Vertex’s treasury view looked familiar: anchor on last year’s same week, layer a few spreadsheet guardrails, and hope the pattern repeats. COVID-19 made that contract void — trials slipped, supply stretched, and cash timing stopped obeying the calendar. The classroom story is not “replace finance with AI”; it is keep an auditable legacy anchor, then add a Python + scikit-learn driver model that learns from the same signals you already argue about in committee. The pilot notebook is the analytical source of truth: what you tune there is what this page plots (via the shared pipeline). Optional generative-AI sits on top as narrative glue — scenario packs and plain-language bridges — so faster numbers travel with faster explainability, not a black box.
What you are looking at is the same synthetic weekly cash path you build in pharma_cash_pilot.ipynb: warmup from early 2018, then a stress regime aligned around Q1 2020. The legacy baseline is deliberately “spreadsheet-shaped”: forecast ≈ cash from 52 weeks ago (seasonal naive), then a small shock-state haircut when the stress flag is on — transparent, reproducible in Excel, and wired identically in cases/vertex_chart_pipeline.py so this page cannot drift from the class notebook. The forecast target is observed weekly cash, cash_actual_m; drivers (trials, procurement, collections, FX, promo) are the levers FP&A already debates.
What you practise in Python is a clean separation of roles: the gradient boosting model sees drivers, short cash lags, calendar features, and a delayed shock indicator for realism — it does not ingest the legacy baseline as an input, so uplift is a fair “rules-based anchor vs learned pattern” story. Scenario bands and the optional GenAI cells mirror how you would brief treasury: envelope first, narrative second, audit trail always. Adapted from: Vertex Pharma AI/ML FP&A Case, FP&A Trends Global AI Committee 2024
Vertex Pharma cash-flow simulation with ML + GenAI implementation in Python.
Similar case studies are used in investment banking solution workflows.
GenAI defaults live in src/vertex_lab_ai_config.py; table display in src/pandas_display_config.py; plot style in src/chart_config.py; Matplotlib lab charts under src/charts/ with bind(raw_df) then trial_velocity(), row(…) (one row of subplots), or grid(…) (fixed 2×3 layout) in src/charts/quick.py; synthetic pilot parameters and build_synthetic_pharma_data live in src/pharma_cash_synthetic.py (the notebook loads data/vertex_pharma_cash_synthetic.csv when present to skip regeneration). In JupyterLite the tree is driven by prebuilt static/jupyterlite/api/contents/*.json (not a live scan of files/), so new paths under static/jupyterlite/files/ must be listed there — e.g. src/ and data/ via api/contents/all.json plus api/contents/src/all.json and api/contents/data/all.json. The repo keeps the same src/ modules at the project root; canonical CSV also under cases/data/.
Click Generate Executive Consulting Report below the lab to reveal Post-Notebook Findings charts and the full consulting addendum. Data mirror cases/vertex_chart_pipeline.py unless you export from the notebook.
Relative uplift versus the baseline forecast method across the evaluated test window.
Generate the report to convert notebook outputs into a board-ready interpretation.
The report will appear here once generated from the notebook run.
cash_latent_m in the synthetic generator).baseline_seasonal_naive - shock_flag_baseline * baseline_shock_adjust_m (Excel-style shock-state adjustment).