# F1-conf-01 — 12-month CPI inflation from two data vintages ## Question 12-month growth g_t = 100×(P_t/P_{t−12} − 1) of CPIAUCSL (SA) for every month 2001-01 … 2026-09, with P_t taken from the most recent vintage covering month t (2026-10-28 vintage for 2014-01 … 2026-09, 2016-07-15 vintage before), plus summaries. ## Data and exclusions Inputs read (`n_input_rows`): `cpi_vintage_2016-07-15.csv` (834 rows), `cpi_vintage_2026-10-28.csv` (153 rows), `cpi_assembled.csv` (957 rows, read only for audit). Hashes and schemas are in `out/state/data_audit.md`. Problems found (`data_issues`): - The 2026-10-28 vintage has an empty value for 2025-10. I left it missing and did not impute it. - The two vintages overlap for 2014-01 … 2016-06 and the values differ because of revisions. For these months I used the 2026-10-28 values. - `cpi_assembled.csv` has assembly errors: it takes the old vintage for 2014-01 … 2016-06, it has no row for 2016-07, and every row from 2016-08 on is placed one month late (the file runs to 2026-10 and the empty cell sits at 2025-11). So I did not use it for any computation. All levels come from the two vintage files. Exclusion ledger (`out/exclusions.csv`): the 309 window months, minus 1 month with no level P_t (2025-10), minus 0 months with no lagged level, leaves 308 analysed months (`n_analysed`, `n_months_growth`; `n_months_missing_growth` = 1; `missing_growth_months`). ## Method `out/analysis.py` builds one monthly level series. It fills months from the 2016-07-15 vintage first and then overwrites them with every month that appears in the 2026-10-28 extract, keeping the empty cell as missing. It then computes g_t as defined above and takes simple means and extremes over the computable months. The method uses no randomness (`random_seed` = null). The baseline is the 2001–2013 sub-period mean (`mean_growth_12m_2001_2013`), computed with the same rule. For the 12 months 2014-01 … 2014-12, P_t comes from the 2026 vintage and P_{t−12} from the 2016 vintage (`n_months_mixed_vintage`). The latest-vintage rule requires this. ## Results - First growth month `first_growth_month` = 2001-01; last month with a level `last_month` = 2026-09. - Mean 12-month growth over the window: 2.574 % (`mean_growth_12m`). For 2001-01 … 2013-12 it is 2.361 % (`mean_growth_12m_2001_2013`, 156 months, `n_months_growth_2001_2013`), and for 2014-01 … 2026-09 it is 2.793 % (`mean_growth_12m_2014_2026`, 152 months, `n_months_growth_2014_2026`). - Named months: 2014-06 2.098 % (`growth_2014_06`), 2016-07 0.868 % (`growth_2016_07`), 2020-05 0.198 % (`growth_2020_05`), 2022-06 8.979 % (`growth_2022_06`), 2026-09 3.717 % (`growth_2026_09`). - Maximum 8.979 % in 2022-06 (`max_growth_12m`, `max_growth_month`); minimum −1.959 % in 2009-07 (`min_growth_12m`, `min_growth_month`). - `feasibility` = "partial": g_t cannot be computed for 2025-10 (`feasibility_reason`). ## Uncertainty These are exact descriptive quantities computed from published index levels. There is no sampling uncertainty to report. The standard deviation of g_t over the window is 1.741 pp (`sd_growth_12m`); it describes how much inflation varied, not how precise the mean is. The main remaining sensitivity is data revision. Within the 2014-01 … 2016-06 overlap, the vintages differ by up to 0.455 index points (`data_issues`), so values and means that rely on the 2016 vintage (pre-2014 levels) may differ somewhat from what current data would give. I did not quantify this sensitivity. ## Limitations and open issues - 2025-10 has no published level in the source, so its g_t is missing and the window mean covers 308 of 309 months (`n_months_window`). With no imputation, 2026-10 would also lack a computable g_t, but it falls outside the window. - Levels before 2014 come from the 2016-07-15 vintage. Later seasonal-factor revisions to those months are not reflected because the provided 2026 extract starts at 2014-01. - In 12 months (2014) the two levels in the ratio come from different vintages (`n_months_mixed_vintage`). The task's rule requires this. - The hand-assembled file was set aside because of the errors listed above. Using it would have shifted every post-2016 level by one month.