|
184 | 184 | } |
185 | 185 | }, |
186 | 186 | "outputs": [], |
187 | | - "source": "def calculate_rebate_base_statistics(sim, unit_type=\"household\", year=2026):\n \"\"\"\n Calculate AEI rebate base program statistics for California households or tax units.\n \n Args:\n sim: Microsimulation object with reform applied\n unit_type: Either \"household\" or \"tax_unit\"\n year: Year to calculate for\n \n Returns:\n Dictionary with rebate base statistics\n \"\"\"\n print(f\"Calculating {unit_type} statistics for {year}...\")\n \n if unit_type == \"household\":\n # Calculate rebate base for all households\n rebate_base = sim.calculate(\"ca_aei_rebate_base\", year)\n \n # Filter for California households only\n household_state = sim.calculate(\"state_code\", year, map_to=\"household\")\n ca_mask = household_state == \"CA\"\n \n # Apply CA filter\n ca_rebate_base = rebate_base[ca_mask]\n total_ca_units = ca_mask.sum()\n \n else: # tax_unit\n # Calculate rebate base for all tax units (defined_for gives 0 for non-CA)\n rebate_base = sim.calculate(\"ca_aei_rebate_base_tax_unit\", year)\n \n # Use calculate_dataframe to get household-level data\n household_df = sim.calculate_dataframe(\n [\"household_id\", \"state_code\"],\n year,\n map_to=\"household\"\n )\n \n # Get tax unit data\n tax_unit_df = sim.calculate_dataframe(\n [\"tax_unit_id\", \"tax_unit_household_id\"],\n year\n )\n \n # Merge to get state for each tax unit\n tax_unit_with_state = tax_unit_df.merge(\n household_df[[\"household_id\", \"state_code\"]],\n left_on=\"tax_unit_household_id\",\n right_on=\"household_id\",\n how=\"left\"\n )\n \n # Create a boolean MicroSeries for CA tax units\n ca_tax_unit_mask = tax_unit_with_state[\"state_code\"] == \"CA\"\n total_ca_units = ca_tax_unit_mask.sum()\n \n # For tax units, we use all rebates (defined_for already filters to CA)\n ca_rebate_base = rebate_base\n \n # Calculate statistics (MicroSeries already contain weights)\n units_with_rebate = (ca_rebate_base > 0).sum()\n total_rebate_base = ca_rebate_base.sum()\n average_rebate_base = ca_rebate_base[ca_rebate_base > 0].mean() if units_with_rebate > 0 else 0\n \n return {\n f\"total_ca_{unit_type}s\": total_ca_units,\n f\"{unit_type}s_with_rebate\": units_with_rebate,\n \"rebate_percentage\": units_with_rebate / total_ca_units,\n \"average_rebate_base\": average_rebate_base,\n \"total_rebate_base\": total_rebate_base,\n }\n\n# Create simulation once\nprint(\"Loading data and creating simulation...\")\nreform = create_aei_reform()\nsim = Microsimulation(\n dataset=\"hf://policyengine/policyengine-us-data/pooled_3_year_cps_2023.h5\",\n reform=reform\n)\n\n# Calculate both household and tax unit results using the same simulation\nhousehold_results = calculate_rebate_base_statistics(sim, \"household\", SIMULATION_YEAR)\ntax_unit_results = calculate_rebate_base_statistics(sim, \"tax_unit\", SIMULATION_YEAR)" |
| 187 | + "source": "def calculate_rebate_base_statistics(sim, unit_type=\"household\", year=2026):\n \"\"\"\n Calculate AEI rebate base program statistics for California households or tax units.\n \n Args:\n sim: Microsimulation object with reform applied\n unit_type: Either \"household\" or \"tax_unit\"\n year: Year to calculate for\n \n Returns:\n Dictionary with rebate base statistics\n \"\"\"\n print(f\"Calculating {unit_type} statistics for {year}...\")\n \n if unit_type == \"household\":\n # Calculate rebate base for all households\n rebate_base = sim.calculate(\"ca_aei_rebate_base\", year)\n \n # Filter for California households only\n household_state = sim.calculate(\"state_code\", year, map_to=\"household\")\n ca_mask = household_state == \"CA\"\n \n # Apply CA filter\n ca_rebate_base = rebate_base[ca_mask]\n total_ca_units = ca_mask.sum()\n \n else: # tax_unit\n # Calculate rebate base for all tax units (defined_for gives 0 for non-CA)\n rebate_base = sim.calculate(\"ca_aei_rebate_base_tax_unit\", year)\n \n # Use calculate_dataframe to get household-level data\n household_df = sim.calculate_dataframe(\n [\"household_id\", \"state_code\"],\n year,\n map_to=\"household\"\n )\n \n # Get tax unit data\n tax_unit_df = sim.calculate_dataframe(\n [\"tax_unit_id\", \"tax_unit_household_id\"],\n year\n )\n \n # Merge to get state for each tax unit\n tax_unit_with_state = tax_unit_df.merge(\n household_df[[\"household_id\", \"state_code\"]],\n left_on=\"tax_unit_household_id\",\n right_on=\"household_id\",\n how=\"left\"\n )\n \n # Create a boolean MicroSeries for CA tax units\n ca_tax_unit_mask = tax_unit_with_state[\"state_code\"] == \"CA\"\n total_ca_units = ca_tax_unit_mask.sum()\n \n # For tax units, we use all rebates (defined_for already filters to CA)\n ca_rebate_base = rebate_base\n \n # Calculate statistics (MicroSeries already contain weights)\n units_with_rebate = (ca_rebate_base > 0).sum()\n total_rebate_base = ca_rebate_base.sum()\n average_rebate_base = ca_rebate_base[ca_rebate_base > 0].mean() if units_with_rebate > 0 else 0\n \n return {\n \"unit_type\": unit_type,\n \"total_ca_units\": total_ca_units,\n \"units_with_rebate\": units_with_rebate,\n \"rebate_percentage\": units_with_rebate / total_ca_units,\n \"average_rebate_base\": average_rebate_base,\n \"total_rebate_base\": total_rebate_base,\n }\n\n# Create simulation once\nprint(\"Loading data and creating simulation...\")\nreform = create_aei_reform()\nsim = Microsimulation(\n dataset=\"hf://policyengine/policyengine-us-data/pooled_3_year_cps_2023.h5\",\n reform=reform\n)\n\n# Calculate both household and tax unit results using the same simulation\nhousehold_results = calculate_rebate_base_statistics(sim, \"household\", SIMULATION_YEAR)\ntax_unit_results = calculate_rebate_base_statistics(sim, \"tax_unit\", SIMULATION_YEAR)" |
188 | 188 | }, |
189 | 189 | { |
190 | 190 | "cell_type": "markdown", |
|
203 | 203 | } |
204 | 204 | }, |
205 | 205 | "outputs": [], |
206 | | - "source": "# Display household results\nhousehold_table = pd.DataFrame([\n {'Metric': 'Total CA Households', 'Value': f\"{household_results['total_ca_households']/1e6:.1f}M\"},\n {'Metric': 'Households with Rebate', 'Value': f\"{household_results['households_with_rebate']/1e6:.1f}M ({household_results['rebate_percentage']:.0%})\"},\n {'Metric': 'Average Rebate Base', 'Value': f\"${household_results['average_rebate_base']:,.0f}\"},\n {'Metric': 'Total Rebate Base', 'Value': f\"${household_results['total_rebate_base']/1e9:.1f}B\"},\n])\n\nprint(f\"\\n=== HOUSEHOLD-LEVEL RESULTS ({SIMULATION_YEAR}) ===\")\nhousehold_table" |
| 206 | + "source": "# Display household results\nhousehold_table = pd.DataFrame([\n {'Metric': 'Total CA Households', 'Value': f\"{household_results['total_ca_units']/1e6:.1f}M\"},\n {'Metric': 'Households with Rebate', 'Value': f\"{household_results['units_with_rebate']/1e6:.1f}M ({household_results['rebate_percentage']:.0%})\"},\n {'Metric': 'Average Rebate Base', 'Value': f\"${household_results['average_rebate_base']:,.0f}\"},\n {'Metric': 'Total Rebate Base', 'Value': f\"${household_results['total_rebate_base']/1e9:.1f}B\"},\n])\n\nprint(f\"\\n=== HOUSEHOLD-LEVEL RESULTS ({SIMULATION_YEAR}) ===\")\nhousehold_table" |
207 | 207 | }, |
208 | 208 | { |
209 | 209 | "cell_type": "code", |
210 | | - "source": "# Display tax unit results \ntax_unit_table = pd.DataFrame([\n {'Metric': 'Total CA Tax Units', 'Value': f\"{tax_unit_results['total_ca_tax_units']/1e6:.1f}M\"},\n {'Metric': 'Tax Units with Rebate', 'Value': f\"{tax_unit_results['tax_units_with_rebate']/1e6:.1f}M ({tax_unit_results['rebate_percentage']:.0%})\"},\n {'Metric': 'Average Rebate Base', 'Value': f\"${tax_unit_results['average_rebate_base']:,.0f}\"},\n {'Metric': 'Total Rebate Base', 'Value': f\"${tax_unit_results['total_rebate_base']/1e9:.1f}B\"},\n])\n\nprint(f\"\\n=== TAX UNIT-LEVEL RESULTS ({SIMULATION_YEAR}) ===\")\ntax_unit_table", |
| 210 | + "source": "# Display tax unit results \ntax_unit_table = pd.DataFrame([\n {'Metric': 'Total CA Tax Units', 'Value': f\"{tax_unit_results['total_ca_units']/1e6:.1f}M\"},\n {'Metric': 'Tax Units with Rebate', 'Value': f\"{tax_unit_results['units_with_rebate']/1e6:.1f}M ({tax_unit_results['rebate_percentage']:.0%})\"},\n {'Metric': 'Average Rebate Base', 'Value': f\"${tax_unit_results['average_rebate_base']:,.0f}\"},\n {'Metric': 'Total Rebate Base', 'Value': f\"${tax_unit_results['total_rebate_base']/1e9:.1f}B\"},\n])\n\nprint(f\"\\n=== TAX UNIT-LEVEL RESULTS ({SIMULATION_YEAR}) ===\")\ntax_unit_table", |
| 211 | + "metadata": {}, |
| 212 | + "execution_count": null, |
| 213 | + "outputs": [] |
| 214 | + }, |
| 215 | + { |
| 216 | + "cell_type": "code", |
| 217 | + "source": "# Example: Stack results into a single DataFrame\nresults_df = pd.DataFrame([household_results, tax_unit_results])\nprint(\"\\n=== COMBINED RESULTS ===\")\nresults_df", |
211 | 218 | "metadata": {}, |
212 | 219 | "execution_count": null, |
213 | 220 | "outputs": [] |
|
236 | 243 | { |
237 | 244 | "cell_type": "markdown", |
238 | 245 | "metadata": {}, |
239 | | - "source": [ |
240 | | - "#### VAT Formula\n", |
241 | | - "The rebate base (X) is used in the VAT rate calculation:\n", |
242 | | - "```\n", |
243 | | - "t = Rs/(Cp - X - T + Ro)\n", |
244 | | - "```\n", |
245 | | - "Where:\n", |
246 | | - "- **t** = VAT rate to be determined\n", |
247 | | - "- **Rs** = Revenue target\n", |
248 | | - "- **Cp** = Private consumption\n", |
249 | | - "- **X** = Total rebate base (calculated above)\n", |
250 | | - "- **T** = Existing taxes\n", |
251 | | - "- **Ro** = Other revenue" |
252 | | - ] |
| 246 | + "source": "# Create summary table\nsummary_data = {\n 'Approach': ['Household-Level', 'Tax Unit-Level'],\n 'Total Rebate Base (X)': [\n f\"${household_results['total_rebate_base']/1e9:.1f}B\",\n f\"${tax_unit_results['total_rebate_base']/1e9:.1f}B\"\n ],\n 'Coverage': [\n f\"{household_results['units_with_rebate']/1e6:.1f}M ({household_results['rebate_percentage']:.0%})\",\n f\"{tax_unit_results['units_with_rebate']/1e6:.1f}M ({tax_unit_results['rebate_percentage']:.0%})\"\n ],\n 'VAT Formula Value': [\n f\"${household_results['total_rebate_base']:,.0f}\",\n f\"${tax_unit_results['total_rebate_base']:,.0f}\"\n ]\n}\n\nsummary_df = pd.DataFrame(summary_data)\nprint(f\"=== SUMMARY OF REBATE BASE CALCULATIONS ({SIMULATION_YEAR}) ===\")\nsummary_df" |
253 | 247 | }, |
254 | 248 | { |
255 | 249 | "cell_type": "markdown", |
|
408 | 402 | } |
409 | 403 | }, |
410 | 404 | "outputs": [], |
411 | | - "source": "# Create comparison table\ncomparison_data = {\n 'Metric': [\n 'Total Count',\n 'Eligible Units (with rebate base)',\n 'Total Rebate Base',\n 'Average Rebate Base (eligible only)'\n ],\n 'Households': [\n f\"{household_results['total_ca_households']/1e6:.1f}M\",\n f\"{household_results['households_with_rebate']/1e6:.1f}M ({household_results['rebate_percentage']:.0%})\",\n f\"${household_results['total_rebate_base']/1e9:.1f}B\",\n f\"${household_results['average_rebate_base']:,.0f}\"\n ],\n 'Tax Units': [\n f\"{tax_unit_results['total_ca_tax_units']/1e6:.1f}M\",\n f\"{tax_unit_results['tax_units_with_rebate']/1e6:.1f}M ({tax_unit_results['rebate_percentage']:.0%})\",\n f\"${tax_unit_results['total_rebate_base']/1e9:.1f}B\",\n f\"${tax_unit_results['average_rebate_base']:,.0f}\"\n ]\n}\n\ncomparison_df = pd.DataFrame(comparison_data)\n\n# Calculate ratios for all metrics\nratios = [\n f\"{tax_unit_results['total_ca_tax_units']/household_results['total_ca_households']:.2f}x\",\n f\"{tax_unit_results['tax_units_with_rebate']/household_results['households_with_rebate']:.2f}x\",\n f\"{tax_unit_results['total_rebate_base']/household_results['total_rebate_base']:.2f}x\",\n f\"{tax_unit_results['average_rebate_base']/household_results['average_rebate_base']:.2f}x\"\n]\n\ncomparison_df['Ratio (TU/HH)'] = ratios\n\nprint(f\"=== HOUSEHOLD VS TAX UNIT ANALYSIS ({SIMULATION_YEAR}) ===\")\ncomparison_df" |
| 405 | + "source": "# Create comparison table\ncomparison_data = {\n 'Metric': [\n 'Total Count',\n 'Eligible Units (with rebate base)',\n 'Total Rebate Base',\n 'Average Rebate Base (eligible only)'\n ],\n 'Households': [\n f\"{household_results['total_ca_units']/1e6:.1f}M\",\n f\"{household_results['units_with_rebate']/1e6:.1f}M ({household_results['rebate_percentage']:.0%})\",\n f\"${household_results['total_rebate_base']/1e9:.1f}B\",\n f\"${household_results['average_rebate_base']:,.0f}\"\n ],\n 'Tax Units': [\n f\"{tax_unit_results['total_ca_units']/1e6:.1f}M\",\n f\"{tax_unit_results['units_with_rebate']/1e6:.1f}M ({tax_unit_results['rebate_percentage']:.0%})\",\n f\"${tax_unit_results['total_rebate_base']/1e9:.1f}B\",\n f\"${tax_unit_results['average_rebate_base']:,.0f}\"\n ]\n}\n\ncomparison_df = pd.DataFrame(comparison_data)\n\n# Calculate ratios for all metrics\nratios = [\n f\"{tax_unit_results['total_ca_units']/household_results['total_ca_units']:.2f}x\",\n f\"{tax_unit_results['units_with_rebate']/household_results['units_with_rebate']:.2f}x\",\n f\"{tax_unit_results['total_rebate_base']/household_results['total_rebate_base']:.2f}x\",\n f\"{tax_unit_results['average_rebate_base']/household_results['average_rebate_base']:.2f}x\"\n]\n\ncomparison_df['Ratio (TU/HH)'] = ratios\n\nprint(f\"=== HOUSEHOLD VS TAX UNIT ANALYSIS ({SIMULATION_YEAR}) ===\")\ncomparison_df" |
412 | 406 | }, |
413 | 407 | { |
414 | 408 | "cell_type": "markdown", |
|
0 commit comments