policyengine-uk 2.41.4__py3-none-any.whl → 2.43.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,7 @@ reforms:
16
16
  parameters:
17
17
  gov.hmrc.child_benefit.amount.additional: 25
18
18
  - name: Reduce Universal Credit taper rate to 20%
19
- expected_impact: -36.7
19
+ expected_impact: -38.4
20
20
  parameters:
21
21
  gov.dwp.universal_credit.means_test.reduction_rate: 0.2
22
22
  - name: Raise Class 1 main employee NICs rate to 10%
@@ -0,0 +1,170 @@
1
+ import pandas as pd
2
+ import numpy as np
3
+
4
+ from policyengine_uk.system import system
5
+
6
+ # Source: ONS series ref 2863
7
+ historical_modified_cpi = pd.DataFrame(
8
+ {
9
+ "period": ["2022-01-01", "2023-01-01", "2024-01-01"],
10
+ "modified_cpi_index": [126.05, 133.22, 135.68],
11
+ "modified_cpi_yoy": [0.107, 0.057, 0.018],
12
+ }
13
+ )
14
+
15
+ # Source: ONS Consumer price inflation, updating weights: Annex A, Tables W1 to W3
16
+ initial_weights = {
17
+ "w_water": 9.7399 / 1000,
18
+ "w_rent": 81.4551 / 1000,
19
+ "w_repair": 2.9902 / 1000,
20
+ }
21
+
22
+ cpi = (
23
+ system.parameters.gov.economic_assumptions.indices.obr.consumer_price_index
24
+ )
25
+ water_index = (
26
+ system.parameters.gov.economic_assumptions.indices.ofwat.water_bills
27
+ )
28
+ rent_index = system.parameters.gov.economic_assumptions.indices.obr.rent
29
+
30
+
31
+ def get_parameter_values(param, start_year, end_year):
32
+ values = {}
33
+ for year in range(start_year, end_year + 1):
34
+ instant = f"{year}-01-01"
35
+ value = param(instant)
36
+ if value is not None:
37
+ values[year] = value
38
+ return values
39
+
40
+
41
+ def create_modified_cpi_forecast(
42
+ cpi_parameter,
43
+ water_index_parameter,
44
+ rent_index_parameter,
45
+ historical_modified_cpi,
46
+ initial_weights,
47
+ forecast_start_year=2025,
48
+ forecast_end_year=2029,
49
+ ):
50
+
51
+ cpi_values = get_parameter_values(
52
+ cpi_parameter, forecast_start_year, forecast_end_year
53
+ )
54
+ water_values = get_parameter_values(
55
+ water_index_parameter, forecast_start_year, forecast_end_year
56
+ )
57
+ rent_values = get_parameter_values(
58
+ rent_index_parameter, forecast_start_year, forecast_end_year
59
+ )
60
+
61
+ last_historical_year = forecast_start_year - 1
62
+ last_cpi = cpi_parameter(f"{last_historical_year}-01-01")
63
+ last_water = water_index_parameter(f"{last_historical_year}-01-01")
64
+ last_rent = rent_index_parameter(f"{last_historical_year}-01-01")
65
+
66
+ results = []
67
+ for _, row in historical_modified_cpi.iterrows():
68
+ results.append(
69
+ {
70
+ "period": row["period"],
71
+ "modified_cpi_index": row["modified_cpi_index"],
72
+ "modified_cpi_yoy": row["modified_cpi_yoy"],
73
+ "data_type": "historical",
74
+ }
75
+ )
76
+
77
+ last_historical = historical_modified_cpi.iloc[-1]
78
+ last_modified_index = last_historical["modified_cpi_index"]
79
+
80
+ current_weights = initial_weights.copy()
81
+ current_weights["w_other"] = 1 - (
82
+ current_weights["w_water"]
83
+ + current_weights["w_repair"]
84
+ + current_weights["w_rent"]
85
+ )
86
+
87
+ forecast_years = sorted(cpi_values.keys())
88
+ prev_cpi = last_cpi
89
+ prev_water_index = last_water
90
+ prev_rent_index = last_rent
91
+
92
+ for year in forecast_years:
93
+ current_cpi = cpi_values[year]
94
+ current_water_index = water_values.get(year)
95
+ current_rent_index = rent_values.get(year)
96
+
97
+ pi_total = (current_cpi / prev_cpi) - 1
98
+ pi_repair = pi_total # Use CPI for maintenance and repair
99
+ pi_water = (current_water_index / prev_water_index) - 1
100
+ pi_rent = (current_rent_index / prev_rent_index) - 1
101
+
102
+ housing_contribution = (
103
+ current_weights["w_water"] * pi_water
104
+ + current_weights["w_repair"] * pi_repair
105
+ + current_weights["w_rent"] * pi_rent
106
+ )
107
+
108
+ pi_other = (pi_total - housing_contribution) / current_weights[
109
+ "w_other"
110
+ ]
111
+
112
+ new_modified_index = last_modified_index * (1 + pi_other)
113
+
114
+ if len(results) >= 1:
115
+ prev_year_value = results[-1]["modified_cpi_index"]
116
+ modified_cpi_yoy = (new_modified_index / prev_year_value) - 1
117
+ else:
118
+ modified_cpi_yoy = np.nan
119
+
120
+ results.append(
121
+ {
122
+ "period": f"{year}-01-01",
123
+ "year": int(year),
124
+ "modified_cpi_index": new_modified_index,
125
+ "modified_cpi_yoy": modified_cpi_yoy,
126
+ "original_cpi_yoy": pi_total,
127
+ "data_type": "forecast",
128
+ "pi_other": pi_other,
129
+ "pi_total": pi_total,
130
+ "pi_rent": pi_rent,
131
+ "pi_water": pi_water,
132
+ "pi_repair": pi_repair,
133
+ }
134
+ )
135
+
136
+ total_weighted_growth = (
137
+ current_weights["w_water"] * (1 + pi_water)
138
+ + current_weights["w_rent"] * (1 + pi_rent)
139
+ + current_weights["w_repair"] * (1 + pi_repair)
140
+ + current_weights["w_other"] * (1 + pi_other)
141
+ )
142
+
143
+ current_weights["w_water"] = (
144
+ current_weights["w_water"] * (1 + pi_water) / total_weighted_growth
145
+ )
146
+ current_weights["w_rent"] = (
147
+ current_weights["w_rent"] * (1 + pi_rent) / total_weighted_growth
148
+ )
149
+ current_weights["w_repair"] = (
150
+ current_weights["w_repair"]
151
+ * (1 + pi_repair)
152
+ / total_weighted_growth
153
+ )
154
+ current_weights["w_other"] = (
155
+ current_weights["w_other"] * (1 + pi_other) / total_weighted_growth
156
+ )
157
+
158
+ last_modified_index = new_modified_index
159
+ prev_cpi = current_cpi
160
+ prev_water_index = current_water_index
161
+ prev_rent_index = current_rent_index
162
+
163
+ return pd.DataFrame(results)
164
+
165
+
166
+ if __name__ == "__main__":
167
+ modified_cpi_forecast = create_modified_cpi_forecast(
168
+ cpi, water_index, rent_index, historical_modified_cpi, initial_weights
169
+ )
170
+ print(modified_cpi_forecast.to_markdown(index=False))
@@ -0,0 +1,184 @@
1
+ from pydantic import BaseModel
2
+ from typing import Optional, Callable, Dict, Type, Union
3
+ from policyengine_core.simulations import Simulation
4
+ from policyengine_core.reforms import Reform
5
+
6
+
7
+ class Scenario(BaseModel):
8
+ """Represents a scenario configuration for policy simulations.
9
+
10
+ A scenario can include parameter changes and/or simulation modifications
11
+ that are applied before running a simulation. Scenarios can be combined
12
+ using the + operator.
13
+ """
14
+
15
+ parameter_changes: Optional[
16
+ Dict[
17
+ str,
18
+ Union[
19
+ int,
20
+ float,
21
+ bool,
22
+ Dict[Union[str, int], Union[int, float, bool]],
23
+ ],
24
+ ]
25
+ ] = None
26
+ """A dictionary of parameter changes to apply to the simulation. These are applied *before* parameter operations."""
27
+
28
+ simulation_modifier: Optional[Callable[["Simulation"], None]] = None
29
+ """A function that modifies the simulation before running it."""
30
+
31
+ class Config:
32
+ """Pydantic configuration."""
33
+
34
+ arbitrary_types_allowed = True # Allow Callable types
35
+
36
+ def __add__(self, other: "Scenario") -> "Scenario":
37
+ """Combine two scenarios by merging parameter changes and chaining modifiers.
38
+
39
+ Args:
40
+ other: Another Scenario to combine with this one
41
+
42
+ Returns:
43
+ A new Scenario with merged parameter changes and combined modifiers
44
+ """
45
+ # Merge parameter changes (other's changes take precedence in conflicts)
46
+ merged_params = {}
47
+
48
+ if self.parameter_changes:
49
+ merged_params.update(self.parameter_changes)
50
+
51
+ if other.parameter_changes:
52
+ for key, value in other.parameter_changes.items():
53
+ if (
54
+ key in merged_params
55
+ and isinstance(merged_params[key], dict)
56
+ and isinstance(value, dict)
57
+ ):
58
+ # Deep merge nested dictionaries
59
+ merged_params[key] = {**merged_params[key], **value}
60
+ else:
61
+ # Simple override
62
+ merged_params[key] = value
63
+
64
+ # Chain simulation modifiers
65
+ combined_modifier = None
66
+
67
+ if self.simulation_modifier and other.simulation_modifier:
68
+ # Both have modifiers - chain them
69
+ def combined_modifier(simulation: Simulation) -> None:
70
+ self.simulation_modifier(simulation)
71
+ other.simulation_modifier(simulation)
72
+
73
+ elif self.simulation_modifier:
74
+ combined_modifier = self.simulation_modifier
75
+ elif other.simulation_modifier:
76
+ combined_modifier = other.simulation_modifier
77
+
78
+ # Return new scenario with merged configuration
79
+ return Scenario(
80
+ parameter_changes=merged_params if merged_params else None,
81
+ simulation_modifier=combined_modifier,
82
+ )
83
+
84
+ @classmethod
85
+ def from_reform(
86
+ cls, reform: Union[tuple, dict, Type[Reform]]
87
+ ) -> "Scenario":
88
+ """Create a Scenario from various reform representations.
89
+
90
+ Args:
91
+ reform: Can be:
92
+ - A Reform class type (will be applied via simulation modifier)
93
+ - A dict of parameter changes
94
+ - A tuple (treated as a Reform for backward compatibility)
95
+
96
+ Returns:
97
+ A new Scenario configured with the reform
98
+
99
+ Raises:
100
+ ValueError: If reform type is not supported
101
+ """
102
+ if isinstance(reform, type) and issubclass(reform, Reform):
103
+ # Reform class - create modifier function
104
+ def modifier(simulation: Simulation) -> None:
105
+ reform_instance = reform()
106
+ reform_instance.apply(simulation.tax_benefit_system)
107
+
108
+ return cls(
109
+ simulation_modifier=modifier,
110
+ )
111
+
112
+ elif isinstance(reform, dict):
113
+ # Dictionary of parameter changes
114
+ return cls(
115
+ parameter_changes=reform,
116
+ )
117
+
118
+ elif isinstance(reform, tuple):
119
+ # Tuple format (legacy support) - treat as a Reform class
120
+ # Assuming the tuple contains (reform_class, *args)
121
+ if (
122
+ len(reform) > 0
123
+ and isinstance(reform[0], type)
124
+ and issubclass(reform[0], Reform)
125
+ ):
126
+ reform_class = reform[0]
127
+ reform_args = reform[1:] if len(reform) > 1 else ()
128
+
129
+ def modifier(simulation: Simulation) -> None:
130
+ reform_instance = reform_class(*reform_args)
131
+ reform_instance.apply(simulation.tax_benefit_system)
132
+
133
+ return cls(
134
+ simulation_modifier=modifier,
135
+ )
136
+ else:
137
+ raise ValueError(f"Invalid tuple format for reform: {reform}")
138
+
139
+ else:
140
+ raise ValueError(
141
+ f"Unsupported reform type: {type(reform)}. "
142
+ "Expected Reform class, dict, or tuple."
143
+ )
144
+
145
+ def apply(self, simulation: Simulation) -> None:
146
+ """Apply this scenario to a simulation.
147
+
148
+ First applies parameter changes, then runs the simulation modifier if present.
149
+
150
+ Args:
151
+ simulation: The simulation to modify
152
+ """
153
+ # Apply parameter changes first
154
+ if self.parameter_changes:
155
+ for path, value in self.parameter_changes.items():
156
+ if isinstance(value, dict):
157
+ # Handle nested parameter changes
158
+ for sub_path, sub_value in value.items():
159
+ full_path = f"{path}.{sub_path}"
160
+ simulation.tax_benefit_system.parameters.update(
161
+ full_path,
162
+ period=None, # Apply to all periods
163
+ value=sub_value,
164
+ )
165
+ else:
166
+ # Simple parameter change
167
+ simulation.tax_benefit_system.parameters.update(
168
+ path, period=None, value=value # Apply to all periods
169
+ )
170
+
171
+ # Then apply simulation modifier
172
+ if self.simulation_modifier:
173
+ self.simulation_modifier(simulation)
174
+
175
+ def __repr__(self) -> str:
176
+ """String representation of the Scenario."""
177
+ parts = []
178
+ if self.parameter_changes:
179
+ parts.append(
180
+ f"parameter_changes={len(self.parameter_changes)} items"
181
+ )
182
+ if self.simulation_modifier:
183
+ parts.append("simulation_modifier=<function>")
184
+ return f"Scenario({', '.join(parts)})"
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.43.0] - 2025-07-26 11:31:02
9
+
10
+ ### Added
11
+
12
+ - Scenario class for reforms.
13
+ - Documentation of Scenario and Simulation.
14
+ - Standardisation of uprating behaviour.
15
+
16
+ ## [2.42.0] - 2025-07-25 08:57:23
17
+
18
+ ### Changed
19
+
20
+ - Add after housing costs deflator
21
+
8
22
  ## [2.41.4] - 2025-07-24 14:41:02
