def test_shortcut_to_containing_entity_not_provided(): """ Tests that, when an entity doesn't provide a containing entity, the shortcut to that containing entity is not provided. """ person_entity = build_entity( key="person", plural="people", label="A person", is_person=True, ) family_entity = build_entity( key="family", plural="families", label="A family (all members in the same household)", containing_entities=[], roles=[{ "key": "member", "plural": "members", "label": "Member", }]) household_entity = build_entity( key="household", plural="households", label="A household, containing one or more families", roles=[{ "key": "member", "plural": "members", "label": "Member", }]) entities = [person_entity, family_entity, household_entity] system = TaxBenefitSystem(entities) simulation = SimulationBuilder().build_from_dict(system, {}) try: simulation.populations["family"].household raise AssertionError() except AttributeError: pass
class salaire_net(Variable): column = FloatCol entity = Individu label = u"Salaire net" def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') salaire_brut = simulation.calculate('salaire_brut', period) return period, salaire_brut * 0.8 # TaxBenefitSystem instance declared after formulas tax_benefit_system = TaxBenefitSystem([Famille, Individu]) tax_benefit_system.add_variables(age_en_mois, birth, depcom, salaire_brut, age, dom_tom, revenu_disponible, rsa, salaire_imposable, salaire_net) @timeit def check_revenu_disponible(year, depcom, expected_revenu_disponible): simulation = simulations.Simulation(period=periods.period(year), tax_benefit_system=tax_benefit_system) famille = simulation.entities["famille"] famille.count = 3 famille.roles_count = 2 famille.step_size = 1 individu = simulation.entities["individu"] individu.count = 6
def test_group_encapsulation(): """Projects a calculation to all members of an entity. When a household contains more than one family Variables can be defined for the the household And calculations are projected to all the member families. """ from openfisca_core.taxbenefitsystems import TaxBenefitSystem from openfisca_core.entities import build_entity from openfisca_core.periods import ETERNITY person_entity = build_entity( key="person", plural="people", label="A person", is_person=True, ) family_entity = build_entity( key="family", plural="families", label="A family (all members in the same household)", containing_entities=["household"], roles=[{ "key": "member", "plural": "members", "label": "Member", }]) household_entity = build_entity( key="household", plural="households", label="A household, containing one or more families", roles=[{ "key": "member", "plural": "members", "label": "Member", }]) entities = [person_entity, family_entity, household_entity] system = TaxBenefitSystem(entities) class household_level_variable(Variable): value_type = int entity = household_entity definition_period = ETERNITY class projected_family_level_variable(Variable): value_type = int entity = family_entity definition_period = ETERNITY def formula(family, period): return family.household("household_level_variable", period) system.add_variables(household_level_variable, projected_family_level_variable) simulation = SimulationBuilder().build_from_dict( system, { "people": { "person1": {}, "person2": {}, "person3": {} }, "families": { "family1": { "members": ["person1", "person2"] }, "family2": { "members": ["person3"] }, }, "households": { "household1": { "members": ["person1", "person2", "person3"], "household_level_variable": { "eternity": 5 } } } }) assert (simulation.calculate("projected_family_level_variable", "2021-01-01") == 5).all()
def test_enum_projects_downwards(): """ Test that an Enum-type household-level variable projects values onto its members correctly. """ person = build_entity( key="person", plural="people", label="A person", is_person=True, ) household = build_entity(key="household", plural="households", label="A household", roles=[{ "key": "member", "plural": "members", "label": "Member", }]) entities = [person, household] system = TaxBenefitSystem(entities) class enum(Enum): FIRST_OPTION = "First option" SECOND_OPTION = "Second option" class household_enum_variable(Variable): value_type = Enum possible_values = enum default_value = enum.FIRST_OPTION entity = household definition_period = ETERNITY class projected_enum_variable(Variable): value_type = Enum possible_values = enum default_value = enum.FIRST_OPTION entity = person definition_period = ETERNITY def formula(person, period): return person.household("household_enum_variable", period) system.add_variables(household_enum_variable, projected_enum_variable) simulation = SimulationBuilder().build_from_dict( system, { "people": { "person1": {}, "person2": {}, "person3": {} }, "households": { "household1": { "members": ["person1", "person2", "person3"], "household_enum_variable": { "eternity": "SECOND_OPTION" } } } }) assert (simulation.calculate("projected_enum_variable", "2021-01-01").decode_to_str() == np.array( ["SECOND_OPTION"] * 3)).all()
def test_enum_projects_between_containing_groups(): """ Test that an Enum-type person-level variable projects values onto its household (from the first person) correctly. """ person_entity = build_entity( key="person", plural="people", label="A person", is_person=True, ) family_entity = build_entity( key="family", plural="families", label="A family (all members in the same household)", containing_entities=["household"], roles=[{ "key": "member", "plural": "members", "label": "Member", }]) household_entity = build_entity( key="household", plural="households", label="A household, containing one or more families", roles=[{ "key": "member", "plural": "members", "label": "Member", }]) entities = [person_entity, family_entity, household_entity] system = TaxBenefitSystem(entities) class enum(Enum): FIRST_OPTION = "First option" SECOND_OPTION = "Second option" class household_level_variable(Variable): value_type = Enum possible_values = enum default_value = enum.FIRST_OPTION entity = household_entity definition_period = ETERNITY class projected_family_level_variable(Variable): value_type = Enum possible_values = enum default_value = enum.FIRST_OPTION entity = family_entity definition_period = ETERNITY def formula(family, period): return family.household("household_level_variable", period) system.add_variables(household_level_variable, projected_family_level_variable) simulation = SimulationBuilder().build_from_dict( system, { "people": { "person1": {}, "person2": {}, "person3": {} }, "families": { "family1": { "members": ["person1", "person2"] }, "family2": { "members": ["person3"] }, }, "households": { "household1": { "members": ["person1", "person2", "person3"], "household_level_variable": { "eternity": "SECOND_OPTION" } } } }) assert (simulation.calculate("projected_family_level_variable", "2021-01-01").decode_to_str() == np.array( ["SECOND_OPTION"])).all()