From 86f502ddd9234f721523877ea316716dfe214f59 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 25 Sep 2021 13:46:25 -0700 Subject: [PATCH 1/7] Add first try at openfisca-us-based analysis --- py/openfisca-analysis.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 py/openfisca-analysis.ipynb diff --git a/py/openfisca-analysis.ipynb b/py/openfisca-analysis.ipynb new file mode 100644 index 0000000..e69de29 From 77b015b8450a103ad91b8754a454d86cd153873e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 25 Sep 2021 13:47:36 -0700 Subject: [PATCH 2/7] Update file --- py/openfisca-analysis.ipynb | 375 ++++++++++++++++++++++++++++++++++++ 1 file changed, 375 insertions(+) diff --git a/py/openfisca-analysis.ipynb b/py/openfisca-analysis.ipynb index e69de29..130faac 100644 --- a/py/openfisca-analysis.ipynb +++ b/py/openfisca-analysis.ipynb @@ -0,0 +1,375 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "source": [ + "from openfisca_us import Microsimulation\n", + "from openfisca_us.api import *\n", + "from openfisca_us.entities import *\n", + "from openfisca_us.tools.general import *\n", + "from openfisca_us import reforms\n", + "import numpy as np" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 2, + "source": [ + "# Calculate poverty rate\n", + "base = Microsimulation(year=2020)\n", + "base.calc(\"in_poverty\", map_to=\"person\").mean()" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.10159000907591269" + ] + }, + "metadata": {}, + "execution_count": 2 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 15, + "source": [ + "class basic_income(Variable):\n", + " value_type = float\n", + " entity = TaxUnit\n", + " definition_period = YEAR\n", + " label = \"Basic income\"\n", + "\n", + " def formula(tax_unit, period, parameters):\n", + " # Extract FPG parameter\n", + " fpg_params = parameters(period).poverty.fpg\n", + " # Includes first_person and additional_person\n", + " # Extract tax unit number of people\n", + " nb_people = tax_unit.nb_persons()\n", + " # Calculate FPG\n", + " fpg = fpg_params.first_person.contiguous_US + (nb_people - 1) * fpg_params.additional_person.contiguous_US\n", + " # Extract taxable income\n", + " taxable_income = tax_unit(\"taxable_income\", period)\n", + " # Calculate basic income phased out at 50%\n", + " return np.maximum(fpg - taxable_income * 0.5, 0)\n", + " # TODO: Make 50% a parameter" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 27, + "source": [ + "class taxable_income(Variable):\n", + " value_type = float\n", + " entity = TaxUnit\n", + " definition_period = YEAR" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 28, + "source": [ + "class SPM_unit_net_income(Variable):\n", + " value_type = float\n", + " entity = SPMUnit\n", + " label = u\"SPM unit net income\"\n", + " definition_period = YEAR\n", + "\n", + " def formula(spm_unit, period):\n", + " INCOME_COMPONENTS = [\n", + " \"SPM_unit_total_income\",\n", + " \"SPM_unit_SNAP\",\n", + " \"SPM_unit_capped_housing_subsidy\",\n", + " \"SPM_unit_school_lunch_subsidy\",\n", + " \"SPM_unit_energy_subsidy\",\n", + " \"SPM_unit_WIC\",\n", + " ]\n", + " EXPENSE_COMPONENTS = [\n", + " \"SPM_unit_FICA\",\n", + " \"SPM_unit_federal_tax\",\n", + " \"SPM_unit_state_tax\",\n", + " \"SPM_unit_capped_work_childcare_expenses\",\n", + " \"SPM_unit_medical_expenses\",\n", + " ]\n", + " income = add(spm_unit, period, *INCOME_COMPONENTS)\n", + " expense = add(spm_unit, period, *EXPENSE_COMPONENTS)\n", + " basic_income = sum_contained_tax_units(\"basic_income\", spm_unit, period)\n", + " return income - expense + basic_income" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 29, + "source": [ + "class reform(Reform):\n", + " def apply(self):\n", + " self.update_variable(SPM_unit_net_income)\n", + " self.add_variable(basic_income)\n", + " self.add_variable(taxable_income)\n", + "\n", + "# reform = reforms.restructure(SPM_unit_net_income), reforms.new_variable(basic_income)\n", + "reform_sim = Microsimulation(reform, year=2020)\n", + "from openfisca_us_data import RawCPS\n", + "taxable_income_values = RawCPS.load(2020, \"tax_unit\").TAX_INC.values\n", + "reform_sim.simulation.set_input(\"taxable_income\", 2020, taxable_income_values)" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 34, + "source": [ + "reform_sim.df([\"SPM_unit_net_income\", \"taxable_income\", \"basic_income\"])" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SPM_unit_net_incometaxable_incomebasic_incomeweight
090113.75000098944.00.01552.900024
162220.00000014589.05465.5990.489990
243478.00000024720.04880.01505.270020
327279.0605470.012760.01430.699951
489555.0000000.012760.01133.369995
...............
82193NaN0.021720.0NaN
82194NaN73783.00.0NaN
82195NaN0.026200.0NaN
82196NaN0.012760.0NaN
82197NaN102751.00.0NaN
\n", + "

82198 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " weight SPM_unit_net_income taxable_income basic_income\n", + "0 1552.900024 90113.750000 98944.0 0.0\n", + "1 990.489990 62220.000000 14589.0 5465.5\n", + "2 1505.270020 43478.000000 24720.0 4880.0\n", + "3 1430.699951 27279.060547 0.0 12760.0\n", + "4 1133.369995 89555.000000 0.0 12760.0\n", + "... ... ... ... ...\n", + "82193 NaN NaN 0.0 21720.0\n", + "82194 NaN NaN 73783.0 0.0\n", + "82195 NaN NaN 0.0 26200.0\n", + "82196 NaN NaN 0.0 12760.0\n", + "82197 NaN NaN 102751.0 0.0\n", + "\n", + "[82198 rows x 4 columns]" + ] + }, + "metadata": {}, + "execution_count": 34 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 33, + "source": [ + "gain = reform_sim.calc(\"SPM_unit_net_income\") - base.calc(\"SPM_unit_net_income\")\n", + "gain.groupby(base.calc(\"SPM_unit_net_income\").decile_rank()).mean()" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1.0 6950.139729\n", + "2.0 7377.274381\n", + "3.0 8676.671452\n", + "4.0 9226.481163\n", + "5.0 9980.518635\n", + "6.0 10343.661848\n", + "7.0 11180.844588\n", + "8.0 11710.768067\n", + "9.0 12154.836279\n", + "10.0 12263.114358\n", + "dtype: float64" + ] + }, + "metadata": {}, + "execution_count": 33 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 30, + "source": [ + "reform_sim.calc(\"SPM_unit_net_income\").mean() - base.calc(\"SPM_unit_net_income\").mean()" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "9986.52237030775" + ] + }, + "metadata": {}, + "execution_count": 30 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 31, + "source": [ + "reform_sim.calc(\"basic_income\").mean()" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "7837.700207688253" + ] + }, + "metadata": {}, + "execution_count": 31 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [], + "outputs": [], + "metadata": {} + } + ], + "metadata": { + "orig_nbformat": 4, + "language_info": { + "name": "python", + "version": "3.8.11", + "mimetype": "text/x-python", + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "pygments_lexer": "ipython3", + "nbconvert_exporter": "python", + "file_extension": ".py" + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3.8.11 64-bit ('base': conda)" + }, + "interpreter": { + "hash": "4a68920d8e8856d089b03c157a7384bba62e0986489c1fa381bbe538cda0922c" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file From c8a6a45fcc2fea57af3d015ca6d71a6ee48eff3f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 28 Sep 2021 12:07:31 -0700 Subject: [PATCH 3/7] Co-authored-by: Nikhil Woodruff --- py/openfisca-analysis.ipynb | 436 +++++++++++++++++++++++++++--------- 1 file changed, 332 insertions(+), 104 deletions(-) diff --git a/py/openfisca-analysis.ipynb b/py/openfisca-analysis.ipynb index 130faac..5e3c82d 100644 --- a/py/openfisca-analysis.ipynb +++ b/py/openfisca-analysis.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 14, "source": [ "from openfisca_us import Microsimulation\n", "from openfisca_us.api import *\n", @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 15, "source": [ "# Calculate poverty rate\n", "base = Microsimulation(year=2020)\n", @@ -31,14 +31,14 @@ ] }, "metadata": {}, - "execution_count": 2 + "execution_count": 15 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "source": [ "class basic_income(Variable):\n", " value_type = float\n", @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 17, "source": [ "class taxable_income(Variable):\n", " value_type = float\n", @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 18, "source": [ "class SPM_unit_net_income(Variable):\n", " value_type = float\n", @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 19, "source": [ "class reform(Reform):\n", " def apply(self):\n", @@ -130,9 +130,15 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 20, "source": [ - "reform_sim.df([\"SPM_unit_net_income\", \"taxable_income\", \"basic_income\"])" + "import pandas as pd\n", + "df = pd.DataFrame(dict(\n", + " net_income = reform_sim.calc(\"SPM_unit_net_income\", map_to=\"spm_unit\"),\n", + " total_income = reform_sim.calc(\"SPM_unit_total_income\", map_to=\"spm_unit\"),\n", + " taxable_income = reform_sim.calc(\"taxable_income\", map_to=\"spm_unit\"),\n", + " basic_income = reform_sim.calc(\"basic_income\", map_to=\"spm_unit\")))\n", + "df.corr()" ], "outputs": [ { @@ -157,121 +163,62 @@ " \n", " \n", " \n", - " SPM_unit_net_income\n", + " net_income\n", + " total_income\n", " taxable_income\n", " basic_income\n", - " weight\n", " \n", " \n", " \n", " \n", - " 0\n", - " 90113.750000\n", - " 98944.0\n", - " 0.0\n", - " 1552.900024\n", - " \n", - " \n", - " 1\n", - " 62220.000000\n", - " 14589.0\n", - " 5465.5\n", - " 990.489990\n", - " \n", - " \n", - " 2\n", - " 43478.000000\n", - " 24720.0\n", - " 4880.0\n", - " 1505.270020\n", - " \n", - " \n", - " 3\n", - " 27279.060547\n", - " 0.0\n", - " 12760.0\n", - " 1430.699951\n", - " \n", - " \n", - " 4\n", - " 89555.000000\n", - " 0.0\n", - " 12760.0\n", - " 1133.369995\n", - " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 82193\n", - " NaN\n", - " 0.0\n", - " 21720.0\n", - " NaN\n", + " net_income\n", + " 1.000000\n", + " 0.976896\n", + " -0.026355\n", + " 0.252275\n", " \n", " \n", - " 82194\n", - " NaN\n", - " 73783.0\n", - " 0.0\n", - " NaN\n", + " total_income\n", + " 0.976896\n", + " 1.000000\n", + " 0.014944\n", + " 0.101657\n", " \n", " \n", - " 82195\n", - " NaN\n", - " 0.0\n", - " 26200.0\n", - " NaN\n", - " \n", - " \n", - " 82196\n", - " NaN\n", - " 0.0\n", - " 12760.0\n", - " NaN\n", + " taxable_income\n", + " -0.026355\n", + " 0.014944\n", + " 1.000000\n", + " -0.350393\n", " \n", " \n", - " 82197\n", - " NaN\n", - " 102751.0\n", - " 0.0\n", - " NaN\n", + " basic_income\n", + " 0.252275\n", + " 0.101657\n", + " -0.350393\n", + " 1.000000\n", " \n", " \n", "\n", - "

82198 rows × 4 columns

\n", "" ], "text/plain": [ - " weight SPM_unit_net_income taxable_income basic_income\n", - "0 1552.900024 90113.750000 98944.0 0.0\n", - "1 990.489990 62220.000000 14589.0 5465.5\n", - "2 1505.270020 43478.000000 24720.0 4880.0\n", - "3 1430.699951 27279.060547 0.0 12760.0\n", - "4 1133.369995 89555.000000 0.0 12760.0\n", - "... ... ... ... ...\n", - "82193 NaN NaN 0.0 21720.0\n", - "82194 NaN NaN 73783.0 0.0\n", - "82195 NaN NaN 0.0 26200.0\n", - "82196 NaN NaN 0.0 12760.0\n", - "82197 NaN NaN 102751.0 0.0\n", - "\n", - "[82198 rows x 4 columns]" + " net_income total_income taxable_income basic_income\n", + "net_income 1.000000 0.976896 -0.026355 0.252275\n", + "total_income 0.976896 1.000000 0.014944 0.101657\n", + "taxable_income -0.026355 0.014944 1.000000 -0.350393\n", + "basic_income 0.252275 0.101657 -0.350393 1.000000" ] }, "metadata": {}, - "execution_count": 34 + "execution_count": 20 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 21, "source": [ "gain = reform_sim.calc(\"SPM_unit_net_income\") - base.calc(\"SPM_unit_net_income\")\n", "gain.groupby(base.calc(\"SPM_unit_net_income\").decile_rank()).mean()" @@ -295,14 +242,14 @@ ] }, "metadata": {}, - "execution_count": 33 + "execution_count": 21 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 22, "source": [ "reform_sim.calc(\"SPM_unit_net_income\").mean() - base.calc(\"SPM_unit_net_income\").mean()" ], @@ -315,14 +262,14 @@ ] }, "metadata": {}, - "execution_count": 30 + "execution_count": 22 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 23, "source": [ "reform_sim.calc(\"basic_income\").mean()" ], @@ -335,17 +282,298 @@ ] }, "metadata": {}, - "execution_count": 31 + "execution_count": 23 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 27, + "source": [ + "reform_income = pd.Series(reform_sim.calc(\"SPM_unit_net_income\").values, index=reform_sim.calc(\"spm_unit_id\").values)" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 43, + "source": [ + "SPM_unit_UBI = reform_sim.calc(\"basic_income\", map_to=\"person\")" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 52, + "source": [ + "spm_unit_size = reform_sim.simulation.populations[\"spm_unit\"].project(\n", + " reform_sim.simulation.populations[\"spm_unit\"].nb_persons()\n", + ")" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 54, + "source": [ + "spm_unit_size.size" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "157959" + ] + }, + "metadata": {}, + "execution_count": 54 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": null, - "source": [], + "execution_count": 55, + "source": [ + "SPM_unit_UBI /= spm_unit_size" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 57, + "source": [ + "SPM_unit_UBI.groupby(reform_sim.calc(\"person_spm_unit_id\").values).sum()" + ], + "outputs": [ + { + "output_type": "error", + "ename": "KeyboardInterrupt", + "evalue": "", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mSPM_unit_UBI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreform_sim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"person_spm_unit_id\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36m_weighted_agg_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 424\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 425\u001b[0m ):\n\u001b[0;32m--> 426\u001b[0;31m result = df.agg(\n\u001b[0m\u001b[1;32m 427\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mrow\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mvia_micro_series\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 428\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36maggregate\u001b[0;34m(self, func, axis, *args, **kwargs)\u001b[0m\n\u001b[1;32m 8544\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8545\u001b[0m \u001b[0mop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mframe_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 8546\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8547\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8548\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrelabeling\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36magg\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 693\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 694\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0maxis\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 695\u001b[0;31m result = FrameRowApply(\n\u001b[0m\u001b[1;32m 696\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 697\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0morig_f\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36magg\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 707\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 708\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0morig_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 709\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 710\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, func, axis, raw, result_type, args, **kwargs)\u001b[0m\n\u001b[1;32m 8734\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8735\u001b[0m )\n\u001b[0;32m-> 8736\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8737\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8738\u001b[0m def applymap(\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 686\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_raw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 687\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 688\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_standard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 689\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 690\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0magg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 803\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 804\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_standard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 805\u001b[0;31m \u001b[0mresults\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mres_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_series_generator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 806\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 807\u001b[0m \u001b[0;31m# wrap results\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply_series_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 819\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseries_gen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0;31m# ignore SettingWithCopy here in case the user mutates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 821\u001b[0;31m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 822\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mABCSeries\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 823\u001b[0m \u001b[0;31m# If we have a view on v, we need to make a copy because\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(row)\u001b[0m\n\u001b[1;32m 425\u001b[0m ):\n\u001b[1;32m 426\u001b[0m result = df.agg(\n\u001b[0;32m--> 427\u001b[0;31m \u001b[0;32mlambda\u001b[0m \u001b[0mrow\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mvia_micro_series\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 428\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m )\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36mvia_micro_series\u001b[0;34m(row, *args, **kwargs)\u001b[0m\n\u001b[1;32m 407\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_weighted_agg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mvia_micro_series\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 409\u001b[0;31m return getattr(MicroSeries(row.a, weights=row.w), name)(\n\u001b[0m\u001b[1;32m 410\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 411\u001b[0m )\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, weights, *args, **kwargs)\u001b[0m\n\u001b[1;32m 16\u001b[0m \"\"\"\n\u001b[1;32m 17\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_weights\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweights\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mweighted_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36mset_weights\u001b[0;34m(self, weights)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mweights\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mones_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mweights\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweights\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mvector_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/series.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, index, dtype, name, copy, fastpath)\u001b[0m\n\u001b[1;32m 437\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 438\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 439\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msanitize_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 441\u001b[0m \u001b[0mmanager\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_option\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"mode.data_manager\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/construction.py\u001b[0m in \u001b[0;36msanitize_array\u001b[0;34m(data, index, dtype, copy, raise_cast_failure, allow_2d)\u001b[0m\n\u001b[1;32m 509\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 511\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_list_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 512\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 513\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"index must be specified when data is not list-like\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 71, + "source": [ + "basic_income = reform_sim.map_to(reform_sim.calc(\"basic_income\", map_to=\"person\", how=\"mean\"), \"person\", \"spm_unit\")" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 73, + "source": [ + "taxable_income = reform_sim.map_to(reform_sim.calc(\"taxable_income\", map_to=\"person\", how=\"mean\"), \"person\", \"spm_unit\")" + ], "outputs": [], "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 75, + "source": [ + "pd.concat([\n", + " pd.DataFrame(dict(basic_income=basic_income, taxable_income=taxable_income)),\n", + " reform_sim.df([\"spm_unit_id\", \"in_poverty\"]),\n", + "], axis=1)" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
basic_incometaxable_incomespm_unit_idin_poverty
00.098944.01001.0False
14880.024720.02001.0False
212760.00.03001.0False
318225.514589.04001.0False
442760.00.05001.0False
...............
6308712760.00.091497000.0False
630880.037600.091498008.0False
6308910310.04900.091498008.0True
630900.028700.091499000.0False
6309117240.00.091500000.0False
\n", + "

63092 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " basic_income taxable_income spm_unit_id in_poverty\n", + "0 0.0 98944.0 1001.0 False\n", + "1 4880.0 24720.0 2001.0 False\n", + "2 12760.0 0.0 3001.0 False\n", + "3 18225.5 14589.0 4001.0 False\n", + "4 42760.0 0.0 5001.0 False\n", + "... ... ... ... ...\n", + "63087 12760.0 0.0 91497000.0 False\n", + "63088 0.0 37600.0 91498008.0 False\n", + "63089 10310.0 4900.0 91498008.0 True\n", + "63090 0.0 28700.0 91499000.0 False\n", + "63091 17240.0 0.0 91500000.0 False\n", + "\n", + "[63092 rows x 4 columns]" + ] + }, + "metadata": {}, + "execution_count": 75 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 70, + "source": [ + "reform_sim.calc(\"spm_unit_id\")" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " value weight\n", + "0 1001.0 1552.900024\n", + "1 2001.0 990.489990\n", + "2 3001.0 1505.270020\n", + "3 4001.0 1430.699951\n", + "4 5001.0 1133.369995\n", + "... ... ...\n", + "63087 91497000.0 486.019989\n", + "63088 91498008.0 444.179993\n", + "63089 91498008.0 388.290009\n", + "63090 91499000.0 494.049988\n", + "63091 91500000.0 423.839996\n", + "\n", + "[63092 rows x 2 columns]" + ] + }, + "metadata": {}, + "execution_count": 70 + } + ], + "metadata": {} } ], "metadata": { From 6a7ac78676bd97cb0cbdf5b195087e1447dcbbdb Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 28 Sep 2021 14:04:36 -0700 Subject: [PATCH 4/7] last changes --- py/openfisca-analysis.ipynb | 40 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/py/openfisca-analysis.ipynb b/py/openfisca-analysis.ipynb index 5e3c82d..99c8949 100644 --- a/py/openfisca-analysis.ipynb +++ b/py/openfisca-analysis.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 14, + "execution_count": 1, "source": [ "from openfisca_us import Microsimulation\n", "from openfisca_us.api import *\n", @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "source": [ "# Calculate poverty rate\n", "base = Microsimulation(year=2020)\n", @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "source": [ "class basic_income(Variable):\n", " value_type = float\n", @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "source": [ "class taxable_income(Variable):\n", " value_type = float\n", @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "source": [ "class SPM_unit_net_income(Variable):\n", " value_type = float\n", @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "source": [ "class reform(Reform):\n", " def apply(self):\n", @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "source": [ "import pandas as pd\n", "df = pd.DataFrame(dict(\n", @@ -218,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "source": [ "gain = reform_sim.calc(\"SPM_unit_net_income\") - base.calc(\"SPM_unit_net_income\")\n", "gain.groupby(base.calc(\"SPM_unit_net_income\").decile_rank()).mean()" @@ -249,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "source": [ "reform_sim.calc(\"SPM_unit_net_income\").mean() - base.calc(\"SPM_unit_net_income\").mean()" ], @@ -269,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "source": [ "reform_sim.calc(\"basic_income\").mean()" ], @@ -289,7 +289,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "source": [ "reform_income = pd.Series(reform_sim.calc(\"SPM_unit_net_income\").values, index=reform_sim.calc(\"spm_unit_id\").values)" ], @@ -298,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "source": [ "SPM_unit_UBI = reform_sim.calc(\"basic_income\", map_to=\"person\")" ], @@ -307,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "source": [ "spm_unit_size = reform_sim.simulation.populations[\"spm_unit\"].project(\n", " reform_sim.simulation.populations[\"spm_unit\"].nb_persons()\n", @@ -318,7 +318,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "source": [ "spm_unit_size.size" ], @@ -338,7 +338,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": null, "source": [ "SPM_unit_UBI /= spm_unit_size" ], @@ -347,7 +347,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "source": [ "SPM_unit_UBI.groupby(reform_sim.calc(\"person_spm_unit_id\").values).sum()" ], @@ -382,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "source": [ "basic_income = reform_sim.map_to(reform_sim.calc(\"basic_income\", map_to=\"person\", how=\"mean\"), \"person\", \"spm_unit\")" ], @@ -391,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "source": [ "taxable_income = reform_sim.map_to(reform_sim.calc(\"taxable_income\", map_to=\"person\", how=\"mean\"), \"person\", \"spm_unit\")" ], @@ -400,7 +400,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "source": [ "pd.concat([\n", " pd.DataFrame(dict(basic_income=basic_income, taxable_income=taxable_income)),\n", @@ -544,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "source": [ "reform_sim.calc(\"spm_unit_id\")" ], From b4331f26a30861794d51a51af0d3d78c5b7e11ea Mon Sep 17 00:00:00 2001 From: Nikhil Date: Tue, 28 Sep 2021 23:43:31 +0100 Subject: [PATCH 5/7] Add changes --- py/openfisca-analysis.ipynb | 497 ++++-------------------------------- 1 file changed, 48 insertions(+), 449 deletions(-) diff --git a/py/openfisca-analysis.ipynb b/py/openfisca-analysis.ipynb index 99c8949..9f99b07 100644 --- a/py/openfisca-analysis.ipynb +++ b/py/openfisca-analysis.ipynb @@ -4,42 +4,43 @@ "cell_type": "code", "execution_count": 1, "source": [ - "from openfisca_us import Microsimulation\n", + "from openfisca_us import Microsimulation, reforms\n", "from openfisca_us.api import *\n", - "from openfisca_us.entities import *\n", - "from openfisca_us.tools.general import *\n", - "from openfisca_us import reforms\n", - "import numpy as np" + "import numpy as np\n", + "import pandas as pd" ], "outputs": [], "metadata": {} }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "source": [ "# Calculate poverty rate\n", - "base = Microsimulation(year=2020)\n", - "base.calc(\"in_poverty\", map_to=\"person\").mean()" + "baseline = Microsimulation(year=2020)\n", + "baseline.calc(\"in_poverty\", map_to=\"person\").mean()" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "0.10159000907591269" + "0.11652875394831709" ] }, "metadata": {}, - "execution_count": 15 + "execution_count": 2 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "source": [ + "from openfisca_us.entities import *\n", + "\n", + "\n", "class basic_income(Variable):\n", " value_type = float\n", " entity = TaxUnit\n", @@ -53,7 +54,10 @@ " # Extract tax unit number of people\n", " nb_people = tax_unit.nb_persons()\n", " # Calculate FPG\n", - " fpg = fpg_params.first_person.contiguous_US + (nb_people - 1) * fpg_params.additional_person.contiguous_US\n", + " fpg = (\n", + " fpg_params.first_person.contiguous_US\n", + " + (nb_people - 1) * fpg_params.additional_person.contiguous_US\n", + " )\n", " # Extract taxable income\n", " taxable_income = tax_unit(\"taxable_income\", period)\n", " # Calculate basic income phased out at 50%\n", @@ -65,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "source": [ "class taxable_income(Variable):\n", " value_type = float\n", @@ -77,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "source": [ "class SPM_unit_net_income(Variable):\n", " value_type = float\n", @@ -103,7 +107,9 @@ " ]\n", " income = add(spm_unit, period, *INCOME_COMPONENTS)\n", " expense = add(spm_unit, period, *EXPENSE_COMPONENTS)\n", - " basic_income = sum_contained_tax_units(\"basic_income\", spm_unit, period)\n", + " basic_income = sum_contained_tax_units(\n", + " \"basic_income\", spm_unit, period\n", + " )\n", " return income - expense + basic_income" ], "outputs": [], @@ -111,17 +117,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "source": [ - "class reform(Reform):\n", - " def apply(self):\n", - " self.update_variable(SPM_unit_net_income)\n", - " self.add_variable(basic_income)\n", - " self.add_variable(taxable_income)\n", - "\n", - "# reform = reforms.restructure(SPM_unit_net_income), reforms.new_variable(basic_income)\n", + "reform = (\n", + " reforms.restructure(SPM_unit_net_income),\n", + " reforms.new_variable(basic_income),\n", + " reforms.new_variable(taxable_income),\n", + ")\n", "reform_sim = Microsimulation(reform, year=2020)\n", "from openfisca_us_data import RawCPS\n", + "\n", "taxable_income_values = RawCPS.load(2020, \"tax_unit\").TAX_INC.values\n", "reform_sim.simulation.set_input(\"taxable_income\", 2020, taxable_income_values)" ], @@ -130,187 +135,10 @@ }, { "cell_type": "code", - "execution_count": null, - "source": [ - "import pandas as pd\n", - "df = pd.DataFrame(dict(\n", - " net_income = reform_sim.calc(\"SPM_unit_net_income\", map_to=\"spm_unit\"),\n", - " total_income = reform_sim.calc(\"SPM_unit_total_income\", map_to=\"spm_unit\"),\n", - " taxable_income = reform_sim.calc(\"taxable_income\", map_to=\"spm_unit\"),\n", - " basic_income = reform_sim.calc(\"basic_income\", map_to=\"spm_unit\")))\n", - "df.corr()" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
net_incometotal_incometaxable_incomebasic_income
net_income1.0000000.976896-0.0263550.252275
total_income0.9768961.0000000.0149440.101657
taxable_income-0.0263550.0149441.000000-0.350393
basic_income0.2522750.101657-0.3503931.000000
\n", - "
" - ], - "text/plain": [ - " net_income total_income taxable_income basic_income\n", - "net_income 1.000000 0.976896 -0.026355 0.252275\n", - "total_income 0.976896 1.000000 0.014944 0.101657\n", - "taxable_income -0.026355 0.014944 1.000000 -0.350393\n", - "basic_income 0.252275 0.101657 -0.350393 1.000000" - ] - }, - "metadata": {}, - "execution_count": 20 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "gain = reform_sim.calc(\"SPM_unit_net_income\") - base.calc(\"SPM_unit_net_income\")\n", - "gain.groupby(base.calc(\"SPM_unit_net_income\").decile_rank()).mean()" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "1.0 6950.139729\n", - "2.0 7377.274381\n", - "3.0 8676.671452\n", - "4.0 9226.481163\n", - "5.0 9980.518635\n", - "6.0 10343.661848\n", - "7.0 11180.844588\n", - "8.0 11710.768067\n", - "9.0 12154.836279\n", - "10.0 12263.114358\n", - "dtype: float64" - ] - }, - "metadata": {}, - "execution_count": 21 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "reform_sim.calc(\"SPM_unit_net_income\").mean() - base.calc(\"SPM_unit_net_income\").mean()" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "9986.52237030775" - ] - }, - "metadata": {}, - "execution_count": 22 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "reform_sim.calc(\"basic_income\").mean()" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "7837.700207688253" - ] - }, - "metadata": {}, - "execution_count": 23 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 15, "source": [ - "reform_income = pd.Series(reform_sim.calc(\"SPM_unit_net_income\").values, index=reform_sim.calc(\"spm_unit_id\").values)" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "SPM_unit_UBI = reform_sim.calc(\"basic_income\", map_to=\"person\")" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "spm_unit_size = reform_sim.simulation.populations[\"spm_unit\"].project(\n", - " reform_sim.simulation.populations[\"spm_unit\"].nb_persons()\n", + "df = reform_sim.df(\n", + " [\"SPM_unit_net_income\", \"taxable_income\", \"in_poverty\", \"basic_income\"]\n", ")" ], "outputs": [], @@ -318,259 +146,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "source": [ - "spm_unit_size.size" + "df.basic_income.groupby(df.taxable_income.decile_rank()).mean()" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "157959" - ] - }, - "metadata": {}, - "execution_count": 54 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "SPM_unit_UBI /= spm_unit_size" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "SPM_unit_UBI.groupby(reform_sim.calc(\"person_spm_unit_id\").values).sum()" - ], - "outputs": [ - { - "output_type": "error", - "ename": "KeyboardInterrupt", - "evalue": "", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mSPM_unit_UBI\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreform_sim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"person_spm_unit_id\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36m_weighted_agg_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 424\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 425\u001b[0m ):\n\u001b[0;32m--> 426\u001b[0;31m result = df.agg(\n\u001b[0m\u001b[1;32m 427\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mrow\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mvia_micro_series\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 428\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36maggregate\u001b[0;34m(self, func, axis, *args, **kwargs)\u001b[0m\n\u001b[1;32m 8544\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8545\u001b[0m \u001b[0mop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mframe_apply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 8546\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8547\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8548\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrelabeling\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36magg\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 693\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 694\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0maxis\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 695\u001b[0;31m result = FrameRowApply(\n\u001b[0m\u001b[1;32m 696\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 697\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0morig_f\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36magg\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 707\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 708\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0morig_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 709\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 710\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, func, axis, raw, result_type, args, **kwargs)\u001b[0m\n\u001b[1;32m 8734\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8735\u001b[0m )\n\u001b[0;32m-> 8736\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8737\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8738\u001b[0m def applymap(\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 686\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_raw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 687\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 688\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_standard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 689\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 690\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0magg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 803\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 804\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_standard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 805\u001b[0;31m \u001b[0mresults\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mres_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_series_generator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 806\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 807\u001b[0m \u001b[0;31m# wrap results\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/apply.py\u001b[0m in \u001b[0;36mapply_series_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 819\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseries_gen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0;31m# ignore SettingWithCopy here in case the user mutates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 821\u001b[0;31m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 822\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mABCSeries\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 823\u001b[0m \u001b[0;31m# If we have a view on v, we need to make a copy because\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(row)\u001b[0m\n\u001b[1;32m 425\u001b[0m ):\n\u001b[1;32m 426\u001b[0m result = df.agg(\n\u001b[0;32m--> 427\u001b[0;31m \u001b[0;32mlambda\u001b[0m \u001b[0mrow\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mvia_micro_series\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 428\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 429\u001b[0m )\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36mvia_micro_series\u001b[0;34m(row, *args, **kwargs)\u001b[0m\n\u001b[1;32m 407\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_weighted_agg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mvia_micro_series\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 409\u001b[0;31m return getattr(MicroSeries(row.a, weights=row.w), name)(\n\u001b[0m\u001b[1;32m 410\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 411\u001b[0m )\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, weights, *args, **kwargs)\u001b[0m\n\u001b[1;32m 16\u001b[0m \"\"\"\n\u001b[1;32m 17\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_weights\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweights\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mweighted_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/microdf/generic.py\u001b[0m in \u001b[0;36mset_weights\u001b[0;34m(self, weights)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mweights\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mones_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mweights\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweights\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mvector_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/series.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, index, dtype, name, copy, fastpath)\u001b[0m\n\u001b[1;32m 437\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 438\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 439\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msanitize_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 441\u001b[0m \u001b[0mmanager\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_option\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"mode.data_manager\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/pandas/core/construction.py\u001b[0m in \u001b[0;36msanitize_array\u001b[0;34m(data, index, dtype, copy, raise_cast_failure, allow_2d)\u001b[0m\n\u001b[1;32m 509\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 511\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_list_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 512\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 513\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"index must be specified when data is not list-like\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "basic_income = reform_sim.map_to(reform_sim.calc(\"basic_income\", map_to=\"person\", how=\"mean\"), \"person\", \"spm_unit\")" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "taxable_income = reform_sim.map_to(reform_sim.calc(\"taxable_income\", map_to=\"person\", how=\"mean\"), \"person\", \"spm_unit\")" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "pd.concat([\n", - " pd.DataFrame(dict(basic_income=basic_income, taxable_income=taxable_income)),\n", - " reform_sim.df([\"spm_unit_id\", \"in_poverty\"]),\n", - "], axis=1)" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
basic_incometaxable_incomespm_unit_idin_poverty
00.098944.01001.0False
14880.024720.02001.0False
212760.00.03001.0False
318225.514589.04001.0False
442760.00.05001.0False
...............
6308712760.00.091497000.0False
630880.037600.091498008.0False
6308910310.04900.091498008.0True
630900.028700.091499000.0False
6309117240.00.091500000.0False
\n", - "

63092 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " basic_income taxable_income spm_unit_id in_poverty\n", - "0 0.0 98944.0 1001.0 False\n", - "1 4880.0 24720.0 2001.0 False\n", - "2 12760.0 0.0 3001.0 False\n", - "3 18225.5 14589.0 4001.0 False\n", - "4 42760.0 0.0 5001.0 False\n", - "... ... ... ... ...\n", - "63087 12760.0 0.0 91497000.0 False\n", - "63088 0.0 37600.0 91498008.0 False\n", - "63089 10310.0 4900.0 91498008.0 True\n", - "63090 0.0 28700.0 91499000.0 False\n", - "63091 17240.0 0.0 91500000.0 False\n", - "\n", - "[63092 rows x 4 columns]" - ] - }, - "metadata": {}, - "execution_count": 75 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "reform_sim.calc(\"spm_unit_id\")" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " value weight\n", - "0 1001.0 1552.900024\n", - "1 2001.0 990.489990\n", - "2 3001.0 1505.270020\n", - "3 4001.0 1430.699951\n", - "4 5001.0 1133.369995\n", - "... ... ...\n", - "63087 91497000.0 486.019989\n", - "63088 91498008.0 444.179993\n", - "63089 91498008.0 388.290009\n", - "63090 91499000.0 494.049988\n", - "63091 91500000.0 423.839996\n", - "\n", - "[63092 rows x 2 columns]" + "1.0 17615.118505\n", + "2.0 18213.645279\n", + "3.0 17982.893939\n", + "4.0 12921.723542\n", + "5.0 7550.313452\n", + "6.0 4565.691330\n", + "7.0 3264.406229\n", + "8.0 2298.077669\n", + "9.0 1967.494285\n", + "10.0 1499.863151\n", + "dtype: float64" ] }, "metadata": {}, - "execution_count": 70 + "execution_count": 20 } ], "metadata": {} @@ -580,7 +179,7 @@ "orig_nbformat": 4, "language_info": { "name": "python", - "version": "3.8.11", + "version": "3.8.8", "mimetype": "text/x-python", "codemirror_mode": { "name": "ipython", @@ -592,10 +191,10 @@ }, "kernelspec": { "name": "python3", - "display_name": "Python 3.8.11 64-bit ('base': conda)" + "display_name": "Python 3.8.8 64-bit ('base': conda)" }, "interpreter": { - "hash": "4a68920d8e8856d089b03c157a7384bba62e0986489c1fa381bbe538cda0922c" + "hash": "d8fe82497dc3af1dafdfcaf67c3f347e622d9ec55d37e96a4812404db83e4772" } }, "nbformat": 4, From 19b69ff98a15f0ff63770092ef6fa43639377f61 Mon Sep 17 00:00:00 2001 From: Nikhil Date: Tue, 28 Sep 2021 23:43:41 +0100 Subject: [PATCH 6/7] Add results --- py/openfisca-analysis.ipynb | 41 +++++++++---------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/py/openfisca-analysis.ipynb b/py/openfisca-analysis.ipynb index 9f99b07..b61f33a 100644 --- a/py/openfisca-analysis.ipynb +++ b/py/openfisca-analysis.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 21, "source": [ "from openfisca_us import Microsimulation, reforms\n", "from openfisca_us.api import *\n", @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 22, "source": [ "# Calculate poverty rate\n", "baseline = Microsimulation(year=2020)\n", @@ -29,14 +29,14 @@ ] }, "metadata": {}, - "execution_count": 2 + "execution_count": 22 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 23, "source": [ "from openfisca_us.entities import *\n", "\n", @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 24, "source": [ "class taxable_income(Variable):\n", " value_type = float\n", @@ -81,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 25, "source": [ "class SPM_unit_net_income(Variable):\n", " value_type = float\n", @@ -117,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 26, "source": [ "reform = (\n", " reforms.restructure(SPM_unit_net_income),\n", @@ -135,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "source": [ "df = reform_sim.df(\n", " [\"SPM_unit_net_income\", \"taxable_income\", \"in_poverty\", \"basic_income\"]\n", @@ -146,32 +146,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "source": [ "df.basic_income.groupby(df.taxable_income.decile_rank()).mean()" ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "1.0 17615.118505\n", - "2.0 18213.645279\n", - "3.0 17982.893939\n", - "4.0 12921.723542\n", - "5.0 7550.313452\n", - "6.0 4565.691330\n", - "7.0 3264.406229\n", - "8.0 2298.077669\n", - "9.0 1967.494285\n", - "10.0 1499.863151\n", - "dtype: float64" - ] - }, - "metadata": {}, - "execution_count": 20 - } - ], + "outputs": [], "metadata": {} } ], From f6bb55d2b3882a25c7399543222cc762b6f5cf33 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 29 Sep 2021 10:19:13 -0700 Subject: [PATCH 7/7] Update and fix --- py/openfisca-analysis.ipynb | 41 ++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/py/openfisca-analysis.ipynb b/py/openfisca-analysis.ipynb index b61f33a..2b56530 100644 --- a/py/openfisca-analysis.ipynb +++ b/py/openfisca-analysis.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 21, + "execution_count": 1, "source": [ "from openfisca_us import Microsimulation, reforms\n", "from openfisca_us.api import *\n", @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 2, "source": [ "# Calculate poverty rate\n", "baseline = Microsimulation(year=2020)\n", @@ -29,14 +29,14 @@ ] }, "metadata": {}, - "execution_count": 22 + "execution_count": 2 } ], "metadata": {} }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 3, "source": [ "from openfisca_us.entities import *\n", "\n", @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 4, "source": [ "class taxable_income(Variable):\n", " value_type = float\n", @@ -81,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 5, "source": [ "class SPM_unit_net_income(Variable):\n", " value_type = float\n", @@ -117,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 6, "source": [ "reform = (\n", " reforms.restructure(SPM_unit_net_income),\n", @@ -135,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "source": [ "df = reform_sim.df(\n", " [\"SPM_unit_net_income\", \"taxable_income\", \"in_poverty\", \"basic_income\"]\n", @@ -146,11 +146,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "source": [ "df.basic_income.groupby(df.taxable_income.decile_rank()).mean()" ], - "outputs": [], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1.0 17615.118505\n", + "2.0 18213.645279\n", + "3.0 17982.893939\n", + "4.0 12921.723542\n", + "5.0 7550.313452\n", + "6.0 4565.691330\n", + "7.0 3264.406229\n", + "8.0 2298.077669\n", + "9.0 1967.494285\n", + "10.0 1499.863151\n", + "dtype: float64" + ] + }, + "metadata": {}, + "execution_count": 8 + } + ], "metadata": {} } ],