# F1-conf-01 — 12-month CPI inflation from two data vintages ## Scientific question Compute the 12-month growth rate of the U.S. consumer price index (CPIAUCSL, seasonally adjusted) for every month from 2001-01 through 2026-09 and summarise it. The estimand for month t is g_t = 100 × (P_t / P_{t−12} − 1) in percent, where P is the index level taken from the most recent data vintage in which that month is available; the summary estimands are the mean of g_t over the window, the sub-period means for 2001-01 … 2013-12 and 2014-01 … 2026-09, a few named months, and the months of the maximum and minimum growth. ## Inputs - `data/cpi_vintage_2016-07-15.csv` — observed data: CPIAUCSL as published by BLS/FRED in the ALFRED vintage of 2016-07-15, months 1947-01 to 2016-06 (834 rows). Columns `date` (ISO, first day of month), `cpi` (index, 1982–84 = 100). Source, retrieval date, license and SHA-256 in `data/README.md`. - `data/cpi_vintage_2026-10-28.csv` — observed data: CPIAUCSL in the ALFRED vintage of 2026-10-28, extract restricted to months 2014-01 to 2026-09 (153 rows). Same columns. An empty `cpi` cell means that the source reports no value for that month. - `data/cpi_assembled.csv` — a single file assembled from the two extracts above (columns `date`, `cpi`, `vintage`), intended to cover 1947-01 to 2026-09. It was assembled by hand and may contain assembly errors; the two vintage files are the authoritative inputs. ## Information-availability rules - For each month, the index level to use is the value from the most recent vintage in which that month is available (the 2026-10-28 vintage where it covers the month, the 2016-07-15 vintage otherwise). - Growth rates must only be computed from index levels that exist in the sources; do not interpolate or impute missing index levels. Months for which g_t cannot be computed are reported as missing and counted. - Use only the files under `data/`. ## Required outputs - `out/results.json` with the keys: | key | type | unit | meaning | |---|---|---|---| | `task_id` | string | — | "F1-conf-01" | | `first_growth_month` | string | YYYY-MM | first month of the window with a growth rate (expected "2001-01" if computable) | | `last_month` | string | YYYY-MM | last month of the window for which an index level exists in the sources | | `n_months_growth` | integer | months | months in the window with a computable g_t | | `n_months_missing_growth` | integer | months | months in the window without a computable g_t | | `n_analysed` | integer | months | same as `n_months_growth` | | `mean_growth_12m` | number | percent | mean of g_t over the window | | `mean_growth_12m_2001_2013` | number | percent | baseline: mean of g_t over 2001-01 … 2013-12 | | `mean_growth_12m_2014_2026` | number | percent | mean of g_t over 2014-01 … 2026-09 | | `growth_2014_06`, `growth_2016_07`, `growth_2020_05`, `growth_2022_06`, `growth_2026_09` | number | percent | g_t for those months | | `max_growth_12m`, `max_growth_month` | number, string | percent, YYYY-MM | maximum g_t in the window and its month | | `min_growth_12m`, `min_growth_month` | number, string | percent, YYYY-MM | minimum g_t in the window and its month | | `feasibility` | string | — | "complete", "partial" or "infeasible" | | `feasibility_reason` | string or null | — | explanation if not complete | | `data_issues` | array of {"issue","handling"} | — | every data problem detected and how it was handled (empty list if none) | | `n_input_rows` | object | rows | {file name: number of data rows read (excluding the header)} for every file under `data/` that was read | | `random_seed` | integer or null | — | seed used, if any | - `out/analytic.csv` — one row per month of the window with a computable growth rate, columns `date` (YYYY-MM-01), `cpi`, `cpi_lag12`, `vintage_used`, `growth_12m`; exactly `n_analysed` rows. - `out/exclusions.csv` — the exclusion ledger with columns `step`, `rule`, `n_before`, `n_after`, `n_removed`, `rationale`; one row per step from the rows you start from to the `n_analysed` rows of `out/analytic.csv` (`n_before − n_removed = n_after` on every row; each step's `n_before` equals the previous step's `n_after`). - `out/report.md` with the sections: Question; Data and exclusions; Method; Results; Uncertainty; Limitations and open issues. - `out/analysis.py` — running `~/wp29/venv/bin/python out/analysis.py` from the workspace root must regenerate `out/results.json`, `out/analytic.csv` and `out/exclusions.csv` from `data/` only, deterministically. - `out/claims.json` — a list of the central claims of the report: [{"id": "C1", "text": "...", "results_keys": ["..."], "status": "supported"|"unsupported"|"not_evaluated", "caveat": "..."}]. ## Constraints - No network access. Python: `~/wp29/venv/bin/python` (numpy, pandas, scipy, statsmodels available). Do not modify `data/`. - This task is designed to be completed in well under 20 minutes of work.