9
23
 
10
24
  ### Fixed
@@ -2016,6 +2030,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2016
2030
 
2017
2031
 
2018
2032
 
2033
+ [2.43.0]: https://github.com/PolicyEngine/openfisca-uk/compare/2.42.0...2.43.0
2034
+ [2.42.0]: https://github.com/PolicyEngine/openfisca-uk/compare/2.41.4...2.42.0
2019
2035
  [2.41.4]: https://github.com/PolicyEngine/openfisca-uk/compare/2.41.3...2.41.4
2020
2036
  [2.41.3]: https://github.com/PolicyEngine/openfisca-uk/compare/2.41.2...2.41.3
2021
2037
  [2.41.2]: https://github.com/PolicyEngine/openfisca-uk/compare/2.41.1...2.41.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine-uk
3
- Version: 2.41.4
3
+ Version: 2.43.0
4
4
  Summary: PolicyEngine tax and benefit system for the UK
5
5
  Project-URL: Homepage, https://github.com/PolicyEngine/policyengine-uk
6
6
  Project-URL: Repository, https://github.com/PolicyEngine/policyengine-uk
@@ -15,7 +15,7 @@ Classifier: Operating System :: POSIX
15
15
  Classifier: Programming Language :: Python
16
16
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
17
17
  Requires-Python: >=3.10
