From 042c7428eeecdaff9f72f54813ac4ae04f0a376b Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Sat, 12 Jul 2025 15:03:40 +0100 Subject: [PATCH 1/5] Simulation to-input-dataframe saves variable time periods which are incompatible with the variables. Fixes #375 --- changelog_entry.yaml | 4 ++++ policyengine_core/simulations/simulation.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb..6e40004e2 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + fixed: + - Bug causing to_input_dataframe to include bad time periods. diff --git a/policyengine_core/simulations/simulation.py b/policyengine_core/simulations/simulation.py index 795642fc5..2ed89728b 100644 --- a/policyengine_core/simulations/simulation.py +++ b/policyengine_core/simulations/simulation.py @@ -1503,6 +1503,12 @@ def to_input_dataframe( for variable in self.tax_benefit_system.variables: for period in self.get_holder(variable).get_known_periods(): + # Test if period matches entity definition period + if ( + variable.definition_period + != period.unit + ): + continue values = self.calculate(variable, period, map_to="person") if values is not None: df[f"{variable}__{period}"] = values From 84a71cec56348f2178d465445527adec48200b36 Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Sat, 12 Jul 2025 15:06:16 +0100 Subject: [PATCH 2/5] Format --- policyengine_core/simulations/simulation.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/policyengine_core/simulations/simulation.py b/policyengine_core/simulations/simulation.py index 2ed89728b..f00e7ccfb 100644 --- a/policyengine_core/simulations/simulation.py +++ b/policyengine_core/simulations/simulation.py @@ -1504,10 +1504,7 @@ def to_input_dataframe( for variable in self.tax_benefit_system.variables: for period in self.get_holder(variable).get_known_periods(): # Test if period matches entity definition period - if ( - variable.definition_period - != period.unit - ): + if variable.definition_period != period.unit: continue values = self.calculate(variable, period, map_to="person") if values is not None: From 484779cdc756513686e35ac3d7ddc38787bdd7ae Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Sat, 12 Jul 2025 15:07:42 +0100 Subject: [PATCH 3/5] Fix bug --- policyengine_core/simulations/simulation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/policyengine_core/simulations/simulation.py b/policyengine_core/simulations/simulation.py index f00e7ccfb..1729297c9 100644 --- a/policyengine_core/simulations/simulation.py +++ b/policyengine_core/simulations/simulation.py @@ -1502,9 +1502,10 @@ def to_input_dataframe( df = pd.DataFrame() for variable in self.tax_benefit_system.variables: + variable_meta = self.tax_benefit_system.variables[variable] for period in self.get_holder(variable).get_known_periods(): # Test if period matches entity definition period - if variable.definition_period != period.unit: + if variable_meta.definition_period != period.unit: continue values = self.calculate(variable, period, map_to="person") if values is not None: From e85835f2e631a77bd1470fb92f5449beb5c30982 Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Sat, 12 Jul 2025 15:11:11 +0100 Subject: [PATCH 4/5] Add print statement --- policyengine_core/simulations/simulation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/policyengine_core/simulations/simulation.py b/policyengine_core/simulations/simulation.py index 1729297c9..9a06e96a7 100644 --- a/policyengine_core/simulations/simulation.py +++ b/policyengine_core/simulations/simulation.py @@ -1505,6 +1505,7 @@ def to_input_dataframe( variable_meta = self.tax_benefit_system.variables[variable] for period in self.get_holder(variable).get_known_periods(): # Test if period matches entity definition period + print(f"{variable}, {period}, {variable_meta.definition_period}") if variable_meta.definition_period != period.unit: continue values = self.calculate(variable, period, map_to="person") From 3a758d4eb4a5c036238d2b5aaf1cbd7ab2da1aef Mon Sep 17 00:00:00 2001 From: Nikhil Woodruff Date: Sat, 12 Jul 2025 15:15:47 +0100 Subject: [PATCH 5/5] More rigorously infer time period --- policyengine_core/simulations/simulation.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/policyengine_core/simulations/simulation.py b/policyengine_core/simulations/simulation.py index 9a06e96a7..a0b1ec851 100644 --- a/policyengine_core/simulations/simulation.py +++ b/policyengine_core/simulations/simulation.py @@ -1505,7 +1505,6 @@ def to_input_dataframe( variable_meta = self.tax_benefit_system.variables[variable] for period in self.get_holder(variable).get_known_periods(): # Test if period matches entity definition period - print(f"{variable}, {period}, {variable_meta.definition_period}") if variable_meta.definition_period != period.unit: continue values = self.calculate(variable, period, map_to="person") @@ -1566,7 +1565,11 @@ def subsample( df = self.to_input_dataframe() # Extract time period from DataFrame columns - df_time_period = df.columns.values[0].split("__")[1] + df_time_period = ( + df.columns[df.columns.str.contains("household_id__")] + .values[0] + .split("__")[1] + ) df_household_id_column = f"household_id__{df_time_period}" df_person_id_column = f"person_id__{df_time_period}"