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()OpenFisca Scenario - Impôt
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/leximpact-prepare-data/-/issues/122 pour le détail.