18
- Requires-Dist: microdf-python==0.4.4
18
+ Requires-Dist: microdf-python>=1.0.0
19
19
  Requires-Dist: policyengine-core>=3.6.4
20
20
  Provides-Extra: dev
21
21
  Requires-Dist: black; extra == 'dev'
@@ -1,12 +1,11 @@
1
1
  policyengine_uk/__init__.py,sha256=ud1uvjBep-lcZKBWUd0eo-PAT_FM92_PqUlDp5OYl4g,355
2
2
  policyengine_uk/entities.py,sha256=9yUbkUWQr3WydNE-gHhUudG97HGyXIZY3dkgQ6Z3t9A,1212
3
- policyengine_uk/model_api.py,sha256=D5OuQpQbdBXiF6r7LvCLWjsTkAWtkeBJWz2ebsJ-GN0,189
3
+ policyengine_uk/model_api.py,sha256=KdwJCL2HkXVxDpL6fCsCnQ9Sub6Kqp7Hyxlis3MNIx4,241
4
4
  policyengine_uk/modelled_policies.yaml,sha256=TLhvmkuI9ip-Fjq63n66RzDErCkN8K4BzY6XLxLMtFg,463
5
- policyengine_uk/repo.py,sha256=-dqpIMUD7UUj94ql9XwaMrFJUYKvNhFQ_9uj83Z8uh0,55
6
- policyengine_uk/system.py,sha256=jfMN-0cDBMsbqIgTenRxCblSY3o69YIeSWGFaBgF76s,9719
5
+ policyengine_uk/system.py,sha256=OooTAxHpzh4H5k8rWiH_qE4SooBomn-pjZnk4UvVR8A,21813
7
6
  policyengine_uk/data/__init__.py,sha256=J0bZ3WnvPzZ4qfVLYcwOc4lziMUMdbcMqJ3xwjoekbM,101
