From 26e8e3bb76d2ed8bf62c83d07337c8b92d541c37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 8 Oct 2026 15:39:42 +0100 Subject: [PATCH 01/18] Hold VAT and the ONS energy rows out of the objective; measure them with a diagnose tool (#1113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The national solve was closing three level gaps by moving weights. obr.vat reads +24.7 percent at design weights and +24.1 percent calibrated on #1121's head calibration (policyengine-uk 2.122.2), against the 25 percent bound: the engine divides household VAT by microdata_vat_coverage (0.38, a constant since January 2023), and the frame's raw household VAT is about 46 percent of the OBR receipts (policyengine-uk#1996). The ONS 04.5.1 and 04.5.2 rows sit below the stage's DESNZ volume at QEP prices on every aligned basis (gas below unit cost alone), and fitting them cut electricity 8.6 percent, gas 18.9 percent and the gas-connected share from 84.5 to 78.9 percent. A re-solve of the 2026-09-30 problem with the rows masked changed no other row's fit (98.5 against 98.4 percent within 10 percent). The three rows join the measure-exclusion register on María's 2026-10-08 ruling (VAT until the engine factor is split; the energy rows as a published-source residual, with DESNZ volume at QEP prices kept as the level), windowed to 2027-01-08. tools/diagnose_uk_consumption_taxes.py keeps them measured on any H5 the engine loads, against the values the run's contract registry declares, beside the fuel and energy composition the rows pulled. The twelve COICOP division columns become a named view beside the LCFS rename map so the tool imports them rather than copying them. Co-Authored-By: Claude Opus 5.5 --- .../uk/calibration_measure_exclusions.json | 27 ++++ .../build/uk_runtime/lcfs_consumption.py | 5 + .../uk/test_uk_consumption_tax_diagnostics.py | 114 +++++++++++++ .../uk/test_uk_measure_simulation.py | 34 +++- tools/diagnose_uk_consumption_taxes.py | 152 ++++++++++++++++++ 5 files changed, 331 insertions(+), 1 deletion(-) create mode 100644 packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_tax_diagnostics.py create mode 100644 tools/diagnose_uk_consumption_taxes.py diff --git a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json index 0abb2ecc9e..8605c49863 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json @@ -576,6 +576,33 @@ "adjudication": "microcosm#882 (the 2026-09-16 status comment, issuecomment-5694598278, whose next-steps list this repair works, and the repairs plan María approved on 2026-09-16 with her population ruling on the U8 take-up entry; approver as author per the register convention). Expiry 2026-12-08 aligns the whole UC-repair tranche with the zero-band clock already on the register (microcosm#877), so the next spine re-adjudicates them together. Receipts: experiments/882-uc-repairs-receipts.md (R2 and R5, tools/diagnose_uk_benefit_cap.py on the Q50f candidate and the twins).", "approved_on": "2026-09-16", "expires_on": "2026-12-08" + }, + { + "name": "obr.vat", + "reason": "Level set by an engine factor, not the weights: policyengine-uk's vat divides household VAT by gov.simulation.microdata_vat_coverage (0.38, a constant since January 2023 with no recorded derivation; policyengine-uk#1996), which folds the household share of VAT receipts (about 70 percent per OBR and the HMRC VAT gap estimates) together with the survey's capture of household spending. The frame's raw household VAT is about 46 percent of the OBR receipts, so the row reads +24.7 percent at design weights and +24.1 percent calibrated on microcosm#1121's head calibration (policyengine-uk 2.122.2), against the 25 percent bound. Fitting it held total consumption 5 percent (GBP 55bn) low on the 2026-09-30 national problem, and a re-solve with the row masked changed no other row's fit (98.5 against 98.4 percent within 10 percent). Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; rebind when a locked policyengine-uk splits the factor into the published household share and a declared survey capture and the row fits.", + "tracking": "policyengine-uk#1996", + "approved_by": "juaristi22", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D3: hold the row out until the engine factor is split. Receipts: experiments/1113-consumption-tax-levels-receipts.md (the masked re-solve of the 2026-09-30 problem and microcosm#1121's head calibration).", + "approved_on": "2026-10-08", + "expires_on": "2027-01-08" + }, + { + "name": "ons.household_electricity_expenditure", + "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets electricity spend from DESNZ Energy Trends FY2024-25 domestic volume at QEP FY2024-25 average prices paid (the level the energy_rake gate checks), and ONS Consumer Trends 04.5.1 sits below it on every aligned basis: CY2025 GBP 26.52bn against GBP 29.60bn for Energy Trends volume times QEP unit and fixed costs (0.90), and 1.11 times unit cost alone; meters against households explains about 2 percent. Fitting the row cut electricity 8.6 percent through the weights (82.9 TWh implied against 93.0 TWh on the 2026-09-30 build), and a re-solve with it masked changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", + "tracking": "microcosm#1113", + "approved_by": "juaristi22", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "approved_on": "2026-10-08", + "expires_on": "2027-01-08" + }, + { + "name": "ons.household_gas_expenditure", + "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets gas spend from DESNZ Energy Trends FY2024-25 domestic volume at QEP FY2024-25 average prices paid over the published gas-connected share, and ONS Consumer Trends 04.5.2 sits below it on every aligned basis: CY2025 GBP 15.34bn against GBP 18.94bn for Energy Trends volume times QEP unit and fixed costs (0.81), and below unit cost alone (0.955). Fitting the row cut gas 18.9 percent through the weights and the gas-connected share from 84.5 to 78.9 percent against the DESNZ meter share the stage imposes; a re-solve with it masked kept the share at 84.6 percent and changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", + "tracking": "microcosm#1113", + "approved_by": "juaristi22", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "approved_on": "2026-10-08", + "expires_on": "2027-01-08" } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index 289fd42789..c0a232fe3e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -145,6 +145,11 @@ "c72212": "diesel_spending", "p537": "domestic_energy_consumption", } +#: The twelve COICOP division totals (LCFS p601-p612), in division order: the +#: columns policyengine-uk's ``consumption`` sums and its VAT base reads. +UK_LCFS_COICOP_DIVISION_COLUMNS = tuple( + CONSUMPTION_VARIABLE_RENAMES[f"p6{division:02d}"] for division in range(1, 13) +) BUS_FARE_LCFS_CODES = ("c73212", "c73213", "c73214") #: Cars and vans available to the household: LCFS ``a124`` on the donor, the #: was_wealth QRF draw of WAS ``vcarnr8`` on the recipient (the FRS carries no diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_tax_diagnostics.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_tax_diagnostics.py new file mode 100644 index 0000000000..e856d4a120 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_tax_diagnostics.py @@ -0,0 +1,114 @@ +"""The consumption-tax diagnose tool's engine-free helpers (microcosm#1113). + +The tool keeps the rows the measure-exclusion register holds out of the +objective measured; these tests pin its aggregation, its comparison against +the run's declared values, and that every row it reports is a committed +reference name, so a register entry that names the tool measures a real row. +""" + +from __future__ import annotations + +import importlib.util +import json +from importlib.resources import files + +import pandas as pd +import pytest + +from microcosm.build.uk_runtime.lcfs_consumption import ( + CONSUMPTION_VARIABLE_RENAMES, + UK_LCFS_COICOP_DIVISION_COLUMNS, +) +from test_support.paths import paths_for + +_TOOL = ( + paths_for("microcosm-build").repository / "tools/diagnose_uk_consumption_taxes.py" +) +_SPEC = importlib.util.spec_from_file_location("diagnose_uk_consumption_taxes", _TOOL) +assert _SPEC is not None and _SPEC.loader is not None +_tool = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(_tool) + + +def _household() -> pd.DataFrame: + table = pd.DataFrame( + { + "household_weight": [1.0, 2.0, 1.0], + "petrol_spending": [1_000.0, 0.0, 0.0], + "diesel_spending": [0.0, 0.0, 500.0], + "electricity_consumption": [900.0, 800.0, 700.0], + "gas_consumption": [600.0, 0.0, 500.0], + "has_fuel_consumption": [True, True, False], + } + ) + for column in UK_LCFS_COICOP_DIVISION_COLUMNS: + table[column] = 100.0 + return table + + +def test_division_columns_are_the_twelve_lcfs_division_totals() -> None: + assert len(UK_LCFS_COICOP_DIVISION_COLUMNS) == 12 + assert UK_LCFS_COICOP_DIVISION_COLUMNS[0] == CONSUMPTION_VARIABLE_RENAMES["p601"] + assert UK_LCFS_COICOP_DIVISION_COLUMNS[-1] == CONSUMPTION_VARIABLE_RENAMES["p612"] + assert "petrol_spending" not in UK_LCFS_COICOP_DIVISION_COLUMNS + + +def test_composition_weights_the_household_table() -> None: + summary = _tool.composition(_household()) + assert summary["households"] == 4.0 + # Households one and three are on gas: weight 2 of 4. + assert summary["gas_connected_share"] == pytest.approx(0.5) + assert summary["petrol_positive_share"] == pytest.approx(0.25) + # Two fuel-car households carry weight 3; the weight-2 one buys no fuel. + assert summary["fuel_car_household_share"] == pytest.approx(0.75) + assert summary["fuel_car_zero_fuel_share"] == pytest.approx(2.0 / 3.0) + assert summary["consumption_stored"] == pytest.approx(4.0 * 12 * 100.0) + assert summary["electricity_consumption_stored"] == pytest.approx( + 900.0 + 1_600.0 + 700.0 + ) + + +def test_composition_refuses_zero_weight() -> None: + table = _household() + table["household_weight"] = 0.0 + with pytest.raises(ValueError, match="sum to zero"): + _tool.composition(table) + + +def test_compare_reports_relative_error_and_missing_targets() -> None: + rows = _tool.compare( + {"obr.vat": 220.0, "ons.household_gas_expenditure": 18.0}, + {"obr.vat": 176.0}, + ) + assert rows["obr.vat"]["relative_error"] == pytest.approx(0.25) + assert rows["ons.household_gas_expenditure"] == { + "estimate": 18.0, + "target": None, + "relative_error": None, + } + + +def test_registry_values_reads_only_the_tool_rows(tmp_path) -> None: + path = tmp_path / "national_contract_registry.json" + path.write_text( + json.dumps( + { + "specs": [ + {"name": "obr.vat", "value": 177.9e9}, + {"name": "obr.income_tax", "value": 1.0}, + {"name": "ons.household_gas_expenditure", "value": None}, + ] + } + ) + ) + assert _tool.registry_values(path) == {"obr.vat": 177.9e9} + + +def test_tool_rows_are_committed_reference_names() -> None: + payload = json.loads( + files("microcosm.build.uk").joinpath("target_references.json").read_text() + ) + committed = {reference["name"] for reference in payload["target_references"]} + assert set(_tool.ROWS) <= committed, sorted(set(_tool.ROWS) - committed) + for name, variables in _tool.ROWS.items(): + assert variables and all(isinstance(v, str) for v in variables), name diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py index 197e7af48c..021ebc7be7 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py @@ -612,6 +612,12 @@ def test_exclusion_applier_warns_within_week_of_expiry(): # Two amount bands (200.01-300, 400.01-500) retired 2026-09-21 on the # v20 measurement (-10.1 % and -3.8 % unbound); the tail bands stay out. "dwp.benefit_cap.capped_households_": 11, + # microcosm#1113 and #1123 item 3 (2026-10-08): rows whose level the + # engine or a published-source residual sets, held out and measured with + # tools/diagnose_uk_consumption_taxes.py. + "obr.vat": 1, + "ons.household_electricity_expenditure": 1, + "ons.household_gas_expenditure": 1, } # The carer and childcare rows were retired on 2026-09-16 with the repairs @@ -637,7 +643,7 @@ def test_exclusion_applier_warns_within_week_of_expiry(): def test_packaged_exclusions_load(): exclusions = load_uk_calibration_measure_exclusions() names = [entry["name"] for entry in exclusions] - assert len(names) == len(set(names)) == 64 + assert len(names) == len(set(names)) == 67 band_h_region_cells = [ entry for entry in exclusions @@ -733,6 +739,32 @@ def test_packaged_exclusions_load(): assert entry["expires_on"] == "2026-11-26" assert "microcosm#1095" in entry["adjudication"] assert "policyengine-uk 2.122.2" in entry["reason"] + # The 2026-10-08 consumption-tax tranche (microcosm#1113, #1123 item 3): + # VAT's level is an engine factor (policyengine-uk#1996) and the two ONS + # energy rows are a published-source residual against the stage's DESNZ + # volume at QEP prices. A masked re-solve changed no other row's fit, so + # they are held out of the objective and measured by the diagnose tool. + consumption_taxes = [e for e in exclusions if e["approved_on"] == "2026-10-08"] + assert sorted(e["name"] for e in consumption_taxes) == [ + "obr.vat", + "ons.household_electricity_expenditure", + "ons.household_gas_expenditure", + ] + for entry in consumption_taxes: + assert entry["expires_on"] == "2027-01-08", entry["name"] + assert "tools/diagnose_uk_consumption_taxes.py" in entry["reason"], entry[ + "name" + ] + assert ( + "experiments/1113-consumption-tax-levels-receipts.md" + in entry["adjudication"] + ), entry["name"] + trackings = {e["name"]: e["tracking"] for e in consumption_taxes} + assert trackings == { + "obr.vat": "policyengine-uk#1996", + "ons.household_electricity_expenditure": "microcosm#1113", + "ons.household_gas_expenditure": "microcosm#1113", + } for entry in renewed: assert entry["expires_on"] == "2026-11-03", entry["name"] assert entry["tracking"] == a16_issues[entry["name"]], entry["name"] diff --git a/tools/diagnose_uk_consumption_taxes.py b/tools/diagnose_uk_consumption_taxes.py new file mode 100644 index 0000000000..5043c96d6b --- /dev/null +++ b/tools/diagnose_uk_consumption_taxes.py @@ -0,0 +1,152 @@ +"""Measure the consumption-tax and domestic-energy rows on a UK dataset. + +The levels of these rows are set by the build or the engine, not by the +weights (microcosm#1113, microcosm#1123 item 3): ``obr.vat`` by an engine +coverage factor (policyengine-uk#1996), ``obr.fuel_duties_cars`` by fuel +that includes business-paid car fuel, and the ONS electricity and gas rows +by a published-source residual against the stage's DESNZ volume at QEP +prices. Rows held out of the objective by the measure-exclusion register stay +measured here: the tool reports each row's estimate on any H5 the engine +loads, against the value the run's contract registry declares, beside the +household fuel and energy composition the rows used to pull (gas-connected +share, fuel-car households with no fuel, consumption total). Development +diagnostic: it never recalibrates and writes only an aggregate JSON. +""" + +from __future__ import annotations + +import argparse +import json +from collections.abc import Mapping +from pathlib import Path + +import numpy as np +import pandas as pd + +from microcosm.build.uk_runtime.lcfs_consumption import UK_LCFS_COICOP_DIVISION_COLUMNS + +#: Held-out rows and the engine variables whose weighted sum measures them. +ROWS: Mapping[str, tuple[str, ...]] = { + "obr.vat": ("vat",), + "obr.fuel_duties_cars": ("fuel_duty",), + "ons.household_electricity_expenditure": ("electricity_consumption",), + "ons.household_gas_expenditure": ("gas_consumption",), +} + + +def composition(household: pd.DataFrame) -> dict[str, float]: + """Weighted fuel and energy composition from the stored household table.""" + + weight = household["household_weight"].to_numpy(dtype=float) + total = float(weight.sum()) + if total <= 0: + raise ValueError("household weights sum to zero.") + petrol = household["petrol_spending"].to_numpy(dtype=float) + diesel = household["diesel_spending"].to_numpy(dtype=float) + fuel = petrol + diesel + gas = household["gas_consumption"].to_numpy(dtype=float) + flagged = household["has_fuel_consumption"].to_numpy(dtype=bool) + flagged_weight = float(weight[flagged].sum()) + out = { + "households": total, + "gas_connected_share": float(weight[gas > 0].sum()) / total, + "petrol_positive_share": float(weight[petrol > 0].sum()) / total, + "diesel_positive_share": float(weight[diesel > 0].sum()) / total, + "fuel_car_household_share": flagged_weight / total, + "fuel_car_zero_fuel_share": ( + float(weight[flagged & (fuel <= 0)].sum()) / flagged_weight + if flagged_weight > 0 + else 0.0 + ), + "consumption_stored": float( + np.dot( + weight, + household[list(UK_LCFS_COICOP_DIVISION_COLUMNS)] + .to_numpy(dtype=float) + .sum(axis=1), + ) + ), + } + for column in ( + "petrol_spending", + "diesel_spending", + "electricity_consumption", + "gas_consumption", + ): + out[f"{column}_stored"] = float( + np.dot(weight, household[column].to_numpy(dtype=float)) + ) + return out + + +def compare( + estimates: Mapping[str, float], targets: Mapping[str, float] +) -> dict[str, dict[str, float | None]]: + """Each row's estimate beside its declared value and relative error.""" + + rows: dict[str, dict[str, float | None]] = {} + for name, estimate in estimates.items(): + target = targets.get(name) + rows[name] = { + "estimate": float(estimate), + "target": None if target is None else float(target), + "relative_error": ( + None if not target else float(estimate) / float(target) - 1.0 + ), + } + return rows + + +def registry_values(path: Path) -> dict[str, float]: + """Declared values of the held-out rows from a run's contract registry.""" + + payload = json.loads(path.read_text()) + values: dict[str, float] = {} + for spec in payload.get("specs", []): + if spec.get("name") in ROWS and spec.get("value") is not None: + values[str(spec["name"])] = float(spec["value"]) + return values + + +def engine_estimates(dataset: str, year: int) -> dict[str, float]: + """Weighted engine totals of each held-out row at ``year``.""" + + from policyengine_uk import Microsimulation + + simulation = Microsimulation(dataset=dataset) + estimates: dict[str, float] = {} + for name, variables in ROWS.items(): + estimates[name] = float( + sum( + float(simulation.calculate(variable, year).sum()) + for variable in variables + ) + ) + return estimates + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--dataset", required=True, help="an H5 the engine loads") + parser.add_argument( + "--registry", + type=Path, + help="the run's national_contract_registry.json (declared row values)", + ) + parser.add_argument("--year", type=int, default=2025) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + household = pd.read_hdf(args.dataset, "household") + targets = registry_values(args.registry) if args.registry else {} + report = { + "dataset": args.dataset, + "year": args.year, + "rows": compare(engine_estimates(args.dataset, args.year), targets), + "composition": composition(household), + } + args.out.write_text(json.dumps(report, indent=1, sort_keys=True)) + print(json.dumps(report["rows"], indent=1)) + + +if __name__ == "__main__": + main() From f7a02a321c0fcab19e69530084e42b411fd744aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 8 Oct 2026 16:11:03 +0100 Subject: [PATCH 02/18] Level household road fuel to ONS 07.2.2 in the LCFS stage (#1113) The LCFS diary records about a quarter less road fuel than ONS household spending, and binding the OBR cars receipts closed that gap by moving weight onto fuel-buying households. A declared level_road_fuel step after the fuel flag now scales petrol and diesel by one factor, so their prior-weighted total equals ONS Consumer Trends COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own c72213 other-fuels share. The drawn mix and each household's relative spend are kept. - lcfs_consumption reads ons_household_expenditure_facts.json, now its declared consumer (re-vendored; values unchanged). - The uk_stage_lcfs_consumption_road_fuel_level stage-health gate recomputes the level from the vendored row and checks that the factor reproduces it; the licensed donor's other-fuels share is bounded at 5%. - Petrol and diesel join the levelled columns, so they carry no committed support bound (regenerated from the pinned LCFS tabs). - The existing litres audit runs after the step, so its frame litres at DESNZ pump prices describe the levelled frame. - Mirrors: operation schema and kind, stage_health parameter vocabulary, spine gate scope, gate-battery digests and entry lists, coverage manifest. The graph parity fixture is regenerated once at the end of the series. Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/source_manifest.py | 1 + .../spec_engine/schema/sources.schema.json | 52 +++++ .../src/microcosm/build/uk/gates.json | 15 ++ .../uk/lcfs_consumption_support_bounds.json | 8 - .../uk/ledger_fact_vendor_selections.json | 6 +- .../uk/ons_household_expenditure_facts.json | 6 +- .../uk/release_input_coverage_manifest.json | 34 ++-- .../src/microcosm/build/uk/source_stages.json | 24 ++- .../src/microcosm/build/uk/spec/sources.yaml | 18 +- .../build/uk_runtime/battery_bindings.py | 3 + .../build/uk_runtime/calibration_run.py | 1 + .../build/uk_runtime/lcfs_consumption.py | 192 +++++++++++++++++- .../build/uk_runtime/stage_health.py | 100 +++++++++ .../engine_free/shared/test_country_spec.py | 2 + .../uk/test_uk_consumption_resources.py | 6 +- .../uk/test_uk_lcfs_consumption.py | 176 ++++++++++++++++ .../engine_free/uk/test_uk_source_stages.py | 1 + .../engine_free/uk/test_uk_stage_health.py | 59 ++++++ .../src/microcosm/data/contract.py | 13 +- .../tests/engine_free/shared/test_contract.py | 8 +- 20 files changed, 683 insertions(+), 42 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/source_manifest.py b/packages/microcosm-build/src/microcosm/build/source_manifest.py index 2588173e1b..7fcb689adc 100644 --- a/packages/microcosm-build/src/microcosm/build/source_manifest.py +++ b/packages/microcosm-build/src/microcosm/build/source_manifest.py @@ -142,6 +142,7 @@ "impute_workers_compensation_to_puf_support", "impute_weeks_unemployed_to_puf_support", "iterative_proportional_fit", + "level_road_fuel", "pair_clone_households_to_originals", "price_domestic_energy", "price_bus_journeys", diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index 839249b199..09516c22e4 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -11124,6 +11124,58 @@ } } } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "columns", + "resource", + "concept", + "coicop", + "period_type", + "period_value", + "other_fuels_rule", + "other_fuels_codes" + ], + "properties": { + "kind": { + "const": "level_road_fuel" + }, + "columns": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "resource": { + "type": "string" + }, + "concept": { + "type": "string" + }, + "coicop": { + "type": "string" + }, + "period_type": { + "const": "calendar_year" + }, + "period_value": { + "type": "integer" + }, + "other_fuels_rule": { + "type": "string" + }, + "other_fuels_codes": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + } } ], "description": "Closed kind-discriminated source artifact and operation records, covering the packaged US, UK, and BE source vocabularies." diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 83982de50b..956ce9376b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -346,6 +346,21 @@ }, "notes": "Stage-time fact check on the lcfs bus_pricing receipt (microcosm#930): every area's receipts, boardings, concessionary journeys, trips per resident and population, and the boardings-per-trip and yield factors derived from them, are recomputed from the vendored rows the stage declares and must equal the receipt's; the unpriced regions must be the declared ones (Wales, which keeps the chain's raw draw by María's ruling of 2026-09-17) and the chain must have conditioned on the raw draw. The frame-implied boardings over the published ones are reported per area, not fenced: that ratio is the survey-versus-admin reading the bound receipts targets then act on. A population fact check: the synthetic smoke records it without blocking." }, + { + "id": "uk_stage_lcfs_consumption_road_fuel_level", + "gate": "stage_health", + "phase": "transferred", + "criticality": "release_blocking", + "evidence_absent_blocks": true, + "population_fact_check": true, + "parameters": { + "stage": "lcfs_consumption", + "check": "road_fuel_level", + "maximum_relative_deviation": 1e-09, + "maximum_other_fuels_share": 0.05 + }, + "notes": "Stage-time fact check on the lcfs road_fuel_level receipt (microcosm#1113): the ONS Consumer Trends COICOP 07.2.2 household spend the stage declares is recomputed from the vendored row and must equal the receipt's, and the prior-weighted petrol plus diesel after the step must equal it less the donor's other-fuels share, with the factor reproducing that from the drawn total. The other-fuels share is the LCFS donor's own c72213 share of 07.2.2, licensed microdata the gate cannot recompute, so it is bounded at five percent instead (0.37 percent on the 2023-24 diary). María's ruling of 2026-10-08 set the stage, not the weights, as what levels household road fuel. A population fact check: the synthetic smoke records it without blocking." + }, { "id": "uk_stage_etb_vat_support", "gate": "stage_health", diff --git a/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json b/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json index d4c9d7f0f3..7a96be6a71 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json +++ b/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json @@ -22,10 +22,6 @@ 0.0, 40000 ], - "diesel_spending": [ - 0.0, - 30000 - ], "education_consumption": [ 0.0, 200000 @@ -50,10 +46,6 @@ 0.0, 70000 ], - "petrol_spending": [ - 0.0, - 20000 - ], "recreation_consumption": [ 0.0, 300000 diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json index 95a83f4eff..bec0992dba 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json @@ -376,8 +376,10 @@ }, { "resource": "ons_household_expenditure_facts.json", - "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the domestic energy spend targets (04.5.1 and 04.5.2 bound per fuel) and the motor-fuel spend diagnostic.", - "consumers": [], + "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", + "consumers": [ + "uk_runtime.lcfs_consumption" + ], "planned_consumers": [ "uk_aggregate_admin" ], diff --git a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json index 44ff41c783..b4cd04d09a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json @@ -3,8 +3,10 @@ "country": "uk", "kind": "uk_vendored_ledger_facts", "resource": "ons_household_expenditure_facts.json", - "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the domestic energy spend targets (04.5.1 and 04.5.2 bound per fuel) and the motor-fuel spend diagnostic.", - "consumers": [], + "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", + "consumers": [ + "uk_runtime.lcfs_consumption" + ], "planned_consumers": [ "uk_aggregate_admin" ], diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 662ea2616d..1895f87645 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "067ba21c12aeb4e95e6a8a16141dbaa075e8787ed875a005f549cab6e91a6b56", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,7 +760,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", "survey": "Living Costs and Food Survey 2023-24" @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index ccd88f5197..aec2e27f45 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -3402,6 +3402,12 @@ "resource": "devolved_bus_finance.json", "kind": "public_aggregate_reference", "format": "json" + }, + { + "role": "ons_household_expenditure_facts", + "resource": "ons_household_expenditure_facts.json", + "kind": "public_aggregate_reference", + "format": "json" } ], "operations": [ @@ -3851,6 +3857,22 @@ ], "condition": "has_fuel_consumption == false" }, + { + "kind": "level_road_fuel", + "columns": [ + "petrol_spending", + "diesel_spending" + ], + "resource": "ons_household_expenditure_facts.json", + "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", + "coicop": "07.2.2", + "period_type": "calendar_year", + "period_value": 2024, + "other_fuels_rule": "lcfs_donor_other_fuels_share", + "other_fuels_codes": [ + "c72213" + ] + }, { "kind": "record_mass_conservation_receipt", "entity": "household", @@ -3901,7 +3923,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095)." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel is levelled by the declared level_road_fuel step (microcosm#1113): after the fuel flag zeroes the households without a fuel car, one factor scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 2bad0fece3..8ab85c0d80 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -2819,6 +2819,10 @@ stages: resource: devolved_bus_finance.json kind: public_aggregate_reference format: json + - role: ons_household_expenditure_facts + resource: ons_household_expenditure_facts.json + kind: public_aggregate_reference + format: json operations: - kind: derive lowercase_columns: true @@ -3163,6 +3167,18 @@ stages: - petrol_spending - diesel_spending condition: has_fuel_consumption == false + - kind: level_road_fuel + columns: + - petrol_spending + - diesel_spending + resource: ons_household_expenditure_facts.json + concept: ons.household_expenditure.personal_transport_fuels_lubricants + coicop: 07.2.2 + period_type: calendar_year + period_value: 2024 + other_fuels_rule: lcfs_donor_other_fuels_share + other_fuels_codes: + - c72213 - kind: record_mass_conservation_receipt entity: household reason: 'LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.' @@ -3208,7 +3224,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095).' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel is levelled by the declared level_road_fuel step (microcosm#1113): after the fuel flag zeroes the households without a fuel car, one factor scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns.' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py index ca573aef07..f5cdc738ba 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py @@ -1787,6 +1787,9 @@ def _ledger_compile_parity_required_artifacts( # #1063 wealth_coherence check: the reviewed excess of owner # households without a main-residence value over the donor's. "maximum_owner_share_without_main_residence_excess", + # #1113 road_fuel_level check: the ceiling on the LCFS donor + # share of other personal-transport fuels netted off 07.2.2. + "maximum_other_fuels_share", } ), artifact_keys=frozenset({"stage_evidence"}), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 37044ffaf2..13c1317d64 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py @@ -97,6 +97,7 @@ "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index c0a232fe3e..6ec03b5f81 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -165,6 +165,8 @@ # the register names. UK_LCFS_DFT_BUS_JOURNEYS_RESOURCE = UK_DFT_BUS_JOURNEYS_RESOURCE UK_LCFS_DEVOLVED_BUS_FINANCE_RESOURCE = "devolved_bus_finance.json" +#: ONS Consumer Trends household spending, the road-fuel level (COICOP 07.2.2). +UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE = "ons_household_expenditure_facts.json" UK_LCFS_VENDORED_RESOURCES = ( UK_LCFS_ROAD_FUEL_RESOURCE, UK_LCFS_LICENSED_CARS_RESOURCE, @@ -174,18 +176,28 @@ UK_NEED_ENERGY_FACTS_RESOURCE, UK_DESNZ_DOMESTIC_ENERGY_RESOURCE, UK_QEP_ENERGY_PRICES_RESOURCE, + UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE, ) +#: The household road-fuel columns the ``level_road_fuel`` step scales. +UK_LCFS_ROAD_FUEL_COLUMNS = ("petrol_spending", "diesel_spending") #: Columns a declared rake or pricing step levels (energy in kWh to the NEED #: shape at the DESNZ level; bus fares as journeys times the published -#: yield, microcosm#930); the committed support bounds leave them alone. +#: yield, microcosm#930; road fuel to ONS household spending, microcosm#1113); +#: the committed support bounds leave them alone. UK_LCFS_RAKED_COLUMNS = frozenset( { "electricity_consumption", "gas_consumption", "domestic_energy_consumption", "bus_fare_spending", + *UK_LCFS_ROAD_FUEL_COLUMNS, } ) +LEVEL_ROAD_FUEL_KIND = "level_road_fuel" +#: The LCFS diary lines inside COICOP 07.2.2 beside petrol (c72211) and diesel +#: (c72212): other motor fuels and oils, which ONS's 07.2.2 also carries. +UK_LCFS_OTHER_ROAD_FUEL_CODES = ("c72213",) +UK_LCFS_ROAD_FUEL_OTHER_SHARE_RULE = "lcfs_donor_other_fuels_share" UK_LCFS_ICE_SHARE_RULE = "one_minus_zero_emission_share" #: The litres audit (microcosm#890 C7) reads these vendored concepts beside the #: declared litre-proxy price concepts: HMRC clearances are all road users, the @@ -267,6 +279,7 @@ class UKLCFSConsumptionResult: energy_rake: Mapping[str, Any] | None = None fuel_litres_audit: Mapping[str, Any] | None = None donor_floor: Mapping[str, Any] | None = None + road_fuel_level: Mapping[str, Any] | None = None def evidence(self) -> dict[str, object]: evidence: dict[str, object] = { @@ -287,6 +300,8 @@ def evidence(self) -> dict[str, object]: evidence["fuel_litres_audit"] = dict(self.fuel_litres_audit) if self.donor_floor is not None: evidence["donor_floor"] = dict(self.donor_floor) + if self.road_fuel_level is not None: + evidence["road_fuel_level"] = dict(self.road_fuel_level) return evidence @@ -397,6 +412,9 @@ def __call__(self, frame: Frame) -> Frame: ~recipient["has_fuel_consumption"].astype(bool), ["petrol_spending", "diesel_spending"], ] = 0.0 + household_draws, road_fuel_level_receipt = lcfs_road_fuel_level( + self.stage, household_draws, weights=weights, lcfs_household=lcfs_household + ) litres_audit = fuel_litres_audit( household_draws, weights=weights, stage=self.stage ) @@ -432,6 +450,7 @@ def __call__(self, frame: Frame) -> Frame: energy_rake=energy_rake_receipt, fuel_litres_audit=litres_audit, donor_floor=donor_floor_receipt, + road_fuel_level=road_fuel_level_receipt, ) return result @@ -555,6 +574,177 @@ def receipts(category: str) -> float: } +@dataclass(frozen=True) +class RoadFuelLevel: + """The household road-fuel level the ``level_road_fuel`` step scales to. + + ``published`` is the ONS Consumer Trends COICOP 07.2.2 spend (fuels and + lubricants for personal transport equipment); ``other_fuels_share`` the + part of it that is neither petrol nor diesel, taken from the LCFS donor's + own split of 07.2.2. ``level`` is what the frame's petrol plus diesel + totals at prior weights after the step. + """ + + published: float + other_fuels_share: float + receipt: Mapping[str, Any] + + @property + def level(self) -> float: + return self.published * (1.0 - self.other_fuels_share) + + +def road_fuel_level_operation(stage: SourceStageSpec) -> Mapping[str, Any] | None: + """The stage's declared ``level_road_fuel`` parameters, if any.""" + + for operation in stage.operations: + if operation.kind == LEVEL_ROAD_FUEL_KIND: + return {"kind": operation.kind, **operation.parameters} + return None + + +def lcfs_other_road_fuel_share(lcfs_household: pd.DataFrame) -> float: + """The donor's weighted share of COICOP 07.2.2 that is neither petrol nor diesel.""" + + household = _lowercase(lcfs_household) + _require_columns( + household, ("weighta", "c72211", "c72212", *UK_LCFS_OTHER_ROAD_FUEL_CODES) + ) + weight = _numeric(household["weighta"]).to_numpy(dtype=float) + other = sum( + _numeric(household[code]).to_numpy(dtype=float) + for code in UK_LCFS_OTHER_ROAD_FUEL_CODES + ) + total = ( + _numeric(household["c72211"]).to_numpy(dtype=float) + + _numeric(household["c72212"]).to_numpy(dtype=float) + + other + ) + denominator = float(np.dot(weight, total)) + if not np.isfinite(denominator) or denominator <= 0: + raise ValueError("LCFS donor records no COICOP 07.2.2 road-fuel spend.") + return float(np.dot(weight, other)) / denominator + + +def road_fuel_level( + parameters: Mapping[str, Any], *, other_fuels_share: float +) -> RoadFuelLevel: + """Resolve the declared ONS road-fuel level from the vendored rows.""" + + columns = tuple(str(column) for column in parameters.get("columns", ())) + if columns != UK_LCFS_ROAD_FUEL_COLUMNS: + raise ValueError( + f"{LEVEL_ROAD_FUEL_KIND} must level {UK_LCFS_ROAD_FUEL_COLUMNS}, " + f"not {columns}." + ) + resource = str(parameters.get("resource") or "") + if resource != UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE: + raise ValueError( + f"{LEVEL_ROAD_FUEL_KIND} must read {UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE!r}, " + f"not {resource!r}." + ) + rule = str(parameters.get("other_fuels_rule") or "") + if rule != UK_LCFS_ROAD_FUEL_OTHER_SHARE_RULE: + raise ValueError( + f"unsupported {LEVEL_ROAD_FUEL_KIND} other_fuels_rule {rule!r}." + ) + codes = tuple(str(code) for code in parameters.get("other_fuels_codes", ())) + if codes != UK_LCFS_OTHER_ROAD_FUEL_CODES: + raise ValueError( + f"{LEVEL_ROAD_FUEL_KIND} other_fuels_codes must be " + f"{UK_LCFS_OTHER_ROAD_FUEL_CODES}, not {codes}." + ) + if str(parameters.get("period_type")) != "calendar_year": + raise ValueError(f"{LEVEL_ROAD_FUEL_KIND} binds a calendar-year ONS level.") + if not 0.0 <= other_fuels_share < 1.0: + raise ValueError(f"other-fuels share {other_fuels_share} is outside [0, 1).") + period_value = int(parameters["period_value"]) + rows = vendored_rows( + resource, + concept=str(parameters["concept"]), + period_type="calendar_year", + period_value=period_value, + geography_id="K02000001", + dimensions={"coicop": str(parameters["coicop"]), "frequency": "annual"}, + ) + if len(rows) != 1: + raise ValueError( + f"{resource}: expected one {parameters['coicop']} row for " + f"{period_value}, found {len(rows)}." + ) + published = float(rows[0]["value"]) + if not np.isfinite(published) or published <= 0: + raise ValueError(f"{resource}: the road-fuel level must be positive.") + receipt = { + "operation": LEVEL_ROAD_FUEL_KIND, + "resource": resource, + "concept": str(parameters["concept"]), + "coicop": str(parameters["coicop"]), + "period_type": "calendar_year", + "period_value": period_value, + "source_record_id": str(rows[0].get("source_record_id", "")), + "published": published, + "other_fuels_rule": rule, + "other_fuels_codes": list(UK_LCFS_OTHER_ROAD_FUEL_CODES), + "other_fuels_share": float(other_fuels_share), + "level": published * (1.0 - other_fuels_share), + "columns": list(UK_LCFS_ROAD_FUEL_COLUMNS), + } + return RoadFuelLevel(published, float(other_fuels_share), receipt) + + +def level_road_fuel( + household_draws: pd.DataFrame, + *, + level: RoadFuelLevel, + weights: Sequence[float], +) -> tuple[pd.DataFrame, dict[str, Any]]: + """Scale petrol and diesel by one factor so the prior-weighted total is the level. + + One factor keeps the drawn petrol/diesel mix and every household's + relative spend; only the level moves (microcosm#1113: the LCFS diary + records about a quarter less road fuel than ONS household spending). + """ + + columns = list(UK_LCFS_ROAD_FUEL_COLUMNS) + weight_values = np.asarray(weights, dtype=float) + spend = household_draws[columns].to_numpy(dtype=float) + before = float(np.dot(weight_values, spend.sum(axis=1))) + if not np.isfinite(before) or before <= 0: + raise ValueError("the frame draws no road-fuel spend to level.") + factor = level.level / before + result = household_draws.copy() + result[columns] = spend * factor + after = result[columns].to_numpy(dtype=float) + petrol = float(np.dot(weight_values, after[:, 0])) + receipt = { + **dict(level.receipt), + "frame_before": before, + "factor": float(factor), + "frame_after": float(np.dot(weight_values, after.sum(axis=1))), + "petrol_share_of_level": petrol / level.level, + } + return result, receipt + + +def lcfs_road_fuel_level( + stage: SourceStageSpec, + household_draws: pd.DataFrame, + *, + weights: Sequence[float], + lcfs_household: pd.DataFrame, +) -> tuple[pd.DataFrame, dict[str, Any] | None]: + """Apply the declared ``level_road_fuel`` step (none if undeclared).""" + + parameters = road_fuel_level_operation(stage) + if parameters is None: + return household_draws, None + level = road_fuel_level( + parameters, other_fuels_share=lcfs_other_road_fuel_share(lcfs_household) + ) + return level_road_fuel(household_draws, level=level, weights=weights) + + @dataclass(frozen=True) class LCFSEnergyPricing: """The declared prices, NEED margins, gas connection and level, with receipts.""" diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py index 2f2642bf1a..f3cbfdef03 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py @@ -77,6 +77,8 @@ def uk_stage_health_gate( return _bus_travel_facts_gate(stage, evidence, parameters) if check == "bus_pricing": return _bus_pricing_gate(stage, evidence, parameters) + if check == "road_fuel_level": + return _road_fuel_level_gate(stage, evidence, parameters) if check == "bus_support_pricing": return _bus_support_pricing_gate(stage, evidence, parameters) return GateResult( @@ -2630,6 +2632,104 @@ def _close(observed: object, value: float) -> bool: ) +def _road_fuel_level_gate( + stage: str, + evidence: Mapping[str, object], + parameters: Mapping[str, object], +) -> GateResult: + """The road-fuel step levelled petrol plus diesel to the published ONS spend. + + Fact checks on the ``road_fuel_level`` receipt (microcosm#1113): the ONS + COICOP 07.2.2 level is recomputed here from the vendored row through the + stage's own declaration (never taken from the receipt) and must equal the + receipt's; the levelled prior-weighted total must equal the published + spend less the donor's other-fuels share, and the factor must reproduce it + from the drawn total, to ``maximum_relative_deviation``. The other-fuels + share comes from the licensed LCFS donor, so it is bounded, not recomputed: + it must lie in [0, ``maximum_other_fuels_share``]. + """ + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + road_fuel_level, + road_fuel_level_operation, + ) + + check = "road_fuel_level" + receipt = _mapping( + evidence.get("road_fuel_level"), label=f"{stage}.road_fuel_level" + ) + tolerance = _finite_number( + parameters.get("maximum_relative_deviation"), + label=f"{stage}.maximum_relative_deviation", + ) + maximum_other = _finite_number( + parameters.get("maximum_other_fuels_share"), + label=f"{stage}.maximum_other_fuels_share", + ) + declared = road_fuel_level_operation( + load_country_spec("uk").sources.stage_map()[stage] + ) + if declared is None: + raise ValueError(f"{stage}: declares no level_road_fuel operation.") + share = _finite_number( + receipt.get("other_fuels_share"), label=f"{stage}.other_fuels_share" + ) + failures: list[str] = [] + if not 0.0 <= share <= maximum_other: + failures.append( + f"{stage}: other-fuels share {share} is outside [0, {maximum_other}]." + ) + share = min(max(share, 0.0), maximum_other) + level = road_fuel_level(declared, other_fuels_share=share) + + def _close(observed: object, value: float) -> bool: + return isinstance(observed, int | float) and abs(float(observed) - value) <= ( + tolerance * max(1.0, abs(value)) + ) + + for key, value in (("published", level.published), ("level", level.level)): + if not _close(receipt.get(key), value): + failures.append( + f"{stage}: road-fuel {key} {receipt.get(key)!r} is not the vendored " + f"{value}." + ) + if receipt.get("source_record_id") != level.receipt["source_record_id"]: + failures.append( + f"{stage}: the receipt names {receipt.get('source_record_id')!r}, not the " + f"declared row {level.receipt['source_record_id']!r}." + ) + if not _close(receipt.get("frame_after"), level.level): + failures.append( + f"{stage}: the levelled road-fuel total {receipt.get('frame_after')!r} is " + f"not the level {level.level}." + ) + before = receipt.get("frame_before") + factor = receipt.get("factor") + if not ( + isinstance(before, int | float) + and isinstance(factor, int | float) + and _close(float(before) * float(factor), level.level) + ): + failures.append( + f"{stage}: factor {factor!r} times the drawn total {before!r} does not " + f"reproduce the level {level.level}." + ) + details = { + "maximum_relative_deviation": tolerance, + "published": level.published, + "other_fuels_share": share, + "level": level.level, + "factor": factor, + "petrol_share_of_level": receipt.get("petrol_share_of_level"), + } + return ( + _fail(stage, check, failures, details) + if failures + else _pass(stage, check, details) + ) + + def _bus_support_pricing_gate( stage: str, evidence: Mapping[str, object], diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index 1125834a14..a2613f3ecb 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -1393,6 +1393,7 @@ def test_declares_the_full_june_battery(self, manifest) -> None: "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", @@ -1500,6 +1501,7 @@ def test_strict_absent_evidence_entries_are_declared(self, manifest) -> None: "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py index 2744d92060..6e197a5540 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py @@ -86,9 +86,11 @@ def test_e6_support_bounds_resources_are_sha_bound_and_non_placeholder() -> None assert lcfs["source"]["person_tab_sha256"] == ( "f32d54d83cdecf023f0ac73530be3a99372099b596e0106a56eae42a64929e50" ) - # Raked columns (energy and, since microcosm#890, bus fares) carry no bounds. - assert len(lcfs["bounds"]) == 14 + # Raked or levelled columns carry no bounds: energy, bus fares since + # microcosm#890, and petrol and diesel since microcosm#1113. + assert len(lcfs["bounds"]) == 12 assert "bus_fare_spending" not in lcfs["bounds"] + assert "petrol_spending" not in lcfs["bounds"] assert vat["source"]["tab_sha256"] == ( "d0e94ebc92e85ca1b9fb3a7353dcaf41db2c5110c9f07c7793dc8c0b695250d8" ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index c83f660a81..5eb9119a8d 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -626,6 +626,9 @@ def _synthetic_lcfs_donor( household[code] = rng.uniform(1.0, 200.0, n) household["c72211"] = np.where(rows % 4 == 0, 0.0, rng.uniform(5.0, 80.0, n)) household["c72212"] = np.where(rows % 4 == 0, 0.0, rng.uniform(0.0, 40.0, n)) + # Other motor fuels inside 07.2.2, deterministic so the draws below keep + # their stream. + household["c72213"] = np.where(rows % 10 == 1, 0.5, 0.0) for code in BUS_FARE_LCFS_CODES: household[code] = np.where(rng.random(n) < 0.55, 0.0, rng.uniform(1.0, 30.0, n)) person = pd.DataFrame( @@ -781,6 +784,24 @@ def materialize(self, frame, variables, period): no_vehicle = household["num_vehicles"].to_numpy() == 0 assert (out.loc[no_vehicle, "petrol_spending"] == 0.0).all() assert 0.95 < evidence["has_fuel_consumption"]["ice_share"]["rate"] < 0.97 + # Road fuel: petrol plus diesel at prior weights is ONS 07.2.2 for 2024 + # less the donor's own other-fuels share (#1113). + level = evidence["road_fuel_level"] + assert level["coicop"] == "07.2.2" and level["period_value"] == 2024 + weight = donor_household["weighta"].to_numpy() + fuels = donor_household[["c72211", "c72212", "c72213"]].to_numpy() + assert level["other_fuels_share"] == pytest.approx( + weight @ fuels[:, 2] / (weight @ fuels.sum(axis=1)) + ) + assert level["level"] == pytest.approx( + level["published"] * (1.0 - level["other_fuels_share"]) + ) + road_fuel = out[["petrol_spending", "diesel_spending"]].to_numpy().sum(axis=1) + assert result.weights_for("household").values @ road_fuel == pytest.approx( + level["level"] + ) + assert level["frame_after"] == pytest.approx(level["level"]) + assert (out.loc[no_vehicle, "diesel_spending"] == 0.0).all() # Bus: fares are journeys times the published yield in every priced region; # Wales keeps the chain's raw draw, clipped to donor support. pricing = evidence["bus_pricing"] @@ -883,6 +904,161 @@ class Stage: assert fuel_litres_audit(draws, weights=weights, stage=Stage()) is None +def test_road_fuel_level_reads_the_vendored_ons_row() -> None: + """The declared level is ONS 07.2.2 for 2024 less the other-fuels share (#1113).""" + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + road_fuel_level, + road_fuel_level_operation, + ) + from microcosm.build.uk_runtime.ledger_fact_vendoring import vendored_rows + + stage = load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + declared = road_fuel_level_operation(stage) + assert declared is not None + kinds = [operation.kind for operation in stage.operations] + assert kinds.index("level_road_fuel") == kinds.index("zero_when_false") + 1 + + level = road_fuel_level(declared, other_fuels_share=0.004) + + (row,) = vendored_rows( + "ons_household_expenditure_facts.json", + concept="ons.household_expenditure.personal_transport_fuels_lubricants", + period_type="calendar_year", + period_value=2024, + geography_id="K02000001", + dimensions={"coicop": "07.2.2", "frequency": "annual"}, + ) + assert level.published == float(row["value"]) + assert level.level == pytest.approx(float(row["value"]) * 0.996) + assert level.receipt["source_record_id"] == row["source_record_id"] + assert level.receipt["columns"] == ["petrol_spending", "diesel_spending"] + assert level.receipt["other_fuels_codes"] == ["c72213"] + + +@pytest.mark.parametrize( + ("change", "match"), + [ + ({"columns": ["petrol_spending"]}, "must level"), + ({"resource": "road_fuel_anchors.json"}, "must read"), + ({"other_fuels_rule": "none"}, "unsupported"), + ({"other_fuels_codes": ["c72213", "c72214"]}, "other_fuels_codes"), + ({"period_type": "fiscal_year"}, "calendar-year"), + ({"period_value": 2019}, "expected one"), + ], +) +def test_road_fuel_level_refuses_a_wrong_declaration(change, match) -> None: + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + road_fuel_level, + road_fuel_level_operation, + ) + + declared = road_fuel_level_operation( + load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + ) + with pytest.raises(ValueError, match=match): + road_fuel_level({**declared, **change}, other_fuels_share=0.0) + + +def test_road_fuel_level_refuses_a_share_outside_the_unit_interval() -> None: + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + road_fuel_level, + road_fuel_level_operation, + ) + + declared = road_fuel_level_operation( + load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + ) + for share in (-0.01, 1.0): + with pytest.raises(ValueError, match="outside"): + road_fuel_level(declared, other_fuels_share=share) + + +def test_level_road_fuel_scales_both_fuels_by_one_factor() -> None: + """One factor: the prior-weighted total is the level and the mix is kept.""" + + from microcosm.build.uk_runtime.lcfs_consumption import ( + RoadFuelLevel, + level_road_fuel, + ) + + draws = pd.DataFrame( + { + "petrol_spending": [1000.0, 0.0, 500.0, 0.0], + "diesel_spending": [0.0, 300.0, 250.0, 0.0], + "food_consumption": [1.0, 2.0, 3.0, 4.0], + } + ) + weights = np.array([2.0, 1.0, 1.0, 5.0]) + level = RoadFuelLevel(5000.0, 0.02, {"operation": "level_road_fuel"}) + + levelled, receipt = level_road_fuel(draws, level=level, weights=weights) + + before = 2.0 * 1000.0 + 300.0 + 750.0 + assert receipt["frame_before"] == pytest.approx(before) + assert receipt["factor"] == pytest.approx(4900.0 / before) + assert receipt["frame_after"] == pytest.approx(4900.0) + np.testing.assert_allclose( + levelled[["petrol_spending", "diesel_spending"]].to_numpy(), + draws[["petrol_spending", "diesel_spending"]].to_numpy() * receipt["factor"], + ) + assert receipt["petrol_share_of_level"] == pytest.approx(2500.0 / before) + assert levelled["food_consumption"].tolist() == [1.0, 2.0, 3.0, 4.0] + assert levelled.loc[3, ["petrol_spending", "diesel_spending"]].tolist() == [ + 0.0, + 0.0, + ] + with pytest.raises(ValueError, match="no road-fuel spend"): + level_road_fuel(draws * 0.0, level=level, weights=weights) + + +def test_other_road_fuel_share_is_the_donor_weighted_c72213_share() -> None: + from microcosm.build.uk_runtime.lcfs_consumption import ( + lcfs_other_road_fuel_share, + ) + + donor = pd.DataFrame( + { + "WEIGHTA": [1.0, 3.0], + "C72211": [10.0, 0.0], + "C72212": [0.0, 5.0], + "C72213": [1.0, 0.0], + } + ) + assert lcfs_other_road_fuel_share(donor) == pytest.approx(1.0 / 26.0) + with pytest.raises(ValueError, match="no COICOP 07.2.2"): + lcfs_other_road_fuel_share(donor.assign(C72211=0.0, C72212=0.0, C72213=0.0)) + with pytest.raises(ValueError, match="c72213"): + lcfs_other_road_fuel_share(donor.drop(columns="C72213")) + + +def test_road_fuel_level_is_a_no_op_when_undeclared() -> None: + import dataclasses + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import lcfs_road_fuel_level + + committed = load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + stage = dataclasses.replace( + committed, + operations=tuple( + operation + for operation in committed.operations + if operation.kind != "level_road_fuel" + ), + ) + draws = pd.DataFrame({"petrol_spending": [1.0], "diesel_spending": [2.0]}) + + levelled, receipt = lcfs_road_fuel_level( + stage, draws, weights=[1.0], lcfs_household=pd.DataFrame() + ) + + assert receipt is None and levelled is draws + + def test_recipient_counts_adults_and_children_by_age_not_engine_flags() -> None: """The LCFS G018/G019 split is age 18, which the recipient counts from age. diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py index 80c888e2cf..7a23d63aa4 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py @@ -620,6 +620,7 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: "price_bus_journeys", "fold_into", "zero_when_false", + "level_road_fuel", "record_mass_conservation_receipt", ] assert [op.kind for op in stages["etb_vat"].operations] == [ diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py index 8d3434b835..a521c0051b 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py @@ -1550,6 +1550,65 @@ def run(ev): run(None) +def test_road_fuel_level_gate_recomputes_the_level_from_the_vendored_row() -> None: + """The lcfs road_fuel_level receipt is fact-checked at stage time (microcosm#1113).""" + + import pandas as pd + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.calibration_run import UK_SPINE_GATE_SCOPE + from microcosm.build.uk_runtime.lcfs_consumption import ( + level_road_fuel, + road_fuel_level, + road_fuel_level_operation, + ) + + gate_id = "uk_stage_lcfs_consumption_road_fuel_level" + assert gate_id in UK_SPINE_GATE_SCOPE + parameters = _gate_parameters(gate_id) + assert parameters["check"] == "road_fuel_level" + declared = road_fuel_level_operation( + load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + ) + draws = pd.DataFrame( + {"petrol_spending": [900.0, 0.0, 400.0], "diesel_spending": [0.0, 700.0, 0.0]} + ) + _, receipt = level_road_fuel( + draws, + level=road_fuel_level(declared, other_fuels_share=0.004), + weights=np.array([1.0e7, 1.5e7, 2.0e7]), + ) + + def run(ev): + return uk_stage_health_gate( + evidence={"stage": "lcfs_consumption", "road_fuel_level": ev}, + stage="lcfs_consumption", + check="road_fuel_level", + parameters=parameters, + ) + + def failing(ev, fragment: str) -> None: + result = run(ev) + assert not result.passed and any(fragment in f for f in result.failures), ( + fragment, + result.failures, + ) + + passed = run(receipt) + assert passed.passed, passed.failures + assert passed.details["level"] == pytest.approx(receipt["level"]) + failing( + {**receipt, "published": receipt["published"] * 1.01}, "road-fuel published" + ) + failing({**receipt, "level": receipt["level"] * 1.01}, "road-fuel level") + failing({**receipt, "frame_after": receipt["frame_after"] * 0.99}, "levelled") + failing({**receipt, "factor": receipt["factor"] * 1.01}, "does not reproduce") + failing({**receipt, "source_record_id": "elsewhere"}, "declared row") + failing({**receipt, "other_fuels_share": 0.2}, "other-fuels share") + with pytest.raises(ValueError, match="road_fuel_level must be an object"): + run(None) + + def test_bus_support_pricing_gate_recomputes_the_factors_from_the_vendored_rows() -> ( None ): diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index 32dee6aa31..5bee7f8ca1 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -416,13 +416,13 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "6be9d4f71cc00815c9ad2c93f0d58f42d7c3ba6417cb8a2ab31ad9bf4c8f73ea" + "5289ea684304066ab7541fa184861a1c4dae72bf3ae200386f0d8a4ba0ec660a" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "8e635a5f341d304b87f277a68c15e1069972836c8858ed69115b972bf6d70b67" + "2ebb6b81d44a82905bec15f64634283eb011c460db3f70a74ff5230c903ad914" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "fea3ba9ad91bd163cd08542872e1bb7627716cb6e4579f6f87de5c8cf83b5eea" + "3e04fbeb7f058269547937323829772807604f26c508755a73402e7554c9b2ab" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -475,6 +475,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_support": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_energy_rake": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_bus_pricing": ("stage_health", "transferred"), + "uk_stage_lcfs_consumption_road_fuel_level": ("stage_health", "transferred"), "uk_stage_etb_vat_support": ("stage_health", "transferred"), "uk_stage_etb_services_support": ("stage_health", "transferred"), "uk_stage_etb_services_support_pricing": ("stage_health", "transferred"), @@ -580,6 +581,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", @@ -798,6 +800,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: "uk_stage_hmrc_spi_income_spine_identity", "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_energy_rake", + "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_lcfs_consumption_support", "uk_stage_nts_bus_travel_facts", "uk_stage_nts_bus_travel_support", @@ -851,10 +854,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: _UK_CERTIFICATION_PART_DIGESTS: Mapping[str, Mapping[str, str]] = { "spine": { "gates_manifest_sha256": ( - "da12b5be6236783cb7af79279175116548d7c99da283e4e45ef40b3ba3cd3168" + "39a636259973ea320adee66bb2d4f8e56f3a699ac391426fc62ce483ec6f61b7" ), "policy_sha256": ( - "447841b7d7e57abf7e64574884b6b3db15ee44f4be09e4863cda066f0005e498" + "1343d2f6afbc8e1b08405d5e58ca0348ecd00b2ab64c36eaea2ba86ee00a609c" ), }, "calibration_seam": { diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index feb52a8890..b97e041737 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -127,13 +127,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "6be9d4f71cc00815c9ad2c93f0d58f42d7c3ba6417cb8a2ab31ad9bf4c8f73ea" + "5289ea684304066ab7541fa184861a1c4dae72bf3ae200386f0d8a4ba0ec660a" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "8e635a5f341d304b87f277a68c15e1069972836c8858ed69115b972bf6d70b67" + "2ebb6b81d44a82905bec15f64634283eb011c460db3f70a74ff5230c903ad914" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "fea3ba9ad91bd163cd08542872e1bb7627716cb6e4579f6f87de5c8cf83b5eea" + "3e04fbeb7f058269547937323829772807604f26c508755a73402e7554c9b2ab" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" @@ -170,6 +170,7 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: "uk_stage_lcfs_consumption_support": ("stage_health", "transferred", None), "uk_stage_lcfs_consumption_energy_rake": ("stage_health", "transferred", None), "uk_stage_lcfs_consumption_bus_pricing": ("stage_health", "transferred", None), + "uk_stage_lcfs_consumption_road_fuel_level": ("stage_health", "transferred", None), "uk_stage_nts_bus_travel_support": ("stage_health", "transferred", None), "uk_stage_nts_bus_travel_facts": ("stage_health", "transferred", None), "uk_stage_etb_vat_support": ("stage_health", "transferred", None), @@ -1269,6 +1270,7 @@ def _gate_battery_payload( "uk_stage_lcfs_consumption_support": "lcfs_consumption", "uk_stage_lcfs_consumption_energy_rake": "lcfs_consumption", "uk_stage_lcfs_consumption_bus_pricing": "lcfs_consumption", + "uk_stage_lcfs_consumption_road_fuel_level": "lcfs_consumption", "uk_stage_nts_bus_travel_support": "nts_bus_travel", "uk_stage_nts_bus_travel_facts": "nts_bus_travel", "uk_stage_etb_vat_support": "etb_vat", From b609d07678a12dffc4f111e5267075786b40bfe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 8 Oct 2026 16:32:24 +0100 Subject: [PATCH 03/18] Give every flagged fuel-car household a positive road-fuel spend (#1113) The LCFS diary covers two weeks, so about a third of car-owning donors record no fuel purchase, and the chain reproduced that zero share among the households the fuel flag marks as buying petrol or diesel (34.3% at prior weights on #1121's head). Over a year such a car is refuelled; binding the OBR cars row had moved weight off those households to compensate. A declared redraw_zero_road_fuel step, between the fuel flag's zeroing and the level step, redraws a flagged household whose chain draw is zero from the donor's distribution among households with positive road fuel, on the chain's predictors. A weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, which keeps diesel-only and mixed households. The quantiles are keyed on the household id (predict_from_uniforms), so a household's draw doesn't depend on row order. Positive chain draws are kept, and the level step then rescales the total. - The receipt records the flagged zero share before and after, the mean among positive households before, the redrawn mean and mix, and the model's regimes. Its two fits add fit-weight records. - The uk_stage_lcfs_consumption_road_fuel_incidence gate checks the declared rule, seed, salt and trees; that no flagged household is left at zero and no unflagged one carries fuel; and the total's positive-only regime. It fails if the chain's zero share passes one half, which would point at the chain rather than the diary. - The end-to-end stage test's synthetic donor now has one-car diaries with no purchase, so the redraw runs there, and the stage's receipts pass both road-fuel gates. - Mirrors: operation schema and kind, stage_health parameter vocabulary, spine gate scope, gate-battery digests and entry lists, coverage manifest, seed pin. Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/source_manifest.py | 1 + .../spec_engine/schema/sources.schema.json | 41 +++ .../src/microcosm/build/uk/gates.json | 14 + .../uk/release_input_coverage_manifest.json | 34 +-- .../src/microcosm/build/uk/source_stages.json | 14 +- .../src/microcosm/build/uk/spec/sources.yaml | 11 +- .../build/uk_runtime/battery_bindings.py | 3 + .../build/uk_runtime/calibration_run.py | 1 + .../build/uk_runtime/lcfs_consumption.py | 220 +++++++++++++++- .../build/uk_runtime/stage_health.py | 87 +++++++ .../engine_free/shared/test_country_spec.py | 2 + .../uk/test_uk_lcfs_consumption.py | 245 +++++++++++++++++- .../engine_free/uk/test_uk_source_stages.py | 3 + .../engine_free/uk/test_uk_stage_health.py | 66 +++++ .../src/microcosm/data/contract.py | 13 +- .../tests/engine_free/shared/test_contract.py | 12 +- 16 files changed, 735 insertions(+), 32 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/source_manifest.py b/packages/microcosm-build/src/microcosm/build/source_manifest.py index 7fcb689adc..84a10e859f 100644 --- a/packages/microcosm-build/src/microcosm/build/source_manifest.py +++ b/packages/microcosm-build/src/microcosm/build/source_manifest.py @@ -143,6 +143,7 @@ "impute_weeks_unemployed_to_puf_support", "iterative_proportional_fit", "level_road_fuel", + "redraw_zero_road_fuel", "pair_clone_households_to_originals", "price_domestic_energy", "price_bus_journeys", diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index 09516c22e4..023c27be01 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -11176,6 +11176,47 @@ } } } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "columns", + "flag", + "rule", + "seed", + "salt", + "n_estimators" + ], + "properties": { + "kind": { + "const": "redraw_zero_road_fuel" + }, + "columns": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "flag": { + "type": "string" + }, + "rule": { + "type": "string" + }, + "seed": { + "type": "integer" + }, + "salt": { + "type": "string" + }, + "n_estimators": { + "type": "integer", + "minimum": 1 + } + } } ], "description": "Closed kind-discriminated source artifact and operation records, covering the packaged US, UK, and BE source vocabularies." diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 956ce9376b..e4b2786fcb 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -346,6 +346,20 @@ }, "notes": "Stage-time fact check on the lcfs bus_pricing receipt (microcosm#930): every area's receipts, boardings, concessionary journeys, trips per resident and population, and the boardings-per-trip and yield factors derived from them, are recomputed from the vendored rows the stage declares and must equal the receipt's; the unpriced regions must be the declared ones (Wales, which keeps the chain's raw draw by María's ruling of 2026-09-17) and the chain must have conditioned on the raw draw. The frame-implied boardings over the published ones are reported per area, not fenced: that ratio is the survey-versus-admin reading the bound receipts targets then act on. A population fact check: the synthetic smoke records it without blocking." }, + { + "id": "uk_stage_lcfs_consumption_road_fuel_incidence", + "gate": "stage_health", + "phase": "transferred", + "criticality": "release_blocking", + "evidence_absent_blocks": true, + "population_fact_check": true, + "parameters": { + "stage": "lcfs_consumption", + "check": "road_fuel_incidence", + "maximum_flagged_zero_share": 0.5 + }, + "notes": "Stage-time check on the lcfs road_fuel_incidence receipt (microcosm#1113): the redraw ran with the declared rule, seed, salt and trees; after it no household the fuel flag marks as buying petrol or diesel carries zero road fuel and no unflagged household carries any; the total model fitted the positive-only regime. The chain's zero share among flagged households is the two-week diary's artefact the step corrects (about a third at prior weights on the 2026-10-08 spine); above one half the chain itself would be at fault, so the gate fails there instead of redrawing it away. María's ruling of 2026-10-08 set every fuel-car household to a positive annual spend. A population fact check: the synthetic smoke records it without blocking." + }, { "id": "uk_stage_lcfs_consumption_road_fuel_level", "gate": "stage_health", diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 1895f87645..52feeab0a0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "067ba21c12aeb4e95e6a8a16141dbaa075e8787ed875a005f549cab6e91a6b56", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,7 +760,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", "survey": "Living Costs and Food Survey 2023-24" @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "62e7c85a8fa74381aa9a57618cc75b33c9303a43c24b2e52da94eb041a59e017", + "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index aec2e27f45..dfe55285db 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -3857,6 +3857,18 @@ ], "condition": "has_fuel_consumption == false" }, + { + "kind": "redraw_zero_road_fuel", + "columns": [ + "petrol_spending", + "diesel_spending" + ], + "flag": "has_fuel_consumption", + "rule": "positive_total_then_petrol_share", + "seed": 0, + "salt": "lcfs_positive_road_fuel", + "n_estimators": 100 + }, { "kind": "level_road_fuel", "columns": [ @@ -3923,7 +3935,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel is levelled by the declared level_road_fuel step (microcosm#1113): after the fuel flag zeroes the households without a fuel car, one factor scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 8ab85c0d80..15ef13ed87 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -3167,6 +3167,15 @@ stages: - petrol_spending - diesel_spending condition: has_fuel_consumption == false + - kind: redraw_zero_road_fuel + columns: + - petrol_spending + - diesel_spending + flag: has_fuel_consumption + rule: positive_total_then_petrol_share + seed: 0 + salt: lcfs_positive_road_fuel + n_estimators: 100 - kind: level_road_fuel columns: - petrol_spending @@ -3224,7 +3233,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel is levelled by the declared level_road_fuel step (microcosm#1113): after the fuel flag zeroes the households without a fuel car, one factor scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns.' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns.' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py index f5cdc738ba..8baaa61fc6 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py @@ -1790,6 +1790,9 @@ def _ledger_compile_parity_required_artifacts( # #1113 road_fuel_level check: the ceiling on the LCFS donor # share of other personal-transport fuels netted off 07.2.2. "maximum_other_fuels_share", + # #1113 road_fuel_incidence check: the ceiling on the chain's + # zero share among flagged fuel-car households. + "maximum_flagged_zero_share", } ), artifact_keys=frozenset({"stage_evidence"}), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 13c1317d64..08f002d933 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py @@ -97,6 +97,7 @@ "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index 6ec03b5f81..d769f013a9 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -198,6 +198,13 @@ #: (c72212): other motor fuels and oils, which ONS's 07.2.2 also carries. UK_LCFS_OTHER_ROAD_FUEL_CODES = ("c72213",) UK_LCFS_ROAD_FUEL_OTHER_SHARE_RULE = "lcfs_donor_other_fuels_share" +REDRAW_ZERO_ROAD_FUEL_KIND = "redraw_zero_road_fuel" +UK_LCFS_ROAD_FUEL_REDRAW_RULE = "positive_total_then_petrol_share" +#: The redraw's chain targets: the household's road-fuel total, positive by +#: construction of the training set, then the petrol share of it (zero for a +#: diesel-only household). +UK_LCFS_ROAD_FUEL_TOTAL = "road_fuel_total" +UK_LCFS_PETROL_SHARE = "petrol_share_of_road_fuel" UK_LCFS_ICE_SHARE_RULE = "one_minus_zero_emission_share" #: The litres audit (microcosm#890 C7) reads these vendored concepts beside the #: declared litre-proxy price concepts: HMRC clearances are all road users, the @@ -279,6 +286,7 @@ class UKLCFSConsumptionResult: energy_rake: Mapping[str, Any] | None = None fuel_litres_audit: Mapping[str, Any] | None = None donor_floor: Mapping[str, Any] | None = None + road_fuel_incidence: Mapping[str, Any] | None = None road_fuel_level: Mapping[str, Any] | None = None def evidence(self) -> dict[str, object]: @@ -300,6 +308,8 @@ def evidence(self) -> dict[str, object]: evidence["fuel_litres_audit"] = dict(self.fuel_litres_audit) if self.donor_floor is not None: evidence["donor_floor"] = dict(self.donor_floor) + if self.road_fuel_incidence is not None: + evidence["road_fuel_incidence"] = dict(self.road_fuel_incidence) if self.road_fuel_level is not None: evidence["road_fuel_level"] = dict(self.road_fuel_level) return evidence @@ -412,6 +422,15 @@ def __call__(self, frame: Frame) -> Frame: ~recipient["has_fuel_consumption"].astype(bool), ["petrol_spending", "diesel_spending"], ] = 0.0 + incidence = lcfs_road_fuel_incidence( + self.stage, + household_draws, + donor=donor, + recipient=recipient, + household_ids=frame.table("household")["household_id"].to_numpy(), + weights=weights, + ) + household_draws = incidence.draws household_draws, road_fuel_level_receipt = lcfs_road_fuel_level( self.stage, household_draws, weights=weights, lcfs_household=lcfs_household ) @@ -439,7 +458,10 @@ def __call__(self, frame: Frame) -> Frame: ), ) validate_uk_national_frame(result) - self.last_fit_weight_records = imputation.fit_weight_records + self.last_fit_weight_records = ( + *imputation.fit_weight_records, + *incidence.fit_weight_records, + ) self.last_result = UKLCFSConsumptionResult( frame=result, support_clip=clip_result.receipt, @@ -450,6 +472,7 @@ def __call__(self, frame: Frame) -> Frame: energy_rake=energy_rake_receipt, fuel_litres_audit=litres_audit, donor_floor=donor_floor_receipt, + road_fuel_incidence=incidence.receipt, road_fuel_level=road_fuel_level_receipt, ) return result @@ -574,6 +597,201 @@ def receipts(category: str) -> float: } +@dataclass(frozen=True) +class RoadFuelIncidence: + """Road-fuel draws after the incidence redraw, its receipt and fit records.""" + + draws: pd.DataFrame + receipt: Mapping[str, Any] | None + fit_weight_records: tuple[FitWeightRecord, ...] = () + + +def road_fuel_incidence_operation(stage: SourceStageSpec) -> Mapping[str, Any] | None: + """The stage's declared ``redraw_zero_road_fuel`` parameters, if any.""" + + for operation in stage.operations: + if operation.kind == REDRAW_ZERO_ROAD_FUEL_KIND: + return {"kind": operation.kind, **operation.parameters} + return None + + +def redraw_zero_road_fuel( + household_draws: pd.DataFrame, + *, + donor: pd.DataFrame, + recipient: pd.DataFrame, + flagged: np.ndarray, + household_ids: np.ndarray, + weights: Sequence[float], + parameters: Mapping[str, Any], +) -> RoadFuelIncidence: + """Give every household the fuel flag marks a positive road-fuel spend. + + The LCFS diary covers two weeks, so about a third of car-owning donors + record no fuel purchase and the chain reproduces that zero share among the + households the fuel flag marks as buying petrol or diesel; over a year + such a car is refuelled. For a flagged household whose chain draw is zero, + petrol plus diesel is redrawn from the donor's conditional distribution + among households with positive road fuel, on the chain's predictors: a + weighted regime-gated QRF draws the total, positive by construction, then + the petrol share of it (which keeps diesel-only and mixed households), at + quantiles keyed on the household id. Positive draws are kept; the level + step then rescales the total (microcosm#1113). + """ + + from microcosm.fit.qrf import Regime, RegimeGatedQRF + + columns = tuple(str(column) for column in parameters.get("columns", ())) + if columns != UK_LCFS_ROAD_FUEL_COLUMNS: + raise ValueError( + f"{REDRAW_ZERO_ROAD_FUEL_KIND} must redraw {UK_LCFS_ROAD_FUEL_COLUMNS}, " + f"not {columns}." + ) + if parameters.get("flag") != "has_fuel_consumption": + raise ValueError( + f"{REDRAW_ZERO_ROAD_FUEL_KIND} must redraw the has_fuel_consumption " + "households." + ) + rule = str(parameters.get("rule") or "") + if rule != UK_LCFS_ROAD_FUEL_REDRAW_RULE: + raise ValueError(f"unsupported {REDRAW_ZERO_ROAD_FUEL_KIND} rule {rule!r}.") + seed = parameters.get("seed") + n_estimators = parameters.get("n_estimators") + salt = parameters.get("salt") + if not isinstance(seed, int) or not isinstance(n_estimators, int): + raise ValueError(f"{REDRAW_ZERO_ROAD_FUEL_KIND} needs integer seed and trees.") + if not isinstance(salt, str) or not salt: + raise ValueError(f"{REDRAW_ZERO_ROAD_FUEL_KIND} needs a declared salt.") + flagged = np.asarray(flagged, dtype=bool) + weight = np.asarray(weights, dtype=float) + spend = household_draws[list(columns)].to_numpy(dtype=float) + before = spend.sum(axis=1) + zero = flagged & ~(before > 0) + redrawn = household_draws.copy() + regimes: dict[str, str] | None = None + training_rows = 0 + records: tuple[FitWeightRecord, ...] = () + if zero.any(): + donor_encoded, recipient_encoded, predictors = _encode_consumption_predictors( + donor, recipient + ) + donor_total = donor_encoded["petrol_spending"].to_numpy( + dtype=float + ) + donor_encoded["diesel_spending"].to_numpy(dtype=float) + positive = donor_total > 0 + training_rows = int(positive.sum()) + if training_rows == 0: + raise ValueError("LCFS donor records no positive road-fuel spend.") + train = donor_encoded.loc[positive, [*predictors, "household_weight"]] + train = train.reset_index(drop=True) + train[UK_LCFS_ROAD_FUEL_TOTAL] = donor_total[positive] + train[UK_LCFS_PETROL_SHARE] = ( + donor_encoded.loc[positive, "petrol_spending"].to_numpy(dtype=float) + / donor_total[positive] + ) + targets = [UK_LCFS_ROAD_FUEL_TOTAL, UK_LCFS_PETROL_SHARE] + fitted = RegimeGatedQRF(n_estimators=n_estimators, seed=seed).fit( + train, list(predictors), targets, weights="household_weight" + ) + regimes = {target: str(regime) for target, regime in fitted.regimes().items()} + if regimes[UK_LCFS_ROAD_FUEL_TOTAL] != Regime.POSITIVE_ONLY: + raise ValueError( + f"the road-fuel total fitted regime {regimes[UK_LCFS_ROAD_FUEL_TOTAL]!r}" + f", not {Regime.POSITIVE_ONLY!r}." + ) + ids = np.asarray(household_ids)[zero] + drawn = fitted.predict_from_uniforms( + recipient_encoded.loc[zero, list(predictors)].reset_index(drop=True), + quantiles={ + target: stable_identity_uniforms( + ids, seed=seed, salt=f"{salt}:{target}" + ) + for target in targets + }, + sign_uniforms={ + target: stable_identity_uniforms( + ids, seed=seed, salt=f"{salt}:{target}:sign" + ) + for target in targets + }, + ) + total = drawn[UK_LCFS_ROAD_FUEL_TOTAL].to_numpy(dtype=float) + share = np.clip(drawn[UK_LCFS_PETROL_SHARE].to_numpy(dtype=float), 0.0, 1.0) + rows = np.flatnonzero(zero) + redrawn.iloc[rows, redrawn.columns.get_loc("petrol_spending")] = share * total + redrawn.iloc[rows, redrawn.columns.get_loc("diesel_spending")] = ( + 1.0 - share + ) * total + records = tuple( + FitWeightRecord( + f"{UK_LCFS_CONSUMPTION_FIT_NAME}:{target}", fitted.weight_kind + ) + for target in targets + ) + after_spend = redrawn[list(columns)].to_numpy(dtype=float) + after = after_spend.sum(axis=1) + + def weighted_mean(values: np.ndarray, mask: np.ndarray) -> float | None: + mass = float(weight[mask].sum()) + return float(np.dot(weight[mask], values[mask]) / mass) if mass > 0 else None + + flagged_mass = float(weight[flagged].sum()) + redrawn_total = float(np.dot(weight[zero], after[zero])) + receipt = { + "operation": REDRAW_ZERO_ROAD_FUEL_KIND, + "rule": rule, + "seed": seed, + "salt": salt, + "n_estimators": n_estimators, + "columns": list(columns), + "regimes": regimes, + "training_rows": training_rows, + "flagged_households": int(flagged.sum()), + "flagged_zero_before": int(zero.sum()), + "flagged_zero_share_before": ( + float(weight[zero].sum()) / flagged_mass if flagged_mass > 0 else 0.0 + ), + "flagged_zero_after": int((flagged & ~(after > 0)).sum()), + "unflagged_with_fuel": int((~flagged & (after > 0)).sum()), + "mean_positive_before": weighted_mean(before, flagged & (before > 0)), + "mean_redrawn": weighted_mean(after, zero), + "mean_flagged_after": weighted_mean(after, flagged), + "redrawn_petrol_share": ( + float(np.dot(weight[zero], after_spend[zero, 0])) / redrawn_total + if redrawn_total > 0 + else None + ), + "weighted_total_before": float(np.dot(weight, before)), + "weighted_total_after": float(np.dot(weight, after)), + } + return RoadFuelIncidence(redrawn, receipt, records) + + +def lcfs_road_fuel_incidence( + stage: SourceStageSpec, + household_draws: pd.DataFrame, + *, + donor: pd.DataFrame, + recipient: pd.DataFrame, + household_ids: np.ndarray, + weights: Sequence[float], +) -> RoadFuelIncidence: + """Apply the declared ``redraw_zero_road_fuel`` step (none if undeclared).""" + + parameters = road_fuel_incidence_operation(stage) + if parameters is None: + return RoadFuelIncidence(household_draws, None) + return redraw_zero_road_fuel( + household_draws, + donor=donor, + recipient=recipient, + flagged=recipient["has_fuel_consumption"].to_numpy(dtype=bool), + household_ids=household_ids, + weights=weights, + parameters=parameters, + ) + + @dataclass(frozen=True) class RoadFuelLevel: """The household road-fuel level the ``level_road_fuel`` step scales to. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py index f3cbfdef03..efbce43859 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py @@ -77,6 +77,8 @@ def uk_stage_health_gate( return _bus_travel_facts_gate(stage, evidence, parameters) if check == "bus_pricing": return _bus_pricing_gate(stage, evidence, parameters) + if check == "road_fuel_incidence": + return _road_fuel_incidence_gate(stage, evidence, parameters) if check == "road_fuel_level": return _road_fuel_level_gate(stage, evidence, parameters) if check == "bus_support_pricing": @@ -2632,6 +2634,91 @@ def _close(observed: object, value: float) -> bool: ) +def _road_fuel_incidence_gate( + stage: str, + evidence: Mapping[str, object], + parameters: Mapping[str, object], +) -> GateResult: + """Every household the fuel flag marks carries road fuel after the redraw. + + Checks on the ``road_fuel_incidence`` receipt (microcosm#1113): the redraw + ran with the stage's declared rule, seed, salt and trees; no flagged + household is left at zero and no unflagged household carries fuel; the + total model fitted the positive-only regime; and the chain's zero share + among flagged households, the diary artefact the step corrects, is at most + ``maximum_flagged_zero_share`` (a larger share would mean the chain, not + the two-week diary, is at fault). + """ + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_ROAD_FUEL_TOTAL, + road_fuel_incidence_operation, + ) + + check = "road_fuel_incidence" + receipt = _mapping( + evidence.get("road_fuel_incidence"), label=f"{stage}.road_fuel_incidence" + ) + maximum_zero_share = _finite_number( + parameters.get("maximum_flagged_zero_share"), + label=f"{stage}.maximum_flagged_zero_share", + ) + declared = road_fuel_incidence_operation( + load_country_spec("uk").sources.stage_map()[stage] + ) + if declared is None: + raise ValueError(f"{stage}: declares no redraw_zero_road_fuel operation.") + failures: list[str] = [] + for key in ("rule", "seed", "salt", "n_estimators"): + if receipt.get(key) != declared.get(key): + failures.append( + f"{stage}: the redraw ran with {key} {receipt.get(key)!r}, not the " + f"declared {declared.get(key)!r}." + ) + for key in ("flagged_zero_after", "unflagged_with_fuel"): + value = receipt.get(key) + if isinstance(value, bool) or not isinstance(value, int) or value != 0: + failures.append(f"{stage}: {key} is {value!r}, not 0.") + zero_before = receipt.get("flagged_zero_before") + if isinstance(zero_before, bool) or not isinstance(zero_before, int): + failures.append(f"{stage}: flagged_zero_before {zero_before!r} is not a count.") + elif zero_before > 0: + regimes = receipt.get("regimes") + regime = ( + regimes.get(UK_LCFS_ROAD_FUEL_TOTAL) + if isinstance(regimes, Mapping) + else None + ) + if regime != "positive_only": + failures.append( + f"{stage}: the road-fuel total fitted regime {regime!r}, not " + "'positive_only'." + ) + share = _finite_number( + receipt.get("flagged_zero_share_before"), + label=f"{stage}.flagged_zero_share_before", + ) + if not 0.0 <= share <= maximum_zero_share: + failures.append( + f"{stage}: the chain left {share:.4f} of flagged households at zero road " + f"fuel, outside [0, {maximum_zero_share}]." + ) + details = { + "maximum_flagged_zero_share": maximum_zero_share, + "flagged_households": receipt.get("flagged_households"), + "flagged_zero_before": zero_before, + "flagged_zero_share_before": share, + "mean_positive_before": receipt.get("mean_positive_before"), + "mean_redrawn": receipt.get("mean_redrawn"), + } + return ( + _fail(stage, check, failures, details) + if failures + else _pass(stage, check, details) + ) + + def _road_fuel_level_gate( stage: str, evidence: Mapping[str, object], diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index a2613f3ecb..8ae859a068 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -1393,6 +1393,7 @@ def test_declares_the_full_june_battery(self, manifest) -> None: "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", @@ -1501,6 +1502,7 @@ def test_strict_absent_evidence_entries_are_declared(self, manifest) -> None: "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index 5eb9119a8d..d4e4424d88 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -624,8 +624,11 @@ def _synthetic_lcfs_donor( "p612", ): household[code] = rng.uniform(1.0, 200.0, n) - household["c72211"] = np.where(rows % 4 == 0, 0.0, rng.uniform(5.0, 80.0, n)) - household["c72212"] = np.where(rows % 4 == 0, 0.0, rng.uniform(0.0, 40.0, n)) + # No fuel without a car, and half the one-car diaries record no purchase + # either (the two-week diary's zeros the road-fuel redraw corrects). + no_fuel = (rows % 4 == 0) | (rows % 8 == 1) + household["c72211"] = np.where(no_fuel, 0.0, rng.uniform(5.0, 80.0, n)) + household["c72212"] = np.where(no_fuel, 0.0, rng.uniform(0.0, 40.0, n)) # Other motor fuels inside 07.2.2, deterministic so the draws below keep # their stream. household["c72213"] = np.where(rows % 10 == 1, 0.5, 0.0) @@ -748,7 +751,11 @@ def materialize(self, frame, variables, period): out = result.table("household") assert set(UK_LCFS_CONSUMPTION_OUTPUT_COLUMNS) <= set(out.columns) - assert len(transform.fit_weight_records) == 18 + # The 18 chain targets, then the road-fuel redraw's total and petrol share. + assert len(transform.fit_weight_records) == 20 + assert transform.fit_weight_records[-1].fit_name.endswith( + ":petrol_share_of_road_fuel" + ) from microcosm.build.uk_runtime.lcfs_consumption import ( UK_LCFS_CONSUMPTION_MASS_CONSERVATION_REASON, ) @@ -802,6 +809,31 @@ def materialize(self, frame, variables, period): ) assert level["frame_after"] == pytest.approx(level["level"]) assert (out.loc[no_vehicle, "diesel_spending"] == 0.0).all() + # Incidence: every flagged fuel-car household carries road fuel (#1113). + flagged = out["has_fuel_consumption"].to_numpy(dtype=bool) + assert (road_fuel[flagged] > 0).all() and (road_fuel[~flagged] == 0).all() + incidence = evidence["road_fuel_incidence"] + assert incidence["flagged_zero_before"] > 0 + assert incidence["flagged_zero_after"] == 0 + assert incidence["regimes"]["road_fuel_total"] == "positive_only" + assert level["frame_before"] == pytest.approx(incidence["weighted_total_after"]) + # The receipts the stage writes are the ones its gates read. + from microcosm.build.uk_runtime.stage_health import uk_stage_health_gate + + gates = [ + gate + for gate in load_country_spec("uk").gates.gates + if gate.id.startswith("uk_stage_lcfs_consumption_road_fuel") + ] + assert len(gates) == 2 + for gate in gates: + checked = uk_stage_health_gate( + evidence=evidence, + stage="lcfs_consumption", + check=gate.parameters["check"], + parameters=gate.parameters, + ) + assert checked.passed, checked.failures # Bus: fares are journeys times the published yield in every priced region; # Wales keeps the chain's raw draw, clipped to donor support. pricing = evidence["bus_pricing"] @@ -918,7 +950,8 @@ def test_road_fuel_level_reads_the_vendored_ons_row() -> None: declared = road_fuel_level_operation(stage) assert declared is not None kinds = [operation.kind for operation in stage.operations] - assert kinds.index("level_road_fuel") == kinds.index("zero_when_false") + 1 + assert kinds.index("redraw_zero_road_fuel") == kinds.index("zero_when_false") + 1 + assert kinds.index("level_road_fuel") == kinds.index("redraw_zero_road_fuel") + 1 level = road_fuel_level(declared, other_fuels_share=0.004) @@ -1059,6 +1092,210 @@ def test_road_fuel_level_is_a_no_op_when_undeclared() -> None: assert receipt is None and levelled is draws +_ROAD_FUEL = ["petrol_spending", "diesel_spending"] + + +def _road_fuel_sides( + seed: int = 5, +) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: + """A donor with none, petrol, diesel and both, and zeroed recipient draws.""" + + rng = np.random.default_rng(seed) + + def side(n: int) -> pd.DataFrame: + rows = np.arange(n) + return pd.DataFrame( + { + "household_adult_count": 1 + rows % 3, + "household_child_count": rows % 2, + "region": np.array(["LONDON", "WALES", "SCOTLAND"])[rows % 3], + "employment_income": rng.uniform(0.0, 5e4, n), + "self_employment_income": rng.uniform(0.0, 5e3, n), + "private_pension_income": rng.uniform(0.0, 1e4, n), + "hbai_household_net_income": rng.uniform(1e4, 6e4, n), + "tenure_type": np.array(["OWNED_OUTRIGHT", "RENT_PRIVATELY"])[rows % 2], + "accommodation_type": np.array(["FLAT", "HOUSE_DETACHED"])[rows % 2], + "num_vehicles": rows % 3, + } + ) + + donor = side(200) + kind = np.arange(200) % 4 + donor["petrol_spending"] = np.where(kind % 2 == 1, rng.uniform(300, 2e3, 200), 0.0) + donor["diesel_spending"] = np.where(kind >= 2, rng.uniform(300, 2e3, 200), 0.0) + donor["household_weight"] = rng.uniform(500.0, 2000.0, 200) + recipient = side(40) + recipient["has_fuel_consumption"] = recipient["num_vehicles"].to_numpy() > 0 + rows = np.arange(40) + draws = pd.DataFrame( + { + "petrol_spending": np.where(rows % 4 == 1, 800.0, 0.0), + "diesel_spending": np.where(rows % 4 == 2, 600.0, 0.0), + "food_and_non_alcoholic_beverages_consumption": 1.0 + rows, + } + ) + draws.loc[~recipient["has_fuel_consumption"], _ROAD_FUEL] = 0.0 + return donor, recipient, draws + + +def _redraw_declaration() -> dict: + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + road_fuel_incidence_operation, + ) + + declared = road_fuel_incidence_operation( + load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + ) + assert declared is not None + return {**declared, "n_estimators": 10} + + +def test_redraw_gives_every_flagged_household_road_fuel() -> None: + """Zero draws among flagged households come from the positive-fuel donors (#1113).""" + + from microcosm.build.uk_runtime.lcfs_consumption import redraw_zero_road_fuel + + donor, recipient, draws = _road_fuel_sides() + flagged = recipient["has_fuel_consumption"].to_numpy(dtype=bool) + weights = np.linspace(1.0, 2.0, 40) + + result = redraw_zero_road_fuel( + draws, + donor=donor, + recipient=recipient, + flagged=flagged, + household_ids=np.arange(101, 141), + weights=weights, + parameters=_redraw_declaration(), + ) + + before = draws[_ROAD_FUEL].to_numpy() + after = result.draws[_ROAD_FUEL].to_numpy() + zero = flagged & (before.sum(axis=1) == 0) + assert zero.sum() > 0 + assert (after.sum(axis=1)[flagged] > 0).all() + assert (after.sum(axis=1)[~flagged] == 0).all() and (after >= 0).all() + np.testing.assert_array_equal(after[~zero], before[~zero]) + donor_total = donor[_ROAD_FUEL].to_numpy().sum(axis=1) + assert after.sum(axis=1)[zero].max() <= donor_total.max() + 1e-9 + assert result.draws["food_and_non_alcoholic_beverages_consumption"].equals( + draws["food_and_non_alcoholic_beverages_consumption"] + ) + receipt = result.receipt + assert receipt["flagged_zero_before"] == int(zero.sum()) + assert receipt["flagged_zero_after"] == 0 and receipt["unflagged_with_fuel"] == 0 + assert receipt["flagged_zero_share_before"] == pytest.approx( + weights[zero].sum() / weights[flagged].sum() + ) + assert receipt["training_rows"] == int((donor_total > 0).sum()) + assert receipt["regimes"] == { + "road_fuel_total": "positive_only", + "petrol_share_of_road_fuel": "zero_inflated_positive", + } + assert receipt["mean_positive_before"] == pytest.approx( + weights[flagged & ~zero] + @ before.sum(axis=1)[flagged & ~zero] + / weights[flagged & ~zero].sum() + ) + assert receipt["weighted_total_after"] == pytest.approx(weights @ after.sum(axis=1)) + assert [record.fit_name for record in result.fit_weight_records] == [ + "uk_lcfs_2023_24_consumption:road_fuel_total", + "uk_lcfs_2023_24_consumption:petrol_share_of_road_fuel", + ] + + +def test_redraw_is_keyed_on_household_identity_not_row_order() -> None: + from microcosm.build.uk_runtime.lcfs_consumption import redraw_zero_road_fuel + + donor, recipient, draws = _road_fuel_sides() + flagged = recipient["has_fuel_consumption"].to_numpy(dtype=bool) + ids = np.arange(101, 141) + weights = np.linspace(1.0, 2.0, 40) + parameters = _redraw_declaration() + base = redraw_zero_road_fuel( + draws, + donor=donor, + recipient=recipient, + flagged=flagged, + household_ids=ids, + weights=weights, + parameters=parameters, + ) + order = np.random.default_rng(0).permutation(40) + + shuffled = redraw_zero_road_fuel( + draws.iloc[order].reset_index(drop=True), + donor=donor, + recipient=recipient.iloc[order].reset_index(drop=True), + flagged=flagged[order], + household_ids=ids[order], + weights=weights[order], + parameters=parameters, + ) + + np.testing.assert_allclose( + shuffled.draws[_ROAD_FUEL].to_numpy(), + base.draws[_ROAD_FUEL].to_numpy()[order], + ) + + +@pytest.mark.parametrize( + ("change", "match"), + [ + ({"columns": ["petrol_spending"]}, "must redraw"), + ({"flag": "num_vehicles"}, "has_fuel_consumption"), + ({"rule": "zero_inflated"}, "unsupported"), + ({"seed": "0"}, "integer seed"), + ({"salt": ""}, "salt"), + ], +) +def test_redraw_refuses_a_wrong_declaration(change, match) -> None: + from microcosm.build.uk_runtime.lcfs_consumption import redraw_zero_road_fuel + + donor, recipient, draws = _road_fuel_sides() + with pytest.raises(ValueError, match=match): + redraw_zero_road_fuel( + draws, + donor=donor, + recipient=recipient, + flagged=recipient["has_fuel_consumption"].to_numpy(dtype=bool), + household_ids=np.arange(40), + weights=np.ones(40), + parameters={**_redraw_declaration(), **change}, + ) + + +def test_redraw_is_a_no_op_when_undeclared() -> None: + import dataclasses + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import lcfs_road_fuel_incidence + + committed = load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + stage = dataclasses.replace( + committed, + operations=tuple( + operation + for operation in committed.operations + if operation.kind != "redraw_zero_road_fuel" + ), + ) + donor, recipient, draws = _road_fuel_sides() + + result = lcfs_road_fuel_incidence( + stage, + draws, + donor=donor, + recipient=recipient, + household_ids=np.arange(40), + weights=np.ones(40), + ) + + assert result.draws is draws and result.receipt is None + assert result.fit_weight_records == () + + def test_recipient_counts_adults_and_children_by_age_not_engine_flags() -> None: """The LCFS G018/G019 split is age 18, which the recipient counts from age. diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py index 7a23d63aa4..d5a756e764 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py @@ -620,6 +620,7 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: "price_bus_journeys", "fold_into", "zero_when_false", + "redraw_zero_road_fuel", "level_road_fuel", "record_mass_conservation_receipt", ] @@ -966,6 +967,8 @@ def test_e6_declared_seed_lockstep(self) -> None: "assign_binary_from_rate": 0, "fit_weighted_qrf_chain": 0, "price_domestic_energy": 0, + # The road-fuel incidence redraw (microcosm#1113). + "redraw_zero_road_fuel": 0, } assert stages["etb_vat"].operations[2].parameters["seed"] == 0 assert stages["etb_services"].operations[3].parameters["seed"] == 0 diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py index a521c0051b..85a5dda6f5 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py @@ -1609,6 +1609,72 @@ def failing(ev, fragment: str) -> None: run(None) +def test_road_fuel_incidence_gate_holds_every_flagged_household_positive() -> None: + """The lcfs road_fuel_incidence receipt is checked at stage time (microcosm#1113).""" + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.calibration_run import UK_SPINE_GATE_SCOPE + from microcosm.build.uk_runtime.lcfs_consumption import ( + road_fuel_incidence_operation, + ) + + gate_id = "uk_stage_lcfs_consumption_road_fuel_incidence" + assert gate_id in UK_SPINE_GATE_SCOPE + parameters = _gate_parameters(gate_id) + assert parameters["check"] == "road_fuel_incidence" + declared = road_fuel_incidence_operation( + load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + ) + receipt = { + **{key: declared[key] for key in ("rule", "seed", "salt", "n_estimators")}, + "regimes": { + "road_fuel_total": "positive_only", + "petrol_share_of_road_fuel": "zero_inflated_positive", + }, + "flagged_households": 100, + "flagged_zero_before": 34, + "flagged_zero_share_before": 0.343, + "flagged_zero_after": 0, + "unflagged_with_fuel": 0, + "mean_positive_before": 1500.0, + "mean_redrawn": 900.0, + } + + def run(ev): + return uk_stage_health_gate( + evidence={"stage": "lcfs_consumption", "road_fuel_incidence": ev}, + stage="lcfs_consumption", + check="road_fuel_incidence", + parameters=parameters, + ) + + def failing(ev, fragment: str) -> None: + result = run(ev) + assert not result.passed and any(fragment in f for f in result.failures), ( + fragment, + result.failures, + ) + + passed = run(receipt) + assert passed.passed, passed.failures + assert passed.details["flagged_zero_share_before"] == 0.343 + failing({**receipt, "flagged_zero_after": 1}, "flagged_zero_after is 1") + failing({**receipt, "unflagged_with_fuel": 2}, "unflagged_with_fuel is 2") + failing({**receipt, "salt": "other"}, "the redraw ran with salt") + failing({**receipt, "n_estimators": 4}, "the redraw ran with n_estimators") + failing( + {**receipt, "regimes": {"road_fuel_total": "zero_inflated_positive"}}, + "fitted regime", + ) + failing({**receipt, "flagged_zero_share_before": 0.6}, "outside [0, 0.5]") + failing({**receipt, "flagged_zero_before": 3.0}, "is not a count") + # Nothing to redraw needs no fitted model. + nothing = {**receipt, "flagged_zero_before": 0, "regimes": None} + assert run({**nothing, "flagged_zero_share_before": 0.0}).passed + with pytest.raises(ValueError, match="road_fuel_incidence must be an object"): + run(None) + + def test_bus_support_pricing_gate_recomputes_the_factors_from_the_vendored_rows() -> ( None ): diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index 5bee7f8ca1..61c9d0a834 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -416,13 +416,13 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "5289ea684304066ab7541fa184861a1c4dae72bf3ae200386f0d8a4ba0ec660a" + "22ccc5fa198f562af475c419c25c1781dc0c7c2e2ca06545de540fb2b2c11e08" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "2ebb6b81d44a82905bec15f64634283eb011c460db3f70a74ff5230c903ad914" + "94f76b7ce2e76727bfbe91ca2726e05c8399ad9783972ea7d3cc865771d87b55" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "3e04fbeb7f058269547937323829772807604f26c508755a73402e7554c9b2ab" + "c6cfff6fdf1d4e87c6cc4ebca1b9ed74134dcd585e1b2c914f893e7907925460" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -475,6 +475,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_support": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_energy_rake": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_bus_pricing": ("stage_health", "transferred"), + "uk_stage_lcfs_consumption_road_fuel_incidence": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_road_fuel_level": ("stage_health", "transferred"), "uk_stage_etb_vat_support": ("stage_health", "transferred"), "uk_stage_etb_services_support": ("stage_health", "transferred"), @@ -581,6 +582,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_support", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_bus_pricing", + "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", @@ -800,6 +802,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: "uk_stage_hmrc_spi_income_spine_identity", "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_energy_rake", + "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_lcfs_consumption_support", "uk_stage_nts_bus_travel_facts", @@ -854,10 +857,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: _UK_CERTIFICATION_PART_DIGESTS: Mapping[str, Mapping[str, str]] = { "spine": { "gates_manifest_sha256": ( - "39a636259973ea320adee66bb2d4f8e56f3a699ac391426fc62ce483ec6f61b7" + "e95e5808ead125458077a4844c93938b7249059670c114c52759c932ae0b78bb" ), "policy_sha256": ( - "1343d2f6afbc8e1b08405d5e58ca0348ecd00b2ab64c36eaea2ba86ee00a609c" + "3a8d9c53f3f38051a830755533e233422b010d005100ca1511e836664bee362d" ), }, "calibration_seam": { diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index b97e041737..24767347e7 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -127,13 +127,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "5289ea684304066ab7541fa184861a1c4dae72bf3ae200386f0d8a4ba0ec660a" + "22ccc5fa198f562af475c419c25c1781dc0c7c2e2ca06545de540fb2b2c11e08" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "2ebb6b81d44a82905bec15f64634283eb011c460db3f70a74ff5230c903ad914" + "94f76b7ce2e76727bfbe91ca2726e05c8399ad9783972ea7d3cc865771d87b55" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "3e04fbeb7f058269547937323829772807604f26c508755a73402e7554c9b2ab" + "c6cfff6fdf1d4e87c6cc4ebca1b9ed74134dcd585e1b2c914f893e7907925460" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" @@ -170,6 +170,11 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: "uk_stage_lcfs_consumption_support": ("stage_health", "transferred", None), "uk_stage_lcfs_consumption_energy_rake": ("stage_health", "transferred", None), "uk_stage_lcfs_consumption_bus_pricing": ("stage_health", "transferred", None), + "uk_stage_lcfs_consumption_road_fuel_incidence": ( + "stage_health", + "transferred", + None, + ), "uk_stage_lcfs_consumption_road_fuel_level": ("stage_health", "transferred", None), "uk_stage_nts_bus_travel_support": ("stage_health", "transferred", None), "uk_stage_nts_bus_travel_facts": ("stage_health", "transferred", None), @@ -1270,6 +1275,7 @@ def _gate_battery_payload( "uk_stage_lcfs_consumption_support": "lcfs_consumption", "uk_stage_lcfs_consumption_energy_rake": "lcfs_consumption", "uk_stage_lcfs_consumption_bus_pricing": "lcfs_consumption", + "uk_stage_lcfs_consumption_road_fuel_incidence": "lcfs_consumption", "uk_stage_lcfs_consumption_road_fuel_level": "lcfs_consumption", "uk_stage_nts_bus_travel_support": "nts_bus_travel", "uk_stage_nts_bus_travel_facts": "nts_bus_travel", From 149fb61b54d98b35d116ecb016883d447ac61f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:01:12 +0100 Subject: [PATCH 04/18] Bind household road fuel on ONS 07.2.2; measure the OBR cars receipts (#1113) The contract declares ons.household_road_fuel_expenditure: ONS Consumer Trends COICOP 07.2.2 (fuels and lubricants for personal transport), calendar year, household scope, with value_expression "petrol_spending + diesel_spending". It resolves to GBP 35.099bn for 2025. Its notes cover the other motor fuels and lubricants the class carries and the measure doesn't (0.4% on the LCFS diary), and why its design-weight gap is the engine's 2024-to-2025 uprating, since the stage levels the columns to the 2024 row. obr.fuel_duties_cars moves to the measure-exclusion register, still measured on every evaluation. Its gap breakdown: - The OBR cars line includes business-paid car fuel. ONS 07.2.2 at DESNZ pump prices implies about GBP 13.5bn of duty, 7% under it. - With the level step in place, the engine's fuel_duty reads -9.9% against it (-8.1% on DESNZ divisors; policyengine-uk#2169 A). Binding it would move weight onto fuel buyers to stand in for business use. This commit is the only one that changes if the OBR cars row is kept bound instead. - National references regenerated: 1,232 active, with 7 no_fact_at_or_before_period and 16 signed excluded unchanged. The local census is unchanged. - Both compile-parity receipts gain the row as ledger_only. - tools/diagnose_uk_consumption_taxes.py measures the new row beside the held-out ones. The register census and the contract and reference counts are re-pinned. Co-Authored-By: Claude Opus 5.5 --- .../uk/calibration_measure_exclusions.json | 9 +++++ ...ity_incumbent_2025_signed_differences.json | 13 +++++-- ...ty_production_2023_signed_differences.json | 13 +++++-- .../build/uk/target_reference_membership.json | 28 ++++++++++++-- .../microcosm/build/uk/target_references.json | 26 +++++++++++++ .../build/uk/uk_population_targets.json | 37 +++++++++++++++++++ .../engine_free/shared/test_country_spec.py | 4 +- .../uk/test_uk_measure_simulation.py | 15 +++++--- .../uk/test_uk_national_calibration.py | 2 +- .../uk/test_uk_population_targets.py | 17 +++++---- .../uk/test_uk_target_references.py | 4 +- tools/diagnose_uk_consumption_taxes.py | 16 +++++--- 12 files changed, 150 insertions(+), 34 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json index 8605c49863..16ac2b52b1 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json @@ -603,6 +603,15 @@ "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", "approved_on": "2026-10-08", "expires_on": "2027-01-08" + }, + { + "name": "obr.fuel_duties_cars", + "reason": "Scope and conversion residual once the stage sets household road fuel: OBR's cars receipts (GBP 14.4bn for FY2024-25, the April 2024 vehicle-type split) include car fuel paid by businesses, and ONS Consumer Trends 07.2.2 for CY2025 at DESNZ 2025 pump prices converts to about GBP 13.5bn of duty, 7 percent below the OBR cars line. With petrol plus diesel levelled to ONS 07.2.2 by the lcfs_consumption stage, the engine's 2025 fuel_duty reads -9.9 percent against the row on its RAC price divisors (-8.1 percent on DESNZ's; policyengine-uk#2169 A), so binding it would pull weight toward fuel buyers to cover business use the household frame does not hold. Before the level step it read -34.5 percent at design weights and -17.7 percent calibrated on microcosm#1121's head, and fitting it raised petrol 21 and diesel 34 percent through the weights; a re-solve of the 2026-09-30 problem with it masked changed no other row's fit. Household road fuel is bound as ons.household_road_fuel_expenditure. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; rebind if Microcosm comes to model business use of cars.", + "tracking": "microcosm#1113", + "approved_by": "juaristi22", + "adjudication": "María's approval of 2026-10-08 of the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D2, with the binding confirmed on 2026-10-09: the stage sets the household road-fuel level and incidence, and the household-scope ONS 07.2.2 row is bound in place of the OBR cars receipts, which include business fuel. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "approved_on": "2026-10-08", + "expires_on": "2027-01-08" } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json index 7615ebb4d7..b28295c0ba 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 1231, + "compiled_count": 1232, "counts_by_kind": { "calibration_drift": 553, "fixture_only": 55, - "ledger_only": 649 + "ledger_only": 650 }, - "difference_count": 1257, + "difference_count": 1258, "differences": [ { "fixture_value": 1608000.0, @@ -4886,6 +4886,13 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 35099000000.0, + "name": "ons.household_road_fuel_expenditure", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 414716.0, diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json index ca51817904..74b5ea51ff 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 919, + "compiled_count": 920, "counts_by_kind": { "calibration_drift": 120, "fixture_only": 17, - "ledger_only": 787 + "ledger_only": 788 }, - "difference_count": 924, + "difference_count": 925, "differences": [ { "fixture_value": 82000.0, @@ -5208,6 +5208,13 @@ "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 38504000000.0, + "name": "ons.household_road_fuel_expenditure", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 1742660.0, diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json index afac8eddaa..80f94bcd54 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json @@ -1,11 +1,11 @@ { "source_fact_feed": "chronicle-uk-825406f9-consumer-facts", "target_period": 2025, - "candidate_count": 1254, - "contract_target_count": 341, - "active_reference_count": 1231, + "candidate_count": 1255, + "contract_target_count": 342, + "active_reference_count": 1232, "status_counts": { - "active": 1231, + "active": 1232, "no_fact_at_or_before_period": 7, "signed_excluded": 16 }, @@ -1968,6 +1968,10 @@ "geography_level": "country", "geography_id": "K02000001" }, + "ons.household_road_fuel_expenditure": { + "geography_level": "country", + "geography_id": "K02000001" + }, "scotgov.bus.passenger_revenue": { "geography_level": "country", "geography_id": "S92000003" @@ -4086,6 +4090,7 @@ "dfi_ni.bus.passenger_receipts", "dwp.workplace_pension.employer_contributions", "nithc.public_transport_support", + "ons.household_road_fuel_expenditure", "ons.population.age_0_9_by_region@E12000001", "ons.population.age_0_9_by_region@E12000002", "ons.population.age_0_9_by_region@E12000003", @@ -19337,6 +19342,21 @@ } ] }, + "ons.household_road_fuel_expenditure": { + "status": "active", + "candidates": [ + { + "name": "ons.household_road_fuel_expenditure", + "status": "active", + "matched_fact_count_overall": 6, + "matched_fact_count_at_or_before_period": 6, + "resolved_period": 2025, + "resolved_value": 35099000000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_5f09d8c219289c6331c51da6" + } + ] + }, "scotgov.bus.passenger_revenue": { "status": "active", "candidates": [ diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_references.json b/packages/microcosm-build/src/microcosm/build/uk/target_references.json index d31d3812c3..b29871dea8 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -468,6 +468,7 @@ "ons.household_composition.unrelated_adult_households": "ons.household_composition", "ons.household_electricity_expenditure": "ons.consumer_trends", "ons.household_gas_expenditure": "ons.consumer_trends", + "ons.household_road_fuel_expenditure": "ons.consumer_trends", "ons.land.corporate_land_value": "ons.land", "ons.land.household_land_value": "ons.land", "ons.land.land_value": "ons.land", @@ -796,6 +797,7 @@ "ons.household_composition.unrelated_adult_households": "Unrelated adult households", "ons.household_electricity_expenditure": "Electricity (COICOP 04.5.1)", "ons.household_gas_expenditure": "Gas (COICOP 04.5.2)", + "ons.household_road_fuel_expenditure": "Fuels and lubricants for personal transport (COICOP 07.2.2)", "ons.land.corporate_land_value": "Corporate land value", "ons.land.household_land_value": "Household land value", "ons.land.land_value": "Land value", @@ -23700,6 +23702,30 @@ "measure_kind": "prepared_column" } }, + { + "name": "ons.household_road_fuel_expenditure", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.household_expenditure.personal_transport_fuels_lubricants", + "entity_name": "household", + "period_type": "calendar_year", + "dimension_values": { + "coicop": "07.2.2", + "frequency": "annual" + }, + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "ons/household_road_fuel_expenditure", + "family": "ons_national_accounts", + "period": 2025, + "metadata": { + "contract_target_id": "ons.household_road_fuel_expenditure", + "measure_kind": "prepared_column" + }, + "value_operation": "sum" + }, { "name": "scotgov.bus.passenger_revenue", "ledger_selector": { diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 6ff16117b3..9c665ef8aa 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -707,6 +707,7 @@ "ons.household_energy_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 binds ONS Consumer Trends COICOP 04.5.", "ons.household_electricity_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 binds ONS Consumer Trends COICOP 04.5.1 electricity per fuel (chronicle#270 / #271).", "ons.household_gas_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 binds ONS Consumer Trends COICOP 04.5.2 gas per fuel (chronicle#270 / #271).", + "ons.household_road_fuel_expenditure": "No incumbent target: uk-data bound the all-road-users OBR fuel duties total and never a household road-fuel spend; microcosm#1113 binds ONS Consumer Trends COICOP 07.2.2 on petrol plus diesel spend in place of the OBR cars receipts, which stay measured as a diagnostic.", "scotgov.bus.passenger_revenue": "No incumbent target: uk-data uplifted DfT England fares to the UK by population; microcosm#890 binds the Scotland leg from Scottish Transport Statistics.", "scotgov.bus.government_support": "No incumbent target: uk-data uplifted DfT England support to the UK by population; microcosm#890 binds the Scotland leg from Scottish Transport Statistics.", "welshgov.bus.public_support": "No incumbent target: uk-data uplifted DfT England support to the UK by population; microcosm#890 binds the Wales leg (local-authority route) from the StatsWales revenue outturn.", @@ -1080,6 +1081,7 @@ "ons.household_energy_expenditure", "ons.household_electricity_expenditure", "ons.household_gas_expenditure", + "ons.household_road_fuel_expenditure", "scotgov.bus.passenger_revenue", "scotgov.bus.government_support", "welshgov.bus.public_support", @@ -15105,6 +15107,41 @@ "category_id": "ons.consumer_trends", "label": "Gas (COICOP 04.5.2)" }, + { + "target_id": "ons.household_road_fuel_expenditure", + "family": "ons_national_accounts", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "household", + "concept": "uk.consumption.road_fuel.amount" + }, + "bindings": { + "policyengine": { + "metric_name": "ons/household_road_fuel_expenditure", + "value_expression": "petrol_spending + diesel_spending", + "notes": "ONS Consumer Trends COICOP 07.2.2 fuels and lubricants for personal transport equipment, current prices, calendar year, bound on the frame's petrol plus diesel spend (microcosm#1113). The publisher class also carries other motor fuels and lubricants, about 0.4 percent of it on the LCFS 2023-24 diary (c72213), which the measure does not. The lcfs_consumption stage levels petrol plus diesel to the calendar-2024 row less that share, so the design-weight gap to this calendar-2025 row is the engine's 2024-to-2025 uprating of the two columns against ONS's own growth. Household-scope road fuel replaces the OBR cars receipts as the bound fuel row: those are a fiscal-year duty total that includes business use of cars, which the frame reaches only through the engine's conversion of spend to litres, so they stay measured as a diagnostic (calibration_measure_exclusions.json)." + }, + "axiom": { + "metric_name": "ons/household_road_fuel_expenditure", + "status": "pending", + "value_rule": "uk.consumption.road_fuel.amount" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.household_expenditure.personal_transport_fuels_lubricants", + "entity_name": "household", + "period_type": "calendar_year", + "dimension_values": { + "coicop": "07.2.2", + "frequency": "annual" + } + }, + "category_id": "ons.consumer_trends", + "label": "Fuels and lubricants for personal transport (COICOP 07.2.2)" + }, { "target_id": "scotgov.bus.passenger_revenue", "family": "dft_local_bus", diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index 8ae859a068..0ca35a8b16 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -1132,8 +1132,8 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: references = {reference.name: reference for reference in spec.target_references} assert ( - len(references) == 1231 - ) # PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three + len(references) == 1232 + ) # microcosm#1113: + 1 ONS 07.2.2 household road fuel; PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three # measures by eleven bands) + 26 SPI savings-interest rows (two measures by # thirteen bands) + 360 SPI Table 3.11 region-tier rows (three measures by # ten regional bands over twelve areas); microcosm#905: 424 - 18 country diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py index 021ebc7be7..794f4634a1 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py @@ -613,9 +613,10 @@ def test_exclusion_applier_warns_within_week_of_expiry(): # v20 measurement (-10.1 % and -3.8 % unbound); the tail bands stay out. "dwp.benefit_cap.capped_households_": 11, # microcosm#1113 and #1123 item 3 (2026-10-08): rows whose level the - # engine or a published-source residual sets, held out and measured with - # tools/diagnose_uk_consumption_taxes.py. + # engine, a published-source residual or a scope the frame doesn't hold + # sets, held out and measured with tools/diagnose_uk_consumption_taxes.py. "obr.vat": 1, + "obr.fuel_duties_cars": 1, "ons.household_electricity_expenditure": 1, "ons.household_gas_expenditure": 1, } @@ -643,7 +644,7 @@ def test_exclusion_applier_warns_within_week_of_expiry(): def test_packaged_exclusions_load(): exclusions = load_uk_calibration_measure_exclusions() names = [entry["name"] for entry in exclusions] - assert len(names) == len(set(names)) == 67 + assert len(names) == len(set(names)) == 68 band_h_region_cells = [ entry for entry in exclusions @@ -742,10 +743,13 @@ def test_packaged_exclusions_load(): # The 2026-10-08 consumption-tax tranche (microcosm#1113, #1123 item 3): # VAT's level is an engine factor (policyengine-uk#1996) and the two ONS # energy rows are a published-source residual against the stage's DESNZ - # volume at QEP prices. A masked re-solve changed no other row's fit, so - # they are held out of the objective and measured by the diagnose tool. + # volume at QEP prices. The OBR cars receipts include business-paid car + # fuel, so household road fuel is bound on ONS 07.2.2 in their place. A + # masked re-solve changed no other row's fit, so they are held out of the + # objective and measured by the diagnose tool. consumption_taxes = [e for e in exclusions if e["approved_on"] == "2026-10-08"] assert sorted(e["name"] for e in consumption_taxes) == [ + "obr.fuel_duties_cars", "obr.vat", "ons.household_electricity_expenditure", "ons.household_gas_expenditure", @@ -762,6 +766,7 @@ def test_packaged_exclusions_load(): trackings = {e["name"]: e["tracking"] for e in consumption_taxes} assert trackings == { "obr.vat": "policyengine-uk#1996", + "obr.fuel_duties_cars": "microcosm#1113", "ons.household_electricity_expenditure": "microcosm#1113", "ons.household_gas_expenditure": "microcosm#1113", } diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py index 42116254d4..588b7d6f0d 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py @@ -53,7 +53,7 @@ from microcosm.calibrate.artifacts import decode_problem from microcosm.frame import EntitySchema, Frame, MassChange, WeightKind, Weights -ACTIVE_REFERENCE_COUNT = 1231 +ACTIVE_REFERENCE_COUNT = 1232 def _uc_reference(**overrides) -> LedgerTargetReference: diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py index 2a08635153..714896eee3 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py @@ -202,8 +202,9 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # contribution targets and the DWP employee total leave the fit again (their # relief-mechanism and gross definitions do not match the engine's columns; # microcosm#1069 c9 arm); microcosm#1095 adds DWP's Great Britain - # pension-age Housing Benefit spending. - assert len(resource["targets"]) == 392 + # pension-age Housing Benefit spending; microcosm#1113 adds ONS 07.2.2 + # household road fuel. + assert len(resource["targets"]) == 393 providers = resource["hierarchy"]["providers"] categories = resource["hierarchy"]["categories"] @@ -217,10 +218,10 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: target_ids = [target["target_id"] for target in resource["targets"]] registry_scope = resource["registry_parity"]["scope_target_ids"] profile_scope = resource["profile_parity"]["scope_target_ids"] - assert len(registry_scope) == 341 + assert len(registry_scope) == 342 assert len(profile_scope) == 51 - assert target_ids[:341] == registry_scope - assert target_ids[341:] == profile_scope + assert target_ids[:342] == registry_scope + assert target_ids[342:] == profile_scope parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -234,7 +235,7 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: assert mapped_target_ids | set(unmapped_declarations) == set(registry_scope) assert all(reason for reason in unmapped_declarations.values()) assert len(mapped_target_ids) == 192 - assert len(unmapped_declarations) == 149 + assert len(unmapped_declarations) == 150 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -353,7 +354,7 @@ def test_uk_population_targets_have_unique_target_ids() -> None: resource = _load() target_ids = [target["target_id"] for target in resource["targets"]] - assert len(target_ids) == 392 + assert len(target_ids) == 393 assert len(target_ids) == len(set(target_ids)) @@ -821,7 +822,7 @@ def test_uc_payment_bands_share_administrative_family_but_keep_source_window() - def test_paid_joint_diagnostics_do_not_add_active_targets() -> None: targets = _load()["targets"] - assert len(targets) == 392 + assert len(targets) == 393 assert not any( f.get("variable") == "uc_calibration_child_entitlement" for target in targets diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py index 1bcf8666c5..fb922fb149 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py @@ -64,7 +64,7 @@ _TEST_PATHS = paths_for("microcosm-build") -ACTIVE_REFERENCE_COUNT = 1231 +ACTIVE_REFERENCE_COUNT = 1232 REGION_TIER_LEVEL = {code: level for level, code in UK_REGION_TIER} UK_DATA_REPO = "policyengine-" + "uk-data" @@ -750,7 +750,7 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: assert membership["target_period"] == 2025 assert membership["active_reference_count"] == ACTIVE_REFERENCE_COUNT assert membership["status_counts"] == { - "active": 1231, + "active": 1232, "no_fact_at_or_before_period": 7, "signed_excluded": 16, } diff --git a/tools/diagnose_uk_consumption_taxes.py b/tools/diagnose_uk_consumption_taxes.py index 5043c96d6b..ede1d3081c 100644 --- a/tools/diagnose_uk_consumption_taxes.py +++ b/tools/diagnose_uk_consumption_taxes.py @@ -6,11 +6,13 @@ that includes business-paid car fuel, and the ONS electricity and gas rows by a published-source residual against the stage's DESNZ volume at QEP prices. Rows held out of the objective by the measure-exclusion register stay -measured here: the tool reports each row's estimate on any H5 the engine -loads, against the value the run's contract registry declares, beside the -household fuel and energy composition the rows used to pull (gas-connected -share, fuel-car households with no fuel, consumption total). Development -diagnostic: it never recalibrates and writes only an aggregate JSON. +measured here, beside the household road-fuel row (ONS 07.2.2) bound in place +of the cars receipts: the tool reports each row's estimate on any H5 the +engine loads, against the value the run's contract registry declares, beside +the household fuel and energy composition the rows used to pull +(gas-connected share, fuel-car households with no fuel, consumption total). +Development diagnostic: it never recalibrates and writes only an aggregate +JSON. """ from __future__ import annotations @@ -25,12 +27,14 @@ from microcosm.build.uk_runtime.lcfs_consumption import UK_LCFS_COICOP_DIVISION_COLUMNS -#: Held-out rows and the engine variables whose weighted sum measures them. +#: The held-out rows and the bound road-fuel row that replaced the cars +#: receipts, with the engine variables whose weighted sum measures each. ROWS: Mapping[str, tuple[str, ...]] = { "obr.vat": ("vat",), "obr.fuel_duties_cars": ("fuel_duty",), "ons.household_electricity_expenditure": ("electricity_consumption",), "ons.household_gas_expenditure": ("gas_consumption",), + "ons.household_road_fuel_expenditure": ("petrol_spending", "diesel_spending"), } From 8db8d6868a769708f78b516edc6be1fb76e70387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 8 Oct 2026 21:18:32 +0100 Subject: [PATCH 05/18] Recompose housing and transport around their levelled parts (#1113) The chain draws COICOP 04 (housing, water and fuel) and 07 (transport) as whole diary totals, while the stage re-levels the energy and road fuel inside them. Electricity and gas move to DESNZ volume at QEP prices, and petrol and diesel to ONS 07.2.2, so the totals no longer contained their own parts: 2.7% of households had energy above their COICOP 04 total. PE-UK's explicit energy VAT base (policyengine-uk#2166) can only take energy out of the generic base if the totals hold it. A declared recompose_from_remainder step runs after the levelling steps. Each total keeps its own chain draw, less the chain's draws of the parts the stage re-levels, and adds the levelled parts back: - housing_water_and_electricity_consumption: its draw, less the drawn electricity and gas, plus the levelled electricity and gas; - transport_consumption: its draw, less the drawn petrol and diesel, plus the levelled petrol and diesel. The drawn parts are kept right after the support clip, before any step touches them. A remainder floors at zero where the parts outgrow the total: 2,056 and 1,240 of 63,956 households on the head-r3 spine, about GBP 1.0bn and 0.3bn. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split. Drawing the remainders as chain targets of their own (the plan's first version) over-drew the vehicle-purchase tail of transport: 10 to 13% above the donor in-sample, and GBP 27bn on the spine. The chain and its targets are unchanged, and output columns are unchanged. On the head-r3 spine, consumption across the twelve divisions moves -0.7% (GBP 979.0bn to 972.3bn): - housing -3.4%, as DESNZ x QEP energy (GBP 47.9bn) replaces the drawn electricity and gas (GBP 54.7bn); - transport +0.2%, as the levelled fuel (GBP 36.9bn) replaces the chain's fuel draws (GBP 28.7bn), including those zeroed for households without a fuel car. - The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level. The receipt records their published ONS 04.5.3 and 04.5.4 spend beside it (CY2024, vendored rows): GBP 1.55bn. - The uk_stage_lcfs_consumption_recomposed_totals gate checks each total against its declaration. It requires no negative remainder and no household below its components. The remainder must equal the draw less the drawn parts plus the floored mass, and the total must equal the remainder plus the parts. It also recomputes the uncarried ONS spend from the vendored rows. - The two totals leave the committed support bounds (regenerated); the gate holds them instead. - Mirrors: operation schema and kind, spine gate scope, gate-battery digests and entry lists, coverage manifest, source-stage pins. Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/source_manifest.py | 1 + .../spec_engine/schema/sources.schema.json | 79 +++++++ .../src/microcosm/build/uk/gates.json | 14 ++ .../uk/lcfs_consumption_support_bounds.json | 8 - .../uk/release_input_coverage_manifest.json | 34 +-- .../src/microcosm/build/uk/source_stages.json | 40 +++- .../src/microcosm/build/uk/spec/sources.yaml | 25 ++- .../build/uk_runtime/calibration_run.py | 1 + .../build/uk_runtime/lcfs_consumption.py | 200 +++++++++++++++++- .../build/uk_runtime/stage_health.py | 115 ++++++++++ .../engine_free/shared/test_country_spec.py | 2 + .../uk/test_uk_consumption_resources.py | 6 +- .../uk/test_uk_lcfs_consumption.py | 189 ++++++++++++++++- .../engine_free/uk/test_uk_source_stages.py | 1 + .../engine_free/uk/test_uk_stage_health.py | 95 +++++++++ .../src/microcosm/data/contract.py | 13 +- .../tests/engine_free/shared/test_contract.py | 12 +- 17 files changed, 794 insertions(+), 41 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/source_manifest.py b/packages/microcosm-build/src/microcosm/build/source_manifest.py index 84a10e859f..78d4f523e6 100644 --- a/packages/microcosm-build/src/microcosm/build/source_manifest.py +++ b/packages/microcosm-build/src/microcosm/build/source_manifest.py @@ -144,6 +144,7 @@ "iterative_proportional_fit", "level_road_fuel", "redraw_zero_road_fuel", + "recompose_from_remainder", "pair_clone_households_to_originals", "price_domestic_energy", "price_bus_journeys", diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index 023c27be01..d7df728849 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -11217,6 +11217,85 @@ "minimum": 1 } } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "parents", + "uncarried" + ], + "properties": { + "kind": { + "const": "recompose_from_remainder" + }, + "parents": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "drawn_subtracts", + "components" + ], + "properties": { + "drawn_subtracts": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "components": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + } + } + }, + "uncarried": { + "type": "object", + "additionalProperties": false, + "required": [ + "resource", + "period_value", + "classes" + ], + "properties": { + "resource": { + "type": "string" + }, + "period_value": { + "type": "integer" + }, + "classes": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "coicop", + "concept" + ], + "properties": { + "coicop": { + "type": "string" + }, + "concept": { + "type": "string" + } + } + } + } + } + } + } } ], "description": "Closed kind-discriminated source artifact and operation records, covering the packaged US, UK, and BE source vocabularies." diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index e4b2786fcb..9b1347a7e0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -375,6 +375,20 @@ }, "notes": "Stage-time fact check on the lcfs road_fuel_level receipt (microcosm#1113): the ONS Consumer Trends COICOP 07.2.2 household spend the stage declares is recomputed from the vendored row and must equal the receipt's, and the prior-weighted petrol plus diesel after the step must equal it less the donor's other-fuels share, with the factor reproducing that from the drawn total. The other-fuels share is the LCFS donor's own c72213 share of 07.2.2, licensed microdata the gate cannot recompute, so it is bounded at five percent instead (0.37 percent on the 2023-24 diary). María's ruling of 2026-10-08 set the stage, not the weights, as what levels household road fuel. A population fact check: the synthetic smoke records it without blocking." }, + { + "id": "uk_stage_lcfs_consumption_recomposed_totals", + "gate": "stage_health", + "phase": "transferred", + "criticality": "release_blocking", + "evidence_absent_blocks": true, + "population_fact_check": true, + "parameters": { + "stage": "lcfs_consumption", + "check": "recomposed_totals", + "maximum_relative_deviation": 1e-09 + }, + "notes": "Stage-time check on the lcfs recomposed_totals receipt (microcosm#1113): housing_water_and_electricity_consumption and transport_consumption each keep their own chain draw less the chain's draws of the parts the stage re-levels (the diary energy, petrol and diesel; floored at zero where the parts outgrow the total) and add the levelled parts back, so no household's total is below its electricity and gas or its petrol and diesel and no remainder is negative. The declared parts must be the receipt's, the weighted remainder must equal the drawn total less the drawn parts plus the floored mass, and the weighted total the remainder plus the levelled parts, to the declared tolerance. The ONS 04.5.3 and 04.5.4 liquid and solid fuel spend, which leaves the housing total because no frame column carries it, is recomputed from the vendored rows and must equal the receipt's. The two totals carry no committed support bound; this check holds them instead. A population fact check: the synthetic smoke records it without blocking." + }, { "id": "uk_stage_etb_vat_support", "gate": "stage_health", diff --git a/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json b/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json index 7a96be6a71..4588976ff0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json +++ b/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json @@ -38,10 +38,6 @@ 0.0, 200000 ], - "housing_water_and_electricity_consumption": [ - -20000, - 300000 - ], "miscellaneous_consumption": [ 0.0, 70000 @@ -53,10 +49,6 @@ "restaurants_and_hotels_consumption": [ 0.0, 70000 - ], - "transport_consumption": [ - 0.0, - 200000 ] }, "chronicle": [ diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 52feeab0a0..f12306d2f0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "067ba21c12aeb4e95e6a8a16141dbaa075e8787ed875a005f549cab6e91a6b56", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,7 +760,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", "survey": "Living Costs and Food Survey 2023-24" @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "115c19c394726aa3b4d50e10501885db5ee4e563f1a6b84cd93cf2cea2d75b1c", + "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index dfe55285db..cc78e12cb3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -3885,6 +3885,44 @@ "c72213" ] }, + { + "kind": "recompose_from_remainder", + "parents": { + "housing_water_and_electricity_consumption": { + "drawn_subtracts": [ + "domestic_energy_consumption" + ], + "components": [ + "electricity_consumption", + "gas_consumption" + ] + }, + "transport_consumption": { + "drawn_subtracts": [ + "petrol_spending", + "diesel_spending" + ], + "components": [ + "petrol_spending", + "diesel_spending" + ] + } + }, + "uncarried": { + "resource": "ons_household_expenditure_facts.json", + "period_value": 2024, + "classes": [ + { + "coicop": "04.5.3", + "concept": "ons.household_expenditure.liquid_fuels" + }, + { + "coicop": "04.5.4", + "concept": "ons.household_expenditure.solid_fuels" + } + ] + } + }, { "kind": "record_mass_conservation_receipt", "entity": "household", @@ -3935,7 +3973,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn diary energy (p537, the whole of COICOP 04.5) plus electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The liquid and solid fuels of COICOP 04.5, which no frame column carries, leave the housing total with the drawn p537; the receipt records their published ONS 04.5.3 and 04.5.4 spend. The two totals carry no committed support bound; the recomposed_totals gate holds them instead." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 15ef13ed87..a892d1de3b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -3188,6 +3188,29 @@ stages: other_fuels_rule: lcfs_donor_other_fuels_share other_fuels_codes: - c72213 + - kind: recompose_from_remainder + parents: + housing_water_and_electricity_consumption: + drawn_subtracts: + - domestic_energy_consumption + components: + - electricity_consumption + - gas_consumption + transport_consumption: + drawn_subtracts: + - petrol_spending + - diesel_spending + components: + - petrol_spending + - diesel_spending + uncarried: + resource: ons_household_expenditure_facts.json + period_value: 2024 + classes: + - coicop: 04.5.3 + concept: ons.household_expenditure.liquid_fuels + - coicop: 04.5.4 + concept: ons.household_expenditure.solid_fuels - kind: record_mass_conservation_receipt entity: household reason: 'LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.' @@ -3233,7 +3256,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns.' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn diary energy (p537, the whole of COICOP 04.5) plus electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The liquid and solid fuels of COICOP 04.5, which no frame column carries, leave the housing total with the drawn p537; the receipt records their published ONS 04.5.3 and 04.5.4 spend. The two totals carry no committed support bound; the recomposed_totals gate holds them instead.' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 08f002d933..46516f9fa3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py @@ -99,6 +99,7 @@ "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", + "uk_stage_lcfs_consumption_recomposed_totals", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index d769f013a9..31dac0e5b2 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -264,6 +264,33 @@ "electricity_consumption", "gas_consumption", ) +RECOMPOSE_FROM_REMAINDER_KIND = "recompose_from_remainder" +#: The COICOP totals that contain columns the stage levels (microcosm#1113): +#: each maps to the chain draws subtracted from its own draw to leave its +#: remainder, and the levelled columns added back. The chain draws each part +#: after its total, so the split is the chain's own. Housing (p604) nets the +#: drawn electricity and gas (the chain's domestic-energy target is the diary's +#: electricity plus gas), so the liquid and solid fuels no column carries stay +#: in its remainder; transport (p607) nets the drawn petrol and diesel (c72211, +#: c72212) and keeps other motor fuels. +UK_LCFS_RECOMPOSED_PARENTS: Mapping[str, tuple[tuple[str, ...], tuple[str, ...]]] = { + "housing_water_and_electricity_consumption": ( + ("domestic_energy_consumption",), + ("electricity_consumption", "gas_consumption"), + ), + "transport_consumption": ( + ("petrol_spending", "diesel_spending"), + ("petrol_spending", "diesel_spending"), + ), +} +#: The chain draws a recomposition subtracts, kept before any step re-levels them. +UK_LCFS_RECOMPOSED_DRAWN_COLUMNS = tuple( + dict.fromkeys( + column + for subtracted, _ in UK_LCFS_RECOMPOSED_PARENTS.values() + for column in subtracted + ) +) UK_LCFS_CONSUMPTION_OUTPUT_COLUMNS = ( *UK_LCFS_CONSUMPTION_TARGET_COLUMNS, "has_fuel_consumption", @@ -288,6 +315,7 @@ class UKLCFSConsumptionResult: donor_floor: Mapping[str, Any] | None = None road_fuel_incidence: Mapping[str, Any] | None = None road_fuel_level: Mapping[str, Any] | None = None + recomposed_totals: Mapping[str, Any] | None = None def evidence(self) -> dict[str, object]: evidence: dict[str, object] = { @@ -312,6 +340,8 @@ def evidence(self) -> dict[str, object]: evidence["road_fuel_incidence"] = dict(self.road_fuel_incidence) if self.road_fuel_level is not None: evidence["road_fuel_level"] = dict(self.road_fuel_level) + if self.recomposed_totals is not None: + evidence["recomposed_totals"] = dict(self.recomposed_totals) return evidence @@ -398,6 +428,9 @@ def __call__(self, frame: Frame) -> Frame: imputation.draws, donor, exempt=support_clip_exempt(self.stage) ) household_draws = clip_result.clipped + # The chain's own draws of the parts later steps re-level, for the + # recomposed totals (microcosm#1113). + drawn_parts = household_draws[list(UK_LCFS_RECOMPOSED_DRAWN_COLUMNS)].copy() energy_rake_receipt = None if energy is not None: household_draws, energy_rake_receipt = rake_recipient_energy( @@ -434,6 +467,9 @@ def __call__(self, frame: Frame) -> Frame: household_draws, road_fuel_level_receipt = lcfs_road_fuel_level( self.stage, household_draws, weights=weights, lcfs_household=lcfs_household ) + household_draws, recomposed_totals_receipt = lcfs_recompose_from_remainder( + self.stage, household_draws, drawn=drawn_parts, weights=weights + ) litres_audit = fuel_litres_audit( household_draws, weights=weights, stage=self.stage ) @@ -474,6 +510,7 @@ def __call__(self, frame: Frame) -> Frame: donor_floor=donor_floor_receipt, road_fuel_incidence=incidence.receipt, road_fuel_level=road_fuel_level_receipt, + recomposed_totals=recomposed_totals_receipt, ) return result @@ -963,6 +1000,160 @@ def lcfs_road_fuel_level( return level_road_fuel(household_draws, level=level, weights=weights) +def recompose_from_remainder_operation( + stage: SourceStageSpec, +) -> Mapping[str, Any] | None: + """The stage's declared ``recompose_from_remainder`` parameters, if any.""" + + for operation in stage.operations: + if operation.kind == RECOMPOSE_FROM_REMAINDER_KIND: + return {"kind": operation.kind, **operation.parameters} + return None + + +def check_recomposed_parents(parameters: Mapping[str, Any]) -> None: + """Refuse a declaration that differs from the totals the stage recomposes.""" + + parents = parameters.get("parents") + if not isinstance(parents, Mapping) or set(parents) != set( + UK_LCFS_RECOMPOSED_PARENTS + ): + raise ValueError( + f"{RECOMPOSE_FROM_REMAINDER_KIND} must declare " + f"{sorted(UK_LCFS_RECOMPOSED_PARENTS)}." + ) + for parent, (subtracted, components) in UK_LCFS_RECOMPOSED_PARENTS.items(): + declared = parents[parent] + if ( + not isinstance(declared, Mapping) + or tuple(declared.get("drawn_subtracts", ())) != subtracted + or tuple(declared.get("components", ())) != components + ): + raise ValueError( + f"{RECOMPOSE_FROM_REMAINDER_KIND} declares {parent!r} as " + f"{declared!r}, not its draw less {subtracted} plus {components}." + ) + + +def uncarried_spend(parameters: Mapping[str, Any]) -> dict[str, Any]: + """The published spend inside a recomposed total that no column carries. + + ONS Consumer Trends classes read from the vendored rows the declaration + names: the liquid and solid fuels of COICOP 04.5, which have no column of + their own and stay inside the housing remainder at the diary's level. + """ + + spec = parameters.get("uncarried") + if not isinstance(spec, Mapping): + raise ValueError(f"{RECOMPOSE_FROM_REMAINDER_KIND} must declare uncarried.") + resource = str(spec.get("resource") or "") + if resource not in UK_LCFS_VENDORED_RESOURCES: + raise ValueError(f"{resource!r} is not a vendored lcfs_consumption resource.") + period_value = int(spec["period_value"]) + classes = [] + for entry in spec.get("classes", ()): + coicop, concept = str(entry["coicop"]), str(entry["concept"]) + rows = vendored_rows( + resource, + concept=concept, + period_type="calendar_year", + period_value=period_value, + geography_id="K02000001", + dimensions={"coicop": coicop, "frequency": "annual"}, + ) + if len(rows) != 1: + raise ValueError( + f"{resource}: expected one {coicop} row for {period_value}, " + f"found {len(rows)}." + ) + classes.append( + { + "coicop": coicop, + "concept": concept, + "source_record_id": str(rows[0].get("source_record_id", "")), + "value": float(rows[0]["value"]), + } + ) + if not classes: + raise ValueError(f"{RECOMPOSE_FROM_REMAINDER_KIND} declares no classes.") + return { + "resource": resource, + "period_value": period_value, + "classes": classes, + "total": float(sum(entry["value"] for entry in classes)), + } + + +def recompose_parent_totals( + household_draws: pd.DataFrame, + *, + drawn: pd.DataFrame, + parameters: Mapping[str, Any], + weights: Sequence[float], +) -> tuple[pd.DataFrame, dict[str, Any]]: + """Write each recomposed total around the levelled parts the stage set. + + A total keeps its own chain draw less the chain's draws of the parts the + stage re-levels (``drawn``, kept before any step touched them; floored at + zero where the parts outgrow the total), and adds the levelled parts back, + so it always contains the electricity, gas, petrol and diesel at their + published scale (microcosm#1113). The chain draws each part after, and + conditional on, its total, so the remainder is the chain's own split; a + remainder drawn as a chain target of its own over-drew the vehicle-purchase + tail of transport (10 to 13 percent above the donor in-sample). + """ + + check_recomposed_parents(parameters) + weight = np.asarray(weights, dtype=float) + result = household_draws.copy() + parents: dict[str, Any] = {} + for parent, (subtracted, components) in UK_LCFS_RECOMPOSED_PARENTS.items(): + drawn_total = result[parent].to_numpy(dtype=float) + drawn_parts = sum(drawn[column].to_numpy(dtype=float) for column in subtracted) + rest = np.maximum(drawn_total - drawn_parts, 0.0) + parts = sum(result[column].to_numpy(dtype=float) for column in components) + total = rest + parts + result[parent] = total + parents[parent] = { + "drawn_subtracts": list(subtracted), + "components": list(components), + "weighted_drawn_total": float(np.dot(weight, drawn_total)), + "weighted_drawn_subtracts": float(np.dot(weight, drawn_parts)), + "rows_floored": int((drawn_parts > drawn_total).sum()), + "weighted_floored_mass": float( + np.dot(weight, np.maximum(drawn_parts - drawn_total, 0.0)) + ), + "weighted_remainder": float(np.dot(weight, rest)), + "weighted_components": float(np.dot(weight, parts)), + "weighted_total": float(np.dot(weight, total)), + "minimum_remainder": float(rest.min()) if rest.size else 0.0, + "rows_below_components": int((total < parts).sum()), + } + receipt = { + "operation": RECOMPOSE_FROM_REMAINDER_KIND, + "parents": parents, + "uncarried": uncarried_spend(parameters), + } + return result, receipt + + +def lcfs_recompose_from_remainder( + stage: SourceStageSpec, + household_draws: pd.DataFrame, + *, + drawn: pd.DataFrame, + weights: Sequence[float], +) -> tuple[pd.DataFrame, dict[str, Any] | None]: + """Apply the declared ``recompose_from_remainder`` step (none if undeclared).""" + + parameters = recompose_from_remainder_operation(stage) + if parameters is None: + return household_draws, None + return recompose_parent_totals( + household_draws, drawn=drawn, parameters=parameters, weights=weights + ) + + @dataclass(frozen=True) class LCFSEnergyPricing: """The declared prices, NEED margins, gas connection and level, with receipts.""" @@ -1705,11 +1896,16 @@ def support_clip_to_donor( def donor_realized_ranges(donor: pd.DataFrame) -> dict[str, tuple[float, float]]: - """Donor support per clipped column; raked columns carry no bounds.""" + """Donor support per clipped column. + + Levelled columns carry no bounds, nor do the totals written back around + their levelled components, whose coherence the stage's recomposed-totals + check holds instead (microcosm#1113). + """ ranges: dict[str, tuple[float, float]] = {} for column in UK_LCFS_CONSUMPTION_TARGET_COLUMNS: - if column in UK_LCFS_RAKED_COLUMNS: + if column in UK_LCFS_RAKED_COLUMNS or column in UK_LCFS_RECOMPOSED_PARENTS: continue values = pd.to_numeric(donor[column], errors="coerce") finite = values[np.isfinite(values)] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py index efbce43859..1c3a9243f4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py @@ -77,6 +77,8 @@ def uk_stage_health_gate( return _bus_travel_facts_gate(stage, evidence, parameters) if check == "bus_pricing": return _bus_pricing_gate(stage, evidence, parameters) + if check == "recomposed_totals": + return _recomposed_totals_gate(stage, evidence, parameters) if check == "road_fuel_incidence": return _road_fuel_incidence_gate(stage, evidence, parameters) if check == "road_fuel_level": @@ -2634,6 +2636,119 @@ def _close(observed: object, value: float) -> bool: ) +def _recomposed_totals_gate( + stage: str, + evidence: Mapping[str, object], + parameters: Mapping[str, object], +) -> GateResult: + """Every recomposed COICOP total contains its levelled components. + + Checks on the ``recomposed_totals`` receipt (microcosm#1113): each total + the stage declares keeps its own draw less the declared drawn parts and + adds the declared levelled parts back; no remainder is negative and no + household's total is below its components; to + ``maximum_relative_deviation``, the weighted remainder equals the drawn + total less the drawn parts plus the floored mass, and the weighted total + the remainder plus the components; and the uncarried ONS spend is + recomputed from the vendored rows through the stage's own declaration. + """ + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + recompose_from_remainder_operation, + uncarried_spend, + ) + + check = "recomposed_totals" + receipt = _mapping( + evidence.get("recomposed_totals"), label=f"{stage}.recomposed_totals" + ) + tolerance = _finite_number( + parameters.get("maximum_relative_deviation"), + label=f"{stage}.maximum_relative_deviation", + ) + declared = recompose_from_remainder_operation( + load_country_spec("uk").sources.stage_map()[stage] + ) + if declared is None: + raise ValueError(f"{stage}: declares no recompose_from_remainder operation.") + parents = _mapping( + receipt.get("parents"), label=f"{stage}.recomposed_totals.parents" + ) + declared_parents = declared["parents"] + failures: list[str] = [] + if set(parents) != set(declared_parents): + failures.append( + f"{stage}: recomposed {sorted(parents)}, not the declared " + f"{sorted(declared_parents)}." + ) + for parent in sorted(set(parents) & set(declared_parents)): + entry = _mapping(parents[parent], label=f"{stage}.recomposed_totals.{parent}") + spec = declared_parents[parent] + for key in ("drawn_subtracts", "components"): + observed = entry.get(key) + expected = spec[key] + if (list(observed) if isinstance(observed, list | tuple) else observed) != ( + list(expected) if isinstance(expected, list | tuple) else expected + ): + failures.append( + f"{stage}: {parent} {key} {observed!r} is not the declared " + f"{expected!r}." + ) + minimum = _finite_number( + entry.get("minimum_remainder"), label=f"{stage}.{parent}.minimum_remainder" + ) + if minimum < 0: + failures.append(f"{stage}: {parent} has a negative remainder ({minimum}).") + below = entry.get("rows_below_components") + if isinstance(below, bool) or not isinstance(below, int) or below != 0: + failures.append( + f"{stage}: {below!r} households have {parent} below its components." + ) + + def number(key: str, parent: str = parent, entry=entry) -> float: + return _finite_number(entry.get(key), label=f"{stage}.{parent}.{key}") + + remainder = number("weighted_remainder") + split = ( + number("weighted_drawn_total") + - number("weighted_drawn_subtracts") + + number("weighted_floored_mass") + ) + if abs(remainder - split) > tolerance * max(1.0, abs(remainder)): + failures.append( + f"{stage}: {parent} remainder {remainder} is not its draw less the " + f"drawn parts plus the floored mass ({split})." + ) + total = number("weighted_total") + parts = remainder + number("weighted_components") + if abs(total - parts) > tolerance * max(1.0, abs(total)): + failures.append( + f"{stage}: {parent} weighted total {total} is not its remainder plus " + f"components {parts}." + ) + uncarried = uncarried_spend(declared) + observed = _mapping(receipt.get("uncarried"), label=f"{stage}.uncarried") + if ( + observed.get("classes") != uncarried["classes"] + or observed.get("total") != uncarried["total"] + ): + failures.append( + f"{stage}: the uncarried spend {observed.get('total')!r} is not the vendored " + f"{uncarried['total']}." + ) + details = { + "maximum_relative_deviation": tolerance, + "parents": sorted(parents), + "uncarried_total": uncarried["total"], + } + return ( + _fail(stage, check, failures, details) + if failures + else _pass(stage, check, details) + ) + + def _road_fuel_incidence_gate( stage: str, evidence: Mapping[str, object], diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index 0ca35a8b16..03bbca25ea 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -1395,6 +1395,7 @@ def test_declares_the_full_june_battery(self, manifest) -> None: "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", + "uk_stage_lcfs_consumption_recomposed_totals", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", @@ -1504,6 +1505,7 @@ def test_strict_absent_evidence_entries_are_declared(self, manifest) -> None: "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", + "uk_stage_lcfs_consumption_recomposed_totals", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py index 6e197a5540..4216ece6ee 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py @@ -87,10 +87,12 @@ def test_e6_support_bounds_resources_are_sha_bound_and_non_placeholder() -> None "f32d54d83cdecf023f0ac73530be3a99372099b596e0106a56eae42a64929e50" ) # Raked or levelled columns carry no bounds: energy, bus fares since - # microcosm#890, and petrol and diesel since microcosm#1113. - assert len(lcfs["bounds"]) == 12 + # microcosm#890, and since microcosm#1113 petrol, diesel and the housing and + # transport totals recomposed around the levelled parts. + assert len(lcfs["bounds"]) == 10 assert "bus_fare_spending" not in lcfs["bounds"] assert "petrol_spending" not in lcfs["bounds"] + assert "transport_consumption" not in lcfs["bounds"] assert vat["source"]["tab_sha256"] == ( "d0e94ebc92e85ca1b9fb3a7353dcaf41db2c5110c9f07c7793dc8c0b695250d8" ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index d4e4424d88..57b998a22f 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -820,12 +820,31 @@ def materialize(self, frame, variables, period): # The receipts the stage writes are the ones its gates read. from microcosm.build.uk_runtime.stage_health import uk_stage_health_gate + # Totals contain their levelled components (#1113). + energy = out[["electricity_consumption", "gas_consumption"]].sum(axis=1) + assert (out["housing_water_and_electricity_consumption"] >= energy).all() + assert (out["transport_consumption"] >= road_fuel).all() + recomposed = evidence["recomposed_totals"]["parents"] + assert recomposed["transport_consumption"]["weighted_components"] == ( + pytest.approx(level["level"]) + ) + assert recomposed["housing_water_and_electricity_consumption"][ + "weighted_total" + ] == pytest.approx( + result.weights_for("household").values + @ out["housing_water_and_electricity_consumption"].to_numpy() + ) gates = [ gate for gate in load_country_spec("uk").gates.gates - if gate.id.startswith("uk_stage_lcfs_consumption_road_fuel") + if gate.id + in { + "uk_stage_lcfs_consumption_road_fuel_incidence", + "uk_stage_lcfs_consumption_road_fuel_level", + "uk_stage_lcfs_consumption_recomposed_totals", + } ] - assert len(gates) == 2 + assert len(gates) == 3 for gate in gates: checked = uk_stage_health_gate( evidence=evidence, @@ -1296,6 +1315,172 @@ def test_redraw_is_a_no_op_when_undeclared() -> None: assert result.fit_weight_records == () +def _recompose_declaration() -> dict: + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + recompose_from_remainder_operation, + ) + + declared = recompose_from_remainder_operation( + load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + ) + assert declared is not None + return declared + + +def test_recompose_writes_each_total_around_its_levelled_parts() -> None: + """Totals keep the chain's own split and hold the levelled parts (#1113).""" + + from microcosm.build.uk_runtime.lcfs_consumption import recompose_parent_totals + from microcosm.build.uk_runtime.ledger_fact_vendoring import vendored_rows + + # The chain's draws of the parts, before any step re-levelled them. + drawn = pd.DataFrame( + { + "domestic_energy_consumption": [2000.0, 900.0, 0.0], + "petrol_spending": [800.0, 0.0, 0.0], + "diesel_spending": [0.0, 700.0, 0.0], + } + ) + # The levelled parts, beside the totals as the chain drew them. + draws = pd.DataFrame( + { + "housing_water_and_electricity_consumption": [7000.0, 600.0, 800.0], + "electricity_consumption": [900.0, 600.0, 0.0], + "gas_consumption": [700.0, 0.0, 0.0], + "transport_consumption": [2000.0, 1000.0, 0.0], + "petrol_spending": [1500.0, 0.0, 0.0], + "diesel_spending": [0.0, 900.0, 0.0], + "food_and_non_alcoholic_beverages_consumption": [1.0, 2.0, 3.0], + } + ) + weights = np.array([2.0, 1.0, 3.0]) + + out, receipt = recompose_parent_totals( + draws, drawn=drawn, parameters=_recompose_declaration(), weights=weights + ) + + # Housing: 7000 - 2000 + 1600; 600 - 900 floors at 0, + 600; 800 + 0. + assert out["housing_water_and_electricity_consumption"].tolist() == [ + 6600.0, + 600.0, + 800.0, + ] + # Transport: 2000 - 800 + 1500; 1000 - 700 + 900; 0. + assert out["transport_consumption"].tolist() == [2700.0, 1200.0, 0.0] + assert out["food_and_non_alcoholic_beverages_consumption"].tolist() == [ + 1.0, + 2.0, + 3.0, + ] + housing = receipt["parents"]["housing_water_and_electricity_consumption"] + assert housing["drawn_subtracts"] == ["domestic_energy_consumption"] + assert housing["weighted_drawn_total"] == 2.0 * 7000.0 + 600.0 + 3.0 * 800.0 + assert housing["rows_floored"] == 1 + assert housing["weighted_floored_mass"] == 300.0 + assert housing["weighted_remainder"] == pytest.approx( + housing["weighted_drawn_total"] + - housing["weighted_drawn_subtracts"] + + housing["weighted_floored_mass"] + ) + assert housing["rows_below_components"] == 0 + transport = receipt["parents"]["transport_consumption"] + assert transport["weighted_total"] == 2.0 * 2700.0 + 1200.0 + assert transport["weighted_components"] == 2.0 * 1500.0 + 900.0 + uncarried = receipt["uncarried"] + expected = [ + float( + vendored_rows( + "ons_household_expenditure_facts.json", + concept=concept, + period_type="calendar_year", + period_value=2024, + geography_id="K02000001", + dimensions={"coicop": coicop, "frequency": "annual"}, + )[0]["value"] + ) + for coicop, concept in ( + ("04.5.3", "ons.household_expenditure.liquid_fuels"), + ("04.5.4", "ons.household_expenditure.solid_fuels"), + ) + ] + assert [entry["value"] for entry in uncarried["classes"]] == expected + assert uncarried["total"] == pytest.approx(sum(expected)) + + +@pytest.mark.parametrize( + ("change", "match"), + [ + ( + lambda d: d["parents"]["transport_consumption"].update( + drawn_subtracts=["petrol_spending"] + ), + "not its draw less", + ), + ( + lambda d: d["parents"]["housing_water_and_electricity_consumption"].update( + components=["electricity_consumption"] + ), + "not its draw less", + ), + (lambda d: d["parents"].pop("transport_consumption"), "must declare"), + ( + lambda d: d["uncarried"].update(resource="family_resources.json"), + "not a vendored", + ), + ( + lambda d: d["uncarried"]["classes"][0].update(concept="ons.other"), + "expected one", + ), + ], +) +def test_recompose_refuses_a_declaration_it_does_not_apply(change, match) -> None: + import copy + + from microcosm.build.uk_runtime.lcfs_consumption import recompose_parent_totals + + declared = copy.deepcopy(_recompose_declaration()) + change(declared) + columns = ( + "housing_water_and_electricity_consumption", + "domestic_energy_consumption", + "electricity_consumption", + "gas_consumption", + "transport_consumption", + "petrol_spending", + "diesel_spending", + ) + draws = pd.DataFrame({column: [1.0] for column in columns}) + with pytest.raises(ValueError, match=match): + recompose_parent_totals(draws, drawn=draws, parameters=declared, weights=[1.0]) + + +def test_recompose_is_a_no_op_when_undeclared() -> None: + import dataclasses + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.lcfs_consumption import ( + lcfs_recompose_from_remainder, + ) + + committed = load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + stage = dataclasses.replace( + committed, + operations=tuple( + operation + for operation in committed.operations + if operation.kind != "recompose_from_remainder" + ), + ) + draws = pd.DataFrame({"transport_consumption": [1.0]}) + + out, receipt = lcfs_recompose_from_remainder( + stage, draws, drawn=draws, weights=[1.0] + ) + + assert out is draws and receipt is None + + def test_recipient_counts_adults_and_children_by_age_not_engine_flags() -> None: """The LCFS G018/G019 split is age 18, which the recipient counts from age. diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py index d5a756e764..c76569b409 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py @@ -622,6 +622,7 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: "zero_when_false", "redraw_zero_road_fuel", "level_road_fuel", + "recompose_from_remainder", "record_mass_conservation_receipt", ] assert [op.kind for op in stages["etb_vat"].operations] == [ diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py index 85a5dda6f5..9946a32d78 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py @@ -1675,6 +1675,101 @@ def failing(ev, fragment: str) -> None: run(None) +def test_recomposed_totals_gate_holds_totals_above_their_components() -> None: + """The lcfs recomposed_totals receipt is checked at stage time (microcosm#1113).""" + + import copy + + import pandas as pd + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.calibration_run import UK_SPINE_GATE_SCOPE + from microcosm.build.uk_runtime.lcfs_consumption import ( + recompose_from_remainder_operation, + recompose_parent_totals, + ) + + gate_id = "uk_stage_lcfs_consumption_recomposed_totals" + assert gate_id in UK_SPINE_GATE_SCOPE + parameters = _gate_parameters(gate_id) + assert parameters["check"] == "recomposed_totals" + declared = recompose_from_remainder_operation( + load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + ) + drawn = pd.DataFrame( + { + "domestic_energy_consumption": [2000.0, 900.0], + "petrol_spending": [800.0, 0.0], + "diesel_spending": [0.0, 700.0], + } + ) + draws = pd.DataFrame( + { + "housing_water_and_electricity_consumption": [7000.0, 600.0], + "electricity_consumption": [900.0, 600.0], + "gas_consumption": [700.0, 0.0], + "transport_consumption": [2000.0, 1000.0], + "petrol_spending": [1500.0, 0.0], + "diesel_spending": [0.0, 900.0], + } + ) + _, receipt = recompose_parent_totals( + draws, drawn=drawn, parameters=declared, weights=np.array([2.0, 1.0]) + ) + + def run(ev): + return uk_stage_health_gate( + evidence={"stage": "lcfs_consumption", "recomposed_totals": ev}, + stage="lcfs_consumption", + check="recomposed_totals", + parameters=parameters, + ) + + def failing(mutate, fragment: str) -> None: + tampered = copy.deepcopy(receipt) + mutate(tampered) + result = run(tampered) + assert not result.passed and any(fragment in f for f in result.failures), ( + fragment, + result.failures, + ) + + passed = run(receipt) + assert passed.passed, passed.failures + assert passed.details["uncarried_total"] == receipt["uncarried"]["total"] + housing = "housing_water_and_electricity_consumption" + failing( + lambda r: r["parents"][housing].update(minimum_remainder=-1.0), + "negative remainder", + ) + failing( + lambda r: r["parents"][housing].update(rows_below_components=1), + "below its components", + ) + failing( + lambda r: r["parents"]["transport_consumption"].update(weighted_total=1.0), + "is not its remainder plus components", + ) + failing( + lambda r: r["parents"][housing].update(weighted_floored_mass=0.0), + "is not its draw less the drawn parts", + ) + failing( + lambda r: r["parents"][housing].update(components=["electricity_consumption"]), + "components", + ) + failing( + lambda r: r["parents"]["transport_consumption"].update( + drawn_subtracts=["petrol_spending"] + ), + "drawn_subtracts", + ) + failing(lambda r: r["parents"].pop("transport_consumption"), "not the declared") + failing(lambda r: r["uncarried"].update(total=0.0), "uncarried spend") + with pytest.raises(ValueError, match="recomposed_totals must be an object"): + run(None) + + def test_bus_support_pricing_gate_recomputes_the_factors_from_the_vendored_rows() -> ( None ): diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index 61c9d0a834..ea5bd6d090 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -416,13 +416,13 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "22ccc5fa198f562af475c419c25c1781dc0c7c2e2ca06545de540fb2b2c11e08" + "27099cbe14d1a39cef77357594e914bc68b595032c18109f4232218b483813e4" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "94f76b7ce2e76727bfbe91ca2726e05c8399ad9783972ea7d3cc865771d87b55" + "3a37d35989ffedae5c8a62c47d3660799a9b88fbea1cd569aca09e85dbe9863c" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "c6cfff6fdf1d4e87c6cc4ebca1b9ed74134dcd585e1b2c914f893e7907925460" + "635efdbe3b38d6d6b3472fc59794952d54b1622b932355ef6c7d46047c3383f3" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -477,6 +477,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_bus_pricing": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_road_fuel_incidence": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_road_fuel_level": ("stage_health", "transferred"), + "uk_stage_lcfs_consumption_recomposed_totals": ("stage_health", "transferred"), "uk_stage_etb_vat_support": ("stage_health", "transferred"), "uk_stage_etb_services_support": ("stage_health", "transferred"), "uk_stage_etb_services_support_pricing": ("stage_health", "transferred"), @@ -584,6 +585,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", + "uk_stage_lcfs_consumption_recomposed_totals", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", @@ -802,6 +804,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: "uk_stage_hmrc_spi_income_spine_identity", "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_energy_rake", + "uk_stage_lcfs_consumption_recomposed_totals", "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_lcfs_consumption_support", @@ -857,10 +860,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: _UK_CERTIFICATION_PART_DIGESTS: Mapping[str, Mapping[str, str]] = { "spine": { "gates_manifest_sha256": ( - "e95e5808ead125458077a4844c93938b7249059670c114c52759c932ae0b78bb" + "0d12d3668a660be83f170307e43c1a89a00c397a6580870710f9b271025c7928" ), "policy_sha256": ( - "3a8d9c53f3f38051a830755533e233422b010d005100ca1511e836664bee362d" + "71ec27bb988fd358ad075439a854ec6410ef6f9df004c2790eab49ab85f5de37" ), }, "calibration_seam": { diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index 24767347e7..a5c51dd18c 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -127,13 +127,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "22ccc5fa198f562af475c419c25c1781dc0c7c2e2ca06545de540fb2b2c11e08" + "27099cbe14d1a39cef77357594e914bc68b595032c18109f4232218b483813e4" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "94f76b7ce2e76727bfbe91ca2726e05c8399ad9783972ea7d3cc865771d87b55" + "3a37d35989ffedae5c8a62c47d3660799a9b88fbea1cd569aca09e85dbe9863c" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "c6cfff6fdf1d4e87c6cc4ebca1b9ed74134dcd585e1b2c914f893e7907925460" + "635efdbe3b38d6d6b3472fc59794952d54b1622b932355ef6c7d46047c3383f3" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" @@ -176,6 +176,11 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: None, ), "uk_stage_lcfs_consumption_road_fuel_level": ("stage_health", "transferred", None), + "uk_stage_lcfs_consumption_recomposed_totals": ( + "stage_health", + "transferred", + None, + ), "uk_stage_nts_bus_travel_support": ("stage_health", "transferred", None), "uk_stage_nts_bus_travel_facts": ("stage_health", "transferred", None), "uk_stage_etb_vat_support": ("stage_health", "transferred", None), @@ -1277,6 +1282,7 @@ def _gate_battery_payload( "uk_stage_lcfs_consumption_bus_pricing": "lcfs_consumption", "uk_stage_lcfs_consumption_road_fuel_incidence": "lcfs_consumption", "uk_stage_lcfs_consumption_road_fuel_level": "lcfs_consumption", + "uk_stage_lcfs_consumption_recomposed_totals": "lcfs_consumption", "uk_stage_nts_bus_travel_support": "nts_bus_travel", "uk_stage_nts_bus_travel_facts": "nts_bus_travel", "uk_stage_etb_vat_support": "etb_vat", From e3f2a3a58da625143659e6cddae8335d233124aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 8 Oct 2026 21:20:07 +0100 Subject: [PATCH 06/18] Label the litres audit's per-fuel ratios as a uniform cars share (#1113) The audit scales each fuel's all-road-user HMRC litres by the all-fuel OBR cars share (58.3%), giving petrol x1.30 and diesel x0.37. Diesel is mostly vans and lorries, so those per-fuel ratios mislead; only the total ratio compares like with like. The receipt now says so in per_fuel_ratio_basis until a per-fuel cars benchmark exists (DESNZ sub-national road fuel by vehicle and fuel, requested in PolicyEngine/chronicle#322). The plan's quarterly 04.5.x and 07.2.2 vendoring is dropped: no code would read those rows. Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/uk_runtime/lcfs_consumption.py | 8 ++++++++ .../tests/engine_free/uk/test_uk_lcfs_consumption.py | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index 31dac0e5b2..8872732f2d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -206,6 +206,9 @@ UK_LCFS_ROAD_FUEL_TOTAL = "road_fuel_total" UK_LCFS_PETROL_SHARE = "petrol_share_of_road_fuel" UK_LCFS_ICE_SHARE_RULE = "one_minus_zero_emission_share" +#: How the litres audit reads its per-fuel ratios until a per-fuel cars benchmark +#: exists: only the all-fuel total compares like with like. +UK_LITRES_AUDIT_PER_FUEL_BASIS = "uniform cars share, not a per-fuel benchmark" #: The litres audit (microcosm#890 C7) reads these vendored concepts beside the #: declared litre-proxy price concepts: HMRC clearances are all road users, the #: OBR receipts split names the cars share of them. @@ -630,6 +633,11 @@ def receipts(category: str) -> float: "frame_over_cars_benchmark": ( frame_total / benchmark_total if benchmark_total > 0 else None ), + # The per-fuel ratios apply the all-fuel cars share to each fuel's + # all-road-user litres, but diesel is mostly vans and lorries, so + # only the total is a benchmark (microcosm#1113; a per-fuel cars + # split waits on PolicyEngine/chronicle#322). + "per_fuel_ratio_basis": UK_LITRES_AUDIT_PER_FUEL_BASIS, "gated": False, } diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index 57b998a22f..93c0c49c04 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -948,6 +948,10 @@ def test_fuel_litres_audit_reads_the_vendored_prices_litres_and_obr_split() -> N ) assert set(audit["fuels"]) == {"petrol_spending", "diesel_spending"} assert audit["gated"] is False + # Only the total compares like with like (#1113). + assert audit["per_fuel_ratio_basis"] == ( + "uniform cars share, not a per-fuel benchmark" + ) class Stage: operations = () From 21a4d3a7783df8a3895066b06fc163c458a62ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 8 Oct 2026 21:25:24 +0100 Subject: [PATCH 07/18] Report stage-levelled consumption at design and final weights (#1113) The lcfs_consumption stage now sets the levels of electricity, gas, petrol and diesel, the gas connection and the fuel incidence, so calibration should barely move them. Before this series, the bound rows moved them a lot: gas fell 19% through the weights and the gas-connected share 84.5% to 78.9%. uk_diagnostics gains a report-only consumption_drift block, computed from the calibration's initial and final weights on the frame's own columns: - totals: electricity, gas, domestic energy, petrol, diesel, and consumption across the twelve COICOP divisions; - shares: gas-connected households, fuel-buying households, and flagged fuel-car households without fuel. Each value carries design, final, change and relative change. The block is omitted for a frame without the consumption columns. The typed schema (UKConsumptionDrift, UKDriftValue) is optional and forbids undeclared fields, as the rest of the UK extension does. Co-Authored-By: Claude Opus 5.5 --- .../microcosm/build/uk_runtime/diagnostics.py | 80 +++++++++++++++++ .../engine_free/uk/test_uk_diagnostics.py | 89 ++++++++++++++++++- .../src/microcosm/diagnostics/__init__.py | 4 + .../src/microcosm/diagnostics/schema.py | 33 +++++++ .../tests/engine_free/shared/test_schema.py | 51 +++++++++++ 5 files changed, 256 insertions(+), 1 deletion(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py index 4a961a6046..05d400efaa 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py @@ -47,6 +47,7 @@ "UK_DIAGNOSTICS_SCHEMA_VERSION", "UK_TARGET_GEOGRAPHY_LEVELS", "uk_calibration_diagnostics_payload", + "uk_consumption_drift", "uk_fit_by_family", "uk_support_limited_misses", "uk_target_geography_levels", @@ -619,6 +620,82 @@ def _stratum_columns(columns: Sequence[str]) -> tuple[str, ...]: return materialized +#: Columns whose level the lcfs_consumption stage sets (energy at DESNZ volume +#: and QEP prices, road fuel at ONS 07.2.2) and calibration should leave alone. +_UK_DRIFT_TOTAL_COLUMNS: tuple[str, ...] = ( + "electricity_consumption", + "gas_consumption", + "domestic_energy_consumption", + "petrol_spending", + "diesel_spending", +) + + +def _drift_value(design: float, final: float) -> dict[str, float | None]: + return { + "design": float(design), + "final": float(final), + "change": float(final - design), + "relative_change": None if design == 0 else float((final - design) / design), + } + + +def uk_consumption_drift( + household: pd.DataFrame, + design_weights: Sequence[float] | np.ndarray, + final_weights: Sequence[float] | np.ndarray, +) -> dict[str, object] | None: + """Stage-levelled spend and its composition at design and final weights. + + Report only (microcosm#1113): the stage sets the energy and road-fuel + levels, the gas connection and the fuel incidence, so calibration should + barely move them. Returns None for a frame without the consumption columns. + """ + + from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_COICOP_DIVISION_COLUMNS, + ) + + needed = { + *_UK_DRIFT_TOTAL_COLUMNS, + *UK_LCFS_COICOP_DIVISION_COLUMNS, + "has_fuel_consumption", + } + if not needed <= set(household.columns): + return None + design = _as_weights(design_weights) + final = _as_weights(final_weights) + if design.shape != (len(household),) or final.shape != (len(household),): + raise ValueError("UK drift weights must align with the household rows.") + + def column(name: str) -> np.ndarray: + return household[name].to_numpy(dtype=np.float64) + + totals = { + name: _drift_value(design @ column(name), final @ column(name)) + for name in _UK_DRIFT_TOTAL_COLUMNS + } + consumption = sum(column(name) for name in UK_LCFS_COICOP_DIVISION_COLUMNS) + totals["consumption"] = _drift_value(design @ consumption, final @ consumption) + road_fuel = column("petrol_spending") + column("diesel_spending") + flagged = household["has_fuel_consumption"].to_numpy(dtype=bool) + + def share(mask: np.ndarray, base: np.ndarray, weights: np.ndarray) -> float: + mass = float(weights[base].sum()) + return float(weights[mask & base].sum()) / mass if mass > 0 else 0.0 + + everyone = np.ones(len(household), dtype=bool) + shares = { + name: _drift_value(share(mask, base, design), share(mask, base, final)) + for name, mask, base in ( + ("gas_connected_households", column("gas_consumption") > 0, everyone), + ("fuel_buying_households", road_fuel > 0, everyone), + ("fuel_car_households_without_fuel", ~(road_fuel > 0), flagged), + ) + } + return {"report_only": True, "totals": totals, "shares": shares} + + def uk_zero_weight_strata( household: pd.DataFrame, weights: Sequence[float] | np.ndarray, @@ -953,6 +1030,9 @@ def uk_calibration_diagnostics_payload( ) if rotated_holdout is not None: uk_diagnostics["rotated_holdout"] = dict(rotated_holdout) + drift = uk_consumption_drift(household, result.initial_weights, result_weights) + if drift is not None: + uk_diagnostics["consumption_drift"] = drift payload["uk_diagnostics"] = uk_diagnostics return CalibrationDiagnosticsV8.model_validate(payload).model_dump( mode="python", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_diagnostics.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_diagnostics.py index c12701540c..2498acc42a 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_diagnostics.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_diagnostics.py @@ -261,7 +261,26 @@ def test_local_fit_diagnostics_filter_national_rows_and_pin_support_shape() -> N assert areas["bottom_by_fit"][0]["area_code"] == "E14000001" -def _diagnostics_case(*, with_skipped: bool = False): +def _consumption_columns(n: int) -> dict[str, np.ndarray]: + """The lcfs_consumption columns the drift block reads, two houses with gas.""" + + from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_COICOP_DIVISION_COLUMNS, + ) + + columns = {name: np.full(n, 10.0) for name in UK_LCFS_COICOP_DIVISION_COLUMNS} + columns["electricity_consumption"] = np.full(n, 2.0) + columns["gas_consumption"] = np.where(np.arange(n) < 2, 3.0, 0.0) + columns["domestic_energy_consumption"] = ( + columns["electricity_consumption"] + columns["gas_consumption"] + ) + columns["petrol_spending"] = np.where(np.arange(n) % 2 == 0, 4.0, 0.0) + columns["diesel_spending"] = np.zeros(n) + columns["has_fuel_consumption"] = np.arange(n) % 2 == 0 + return columns + + +def _diagnostics_case(*, with_skipped: bool = False, with_consumption: bool = False): levels_and_weights = ( ("national", 11.0), ("region", 12.0), @@ -277,6 +296,9 @@ def _diagnostics_case(*, with_skipped: bool = False): _CG_COLUMN: [False, False, True, True, False] * 2, } ) + if with_consumption: + for name, values in _consumption_columns(n_households).items(): + household[name] = values specs = [] geography = {} for row_index, (level, _) in enumerate(levels_and_weights): @@ -586,6 +608,71 @@ def test_payload_preserves_common_schema_and_adds_versioned_uk_evidence() -> Non assert json.loads(json.dumps(payload, allow_nan=False)) == payload +def test_consumption_drift_compares_design_and_final_weights() -> None: + """Stage-levelled spend and composition, design against final (#1113).""" + + from microcosm.build.uk_runtime.diagnostics import uk_consumption_drift + + household = pd.DataFrame(_consumption_columns(4)) + design = np.array([1.0, 1.0, 1.0, 1.0]) + final = np.array([2.0, 0.0, 1.0, 1.0]) + + drift = uk_consumption_drift(household, design, final) + + assert drift["report_only"] is True + assert drift["totals"]["gas_consumption"] == { + "design": 6.0, + "final": 6.0, + "change": 0.0, + "relative_change": 0.0, + } + assert drift["totals"]["petrol_spending"]["final"] == 12.0 + assert drift["totals"]["petrol_spending"]["relative_change"] == pytest.approx(0.5) + assert drift["totals"]["consumption"]["design"] == 4 * 120.0 + assert drift["shares"]["gas_connected_households"]["design"] == 0.5 + assert drift["shares"]["gas_connected_households"]["final"] == 0.5 + assert drift["shares"]["fuel_buying_households"]["final"] == 0.75 + assert drift["shares"]["fuel_car_households_without_fuel"] == { + "design": 0.0, + "final": 0.0, + "change": 0.0, + "relative_change": None, + } + assert ( + uk_consumption_drift(household.drop(columns="gas_consumption"), design, final) + is None + ) + with pytest.raises(ValueError, match="align"): + uk_consumption_drift(household, design[:3], final) + + +def test_payload_carries_the_consumption_drift_when_the_frame_has_it() -> None: + result, frame, registry, geography = _diagnostics_case(with_consumption=True) + + payload = uk_calibration_diagnostics_payload( + result, + frame, + target_geography_levels=geography, + target_registry=registry, + ) + + drift = payload["uk_diagnostics"]["consumption_drift"] + assert set(drift["totals"]) == { + "electricity_consumption", + "gas_consumption", + "domestic_energy_consumption", + "petrol_spending", + "diesel_spending", + "consumption", + } + assert drift["totals"]["electricity_consumption"]["design"] == pytest.approx( + 2.0 * frame.n("household") + ) + assert drift["totals"]["electricity_consumption"]["final"] == pytest.approx( + 2.0 * float(np.sum(frame.weights_for("household").values)) + ) + + def test_uk_payload_shared_layer_matches_shared_diagnostics_format() -> None: result, frame, registry, geography = _diagnostics_case() build = {"release_id": "fixture"} diff --git a/packages/microcosm-diagnostics/src/microcosm/diagnostics/__init__.py b/packages/microcosm-diagnostics/src/microcosm/diagnostics/__init__.py index 3fbbcf803f..fc56769f93 100644 --- a/packages/microcosm-diagnostics/src/microcosm/diagnostics/__init__.py +++ b/packages/microcosm-diagnostics/src/microcosm/diagnostics/__init__.py @@ -9,8 +9,10 @@ CalibrationDiagnostics, CalibrationDiagnosticsV8, UKAreaFit, + UKConsumptionDrift, UKCountryFit, UKDiagnosticsV1, + UKDriftValue, UKGeographyPassRate, UKMeasuredRotatedHoldout, UKRotatedHoldoutFold, @@ -44,8 +46,10 @@ "UK_DIAGNOSTICS_SCHEMA_VERSION", "UK_TARGET_GEOGRAPHY_LEVELS", "UKAreaFit", + "UKConsumptionDrift", "UKCountryFit", "UKDiagnosticsV1", + "UKDriftValue", "UKGeographyPassRate", "UKMeasuredRotatedHoldout", "UKRotatedHoldoutFold", diff --git a/packages/microcosm-diagnostics/src/microcosm/diagnostics/schema.py b/packages/microcosm-diagnostics/src/microcosm/diagnostics/schema.py index 5951f53798..e5052a334a 100644 --- a/packages/microcosm-diagnostics/src/microcosm/diagnostics/schema.py +++ b/packages/microcosm-diagnostics/src/microcosm/diagnostics/schema.py @@ -525,6 +525,38 @@ class UKSkippedRotatedHoldout(DiagnosticsModel): UKRotatedHoldout = UKMeasuredRotatedHoldout | UKSkippedRotatedHoldout +class UKDriftValue(DiagnosticsModel): + """One quantity at the design weights and at the final weights.""" + + design: FiniteFloat + final: FiniteFloat + change: FiniteFloat + relative_change: FiniteFloat | None + + @model_validator(mode="after") + def reconcile_change(self) -> UKDriftValue: + if not math.isclose( + self.change, self.final - self.design, rel_tol=1e-9, abs_tol=1e-9 + ): + raise ValueError("UK drift change must equal final minus design") + if (self.relative_change is None) != (self.design == 0): + raise ValueError("UK drift relative change is undefined only at zero") + return self + + +class UKConsumptionDrift(DiagnosticsModel): + """Stage-levelled spend and its composition, design against final weights. + + Report only (microcosm#1113): the stage sets these levels and shares, so + calibration should barely move them; a large move means a bound row is + pulling weight onto the columns instead. + """ + + report_only: Literal[True] + totals: dict[NonBlankText, UKDriftValue] = Field(min_length=1) + shares: dict[NonBlankText, UKDriftValue] = Field(min_length=1) + + class UKDiagnosticsV1(DiagnosticsModel): schema_version: Literal[UK_DIAGNOSTICS_SCHEMA_VERSION] weights: UKWeightSummary @@ -534,6 +566,7 @@ class UKDiagnosticsV1(DiagnosticsModel): weakest_families: list[UKWeakestFamily] | None = None weakest_areas_by_fit: UKWeakestAreasByFit | None = None rotated_holdout: UKRotatedHoldout | None = None + consumption_drift: UKConsumptionDrift | None = None @model_validator(mode="after") def reconcile_uk_diagnostics(self) -> UKDiagnosticsV1: diff --git a/packages/microcosm-diagnostics/tests/engine_free/shared/test_schema.py b/packages/microcosm-diagnostics/tests/engine_free/shared/test_schema.py index 7668dc5b7e..c95a9d1b5e 100644 --- a/packages/microcosm-diagnostics/tests/engine_free/shared/test_schema.py +++ b/packages/microcosm-diagnostics/tests/engine_free/shared/test_schema.py @@ -205,6 +205,25 @@ def _uk_payload() -> dict: }, ], }, + "consumption_drift": { + "report_only": True, + "totals": { + "petrol_spending": { + "design": 100.0, + "final": 102.0, + "change": 2.0, + "relative_change": 0.02, + } + }, + "shares": { + "fuel_car_households_without_fuel": { + "design": 0.0, + "final": 0.0, + "change": 0.0, + "relative_change": None, + } + }, + }, } return payload @@ -283,6 +302,14 @@ def test_every_declared_uk_record_forbids_undeclared_fields() -> None: 0, "holdout_target_indices", ), + ("uk_diagnostics", "consumption_drift", "report_only"), + ( + "uk_diagnostics", + "consumption_drift", + "totals", + "petrol_spending", + "relative_change", + ), ], ) def test_schema_8_rejects_missing_fields_across_the_uk_extension( @@ -308,6 +335,13 @@ def test_schema_8_rejects_missing_fields_across_the_uk_extension( ("uk_diagnostics", "weakest_areas_by_fit", "countries", 0), ("uk_diagnostics", "rotated_holdout"), ("uk_diagnostics", "rotated_holdout", "folds", 0), + ("uk_diagnostics", "consumption_drift"), + ( + "uk_diagnostics", + "consumption_drift", + "shares", + "fuel_car_households_without_fuel", + ), ], ) def test_schema_8_rejects_undeclared_fields_across_the_uk_extension( @@ -530,3 +564,20 @@ def test_writer_round_trips_valid_output(tmp_path: Path) -> None: assert outcome.status == "available" assert parse_calibration_diagnostics(json.loads(path.read_text())) == model + + +@pytest.mark.parametrize( + ("change", "match"), + [ + ({"change": 3.0}, "final minus design"), + ({"relative_change": None}, "undefined only at zero"), + ], +) +def test_uk_consumption_drift_values_reconcile(change: dict, match: str) -> None: + payload = _uk_payload() + payload["uk_diagnostics"]["consumption_drift"]["totals"]["petrol_spending"].update( + change + ) + + with pytest.raises(ValidationError, match=match): + parse_calibration_diagnostics(payload) From ea433d1c5c25acb1bf1399db6e55f3fd739f9f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 9 Oct 2026 10:01:51 +0100 Subject: [PATCH 08/18] Put every LCFS spend column at calendar-2024 prices (#1113) PE-UK projects each household spend column from the H5's year, 2024, with calendar-year growth, and Microcosm's calibration uprates the same values to the calendar-2025 window, so both read every column as calendar-2024 prices. Two of the stage's levels were on FY2024-25 instead: - energy: DESNZ volume and QEP prices for FY2024-25; - bus fares: the yield per fare-paying boarding from FY2024-25 receipts and journeys. Each column would then have needed its own basis to be projected correctly. Instead every column now sits on calendar 2024, so none does: - Energy is priced at QEP's calendar-2024 averages paid and levelled to the DESNZ Energy Trends volume over the four quarters of 2024, both vendored beside the fiscal rows. The level now takes a calendar or fiscal year. - Each area's FY2024-25 bus yield is re-priced to calendar 2024 by its fares index: - London and England outside London: DfT's quarterly local bus fares index, calendar-year mean over fiscal-year mean; - Scotland: its calendar-year index, taking the fiscal year as three quarters of 2024 and one of 2025; - Northern Ireland: England's index. The factors are 1.000 for London (fares held flat), 0.965 for England outside London (the fare cap rose in January 2025), 0.988 for Scotland and 0.982 for Northern Ireland. The bus pricing gate checks them. - The diary columns (CPI-uprated to 2024) and road fuel (ONS 07.2.2 for 2024) were already on calendar 2024. The uk_stage_lcfs_consumption_basis gate holds every level-setting step to calendar 2024: the donor uprating's target year, the energy prices' and the DESNZ level's periods, the bus prices' year and the road-fuel level's period. A step whose receipt is absent fails. On the head-r3 spine all seven lcfs stage-health gates pass. Energy moves +1.7% (GBP 47.9bn to 48.8bn) and bus fares -2.1%; fuel and the diary columns don't move. PE-UK can then project every column from the H5's year with no basis of its own. It still has to project energy: an energy price index from 2024 in place of the uk-data assumption that bills are stored at FY2026-27 prices. Co-Authored-By: Claude Opus 5.5 --- .../spec_engine/schema/sources.schema.json | 45 ++++++- .../src/microcosm/build/uk/gates.json | 17 ++- .../uk/release_input_coverage_manifest.json | 36 +++--- .../src/microcosm/build/uk/source_stages.json | 35 +++++- .../src/microcosm/build/uk/spec/sources.yaml | 31 ++++- .../build/uk_runtime/battery_bindings.py | 4 + .../build/uk_runtime/bus_fare_pricing.py | 118 +++++++++++++++++- .../build/uk_runtime/calibration_run.py | 1 + .../build/uk_runtime/energy_pricing.py | 25 +++- .../build/uk_runtime/stage_health.py | 91 +++++++++++++- .../engine_free/shared/test_country_spec.py | 2 + .../uk/test_uk_bus_fare_pricing.py | 93 ++++++++++++++ .../engine_free/uk/test_uk_energy_pricing.py | 50 +++++--- .../uk/test_uk_lcfs_consumption.py | 19 +++ .../engine_free/uk/test_uk_stage_health.py | 74 +++++++++++ .../src/microcosm/data/contract.py | 13 +- .../tests/engine_free/shared/test_contract.py | 8 +- 17 files changed, 599 insertions(+), 63 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index d7df728849..4ae6ddbe45 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -9597,7 +9597,8 @@ "margins_resource", "margins_period_value", "level_resource", - "level_fiscal_start", + "level_period_type", + "level_period_value", "level_temperature_adjustment" ], "properties": { @@ -9694,8 +9695,14 @@ "level_resource": { "type": "string" }, - "level_fiscal_start": { - "type": "string" + "level_period_type": { + "enum": [ + "calendar_year", + "fiscal_year" + ] + }, + "level_period_value": { + "type": "integer" }, "level_temperature_adjustment": { "enum": [ @@ -10526,6 +10533,9 @@ "fiscal_start": { "type": "string" }, + "price_year": { + "type": "integer" + }, "trip_rates_resource": { "type": "string" }, @@ -10684,6 +10694,35 @@ "trips_concept": { "type": "string" }, + "price_index": { + "type": "object", + "additionalProperties": false, + "required": [ + "resource", + "concept", + "frequency" + ], + "properties": { + "resource": { + "type": "string" + }, + "concept": { + "type": "string" + }, + "geography_id": { + "type": "string" + }, + "frequency": { + "enum": [ + "quarterly", + "annual" + ] + }, + "basis": { + "type": "string" + } + } + }, "trips_basis": { "enum": [ "published_series_rate", diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 9b1347a7e0..ae4988805d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -387,7 +387,22 @@ "check": "recomposed_totals", "maximum_relative_deviation": 1e-09 }, - "notes": "Stage-time check on the lcfs recomposed_totals receipt (microcosm#1113): housing_water_and_electricity_consumption and transport_consumption each keep their own chain draw less the chain's draws of the parts the stage re-levels (the diary energy, petrol and diesel; floored at zero where the parts outgrow the total) and add the levelled parts back, so no household's total is below its electricity and gas or its petrol and diesel and no remainder is negative. The declared parts must be the receipt's, the weighted remainder must equal the drawn total less the drawn parts plus the floored mass, and the weighted total the remainder plus the levelled parts, to the declared tolerance. The ONS 04.5.3 and 04.5.4 liquid and solid fuel spend, which leaves the housing total because no frame column carries it, is recomputed from the vendored rows and must equal the receipt's. The two totals carry no committed support bound; this check holds them instead. A population fact check: the synthetic smoke records it without blocking." + "notes": "Stage-time check on the lcfs recomposed_totals receipt (microcosm#1113): housing_water_and_electricity_consumption and transport_consumption each keep their own chain draw less the chain's draws of the parts the stage re-levels (the drawn electricity and gas, or petrol and diesel; floored at zero where the parts outgrow the total) and add the levelled parts back, so no household's total is below its electricity and gas or its petrol and diesel and no remainder is negative. The declared parts must be the receipt's, the weighted remainder must equal the drawn total less the drawn parts plus the floored mass, and the weighted total the remainder plus the levelled parts, to the declared tolerance. The ONS 04.5.3 and 04.5.4 liquid and solid fuel spend, which stays inside the housing remainder because no frame column carries it, is recomputed from the vendored rows and must equal the receipt's. The two totals carry no committed support bound; this check holds them instead. A population fact check: the synthetic smoke records it without blocking." + }, + { + "id": "uk_stage_lcfs_consumption_basis", + "gate": "stage_health", + "phase": "transferred", + "criticality": "release_blocking", + "evidence_absent_blocks": true, + "population_fact_check": true, + "parameters": { + "stage": "lcfs_consumption", + "check": "consumption_basis", + "period_type": "calendar_year", + "period_value": 2024 + }, + "notes": "Stage-time check that every household spend column lcfs_consumption emits is at calendar-2024 prices as households paid them (microcosm#1113): the H5's year, which policyengine-uk projects every column from with calendar-year growth and the calibration uprates to the calendar-2025 window, so no column needs a basis of its own. The donor uprating must move the diary to 2024, the QEP energy prices and the DESNZ volume level must be for calendar 2024, bus fares must be re-priced to 2024 by the fares indices, and the road-fuel level must be ONS 07.2.2 for calendar 2024; a step whose receipt is absent fails. A population fact check: the synthetic smoke records it without blocking." }, { "id": "uk_stage_etb_vat_support", diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index f12306d2f0..f6360a8ad2 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "067ba21c12aeb4e95e6a8a16141dbaa075e8787ed875a005f549cab6e91a6b56", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,9 +760,9 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { - "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", + "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2023-24" }, "stage": "lcfs_consumption", @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "a1b746de54e817c77d2b92062b3313cd661f74d133ddc65c097dff431b431c91", + "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index cc78e12cb3..1a189150ca 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -3318,7 +3318,7 @@ { "stage": "lcfs_consumption", "survey": "Living Costs and Food Survey 2023-24", - "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", + "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "grain": "household", "base_candidate": { "filename": "populace_uk_2023.h5", @@ -3641,7 +3641,7 @@ "kind": "price_domestic_energy", "resource": "qep_energy_prices.json", "crosswalk_resource": "ofgem_region_crosswalk.json", - "period_type": "fiscal_year", + "period_type": "calendar_year", "period_value": 2024, "payment_method": "all", "metering_arrangement": "standard", @@ -3663,7 +3663,8 @@ "margins_resource": "need_energy_facts.json", "margins_period_value": 2024, "level_resource": "desnz_domestic_energy_facts.json", - "level_fiscal_start": "2024-04-01", + "level_period_type": "calendar_year", + "level_period_value": 2024, "level_temperature_adjustment": "actual_temperature" }, { @@ -3675,6 +3676,7 @@ }, "eligibility_column": "bus_pass_eligible", "fiscal_start": "2024-04-01", + "price_year": 2024, "trip_rates_resource": "dft_bus_value_anchors.json", "trip_rates_period_value": 2024, "population_resource": "dft_bus_journeys.json", @@ -3701,6 +3703,12 @@ "journey_category": "total_concessionary" } }, + "price_index": { + "resource": "dft_bus_value_anchors.json", + "concept": "dft.local_bus_fares_index", + "geography_id": "E12000007", + "frequency": "quarterly" + }, "trips_concept": "dft.bus_in_london_trips_per_person", "trips_basis": "published_series_rate", "population_geography_ids": [ @@ -3747,6 +3755,12 @@ "journey_category": "total_concessionary" } }, + "price_index": { + "resource": "dft_bus_value_anchors.json", + "concept": "dft.local_bus_fares_index", + "geography_id": "dft:england_outside_london", + "frequency": "quarterly" + }, "trips_concept": "dft.other_local_bus_trips_per_person", "trips_basis": "published_series_rate", "population_geography_ids": [ @@ -3788,6 +3802,12 @@ "journey_category": "concessionary" } }, + "price_index": { + "resource": "devolved_bus_finance.json", + "concept": "scotgov.bus.local_fare_index", + "geography_id": "S92000003", + "frequency": "annual" + }, "trips_concept": "dft.other_local_bus_trips_per_person", "trips_basis": "england_other_local_bus_rate_as_proxy", "population_geography_ids": [ @@ -3828,6 +3848,13 @@ "travel_status": "full_fare_concession" } }, + "price_index": { + "resource": "dft_bus_value_anchors.json", + "concept": "dft.local_bus_fares_index", + "geography_id": "E92000001", + "frequency": "quarterly", + "basis": "england_index_as_proxy" + }, "trips_concept": "dft.other_local_bus_trips_per_person", "trips_basis": "england_other_local_bus_rate_as_proxy", "population_geography_ids": [ @@ -3973,7 +4000,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn diary energy (p537, the whole of COICOP 04.5) plus electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The liquid and solid fuels of COICOP 04.5, which no frame column carries, leave the housing total with the drawn p537; the receipt records their published ONS 04.5.3 and 04.5.4 spend. The two totals carry no committed support bound; the recomposed_totals gate holds them instead." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index a892d1de3b..305bd0fc7f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -2757,7 +2757,7 @@ stages: notes: Imputes local-bus travel per person from the National Travel Survey microdata (microcosm#930; the structural fix Maria ruled on 2026-09-15 for the rake-then-bind bus fares of microcosm#890). The donor is the NTS End User Licence extract (England residents only since 2013) pooled over the declared survey years for the conditional fit; the artifact pins are the 19th-edition (November 2025) tabs, verified at runtime, and the H2 fixture drives the stage with synthetic tabs in the same codebook. One QRF target, the interview frequency-of-use band (the variable behind NTS0313; 0 is the non-user band), conditioned on age band, sex, cars (the was_wealth draw on the recipient), household size, the three-band gross household income and region, drawn from identity-keyed uniforms and rounded to the nearest band; devolved recipients take a declared proxy region for prediction only. Each person's annual local-bus trips are the diary's weighted mean for their band and residence group (London or the rest of England), split into the bus-in-London and other-local-bus series by main mode, W5 x JJXSC over W2 persons annualised by 52.14 weeks; a seven-day diary annualised per person would be right in aggregate and wrong in distribution, so it supplies band means, not per-person counts. If the extract carries no frequency column the band is drawn from the vendored NTS0313/NTS0621 shares and declared band midpoints are scaled to the vendored NTS0303 rate (the receipt names the path). Concessionary eligibility is the declared statutory age rule of the person's area, emitted for the lcfs pricing step to zero-price eligible persons' trips; the donor's eligible share of trips per series is receipted beside the publisher's concessionary boarding share. The stage and ticket tables class every diary bus boarding by how it was paid for (at the point of use, a season ticket or pass, a concessionary pass, free) and give each person the share of fare-paying boardings paid at the point of use for their band and residence group (local_bus_single_fare_share), the boardings a per-journey fare cap binds on, with the fare paid per boarding by residence group and survey year receipted beside it (microcosm#930 C13, María's ask of 2026-09-23). The stage records the frame's band shares against NTS0313/NTS0621, its trips per person against NTS0303 and by age band against NTS0601, and the frame's car availability against NTS0205, all from vendored rows; nothing derived from the licensed rows is committed. - stage: lcfs_consumption survey: Living Costs and Food Survey 2023-24 - source: UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables. + source: UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices. grain: household base_candidate: filename: populace_uk_2023.h5 @@ -3001,7 +3001,7 @@ stages: - kind: price_domestic_energy resource: qep_energy_prices.json crosswalk_resource: ofgem_region_crosswalk.json - period_type: fiscal_year + period_type: calendar_year period_value: 2024 payment_method: all metering_arrangement: standard @@ -3021,7 +3021,8 @@ stages: margins_resource: need_energy_facts.json margins_period_value: 2024 level_resource: desnz_domestic_energy_facts.json - level_fiscal_start: '2024-04-01' + level_period_type: calendar_year + level_period_value: 2024 level_temperature_adjustment: actual_temperature - kind: price_bus_journeys column: bus_fare_spending @@ -3030,6 +3031,7 @@ stages: other_local_bus: other_local_bus_trips eligibility_column: bus_pass_eligible fiscal_start: '2024-04-01' + price_year: 2024 trip_rates_resource: dft_bus_value_anchors.json trip_rates_period_value: 2024 population_resource: dft_bus_journeys.json @@ -3051,6 +3053,11 @@ stages: geography_id: E12000007 dimension_values: journey_category: total_concessionary + price_index: + resource: dft_bus_value_anchors.json + concept: dft.local_bus_fares_index + geography_id: E12000007 + frequency: quarterly trips_concept: dft.bus_in_london_trips_per_person trips_basis: published_series_rate population_geography_ids: @@ -3089,6 +3096,11 @@ stages: geography_id: dft:england_outside_london dimension_values: journey_category: total_concessionary + price_index: + resource: dft_bus_value_anchors.json + concept: dft.local_bus_fares_index + geography_id: dft:england_outside_london + frequency: quarterly trips_concept: dft.other_local_bus_trips_per_person trips_basis: published_series_rate population_geography_ids: @@ -3121,6 +3133,11 @@ stages: groupby_value_id: concessionary_passenger_journeys dimension_values: journey_category: concessionary + price_index: + resource: devolved_bus_finance.json + concept: scotgov.bus.local_fare_index + geography_id: S92000003 + frequency: annual trips_concept: dft.other_local_bus_trips_per_person trips_basis: england_other_local_bus_rate_as_proxy population_geography_ids: @@ -3149,6 +3166,12 @@ stages: dimension_values: transport_mode: bus travel_status: full_fare_concession + price_index: + resource: dft_bus_value_anchors.json + concept: dft.local_bus_fares_index + geography_id: E92000001 + frequency: quarterly + basis: england_index_as_proxy trips_concept: dft.other_local_bus_trips_per_person trips_basis: england_other_local_bus_rate_as_proxy population_geography_ids: @@ -3256,7 +3279,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn diary energy (p537, the whole of COICOP 04.5) plus electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The liquid and solid fuels of COICOP 04.5, which no frame column carries, leave the housing total with the drawn p537; the receipt records their published ONS 04.5.3 and 04.5.4 spend. The two totals carry no committed support bound; the recomposed_totals gate holds them instead.' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year.' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py index 8baaa61fc6..322295f973 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py @@ -1793,6 +1793,10 @@ def _ledger_compile_parity_required_artifacts( # #1113 road_fuel_incidence check: the ceiling on the chain's # zero share among flagged fuel-car households. "maximum_flagged_zero_share", + # #1113 consumption_basis check: the one base year of every + # LCFS spend column. + "period_type", + "period_value", } ), artifact_keys=frozenset({"stage_evidence"}), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/bus_fare_pricing.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/bus_fare_pricing.py index f4d4f731bd..c0a9125d33 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/bus_fare_pricing.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/bus_fare_pricing.py @@ -23,6 +23,12 @@ Regions with no published receipts (Wales) are left unpriced and keep the chain's raw draw, clipped to donor support (María's ruling, 2026-09-17). +The receipts and journeys are fiscal-year figures. When the declaration names a +``price_year``, each area's yield is re-priced to that calendar year with a +published fares index (the DfT local bus fares index by quarter, Scotland's +calendar-year index), so bus fares sit on calendar 2024 with every other LCFS +spend column (microcosm#1113). + Every input is a vendored Chronicle row; the receipt records every factor, the frame-implied boardings beside the published ones, and the frame's eligible trip share beside the publisher's concessionary boarding share, so the @@ -40,6 +46,7 @@ import numpy as np import pandas as pd +from microcosm.build.uk_runtime.energy_pricing import period_quarters from microcosm.build.uk_runtime.ledger_fact_vendoring import vendored_rows PRICE_BUS_JOURNEYS_KIND = "price_bus_journeys" @@ -155,6 +162,7 @@ class AreaPrice: yield_per_fare_paying_boarding: float fare_per_trip: float concessionary_boarding_share: float + calendar_price_factor: float trips_basis: str receipt: dict[str, Any] @@ -170,6 +178,90 @@ def area_for_region(self, region: str) -> AreaPrice | None: return self.other_by_region.get(str(region)) +def calendar_price_factor( + spec: Mapping[str, Any], + *, + price_year: int, + fiscal_start: str, + allowed_resources: Sequence[str], +) -> tuple[float, dict[str, Any]]: + """The factor that re-prices a fiscal-year yield to a calendar year. + + ``quarterly``: the fares index's mean over the calendar year's four + quarters over its mean over the fiscal year's (rows keyed by quarter + coverage). ``annual``: a calendar-year index, the fiscal year starting in + April of Y being three quarters of Y and one of Y + 1. + """ + + resource = str(spec.get("resource") or "") + if resource not in allowed_resources: + raise BusFarePricingError(f"price index resource {resource!r} is not declared.") + concept = str(spec.get("concept") or "") + criteria: dict[str, Any] = {"concept": concept} + if spec.get("geography_id") is not None: + criteria["geography_id"] = str(spec["geography_id"]) + if not fiscal_start.endswith("-04-01"): + raise BusFarePricingError("fiscal_start must be an April 1st.") + fiscal_year = int(fiscal_start[:4]) + frequency = str(spec.get("frequency") or "") + receipt: dict[str, Any] = { + "resource": resource, + "concept": concept, + "geography_id": criteria.get("geography_id"), + "frequency": frequency, + "basis": str(spec.get("basis", "own_index")), + "price_year": int(price_year), + "fiscal_start": fiscal_start, + } + if frequency == "quarterly": + by_start: dict[str, float] = {} + for row in vendored_rows(resource, **criteria): + start = str((row.get("period_coverage") or {}).get("start_date")) + if start in by_start: + raise BusFarePricingError( + f"{resource}: duplicate {concept} quarter {start}." + ) + by_start[start] = float(row["value"]) + calendar = period_quarters("calendar_year", price_year) + fiscal = period_quarters("fiscal_year", fiscal_year) + missing = [q for q in (*calendar, *fiscal) if q not in by_start] + if missing: + raise BusFarePricingError( + f"{resource}: {concept} lacks quarters {missing}." + ) + calendar_value = sum(by_start[q] for q in calendar) / 4.0 + fiscal_value = sum(by_start[q] for q in fiscal) / 4.0 + receipt["calendar_quarters"] = {q: by_start[q] for q in calendar} + receipt["fiscal_quarters"] = {q: by_start[q] for q in fiscal} + elif frequency == "annual": + values = {} + for year in sorted({int(price_year), fiscal_year, fiscal_year + 1}): + rows = vendored_rows( + resource, period_type="calendar_year", period_value=year, **criteria + ) + if len(rows) != 1: + raise BusFarePricingError( + f"{resource}: expected one {concept} row for {year}, found {len(rows)}." + ) + values[year] = float(rows[0]["value"]) + calendar_value = values[int(price_year)] + fiscal_value = 0.75 * values[fiscal_year] + 0.25 * values[fiscal_year + 1] + receipt["calendar_years"] = {str(year): value for year, value in values.items()} + else: + raise BusFarePricingError(f"unsupported price index frequency {frequency!r}.") + if calendar_value <= 0 or fiscal_value <= 0: + raise BusFarePricingError(f"{resource}: {concept} must be positive.") + factor = calendar_value / fiscal_value + receipt.update( + { + "calendar_value": calendar_value, + "fiscal_value": fiscal_value, + "factor": factor, + } + ) + return factor, receipt + + def bus_fare_prices( parameters: Mapping[str, Any], *, allowed_resources: Sequence[str] ) -> BusFarePrices: @@ -182,6 +274,7 @@ def bus_fare_prices( trip_rates_period = int(parameters["trip_rates_period_value"]) population_resource = str(parameters["population_resource"]) population_period = int(parameters["population_period_value"]) + price_year = parameters.get("price_year") areas = parameters.get("areas") if not isinstance(areas, list) or not areas: raise BusFarePricingError("price_bus_journeys declares no areas.") @@ -253,6 +346,18 @@ def bus_fare_prices( resident_trips = trips_per_person * population k = boardings / resident_trips y = receipts / (boardings - concessionary) + factor, index_receipt = 1.0, None + if price_year is not None: + if not isinstance(area.get("price_index"), Mapping): + raise BusFarePricingError( + f"area {label!r} declares no price_index for price_year {price_year}." + ) + factor, index_receipt = calendar_price_factor( + area["price_index"], + price_year=int(price_year), + fiscal_start=fiscal_start, + allowed_resources=allowed_resources, + ) price = AreaPrice( label=label, series=series, @@ -264,8 +369,9 @@ def bus_fare_prices( population=population, boardings_per_trip=k, yield_per_fare_paying_boarding=y, - fare_per_trip=k * y, + fare_per_trip=k * y * factor, concessionary_boarding_share=concessionary / boardings, + calendar_price_factor=factor, trips_basis=str(area.get("trips_basis", "published_series_rate")), receipt={ "label": label, @@ -284,7 +390,9 @@ def bus_fare_prices( "published_resident_trips": resident_trips, "boardings_per_trip": k, "yield_per_fare_paying_boarding": y, - "fare_per_trip": k * y, + "calendar_price_factor": factor, + "price_index": index_receipt, + "fare_per_trip": k * y * factor, "concessionary_boarding_share": concessionary / boardings, "trips_basis": str(area.get("trips_basis", "published_series_rate")), }, @@ -308,14 +416,16 @@ def bus_fare_prices( raise BusFarePricingError("no area prices the bus_in_london series.") receipt = { "fiscal_start": fiscal_start, + "price_year": None if price_year is None else int(price_year), "trip_rates_period_value": trip_rates_period, "population_period_value": population_period, "areas": area_receipts, "unpriced_regions": sorted(unpriced), "scope_translation": str(parameters.get("scope_translation", "")), "algebra": ( - "fare = sum over series of trips x k x y with k = B / (T x P) and " - "y = R / (B - C); frame / R = [frame trips / (T x P)] x " + "fare = sum over series of trips x k x y x f with k = B / (T x P), " + "y = R / (B - C) and f the fares index's calendar over fiscal-year " + "level; frame / R = f x [frame trips / (T x P)] x " "[frame fare-paying trip share / (1 - C / B)]: a survey-versus-survey " "composition check times a survey-versus-admin concession check, " "never a level the stage set." diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 46516f9fa3..fa13f3efa8 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py @@ -100,6 +100,7 @@ "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_lcfs_consumption_recomposed_totals", + "uk_stage_lcfs_consumption_basis", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py index d6af5fe0b7..6d9bee6230 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py @@ -208,6 +208,16 @@ def fiscal_year_quarters(fiscal_start: str) -> tuple[str, ...]: ) +def period_quarters(period_type: str, period_value: int) -> tuple[str, ...]: + """The four quarterly coverage start dates of a calendar or fiscal year.""" + + if period_type == "calendar_year": + return tuple(f"{int(period_value)}-{month:02d}-01" for month in (1, 4, 7, 10)) + if period_type == "fiscal_year": + return fiscal_year_quarters(f"{int(period_value)}-04-01") + raise ValueError("period_type must be calendar_year or fiscal_year.") + + def _one_row(rows: Sequence[Mapping[str, Any]], *, what: str) -> Mapping[str, Any]: if len(rows) != 1: raise ValueError(f"{what}: expected one vendored row, found {len(rows)}.") @@ -649,7 +659,12 @@ def impose_gas_connection( def published_energy_level( parameters: Mapping[str, Any], ) -> tuple[dict[str, float], dict[str, Any]]: - """Fiscal-year domestic consumption per fuel (kWh) from the Energy Trends rows.""" + """Domestic consumption per fuel (kWh) over the declared year. + + The four Energy Trends quarters of the declared calendar or fiscal year + are summed; the stage declares calendar 2024, the base year of every LCFS + spend column (microcosm#1113). + """ resource = str(parameters.get("level_resource") or "") if resource != UK_DESNZ_DOMESTIC_ENERGY_RESOURCE: @@ -657,8 +672,9 @@ def published_energy_level( f"level_resource must be {UK_DESNZ_DOMESTIC_ENERGY_RESOURCE!r}, " f"not {resource!r}." ) - fiscal_start = str(parameters["level_fiscal_start"]) - quarters = fiscal_year_quarters(fiscal_start) + period_type = str(parameters.get("level_period_type") or "") + period_value = int(parameters["level_period_value"]) + quarters = period_quarters(period_type, period_value) temperature = str(parameters.get("level_temperature_adjustment") or "") if temperature != "actual_temperature": raise ValueError( @@ -707,7 +723,8 @@ def published_energy_level( } receipt = { "resource": resource, - "fiscal_start": fiscal_start, + "period_type": period_type, + "period_value": period_value, "quarters": list(quarters), "temperature_adjustment": temperature, "geography_ids": sorted(geographies), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py index 1c3a9243f4..50190c4759 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py @@ -77,6 +77,8 @@ def uk_stage_health_gate( return _bus_travel_facts_gate(stage, evidence, parameters) if check == "bus_pricing": return _bus_pricing_gate(stage, evidence, parameters) + if check == "consumption_basis": + return _consumption_basis_gate(stage, evidence, parameters) if check == "recomposed_totals": return _recomposed_totals_gate(stage, evidence, parameters) if check == "road_fuel_incidence": @@ -2536,9 +2538,10 @@ def _bus_pricing_gate( from the receipt): for every declared area the receipts, boardings, concessionary journeys, trips per person and population, and the boardings-per-trip and yield factors derived from them, must equal the - receipt's to ``maximum_relative_deviation``; the unpriced regions must be - the declared ones; and the receipt must state that the chain conditioned - on the raw draw. The frame-implied boardings against the published ones + receipt's to ``maximum_relative_deviation``, as must the fares-index factor + that re-prices each fiscal-year yield to the declared calendar year + (microcosm#1113); the unpriced regions must be the declared ones; and the + receipt must state that the chain conditioned on the raw draw. The frame-implied boardings against the published ones are reported, not fenced: that ratio is the survey-versus-admin reading the calibration targets then act on (microcosm#930). """ @@ -2594,6 +2597,7 @@ def _close(observed: object, value: float) -> bool: for key, value in ( ("boardings_per_trip", area.boardings_per_trip), ("yield_per_fare_paying_boarding", area.yield_per_fare_paying_boarding), + ("calendar_price_factor", area.calendar_price_factor), ("fare_per_trip", area.fare_per_trip), ("concessionary_boarding_share", area.concessionary_boarding_share), ): @@ -2636,6 +2640,87 @@ def _close(observed: object, value: float) -> bool: ) +def _consumption_basis_gate( + stage: str, + evidence: Mapping[str, object], + parameters: Mapping[str, object], +) -> GateResult: + """Every LCFS spend column is on the declared base year's prices. + + Checks on the receipts of the steps that set the spend levels + (microcosm#1113): the donor uprating's target year, the energy prices' + and the DESNZ level's periods, the bus prices' re-pricing year and the + road-fuel level's period must all be the declared calendar year, so + policyengine-uk can project every column from the H5's year with no + per-column bases. A step whose receipt is absent fails the check. + """ + + check = "consumption_basis" + period_type = str(parameters.get("period_type") or "") + if period_type != "calendar_year": + raise ValueError(f"{stage}: the spend basis must be a calendar year.") + period_value = parameters.get("period_value") + if isinstance(period_value, bool) or not isinstance(period_value, int): + raise ValueError(f"{stage}: period_value must be an integer year.") + expected = (period_type, period_value) + failures: list[str] = [] + found: dict[str, object] = {} + + def receipt(key: str) -> Mapping[str, object] | None: + value = evidence.get(key) + if not isinstance(value, Mapping): + failures.append(f"{stage}: the stage recorded no {key} receipt.") + return None + return value + + def period_of(block: Mapping[str, object]) -> tuple[object, object]: + return (block.get("period_type"), block.get("period_value")) + + uprating = receipt("donor_uprating") + if uprating is not None: + found["donor_uprating"] = ("calendar_year", uprating.get("to_period")) + if uprating.get("to_period") != period_value: + failures.append( + f"{stage}: the donor uprating moves the diary to " + f"{uprating.get('to_period')!r}, not {period_value}." + ) + energy = receipt("energy_pricing") + if energy is not None: + level = energy.get("level") + level = level if isinstance(level, Mapping) else {} + found["energy_prices"] = period_of(energy) + found["energy_level"] = period_of(level) + for label, observed in ( + ("energy prices", found["energy_prices"]), + ("DESNZ energy level", found["energy_level"]), + ): + if observed != expected: + failures.append( + f"{stage}: the {label} are for {observed}, not {expected}." + ) + bus = receipt("bus_pricing") + if bus is not None: + found["bus_prices"] = bus.get("price_year") + if bus.get("price_year") != period_value: + failures.append( + f"{stage}: bus fares are priced for {bus.get('price_year')!r}, not " + f"{period_value}." + ) + fuel = receipt("road_fuel_level") + if fuel is not None: + found["road_fuel_level"] = period_of(fuel) + if period_of(fuel) != expected: + failures.append( + f"{stage}: the road-fuel level is for {period_of(fuel)}, not {expected}." + ) + details = {"period": list(expected), "steps": found} + return ( + _fail(stage, check, failures, details) + if failures + else _pass(stage, check, details) + ) + + def _recomposed_totals_gate( stage: str, evidence: Mapping[str, object], diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index 03bbca25ea..6317674d69 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -1396,6 +1396,7 @@ def test_declares_the_full_june_battery(self, manifest) -> None: "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_lcfs_consumption_recomposed_totals", + "uk_stage_lcfs_consumption_basis", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", @@ -1506,6 +1507,7 @@ def test_strict_absent_evidence_entries_are_declared(self, manifest) -> None: "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_lcfs_consumption_recomposed_totals", + "uk_stage_lcfs_consumption_basis", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_bus_fare_pricing.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_bus_fare_pricing.py index 87fcd7c30d..ee8480b6d8 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_bus_fare_pricing.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_bus_fare_pricing.py @@ -85,6 +85,8 @@ def test_prices_recompute_from_the_vendored_rows() -> None: assert london.trips_per_person == pytest.approx(trips) assert london.population == pytest.approx(population) assert london.boardings_per_trip == pytest.approx(total / (trips * population)) + # London fares held flat through 2024-25, so the calendar re-pricing is 1. + assert london.calendar_price_factor == pytest.approx(1.0) assert london.fare_per_trip == pytest.approx( london.boardings_per_trip * london.yield_per_fare_paying_boarding ) @@ -114,6 +116,97 @@ def test_prices_recompute_from_the_vendored_rows() -> None: assert ni.receipts == pytest.approx(49_584_434.28 + 100_498_383.21, rel=1e-6) assert ni.concessionary_boardings == pytest.approx(8_960_000.0) assert "composition check" in prices.receipt["algebra"] + # Every area's fiscal-year yield is re-priced to calendar 2024 (#1113). + assert prices.receipt["price_year"] == 2024 + for area in prices.other_by_region.values(): + assert area.fare_per_trip == pytest.approx( + area.boardings_per_trip + * area.yield_per_fare_paying_boarding + * area.calendar_price_factor + ) + assert ni.receipt["price_index"]["basis"] == "england_index_as_proxy" + + +def test_calendar_price_factor_reprices_a_fiscal_year_yield() -> None: + """Quarterly: calendar over fiscal mean; annual: three quarters of Y (#1113).""" + + from microcosm.build.uk_runtime.bus_fare_pricing import calendar_price_factor + + quarterly = { + "resource": "dft_bus_value_anchors.json", + "concept": "dft.local_bus_fares_index", + "geography_id": "dft:england_outside_london", + "frequency": "quarterly", + } + factor, receipt = calendar_price_factor( + quarterly, + price_year=2024, + fiscal_start="2024-04-01", + allowed_resources=UK_LCFS_VENDORED_RESOURCES, + ) + by_start = { + row["period_coverage"]["start_date"]: float(row["value"]) + for row in vendored_rows( + "dft_bus_value_anchors.json", + concept="dft.local_bus_fares_index", + geography_id="dft:england_outside_london", + ) + } + calendar = [by_start[f"2024-{m}-01"] for m in ("01", "04", "07", "10")] + fiscal = [ + by_start[q] for q in ("2024-04-01", "2024-07-01", "2024-10-01", "2025-01-01") + ] + assert factor == pytest.approx(np.mean(calendar) / np.mean(fiscal)) + assert factor < 1.0 # fares rose in January 2025 + assert receipt["calendar_quarters"]["2024-01-01"] == calendar[0] + + annual = { + "resource": "devolved_bus_finance.json", + "concept": "scotgov.bus.local_fare_index", + "geography_id": "S92000003", + "frequency": "annual", + } + factor, receipt = calendar_price_factor( + annual, + price_year=2024, + fiscal_start="2024-04-01", + allowed_resources=UK_LCFS_VENDORED_RESOURCES, + ) + years = {int(k): v for k, v in receipt["calendar_years"].items()} + assert factor == pytest.approx( + years[2024] / (0.75 * years[2024] + 0.25 * years[2025]) + ) + for change, match in ( + ({"frequency": "monthly"}, "unsupported price index frequency"), + ({"resource": "family_resources.json"}, "not declared"), + ({"geography_id": "W92000004"}, "lacks quarters"), + ): + with pytest.raises(BusFarePricingError, match=match): + calendar_price_factor( + {**quarterly, **change}, + price_year=2024, + fiscal_start="2024-04-01", + allowed_resources=UK_LCFS_VENDORED_RESOURCES, + ) + + +def test_a_price_year_needs_every_area_to_name_its_index() -> None: + declared = _declared() + areas = [dict(area) for area in declared["areas"]] + areas[1].pop("price_index") + with pytest.raises(BusFarePricingError, match="declares no price_index"): + bus_fare_prices( + {**declared, "areas": areas}, allowed_resources=UK_LCFS_VENDORED_RESOURCES + ) + # Without a price year the yields stay on the publisher's fiscal year. + unrepriced = bus_fare_prices( + {key: value for key, value in declared.items() if key != "price_year"}, + allowed_resources=UK_LCFS_VENDORED_RESOURCES, + ) + assert all( + area.calendar_price_factor == 1.0 + for area in unrepriced.other_by_region.values() + ) def test_published_fact_refuses_the_wrong_resource_unit_or_split() -> None: diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_energy_pricing.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_energy_pricing.py index 4d95eac9e3..e6e0deb3dd 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_energy_pricing.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_energy_pricing.py @@ -24,6 +24,7 @@ kwh_to_spend, need_geography, need_margins_from_facts, + period_quarters, pricing_operation, published_energy_level, published_gas_connected_shares, @@ -62,7 +63,7 @@ def _qep_value(concept: str, region: str, component: str, fuel: str) -> float: rows = vendored_rows( "qep_energy_prices.json", concept=concept, - period_type="fiscal_year", + period_type="calendar_year", period_value=2024, groupby_value_id=region, dimensions=dims, @@ -82,14 +83,27 @@ def test_fiscal_year_quarters() -> None: fiscal_year_quarters("2024-01-01") +def test_period_quarters_cover_a_calendar_or_fiscal_year() -> None: + assert period_quarters("calendar_year", 2024) == ( + "2024-01-01", + "2024-04-01", + "2024-07-01", + "2024-10-01", + ) + assert period_quarters("fiscal_year", 2024) == fiscal_year_quarters("2024-04-01") + with pytest.raises(ValueError, match="calendar_year or fiscal_year"): + period_quarters("quarter", 2024) + + def test_prices_are_the_published_qep_averages_paid() -> None: prices, receipt = qep_prices(_declared()) - # FY2024-25, all payment methods, including VAT: UK electricity 24.81 p/kWh - # + GBP 209.39 a year, gas 6.23 p/kWh + GBP 113.13. - assert prices.unit_rate[(UK, "electricity")] == pytest.approx(0.2481, abs=5e-4) - assert prices.fixed_cost[(UK, "electricity")] == pytest.approx(209.39, abs=0.01) - assert prices.unit_rate[(UK, "gas")] == pytest.approx(0.0623, abs=5e-4) - assert prices.fixed_cost[(UK, "gas")] == pytest.approx(113.13, abs=0.01) + # Calendar 2024, the base year of every LCFS spend column (microcosm#1113), + # all payment methods, including VAT: UK electricity 25.83 p/kWh + GBP + # 205.11 a year, gas 6.54 p/kWh + GBP 112.95. + assert prices.unit_rate[(UK, "electricity")] == pytest.approx(0.2583, abs=5e-4) + assert prices.fixed_cost[(UK, "electricity")] == pytest.approx(205.11, abs=0.01) + assert prices.unit_rate[(UK, "gas")] == pytest.approx(0.0654, abs=5e-4) + assert prices.fixed_cost[(UK, "gas")] == pytest.approx(112.95, abs=0.01) for region in sorted(set(prices.region_of_frs_region.values()) | {UK}): for fuel in ("electricity", "gas"): if (region, fuel) not in prices.unit_rate: @@ -134,7 +148,7 @@ def test_prices_are_the_published_qep_averages_paid() -> None: assert receipt["gas_priced_at_uk_average"] == ["NORTHERN_IRELAND"] assert receipt["payment_method"] == "all" assert receipt["vat_treatment"] == "including_vat" - assert receipt["period_type"] == "fiscal_year" and receipt["period_value"] == 2024 + assert receipt["period_type"] == "calendar_year" and receipt["period_value"] == 2024 # Regional spread is material in the fixed cost. assert prices.fixed_cost[("north_east", "electricity")] > ( prices.fixed_cost[("london", "electricity")] + 80 @@ -194,6 +208,8 @@ def test_qep_averages_paid_sit_near_the_cap_levels() -> None: """The cap matrix stays vendored as the regional maximum; QEP is what was paid.""" prices, _ = qep_prices(_declared()) + # The cap matrix is vendored for FY2024-25 only; the calendar-2024 averages + # paid sit within the same 10% of it. quarters = fiscal_year_quarters("2024-04-01") def cap(fuel: str, level: str, quarter: str) -> float: @@ -447,9 +463,11 @@ def test_identity_uniform_order_is_keyed_by_identity_not_row_order() -> None: impose_gas_connection(gas, frs_region=region, weights=weights, **kwargs) -def test_published_level_is_the_fiscal_year_sum_of_energy_trends_quarters() -> None: +def test_published_level_is_the_calendar_year_sum_of_energy_trends_quarters() -> None: level, receipt = published_energy_level(_declared()) - quarters = fiscal_year_quarters("2024-04-01") + quarters = period_quarters("calendar_year", 2024) + assert receipt["quarters"] == list(quarters) + assert (receipt["period_type"], receipt["period_value"]) == ("calendar_year", 2024) for column, concept in ( (ELECTRICITY_KWH, "desnz.energy_trends.domestic_electricity_consumption"), (GAS_KWH, "desnz.energy_trends.domestic_gas_consumption"), @@ -467,13 +485,17 @@ def test_published_level_is_the_fiscal_year_sum_of_energy_trends_quarters() -> N ) assert level[column] == pytest.approx(expected) assert receipt["by_fuel"][column]["total_kwh"] == pytest.approx(expected) - # FY2024-25: about 93 TWh of electricity and 260 TWh of gas. - assert level[ELECTRICITY_KWH] == pytest.approx(93.03e9, rel=1e-3) - assert level[GAS_KWH] == pytest.approx(260.07e9, rel=1e-3) + # Calendar 2024: about 91.7 TWh of electricity and 252.3 TWh of gas. + assert level[ELECTRICITY_KWH] == pytest.approx(91.74e9, rel=1e-3) + assert level[GAS_KWH] == pytest.approx(252.34e9, rel=1e-3) assert receipt["geography_ids"] == ["K02000001"] for mutation, match in ( (lambda p: p.update(level_resource="need_energy_facts.json"), "level_resource"), - (lambda p: p.update(level_fiscal_start="2020-04-01"), "lacks quarters"), + (lambda p: p.update(level_period_value=2019), "lacks quarters"), + ( + lambda p: p.update(level_period_type="quarter"), + "calendar_year or fiscal_year", + ), ( lambda p: p.update(level_temperature_adjustment="weather_corrected"), "actual_temperature", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index 93c0c49c04..02719dc0a2 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -845,6 +845,25 @@ def materialize(self, frame, variables, period): } ] assert len(gates) == 3 + # Every spend level is on calendar 2024; this run drops the uprating step, + # so the basis gate fails on exactly that receipt. + basis = uk_stage_health_gate( + evidence=evidence, + stage="lcfs_consumption", + check="consumption_basis", + parameters={ + "stage": "lcfs_consumption", + "check": "consumption_basis", + "period_type": "calendar_year", + "period_value": 2024, + }, + ) + assert not basis.passed + assert list(basis.failures) == [ + "lcfs_consumption: the stage recorded no donor_uprating receipt." + ], basis.failures + assert evidence["energy_pricing"]["level"]["period_type"] == "calendar_year" + assert evidence["bus_pricing"]["price_year"] == 2024 for gate in gates: checked = uk_stage_health_gate( evidence=evidence, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py index 9946a32d78..ad6b32cff9 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py @@ -1539,6 +1539,12 @@ def run(ev): "boardings" in f and "not the vendored" in f for f in result.failures ), result.failures tampered = copy.deepcopy(receipt) + tampered["prices"]["england_outside_london"]["calendar_price_factor"] *= 1.01 + result = run(tampered) + assert not result.passed and any( + "calendar_price_factor" in f for f in result.failures + ), result.failures + tampered = copy.deepcopy(receipt) tampered["chain_conditioned_on"] = "priced" result = run(tampered) assert not result.passed and any("raw draw" in f for f in result.failures) @@ -1609,6 +1615,74 @@ def failing(ev, fragment: str) -> None: run(None) +def test_consumption_basis_gate_holds_every_spend_level_to_calendar_2024() -> None: + """Every LCFS spend column is on the H5's year, calendar 2024 (#1113).""" + + import copy + + from microcosm.build.uk_runtime.calibration_run import UK_SPINE_GATE_SCOPE + + gate_id = "uk_stage_lcfs_consumption_basis" + assert gate_id in UK_SPINE_GATE_SCOPE + parameters = _gate_parameters(gate_id) + assert parameters == { + "stage": "lcfs_consumption", + "check": "consumption_basis", + "period_type": "calendar_year", + "period_value": 2024, + } + evidence = { + "stage": "lcfs_consumption", + "donor_uprating": {"from_period": 2023, "to_period": 2024}, + "energy_pricing": { + "period_type": "calendar_year", + "period_value": 2024, + "level": {"period_type": "calendar_year", "period_value": 2024}, + }, + "bus_pricing": {"price_year": 2024}, + "road_fuel_level": {"period_type": "calendar_year", "period_value": 2024}, + } + + def run(ev): + return uk_stage_health_gate( + evidence=ev, + stage="lcfs_consumption", + check="consumption_basis", + parameters=parameters, + ) + + def failing(mutate, fragment: str) -> None: + tampered = copy.deepcopy(evidence) + mutate(tampered) + result = run(tampered) + assert not result.passed and any(fragment in f for f in result.failures), ( + fragment, + result.failures, + ) + + passed = run(evidence) + assert passed.passed, passed.failures + assert passed.details["steps"]["energy_level"] == ("calendar_year", 2024) + failing(lambda e: e["donor_uprating"].update(to_period=2025), "donor uprating") + failing( + lambda e: e["energy_pricing"].update(period_type="fiscal_year"), "energy prices" + ) + failing( + lambda e: e["energy_pricing"]["level"].update(period_type="fiscal_year"), + "DESNZ energy level", + ) + failing(lambda e: e["bus_pricing"].update(price_year=None), "bus fares") + failing(lambda e: e["road_fuel_level"].update(period_value=2025), "road-fuel level") + failing(lambda e: e.pop("bus_pricing"), "no bus_pricing receipt") + with pytest.raises(ValueError, match="calendar year"): + uk_stage_health_gate( + evidence=evidence, + stage="lcfs_consumption", + check="consumption_basis", + parameters={**parameters, "period_type": "fiscal_year"}, + ) + + def test_road_fuel_incidence_gate_holds_every_flagged_household_positive() -> None: """The lcfs road_fuel_incidence receipt is checked at stage time (microcosm#1113).""" diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index ea5bd6d090..eb1e83dd5f 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -416,13 +416,13 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "27099cbe14d1a39cef77357594e914bc68b595032c18109f4232218b483813e4" + "9c08a68f9d63fff9f54dd21abb0a212723ff2074f0381cd7b69165e97c4c5ef6" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "3a37d35989ffedae5c8a62c47d3660799a9b88fbea1cd569aca09e85dbe9863c" + "f4eb5559cede924ae28b888f49e46a73133b43ea0468e01ddf2fae8be975e42b" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "635efdbe3b38d6d6b3472fc59794952d54b1622b932355ef6c7d46047c3383f3" + "4ebc627b0ba172b0f0b06810f8053811f9b628058b87e0d281a93166b39f70c4" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -478,6 +478,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_road_fuel_incidence": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_road_fuel_level": ("stage_health", "transferred"), "uk_stage_lcfs_consumption_recomposed_totals": ("stage_health", "transferred"), + "uk_stage_lcfs_consumption_basis": ("stage_health", "transferred"), "uk_stage_etb_vat_support": ("stage_health", "transferred"), "uk_stage_etb_services_support": ("stage_health", "transferred"), "uk_stage_etb_services_support_pricing": ("stage_health", "transferred"), @@ -586,6 +587,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_lcfs_consumption_road_fuel_incidence", "uk_stage_lcfs_consumption_road_fuel_level", "uk_stage_lcfs_consumption_recomposed_totals", + "uk_stage_lcfs_consumption_basis", "uk_stage_etb_vat_support", "uk_stage_etb_services_support", "uk_stage_etb_services_support_pricing", @@ -802,6 +804,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: "uk_stage_hmrc_cgt_asset_type_spine_summary", "uk_stage_hmrc_cgt_gains_spine_summary", "uk_stage_hmrc_spi_income_spine_identity", + "uk_stage_lcfs_consumption_basis", "uk_stage_lcfs_consumption_bus_pricing", "uk_stage_lcfs_consumption_energy_rake", "uk_stage_lcfs_consumption_recomposed_totals", @@ -860,10 +863,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: _UK_CERTIFICATION_PART_DIGESTS: Mapping[str, Mapping[str, str]] = { "spine": { "gates_manifest_sha256": ( - "0d12d3668a660be83f170307e43c1a89a00c397a6580870710f9b271025c7928" + "e6c5bc251657d6d73abacf5f62139458b29d515352f6bbd532d5e6da26bb24d3" ), "policy_sha256": ( - "71ec27bb988fd358ad075439a854ec6410ef6f9df004c2790eab49ab85f5de37" + "984cc9abf94cc119fca8b3c5ca1a36633cdfdf17caf060e4d17a493151e50e18" ), }, "calibration_seam": { diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index a5c51dd18c..1f7e56abfd 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -127,13 +127,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "27099cbe14d1a39cef77357594e914bc68b595032c18109f4232218b483813e4" + "9c08a68f9d63fff9f54dd21abb0a212723ff2074f0381cd7b69165e97c4c5ef6" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "3a37d35989ffedae5c8a62c47d3660799a9b88fbea1cd569aca09e85dbe9863c" + "f4eb5559cede924ae28b888f49e46a73133b43ea0468e01ddf2fae8be975e42b" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "635efdbe3b38d6d6b3472fc59794952d54b1622b932355ef6c7d46047c3383f3" + "4ebc627b0ba172b0f0b06810f8053811f9b628058b87e0d281a93166b39f70c4" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" @@ -181,6 +181,7 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: "transferred", None, ), + "uk_stage_lcfs_consumption_basis": ("stage_health", "transferred", None), "uk_stage_nts_bus_travel_support": ("stage_health", "transferred", None), "uk_stage_nts_bus_travel_facts": ("stage_health", "transferred", None), "uk_stage_etb_vat_support": ("stage_health", "transferred", None), @@ -1283,6 +1284,7 @@ def _gate_battery_payload( "uk_stage_lcfs_consumption_road_fuel_incidence": "lcfs_consumption", "uk_stage_lcfs_consumption_road_fuel_level": "lcfs_consumption", "uk_stage_lcfs_consumption_recomposed_totals": "lcfs_consumption", + "uk_stage_lcfs_consumption_basis": "lcfs_consumption", "uk_stage_nts_bus_travel_support": "nts_bus_travel", "uk_stage_nts_bus_travel_facts": "nts_bus_travel", "uk_stage_etb_vat_support": "etb_vat", From 975fd93d9dd278b0e19cf5fa698716b671eaa1df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 9 Oct 2026 10:03:56 +0100 Subject: [PATCH 09/18] Record the consumption-tax receipts and changelog fragments (#1113) experiments/1113-consumption-tax-levels-receipts.md is the receipt the register entries cite. It holds: - the commit list; - microcosm#1121's head calibration; - the measurements that put the levels in the stage (energy volumes and sources, road fuel, the VAT factor); - the masked re-solve of the 2026-09-30 problem; - the stage-only development run on the head-r3 spine, where all seven lcfs stage-health gates pass, with the in-sample check that moved the recomposed totals off chain-drawn remainders. One changelog fragment per change. The charter-H2 graph parity fixture and the national remeasure follow Group B (PolicyEngine/chronicle#322), whose feed re-pin moves the fixture again. Co-Authored-By: Claude Opus 5.5 --- .../1113-calendar-2024-spend-basis.changed.md | 1 + ...113-consumption-drift-diagnostics.added.md | 1 + ...sumption-tax-measure-exclusions.changed.md | 1 + .../1113-household-road-fuel-target.added.md | 1 + .../1113-recomposed-coicop-totals.changed.md | 1 + ...3-road-fuel-level-and-incidence.changed.md | 1 + .../1113-consumption-tax-levels-receipts.md | 151 ++++++++++++++++++ 7 files changed, 157 insertions(+) create mode 100644 changelog.d/1113-calendar-2024-spend-basis.changed.md create mode 100644 changelog.d/1113-consumption-drift-diagnostics.added.md create mode 100644 changelog.d/1113-consumption-tax-measure-exclusions.changed.md create mode 100644 changelog.d/1113-household-road-fuel-target.added.md create mode 100644 changelog.d/1113-recomposed-coicop-totals.changed.md create mode 100644 changelog.d/1113-road-fuel-level-and-incidence.changed.md create mode 100644 experiments/1113-consumption-tax-levels-receipts.md diff --git a/changelog.d/1113-calendar-2024-spend-basis.changed.md b/changelog.d/1113-calendar-2024-spend-basis.changed.md new file mode 100644 index 0000000000..f4696d6567 --- /dev/null +++ b/changelog.d/1113-calendar-2024-spend-basis.changed.md @@ -0,0 +1 @@ +Every household spend column the UK LCFS stage emits is now at calendar-2024 prices, the H5's year (microcosm#1113): domestic energy is priced at QEP's calendar-2024 averages paid and levelled to the DESNZ volume over the four quarters of 2024, and each area's fiscal-year bus yield is re-priced to 2024 by its fares index, so policyengine-uk can project every column from the H5's year. A stage-health gate holds every level-setting step to that year. diff --git a/changelog.d/1113-consumption-drift-diagnostics.added.md b/changelog.d/1113-consumption-drift-diagnostics.added.md new file mode 100644 index 0000000000..ba31caac15 --- /dev/null +++ b/changelog.d/1113-consumption-drift-diagnostics.added.md @@ -0,0 +1 @@ +UK calibration diagnostics report the stage-levelled consumption totals (electricity, gas, domestic energy, petrol, diesel and total consumption) and shares (gas-connected, fuel-buying, and fuel-car households without fuel) at design and final weights, in a report-only `consumption_drift` block (microcosm#1113). diff --git a/changelog.d/1113-consumption-tax-measure-exclusions.changed.md b/changelog.d/1113-consumption-tax-measure-exclusions.changed.md new file mode 100644 index 0000000000..51e15add05 --- /dev/null +++ b/changelog.d/1113-consumption-tax-measure-exclusions.changed.md @@ -0,0 +1 @@ +The UK calibration holds `obr.vat`, `ons.household_electricity_expenditure`, `ons.household_gas_expenditure` and `obr.fuel_duties_cars` out of the objective as reviewed measure exclusions, still measured on every evaluation; `tools/diagnose_uk_consumption_taxes.py` reports them on any H5 the engine loads (microcosm#1113, microcosm#1123 item 3). VAT's level is an engine factor (policyengine-uk#1996), the ONS energy rows sit below the DESNZ volume at QEP prices the stage sets, and the OBR cars receipts include business-paid car fuel; a re-solve with the rows masked changed no other row's fit. diff --git a/changelog.d/1113-household-road-fuel-target.added.md b/changelog.d/1113-household-road-fuel-target.added.md new file mode 100644 index 0000000000..f29db0abfb --- /dev/null +++ b/changelog.d/1113-household-road-fuel-target.added.md @@ -0,0 +1 @@ +The UK contract binds `ons.household_road_fuel_expenditure`, ONS Consumer Trends COICOP 07.2.2 (fuels and lubricants for personal transport) for the calendar year, measured as petrol plus diesel spend (microcosm#1113). diff --git a/changelog.d/1113-recomposed-coicop-totals.changed.md b/changelog.d/1113-recomposed-coicop-totals.changed.md new file mode 100644 index 0000000000..ce51422bc8 --- /dev/null +++ b/changelog.d/1113-recomposed-coicop-totals.changed.md @@ -0,0 +1 @@ +The UK LCFS stage writes `housing_water_and_electricity_consumption` and `transport_consumption` around the parts it re-levels (microcosm#1113): each keeps its own chain draw less the chain's draws of the diary energy, or of petrol and diesel, and adds the levelled electricity and gas, or petrol and diesel, back, so no total is below its parts. The liquid and solid fuels, which have no column of their own, stay inside the housing remainder, and the receipt records their published ONS spend beside it; a stage-health gate holds the totals in place of committed support bounds. diff --git a/changelog.d/1113-road-fuel-level-and-incidence.changed.md b/changelog.d/1113-road-fuel-level-and-incidence.changed.md new file mode 100644 index 0000000000..10880d33e2 --- /dev/null +++ b/changelog.d/1113-road-fuel-level-and-incidence.changed.md @@ -0,0 +1 @@ +The UK LCFS stage sets household road fuel itself (microcosm#1113): a flagged fuel-car household whose chain draw is zero is redrawn from the donor's distribution among households with positive road fuel (`redraw_zero_road_fuel`), and one factor then scales petrol and diesel to ONS 07.2.2 for 2024 less the donor's other-fuels share (`level_road_fuel`). Two stage-health gates check the receipts, petrol and diesel leave the committed support bounds, and the litres audit labels its per-fuel ratios as a uniform cars share. diff --git a/experiments/1113-consumption-tax-levels-receipts.md b/experiments/1113-consumption-tax-levels-receipts.md new file mode 100644 index 0000000000..496d25887f --- /dev/null +++ b/experiments/1113-consumption-tax-levels-receipts.md @@ -0,0 +1,151 @@ +# microcosm#1113 receipts: consumption-tax levels (VAT, road fuel, domestic energy) + +Plan: `repos/microcosm-vat-fuel-energy-implementation-plan.md` (María's rulings of 2026-10-08: D1 +DESNZ volume at QEP prices stays the energy level, D2 the stage sets the road-fuel level and +incidence, D3 VAT is held out until the engine factor is split). Covers microcosm#1113 and +microcosm#1123 item 3. Branch `uk-consumption-tax-levels`, off main `75167a688` (#1121 merged), +which locks policyengine-uk 2.122.2 on policyengine-core 3.32.19. + +Group A needs nothing from PolicyEngine/chronicle#322 and is complete. Group B (Consumer Trends for +every division and the per-fuel cars benchmark) follows once #322 lands. + +## Commits + +- A1 `cf2f7f2a4`: `obr.vat`, `ons.household_electricity_expenditure` and + `ons.household_gas_expenditure` move to the measure-exclusion register, measured on every + evaluation with `tools/diagnose_uk_consumption_taxes.py`. +- A2 `754e64414`: the `level_road_fuel` step sets petrol plus diesel to ONS Consumer Trends 07.2.2 + for calendar 2024, less the donor's own other-fuels share (gate `road_fuel_level`). +- A3 `519aef6e2`: the `redraw_zero_road_fuel` step gives every flagged fuel-car household a + positive spend (gate `road_fuel_incidence`). +- A4 `c252a1c46`: the contract binds `ons.household_road_fuel_expenditure` (07.2.2, calendar 2025, + GBP 35.099bn), and `obr.fuel_duties_cars` moves to the register. María confirmed this binding on + 2026-10-09. +- A5 `146b8418e`: the `recompose_from_remainder` step writes housing and transport around their + levelled parts (gate `recomposed_totals`). +- A8 `d04a72896`: the litres audit labels its per-fuel ratios as a uniform cars share. The plan's + quarterly 04.5.x and 07.2.2 vendoring is dropped, because no code would read it. +- A7 `a7a73638e`: `uk_diagnostics.consumption_drift` reports the stage-levelled totals and shares + at design and final weights. +- A6 `357adc2bf`: every LCFS spend column is at calendar-2024 prices, the H5's year. Energy is + priced and levelled for calendar 2024, and bus yields are re-priced to 2024 by fares index. The + gate `consumption_basis` holds every level-setting step to that year, so policyengine-uk can + project each column from the H5's year with no basis of its own. This replaces the plan's + per-column declaration (María's ruling of 2026-10-09). + +## microcosm#1121's head calibration + +Arm `head-r3` (tree `c7fe76e8a`, ledger feed `825406f` rebuilt; loss 0.00712, 98.3% of 1,167 rows +within 10%), before this branch: + +- `obr.vat` reads +24.7% at design weights and +24.1% calibrated, against the 25% bound. +- `obr.fuel_duties_cars` reads -34.5% at design weights and -17.7% calibrated. +- The ONS electricity and gas rows start at +9.4% and +23.4% and close through the weights. That + moves petrol +21% and diesel +34%, the gas-connected share from 84.5% to 78.9%, and fuel-car + households with no fuel from 34.3% to 30.0%. + +## Why the levels belong to the stage + +Measured on the 2026-09-30 national build (`c5a1cba87`); outputs in +`data/ukds/acceptance/vat-fuel-energy-measure-2026-10-08/`. + +- **Energy volumes (M1).** At design weights the frame holds 93.0 TWh of electricity and + 260.1 TWh of gas, equal to Energy Trends, with 84.5% of households connected to gas. At final + weights it holds 82.9 and 205.2 TWh with 78.9% connected. +- **Energy sources (M2).** For calendar 2025, ONS 04.5.1 electricity is GBP 26.52bn, 0.90 of + Energy Trends volume times QEP unit and standing charges (GBP 29.60bn) and 1.11 of unit cost + alone. ONS 04.5.2 gas is GBP 15.34bn, 0.81 of GBP 18.94bn and below unit cost alone (0.955). Meters + against households explains about 2%. Coverage, period and VAT cannot close a gap where the + household-sector total sits below the unit cost of the measured volume, so the ONS rows are a + published-source residual, not a weight question. +- **Road fuel (M3).** ONS 07.2.2 is GBP 37.025bn for calendar 2024 and GBP 35.099bn for 2025. The + LCFS diary records about a quarter less; the frame matched the donor per household (GBP 966 against + GBP 972). Once fuel is levelled, the engine's 2025 `fuel_duty` reads -9.9% against OBR cars on its + RAC price divisors and -8.1% on DESNZ's. ONS 07.2.2 at DESNZ 2025 pump prices implies about + GBP 13.5bn of duty; the OBR cars line, which includes business-paid car fuel, is about 7% above it. About a + third of fuel-car households carry no annual fuel (32.4% of the donor's car households record + none in the two-week diary). +- **VAT.** `vat` divides household VAT by `gov.simulation.microdata_vat_coverage` (0.38, a constant + since policyengine-uk PR #690, January 2023, with no recorded derivation; policyengine-uk#1996). + The frame's raw household VAT is about 46% of OBR receipts, so the factor sets the level. + +## Masked re-solve of the 2026-09-30 problem + +M4 re-solved the stored national problem with the doctrine options (1,500 epochs, lr 0.02, seed 0, +`max_weight_ratio` 10, loss cap 10, mass free), with and without the four rows. The baseline arm +reproduced the stored weights exactly. + +- With the four rows masked, the other 1,086 rows lose nothing: 98.5% within 10% against 98.4%, + none past 25% against one, and ESS +3.7%. +- What the rows cost the frame: VAT held total consumption 5% (GBP 55bn) low; the cars fuel row + pushed petrol up 18% and diesel 36%; the gas row cut gas 19% and the gas-connected share to 78.9%. +- Unbound, VAT reads +35% and OBR cars -27%, so both are signed register entries, not rows left + under the target-fit gate. + +## Stage-only development run + +`run_stage_dev.sh` re-runs the committed `lcfs_consumption` stage on the finished head-r3 spine +(63,956 households, about 50 seconds and 4.6 GB) and runs every lcfs stage-health gate on its +receipts. The spine already holds the stages after `lcfs_consumption`, so the before and after +columns differ by the re-run as well as by this branch. All seven gates pass: support, +energy_rake, bus_pricing, road_fuel_incidence, road_fuel_level, recomposed_totals and +consumption_basis. + +- **Incidence.** The chain left 33.2% of the 48,529 flagged fuel-car households (16,362) at zero + fuel; after the redraw none are. The redraw's mean is GBP 1,794 against GBP 1,880 for households + that drew fuel, with a 73.8% petrol share, from a model fitted on the 2,427 donors with positive + road fuel. +- **Level.** The redraw raises prior-weighted petrol plus diesel from GBP 26.89bn to GBP 39.63bn, + and the level step scales it by 0.931 to GBP 36.887bn: the published GBP 37.025bn less the donor's + 0.372% other-fuels share. Petrol is 68.4% of it. Annualised two-week spend runs high for the + households that did buy fuel, and the level step corrects that as well. +- **Recomposed totals.** Housing is its draw (GBP 180.1bn), less the drawn electricity and gas + (GBP 56.5bn), plus DESNZ times QEP energy (GBP 48.8bn): GBP 173.5bn. Transport is its draw + (GBP 173.0bn), less the drawn petrol and diesel (GBP 28.7bn), plus the levelled fuel + (GBP 36.9bn): GBP 181.5bn. Remainders floor at zero for 2,368 and 1,240 households + (GBP 1.1bn and 0.3bn). No household's total is below its parts, against 2.7% (energy) and + 1.8% (fuel) before. The chain's domestic-energy target is the diary's electricity plus gas, so + the liquid and solid fuels of COICOP 04.5 have no column of their own and stay inside the + housing remainder at the diary's level (about GBP 5bn on the donor, with the split's residue); + the receipt records their published spend beside it (ONS 04.5.3 and 04.5.4, GBP 1.547bn for + 2024). +- **Totals.** Consumption across the twelve divisions moves from GBP 979.0bn to GBP 971.4bn + (-0.8%). Electricity is GBP 29.5bn and gas GBP 19.2bn at calendar-2024 prices, with 84.6% of + households connected to gas. The litres audit's total ratio, frame over the cars benchmark, is + 0.951. + +### Calendar 2024 for every spend column + +policyengine-uk projects every column from the H5's year, 2024, with calendar-year growth, and the +calibration uprates the same values to the calendar-2025 window. Two levels were on FY2024-25: +energy and the bus yields. A6 moves them to calendar 2024: +- Energy uses QEP's calendar-2024 averages paid and the DESNZ volume over the four quarters of + 2024. Against the FY2024-25 basis, electricity moves +1.75% (GBP 29.02bn to 29.52bn) and gas + +1.58% (GBP 18.93bn to 19.23bn). +- Each area's bus yield is re-priced by its fares index. London's fares were flat through + 2024-25, so its factor is 1.000. England outside London is 0.965, because the fare cap rose in + January 2025. Scotland is 0.988 on its calendar-year index, and Northern Ireland 0.982 on + England's. Bus fares move -2.05% (GBP 4.19bn to 4.10bn). +- The diary columns and road fuel were already on calendar 2024 and don't move. + +Housing moves -0.5%: the drawn electricity and gas it nets rise with the donor's re-priced energy, +by more than the levelled energy it adds back. + +### Why the remainders are not chain targets + +The plan's first version drew `housing_water_excluding_domestic_energy` and +`transport_excluding_road_fuel` as chain targets. On the same spine that took transport to +GBP 218.6bn and consumption to GBP 1,012.7bn (+3.4%). Drawn in-sample on the donor, the transport +remainder came out 13.0% and 10.0% above the donor total at seeds 0 and 1: the positive mean rose +from GBP 4,299 to 4,830 and 4,607. The parent came out 1.0% and 5.2% above. The QRF over-draws the +vehicle-purchase tail, which dominates the remainder once fuel is gone, and the spine's richer +households amplify it. The step therefore keeps each total's own draw and subtracts the chain's +draws of its parts, which the chain draws after, and conditional on, the total. + +## Not run + +- The national remeasure (R1) runs once Group B lands, on whatever policyengine-uk Microcosm locks + then. If the VAT, fuel-duty and energy engine fixes are released by then, the lock moves first in + its own PR. +- The charter-H2 graph parity fixture is regenerated at the final head, after Group B's feed + re-pin, which moves it again. From 2232d911767fdfced948a1c42e8ed0f54b4b2aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 9 Oct 2026 12:57:58 +0100 Subject: [PATCH 10/18] Re-pin the UK Chronicle feed to 1ee7dfe (PolicyEngine/chronicle#322 via #323) (#1113) The artifact is chronicle main at the #323 merge: 352,549 rows (825406f's 344,402 plus 8,147), consumer_fact.v4 with an unchanged schema. It brings ONS Consumer Trends by COICOP division and class, with the national and domestic totals, and DESNZ road transport fuel consumption by vehicle type and fuel. - No existing value moved. Every 825406f row is byte-identical except the seven Consumer Trends series already in the feed. #323 restates their 217 rows on ONS's domestic concept (territory role; price-basis, seasonal-adjustment, unit, sheet and concept dimensions), under new keys with the same values. - The national and local reference files are byte-identical. The electricity, gas and road-fuel targets resolve to the same values through the new keys, which is all the national membership records beside the feed label. - The three compile-parity receipts are unchanged. - The vendored resources carry the same rows under the new feed identity. The Consumer Trends resource names the domestic concept, and the road-fuel target's note says why no national bridge applies: ONS splits the tourism adjustment by no class. - The charter-H2 fixture moves at the branch head, after the stage changes that follow. Co-Authored-By: Claude Opus 5.5 --- ...uk-chronicle-feed-repin-1ee7dfe.changed.md | 1 + docs/uk-chronicle-feed-repin.md | 13 + ...e_employer_pension_contribution_rates.json | 8 +- .../microcosm/build/uk/chronicle_feed.json | 8 +- .../build/uk/desnz_domestic_energy_facts.json | 8 +- .../build/uk/devolved_bus_finance.json | 8 +- .../microcosm/build/uk/dft_bus_journeys.json | 8 +- .../build/uk/dft_bus_value_anchors.json | 8 +- .../build/uk/hmrc_cgt_asset_type_facts.json | 8 +- .../build/uk/hmrc_cgt_conditioning_facts.json | 8 +- .../uk/hmrc_child_benefit_statistics.json | 8 +- .../build/uk/hmrc_itl_taxpayer_counts.json | 8 +- .../uk/ledger_fact_vendor_selections.json | 2 +- .../build/uk/licensed_cars_fuel_type.json | 8 +- .../uk/local_target_reference_membership.json | 2 +- .../build/uk/local_validation_levels.json | 6 +- .../microcosm/build/uk/need_energy_facts.json | 8 +- .../build/uk/nts_bus_use_frequency.json | 8 +- .../build/uk/nts_car_availability.json | 8 +- .../microcosm/build/uk/nts_trip_rates.json | 8 +- .../build/uk/ofgem_price_cap_facts.json | 8 +- .../uk/ons_household_expenditure_facts.json | 724 +++++++++++------- .../uk/ons_single_year_age_populations.json | 8 +- .../microcosm/build/uk/orr_rail_facts.json | 8 +- .../microcosm/build/uk/qep_energy_prices.json | 8 +- .../uk/release_input_coverage_manifest.json | 2 +- .../microcosm/build/uk/road_fuel_anchors.json | 8 +- .../build/uk/target_reference_membership.json | 8 +- .../build/uk/uk_local_target_census.json | 104 +-- .../build/uk/uk_population_targets.json | 2 +- .../engine_free/uk/test_uk_chronicle_feed.py | 8 +- .../engine_free/uk/test_uk_full_targets.py | 13 +- 32 files changed, 635 insertions(+), 410 deletions(-) create mode 100644 changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md diff --git a/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md b/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md new file mode 100644 index 0000000000..3ca7a5b9a0 --- /dev/null +++ b/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md @@ -0,0 +1 @@ +Re-pin the UK Chronicle feed to 1ee7dfe (PolicyEngine/chronicle#322 via #323). The feed now carries ONS Consumer Trends household final consumption expenditure by COICOP division and class, with the national and domestic totals (annual for 2020 to 2025, quarterly to 2026 Q1), and DESNZ road transport fuel consumption by vehicle type and fuel for 2005 to 2024 (352,549 rows). No compiled target value moved on either surface. The seven Consumer Trends series already in the feed come back on ONS's domestic concept under new keys with the same values, so the electricity, gas and road-fuel targets resolve to the same values; the vendored resources and the membership reports restate the feed identity, and the three compile-parity receipts are unchanged (microcosm#1113). diff --git a/docs/uk-chronicle-feed-repin.md b/docs/uk-chronicle-feed-repin.md index ce7ca146f7..f9a115304d 100644 --- a/docs/uk-chronicle-feed-repin.md +++ b/docs/uk-chronicle-feed-repin.md @@ -121,3 +121,16 @@ match two facts each (the new 2023-24 Table 6.2 rows beside the bound 2024-25 on resolve to the 2024-25 fact. For the same reason the 2023 production compile-parity receipt gains five ledger-only rows (the relief targets now compile at that comparison period from the 2023-24 facts); the two 2025 incumbent receipts are unchanged. +The `1ee7dfe` re-pin (microcosm#1113, PolicyEngine/chronicle#322 via #323, on top of `825406f`) +brought ONS Consumer Trends household final consumption expenditure, annual for 2020 to 2025 and +quarterly to 2026 Q1: the national and domestic totals, the twelve domestic COICOP divisions and net +tourism (sheet 0CN), their classes (sheets 01CN to 12CN) and the tourism detail (TOURCN). It also +brought DESNZ road transport energy consumption by vehicle type and fuel for 2005 to 2024, for the +UK, Great Britain, the four countries and the English regions (352,549 rows). #323 also restates the +seven Consumer Trends series already in the feed as domestic household spending: the 217 rows keep +their concepts and values under new keys, with the territory role and the price-basis, +seasonal-adjustment, unit, sheet and concept dimensions. Every other `825406f` row is +byte-identical. The national and local reference files are byte-identical; the electricity, gas and +road-fuel targets resolve to the same values through the new keys. The vendored resources carry the +same rows under the new feed identity, the Consumer Trends resource's 42 under their new keys, and +the three compile-parity receipts are unchanged. diff --git a/packages/microcosm-build/src/microcosm/build/uk/ashe_employer_pension_contribution_rates.json b/packages/microcosm-build/src/microcosm/build/uk/ashe_employer_pension_contribution_rates.json index f55f3b9924..f71f97368c 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ashe_employer_pension_contribution_rates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ashe_employer_pension_contribution_rates.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json b/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json index 35eb3534bc..be99cfd45a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json +++ b/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json @@ -3,14 +3,14 @@ "country": "uk", "scope": "uk_calibration", "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", "consumer_fact_schema_versions": [ "chronicle.consumer_fact.v4" ], "consumer_fact_schema_sha256": "cc9efb90e9c73913bc76a89e9df435a9ca6ff49942e63dc8d2bf183c65a70224", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" } diff --git a/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json b/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json index 339bfd57ab..85cbb669e2 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json b/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json index 9c3c19daeb..2b2960718e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json +++ b/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json index 7834ff9036..226fcfacf0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json +++ b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json index c1cdf4bab5..95b4882d7d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json +++ b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json index 11ccf828a8..1001193c0a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json index 4960f88b2c..bfe6d9e4ef 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json @@ -16,12 +16,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_child_benefit_statistics.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_child_benefit_statistics.json index febc0be20d..61d9a092ff 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_child_benefit_statistics.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_child_benefit_statistics.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json index 140b029545..d15b7674a6 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json index bec0992dba..a82c17f8c4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json @@ -376,7 +376,7 @@ }, { "resource": "ons_household_expenditure_facts.json", - "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", + "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, on the domestic concept (spending on UK territory; PolicyEngine/chronicle#322), for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", "consumers": [ "uk_runtime.lcfs_consumption" ], diff --git a/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json b/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json index 35a3a4a7ee..9e712f8c2d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json +++ b/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json index b98ccb7d43..4689d3e3aa 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json @@ -1,5 +1,5 @@ { - "source_fact_feed": "chronicle-uk-825406f9-consumer-facts", + "source_fact_feed": "chronicle-uk-1ee7dfe2-consumer-facts", "target_period": 2025, "candidate_count": 22464, "contract_target_count": 51, diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json b/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json index 001d6d51fb..43e4e41a9a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json @@ -5,10 +5,10 @@ "source_feed": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256" + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd" }, "rows": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json b/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json index 5522cdad2c..2075325641 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json b/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json index 2eeea01de6..2f5a6078bd 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json +++ b/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json @@ -16,12 +16,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json b/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json index 4c2e36e88a..870e403587 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json +++ b/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json b/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json index 2e889832ef..cb9316f5d3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json b/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json index d7ca8d89b0..fef8902590 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json index b4cd04d09a..4d3f28899d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json @@ -3,7 +3,7 @@ "country": "uk", "kind": "uk_vendored_ledger_facts", "resource": "ons_household_expenditure_facts.json", - "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", + "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, on the domestic concept (spending on UK territory; PolicyEngine/chronicle#322), for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", "consumers": [ "uk_runtime.lcfs_consumption" ], @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { @@ -46,8 +46,8 @@ "row_count": 42, "rows": [ { - "aggregate_fact_key": "ledger_aggregate_fact_v2_1f5c87a2ff4e2a26bb4dbdf0", - "semantic_fact_key": "ledger_semantic_fact_v2_74832087b071610e1054f510", + "aggregate_fact_key": "ledger_aggregate_fact_v2_757e464b14a1c434720c155f", + "semantic_fact_key": "ledger_semantic_fact_v2_e7a50fe26f35ce62d4b243c9", "source_record_id": "ons.consumer_trends.04cn_04_5_1.cy2020.coicop_04_5_1.expenditure", "concept": "ons.household_expenditure.electricity", "measure_id": "expenditure", @@ -55,7 +55,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -79,21 +79,26 @@ }, "dimensions": { "coicop": "04.5.1", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 18805000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_6844ff63ead23908eb1a679e", - "semantic_fact_key": "ledger_semantic_fact_v2_342d8fa55b194fd0638573dd", + "aggregate_fact_key": "ledger_aggregate_fact_v2_b1c4a44cee50e6a99a7a044c", + "semantic_fact_key": "ledger_semantic_fact_v2_23563e995e1641ea91b80efc", "source_record_id": "ons.consumer_trends.04cn_04_5_1.cy2021.coicop_04_5_1.expenditure", "concept": "ons.household_expenditure.electricity", "measure_id": "expenditure", @@ -101,7 +106,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -125,21 +130,26 @@ }, "dimensions": { "coicop": "04.5.1", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 20550000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_472b83dd42081d7c6bd4ca3e", - "semantic_fact_key": "ledger_semantic_fact_v2_15d18e881ad6da11c7adb3c5", + "aggregate_fact_key": "ledger_aggregate_fact_v2_e2685d017e4c31bb21ce6aac", + "semantic_fact_key": "ledger_semantic_fact_v2_b2ad70860c88c877990d1812", "source_record_id": "ons.consumer_trends.04cn_04_5_1.cy2022.coicop_04_5_1.expenditure", "concept": "ons.household_expenditure.electricity", "measure_id": "expenditure", @@ -147,7 +157,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -171,21 +181,26 @@ }, "dimensions": { "coicop": "04.5.1", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 27770000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_f48570ad03900f6b233d2318", - "semantic_fact_key": "ledger_semantic_fact_v2_dd5086f4c6880d7cac608fd8", + "aggregate_fact_key": "ledger_aggregate_fact_v2_4b05f105923ba1719c248498", + "semantic_fact_key": "ledger_semantic_fact_v2_36cc0603b81fcae2a361ebea", "source_record_id": "ons.consumer_trends.04cn_04_5_1.cy2023.coicop_04_5_1.expenditure", "concept": "ons.household_expenditure.electricity", "measure_id": "expenditure", @@ -193,7 +208,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -217,21 +232,26 @@ }, "dimensions": { "coicop": "04.5.1", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 30589000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_c43f1f3db097958aae5d30e9", - "semantic_fact_key": "ledger_semantic_fact_v2_bfaffb39e2137d78d2bf1a30", + "aggregate_fact_key": "ledger_aggregate_fact_v2_a08fabead329bf8b06fb5c4e", + "semantic_fact_key": "ledger_semantic_fact_v2_3a367fa31eb41f7a54a3629d", "source_record_id": "ons.consumer_trends.04cn_04_5_1.cy2024.coicop_04_5_1.expenditure", "concept": "ons.household_expenditure.electricity", "measure_id": "expenditure", @@ -239,7 +259,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -263,21 +283,26 @@ }, "dimensions": { "coicop": "04.5.1", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 26099000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_69cd660b943ae8f21761f76a", - "semantic_fact_key": "ledger_semantic_fact_v2_700cde24dd20d48b8eea6f9a", + "aggregate_fact_key": "ledger_aggregate_fact_v2_643fd0413421fbcff9ea2bb5", + "semantic_fact_key": "ledger_semantic_fact_v2_394f2c58a2fb6fc6347c5a5e", "source_record_id": "ons.consumer_trends.04cn_04_5_1.cy2025.coicop_04_5_1.expenditure", "concept": "ons.household_expenditure.electricity", "measure_id": "expenditure", @@ -285,7 +310,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -309,21 +334,26 @@ }, "dimensions": { "coicop": "04.5.1", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 26522000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_3cd88a21220794f9b66e2186", - "semantic_fact_key": "ledger_semantic_fact_v2_69ab36c8d0410c47801330e7", + "aggregate_fact_key": "ledger_aggregate_fact_v2_32647c12f2c1161ff5203033", + "semantic_fact_key": "ledger_semantic_fact_v2_078f45770bf839c60975b947", "source_record_id": "ons.consumer_trends.04cn.cy2020.coicop_04_5.expenditure", "concept": "ons.household_expenditure.electricity_gas_other_fuels", "measure_id": "expenditure", @@ -331,7 +361,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -355,21 +385,26 @@ }, "dimensions": { "coicop": "04.5", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 31805000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_00d155a3964927da87c5424a", - "semantic_fact_key": "ledger_semantic_fact_v2_f9e2ed660c7bf05bcbc24719", + "aggregate_fact_key": "ledger_aggregate_fact_v2_e2cb337c3dfe75524cee2553", + "semantic_fact_key": "ledger_semantic_fact_v2_695f33bd9aea33e02703e53d", "source_record_id": "ons.consumer_trends.04cn.cy2021.coicop_04_5.expenditure", "concept": "ons.household_expenditure.electricity_gas_other_fuels", "measure_id": "expenditure", @@ -377,7 +412,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -401,21 +436,26 @@ }, "dimensions": { "coicop": "04.5", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 34437000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_45a1dcd4688e4b1af441dec8", - "semantic_fact_key": "ledger_semantic_fact_v2_db656012dccfacaea215be01", + "aggregate_fact_key": "ledger_aggregate_fact_v2_5e18c23bee8020b2c82de1b0", + "semantic_fact_key": "ledger_semantic_fact_v2_8112da34428e09fcf2b80d7b", "source_record_id": "ons.consumer_trends.04cn.cy2022.coicop_04_5.expenditure", "concept": "ons.household_expenditure.electricity_gas_other_fuels", "measure_id": "expenditure", @@ -423,7 +463,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -447,21 +487,26 @@ }, "dimensions": { "coicop": "04.5", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 49403000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_373356553e5ac91d15c27eb4", - "semantic_fact_key": "ledger_semantic_fact_v2_21f4d1c7024d0cd2312f7a61", + "aggregate_fact_key": "ledger_aggregate_fact_v2_9cde7ccefd77be924921b6bb", + "semantic_fact_key": "ledger_semantic_fact_v2_0cb1a7ea4c71d4792d40a81f", "source_record_id": "ons.consumer_trends.04cn.cy2023.coicop_04_5.expenditure", "concept": "ons.household_expenditure.electricity_gas_other_fuels", "measure_id": "expenditure", @@ -469,7 +514,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -493,21 +538,26 @@ }, "dimensions": { "coicop": "04.5", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 52505000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_c02320ecb93dfd12bd18bb07", - "semantic_fact_key": "ledger_semantic_fact_v2_e44470dd8eef345c701a1879", + "aggregate_fact_key": "ledger_aggregate_fact_v2_447c0e2734a87cc178535e7b", + "semantic_fact_key": "ledger_semantic_fact_v2_7ad2ee8a8483229d31211fa5", "source_record_id": "ons.consumer_trends.04cn.cy2024.coicop_04_5.expenditure", "concept": "ons.household_expenditure.electricity_gas_other_fuels", "measure_id": "expenditure", @@ -515,7 +565,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -539,21 +589,26 @@ }, "dimensions": { "coicop": "04.5", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 42288000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_a139145f4db5fea0260908f8", - "semantic_fact_key": "ledger_semantic_fact_v2_19164e8ab903fc254989a703", + "aggregate_fact_key": "ledger_aggregate_fact_v2_a2963d508c2dfd729030e2be", + "semantic_fact_key": "ledger_semantic_fact_v2_49f9a92169bbce7a467e9471", "source_record_id": "ons.consumer_trends.04cn.cy2025.coicop_04_5.expenditure", "concept": "ons.household_expenditure.electricity_gas_other_fuels", "measure_id": "expenditure", @@ -561,7 +616,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -585,21 +640,26 @@ }, "dimensions": { "coicop": "04.5", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 43427000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_80d8c8c00f5ad44d5ef5f57f", - "semantic_fact_key": "ledger_semantic_fact_v2_59cbfe3fe753a66d36205007", + "aggregate_fact_key": "ledger_aggregate_fact_v2_e504779235b7b6f64b0b9a11", + "semantic_fact_key": "ledger_semantic_fact_v2_372753cd716c93e8e33f05f3", "source_record_id": "ons.consumer_trends.04cn_04_5_2.cy2020.coicop_04_5_2.expenditure", "concept": "ons.household_expenditure.gas", "measure_id": "expenditure", @@ -607,7 +667,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -631,21 +691,26 @@ }, "dimensions": { "coicop": "04.5.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 11767000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_90b2a4339c28fcd06c3eb610", - "semantic_fact_key": "ledger_semantic_fact_v2_9f15f6f7686c91a82b34b98a", + "aggregate_fact_key": "ledger_aggregate_fact_v2_47e26d3fd67b3b979d518f39", + "semantic_fact_key": "ledger_semantic_fact_v2_0c3a558c64187053c41a985f", "source_record_id": "ons.consumer_trends.04cn_04_5_2.cy2021.coicop_04_5_2.expenditure", "concept": "ons.household_expenditure.gas", "measure_id": "expenditure", @@ -653,7 +718,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -677,21 +742,26 @@ }, "dimensions": { "coicop": "04.5.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 12218000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_b4586d36f1c41fd00bc45eca", - "semantic_fact_key": "ledger_semantic_fact_v2_b5d13d1a5abc603f4abe1ac1", + "aggregate_fact_key": "ledger_aggregate_fact_v2_2370e5dea8fc0b4179c685ac", + "semantic_fact_key": "ledger_semantic_fact_v2_de44ebfeae661f5f466be743", "source_record_id": "ons.consumer_trends.04cn_04_5_2.cy2022.coicop_04_5_2.expenditure", "concept": "ons.household_expenditure.gas", "measure_id": "expenditure", @@ -699,7 +769,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -723,21 +793,26 @@ }, "dimensions": { "coicop": "04.5.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 19459000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_42d282ed49276224a395c6b4", - "semantic_fact_key": "ledger_semantic_fact_v2_30df43865853127c68f29180", + "aggregate_fact_key": "ledger_aggregate_fact_v2_8dced1a5ac41962dc6ab396c", + "semantic_fact_key": "ledger_semantic_fact_v2_4ab12ad7c3894d8a05086dad", "source_record_id": "ons.consumer_trends.04cn_04_5_2.cy2023.coicop_04_5_2.expenditure", "concept": "ons.household_expenditure.gas", "measure_id": "expenditure", @@ -745,7 +820,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -769,21 +844,26 @@ }, "dimensions": { "coicop": "04.5.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 20085000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_ad2a7e6ede6fa0467d0befd1", - "semantic_fact_key": "ledger_semantic_fact_v2_1ed03d7cf44e7187700058a9", + "aggregate_fact_key": "ledger_aggregate_fact_v2_40f17c830f5d71927e9adf5d", + "semantic_fact_key": "ledger_semantic_fact_v2_fc24615029b337f867506c55", "source_record_id": "ons.consumer_trends.04cn_04_5_2.cy2024.coicop_04_5_2.expenditure", "concept": "ons.household_expenditure.gas", "measure_id": "expenditure", @@ -791,7 +871,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -815,21 +895,26 @@ }, "dimensions": { "coicop": "04.5.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 14642000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_b56be49c552300f6c02fc559", - "semantic_fact_key": "ledger_semantic_fact_v2_87a442261dcb9799a39da32c", + "aggregate_fact_key": "ledger_aggregate_fact_v2_03c5f13d5fbab023177a1aea", + "semantic_fact_key": "ledger_semantic_fact_v2_948fbb40165d556eff8b2990", "source_record_id": "ons.consumer_trends.04cn_04_5_2.cy2025.coicop_04_5_2.expenditure", "concept": "ons.household_expenditure.gas", "measure_id": "expenditure", @@ -837,7 +922,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -861,21 +946,26 @@ }, "dimensions": { "coicop": "04.5.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 15339000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_35756dd19a9cbdcbec5b4ef6", - "semantic_fact_key": "ledger_semantic_fact_v2_15478ab021234b67a7896e66", + "aggregate_fact_key": "ledger_aggregate_fact_v2_0ccea060f68d08a99df9a046", + "semantic_fact_key": "ledger_semantic_fact_v2_4e9602b387ebec3cf923a31e", "source_record_id": "ons.consumer_trends.04cn_04_5_3.cy2020.coicop_04_5_3.expenditure", "concept": "ons.household_expenditure.liquid_fuels", "measure_id": "expenditure", @@ -883,7 +973,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -907,21 +997,26 @@ }, "dimensions": { "coicop": "04.5.3", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 868000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_09d99aa1fcd423640a96eab1", - "semantic_fact_key": "ledger_semantic_fact_v2_9f89890a44969a8215eab45c", + "aggregate_fact_key": "ledger_aggregate_fact_v2_7bfeff7f3d7cbb51ac4cc27f", + "semantic_fact_key": "ledger_semantic_fact_v2_d3fd432d67dfc0aa975ef3b0", "source_record_id": "ons.consumer_trends.04cn_04_5_3.cy2021.coicop_04_5_3.expenditure", "concept": "ons.household_expenditure.liquid_fuels", "measure_id": "expenditure", @@ -929,7 +1024,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -953,21 +1048,26 @@ }, "dimensions": { "coicop": "04.5.3", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 1186000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_19ca82251de1da6360377155", - "semantic_fact_key": "ledger_semantic_fact_v2_79f05dd17d43073e448f0c7b", + "aggregate_fact_key": "ledger_aggregate_fact_v2_efa5e26236915527baa5fb6a", + "semantic_fact_key": "ledger_semantic_fact_v2_974e4fd64dac47e2f64ce8ef", "source_record_id": "ons.consumer_trends.04cn_04_5_3.cy2022.coicop_04_5_3.expenditure", "concept": "ons.household_expenditure.liquid_fuels", "measure_id": "expenditure", @@ -975,7 +1075,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -999,21 +1099,26 @@ }, "dimensions": { "coicop": "04.5.3", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 1624000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_911006ee74d1fffc11a33f14", - "semantic_fact_key": "ledger_semantic_fact_v2_635db100b309ca126437fb90", + "aggregate_fact_key": "ledger_aggregate_fact_v2_3c997a0aa817f78bb9a3e551", + "semantic_fact_key": "ledger_semantic_fact_v2_6b9a8fb62f53c04efc9ed6a6", "source_record_id": "ons.consumer_trends.04cn_04_5_3.cy2023.coicop_04_5_3.expenditure", "concept": "ons.household_expenditure.liquid_fuels", "measure_id": "expenditure", @@ -1021,7 +1126,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1045,21 +1150,26 @@ }, "dimensions": { "coicop": "04.5.3", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 1302000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_7e9465990ec94df2885c8ab9", - "semantic_fact_key": "ledger_semantic_fact_v2_03df42c0c67fa58fd79be1cd", + "aggregate_fact_key": "ledger_aggregate_fact_v2_def858f5909802e76a3bd816", + "semantic_fact_key": "ledger_semantic_fact_v2_ac0d85b006807bc73d65b477", "source_record_id": "ons.consumer_trends.04cn_04_5_3.cy2024.coicop_04_5_3.expenditure", "concept": "ons.household_expenditure.liquid_fuels", "measure_id": "expenditure", @@ -1067,7 +1177,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1091,21 +1201,26 @@ }, "dimensions": { "coicop": "04.5.3", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 1195000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_ffb74c1e4d7fc4055e14600a", - "semantic_fact_key": "ledger_semantic_fact_v2_ebb76a139222d222feef7543", + "aggregate_fact_key": "ledger_aggregate_fact_v2_931ecb3b4370f97af488624e", + "semantic_fact_key": "ledger_semantic_fact_v2_eacfe3015761faf8330b4d2d", "source_record_id": "ons.consumer_trends.04cn_04_5_3.cy2025.coicop_04_5_3.expenditure", "concept": "ons.household_expenditure.liquid_fuels", "measure_id": "expenditure", @@ -1113,7 +1228,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1137,21 +1252,26 @@ }, "dimensions": { "coicop": "04.5.3", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 1254000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_22f12b595a38d5c76b706e64", - "semantic_fact_key": "ledger_semantic_fact_v2_457efbb72200c875fc717ccb", + "aggregate_fact_key": "ledger_aggregate_fact_v2_d80377763eab7b280fbe50de", + "semantic_fact_key": "ledger_semantic_fact_v2_2ece6f9e40a4520992e73fea", "source_record_id": "ons.consumer_trends.07cn_07_2_2.cy2020.coicop_07_2_2.expenditure", "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", "measure_id": "expenditure", @@ -1159,7 +1279,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1183,21 +1303,26 @@ }, "dimensions": { "coicop": "07.2.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 23650000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_f89c1149b40887c248083737", - "semantic_fact_key": "ledger_semantic_fact_v2_39a2389150f9ee33c003967a", + "aggregate_fact_key": "ledger_aggregate_fact_v2_4b7c894cc2dd4843ed56e9df", + "semantic_fact_key": "ledger_semantic_fact_v2_020eab7b7f41ded9a27521f4", "source_record_id": "ons.consumer_trends.07cn_07_2_2.cy2021.coicop_07_2_2.expenditure", "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", "measure_id": "expenditure", @@ -1205,7 +1330,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1229,21 +1354,26 @@ }, "dimensions": { "coicop": "07.2.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 31684000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_76497f62baedb20f24935f0d", - "semantic_fact_key": "ledger_semantic_fact_v2_42eb52d1c607395c11b54801", + "aggregate_fact_key": "ledger_aggregate_fact_v2_90e61da4c97487740653f2f1", + "semantic_fact_key": "ledger_semantic_fact_v2_1e714f4857046e33b0762b79", "source_record_id": "ons.consumer_trends.07cn_07_2_2.cy2022.coicop_07_2_2.expenditure", "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", "measure_id": "expenditure", @@ -1251,7 +1381,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1275,21 +1405,26 @@ }, "dimensions": { "coicop": "07.2.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 42154000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_74431c9bd6815c5351745e5c", - "semantic_fact_key": "ledger_semantic_fact_v2_718d62d2f741137d8391c48a", + "aggregate_fact_key": "ledger_aggregate_fact_v2_4621528f192e3238a2f5b53f", + "semantic_fact_key": "ledger_semantic_fact_v2_6e144ac2588818eb11cf817d", "source_record_id": "ons.consumer_trends.07cn_07_2_2.cy2023.coicop_07_2_2.expenditure", "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", "measure_id": "expenditure", @@ -1297,7 +1432,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1321,21 +1456,26 @@ }, "dimensions": { "coicop": "07.2.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 38504000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_70cbae2800a99998514ca211", - "semantic_fact_key": "ledger_semantic_fact_v2_7ee16cb0e147fc07abc5af13", + "aggregate_fact_key": "ledger_aggregate_fact_v2_d5c11a14d2062955b622275a", + "semantic_fact_key": "ledger_semantic_fact_v2_52a387587b484beecf404fd5", "source_record_id": "ons.consumer_trends.07cn_07_2_2.cy2024.coicop_07_2_2.expenditure", "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", "measure_id": "expenditure", @@ -1343,7 +1483,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1367,21 +1507,26 @@ }, "dimensions": { "coicop": "07.2.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 37025000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_5f09d8c219289c6331c51da6", - "semantic_fact_key": "ledger_semantic_fact_v2_f7b73574b7f8043be4a9e029", + "aggregate_fact_key": "ledger_aggregate_fact_v2_98696a3d0a85269f7b2445ff", + "semantic_fact_key": "ledger_semantic_fact_v2_b37136996871ae4581a3d8da", "source_record_id": "ons.consumer_trends.07cn_07_2_2.cy2025.coicop_07_2_2.expenditure", "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", "measure_id": "expenditure", @@ -1389,7 +1534,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1413,21 +1558,26 @@ }, "dimensions": { "coicop": "07.2.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 35099000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_6a07671fe15ee44be43f9485", - "semantic_fact_key": "ledger_semantic_fact_v2_70cf2f5eace47e8536ec747b", + "aggregate_fact_key": "ledger_aggregate_fact_v2_dc106e0ebfeb201ba1cb2474", + "semantic_fact_key": "ledger_semantic_fact_v2_354b1286ee41dbcc6bc7786b", "source_record_id": "ons.consumer_trends.07cn_07_3_2.cy2020.coicop_07_3_2.expenditure", "concept": "ons.household_expenditure.road_transport_services", "measure_id": "expenditure", @@ -1435,7 +1585,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1459,21 +1609,26 @@ }, "dimensions": { "coicop": "07.3.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 5042000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_5f27204b555a1b49249f6523", - "semantic_fact_key": "ledger_semantic_fact_v2_82e867dffc14d333d7d6df70", + "aggregate_fact_key": "ledger_aggregate_fact_v2_e03a2b5cb6f91f0db018d2fb", + "semantic_fact_key": "ledger_semantic_fact_v2_56fda94971b8facd80ea42f8", "source_record_id": "ons.consumer_trends.07cn_07_3_2.cy2021.coicop_07_3_2.expenditure", "concept": "ons.household_expenditure.road_transport_services", "measure_id": "expenditure", @@ -1481,7 +1636,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1505,21 +1660,26 @@ }, "dimensions": { "coicop": "07.3.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 5629000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_efbc618e51efbb1e0911be4d", - "semantic_fact_key": "ledger_semantic_fact_v2_c08698481263e03a03c9ec0d", + "aggregate_fact_key": "ledger_aggregate_fact_v2_4f3f49d8ecbeddd01fa4c4aa", + "semantic_fact_key": "ledger_semantic_fact_v2_5a3c2f8cc65ead94ad6b8b78", "source_record_id": "ons.consumer_trends.07cn_07_3_2.cy2022.coicop_07_3_2.expenditure", "concept": "ons.household_expenditure.road_transport_services", "measure_id": "expenditure", @@ -1527,7 +1687,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1551,21 +1711,26 @@ }, "dimensions": { "coicop": "07.3.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 6928000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_66f4aea3e385952c4d63c4b9", - "semantic_fact_key": "ledger_semantic_fact_v2_b5c8c12172549bce45edb088", + "aggregate_fact_key": "ledger_aggregate_fact_v2_d7bad25eb585c8812ae87d42", + "semantic_fact_key": "ledger_semantic_fact_v2_1c59b9ce02e8dae1d57327f0", "source_record_id": "ons.consumer_trends.07cn_07_3_2.cy2023.coicop_07_3_2.expenditure", "concept": "ons.household_expenditure.road_transport_services", "measure_id": "expenditure", @@ -1573,7 +1738,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1597,21 +1762,26 @@ }, "dimensions": { "coicop": "07.3.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 6851000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_ccaddb1fba83105aac821ecc", - "semantic_fact_key": "ledger_semantic_fact_v2_be085b83df878a24a170f971", + "aggregate_fact_key": "ledger_aggregate_fact_v2_34d3ea7cd0e9a930fcf04d6d", + "semantic_fact_key": "ledger_semantic_fact_v2_5f8a7c32ec1a91344a346903", "source_record_id": "ons.consumer_trends.07cn_07_3_2.cy2024.coicop_07_3_2.expenditure", "concept": "ons.household_expenditure.road_transport_services", "measure_id": "expenditure", @@ -1619,7 +1789,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1643,21 +1813,26 @@ }, "dimensions": { "coicop": "07.3.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 8000000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_4bb51039d900197468abc60e", - "semantic_fact_key": "ledger_semantic_fact_v2_2a1ae3a8aa83c0f99609c9ac", + "aggregate_fact_key": "ledger_aggregate_fact_v2_5e2a3124654c1293cd8c0e30", + "semantic_fact_key": "ledger_semantic_fact_v2_72c298dbb8c9e4116ac54584", "source_record_id": "ons.consumer_trends.07cn_07_3_2.cy2025.coicop_07_3_2.expenditure", "concept": "ons.household_expenditure.road_transport_services", "measure_id": "expenditure", @@ -1665,7 +1840,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1689,21 +1864,26 @@ }, "dimensions": { "coicop": "07.3.2", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "07CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 8603000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_c3d9b65fd6c56a2f50fdd523", - "semantic_fact_key": "ledger_semantic_fact_v2_f1dd1780e47e687f741e3fde", + "aggregate_fact_key": "ledger_aggregate_fact_v2_0c7d5bd0f03a0a0d5e71173e", + "semantic_fact_key": "ledger_semantic_fact_v2_569b0881de5a757c5f0effb4", "source_record_id": "ons.consumer_trends.04cn_04_5_4.cy2020.coicop_04_5_4.expenditure", "concept": "ons.household_expenditure.solid_fuels", "measure_id": "expenditure", @@ -1711,7 +1891,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1735,21 +1915,26 @@ }, "dimensions": { "coicop": "04.5.4", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 365000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_eca97be976dfb34df564a46d", - "semantic_fact_key": "ledger_semantic_fact_v2_a0984f222d48a5e1d7a4f6f4", + "aggregate_fact_key": "ledger_aggregate_fact_v2_671d3a9fc0911d443d7f6961", + "semantic_fact_key": "ledger_semantic_fact_v2_2947afe6f603730a6cc3ea07", "source_record_id": "ons.consumer_trends.04cn_04_5_4.cy2021.coicop_04_5_4.expenditure", "concept": "ons.household_expenditure.solid_fuels", "measure_id": "expenditure", @@ -1757,7 +1942,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1781,21 +1966,26 @@ }, "dimensions": { "coicop": "04.5.4", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 483000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_26c813e8b7127757032dbf42", - "semantic_fact_key": "ledger_semantic_fact_v2_87d1a9cf7a0c471af8056492", + "aggregate_fact_key": "ledger_aggregate_fact_v2_d61d8af99838bf61b2c03bac", + "semantic_fact_key": "ledger_semantic_fact_v2_0f4cbd132d23844d6535a131", "source_record_id": "ons.consumer_trends.04cn_04_5_4.cy2022.coicop_04_5_4.expenditure", "concept": "ons.household_expenditure.solid_fuels", "measure_id": "expenditure", @@ -1803,7 +1993,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1827,21 +2017,26 @@ }, "dimensions": { "coicop": "04.5.4", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 550000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_a5b1a68c3627be7dcb229e35", - "semantic_fact_key": "ledger_semantic_fact_v2_835c9b79fb5b7d7a2882bff2", + "aggregate_fact_key": "ledger_aggregate_fact_v2_9e80f8ce6e17c9f155cf8a93", + "semantic_fact_key": "ledger_semantic_fact_v2_f69061289be48c35c134428d", "source_record_id": "ons.consumer_trends.04cn_04_5_4.cy2023.coicop_04_5_4.expenditure", "concept": "ons.household_expenditure.solid_fuels", "measure_id": "expenditure", @@ -1849,7 +2044,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1873,21 +2068,26 @@ }, "dimensions": { "coicop": "04.5.4", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 529000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_2ca1a9dd480fd040d4475a96", - "semantic_fact_key": "ledger_semantic_fact_v2_a2dbfe5906881110cfd1825c", + "aggregate_fact_key": "ledger_aggregate_fact_v2_e16a5c15d553955ec50ae5a8", + "semantic_fact_key": "ledger_semantic_fact_v2_a43402e366adb17edc33c7dd", "source_record_id": "ons.consumer_trends.04cn_04_5_4.cy2024.coicop_04_5_4.expenditure", "concept": "ons.household_expenditure.solid_fuels", "measure_id": "expenditure", @@ -1895,7 +2095,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1919,21 +2119,26 @@ }, "dimensions": { "coicop": "04.5.4", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 352000000 }, { - "aggregate_fact_key": "ledger_aggregate_fact_v2_3003b60e6155651063ef666b", - "semantic_fact_key": "ledger_semantic_fact_v2_2295cdc0c882e9e04a730f53", + "aggregate_fact_key": "ledger_aggregate_fact_v2_bc599354d39c6c27cf134f33", + "semantic_fact_key": "ledger_semantic_fact_v2_ec6e4441226ad0dd0d777e10", "source_record_id": "ons.consumer_trends.04cn_04_5_4.cy2025.coicop_04_5_4.expenditure", "concept": "ons.household_expenditure.solid_fuels", "measure_id": "expenditure", @@ -1941,7 +2146,7 @@ "aggregation": "sum", "entity": { "name": "household", - "role": "resident_households" + "role": "households_on_uk_territory" }, "geography": { "id": "K02000001", @@ -1965,14 +2170,19 @@ }, "dimensions": { "coicop": "04.5.4", - "frequency": "annual" + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" }, "source": { "source_name": "ons", - "source_table": "Consumer Trends current price, not seasonally adjusted, sheets 04CN and 07CN", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", "source_file": "cpnsa.xlsx", "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", - "vintage": "current_2026_09_09", + "vintage": "2026_06_30_release_2026_q1", "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 312000000 diff --git a/packages/microcosm-build/src/microcosm/build/uk/ons_single_year_age_populations.json b/packages/microcosm-build/src/microcosm/build/uk/ons_single_year_age_populations.json index 249b30e8fa..03bf232bab 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ons_single_year_age_populations.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ons_single_year_age_populations.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json b/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json index f0db23e363..3aee200f90 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json b/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json index 07b7605233..eb2a6e44f1 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json +++ b/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index f6360a8ad2..405b6288e3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -633,7 +633,7 @@ "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", - "conditioning_resource_sha256": "067ba21c12aeb4e95e6a8a16141dbaa075e8787ed875a005f549cab6e91a6b56", + "conditioning_resource_sha256": "0d2044d9526ea8e836996115f38cdb8b5bd84c0f4962338974a6dfea09d3c1aa", "conditioning_surface": "2024-25", "hmrc_surface": "2024-25", "mapped_build_period": "2024" diff --git a/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json b/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json index fce139877d..3bc74c390b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json +++ b/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json index 80f94bcd54..351f313365 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json @@ -1,5 +1,5 @@ { - "source_fact_feed": "chronicle-uk-825406f9-consumer-facts", + "source_fact_feed": "chronicle-uk-1ee7dfe2-consumer-facts", "target_period": 2025, "candidate_count": 1255, "contract_target_count": 342, @@ -19323,7 +19323,7 @@ "resolved_period": 2025, "resolved_value": 26522000000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_69cd660b943ae8f21761f76a" + "resolved_fact_key": "ledger_aggregate_fact_v2_643fd0413421fbcff9ea2bb5" } ] }, @@ -19338,7 +19338,7 @@ "resolved_period": 2025, "resolved_value": 15339000000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b56be49c552300f6c02fc559" + "resolved_fact_key": "ledger_aggregate_fact_v2_03c5f13d5fbab023177a1aea" } ] }, @@ -19353,7 +19353,7 @@ "resolved_period": 2025, "resolved_value": 35099000000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5f09d8c219289c6331c51da6" + "resolved_fact_key": "ledger_aggregate_fact_v2_98696a3d0a85269f7b2445ff" } ] }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json b/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json index 135df6003f..cad134683c 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json @@ -565,11 +565,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "Unbanded area statistics in the pinned Ledger fact feed supply the local HMRC count targets directly and the amount targets via the signed count_x_mean construction. The feed publishes SPI target count/mean measures for 650/650 constituencies except self_employment_income_mean at E14001416 (so that one amount row is signed deferred), and for 359/361 crosswalk local authorities; E06000027 has only median SPI measures and E06000053 has no SPI local-authority target-measure rows. This remains a different surface from the 208 banded Total Income facts held fenced by the national adjudication.", @@ -588,11 +588,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the PCON24 constituency population age specs for all 650 constituencies across the ONS, NRS, and NISRA publisher legs. Mid-year estimates cover the total usual-resident population \u2014 see the population_universe_private_households adjudication.", @@ -611,11 +611,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries local-authority population age specs for all 361 crosswalk local authorities. Covers the total usual-resident population \u2014 see the population_universe_private_households adjudication.", @@ -635,11 +635,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the compiled household cells.", @@ -659,11 +659,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the compiled household cells; the source specification defines HouseholdCount as occupied households.", @@ -683,11 +683,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the compiled household cells.", @@ -707,11 +707,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries DWP Stat-Xplore UC household facts for 632/650 constituencies and 350/361 local authorities, plus the four constituency child-bucket specs. DWP UC official statistics in this feed cover Great Britain; the 18 Northern Ireland constituencies and 11 Northern Ireland local authorities are signed deferred. DWP counts UC claim households \u2014 see the uc_unit_vs_household_grain adjudication.", @@ -730,11 +730,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "Model-based estimates built from the Family Resources Survey \u2014 see the frs_model_based_target_circularity adjudication. The BHC and AHC measures are independently modelled and not directly comparable \u2014 see the ons_bhc_ahc_noncomparable adjudication. MSOA-to-local-authority aggregation is signed deferred for this run; England and Wales only.", @@ -756,11 +756,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries tenure specs for all 361 crosswalk local authorities across ONS Census 2021, NRS Census 2022, and NISRA Census 2021 publisher legs. Private-rent and social-rent tenure rows are additive over publisher-native subclasses and compile through the signed sum operation.", @@ -779,11 +779,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "PIPR publishes average rent price levels, not additive rent totals; a bound cell composes the level into a total (see the signed rationale). Of the 361 local-authority cells, 314 bind for the 2025 compile and 47 remain signed deferred: four English cells have no matching LA id, 32 Scottish cells are represented only at BRMA grain without a signed translation, and 11 Northern Ireland cells are absent.", @@ -804,11 +804,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned feed record-set specs uk.local_geography.council_tax.england_ctb.line_07_chargeable_dwellings_adjusted_for_disabled_relief.v1, line_11_second_homes.v1 and line_15_empty_dwellings.v1 supply the 296 English billing authorities by band A-, A-H at the October 2025 count. Each cell binds line 7 minus line 11 minus line 15 (band A adds line 7's A- column): the dwellings charged as someone's sole or main residence, the universe a household frame carries. Bands A-G bind 294 authorities after E06000053 and E09000001 are support-floor excluded; the 296-cell band H family stays signed deferred on spine support (microcosm#762 A14). Barnsley and Sheffield bind through the crosswalk's declared aliases of their April 2025 codes. The family is scoped to the 296 English authorities: Wales and Scotland bind their own returns below and Northern Ireland levies domestic rates.", @@ -827,11 +827,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned feed record-set specs uk.local_geography.council_tax.wales_ct1.a1_all_chargeable_dwellings.v1, h7_total_chargeable_empty_properties.v1 and h8_total_chargeable_second_homes.v1 supply the 22 Welsh authorities by band A-I per financial year. Each cell binds a1 minus h7 minus h8 on the 2025-26 row (the taxbase set for that year, counted on the 31 October 2024 list, one count-year behind England and Scotland by ruling of 2026-09-15); all 198 cells bind, band I included.", @@ -850,11 +850,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 344402, - "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", - "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned feed record-set spec uk.local_geography.council_tax_stock.scotland_ctaxbase_chargeable_dwellings.by_council_area.v1 supplies the 32 councils by band A-H, the concept the scotgov.council_tax_stock country rows already bind; 255 cells bind and Shetland band H is signed deferred (no band-H clone at K=15). Chargeable dwellings run about 1 % above the household frame nationally, the residual the universe fence records.", diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 9c665ef8aa..9f9049fc88 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -15121,7 +15121,7 @@ "policyengine": { "metric_name": "ons/household_road_fuel_expenditure", "value_expression": "petrol_spending + diesel_spending", - "notes": "ONS Consumer Trends COICOP 07.2.2 fuels and lubricants for personal transport equipment, current prices, calendar year, bound on the frame's petrol plus diesel spend (microcosm#1113). The publisher class also carries other motor fuels and lubricants, about 0.4 percent of it on the LCFS 2023-24 diary (c72213), which the measure does not. The lcfs_consumption stage levels petrol plus diesel to the calendar-2024 row less that share, so the design-weight gap to this calendar-2025 row is the engine's 2024-to-2025 uprating of the two columns against ONS's own growth. Household-scope road fuel replaces the OBR cars receipts as the bound fuel row: those are a fiscal-year duty total that includes business use of cars, which the frame reaches only through the engine's conversion of spend to litres, so they stay measured as a diagnostic (calibration_measure_exclusions.json)." + "notes": "ONS Consumer Trends COICOP 07.2.2 fuels and lubricants for personal transport equipment, current prices, calendar year, bound on the frame's petrol plus diesel spend (microcosm#1113). The publisher class also carries other motor fuels and lubricants, about 0.4 percent of it on the LCFS 2023-24 diary (c72213), which the measure does not. ONS publishes the class on the domestic concept (spending on UK territory, non-residents included; PolicyEngine/chronicle#322), and Consumer Trends splits the tourism adjustment by no class, so no national bridge is applied. The lcfs_consumption stage levels petrol plus diesel to the calendar-2024 row less that share, so the design-weight gap to this calendar-2025 row is the engine's 2024-to-2025 uprating of the two columns against ONS's own growth. Household-scope road fuel replaces the OBR cars receipts as the bound fuel row: those are a fiscal-year duty total that includes business use of cars, which the frame reaches only through the engine's conversion of spend to litres, so they stay measured as a diagnostic (calibration_measure_exclusions.json)." }, "axiom": { "metric_name": "ons/household_road_fuel_expenditure", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py index b4fd40ddcf..35c4067791 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py @@ -15,14 +15,14 @@ def test_national_feed_records_the_complete_merged_source_artifact(): pin = load_uk_chronicle_feed() resource = files("microcosm.build.uk").joinpath("chronicle_feed.json") raw = resource.read_bytes() - assert pin.source_commit == "825406f98913ab7324c834c3642804e9317a2256" + assert pin.source_commit == "1ee7dfe257415ec0066fcf511e01fbaaec23cacd" assert pin.source_repo == "PolicyEngine/chronicle" - assert pin.fact_row_count == 344402 + assert pin.fact_row_count == 352549 assert pin.facts_sha256 == ( - "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d" + "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d" ) assert pin.manifest_sha256 == ( - "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" ) assert pin.artifact_schema_version == "policyengine_ledger.consumer_artifact.v2" assert pin.consumer_fact_schema_versions == ("chronicle.consumer_fact.v4",) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py index 611cbeaee9..4f85c1ab90 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py @@ -187,26 +187,27 @@ def test_wrong_fact_count_refuses_before_either_compiler(prepared): def test_current_national_and_local_pins_share_one_reviewed_identity(): # main (#904) reads one committed pin, ``uk/chronicle_feed.json``, for the # national feed and the local census; the full build checks they agree. - # The identity is the 825406f feed re-pinned by microcosm#1069 - # (PolicyEngine/chronicle#302 via #305, the UK pension facts). + # The identity is the 1ee7dfe feed re-pinned by microcosm#1113 + # (PolicyEngine/chronicle#322 via #323, Consumer Trends by COICOP division + # and DESNZ road fuel by vehicle type and fuel). national = runtime.load_uk_chronicle_feed() local = runtime.load_uk_local_chronicle_pin() assert ( national.facts_sha256 == local["facts_sha256"] - == ("28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d") + == ("3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d") ) assert ( national.manifest_sha256 == local["manifest_sha256"] - == ("6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119") + == ("0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0") ) assert ( national.source_commit == local["source_commit"] - == "825406f98913ab7324c834c3642804e9317a2256" + == "1ee7dfe257415ec0066fcf511e01fbaaec23cacd" ) - assert national.fact_row_count == local["fact_row_count"] == 344402 + assert national.fact_row_count == local["fact_row_count"] == 352549 def test_chronicle_source_codec_validates_directory_manifest(tmp_path): From 543533a5d95563537592c3f4bd5c6e54c24dde8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 9 Oct 2026 13:03:44 +0100 Subject: [PATCH 11/18] Report each LCFS division's capture of ONS household spending (#1113) The stage receipt gains a report-only division_capture block. For each of the twelve COICOP divisions it sets the prior-weighted frame total against ONS Consumer Trends for the uprating's target year (calendar 2024), less the classes a household diary does not record: 02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM. - The divisions are on ONS's domestic concept. Consumer Trends publishes the tourism adjustment for the total only, so only the twelve together are also compared on the national concept (NAT0). International students' tuition has no published split either, and stays in the domestic gap of division 10. - The Consumer Trends resource vendors the 0CN totals and divisions and the three out-of-survey classes for 2023 to 2025 (42 to 93 rows). - Nothing is gated on it. The engine-free stage test has no uprating step, so it checks the block is absent there; a unit test checks the arithmetic against the vendored rows. Co-Authored-By: Claude Opus 5.5 --- .../1113-division-capture-diagnostic.added.md | 1 + .../uk/ledger_fact_vendor_selections.json | 61 +- .../uk/ons_household_expenditure_facts.json | 2766 ++++++++++++++++- .../uk/release_input_coverage_manifest.json | 36 +- .../src/microcosm/build/uk/source_stages.json | 4 +- .../src/microcosm/build/uk/spec/sources.yaml | 4 +- .../build/uk_runtime/lcfs_consumption.py | 135 +- .../uk/test_uk_lcfs_consumption.py | 59 +- 8 files changed, 3038 insertions(+), 28 deletions(-) create mode 100644 changelog.d/1113-division-capture-diagnostic.added.md diff --git a/changelog.d/1113-division-capture-diagnostic.added.md b/changelog.d/1113-division-capture-diagnostic.added.md new file mode 100644 index 0000000000..892dc31ce0 --- /dev/null +++ b/changelog.d/1113-division-capture-diagnostic.added.md @@ -0,0 +1 @@ +The UK LCFS stage receipt reports how much of ONS household spending each COICOP division captures (microcosm#1113): each of the twelve division totals at prior weights against ONS Consumer Trends for calendar 2024, less the classes a household diary does not record (narcotics, owner-occupiers' imputed rent and FISIM), on ONS's domestic concept, with the twelve together also against the national concept. The block is report-only, and the Consumer Trends resource vendors the division and total rows it reads. diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json index a82c17f8c4..2c0344bc30 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json @@ -376,7 +376,7 @@ }, { "resource": "ons_household_expenditure_facts.json", - "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, on the domestic concept (spending on UK territory; PolicyEngine/chronicle#322), for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", + "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual (30 June 2026 release). The seven specific series, 2020 to 2025: COICOP 04.5 and its sub-classes 04.5.1 to 04.5.4, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, all on the domestic concept. For 2023 to 2025: the national (NAT0) and domestic (0) totals and the twelve domestic divisions from the overview sheet, and the three classes a household diary does not record (02.3 narcotics, 04.2 imputed rentals, 12.6.1 FISIM). Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and the division-capture diagnostic.", "consumers": [ "uk_runtime.lcfs_consumption" ], @@ -400,6 +400,65 @@ "period_type": "calendar_year" }, "expected_row_count": 42 + }, + { + "label": "ons_consumer_trends_totals_and_divisions", + "selector": { + "source_name": "ons", + "source_concept": "ons.household_final_consumption_expenditure", + "period_type": "calendar_year", + "period_value": [ + 2023, + 2024, + 2025 + ], + "dimension_values": { + "source_sheet": "0CN", + "coicop": [ + "NAT0", + "0", + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12" + ] + } + }, + "expected_row_count": 42 + }, + { + "label": "ons_consumer_trends_out_of_survey_classes", + "selector": { + "source_name": "ons", + "source_concept": "ons.household_final_consumption_expenditure", + "period_type": "calendar_year", + "period_value": [ + 2023, + 2024, + 2025 + ], + "dimension_values": { + "source_sheet": [ + "02CN", + "04CN", + "12CN" + ], + "coicop": [ + "02.3", + "04.2", + "12.6.1" + ] + } + }, + "expected_row_count": 9 } ] }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json index 4d3f28899d..e4c4e283ed 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json @@ -3,7 +3,7 @@ "country": "uk", "kind": "uk_vendored_ledger_facts", "resource": "ons_household_expenditure_facts.json", - "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual, on the domestic concept (spending on UK territory; PolicyEngine/chronicle#322), for COICOP 04.5 electricity, gas and other fuels and its sub-classes 04.5.1 electricity, 04.5.2 gas, 04.5.3 liquid fuels and 04.5.4 solid fuels, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, 2020 to 2025. Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and planned for the domestic energy and motor-fuel spend diagnostics.", + "purpose": "ONS Consumer Trends household final consumption expenditure, current prices, annual (30 June 2026 release). The seven specific series, 2020 to 2025: COICOP 04.5 and its sub-classes 04.5.1 to 04.5.4, 07.2.2 fuels and lubricants for personal transport and 07.3.2 passenger transport by road, all on the domestic concept. For 2023 to 2025: the national (NAT0) and domestic (0) totals and the twelve domestic divisions from the overview sheet, and the three classes a household diary does not record (02.3 narcotics, 04.2 imputed rentals, 12.6.1 FISIM). Consumed by the lcfs_consumption road-fuel level (07.2.2, microcosm#1113) and the division-capture diagnostic.", "consumers": [ "uk_runtime.lcfs_consumption" ], @@ -41,9 +41,68 @@ "period_type": "calendar_year" }, "row_count": 42 + }, + { + "label": "ons_consumer_trends_totals_and_divisions", + "selector": { + "source_name": "ons", + "source_concept": "ons.household_final_consumption_expenditure", + "period_type": "calendar_year", + "period_value": [ + 2023, + 2024, + 2025 + ], + "dimension_values": { + "source_sheet": "0CN", + "coicop": [ + "NAT0", + "0", + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12" + ] + } + }, + "row_count": 42 + }, + { + "label": "ons_consumer_trends_out_of_survey_classes", + "selector": { + "source_name": "ons", + "source_concept": "ons.household_final_consumption_expenditure", + "period_type": "calendar_year", + "period_value": [ + 2023, + 2024, + 2025 + ], + "dimension_values": { + "source_sheet": [ + "02CN", + "04CN", + "12CN" + ], + "coicop": [ + "02.3", + "04.2", + "12.6.1" + ] + } + }, + "row_count": 9 } ], - "row_count": 42, + "row_count": 93, "rows": [ { "aggregate_fact_key": "ledger_aggregate_fact_v2_757e464b14a1c434720c155f", @@ -2186,6 +2245,2709 @@ "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" }, "value": 312000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_119dc4e5bc95e324b75733e8", + "semantic_fact_key": "ledger_semantic_fact_v2_33ce232860767dbacae7736e", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_0.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_0", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABQI", + "coicop": "0", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 1630297000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_118a077a27a6f05ec5c8f25b", + "semantic_fact_key": "ledger_semantic_fact_v2_46e7fbda7fed449f4f076f73", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_01.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_01", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABZV", + "coicop": "01", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 139909000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ed787ceac10b5b4283c54512", + "semantic_fact_key": "ledger_semantic_fact_v2_b215b9ba2217814142024645", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_02.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_02", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFL", + "coicop": "02", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 50348000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_38803d2247a8b4b1f7f8b6b4", + "semantic_fact_key": "ledger_semantic_fact_v2_d725cffd694a7f677d62b707", + "source_record_id": "ons.consumer_trends.expanded_02cn.cy2023.published.coicop_02_3.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_02cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_02_3", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "MNC2", + "coicop": "02.3", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "02CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 3344000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_efccc773435308ec534d6162", + "semantic_fact_key": "ledger_semantic_fact_v2_d3fa68fe7ea1be71ee1058bb", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_03.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_03", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFP", + "coicop": "03", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 79913000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9ec24b35db63aefc2bef7d0a", + "semantic_fact_key": "ledger_semantic_fact_v2_6043d822382edf8c7dc661b1", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_04.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_04", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFS", + "coicop": "04", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 431667000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_09d1af38710f23674a931d4f", + "semantic_fact_key": "ledger_semantic_fact_v2_80fd5a77f8febf7ba1aec86f", + "source_record_id": "ons.consumer_trends.expanded_04cn.cy2023.published.coicop_04_2.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_04cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_04_2", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFU", + "coicop": "04.2", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 266330000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_17bbb2e670f11d1bdb3bfd45", + "semantic_fact_key": "ledger_semantic_fact_v2_d49f272f321fd32568b9e656", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_05.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_05", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFY", + "coicop": "05", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 77105000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_09994b1303245de703ff9a96", + "semantic_fact_key": "ledger_semantic_fact_v2_423370078189cfec79111fcc", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_06.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_06", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGP", + "coicop": "06", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 31659000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_7007df456ebcacf0a5dcd7fd", + "semantic_fact_key": "ledger_semantic_fact_v2_b01a8dc4c0dc2589cde14303", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_07.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_07", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGT", + "coicop": "07", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 210930000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_7ebe9c4469b9ef50cdba0cef", + "semantic_fact_key": "ledger_semantic_fact_v2_d79a59ea841fb9eda2731977", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_08.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_08", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGX", + "coicop": "08", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 29321000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_039f1f1fad554b41eb635f95", + "semantic_fact_key": "ledger_semantic_fact_v2_35d89fa006c9d4c99bce256a", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_09.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_09", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGY", + "coicop": "09", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 156163000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ea0704ec2b12857a02ccf2dd", + "semantic_fact_key": "ledger_semantic_fact_v2_c5712e2a32a76176bc7517ca", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_10.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_10", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADIE", + "coicop": "10", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 39455000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3007c584c41fae874ca5a236", + "semantic_fact_key": "ledger_semantic_fact_v2_01823f63266bf3d594896af9", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_11.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_11", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADIF", + "coicop": "11", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 175197000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_07d0b1de1b76ace57d954c16", + "semantic_fact_key": "ledger_semantic_fact_v2_d867fd60d4268a2e5beeabaa", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.coicop_12.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_12", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADII", + "coicop": "12", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 208630000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9b1df9adde8c44efe1ce54b8", + "semantic_fact_key": "ledger_semantic_fact_v2_8acb0636ba59e840eb195e3d", + "source_record_id": "ons.consumer_trends.expanded_12cn.cy2023.published.coicop_12_6_1.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_12cn.cy2023.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_12_6_1", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "C68S", + "coicop": "12.6.1", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "12CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 58452000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e44e14ff2b8587a47e335448", + "semantic_fact_key": "ledger_semantic_fact_v2_9b1c4f5718cf9478b89195fb", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2023.published.national.coicop_nat0.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "resident_households" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2023.published.national", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_nat0", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABPB", + "coicop": "NAT0", + "consumption_concept": "national", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 1652281000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a9b5d74a1905275b8b8dadae", + "semantic_fact_key": "ledger_semantic_fact_v2_a73977aeaa41f815044099fe", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_0.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_0", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABQI", + "coicop": "0", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 1685220000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_19b25cb53e05c9f045fb1cec", + "semantic_fact_key": "ledger_semantic_fact_v2_8488ba6ec631b3f828ef2739", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_01.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_01", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABZV", + "coicop": "01", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 142184000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1e134fc0c63ee8affdf1c3ba", + "semantic_fact_key": "ledger_semantic_fact_v2_9f4c3da6794bc0ee887ee82d", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_02.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_02", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFL", + "coicop": "02", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 51116000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a9c2cf60ddc9feb86cd54407", + "semantic_fact_key": "ledger_semantic_fact_v2_9a83fd9699b4fb97c9bfc4f0", + "source_record_id": "ons.consumer_trends.expanded_02cn.cy2024.published.coicop_02_3.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_02cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_02_3", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "MNC2", + "coicop": "02.3", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "02CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 3030000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_565438cdaa9a16854138834f", + "semantic_fact_key": "ledger_semantic_fact_v2_520f95da39f8cb35d288497d", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_03.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_03", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFP", + "coicop": "03", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 78930000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3d2eab52c411caf62b4b327b", + "semantic_fact_key": "ledger_semantic_fact_v2_3d923cd09e1028c729eb19b8", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_04.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_04", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFS", + "coicop": "04", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 455559000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9a759bc4b58b961b03999eb6", + "semantic_fact_key": "ledger_semantic_fact_v2_b6111c445869ba1343ae7c97", + "source_record_id": "ons.consumer_trends.expanded_04cn.cy2024.published.coicop_04_2.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_04cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_04_2", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFU", + "coicop": "04.2", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 291755000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_77a67bd726abdc70bffe5d1c", + "semantic_fact_key": "ledger_semantic_fact_v2_2ceea72d01dbb3ad0117e019", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_05.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_05", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFY", + "coicop": "05", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 76041000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e536c31570dee9e8aa7c654f", + "semantic_fact_key": "ledger_semantic_fact_v2_68c95bad830d0a49f3a12f53", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_06.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_06", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGP", + "coicop": "06", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 33157000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e1618424b63e1e44f5f98fc6", + "semantic_fact_key": "ledger_semantic_fact_v2_639dc1779e5c47a565a12892", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_07.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_07", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGT", + "coicop": "07", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 215510000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_331dd633a5e6612464f55409", + "semantic_fact_key": "ledger_semantic_fact_v2_27081b8e489dbe495915beb6", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_08.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_08", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGX", + "coicop": "08", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 31725000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1baceb48cd8c830a43e2c337", + "semantic_fact_key": "ledger_semantic_fact_v2_8cdee0441150b72dc575b2c7", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_09.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_09", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGY", + "coicop": "09", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 164060000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_21ada720cc8c4205939a355a", + "semantic_fact_key": "ledger_semantic_fact_v2_2a80ee54018cf4d88c6345cb", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_10.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_10", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADIE", + "coicop": "10", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 42334000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c773d9c9e853e850ce3b026d", + "semantic_fact_key": "ledger_semantic_fact_v2_688853034059206a8c2f7478", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_11.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_11", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADIF", + "coicop": "11", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 182600000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_017640e890c0d4542c4e318f", + "semantic_fact_key": "ledger_semantic_fact_v2_ec80ee0fd14e794642f430f8", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.coicop_12.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_12", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADII", + "coicop": "12", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 212004000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_be49a987c62579a9fcb89886", + "semantic_fact_key": "ledger_semantic_fact_v2_13228714785f6dc459e4963f", + "source_record_id": "ons.consumer_trends.expanded_12cn.cy2024.published.coicop_12_6_1.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_12cn.cy2024.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_12_6_1", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "C68S", + "coicop": "12.6.1", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "12CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 55794000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9cf45d098c7b6040db848411", + "semantic_fact_key": "ledger_semantic_fact_v2_b5926c7e5559ecea14c0a022", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2024.published.national.coicop_nat0.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "resident_households" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2024.published.national", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_nat0", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABPB", + "coicop": "NAT0", + "consumption_concept": "national", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 1699387000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ed792b8fd35240decb2a8cf1", + "semantic_fact_key": "ledger_semantic_fact_v2_684d36f2bed3831081724975", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_0.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_0", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABQI", + "coicop": "0", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 1762970000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1faaa0418f29a4a141a6622a", + "semantic_fact_key": "ledger_semantic_fact_v2_cc38678c03000ed594a430ac", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_01.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_01", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABZV", + "coicop": "01", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 148165000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5e5a13e6602c1a5422627bf0", + "semantic_fact_key": "ledger_semantic_fact_v2_118e178c8dd2e668559c913b", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_02.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_02", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFL", + "coicop": "02", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 52880000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_61fb174b349f577248108ed2", + "semantic_fact_key": "ledger_semantic_fact_v2_1a75184724794d7fa16f9825", + "source_record_id": "ons.consumer_trends.expanded_02cn.cy2025.published.coicop_02_3.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_02cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_02_3", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "MNC2", + "coicop": "02.3", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "02CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 3058000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8bdd83499c4b6b67e3ce08fd", + "semantic_fact_key": "ledger_semantic_fact_v2_09a8fea16cdceb56a1b499ed", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_03.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_03", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFP", + "coicop": "03", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 82340000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_715ba2476efc3e5594aff863", + "semantic_fact_key": "ledger_semantic_fact_v2_50e5556b8b35f7d427f6c3ce", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_04.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_04", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFS", + "coicop": "04", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 486444000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5a7a7ff5326cedc65125f71d", + "semantic_fact_key": "ledger_semantic_fact_v2_01598fb8c6a0098a8e97faaf", + "source_record_id": "ons.consumer_trends.expanded_04cn.cy2025.published.coicop_04_2.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_04cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_04_2", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFU", + "coicop": "04.2", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "04CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 313154000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b87304a6051c5c0a917800ad", + "semantic_fact_key": "ledger_semantic_fact_v2_bb9df930ed3545099a7e4354", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_05.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_05", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADFY", + "coicop": "05", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 75906000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d08711c664e4d83374c451df", + "semantic_fact_key": "ledger_semantic_fact_v2_7cc09b839827a1ddf5de094a", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_06.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_06", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGP", + "coicop": "06", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 35880000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_198f412cb804cefeeb26fadb", + "semantic_fact_key": "ledger_semantic_fact_v2_8e62f055806fa3a9ab5aeb50", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_07.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_07", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGT", + "coicop": "07", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 223393000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9a375187cea82a8be5420b30", + "semantic_fact_key": "ledger_semantic_fact_v2_c20c7cbc943743239a668c49", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_08.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_08", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGX", + "coicop": "08", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 31619000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b3c1ad05ca7f31c8829cd5c8", + "semantic_fact_key": "ledger_semantic_fact_v2_fa66b21a89f9d80a390ea539", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_09.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_09", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADGY", + "coicop": "09", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 171605000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ce5d57216c3b28fe662c6ea3", + "semantic_fact_key": "ledger_semantic_fact_v2_ba85efbaeaf0e090a7f74be9", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_10.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_10", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADIE", + "coicop": "10", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 46028000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6a56cddb7d8e27dc81935c05", + "semantic_fact_key": "ledger_semantic_fact_v2_edfe814e6e1fb80420706dbf", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_11.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_11", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADIF", + "coicop": "11", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 192883000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_77a94b7cb65deb219d254195", + "semantic_fact_key": "ledger_semantic_fact_v2_76307839c9a823112fa8bcd4", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.coicop_12.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_12", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ADII", + "coicop": "12", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 215827000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b7d4f70b6cada2419c81a171", + "semantic_fact_key": "ledger_semantic_fact_v2_62f82c0a4b5cef35953abd2b", + "source_record_id": "ons.consumer_trends.expanded_12cn.cy2025.published.coicop_12_6_1.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "households_on_uk_territory" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_12cn.cy2025.published", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_12_6_1", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "C68S", + "coicop": "12.6.1", + "consumption_concept": "domestic", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "12CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 56934000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a033855d0326c275f294e556", + "semantic_fact_key": "ledger_semantic_fact_v2_c247000f9965d60f2ae14aff", + "source_record_id": "ons.consumer_trends.expanded_0cn.cy2025.published.national.coicop_nat0.expenditure", + "concept": "ons.household_final_consumption_expenditure", + "measure_id": "expenditure", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "household", + "role": "resident_households" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2025 + }, + "period_coverage": { + "start_date": "2025-01-01", + "end_date": "2025-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "ons.consumer_trends.expanded_0cn.cy2025.published.national", + "groupby_dimension": "ons.coicop", + "groupby_value_id": "coicop_nat0", + "table_record_kind": "detail" + }, + "dimensions": { + "cdid": "ABPB", + "coicop": "NAT0", + "consumption_concept": "national", + "frequency": "annual", + "price_basis": "current_prices", + "publication_status": "published", + "published_unit": "gbp_million", + "seasonal_adjustment": "not_seasonally_adjusted", + "source_sheet": "0CN" + }, + "source": { + "source_name": "ons", + "source_table": "Consumer Trends current price, not seasonally adjusted, 0CN, 01CN-12CN and TOURCN", + "source_file": "cpnsa.xlsx", + "source_sha256": "109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c", + "vintage": "2026_06_30_release_2026_q1", + "raw_r2_key": "raw/ons/ons-consumer-trends-current-price-2026/2026/109e53de0c09d30327ae2053a0487cee159fe44135884707c9000c252438143c/cpnsa.xlsx" + }, + "value": 1776550000000 } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 405b6288e3..f0f0bf0dbd 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "0d2044d9526ea8e836996115f38cdb8b5bd84c0f4962338974a6dfea09d3c1aa", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,9 +760,9 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { - "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", + "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2023-24" }, "stage": "lcfs_consumption", @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "9250baa997705adda0e6f9036effcc99db5b797d90b46efec9badd874c17b2e8", + "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 1a189150ca..2cb25f62cb 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -3318,7 +3318,7 @@ { "stage": "lcfs_consumption", "survey": "Living Costs and Food Survey 2023-24", - "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", + "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "grain": "household", "base_candidate": { "filename": "populace_uk_2023.h5", @@ -4000,7 +4000,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113)." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 305bd0fc7f..d2a5f95e88 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -2757,7 +2757,7 @@ stages: notes: Imputes local-bus travel per person from the National Travel Survey microdata (microcosm#930; the structural fix Maria ruled on 2026-09-15 for the rake-then-bind bus fares of microcosm#890). The donor is the NTS End User Licence extract (England residents only since 2013) pooled over the declared survey years for the conditional fit; the artifact pins are the 19th-edition (November 2025) tabs, verified at runtime, and the H2 fixture drives the stage with synthetic tabs in the same codebook. One QRF target, the interview frequency-of-use band (the variable behind NTS0313; 0 is the non-user band), conditioned on age band, sex, cars (the was_wealth draw on the recipient), household size, the three-band gross household income and region, drawn from identity-keyed uniforms and rounded to the nearest band; devolved recipients take a declared proxy region for prediction only. Each person's annual local-bus trips are the diary's weighted mean for their band and residence group (London or the rest of England), split into the bus-in-London and other-local-bus series by main mode, W5 x JJXSC over W2 persons annualised by 52.14 weeks; a seven-day diary annualised per person would be right in aggregate and wrong in distribution, so it supplies band means, not per-person counts. If the extract carries no frequency column the band is drawn from the vendored NTS0313/NTS0621 shares and declared band midpoints are scaled to the vendored NTS0303 rate (the receipt names the path). Concessionary eligibility is the declared statutory age rule of the person's area, emitted for the lcfs pricing step to zero-price eligible persons' trips; the donor's eligible share of trips per series is receipted beside the publisher's concessionary boarding share. The stage and ticket tables class every diary bus boarding by how it was paid for (at the point of use, a season ticket or pass, a concessionary pass, free) and give each person the share of fare-paying boardings paid at the point of use for their band and residence group (local_bus_single_fare_share), the boardings a per-journey fare cap binds on, with the fare paid per boarding by residence group and survey year receipted beside it (microcosm#930 C13, María's ask of 2026-09-23). The stage records the frame's band shares against NTS0313/NTS0621, its trips per person against NTS0303 and by age band against NTS0601, and the frame's car availability against NTS0205, all from vendored rows; nothing derived from the licensed rows is committed. - stage: lcfs_consumption survey: Living Costs and Food Survey 2023-24 - source: UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices. + source: UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices. grain: household base_candidate: filename: populace_uk_2023.h5 @@ -3279,7 +3279,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year.' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers'' imputed rent and 12.6.1 FISIM), on ONS''s domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113).' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index 8872732f2d..bde6b15f55 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -165,8 +165,10 @@ # the register names. UK_LCFS_DFT_BUS_JOURNEYS_RESOURCE = UK_DFT_BUS_JOURNEYS_RESOURCE UK_LCFS_DEVOLVED_BUS_FINANCE_RESOURCE = "devolved_bus_finance.json" -#: ONS Consumer Trends household spending, the road-fuel level (COICOP 07.2.2). -UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE = "ons_household_expenditure_facts.json" +#: ONS Consumer Trends household spending, the road-fuel level (COICOP 07.2.2) +#: and the division totals the capture diagnostic compares against. +UK_LCFS_ONS_EXPENDITURE_RESOURCE = "ons_household_expenditure_facts.json" +UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE = UK_LCFS_ONS_EXPENDITURE_RESOURCE UK_LCFS_VENDORED_RESOURCES = ( UK_LCFS_ROAD_FUEL_RESOURCE, UK_LCFS_LICENSED_CARS_RESOURCE, @@ -319,6 +321,7 @@ class UKLCFSConsumptionResult: road_fuel_incidence: Mapping[str, Any] | None = None road_fuel_level: Mapping[str, Any] | None = None recomposed_totals: Mapping[str, Any] | None = None + division_capture: Mapping[str, Any] | None = None def evidence(self) -> dict[str, object]: evidence: dict[str, object] = { @@ -345,6 +348,8 @@ def evidence(self) -> dict[str, object]: evidence["road_fuel_level"] = dict(self.road_fuel_level) if self.recomposed_totals is not None: evidence["recomposed_totals"] = dict(self.recomposed_totals) + if self.division_capture is not None: + evidence["division_capture"] = dict(self.division_capture) return evidence @@ -473,6 +478,16 @@ def __call__(self, frame: Frame) -> Frame: household_draws, recomposed_totals_receipt = lcfs_recompose_from_remainder( self.stage, household_draws, drawn=drawn_parts, weights=weights ) + uprating = uprating_operation(self.stage) + capture = ( + None + if uprating is None + else division_capture( + household_draws, + weights=weights, + period_value=int(uprating["to_period"]), + ) + ) litres_audit = fuel_litres_audit( household_draws, weights=weights, stage=self.stage ) @@ -514,6 +529,7 @@ def __call__(self, frame: Frame) -> Frame: road_fuel_incidence=incidence.receipt, road_fuel_level=road_fuel_level_receipt, recomposed_totals=recomposed_totals_receipt, + division_capture=capture, ) return result @@ -533,6 +549,121 @@ class UKLCFSConsumptionImputationResult: fit_weight_records: tuple[FitWeightRecord, ...] +#: ONS Consumer Trends' generic concept for the divisions and classes. +UK_ONS_HFCE_CONCEPT = "ons.household_final_consumption_expenditure" +#: Each LCFS division column and its COICOP division. +UK_LCFS_DIVISION_COICOP = { + column: f"{division:02d}" + for division, column in enumerate(UK_LCFS_COICOP_DIVISION_COLUMNS, start=1) +} +#: The classes national accounts count that a household diary does not: +#: narcotics, owner-occupiers' imputed rent and FISIM, each with its sheet. +UK_LCFS_SURVEY_OUT_OF_SCOPE_CLASSES = { + "02": (("02.3", "02CN"),), + "04": (("04.2", "04CN"),), + "12": (("12.6.1", "12CN"),), +} + + +def _ons_annual_value( + coicop: str, *, source_sheet: str, consumption_concept: str, period_value: int +) -> tuple[float, str]: + rows = vendored_rows( + UK_LCFS_ONS_EXPENDITURE_RESOURCE, + concept=UK_ONS_HFCE_CONCEPT, + period_type="calendar_year", + period_value=int(period_value), + dimensions={ + "coicop": coicop, + "source_sheet": source_sheet, + "consumption_concept": consumption_concept, + }, + ) + if len(rows) != 1: + raise ValueError( + f"{UK_LCFS_ONS_EXPENDITURE_RESOURCE}: expected one {coicop} " + f"({source_sheet}, {consumption_concept}) row for {period_value}, " + f"found {len(rows)}." + ) + return float(rows[0]["value"]), str(rows[0].get("source_record_id", "")) + + +def division_capture( + household_draws: pd.DataFrame, *, weights: Sequence[float], period_value: int +) -> dict[str, Any]: + """How much of ONS household spending each LCFS division captures. + + Diagnostic only (microcosm#1113): each division's prior-weighted frame + total against ONS Consumer Trends for the same calendar year, less the + classes a household diary does not record (narcotics, imputed rent, + FISIM). The divisions are ONS's domestic concept: they include + non-residents' spending in the UK and exclude residents' spending abroad, + and the tourism adjustment is published for the total only, so only the + total is also compared on the national concept. Nothing is gated on it. + """ + + weight = np.asarray(weights, dtype=float) + divisions: dict[str, Any] = {} + frame_total = 0.0 + out_of_scope_total = 0.0 + for column, coicop in UK_LCFS_DIVISION_COICOP.items(): + published, record_id = _ons_annual_value( + coicop, + source_sheet="0CN", + consumption_concept="domestic", + period_value=period_value, + ) + out_of_scope = {} + for code, sheet in UK_LCFS_SURVEY_OUT_OF_SCOPE_CLASSES.get(coicop, ()): + out_of_scope[code], _ = _ons_annual_value( + code, + source_sheet=sheet, + consumption_concept="domestic", + period_value=period_value, + ) + survey_scope = published - sum(out_of_scope.values()) + frame = float(np.dot(weight, household_draws[column].to_numpy(dtype=float))) + frame_total += frame + out_of_scope_total += sum(out_of_scope.values()) + divisions[column] = { + "coicop": coicop, + "published_domestic": published, + "source_record_id": record_id, + "out_of_scope": out_of_scope, + "survey_scope": survey_scope, + "frame": frame, + "capture": frame / survey_scope if survey_scope > 0 else None, + } + domestic, _ = _ons_annual_value( + "0", + source_sheet="0CN", + consumption_concept="domestic", + period_value=period_value, + ) + national, _ = _ons_annual_value( + "NAT0", + source_sheet="0CN", + consumption_concept="national", + period_value=period_value, + ) + return { + "resource": UK_LCFS_ONS_EXPENDITURE_RESOURCE, + "concept": UK_ONS_HFCE_CONCEPT, + "period_type": "calendar_year", + "period_value": int(period_value), + "divisions": divisions, + "total": { + "frame": frame_total, + "published_domestic": domestic, + "published_national": national, + "out_of_scope": out_of_scope_total, + "capture_domestic": frame_total / (domestic - out_of_scope_total), + "capture_national": frame_total / (national - out_of_scope_total), + }, + "gated": False, + } + + def fuel_litres_audit( household_draws: pd.DataFrame, *, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index 02719dc0a2..166550f808 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -784,8 +784,10 @@ def materialize(self, frame, variables, period): assert evidence["energy_rake"]["margins_period_value"] == 2024 assert evidence["energy_rake"]["level"]["gas_kwh"]["factor"] > 0 assert evidence["energy_rake"]["gas_connection"]["rule"] == "published_meter_share" - # The uprating step is dropped in this engine-free run, so no litres audit. + # The uprating step is dropped in this engine-free run, so no litres audit + # and no division capture (both read the uprating's target year). assert "fuel_litres_audit" not in evidence + assert "division_capture" not in evidence assert "donor_uprating" not in evidence # Fuel: no vehicles means no fuel; the fuel-buyer share came from VEH1103. no_vehicle = household["num_vehicles"].to_numpy() == 0 @@ -978,6 +980,61 @@ class Stage: assert fuel_litres_audit(draws, weights=weights, stage=Stage()) is None +def test_division_capture_compares_each_division_with_ons() -> None: + """Frame divisions against Consumer Trends less what diaries miss (#1113).""" + + from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_COICOP_DIVISION_COLUMNS, + division_capture, + ) + from microcosm.build.uk_runtime.ledger_fact_vendoring import vendored_rows + + def ons(coicop: str, sheet: str, concept: str = "domestic") -> float: + (row,) = vendored_rows( + "ons_household_expenditure_facts.json", + concept="ons.household_final_consumption_expenditure", + period_type="calendar_year", + period_value=2024, + dimensions={ + "coicop": coicop, + "source_sheet": sheet, + "consumption_concept": concept, + }, + ) + return float(row["value"]) + + draws = pd.DataFrame( + {column: [1.0e3, 2.0e3] for column in UK_LCFS_COICOP_DIVISION_COLUMNS} + ) + weights = np.array([1.0e7, 5.0e6]) + + capture = division_capture(draws, weights=weights, period_value=2024) + + frame = 1.0e3 * 1.0e7 + 2.0e3 * 5.0e6 + food = capture["divisions"]["food_and_non_alcoholic_beverages_consumption"] + assert food["coicop"] == "01" and food["out_of_scope"] == {} + assert food["published_domestic"] == ons("01", "0CN") + assert food["capture"] == pytest.approx(frame / ons("01", "0CN")) + housing = capture["divisions"]["housing_water_and_electricity_consumption"] + assert housing["out_of_scope"] == {"04.2": ons("04.2", "04CN")} + assert housing["survey_scope"] == pytest.approx( + ons("04", "0CN") - ons("04.2", "04CN") + ) + assert set( + capture["divisions"]["alcohol_and_tobacco_consumption"]["out_of_scope"] + ) == {"02.3"} + assert set(capture["divisions"]["miscellaneous_consumption"]["out_of_scope"]) == { + "12.6.1" + } + total = capture["total"] + assert total["frame"] == pytest.approx(12 * frame) + assert total["published_national"] == ons("NAT0", "0CN", "national") + assert total["capture_national"] == pytest.approx( + 12 * frame / (total["published_national"] - total["out_of_scope"]) + ) + assert capture["gated"] is False + + def test_road_fuel_level_reads_the_vendored_ons_row() -> None: """The declared level is ONS 07.2.2 for 2024 less the other-fuels share (#1113).""" From 59339e4ab4a0a4f00901f4ea2ef9e3077091927b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 9 Oct 2026 13:10:16 +0100 Subject: [PATCH 12/18] Benchmark each fuel in the litres audit against its cars share (#1113) The litres audit's per-fuel benchmark is now HMRC's clearances of that fuel times the cars share of its UK road use, from DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322), for the uprating's target year. Within one fuel the ktoe cancel, so no conversion factor enters. - For 2024 cars burn 97.8% of road petrol and 39.2% of road diesel; the OBR cars share of fuel duty receipts applied one share to both, which A8 labelled. The OBR-based total stays on the receipt beside the new one. - desnz_road_fuel_by_vehicle.json vendors the UK rows for 2022 to 2024 (30 rows), and the lcfs_consumption stage declares it as an artifact. - Report-only, as before. Co-Authored-By: Claude Opus 5.5 --- ...3-road-fuel-level-and-incidence.changed.md | 2 +- .../microcosm/build/uk/country_package.json | 5 + .../build/uk/desnz_road_fuel_by_vehicle.json | 1629 +++++++++++++++++ .../uk/ledger_fact_vendor_selections.json | 25 + .../uk/release_input_coverage_manifest.json | 36 +- .../src/microcosm/build/uk/source_stages.json | 10 +- .../src/microcosm/build/uk/spec/sources.yaml | 8 +- .../build/uk_runtime/lcfs_consumption.py | 95 +- .../engine_free/shared/test_country_spec.py | 2 + .../uk/test_uk_lcfs_consumption.py | 31 +- 10 files changed, 1798 insertions(+), 45 deletions(-) create mode 100644 packages/microcosm-build/src/microcosm/build/uk/desnz_road_fuel_by_vehicle.json diff --git a/changelog.d/1113-road-fuel-level-and-incidence.changed.md b/changelog.d/1113-road-fuel-level-and-incidence.changed.md index 10880d33e2..8b3250ffdd 100644 --- a/changelog.d/1113-road-fuel-level-and-incidence.changed.md +++ b/changelog.d/1113-road-fuel-level-and-incidence.changed.md @@ -1 +1 @@ -The UK LCFS stage sets household road fuel itself (microcosm#1113): a flagged fuel-car household whose chain draw is zero is redrawn from the donor's distribution among households with positive road fuel (`redraw_zero_road_fuel`), and one factor then scales petrol and diesel to ONS 07.2.2 for 2024 less the donor's other-fuels share (`level_road_fuel`). Two stage-health gates check the receipts, petrol and diesel leave the committed support bounds, and the litres audit labels its per-fuel ratios as a uniform cars share. +The UK LCFS stage sets household road fuel itself (microcosm#1113): a flagged fuel-car household whose chain draw is zero is redrawn from the donor's distribution among households with positive road fuel (`redraw_zero_road_fuel`), and one factor then scales petrol and diesel to ONS 07.2.2 for 2024 less the donor's other-fuels share (`level_road_fuel`). Two stage-health gates check the receipts, petrol and diesel leave the committed support bounds, and the litres audit benchmarks each fuel against HMRC clearances times DESNZ's cars share of that fuel's road use (PolicyEngine/chronicle#322), keeping the OBR cars share of duty receipts, uniform across fuels, beside the total. diff --git a/packages/microcosm-build/src/microcosm/build/uk/country_package.json b/packages/microcosm-build/src/microcosm/build/uk/country_package.json index 7b8b053134..f08a30225e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/country_package.json +++ b/packages/microcosm-build/src/microcosm/build/uk/country_package.json @@ -422,6 +422,11 @@ "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "desnz_road_fuel_by_vehicle.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "dft_bus_journeys.json", "kind": "legacy_json", diff --git a/packages/microcosm-build/src/microcosm/build/uk/desnz_road_fuel_by_vehicle.json b/packages/microcosm-build/src/microcosm/build/uk/desnz_road_fuel_by_vehicle.json new file mode 100644 index 0000000000..49794b9e95 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/desnz_road_fuel_by_vehicle.json @@ -0,0 +1,1629 @@ +{ + "schema_version": 1, + "country": "uk", + "kind": "uk_vendored_ledger_facts", + "resource": "desnz_road_fuel_by_vehicle.json", + "purpose": "DESNZ sub-national road transport fuel consumption (25 June 2026 workbook), UK totals by vehicle type and fuel in ktoe, calendar years 2022 to 2024: the cars share of each fuel's road use for the LCFS litres audit's per-fuel benchmark (microcosm#1113, PolicyEngine/chronicle#322).", + "consumers": [ + "uk_runtime.lcfs_consumption" + ], + "planned_consumers": [], + "policy": "Rows are copied verbatim from the pinned Chronicle consumer feed named in source_fact_feed; every value is a publisher-stated fact. Consumers declare their own arithmetic on these rows and never edit this file by hand: regenerate it with tools/vendor_uk_ledger_facts.py.", + "generator": { + "tool": "tools/vendor_uk_ledger_facts.py", + "version": 1 + }, + "source_fact_feed": { + "source_repo": "PolicyEngine/chronicle", + "source_commit": "1ee7dfe257415ec0066fcf511e01fbaaec23cacd", + "build": "build-bundle --suite uk -> build-consumer-artifact", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "fact_row_count": 352549, + "facts_sha256": "3515800a522f6aa6d076c0ba95a37b924e8505dd8e13d33a55413afd84172f2d", + "manifest_sha256": "0ee42919d02c0dced9048033c43ef057e14b2af05166d96c0bd00cd1128cd4e0" + }, + "selections": [ + { + "label": "desnz_road_fuel_uk_by_vehicle_and_fuel", + "selector": { + "source_name": "desnz", + "source_concept": "desnz.road_transport.fuel_consumption", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + 2022, + 2023, + 2024 + ] + }, + "row_count": 30 + } + ], + "row_count": 30, + "rows": [ + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3177df322e70209b264c8e69", + "semantic_fact_key": "ledger_semantic_fact_v2_522c5e6e966e536a035a72a3", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.all_vehicles_all_fuels", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "all_vehicles_all_fuels", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "all_fuels", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "all_vehicles" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 40108.93699794764 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d478fa6d0c85961b316f8c06", + "semantic_fact_key": "ledger_semantic_fact_v2_08a5860d6329b73bc2c296de", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.buses_and_coaches_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "buses_and_coaches_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "buses_and_coaches" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 919.1179587807651 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a9727f943547ae0977ef3fdc", + "semantic_fact_key": "ledger_semantic_fact_v2_6d42ec5a6d8bd747e2b7c475", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.cars_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "cars_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "cars" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 10718.537925649329 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c9d249711a6ebed7e867fcf8", + "semantic_fact_key": "ledger_semantic_fact_v2_9918c4a87d8f441d09b77686", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.hgv_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "hgv_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "hgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 7270.335857779619 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b28e81c45d1d34cfeddde024", + "semantic_fact_key": "ledger_semantic_fact_v2_bcc1fcf8d77742e970d37e0d", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.lgv_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 7082.325691484031 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_96149cc6b8907e2266b09501", + "semantic_fact_key": "ledger_semantic_fact_v2_14e5a259664bf5e402b24e0e", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.cars_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "cars_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "cars" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 13783.459179880458 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9f4c44837ab444dce6c5e1b4", + "semantic_fact_key": "ledger_semantic_fact_v2_d27de2645dd5dc51f7542239", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.lgv_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 145.97469765079305 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0e6d1b6bc9c5567c7622579a", + "semantic_fact_key": "ledger_semantic_fact_v2_9686ca6f49fd9048c709cd75", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.motorcycles_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "motorcycles_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "motorcycles" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 188.8585393082966 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_bc2f79875b76ee4213b0f8d7", + "semantic_fact_key": "ledger_semantic_fact_v2_6a4134fbfabbb12cf05af0a1", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.lgv_lpg", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_lpg", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "lpg", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 0.103531988946173 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4bc576b96126224109659a96", + "semantic_fact_key": "ledger_semantic_fact_v2_1a33be5fd9f1695d1584db90", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2022.k02000001.hgv_natural_gas", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "hgv_natural_gas", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2022 + }, + "period_coverage": { + "start_date": "2022-01-01", + "end_date": "2022-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2022", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "natural_gas", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "hgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 0.22361542540962204 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_97307b326cdab60ba250d548", + "semantic_fact_key": "ledger_semantic_fact_v2_45881ca908be1b6de2b8b383", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.all_vehicles_all_fuels", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "all_vehicles_all_fuels", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "all_fuels", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "all_vehicles" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 39878.20310359735 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b7daf9d0c79d0aa98012d88b", + "semantic_fact_key": "ledger_semantic_fact_v2_8d9bd868561e29bfe3b0e8eb", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.buses_and_coaches_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "buses_and_coaches_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "buses_and_coaches" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 888.375782715515 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_150690f7c1ca005ad98e44c6", + "semantic_fact_key": "ledger_semantic_fact_v2_69e05d3e693e1c00d1f4ede8", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.cars_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "cars_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "cars" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 10223.50594811775 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b5cbd927cc249b3c977cf04e", + "semantic_fact_key": "ledger_semantic_fact_v2_882d117dd9d1deb577677a21", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.hgv_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "hgv_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "hgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 7050.954092068948 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_673fadc5ae832dfab513d22d", + "semantic_fact_key": "ledger_semantic_fact_v2_625b50b951c39be0de9b850c", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.lgv_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 7051.437932832095 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_584bbce563bdcbe188c2fa5a", + "semantic_fact_key": "ledger_semantic_fact_v2_525c78095986df2980bb55e4", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.cars_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "cars_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "cars" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 14333.754242622057 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_171f655132e3f991a7bcb149", + "semantic_fact_key": "ledger_semantic_fact_v2_6ecee05116aef46207d8ed4d", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.lgv_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 141.81873733262958 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_78bf9bc5eb49bfc4b598e196", + "semantic_fact_key": "ledger_semantic_fact_v2_6456181667d2c7a3f84c8b29", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.motorcycles_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "motorcycles_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "motorcycles" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 187.89928932755384 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6ceb3db4e36d90a94d8113fc", + "semantic_fact_key": "ledger_semantic_fact_v2_317e75b9b98fd09889f333ea", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.lgv_lpg", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_lpg", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "lpg", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 0.15842605311858937 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_131e2e2436aac4b880f9ac56", + "semantic_fact_key": "ledger_semantic_fact_v2_e1c0ae9bbab2d6226522a2bb", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2023.k02000001.hgv_natural_gas", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "hgv_natural_gas", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": "2023-01-01", + "end_date": "2023-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2023", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "natural_gas", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "hgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 0.298652527679633 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1c3752ed2cc45c708ff93a4b", + "semantic_fact_key": "ledger_semantic_fact_v2_fc8998399d13f8bf92afe25e", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.all_vehicles_all_fuels", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "all_vehicles_all_fuels", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "all_fuels", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "all_vehicles" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 39343.07844026484 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3e29ed0eb8f6b5ee2bf4dcb7", + "semantic_fact_key": "ledger_semantic_fact_v2_e635c1dd7698e6c161687429", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.buses_and_coaches_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "buses_and_coaches_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "buses_and_coaches" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 880.649432681561 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_53ede5867bca38ba850afded", + "semantic_fact_key": "ledger_semantic_fact_v2_4ae6305cfc5f05b2ecb31123", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.cars_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "cars_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "cars" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 9571.883358666924 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_02b65d2b87bdf2e5ad44888f", + "semantic_fact_key": "ledger_semantic_fact_v2_d57337bd9a311a9d634477a6", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.hgv_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "hgv_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "hgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 6902.162844500974 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1328b7b0e70a42bf1749e1e4", + "semantic_fact_key": "ledger_semantic_fact_v2_7d73836f6339197d8190259e", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.lgv_diesel", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_diesel", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "diesel", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 7051.256712217175 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_699cd920a6c031a9af9fe877", + "semantic_fact_key": "ledger_semantic_fact_v2_a336091f05ba44dc421912a6", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.cars_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "cars_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "cars" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 14605.695206681678 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_76ab8c9e9e6075c5064a5e31", + "semantic_fact_key": "ledger_semantic_fact_v2_e53412d28eed53c0ce53d26c", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.lgv_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 138.67363921583953 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_45dbca724111ce8a61cc5ead", + "semantic_fact_key": "ledger_semantic_fact_v2_069dda1713c83536d895b787", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.motorcycles_petrol", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "motorcycles_petrol", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "biofuel_treatment": "includes_blended_biofuels", + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "petrol", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "motorcycles" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 192.19893899352886 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_983a8c21785b8bee7639706f", + "semantic_fact_key": "ledger_semantic_fact_v2_b79a18b765d63d78a35bba0b", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.lgv_lpg", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "lgv_lpg", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "lpg", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "lgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 0.21659373944247667 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e389f522fd91a2258530ee2b", + "semantic_fact_key": "ledger_semantic_fact_v2_bbb0cc3a0184ff73a0145cce", + "source_record_id": "desnz.road_transport.fuel_consumption.cy2024.k02000001.hgv_natural_gas", + "concept": "desnz.road_transport.fuel_consumption", + "measure_id": "hgv_natural_gas", + "unit": "ktoe", + "aggregation": "sum", + "entity": { + "name": "institutional_sector", + "role": "road_transport" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "2025-12" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-12-31", + "basis": "calendar" + }, + "layout": { + "record_set_id": "desnz.road_transport.fuel_consumption.cy2024", + "groupby_dimension": "desnz.road_transport.area", + "groupby_value_id": "k02000001", + "table_record_kind": "total" + }, + "dimensions": { + "electric_vehicle_treatment": "excluded", + "estimate_basis": "spatial_estimates_without_dukes_normalisation", + "fuel": "natural_gas", + "geography_kind": "country", + "national_inventory_basis": "normalised_to_adjusted_dukes_fuel_sales", + "population_scope": "vehicles_travelling_in_area", + "road_type": "all_roads", + "vehicle_type": "hgv" + }, + "source": { + "source_name": "desnz", + "source_table": "Sub-national road transport fuel consumption statistics, 2005-2024", + "source_file": "subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx", + "source_sha256": "1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f", + "vintage": "2026_06_25_release_2005_2024", + "raw_r2_key": "raw/uk/desnz/desnz-road-transport-fuel-consumption-2024/2026/1b6d8596659ed9e4e6cb946b904f967a48d9eda175709c7f0b3801f87d0fc39f/subnational-road-transport-fuel-consumption-tables-2005-2024.xlsx" + }, + "value": 0.3417135677224947 + } + ] +} diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json index 2c0344bc30..48506adba0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json @@ -462,6 +462,31 @@ } ] }, + { + "resource": "desnz_road_fuel_by_vehicle.json", + "purpose": "DESNZ sub-national road transport fuel consumption (25 June 2026 workbook), UK totals by vehicle type and fuel in ktoe, calendar years 2022 to 2024: the cars share of each fuel's road use for the LCFS litres audit's per-fuel benchmark (microcosm#1113, PolicyEngine/chronicle#322).", + "consumers": [ + "uk_runtime.lcfs_consumption" + ], + "planned_consumers": [], + "selections": [ + { + "label": "desnz_road_fuel_uk_by_vehicle_and_fuel", + "selector": { + "source_name": "desnz", + "source_concept": "desnz.road_transport.fuel_consumption", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + 2022, + 2023, + 2024 + ] + }, + "expected_row_count": 30 + } + ] + }, { "resource": "desnz_domestic_energy_facts.json", "purpose": "DESNZ domestic energy volumes: Energy Trends domestic electricity (table 5.5) and gas (table 4.1) consumption at actual temperature, annual and quarterly, United Kingdom, 2022 to the latest quarter (the published level the LCFS kWh rake scales to over FY2024-25), and the subnational electricity and gas statistics' domestic consumption and meter counts for Great Britain, England and Wales, the countries and the English regions, 2023 and 2024 (the published gas-connected share by region: gas meters over electricity meters).", diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index f0f0bf0dbd..48129f6778 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "0d2044d9526ea8e836996115f38cdb8b5bd84c0f4962338974a6dfea09d3c1aa", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,9 +760,9 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { - "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", + "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2023-24" }, "stage": "lcfs_consumption", @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "f6626f4bfd99fae29214aa39019794b1431d334f29b9dda9ed40952f7ddf71d4", + "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 2cb25f62cb..3dfee7c117 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -3318,7 +3318,7 @@ { "stage": "lcfs_consumption", "survey": "Living Costs and Food Survey 2023-24", - "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", + "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "grain": "household", "base_candidate": { "filename": "populace_uk_2023.h5", @@ -3408,6 +3408,12 @@ "resource": "ons_household_expenditure_facts.json", "kind": "public_aggregate_reference", "format": "json" + }, + { + "role": "desnz_road_fuel_by_vehicle", + "resource": "desnz_road_fuel_by_vehicle.json", + "kind": "public_aggregate_reference", + "format": "json" } ], "operations": [ @@ -4000,7 +4006,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113)." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index d2a5f95e88..a7c5c3491f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -2757,7 +2757,7 @@ stages: notes: Imputes local-bus travel per person from the National Travel Survey microdata (microcosm#930; the structural fix Maria ruled on 2026-09-15 for the rake-then-bind bus fares of microcosm#890). The donor is the NTS End User Licence extract (England residents only since 2013) pooled over the declared survey years for the conditional fit; the artifact pins are the 19th-edition (November 2025) tabs, verified at runtime, and the H2 fixture drives the stage with synthetic tabs in the same codebook. One QRF target, the interview frequency-of-use band (the variable behind NTS0313; 0 is the non-user band), conditioned on age band, sex, cars (the was_wealth draw on the recipient), household size, the three-band gross household income and region, drawn from identity-keyed uniforms and rounded to the nearest band; devolved recipients take a declared proxy region for prediction only. Each person's annual local-bus trips are the diary's weighted mean for their band and residence group (London or the rest of England), split into the bus-in-London and other-local-bus series by main mode, W5 x JJXSC over W2 persons annualised by 52.14 weeks; a seven-day diary annualised per person would be right in aggregate and wrong in distribution, so it supplies band means, not per-person counts. If the extract carries no frequency column the band is drawn from the vendored NTS0313/NTS0621 shares and declared band midpoints are scaled to the vendored NTS0303 rate (the receipt names the path). Concessionary eligibility is the declared statutory age rule of the person's area, emitted for the lcfs pricing step to zero-price eligible persons' trips; the donor's eligible share of trips per series is receipted beside the publisher's concessionary boarding share. The stage and ticket tables class every diary bus boarding by how it was paid for (at the point of use, a season ticket or pass, a concessionary pass, free) and give each person the share of fare-paying boardings paid at the point of use for their band and residence group (local_bus_single_fare_share), the boardings a per-journey fare cap binds on, with the fare paid per boarding by residence group and survey year receipted beside it (microcosm#930 C13, María's ask of 2026-09-23). The stage records the frame's band shares against NTS0313/NTS0621, its trips per person against NTS0303 and by age band against NTS0601, and the frame's car availability against NTS0205, all from vendored rows; nothing derived from the licensed rows is committed. - stage: lcfs_consumption survey: Living Costs and Food Survey 2023-24 - source: UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices. + source: UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices. grain: household base_candidate: filename: populace_uk_2023.h5 @@ -2823,6 +2823,10 @@ stages: resource: ons_household_expenditure_facts.json kind: public_aggregate_reference format: json + - role: desnz_road_fuel_by_vehicle + resource: desnz_road_fuel_by_vehicle.json + kind: public_aggregate_reference + format: json operations: - kind: derive lowercase_columns: true @@ -3279,7 +3283,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers'' imputed rent and 12.6.1 FISIM), on ONS''s domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113).' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers'' imputed rent and 12.6.1 FISIM), on ONS''s domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel''s frame litres with HMRC''s clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index bde6b15f55..2a973ecc30 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -169,6 +169,9 @@ #: and the division totals the capture diagnostic compares against. UK_LCFS_ONS_EXPENDITURE_RESOURCE = "ons_household_expenditure_facts.json" UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE = UK_LCFS_ONS_EXPENDITURE_RESOURCE +#: DESNZ sub-national road transport fuel consumption by vehicle and fuel (ktoe), +#: the litres audit's per-fuel cars share. +UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE = "desnz_road_fuel_by_vehicle.json" UK_LCFS_VENDORED_RESOURCES = ( UK_LCFS_ROAD_FUEL_RESOURCE, UK_LCFS_LICENSED_CARS_RESOURCE, @@ -179,6 +182,7 @@ UK_DESNZ_DOMESTIC_ENERGY_RESOURCE, UK_QEP_ENERGY_PRICES_RESOURCE, UK_LCFS_ROAD_FUEL_LEVEL_RESOURCE, + UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE, ) #: The household road-fuel columns the ``level_road_fuel`` step scales. UK_LCFS_ROAD_FUEL_COLUMNS = ("petrol_spending", "diesel_spending") @@ -208,9 +212,11 @@ UK_LCFS_ROAD_FUEL_TOTAL = "road_fuel_total" UK_LCFS_PETROL_SHARE = "petrol_share_of_road_fuel" UK_LCFS_ICE_SHARE_RULE = "one_minus_zero_emission_share" -#: How the litres audit reads its per-fuel ratios until a per-fuel cars benchmark -#: exists: only the all-fuel total compares like with like. -UK_LITRES_AUDIT_PER_FUEL_BASIS = "uniform cars share, not a per-fuel benchmark" +#: How the litres audit benchmarks each fuel: HMRC's all-road-user litres times +#: the cars share of that fuel's road use (PolicyEngine/chronicle#322). +UK_LITRES_AUDIT_PER_FUEL_BASIS = "desnz cars share of each fuel's road use" +UK_DESNZ_ROAD_FUEL_CONCEPT = "desnz.road_transport.fuel_consumption" +UK_LITRES_AUDIT_FUELS = {"petrol_spending": "petrol", "diesel_spending": "diesel"} #: The litres audit (microcosm#890 C7) reads these vendored concepts beside the #: declared litre-proxy price concepts: HMRC clearances are all road users, the #: OBR receipts split names the cars share of them. @@ -664,20 +670,68 @@ def division_capture( } +def desnz_cars_share_by_fuel(period_value: int) -> dict[str, dict[str, Any]]: + """The cars share of each fuel's UK road use, from DESNZ's vehicle/fuel ktoe. + + Within one fuel the units cancel, so no ktoe-to-litres factor is needed: + cars over every vehicle type burning that fuel (petrol: cars, motorcycles + and LGVs; diesel: cars, buses and coaches, LGVs and HGVs). + """ + + rows = vendored_rows( + UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE, + concept=UK_DESNZ_ROAD_FUEL_CONCEPT, + period_type="calendar_year", + period_value=int(period_value), + geography_id="K02000001", + ) + shares: dict[str, dict[str, Any]] = {} + for fuel in UK_LITRES_AUDIT_FUELS.values(): + by_vehicle: dict[str, float] = {} + record_ids: list[str] = [] + for row in rows: + dims = row.get("dimensions") or {} + if dims.get("fuel") != fuel: + continue + vehicle = str(dims.get("vehicle_type")) + if vehicle in by_vehicle: + raise ValueError( + f"{UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE}: duplicate {vehicle} {fuel} " + f"row for {period_value}." + ) + by_vehicle[vehicle] = float(row["value"]) + record_ids.append(str(row.get("source_record_id", ""))) + total = sum(by_vehicle.values()) + if "cars" not in by_vehicle or total <= 0: + raise ValueError( + f"{UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE}: no {fuel} cars row for " + f"{period_value}." + ) + shares[fuel] = { + "ktoe_by_vehicle": dict(sorted(by_vehicle.items())), + "cars_share": by_vehicle["cars"] / total, + "source_record_ids": record_ids, + } + return shares + + def fuel_litres_audit( household_draws: pd.DataFrame, *, weights: Sequence[float], stage: SourceStageSpec, ) -> dict[str, Any] | None: - """Frame road-fuel litres against HMRC clearances times the OBR cars share. - - Diagnostic only (microcosm#890 C7): for each fuel column the declared - uprating moves by the vendored litre proxy, the frame's prior-weighted - spend is divided by the DESNZ pump price of the uprating's target year and - compared with the HMRC fiscal-year litres scaled by the OBR cars share of - fuel duty receipts (the household frame carries cars, not lorries or - vans). Recorded in the stage evidence; nothing is gated on it. + """Frame road-fuel litres against the cars' share of HMRC clearances. + + Diagnostic only (microcosm#890 C7, #1113): for each fuel column the + declared uprating moves by the vendored litre proxy, the frame's + prior-weighted spend is divided by the DESNZ pump price of the uprating's + target year and compared with the HMRC fiscal-year litres of that fuel + scaled by the cars share of its road use (DESNZ sub-national road fuel by + vehicle, the uprating's target year; the household frame carries cars, not + lorries or vans). The OBR cars share of fuel duty receipts, uniform across + fuels, stays on the receipt beside the total. Recorded in the stage + evidence; nothing is gated on it. """ parameters = uprating_operation(stage) @@ -738,9 +792,13 @@ def receipts(category: str) -> float: cars, total = receipts(UK_OBR_CARS_CATEGORY), receipts(UK_OBR_TOTAL_CATEGORY) cars_share = cars / total - for entry in fuels.values(): + desnz = desnz_cars_share_by_fuel(to_period) + for column, entry in fuels.items(): + fuel = UK_LITRES_AUDIT_FUELS[column] + entry["desnz_cars_share"] = desnz[fuel]["cars_share"] + entry["desnz_ktoe_by_vehicle"] = desnz[fuel]["ktoe_by_vehicle"] entry["cars_litres_benchmark"] = ( - entry["hmrc_litres_all_road_users"] * cars_share + entry["hmrc_litres_all_road_users"] * desnz[fuel]["cars_share"] ) entry["frame_over_cars_benchmark"] = ( entry["frame_litres"] / entry["cars_litres_benchmark"] @@ -749,10 +807,14 @@ def receipts(category: str) -> float: ) frame_total = sum(entry["frame_litres"] for entry in fuels.values()) benchmark_total = sum(entry["cars_litres_benchmark"] for entry in fuels.values()) + obr_benchmark_total = cars_share * sum( + entry["hmrc_litres_all_road_users"] for entry in fuels.values() + ) return { "resource": resource, "period_value": to_period, "fiscal_start": f"{to_period}-04-01", + "cars_share_resource": UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE, "obr_fuel_duty_receipts": { "cars_gbp": cars, "total_gbp": total, @@ -764,10 +826,9 @@ def receipts(category: str) -> float: "frame_over_cars_benchmark": ( frame_total / benchmark_total if benchmark_total > 0 else None ), - # The per-fuel ratios apply the all-fuel cars share to each fuel's - # all-road-user litres, but diesel is mostly vans and lorries, so - # only the total is a benchmark (microcosm#1113; a per-fuel cars - # split waits on PolicyEngine/chronicle#322). + "frame_over_obr_uniform_cars_benchmark": ( + frame_total / obr_benchmark_total if obr_benchmark_total > 0 else None + ), "per_fuel_ratio_basis": UK_LITRES_AUDIT_PER_FUEL_BASIS, "gated": False, } diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index 6317674d69..1c41f30427 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -997,6 +997,7 @@ def test_spi_spine_adds_no_country_package_resources(self) -> None: "devolved_bus_finance.json", "orr_rail_facts.json", "ons_household_expenditure_facts.json", + "desnz_road_fuel_by_vehicle.json", "dft_bus_journeys.json", "nts_trip_rates.json", "nts_car_availability.json", @@ -1122,6 +1123,7 @@ def test_uk_package_loads(self) -> None: "devolved_bus_finance.json", "orr_rail_facts.json", "ons_household_expenditure_facts.json", + "desnz_road_fuel_by_vehicle.json", "dft_bus_journeys.json", "nts_trip_rates.json", "nts_car_availability.json", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index 166550f808..7156739c40 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -961,17 +961,38 @@ def test_fuel_litres_audit_reads_the_vendored_prices_litres_and_obr_split() -> N assert audit["obr_fuel_duty_receipts"]["cars_share"] == pytest.approx( 14.4 / 24.7, abs=1e-3 ) - assert petrol["cars_litres_benchmark"] == pytest.approx( - hmrc * audit["obr_fuel_duty_receipts"]["cars_share"] + # Each fuel's benchmark is its HMRC litres times the cars share of that + # fuel's road use (DESNZ, by vehicle and fuel; PolicyEngine/chronicle#322). + desnz = vendored_rows( + "desnz_road_fuel_by_vehicle.json", + concept="desnz.road_transport.fuel_consumption", + period_type="calendar_year", + period_value=2024, + geography_id="K02000001", ) + petrol_rows = { + r["dimensions"]["vehicle_type"]: float(r["value"]) + for r in desnz + if r["dimensions"]["fuel"] == "petrol" + } + share = petrol_rows["cars"] / sum(petrol_rows.values()) + assert petrol["desnz_cars_share"] == pytest.approx(share) + assert petrol["cars_litres_benchmark"] == pytest.approx(hmrc * share) assert petrol["frame_over_cars_benchmark"] == pytest.approx( petrol["frame_litres"] / petrol["cars_litres_benchmark"] ) + diesel = audit["fuels"]["diesel_spending"] + # Diesel is mostly vans and lorries, so its cars share is far below petrol's. + assert diesel["desnz_cars_share"] < petrol["desnz_cars_share"] assert set(audit["fuels"]) == {"petrol_spending", "diesel_spending"} assert audit["gated"] is False - # Only the total compares like with like (#1113). - assert audit["per_fuel_ratio_basis"] == ( - "uniform cars share, not a per-fuel benchmark" + assert audit["per_fuel_ratio_basis"] == "desnz cars share of each fuel's road use" + assert audit["frame_over_obr_uniform_cars_benchmark"] == pytest.approx( + audit["frame_litres_total"] + / ( + audit["obr_fuel_duty_receipts"]["cars_share"] + * (hmrc + diesel["hmrc_litres_all_road_users"]) + ) ) class Stage: From 3ed090d03845d20eeb22317b4c2db1a2bf0532b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 9 Oct 2026 13:31:34 +0100 Subject: [PATCH 13/18] Regenerate the charter-H2 UK spine fixture for #1113 The fixture moves once, at the branch head, for every stage change above. - The bundle gains the lcfs_consumption steps: redraw_zero_road_fuel, level_road_fuel and recompose_from_remainder. It also gains the calendar-2024 energy and bus-fare parameters, the ONS and DESNZ artifact roles, and the updated source and notes text. - The synthetic LCFS donor gains c72213, the other motor fuels whose donor share level_road_fuel nets from ONS 07.2.2. It is added after the positional columns, so no other synthetic value moves. - In the graph JSON only stage_contract_sha256 moves: for lcfs_consumption and for the ten stages that declare a vendored resource the 1ee7dfe re-pin restamped. Co-Authored-By: Claude Opus 5.5 --- .../parity/uk_spine/sources/fixture.json | 113 ++++++++++++++- .../uk_spine/sources/lcfs_household.csv | 130 +++++++++--------- .../fixtures/parity/uk_spine/uk_spine.json | 2 +- tools/graph_uk_spine_fixture.py | 3 + 4 files changed, 178 insertions(+), 70 deletions(-) diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json index 02e940a6a0..ebed2d4c3b 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json @@ -3451,6 +3451,18 @@ "kind": "public_aggregate_reference", "resource": "devolved_bus_finance.json", "role": "devolved_bus_finance" + }, + { + "format": "json", + "kind": "public_aggregate_reference", + "resource": "ons_household_expenditure_facts.json", + "role": "ons_household_expenditure_facts" + }, + { + "format": "json", + "kind": "public_aggregate_reference", + "resource": "desnz_road_fuel_by_vehicle.json", + "role": "desnz_road_fuel_by_vehicle" } ], "grain": "household", @@ -3475,7 +3487,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (Mar\u00eda's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the FY2024-25 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four FY2024-25 quarters; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095).", + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (Mar\u00eda's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.", "operations": [ { "annualization_weeks": 52.17857142857143, @@ -3719,14 +3731,15 @@ "disconnect_rule": "identity_uniform_order", "gas_connected": "published_meter_share", "kind": "price_domestic_energy", - "level_fiscal_start": "2024-04-01", + "level_period_type": "calendar_year", + "level_period_value": 2024, "level_resource": "desnz_domestic_energy_facts.json", "level_temperature_adjustment": "actual_temperature", "margins_period_value": 2024, "margins_resource": "need_energy_facts.json", "metering_arrangement": "standard", "payment_method": "all", - "period_type": "fiscal_year", + "period_type": "calendar_year", "period_value": 2024, "resource": "qep_energy_prices.json", "seed": 0, @@ -3760,6 +3773,12 @@ "E12000008", "E12000009" ], + "price_index": { + "concept": "dft.local_bus_fares_index", + "frequency": "quarterly", + "geography_id": "E12000007", + "resource": "dft_bus_value_anchors.json" + }, "receipts": { "concept": "dft.local_bus_passenger_fare_receipts", "geography_id": "E12000007", @@ -3795,6 +3814,12 @@ "E12000008", "E12000009" ], + "price_index": { + "concept": "dft.local_bus_fares_index", + "frequency": "quarterly", + "geography_id": "dft:england_outside_london", + "resource": "dft_bus_value_anchors.json" + }, "receipts": { "concept": "dft.local_bus_passenger_fare_receipts", "geography_id": "dft:england_outside_london", @@ -3833,6 +3858,12 @@ "population_geography_ids": [ "S92000003" ], + "price_index": { + "concept": "scotgov.bus.local_fare_index", + "frequency": "annual", + "geography_id": "S92000003", + "resource": "devolved_bus_finance.json" + }, "receipts": { "concept": "scotgov.bus.operator_revenue", "dimension_values": { @@ -3871,6 +3902,13 @@ "population_geography_ids": [ "N92000002" ], + "price_index": { + "basis": "england_index_as_proxy", + "concept": "dft.local_bus_fares_index", + "frequency": "quarterly", + "geography_id": "E92000001", + "resource": "dft_bus_value_anchors.json" + }, "receipts": { "concept": "dfi_ni.translink_bus.passenger_receipts", "resource": "devolved_bus_finance.json", @@ -3895,6 +3933,7 @@ "kind": "price_bus_journeys", "population_period_value": 2024, "population_resource": "dft_bus_journeys.json", + "price_year": 2024, "scope_translation": "operator receipts carry interchange boardings, non-resident and business payers, and London contactless is not separated, so the yield is per resident trip, not a fare; Wales publishes journeys but no receipts and keeps the chain's raw draw clipped to donor support", "trip_rates_period_value": 2024, "trip_rates_resource": "dft_bus_value_anchors.json", @@ -3923,6 +3962,72 @@ "condition": "has_fuel_consumption == false", "kind": "zero_when_false" }, + { + "columns": [ + "petrol_spending", + "diesel_spending" + ], + "flag": "has_fuel_consumption", + "kind": "redraw_zero_road_fuel", + "n_estimators": 100, + "rule": "positive_total_then_petrol_share", + "salt": "lcfs_positive_road_fuel", + "seed": 0 + }, + { + "coicop": "07.2.2", + "columns": [ + "petrol_spending", + "diesel_spending" + ], + "concept": "ons.household_expenditure.personal_transport_fuels_lubricants", + "kind": "level_road_fuel", + "other_fuels_codes": [ + "c72213" + ], + "other_fuels_rule": "lcfs_donor_other_fuels_share", + "period_type": "calendar_year", + "period_value": 2024, + "resource": "ons_household_expenditure_facts.json" + }, + { + "kind": "recompose_from_remainder", + "parents": { + "housing_water_and_electricity_consumption": { + "components": [ + "electricity_consumption", + "gas_consumption" + ], + "drawn_subtracts": [ + "domestic_energy_consumption" + ] + }, + "transport_consumption": { + "components": [ + "petrol_spending", + "diesel_spending" + ], + "drawn_subtracts": [ + "petrol_spending", + "diesel_spending" + ] + } + }, + "uncarried": { + "classes": [ + { + "coicop": "04.5.3", + "concept": "ons.household_expenditure.liquid_fuels" + }, + { + "coicop": "04.5.4", + "concept": "ons.household_expenditure.solid_fuels" + } + ], + "period_value": 2024, + "resource": "ons_household_expenditure_facts.json" + } + }, { "declared_factor": 1, "entity": "household", @@ -3953,7 +4058,7 @@ "has_fuel_consumption" ], "rewrites": [], - "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", + "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "stage": "lcfs_consumption", "survey": "Living Costs and Food Survey 2023-24" }, diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/lcfs_household.csv b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/lcfs_household.csv index 2da931d093..3de97526b1 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/lcfs_household.csv +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/lcfs_household.csv @@ -1,65 +1,65 @@ -case,g018,g019,gorx,a124,p389p,p344p,weighta,a122,a121,b226,b489,b490,p537,p601,p602,p603,p604,p605,p606,p607,p608,p609,p610,p611,p612,c72211,c72212,c73212,c73213,c73214 -1,1,0,1,0,100,150,1,1,1,6,2,1,10,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,0,0 -2,2,1,2,1,110,160,1.1000000000000001,2,2,7,3,2,11,1.1000000000000001,2.1000000000000001,3.1000000000000001,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001 -3,3,2,3,2,120,170,1.2,3,3,8,4,3,12,1.2,2.2000000000000002,3.2000000000000002,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999 -4,1,0,4,3,130,180,1.3,4,4,6,5,4,13,1.3,2.2999999999999998,3.2999999999999998,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,0,0,0 -5,2,1,5,0,140,190,1.3999999999999999,5,5,7,6,1,14,1.3999999999999999,2.3999999999999999,3.3999999999999999,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999 -6,3,2,6,1,150,200,1.5,6,6,8,2,2,15,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5 -7,1,0,7,2,160,210,1.6000000000000001,7,7,6,3,3,16,1.6000000000000001,2.6000000000000001,3.6000000000000001,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,0,0,0 -8,2,1,8,3,170,220,1,8,8,7,4,4,17,1.7,2.7000000000000002,3.7000000000000002,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999 -9,3,2,9,0,180,230,1.1000000000000001,1,1,8,5,1,18,1.8,2.7999999999999998,3.7999999999999998,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001 -10,1,0,10,1,190,240,1.2,2,2,6,6,2,19,1.8999999999999999,2.8999999999999999,3.8999999999999999,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,0,0,0 -11,2,1,11,2,200,250,1.3,3,3,7,2,3,20,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 -12,3,2,12,3,210,260,1.3999999999999999,4,4,8,3,4,21,2.1000000000000001,3.1000000000000001,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001 -13,1,0,1,0,220,270,1.5,5,5,6,4,1,22,2.2000000000000002,3.2000000000000002,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,0,0,0 -14,2,1,2,1,230,280,1.6000000000000001,6,6,7,5,2,23,2.2999999999999998,3.2999999999999998,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001 -15,3,2,3,2,240,290,1,7,7,8,6,3,24,2.3999999999999999,3.3999999999999999,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999 -16,1,0,4,3,250,300,1.1000000000000001,8,8,6,2,4,25,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,0,0,0 -17,2,1,5,0,260,310,1.2,1,1,7,3,1,26,2.6000000000000001,3.6000000000000001,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001 -18,3,2,6,1,270,320,1.3,2,2,8,4,2,27,2.7000000000000002,3.7000000000000002,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999 -19,1,0,7,2,280,330,1.3999999999999999,3,3,6,5,3,28,2.7999999999999998,3.7999999999999998,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,0,0,0 -20,2,1,8,3,290,340,1.5,4,4,7,6,4,29,2.8999999999999999,3.8999999999999999,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999 -21,3,2,9,0,300,350,1.6000000000000001,5,5,8,2,1,30,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 -22,1,0,10,1,310,360,1,6,6,6,3,2,31,3.1000000000000001,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,0,0,0 -23,2,1,11,2,320,370,1.1000000000000001,7,7,7,4,3,32,3.2000000000000002,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999 -24,3,2,12,3,330,380,1.2,8,8,8,5,4,33,3.2999999999999998,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001 -25,1,0,1,0,340,390,1.3,1,1,6,6,1,34,3.3999999999999999,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,0,0,0 -26,2,1,2,1,350,400,1.3999999999999999,2,2,7,2,2,35,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5 -27,3,2,3,2,360,410,1.5,3,3,8,3,3,36,3.6000000000000001,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001,19.600000000000001 -28,1,0,4,3,370,420,1.6000000000000001,4,4,6,4,4,37,3.7000000000000002,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,0,0,0 -29,2,1,5,0,380,430,1,5,5,7,5,1,38,3.7999999999999998,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,19.800000000000001 -30,3,2,6,1,390,440,1.1000000000000001,6,6,8,6,2,39,3.8999999999999999,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999,19.899999999999999 -31,1,0,7,2,400,450,1.2,7,7,6,2,3,40,4,5,6,7,8,9,10,11,12,13,14,15,16,17,0,0,0 -32,2,1,8,3,410,460,1.3,8,8,7,3,4,41,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,20.100000000000001 -33,3,2,9,0,420,470,1.3999999999999999,1,1,8,4,1,42,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999,20.199999999999999 -34,1,0,10,1,430,480,1.5,2,2,6,5,2,43,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,0,0,0 -35,2,1,11,2,440,490,1.6000000000000001,3,3,7,6,3,44,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999,19.399999999999999,20.399999999999999 -36,3,2,12,3,450,500,1,4,4,8,2,4,45,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,20.5 -37,1,0,1,0,460,510,1.1000000000000001,5,5,6,3,1,46,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,0,0,0 -38,2,1,2,1,470,520,1.2,6,6,7,4,2,47,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999,19.699999999999999,20.699999999999999 -39,3,2,3,2,480,530,1.3,7,7,8,5,3,48,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,19.800000000000001,20.800000000000001 -40,1,0,4,3,490,540,1.3999999999999999,8,8,6,6,4,49,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,0,0,0 -41,2,1,5,0,500,550,1.5,1,1,7,2,1,50,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 -42,3,2,6,1,510,560,1.6000000000000001,2,2,8,3,2,51,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,20.100000000000001,21.100000000000001 -43,1,0,7,2,520,570,1,3,3,6,4,3,52,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,0,0,0 -44,2,1,8,3,530,580,1.1000000000000001,4,4,7,5,4,53,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001,20.300000000000001,21.300000000000001 -45,3,2,9,0,540,590,1.2,5,5,8,6,1,54,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999,19.399999999999999,20.399999999999999,21.399999999999999 -46,1,0,10,1,550,600,1.3,6,6,6,2,2,55,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,0,0,0 -47,2,1,11,2,560,610,1.3999999999999999,7,7,7,3,3,56,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001,19.600000000000001,20.600000000000001,21.600000000000001 -48,3,2,12,3,570,620,1.5,8,8,8,4,4,57,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999,19.699999999999999,20.699999999999999,21.699999999999999 -49,1,0,1,0,580,630,1.6000000000000001,1,1,6,5,1,58,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,0,0,0 -50,2,1,2,1,590,640,1,2,2,7,6,2,59,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999,19.899999999999999,20.899999999999999,21.899999999999999 -51,3,2,3,2,600,650,1.1000000000000001,3,3,8,2,3,60,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 -52,1,0,4,3,610,660,1.2,4,4,6,3,4,61,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,0,0,0 -53,2,1,5,0,620,670,1.3,5,5,7,4,1,62,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999,20.199999999999999,21.199999999999999,22.199999999999999 -54,3,2,6,1,630,680,1.3999999999999999,6,6,8,5,2,63,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001,20.300000000000001,21.300000000000001,22.300000000000001 -55,1,0,7,2,640,690,1.5,7,7,6,6,3,64,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999,19.399999999999999,0,0,0 -56,2,1,8,3,650,700,1.6000000000000001,8,8,7,2,4,65,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,20.5,21.5,22.5 -57,3,2,9,0,660,710,1,1,1,8,3,1,66,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001,19.600000000000001,20.600000000000001,21.600000000000001,22.600000000000001 -58,1,0,10,1,670,720,1.1000000000000001,2,2,6,4,2,67,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999,19.699999999999999,0,0,0 -59,2,1,11,2,680,730,1.2,3,3,7,5,3,68,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,19.800000000000001,20.800000000000001,21.800000000000001,22.800000000000001 -60,3,2,12,3,690,740,1.3,4,4,8,6,4,69,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999,19.899999999999999,20.899999999999999,21.899999999999999,22.899999999999999 -61,1,0,1,0,700,750,1.3999999999999999,5,5,6,2,1,70,7,8,9,10,11,12,13,14,15,16,17,18,19,20,0,0,0 -62,2,1,2,1,710,760,1.5,6,6,7,3,2,71,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,20.100000000000001,21.100000000000001,22.100000000000001,23.100000000000001 -63,3,2,3,2,720,770,1.6000000000000001,7,7,8,4,3,72,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999,20.199999999999999,21.199999999999999,22.199999999999999,23.199999999999999 -64,1,0,4,3,730,780,1,8,8,6,5,4,73,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001,20.300000000000001,0,0,0 +case,g018,g019,gorx,a124,p389p,p344p,weighta,a122,a121,b226,b489,b490,p537,p601,p602,p603,p604,p605,p606,p607,p608,p609,p610,p611,p612,c72211,c72212,c73212,c73213,c73214,c72213 +1,1,0,1,0,100,150,1,1,1,6,2,1,10,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,0,0,0.5 +2,2,1,2,1,110,160,1.1000000000000001,2,2,7,3,2,11,1.1000000000000001,2.1000000000000001,3.1000000000000001,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,0 +3,3,2,3,2,120,170,1.2,3,3,8,4,3,12,1.2,2.2000000000000002,3.2000000000000002,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,0 +4,1,0,4,3,130,180,1.3,4,4,6,5,4,13,1.3,2.2999999999999998,3.2999999999999998,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,0,0,0,0 +5,2,1,5,0,140,190,1.3999999999999999,5,5,7,6,1,14,1.3999999999999999,2.3999999999999999,3.3999999999999999,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,0 +6,3,2,6,1,150,200,1.5,6,6,8,2,2,15,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,0.5 +7,1,0,7,2,160,210,1.6000000000000001,7,7,6,3,3,16,1.6000000000000001,2.6000000000000001,3.6000000000000001,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,0,0,0,0 +8,2,1,8,3,170,220,1,8,8,7,4,4,17,1.7,2.7000000000000002,3.7000000000000002,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,0 +9,3,2,9,0,180,230,1.1000000000000001,1,1,8,5,1,18,1.8,2.7999999999999998,3.7999999999999998,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,0 +10,1,0,10,1,190,240,1.2,2,2,6,6,2,19,1.8999999999999999,2.8999999999999999,3.8999999999999999,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,0,0,0,0 +11,2,1,11,2,200,250,1.3,3,3,7,2,3,20,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,0.5 +12,3,2,12,3,210,260,1.3999999999999999,4,4,8,3,4,21,2.1000000000000001,3.1000000000000001,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,0 +13,1,0,1,0,220,270,1.5,5,5,6,4,1,22,2.2000000000000002,3.2000000000000002,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,0,0,0,0 +14,2,1,2,1,230,280,1.6000000000000001,6,6,7,5,2,23,2.2999999999999998,3.2999999999999998,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,0 +15,3,2,3,2,240,290,1,7,7,8,6,3,24,2.3999999999999999,3.3999999999999999,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999,0 +16,1,0,4,3,250,300,1.1000000000000001,8,8,6,2,4,25,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,0,0,0,0.5 +17,2,1,5,0,260,310,1.2,1,1,7,3,1,26,2.6000000000000001,3.6000000000000001,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001,0 +18,3,2,6,1,270,320,1.3,2,2,8,4,2,27,2.7000000000000002,3.7000000000000002,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999,0 +19,1,0,7,2,280,330,1.3999999999999999,3,3,6,5,3,28,2.7999999999999998,3.7999999999999998,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,0,0,0,0 +20,2,1,8,3,290,340,1.5,4,4,7,6,4,29,2.8999999999999999,3.8999999999999999,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999,0 +21,3,2,9,0,300,350,1.6000000000000001,5,5,8,2,1,30,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0.5 +22,1,0,10,1,310,360,1,6,6,6,3,2,31,3.1000000000000001,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,0,0,0,0 +23,2,1,11,2,320,370,1.1000000000000001,7,7,7,4,3,32,3.2000000000000002,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999,0 +24,3,2,12,3,330,380,1.2,8,8,8,5,4,33,3.2999999999999998,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001,0 +25,1,0,1,0,340,390,1.3,1,1,6,6,1,34,3.3999999999999999,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,0,0,0,0 +26,2,1,2,1,350,400,1.3999999999999999,2,2,7,2,2,35,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,0.5 +27,3,2,3,2,360,410,1.5,3,3,8,3,3,36,3.6000000000000001,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001,19.600000000000001,0 +28,1,0,4,3,370,420,1.6000000000000001,4,4,6,4,4,37,3.7000000000000002,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,0,0,0,0 +29,2,1,5,0,380,430,1,5,5,7,5,1,38,3.7999999999999998,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,19.800000000000001,0 +30,3,2,6,1,390,440,1.1000000000000001,6,6,8,6,2,39,3.8999999999999999,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999,19.899999999999999,0 +31,1,0,7,2,400,450,1.2,7,7,6,2,3,40,4,5,6,7,8,9,10,11,12,13,14,15,16,17,0,0,0,0.5 +32,2,1,8,3,410,460,1.3,8,8,7,3,4,41,4.0999999999999996,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,20.100000000000001,0 +33,3,2,9,0,420,470,1.3999999999999999,1,1,8,4,1,42,4.2000000000000002,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999,20.199999999999999,0 +34,1,0,10,1,430,480,1.5,2,2,6,5,2,43,4.2999999999999998,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,0,0,0,0 +35,2,1,11,2,440,490,1.6000000000000001,3,3,7,6,3,44,4.4000000000000004,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999,19.399999999999999,20.399999999999999,0 +36,3,2,12,3,450,500,1,4,4,8,2,4,45,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,20.5,0.5 +37,1,0,1,0,460,510,1.1000000000000001,5,5,6,3,1,46,4.5999999999999996,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,0,0,0,0 +38,2,1,2,1,470,520,1.2,6,6,7,4,2,47,4.7000000000000002,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999,19.699999999999999,20.699999999999999,0 +39,3,2,3,2,480,530,1.3,7,7,8,5,3,48,4.7999999999999998,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,19.800000000000001,20.800000000000001,0 +40,1,0,4,3,490,540,1.3999999999999999,8,8,6,6,4,49,4.9000000000000004,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,0,0,0,0 +41,2,1,5,0,500,550,1.5,1,1,7,2,1,50,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,0.5 +42,3,2,6,1,510,560,1.6000000000000001,2,2,8,3,2,51,5.0999999999999996,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,20.100000000000001,21.100000000000001,0 +43,1,0,7,2,520,570,1,3,3,6,4,3,52,5.2000000000000002,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,0,0,0,0 +44,2,1,8,3,530,580,1.1000000000000001,4,4,7,5,4,53,5.2999999999999998,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001,20.300000000000001,21.300000000000001,0 +45,3,2,9,0,540,590,1.2,5,5,8,6,1,54,5.4000000000000004,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999,19.399999999999999,20.399999999999999,21.399999999999999,0 +46,1,0,10,1,550,600,1.3,6,6,6,2,2,55,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,0,0,0,0.5 +47,2,1,11,2,560,610,1.3999999999999999,7,7,7,3,3,56,5.5999999999999996,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001,19.600000000000001,20.600000000000001,21.600000000000001,0 +48,3,2,12,3,570,620,1.5,8,8,8,4,4,57,5.7000000000000002,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999,19.699999999999999,20.699999999999999,21.699999999999999,0 +49,1,0,1,0,580,630,1.6000000000000001,1,1,6,5,1,58,5.7999999999999998,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,0,0,0,0 +50,2,1,2,1,590,640,1,2,2,7,6,2,59,5.9000000000000004,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999,19.899999999999999,20.899999999999999,21.899999999999999,0 +51,3,2,3,2,600,650,1.1000000000000001,3,3,8,2,3,60,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,0.5 +52,1,0,4,3,610,660,1.2,4,4,6,3,4,61,6.0999999999999996,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,0,0,0,0 +53,2,1,5,0,620,670,1.3,5,5,7,4,1,62,6.2000000000000002,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999,20.199999999999999,21.199999999999999,22.199999999999999,0 +54,3,2,6,1,630,680,1.3999999999999999,6,6,8,5,2,63,6.2999999999999998,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001,20.300000000000001,21.300000000000001,22.300000000000001,0 +55,1,0,7,2,640,690,1.5,7,7,6,6,3,64,6.4000000000000004,7.4000000000000004,8.4000000000000004,9.4000000000000004,10.4,11.4,12.4,13.4,14.4,15.4,16.399999999999999,17.399999999999999,18.399999999999999,19.399999999999999,0,0,0,0 +56,2,1,8,3,650,700,1.6000000000000001,8,8,7,2,4,65,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,20.5,21.5,22.5,0.5 +57,3,2,9,0,660,710,1,1,1,8,3,1,66,6.5999999999999996,7.5999999999999996,8.5999999999999996,9.5999999999999996,10.6,11.6,12.6,13.6,14.6,15.6,16.600000000000001,17.600000000000001,18.600000000000001,19.600000000000001,20.600000000000001,21.600000000000001,22.600000000000001,0 +58,1,0,10,1,670,720,1.1000000000000001,2,2,6,4,2,67,6.7000000000000002,7.7000000000000002,8.6999999999999993,9.6999999999999993,10.699999999999999,11.699999999999999,12.699999999999999,13.699999999999999,14.699999999999999,15.699999999999999,16.699999999999999,17.699999999999999,18.699999999999999,19.699999999999999,0,0,0,0 +59,2,1,11,2,680,730,1.2,3,3,7,5,3,68,6.7999999999999998,7.7999999999999998,8.8000000000000007,9.8000000000000007,10.800000000000001,11.800000000000001,12.800000000000001,13.800000000000001,14.800000000000001,15.800000000000001,16.800000000000001,17.800000000000001,18.800000000000001,19.800000000000001,20.800000000000001,21.800000000000001,22.800000000000001,0 +60,3,2,12,3,690,740,1.3,4,4,8,6,4,69,6.9000000000000004,7.9000000000000004,8.9000000000000004,9.9000000000000004,10.9,11.9,12.9,13.9,14.9,15.9,16.899999999999999,17.899999999999999,18.899999999999999,19.899999999999999,20.899999999999999,21.899999999999999,22.899999999999999,0 +61,1,0,1,0,700,750,1.3999999999999999,5,5,6,2,1,70,7,8,9,10,11,12,13,14,15,16,17,18,19,20,0,0,0,0.5 +62,2,1,2,1,710,760,1.5,6,6,7,3,2,71,7.0999999999999996,8.0999999999999996,9.0999999999999996,10.1,11.1,12.1,13.1,14.1,15.1,16.100000000000001,17.100000000000001,18.100000000000001,19.100000000000001,20.100000000000001,21.100000000000001,22.100000000000001,23.100000000000001,0 +63,3,2,3,2,720,770,1.6000000000000001,7,7,8,4,3,72,7.2000000000000002,8.1999999999999993,9.1999999999999993,10.199999999999999,11.199999999999999,12.199999999999999,13.199999999999999,14.199999999999999,15.199999999999999,16.199999999999999,17.199999999999999,18.199999999999999,19.199999999999999,20.199999999999999,21.199999999999999,22.199999999999999,23.199999999999999,0 +64,1,0,4,3,730,780,1,8,8,6,5,4,73,7.2999999999999998,8.3000000000000007,9.3000000000000007,10.300000000000001,11.300000000000001,12.300000000000001,13.300000000000001,14.300000000000001,15.300000000000001,16.300000000000001,17.300000000000001,18.300000000000001,19.300000000000001,20.300000000000001,0,0,0,0 diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json index c7e42b54e0..b561cffbe8 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json @@ -1 +1 @@ -{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"d1af0febbf2dfd0448e22441f0378d7574cad860b35b0a1497da70f30b41f828","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"e840b69cb05b5cbb76b97b4fcb296244ea843a005e4882459c7132664bb526c2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"8cfab42bcc250fdf1161b22e4fd988fbe8a0473af78f99afea4b1017556633ae","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"d197d6fc2f9dc5918a26ef555d3d2934419f0a9a21ffa2e17379958c692e583d","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"70974ecb9e1a2ac495e0c95e6ccb8b08dfc8e7c5381a0026f470557e28065bf2","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","uc_is_in_startup_period"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"59767eeb246755f4636e2abbbc9ab3370a64c6142e01cda21a12cb01be95e535","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"a29b6ab88ad58d44d4a9b51642b080fffd44223d7d129688b4ac3de71ad58f16","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"a9ed8bb2f260e7ffa395de3eb5b0b4a6d26d9fed8a6f0758e827a56fdb0d3eab","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"a81e4cd867f0215836e2e1cf45dee0735ae7354c6d58e597072836475dabf841","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"e2f10f92da81cafd34107b5eb6d0b82f1b9496e8c1de8afde1ff1c28e06fa300","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"2e229a7a31234c493b326b073a84d54f94fbd148a098f05246fb68f20b0f4df1","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"84e898795548080224fc26aef98479c5d56efbcc2004050700afe3790e1b1650","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"5e28e14d1e1c0a422651c981b12f1c2adbdaaf0346d93d2e22a15c91e633e32b","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"30b37e1c4e122db18391c5f76f1a6d432aea970275bcda7a52126dacc923490b","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"ff740a36b03dcda73b889aa43bde7cff5d178de7b3da38e487320c68342bf9a3","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"f2929ed74bed3f9e4456379a1169cf029893be5b971f3e68a3847219cd4e58aa","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"826e18043928f5dea5ab9fc128f737a3c6978c23cb61c789ce41b9ecb2d34263","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} +{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"d1af0febbf2dfd0448e22441f0378d7574cad860b35b0a1497da70f30b41f828","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"e840b69cb05b5cbb76b97b4fcb296244ea843a005e4882459c7132664bb526c2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"3fe686f6bc229e1eb5a6f8c83abed7b2901e6da6177cd359a946a4390edef7ca","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"ed88ba4df1455d844db1728bb13b0872952d1fdf38ea3033ddf982638ec144c5","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"a3fae94093581eebf304f4e11afc3887073963715a6e7096548fe1842423dfc0","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","uc_is_in_startup_period"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"22df3ad75657541267ec55d83794a202551c5e12ae2a13125c7afa5f5d2d6a20","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"6b851a607103c6787daa96b428dad26248449f066c3446338451cdf0bbb3eda6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"a9ed8bb2f260e7ffa395de3eb5b0b4a6d26d9fed8a6f0758e827a56fdb0d3eab","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"e9b3c37d2674f85c5c9d7aa24f42e374cb8a43f6996ee51cb1858e9936cbe02b","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"e2f10f92da81cafd34107b5eb6d0b82f1b9496e8c1de8afde1ff1c28e06fa300","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"2e229a7a31234c493b326b073a84d54f94fbd148a098f05246fb68f20b0f4df1","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"84e898795548080224fc26aef98479c5d56efbcc2004050700afe3790e1b1650","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"9ac7181cd0284afaaf5d5fddf372a0426f83dd1750c20a05fb436aa675b1b6e4","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"8f6bce3829a002b4d51321d7025005a98513c5d853eac836e4700a4fd2282dfb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"4092b9fc6a21272f706a7bfb8875f6ec5cc78504e95536fe43e000969b3cc811","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"d1623febd3bc05e735fc26083eac917cf42a7f9604156d8ac0a2c69e5c112ce5","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"369d7d90f8013a2a9a1692b89a89308ac2d70f3ffd241531a93e2da895b44e80","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} diff --git a/tools/graph_uk_spine_fixture.py b/tools/graph_uk_spine_fixture.py index dd4f92a228..45d482ce65 100644 --- a/tools/graph_uk_spine_fixture.py +++ b/tools/graph_uk_spine_fixture.py @@ -869,6 +869,9 @@ def _lcfs_donors() -> tuple[pd.DataFrame, pd.DataFrame]: # must reach zero or every non-user recipient would clip low. for source in BUS_FARE_LCFS_CODES: household[source] = np.where(rows.astype(int) % 3 == 0, 0.0, household[source]) + # Other motor fuels (c72213): the level_road_fuel step nets the donor's own + # share of them from ONS 07.2.2 (microcosm#1113), so a few diaries buy some. + household["c72213"] = np.where(rows.astype(int) % 5 == 0, 0.5, 0.0) person = pd.DataFrame( { "case": np.arange(1, _DONOR_ROWS + 1), From 2e32d7bd9cbf2ccad82dd9a8ae320001dc645c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 9 Oct 2026 13:32:28 +0100 Subject: [PATCH 14/18] Record the Group B receipts (#1113) The receipts gain B1 to B3 and the fixture commit, plus the stage-only run at B3: all seven lcfs gates pass, and the Group A figures hold. - Division capture: the frame's twelve divisions are 72.8% of ONS's survey scope for 2024, against 58.5% for the donor's own diary. Housing reads 1.059, GBP 8.0bn of its excess being D1's energy level. Furnishings read 1.251: the frame draws 66% more per household than the donor. - Litres audit: petrol reads 1.011 of its cars benchmark and diesel 0.709. The total is 0.894, against 0.951 on the OBR cars share. Co-Authored-By: Claude Opus 5.5 --- .../1113-consumption-tax-levels-receipts.md | 83 +++++++++++++++---- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/experiments/1113-consumption-tax-levels-receipts.md b/experiments/1113-consumption-tax-levels-receipts.md index 496d25887f..27c5521ee1 100644 --- a/experiments/1113-consumption-tax-levels-receipts.md +++ b/experiments/1113-consumption-tax-levels-receipts.md @@ -3,35 +3,49 @@ Plan: `repos/microcosm-vat-fuel-energy-implementation-plan.md` (María's rulings of 2026-10-08: D1 DESNZ volume at QEP prices stays the energy level, D2 the stage sets the road-fuel level and incidence, D3 VAT is held out until the engine factor is split). Covers microcosm#1113 and -microcosm#1123 item 3. Branch `uk-consumption-tax-levels`, off main `75167a688` (#1121 merged), -which locks policyengine-uk 2.122.2 on policyengine-core 3.32.19. +microcosm#1123 item 3. Branch `uk-consumption-tax-levels`, written on main `75167a688` (#1121 +merged) and rebased on main `7f235941c` on 2026-10-09; both lock policyengine-uk 2.122.2 on +policyengine-core 3.32.19. The measurements below ran before the rebase. -Group A needs nothing from PolicyEngine/chronicle#322 and is complete. Group B (Consumer Trends for -every division and the per-fuel cars benchmark) follows once #322 lands. +Group A needs nothing from PolicyEngine/chronicle#322. Group B re-pins the feed to the Chronicle +commit that carries #322's facts (merged as #323), then adds the division capture and the per-fuel +cars benchmark. ## Commits -- A1 `cf2f7f2a4`: `obr.vat`, `ons.household_electricity_expenditure` and +- A1 `26e8e3bb7`: `obr.vat`, `ons.household_electricity_expenditure` and `ons.household_gas_expenditure` move to the measure-exclusion register, measured on every evaluation with `tools/diagnose_uk_consumption_taxes.py`. -- A2 `754e64414`: the `level_road_fuel` step sets petrol plus diesel to ONS Consumer Trends 07.2.2 +- A2 `f7a02a321`: the `level_road_fuel` step sets petrol plus diesel to ONS Consumer Trends 07.2.2 for calendar 2024, less the donor's own other-fuels share (gate `road_fuel_level`). -- A3 `519aef6e2`: the `redraw_zero_road_fuel` step gives every flagged fuel-car household a +- A3 `b609d0767`: the `redraw_zero_road_fuel` step gives every flagged fuel-car household a positive spend (gate `road_fuel_incidence`). -- A4 `c252a1c46`: the contract binds `ons.household_road_fuel_expenditure` (07.2.2, calendar 2025, +- A4 `149fb61b5`: the contract binds `ons.household_road_fuel_expenditure` (07.2.2, calendar 2025, GBP 35.099bn), and `obr.fuel_duties_cars` moves to the register. María confirmed this binding on 2026-10-09. -- A5 `146b8418e`: the `recompose_from_remainder` step writes housing and transport around their +- A5 `8db8d6868`: the `recompose_from_remainder` step writes housing and transport around their levelled parts (gate `recomposed_totals`). -- A8 `d04a72896`: the litres audit labels its per-fuel ratios as a uniform cars share. The plan's - quarterly 04.5.x and 07.2.2 vendoring is dropped, because no code would read it. -- A7 `a7a73638e`: `uk_diagnostics.consumption_drift` reports the stage-levelled totals and shares +- A8 `e3f2a3a58`: the litres audit labels its per-fuel ratios as a uniform cars share. The plan's + quarterly 04.5.x and 07.2.2 vendoring is dropped, because no code would read it. B3 replaces the + label. +- A7 `21a4d3a77`: `uk_diagnostics.consumption_drift` reports the stage-levelled totals and shares at design and final weights. -- A6 `357adc2bf`: every LCFS spend column is at calendar-2024 prices, the H5's year. Energy is +- A6 `ea433d1c5`: every LCFS spend column is at calendar-2024 prices, the H5's year. Energy is priced and levelled for calendar 2024, and bus yields are re-priced to 2024 by fares index. The gate `consumption_basis` holds every level-setting step to that year, so policyengine-uk can project each column from the H5's year with no basis of its own. This replaces the plan's per-column declaration (María's ruling of 2026-10-09). +- B1 `2232d9117`: the feed re-pins to Chronicle `1ee7dfe` (#323, 352,549 rows). No compiled target + value moves on either surface, and the three compile-parity receipts are unchanged. The seven + Consumer Trends series already in the feed come back on ONS's domestic concept under new keys + with the same values. +- B2 `543533a5d`: the stage receipt reports each division's capture of ONS household spending + (`division_capture`, report-only). +- B3 `59339e4ab`: the litres audit benchmarks each fuel against HMRC clearances times DESNZ's cars + share of that fuel's road use. +- `3ed090d03`: the charter-H2 spine fixture, regenerated once at the head. In the graph only the + stage contract hashes move, for `lcfs_consumption` and the ten stages that declare a re-vendored + resource. ## microcosm#1121's head calibration @@ -142,10 +156,43 @@ vehicle-purchase tail, which dominates the remainder once fuel is gone, and the households amplify it. The step therefore keeps each total's own draw and subtracts the chain's draws of its parts, which the chain draws after, and conditional on, the total. +## Group B development run + +The same stage-only run at B3 (`stage_dev_run.group-b.json`, 66 seconds): all seven gates pass, and +every Group A figure above is unchanged apart from the litres audit's total, which B3 re-bases. + +### Division capture (B2) + +Each division's prior-weighted frame total for calendar 2024, against ONS Consumer Trends for 2024 +less the classes a household diary does not record: 02.3 narcotics, 04.2 owner-occupiers' imputed +rent and 12.6.1 FISIM (GBP 350.6bn together). + +- The twelve divisions total GBP 971.4bn against GBP 1,334.6bn in survey scope: 72.8% of ONS's + domestic concept and 72.0% of the national one. The donor's own diary totals GBP 780.7bn at + 2023-24 prices, 58.5% of the same scope. Both sides hold about the same households (29.0m and + 28.5m of weight), so the gap is in the draws per household, which condition on the frame's own + incomes. +- Housing reads 1.059. Of its GBP 9.7bn excess, GBP 8.0bn is D1's energy level: DESNZ volume at + QEP prices (GBP 48.8bn) against ONS 04.5.1 plus 04.5.2 for 2024 (GBP 40.7bn). +- Furnishings (05) read 1.251: the frame draws GBP 95.1bn against ONS's GBP 76.0bn and the + donor's GBP 57.5bn, 66% more per household than the donor. Health (06) is 73% above the donor, + though still 0.586 of ONS. The top 1% of households carry 15% of the frame's furnishings and 18% + of its health spend. That is the shape of the tail over-draw that ruled out drawing the transport + remainder as a chain target, but this run does not test it. +- Education reads 0.085, half the donor's own 0.177: ONS 10 includes tuition financed by student + loans and international students' fees. +- Alcohol and tobacco (0.469), clothing (0.409) and restaurants and hotels (0.457) are the other + low readings. The last also carries non-residents' spending on the domestic concept. + +### Litres audit (B3) + +For 2024 cars burn 97.8% of road petrol and 39.2% of road diesel (DESNZ ktoe). Against HMRC's +fiscal 2024-25 clearances times those shares, the frame's petrol litres read 1.011 and its diesel +litres 0.709. The total reads 0.894, against 0.951 on the OBR cars share of duty receipts (58.3%, +uniform across fuels). The level step keeps the donor's mix (petrol 68.4% of spend), so the diesel +shortfall is the diary's petrol-diesel split against DESNZ's cars. + ## Not run -- The national remeasure (R1) runs once Group B lands, on whatever policyengine-uk Microcosm locks - then. If the VAT, fuel-duty and energy engine fixes are released by then, the lock moves first in - its own PR. -- The charter-H2 graph parity fixture is regenerated at the final head, after Group B's feed - re-pin, which moves it again. +- The national remeasure (R1) runs on whatever policyengine-uk Microcosm locks then. If the VAT, + fuel-duty and energy engine fixes are released by then, the lock moves first in its own PR. From 352310965f323b3e6a7e3b91e4d14c141aa308c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:04:09 +0100 Subject: [PATCH 15/18] Address review round 1 on the consumption-tax levels (#1113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vahid's round-1 pass on #1167 found nothing blocking. This takes its three should-fixes and two nits. María ruled on the first two on 2026-10-10. - The electricity and gas exclusions named the FY2024-25 basis the stage left on 2026-10-09. Their reasons now name calendar 2024 and quote that year beside 2025: ONS is 0.88 of the stage's electricity level and 0.76 of its gas level. The 2025 ratios were already calendar-year. María approved the restatement; each adjudication records it and keeps the decision's date. - The bound road-fuel row's notes record the 0.4% scope offset: the target is all of 07.2.2, and the stage levels to it less the donor's other-fuels share. María ruled that it stays recorded and is not scaled into the target. - The same notes size the domestic concept as far as ONS allows: non-residents' spending in the UK and residents' spending abroad, which Consumer Trends publishes for total spending only and by no class. - The stage notes say policyengine-uk applies the fiscal 2024-25 rules to model year 2024, a quarter after the calendar-2024 prices, and that the diary's 07.2.2 has no line for vehicle electricity. - The stage notes feed source_stages.json, the coverage manifest and the H2 fixture bundle, which are regenerated. No stage contract hash or gate digest moves. Co-Authored-By: Claude Opus 5.5 --- .../1113-consumption-tax-levels-receipts.md | 27 +++++++++++++++ .../uk/calibration_measure_exclusions.json | 8 ++--- .../uk/release_input_coverage_manifest.json | 34 +++++++++---------- .../src/microcosm/build/uk/source_stages.json | 2 +- .../src/microcosm/build/uk/spec/sources.yaml | 2 +- .../build/uk/uk_population_targets.json | 2 +- .../parity/uk_spine/sources/fixture.json | 2 +- 7 files changed, 52 insertions(+), 25 deletions(-) diff --git a/experiments/1113-consumption-tax-levels-receipts.md b/experiments/1113-consumption-tax-levels-receipts.md index 27c5521ee1..5adcf82eae 100644 --- a/experiments/1113-consumption-tax-levels-receipts.md +++ b/experiments/1113-consumption-tax-levels-receipts.md @@ -192,6 +192,33 @@ litres 0.709. The total reads 0.894, against 0.951 on the OBR cars share of duty uniform across fuels). The level step keeps the donor's mix (petrol 68.4% of spend), so the diesel shortfall is the diary's petrol-diesel split against DESNZ's cars. +## Review round 1 (2026-10-10) + +Vahid's round-1 pass on PolicyEngine/microcosm#1167 found nothing blocking. The changes it led to, +with María's rulings of 2026-10-10: + +- **Scope offset on the bound row (ruled: recorded, not scaled).** ONS 07.2.2 carries other motor + fuels and lubricants, 0.37% of the class on the diary. The stage levels petrol plus diesel to + the class less that share, and the target is the full class, so the row reads about 0.4% low + from scope alone. The binding notes record it. +- **Concept of the bound row.** ONS publishes 07.2.2 on the domestic concept. It includes + non-residents' fuel bought in the UK, which the residents-only frame does not hold, and leaves + out residents' fuel bought abroad. Consumer Trends publishes those flows for total spending + only: for 2024, GBP 64.7bn by non-residents in the UK (3.8% of the domestic total) and + GBP 78.9bn by residents abroad. It splits them by no class, so their size for road fuel is not + known and no bridge is applied. +- **Energy exclusions restated (approved).** The two register reasons named the FY2024-25 basis + the stage left on 2026-10-09. They now name calendar 2024 and quote that year beside 2025: ONS + 04.5.1 is GBP 26.10bn against the stage's GBP 29.52bn (0.88), and ONS 04.5.2 is GBP 14.64bn + against GBP 19.23bn (0.76). The 2025 ratios (0.90 and 0.81) were already calendar-year. +- **Model year.** policyengine-uk applies the fiscal 2024-25 rules to model year 2024, sampling + each parameter at 30 April. The spend columns are at calendar-2024 prices, about a quarter + before the midpoint of that policy year. The calibration binds calendar-year facts as published + and fiscal-year facts at the calendar window (María's rule of 2026-09-22). The stage notes say + so. +- **Vehicle electricity.** The diary's 07.2.2 has three lines (c72211, c72212, c72213) and none for + vehicle electricity, so nothing joins the other-fuels share. The stage notes say so. + ## Not run - The national remeasure (R1) runs on whatever policyengine-uk Microcosm locks then. If the VAT, diff --git a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json index 16ac2b52b1..2a1b411255 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json @@ -588,19 +588,19 @@ }, { "name": "ons.household_electricity_expenditure", - "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets electricity spend from DESNZ Energy Trends FY2024-25 domestic volume at QEP FY2024-25 average prices paid (the level the energy_rake gate checks), and ONS Consumer Trends 04.5.1 sits below it on every aligned basis: CY2025 GBP 26.52bn against GBP 29.60bn for Energy Trends volume times QEP unit and fixed costs (0.90), and 1.11 times unit cost alone; meters against households explains about 2 percent. Fitting the row cut electricity 8.6 percent through the weights (82.9 TWh implied against 93.0 TWh on the 2026-09-30 build), and a re-solve with it masked changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", + "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets electricity spend from the DESNZ Energy Trends domestic volume over the four quarters of calendar 2024 at QEP calendar-2024 average prices paid (the level the energy_rake gate checks), and ONS Consumer Trends 04.5.1 sits below it on every aligned basis. For calendar 2024 it is GBP 26.10bn against the stage's GBP 29.52bn on microcosm#1121's head spine (0.88). For calendar 2025 it is GBP 26.52bn against GBP 29.60bn for Energy Trends volume times QEP unit and fixed costs (0.90), and 1.11 times unit cost alone; meters against households explains about 2 percent. Fitting the row cut electricity 8.6 percent through the weights (82.9 TWh implied against 93.0 TWh on the 2026-09-30 build), and a re-solve with it masked changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", "tracking": "microcosm#1113", "approved_by": "juaristi22", - "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. The reason was restated on the calendar-2024 basis on 2026-10-10 with her approval, after her ruling of 2026-10-09 put every LCFS spend column at calendar-2024 prices. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", "approved_on": "2026-10-08", "expires_on": "2027-01-08" }, { "name": "ons.household_gas_expenditure", - "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets gas spend from DESNZ Energy Trends FY2024-25 domestic volume at QEP FY2024-25 average prices paid over the published gas-connected share, and ONS Consumer Trends 04.5.2 sits below it on every aligned basis: CY2025 GBP 15.34bn against GBP 18.94bn for Energy Trends volume times QEP unit and fixed costs (0.81), and below unit cost alone (0.955). Fitting the row cut gas 18.9 percent through the weights and the gas-connected share from 84.5 to 78.9 percent against the DESNZ meter share the stage imposes; a re-solve with it masked kept the share at 84.6 percent and changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", + "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets gas spend from the DESNZ Energy Trends domestic volume over the four quarters of calendar 2024 at QEP calendar-2024 average prices paid over the published gas-connected share, and ONS Consumer Trends 04.5.2 sits below it on every aligned basis. For calendar 2024 it is GBP 14.64bn against the stage's GBP 19.23bn on microcosm#1121's head spine (0.76). For calendar 2025 it is GBP 15.34bn against GBP 18.94bn for Energy Trends volume times QEP unit and fixed costs (0.81), and below unit cost alone (0.955). Fitting the row cut gas 18.9 percent through the weights and the gas-connected share from 84.5 to 78.9 percent against the DESNZ meter share the stage imposes; a re-solve with it masked kept the share at 84.6 percent and changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", "tracking": "microcosm#1113", "approved_by": "juaristi22", - "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. The reason was restated on the calendar-2024 basis on 2026-10-10 with her approval, after her ruling of 2026-10-09 put every LCFS spend column at calendar-2024 prices. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", "approved_on": "2026-10-08", "expires_on": "2027-01-08" }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 48129f6778..592c2f2e3a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "0d2044d9526ea8e836996115f38cdb8b5bd84c0f4962338974a6dfea09d3c1aa", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,7 +760,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2023-24" @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7835ba24ecb3a28a7732638b28502ba8d8e77d72c787c7bb442a69c72ec0cf8d", + "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 3dfee7c117..e42e7fc3b0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -4006,7 +4006,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary's 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (María's rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index a7c5c3491f..851c9df287 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -3283,7 +3283,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers'' imputed rent and 12.6.1 FISIM), on ONS''s domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel''s frame litres with HMRC''s clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary''s 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (María''s rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers'' imputed rent and 12.6.1 FISIM), on ONS''s domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel''s frame litres with HMRC''s clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 9f9049fc88..3cad48838a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -15121,7 +15121,7 @@ "policyengine": { "metric_name": "ons/household_road_fuel_expenditure", "value_expression": "petrol_spending + diesel_spending", - "notes": "ONS Consumer Trends COICOP 07.2.2 fuels and lubricants for personal transport equipment, current prices, calendar year, bound on the frame's petrol plus diesel spend (microcosm#1113). The publisher class also carries other motor fuels and lubricants, about 0.4 percent of it on the LCFS 2023-24 diary (c72213), which the measure does not. ONS publishes the class on the domestic concept (spending on UK territory, non-residents included; PolicyEngine/chronicle#322), and Consumer Trends splits the tourism adjustment by no class, so no national bridge is applied. The lcfs_consumption stage levels petrol plus diesel to the calendar-2024 row less that share, so the design-weight gap to this calendar-2025 row is the engine's 2024-to-2025 uprating of the two columns against ONS's own growth. Household-scope road fuel replaces the OBR cars receipts as the bound fuel row: those are a fiscal-year duty total that includes business use of cars, which the frame reaches only through the engine's conversion of spend to litres, so they stay measured as a diagnostic (calibration_measure_exclusions.json)." + "notes": "ONS Consumer Trends COICOP 07.2.2 fuels and lubricants for personal transport equipment, current prices, calendar year, bound on the frame's petrol plus diesel spend (microcosm#1113). The publisher class also carries other motor fuels and lubricants, about 0.4 percent of it on the LCFS 2023-24 diary (c72213), which the measure does not. The lcfs_consumption stage levels petrol plus diesel to the calendar-2024 row less that share, so this row reads about 0.4 percent low from scope alone: a known offset, left in place and not scaled into the target (María's ruling of 2026-10-10). ONS publishes the class on the domestic concept (spending on UK territory; PolicyEngine/chronicle#322): it includes non-residents' fuel bought in the UK, which the residents-only frame does not hold, and leaves out residents' fuel bought abroad. Consumer Trends publishes those two flows for total spending only (for 2024, GBP 64.7bn by non-residents in the UK, 3.8 percent of the domestic total, and GBP 78.9bn by residents abroad) and splits them by no class, so no national bridge is applied and their size for road fuel is not known. Beyond the scope offset, the design-weight gap to this calendar-2025 row is the engine's 2024-to-2025 uprating of the two columns against ONS's own growth. Household-scope road fuel replaces the OBR cars receipts as the bound fuel row: those are a fiscal-year duty total that includes business use of cars, which the frame reaches only through the engine's conversion of spend to litres, so they stay measured as a diagnostic (calibration_measure_exclusions.json)." }, "axiom": { "metric_name": "ons/household_road_fuel_expenditure", diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json index ebed2d4c3b..ff09f100d6 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json @@ -3487,7 +3487,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (Mar\u00eda's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.", + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (Mar\u00eda's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary's 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (Mar\u00eda's rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.", "operations": [ { "annualization_weeks": 52.17857142857143, From d822cc4cd8af4324302d6bb3f804fb1bd1d29a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sun, 11 Oct 2026 09:37:23 +0100 Subject: [PATCH 16/18] Address the adversarial review on the consumption-tax levels (#1113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit María's independent review of #1167 at 352310965 found the diary columns a quarter past the calendar-2024 basis the PR claims, a gate that could not see it, and gate and register texts describing rows that no longer bind. Stage behaviour: - The diary spend columns (twelve divisions and bus fares) are carried on the engine's CPI index from the April-to-March 2023-24 diary year to calendar 2024: uprate_donor_columns gains a fiscal_year_bridge and a per-column from_window. The step is 1.0186, not the full year's 1.025. Income predictors keep the full-year step to the FRS 2024-25 incomes. - consumption_basis reads each diary column's declared window and the bridge weights, not an assumed period type. - transport_consumption is recomposed around the priced bus fares as well as the levelled petrol and diesel, so it holds every levelled part. - The housing and transport totals keep their committed support bounds, so the terminal support gate holds the emitted totals. The recomposed_totals check guards the declaration and the receipt; its sums are identities. - The division capture and the litres audit record why they have no figures when a published row is missing for the year; they no longer raise. The litres audit falls back to the OBR cars share. A stale vendored resource still fails. - The Consumer Trends target selectors pin the price basis, concept and seasonal adjustment chronicle#323 added. Texts restated to what the stage and the calibration now do: - gates.json: the energy level is calendar 2024; no bound row or release-blocking check holds calibrated domestic energy, the VAT base or fuel duty since D1 to D3, and the notes say so; what road_fuel_level and recomposed_totals can and cannot catch. - The signed exclusions for obr.fuel_duties and COICOP 04.5 no longer say the rows that replaced them bind. - The four measure-exclusion reasons give design-to-final moves and the masked-arm comparison separately, and say the four rows were masked together on the 2026-09-30 problem. - The bound road-fuel row's notes give the engine-growth part of its design-weight gap: about +2.3% on policyengine-uk 2.122.2, scope included. - The stage notes record the fuel flag's known residual, the Northern Ireland bus index proxy, and that the housing remainder holds only part of the diary's other fuels. - The three exclusions that tracked #1113, which the PR closes, now track the follow-up issue #1207, and the two energy rows retire on its reconciliation. Regenerated: source_stages.json, the coverage manifest, the gate digests, the LCFS support bounds, the national references and membership, and the H2 fixture (only lcfs_consumption's contract hash moves). Co-Authored-By: Claude Opus 5.5 --- .../1113-calendar-2024-spend-basis.changed.md | 2 +- ...sumption-tax-measure-exclusions.changed.md | 2 +- .../1113-division-capture-diagnostic.added.md | 2 +- .../1113-household-road-fuel-target.added.md | 2 +- .../1113-recomposed-coicop-totals.changed.md | 2 +- ...3-road-fuel-level-and-incidence.changed.md | 2 +- ...uk-chronicle-feed-repin-1ee7dfe.changed.md | 2 +- docs/uk-chronicle-feed-repin.md | 3 +- .../spec_engine/schema/sources.schema.json | 19 +++ .../uk/calibration_measure_exclusions.json | 22 ++-- .../src/microcosm/build/uk/gates.json | 10 +- .../uk/lcfs_consumption_support_bounds.json | 10 +- .../uk/release_input_coverage_manifest.json | 34 ++--- .../src/microcosm/build/uk/source_stages.json | 51 +++++--- .../src/microcosm/build/uk/spec/sources.yaml | 20 ++- .../build/uk/target_reference_membership.json | 4 +- .../target_reference_signed_exclusions.json | 4 +- .../microcosm/build/uk/target_references.json | 15 ++- .../build/uk/uk_population_targets.json | 30 +++-- .../build/uk_runtime/donor_uprating.py | 68 +++++++++- .../build/uk_runtime/energy_pricing.py | 2 +- .../build/uk_runtime/lcfs_consumption.py | 121 ++++++++++++++---- .../build/uk_runtime/stage_health.py | 50 +++++++- .../tests/engine/uk/test_uk_donor_uprating.py | 8 +- .../uk/test_uk_consumption_resources.py | 13 +- .../engine_free/uk/test_uk_donor_uprating.py | 84 ++++++++++++ .../uk/test_uk_lcfs_consumption.py | 88 ++++++++++++- .../uk/test_uk_measure_simulation.py | 12 +- .../engine_free/uk/test_uk_stage_health.py | 38 +++++- .../src/microcosm/data/contract.py | 10 +- .../tests/engine_free/shared/test_contract.py | 4 +- .../parity/uk_spine/sources/fixture.json | 25 +++- .../fixtures/parity/uk_spine/uk_spine.json | 2 +- .../microcosm_build/uk_donor_uprating.py | 5 +- 34 files changed, 626 insertions(+), 140 deletions(-) diff --git a/changelog.d/1113-calendar-2024-spend-basis.changed.md b/changelog.d/1113-calendar-2024-spend-basis.changed.md index f4696d6567..b80fe75d30 100644 --- a/changelog.d/1113-calendar-2024-spend-basis.changed.md +++ b/changelog.d/1113-calendar-2024-spend-basis.changed.md @@ -1 +1 @@ -Every household spend column the UK LCFS stage emits is now at calendar-2024 prices, the H5's year (microcosm#1113): domestic energy is priced at QEP's calendar-2024 averages paid and levelled to the DESNZ volume over the four quarters of 2024, and each area's fiscal-year bus yield is re-priced to 2024 by its fares index, so policyengine-uk can project every column from the H5's year. A stage-health gate holds every level-setting step to that year. +Every household spend column the UK LCFS stage emits is now at calendar-2024 prices, the H5's year (microcosm#1113): the diary columns are carried on the engine's CPI index from the April-to-March 2023-24 diary year to calendar 2024, three quarters of a year's step and not a full one; domestic energy is priced at QEP's calendar-2024 averages paid and levelled to the DESNZ volume over the four quarters of 2024, and each area's fiscal-year bus yield is re-priced to 2024 by its fares index, so policyengine-uk can project every column from the H5's year. A stage-health gate holds every level-setting step to that year and checks that each diary column declares the diary-year window. diff --git a/changelog.d/1113-consumption-tax-measure-exclusions.changed.md b/changelog.d/1113-consumption-tax-measure-exclusions.changed.md index 51e15add05..a59e7a70eb 100644 --- a/changelog.d/1113-consumption-tax-measure-exclusions.changed.md +++ b/changelog.d/1113-consumption-tax-measure-exclusions.changed.md @@ -1 +1 @@ -The UK calibration holds `obr.vat`, `ons.household_electricity_expenditure`, `ons.household_gas_expenditure` and `obr.fuel_duties_cars` out of the objective as reviewed measure exclusions, still measured on every evaluation; `tools/diagnose_uk_consumption_taxes.py` reports them on any H5 the engine loads (microcosm#1113, microcosm#1123 item 3). VAT's level is an engine factor (policyengine-uk#1996), the ONS energy rows sit below the DESNZ volume at QEP prices the stage sets, and the OBR cars receipts include business-paid car fuel; a re-solve with the rows masked changed no other row's fit. +The UK calibration holds `obr.vat`, `ons.household_electricity_expenditure`, `ons.household_gas_expenditure` and `obr.fuel_duties_cars` out of the objective as reviewed measure exclusions, still measured on every evaluation; `tools/diagnose_uk_consumption_taxes.py` reports them on any H5 the engine loads (microcosm#1113, microcosm#1123 item 3). VAT's level is an engine factor (policyengine-uk#1996), the ONS energy rows sit below the DESNZ volume at QEP prices the stage sets, and the OBR cars receipts include business-paid car fuel; a re-solve of the 2026-09-30 national problem with the four rows masked together left the other rows fitting no worse. diff --git a/changelog.d/1113-division-capture-diagnostic.added.md b/changelog.d/1113-division-capture-diagnostic.added.md index 892dc31ce0..6d938f1e18 100644 --- a/changelog.d/1113-division-capture-diagnostic.added.md +++ b/changelog.d/1113-division-capture-diagnostic.added.md @@ -1 +1 @@ -The UK LCFS stage receipt reports how much of ONS household spending each COICOP division captures (microcosm#1113): each of the twelve division totals at prior weights against ONS Consumer Trends for calendar 2024, less the classes a household diary does not record (narcotics, owner-occupiers' imputed rent and FISIM), on ONS's domestic concept, with the twelve together also against the national concept. The block is report-only, and the Consumer Trends resource vendors the division and total rows it reads. +The UK LCFS stage receipt reports how much of ONS household spending each COICOP division captures (microcosm#1113): each of the twelve division totals at prior weights against ONS Consumer Trends for calendar 2024, less the classes a household diary does not record (narcotics, owner-occupiers' imputed rent and FISIM), on ONS's domestic concept, with the twelve together also against the national concept. The block is report-only, and the Consumer Trends resource vendors the division and total rows it reads. When a published row is missing for the year, the block records why it has no figures and the stage carries on. diff --git a/changelog.d/1113-household-road-fuel-target.added.md b/changelog.d/1113-household-road-fuel-target.added.md index f29db0abfb..e0d57ec87a 100644 --- a/changelog.d/1113-household-road-fuel-target.added.md +++ b/changelog.d/1113-household-road-fuel-target.added.md @@ -1 +1 @@ -The UK contract binds `ons.household_road_fuel_expenditure`, ONS Consumer Trends COICOP 07.2.2 (fuels and lubricants for personal transport) for the calendar year, measured as petrol plus diesel spend (microcosm#1113). +The UK contract binds `ons.household_road_fuel_expenditure`, ONS Consumer Trends COICOP 07.2.2 (fuels and lubricants for personal transport) for the calendar year, measured as petrol plus diesel spend (microcosm#1113). The class also carries other motor fuels and lubricants, so the row reads about 0.4% low from scope alone, and the new row adds one ledger-only row to each national compile-parity receipt. diff --git a/changelog.d/1113-recomposed-coicop-totals.changed.md b/changelog.d/1113-recomposed-coicop-totals.changed.md index ce51422bc8..2daea3233d 100644 --- a/changelog.d/1113-recomposed-coicop-totals.changed.md +++ b/changelog.d/1113-recomposed-coicop-totals.changed.md @@ -1 +1 @@ -The UK LCFS stage writes `housing_water_and_electricity_consumption` and `transport_consumption` around the parts it re-levels (microcosm#1113): each keeps its own chain draw less the chain's draws of the diary energy, or of petrol and diesel, and adds the levelled electricity and gas, or petrol and diesel, back, so no total is below its parts. The liquid and solid fuels, which have no column of their own, stay inside the housing remainder, and the receipt records their published ONS spend beside it; a stage-health gate holds the totals in place of committed support bounds. +The UK LCFS stage writes `housing_water_and_electricity_consumption` and `transport_consumption` around the parts it re-levels (microcosm#1113): each keeps its own chain draw less the chain's draws of the diary energy, or of petrol, diesel and bus fares, and adds the levelled electricity and gas, or the levelled petrol and diesel and the priced bus fares, back, so no total is below its parts. No column carries the diary's liquid and solid fuels: part of them stays inside the housing remainder, and the receipt records their published ONS spend. The two totals keep their committed support bounds, which the terminal support gate applies to the emitted frame; a stage-health gate checks the declaration and the receipt. diff --git a/changelog.d/1113-road-fuel-level-and-incidence.changed.md b/changelog.d/1113-road-fuel-level-and-incidence.changed.md index 8b3250ffdd..d3746c7425 100644 --- a/changelog.d/1113-road-fuel-level-and-incidence.changed.md +++ b/changelog.d/1113-road-fuel-level-and-incidence.changed.md @@ -1 +1 @@ -The UK LCFS stage sets household road fuel itself (microcosm#1113): a flagged fuel-car household whose chain draw is zero is redrawn from the donor's distribution among households with positive road fuel (`redraw_zero_road_fuel`), and one factor then scales petrol and diesel to ONS 07.2.2 for 2024 less the donor's other-fuels share (`level_road_fuel`). Two stage-health gates check the receipts, petrol and diesel leave the committed support bounds, and the litres audit benchmarks each fuel against HMRC clearances times DESNZ's cars share of that fuel's road use (PolicyEngine/chronicle#322), keeping the OBR cars share of duty receipts, uniform across fuels, beside the total. +The UK LCFS stage sets household road fuel itself (microcosm#1113): a flagged fuel-car household whose chain draw is zero is redrawn from the donor's distribution among households with positive road fuel (`redraw_zero_road_fuel`), and one factor then scales petrol and diesel to ONS 07.2.2 for 2024 less the donor's other-fuels share (`level_road_fuel`). Two stage-health gates check the receipts, petrol and diesel leave the committed support bounds, and the litres audit benchmarks each fuel against HMRC clearances times DESNZ's cars share of that fuel's road use (PolicyEngine/chronicle#322), keeping the OBR cars share of duty receipts, uniform across fuels, beside the total and falling back to it where DESNZ publishes no split for the year. diff --git a/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md b/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md index 3ca7a5b9a0..dc2a8e062e 100644 --- a/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md +++ b/changelog.d/uk-chronicle-feed-repin-1ee7dfe.changed.md @@ -1 +1 @@ -Re-pin the UK Chronicle feed to 1ee7dfe (PolicyEngine/chronicle#322 via #323). The feed now carries ONS Consumer Trends household final consumption expenditure by COICOP division and class, with the national and domestic totals (annual for 2020 to 2025, quarterly to 2026 Q1), and DESNZ road transport fuel consumption by vehicle type and fuel for 2005 to 2024 (352,549 rows). No compiled target value moved on either surface. The seven Consumer Trends series already in the feed come back on ONS's domestic concept under new keys with the same values, so the electricity, gas and road-fuel targets resolve to the same values; the vendored resources and the membership reports restate the feed identity, and the three compile-parity receipts are unchanged (microcosm#1113). +Re-pin the UK Chronicle feed to 1ee7dfe (PolicyEngine/chronicle#322 via #323). The feed now carries ONS Consumer Trends household final consumption expenditure by COICOP division and class, with the national and domestic totals (annual for 2020 to 2025, quarterly to 2026 Q1), and DESNZ road transport fuel consumption by vehicle type and fuel for 2005 to 2024 (352,549 rows). No compiled target value moved on either surface. The seven Consumer Trends series already in the feed come back on ONS's domestic concept under new keys with the same values, so the electricity, gas and road-fuel targets resolve to the same values; the vendored resources and the membership reports restate the feed identity, and the re-pin itself leaves the three compile-parity receipts unchanged (microcosm#1113). diff --git a/docs/uk-chronicle-feed-repin.md b/docs/uk-chronicle-feed-repin.md index f9a115304d..cb9b54fb21 100644 --- a/docs/uk-chronicle-feed-repin.md +++ b/docs/uk-chronicle-feed-repin.md @@ -121,6 +121,7 @@ match two facts each (the new 2023-24 Table 6.2 rows beside the bound 2024-25 on resolve to the 2024-25 fact. For the same reason the 2023 production compile-parity receipt gains five ledger-only rows (the relief targets now compile at that comparison period from the 2023-24 facts); the two 2025 incumbent receipts are unchanged. + The `1ee7dfe` re-pin (microcosm#1113, PolicyEngine/chronicle#322 via #323, on top of `825406f`) brought ONS Consumer Trends household final consumption expenditure, annual for 2020 to 2025 and quarterly to 2026 Q1: the national and domestic totals, the twelve domestic COICOP divisions and net @@ -133,4 +134,4 @@ seasonal-adjustment, unit, sheet and concept dimensions. Every other `825406f` r byte-identical. The national and local reference files are byte-identical; the electricity, gas and road-fuel targets resolve to the same values through the new keys. The vendored resources carry the same rows under the new feed identity, the Consumer Trends resource's 42 under their new keys, and -the three compile-parity receipts are unchanged. +the re-pin leaves the three compile-parity receipts unchanged. diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index 4ae6ddbe45..fcfe7a3a2e 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -9477,6 +9477,9 @@ }, "audit_parameter_path": { "type": "string" + }, + "from_window": { + "const": "fiscal_year" } } } @@ -9489,6 +9492,22 @@ }, "instant": { "const": "january_first" + }, + "fiscal_year_bridge": { + "type": "object", + "additionalProperties": false, + "required": [ + "start_year_weight", + "next_year_weight" + ], + "properties": { + "start_year_weight": { + "const": 0.75 + }, + "next_year_weight": { + "const": 0.25 + } + } } } }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json index 2a1b411255..c34a1576cc 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json @@ -579,37 +579,37 @@ }, { "name": "obr.vat", - "reason": "Level set by an engine factor, not the weights: policyengine-uk's vat divides household VAT by gov.simulation.microdata_vat_coverage (0.38, a constant since January 2023 with no recorded derivation; policyengine-uk#1996), which folds the household share of VAT receipts (about 70 percent per OBR and the HMRC VAT gap estimates) together with the survey's capture of household spending. The frame's raw household VAT is about 46 percent of the OBR receipts, so the row reads +24.7 percent at design weights and +24.1 percent calibrated on microcosm#1121's head calibration (policyengine-uk 2.122.2), against the 25 percent bound. Fitting it held total consumption 5 percent (GBP 55bn) low on the 2026-09-30 national problem, and a re-solve with the row masked changed no other row's fit (98.5 against 98.4 percent within 10 percent). Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; rebind when a locked policyengine-uk splits the factor into the published household share and a declared survey capture and the row fits.", + "reason": "Level set by an engine factor, not the weights: policyengine-uk's vat divides household VAT by gov.simulation.microdata_vat_coverage (0.38, a constant since January 2023 with no recorded derivation; policyengine-uk#1996), which folds the household share of VAT receipts (about 70 percent per OBR and the HMRC VAT gap estimates) together with the survey's capture of household spending. The frame's raw household VAT is about 46 percent of the OBR receipts, so the row reads +24.7 percent at design weights and +24.1 percent calibrated on microcosm#1121's head calibration (policyengine-uk 2.122.2), against the 25 percent bound. On the 2026-09-30 national problem (1,090 rows, before this stage set any level) the calibration with the four consumption-tax rows bound left total consumption GBP 55bn (5 percent) below a re-solve with the four consumption-tax rows masked together (GBP 982bn against GBP 1,037bn). In that re-solve the other 1,086 rows fitted no worse (98.5 against 98.4 percent within 10 percent, none past 25 percent against one). Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; rebind when a locked policyengine-uk splits the factor into the published household share and a declared survey capture and the row fits.", "tracking": "policyengine-uk#1996", "approved_by": "juaristi22", - "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D3: hold the row out until the engine factor is split. Receipts: experiments/1113-consumption-tax-levels-receipts.md (the masked re-solve of the 2026-09-30 problem and microcosm#1121's head calibration).", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D3: hold the row out until the engine factor is split. The reason's figures were restated on 2026-10-11 after her review of PolicyEngine/microcosm#1167, which found bases mixed. Receipts: experiments/1113-consumption-tax-levels-receipts.md (the masked re-solve of the 2026-09-30 problem and microcosm#1121's head calibration).", "approved_on": "2026-10-08", "expires_on": "2027-01-08" }, { "name": "ons.household_electricity_expenditure", - "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets electricity spend from the DESNZ Energy Trends domestic volume over the four quarters of calendar 2024 at QEP calendar-2024 average prices paid (the level the energy_rake gate checks), and ONS Consumer Trends 04.5.1 sits below it on every aligned basis. For calendar 2024 it is GBP 26.10bn against the stage's GBP 29.52bn on microcosm#1121's head spine (0.88). For calendar 2025 it is GBP 26.52bn against GBP 29.60bn for Energy Trends volume times QEP unit and fixed costs (0.90), and 1.11 times unit cost alone; meters against households explains about 2 percent. Fitting the row cut electricity 8.6 percent through the weights (82.9 TWh implied against 93.0 TWh on the 2026-09-30 build), and a re-solve with it masked changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", - "tracking": "microcosm#1113", + "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets electricity spend from the DESNZ Energy Trends domestic volume over the four quarters of calendar 2024 at QEP calendar-2024 average prices paid (the level the energy_rake gate checks), and ONS Consumer Trends 04.5.1 sits below it on every aligned basis. For calendar 2024 it is GBP 26.10bn against the stage's GBP 29.52bn on microcosm#1121's head spine (0.88). For calendar 2025 it is GBP 26.52bn against GBP 29.60bn for Energy Trends volume times QEP unit and fixed costs (0.90), and 1.11 times unit cost alone; meters against households explains about 2 percent. On the 2026-09-30 national problem the calibration took electricity from GBP 29.11bn at design weights to GBP 26.54bn (8.8 percent; 93.0 to 82.9 TWh, 10.9 percent). In a re-solve with the four consumption-tax rows masked together it stayed at GBP 28.70bn, and the other 1,086 rows fitted no worse. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the reconciliation microcosm#1207 tracks finds a concept difference to bridge.", + "tracking": "microcosm#1207", "approved_by": "juaristi22", - "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. The reason was restated on the calendar-2024 basis on 2026-10-10 with her approval, after her ruling of 2026-10-09 put every LCFS spend column at calendar-2024 prices. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. The reason was restated on the calendar-2024 basis on 2026-10-10 with her approval, after her ruling of 2026-10-09 put every LCFS spend column at calendar-2024 prices. Its figures were restated on 2026-10-11 after her review of PolicyEngine/microcosm#1167, which found bases mixed. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", "approved_on": "2026-10-08", "expires_on": "2027-01-08" }, { "name": "ons.household_gas_expenditure", - "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets gas spend from the DESNZ Energy Trends domestic volume over the four quarters of calendar 2024 at QEP calendar-2024 average prices paid over the published gas-connected share, and ONS Consumer Trends 04.5.2 sits below it on every aligned basis. For calendar 2024 it is GBP 14.64bn against the stage's GBP 19.23bn on microcosm#1121's head spine (0.76). For calendar 2025 it is GBP 15.34bn against GBP 18.94bn for Energy Trends volume times QEP unit and fixed costs (0.81), and below unit cost alone (0.955). Fitting the row cut gas 18.9 percent through the weights and the gas-connected share from 84.5 to 78.9 percent against the DESNZ meter share the stage imposes; a re-solve with it masked kept the share at 84.6 percent and changed no other row's fit. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the microcosm#1113 reconciliation finds a concept difference to bridge.", - "tracking": "microcosm#1113", + "reason": "Published-source residual, not a weight question: the lcfs_consumption stage sets gas spend from the DESNZ Energy Trends domestic volume over the four quarters of calendar 2024 at QEP calendar-2024 average prices paid over the published gas-connected share, and ONS Consumer Trends 04.5.2 sits below it on every aligned basis. For calendar 2024 it is GBP 14.64bn against the stage's GBP 19.23bn on microcosm#1121's head spine (0.76). For calendar 2025 it is GBP 15.34bn against GBP 18.94bn for Energy Trends volume times QEP unit and fixed costs (0.81), and below unit cost alone (0.955). On the 2026-09-30 national problem the calibration took gas from GBP 18.97bn at design weights to GBP 15.35bn (19.1 percent; 260.1 to 205.2 TWh, 21.1 percent) and the gas-connected share from 84.5 to 78.9 percent, against the DESNZ meter share the stage imposes. In a re-solve with the four consumption-tax rows masked together gas stayed at GBP 18.97bn and the share at 84.6 percent, and the other 1,086 rows fitted no worse. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; retire if the reconciliation microcosm#1207 tracks finds a concept difference to bridge.", + "tracking": "microcosm#1207", "approved_by": "juaristi22", - "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. The reason was restated on the calendar-2024 basis on 2026-10-10 with her approval, after her ruling of 2026-10-09 put every LCFS spend column at calendar-2024 prices. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "adjudication": "María's ruling of 2026-10-08 on the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D1: DESNZ volume at QEP prices stays the level and the ONS rows become diagnostics. The reason was restated on the calendar-2024 basis on 2026-10-10 with her approval, after her ruling of 2026-10-09 put every LCFS spend column at calendar-2024 prices. Its figures were restated on 2026-10-11 after her review of PolicyEngine/microcosm#1167, which found bases mixed. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", "approved_on": "2026-10-08", "expires_on": "2027-01-08" }, { "name": "obr.fuel_duties_cars", - "reason": "Scope and conversion residual once the stage sets household road fuel: OBR's cars receipts (GBP 14.4bn for FY2024-25, the April 2024 vehicle-type split) include car fuel paid by businesses, and ONS Consumer Trends 07.2.2 for CY2025 at DESNZ 2025 pump prices converts to about GBP 13.5bn of duty, 7 percent below the OBR cars line. With petrol plus diesel levelled to ONS 07.2.2 by the lcfs_consumption stage, the engine's 2025 fuel_duty reads -9.9 percent against the row on its RAC price divisors (-8.1 percent on DESNZ's; policyengine-uk#2169 A), so binding it would pull weight toward fuel buyers to cover business use the household frame does not hold. Before the level step it read -34.5 percent at design weights and -17.7 percent calibrated on microcosm#1121's head, and fitting it raised petrol 21 and diesel 34 percent through the weights; a re-solve of the 2026-09-30 problem with it masked changed no other row's fit. Household road fuel is bound as ons.household_road_fuel_expenditure. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; rebind if Microcosm comes to model business use of cars.", - "tracking": "microcosm#1113", + "reason": "Scope and conversion residual once the stage sets household road fuel: OBR's cars receipts (GBP 14.4bn for FY2024-25, the April 2024 vehicle-type split) include car fuel paid by businesses, and ONS Consumer Trends 07.2.2 for CY2025 at DESNZ 2025 pump prices converts to about GBP 13.5bn of duty, 7 percent below the OBR cars line. With petrol plus diesel levelled to ONS 07.2.2 by the lcfs_consumption stage, the engine's 2025 fuel_duty reads -9.9 percent against the row on its RAC price divisors (-8.1 percent on DESNZ's; policyengine-uk#2169 A), so binding it would pull weight toward fuel buyers to cover business use the household frame does not hold. Before the level step it read -34.5 percent at design weights and -17.7 percent calibrated on microcosm#1121's head, where the weights raised petrol 21 and diesel 34 percent from design to final. On the 2026-09-30 national problem the calibration with the four consumption-tax rows bound left petrol 18 and diesel 36 percent above a re-solve with the four consumption-tax rows masked together, in which the other 1,086 rows fitted no worse. Household road fuel is bound as ons.household_road_fuel_expenditure. Measured on every evaluation with tools/diagnose_uk_consumption_taxes.py; rebind if Microcosm comes to model business use of cars, which microcosm#1207 tracks.", + "tracking": "microcosm#1207", "approved_by": "juaristi22", - "adjudication": "María's approval of 2026-10-08 of the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D2, with the binding confirmed on 2026-10-09: the stage sets the household road-fuel level and incidence, and the household-scope ONS 07.2.2 row is bound in place of the OBR cars receipts, which include business fuel. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", + "adjudication": "María's approval of 2026-10-08 of the VAT, road fuel and domestic energy plan (microcosm#1113, microcosm#1123 item 3), decision D2, with the binding confirmed on 2026-10-09: the stage sets the household road-fuel level and incidence, and the household-scope ONS 07.2.2 row is bound in place of the OBR cars receipts, which include business fuel. The reason's figures were restated on 2026-10-11 after her review of PolicyEngine/microcosm#1167, which found bases mixed. Receipts: experiments/1113-consumption-tax-levels-receipts.md.", "approved_on": "2026-10-08", "expires_on": "2027-01-08" } diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index ae4988805d..aa3b1e1c83 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -330,7 +330,7 @@ "convergence_window_sweeps": 10, "maximum_residual_change_over_window": 0.001 }, - "notes": "Stage-time energy check (microcosm#890 F, chronicle#270). María's ruling (2026-09-15, PR #927): 'I'm not sure why we are comparing against NEED as a gate in the first place if that is not what we are calibrating, but I agree we should implement Vahid's recommended fix and move the fix to before calibration.' Fact checks on the lcfs energy_rake receipt, every published value recomputed at gate time from the vendored rows the stage declares: each cell's shape target is the vendored NEED 2024 mean (need_energy_facts.json, margins_period_value), each fuel's level is the vendored DESNZ Energy Trends domestic consumption at actual temperature over the four FY2024-25 quarters (desnz_domestic_energy_facts.json) with the level factor equal to that total over the frame's pre-level total and the levelled frame total equal to the published one, each cell's target is shape times factor, and every region with a published gas-connected share (DESNZ subnational gas meters over electricity meters, 2024) sits within 0.5 points of it after the imposition unless the draw could not fill it (a receipted shortfall). The residual check holds the maximum absolute relative deviation of any cell mean from its levelled target, per margin (income band, tenure, property type, region) and fuel, electricity over every household of a cell and gas over its gas-connected households, to one fixed 2.5 % tolerance on the IPF's cross-margin residual (region is swept last and fits to machine precision by construction, so the tolerance binds the earlier three; a declared rule set above the observed maxima, not a fact: spine-s3 on NEED 2023 showed income 1.65 %, tenure 1.29 %, accommodation 0.83 %; spine-s5 on the NEED 2024 shape with the published connection showed income 2.16 % electricity / 1.97 % gas, accommodation 1.46 %, tenure 1.31 %, which is why the 2 % rule of spine-s3 moved to 2.5 %). This gate replaced the two NEED mean-spend anchors that uk_aggregate_admin measured on the calibrated frame; the calibrated frame is held to the bound ONS 04.5.1 electricity and 04.5.2 gas rows, and the gap between the DESNZ-volume-times-QEP-price level the stage sets and the ONS national-accounts spend is the published-source residual PR #927 receipts Part T records, not a gate. The entry is a population_fact_check: a synthetic smoke build (the staging smoke over the H2 fixture) records its outcome without blocking, because the fixture is not the population NEED, DESNZ and the meter counts describe; every licensed build blocks on it. Tolerance governance (Vahid's third pass on PR #927): maximum_relative_deviation is a rule set above the observed maxima, not a fact; the rake runs a fixed number of sweeps and the receipt now records the cross-margin residual after every sweep (sweep_residuals), so the terminal residual is shown converged, not truncated, and a vintage whose converged residual exceeds the rule is a new ruling for María, never a silent re-pin. The gate checks the convergence rather than asserting it (Vahid's review of microcosm#1012): across the last convergence_window_sweeps (10) sweeps each fuel's residual may range, maximum minus minimum, by at most maximum_residual_change_over_window (0.1 point of relative deviation), so a rake oscillating inside the window fails as a truncated one does; the window presupposes the stage declares more sweeps than the window is long, and the stage refuses an undeclared sweep count. On the licensed spines the 50-sweep receipts of main and of the SPI-first reorder were still falling 0.11 to 0.75 points over their last 10 sweeps, while the 200-sweep receipt of microcosm#1012's final head moves 0.014 points. maximum_connected_share_deviation is declared, not derived from the walk: the greedy weight-fitting walk lands within a fraction of one household weight of the published share, and the check is waived only for a region whose draw cannot fill its published share (the shortfall is receipted and reported here), never for a region above it. The regions the crosswalk maps to no subnational area are declared on the stage (connection_fallback_regions, Northern Ireland) and refused if they differ from the crosswalk." + "notes": "Stage-time energy check (microcosm#890 F, chronicle#270). María's ruling (2026-09-15, PR #927): 'I'm not sure why we are comparing against NEED as a gate in the first place if that is not what we are calibrating, but I agree we should implement Vahid's recommended fix and move the fix to before calibration.' Fact checks on the lcfs energy_rake receipt, every published value recomputed at gate time from the vendored rows the stage declares: each cell's shape target is the vendored NEED 2024 mean (need_energy_facts.json, margins_period_value), each fuel's level is the vendored DESNZ Energy Trends domestic consumption at actual temperature over the four quarters of calendar 2024 (desnz_domestic_energy_facts.json) with the level factor equal to that total over the frame's pre-level total and the levelled frame total equal to the published one, each cell's target is shape times factor, and every region with a published gas-connected share (DESNZ subnational gas meters over electricity meters, 2024) sits within 0.5 points of it after the imposition unless the draw could not fill it (a receipted shortfall). The residual check holds the maximum absolute relative deviation of any cell mean from its levelled target, per margin (income band, tenure, property type, region) and fuel, electricity over every household of a cell and gas over its gas-connected households, to one fixed 2.5 % tolerance on the IPF's cross-margin residual (region is swept last and fits to machine precision by construction, so the tolerance binds the earlier three; a declared rule set above the observed maxima, not a fact: spine-s3 on NEED 2023 showed income 1.65 %, tenure 1.29 %, accommodation 0.83 %; spine-s5 on the NEED 2024 shape with the published connection showed income 2.16 % electricity / 1.97 % gas, accommodation 1.46 %, tenure 1.31 %, which is why the 2 % rule of spine-s3 moved to 2.5 %). This gate replaced the two NEED mean-spend anchors that uk_aggregate_admin measured on the calibrated frame. The ONS 04.5.1 electricity and 04.5.2 gas rows then held the calibrated frame until microcosm#1113 made them measured diagnostics (María's ruling of 2026-10-08, D1). Since then nothing release-blocking holds domestic energy after calibration: this gate holds its level at prior weights, and the report-only uk_diagnostics.consumption_drift shows how far the weights move it. The gap between the DESNZ-volume-times-QEP-price level the stage sets and the ONS national-accounts spend is the published-source residual PR #927 receipts Part T records, not a gate. The entry is a population_fact_check: a synthetic smoke build (the staging smoke over the H2 fixture) records its outcome without blocking, because the fixture is not the population NEED, DESNZ and the meter counts describe; every licensed build blocks on it. Tolerance governance (Vahid's third pass on PR #927): maximum_relative_deviation is a rule set above the observed maxima, not a fact; the rake runs a fixed number of sweeps and the receipt now records the cross-margin residual after every sweep (sweep_residuals), so the terminal residual is shown converged, not truncated, and a vintage whose converged residual exceeds the rule is a new ruling for María, never a silent re-pin. The gate checks the convergence rather than asserting it (Vahid's review of microcosm#1012): across the last convergence_window_sweeps (10) sweeps each fuel's residual may range, maximum minus minimum, by at most maximum_residual_change_over_window (0.1 point of relative deviation), so a rake oscillating inside the window fails as a truncated one does; the window presupposes the stage declares more sweeps than the window is long, and the stage refuses an undeclared sweep count. On the licensed spines the 50-sweep receipts of main and of the SPI-first reorder were still falling 0.11 to 0.75 points over their last 10 sweeps, while the 200-sweep receipt of microcosm#1012's final head moves 0.014 points. maximum_connected_share_deviation is declared, not derived from the walk: the greedy weight-fitting walk lands within a fraction of one household weight of the published share, and the check is waived only for a region whose draw cannot fill its published share (the shortfall is receipted and reported here), never for a region above it. The regions the crosswalk maps to no subnational area are declared on the stage (connection_fallback_regions, Northern Ireland) and refused if they differ from the crosswalk." }, { "id": "uk_stage_lcfs_consumption_bus_pricing", @@ -373,7 +373,7 @@ "maximum_relative_deviation": 1e-09, "maximum_other_fuels_share": 0.05 }, - "notes": "Stage-time fact check on the lcfs road_fuel_level receipt (microcosm#1113): the ONS Consumer Trends COICOP 07.2.2 household spend the stage declares is recomputed from the vendored row and must equal the receipt's, and the prior-weighted petrol plus diesel after the step must equal it less the donor's other-fuels share, with the factor reproducing that from the drawn total. The other-fuels share is the LCFS donor's own c72213 share of 07.2.2, licensed microdata the gate cannot recompute, so it is bounded at five percent instead (0.37 percent on the 2023-24 diary). María's ruling of 2026-10-08 set the stage, not the weights, as what levels household road fuel. A population fact check: the synthetic smoke records it without blocking." + "notes": "Stage-time fact check on the lcfs road_fuel_level receipt (microcosm#1113): the ONS Consumer Trends COICOP 07.2.2 household spend the stage declares is recomputed from the vendored row and must equal the receipt's, and the prior-weighted petrol plus diesel after the step must equal it less the donor's other-fuels share, with the factor reproducing that from the drawn total. The other-fuels share is the LCFS donor's own c72213 share of 07.2.2, licensed microdata the gate cannot recompute, so it is bounded at five percent instead (0.37 percent on the 2023-24 diary). María's ruling of 2026-10-08 set the stage, not the weights, as what levels household road fuel. The level is recomputed from the same vendored row the stage read, so the check catches a step that did not apply the declared level; it cannot catch an error in the row itself or a later stage moving the columns. The outside reading is the report-only litres audit against HMRC clearances. A population fact check: the synthetic smoke records it without blocking." }, { "id": "uk_stage_lcfs_consumption_recomposed_totals", @@ -387,7 +387,7 @@ "check": "recomposed_totals", "maximum_relative_deviation": 1e-09 }, - "notes": "Stage-time check on the lcfs recomposed_totals receipt (microcosm#1113): housing_water_and_electricity_consumption and transport_consumption each keep their own chain draw less the chain's draws of the parts the stage re-levels (the drawn electricity and gas, or petrol and diesel; floored at zero where the parts outgrow the total) and add the levelled parts back, so no household's total is below its electricity and gas or its petrol and diesel and no remainder is negative. The declared parts must be the receipt's, the weighted remainder must equal the drawn total less the drawn parts plus the floored mass, and the weighted total the remainder plus the levelled parts, to the declared tolerance. The ONS 04.5.3 and 04.5.4 liquid and solid fuel spend, which stays inside the housing remainder because no frame column carries it, is recomputed from the vendored rows and must equal the receipt's. The two totals carry no committed support bound; this check holds them instead. A population fact check: the synthetic smoke records it without blocking." + "notes": "Stage-time check on the lcfs recomposed_totals receipt (microcosm#1113): housing_water_and_electricity_consumption and transport_consumption each keep their own chain draw less the chain's draws of the parts the stage re-levels (the drawn electricity and gas, or the drawn petrol, diesel and bus fares; floored at zero where the parts outgrow the total) and add the levelled parts back, so no household's total is below its electricity and gas, or its petrol, diesel and priced bus fares, and no remainder is negative. The declared parts must be the receipt's, the weighted remainder must equal the drawn total less the drawn parts plus the floored mass, and the weighted total the remainder plus the levelled parts, to the declared tolerance. The step floors the remainder and adds the parts, so on a receipt the declared step wrote these are identities: the check guards the declaration and the receipt, not the size of the totals. The committed support bounds do that, on the emitted frame, through the terminal uk_support gate. The ONS 04.5.3 and 04.5.4 liquid and solid fuel spend no frame column carries is recomputed from the vendored rows and must equal the receipt's; the housing remainder holds only part of the diary's other fuels, because the stage's energy derivation splits all of the diary's fuel, light and power into electricity and gas where the household reports no combined payment. A population fact check: the synthetic smoke records it without blocking." }, { "id": "uk_stage_lcfs_consumption_basis", @@ -402,7 +402,7 @@ "period_type": "calendar_year", "period_value": 2024 }, - "notes": "Stage-time check that every household spend column lcfs_consumption emits is at calendar-2024 prices as households paid them (microcosm#1113): the H5's year, which policyengine-uk projects every column from with calendar-year growth and the calibration uprates to the calendar-2025 window, so no column needs a basis of its own. The donor uprating must move the diary to 2024, the QEP energy prices and the DESNZ volume level must be for calendar 2024, bus fares must be re-priced to 2024 by the fares indices, and the road-fuel level must be ONS 07.2.2 for calendar 2024; a step whose receipt is absent fails. A population fact check: the synthetic smoke records it without blocking." + "notes": "Stage-time check that every household spend column lcfs_consumption emits is at calendar-2024 prices as households paid them (microcosm#1113): the H5's year, which policyengine-uk projects every column from with calendar-year growth and the calibration uprates to the calendar-2025 window, so no column needs a basis of its own. The donor uprating must end at 2024 and carry every diary spend column from the April-to-March 2023-24 diary year, placed on the calendar-year index at three quarters of 2023 and one of 2024; a full year's step would leave them a quarter past calendar 2024, at about fiscal 2024-25 prices. The QEP energy prices and the DESNZ volume level must be for calendar 2024, bus fares must be re-priced to 2024 by the fares indices, and the road-fuel level must be ONS 07.2.2 for calendar 2024; a step whose receipt is absent fails. A population fact check: the synthetic smoke records it without blocking." }, { "id": "uk_stage_etb_vat_support", @@ -885,7 +885,7 @@ } ] }, - "notes": "Release-blocking aggregate-admin gate for the NHS budget. The two NEED energy anchors left this gate under microcosm#890 by María's ruling (2026-09-15, PR #927): 'I'm not sure why we are comparing against NEED as a gate in the first place if that is not what we are calibrating, but I agree we should implement Vahid's recommended fix and move the fix to before calibration.' NEED is checked where the rake acts, at prior weights, by uk_stage_lcfs_consumption_energy_rake; the calibrated frame is held to the bound ONS 04.5.1 electricity and 04.5.2 gas rows (per fuel since chronicle #271). Known and now unchecked after calibration: the calibrated NEED means sat at GBP 824 / 688 against the anchors' GBP 1,082 / 850 (-24 % / -19 %) because NEED kWh priced at the FY2024-25 cap (about GBP 52bn at design weights) and ONS 04.5 (GBP 43.4bn) disagree by roughly 20 % on this frame (PR #927 receipts Parts N-Q). The build supplies SDC-safe measured aggregates as evidence; the gate checks signs and tolerances." + "notes": "Release-blocking aggregate-admin gate for the NHS budget. The two NEED energy anchors left this gate under microcosm#890 by María's ruling (2026-09-15, PR #927): 'I'm not sure why we are comparing against NEED as a gate in the first place if that is not what we are calibrating, but I agree we should implement Vahid's recommended fix and move the fix to before calibration.' NEED is checked where the rake acts, at prior weights, by uk_stage_lcfs_consumption_energy_rake. From chronicle #271 the calibrated frame was held to the bound ONS 04.5.1 electricity and 04.5.2 gas rows; microcosm#1113 made both measured diagnostics (María's ruling of 2026-10-08, D1), and held obr.vat and obr.fuel_duties_cars out of the fit with them (D3, D2). So no bound row and no release-blocking check now holds calibrated domestic energy, the VAT base or fuel duty; the bound ons.household_road_fuel_expenditure row holds household road-fuel spend, and the report-only uk_diagnostics.consumption_drift shows the levelled totals at design and final weights. Known and unchecked after calibration since microcosm#890: the calibrated NEED means sat at GBP 824 / 688 against the anchors' GBP 1,082 / 850 (-24 % / -19 %) because NEED kWh priced at the FY2024-25 cap (about GBP 52bn at design weights) and ONS 04.5 (GBP 43.4bn) disagree by roughly 20 % on this frame (PR #927 receipts Parts N-Q). The build supplies SDC-safe measured aggregates as evidence; the gate checks signs and tolerances." }, { "id": "uk_export_surface", diff --git a/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json b/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json index 4588976ff0..1b2b3c8709 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json +++ b/packages/microcosm-build/src/microcosm/build/uk/lcfs_consumption_support_bounds.json @@ -38,6 +38,10 @@ 0.0, 200000 ], + "housing_water_and_electricity_consumption": [ + -20000, + 300000 + ], "miscellaneous_consumption": [ 0.0, 70000 @@ -48,7 +52,11 @@ ], "restaurants_and_hotels_consumption": [ 0.0, - 70000 + 60000 + ], + "transport_consumption": [ + 0.0, + 200000 ] }, "chronicle": [ diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 592c2f2e3a..5523d30978 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +514,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +536,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +565,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +585,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +606,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +630,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "0d2044d9526ea8e836996115f38cdb8b5bd84c0f4962338974a6dfea09d3c1aa", @@ -719,7 +719,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,7 +760,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2023-24" @@ -786,7 +786,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -810,7 +810,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +837,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +870,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +892,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +914,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +949,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "e4717a18874b15c3e7a8e3da0853b51f9f9318f3f17829457358370c97a929b8", + "source_manifest_sha256": "6dfb73cf805d29743a48bd211509e130ceecb39c36a5e760bd3bcbeaa464814c", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index e42e7fc3b0..e3496be3c3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -3443,58 +3443,75 @@ "from_period": 2023, "to_period": 2024, "instant": "january_first", + "fiscal_year_bridge": { + "start_year_weight": 0.75, + "next_year_weight": 0.25 + }, "columns": { "food_and_non_alcoholic_beverages_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "alcohol_and_tobacco_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "clothing_and_footwear_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "housing_water_and_electricity_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "household_furnishings_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "health_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "transport_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "communication_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "recreation_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "education_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "restaurants_and_hotels_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "miscellaneous_consumption": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "bus_fare_spending": { "basis": "engine_parameter", - "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" + "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index", + "from_window": "fiscal_year" }, "employment_income": { "basis": "engine_parameter", @@ -3933,11 +3950,13 @@ "transport_consumption": { "drawn_subtracts": [ "petrol_spending", - "diesel_spending" + "diesel_spending", + "bus_fare_spending" ], "components": [ "petrol_spending", - "diesel_spending" + "diesel_spending", + "bus_fare_spending" ] } }, @@ -4006,7 +4025,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary's 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (María's rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total." + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). The frame holds no fuel type, so the draw, keyed on the household identity, is what makes a vehicle-owning household a fuel buyer or a zero-emission one: it is random with respect to income and every other characteristic, and a household with several vehicles is all one or the other. With the redraw of microcosm#1113 every flagged household buys fuel, so this flag alone sets fuel incidence; who holds the zero-emission cars is a known residual. Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is moved to the base year by the declared uprate_donor_columns step (microcosm#890). Consumption columns and bus fares take the engine's CPI index from the April-to-March diary year, placed on the calendar-year index at three quarters of 2023 and one of 2024, to calendar 2024 (microcosm#1113; a full year's step would leave them a quarter past it, at about fiscal 2024-25 prices; the fare factor survives only where no fare cell levels the column, i.e. Wales). Income predictors take a full year's step on the engine's earnings, mixed-income and pension indices, to the FRS 2024-25 incomes they are matched against. Petrol and diesel take the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json, which sets only their donor distribution because the level step follows; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary's 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol, diesel and bus fares plus the levelled petrol and diesel and the priced bus fares. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the electricity and gas the stage derives from the diary: GBP 54.9bn on the donor, against GBP 60.1bn for all of its fuel, light and power. The derivation splits all of that total where the household reports no combined payment (2,978 of the 4,202 diaries), so those households' liquid and solid fuels leave with the drawn energy; where it reads the combined payment, the rest (GBP 5.2bn) stays in the housing remainder. The remainder therefore holds part of the diary's other fuels, beside other energy payments, and no column carries them; the receipt records their published ONS 04.5.3 and 04.5.4 spend. The two totals keep their committed support bounds, which the terminal support gate applies to the emitted frame; the recomposed_totals gate checks the declaration and the receipt. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, a declared proxy that carries the January 2025 rise in the English fare cap Northern Ireland did not have, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (María's rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total." }, { "stage": "etb_vat", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 851c9df287..13f794c811 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -2847,46 +2847,62 @@ stages: from_period: 2023 to_period: 2024 instant: january_first + fiscal_year_bridge: + start_year_weight: 0.75 + next_year_weight: 0.25 columns: food_and_non_alcoholic_beverages_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year alcohol_and_tobacco_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year clothing_and_footwear_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year housing_water_and_electricity_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year household_furnishings_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year health_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year transport_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year communication_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year recreation_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year education_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year restaurants_and_hotels_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year miscellaneous_consumption: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year bus_fare_spending: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.consumer_price_index + from_window: fiscal_year employment_income: basis: engine_parameter parameter_path: gov.economic_assumptions.indices.obr.average_earnings @@ -3227,9 +3243,11 @@ stages: drawn_subtracts: - petrol_spending - diesel_spending + - bus_fare_spending components: - petrol_spending - diesel_spending + - bus_fare_spending uncarried: resource: ons_household_expenditure_facts.json period_value: 2024 @@ -3283,7 +3301,7 @@ stages: - electricity_consumption - gas_consumption - has_fuel_consumption - notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine''s CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine''s earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary''s 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the diary''s electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary''s level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (María''s rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers'' imputed rent and 12.6.1 FISIM), on ONS''s domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel''s frame litres with HMRC''s clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.' + notes: 'Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent''s WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). The frame holds no fuel type, so the draw, keyed on the household identity, is what makes a vehicle-owning household a fuel buyer or a zero-emission one: it is random with respect to income and every other characteristic, and a household with several vehicles is all one or the other. With the redraw of microcosm#1113 every flagged household buys fuel, so this flag alone sets fuel incidence; who holds the zero-emission cars is a known residual. Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (María''s rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain''s raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household''s QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk''s seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED''s Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person''s annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household''s non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area''s price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England''s trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame''s eligible trip share beside the publisher''s concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is moved to the base year by the declared uprate_donor_columns step (microcosm#890). Consumption columns and bus fares take the engine''s CPI index from the April-to-March diary year, placed on the calendar-year index at three quarters of 2023 and one of 2024, to calendar 2024 (microcosm#1113; a full year''s step would leave them a quarter past it, at about fiscal 2024-25 prices; the fare factor survives only where no fare cell levels the column, i.e. Wales). Income predictors take a full year''s step on the engine''s earnings, mixed-income and pension indices, to the FRS 2024-25 incomes they are matched against. Petrol and diesel take the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json, which sets only their donor distribution because the level step follows; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey''s age-18 split) predict on both sides; the recipient counts its members by age, not through the engine''s is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor''s distribution among households with positive road fuel, on the chain''s predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor''s own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary''s 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain''s draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol, diesel and bus fares plus the levelled petrol and diesel and the priced bus fares. The chain draws each part after, and conditional on, its total, so the remainder is the chain''s own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain''s domestic-energy target is the electricity and gas the stage derives from the diary: GBP 54.9bn on the donor, against GBP 60.1bn for all of its fuel, light and power. The derivation splits all of that total where the household reports no combined payment (2,978 of the 4,202 diaries), so those households'' liquid and solid fuels leave with the drawn energy; where it reads the combined payment, the rest (GBP 5.2bn) stays in the housing remainder. The remainder therefore holds part of the diary''s other fuels, beside other energy payments, and no column carries them; the receipt records their published ONS 04.5.3 and 04.5.4 spend. The two totals keep their committed support bounds, which the terminal support gate applies to the emitted frame; the recomposed_totals gate checks the declaration and the receipt. Every household spend column is at calendar-2024 prices as households paid them, the H5''s year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area''s fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England''s index, a declared proxy that carries the January 2025 rise in the English fare cap Northern Ireland did not have, Scotland''s calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (María''s rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers'' imputed rent and 12.6.1 FISIM), on ONS''s domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel''s frame litres with HMRC''s clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.' - stage: etb_vat survey: Effects of Taxes and Benefits 1977-2024 source: UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource. diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json index 351f313365..6be2ca1f55 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json @@ -11149,7 +11149,7 @@ "status": "signed_excluded", "matched_fact_count_overall": 7, "matched_fact_count_at_or_before_period": 2, - "signed_rationale": "The OBR fuel duties fact is all-road-users receipts (freight, vans, business mileage) against a household frame; obr.fuel_duties_cars binds the cars receipts from the OBR vehicle-type release instead (ruling 2026-09-10). The all-road-users row is retained in the contract for registry parity and signed out here rather than carried as a calibration measure exclusion." + "signed_rationale": "The OBR fuel duties fact is all-road-users receipts (freight, vans, business mileage) against a household frame. obr.fuel_duties_cars, the cars receipts from the OBR vehicle-type release, was bound in its place (ruling 2026-09-10) until microcosm#1113 moved it to the measure-exclusion register (Mar\u00eda's ruling of 2026-10-08, D2); household road-fuel spend is bound on ons.household_road_fuel_expenditure, and no fuel-duty row is fitted. The all-road-users row is retained in the contract for registry parity and signed out here rather than carried as a calibration measure exclusion." } ] }, @@ -19308,7 +19308,7 @@ "status": "signed_excluded", "matched_fact_count_overall": 6, "matched_fact_count_at_or_before_period": 6, - "signed_rationale": "ONS Consumer Trends COICOP 04.5 (electricity, gas and other fuels) carries liquid and solid fuels the frame does not model; chronicle #271 (chronicle#270) published the 04.5.1 electricity and 04.5.2 gas sub-classes, which ons.household_electricity_expenditure and ons.household_gas_expenditure bind per fuel on the frame's own columns. The total row is retained in the contract for registry parity and signed out here (microcosm#890 F1)." + "signed_rationale": "ONS Consumer Trends COICOP 04.5 (electricity, gas and other fuels) carries liquid and solid fuels the frame does not model; chronicle #271 (chronicle#270) published the 04.5.1 electricity and 04.5.2 gas sub-classes, which ons.household_electricity_expenditure and ons.household_gas_expenditure carry per fuel on the frame's own columns. Both were bound until microcosm#1113 made them measured diagnostics (Mar\u00eda's ruling of 2026-10-08, D1), so no ONS energy row is fitted. The total row is retained in the contract for registry parity and signed out here (microcosm#890 F1)." } ] }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json index c7fb3ae25e..4466d41fd7 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json @@ -52,7 +52,7 @@ { "target_id": "obr.fuel_duties", "reason_id": "universe_scope_all_road_users", - "rationale": "The OBR fuel duties fact is all-road-users receipts (freight, vans, business mileage) against a household frame; obr.fuel_duties_cars binds the cars receipts from the OBR vehicle-type release instead (ruling 2026-09-10). The all-road-users row is retained in the contract for registry parity and signed out here rather than carried as a calibration measure exclusion.", + "rationale": "The OBR fuel duties fact is all-road-users receipts (freight, vans, business mileage) against a household frame. obr.fuel_duties_cars, the cars receipts from the OBR vehicle-type release, was bound in its place (ruling 2026-09-10) until microcosm#1113 moved it to the measure-exclusion register (María's ruling of 2026-10-08, D2); household road-fuel spend is bound on ons.household_road_fuel_expenditure, and no fuel-duty row is fitted. The all-road-users row is retained in the contract for registry parity and signed out here rather than carried as a calibration measure exclusion.", "tracking": "microcosm#890", "approved_by": "juaristi22", "approved_on": "2026-09-11" @@ -60,7 +60,7 @@ { "target_id": "ons.household_energy_expenditure", "reason_id": "superseded_by_component_targets", - "rationale": "ONS Consumer Trends COICOP 04.5 (electricity, gas and other fuels) carries liquid and solid fuels the frame does not model; chronicle #271 (chronicle#270) published the 04.5.1 electricity and 04.5.2 gas sub-classes, which ons.household_electricity_expenditure and ons.household_gas_expenditure bind per fuel on the frame's own columns. The total row is retained in the contract for registry parity and signed out here (microcosm#890 F1).", + "rationale": "ONS Consumer Trends COICOP 04.5 (electricity, gas and other fuels) carries liquid and solid fuels the frame does not model; chronicle #271 (chronicle#270) published the 04.5.1 electricity and 04.5.2 gas sub-classes, which ons.household_electricity_expenditure and ons.household_gas_expenditure carry per fuel on the frame's own columns. Both were bound until microcosm#1113 made them measured diagnostics (María's ruling of 2026-10-08, D1), so no ONS energy row is fitted. The total row is retained in the contract for registry parity and signed out here (microcosm#890 F1).", "tracking": "microcosm#890", "approved_by": "juaristi22", "approved_on": "2026-09-16" diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_references.json b/packages/microcosm-build/src/microcosm/build/uk/target_references.json index b29871dea8..423cd4709b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -23665,7 +23665,10 @@ "period_type": "calendar_year", "dimension_values": { "coicop": "04.5.1", - "frequency": "annual" + "frequency": "annual", + "consumption_concept": "domestic", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted" }, "geography_level": "country", "geography_id": "K02000001" @@ -23688,7 +23691,10 @@ "period_type": "calendar_year", "dimension_values": { "coicop": "04.5.2", - "frequency": "annual" + "frequency": "annual", + "consumption_concept": "domestic", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted" }, "geography_level": "country", "geography_id": "K02000001" @@ -23711,7 +23717,10 @@ "period_type": "calendar_year", "dimension_values": { "coicop": "07.2.2", - "frequency": "annual" + "frequency": "annual", + "consumption_concept": "domestic", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted" }, "geography_level": "country", "geography_id": "K02000001" diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 3cad48838a..9653d0378f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -702,11 +702,11 @@ "dft.bus_fare_receipts.uk": "#789 consumer target.", "dft.bus_net_support.uk": "#789 consumer target.", "hmrc.cgt.liability_total": "Observed FY2024-25 individuals liability from the pinned HMRC Table 1 fact. No incumbent same-basis liability target; OBR cash is a separate diagnostic.", - "obr.fuel_duties_cars": "No incumbent ancestor: uk-data bound the all-road-users OBR fuel duties total; the cars receipts from the OBR vehicle-type release are a net-new household-incidence target (microcosm#890 E1, ruling 2026-09-10).", + "obr.fuel_duties_cars": "No incumbent ancestor: uk-data bound the all-road-users OBR fuel duties total; the cars receipts from the OBR vehicle-type release are a net-new household-incidence target (microcosm#890 E1, ruling 2026-09-10); a measured diagnostic since microcosm#1113.", "orr.rail_government_support": "No incumbent target: uk-data scaled rail_subsidy_spending to the ORR total after calibration (the #790 rail scaler); microcosm#890 G binds the ORR table 7270 fact instead.", - "ons.household_energy_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 binds ONS Consumer Trends COICOP 04.5.", - "ons.household_electricity_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 binds ONS Consumer Trends COICOP 04.5.1 electricity per fuel (chronicle#270 / #271).", - "ons.household_gas_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 binds ONS Consumer Trends COICOP 04.5.2 gas per fuel (chronicle#270 / #271).", + "ons.household_energy_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 declared ONS Consumer Trends COICOP 04.5, signed out for its per-fuel sub-classes.", + "ons.household_electricity_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 bound ONS Consumer Trends COICOP 04.5.1 electricity per fuel (chronicle#270 / #271); a measured diagnostic since microcosm#1113.", + "ons.household_gas_expenditure": "No incumbent target: uk-data raked energy to NEED means and never bound a household-sector expenditure total; microcosm#890 F1 bound ONS Consumer Trends COICOP 04.5.2 gas per fuel (chronicle#270 / #271); a measured diagnostic since microcosm#1113.", "ons.household_road_fuel_expenditure": "No incumbent target: uk-data bound the all-road-users OBR fuel duties total and never a household road-fuel spend; microcosm#1113 binds ONS Consumer Trends COICOP 07.2.2 on petrol plus diesel spend in place of the OBR cars receipts, which stay measured as a diagnostic.", "scotgov.bus.passenger_revenue": "No incumbent target: uk-data uplifted DfT England fares to the UK by population; microcosm#890 binds the Scotland leg from Scottish Transport Statistics.", "scotgov.bus.government_support": "No incumbent target: uk-data uplifted DfT England support to the UK by population; microcosm#890 binds the Scotland leg from Scottish Transport Statistics.", @@ -15031,7 +15031,10 @@ "period_type": "calendar_year", "dimension_values": { "coicop": "04.5", - "frequency": "annual" + "frequency": "annual", + "consumption_concept": "domestic", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted" } }, "category_id": "ons.consumer_trends", @@ -15066,7 +15069,10 @@ "period_type": "calendar_year", "dimension_values": { "coicop": "04.5.1", - "frequency": "annual" + "frequency": "annual", + "consumption_concept": "domestic", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted" } }, "category_id": "ons.consumer_trends", @@ -15101,7 +15107,10 @@ "period_type": "calendar_year", "dimension_values": { "coicop": "04.5.2", - "frequency": "annual" + "frequency": "annual", + "consumption_concept": "domestic", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted" } }, "category_id": "ons.consumer_trends", @@ -15121,7 +15130,7 @@ "policyengine": { "metric_name": "ons/household_road_fuel_expenditure", "value_expression": "petrol_spending + diesel_spending", - "notes": "ONS Consumer Trends COICOP 07.2.2 fuels and lubricants for personal transport equipment, current prices, calendar year, bound on the frame's petrol plus diesel spend (microcosm#1113). The publisher class also carries other motor fuels and lubricants, about 0.4 percent of it on the LCFS 2023-24 diary (c72213), which the measure does not. The lcfs_consumption stage levels petrol plus diesel to the calendar-2024 row less that share, so this row reads about 0.4 percent low from scope alone: a known offset, left in place and not scaled into the target (María's ruling of 2026-10-10). ONS publishes the class on the domestic concept (spending on UK territory; PolicyEngine/chronicle#322): it includes non-residents' fuel bought in the UK, which the residents-only frame does not hold, and leaves out residents' fuel bought abroad. Consumer Trends publishes those two flows for total spending only (for 2024, GBP 64.7bn by non-residents in the UK, 3.8 percent of the domestic total, and GBP 78.9bn by residents abroad) and splits them by no class, so no national bridge is applied and their size for road fuel is not known. Beyond the scope offset, the design-weight gap to this calendar-2025 row is the engine's 2024-to-2025 uprating of the two columns against ONS's own growth. Household-scope road fuel replaces the OBR cars receipts as the bound fuel row: those are a fiscal-year duty total that includes business use of cars, which the frame reaches only through the engine's conversion of spend to litres, so they stay measured as a diagnostic (calibration_measure_exclusions.json)." + "notes": "ONS Consumer Trends COICOP 07.2.2 fuels and lubricants for personal transport equipment, current prices, calendar year, bound on the frame's petrol plus diesel spend (microcosm#1113). The publisher class also carries other motor fuels and lubricants, about 0.4 percent of it on the LCFS 2023-24 diary (c72213), which the measure does not. The lcfs_consumption stage levels petrol plus diesel to the calendar-2024 row less that share, so this row reads about 0.4 percent low from scope alone: a known offset, left in place and not scaled into the target (María's ruling of 2026-10-10). ONS publishes the class on the domestic concept (spending on UK territory; PolicyEngine/chronicle#322): it includes non-residents' fuel bought in the UK, which the residents-only frame does not hold, and leaves out residents' fuel bought abroad. Consumer Trends publishes those two flows for total spending only (for 2024, GBP 64.7bn by non-residents in the UK, 3.8 percent of the domestic total, and GBP 78.9bn by residents abroad) and splits them by no class, so no national bridge is applied and their size for road fuel is not known. Beyond the scope offset, the design-weight gap to this calendar-2025 row is the engine's 2024-to-2025 uprating of the two columns against ONS's own move (37.025bn to 35.099bn, -5.2 percent). policyengine-uk 2.122.2 carries both columns -2.7 percent, so on that version the row reads about +2.3 percent at design weights, scope offset included, and the calibration closes that by moving weight away from fuel buyers. That is a desk figure from the engine's indices; the national remeasure records the measured one. Household-scope road fuel replaces the OBR cars receipts as the bound fuel row: those are a fiscal-year duty total that includes business use of cars, which the frame reaches only through the engine's conversion of spend to litres, so they stay measured as a diagnostic (calibration_measure_exclusions.json)." }, "axiom": { "metric_name": "ons/household_road_fuel_expenditure", @@ -15136,7 +15145,10 @@ "period_type": "calendar_year", "dimension_values": { "coicop": "07.2.2", - "frequency": "annual" + "frequency": "annual", + "consumption_concept": "domestic", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted" } }, "category_id": "ons.consumer_trends", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/donor_uprating.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/donor_uprating.py index 0e8b5ff17b..97ebd73b12 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/donor_uprating.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/donor_uprating.py @@ -7,7 +7,12 @@ * ``engine_parameter`` — the ratio of a PolicyEngine UK parameter at the two January-first instants (the SPI-donor precedent in ``spi_income``), read from the installed engine so the factor stays lockstepped with what the engine - itself applies afterwards; + itself applies afterwards. That ratio is a full year's step. A column that + declares ``from_window: fiscal_year`` instead starts from the April-to-March + year beginning in ``from_period``, placed on the calendar-year index by the + operation's ``fiscal_year_bridge`` weights (three quarters in the starting + year, one in the next), and ends at calendar ``to_period`` (microcosm#1113: + a full step would carry a 2023-24 diary a quarter past calendar 2024); * ``vendored_litre_proxy`` — publisher outturn for road fuel: the DESNZ annual pump-price ratio times the HMRC fiscal-year litres ratio over the ONS population ratio, all read from the vendored Chronicle facts (María's ruling @@ -34,6 +39,12 @@ BASIS_ENGINE_PARAMETER = "engine_parameter" BASIS_VENDORED_LITRE_PROXY = "vendored_litre_proxy" BASIS_VENDORED_RATIO = "vendored_ratio" +#: A column whose donor values are at the prices of the April-to-March year +#: starting in ``from_period``, not of calendar ``from_period``. +FROM_WINDOW_FISCAL_YEAR = "fiscal_year" +#: Where an April-to-March year sits on a calendar-year index: three quarters +#: in its starting year and one in the next. +UK_FISCAL_YEAR_CALENDAR_WEIGHTS = (0.75, 0.25) ParameterReader = Callable[[str, int], float] @@ -86,11 +97,21 @@ def donor_uprating_factors( raise ValueError( f"uprate_donor_columns lists exempt columns as uprated: {overlap}." ) + bridge = _fiscal_year_bridge(parameters) reader = parameter_reader factors: dict[str, float] = {} receipt_columns: dict[str, dict[str, Any]] = {} for column, spec in columns.items(): basis = str(spec.get("basis") or "") + window = spec.get("from_window") + if window is not None and ( + basis != BASIS_ENGINE_PARAMETER or window != FROM_WINDOW_FISCAL_YEAR + ): + raise ValueError( + f"uprate_donor_columns column {column!r} declares from_window " + f"{window!r}; only a fiscal_year window on an engine_parameter " + "basis is supported." + ) if basis == BASIS_ENGINE_PARAMETER: if reader is None: reader = engine_parameter_reader() @@ -98,8 +119,25 @@ def donor_uprating_factors( before = reader(path, from_period) after = reader(path, to_period) _require_positive(column, before, after) - factor = after / before detail = {"parameter_path": path, "before": before, "after": after} + if window is None: + factor = after / before + else: + if bridge is None: + raise ValueError( + f"uprate_donor_columns column {column!r} declares a " + "fiscal_year window but the operation declares no " + "fiscal_year_bridge." + ) + following = ( + after + if to_period == from_period + 1 + else reader(path, from_period + 1) + ) + _require_positive(column, before, following) + base = bridge[0] * before + bridge[1] * following + factor = after / base + detail.update({"from_window": window, "base": base}) elif basis == BASIS_VENDORED_LITRE_PROXY: factor, detail = _litre_proxy_factor(spec, from_period, to_period) audit_path = spec.get("audit_parameter_path") @@ -133,9 +171,35 @@ def donor_uprating_factors( "columns": receipt_columns, "exempt": list(exempt), } + if bridge is not None: + receipt["fiscal_year_bridge"] = { + "start_year_weight": bridge[0], + "next_year_weight": bridge[1], + } return factors, receipt +def _fiscal_year_bridge(parameters: Mapping[str, Any]) -> tuple[float, float] | None: + """The declared calendar-year weights of the April-to-March starting year.""" + + declared = parameters.get("fiscal_year_bridge") + if declared is None: + return None + if not isinstance(declared, Mapping): + raise ValueError("uprate_donor_columns fiscal_year_bridge must be a mapping.") + weights = ( + float(declared["start_year_weight"]), + float(declared["next_year_weight"]), + ) + if weights != UK_FISCAL_YEAR_CALENDAR_WEIGHTS: + raise ValueError( + "uprate_donor_columns fiscal_year_bridge must be " + f"{UK_FISCAL_YEAR_CALENDAR_WEIGHTS}: an April-to-March year has three " + f"quarters in its starting year and one in the next; got {weights}." + ) + return weights + + def apply_donor_uprating( table: pd.DataFrame, factors: Mapping[str, float] ) -> pd.DataFrame: diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py index 6d9bee6230..32bf45da27 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/energy_pricing.py @@ -2,7 +2,7 @@ to the NEED shape at the DESNZ level (microcosm#890 F, chronicle#270). The LCFS diary and the consumption QRF carry energy as pounds. Four published -facts turn that into a base-year (FY2024-25) frame under one declared +facts turn that into a base-year (calendar 2024) frame under one declared operation, ``price_domestic_energy``: * price: the DESNZ Quarterly Energy Prices average variable unit cost diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py index 2a973ecc30..9d16866a10 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/lcfs_consumption.py @@ -151,6 +151,10 @@ CONSUMPTION_VARIABLE_RENAMES[f"p6{division:02d}"] for division in range(1, 13) ) BUS_FARE_LCFS_CODES = ("c73212", "c73213", "c73214") +#: The spend columns a price index carries from the April-to-March diary to +#: the calendar base year (microcosm#1113). Energy and road fuel are not here: +#: later steps set their levels for that year. +UK_LCFS_DIARY_PRICE_COLUMNS = (*UK_LCFS_COICOP_DIVISION_COLUMNS, "bus_fare_spending") #: Cars and vans available to the household: LCFS ``a124`` on the donor, the #: was_wealth QRF draw of WAS ``vcarnr8`` on the recipient (the FRS carries no #: vehicle variable). Both sides are rounded and clipped to this closed range so @@ -215,6 +219,9 @@ #: How the litres audit benchmarks each fuel: HMRC's all-road-user litres times #: the cars share of that fuel's road use (PolicyEngine/chronicle#322). UK_LITRES_AUDIT_PER_FUEL_BASIS = "desnz cars share of each fuel's road use" +#: The fallback when DESNZ publishes no vehicle split for the audit's year: the +#: OBR cars share of duty receipts on both fuels, which only the total can bear. +UK_LITRES_AUDIT_UNIFORM_BASIS = "uniform cars share, not a per-fuel benchmark" UK_DESNZ_ROAD_FUEL_CONCEPT = "desnz.road_transport.fuel_consumption" UK_LITRES_AUDIT_FUELS = {"petrol_spending": "petrol", "diesel_spending": "diesel"} #: The litres audit (microcosm#890 C7) reads these vendored concepts beside the @@ -280,18 +287,22 @@ #: each maps to the chain draws subtracted from its own draw to leave its #: remainder, and the levelled columns added back. The chain draws each part #: after its total, so the split is the chain's own. Housing (p604) nets the -#: drawn electricity and gas (the chain's domestic-energy target is the diary's -#: electricity plus gas), so the liquid and solid fuels no column carries stay -#: in its remainder; transport (p607) nets the drawn petrol and diesel (c72211, -#: c72212) and keeps other motor fuels. +#: chain's domestic-energy draw, which is the electricity and gas +#: ``derive_energy_from_lcfs`` makes of the diary. That derivation splits all of +#: ``p537`` (fuel, light and power) where the household reports no combined +#: payment, so those households' liquid and solid fuels leave with the drawn +#: energy; where it reads the combined payment, whatever else ``p537`` holds +#: stays in the housing remainder. Transport (p607) nets the drawn petrol and +#: diesel (c72211, c72212) and the drawn bus fares (which the pricing step +#: replaces with journeys times yield), and keeps other motor fuels. UK_LCFS_RECOMPOSED_PARENTS: Mapping[str, tuple[tuple[str, ...], tuple[str, ...]]] = { "housing_water_and_electricity_consumption": ( ("domestic_energy_consumption",), ("electricity_consumption", "gas_consumption"), ), "transport_consumption": ( - ("petrol_spending", "diesel_spending"), - ("petrol_spending", "diesel_spending"), + ("petrol_spending", "diesel_spending", "bus_fare_spending"), + ("petrol_spending", "diesel_spending", "bus_fare_spending"), ), } #: The chain draws a recomposition subtracts, kept before any step re-levels them. @@ -488,7 +499,7 @@ def __call__(self, frame: Frame) -> Frame: capture = ( None if uprating is None - else division_capture( + else division_capture_or_reason( household_draws, weights=weights, period_value=int(uprating["to_period"]), @@ -555,8 +566,24 @@ class UKLCFSConsumptionImputationResult: fit_weight_records: tuple[FitWeightRecord, ...] +class DiagnosticUnavailableError(ValueError): + """A report-only diagnostic's published row is missing or ambiguous. + + Raised only by the diagnostics' own row lookups, so the stage can record + why a report-only block has no figures and carry on. A vendored resource + that lags the feed pin still fails in ``vendored_rows`` as a plain error. + """ + + #: ONS Consumer Trends' generic concept for the divisions and classes. UK_ONS_HFCE_CONCEPT = "ons.household_final_consumption_expenditure" +#: The variant of each Consumer Trends row the diagnostic reads: annual, +#: current prices, not seasonally adjusted. +UK_ONS_HFCE_ROW_DIMENSIONS = { + "frequency": "annual", + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted", +} #: Each LCFS division column and its COICOP division. UK_LCFS_DIVISION_COICOP = { column: f"{division:02d}" @@ -580,13 +607,14 @@ def _ons_annual_value( period_type="calendar_year", period_value=int(period_value), dimensions={ + **UK_ONS_HFCE_ROW_DIMENSIONS, "coicop": coicop, "source_sheet": source_sheet, "consumption_concept": consumption_concept, }, ) if len(rows) != 1: - raise ValueError( + raise DiagnosticUnavailableError( f"{UK_LCFS_ONS_EXPENDITURE_RESOURCE}: expected one {coicop} " f"({source_sheet}, {consumption_concept}) row for {period_value}, " f"found {len(rows)}." @@ -670,6 +698,32 @@ def division_capture( } +def division_capture_or_reason( + household_draws: pd.DataFrame, *, weights: Sequence[float], period_value: int +) -> dict[str, Any]: + """The division capture, or why it has no figures for this year. + + The block is report-only, so a Consumer Trends row that is missing or + ambiguous for the year must not stop the stage: the receipt records the + reason in place of the figures. + """ + + try: + return division_capture( + household_draws, weights=weights, period_value=period_value + ) + except DiagnosticUnavailableError as error: + return { + "resource": UK_LCFS_ONS_EXPENDITURE_RESOURCE, + "concept": UK_ONS_HFCE_CONCEPT, + "period_type": "calendar_year", + "period_value": int(period_value), + "available": False, + "reason": str(error), + "gated": False, + } + + def desnz_cars_share_by_fuel(period_value: int) -> dict[str, dict[str, Any]]: """The cars share of each fuel's UK road use, from DESNZ's vehicle/fuel ktoe. @@ -695,7 +749,7 @@ def desnz_cars_share_by_fuel(period_value: int) -> dict[str, dict[str, Any]]: continue vehicle = str(dims.get("vehicle_type")) if vehicle in by_vehicle: - raise ValueError( + raise DiagnosticUnavailableError( f"{UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE}: duplicate {vehicle} {fuel} " f"row for {period_value}." ) @@ -703,7 +757,7 @@ def desnz_cars_share_by_fuel(period_value: int) -> dict[str, dict[str, Any]]: record_ids.append(str(row.get("source_record_id", ""))) total = sum(by_vehicle.values()) if "cars" not in by_vehicle or total <= 0: - raise ValueError( + raise DiagnosticUnavailableError( f"{UK_LCFS_ROAD_FUEL_BY_VEHICLE_RESOURCE}: no {fuel} cars row for " f"{period_value}." ) @@ -792,14 +846,19 @@ def receipts(category: str) -> float: cars, total = receipts(UK_OBR_CARS_CATEGORY), receipts(UK_OBR_TOTAL_CATEGORY) cars_share = cars / total - desnz = desnz_cars_share_by_fuel(to_period) + try: + desnz: dict[str, dict[str, Any]] | None = desnz_cars_share_by_fuel(to_period) + unavailable = None + except DiagnosticUnavailableError as error: + desnz, unavailable = None, str(error) for column, entry in fuels.items(): fuel = UK_LITRES_AUDIT_FUELS[column] - entry["desnz_cars_share"] = desnz[fuel]["cars_share"] - entry["desnz_ktoe_by_vehicle"] = desnz[fuel]["ktoe_by_vehicle"] - entry["cars_litres_benchmark"] = ( - entry["hmrc_litres_all_road_users"] * desnz[fuel]["cars_share"] - ) + share = cars_share + if desnz is not None: + share = desnz[fuel]["cars_share"] + entry["desnz_cars_share"] = share + entry["desnz_ktoe_by_vehicle"] = desnz[fuel]["ktoe_by_vehicle"] + entry["cars_litres_benchmark"] = entry["hmrc_litres_all_road_users"] * share entry["frame_over_cars_benchmark"] = ( entry["frame_litres"] / entry["cars_litres_benchmark"] if entry["cars_litres_benchmark"] > 0 @@ -829,7 +888,12 @@ def receipts(category: str) -> float: "frame_over_obr_uniform_cars_benchmark": ( frame_total / obr_benchmark_total if obr_benchmark_total > 0 else None ), - "per_fuel_ratio_basis": UK_LITRES_AUDIT_PER_FUEL_BASIS, + "per_fuel_ratio_basis": ( + UK_LITRES_AUDIT_PER_FUEL_BASIS + if desnz is not None + else UK_LITRES_AUDIT_UNIFORM_BASIS + ), + **({} if unavailable is None else {"cars_share_unavailable": unavailable}), "gated": False, } @@ -1296,8 +1360,8 @@ def recompose_parent_totals( A total keeps its own chain draw less the chain's draws of the parts the stage re-levels (``drawn``, kept before any step touched them; floored at zero where the parts outgrow the total), and adds the levelled parts back, - so it always contains the electricity, gas, petrol and diesel at their - published scale (microcosm#1113). The chain draws each part after, and + so it always contains the electricity, gas, petrol, diesel and priced bus + fares at their published scale (microcosm#1113). The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport (10 to 13 percent above the donor in-sample). @@ -1793,11 +1857,13 @@ def clean_lcfs_consumption_table( """Return the LCFS donor table with annualized consumption variables. ``uprating`` maps donor columns to the declared factors that move the - 2023-24 diary to the FRS 2024-25 base year (``uprate_donor_columns``); - it is applied after annualisation and before the donor-side NEED rake, so - the income bands and the support-clip ranges see base-year values. + 2023-24 diary to the base year (``uprate_donor_columns``): the spend + columns to calendar-2024 prices, the income predictors a full year to the + FRS 2024-25 incomes. It is applied after annualisation and before the + donor-side NEED rake, so the income bands and the support-clip ranges see + base-year values. ``energy`` (the declared ``price_domestic_energy``) converts the diary's - energy spend to kWh at the FY2024-25 regional average prices paid, rakes + energy spend to kWh at the calendar-2024 regional average prices paid, rakes the income margin to the NEED means (shape only, no level) and prices back; without it the energy columns are the raw diary spend. """ @@ -2098,14 +2164,15 @@ def support_clip_to_donor( def donor_realized_ranges(donor: pd.DataFrame) -> dict[str, tuple[float, float]]: """Donor support per clipped column. - Levelled columns carry no bounds, nor do the totals written back around - their levelled components, whose coherence the stage's recomposed-totals - check holds instead (microcosm#1113). + Levelled columns carry no bounds. The housing and transport totals keep + theirs although the stage writes them back around levelled components + (microcosm#1113): the terminal support check then holds the emitted totals + to the diary's own range, which a stage-time receipt check cannot do. """ ranges: dict[str, tuple[float, float]] = {} for column in UK_LCFS_CONSUMPTION_TARGET_COLUMNS: - if column in UK_LCFS_RAKED_COLUMNS or column in UK_LCFS_RECOMPOSED_PARENTS: + if column in UK_LCFS_RAKED_COLUMNS: continue values = pd.to_numeric(donor[column], errors="coerce") finite = values[np.isfinite(values)] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py index 50190c4759..868412498b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py @@ -2648,13 +2648,24 @@ def _consumption_basis_gate( """Every LCFS spend column is on the declared base year's prices. Checks on the receipts of the steps that set the spend levels - (microcosm#1113): the donor uprating's target year, the energy prices' - and the DESNZ level's periods, the bus prices' re-pricing year and the - road-fuel level's period must all be the declared calendar year, so - policyengine-uk can project every column from the H5's year with no - per-column bases. A step whose receipt is absent fails the check. + (microcosm#1113). The donor uprating must end at the declared year and + carry every diary spend column from the April-to-March diary year, placed + on the calendar-year index at three quarters and one quarter, not by a + full year's step, which would land a quarter past the calendar year. The + energy prices' and the DESNZ level's periods, the bus prices' re-pricing + year and the road-fuel level's period must all be the declared calendar + year. policyengine-uk can then project every column from the H5's year + with no per-column bases. A step whose receipt is absent fails the check. """ + from microcosm.build.uk_runtime.donor_uprating import ( + FROM_WINDOW_FISCAL_YEAR, + UK_FISCAL_YEAR_CALENDAR_WEIGHTS, + ) + from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_DIARY_PRICE_COLUMNS, + ) + check = "consumption_basis" period_type = str(parameters.get("period_type") or "") if period_type != "calendar_year": @@ -2678,12 +2689,39 @@ def period_of(block: Mapping[str, object]) -> tuple[object, object]: uprating = receipt("donor_uprating") if uprating is not None: - found["donor_uprating"] = ("calendar_year", uprating.get("to_period")) if uprating.get("to_period") != period_value: failures.append( f"{stage}: the donor uprating moves the diary to " f"{uprating.get('to_period')!r}, not {period_value}." ) + bridge = uprating.get("fiscal_year_bridge") + bridge = bridge if isinstance(bridge, Mapping) else {} + weights = (bridge.get("start_year_weight"), bridge.get("next_year_weight")) + columns = uprating.get("columns") + columns = columns if isinstance(columns, Mapping) else {} + full_step = [ + column + for column in UK_LCFS_DIARY_PRICE_COLUMNS + if not isinstance(columns.get(column), Mapping) + or columns[column].get("from_window") != FROM_WINDOW_FISCAL_YEAR + ] + bridged = not full_step and weights == UK_FISCAL_YEAR_CALENDAR_WEIGHTS + found["donor_uprating"] = ( + "calendar_year" if bridged else "fiscal_year", + uprating.get("to_period"), + ) + if full_step: + failures.append( + f"{stage}: the donor uprating does not carry {full_step} from " + "the April-to-March diary year, so a full year's step leaves " + f"them a quarter past calendar {period_value}." + ) + elif weights != UK_FISCAL_YEAR_CALENDAR_WEIGHTS: + failures.append( + f"{stage}: the donor uprating places the diary year on the " + f"calendar-year index at {weights}, not " + f"{UK_FISCAL_YEAR_CALENDAR_WEIGHTS}." + ) energy = receipt("energy_pricing") if energy is not None: level = energy.get("level") diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_donor_uprating.py b/packages/microcosm-build/tests/engine/uk/test_uk_donor_uprating.py index 1c0eafe912..b21cd6fc79 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_donor_uprating.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_donor_uprating.py @@ -11,6 +11,11 @@ def test_declared_factors_lockstep_with_the_installed_engine() -> None: lcfs_factors, lcfs_receipt = lcfs_donor_uprating(stages["lcfs_consumption"]) cpi_ratio = reader(CPI, 2024) / reader(CPI, 2023) + # The diary columns start from the April-to-March 2023-24 year and end at + # calendar 2024, so they take the bridged step, not the full year's. + diary_ratio = reader(CPI, 2024) / ( + 0.75 * reader(CPI, 2023) + 0.25 * reader(CPI, 2024) + ) cpi_columns = [ column for column, spec in lcfs_receipt["columns"].items() @@ -18,7 +23,8 @@ def test_declared_factors_lockstep_with_the_installed_engine() -> None: ] assert len(cpi_columns) == 13 for column in cpi_columns: - assert lcfs_factors[column] == cpi_ratio, column + assert lcfs_factors[column] == pytest.approx(diary_ratio), column + assert diary_ratio < cpi_ratio assert lcfs_factors["employment_income"] == reader( "gov.economic_assumptions.indices.obr.average_earnings", 2024 ) / reader("gov.economic_assumptions.indices.obr.average_earnings", 2023) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py index 4216ece6ee..67711267d3 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_consumption_resources.py @@ -87,12 +87,17 @@ def test_e6_support_bounds_resources_are_sha_bound_and_non_placeholder() -> None "f32d54d83cdecf023f0ac73530be3a99372099b596e0106a56eae42a64929e50" ) # Raked or levelled columns carry no bounds: energy, bus fares since - # microcosm#890, and since microcosm#1113 petrol, diesel and the housing and - # transport totals recomposed around the levelled parts. - assert len(lcfs["bounds"]) == 10 + # microcosm#890, and petrol and diesel since microcosm#1113. The housing + # and transport totals keep theirs: the stage recomposes them around the + # levelled parts, and the terminal support check holds the emitted totals. + assert len(lcfs["bounds"]) == 12 assert "bus_fare_spending" not in lcfs["bounds"] assert "petrol_spending" not in lcfs["bounds"] - assert "transport_consumption" not in lcfs["bounds"] + assert lcfs["bounds"]["housing_water_and_electricity_consumption"] == [ + -20000, + 300000, + ] + assert lcfs["bounds"]["transport_consumption"] == [0.0, 200000] assert vat["source"]["tab_sha256"] == ( "d0e94ebc92e85ca1b9fb3a7353dcaf41db2c5110c9f07c7793dc8c0b695250d8" ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_donor_uprating.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_donor_uprating.py index 913eb7cf2c..36f6731e68 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_donor_uprating.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_donor_uprating.py @@ -22,10 +22,24 @@ def test_both_donor_stages_declare_uprating_to_the_base_year() -> None: ] assert lcfs["columns"]["petrol_spending"]["basis"] == "vendored_litre_proxy" assert lcfs["columns"]["diesel_spending"]["basis"] == "vendored_litre_proxy" + # Every diary spend column starts from the April-to-March diary year and + # ends at calendar 2024 (microcosm#1113); income predictors move a full year. + assert lcfs["fiscal_year_bridge"] == { + "start_year_weight": 0.75, + "next_year_weight": 0.25, + } assert lcfs["columns"]["bus_fare_spending"] == { "basis": "engine_parameter", "parameter_path": CPI, + "from_window": "fiscal_year", } + bridged = sorted( + column + for column, spec in lcfs["columns"].items() + if spec.get("from_window") == "fiscal_year" + ) + assert bridged == sorted(UK_LCFS_DIARY_PRICE_COLUMNS) + assert "from_window" not in lcfs["columns"]["employment_income"] etb = uprating_operation(stages["etb_services"]) assert etb["columns"]["rail_subsidy_spending"]["concept"] == ( "orr.rail.total_government_support" @@ -205,6 +219,36 @@ def test_vendored_ratio_basis_selects_by_fiscal_start_and_geography() -> None: ) +def test_fiscal_year_window_ends_a_diary_column_at_the_calendar_year() -> None: + """A fiscal-year diary reaches calendar ``to_period``, not a quarter past it.""" + + bridge = {"start_year_weight": 0.75, "next_year_weight": 0.25} + factors, receipt = donor_uprating_factors( + { + "from_period": 2023, + "to_period": 2024, + "fiscal_year_bridge": bridge, + "columns": { + "food": { + "basis": "engine_parameter", + "parameter_path": CPI, + "from_window": "fiscal_year", + }, + "earnings": {"basis": "engine_parameter", "parameter_path": CPI}, + }, + }, + parameter_reader=_fake_reader, + ) + base = 0.75 * 1.51964 + 0.25 * 1.55763 + assert factors["food"] == pytest.approx(1.55763 / base) + # The bridged step is three quarters of the full year's, not all of it. + assert factors["food"] < factors["earnings"] == pytest.approx(1.55763 / 1.51964) + assert receipt["fiscal_year_bridge"] == bridge + assert receipt["columns"]["food"]["from_window"] == "fiscal_year" + assert receipt["columns"]["food"]["base"] == pytest.approx(base) + assert "from_window" not in receipt["columns"]["earnings"] + + @pytest.mark.parametrize( ("parameters", "match"), [ @@ -212,6 +256,46 @@ def test_vendored_ratio_basis_selects_by_fiscal_start_and_geography() -> None: {"from_period": 2024, "to_period": 2023, "columns": {"a": {}}}, "backwards", ), + ( + { + "from_period": 2023, + "to_period": 2024, + "columns": { + "a": { + "basis": "engine_parameter", + "parameter_path": CPI, + "from_window": "fiscal_year", + } + }, + }, + "no fiscal_year_bridge", + ), + ( + { + "from_period": 2023, + "to_period": 2024, + "fiscal_year_bridge": { + "start_year_weight": 0.5, + "next_year_weight": 0.5, + }, + "columns": {"a": {"basis": "engine_parameter", "parameter_path": CPI}}, + }, + "three quarters", + ), + ( + { + "from_period": 2023, + "to_period": 2024, + "columns": { + "a": { + "basis": "engine_parameter", + "parameter_path": CPI, + "from_window": "calendar_quarter", + } + }, + }, + "only a fiscal_year window", + ), ({"from_period": 2023, "to_period": 2024, "columns": {}}, "no columns"), ( { diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py index 7156739c40..7cfdc21811 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_lcfs_consumption.py @@ -825,10 +825,13 @@ def materialize(self, frame, variables, period): # Totals contain their levelled components (#1113). energy = out[["electricity_consumption", "gas_consumption"]].sum(axis=1) assert (out["housing_water_and_electricity_consumption"] >= energy).all() - assert (out["transport_consumption"] >= road_fuel).all() + # Transport holds the levelled road fuel and the priced bus fares together. + bus = out["bus_fare_spending"].to_numpy(dtype=float) + assert (out["transport_consumption"] >= road_fuel + bus - 1e-9).all() recomposed = evidence["recomposed_totals"]["parents"] + household_weights = result.weights_for("household").values assert recomposed["transport_consumption"]["weighted_components"] == ( - pytest.approx(level["level"]) + pytest.approx(level["level"] + household_weights @ bus) ) assert recomposed["housing_water_and_electricity_consumption"][ "weighted_total" @@ -1020,6 +1023,8 @@ def ons(coicop: str, sheet: str, concept: str = "domestic") -> float: "coicop": coicop, "source_sheet": sheet, "consumption_concept": concept, + "price_basis": "current_prices", + "seasonal_adjustment": "not_seasonally_adjusted", }, ) return float(row["value"]) @@ -1056,6 +1061,66 @@ def ons(coicop: str, sheet: str, concept: str = "domestic") -> float: assert capture["gated"] is False +def test_report_only_diagnostics_record_a_missing_year_and_do_not_raise( + monkeypatch, +) -> None: + """A report-only block says why it has no figures; it never stops a build.""" + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime import lcfs_consumption as module + from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_COICOP_DIVISION_COLUMNS, + DiagnosticUnavailableError, + desnz_cars_share_by_fuel, + division_capture, + division_capture_or_reason, + fuel_litres_audit, + ) + + draws = pd.DataFrame( + {column: [1.0e3, 2.0e3] for column in UK_LCFS_COICOP_DIVISION_COLUMNS} + ) + weights = np.array([1.0e7, 5.0e6]) + # No Consumer Trends row is vendored for 2031. + with pytest.raises(DiagnosticUnavailableError, match="expected one"): + division_capture(draws, weights=weights, period_value=2031) + recorded = division_capture_or_reason(draws, weights=weights, period_value=2031) + assert recorded["available"] is False and recorded["gated"] is False + assert "expected one" in recorded["reason"] + assert "divisions" not in recorded + assert "available" not in division_capture_or_reason( + draws, weights=weights, period_value=2024 + ) + + # DESNZ's vehicle split is vendored for 2022 to 2024 only. + with pytest.raises(DiagnosticUnavailableError, match="cars row"): + desnz_cars_share_by_fuel(2031) + + def no_split(period_value: int): + raise DiagnosticUnavailableError(f"no cars row for {period_value}.") + + monkeypatch.setattr(module, "desnz_cars_share_by_fuel", no_split) + stage = load_country_spec("uk").sources.stage_map()["lcfs_consumption"] + fuel = pd.DataFrame( + {"petrol_spending": [1500.0, 0.0], "diesel_spending": [0.0, 1200.0]} + ) + audit = fuel_litres_audit(fuel, weights=weights, stage=stage) + # The audit falls back to the OBR cars share on both fuels and says so. + assert audit["per_fuel_ratio_basis"] == ( + "uniform cars share, not a per-fuel benchmark" + ) + assert "no cars row" in audit["cars_share_unavailable"] + petrol = audit["fuels"]["petrol_spending"] + assert "desnz_cars_share" not in petrol + assert petrol["cars_litres_benchmark"] == pytest.approx( + petrol["hmrc_litres_all_road_users"] + * audit["obr_fuel_duty_receipts"]["cars_share"] + ) + assert audit["frame_over_cars_benchmark"] == pytest.approx( + audit["frame_over_obr_uniform_cars_benchmark"] + ) + + def test_road_fuel_level_reads_the_vendored_ons_row() -> None: """The declared level is ONS 07.2.2 for 2024 less the other-fuels share (#1113).""" @@ -1441,6 +1506,7 @@ def test_recompose_writes_each_total_around_its_levelled_parts() -> None: "domestic_energy_consumption": [2000.0, 900.0, 0.0], "petrol_spending": [800.0, 0.0, 0.0], "diesel_spending": [0.0, 700.0, 0.0], + "bus_fare_spending": [100.0, 0.0, 50.0], } ) # The levelled parts, beside the totals as the chain drew them. @@ -1452,6 +1518,8 @@ def test_recompose_writes_each_total_around_its_levelled_parts() -> None: "transport_consumption": [2000.0, 1000.0, 0.0], "petrol_spending": [1500.0, 0.0, 0.0], "diesel_spending": [0.0, 900.0, 0.0], + # Priced bus fares: journeys times yield, not the chain's draw. + "bus_fare_spending": [0.0, 250.0, 400.0], "food_and_non_alcoholic_beverages_consumption": [1.0, 2.0, 3.0], } ) @@ -1467,8 +1535,9 @@ def test_recompose_writes_each_total_around_its_levelled_parts() -> None: 600.0, 800.0, ] - # Transport: 2000 - 800 + 1500; 1000 - 700 + 900; 0. - assert out["transport_consumption"].tolist() == [2700.0, 1200.0, 0.0] + # Transport nets the drawn fuel and bus and adds the levelled fuel and the + # priced bus: 2000 - 900 + 1500; 1000 - 700 + 1150; 0 - 50 floors at 0, + 400. + assert out["transport_consumption"].tolist() == [2600.0, 1450.0, 400.0] assert out["food_and_non_alcoholic_beverages_consumption"].tolist() == [ 1.0, 2.0, @@ -1486,8 +1555,14 @@ def test_recompose_writes_each_total_around_its_levelled_parts() -> None: ) assert housing["rows_below_components"] == 0 transport = receipt["parents"]["transport_consumption"] - assert transport["weighted_total"] == 2.0 * 2700.0 + 1200.0 - assert transport["weighted_components"] == 2.0 * 1500.0 + 900.0 + assert transport["drawn_subtracts"] == [ + "petrol_spending", + "diesel_spending", + "bus_fare_spending", + ] + assert transport["weighted_total"] == 2.0 * 2600.0 + 1450.0 + 3.0 * 400.0 + assert transport["weighted_components"] == 2.0 * 1500.0 + 1150.0 + 3.0 * 400.0 + assert transport["rows_floored"] == 1 uncarried = receipt["uncarried"] expected = [ float( @@ -1550,6 +1625,7 @@ def test_recompose_refuses_a_declaration_it_does_not_apply(change, match) -> Non "transport_consumption", "petrol_spending", "diesel_spending", + "bus_fare_spending", ) draws = pd.DataFrame({column: [1.0] for column in columns}) with pytest.raises(ValueError, match=match): diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py index 794f4634a1..5b6d0e8da4 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py @@ -745,8 +745,10 @@ def test_packaged_exclusions_load(): # energy rows are a published-source residual against the stage's DESNZ # volume at QEP prices. The OBR cars receipts include business-paid car # fuel, so household road fuel is bound on ONS 07.2.2 in their place. A - # masked re-solve changed no other row's fit, so they are held out of the - # objective and measured by the diagnose tool. + # re-solve with the four masked together left the other rows fitting no + # worse, so they are held out of the objective and measured by the + # diagnose tool. The PR that added them closes microcosm#1113, so the + # three that tracked it track its follow-up issue, microcosm#1207. consumption_taxes = [e for e in exclusions if e["approved_on"] == "2026-10-08"] assert sorted(e["name"] for e in consumption_taxes) == [ "obr.fuel_duties_cars", @@ -766,9 +768,9 @@ def test_packaged_exclusions_load(): trackings = {e["name"]: e["tracking"] for e in consumption_taxes} assert trackings == { "obr.vat": "policyengine-uk#1996", - "obr.fuel_duties_cars": "microcosm#1113", - "ons.household_electricity_expenditure": "microcosm#1113", - "ons.household_gas_expenditure": "microcosm#1113", + "obr.fuel_duties_cars": "microcosm#1207", + "ons.household_electricity_expenditure": "microcosm#1207", + "ons.household_gas_expenditure": "microcosm#1207", } for entry in renewed: assert entry["expires_on"] == "2026-11-03", entry["name"] diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py index ad6b32cff9..4c91c57098 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py @@ -1631,9 +1631,21 @@ def test_consumption_basis_gate_holds_every_spend_level_to_calendar_2024() -> No "period_type": "calendar_year", "period_value": 2024, } + from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_DIARY_PRICE_COLUMNS, + ) + evidence = { "stage": "lcfs_consumption", - "donor_uprating": {"from_period": 2023, "to_period": 2024}, + "donor_uprating": { + "from_period": 2023, + "to_period": 2024, + "fiscal_year_bridge": {"start_year_weight": 0.75, "next_year_weight": 0.25}, + "columns": { + column: {"basis": "engine_parameter", "from_window": "fiscal_year"} + for column in UK_LCFS_DIARY_PRICE_COLUMNS + }, + }, "energy_pricing": { "period_type": "calendar_year", "period_value": 2024, @@ -1663,7 +1675,29 @@ def failing(mutate, fragment: str) -> None: passed = run(evidence) assert passed.passed, passed.failures assert passed.details["steps"]["energy_level"] == ("calendar_year", 2024) + assert passed.details["steps"]["donor_uprating"] == ("calendar_year", 2024) failing(lambda e: e["donor_uprating"].update(to_period=2025), "donor uprating") + # A diary column moved by a full year's step lands a quarter past the + # calendar year, whatever the receipt's target year says. + failing( + lambda e: e["donor_uprating"]["columns"]["health_consumption"].pop( + "from_window" + ), + "a quarter past calendar 2024", + ) + failing( + lambda e: e["donor_uprating"]["columns"].pop("bus_fare_spending"), + "a quarter past calendar 2024", + ) + failing( + lambda e: e["donor_uprating"]["fiscal_year_bridge"].update( + start_year_weight=1.0 + ), + "calendar-year index", + ) + failing( + lambda e: e["donor_uprating"].pop("fiscal_year_bridge"), "calendar-year index" + ) failing( lambda e: e["energy_pricing"].update(period_type="fiscal_year"), "energy prices" ) @@ -1775,6 +1809,7 @@ def test_recomposed_totals_gate_holds_totals_above_their_components() -> None: "domestic_energy_consumption": [2000.0, 900.0], "petrol_spending": [800.0, 0.0], "diesel_spending": [0.0, 700.0], + "bus_fare_spending": [100.0, 0.0], } ) draws = pd.DataFrame( @@ -1785,6 +1820,7 @@ def test_recomposed_totals_gate_holds_totals_above_their_components() -> None: "transport_consumption": [2000.0, 1000.0], "petrol_spending": [1500.0, 0.0], "diesel_spending": [0.0, 900.0], + "bus_fare_spending": [0.0, 250.0], } ) _, receipt = recompose_parent_totals( diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index eb1e83dd5f..627a52e24e 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -419,10 +419,10 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "9c08a68f9d63fff9f54dd21abb0a212723ff2074f0381cd7b69165e97c4c5ef6" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "f4eb5559cede924ae28b888f49e46a73133b43ea0468e01ddf2fae8be975e42b" + "942bc58008b07fd3477e9dd7a407a780a5c0ff37fc1c6790cf1beb858c604f1d" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "4ebc627b0ba172b0f0b06810f8053811f9b628058b87e0d281a93166b39f70c4" + "f8d079d8ce18afe076d99ddb237bc2fb45bc9f413c6fb771e3fe7348b2e27598" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -863,7 +863,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: _UK_CERTIFICATION_PART_DIGESTS: Mapping[str, Mapping[str, str]] = { "spine": { "gates_manifest_sha256": ( - "e6c5bc251657d6d73abacf5f62139458b29d515352f6bbd532d5e6da26bb24d3" + "f84884d2213c26b7fe70fe51a5137ac929e2114ad40bd6d2e652a27a259b0339" ), "policy_sha256": ( "984cc9abf94cc119fca8b3c5ca1a36633cdfdf17caf060e4d17a493151e50e18" @@ -871,7 +871,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "calibration_seam": { "gates_manifest_sha256": ( - "bb974753aa327f8d3a8c076763c427c008db4e1c8fddc418022a277d3ff25378" + "763df9874b4655caea7f6a54bb301fea0b02ba47dedde13f5fa65dd9428afad0" ), "policy_sha256": ( "5a78ad115f958eb20247534ff9fd52e5d5d4f277b608d55ad4251d48a7232049" @@ -879,7 +879,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "release_cut": { "gates_manifest_sha256": ( - "b08c43d431859f03845327f5a321047adb32e74e78035a5fceca35346e5234f6" + "bf62006c78b4f2d4b903c3b869a464de532158326acbf59684681de1e03beb9e" ), "policy_sha256": ( "5711e4f07003aa548de9a1c9b67e3949bc99294a4a7302f956735983f8b67d4c" diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index 1f7e56abfd..25cdd0c108 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -130,10 +130,10 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: "9c08a68f9d63fff9f54dd21abb0a212723ff2074f0381cd7b69165e97c4c5ef6" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "f4eb5559cede924ae28b888f49e46a73133b43ea0468e01ddf2fae8be975e42b" + "942bc58008b07fd3477e9dd7a407a780a5c0ff37fc1c6790cf1beb858c604f1d" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "4ebc627b0ba172b0f0b06810f8053811f9b628058b87e0d281a93166b39f70c4" + "f8d079d8ce18afe076d99ddb237bc2fb45bc9f413c6fb771e3fe7348b2e27598" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json index ff09f100d6..d92bdc763b 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json @@ -3487,7 +3487,7 @@ "gas_consumption", "has_fuel_consumption" ], - "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (Mar\u00eda's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is uprated to the FRS 2024-25 base year by the declared uprate_donor_columns step (microcosm#890), with consumption columns and bus fares uprated by the engine's CPI index (the fare factor survives only where no fare cell levels the column, i.e. Wales), income predictors by the engine's earnings, mixed-income and pension indices, petrol and diesel by the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary's 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol and diesel plus the levelled petrol and diesel. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the diary's electricity plus gas, so the liquid and solid fuels of COICOP 04.5, which have no column of their own, stay inside the housing remainder at the diary's level; the receipt records their published ONS 04.5.3 and 04.5.4 spend beside it. The two totals carry no committed support bound; the recomposed_totals gate holds them instead. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (Mar\u00eda's rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.", + "notes": "Ports the incumbent LCFS consumption QRF, including NEED energy raking, with adjudicated weighted fits and an identity-keyed seed-0 fuel flag. The vehicle count is a numeric QRF predictor on both sides (LCFS a124 on the donor, the was_wealth draw of WAS vcarnr8 on the recipient, both clipped to 0-5), which retires the incumbent's WAS-to-LCFS has-fuel bridge (microcosm#890 A). The recipient fuel flag is num_vehicles > 0 times a draw at the fuel-buyer share from the vendored DfT VEH1103 licensed-car stock (one minus the battery-electric and fuel-cell share, 2024, Great Britain; plug-in hybrids count as fuel buyers), replacing the hand-copied NTS share (microcosm#890 E2). The frame holds no fuel type, so the draw, keyed on the household identity, is what makes a vehicle-owning household a fuel buyer or a zero-emission one: it is random with respect to income and every other characteristic, and a household with several vehicles is all one or the other. With the redraw of microcosm#1113 every flagged household buys fuel, so this flag alone sets fuel incidence; who holds the zero-emission cars is a known residual. Energy support clipping is exempt because NEED raking governs those columns. Bus fares are clipped to donor support before the pricing step (Mar\u00eda's rulings 2026-09-15 and 2026-09-17), which bounds the region no area prices (Wales keeps the chain's raw draw) while the priced regions move beyond donor support afterwards; for that reason the column carries no committed support bound for the terminal gate. Domestic energy is raked in kWh to the NEED 2024 shape at the DESNZ level and priced at the average prices paid (microcosm#890 F, chronicle#270), where both NEED rakes take their mean-kWh margins from the vendored NEED 2024 tables (England and Wales by income band, tenure, property type and region; Scotland by income band, tenure and property type with the all-dwellings mean as its region margin; Northern Ireland untouched), the declared price_domestic_energy step converts spend to kWh and back at each household's QEP price region through the committed crosswalk using the calendar-2024 average variable unit cost and fixed cost across payment methods, standard metering, including VAT (Northern Ireland gas at the UK average because QEP publishes no Northern Ireland gas row), a gas fixed cost only for connected households, the gas connection imposed on the recipient frame at the published share of each region (DESNZ subnational gas meters over electricity meters, 2024) by disconnecting gas-positive households in an identity-keyed uniform order, skipping a household whose weight would overshoot the published share (Northern Ireland has no subnational row and keeps the positive-gas rule), and after the four-margin NEED rake one factor per fuel scales the kWh so the prior-weighted frame total equals the DESNZ Energy Trends domestic consumption at actual temperature summed over the four quarters of calendar 2024; NEED gas means are per gas-metered household, so the gas kWh margins are raked over connected households only while electricity is raked over every household, and the energy_rake gate recomputes every NEED mean, the DESNZ level and the connection shares from the vendored rows. The disconnection walk's seed-0 uniform order makes every group of households (dwelling type, income band, support channel) lose the same expected share of its drawn connected mass, so only the level of the drawn connection moves; the smallest-drawn-gas-first order it replaces piled the disconnections onto low-draw flats once the SPI support households drew gas from their own incomes, and NEED's Scottish property-type means then implied a level 2.6 % above the Scottish all-dwellings mean, a margin conflict the rake could not close. Bus fares are priced from journeys (microcosm#930), where the nts_bus_travel stage imputes each person's annual bus-in-London and other-local-bus trips and their concessionary eligibility, and the declared price_bus_journeys step sets bus_fare_spending as the sum over the household's non-eligible persons of trips times boardings per resident trip (the published BUS01 journeys over the published NTS0705a trips per resident times the ONS population) times the yield per fare-paying boarding (BUS05ai receipts over journeys less concessionary journeys), per area; bus-in-London trips take the London area's price for every resident, other-local-bus trips the price of the residence area (England outside London; Scotland and Northern Ireland from their own receipts and journeys with England's trip rate as the declared proxy); Wales is unpriced and keeps the raw draw. The chain still draws bus_fare_spending so later targets condition on the same raw draw; the emitted column is the priced value. The receipt records every factor, the frame-implied boardings beside the published ones and the frame's eligible trip share beside the publisher's concessionary boarding share, so the prior-weight fit of the bound receipts targets is read as a composition check, never a level the stage set; the #890 incidence draw and fare rake are retired. The 2023-24 diary is moved to the base year by the declared uprate_donor_columns step (microcosm#890). Consumption columns and bus fares take the engine's CPI index from the April-to-March diary year, placed on the calendar-year index at three quarters of 2023 and one of 2024, to calendar 2024 (microcosm#1113; a full year's step would leave them a quarter past it, at about fiscal 2024-25 prices; the fare factor survives only where no fare cell levels the column, i.e. Wales). Income predictors take a full year's step on the engine's earnings, mixed-income and pension indices, to the FRS 2024-25 incomes they are matched against. Petrol and diesel take the DESNZ pump-price times HMRC litres per head outturn from the vendored road_fuel_anchors.json, which sets only their donor distribution because the level step follows; the energy columns are exempt because the NEED 2024 shape at the DESNZ level and the QEP average prices paid set their level. The household adult and child counts (LCFS G018 and G019, the survey's age-18 split) predict on both sides; the recipient counts its members by age, not through the engine's is_adult and is_child flags, which policyengine-uk#1896 deprecates (uk-data#486, microcosm#1095). Road fuel incidence and level are set by two declared steps (microcosm#1113). The two-week diary leaves about a third of car-owning donors with no fuel purchase, which the chain reproduces among the households the fuel flag marks as fuel buyers, so the redraw_zero_road_fuel step redraws a flagged household that drew zero from the donor's distribution among households with positive road fuel, on the chain's predictors: a weighted regime-gated QRF draws the total, positive by construction, then the petrol share of it, at quantiles keyed on the household id; positive draws are kept. Then the level_road_fuel step, after the fuel flag has zeroed the households without a fuel car, scales petrol and diesel so their prior-weighted total equals ONS Consumer Trends household spending on COICOP 07.2.2 for calendar 2024 (the year of the DESNZ pump prices the donor uprating uses) less the donor's own other-fuels share of 07.2.2 (c72213), keeping the drawn mix. The diary's 07.2.2 has three lines (c72211 petrol, c72212 diesel and c72213, the other motor fuels and lubricants) and none for vehicle electricity. The LCFS diary records about a quarter less road fuel than ONS, and binding the OBR cars receipts had closed that gap by moving weight onto fuel-buying households; petrol and diesel therefore carry no committed support bound, like the other levelled columns. The totals that contain levelled columns are written back around them by the declared recompose_from_remainder step (microcosm#1113): each keeps its own chain draw less the chain's draws of the parts the stage re-levels, kept before any step touches them and floored at zero where the parts outgrow the total, and adds the levelled parts back, so housing_water_and_electricity_consumption is its draw less the drawn electricity and gas plus the levelled electricity and gas, and transport_consumption its draw less the drawn petrol, diesel and bus fares plus the levelled petrol and diesel and the priced bus fares. The chain draws each part after, and conditional on, its total, so the remainder is the chain's own split; a remainder drawn as a chain target of its own over-drew the vehicle-purchase tail of transport, 10 to 13 percent above the donor in-sample. The chain's domestic-energy target is the electricity and gas the stage derives from the diary: GBP 54.9bn on the donor, against GBP 60.1bn for all of its fuel, light and power. The derivation splits all of that total where the household reports no combined payment (2,978 of the 4,202 diaries), so those households' liquid and solid fuels leave with the drawn energy; where it reads the combined payment, the rest (GBP 5.2bn) stays in the housing remainder. The remainder therefore holds part of the diary's other fuels, beside other energy payments, and no column carries them; the receipt records their published ONS 04.5.3 and 04.5.4 spend. The two totals keep their committed support bounds, which the terminal support gate applies to the emitted frame; the recomposed_totals gate checks the declaration and the receipt. Every household spend column is at calendar-2024 prices as households paid them, the H5's year that policyengine-uk projects from and the calibration uprates to the calendar-2025 window (microcosm#1113): the diary columns by the CPI uprating to 2024, road fuel at ONS 07.2.2 for 2024, energy at DESNZ volume and QEP prices for 2024, and bus fares at each area's fiscal-year yield re-priced to 2024 by its fares index (the DfT local bus fares index by quarter for London and England outside London, Northern Ireland on England's index, a declared proxy that carries the January 2025 rise in the English fare cap Northern Ireland did not have, Scotland's calendar-year index); the consumption_basis gate holds every level-setting step to that year. policyengine-uk applies the fiscal 2024-25 rules to model year 2024 (it samples each parameter at 30 April), so every levelled column sits about a quarter before the midpoint of the policy year it is taxed in; the calibration binds calendar-year facts as published and fiscal-year facts at the calendar window (Mar\u00eda's rule of 2026-09-22). The stage receipt also reports, for each of the twelve COICOP divisions, the prior-weighted frame total against ONS Consumer Trends for the same calendar year less the classes a household diary does not record (02.3 narcotics, 04.2 owner-occupiers' imputed rent and 12.6.1 FISIM), on ONS's domestic concept, and the twelve together against the national concept as well; it is report-only (microcosm#1113). The report-only litres audit compares each fuel's frame litres with HMRC's clearances of that fuel scaled by the cars share of its road use, from the vendored DESNZ sub-national road transport fuel consumption by vehicle type and fuel (PolicyEngine/chronicle#322); the OBR cars share of fuel duty receipts, uniform across fuels, stays beside the total.", "operations": [ { "annualization_weeks": 52.17857142857143, @@ -3514,18 +3514,22 @@ "columns": { "alcohol_and_tobacco_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "bus_fare_spending": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "clothing_and_footwear_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "communication_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "diesel_spending": { @@ -3538,6 +3542,7 @@ }, "education_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "employment_income": { @@ -3546,6 +3551,7 @@ }, "food_and_non_alcoholic_beverages_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "hbai_household_net_income": { @@ -3554,10 +3560,12 @@ }, "health_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "household_furnishings_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "household_gross_income": { @@ -3566,10 +3574,12 @@ }, "housing_water_and_electricity_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "miscellaneous_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "petrol_spending": { @@ -3586,10 +3596,12 @@ }, "recreation_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "restaurants_and_hotels_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" }, "self_employment_income": { @@ -3598,6 +3610,7 @@ }, "transport_consumption": { "basis": "engine_parameter", + "from_window": "fiscal_year", "parameter_path": "gov.economic_assumptions.indices.obr.consumer_price_index" } }, @@ -3606,6 +3619,10 @@ "gas_consumption", "domestic_energy_consumption" ], + "fiscal_year_bridge": { + "next_year_weight": 0.25, + "start_year_weight": 0.75 + }, "from_period": 2023, "instant": "january_first", "kind": "uprate_donor_columns", @@ -4005,11 +4022,13 @@ "transport_consumption": { "components": [ "petrol_spending", - "diesel_spending" + "diesel_spending", + "bus_fare_spending" ], "drawn_subtracts": [ "petrol_spending", - "diesel_spending" + "diesel_spending", + "bus_fare_spending" ] } }, diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json index b561cffbe8..5319b8a45c 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json @@ -1 +1 @@ -{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"d1af0febbf2dfd0448e22441f0378d7574cad860b35b0a1497da70f30b41f828","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"e840b69cb05b5cbb76b97b4fcb296244ea843a005e4882459c7132664bb526c2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"3fe686f6bc229e1eb5a6f8c83abed7b2901e6da6177cd359a946a4390edef7ca","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"ed88ba4df1455d844db1728bb13b0872952d1fdf38ea3033ddf982638ec144c5","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"a3fae94093581eebf304f4e11afc3887073963715a6e7096548fe1842423dfc0","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","uc_is_in_startup_period"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"22df3ad75657541267ec55d83794a202551c5e12ae2a13125c7afa5f5d2d6a20","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"6b851a607103c6787daa96b428dad26248449f066c3446338451cdf0bbb3eda6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"a9ed8bb2f260e7ffa395de3eb5b0b4a6d26d9fed8a6f0758e827a56fdb0d3eab","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"e9b3c37d2674f85c5c9d7aa24f42e374cb8a43f6996ee51cb1858e9936cbe02b","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"e2f10f92da81cafd34107b5eb6d0b82f1b9496e8c1de8afde1ff1c28e06fa300","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"2e229a7a31234c493b326b073a84d54f94fbd148a098f05246fb68f20b0f4df1","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"84e898795548080224fc26aef98479c5d56efbcc2004050700afe3790e1b1650","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"9ac7181cd0284afaaf5d5fddf372a0426f83dd1750c20a05fb436aa675b1b6e4","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"8f6bce3829a002b4d51321d7025005a98513c5d853eac836e4700a4fd2282dfb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"4092b9fc6a21272f706a7bfb8875f6ec5cc78504e95536fe43e000969b3cc811","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"d1623febd3bc05e735fc26083eac917cf42a7f9604156d8ac0a2c69e5c112ce5","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"369d7d90f8013a2a9a1692b89a89308ac2d70f3ffd241531a93e2da895b44e80","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} +{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"d1af0febbf2dfd0448e22441f0378d7574cad860b35b0a1497da70f30b41f828","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"e840b69cb05b5cbb76b97b4fcb296244ea843a005e4882459c7132664bb526c2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"3fe686f6bc229e1eb5a6f8c83abed7b2901e6da6177cd359a946a4390edef7ca","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"ed88ba4df1455d844db1728bb13b0872952d1fdf38ea3033ddf982638ec144c5","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"a3fae94093581eebf304f4e11afc3887073963715a6e7096548fe1842423dfc0","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","uc_is_in_startup_period"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"22df3ad75657541267ec55d83794a202551c5e12ae2a13125c7afa5f5d2d6a20","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"dba64ef024f12e6683308c88512c0b005515a5359f4c8f8f774dfc1eae0a05bf","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"a9ed8bb2f260e7ffa395de3eb5b0b4a6d26d9fed8a6f0758e827a56fdb0d3eab","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"e9b3c37d2674f85c5c9d7aa24f42e374cb8a43f6996ee51cb1858e9936cbe02b","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"e2f10f92da81cafd34107b5eb6d0b82f1b9496e8c1de8afde1ff1c28e06fa300","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"2e229a7a31234c493b326b073a84d54f94fbd148a098f05246fb68f20b0f4df1","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"84e898795548080224fc26aef98479c5d56efbcc2004050700afe3790e1b1650","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"9ac7181cd0284afaaf5d5fddf372a0426f83dd1750c20a05fb436aa675b1b6e4","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"8f6bce3829a002b4d51321d7025005a98513c5d853eac836e4700a4fd2282dfb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"4092b9fc6a21272f706a7bfb8875f6ec5cc78504e95536fe43e000969b3cc811","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"d1623febd3bc05e735fc26083eac917cf42a7f9604156d8ac0a2c69e5c112ce5","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"369d7d90f8013a2a9a1692b89a89308ac2d70f3ffd241531a93e2da895b44e80","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} diff --git a/test_support/microcosm_build/uk_donor_uprating.py b/test_support/microcosm_build/uk_donor_uprating.py index 1d5767009f..fe1e6e937d 100644 --- a/test_support/microcosm_build/uk_donor_uprating.py +++ b/test_support/microcosm_build/uk_donor_uprating.py @@ -22,7 +22,10 @@ etb_donor_uprating, rail_fare_index_denominator_key, ) -from microcosm.build.uk_runtime.lcfs_consumption import lcfs_donor_uprating +from microcosm.build.uk_runtime.lcfs_consumption import ( + UK_LCFS_DIARY_PRICE_COLUMNS, + lcfs_donor_uprating, +) from microcosm.build.uk_runtime.ledger_fact_vendoring import vendored_rows from test_support.paths import paths_for From e34e643cc5f0dec5f323284c6e58864d2cbece03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sun, 11 Oct 2026 10:25:14 +0100 Subject: [PATCH 17/18] Commit the consumption-tax measurement scripts and aggregate outputs (#1113) The review asked that the scripts behind the receipts live in the repository, as docs/evidence/uk-a16-v20 does. - scripts: the M2/M3 desk measurements, the M4 masked re-solve, and the stage-only run with its per-tree runner. - outputs: aggregates only. The household dumps and solved weight vectors stay out, and sanitize_outputs.py drops the stage's donor_floor receipt, which records exact donor minima. - The stage runs include main's stage on the same spine. A re-run redraws most households, so that run, not the spine's stored columns, is what a change is compared with. - M1's volume figures have no saved script; the README says so. Co-Authored-By: Claude Opus 5.5 --- .../uk-consumption-taxes-1113/README.md | 36 + .../outputs/m2_m3_desk.json | 145 ++++ .../outputs/m4_report.json | 293 ++++++++ .../outputs/solve_base.json | 8 + .../outputs/solve_drop4.json | 13 + .../outputs/stage_dev_run.base-7f235941c.json | 376 ++++++++++ .../outputs/stage_dev_run.group-b.json | 445 ++++++++++++ .../outputs/stage_dev_run.json | 299 ++++++++ .../outputs/stage_dev_run.review-r2.json | 681 ++++++++++++++++++ .../uk-consumption-taxes-1113/receipts.json | 41 ++ .../scripts/m2_m3_desk.py | 264 +++++++ .../scripts/m4_resolve.py | 249 +++++++ .../scripts/run_m4.sh | 22 + .../scripts/run_stage_dev_at.sh | 26 + .../scripts/sanitize_outputs.py | 55 ++ .../scripts/stage_dev_run.py | 243 +++++++ 16 files changed, 3196 insertions(+) create mode 100644 docs/evidence/uk-consumption-taxes-1113/README.md create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/m2_m3_desk.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/m4_report.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/solve_base.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/solve_drop4.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/stage_dev_run.base-7f235941c.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/stage_dev_run.group-b.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/stage_dev_run.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/outputs/stage_dev_run.review-r2.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/receipts.json create mode 100644 docs/evidence/uk-consumption-taxes-1113/scripts/m2_m3_desk.py create mode 100644 docs/evidence/uk-consumption-taxes-1113/scripts/m4_resolve.py create mode 100755 docs/evidence/uk-consumption-taxes-1113/scripts/run_m4.sh create mode 100755 docs/evidence/uk-consumption-taxes-1113/scripts/run_stage_dev_at.sh create mode 100644 docs/evidence/uk-consumption-taxes-1113/scripts/sanitize_outputs.py create mode 100644 docs/evidence/uk-consumption-taxes-1113/scripts/stage_dev_run.py diff --git a/docs/evidence/uk-consumption-taxes-1113/README.md b/docs/evidence/uk-consumption-taxes-1113/README.md new file mode 100644 index 0000000000..ad7bfd0ca4 --- /dev/null +++ b/docs/evidence/uk-consumption-taxes-1113/README.md @@ -0,0 +1,36 @@ +# Consumption-tax levels: measurement scripts and outputs + +Evidence for [PolicyEngine/microcosm#1167](https://github.com/PolicyEngine/microcosm/pull/1167) (microcosm#1113), filed on the review's ask that the scripts behind `experiments/1113-consumption-tax-levels-receipts.md` live in the repository. `receipts.json` carries the digests of the files here and of the spine the stage runs measured. + +## What was measured + +- **M2 and M3, desk measurements** (`scripts/m2_m3_desk.py`, `outputs/m2_m3_desk.json`). ONS Consumer Trends energy and road-fuel spending against DESNZ Energy Trends volume at QEP prices, and the road-fuel level against the OBR cars receipts. It reads the pinned Chronicle feed, the vendored resources, the 2026-09-30 national build and the LCFS 2023-24 household file. It runs no solve and no engine. +- **M4, the masked re-solve** (`scripts/m4_resolve.py`, `scripts/run_m4.sh`, `outputs/m4_report.json`, `outputs/solve_*.json`). The stored 2026-09-30 national problem (1,090 rows) re-solved twice with the doctrine options: with all rows bound, which reproduces the stored weights exactly, and with `obr.vat`, `obr.fuel_duties_cars` and the two ONS energy rows masked together. No arm masks one row alone. +- **Stage-only runs** (`scripts/stage_dev_run.py`, `scripts/run_stage_dev_at.sh`, `outputs/stage_dev_run*.json`). The `lcfs_consumption` stage re-run on the finished head-r3 spine of microcosm#1121 (63,956 households), with every lcfs stage-health gate run on its receipts: + - `stage_dev_run.json`: Group A's head; + - `stage_dev_run.group-b.json`: Group B's head; + - `stage_dev_run.base-7f235941c.json`: the base tree's stage on the same spine; + - `stage_dev_run.review-r2.json`: the head after the second review round. + +The base run is what isolates this PR's effect. The spine already holds the stages after `lcfs_consumption`, so a re-run redraws most households, and a comparison with the spine's stored columns mixes that drift with the change. Compare a run with the base run, not with `before_head_r3`. + +## What is not here + +- **Unit records.** The household dumps the stage runs write (`*.households.parquet`) and the solved weight vectors (`weights_*.npy`) stay out of the repository. +- **Licensed inputs.** The LCFS tabs, the spine and the national H5s. +- **Exact donor minima.** `scripts/sanitize_outputs.py` drops the stage's `donor_floor` receipt, which records each donor column's exact minimum, before an output is copied here. +- **M1.** The design- and final-weight energy volumes on the 2026-09-30 build (93.0 and 260.1 TWh at design weights, 82.9 and 205.2 TWh at final weights) were computed during the audit of 2026-10-08, and no script was saved. `outputs/m4_report.json` holds the same build's spend at design and final weights. + +## Re-running + +The stage runs need the licensed LCFS 2023-24 tabs and the head-r3 spine: + +```bash +scripts/run_stage_dev_at.sh