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). Columnsdate(ISO, first day of month),cpi(index, 1982–84 = 100). Source, retrieval date, license and SHA-256 indata/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 emptycpicell means that the source reports no value for that month.data/cpi_assembled.csv— a single file assembled from the two extracts above (columnsdate,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.jsonwith 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, columnsdate(YYYY-MM-01),cpi,cpi_lag12,vintage_used,growth_12m; exactlyn_analysedrows.out/exclusions.csv— the exclusion ledger with columnsstep,rule,n_before,n_after,n_removed,rationale; one row per step from the rows you start from to then_analysedrows ofout/analytic.csv(n_before − n_removed = n_afteron every row; each step'sn_beforeequals the previous step'sn_after).out/report.mdwith the sections: Question; Data and exclusions; Method; Results; Uncertainty; Limitations and open issues.out/analysis.py— running~/wp29/venv/bin/python out/analysis.pyfrom the workspace root must regenerateout/results.json,out/analytic.csvandout/exclusions.csvfromdata/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 modifydata/. - This task is designed to be completed in well under 20 minutes of work.