예제 #1
0
def trace(tax_benefit_system, input_data):
    simulation = Simulation(tax_benefit_system=tax_benefit_system,
                            simulation_json=input_data,
                            trace=True)

    requested_computations = dpath.util.search(input_data,
                                               '*/*/*/*',
                                               afilter=lambda t: t is None,
                                               yielded=True)
    for computation in requested_computations:
        path = computation[0]
        entity_plural, entity_id, variable_name, period = path.split('/')
        simulation.calculate(variable_name, period)

    trace = deepcopy(simulation.tracer.trace)
    for vector_key, vector_trace in trace.items():
        value = vector_trace['value'].tolist()
        if isinstance(value[0], Enum):
            value = [item.name for item in value]
        if isinstance(value[0], bytes):
            value = [to_unicode(item) for item in value]
        vector_trace['value'] = value

    return {
        "trace": trace,
        "entitiesDescription":
        {entity.plural: entity.ids
         for entity in simulation.entities.values()},
        "requestedCalculations": list(simulation.tracer.requested_calculations)
    }
예제 #2
0
    def trace():
        tax_benefit_system = data['tax_benefit_system']
        request.on_json_loading_failed = handle_invalid_json
        input_data = request.get_json()
        try:
            simulation = Simulation(tax_benefit_system=tax_benefit_system,
                                    simulation_json=input_data,
                                    trace=True)
        except SituationParsingError as e:
            abort(make_response(jsonify(e.error), e.code or 400))

        requested_computations = dpath.util.search(input_data,
                                                   '*/*/*/*',
                                                   afilter=lambda t: t is None,
                                                   yielded=True)
        for computation in requested_computations:
            path = computation[0]
            entity_plural, entity_id, variable_name, period = path.split('/')
            simulation.calculate(variable_name, period).tolist()

        return jsonify({
            "trace":
            simulation.tracer.trace,
            "entitiesDescription": {
                entity.plural: entity.ids
                for entity in simulation.entities.itervalues()
            },
            "requestedCalculations":
            list(simulation.tracer.requested_calculations)
        })
예제 #3
0
def test_get_memory_usage():
    simulation = Simulation(tax_benefit_system=tax_benefit_system,
                            simulation_json=single)
    simulation.calculate('disposable_income', '2017-01')
    memory_usage = simulation.get_memory_usage(variables=['salary'])
    assert (memory_usage['total_nb_bytes'] > 0)
    assert (len(memory_usage['by_variable']) == 1)
def test_dump():
    directory = tempfile.mkdtemp(prefix = "openfisca_")
    simulation = Simulation(tax_benefit_system = tax_benefit_system, simulation_json = couple)
    calculated_value = simulation.calculate('disposable_income', '2018-01')
    dump_simulation(simulation, directory)

    simulation_2 = restore_simulation(directory, tax_benefit_system)

    # Check entities structure have been restored

    assert_array_equal(simulation.person.ids, simulation_2.person.ids)
    assert_array_equal(simulation.person.count, simulation_2.person.count)
    assert_array_equal(simulation.household.ids, simulation_2.household.ids)
    assert_array_equal(simulation.household.count, simulation_2.household.count)
    assert_array_equal(simulation.household.members_position, simulation_2.household.members_position)
    assert_array_equal(simulation.household.members_entity_id, simulation_2.household.members_entity_id)
    assert_array_equal(simulation.household.members_legacy_role, simulation_2.household.members_legacy_role)
    assert_array_equal(simulation.household.members_role, simulation_2.household.members_role)

    # Check calculated values are in cache

    disposable_income_holder = simulation_2.person.get_holder('disposable_income')
    cached_value = disposable_income_holder.get_array('2018-01')
    assert cached_value is not None
    assert_array_equal(cached_value, calculated_value)

    shutil.rmtree(directory)