8
- policyengine_uk/data/dataset_schema.py,sha256=aiBxxEwuYQ5TobkX1U8PM0sQK9c58MGJHnHfL2Aymso,8215
9
- policyengine_uk/data/economic_assumptions.py,sha256=ZZ0sXqhYKjfCkcMZhutZgnvI3cWqC_wfwWocMWpniso,5697
7
+ policyengine_uk/data/dataset_schema.py,sha256=4SPUqDmzTsmmWFaJIlpDzT7J6WvBDgxRPfUnbjjtFuQ,9854
8
+ policyengine_uk/data/economic_assumptions.py,sha256=4ZmE6z8Bbf21n0Hm-IpsS04Astg2NJAypv9TdA_udEk,6189
10
9
  policyengine_uk/data/uprating_indices.yaml,sha256=kQtfeGWyqge4dbJhs0iF4kTMqovuegill_Zfs8orJi4,2394
11
10
  policyengine_uk/parameters/gov/README.md,sha256=bHUep1_2pLHD3Or8SwjStOWXDIbW9OuYxOd4ml8IXcM,13
12
11
  policyengine_uk/parameters/gov/benefit_uprating_cpi.yaml,sha256=2zOSdJeUhDZYYsKE2vLkcK-UbKNoOSVwfac0QIAp02g,250
