From 20b4c8394b13554d88ea455943d4638eb5bd468b Mon Sep 17 00:00:00 2001 From: Daphne Hansell <128793799+daphnehanse11@users.noreply.github.com> Date: Wed, 20 May 2026 12:43:04 -0400 Subject: [PATCH 1/2] Add primary residence value input --- changelog.d/added/8351.md | 1 + .../gov/local/tax/assessment_rate.yaml | 126 ++++++++++++++++++ .../local/tax/assessed_property_value.yaml | 26 ++++ .../gov/local/tax/assessed_property_value.py | 6 +- .../assets/primary_residence_value.py | 17 +++ 5 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 changelog.d/added/8351.md create mode 100644 policyengine_us/parameters/gov/local/tax/assessment_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml create mode 100644 policyengine_us/variables/household/assets/primary_residence_value.py diff --git a/changelog.d/added/8351.md b/changelog.d/added/8351.md new file mode 100644 index 00000000000..a033ffcd941 --- /dev/null +++ b/changelog.d/added/8351.md @@ -0,0 +1 @@ +Add primary residence value and derive assessed property value from state assessment rates. diff --git a/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml b/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml new file mode 100644 index 00000000000..ab944c4276d --- /dev/null +++ b/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml @@ -0,0 +1,126 @@ +description: Assessed property value equals primary residence market value multiplied by this state-level ratio. +metadata: + unit: /1 + period: year + label: Assessed-to-market property value ratio + breakdown: + - state_code +# Default to 1 until state-specific assessed-to-market value ratios are modeled. +AL: + 0000-01-01: 1 +AK: + 0000-01-01: 1 +AZ: + 0000-01-01: 1 +AR: + 0000-01-01: 1 +CA: + 0000-01-01: 1 +CO: + 0000-01-01: 1 +CT: + 0000-01-01: 1 +DE: + 0000-01-01: 1 +FL: + 0000-01-01: 1 +GA: + 0000-01-01: 1 +HI: + 0000-01-01: 1 +ID: + 0000-01-01: 1 +IL: + 0000-01-01: 1 +IN: + 0000-01-01: 1 +IA: + 0000-01-01: 1 +KS: + 0000-01-01: 1 +KY: + 0000-01-01: 1 +LA: + 0000-01-01: 1 +ME: + 0000-01-01: 1 +MD: + 0000-01-01: 1 +MA: + 0000-01-01: 1 +MI: + 0000-01-01: 1 +MN: + 0000-01-01: 1 +MS: + 0000-01-01: 1 +MO: + 0000-01-01: 1 +MT: + 0000-01-01: 1 +NE: + 0000-01-01: 1 +NV: + 0000-01-01: 1 +NH: + 0000-01-01: 1 +NJ: + 0000-01-01: 1 +NM: + 0000-01-01: 1 +NY: + 0000-01-01: 1 +NC: + 0000-01-01: 1 +ND: + 0000-01-01: 1 +OH: + 0000-01-01: 1 +OK: + 0000-01-01: 1 +OR: + 0000-01-01: 1 +PA: + 0000-01-01: 1 +RI: + 0000-01-01: 1 +SC: + 0000-01-01: 1 +SD: + 0000-01-01: 1 +TN: + 0000-01-01: 1 +TX: + 0000-01-01: 1 +UT: + 0000-01-01: 1 +VT: + 0000-01-01: 1 +VA: + 0000-01-01: 1 +WA: + 0000-01-01: 1 +WV: + 0000-01-01: 1 +WI: + 0000-01-01: 1 +WY: + 0000-01-01: 1 +DC: + 0000-01-01: 1 +GU: + 0000-01-01: 1 +MP: + 0000-01-01: 1 +PW: + 0000-01-01: 1 +PR: + 0000-01-01: 1 +VI: + 0000-01-01: 1 +AA: + 0000-01-01: 1 +AE: + 0000-01-01: 1 +AP: + 0000-01-01: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml b/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml new file mode 100644 index 00000000000..87856c21e03 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml @@ -0,0 +1,26 @@ +- name: Assessed property value defaults to primary residence value + period: 2025 + input: + primary_residence_value: 400_000 + state_code: WA + output: + assessed_property_value: 400_000 + +- name: Assessed property value applies the state assessment rate + period: 2025 + input: + primary_residence_value: 400_000 + state_code: MI + gov.local.tax.assessment_rate.MI: 0.5 + output: + assessed_property_value: 200_000 + +- name: Existing direct assessed property value input is still accepted + period: 2025 + input: + assessed_property_value: 300_000 + primary_residence_value: 400_000 + state_code: MI + gov.local.tax.assessment_rate.MI: 0.5 + output: + assessed_property_value: 300_000 diff --git a/policyengine_us/variables/gov/local/tax/assessed_property_value.py b/policyengine_us/variables/gov/local/tax/assessed_property_value.py index 46842490ae3..a26666782da 100644 --- a/policyengine_us/variables/gov/local/tax/assessed_property_value.py +++ b/policyengine_us/variables/gov/local/tax/assessed_property_value.py @@ -7,5 +7,9 @@ class assessed_property_value(Variable): label = "Assessed property value" unit = USD quantity_type = STOCK - documentation = "Total assessed value of property owned by this person." definition_period = YEAR + + def formula(person, period, parameters): + state_code = person.household("state_code_str", period) + assessment_rate = parameters(period).gov.local.tax.assessment_rate[state_code] + return person("primary_residence_value", period) * assessment_rate diff --git a/policyengine_us/variables/household/assets/primary_residence_value.py b/policyengine_us/variables/household/assets/primary_residence_value.py new file mode 100644 index 00000000000..ee73fb8d65e --- /dev/null +++ b/policyengine_us/variables/household/assets/primary_residence_value.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class primary_residence_value(Variable): + value_type = float + entity = Person + label = "Primary residence value" + documentation = ( + "Market value of the person's primary residence, not assessed value." + ) + unit = USD + quantity_type = STOCK + definition_period = YEAR + uprating = "gov.bls.cpi.cpi_u" + reference = ( + "https://www.census.gov/programs-surveys/acs/microdata/documentation.html" + ) From 4b853b33c550c101650b33940bbf24019808d7bf Mon Sep 17 00:00:00 2001 From: Daphne Hansell <128793799+daphnehanse11@users.noreply.github.com> Date: Wed, 20 May 2026 14:15:09 -0400 Subject: [PATCH 2/2] Refine primary residence assessment rates --- .../parameters/gov/local/tax/assessment_rate.yaml | 9 +++++++-- .../baseline/gov/local/tax/assessed_property_value.yaml | 8 +++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml b/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml index ab944c4276d..7181e39929e 100644 --- a/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml +++ b/policyengine_us/parameters/gov/local/tax/assessment_rate.yaml @@ -5,6 +5,11 @@ metadata: label: Assessed-to-market property value ratio breakdown: - state_code + reference: + - title: Michigan Compiled Laws Section 211.27a(1) + href: https://legislature.mi.gov/Laws/MCL?objectName=mcl-211-27a + - title: West Virginia State Tax Department, Ad Valorem Property Tax + href: https://tax.wv.gov/Business/PropertyTax/Pages/AdValoremPropertyTax.aspx # Default to 1 until state-specific assessed-to-market value ratios are modeled. AL: 0000-01-01: 1 @@ -49,7 +54,7 @@ MD: MA: 0000-01-01: 1 MI: - 0000-01-01: 1 + 0000-01-01: 0.5 MN: 0000-01-01: 1 MS: @@ -101,7 +106,7 @@ VA: WA: 0000-01-01: 1 WV: - 0000-01-01: 1 + 0000-01-01: 0.6 WI: 0000-01-01: 1 WY: diff --git a/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml b/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml index 87856c21e03..6cc4dc39a75 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/tax/assessed_property_value.yaml @@ -1,4 +1,4 @@ -- name: Assessed property value defaults to primary residence value +- name: Case 1, assessed property value defaults to primary residence value. period: 2025 input: primary_residence_value: 400_000 @@ -6,21 +6,19 @@ output: assessed_property_value: 400_000 -- name: Assessed property value applies the state assessment rate +- name: Case 2, assessed property value applies the state assessment rate. period: 2025 input: primary_residence_value: 400_000 state_code: MI - gov.local.tax.assessment_rate.MI: 0.5 output: assessed_property_value: 200_000 -- name: Existing direct assessed property value input is still accepted +- name: Case 3, existing direct assessed property value input is still accepted. period: 2025 input: assessed_property_value: 300_000 primary_residence_value: 400_000 state_code: MI - gov.local.tax.assessment_rate.MI: 0.5 output: assessed_property_value: 300_000