diff --git a/obbba_district_impacts/Congressional-Hackathon-2025 b/obbba_district_impacts/Congressional-Hackathon-2025
new file mode 160000
index 0000000..3f6d05e
--- /dev/null
+++ b/obbba_district_impacts/Congressional-Hackathon-2025
@@ -0,0 +1 @@
+Subproject commit 3f6d05e76400c6e396a3a4eddd34a7b3f6919fc3
diff --git a/obbba_district_impacts/HexCDv31/HexCDv31.shp b/obbba_district_impacts/HexCDv31/HexCDv31.shp
new file mode 100644
index 0000000..dadef36
Binary files /dev/null and b/obbba_district_impacts/HexCDv31/HexCDv31.shp differ
diff --git a/obbba_district_impacts/ny_congressional_district_impacts.csv b/obbba_district_impacts/ny_congressional_district_impacts.csv
new file mode 100644
index 0000000..be17b97
--- /dev/null
+++ b/obbba_district_impacts/ny_congressional_district_impacts.csv
@@ -0,0 +1,27 @@
+congressional_district_geoid,sample_size,avg_baseline_income,avg_reformed_income,avg_income_change,total_income_change
+3601,1617.0,143845.171875,148153.40625,4308.232421875,6966412.0
+3602,1419.0,110839.6484375,113832.421875,2992.780029296875,4246755.0
+3603,1690.0,164515.90625,169924.96875,5409.06689453125,9141323.0
+3604,1496.0,126062.1640625,129620.109375,3557.951416015625,5322695.5
+3605,892.0,83690.3203125,85331.4296875,1641.10009765625,1463861.25
+3606,887.0,86829.453125,88802.6484375,1973.1939697265625,1750223.0
+3607,1186.0,127848.3203125,132043.09375,4194.7724609375,4975000.0
+3608,1067.0,100501.953125,103051.6953125,2549.745361328125,2720578.25
+3609,1264.0,138191.859375,142586.171875,4394.2998046875,5554395.0
+3610,1387.0,175475.984375,181719.875,6243.89599609375,8660284.0
+3611,1398.0,131290.796875,135457.265625,4166.443359375,5824687.5
+3612,1440.0,242408.21875,251282.484375,8874.2734375,12778954.0
+3613,869.0,88758.703125,90908.8203125,2150.123046875,1868456.875
+3614,1016.0,99821.90625,102682.8828125,2860.984130859375,2906760.0
+3615,874.0,99412.234375,101974.484375,2562.251953125,2239408.25
+3616,1602.0,155516.40625,160661.171875,5144.767578125,8241918.0
+3617,1470.0,138431.265625,142728.34375,4297.0703125,6316693.5
+3618,1438.0,113723.2578125,116897.4453125,3174.19189453125,4564488.0
+3619,1060.0,93198.765625,95462.4609375,2263.7001953125,2399522.25
+3620,1302.0,110184.2109375,113267.390625,3083.19189453125,4014315.75
+3621,1012.0,86811.2109375,88742.90625,1931.7066650390625,1954887.125
+3622,1048.0,88847.5390625,90992.5234375,2144.984619140625,2247944.0
+3623,1004.0,88731.453125,90741.1328125,2009.684814453125,2017723.5
+3624,1013.0,91033.5625,93158.6015625,2125.0400390625,2152665.5
+3625,1138.0,95898.09375,98287.6875,2389.596435546875,2719360.75
+3626,1040.0,86841.6640625,88932.6328125,2090.965576171875,2174604.25
diff --git a/obbba_district_impacts/ny_congressional_district_impacts.ipynb b/obbba_district_impacts/ny_congressional_district_impacts.ipynb
new file mode 100644
index 0000000..5eeb45f
--- /dev/null
+++ b/obbba_district_impacts/ny_congressional_district_impacts.ipynb
@@ -0,0 +1,1910 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from policyengine_us import Microsimulation\n",
+ "from policyengine_core.reforms import Reform"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "fqndbt28fta",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "reform = Reform.from_dict({\n",
+ " \"gov.irs.credits.estate.base\": {\n",
+ " \"2026-01-01.2026-12-31\": 6790000,\n",
+ " \"2027-01-01.2027-12-31\": 6960000,\n",
+ " \"2028-01-01.2028-12-31\": 7100000,\n",
+ " \"2029-01-01.2029-12-31\": 7240000,\n",
+ " \"2030-01-01.2030-12-31\": 7390000,\n",
+ " \"2031-01-01.2031-12-31\": 7530000,\n",
+ " \"2032-01-01.2032-12-31\": 7680000,\n",
+ " \"2033-01-01.2033-12-31\": 7830000,\n",
+ " \"2034-01-01.2034-12-31\": 7990000,\n",
+ " \"2035-01-01.2100-12-31\": 8150000\n",
+ " },\n",
+ " \"gov.irs.income.bracket.rates.2\": {\n",
+ " \"2025-01-01.2100-12-31\": 0.15\n",
+ " },\n",
+ " \"gov.irs.income.bracket.rates.3\": {\n",
+ " \"2025-01-01.2100-12-31\": 0.25\n",
+ " },\n",
+ " \"gov.irs.income.bracket.rates.4\": {\n",
+ " \"2025-01-01.2100-12-31\": 0.28\n",
+ " },\n",
+ " \"gov.irs.income.bracket.rates.5\": {\n",
+ " \"2025-01-01.2100-12-31\": 0.33\n",
+ " },\n",
+ " \"gov.irs.income.bracket.rates.7\": {\n",
+ " \"2025-01-01.2100-12-31\": 0.396\n",
+ " },\n",
+ " \"gov.irs.deductions.qbi.max.rate\": {\n",
+ " \"2026-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.income.exemption.amount\": {\n",
+ " \"2026-01-01.2026-12-31\": 5300,\n",
+ " \"2027-01-01.2027-12-31\": 5400,\n",
+ " \"2028-01-01.2028-12-31\": 5500,\n",
+ " \"2029-01-01.2029-12-31\": 5650,\n",
+ " \"2030-01-01.2030-12-31\": 5750,\n",
+ " \"2031-01-01.2031-12-31\": 5850,\n",
+ " \"2032-01-01.2032-12-31\": 5950,\n",
+ " \"2033-01-01.2033-12-31\": 6100,\n",
+ " \"2034-01-01.2034-12-31\": 6200,\n",
+ " \"2035-01-01.2100-12-31\": 6350\n",
+ " },\n",
+ " \"gov.irs.deductions.tip_income.cap\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.credits.cdcc.phase_out.max\": {\n",
+ " \"2026-01-01.2100-12-31\": 0.35\n",
+ " },\n",
+ " \"gov.irs.credits.cdcc.phase_out.min\": {\n",
+ " \"2026-01-01.2100-12-31\": 0.2\n",
+ " },\n",
+ " \"gov.irs.deductions.qbi.max.w2_wages.rate\": {\n",
+ " \"2026-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.deductions.standard.amount.JOINT\": {\n",
+ " \"2025-01-01.2025-12-31\": 30000,\n",
+ " \"2026-01-01.2026-12-31\": 16600,\n",
+ " \"2027-01-01.2027-12-31\": 16900,\n",
+ " \"2028-01-01.2028-12-31\": 17300,\n",
+ " \"2029-01-01.2029-12-31\": 17600,\n",
+ " \"2030-01-01.2030-12-31\": 18000,\n",
+ " \"2031-01-01.2031-12-31\": 18300,\n",
+ " \"2032-01-01.2032-12-31\": 18700,\n",
+ " \"2033-01-01.2033-12-31\": 19000,\n",
+ " \"2034-01-01.2034-12-31\": 19400,\n",
+ " \"2035-01-01.2100-12-31\": 19800\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.amount.base[0].amount\": {\n",
+ " \"2025-01-01.2025-12-31\": 2000,\n",
+ " \"2026-01-01.2100-12-31\": 1000\n",
+ " },\n",
+ " \"gov.irs.deductions.auto_loan_interest.cap\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.deductions.standard.amount.SINGLE\": {\n",
+ " \"2025-01-01.2025-12-31\": 15000,\n",
+ " \"2026-01-01.2026-12-31\": 8300,\n",
+ " \"2027-01-01.2027-12-31\": 8450,\n",
+ " \"2028-01-01.2028-12-31\": 8650,\n",
+ " \"2029-01-01.2029-12-31\": 8800,\n",
+ " \"2030-01-01.2030-12-31\": 9000,\n",
+ " \"2031-01-01.2031-12-31\": 9150,\n",
+ " \"2032-01-01.2032-12-31\": 9350,\n",
+ " \"2033-01-01.2033-12-31\": 9500,\n",
+ " \"2034-01-01.2034-12-31\": 9700,\n",
+ " \"2035-01-01.2100-12-31\": 9900\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.amount.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 109800,\n",
+ " \"2027-01-01.2027-12-31\": 112100,\n",
+ " \"2028-01-01.2028-12-31\": 114400,\n",
+ " \"2029-01-01.2029-12-31\": 116700,\n",
+ " \"2030-01-01.2030-12-31\": 119000,\n",
+ " \"2031-01-01.2031-12-31\": 121300,\n",
+ " \"2032-01-01.2032-12-31\": 123700,\n",
+ " \"2033-01-01.2033-12-31\": 126200,\n",
+ " \"2034-01-01.2034-12-31\": 128700,\n",
+ " \"2035-01-01.2100-12-31\": 131200\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.1.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 24300,\n",
+ " \"2027-01-01.2027-12-31\": 24800,\n",
+ " \"2028-01-01.2028-12-31\": 25300,\n",
+ " \"2029-01-01.2029-12-31\": 25800,\n",
+ " \"2030-01-01.2030-12-31\": 26300,\n",
+ " \"2031-01-01.2031-12-31\": 26850,\n",
+ " \"2032-01-01.2032-12-31\": 27350,\n",
+ " \"2033-01-01.2033-12-31\": 27900,\n",
+ " \"2034-01-01.2034-12-31\": 28450,\n",
+ " \"2035-01-01.2100-12-31\": 29000\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.2.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 98600,\n",
+ " \"2027-01-01.2027-12-31\": 100700,\n",
+ " \"2028-01-01.2028-12-31\": 102800,\n",
+ " \"2029-01-01.2029-12-31\": 104800,\n",
+ " \"2030-01-01.2030-12-31\": 106900,\n",
+ " \"2031-01-01.2031-12-31\": 109000,\n",
+ " \"2032-01-01.2032-12-31\": 111100,\n",
+ " \"2033-01-01.2033-12-31\": 113300,\n",
+ " \"2034-01-01.2034-12-31\": 115600,\n",
+ " \"2035-01-01.2100-12-31\": 117900\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.3.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 199000,\n",
+ " \"2027-01-01.2027-12-31\": 203250,\n",
+ " \"2028-01-01.2028-12-31\": 207350,\n",
+ " \"2029-01-01.2029-12-31\": 211450,\n",
+ " \"2030-01-01.2030-12-31\": 215600,\n",
+ " \"2031-01-01.2031-12-31\": 219900,\n",
+ " \"2032-01-01.2032-12-31\": 224250,\n",
+ " \"2033-01-01.2033-12-31\": 228700,\n",
+ " \"2034-01-01.2034-12-31\": 233200,\n",
+ " \"2035-01-01.2100-12-31\": 237850\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.4.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 303250,\n",
+ " \"2027-01-01.2027-12-31\": 309700,\n",
+ " \"2028-01-01.2028-12-31\": 315950,\n",
+ " \"2029-01-01.2029-12-31\": 322200,\n",
+ " \"2030-01-01.2030-12-31\": 328550,\n",
+ " \"2031-01-01.2031-12-31\": 335050,\n",
+ " \"2032-01-01.2032-12-31\": 341700,\n",
+ " \"2033-01-01.2033-12-31\": 348450,\n",
+ " \"2034-01-01.2034-12-31\": 355400,\n",
+ " \"2035-01-01.2100-12-31\": 362450\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.5.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 541550,\n",
+ " \"2027-01-01.2027-12-31\": 553050,\n",
+ " \"2028-01-01.2028-12-31\": 564200,\n",
+ " \"2029-01-01.2029-12-31\": 575400,\n",
+ " \"2030-01-01.2030-12-31\": 586750,\n",
+ " \"2031-01-01.2031-12-31\": 598350,\n",
+ " \"2032-01-01.2032-12-31\": 610200,\n",
+ " \"2033-01-01.2033-12-31\": 622300,\n",
+ " \"2034-01-01.2034-12-31\": 634650,\n",
+ " \"2035-01-01.2100-12-31\": 647250\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.6.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 611750,\n",
+ " \"2027-01-01.2027-12-31\": 624700,\n",
+ " \"2028-01-01.2028-12-31\": 637350,\n",
+ " \"2029-01-01.2029-12-31\": 649950,\n",
+ " \"2030-01-01.2030-12-31\": 662800,\n",
+ " \"2031-01-01.2031-12-31\": 675900,\n",
+ " \"2032-01-01.2032-12-31\": 689250,\n",
+ " \"2033-01-01.2033-12-31\": 702950,\n",
+ " \"2034-01-01.2034-12-31\": 716900,\n",
+ " \"2035-01-01.2100-12-31\": 731150\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.amount.adult_dependent\": {\n",
+ " \"2026-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.deductions.senior_deduction.amount\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.amount.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 70600,\n",
+ " \"2027-01-01.2027-12-31\": 72100,\n",
+ " \"2028-01-01.2028-12-31\": 73500,\n",
+ " \"2029-01-01.2029-12-31\": 75000,\n",
+ " \"2030-01-01.2030-12-31\": 76400,\n",
+ " \"2031-01-01.2031-12-31\": 78000,\n",
+ " \"2032-01-01.2032-12-31\": 79500,\n",
+ " \"2033-01-01.2033-12-31\": 81100,\n",
+ " \"2034-01-01.2034-12-31\": 82700,\n",
+ " \"2035-01-01.2100-12-31\": 84300\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.1.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 12150,\n",
+ " \"2027-01-01.2027-12-31\": 12400,\n",
+ " \"2028-01-01.2028-12-31\": 12650,\n",
+ " \"2029-01-01.2029-12-31\": 12900,\n",
+ " \"2030-01-01.2030-12-31\": 13150,\n",
+ " \"2031-01-01.2031-12-31\": 13425,\n",
+ " \"2032-01-01.2032-12-31\": 13675,\n",
+ " \"2033-01-01.2033-12-31\": 13950,\n",
+ " \"2034-01-01.2034-12-31\": 14225,\n",
+ " \"2035-01-01.2100-12-31\": 14500\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.2.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 49300,\n",
+ " \"2027-01-01.2027-12-31\": 50350,\n",
+ " \"2028-01-01.2028-12-31\": 51400,\n",
+ " \"2029-01-01.2029-12-31\": 52400,\n",
+ " \"2030-01-01.2030-12-31\": 53450,\n",
+ " \"2031-01-01.2031-12-31\": 54500,\n",
+ " \"2032-01-01.2032-12-31\": 55550,\n",
+ " \"2033-01-01.2033-12-31\": 56650,\n",
+ " \"2034-01-01.2034-12-31\": 57800,\n",
+ " \"2035-01-01.2100-12-31\": 58950\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.3.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 119400,\n",
+ " \"2027-01-01.2027-12-31\": 121950,\n",
+ " \"2028-01-01.2028-12-31\": 124400,\n",
+ " \"2029-01-01.2029-12-31\": 126900,\n",
+ " \"2030-01-01.2030-12-31\": 129400,\n",
+ " \"2031-01-01.2031-12-31\": 131950,\n",
+ " \"2032-01-01.2032-12-31\": 134550,\n",
+ " \"2033-01-01.2033-12-31\": 137200,\n",
+ " \"2034-01-01.2034-12-31\": 139950,\n",
+ " \"2035-01-01.2100-12-31\": 142750\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.4.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 249100,\n",
+ " \"2027-01-01.2027-12-31\": 254400,\n",
+ " \"2028-01-01.2028-12-31\": 259550,\n",
+ " \"2029-01-01.2029-12-31\": 264650,\n",
+ " \"2030-01-01.2030-12-31\": 269900,\n",
+ " \"2031-01-01.2031-12-31\": 275250,\n",
+ " \"2032-01-01.2032-12-31\": 280700,\n",
+ " \"2033-01-01.2033-12-31\": 286250,\n",
+ " \"2034-01-01.2034-12-31\": 291900,\n",
+ " \"2035-01-01.2100-12-31\": 297750\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.5.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 541550,\n",
+ " \"2027-01-01.2027-12-31\": 553050,\n",
+ " \"2028-01-01.2028-12-31\": 564200,\n",
+ " \"2029-01-01.2029-12-31\": 575400,\n",
+ " \"2030-01-01.2030-12-31\": 586750,\n",
+ " \"2031-01-01.2031-12-31\": 598350,\n",
+ " \"2032-01-01.2032-12-31\": 610200,\n",
+ " \"2033-01-01.2033-12-31\": 622300,\n",
+ " \"2034-01-01.2034-12-31\": 634650,\n",
+ " \"2035-01-01.2100-12-31\": 647250\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.6.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 543800,\n",
+ " \"2027-01-01.2027-12-31\": 555300,\n",
+ " \"2028-01-01.2028-12-31\": 566500,\n",
+ " \"2029-01-01.2029-12-31\": 577700,\n",
+ " \"2030-01-01.2030-12-31\": 589150,\n",
+ " \"2031-01-01.2031-12-31\": 600800,\n",
+ " \"2032-01-01.2032-12-31\": 612700,\n",
+ " \"2033-01-01.2033-12-31\": 624850,\n",
+ " \"2034-01-01.2034-12-31\": 637250,\n",
+ " \"2035-01-01.2100-12-31\": 649900\n",
+ " },\n",
+ " \"gov.irs.deductions.itemized.casualty.active\": {\n",
+ " \"2026-01-01.2100-12-31\": True\n",
+ " },\n",
+ " \"gov.irs.deductions.standard.amount.SEPARATE\": {\n",
+ " \"2025-01-01.2025-12-31\": 15000,\n",
+ " \"2026-01-01.2026-12-31\": 8300,\n",
+ " \"2027-01-01.2027-12-31\": 8450,\n",
+ " \"2028-01-01.2028-12-31\": 8650,\n",
+ " \"2029-01-01.2029-12-31\": 8800,\n",
+ " \"2030-01-01.2030-12-31\": 9000,\n",
+ " \"2031-01-01.2031-12-31\": 9150,\n",
+ " \"2032-01-01.2032-12-31\": 9350,\n",
+ " \"2033-01-01.2033-12-31\": 9500,\n",
+ " \"2034-01-01.2034-12-31\": 9700,\n",
+ " \"2035-01-01.2100-12-31\": 9900\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.phase_out.rate\": {\n",
+ " \"2026-01-01.2100-12-31\": 0.25\n",
+ " },\n",
+ " \"gov.irs.deductions.overtime_income.cap.JOINT\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.deductions.qbi.max.w2_wages.alt_rate\": {\n",
+ " \"2026-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.amount.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 54900,\n",
+ " \"2027-01-01.2027-12-31\": 56050,\n",
+ " \"2028-01-01.2028-12-31\": 57200,\n",
+ " \"2029-01-01.2029-12-31\": 58350,\n",
+ " \"2030-01-01.2030-12-31\": 59500,\n",
+ " \"2031-01-01.2031-12-31\": 60650,\n",
+ " \"2032-01-01.2032-12-31\": 61850,\n",
+ " \"2033-01-01.2033-12-31\": 63100,\n",
+ " \"2034-01-01.2034-12-31\": 64350,\n",
+ " \"2035-01-01.2100-12-31\": 65600\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.1.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 12150,\n",
+ " \"2027-01-01.2027-12-31\": 12400,\n",
+ " \"2028-01-01.2028-12-31\": 12650,\n",
+ " \"2029-01-01.2029-12-31\": 12900,\n",
+ " \"2030-01-01.2030-12-31\": 13150,\n",
+ " \"2031-01-01.2031-12-31\": 13425,\n",
+ " \"2032-01-01.2032-12-31\": 13675,\n",
+ " \"2033-01-01.2033-12-31\": 13950,\n",
+ " \"2034-01-01.2034-12-31\": 14225,\n",
+ " \"2035-01-01.2100-12-31\": 14500\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.2.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 49300,\n",
+ " \"2027-01-01.2027-12-31\": 50350,\n",
+ " \"2028-01-01.2028-12-31\": 51400,\n",
+ " \"2029-01-01.2029-12-31\": 52400,\n",
+ " \"2030-01-01.2030-12-31\": 53450,\n",
+ " \"2031-01-01.2031-12-31\": 54500,\n",
+ " \"2032-01-01.2032-12-31\": 55550,\n",
+ " \"2033-01-01.2033-12-31\": 56650,\n",
+ " \"2034-01-01.2034-12-31\": 57800,\n",
+ " \"2035-01-01.2100-12-31\": 58950\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.3.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 99500,\n",
+ " \"2027-01-01.2027-12-31\": 101625,\n",
+ " \"2028-01-01.2028-12-31\": 103675,\n",
+ " \"2029-01-01.2029-12-31\": 105725,\n",
+ " \"2030-01-01.2030-12-31\": 107800,\n",
+ " \"2031-01-01.2031-12-31\": 109950,\n",
+ " \"2032-01-01.2032-12-31\": 112125,\n",
+ " \"2033-01-01.2033-12-31\": 114350,\n",
+ " \"2034-01-01.2034-12-31\": 116600,\n",
+ " \"2035-01-01.2100-12-31\": 118925\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.4.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 151625,\n",
+ " \"2027-01-01.2027-12-31\": 154850,\n",
+ " \"2028-01-01.2028-12-31\": 157975,\n",
+ " \"2029-01-01.2029-12-31\": 161100,\n",
+ " \"2030-01-01.2030-12-31\": 164275,\n",
+ " \"2031-01-01.2031-12-31\": 167525,\n",
+ " \"2032-01-01.2032-12-31\": 170850,\n",
+ " \"2033-01-01.2033-12-31\": 174225,\n",
+ " \"2034-01-01.2034-12-31\": 177700,\n",
+ " \"2035-01-01.2100-12-31\": 181225\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.5.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 270775,\n",
+ " \"2027-01-01.2027-12-31\": 276525,\n",
+ " \"2028-01-01.2028-12-31\": 282100,\n",
+ " \"2029-01-01.2029-12-31\": 287700,\n",
+ " \"2030-01-01.2030-12-31\": 293375,\n",
+ " \"2031-01-01.2031-12-31\": 299175,\n",
+ " \"2032-01-01.2032-12-31\": 305100,\n",
+ " \"2033-01-01.2033-12-31\": 311150,\n",
+ " \"2034-01-01.2034-12-31\": 317325,\n",
+ " \"2035-01-01.2100-12-31\": 323625\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.6.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 305875,\n",
+ " \"2027-01-01.2027-12-31\": 312350,\n",
+ " \"2028-01-01.2028-12-31\": 318675,\n",
+ " \"2029-01-01.2029-12-31\": 324975,\n",
+ " \"2030-01-01.2030-12-31\": 331400,\n",
+ " \"2031-01-01.2031-12-31\": 337950,\n",
+ " \"2032-01-01.2032-12-31\": 344625,\n",
+ " \"2033-01-01.2033-12-31\": 351475,\n",
+ " \"2034-01-01.2034-12-31\": 358450,\n",
+ " \"2035-01-01.2100-12-31\": 365575\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.phase_out.threshold.JOINT\": {\n",
+ " \"2026-01-01.2100-12-31\": 110000\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.refundable.individual_max\": {\n",
+ " \"2025-01-01.2025-12-31\": 1800,\n",
+ " \"2026-01-01.2100-12-31\": 1000\n",
+ " },\n",
+ " \"gov.irs.deductions.overtime_income.cap.SINGLE\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.phase_out.threshold.SINGLE\": {\n",
+ " \"2026-01-01.2100-12-31\": 75000\n",
+ " },\n",
+ " \"gov.irs.deductions.itemized.charity.ceiling.all\": {\n",
+ " \"2026-01-01.2100-12-31\": 0.5\n",
+ " },\n",
+ " \"gov.irs.deductions.overtime_income.cap.SEPARATE\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.phase_out.threshold.SEPARATE\": {\n",
+ " \"2026-01-01.2100-12-31\": 55000\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.adult_ssn_requirement_applies\": {\n",
+ " \"2025-01-01.2100-12-31\": False\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.refundable.phase_in.threshold\": {\n",
+ " \"2026-01-01.2100-12-31\": 3000\n",
+ " },\n",
+ " \"gov.irs.deductions.itemized.charity.floor.applies\": {\n",
+ " \"2026-01-01.2100-12-31\": False\n",
+ " },\n",
+ " \"gov.irs.deductions.qbi.max.business_property.rate\": {\n",
+ " \"2026-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.phase_out.start.JOINT\": {\n",
+ " \"2026-01-01.2026-12-31\": 209200,\n",
+ " \"2027-01-01.2027-12-31\": 213600,\n",
+ " \"2028-01-01.2028-12-31\": 217900,\n",
+ " \"2029-01-01.2029-12-31\": 222200,\n",
+ " \"2030-01-01.2030-12-31\": 226600,\n",
+ " \"2031-01-01.2031-12-31\": 231100,\n",
+ " \"2032-01-01.2032-12-31\": 235700,\n",
+ " \"2033-01-01.2033-12-31\": 240300,\n",
+ " \"2034-01-01.2034-12-31\": 245100,\n",
+ " \"2035-01-01.2100-12-31\": 250000\n",
+ " },\n",
+ " \"gov.irs.deductions.standard.amount.SURVIVING_SPOUSE\": {\n",
+ " \"2025-01-01.2025-12-31\": 30000,\n",
+ " \"2026-01-01.2026-12-31\": 16600,\n",
+ " \"2027-01-01.2027-12-31\": 16900,\n",
+ " \"2028-01-01.2028-12-31\": 17300,\n",
+ " \"2029-01-01.2029-12-31\": 17600,\n",
+ " \"2030-01-01.2030-12-31\": 18000,\n",
+ " \"2031-01-01.2031-12-31\": 18300,\n",
+ " \"2032-01-01.2032-12-31\": 18700,\n",
+ " \"2033-01-01.2033-12-31\": 19000,\n",
+ " \"2034-01-01.2034-12-31\": 19400,\n",
+ " \"2035-01-01.2100-12-31\": 19800\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.phase_out.start.SINGLE\": {\n",
+ " \"2026-01-01.2026-12-31\": 156900,\n",
+ " \"2027-01-01.2027-12-31\": 160200,\n",
+ " \"2028-01-01.2028-12-31\": 163400,\n",
+ " \"2029-01-01.2029-12-31\": 166700,\n",
+ " \"2030-01-01.2030-12-31\": 170000,\n",
+ " \"2031-01-01.2031-12-31\": 173300,\n",
+ " \"2032-01-01.2032-12-31\": 176800,\n",
+ " \"2033-01-01.2033-12-31\": 180300,\n",
+ " \"2034-01-01.2034-12-31\": 183800,\n",
+ " \"2035-01-01.2100-12-31\": 187500\n",
+ " },\n",
+ " \"gov.irs.deductions.standard.amount.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2025-01-01.2025-12-31\": 22500,\n",
+ " \"2026-01-01.2026-12-31\": 12150,\n",
+ " \"2027-01-01.2027-12-31\": 12400,\n",
+ " \"2028-01-01.2028-12-31\": 12650,\n",
+ " \"2029-01-01.2029-12-31\": 12900,\n",
+ " \"2030-01-01.2030-12-31\": 13200,\n",
+ " \"2031-01-01.2031-12-31\": 13450,\n",
+ " \"2032-01-01.2032-12-31\": 13700,\n",
+ " \"2033-01-01.2033-12-31\": 14000,\n",
+ " \"2034-01-01.2034-12-31\": 14250,\n",
+ " \"2035-01-01.2100-12-31\": 14550\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.amount.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 109800,\n",
+ " \"2027-01-01.2027-12-31\": 112100,\n",
+ " \"2028-01-01.2028-12-31\": 114400,\n",
+ " \"2029-01-01.2029-12-31\": 116700,\n",
+ " \"2030-01-01.2030-12-31\": 119000,\n",
+ " \"2031-01-01.2031-12-31\": 121300,\n",
+ " \"2032-01-01.2032-12-31\": 123700,\n",
+ " \"2033-01-01.2033-12-31\": 126200,\n",
+ " \"2034-01-01.2034-12-31\": 128700,\n",
+ " \"2035-01-01.2100-12-31\": 131200\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.1.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 24300,\n",
+ " \"2027-01-01.2027-12-31\": 24800,\n",
+ " \"2028-01-01.2028-12-31\": 25300,\n",
+ " \"2029-01-01.2029-12-31\": 25800,\n",
+ " \"2030-01-01.2030-12-31\": 26300,\n",
+ " \"2031-01-01.2031-12-31\": 26850,\n",
+ " \"2032-01-01.2032-12-31\": 27350,\n",
+ " \"2033-01-01.2033-12-31\": 27900,\n",
+ " \"2034-01-01.2034-12-31\": 28450,\n",
+ " \"2035-01-01.2100-12-31\": 29000\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.2.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 98600,\n",
+ " \"2027-01-01.2027-12-31\": 100700,\n",
+ " \"2028-01-01.2028-12-31\": 102800,\n",
+ " \"2029-01-01.2029-12-31\": 104800,\n",
+ " \"2030-01-01.2030-12-31\": 106900,\n",
+ " \"2031-01-01.2031-12-31\": 109000,\n",
+ " \"2032-01-01.2032-12-31\": 111100,\n",
+ " \"2033-01-01.2033-12-31\": 113300,\n",
+ " \"2034-01-01.2034-12-31\": 115600,\n",
+ " \"2035-01-01.2100-12-31\": 117900\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.3.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 199000,\n",
+ " \"2027-01-01.2027-12-31\": 203250,\n",
+ " \"2028-01-01.2028-12-31\": 207350,\n",
+ " \"2029-01-01.2029-12-31\": 211450,\n",
+ " \"2030-01-01.2030-12-31\": 215600,\n",
+ " \"2031-01-01.2031-12-31\": 219900,\n",
+ " \"2032-01-01.2032-12-31\": 224250,\n",
+ " \"2033-01-01.2033-12-31\": 228700,\n",
+ " \"2034-01-01.2034-12-31\": 233200,\n",
+ " \"2035-01-01.2100-12-31\": 237850\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.4.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 303250,\n",
+ " \"2027-01-01.2027-12-31\": 309700,\n",
+ " \"2028-01-01.2028-12-31\": 315950,\n",
+ " \"2029-01-01.2029-12-31\": 322200,\n",
+ " \"2030-01-01.2030-12-31\": 328550,\n",
+ " \"2031-01-01.2031-12-31\": 335050,\n",
+ " \"2032-01-01.2032-12-31\": 341700,\n",
+ " \"2033-01-01.2033-12-31\": 348450,\n",
+ " \"2034-01-01.2034-12-31\": 355400,\n",
+ " \"2035-01-01.2100-12-31\": 362450\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.5.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 541550,\n",
+ " \"2027-01-01.2027-12-31\": 553050,\n",
+ " \"2028-01-01.2028-12-31\": 564200,\n",
+ " \"2029-01-01.2029-12-31\": 575400,\n",
+ " \"2030-01-01.2030-12-31\": 586750,\n",
+ " \"2031-01-01.2031-12-31\": 598350,\n",
+ " \"2032-01-01.2032-12-31\": 610200,\n",
+ " \"2033-01-01.2033-12-31\": 622300,\n",
+ " \"2034-01-01.2034-12-31\": 634650,\n",
+ " \"2035-01-01.2100-12-31\": 647250\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.6.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 611750,\n",
+ " \"2027-01-01.2027-12-31\": 624700,\n",
+ " \"2028-01-01.2028-12-31\": 637350,\n",
+ " \"2029-01-01.2029-12-31\": 649950,\n",
+ " \"2030-01-01.2030-12-31\": 662800,\n",
+ " \"2031-01-01.2031-12-31\": 675900,\n",
+ " \"2032-01-01.2032-12-31\": 689250,\n",
+ " \"2033-01-01.2033-12-31\": 702950,\n",
+ " \"2034-01-01.2034-12-31\": 716900,\n",
+ " \"2035-01-01.2100-12-31\": 731150\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.amount.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 70600,\n",
+ " \"2027-01-01.2027-12-31\": 72100,\n",
+ " \"2028-01-01.2028-12-31\": 73500,\n",
+ " \"2029-01-01.2029-12-31\": 75000,\n",
+ " \"2030-01-01.2030-12-31\": 76400,\n",
+ " \"2031-01-01.2031-12-31\": 78000,\n",
+ " \"2032-01-01.2032-12-31\": 79500,\n",
+ " \"2033-01-01.2033-12-31\": 81100,\n",
+ " \"2034-01-01.2034-12-31\": 82700,\n",
+ " \"2035-01-01.2100-12-31\": 84300\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.phase_out.start.SEPARATE\": {\n",
+ " \"2026-01-01.2026-12-31\": 104600,\n",
+ " \"2027-01-01.2027-12-31\": 106800,\n",
+ " \"2028-01-01.2028-12-31\": 108950,\n",
+ " \"2029-01-01.2029-12-31\": 111100,\n",
+ " \"2030-01-01.2030-12-31\": 113300,\n",
+ " \"2031-01-01.2031-12-31\": 115550,\n",
+ " \"2032-01-01.2032-12-31\": 117850,\n",
+ " \"2033-01-01.2033-12-31\": 120150,\n",
+ " \"2034-01-01.2034-12-31\": 122550,\n",
+ " \"2035-01-01.2100-12-31\": 125000\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.1.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 17350,\n",
+ " \"2027-01-01.2027-12-31\": 17700,\n",
+ " \"2028-01-01.2028-12-31\": 18050,\n",
+ " \"2029-01-01.2029-12-31\": 18400,\n",
+ " \"2030-01-01.2030-12-31\": 18800,\n",
+ " \"2031-01-01.2031-12-31\": 19150,\n",
+ " \"2032-01-01.2032-12-31\": 19550,\n",
+ " \"2033-01-01.2033-12-31\": 19900,\n",
+ " \"2034-01-01.2034-12-31\": 20300,\n",
+ " \"2035-01-01.2100-12-31\": 20700\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.2.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 66050,\n",
+ " \"2027-01-01.2027-12-31\": 67450,\n",
+ " \"2028-01-01.2028-12-31\": 68850,\n",
+ " \"2029-01-01.2029-12-31\": 70200,\n",
+ " \"2030-01-01.2030-12-31\": 71550,\n",
+ " \"2031-01-01.2031-12-31\": 73000,\n",
+ " \"2032-01-01.2032-12-31\": 74450,\n",
+ " \"2033-01-01.2033-12-31\": 75900,\n",
+ " \"2034-01-01.2034-12-31\": 77400,\n",
+ " \"2035-01-01.2100-12-31\": 78950\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.3.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 170550,\n",
+ " \"2027-01-01.2027-12-31\": 174150,\n",
+ " \"2028-01-01.2028-12-31\": 177700,\n",
+ " \"2029-01-01.2029-12-31\": 181200,\n",
+ " \"2030-01-01.2030-12-31\": 184800,\n",
+ " \"2031-01-01.2031-12-31\": 188450,\n",
+ " \"2032-01-01.2032-12-31\": 192150,\n",
+ " \"2033-01-01.2033-12-31\": 195950,\n",
+ " \"2034-01-01.2034-12-31\": 199850,\n",
+ " \"2035-01-01.2100-12-31\": 203850\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.4.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 276200,\n",
+ " \"2027-01-01.2027-12-31\": 282050,\n",
+ " \"2028-01-01.2028-12-31\": 287750,\n",
+ " \"2029-01-01.2029-12-31\": 293450,\n",
+ " \"2030-01-01.2030-12-31\": 299250,\n",
+ " \"2031-01-01.2031-12-31\": 305150,\n",
+ " \"2032-01-01.2032-12-31\": 311200,\n",
+ " \"2033-01-01.2033-12-31\": 317350,\n",
+ " \"2034-01-01.2034-12-31\": 323650,\n",
+ " \"2035-01-01.2100-12-31\": 330100\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.5.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 541550,\n",
+ " \"2027-01-01.2027-12-31\": 553050,\n",
+ " \"2028-01-01.2028-12-31\": 564200,\n",
+ " \"2029-01-01.2029-12-31\": 575400,\n",
+ " \"2030-01-01.2030-12-31\": 586750,\n",
+ " \"2031-01-01.2031-12-31\": 598350,\n",
+ " \"2032-01-01.2032-12-31\": 610200,\n",
+ " \"2033-01-01.2033-12-31\": 622300,\n",
+ " \"2034-01-01.2034-12-31\": 634650,\n",
+ " \"2035-01-01.2100-12-31\": 647250\n",
+ " },\n",
+ " \"gov.irs.income.bracket.thresholds.6.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 577750,\n",
+ " \"2027-01-01.2027-12-31\": 590000,\n",
+ " \"2028-01-01.2028-12-31\": 601950,\n",
+ " \"2029-01-01.2029-12-31\": 613850,\n",
+ " \"2030-01-01.2030-12-31\": 625950,\n",
+ " \"2031-01-01.2031-12-31\": 638350,\n",
+ " \"2032-01-01.2032-12-31\": 651000,\n",
+ " \"2033-01-01.2033-12-31\": 663900,\n",
+ " \"2034-01-01.2034-12-31\": 677050,\n",
+ " \"2035-01-01.2100-12-31\": 690500\n",
+ " },\n",
+ " \"gov.irs.deductions.itemized.interest.mortgage.cap.JOINT\": {\n",
+ " \"2026-01-01.2100-12-31\": 1000000\n",
+ " },\n",
+ " \"gov.irs.deductions.overtime_income.cap.SURVIVING_SPOUSE\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.deductions.qbi.deduction_floor.amount[1].amount\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.credits.cdcc.phase_out.amended_structure.applies\": {\n",
+ " \"2026-01-01.2100-12-31\": False\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.phase_out.threshold.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2100-12-31\": 75000\n",
+ " },\n",
+ " \"gov.irs.deductions.itemized.interest.mortgage.cap.SINGLE\": {\n",
+ " \"2026-01-01.2100-12-31\": 1000000\n",
+ " },\n",
+ " \"gov.irs.deductions.overtime_income.cap.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2025-01-01.2100-12-31\": 0\n",
+ " },\n",
+ " \"gov.irs.credits.ctc.phase_out.threshold.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2100-12-31\": 75000\n",
+ " },\n",
+ " \"gov.irs.deductions.itemized.interest.mortgage.cap.SEPARATE\": {\n",
+ " \"2026-01-01.2100-12-31\": 500000\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.phase_out.start.HEAD_OF_HOUSEHOLD\": {\n",
+ " \"2026-01-01.2026-12-31\": 156900,\n",
+ " \"2027-01-01.2027-12-31\": 160200,\n",
+ " \"2028-01-01.2028-12-31\": 163400,\n",
+ " \"2029-01-01.2029-12-31\": 166700,\n",
+ " \"2030-01-01.2030-12-31\": 170000,\n",
+ " \"2031-01-01.2031-12-31\": 173300,\n",
+ " \"2032-01-01.2032-12-31\": 176800,\n",
+ " \"2033-01-01.2033-12-31\": 180300,\n",
+ " \"2034-01-01.2034-12-31\": 183800,\n",
+ " \"2035-01-01.2100-12-31\": 187500\n",
+ " },\n",
+ " \"gov.irs.income.amt.exemption.phase_out.start.SURVIVING_SPOUSE\": {\n",
+ " \"2026-01-01.2026-12-31\": 209200,\n",
+ " \"2027-01-01.2027-12-31\": 213600,\n",
+ " \"2028-01-01.2028-12-31\": 217900,\n",
+ " \"2029-01-01.2029-12-31\": 222200,\n",
+ " \"2030-01-01.2030-12-31\": 226600,\n",
+ " \"2031-01-01.2031-12-31\": 231100,\n",
+ " \"2032-01-01.2032-12-31\": 235700,\n",
+ " \"2033-01-01.2033-12-31\": 240300,\n",
+ " \"2034-01-01.2034-12-31\": 245100,\n",
+ " \"2035-01-01.2100-12-31\": 250000\n",
+ " }\n",
+ "}, \"policyengine_us\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create baseline and reformed simulations\n",
+ "# Baseline = with the reform, Reformed = current law (without reform)\n",
+ "baseline = Microsimulation(dataset=\"hf://policyengine/test/NY.h5\", reform=reform)\n",
+ "reformed = Microsimulation(dataset=\"hf://policyengine/test/NY.h5\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Calculate household net income for both simulations\n",
+ "baseline_income = baseline.calculate(\"household_net_income\", period=2026)\n",
+ "reformed_income = reformed.calculate(\"household_net_income\", period=2026)\n",
+ "difference_income = reformed_income - baseline_income"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "aeyeb2uolqi",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dataframe has 31629 rows\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Create dataframe with all relevant information\n",
+ "# map_to='household' automatically includes 'household_weight' in the dataframe\n",
+ "df = baseline.calculate_dataframe(\n",
+ " ['household_id', 'state_fips', 'congressional_district_geoid', 'household_weight'], \n",
+ " map_to='household'\n",
+ ")\n",
+ "\n",
+ "# Rename household_weight to weight for convenience (not creating a duplicate)\n",
+ "df = df.rename(columns={'household_weight': 'weight'})\n",
+ "\n",
+ "# Add income columns to dataframe (these are NOT weighted, just raw values)\n",
+ "df['baseline_income'] = baseline_income\n",
+ "df['reformed_income'] = reformed_income\n",
+ "df['income_change'] = difference_income\n",
+ "\n",
+ "# Verify we're not double counting\n",
+ "print(f\"Dataframe has {len(df)} rows\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Columns in dataframe: ['household_id', 'state_fips', 'congressional_district_geoid', 'weight', 'baseline_income', 'reformed_income', 'income_change']\n",
+ "\n",
+ "Total rows: 31629\n",
+ "\n",
+ "First few rows:\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " household_id | \n",
+ " state_fips | \n",
+ " congressional_district_geoid | \n",
+ " weight | \n",
+ " baseline_income | \n",
+ " reformed_income | \n",
+ " income_change | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1800000 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 74.144402 | \n",
+ " 43778.382812 | \n",
+ " 43778.382812 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1800001 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 192.847092 | \n",
+ " 56949.125000 | \n",
+ " 56949.125000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1800002 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 37.884129 | \n",
+ " 75.000000 | \n",
+ " 75.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1800003 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 81.096626 | \n",
+ " 275199.937500 | \n",
+ " 295848.500000 | \n",
+ " 20648.562500 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1800004 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 196.057053 | \n",
+ " 180703.937500 | \n",
+ " 184628.296875 | \n",
+ " 3924.359375 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 1800005 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 67.776245 | \n",
+ " 410960.343750 | \n",
+ " 410653.718750 | \n",
+ " -306.625000 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1800006 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 85.610558 | \n",
+ " 72823.351562 | \n",
+ " 72823.351562 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 1800007 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 20.029324 | \n",
+ " 127268.171875 | \n",
+ " 128712.828125 | \n",
+ " 1444.656250 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1800008 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 159.863495 | \n",
+ " 23696.179688 | \n",
+ " 23696.179688 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1800009 | \n",
+ " 36 | \n",
+ " 3601 | \n",
+ " 123.849129 | \n",
+ " 329378.031250 | \n",
+ " 334942.093750 | \n",
+ " 5564.062500 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " household_id state_fips congressional_district_geoid weight \\\n",
+ "0 1800000 36 3601 74.144402 \n",
+ "1 1800001 36 3601 192.847092 \n",
+ "2 1800002 36 3601 37.884129 \n",
+ "3 1800003 36 3601 81.096626 \n",
+ "4 1800004 36 3601 196.057053 \n",
+ "5 1800005 36 3601 67.776245 \n",
+ "6 1800006 36 3601 85.610558 \n",
+ "7 1800007 36 3601 20.029324 \n",
+ "8 1800008 36 3601 159.863495 \n",
+ "9 1800009 36 3601 123.849129 \n",
+ "\n",
+ " baseline_income reformed_income income_change \n",
+ "0 43778.382812 43778.382812 0.000000 \n",
+ "1 56949.125000 56949.125000 0.000000 \n",
+ "2 75.000000 75.000000 0.000000 \n",
+ "3 275199.937500 295848.500000 20648.562500 \n",
+ "4 180703.937500 184628.296875 3924.359375 \n",
+ "5 410960.343750 410653.718750 -306.625000 \n",
+ "6 72823.351562 72823.351562 0.000000 \n",
+ "7 127268.171875 128712.828125 1444.656250 \n",
+ "8 23696.179688 23696.179688 0.000000 \n",
+ "9 329378.031250 334942.093750 5564.062500 "
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Display the dataframe with columns and check for duplicates\n",
+ "print(\"Columns in dataframe:\", df.columns.tolist())\n",
+ "print(f\"\\nTotal rows: {len(df)}\")\n",
+ "print(f\"\\nFirst few rows:\")\n",
+ "df.head(10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sample_size | \n",
+ " avg_baseline_income | \n",
+ " avg_reformed_income | \n",
+ " avg_income_change | \n",
+ " total_income_change | \n",
+ "
\n",
+ " \n",
+ " | congressional_district_geoid | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 3601 | \n",
+ " 1617.0 | \n",
+ " 143845.171875 | \n",
+ " 148153.406250 | \n",
+ " 4308.232422 | \n",
+ " 6.966412e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3602 | \n",
+ " 1419.0 | \n",
+ " 110839.648438 | \n",
+ " 113832.421875 | \n",
+ " 2992.780029 | \n",
+ " 4.246755e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3603 | \n",
+ " 1690.0 | \n",
+ " 164515.906250 | \n",
+ " 169924.968750 | \n",
+ " 5409.066895 | \n",
+ " 9.141323e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3604 | \n",
+ " 1496.0 | \n",
+ " 126062.164062 | \n",
+ " 129620.109375 | \n",
+ " 3557.951416 | \n",
+ " 5.322696e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3605 | \n",
+ " 892.0 | \n",
+ " 83690.320312 | \n",
+ " 85331.429688 | \n",
+ " 1641.100098 | \n",
+ " 1.463861e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3606 | \n",
+ " 887.0 | \n",
+ " 86829.453125 | \n",
+ " 88802.648438 | \n",
+ " 1973.193970 | \n",
+ " 1.750223e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3607 | \n",
+ " 1186.0 | \n",
+ " 127848.320312 | \n",
+ " 132043.093750 | \n",
+ " 4194.772461 | \n",
+ " 4.975000e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3608 | \n",
+ " 1067.0 | \n",
+ " 100501.953125 | \n",
+ " 103051.695312 | \n",
+ " 2549.745361 | \n",
+ " 2.720578e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3609 | \n",
+ " 1264.0 | \n",
+ " 138191.859375 | \n",
+ " 142586.171875 | \n",
+ " 4394.299805 | \n",
+ " 5.554395e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3610 | \n",
+ " 1387.0 | \n",
+ " 175475.984375 | \n",
+ " 181719.875000 | \n",
+ " 6243.895996 | \n",
+ " 8.660284e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3611 | \n",
+ " 1398.0 | \n",
+ " 131290.796875 | \n",
+ " 135457.265625 | \n",
+ " 4166.443359 | \n",
+ " 5.824688e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3612 | \n",
+ " 1440.0 | \n",
+ " 242408.218750 | \n",
+ " 251282.484375 | \n",
+ " 8874.273438 | \n",
+ " 1.277895e+07 | \n",
+ "
\n",
+ " \n",
+ " | 3613 | \n",
+ " 869.0 | \n",
+ " 88758.703125 | \n",
+ " 90908.820312 | \n",
+ " 2150.123047 | \n",
+ " 1.868457e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3614 | \n",
+ " 1016.0 | \n",
+ " 99821.906250 | \n",
+ " 102682.882812 | \n",
+ " 2860.984131 | \n",
+ " 2.906760e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3615 | \n",
+ " 874.0 | \n",
+ " 99412.234375 | \n",
+ " 101974.484375 | \n",
+ " 2562.251953 | \n",
+ " 2.239408e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3616 | \n",
+ " 1602.0 | \n",
+ " 155516.406250 | \n",
+ " 160661.171875 | \n",
+ " 5144.767578 | \n",
+ " 8.241918e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3617 | \n",
+ " 1470.0 | \n",
+ " 138431.265625 | \n",
+ " 142728.343750 | \n",
+ " 4297.070312 | \n",
+ " 6.316694e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3618 | \n",
+ " 1438.0 | \n",
+ " 113723.257812 | \n",
+ " 116897.445312 | \n",
+ " 3174.191895 | \n",
+ " 4.564488e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3619 | \n",
+ " 1060.0 | \n",
+ " 93198.765625 | \n",
+ " 95462.460938 | \n",
+ " 2263.700195 | \n",
+ " 2.399522e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3620 | \n",
+ " 1302.0 | \n",
+ " 110184.210938 | \n",
+ " 113267.390625 | \n",
+ " 3083.191895 | \n",
+ " 4.014316e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3621 | \n",
+ " 1012.0 | \n",
+ " 86811.210938 | \n",
+ " 88742.906250 | \n",
+ " 1931.706665 | \n",
+ " 1.954887e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3622 | \n",
+ " 1048.0 | \n",
+ " 88847.539062 | \n",
+ " 90992.523438 | \n",
+ " 2144.984619 | \n",
+ " 2.247944e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3623 | \n",
+ " 1004.0 | \n",
+ " 88731.453125 | \n",
+ " 90741.132812 | \n",
+ " 2009.684814 | \n",
+ " 2.017724e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3624 | \n",
+ " 1013.0 | \n",
+ " 91033.562500 | \n",
+ " 93158.601562 | \n",
+ " 2125.040039 | \n",
+ " 2.152666e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3625 | \n",
+ " 1138.0 | \n",
+ " 95898.093750 | \n",
+ " 98287.687500 | \n",
+ " 2389.596436 | \n",
+ " 2.719361e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3626 | \n",
+ " 1040.0 | \n",
+ " 86841.664062 | \n",
+ " 88932.632812 | \n",
+ " 2090.965576 | \n",
+ " 2.174604e+06 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sample_size avg_baseline_income \\\n",
+ "congressional_district_geoid \n",
+ "3601 1617.0 143845.171875 \n",
+ "3602 1419.0 110839.648438 \n",
+ "3603 1690.0 164515.906250 \n",
+ "3604 1496.0 126062.164062 \n",
+ "3605 892.0 83690.320312 \n",
+ "3606 887.0 86829.453125 \n",
+ "3607 1186.0 127848.320312 \n",
+ "3608 1067.0 100501.953125 \n",
+ "3609 1264.0 138191.859375 \n",
+ "3610 1387.0 175475.984375 \n",
+ "3611 1398.0 131290.796875 \n",
+ "3612 1440.0 242408.218750 \n",
+ "3613 869.0 88758.703125 \n",
+ "3614 1016.0 99821.906250 \n",
+ "3615 874.0 99412.234375 \n",
+ "3616 1602.0 155516.406250 \n",
+ "3617 1470.0 138431.265625 \n",
+ "3618 1438.0 113723.257812 \n",
+ "3619 1060.0 93198.765625 \n",
+ "3620 1302.0 110184.210938 \n",
+ "3621 1012.0 86811.210938 \n",
+ "3622 1048.0 88847.539062 \n",
+ "3623 1004.0 88731.453125 \n",
+ "3624 1013.0 91033.562500 \n",
+ "3625 1138.0 95898.093750 \n",
+ "3626 1040.0 86841.664062 \n",
+ "\n",
+ " avg_reformed_income avg_income_change \\\n",
+ "congressional_district_geoid \n",
+ "3601 148153.406250 4308.232422 \n",
+ "3602 113832.421875 2992.780029 \n",
+ "3603 169924.968750 5409.066895 \n",
+ "3604 129620.109375 3557.951416 \n",
+ "3605 85331.429688 1641.100098 \n",
+ "3606 88802.648438 1973.193970 \n",
+ "3607 132043.093750 4194.772461 \n",
+ "3608 103051.695312 2549.745361 \n",
+ "3609 142586.171875 4394.299805 \n",
+ "3610 181719.875000 6243.895996 \n",
+ "3611 135457.265625 4166.443359 \n",
+ "3612 251282.484375 8874.273438 \n",
+ "3613 90908.820312 2150.123047 \n",
+ "3614 102682.882812 2860.984131 \n",
+ "3615 101974.484375 2562.251953 \n",
+ "3616 160661.171875 5144.767578 \n",
+ "3617 142728.343750 4297.070312 \n",
+ "3618 116897.445312 3174.191895 \n",
+ "3619 95462.460938 2263.700195 \n",
+ "3620 113267.390625 3083.191895 \n",
+ "3621 88742.906250 1931.706665 \n",
+ "3622 90992.523438 2144.984619 \n",
+ "3623 90741.132812 2009.684814 \n",
+ "3624 93158.601562 2125.040039 \n",
+ "3625 98287.687500 2389.596436 \n",
+ "3626 88932.632812 2090.965576 \n",
+ "\n",
+ " total_income_change \n",
+ "congressional_district_geoid \n",
+ "3601 6.966412e+06 \n",
+ "3602 4.246755e+06 \n",
+ "3603 9.141323e+06 \n",
+ "3604 5.322696e+06 \n",
+ "3605 1.463861e+06 \n",
+ "3606 1.750223e+06 \n",
+ "3607 4.975000e+06 \n",
+ "3608 2.720578e+06 \n",
+ "3609 5.554395e+06 \n",
+ "3610 8.660284e+06 \n",
+ "3611 5.824688e+06 \n",
+ "3612 1.277895e+07 \n",
+ "3613 1.868457e+06 \n",
+ "3614 2.906760e+06 \n",
+ "3615 2.239408e+06 \n",
+ "3616 8.241918e+06 \n",
+ "3617 6.316694e+06 \n",
+ "3618 4.564488e+06 \n",
+ "3619 2.399522e+06 \n",
+ "3620 4.014316e+06 \n",
+ "3621 1.954887e+06 \n",
+ "3622 2.247944e+06 \n",
+ "3623 2.017724e+06 \n",
+ "3624 2.152666e+06 \n",
+ "3625 2.719361e+06 \n",
+ "3626 2.174604e+06 "
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Analyze impact by congressional district\n",
+ "import pandas as pd\n",
+ "\n",
+ "district_impacts = df.groupby('congressional_district_geoid').apply(\n",
+ " lambda x: pd.Series({\n",
+ " 'sample_size': len(x),\n",
+ " 'avg_baseline_income': x['baseline_income'].mean(),\n",
+ " 'avg_reformed_income': x['reformed_income'].mean(),\n",
+ " 'avg_income_change': x['income_change'].mean(),\n",
+ " 'total_income_change': x['income_change'].sum()\n",
+ " })\n",
+ ")\n",
+ "\n",
+ "district_impacts"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "xjb173w5h3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sample_size | \n",
+ " avg_baseline_income | \n",
+ " avg_reformed_income | \n",
+ " avg_income_change | \n",
+ " total_income_change | \n",
+ "
\n",
+ " \n",
+ " | congressional_district_geoid | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 3612 | \n",
+ " 1440.0 | \n",
+ " 242408.218750 | \n",
+ " 251282.484375 | \n",
+ " 8874.273438 | \n",
+ " 1.277895e+07 | \n",
+ "
\n",
+ " \n",
+ " | 3610 | \n",
+ " 1387.0 | \n",
+ " 175475.984375 | \n",
+ " 181719.875000 | \n",
+ " 6243.895996 | \n",
+ " 8.660284e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3603 | \n",
+ " 1690.0 | \n",
+ " 164515.906250 | \n",
+ " 169924.968750 | \n",
+ " 5409.066895 | \n",
+ " 9.141323e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3616 | \n",
+ " 1602.0 | \n",
+ " 155516.406250 | \n",
+ " 160661.171875 | \n",
+ " 5144.767578 | \n",
+ " 8.241918e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3609 | \n",
+ " 1264.0 | \n",
+ " 138191.859375 | \n",
+ " 142586.171875 | \n",
+ " 4394.299805 | \n",
+ " 5.554395e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3601 | \n",
+ " 1617.0 | \n",
+ " 143845.171875 | \n",
+ " 148153.406250 | \n",
+ " 4308.232422 | \n",
+ " 6.966412e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3617 | \n",
+ " 1470.0 | \n",
+ " 138431.265625 | \n",
+ " 142728.343750 | \n",
+ " 4297.070312 | \n",
+ " 6.316694e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3607 | \n",
+ " 1186.0 | \n",
+ " 127848.320312 | \n",
+ " 132043.093750 | \n",
+ " 4194.772461 | \n",
+ " 4.975000e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3611 | \n",
+ " 1398.0 | \n",
+ " 131290.796875 | \n",
+ " 135457.265625 | \n",
+ " 4166.443359 | \n",
+ " 5.824688e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3604 | \n",
+ " 1496.0 | \n",
+ " 126062.164062 | \n",
+ " 129620.109375 | \n",
+ " 3557.951416 | \n",
+ " 5.322696e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3618 | \n",
+ " 1438.0 | \n",
+ " 113723.257812 | \n",
+ " 116897.445312 | \n",
+ " 3174.191895 | \n",
+ " 4.564488e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3620 | \n",
+ " 1302.0 | \n",
+ " 110184.210938 | \n",
+ " 113267.390625 | \n",
+ " 3083.191895 | \n",
+ " 4.014316e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3602 | \n",
+ " 1419.0 | \n",
+ " 110839.648438 | \n",
+ " 113832.421875 | \n",
+ " 2992.780029 | \n",
+ " 4.246755e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3614 | \n",
+ " 1016.0 | \n",
+ " 99821.906250 | \n",
+ " 102682.882812 | \n",
+ " 2860.984131 | \n",
+ " 2.906760e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3615 | \n",
+ " 874.0 | \n",
+ " 99412.234375 | \n",
+ " 101974.484375 | \n",
+ " 2562.251953 | \n",
+ " 2.239408e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3608 | \n",
+ " 1067.0 | \n",
+ " 100501.953125 | \n",
+ " 103051.695312 | \n",
+ " 2549.745361 | \n",
+ " 2.720578e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3625 | \n",
+ " 1138.0 | \n",
+ " 95898.093750 | \n",
+ " 98287.687500 | \n",
+ " 2389.596436 | \n",
+ " 2.719361e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3619 | \n",
+ " 1060.0 | \n",
+ " 93198.765625 | \n",
+ " 95462.460938 | \n",
+ " 2263.700195 | \n",
+ " 2.399522e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3613 | \n",
+ " 869.0 | \n",
+ " 88758.703125 | \n",
+ " 90908.820312 | \n",
+ " 2150.123047 | \n",
+ " 1.868457e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3622 | \n",
+ " 1048.0 | \n",
+ " 88847.539062 | \n",
+ " 90992.523438 | \n",
+ " 2144.984619 | \n",
+ " 2.247944e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3624 | \n",
+ " 1013.0 | \n",
+ " 91033.562500 | \n",
+ " 93158.601562 | \n",
+ " 2125.040039 | \n",
+ " 2.152666e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3626 | \n",
+ " 1040.0 | \n",
+ " 86841.664062 | \n",
+ " 88932.632812 | \n",
+ " 2090.965576 | \n",
+ " 2.174604e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3623 | \n",
+ " 1004.0 | \n",
+ " 88731.453125 | \n",
+ " 90741.132812 | \n",
+ " 2009.684814 | \n",
+ " 2.017724e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3606 | \n",
+ " 887.0 | \n",
+ " 86829.453125 | \n",
+ " 88802.648438 | \n",
+ " 1973.193970 | \n",
+ " 1.750223e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3621 | \n",
+ " 1012.0 | \n",
+ " 86811.210938 | \n",
+ " 88742.906250 | \n",
+ " 1931.706665 | \n",
+ " 1.954887e+06 | \n",
+ "
\n",
+ " \n",
+ " | 3605 | \n",
+ " 892.0 | \n",
+ " 83690.320312 | \n",
+ " 85331.429688 | \n",
+ " 1641.100098 | \n",
+ " 1.463861e+06 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sample_size avg_baseline_income \\\n",
+ "congressional_district_geoid \n",
+ "3612 1440.0 242408.218750 \n",
+ "3610 1387.0 175475.984375 \n",
+ "3603 1690.0 164515.906250 \n",
+ "3616 1602.0 155516.406250 \n",
+ "3609 1264.0 138191.859375 \n",
+ "3601 1617.0 143845.171875 \n",
+ "3617 1470.0 138431.265625 \n",
+ "3607 1186.0 127848.320312 \n",
+ "3611 1398.0 131290.796875 \n",
+ "3604 1496.0 126062.164062 \n",
+ "3618 1438.0 113723.257812 \n",
+ "3620 1302.0 110184.210938 \n",
+ "3602 1419.0 110839.648438 \n",
+ "3614 1016.0 99821.906250 \n",
+ "3615 874.0 99412.234375 \n",
+ "3608 1067.0 100501.953125 \n",
+ "3625 1138.0 95898.093750 \n",
+ "3619 1060.0 93198.765625 \n",
+ "3613 869.0 88758.703125 \n",
+ "3622 1048.0 88847.539062 \n",
+ "3624 1013.0 91033.562500 \n",
+ "3626 1040.0 86841.664062 \n",
+ "3623 1004.0 88731.453125 \n",
+ "3606 887.0 86829.453125 \n",
+ "3621 1012.0 86811.210938 \n",
+ "3605 892.0 83690.320312 \n",
+ "\n",
+ " avg_reformed_income avg_income_change \\\n",
+ "congressional_district_geoid \n",
+ "3612 251282.484375 8874.273438 \n",
+ "3610 181719.875000 6243.895996 \n",
+ "3603 169924.968750 5409.066895 \n",
+ "3616 160661.171875 5144.767578 \n",
+ "3609 142586.171875 4394.299805 \n",
+ "3601 148153.406250 4308.232422 \n",
+ "3617 142728.343750 4297.070312 \n",
+ "3607 132043.093750 4194.772461 \n",
+ "3611 135457.265625 4166.443359 \n",
+ "3604 129620.109375 3557.951416 \n",
+ "3618 116897.445312 3174.191895 \n",
+ "3620 113267.390625 3083.191895 \n",
+ "3602 113832.421875 2992.780029 \n",
+ "3614 102682.882812 2860.984131 \n",
+ "3615 101974.484375 2562.251953 \n",
+ "3608 103051.695312 2549.745361 \n",
+ "3625 98287.687500 2389.596436 \n",
+ "3619 95462.460938 2263.700195 \n",
+ "3613 90908.820312 2150.123047 \n",
+ "3622 90992.523438 2144.984619 \n",
+ "3624 93158.601562 2125.040039 \n",
+ "3626 88932.632812 2090.965576 \n",
+ "3623 90741.132812 2009.684814 \n",
+ "3606 88802.648438 1973.193970 \n",
+ "3621 88742.906250 1931.706665 \n",
+ "3605 85331.429688 1641.100098 \n",
+ "\n",
+ " total_income_change \n",
+ "congressional_district_geoid \n",
+ "3612 1.277895e+07 \n",
+ "3610 8.660284e+06 \n",
+ "3603 9.141323e+06 \n",
+ "3616 8.241918e+06 \n",
+ "3609 5.554395e+06 \n",
+ "3601 6.966412e+06 \n",
+ "3617 6.316694e+06 \n",
+ "3607 4.975000e+06 \n",
+ "3611 5.824688e+06 \n",
+ "3604 5.322696e+06 \n",
+ "3618 4.564488e+06 \n",
+ "3620 4.014316e+06 \n",
+ "3602 4.246755e+06 \n",
+ "3614 2.906760e+06 \n",
+ "3615 2.239408e+06 \n",
+ "3608 2.720578e+06 \n",
+ "3625 2.719361e+06 \n",
+ "3619 2.399522e+06 \n",
+ "3613 1.868457e+06 \n",
+ "3622 2.247944e+06 \n",
+ "3624 2.152666e+06 \n",
+ "3626 2.174604e+06 \n",
+ "3623 2.017724e+06 \n",
+ "3606 1.750223e+06 \n",
+ "3621 1.954887e+06 \n",
+ "3605 1.463861e+06 "
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Sort districts by total income change to see which are most affected\n",
+ "district_impacts_sorted = district_impacts.sort_values('avg_income_change', ascending=False)\n",
+ "district_impacts_sorted"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "ivjjvnw38dh",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "To use this visualization, you need to download the HexCDv31 shapefile folder from:\n",
+ "https://github.com/PolicyEngine/Congressional-Hackathon-2025/tree/ben-hacks/PolicyEngine/HexCDv31\n",
+ "Extract it to the 'obbba_district_impacts' directory\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Download and prepare hexagon shapefiles for visualization\n",
+ "import urllib.request\n",
+ "import zipfile\n",
+ "import os\n",
+ "\n",
+ "# Create directory for shapefiles if it doesn't exist\n",
+ "os.makedirs('HexCDv31', exist_ok=True)\n",
+ "\n",
+ "# Download the hexagon shapefile\n",
+ "shapefile_url = 'https://github.com/PolicyEngine/Congressional-Hackathon-2025/raw/ben-hacks/PolicyEngine/HexCDv31.zip'\n",
+ "\n",
+ "# Note: You may need to manually download from the repo if this fails\n",
+ "# Download link: https://github.com/PolicyEngine/Congressional-Hackathon-2025/tree/ben-hacks/PolicyEngine/HexCDv31\n",
+ "\n",
+ "print(\"To use this visualization, you need to download the HexCDv31 shapefile folder from:\")\n",
+ "print(\"https://github.com/PolicyEngine/Congressional-Hackathon-2025/tree/ben-hacks/PolicyEngine/HexCDv31\")\n",
+ "print(\"Extract it to the 'obbba_district_impacts' directory\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "iwexbldeti",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "ModuleNotFoundError",
+ "evalue": "No module named 'geopandas'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[36], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# Create NY congressional district map visualization\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mgeopandas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mgpd\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mnumpy\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mnp\u001b[39;00m\n",
+ "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'geopandas'"
+ ]
+ }
+ ],
+ "source": [
+ "# Create NY congressional district map visualization\n",
+ "import geopandas as gpd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "# Load the hexagon shapefile\n",
+ "hex_gdf = gpd.read_file('HexCDv31/HexCDv31.shp')\n",
+ "\n",
+ "# Convert GEOID to integer for merging\n",
+ "hex_gdf['cd_geoid'] = hex_gdf['GEOID'].astype(int)\n",
+ "\n",
+ "# Filter to only NY districts (state FIPS code 36)\n",
+ "ny_hex = hex_gdf[hex_gdf['GEOID'].str.startswith('36')].copy()\n",
+ "\n",
+ "print(f\"Found {len(ny_hex)} NY congressional districts in shapefile\")\n",
+ "\n",
+ "# Prepare district impacts for merging\n",
+ "district_impacts_merge = district_impacts.reset_index()\n",
+ "district_impacts_merge['cd_geoid'] = district_impacts_merge['congressional_district_geoid'].astype(int)\n",
+ "\n",
+ "# Merge the geographic data with impact data\n",
+ "ny_map = ny_hex.merge(\n",
+ " district_impacts_merge[['cd_geoid', 'avg_income_change', 'sample_size']], \n",
+ " on='cd_geoid', \n",
+ " how='left'\n",
+ ")\n",
+ "\n",
+ "print(f\"\\nMerged data: {len(ny_map)} districts\")\n",
+ "print(f\"Districts with impact data: {ny_map['avg_income_change'].notna().sum()}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9xl9qp0qe3b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Plot NY congressional district income changes\n",
+ "fig, ax = plt.subplots(figsize=(12, 10))\n",
+ "\n",
+ "# Create the choropleth map\n",
+ "ny_map.plot(\n",
+ " column='avg_income_change',\n",
+ " cmap='RdYlGn', # Red for negative (income loss), Green for positive (income gain)\n",
+ " legend=True,\n",
+ " ax=ax,\n",
+ " edgecolor='black',\n",
+ " linewidth=0.5,\n",
+ " missing_kwds={'color': 'lightgray'}\n",
+ ")\n",
+ "\n",
+ "# Add district labels\n",
+ "for idx, row in ny_map.iterrows():\n",
+ " # Get the centroid of each district\n",
+ " centroid = row.geometry.centroid\n",
+ " # Extract district number from GEOID (last 2 digits)\n",
+ " district_num = str(row['GEOID'])[-2:]\n",
+ " ax.text(centroid.x, centroid.y, district_num, \n",
+ " fontsize=8, ha='center', va='center', weight='bold')\n",
+ "\n",
+ "ax.set_title('Average Change in Net Income by NY Congressional District\\n(Reform vs Current Law)', \n",
+ " fontsize=14, weight='bold')\n",
+ "ax.axis('off')\n",
+ "\n",
+ "plt.tight_layout()\n",
+ "plt.savefig('ny_district_income_impact.png', dpi=300, bbox_inches='tight')\n",
+ "plt.show()\n",
+ "\n",
+ "print(f\"\\nMap saved as 'ny_district_income_impact.png'\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1kcfqwyrsfm",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Summary statistics for the map\n",
+ "print(\"NY Congressional District Income Impact Summary:\")\n",
+ "print(\"=\"*60)\n",
+ "print(f\"\\nMost negatively impacted (largest income loss):\")\n",
+ "top_losers = district_impacts_sorted.head(3)\n",
+ "for idx, row in top_losers.iterrows():\n",
+ " district_num = str(idx)[-2:]\n",
+ " print(f\" District {district_num}: ${row['avg_income_change']:,.2f}\")\n",
+ "\n",
+ "print(f\"\\nLeast impacted or gaining income:\")\n",
+ "top_gainers = district_impacts_sorted.tail(3)\n",
+ "for idx, row in top_gainers.iterrows():\n",
+ " district_num = str(idx)[-2:]\n",
+ " print(f\" District {district_num}: ${row['avg_income_change']:,.2f}\")\n",
+ "\n",
+ "print(f\"\\nOverall statistics:\")\n",
+ "print(f\" Mean impact: ${district_impacts['avg_income_change'].mean():,.2f}\")\n",
+ "print(f\" Median impact: ${district_impacts['avg_income_change'].median():,.2f}\")\n",
+ "print(f\" Range: ${district_impacts['avg_income_change'].min():,.2f} to ${district_impacts['avg_income_change'].max():,.2f}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "j8m8s0pephe",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Exported district impacts to 'ny_congressional_district_impacts.csv'\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Export district impacts to CSV\n",
+ "district_impacts.to_csv('ny_congressional_district_impacts.csv')\n",
+ "print(\"Exported district impacts to 'ny_congressional_district_impacts.csv'\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "0s7cq08o1r6f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "State-wide Impact Summary for NY:\n",
+ "Total sample size: 31629\n",
+ "\n",
+ "Average baseline income: $122,364.39\n",
+ "Average reformed income: $125,820.82\n",
+ "Average income change per household: $3,456.43\n",
+ "\n",
+ "Total state-wide income change (unweighted): $22,798,964,353\n"
+ ]
+ }
+ ],
+ "source": [
+ "# State-wide summary statistics (unweighted)\n",
+ "print(\"State-wide Impact Summary for NY:\")\n",
+ "print(f\"Total sample size: {len(df)}\")\n",
+ "print(f\"\\nAverage baseline income: ${df['baseline_income'].mean():,.2f}\")\n",
+ "print(f\"Average reformed income: ${df['reformed_income'].mean():,.2f}\")\n",
+ "print(f\"Average income change per household: ${df['income_change'].mean():,.2f}\")\n",
+ "print(f\"\\nTotal state-wide income change (unweighted): ${df['income_change'].sum():,.0f}\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "pe",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}