@@ -314,7 +313,7 @@ policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_incom
314
313
  policyengine_uk/parameters/gov/economic_assumptions/create_economic_assumption_indices.py,sha256=Z4dYghSit5gXo4V3wBpnLIc9zgTX4cfEyb_TUlJkTGY,1937
315
314
  policyengine_uk/parameters/gov/economic_assumptions/lag_average_earnings.py,sha256=ksHcyUQkLAJmKizCeSg8j0hzPc7ajgIvbExWLgCra4U,701
316
315
  policyengine_uk/parameters/gov/economic_assumptions/lag_cpi.py,sha256=IdtaMLN1_OSu-RFZsQV8vBlbOvXsPlnNlsOuinRHrxg,642
317
- policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml,sha256=DaWjPzfdO0r_oU1ilqbM6yy8VaBB-kWZ9sz41TZTcs8,16711
316
+ policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml,sha256=k2xxY4YvioJ0agEOHwebcEWVwQbgePrnXO1dvogGWCs,17673
318
317
  policyengine_uk/parameters/gov/hmrc/README.md,sha256=nkHVZl6lsjI93sR8uC7wAbul3_61wJrsP08iaW8f5lk,7
319
318
  policyengine_uk/parameters/gov/hmrc/minimum_wage.yaml,sha256=1oMbevU0ESHR51mcAG39POd1DA1FgPUep4hL6ojj-P4,2049
320
319
  policyengine_uk/parameters/gov/hmrc/business_rates/README.md,sha256=9ud50i_gMjGj6VymF-nzFDTzkFRMMJx6ybpLwbWzvpI,17
@@ -526,10 +525,14 @@ policyengine_uk/reforms/cps/marriage_tax_reforms.py,sha256=UK7fTMoa4Xh2IvkT3wRDw
526
525
  policyengine_uk/reforms/policyengine/__init__.py,sha256=5ubEO0DGRBXhn3QRSoBNT-jff9ORb4dd2J6FYNpSEik,42
527
526
  policyengine_uk/reforms/policyengine/adjust_budgets.py,sha256=p1NbFB7wwfC_jRdeVLbClHm3MOvRO-gKmU7PzY2zJv8,2084
528
527
  policyengine_uk/reforms/policyengine/disable_simulated_benefits.py,sha256=siEs1EpSHCm5-4CJKwGdDm9jArscd6kVM39JUrFTPlE,2524