예제 #5
0
    def calculate():
        tax_benefit_system = data['tax_benefit_system']
        request.on_json_loading_failed = handle_invalid_json
        input_data = request.get_json()
        try:
            simulation = Simulation(tax_benefit_system=tax_benefit_system,
                                    simulation_json=input_data)
        except SituationParsingError as e:
            abort(make_response(jsonify(e.error), e.code or 400))

        requested_computations = dpath.util.search(input_data,
                                                   '*/*/*/*',
                                                   afilter=lambda t: t is None,
                                                   yielded=True)

        for computation in requested_computations:
            path = computation[0]
            entity_plural, entity_id, variable_name, period = path.split('/')
            result = simulation.calculate(variable_name, period).tolist()
            entity = simulation.get_entity(plural=entity_plural)
            entity_index = entity.ids.index(entity_id)

            variable = tax_benefit_system.get_variable(variable_name)
            if variable.value_type == Enum:
                entity_result = result[entity_index].name
            else:
                entity_result = result[entity_index]

            dpath.util.set(input_data, path, entity_result)

        return jsonify(input_data)
예제 #6
0
def calculate(tax_benefit_system, input_data):
    simulation = Simulation(tax_benefit_system=tax_benefit_system,
                            simulation_json=input_data)

    requested_computations = dpath.util.search(input_data,
                                               '*/*/*/*',
                                               afilter=lambda t: t is None,
                                               yielded=True)
    computation_results = {}

    for computation in requested_computations:
        path = computation[0]
        entity_plural, entity_id, variable_name, period = path.split('/')
        variable = tax_benefit_system.get_variable(variable_name)
        result = simulation.calculate(variable_name, period)
        entity = simulation.get_entity(plural=entity_plural)
        entity_index = entity.ids.index(entity_id)

        if variable.value_type == Enum:
            entity_result = result.decode()[entity_index].name
        elif variable.value_type == float:
            entity_result = float(
                str(result[entity_index])
            )  # To turn the float32 into a regular float without adding confusing extra decimals. There must be a better way.
        elif variable.value_type == str:
            entity_result = to_unicode(
                result[entity_index])  # From bytes to unicode
        else:
            entity_result = result.tolist()[entity_index]

        dpath.util.new(computation_results, path, entity_result)

    dpath.merge(input_data, computation_results)

    return input_data
예제 #7
0
    def calculate():
        tax_benefit_system = data['tax_benefit_system']
        request.on_json_loading_failed = handle_invalid_json
        input_data = request.get_json()
        try:
            simulation = Simulation(tax_benefit_system=tax_benefit_system,
                                    simulation_json=input_data)
        except SituationParsingError as e:
            abort(make_response(jsonify(e.error), e.code or 400))
        except UnicodeEncodeError as e:
            abort(
                make_response(
                    jsonify({
                        "error":
                        "'" + e[1] + "' is not a valid ASCII value."
                    }), 400))

        requested_computations = dpath.util.search(input_data,
                                                   '*/*/*/*',
                                                   afilter=lambda t: t is None,
                                                   yielded=True)
        results = {}

        try:
            for computation in requested_computations:
                path = computation[0]
                entity_plural, entity_id, variable_name, period = path.split(
                    '/')
                variable = tax_benefit_system.get_variable(variable_name)
                result = simulation.calculate(variable_name, period)
                entity = simulation.get_entity(plural=entity_plural)
                entity_index = entity.ids.index(entity_id)

                if variable.value_type == Enum:
                    entity_result = result.decode()[entity_index].name
                elif variable.value_type == float:
                    entity_result = float(
                        str(result[entity_index])
                    )  # To turn the float32 into a regular float without adding confusing extra decimals. There must be a better way.
                elif variable.value_type == str:
                    entity_result = to_unicode(
                        result[entity_index])  # From bytes to unicode
                else:
                    entity_result = result.tolist()[entity_index]

                dpath.util.new(results, path, entity_result)

        except UnicodeEncodeError as e:
            abort(
                make_response(
                    jsonify({
                        "error":
                        "'" + e[1] + "' is not a valid ASCII value."
                    }), 400))

        dpath.util.merge(input_data, results)

        return jsonify(input_data)
