OpenFisca Scenario - Impôt

import plotly.graph_objects as go


# from IPython.display import HTML
from openfisca_france import FranceTaxBenefitSystem
from openfisca_core.simulation_builder import SimulationBuilder
from openfisca_france.scenarios import init_single_entity
from openfisca_core import periods
from openfisca_france.model.base import Reform

tax_benefit_system = FranceTaxBenefitSystem()
def plot(salaire_net, irpp, contribution_exceptionnelle_hauts_revenus):
    fig = go.Figure()

    fig.add_trace(
        go.Scatter(
            x=salaire_net,
            y=irpp,
            name="Impôt sur le revenu",
        )
    )

    fig.add_trace(
        go.Scatter(
            x=salaire_net,
            y=contribution_exceptionnelle_hauts_revenus,
            name="CEHR",
        )
    )
    fig.update_layout(
        xaxis=dict(
            title="Salaire de base",
            # tickmode="linear",
        ),
        yaxis=dict(title="Montant du prélèvement"),  # , rangemode="tozero"
    )
    _ = fig.add_vline(x=250_000, line_dash="dash", line_color="red")

    return fig
# @title Graphique de l'évolution { run: "auto" }


# @markdown Utiliser les slider pour faire varier le nombre de pas et le salaire maximal
nb_step = 1000
# current_period = 2010  #@param {type:"slider", min:1980, max:2022, step:1}
date_naissance = "1980-01-01"  # #param {type:"date"}
salaire_max = 660000  # @param {type:"slider", min:10000, max:1000000, step:50000}

current_period = 2023
sb = SimulationBuilder()

start = (periods.instant(current_period),)

taux_tranche_1 = 0  # @param {type:"slider", min:0, max:10, step:0.5}
taux_tranche_2 = 3  # @param {type:"slider", min:0, max:10, step:0.5}
taux_tranche_3 = 4  # @param {type:"slider", min:0, max:10, step:0.5}


def modify_parameters(parameters):
    # parameters.impot_revenu.contributions_exceptionnelles.contribution_exceptionnelle_hauts_revenus[
    #     0
    # ].rate.update(
    #     # period = periods.period(current_period),
    #     start=start,
    #     value=taux_tranche_1 / 100,
    # )
    # parameters.impot_revenu.contributions_exceptionnelles.contribution_exceptionnelle_hauts_revenus[
    #     1
    # ].rate.update(
    #     # period = periods.period(current_period),
    #     start=start,
    #     value=taux_tranche_2 / 100,
    # )
    # parameters.impot_revenu.contributions_exceptionnelles.contribution_exceptionnelle_hauts_revenus[
    #     2
    # ].rate.update(
    #     # period = periods.period(current_period),
    #     start=start,
    #     value=taux_tranche_3 / 100,
    # )
    return parameters


class ma_reforme(Reform):
    name = "Modif CEHR"

    def apply(self):
        self.modify_parameters(modifier_function=modify_parameters)


reformed_tax_benefit_system = ma_reforme(FranceTaxBenefitSystem())

scenario = init_single_entity(
    reformed_tax_benefit_system.new_scenario(),
    # Axe declaration
    axes=[
        [
            dict(  #  in a dictionary
                count=nb_step,  # 'count' indicates the number of steps
                min=0,
                max=salaire_max,
                name="salaire_de_base",  # the variable that will evolve 'count' times between 'min' and 'max' values
            ),
        ]
    ],
    period=current_period,
    parent1=dict(
        date_naissance=date_naissance,
    ),
)

simulation = scenario.new_simulation()

salaire_net = simulation.calculate_add("salaire_net", current_period)
contribution_exceptionnelle_hauts_revenus = simulation.calculate_add(
    "rfr", current_period
)
irpp = simulation.calculate_add("irpp", current_period) * -1

fig = plot(salaire_net, irpp, contribution_exceptionnelle_hauts_revenus)
fig.show()
/home/jupyter-benoit/leximpact-prepare-data/.venv/lib/python3.9/site-packages/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning: divide by zero encountered in divide
  - (0.007 * (assiette_pss > 5) * ((assiette_pss - 5) / assiette_pss))
/home/jupyter-benoit/leximpact-prepare-data/.venv/lib/python3.9/site-packages/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning: invalid value encountered in multiply
  - (0.007 * (assiette_pss > 5) * ((assiette_pss - 5) / assiette_pss))

Lancement du notebook en Voila : - poetry run voila --Voila.ip='0.0.0.0' --Voila.base_url=/voila/ --no-browser - Il est ensuite visible sur https://jupyter.leximpact.dev/voila/voila/render/notebooks/voila/demo.ipynb - Voir la carte https://git.leximpact.dev/leximpact/simulateur-socio-fiscal/budget/leximpact-prepare-data/-/issues/122 pour le détail.