528
+ policyengine_uk/scenarios/__init__.py,sha256=_Ci6FeBm6tEiv5LUVsn70ubBftSFlaNZXcc--epBdQM,156
529
+ policyengine_uk/scenarios/pip_reform.py,sha256=fv6-HCuRxhzt-XEYv9yLJTEliAWu3EGx6duADSBO4n8,687
530
+ policyengine_uk/scenarios/reindex_benefit_cap.py,sha256=dPUOsTkgYZNRN15e_ax5hg5ObHngk5tizz7FYStkGaE,1070
531
+ policyengine_uk/scenarios/repeal_two_child_limit.py,sha256=vZndQVFNCe7v7k4v-PgneOCPld-YTnCmlveRbX_1czk,250
529
532
  policyengine_uk/tests/test_parameter_metadata.py,sha256=_2w2dSokAf5Jskye_KIL8eh80N7yIrUszlmqnZtwQws,450
530
533
  policyengine_uk/tests/code_health/test_variables.py,sha256=9Y-KpmzhyRGy9eEqocK9z91NXHX5QIF3mDMNGvegb7Q,1398
531
534
  policyengine_uk/tests/microsimulation/README.md,sha256=1toB1Z06ynlUielTrsAaeo9Vb-c3ZrB3tbbR4E1xUGk,3924
532
- policyengine_uk/tests/microsimulation/reforms_config.yaml,sha256=azRPWlthHO8JEHTUq7qcReKqb4cgm2oFwi-eK6TFImY,1086
535
+ policyengine_uk/tests/microsimulation/reforms_config.yaml,sha256=qIxLo33i7qAAkCc6Pvpa-rhWTxoevrbOlsADjF-w7pk,1086
533
536
  policyengine_uk/tests/microsimulation/test_reform_impacts.py,sha256=xM3M2pclEhA9JIFpnuiPMy1fEBFOKcSzroRPk73FPls,2635
534
537
  policyengine_uk/tests/microsimulation/test_validity.py,sha256=RWhbSKrnrZCNQRVmGYlM8hnpe1_Blo5_xP8vr8u3kV0,694
535
538
  policyengine_uk/tests/microsimulation/update_reform_impacts.py,sha256=2pxp2RNLWxV4CesGKKHmg3qBs79Jq2Jcq3GJIBk4euU,4824
@@ -595,7 +598,6 @@ policyengine_uk/tests/policy/baseline/finance/income/minimum_wage.yaml,sha256=qv
595
598
  policyengine_uk/tests/policy/baseline/finance/income/minimum_wage_category.yaml,sha256=mGVi7xJRUiuoYjmp_Dcc1dWZ2-7ceIKAhN1r6NLI6tg,787
596
599
  policyengine_uk/tests/policy/baseline/finance/tax/income_tax/savings_starter_rate_income.yaml,sha256=MVgdxK3jU9_i5WptA6SxYXipKg__mHm1tGk01A9MwS0,1195
597
600
  policyengine_uk/tests/policy/baseline/finance/tax/income_tax/scottish_rates.yaml,sha256=6W1oeU7i13VJZhSS2_2du6a4P75YHkTSv3vmZJIs92I,181
598
- policyengine_uk/tests/policy/baseline/gov/abolitions/abolition_parameters.yaml,sha256=9oaBaVXSP-3-02UZpr3nLB4b0re50G8jRFOop9SPq_A,4837
599
601
  policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv_licence_discount.yaml,sha256=INGw-yjudsQMxNDTiWpcuWbns-UPDKGnH3VuF000kHY,805
600
602
  policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv-licence/tv_licence.yaml,sha256=cYAZlmmoAxWymv7L0lDzPcX6dexNAERQnVQMOB0HVzE,562
601
603
  policyengine_uk/tests/policy/baseline/gov/dfe/care_to_learn/care_to_learn.yaml,sha256=i5RIghjT2T7uWn_xvaeYb2dIJ7JsreSr_f12UPtFqpg,508
@@ -685,9 +687,11 @@ policyengine_uk/tests/policy/reforms/parametric/two_child_limit/age_exemption.ya
685
687
  policyengine_uk/tests/policy/reforms/parametric/two_child_limit/ctc_age_exemption.yaml,sha256=xOgctFi4eLVW7agHdRPUU9szoRzt4p0R9eiMvPqwv_s,3577
686
688
  policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml,sha256=QY3LYJ92VzYH9mXU54XD_6PhefwHNK80kGYQ0R5I0SM,6289
687
689
  policyengine_uk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