예제 #8
0
def test_set_input_enum():
    simulation = Simulation(tax_benefit_system=tax_benefit_system,
                            simulation_json=couple)
    status_occupancy = np.asarray(['owner'])
    period = make_period('2017-12')
    HousingOccupancyStatus = tax_benefit_system.get_variable(
        'housing_occupancy_status').possible_values
    simulation.household.get_holder('housing_occupancy_status').set_input(
        period, status_occupancy)
    result = simulation.calculate('housing_occupancy_status', period)
    assert_equal(result, HousingOccupancyStatus.owner)
예제 #9
0
    def trace():
        tax_benefit_system = data['tax_benefit_system']
        request.on_json_loading_failed = handle_invalid_json
        input_data = request.get_json()
        try:
            simulation = Simulation(tax_benefit_system=tax_benefit_system,
                                    simulation_json=input_data,
                                    trace=True)
        except SituationParsingError as e:
            abort(make_response(jsonify(e.error), e.code or 400))

        requested_computations = dpath.util.search(input_data,
                                                   '*/*/*/*',
                                                   afilter=lambda t: t is None,
                                                   yielded=True)
        for computation in requested_computations:
            path = computation[0]
            entity_plural, entity_id, variable_name, period = path.split('/')
            simulation.calculate(variable_name, period)

        trace = deepcopy(simulation.tracer.trace)
        for vector_key, vector_trace in trace.items():
            value = vector_trace['value'].tolist()
            if isinstance(value[0], Enum):
                value = [item.name for item in value]
            if isinstance(value[0], bytes):
                value = [to_unicode(item) for item in value]
            vector_trace['value'] = value

        return jsonify({
            "trace":
            trace,
            "entitiesDescription": {
                entity.plural: entity.ids
                for entity in simulation.entities.values()
            },
            "requestedCalculations":
            list(simulation.tracer.requested_calculations)
        })
def run_situation(reform_name, reform, situation_json,  calculs):
    with open(situation_json) as json_data:
        json_str = json_data.read()
        situation = json.loads(json_str)

    results = {"Situation": situation_json, "Legislation": reform_name}

    # Initialisez la simulation (rencontre des entités avec la legislation)
    simulation = Simulation(tax_benefit_system=reform, simulation_json=situation)

    # Demandez l'ensemble des calculs
    for calcul, period in calculs.iteritems():
        results
        try:
            results[calcul] = simulation.calculate(calcul, period)[0]
            print('. ' + calcul)
        except ParameterNotFound as e:
            print 'x ' + calcul
            print e.message + os.linesep

    return results
예제 #11
0
def run_situation(reform_name, reform, situation_json, calculs):
    with open(situation_json) as json_data:
        json_str = json_data.read()
        situation = json.loads(json_str)

    results = {"Situation": situation_json, "Legislation": reform_name}

    # Initialisez la simulation (rencontre des entités avec la legislation)
    simulation = Simulation(tax_benefit_system=reform,
                            simulation_json=situation)

    # Demandez l'ensemble des calculs
    for calcul, period in calculs.iteritems():
        results
        try:
            results[calcul] = simulation.calculate(calcul, period)[0]
            print('. ' + calcul)
        except ParameterNotFound as e:
            print 'x ' + calcul
            print e.message + os.linesep

    return results
예제 #12
0
 def simulate(self, variable_name, period, simulation_data):
     simulation = Simulation(
         tax_benefit_system=self.tax_benefit_system,
         simulation_json=simulation_data.to_openfisca_dict(period=period))
     result = simulation.calculate(variable_name, period=period)
     return result
예제 #13
0
# Calculez la situation actuelle de la legislation française
legislation_france = openfisca_france.FranceTaxBenefitSystem()
simulation_actuelle = Simulation(tax_benefit_system=legislation_france,
                                 simulation_json=situation)

# Insérez ci-dessous la variable que vous souhaitez calculer (ex : 'aah_base_ressources')
# ainsi que la periode sur laquelle vous souaitez la calculer (ex : '2017')
bases_ressources = [
    'aah_base_ressources', 'ass_base_ressources', 'cmu_base_ressources',
    'prestations_familiales_base_ressources'
]

for base in bases_ressources:
    print(base)
    print(simulation_actuelle.calculate(base, '2018-01'))
    print('---')

