{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from paramtools import Parameters\n", "\n", "class TaxParams(Parameters):\n", " defaults = {\n", " \"schema\": {\n", " \"labels\": {\n", " \"year\": {\n", " \"type\": \"int\",\n", " \"validators\": {\"range\": {\"min\": 2013, \"max\": 2027}}\n", " },\n", " \"marital_status\": {\n", " \"type\": \"str\",\n", " \"validators\": {\"choice\": {\"choices\": [\"single\", \"joint\"]}}\n", " },\n", " },\n", " \"additional_members\": {\n", " \"cpi_inflatable\": {\"type\": \"bool\", \"number_dims\": 0},\n", " \"cpi_inflated\": {\"type\": \"bool\", \"number_dims\": 0}\n", " }\n", " },\n", " \"standard_deduction\": {\n", " \"title\": \"Standard deduction amount\",\n", " \"description\": \"Amount filing unit can use as a standard deduction.\",\n", " \"cpi_inflatable\": True,\n", " \"cpi_inflated\": True,\n", " \"type\": \"float\",\n", " \"value\": [\n", " {\"year\": 2024, \"marital_status\": \"single\", \"value\": 13673.68},\n", " {\"year\": 2024, \"marital_status\": \"joint\", \"value\": 27347.36},\n", " {\"year\": 2025, \"marital_status\": \"single\", \"value\": 13967.66},\n", " {\"year\": 2025, \"marital_status\": \"joint\", \"value\": 27935.33},\n", " {\"year\": 2026, \"marital_status\": \"single\", \"value\": 7690.0},\n", " {\"year\": 2026, \"marital_status\": \"joint\", \"value\": 15380.0}],\n", " \"validators\": {\n", " \"range\": {\n", " \"min\": 0,\n", " \"max\": 9e+99\n", " }\n", " }\n", " },\n", " }\n", "\n", "params = TaxParams(\n", " initial_state={\"year\": [2024, 2025, 2026]},\n", " array_first=True\n", ")\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'year': [2024, 2025, 2026]}" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params.view_state()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[13673.68, 27347.36],\n", " [13967.66, 27935.33],\n", " [ 7690. , 15380. ]])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params.standard_deduction" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'year': 2024, 'marital_status': 'single', 'value': 13673.68},\n", " {'year': 2024, 'marital_status': 'joint', 'value': 27347.36},\n", " {'year': 2025, 'marital_status': 'single', 'value': 13967.66},\n", " {'year': 2025, 'marital_status': 'joint', 'value': 27935.33},\n", " {'year': 2026, 'marital_status': 'single', 'value': 7690.0},\n", " {'year': 2026, 'marital_status': 'joint', 'value': 15380.0}]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params.from_array(\"standard_deduction\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('standard_deduction',\n", " [OrderedDict([('marital_status', 'single'),\n", " ('year', 2026),\n", " ('value', 7690.0)])])])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# query parameters\n", "params.specification(year=2026, marital_status=\"single\", use_state=False)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[13673.68, 27347.36],\n", " [13967.66, 27935.33],\n", " [10000. , 15380. ]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adjustment = {\n", " \"standard_deduction\": [\n", " {\"year\": 2026, \"marital_status\": \"single\", \"value\": 10000.0}\n", " ],\n", "}\n", "params.adjust(adjustment)\n", "params.standard_deduction\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 0.],\n", " [0., 0.],\n", " [0., 0.]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adjustment = {\n", " \"standard_deduction\": 0,\n", "}\n", "params.adjust(adjustment)\n", "params.standard_deduction\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "ename": "ValidationError", "evalue": "{\n \"standard_deduction\": [\n \"Not a valid number: higher.\"\n ]\n}", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValidationError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0madjustment\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"standard_deduction\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"higher\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mparams\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madjust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madjustment\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~/Documents/ParamTools/paramtools/parameters.py\u001b[0m in \u001b[0;36madjust\u001b[0;34m(self, params_or_path, raise_errors, extend_adj)\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mraise_errors\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_errors\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 185\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidation_error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 186\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel_to_extend\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mextend_adj\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValidationError\u001b[0m: {\n \"standard_deduction\": [\n \"Not a valid number: higher.\"\n ]\n}" ] } ], "source": [ "adjustment[\"standard_deduction\"] = \"higher\"\n", "params.adjust(adjustment)\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "ename": "ValidationError", "evalue": "{\n \"standard_deduction\": [\n \"standard_deduction[marital_status=single, year=2025] -1.0 < min 0 \"\n ]\n}", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValidationError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0madjustment\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"standard_deduction\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"marital_status\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"single\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"year\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2025\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"value\"\u001b[0m\u001b[0;34m:\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[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mparams\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madjust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madjustment\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~/Documents/ParamTools/paramtools/parameters.py\u001b[0m in \u001b[0;36madjust\u001b[0;34m(self, params_or_path, raise_errors, extend_adj)\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mraise_errors\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_errors\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 185\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidation_error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 186\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel_to_extend\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mextend_adj\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValidationError\u001b[0m: {\n \"standard_deduction\": [\n \"standard_deduction[marital_status=single, year=2025] -1.0 < min 0 \"\n ]\n}" ] } ], "source": [ "adjustment[\"standard_deduction\"] = [{\"marital_status\": \"single\", \"year\": 2025, \"value\": -1}]\n", "params.adjust(adjustment)\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "defaults = {\n", " \"schema\": {\n", " \"labels\": {\n", " \"year\": {\n", " \"type\": \"int\",\n", " \"validators\": {\"range\": {\"min\": 2013, \"max\": 2027}}\n", " },\n", " \"marital_status\": {\n", " \"type\": \"str\",\n", " \"validators\": {\"choice\": {\"choices\": [\"single\", \"joint\", \"separate\",\n", " \"headhousehold\", \"widow\"]}}\n", " },\n", " },\n", " \"additional_members\": {\n", " \"cpi_inflatable\": {\"type\": \"bool\"},\n", " \"cpi_inflated\": {\"type\": \"bool\"}\n", " }\n", " },\n", " \"personal_exemption\": {\n", " \"title\": \"Personal Exemption\",\n", " \"description\": \"A simple version of the personal exemption.\",\n", " \"notes\": \"\",\n", " \"cpi_inflatable\": True,\n", " \"cpi_inflated\": True,\n", " \"type\": \"float\",\n", " \"value\": 0,\n", " \"validators\": {\n", " \"range\": {\n", " \"min\": 0,\n", " }\n", " }\n", " },\n", " \"standard_deduction\": {\n", " \"title\": \"Standard deduction amount\",\n", " \"description\": \"Amount filing unit can use as a standard deduction.\",\n", " \"cpi_inflatable\": True,\n", " \"cpi_inflated\": True,\n", " \"type\": \"float\",\n", " \"value\": [\n", " {\"year\": 2024, \"marital_status\": \"single\", \"value\": 13673.68},\n", " {\"year\": 2024, \"marital_status\": \"joint\", \"value\": 27347.36},\n", " {\"year\": 2024, \"marital_status\": \"separate\", \"value\": 13673.68},\n", " {\"year\": 2024, \"marital_status\": \"headhousehold\", \"value\": 20510.52},\n", " {\"year\": 2024, \"marital_status\": \"widow\", \"value\": 27347.36},\n", " {\"year\": 2025, \"marital_status\": \"single\", \"value\": 13967.66},\n", " {\"year\": 2025, \"marital_status\": \"joint\", \"value\": 27935.33},\n", " {\"year\": 2025, \"marital_status\": \"separate\", \"value\": 13967.66},\n", " {\"year\": 2025, \"marital_status\": \"headhousehold\", \"value\": 20951.49},\n", " {\"year\": 2025, \"marital_status\": \"widow\", \"value\": 27935.33}],\n", " \"validators\": {\n", " \"range\": {\n", " \"min\": 0,\n", " \"max\": 9e+99\n", " }\n", " }\n", " },\n", "}\n", "\n", "class Params(Parameters):\n", " defaults = defaults" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "params = Params()\n", "\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[OrderedDict([('value', 0.0)])]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "params.personal_exemption" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }