Repository navigation
Description
Mechanism
create_economic_assumption_indices.py:40-49 sets each yoy_growth series' first listed year to an index of 1.0 and multiplies growth only from the next year. The first listed year's growth (the step from the year before into that year) is never in the index. backdate_parameters (utils/parameters.py:31-46, called from tax_benefit_system.py:228 with BACKDATED_FROM = "2015-01-01") then carries that 1.0 back to 2015. So for a series starting in 2021, the 2020 and 2021 index values are both 1.0, and a 2020 to 2021 step gets a factor of 1.
Which routes read the indices
- Dataset projection (
data/economic_assumptions.py:352-369, and the council tax, rent and water helpers) multiplies byyoy_growthdirectly, not byindices. It is unaffected for every series, whatever the dataset year. The earliest supported dataset is 2022 (enhanced_frs_2022_23) in any case. - Parameter
uprating:metadata: every parameter uprated by an index has its last listed value at or after that index's first year (for examplehousehold.wealth.national_balance_sheet2021 againstper_capita.gdp2021,carbon/intensity.yaml2022 againstcarbon_intensity2022). No parameter is hit. - Direct situation inputs: Core's class-level
uprating =carries an input forward by the index ratio (see the note indata/uprating_indices.yaml:11-12), as does the legacy-gross savings fallback atsimulation.py:711-719. This is the only route hit, and only when an input is dated before the index's first growth year.
Series
| Series | First listed year | Dropped growth | Affects a supported route? |
|---|---|---|---|
obr.per_capita.gdp (35 variables) |
2021 | 8.92% | yes, direct inputs dated 2020 or earlier only |
obr.per_capita.mixed_income (4) |
2021 | 6.36% | yes, direct inputs dated 2020 or earlier only |
obr.house_prices (2) |
2021 | 8.2% | yes, direct inputs dated 2020 or earlier only |
obr.mortgage_interest (3) |
2021 | -2.26% | yes, direct inputs dated 2020 or earlier only |
obr.petrol_spending_litre_proxy |
2021 | 42.8% | yes, direct inputs dated 2020 or earlier only |
obr.diesel_spending_litre_proxy |
2021 | 40.4% | yes, direct inputs dated 2020 or earlier only |
orr.per_capita.rail_passenger_journeys |
2021 | 154.3% | yes, direct inputs dated 2020 or earlier only |
ons.population (household_weight) |
2021 | 0.36% | yes, direct inputs dated 2020 or earlier only |
obr.private_pension_index (generated) |
2020 | 2.2% (min of 2019 RPI and 5%) | yes, direct inputs dated 2019 or earlier only |
obr.lagged_average_earnings (generated) |
2022 | 5.9% (2021 earnings) | yes, direct inputs dated 2021 or earlier only |
ofwat.water_bills |
2022 | 5.2% | no: its variable is projected by country in uprate_water_and_sewerage_charges (#2501); a direct input dated 2021 or earlier would be hit |
obr.consumer_price_index_ahc |
2022 | 9.27% | no: read only by inflation_adjustment_ahc, which nothing uses |
obr.road_fuel_volume, obr.non_labour_income, obr.per_capita.non_labour_income |
2021 | 24.4%, 8.7%, 8.31% | no: no index consumers |
obr.cpih, obr.social_rent, obr.rent, scottish_water.water_bills, ons.private_rental_prices.* (15 areas) |
2022 | 7.92%, 1.6%, 3.47%, 4.2%, 2.8% to 8.8% | no: no consumers before 2025 (rent is read from 2025 by utils/create_ahc_deflator.py) |
carbon_intensity |
2022 | -4.9% | no: its parameter's last value is 2022 |
obr.council_tax.* (3) |
2023 | 6.38% to 7.09% | no: no index consumers |
obr.stamp_duty_land_tax.* (2), obr.business_rates.* (2) |
2024 | 3.3% to 21.1% | no: their parameters' last values are 2024 or 2025 |
ons.household_interest_income |
2020 | 0.0 | no: the dropped value is zero, so nothing changes |
finance_ni.domestic_rates |
2020 | 1.48% | no: no index consumers outside tests |
obr.rpi, obr.average_earnings, obr.consumer_price_index, obr.lagged_cpi |
2009 to 2010 | 1.8% to 2.2% | no |
triple_lock (generated) |
2011 | April 2011 rise | no: its parameters' last values are 2026 |
earnings_uprating, september_cpi_uprating (generated) |
2010 placeholder | none | no: already anchored, see below |
The rail case is the largest: a 2020-dated input queried for 2021 gets a factor of 1.0 instead of 2.543.
So 10 series can drop growth, all through the same narrow route: a direct input dated before the index's first growth year. No dataset or parameter route is affected today.
Fix pattern
#2638 (head b1ee29e) adds an opt-in index_base_year metadata key to the generator. A series that sets it is anchored at 1.0 in that earlier year, so its first growth step is included; the generator refuses a base year at or after the first growth year. create_earnings_uprating.py and create_september_cpi_uprating.py already do the same thing a different way, by writing a None placeholder for their 2010 base year. Either pattern could be applied to the ten series above, or the generator could anchor every series one year before its first growth year by default. Before adding an anchor, check that a growth value exists for the year before it (for example, per-person series need the year's population).
Not a duplicate of #1862, which is about declared uprating = attributes the dataset route ignores. Related: #2639 (rail per-person series).
Found while fixing #2638.
🤖 Generated with Claude Code
Activity
Note the house-price rounding in the projection wording (#2692)