# Calculez la situation avec la réforme
print('#### Réforme ####')
legislation_reforme = MaReforme(legislation_france)
simulation_reforme = Simulation(tax_benefit_system=legislation_reforme,
                                simulation_json=situation)

# Insérez ci-dessous la variable que vous souhaitez calculer (ex : 'impots_directs')
# ainsi que la periode sur laquelle vous souhaitez la calculer (ex : '2017')
bases_ressources = [
    'base_ressource_mensuelle_individu',
]

for base in bases_ressources:
예제 #14
0
from datetime import datetime
from openfisca_core.simulations import Simulation

import sys

from pprint import pprint

filename = '../doc/CMUCACS.csv'

if len(sys.argv) > 1:
    filename = sys.argv[len(sys.argv) - 1]

legislation_francaise = openfisca_france.FranceTaxBenefitSystem()
with open(filename, 'r') as file:
    rows = csv.DictReader(file)
    for data in rows:
        period = datetime.strptime('2018-08-01', '%Y-%m-%d')
        situation = cpam_utils.createSituation(data, period)
        pprint(situation)

        simulation_actuelle = Simulation(
            tax_benefit_system=legislation_francaise,
            simulation_json=situation)
        variable = 'cmu_c'

        periodText = period.strftime('%Y-%m')
        resultat = simulation_actuelle.calculate(variable, periodText)

        print('{0} - {1} : {2}'.format(variable, periodText, resultat))
        print('')
예제 #15
0
      ],

      "personne_de_reference": [
        "Alex"
      ]
    }
  }
}

# Calculez la situation actuelle de la legislation française
legislation_france = openfisca_france.FranceTaxBenefitSystem()
simulation_actuelle = Simulation(tax_benefit_system=legislation_france, simulation_json=situation)

# Insérez ci-dessous la variable que vous souhaitez calculer (ex : 'impots_directs')
# ainsi que la periode sur laquelle vous souaitez la calculer (ex : '2017')
resultat_actuel = simulation_actuelle.calculate('impots_directs', '2017')

print "Résultat actuel"
print resultat_actuel

# Calculez la situation avec la réforme
legislation_reforme = MaReforme(legislation_france)
simulation_reforme = Simulation(tax_benefit_system=legislation_reforme, simulation_json=situation)

# Insérez ci-dessous la variable que vous souhaitez calculer (ex : 'impots_directs')
# ainsi que la periode sur laquelle vous souaitez la calculer (ex : '2017')
resultat_reforme = simulation_reforme.calculate('impots_directs', '2017')

print "Resultat après reforme"
print resultat_reforme
예제 #16
0
    'cmu_base_ressources': '2018-01',
    'prestations_familiales_base_ressources': '2018-01'
}

# Initialisez le fichier CSV pour export Excel
with open('resultats.csv', 'w') as csvfile:
    fieldnames = ['Situation'] + list(calculs)
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for situation_json in situations_json:
        with open(situation_json) as json_data:
            json_str = json_data.read()
            situation = json.loads(json_str)

        results = {"Situation": situation_json}

        # Initialisez la simulation (rencontre des entités avec la legislation)
        legislation_france = openfisca_france.FranceTaxBenefitSystem()
        simulation_actuelle = Simulation(tax_benefit_system=legislation_france,
                                         simulation_json=situation)

        # Demandez l'ensemble des calculs
        for calcul, period in calculs.iteritems():
            results[calcul] = simulation_actuelle.calculate(calcul, period)[0]

        # Écrivez les resultats dans le CSV
        writer.writerow(results)

print('le calcul est terminé')
tax_benefit_system = openfisca_france.CountryTaxBenefitSystem()
simulation_actuelle = Simulation(
    tax_benefit_system=tax_benefit_system,
    simulation_json=situation)

import numpy
import scipy.stats

import pandas as pd
csv_input = pd.read_csv(inputpath, sep=";", nrows=n_limit)

