Structure de données pour les simulations

Structures de données

On définit les entrées et sortie de nos simulations.

En entrée


ReformeSocioFiscale

 ReformeSocioFiscale (base:int, plf:Optional[int]=None,
                      amendement:Optional[Dict[str,Union[float,int,str,Dic
                      t]]]=None, output_variables:List[str],
                      quantile_nb:int=0,
                      quantile_entity:Optional[str]='foyer_fiscal',
                      quantile_base_variable:Optional[List[str]]=None,
                      quantile_compare_variables:Optional[List[str]]=None,
                      winners_loosers_variable:Optional[str]=None)

This is the API Input :year: Année fiscal du calcul :reform: Un dictionnaire des paramètres OpenFisca a modifier :output_variables: Les variables OpenFisca que l’on souhaite en sortie :quantile_nb: Le nombre de décile souhaités : 4 pour quartile, 10 pour des décile, 100 pour centile,… :quantile_base_variable: Variables de base pour les déciles, ‘rfr’ par exemple. Si plusieurs variables, on en fait la somme avant d’en calculer les déciles. :quantile_compare_variables: Variables OpenFisca que l’on souhaite dans les déciles, ‘csg’ par exemple. On n’en calcul pas les déciles, on récupère

En sortie

Résultat d’une simulation


CompareBeforeAfter

 CompareBeforeAfter (total:int, non_zero_before:int, non_zero_after:int,
                     above_after:int|None=None, lower_after:int|None=None,
                     neutral:int|None=None, tolerance_factor_used:float,
                     weight_factor:float)

This is the result of the comparaison of two simulation.

before_after = CompareBeforeAfter(
    total=1,
    non_zero_before=2,
    non_zero_after=3,
    above_after=4,
    lower_after=5,
    neutral=6,
    tolerance_factor_used=7,
    weight_factor=0.79,
)
before_after
CompareBeforeAfter(total=1, non_zero_before=2, non_zero_after=3, above_after=4, lower_after=5, neutral=6, tolerance_factor_used=7.0, weight_factor=0.79)

OneSimulationResult

 OneSimulationResult (state_budget:Dict[str,float],
                      quantiles:Optional[List[Dict[str,float]]]=None, comp
                      are_before_after:Optional[Dict[str,__main__.CompareB
                      eforeAfter]]=None)

This is the output for one simulation

result = OneSimulationResult(
    state_budget={
        "assiette_csg_abattue": 707659989877.222,
    }
)
result.compare_before_after = before_after
result
OneSimulationResult(state_budget={'assiette_csg_abattue': 707659989877.222}, quantiles=None, compare_before_after=CompareBeforeAfter(total=1, non_zero_before=2, non_zero_after=3, above_after=4, lower_after=5, neutral=6, tolerance_factor_used=7.0, weight_factor=0.79))

AllSimulationResult : résultats de toutes les simulations


AllSimulationResult

 AllSimulationResult
                      (result:Optional[Dict[str,__main__.OneSimulationResu
                      lt]]=None, errors:Optional[List[str]]=None)

This is the API Output for all simulations

AllSimulationResult(result={"base": result})
AllSimulationResult(result={'base': OneSimulationResult(state_budget={'assiette_csg_abattue': 707659989877.222}, quantiles=None, compare_before_after=CompareBeforeAfter(total=1, non_zero_before=2, non_zero_after=3, above_after=4, lower_after=5, neutral=6, tolerance_factor_used=7.0, weight_factor=0.79))}, errors=None)
AllSimulationResult(errors=["1", " error 2"])
AllSimulationResult(result=None, errors=['1', ' error 2'])
ReformeSocioFiscale.Config.schema_extra["example"]
{'base': 2023,
 'plf': 2024,
 'amendement': {'prelevements_sociaux.contributions_sociales.csg.activite.deductible.taux': {'start': '2022-01-01',
   'type': 'parameter',
   'value': 0.068},
  'prelevements_sociaux.contributions_sociales.csg.activite.imposable.abattement': {'scale': [{'rate': {'value': 0.0175},
     'threshold': {'value': 0}},
    {'rate': {'value': 0}, 'threshold': {'value': 4}}],
   'start': '2022-01-01',
   'type': 'scale'}},
 'output_variables': ['rfr',
  'csg_imposable_salaire',
  'csg_deductible_salaire'],
 'quantile_nb': 10,
 'quantile_base_variable': ['rfr'],
 'quantile_compare_variables': ['csg_imposable_salaire',
  'csg_deductible_salaire']}

Analyse de l’état du projet


Status

 Status (cache:bool, queue:bool, simulations:bool,
         version_openfisca:List[str], last_commit:str)

This returns the status of the current projet

Status(
    cache=True,
    queue=True,
    simulations=True,
    version_openfisca=["openfisca-fidji", "0.1.0"],
    last_commit="007benito",
)
Status(cache=True, queue=True, simulations=True, version_openfisca=['openfisca-fidji', '0.1.0'], last_commit='007benito')

Custom JSON Serialization


NpEncoder

 NpEncoder (skipkeys=False, ensure_ascii=True, check_circular=True,
            allow_nan=True, sort_keys=False, indent=None, separators=None,
            default=None)

Custom serializer to export our data to Redis

simu_result = OneSimulationResult(
    state_budget={"base": 50_000_000}, quantiles=[{"fraction": 1}, {"fraction": 2}]
)
simu_result
OneSimulationResult(state_budget={'base': 50000000.0}, quantiles=[{'fraction': 1.0}, {'fraction': 2.0}], compare_before_after=None)
all_result = AllSimulationResult(
    result={"base": simu_result},
    compare_before_after=before_after,
    errors=["Ca marche pas"],
)
res_json = json.dumps(
    all_result,
    cls=NpEncoder,
)
res_json
'{"result": {"base": {"state_budget": {"base": 50000000.0}, "quantiles": [{"fraction": 1.0}, {"fraction": 2.0}], "compare_before_after": null}}, "errors": ["Ca marche pas"]}'
json.loads(res_json)
{'result': {'base': {'state_budget': {'base': 50000000.0},
   'quantiles': [{'fraction': 1.0}, {'fraction': 2.0}],
   'compare_before_after': None}},
 'errors': ['Ca marche pas']}
AllSimulationResult.parse_obj(json.loads(res_json))
AllSimulationResult(result={'base': OneSimulationResult(state_budget={'base': 50000000.0}, quantiles=[{'fraction': 1.0}, {'fraction': 2.0}], compare_before_after=None)}, errors=['Ca marche pas'])
cached = b'"{\\"result\\": {\\"base\\": {\\"state_budget\\": {\\"base\\": 50000000.0}, \\"quantiles\\": [{\\"fraction\\": 1.0}, {\\"fraction\\": 2.0}], \\"compare_before_after\\": null}}, \\"errors\\": [\\"Ca marche pas\\"]}"'
json_loaded = json.loads(json.loads(cached))
type(json_loaded)
# {"result": {"base": {"state_budget": {"csg_imposable_salaire": -15739674769.496641}, "quantiles": null, "compare_before_after": null}}, "errors": []}
AllSimulationResult.parse_obj(json_loaded)
dict
AllSimulationResult(result={'base': OneSimulationResult(state_budget={'base': 50000000.0}, quantiles=[{'fraction': 1.0}, {'fraction': 2.0}], compare_before_after=None)}, errors=['Ca marche pas'])