Reforms#
To define a reform, simply define a class inheriting from Reform with an apply(self) function. Inside it, self is the tax-benefit system attached to the simulation with loaded data self.simulation: Simulation. From this, you can run any kind of modification on the Simulation instance that you like- modify parameters, variable logic or even adjust simulation data.
from policyengine_core.country_template import Microsimulation
from policyengine_core.model_api import *
baseline = Microsimulation()
class reform(Reform):
    def apply(self):
        simulation = self.simulation
        # Modify parameters
        simulation.tax_benefit_system.parameters.taxes.housing_tax.rate.update(
            20
        )
        # Modify simulation data
        salary = simulation.calculate("salary", "2022-01")
        new_salary = salary * 1.1
        simulation.set_input("salary", "2022-01", new_salary)
reformed = Microsimulation(reform=reform)
reformed.calculate("salary", "2022-01"), baseline.calculate(
    "salary", "2022-01"
)
(   value     weight
 0  110.0  1000000.0
 1    0.0  1000000.0
 2  220.0  1200000.0,
    value     weight
 0  100.0  1000000.0
 1    0.0  1000000.0
 2  200.0  1200000.0)
reformed.calculate("housing_tax", 2022), baseline.calculate(
    "housing_tax", 2022
)
(   value     weight
 0  200.0  1000000.0
 1  200.0  1200000.0,
    value     weight
 0  200.0  1000000.0
 1  200.0  1200000.0)