690
+ policyengine_uk/utils/create_ahc_deflator.py,sha256=zCJ_R_hq8DUfuO7u3puhRl6gkC1hw2MX3TCusy-bICI,5464
688
691
  policyengine_uk/utils/create_triple_lock.py,sha256=E8qR51cq5jPL6EOXFoPi1qJhrcUBXg3dfWTvdqWN2Bo,948
689
692
  policyengine_uk/utils/dependencies.py,sha256=6mLDZr-lypI6RZMeb0rcWoJy5Ig7QT18kOuAMUgI7vg,8198
690
693
  policyengine_uk/utils/parameters.py,sha256=OQTzTkHMdwbphCo0mV7_n_FJT0rdwIKNFTsk_lsdETE,1301
694
+ policyengine_uk/utils/scenario.py,sha256=xvWjv7WViH6NxqQF5RUECXtIWYktploOn-0kPYC3rXM,6702
691
695
  policyengine_uk/utils/solve_private_school_attendance_factor.py,sha256=LUZCgHKAQTY5qHlGJutn7pOFUWT0AP16YcJy-YUjQ3Q,1609
692
696
  policyengine_uk/utils/water/README.md,sha256=sdBI-JZ-jcRoSUfwNx5wjv5Ig_nM8OPvvjSsSMs_Wh8,443
693
697
  policyengine_uk/utils/water/forecast_water_bills.py,sha256=B4vtfJuR8XfBP-KHGyhRp2Oo7X7buN-lDH6tBIXqE2U,2788
@@ -1369,10 +1373,10 @@ policyengine_uk/variables/misc/spi_imputed.py,sha256=iPVlBF_TisM0rtKvO-3-PQ2UYCe
1369
1373
  policyengine_uk/variables/misc/uc_migrated.py,sha256=zFNcUJaO8gwmbL1iY9GKgUt3G6J9yrCraqBV_5dCvlM,306
1370
1374
  policyengine_uk/variables/misc/categories/lower_middle_or_higher.py,sha256=C54tHYz2DmOyvQYCC1bF8RJwRZinhAq_e3aYC-9F5fM,157
1371
1375
  policyengine_uk/variables/misc/categories/lower_or_higher.py,sha256=81NIbLLabRr9NwjpUZDuV8IV8_mqmp5NM-CZvt55TwE,129
1372
- policyengine_uk-2.41.4.data/data/share/openfisca/openfisca-country-template/CHANGELOG.md,sha256=vTt8gN2BJL3QHkt0Z2U1oyxzb9JjXZGTbGofm7wFfQA,58231
1373
- policyengine_uk-2.41.4.data/data/share/openfisca/openfisca-country-template/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1374
- policyengine_uk-2.41.4.data/data/share/openfisca/openfisca-country-template/README.md,sha256=PCy7LRLdUDQS8U4PaeHeBVnyBZAqHv1dAVDDvEcom20,1976
1375
- policyengine_uk-2.41.4.dist-info/METADATA,sha256=Q3jX47KdRTZPPf-fEIC6oaLZW6Cnq4AJhOSWsOAJWKE,3502
1376
- policyengine_uk-2.41.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1377
- policyengine_uk-2.41.4.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1378
- policyengine_uk-2.41.4.dist-info/RECORD,,
1376
+ policyengine_uk-2.43.0.data/data/share/openfisca/openfisca-country-template/CHANGELOG.md,sha256=PQth_bhEgN2NEdwHaelS1QTnRcLNs7UQ2pU6N2vDfeU,58635
1377
+ policyengine_uk-2.43.0.data/data/share/openfisca/openfisca-country-template/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1378
+ policyengine_uk-2.43.0.data/data/share/openfisca/openfisca-country-template/README.md,sha256=PCy7LRLdUDQS8U4PaeHeBVnyBZAqHv1dAVDDvEcom20,1976
1379
+ policyengine_uk-2.43.0.dist-info/METADATA,sha256=E5g6_HGNjojCeqgn6FQlL1vk8HQ6d3hiKcykskekZU4,3502
1380
+ policyengine_uk-2.43.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1381
+ policyengine_uk-2.43.0.dist-info/licenses/LICENSE,sha256=dql8h4yceoMhuzlcK0TT_i-NgTFNIZsgE47Q4t3dUYI,34520
1382
+ policyengine_uk-2.43.0.dist-info/RECORD,,
policyengine_uk/repo.py DELETED
@@ -1,3 +0,0 @@
1
- from pathlib import Path
2
-
3
- REPO = Path(__file__).parent