for calcul, periodes in calculs.iteritems():
    print(calcul)
    ids = simulation_actuelle.get_variable_entity(calcul).ids
    for periode in periodes:
        valeurs = simulation_actuelle.calculate(calcul, periode)
        sources = simulation_actuelle.calculate(calcul, m3)

        csv_input['_'.join(['openfisca', calcul, periode])] = valeurs

        if calcul in process:
            process[calcul](sources, valeurs)
        else:
            print(numpy.corrcoef(valeurs, sources)[0][1])
            # print(scipy.stats.spearmanr(valeurs, sources))
            print (numpy.histogram(valeurs - sources))

        resultat = dict(zip(ids, zip(valeurs, sources)))
        for matricul, valeurs in resultat.iteritems():
            calculee, reelle = valeurs
            #print (matricul, reelle, calculee)
예제 #18
0
with open(json_path) as json_data:
    json1_str = json_data.read()
    situation = json.loads(json1_str)

####### Calculez la situation actuelle de la legislation française ##############

legislation_france = openfisca_france.FranceTaxBenefitSystem()
simulation_actuelle = Simulation(tax_benefit_system=legislation_france,
                                 simulation_json=situation)

# Insérez ci-dessous la variable que vous souhaitez calculer (ex : 'impots_directs')
# ainsi que la periode sur laquelle vous souaitez la calculer (ex : '2017')

print "Revenu Fiscal de Référence"
print simulation_actuelle.calculate('rfr', '2017')
print '---'

bases_ressources = [
    'aah_base_ressources', 'ass_base_ressources', 'cmu_base_ressources',
    'prestations_familiales_base_ressources'
]

for base in bases_ressources:
    print base
    print simulation_actuelle.calculate(base, '2018-01')
    print '---'

# ####### Calcule la situation avec la réforme ##############
# legislation_reforme = MaReform(legislation_france)
# simulation_reforme = Simulation(tax_benefit_system=legislation_reforme, simulation_json=situation)
예제 #19
0
fieldnames = ['Situation', 'Period', 'Variable', 'Value']

# Initialisez le fichier CSV pour export Excel
with open('resultats.csv', 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for situation_json in situations_json:
        with open(situation_json) as json_data:
            json_str = json_data.read()
            situation = json.loads(json_str)

        pprint(situation_json)
        results = {'Situation': situation_json}

        # Initialisez la simulation (rencontre des entités avec la legislation)

        legislation_france = openfisca_france.FranceTaxBenefitSystem()
        simulation_actuelle = Simulation(tax_benefit_system=legislation_france, simulation_json=removeComputedValues(normalize(situation)))

        # Demandez l'ensemble des calculs
        for calcul, periods in calculs.iteritems():
            results['Variable'] = calcul
            for period in periods:
                results['Period'] = period
                results['Value'] = simulation_actuelle.calculate(calcul, period)[0]
                writer.writerow(results)

print 'le calcul est terminé'
예제 #20
0
    'af_taux_modulation': allMonths,
    'prestations_familiales_base_ressources': allMonths,
}

calculs = {
    'af': allMonths,
}

import experiment_af
import situations
situation = utils.merge(utils.prefix('7618153', situations.situation_7618153),
                        utils.prefix('6771069', situations.situation_6771069))

simulation_actuelle = Simulation(tax_benefit_system=tax_benefit_system,
                                 simulation_json=situation)

checkPeriod = "2018-07"
for calcul, periods in calculs.iteritems():
    ids = simulation_actuelle.get_variable_entity(calcul).ids
    for period in periods:
        data = simulation_actuelle.calculate(calcul, period)
        result = dict(zip(ids, data))
        for mid, value in result.iteritems():
            print(mid, value, value * 0.995)
            # source = situation["familles"][mid]["af"][checkPeriod]
            # if abs(source - value)>1:
            #     print (mid, source, value)

from pprint import pprint
#pprint(situation)
예제 #21
0
# -*- coding: utf-8 -*-

from openfisca_france import CountryTaxBenefitSystem
from openfisca_core.simulations import Simulation
from situation_examples import celibataire

tax_benefit_system = CountryTaxBenefitSystem()
simulation = Simulation(tax_benefit_system=tax_benefit_system,
                        simulation_json=celibataire)

print(simulation.calculate('revenu_disponible', '2016'))