diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..4b9710c2daf 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,8 @@ +- bump: patch + changes: + fixed: + - Added default parameters to select statements for better performance and clarity (issue #1176) + - Updated select statements with dummy True conditions to use default parameter instead + - Set SINGLE as default for filing status select statements per issue #3334 + changed: + - Consolidated Pell Grant calculation method variables by replacing pell_grant_calculation_method and pell_grant_uses_efc with pell_grant_uses_sai diff --git a/policyengine_us/tests/tools/test_filing_status_utility.yaml b/policyengine_us/tests/tools/test_filing_status_utility.yaml new file mode 100644 index 00000000000..af1dc04b7e6 --- /dev/null +++ b/policyengine_us/tests/tools/test_filing_status_utility.yaml @@ -0,0 +1,55 @@ +# Test that select_filing_status_value works correctly with MD income tax +- name: Test filing status utility with MD tax - single filer + period: 2024 + input: + people: + person: + age: 30 + tax_units: + tax_unit: + members: [person] + md_taxable_income: 50_000 + households: + household: + members: [person] + state_code: MD + output: + md_income_tax_before_credits: 2_322.50 + +- name: Test filing status utility with MD tax - joint filers + period: 2024 + input: + people: + head: + age: 30 + spouse: + age: 28 + tax_units: + tax_unit: + members: [head, spouse] + md_taxable_income: 100_000 + households: + household: + members: [head, spouse] + state_code: MD + output: + md_income_tax_before_credits: 4_697.50 + +- name: Test filing status utility with MD tax - head of household + period: 2024 + input: + people: + head: + age: 35 + child: + age: 10 + tax_units: + tax_unit: + members: [head, child] + md_taxable_income: 75_000 + households: + household: + members: [head, child] + state_code: MD + output: + md_income_tax_before_credits: 3_510.00 diff --git a/policyengine_us/tools/general.py b/policyengine_us/tools/general.py index 84701fc131b..d8fe10397c2 100644 --- a/policyengine_us/tools/general.py +++ b/policyengine_us/tools/general.py @@ -84,3 +84,81 @@ def get_previous_threshold( return t[ max_((t <= values.reshape((1, len(values))).T).sum(axis=1) - 1, 0) ] + + +def select_filing_status_value( + filing_status: ArrayLike, + filing_status_values: dict, + input_value: ArrayLike = None, + **kwargs, +) -> ArrayLike: + """ + Select a value based on filing status, with SINGLE as the default. + + This is a common pattern for selecting parameter values based on filing status. + According to IRS SOI data, SINGLE is the most common filing status. + + Args: + filing_status: Array of filing status enum values + filing_status_values: Dict mapping filing status to values or functions + input_value: Optional input value to pass to functions (e.g., taxable income) + + Returns: + Array of selected values based on filing status + + Example: + # For parameter values + result = select_filing_status_value( + filing_status, + parameters.amount + ) + + # For calculated values (e.g., tax brackets) + result = select_filing_status_value( + filing_status, + parameters.rates, + taxable_income + ) + """ + statuses = filing_status.possible_values + + # Helper function to get value + def get_value(fs_value): + if input_value is not None and hasattr(fs_value, "calc"): + # It's a rate schedule or similar + return fs_value.calc(input_value, **kwargs) + elif hasattr(fs_value, "__call__"): + # It's a callable + return ( + fs_value(input_value, **kwargs) + if input_value is not None + else fs_value(**kwargs) + ) + else: + # It's a simple value + return fs_value + + # Build conditions and values, excluding SINGLE + conditions = [] + values = [] + + # Check each filing status except SINGLE + for status_name in [ + "JOINT", + "SEPARATE", + "HEAD_OF_HOUSEHOLD", + "SURVIVING_SPOUSE", + ]: + # Check if this enum value exists in this filing status enum + if hasattr(statuses, status_name): + status_enum = getattr(statuses, status_name) + if status_enum.name.lower() in filing_status_values: + conditions.append(filing_status == status_enum) + values.append( + get_value(filing_status_values[status_enum.name.lower()]) + ) + + # SINGLE is the default + default_value = get_value(filing_status_values["single"]) + + return select(conditions, values, default=default_value) diff --git a/policyengine_us/variables/contrib/taxsim/taxsim_mstat.py b/policyengine_us/variables/contrib/taxsim/taxsim_mstat.py index fd097074586..25446b71a54 100644 --- a/policyengine_us/variables/contrib/taxsim/taxsim_mstat.py +++ b/policyengine_us/variables/contrib/taxsim/taxsim_mstat.py @@ -25,4 +25,5 @@ def formula(tax_unit, period, parameters): 6, 8, ], + default=1, # SINGLE ) diff --git a/policyengine_us/variables/contrib/taxsim/taxsim_state.py b/policyengine_us/variables/contrib/taxsim/taxsim_state.py index 8c07e831f47..c6aa5ae7041 100644 --- a/policyengine_us/variables/contrib/taxsim/taxsim_state.py +++ b/policyengine_us/variables/contrib/taxsim/taxsim_state.py @@ -16,13 +16,12 @@ def formula(tax_unit, period, parameters): state_code_str == "MA", state_code_str == "NY", state_code_str == "WA", - True, ], [ 21, 22, 33, 48, - 0, ], + default=0, ) diff --git a/policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py b/policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py index 2fa39107187..b1b587a0a9d 100644 --- a/policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py +++ b/policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py @@ -28,4 +28,5 @@ def formula(person, period, parameters): max_(0, head_contribution), where(automatic_zero, 0, max_(0, head_contribution)), ], + default=0, ) diff --git a/policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_uses_efc.py b/policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_uses_efc.py deleted file mode 100644 index 34f06b18d00..00000000000 --- a/policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_uses_efc.py +++ /dev/null @@ -1,12 +0,0 @@ -from policyengine_us.model_api import * - - -class pell_grant_uses_efc(Variable): - value_type = bool - entity = Person - definition_period = YEAR - label = "Pell Grant uses the expected family contribution" - - def formula(person, period, parameters): - method = person.tax_unit("pell_grant_calculation_method", period) - return method == method.possible_values.EFC diff --git a/policyengine_us/variables/gov/ed/pell_grant/head/pell_grant_head_contribution.py b/policyengine_us/variables/gov/ed/pell_grant/head/pell_grant_head_contribution.py index 04e85cbbf4f..75f3d032b76 100644 --- a/policyengine_us/variables/gov/ed/pell_grant/head/pell_grant_head_contribution.py +++ b/policyengine_us/variables/gov/ed/pell_grant/head/pell_grant_head_contribution.py @@ -16,7 +16,6 @@ def formula(person, period, parameters): assets = person("pell_grant_contribution_from_assets", period) adjusted_available_income = available_income + assets formula = person("pell_grant_formula", period) - uses_efc = person("pell_grant_uses_efc", period) uses_sai = person("pell_grant_uses_sai", period) p = parameters(period).gov.ed.pell_grant.head positive_head_contribution = p.marginal_rate.calc( @@ -40,4 +39,4 @@ def formula(person, period, parameters): mask = dependents > 0 amount_per_dependent[mask] = total[mask] / dependents[mask] - return select([uses_efc, uses_sai], [amount_per_dependent, total]) + return where(uses_sai, total, amount_per_dependent) diff --git a/policyengine_us/variables/gov/ed/pell_grant/pell_grant.py b/policyengine_us/variables/gov/ed/pell_grant/pell_grant.py index e916c0ef057..bcf96732069 100644 --- a/policyengine_us/variables/gov/ed/pell_grant/pell_grant.py +++ b/policyengine_us/variables/gov/ed/pell_grant/pell_grant.py @@ -14,10 +14,9 @@ def formula(person, period, parameters): efc = person("pell_grant_efc", period) sai = person("pell_grant_sai", period) eligibility = person("pell_grant_eligibility_type", period) - uses_efc = person("pell_grant_uses_efc", period) uses_sai = person("pell_grant_uses_sai", period) p = parameters(period).gov.ed.pell_grant - contribution = select([uses_efc, uses_sai], [efc, sai]) + contribution = where(uses_sai, sai, efc) unbounded = coa - contribution amount = where(unbounded < p.amount.min, 0, unbounded) uncapped_efc_pell = amount * ( @@ -30,9 +29,8 @@ def formula(person, period, parameters): eligibility == eligibility.possible_values.MINIMUM, ], [0, p.amount.max, amount], + default=0, ) - uncapped = select( - [uses_efc, uses_sai], [uncapped_efc_pell, uncapped_sai_pell] - ) + uncapped = where(uses_sai, uncapped_sai_pell, uncapped_efc_pell) max = min_(coa, p.amount.max) return min_(max, uncapped) diff --git a/policyengine_us/variables/gov/ed/pell_grant/pell_grant_calculation_method.py b/policyengine_us/variables/gov/ed/pell_grant/pell_grant_calculation_method.py deleted file mode 100644 index 7004d397aa3..00000000000 --- a/policyengine_us/variables/gov/ed/pell_grant/pell_grant_calculation_method.py +++ /dev/null @@ -1,31 +0,0 @@ -from policyengine_us.model_api import * - - -class PellGrantCalculationMethod(Enum): - EFC = "efc" - SAI = "sai" - - -class pell_grant_calculation_method(Variable): - value_type = Enum - possible_values = PellGrantCalculationMethod - default_value = PellGrantCalculationMethod.SAI - entity = TaxUnit - definition_period = YEAR - label = "Pell Grant calculation method" - - def formula(tax_unit, period, parameters): - tax_units = tax_unit("tax_unit_id", period) - return np.full_like( - tax_units, - PellGrantCalculationMethod.EFC, - dtype=PellGrantCalculationMethod, - ) - - def formula_2024(tax_unit, period, parameters): - tax_units = tax_unit("tax_unit_id", period) - return np.full_like( - tax_units, - PellGrantCalculationMethod.SAI, - dtype=PellGrantCalculationMethod, - ) diff --git a/policyengine_us/variables/gov/ed/pell_grant/sai/eligibility_type/pell_grant_household_type.py b/policyengine_us/variables/gov/ed/pell_grant/sai/eligibility_type/pell_grant_household_type.py index 6be70e88189..d9dc74391c3 100644 --- a/policyengine_us/variables/gov/ed/pell_grant/sai/eligibility_type/pell_grant_household_type.py +++ b/policyengine_us/variables/gov/ed/pell_grant/sai/eligibility_type/pell_grant_household_type.py @@ -33,4 +33,5 @@ def formula(person, period, parameters): PellGrantHouseholdType.INDEPENDENT_SINGLE, PellGrantHouseholdType.INDEPENDENT_NOT_SINGLE, ], + default=PellGrantHouseholdType.INDEPENDENT_SINGLE, ) diff --git a/policyengine_us/variables/gov/ed/pell_grant/sai/pell_grant_uses_sai.py b/policyengine_us/variables/gov/ed/pell_grant/sai/pell_grant_uses_sai.py index 0a8aaa475d7..3a1cfd82cbb 100644 --- a/policyengine_us/variables/gov/ed/pell_grant/sai/pell_grant_uses_sai.py +++ b/policyengine_us/variables/gov/ed/pell_grant/sai/pell_grant_uses_sai.py @@ -5,8 +5,13 @@ class pell_grant_uses_sai(Variable): value_type = bool entity = Person definition_period = YEAR - label = "Pell Grant uses the student aid index" + label = "Pell Grant uses the Student Aid Index" def formula(person, period, parameters): - method = person.tax_unit("pell_grant_calculation_method", period) - return method == method.possible_values.SAI + return True + + def formula_2024(person, period, parameters): + return True + + def formula_2023(person, period, parameters): + return False diff --git a/policyengine_us/variables/gov/hhs/ccdf/ccdf_age_group.py b/policyengine_us/variables/gov/hhs/ccdf/ccdf_age_group.py index 783d97bf5ee..205a39161e2 100644 --- a/policyengine_us/variables/gov/hhs/ccdf/ccdf_age_group.py +++ b/policyengine_us/variables/gov/hhs/ccdf/ccdf_age_group.py @@ -34,4 +34,5 @@ def formula(person, period, parameters): CCDFAgeGroup.PRESCHOOLER, CCDFAgeGroup.SCHOOL_AGE, ], + default=CCDFAgeGroup.SCHOOL_AGE, ) diff --git a/policyengine_us/variables/gov/hhs/ccdf/ccdf_duration_of_care.py b/policyengine_us/variables/gov/hhs/ccdf/ccdf_duration_of_care.py index 70d8a1649eb..0e0e014aabe 100644 --- a/policyengine_us/variables/gov/hhs/ccdf/ccdf_duration_of_care.py +++ b/policyengine_us/variables/gov/hhs/ccdf/ccdf_duration_of_care.py @@ -27,12 +27,11 @@ def formula(person, period): hours_per_week >= 30, hours_per_day >= 6, hours_per_day >= 3, - True, ], [ CCDFDurationOfCare.WEEKLY, CCDFDurationOfCare.DAILY, CCDFDurationOfCare.PART_DAY, - CCDFDurationOfCare.HOURLY, ], + default=CCDFDurationOfCare.HOURLY, ) diff --git a/policyengine_us/variables/gov/hhs/ccdf/ccdf_market_rate.py b/policyengine_us/variables/gov/hhs/ccdf/ccdf_market_rate.py index 4dc9d61667e..990d52e3ad8 100644 --- a/policyengine_us/variables/gov/hhs/ccdf/ccdf_market_rate.py +++ b/policyengine_us/variables/gov/hhs/ccdf/ccdf_market_rate.py @@ -30,5 +30,6 @@ def formula(person, period, parameters): duration_of_care == durations_of_care.HOURLY, ], [1, days_per_week, days_per_week, hours_per_week], + default=0, ) return rate_per_period * periods_per_week * WEEKS_IN_YEAR diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/categories/medicaid_category.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/categories/medicaid_category.py index 5d99cbfea76..684f4fa1fc5 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/categories/medicaid_category.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/categories/medicaid_category.py @@ -53,7 +53,7 @@ def formula(person, period, parameters): [ person(variable, period) for variable in variable_to_category.keys() - ] - + [True], - list(variable_to_category.values()) + [MedicaidCategory.NONE], + ], + list(variable_to_category.values()), + default=MedicaidCategory.NONE, ) diff --git a/policyengine_us/variables/gov/irs/credits/elderly_and_disabled/section_22_income.py b/policyengine_us/variables/gov/irs/credits/elderly_and_disabled/section_22_income.py index f9fa23e5137..c42a59dc711 100644 --- a/policyengine_us/variables/gov/irs/credits/elderly_and_disabled/section_22_income.py +++ b/policyengine_us/variables/gov/irs/credits/elderly_and_disabled/section_22_income.py @@ -27,14 +27,13 @@ def formula(tax_unit, period, parameters): num_qualifying_individuals == 1, num_qualifying_individuals == 2, filing_status == filing_status.possible_values.SEPARATE, - True, ], [ elderly_disabled.amount.one_qualified, elderly_disabled.amount.two_qualified, elderly_disabled.amount.separate, - 0, ], + default=0, ) # Limitations on under-65s diff --git a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/tax_unit_taxable_social_security.py b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/tax_unit_taxable_social_security.py index b3d46333127..60893dd2bbf 100644 --- a/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/tax_unit_taxable_social_security.py +++ b/policyengine_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/tax_unit_taxable_social_security.py @@ -65,11 +65,10 @@ def formula(tax_unit, period, parameters): [ under_first_threshold, under_second_threshold, - True, ], [ 0, amount_if_under_second_threshold, - amount_if_over_second_threshold, ], + default=amount_if_over_second_threshold, ) diff --git a/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/household/nyc_household_credit.py b/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/household/nyc_household_credit.py index 5782df44600..43d289329ef 100644 --- a/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/household/nyc_household_credit.py +++ b/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/household/nyc_household_credit.py @@ -1,4 +1,5 @@ from policyengine_us.model_api import * +from policyengine_us.tools.general import select_filing_status_value class nyc_household_credit(Variable): @@ -23,23 +24,25 @@ def formula(tax_unit, period, parameters): # Then get their number of people. tax_unit_size = tax_unit("tax_unit_size", period) - filing_statuses = filing_status.possible_values - - return select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.SEPARATE, - ], - [ - # Single filers get a flat amount. - p.flat_amount.calc(federal_agi, right=True), - # Separate filers get an amount for each person in the tax - # unit, varying with AGI. - p.separate_per_dependent.calc(federal_agi, right=True) - * tax_unit_size, - ], - # Joint, head of household, and surviving spouse filers have a different - # amount per person, varying with AGI. - default=p.other_per_dependent.calc(federal_agi, right=True) + # Create a dictionary of values for each filing status + filing_status_values = { + "single": p.flat_amount.calc(federal_agi, right=True), + "separate": p.separate_per_dependent.calc(federal_agi, right=True) * tax_unit_size, + # Joint, head of household, and surviving spouse use the same formula + "joint": p.other_per_dependent.calc(federal_agi, right=True) + * tax_unit_size, + "head_of_household": p.other_per_dependent.calc( + federal_agi, right=True + ) + * tax_unit_size, + "surviving_spouse": p.other_per_dependent.calc( + federal_agi, right=True + ) + * tax_unit_size, + } + + return select_filing_status_value( + filing_status, + filing_status_values, ) diff --git a/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/school/nyc_school_tax_credit_rate_reduction_amount.py b/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/school/nyc_school_tax_credit_rate_reduction_amount.py index 6c7d0fbb819..04d821cf73f 100644 --- a/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/school/nyc_school_tax_credit_rate_reduction_amount.py +++ b/policyengine_us/variables/gov/local/ny/nyc/tax/income/credits/school/nyc_school_tax_credit_rate_reduction_amount.py @@ -1,4 +1,5 @@ from policyengine_us.model_api import * +from policyengine_us.tools.general import select_filing_status_value class nyc_school_tax_credit_rate_reduction_amount(Variable): @@ -22,20 +23,8 @@ def formula(tax_unit, period, parameters): ).gov.local.ny.nyc.tax.income.credits.school.rate_reduction # Calculate amount if eligible, which varies only with filing status. - filing_statuses = filing_status.possible_values - return select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.JOINT, - filing_status == filing_statuses.SEPARATE, - filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, - filing_status == filing_statuses.SURVIVING_SPOUSE, - ], - [ - p.amount.single.calc(nyc_taxable_income), - p.amount.joint.calc(nyc_taxable_income), - p.amount.separate.calc(nyc_taxable_income), - p.amount.head_of_household.calc(nyc_taxable_income), - p.amount.surviving_spouse.calc(nyc_taxable_income), - ], + return select_filing_status_value( + filing_status, + p.amount, + nyc_taxable_income, ) diff --git a/policyengine_us/variables/gov/local/ny/nyc/tax/income/nyc_income_tax_before_credits.py b/policyengine_us/variables/gov/local/ny/nyc/tax/income/nyc_income_tax_before_credits.py index 77d60affe49..0cb3173f881 100644 --- a/policyengine_us/variables/gov/local/ny/nyc/tax/income/nyc_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/local/ny/nyc/tax/income/nyc_income_tax_before_credits.py @@ -1,4 +1,5 @@ from policyengine_us.model_api import * +from policyengine_us.tools.general import select_filing_status_value class nyc_income_tax_before_credits(Variable): @@ -12,21 +13,9 @@ class nyc_income_tax_before_credits(Variable): def formula(tax_unit, period, parameters): taxable_income = tax_unit("nyc_taxable_income", period) filing_status = tax_unit("filing_status", period) - filing_statuses = filing_status.possible_values rates = parameters(period).gov.local.ny.nyc.tax.income.rates - return select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.JOINT, - filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, - filing_status == filing_statuses.SURVIVING_SPOUSE, - filing_status == filing_statuses.SEPARATE, - ], - [ - rates.single.calc(taxable_income), - rates.joint.calc(taxable_income), - rates.head_of_household.calc(taxable_income), - rates.surviving_spouse.calc(taxable_income), - rates.separate.calc(taxable_income), - ], + return select_filing_status_value( + filing_status, + rates, + taxable_income, ) diff --git a/policyengine_us/variables/gov/states/al/tax/income/al_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/al/tax/income/al_income_tax_before_non_refundable_credits.py index 5ddbba9714d..2a4f2eb46bc 100644 --- a/policyengine_us/variables/gov/states/al/tax/income/al_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/al/tax/income/al_income_tax_before_non_refundable_credits.py @@ -16,21 +16,4 @@ def formula(tax_unit, period, parameters): taxable_income = tax_unit("al_taxable_income", period) p = parameters(period).gov.states.al.tax.income.rates - statuses = filing_status.possible_values - - return select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], - ) + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py index 5a6952e3657..5ad3581cee8 100644 --- a/policyengine_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py @@ -13,18 +13,5 @@ def formula(tax_unit, period, parameters): income = tax_unit("az_taxable_income", period) filing_status = tax_unit("az_filing_status", period) p = parameters(period).gov.states.az.tax.income.main - status = filing_status.possible_values - return select( - [ - filing_status == status.SINGLE, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.JOINT, - filing_status == status.SEPARATE, - ], - [ - p.single.calc(income), - p.head_of_household.calc(income), - p.joint.calc(income), - p.separate.calc(income), - ], - ) + + return select_filing_status_value(filing_status, p, income) diff --git a/policyengine_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py b/policyengine_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py index acdb8820cc1..04aaf40eb84 100644 --- a/policyengine_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py +++ b/policyengine_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py @@ -29,5 +29,6 @@ def formula(tax_unit, period, parameters): p.income_limit.head_of_household.calc(dependents), p.income_limit.separate, ], + default=0, ) return income <= income_limit diff --git a/policyengine_us/variables/gov/states/ca/tax/income/ca_income_tax_before_credits.py b/policyengine_us/variables/gov/states/ca/tax/income/ca_income_tax_before_credits.py index 93457540467..9a67c732be1 100644 --- a/policyengine_us/variables/gov/states/ca/tax/income/ca_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/states/ca/tax/income/ca_income_tax_before_credits.py @@ -15,21 +15,4 @@ def formula(tax_unit, period, parameters): taxable_income = tax_unit("ca_taxable_income", period) p = parameters(period).gov.states.ca.tax.income.rates - statuses = filing_status.possible_values - - return select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], - ) + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py b/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py index fb12ea45022..00f3758eee3 100644 --- a/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py +++ b/policyengine_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py @@ -20,27 +20,13 @@ class co_ctc(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.co.tax.income.credits.ctc filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values person = tax_unit.members # Depending on the year, Colorado has based its CTC on AGI, the federal CTC, and eligible children. agi = tax_unit("adjusted_gross_income", period) if p.ctc_matched_federal_credit: federal_ctc = tax_unit("co_federal_ctc", period) - rate = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.JOINT, - filing_status == statuses.SEPARATE, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.rate.single.calc(agi, right=True), - p.rate.joint.calc(agi, right=True), - p.rate.separate.calc(agi, right=True), - p.rate.surviving_spouse.calc(agi, right=True), - p.rate.head_of_household.calc(agi, right=True), - ], + rate = select_filing_status_value( + filing_status, p.rate, agi, right=True ) return rate * federal_ctc else: @@ -51,20 +37,7 @@ def formula(tax_unit, period, parameters): person("co_ctc_eligible_child", period) & child_age_eligible ) eligible_children = tax_unit.sum(eligible_child) - amount_per_child = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.JOINT, - filing_status == statuses.SEPARATE, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.amount.single.calc(agi, right=True), - p.amount.joint.calc(agi, right=True), - p.amount.separate.calc(agi, right=True), - p.amount.surviving_spouse.calc(agi, right=True), - p.amount.head_of_household.calc(agi, right=True), - ], + amount_per_child = select_filing_status_value( + filing_status, p.amount, agi, right=True ) return amount_per_child * eligible_children diff --git a/policyengine_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py b/policyengine_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py index b575a36f6ed..3e45e4d121b 100644 --- a/policyengine_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py +++ b/policyengine_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py @@ -15,19 +15,9 @@ def formula(tax_unit, period, parameters): status = filing_status.possible_values p = parameters(period).gov.states.ct.tax.income.agi - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(agi, right=True), - p.joint.calc(agi, right=True), - p.separate.calc(agi, right=True), - p.surviving_spouse.calc(agi, right=True), - p.head_of_household.calc(agi, right=True), - ], + return select_filing_status_value( + filing_status, + p, + agi, + right=True, ) diff --git a/policyengine_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py b/policyengine_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py index 4b6fa36b60a..15bfa2a8e47 100644 --- a/policyengine_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py +++ b/policyengine_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py @@ -14,21 +14,10 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) status = filing_status.possible_values p = parameters(period).gov.states.ct.tax.income.rates - itax_before_personal_credits = select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.joint.calc(taxable_income), - p.separate.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], + itax_before_personal_credits = select_filing_status_value( + filing_status, + p, + taxable_income, ) add_back = tax_unit("ct_income_tax_phase_out_add_back", period) tax_recapture = tax_unit("ct_income_tax_recapture", period) diff --git a/policyengine_us/variables/gov/states/ga/tax/income/ga_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/ga/tax/income/ga_income_tax_before_non_refundable_credits.py index 5818ff57675..36ab257f5dd 100644 --- a/policyengine_us/variables/gov/states/ga/tax/income/ga_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/ga/tax/income/ga_income_tax_before_non_refundable_credits.py @@ -12,21 +12,9 @@ class ga_income_tax_before_non_refundable_credits(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.ga.tax.income.main filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values income = tax_unit("ga_taxable_income", period) - return select( - [ - filing_status == status.SINGLE, - filing_status == status.SEPARATE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - ], - [ - p.single.calc(income), - p.separate.calc(income), - p.joint.calc(income), - p.head_of_household.calc(income), - p.surviving_spouse.calc(income), - ], + return select_filing_status_value( + filing_status, + p, + income, ) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_alternative_tax_on_capital_gains.py b/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_alternative_tax_on_capital_gains.py index 0b03c457c71..f8a6efd328e 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_alternative_tax_on_capital_gains.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_alternative_tax_on_capital_gains.py @@ -17,23 +17,11 @@ def formula(tax_unit, period, parameters): ) p = parameters(period).gov.states.hi.tax.income filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values - normal_tax_rate = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.rates.single.calc(eligible_taxable_income), - p.rates.separate.calc(eligible_taxable_income), - p.rates.joint.calc(eligible_taxable_income), - p.rates.surviving_spouse.calc(eligible_taxable_income), - p.rates.head_of_household.calc(eligible_taxable_income), - ], + + normal_tax_rate = select_filing_status_value( + filing_status, p.rates, eligible_taxable_income ) + taxable_income = tax_unit("hi_taxable_income", period) excess_taxable_income = max_( 0, taxable_income - eligible_taxable_income diff --git a/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_taxable_income_for_alternative_tax.py b/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_taxable_income_for_alternative_tax.py index daf1862f96a..9a6f4ad2608 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_taxable_income_for_alternative_tax.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/alternative_tax/hi_taxable_income_for_alternative_tax.py @@ -28,27 +28,16 @@ def formula(tax_unit, period, parameters): # The filer is eligible to compute the tax on the smaller of the taxable income less capital gains # or the taxable income capped at a threshold below the tax on capital gains rate reduced_taxable_income = taxable_income - smaller_net_capital_gain - cap_single = p.rates.single.thresholds[6] - cap_joint = p.rates.joint.thresholds[6] - cap_surviving_spouse = p.rates.surviving_spouse.thresholds[6] - cap_separate = p.rates.separate.thresholds[6] - cap_hoh = p.rates.head_of_household.thresholds[6] - statuses = filing_status.possible_values - cap = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.SEPARATE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - cap_single, - cap_joint, - cap_surviving_spouse, - cap_separate, - cap_hoh, - ], - ) + + # Get the 6th threshold for each filing status + cap_values = { + "single": p.rates.single.thresholds[6], + "joint": p.rates.joint.thresholds[6], + "surviving_spouse": p.rates.surviving_spouse.thresholds[6], + "separate": p.rates.separate.thresholds[6], + "head_of_household": p.rates.head_of_household.thresholds[6], + } + + cap = select_filing_status_value(filing_status, cap_values) capped_taxable_income = min_(taxable_income, cap) return max_(reduced_taxable_income, capped_taxable_income) diff --git a/policyengine_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py b/policyengine_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py index edf50f3250c..547dec48d28 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py @@ -21,22 +21,8 @@ def formula(tax_unit, period, parameters): # for this program. # Determine amount per exemption based on income and filing status filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values - amount_per_exemption = select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - ], - [ - p.amount.single.calc(income), - p.amount.joint.calc(income), - p.amount.head_of_household.calc(income), - p.amount.separate.calc(income), - p.amount.surviving_spouse.calc(income), - ], + amount_per_exemption = select_filing_status_value( + filing_status, p.amount, income ) exemptions = tax_unit("exemptions_count", period) if p.minor_child.in_effect: diff --git a/policyengine_us/variables/gov/states/hi/tax/income/hi_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/hi/tax/income/hi_income_tax_before_non_refundable_credits.py index 493827e35af..2d290d05739 100644 --- a/policyengine_us/variables/gov/states/hi/tax/income/hi_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/hi/tax/income/hi_income_tax_before_non_refundable_credits.py @@ -16,23 +16,8 @@ def formula(tax_unit, period, parameters): taxable_income = tax_unit("hi_taxable_income", period) p = parameters(period).gov.states.hi.tax.income.rates - statuses = filing_status.possible_values - - income_tax = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], + income_tax = select_filing_status_value( + filing_status, p, taxable_income ) alternative_tax = tax_unit( "hi_alternative_tax_on_capital_gains", period diff --git a/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/deductions/ia_standard_deduction_indiv.py b/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/deductions/ia_standard_deduction_indiv.py index 05fe091ae87..087ce03064e 100644 --- a/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/deductions/ia_standard_deduction_indiv.py +++ b/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/deductions/ia_standard_deduction_indiv.py @@ -33,6 +33,7 @@ def formula(person, period, parameters): fsvals.HEAD_OF_HOUSEHOLD, fsvals.SURVIVING_SPOUSE, ], + default=fsvals.SINGLE, ) is_head = person("is_tax_unit_head", period) is_spouse = person("is_tax_unit_spouse", period) diff --git a/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/ia_amt_indiv.py b/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/ia_amt_indiv.py index 4a40a4d452a..33557bcfbb0 100644 --- a/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/ia_amt_indiv.py +++ b/policyengine_us/variables/gov/states/ia/tax/income/including_married_filing_separately/ia_amt_indiv.py @@ -48,6 +48,7 @@ def formula(person, period, parameters): fsvals.HEAD_OF_HOUSEHOLD, fsvals.SURVIVING_SPOUSE, ], + default=fsvals.SINGLE, ) amt_threshold = amt.threshold[filing_status] # Line 23 amt_exemption = amt.exemption[filing_status] # Line 24 diff --git a/policyengine_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py index 3f7ad77082d..8ec3b3aa949 100644 --- a/policyengine_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py @@ -13,20 +13,5 @@ def formula(tax_unit, period, parameters): income = tax_unit("id_taxable_income", period) rates = parameters(period).gov.states.id.tax.income.main filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - rates.single.calc(income), - rates.joint.calc(income), - rates.separate.calc(income), - rates.surviving_spouse.calc(income), - rates.head_of_household.calc(income), - ], - ) + + return select_filing_status_value(filing_status, rates, income) diff --git a/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption.py b/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption.py index 57cd7ce7899..1820996ca5a 100644 --- a/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption.py +++ b/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption.py @@ -29,5 +29,5 @@ def formula(tax_unit, period, parameters): == ILPersonalExemptionEligibilityStatus.PARTIALLY_ELIGIBLE, ], [2, 1], - 0, + default=0, ) diff --git a/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption_eligibility_status.py b/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption_eligibility_status.py index aaf9d533487..102512584bf 100644 --- a/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption_eligibility_status.py +++ b/policyengine_us/variables/gov/states/il/tax/income/exemptions/il_personal_exemption_eligibility_status.py @@ -81,5 +81,5 @@ def formula(tax_unit, period, parameters): ILPersonalExemptionEligibilityStatus.NOT_ELIGIBLE, ILPersonalExemptionEligibilityStatus.PARTIALLY_ELIGIBLE, ], - ILPersonalExemptionEligibilityStatus.BOTH_ELIGIBLE, + default=ILPersonalExemptionEligibilityStatus.BOTH_ELIGIBLE, ) diff --git a/policyengine_us/variables/gov/states/la/tax/income/la_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/la/tax/income/la_income_tax_before_non_refundable_credits.py index 8ad914641a9..bddbc49ff57 100644 --- a/policyengine_us/variables/gov/states/la/tax/income/la_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/la/tax/income/la_income_tax_before_non_refundable_credits.py @@ -22,20 +22,7 @@ def formula(tax_unit, period, parameters): exemptions = tax_unit("la_exemptions", period) bottom_tax_rate = p.by_filing_status.single.rates[0] exempt_income_tax = exemptions * bottom_tax_rate - pre_exemption_tax_amount = select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - p.by_filing_status.single.calc(income), - p.by_filing_status.joint.calc(income), - p.by_filing_status.separate.calc(income), - p.by_filing_status.surviving_spouse.calc(income), - p.by_filing_status.head_of_household.calc(income), - ], + pre_exemption_tax_amount = select_filing_status_value( + filing_status, p.by_filing_status, income ) return max_(pre_exemption_tax_amount - exempt_income_tax, 0) diff --git a/policyengine_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py b/policyengine_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py index dd35598e5f8..68091ab909a 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py +++ b/policyengine_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py @@ -22,20 +22,15 @@ def formula_2022(tax_unit, period, parameters): spouse_eligible = (spouse_age >= p.age_eligibility).astype(int) eligible_count = head_eligible + spouse_eligible - credit_amount = select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - p.amount.single, - p.amount.joint[eligible_count], - p.amount.head_of_household, - p.amount.surviving_spouse, - p.amount.separate, - ], + # For joint filers, use eligible_count to index into the joint amount array + credit_params = { + "single": p.amount.single, + "joint": p.amount.joint[eligible_count], + "head_of_household": p.amount.head_of_household, + "surviving_spouse": p.amount.surviving_spouse, + "separate": p.amount.separate, + } + credit_amount = select_filing_status_value( + filing_status, credit_params ) return (eligible_count > 0) * credit_amount diff --git a/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemption.py b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemption.py index 4d39d907186..2392af23c4d 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemption.py +++ b/policyengine_us/variables/gov/states/md/tax/income/exemptions/md_personal_exemption.py @@ -17,19 +17,14 @@ def formula(tax_unit, period, parameters): agi = tax_unit("adjusted_gross_income", period) # Calculate for each filing status depending on AGI. p = parameters(period).gov.states.md.tax.income.exemptions.personal - return select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.SEPARATE, - filing_status == filing_statuses.JOINT, - filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, - filing_status == filing_statuses.SURVIVING_SPOUSE, - ], - [ - p.single.calc(agi, right=True), - p.separate.calc(agi, right=True), - p.joint.calc(agi, right=True), - p.head.calc(agi, right=True), - p.surviving_spouse.calc(agi, right=True), - ], + # Map 'head' parameter key to 'head_of_household' for the utility + param_dict = { + "single": p.single, + "separate": p.separate, + "joint": p.joint, + "head_of_household": p.head, + "surviving_spouse": p.surviving_spouse, + } + return select_filing_status_value( + filing_status, param_dict, agi, right=True ) diff --git a/policyengine_us/variables/gov/states/md/tax/income/md_income_tax_before_credits.py b/policyengine_us/variables/gov/states/md/tax/income/md_income_tax_before_credits.py index 5e3f472a201..ae00534db11 100644 --- a/policyengine_us/variables/gov/states/md/tax/income/md_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/states/md/tax/income/md_income_tax_before_credits.py @@ -16,21 +16,8 @@ def formula(tax_unit, period, parameters): # Calculate regular income tax based on filing status p = parameters(period).gov.states.md.tax.income - regular_income_tax = select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.SEPARATE, - filing_status == filing_statuses.JOINT, - filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, - filing_status == filing_statuses.SURVIVING_SPOUSE, - ], - [ - p.rates.single.calc(taxable_income), - p.rates.separate.calc(taxable_income), - p.rates.joint.calc(taxable_income), - p.rates.head_of_household.calc(taxable_income), - p.rates.surviving_spouse.calc(taxable_income), - ], + regular_income_tax = select_filing_status_value( + filing_status, p.rates, taxable_income ) # Add capital gains surtax if applicable diff --git a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py index a9254ec2c0b..5b6835804ab 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py +++ b/policyengine_us/variables/gov/states/me/tax/income/credits/fairness/sales_tax_fairness_credit/me_sales_tax_fairness_credit.py @@ -18,19 +18,16 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) status = filing_status.possible_values base = p.amount.base[filing_status] - additional_amount = select( - [ - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - ], - [ - p.amount.additional.joint.calc(children), - p.amount.additional.head_of_household.calc(children), - p.amount.additional.surviving_spouse.calc(children), - ], - # No additional amount for single and separate filers. - default=0, + # Create a dictionary for the additional amount parameter structure + additional_params = { + "joint": p.amount.additional.joint, + "head_of_household": p.amount.additional.head_of_household, + "surviving_spouse": p.amount.additional.surviving_spouse, + "single": lambda x: 0, # No additional amount for single filers + "separate": lambda x: 0, # No additional amount for separate filers + } + additional_amount = select_filing_status_value( + filing_status, additional_params, children ) max_credit = base + additional_amount reduction_start = p.reduction.start[filing_status] diff --git a/policyengine_us/variables/gov/states/me/tax/income/me_income_tax_before_credits.py b/policyengine_us/variables/gov/states/me/tax/income/me_income_tax_before_credits.py index ebe0592626d..ddd3a89b688 100644 --- a/policyengine_us/variables/gov/states/me/tax/income/me_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/states/me/tax/income/me_income_tax_before_credits.py @@ -12,23 +12,7 @@ class me_income_tax_before_credits(Variable): def formula(tax_unit, period, parameters): taxable_income = tax_unit("me_taxable_income", period) filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values p = parameters(period).gov.states.me.tax.income.main - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - p.single.calc(taxable_income), - p.joint.calc(taxable_income), - p.head_of_household.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.separate.calc(taxable_income), - ], - ) + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/mn/tax/income/mn_basic_tax.py b/policyengine_us/variables/gov/states/mn/tax/income/mn_basic_tax.py index 23c04bc540b..f83d2f559b0 100644 --- a/policyengine_us/variables/gov/states/mn/tax/income/mn_basic_tax.py +++ b/policyengine_us/variables/gov/states/mn/tax/income/mn_basic_tax.py @@ -15,22 +15,7 @@ class mn_basic_tax(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values taxable_income = tax_unit("mn_taxable_income", period) p = parameters(period).gov.states.mn.tax.income.rates - return select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], - ) + + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_indiv.py b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_indiv.py index 5d4be55d70a..ec7126a3daf 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_indiv.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_indiv.py @@ -33,5 +33,6 @@ def formula(person, period, parameters): p.rates.head_of_household.thresholds[-1], p.rates.surviving_spouse.thresholds[-1], ], + default=p.rates.single.thresholds[-1], ) return max_(rate_threshold - non_qualified_income, 0) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_joint.py b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_joint.py index 01e082ae59e..f355c7cf334 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_joint.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_applicable_threshold_joint.py @@ -20,20 +20,15 @@ def formula(person, period, parameters): ) status = filing_status.possible_values non_qualified_income = max_(taxable_income - capital_gains, 0) - rate_threshold = select( - [ - filing_status == status.SINGLE, - filing_status == status.SEPARATE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - ], - [ - p.rates.single.thresholds[-1], - p.rates.separate.thresholds[-1], - p.rates.joint.thresholds[-1], - p.rates.head_of_household.thresholds[-1], - p.rates.surviving_spouse.thresholds[-1], - ], + rate_threshold_dict = { + "single": p.rates.single.thresholds[-1], + "separate": p.rates.separate.thresholds[-1], + "joint": p.rates.joint.thresholds[-1], + "head_of_household": p.rates.head_of_household.thresholds[-1], + "surviving_spouse": p.rates.surviving_spouse.thresholds[-1], + } + rate_threshold = select_filing_status_value( + filing_status, + rate_threshold_dict, ) return max_(rate_threshold - non_qualified_income, 0) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_indiv.py b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_indiv.py index ea8acde69a6..eb4ccb7aa19 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_indiv.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_indiv.py @@ -37,6 +37,7 @@ def formula(person, period, parameters): p.rates.surviving_spouse.amounts[0], p.rates.head_of_household.amounts[0], ], + default=p.rates.single.amounts[0], ) higher_rate = select( [ @@ -51,6 +52,7 @@ def formula(person, period, parameters): p.rates.surviving_spouse.amounts[-1], p.rates.head_of_household.amounts[-1], ], + default=p.rates.single.amounts[-1], ) # Calculate taxes capital_gains_below_threshold = min_( diff --git a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_joint.py b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_joint.py index 851febee251..c8f98fc7fd2 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_joint.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/capital_gains/mt_capital_gains_tax_joint.py @@ -21,37 +21,28 @@ def formula(person, period, parameters): ) status = filing_status.possible_values - lower_rate = select( - [ - filing_status == status.SINGLE, - filing_status == status.SEPARATE, - filing_status == status.JOINT, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - p.rates.single.amounts[0], - p.rates.separate.amounts[0], - p.rates.joint.amounts[0], - p.rates.surviving_spouse.amounts[0], - p.rates.head_of_household.amounts[0], - ], + lower_rate_dict = { + "single": p.rates.single.amounts[0], + "separate": p.rates.separate.amounts[0], + "joint": p.rates.joint.amounts[0], + "surviving_spouse": p.rates.surviving_spouse.amounts[0], + "head_of_household": p.rates.head_of_household.amounts[0], + } + lower_rate = select_filing_status_value( + filing_status, + lower_rate_dict, ) - higher_rate = select( - [ - filing_status == status.SINGLE, - filing_status == status.SEPARATE, - filing_status == status.JOINT, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - p.rates.single.amounts[-1], - p.rates.separate.amounts[-1], - p.rates.joint.amounts[-1], - p.rates.surviving_spouse.amounts[-1], - p.rates.head_of_household.amounts[-1], - ], + + higher_rate_dict = { + "single": p.rates.single.amounts[-1], + "separate": p.rates.separate.amounts[-1], + "joint": p.rates.joint.amounts[-1], + "surviving_spouse": p.rates.surviving_spouse.amounts[-1], + "head_of_household": p.rates.head_of_household.amounts[-1], + } + higher_rate = select_filing_status_value( + filing_status, + higher_rate_dict, ) # Calculate taxes capital_gains_below_threshold = min_( diff --git a/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_indiv.py b/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_indiv.py index def966f92d0..e9873d5ebef 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_indiv.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_indiv.py @@ -19,18 +19,4 @@ def formula(person, period, parameters): if p.capital_gains.in_effect: capital_gains = person("long_term_capital_gains", period) taxable_income = max_(taxable_income - capital_gains, 0) - status = filing_status.possible_values - return select( - [ - filing_status == status.SINGLE, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - ], - [ - p.single.calc(taxable_income), - p.head_of_household.calc(taxable_income), - p.separate.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - ], - ) + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_joint.py b/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_joint.py index 9488150a102..ed3ac5e067a 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_joint.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_regular_income_tax_joint.py @@ -18,19 +18,8 @@ def formula(tax_unit, period, parameters): if p.capital_gains.in_effect: capital_gains = add(tax_unit, period, ["long_term_capital_gains"]) taxable_income = max_(taxable_income - capital_gains, 0) - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - ], - [ - p.single.calc(taxable_income), - p.joint.calc(taxable_income), - p.head_of_household.calc(taxable_income), - p.separate.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - ], + return select_filing_status_value( + filing_status, + p, + taxable_income, ) diff --git a/policyengine_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py b/policyengine_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py index 700775f08b8..45af10b7dd5 100644 --- a/policyengine_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py +++ b/policyengine_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py @@ -16,20 +16,9 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) p = parameters(period).gov.states.nc.tax.income.credits.ctc status = filing_status.possible_values - credit_amount = select( - [ - filing_status == status.SINGLE, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.JOINT, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - p.single.calc(income), - p.head_of_household.calc(income), - p.joint.calc(income), - p.surviving_spouse.calc(income), - p.separate.calc(income), - ], + credit_amount = select_filing_status_value( + filing_status, + p, + income, ) return ctc_qualifying_children * credit_amount diff --git a/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py b/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py index f6f8f50c5ed..b738b4f0366 100644 --- a/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py +++ b/policyengine_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py @@ -15,21 +15,11 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) statuses = filing_status.possible_values p = parameters(period).gov.states.nc.tax.income.deductions.child - amount = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(federal_agi, right=True), - p.separate.calc(federal_agi, right=True), - p.joint.calc(federal_agi, right=True), - p.surviving_spouse.calc(federal_agi, right=True), - p.head_of_household.calc(federal_agi, right=True), - ], + amount = select_filing_status_value( + filing_status, + p, + federal_agi, + right=True, ) # calculate number of eligible children children = tax_unit("ctc_qualifying_children", period) diff --git a/policyengine_us/variables/gov/states/nd/tax/income/nd_income_tax_before_credits.py b/policyengine_us/variables/gov/states/nd/tax/income/nd_income_tax_before_credits.py index 71d25e306a8..55d378384b6 100644 --- a/policyengine_us/variables/gov/states/nd/tax/income/nd_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/states/nd/tax/income/nd_income_tax_before_credits.py @@ -15,22 +15,7 @@ class nd_income_tax_before_credits(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values taxable_income = tax_unit("nd_taxable_income", period) p = parameters(period).gov.states.nd.tax.income.rates - return select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], - ) + + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/ne/tax/income/ne_income_tax_before_credits.py b/policyengine_us/variables/gov/states/ne/tax/income/ne_income_tax_before_credits.py index 488a2b4bef8..60e79d2848e 100644 --- a/policyengine_us/variables/gov/states/ne/tax/income/ne_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/states/ne/tax/income/ne_income_tax_before_credits.py @@ -15,22 +15,7 @@ class ne_income_tax_before_credits(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values taxable_income = tax_unit("ne_taxable_income", period) p = parameters(period).gov.states.ne.tax.income.rates - return select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], - ) + + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py b/policyengine_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py index 874cec32d58..60fa51d516d 100644 --- a/policyengine_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py +++ b/policyengine_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py @@ -16,23 +16,12 @@ class nj_retirement_exclusion_fraction(Variable): def formula(tax_unit, period, parameters): total_income = add(tax_unit, period, ["nj_total_income"]) filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values p = parameters( period ).gov.states.nj.tax.income.exclusions.retirement.pension - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - p.percentage.single.calc(total_income, right=True), - p.percentage.joint.calc(total_income, right=True), - p.percentage.head_of_household.calc(total_income, right=True), - p.percentage.surviving_spouse.calc(total_income, right=True), - p.percentage.separate.calc(total_income, right=True), - ], + return select_filing_status_value( + filing_status, + p.percentage, + total_income, + right=True, ) diff --git a/policyengine_us/variables/gov/states/nj/tax/income/nj_main_income_tax.py b/policyengine_us/variables/gov/states/nj/tax/income/nj_main_income_tax.py index 204c112671e..2a4c4746ad0 100644 --- a/policyengine_us/variables/gov/states/nj/tax/income/nj_main_income_tax.py +++ b/policyengine_us/variables/gov/states/nj/tax/income/nj_main_income_tax.py @@ -13,24 +13,12 @@ class nj_main_income_tax(Variable): def formula(tax_unit, period, parameters): taxable_income = tax_unit("nj_taxable_income", period) filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values # Get main nj tax parameter tree. p = parameters(period).gov.states.nj.tax.income.main - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - p.single.calc(taxable_income), - p.joint.calc(taxable_income), - p.head_of_household.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.separate.calc(taxable_income), - ], + return select_filing_status_value( + filing_status, + p, + taxable_income, ) diff --git a/policyengine_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py b/policyengine_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py index 7a08abad749..2062d69adc9 100644 --- a/policyengine_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py +++ b/policyengine_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py @@ -22,42 +22,20 @@ def formula(tax_unit, period, parameters): taxable_income_before_deduction = tax_unit( "nj_taxable_income_before_property_tax_deduction", period ) - taxes_without_deduction = select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - p.single.calc(taxable_income_before_deduction), - p.joint.calc(taxable_income_before_deduction), - p.head_of_household.calc(taxable_income_before_deduction), - p.surviving_spouse.calc(taxable_income_before_deduction), - p.separate.calc(taxable_income_before_deduction), - ], + taxes_without_deduction = select_filing_status_value( + filing_status, + p, + taxable_income_before_deduction, ) # calculate taxes with deduction taxable_income_after_deduction = max_( 0, taxable_income_before_deduction - deduction ) - taxes_with_deduction = select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - p.single.calc(taxable_income_after_deduction), - p.joint.calc(taxable_income_after_deduction), - p.head_of_household.calc(taxable_income_after_deduction), - p.surviving_spouse.calc(taxable_income_after_deduction), - p.separate.calc(taxable_income_after_deduction), - ], + taxes_with_deduction = select_filing_status_value( + filing_status, + p, + taxable_income_after_deduction, ) # calculate credit amount diff --git a/policyengine_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py b/policyengine_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py index ce8849f3007..d2603f410cb 100644 --- a/policyengine_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py +++ b/policyengine_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py @@ -23,7 +23,6 @@ def formula(tax_unit, period, parameters): ).gov.states.nm.tax.income.deductions.medical_care_expense # the deduction amount is based on filing status, agi, and eligible expenses. filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values agi = tax_unit("adjusted_gross_income", period) expenses = add( tax_unit, @@ -31,20 +30,5 @@ def formula(tax_unit, period, parameters): ["medical_out_of_pocket_expenses"], ) # Use `right=True` to reflect "over ... but not over ...". - rate = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.JOINT, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - filing_status == statuses.SEPARATE, - filing_status == statuses.SURVIVING_SPOUSE, - ], - [ - p.single.calc(agi, right=True), - p.joint.calc(agi, right=True), - p.head_of_household.calc(agi, right=True), - p.separate.calc(agi, right=True), - p.surviving_spouse.calc(agi, right=True), - ], - ) + rate = select_filing_status_value(filing_status, p, agi, right=True) return expenses * rate diff --git a/policyengine_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py b/policyengine_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py index 48aba37ab9b..3814aa069ba 100644 --- a/policyengine_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py +++ b/policyengine_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py @@ -46,20 +46,5 @@ def formula(tax_unit, period, parameters): ) # Use `right=True` to reflect "over ... but not over ...". - amount = select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.JOINT, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - filing_status == statuses.SEPARATE, - filing_status == statuses.SURVIVING_SPOUSE, - ], - [ - p.single.calc(agi, right=True), - p.joint.calc(agi, right=True), - p.head_of_household.calc(agi, right=True), - p.separate.calc(agi, right=True), - p.surviving_spouse.calc(agi, right=True), - ], - ) + amount = select_filing_status_value(filing_status, p, agi, right=True) return eligible_count * amount diff --git a/policyengine_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py index 6dc3479f50a..64e7ab9f60b 100644 --- a/policyengine_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py @@ -14,19 +14,8 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) status = filing_status.possible_values p = parameters(period).gov.states.nm.tax.income.main - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(income), - p.joint.calc(income), - p.separate.calc(income), - p.surviving_spouse.calc(income), - p.head_of_household.calc(income), - ], + return select_filing_status_value( + filing_status, + p, + income, ) diff --git a/policyengine_us/variables/gov/states/ny/tax/income/credits/ny_inflation_refund_credit.py b/policyengine_us/variables/gov/states/ny/tax/income/credits/ny_inflation_refund_credit.py index 5ef503fa712..6742ea2cea1 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/credits/ny_inflation_refund_credit.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/credits/ny_inflation_refund_credit.py @@ -1,4 +1,5 @@ from policyengine_us.model_api import * +from policyengine_us.tools.general import select_filing_status_value class ny_inflation_refund_credit(Variable): @@ -19,23 +20,12 @@ def formula_2025(tax_unit, period, parameters): ).gov.states.ny.tax.income.credits.inflation_refund agi = tax_unit("ny_agi", period) filing_status = tax_unit("filing_status", period) - filing_statuses = filing_status.possible_values - return select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.JOINT, - filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, - filing_status == filing_statuses.SEPARATE, - filing_status == filing_statuses.SURVIVING_SPOUSE, - ], - [ - p.single.calc(agi, right=True), - p.joint.calc(agi, right=True), - p.head_of_household.calc(agi, right=True), - p.separate.calc(agi, right=True), - p.surviving_spouse.calc(agi, right=True), - ], + return select_filing_status_value( + filing_status, + p, + agi, + right=True, ) def formula_2026(tax_unit, period, parameters): diff --git a/policyengine_us/variables/gov/states/ny/tax/income/ny_main_income_tax.py b/policyengine_us/variables/gov/states/ny/tax/income/ny_main_income_tax.py index b1f8174ff88..609a47f2f77 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/ny_main_income_tax.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/ny_main_income_tax.py @@ -1,4 +1,5 @@ from policyengine_us.model_api import * +from policyengine_us.tools.general import select_filing_status_value class ny_main_income_tax(Variable): @@ -12,28 +13,10 @@ class ny_main_income_tax(Variable): def formula(tax_unit, period, parameters): taxable_income = tax_unit("ny_taxable_income", period) filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values - rates = parameters(period).gov.states.ny.tax.income.main - single = rates.single - joint = rates.joint - hoh = rates.head_of_household - surviving_spouse = rates.surviving_spouse - separate = rates.separate - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.SEPARATE, - ], - [ - single.calc(taxable_income), - joint.calc(taxable_income), - hoh.calc(taxable_income), - surviving_spouse.calc(taxable_income), - separate.calc(taxable_income), - ], + return select_filing_status_value( + filing_status, + rates, + taxable_income, ) diff --git a/policyengine_us/variables/gov/states/ny/tax/income/ny_supplemental_tax.py b/policyengine_us/variables/gov/states/ny/tax/income/ny_supplemental_tax.py index 8daa26f4679..40263948770 100644 --- a/policyengine_us/variables/gov/states/ny/tax/income/ny_supplemental_tax.py +++ b/policyengine_us/variables/gov/states/ny/tax/income/ny_supplemental_tax.py @@ -1,5 +1,9 @@ from policyengine_us.model_api import * from policyengine_core.taxscales import MarginalRateTaxScale +from policyengine_us.tools.general import ( + select_filing_status_value, + get_previous_threshold, +) class ny_supplemental_tax(Variable): @@ -19,29 +23,28 @@ def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) status = filing_status.possible_values - statuses = [ - status.SINGLE, - status.JOINT, - status.HEAD_OF_HOUSEHOLD, - status.SURVIVING_SPOUSE, - status.SEPARATE, - ] - in_each_status = [filing_status == s for s in statuses] rates = tax.main - single = rates.single - joint = rates.joint - hoh = rates.head_of_household - surviving_spouse = rates.surviving_spouse - separate = rates.separate - scales = [single, joint, hoh, surviving_spouse, separate] - - previous_agi_threshold = select( - in_each_status, - [ - get_previous_threshold(ny_taxable_income, scale.thresholds) - for scale in scales - ], + + # Create a dictionary for rate schedules + rate_schedules = { + "single": rates.single, + "joint": rates.joint, + "head_of_household": rates.head_of_household, + "surviving_spouse": rates.surviving_spouse, + "separate": rates.separate, + } + + # Get previous AGI threshold based on filing status + def get_previous_threshold_value(scale): + return get_previous_threshold(ny_taxable_income, scale.thresholds) + + previous_agi_threshold = select_filing_status_value( + filing_status, + { + k: get_previous_threshold_value(v) + for k, v in rate_schedules.items() + }, ) applicable_amount = max_( @@ -54,19 +57,17 @@ def formula(tax_unit, period, parameters): ) # edge case for high agi - agi_limit = select( - in_each_status, - [ - single.thresholds[-1], - joint.thresholds[-1], - hoh.thresholds[-1], - surviving_spouse.thresholds[-1], - separate.thresholds[-1], - ], + agi_limit = select_filing_status_value( + filing_status, + {k: v.thresholds[-1] for k, v in rate_schedules.items()}, ) - high_agi_rate = select( - in_each_status, - [scale.marginal_rates(agi_limit + 1) for scale in scales], + + high_agi_rate = select_filing_status_value( + filing_status, + { + k: v.marginal_rates(agi_limit + 1) + for k, v in rate_schedules.items() + }, ) supplemental_tax_high_agi = ( @@ -74,30 +75,16 @@ def formula(tax_unit, period, parameters): ) if p.in_effect: - recapture_base = select( - in_each_status, - [ - p.recapture_base.single.calc(ny_taxable_income), - p.recapture_base.joint.calc(ny_taxable_income), - p.recapture_base.head_of_household.calc(ny_taxable_income), - p.recapture_base.surviving_spouse.calc(ny_taxable_income), - p.recapture_base.separate.calc(ny_taxable_income), - ], + recapture_base = select_filing_status_value( + filing_status, + p.recapture_base, + ny_taxable_income, ) - incremental_benefit = select( - in_each_status, - [ - p.incremental_benefit.single.calc(ny_taxable_income), - p.incremental_benefit.joint.calc(ny_taxable_income), - p.incremental_benefit.head_of_household.calc( - ny_taxable_income - ), - p.incremental_benefit.surviving_spouse.calc( - ny_taxable_income - ), - p.incremental_benefit.separate.calc(ny_taxable_income), - ], + incremental_benefit = select_filing_status_value( + filing_status, + p.incremental_benefit, + ny_taxable_income, ) supplemental_tax_general = ( diff --git a/policyengine_us/variables/gov/states/ok/tax/income/ok_income_tax_before_credits.py b/policyengine_us/variables/gov/states/ok/tax/income/ok_income_tax_before_credits.py index 2e898ac5dac..512605dc130 100644 --- a/policyengine_us/variables/gov/states/ok/tax/income/ok_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/states/ok/tax/income/ok_income_tax_before_credits.py @@ -15,22 +15,7 @@ class ok_income_tax_before_credits(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values taxable_income = tax_unit("ok_taxable_income", period) p = parameters(period).gov.states.ok.tax.income.rates - return select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.SEPARATE, - filing_status == statuses.JOINT, - filing_status == statuses.SURVIVING_SPOUSE, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - p.head_of_household.calc(taxable_income), - ], - ) + + return select_filing_status_value(filing_status, p, taxable_income) diff --git a/policyengine_us/variables/gov/states/or/tax/income/or_income_tax_before_credits.py b/policyengine_us/variables/gov/states/or/tax/income/or_income_tax_before_credits.py index 57d224b1649..12485c36b7a 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/or_income_tax_before_credits.py +++ b/policyengine_us/variables/gov/states/or/tax/income/or_income_tax_before_credits.py @@ -15,22 +15,7 @@ class or_income_tax_before_credits(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values income = tax_unit("or_taxable_income", period) rates = parameters(period).gov.states["or"].tax.income.rates - return select( - [ - filing_status == statuses.SINGLE, - filing_status == statuses.JOINT, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - filing_status == statuses.SEPARATE, - filing_status == statuses.SURVIVING_SPOUSE, - ], - [ - rates.single.calc(income), - rates.joint.calc(income), - rates.head_of_household.calc(income), - rates.separate.calc(income), - rates.surviving_spouse.calc(income), - ], - ) + + return select_filing_status_value(filing_status, rates, income) diff --git a/policyengine_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py b/policyengine_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py index 43168c0596f..ab0c43c862d 100644 --- a/policyengine_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py +++ b/policyengine_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py @@ -1,4 +1,5 @@ from policyengine_us.model_api import * +from policyengine_us.tools.general import select_filing_status_value class or_federal_tax_liability_subtraction(Variable): @@ -27,20 +28,9 @@ def formula(tax_unit, period, parameters): .tax.income.subtractions.federal_tax_liability.cap ) federal_agi = tax_unit("adjusted_gross_income", period) - cap = select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.HEAD_OF_HOUSEHOLD, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - ], - [ - p.single.calc(federal_agi), - p.joint.calc(federal_agi), - p.head_of_household.calc(federal_agi), - p.separate.calc(federal_agi), - p.surviving_spouse.calc(federal_agi), - ], + cap = select_filing_status_value( + filing_status, + p, + federal_agi, ) return min_(or_federal_income_tax, cap) diff --git a/policyengine_us/variables/gov/states/state_filing_status_if_married_filing_separately_on_same_return.py b/policyengine_us/variables/gov/states/state_filing_status_if_married_filing_separately_on_same_return.py index f27b6f2a67f..2d0b3250a2c 100644 --- a/policyengine_us/variables/gov/states/state_filing_status_if_married_filing_separately_on_same_return.py +++ b/policyengine_us/variables/gov/states/state_filing_status_if_married_filing_separately_on_same_return.py @@ -39,4 +39,5 @@ def formula(tax_unit, period, parameters): StateFilingStatusIfMarriedFilingSeparatelyOnSameReturn.HEAD_OF_HOUSEHOLD, StateFilingStatusIfMarriedFilingSeparatelyOnSameReturn.SURVIVING_SPOUSE, ], + default=StateFilingStatusIfMarriedFilingSeparatelyOnSameReturn.SINGLE, ) diff --git a/policyengine_us/variables/gov/states/vt/tax/income/vt_normal_income_tax.py b/policyengine_us/variables/gov/states/vt/tax/income/vt_normal_income_tax.py index e42e4ac7a52..e20b68d8605 100644 --- a/policyengine_us/variables/gov/states/vt/tax/income/vt_normal_income_tax.py +++ b/policyengine_us/variables/gov/states/vt/tax/income/vt_normal_income_tax.py @@ -17,21 +17,9 @@ class vt_normal_income_tax(Variable): def formula(tax_unit, period, parameters): income = tax_unit("vt_taxable_income", period) filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values p = parameters(period).gov.states.vt.tax.income.rates - return select( - [ - filing_status == status.SINGLE, - filing_status == status.JOINT, - filing_status == status.SEPARATE, - filing_status == status.SURVIVING_SPOUSE, - filing_status == status.HEAD_OF_HOUSEHOLD, - ], - [ - p.single.calc(income), - p.joint.calc(income), - p.separate.calc(income), - p.surviving_spouse.calc(income), - p.head_of_household.calc(income), - ], + return select_filing_status_value( + filing_status, + p, + income, ) diff --git a/policyengine_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py b/policyengine_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py index 097b9075c6a..31a5d1521f4 100644 --- a/policyengine_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py +++ b/policyengine_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py @@ -20,19 +20,14 @@ def formula(tax_unit, period, parameters): taxinc = tax_unit("wi_taxable_income", period) fstatus = tax_unit("filing_status", period) p = parameters(period).gov.states.wi.tax.income - return select( - [ - fstatus == fstatus.possible_values.SINGLE, - fstatus == fstatus.possible_values.JOINT, - fstatus == fstatus.possible_values.SURVIVING_SPOUSE, - fstatus == fstatus.possible_values.SEPARATE, - fstatus == fstatus.possible_values.HEAD_OF_HOUSEHOLD, - ], - [ - p.rates.single.calc(taxinc), - p.rates.joint.calc(taxinc), - p.rates.joint.calc(taxinc), - p.rates.separate.calc(taxinc), - p.rates.head_of_household.calc(taxinc), - ], - ) + + # Note: Wisconsin uses joint rates for surviving spouse + rates_dict = { + "single": p.rates.single, + "joint": p.rates.joint, + "surviving_spouse": p.rates.joint, # Uses joint rates + "separate": p.rates.separate, + "head_of_household": p.rates.head_of_household, + } + + return select_filing_status_value(fstatus, rates_dict, taxinc) diff --git a/policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py b/policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py index b816f6ab6f1..2edaa647898 100644 --- a/policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py +++ b/policyengine_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py @@ -36,5 +36,6 @@ def formula(tax_unit, period, parameters): deduction.standard.phase_out.separate.calc(agi), deduction.standard.phase_out.head_of_household.calc(agi), ], + default=0, ) return max_(0, max_amount - phase_out_amount) diff --git a/policyengine_us/variables/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit.py b/policyengine_us/variables/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit.py index ada97201fbf..e057f797e54 100644 --- a/policyengine_us/variables/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit.py +++ b/policyengine_us/variables/gov/states/wv/tax/income/credits/liftc/wv_low_income_family_tax_credit.py @@ -23,21 +23,10 @@ def formula(tax_unit, period, parameters): # condition: wv_agi < = fpg_amount reduced_agi = wv_agi - fpg_amount - credit_percentage = select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.SEPARATE, - filing_status == filing_statuses.JOINT, - filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, - filing_status == filing_statuses.SURVIVING_SPOUSE, - ], - [ - p.amount.single.calc(reduced_agi), - p.amount.separate.calc(reduced_agi), - p.amount.joint.calc(reduced_agi), - p.amount.head_of_household.calc(reduced_agi), - p.amount.surviving_spouse.calc(reduced_agi), - ], + credit_percentage = select_filing_status_value( + filing_status, + p.amount, + reduced_agi, ) tax_before_credits = tax_unit( diff --git a/policyengine_us/variables/gov/states/wv/tax/income/wv_income_tax_before_non_refundable_credits.py b/policyengine_us/variables/gov/states/wv/tax/income/wv_income_tax_before_non_refundable_credits.py index 7dc405388fd..1ef65b21e5d 100644 --- a/policyengine_us/variables/gov/states/wv/tax/income/wv_income_tax_before_non_refundable_credits.py +++ b/policyengine_us/variables/gov/states/wv/tax/income/wv_income_tax_before_non_refundable_credits.py @@ -15,19 +15,15 @@ def formula(tax_unit, period, parameters): taxable_income = tax_unit("wv_taxable_income", period) # Calculate for each of the filing statuses and return the appropriate one. p = parameters(period).gov.states.wv.tax.income.rates - return select( - [ - filing_status == filing_statuses.SINGLE, - filing_status == filing_statuses.SEPARATE, - filing_status == filing_statuses.JOINT, - filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, - filing_status == filing_statuses.SURVIVING_SPOUSE, - ], - [ - p.single.calc(taxable_income), - p.separate.calc(taxable_income), - p.joint.calc(taxable_income), - p.head.calc(taxable_income), - p.surviving_spouse.calc(taxable_income), - ], + filing_status_dict = { + "single": p.single, + "separate": p.separate, + "joint": p.joint, + "head_of_household": p.head, + "surviving_spouse": p.surviving_spouse, + } + return select_filing_status_value( + filing_status, + filing_status_dict, + taxable_income, ) diff --git a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py index 28bdd61c7b2..c7eee86ff79 100644 --- a/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py +++ b/policyengine_us/variables/gov/territories/pr/tax/income/credits/earned_income/pr_earned_income_credit.py @@ -40,6 +40,7 @@ def formula(tax_unit, period, parameters): p.phase_out.threshold.single.calc(child_count), p.phase_out.threshold.joint.calc(child_count), ], + default=p.phase_out.threshold.single.calc(child_count), ) # could be negative if gross income not over threshold, so make the minimum value 0 phase_out = max_( diff --git a/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py b/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py index a68a7aa3c9f..6b195aa3821 100644 --- a/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py +++ b/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py @@ -27,7 +27,7 @@ def formula(spm_unit, period, parameters): [ (fpg_ratio <= p_income_limit.FREE) | categorical_eligibility, fpg_ratio <= p_income_limit.REDUCED, - True, ], - [SchoolMealTier.FREE, SchoolMealTier.REDUCED, SchoolMealTier.PAID], + [SchoolMealTier.FREE, SchoolMealTier.REDUCED], + default=SchoolMealTier.PAID, ) diff --git a/policyengine_us/variables/gov/usda/wic/wic_category.py b/policyengine_us/variables/gov/usda/wic/wic_category.py index 2c0b9b57067..0953e4ee38d 100644 --- a/policyengine_us/variables/gov/usda/wic/wic_category.py +++ b/policyengine_us/variables/gov/usda/wic/wic_category.py @@ -28,15 +28,19 @@ def formula(person, period, parameters): # Categorize mothers based on the minimum age of children in the SPM unit. min_age_family = person.family.min(age) return select( - *zip( - (pregnant, WICCategory.PREGNANT), - ( - mother & breastfeeding & (min_age_family < 1), - WICCategory.BREASTFEEDING, - ), - (mother & (min_age_family < 0.5), WICCategory.POSTPARTUM), - (age < 1, WICCategory.INFANT), - (age < 5, WICCategory.CHILD), - (True, WICCategory.NONE), - ) + [ + pregnant, + mother & breastfeeding & (min_age_family < 1), + mother & (min_age_family < 0.5), + age < 1, + age < 5, + ], + [ + WICCategory.PREGNANT, + WICCategory.BREASTFEEDING, + WICCategory.POSTPARTUM, + WICCategory.INFANT, + WICCategory.CHILD, + ], + default=WICCategory.NONE, ) diff --git a/policyengine_us/variables/household/demographic/age/age_group.py b/policyengine_us/variables/household/demographic/age/age_group.py index 53e9215bf84..2f462894015 100644 --- a/policyengine_us/variables/household/demographic/age/age_group.py +++ b/policyengine_us/variables/household/demographic/age/age_group.py @@ -23,4 +23,5 @@ def formula(person, period, parameters): person("is_senior", period), ], [AgeGroup.CHILD, AgeGroup.WORKING_AGE, AgeGroup.SENIOR], + default=AgeGroup.WORKING_AGE, ) diff --git a/policyengine_us/variables/household/demographic/person/postpartum/count_days_postpartum.py b/policyengine_us/variables/household/demographic/person/postpartum/count_days_postpartum.py index 971ff0a1e2a..8a540231c25 100644 --- a/policyengine_us/variables/household/demographic/person/postpartum/count_days_postpartum.py +++ b/policyengine_us/variables/household/demographic/person/postpartum/count_days_postpartum.py @@ -15,11 +15,10 @@ def formula(person, period, parameters): [ under_60_days, under_12_months, - True, ], [ 0, 60, - np.inf, ], + default=np.inf, ) diff --git a/policyengine_us/variables/household/demographic/person/race.py b/policyengine_us/variables/household/demographic/person/race.py index 99eee912ac9..5dbdfb48a45 100644 --- a/policyengine_us/variables/household/demographic/person/race.py +++ b/policyengine_us/variables/household/demographic/person/race.py @@ -25,12 +25,11 @@ def formula(person, period, parameters): hispanic, (cps_race == 1) & ~hispanic, (cps_race == 2) & ~hispanic, - True, ], [ Race.HISPANIC, Race.WHITE, Race.BLACK, - Race.OTHER, ], + default=Race.OTHER, ) diff --git a/policyengine_us/variables/household/income/person/fsla_overtime_occupation_exemption_category.py b/policyengine_us/variables/household/income/person/fsla_overtime_occupation_exemption_category.py index 47b79f8a58e..51163fddce6 100644 --- a/policyengine_us/variables/household/income/person/fsla_overtime_occupation_exemption_category.py +++ b/policyengine_us/variables/household/income/person/fsla_overtime_occupation_exemption_category.py @@ -28,7 +28,6 @@ def formula(person, period, parameters): person("is_executive_administrative_professional", period), person("is_farmer_fisher", period), person("is_computer_scientist", period), - True, # Default case ], [ OvertimeExemptionCategory.MILITARY, @@ -36,6 +35,6 @@ def formula(person, period, parameters): OvertimeExemptionCategory.EXECUTIVE_ADMINISTRATIVE, OvertimeExemptionCategory.FARMER_FISHER, OvertimeExemptionCategory.COMPUTER_SCIENTIST, - OvertimeExemptionCategory.NONE, ], + default=OvertimeExemptionCategory.NONE, )