From 4fd661652a531f4d1141d25ce94a209001a34fec Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 11:10:52 +0100 Subject: [PATCH 1/8] Add CT data --- policyengine_uk_data/storage/council_tax_bands.csv | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 policyengine_uk_data/storage/council_tax_bands.csv diff --git a/policyengine_uk_data/storage/council_tax_bands.csv b/policyengine_uk_data/storage/council_tax_bands.csv new file mode 100644 index 000000000..47e13023f --- /dev/null +++ b/policyengine_uk_data/storage/council_tax_bands.csv @@ -0,0 +1,11 @@ +Region,A,B,C,D,E,F,G,H,I,Total +NORTH_EAST,667260,205250,194090,111950,60000,26180,14430,1550,0,1280700 +NORTH_WEST,1381000,700030,610850,360710,213480,103150,65240,7280,0,3441730 +SOUTH_EAST,366180,682890,1067530,836070,547270,334360,263930,39980,0,4138200 +SOUTH_WEST,469430,641160,618890,428320,289050,146600,81270,8320,0,2683030 +LONDON,148830,496490,1031190,969650,580310,295330,223990,68020,0,3813790 +EAST_MIDLANDS,800340,500990,399250,245090,152700,73090,38980,3370,0,2213820 +WEST_MIDLANDS,784110,650540,521020,299270,191300,104660,62300,6110,0,2619300 +YORKSHIRE,1068570,510140,427750,246960,156680,75040,41820,3720,0,2530680 +EAST_OF_ENGLAND,400900,595180,733990,502180,310470,170910,112790,14660,0,2841060 +WALES,214540,306120,321500,239690,199500,121740,54850,13130,5630,1476690 From d2e093e40f88d59c07fd4850ff4793bb23cab2e2 Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 11:17:41 +0100 Subject: [PATCH 2/8] Add calibration --- changelog_entry.yaml | 4 ++++ ...x_bands.csv => council_tax_bands_2024.csv} | 0 policyengine_uk_data/utils/loss.py | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+) rename policyengine_uk_data/storage/{council_tax_bands.csv => council_tax_bands_2024.csv} (100%) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb..2b3e5e750 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + added: + - Council Tax calibration. diff --git a/policyengine_uk_data/storage/council_tax_bands.csv b/policyengine_uk_data/storage/council_tax_bands_2024.csv similarity index 100% rename from policyengine_uk_data/storage/council_tax_bands.csv rename to policyengine_uk_data/storage/council_tax_bands_2024.csv diff --git a/policyengine_uk_data/utils/loss.py b/policyengine_uk_data/utils/loss.py index 682911b8f..d2b90d52d 100644 --- a/policyengine_uk_data/utils/loss.py +++ b/policyengine_uk_data/utils/loss.py @@ -308,6 +308,29 @@ def pe_count(*variables): target_names.append("dwp/pip_dl_enhanced_claimants") target_values.append(1_608_000) + # Council Tax band counts + + ct_data = pd.read_csv(STORAGE_FOLDER / "council_tax_bands_2024.csv") + uk_population = ( + sim.tax_benefit_system.parameters.economic_assumptions.indices.ons.population + ) + uprating = uk_population(time_period) / uk_population(2024) + + for i, row in ct_data.iterrows(): + selected_region = row["Region"] + in_region = sim.calculate("region").values == selected_region + for band in ["A", "B", "C", "D", "E", "F", "G", "H", "I"]: + name = f"voa/council_tax/{selected_region}/{band}" + in_band = sim.calculate("council_tax_band") == band + df[name] = in_band * in_region + target_names.append(name) + target_values.append(row[band] * uprating) + # Add total row + name = f"voa/council_tax/{selected_region}/total" + df[name] = in_region + target_names.append(name) + target_values.append(row["Total"] * uprating) + combined_targets = pd.concat( [ targets, From 9cadc4b9dda33d1515a3e84ebbd1ed800fdd47e1 Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 11:19:40 +0100 Subject: [PATCH 3/8] Add Scottish data --- policyengine_uk_data/storage/council_tax_bands_2024.csv | 1 + policyengine_uk_data/utils/loss.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/policyengine_uk_data/storage/council_tax_bands_2024.csv b/policyengine_uk_data/storage/council_tax_bands_2024.csv index 47e13023f..a0e0b7e71 100644 --- a/policyengine_uk_data/storage/council_tax_bands_2024.csv +++ b/policyengine_uk_data/storage/council_tax_bands_2024.csv @@ -9,3 +9,4 @@ WEST_MIDLANDS,784110,650540,521020,299270,191300,104660,62300,6110,0,2619300 YORKSHIRE,1068570,510140,427750,246960,156680,75040,41820,3720,0,2530680 EAST_OF_ENGLAND,400900,595180,733990,502180,310470,170910,112790,14660,0,2841060 WALES,214540,306120,321500,239690,199500,121740,54850,13130,5630,1476690 +SCOTLAND,497867,581576,423304,365001,362354,217954,140162,14327,0,2602545 diff --git a/policyengine_uk_data/utils/loss.py b/policyengine_uk_data/utils/loss.py index d2b90d52d..68961b2da 100644 --- a/policyengine_uk_data/utils/loss.py +++ b/policyengine_uk_data/utils/loss.py @@ -316,6 +316,10 @@ def pe_count(*variables): ) uprating = uk_population(time_period) / uk_population(2024) + # England and Wales data from https://www.gov.uk/government/statistics/council-tax-stock-of-properties-2024 + + # Scotland data from https://www.gov.scot/publications/council-tax-datasets/ (Number of chargeable dwellings, 2024) + for i, row in ct_data.iterrows(): selected_region = row["Region"] in_region = sim.calculate("region").values == selected_region From b9c82e36ac12ede54c5b0eb90317ec9c5ab5bda5 Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 11:26:44 +0100 Subject: [PATCH 4/8] Typo --- policyengine_uk_data/utils/loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_uk_data/utils/loss.py b/policyengine_uk_data/utils/loss.py index 68961b2da..bd8c05615 100644 --- a/policyengine_uk_data/utils/loss.py +++ b/policyengine_uk_data/utils/loss.py @@ -312,7 +312,7 @@ def pe_count(*variables): ct_data = pd.read_csv(STORAGE_FOLDER / "council_tax_bands_2024.csv") uk_population = ( - sim.tax_benefit_system.parameters.economic_assumptions.indices.ons.population + sim.tax_benefit_system.parameters.gov.economic_assumptions.indices.ons.population ) uprating = uk_population(time_period) / uk_population(2024) From 4c3cffe844aa6210b7c5e92c181fc3ca2ba81ed2 Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 11:33:55 +0100 Subject: [PATCH 5/8] Cast? --- policyengine_uk_data/utils/loss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/policyengine_uk_data/utils/loss.py b/policyengine_uk_data/utils/loss.py index bd8c05615..d2c322d8a 100644 --- a/policyengine_uk_data/utils/loss.py +++ b/policyengine_uk_data/utils/loss.py @@ -328,12 +328,12 @@ def pe_count(*variables): in_band = sim.calculate("council_tax_band") == band df[name] = in_band * in_region target_names.append(name) - target_values.append(row[band] * uprating) + target_values.append(float(row[band]) * uprating) # Add total row name = f"voa/council_tax/{selected_region}/total" df[name] = in_region target_names.append(name) - target_values.append(row["Total"] * uprating) + target_values.append(float(row["Total"]) * uprating) combined_targets = pd.concat( [ From 6c2b0107802f90ff916a89f89cac2c0bbce8346e Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 11:41:41 +0100 Subject: [PATCH 6/8] Cast --- policyengine_uk_data/utils/loss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/policyengine_uk_data/utils/loss.py b/policyengine_uk_data/utils/loss.py index d2c322d8a..15d78540f 100644 --- a/policyengine_uk_data/utils/loss.py +++ b/policyengine_uk_data/utils/loss.py @@ -326,12 +326,12 @@ def pe_count(*variables): for band in ["A", "B", "C", "D", "E", "F", "G", "H", "I"]: name = f"voa/council_tax/{selected_region}/{band}" in_band = sim.calculate("council_tax_band") == band - df[name] = in_band * in_region + df[name] = (in_band * in_region).astype(float) target_names.append(name) target_values.append(float(row[band]) * uprating) # Add total row name = f"voa/council_tax/{selected_region}/total" - df[name] = in_region + df[name] = (in_region).astype(float) target_names.append(name) target_values.append(float(row["Total"]) * uprating) From ad9aee19b58d21628b1ef6292870a2a7a7541264 Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 12:07:07 +0100 Subject: [PATCH 7/8] Update tests --- policyengine_uk_data/tests/microsimulation/reforms_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_uk_data/tests/microsimulation/reforms_config.yaml b/policyengine_uk_data/tests/microsimulation/reforms_config.yaml index 4dae4ad4c..c824f12cc 100644 --- a/policyengine_uk_data/tests/microsimulation/reforms_config.yaml +++ b/policyengine_uk_data/tests/microsimulation/reforms_config.yaml @@ -16,7 +16,7 @@ reforms: parameters: gov.hmrc.child_benefit.amount.additional: 25 - name: Reduce Universal Credit taper rate to 20% - expected_impact: -41.3 + expected_impact: -37.3 parameters: gov.dwp.universal_credit.means_test.reduction_rate: 0.2 - name: Raise Class 1 main employee NICs rate to 10% From ee0b08f7aa8029d29ba6246c37bc8352870ca7eb Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Thu, 17 Jul 2025 12:10:08 +0100 Subject: [PATCH 8/8] Fix #167 --- policyengine_uk_data/datasets/frs/frs.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/policyengine_uk_data/datasets/frs/frs.py b/policyengine_uk_data/datasets/frs/frs.py index 7a75e1455..756796741 100644 --- a/policyengine_uk_data/datasets/frs/frs.py +++ b/policyengine_uk_data/datasets/frs/frs.py @@ -89,15 +89,6 @@ def generate(self): for variable in frs: frs[variable] = {self.dwp_frs.time_period: np.array(frs[variable])} - # Domestic rates need to be set for 2025 too - domestic_rates = np.array( - frs["domestic_rates"][self.dwp_frs.time_period] - ) - frs["domestic_rates"] = { - self.dwp_frs.time_period: domestic_rates, - "2025": domestic_rates, - } - self.save_dataset(frs) impute_brmas(self, frs)