F1-conf-01 — 12-month CPI inflation from two data vintages
Question
For each month t from 2001-01 to 2026-09, compute g_t = 100 × (P_t / P_{t−12} − 1) for CPIAUCSL (seasonally adjusted), where P comes from the most recent vintage covering that month. Then summarise: overall and sub-period means, five named months, and the extremes.
Data and exclusions
-
I used two authoritative inputs:
cpi_vintage_2016-07-15.csv(834 rows, 1947-01..2016-06) andcpi_vintage_2026-10-28.csv(153 rows, 2014-01..2026-09) (n_input_rows). -
cpi_assembled.csv(957 rows) was read only to audit it. It has three assembly errors, listed indata_issues:- the overlap months 2014-01..2016-06 carry the older vintage's values;
- 2016-07 is missing;
- every value from 2016-08 onward sits one month late, which creates a spurious 2026-10 row.
Because of these errors I did not use it. The series was rebuilt from the two vintage files.
-
The 2026-10-28 vintage has an empty cell for 2025-10 (
data_issues). This value was not imputed. -
Exclusion ledger (
out/exclusions.csv): the window has 309 months (n_window_months). One month (2025-10) was removed for lacking P_t, and none were removed for lacking P_{t−12}. That leaves 308 analysed months (n_analysed,n_months_growth) and 1 missing month (n_months_missing_growth,missing_growth_months).
Method
- Index level by month: the level for 2014-01..2026-09 comes from the 2026-10-28 vintage, including its empty 2025-10 cell. Earlier months use the 2016-07-15 vintage.
- Growth rate: g_t is computed on a contiguous monthly grid. Growth is missing wherever either level is missing.
- Seam months: for 2014-01..2014-12 the lagged level is from the 2016 vintage, as the availability rule requires.
- Summaries: simple arithmetic means over the available g_t.
- Reproducibility: the computation is deterministic and uses no randomness (
random_seed= null).out/analysis.pyregenerates every output. - Baseline: the task labels the 2001–2013 sub-period mean as the baseline (
mean_growth_12m_2001_2013). No further model was needed.
Results
-
First month with a growth rate: 2001-01 (
first_growth_month). Last month with a level: 2026-09 (last_month). -
Mean 12-month inflation was 2.574% over the 308 analysed months (
mean_growth_12m). By sub-period:- 2001-01..2013-12: 2.361% (
mean_growth_12m_2001_2013, 156 months,n_growth_2001_2013); - 2014-01..2026-09: 2.793% (
mean_growth_12m_2014_2026, 152 months,n_growth_2014_2026).
- 2001-01..2013-12: 2.361% (
-
Named months:
month g_t key 2014-06 2.098% growth_2014_062016-07 0.868% growth_2016_072020-05 0.198% growth_2020_052022-06 8.979% growth_2022_062026-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). -
Standard deviation of g_t over the window: 1.741 percentage points (
sd_growth_12m). -
Feasibility is "partial" (
feasibility,feasibility_reason) because g for 2025-10 cannot be computed. All summary estimands were still computed from the 308 available months.
Uncertainty
These figures are computed directly from published data, not estimated from a sample, so there are no sampling standard errors. The remaining uncertainty comes from data revisions:
- In the 30 overlapping months the two vintages differ by up to about 0.5 index points, because seasonal factors were revised.
- So the 2001–2013 figures would change somewhat under a newer vintage.
- The 2014 growth rates combine levels from two vintages.
I did not quantify this revision uncertainty.
Limitations and open issues
- Missing month: 2025-10 has no published level in the latest vintage, so its g_t is missing. Following the rules, I did not interpolate it. As a result, the 2014–2026 sub-period mean covers 152 of 153 months.
- Mixed vintages: the rule mixes vintages, so g_t for 2014-01..2014-12 compares a 2026-vintage level with a 2016-vintage level.
- Assembled file:
cpi_assembled.csvcontains assembly errors and was not used. Using it would have produced wrong overlap values and growth rates shifted by one month after 2016-07. - Hash mismatch: the SHA-256 values in
data/README.mdrefer to the raw downloads, not the reformatted files, so they could not be checked against the files. The hashes I computed myself are inout/state/data_audit.md.