Skip to content

Commit 97565ef

Browse files
Merge pull request #83 from PolicyEngine/updates
Add full household outputs
2 parents 41ae280 + fa7c575 commit 97565ef

30 files changed

+9257
-91
lines changed

.github/workflows/versioning.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ name: Versioning updates
44
on:
55
push:
66
branches:
7-
- main
7+
- main
88

99
paths:
10-
- changelog_entry.yaml
10+
- changelog_entry.yaml
11+
- "!pyproject.toml"
1112

1213
jobs:
1314
Versioning:

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ all: build
33
documentation:
44
jb clean docs
55
jb build docs
6+
python docs/add_plotly_to_book.py docs/
67

78
install:
89
pip install -e .[dev]

changelog_entry.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- bump: minor
2+
changes:
3+
added:
4+
- Chart generation for macro charts.

docs/_toc.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@ parts:
44
- caption: Reference
55
chapters:
66
- file: reference/simulation
7+
- file: reference/calculate_single_household
8+
- file: reference/calculate_household_comparison
9+
- file: reference/calculate_single_economy
10+
- file: reference/calculate_economy_comparison
11+
- file: reference/create_charts
712

docs/add_plotly_to_book.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import argparse
2+
from pathlib import Path
3+
4+
# This command-line tools enables Plotly charts to show in the HTML files for the Jupyter Book documentation.
5+
6+
parser = argparse.ArgumentParser()
7+
parser.add_argument("book_path", help="Path to the Jupyter Book.")
8+
9+
args = parser.parse_args()
10+
11+
# Find every HTML file in the Jupyter Book. Then, add a script tag to the start of the <head> tag in each file, with the contents:
12+
# <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
13+
14+
book_folder = Path(args.book_path)
15+
16+
for html_file in book_folder.glob("**/*.html"):
17+
with open(html_file, "r") as f:
18+
html = f.read()
19+
20+
# Add the script tag to the start of the <head> tag.
21+
html = html.replace(
22+
"<head>",
23+
'<head><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>',
24+
)
25+
26+
with open(html_file, "w") as f:
27+
f.write(html)

docs/reference/calculate_economy_comparison.ipynb

Lines changed: 267 additions & 0 deletions
Large diffs are not rendered by default.

docs/reference/calculate_household_comparison.ipynb

Lines changed: 155 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"# Simulate outcomes for a large population\n",
8+
"\n",
9+
"Use `Simulation.calculate_single_economy()` to use PolicyEngine's tax-benefit model to compute taxes, benefits and other household properties for a large dataset (usually representing a country). This notebook demonstrates how to use this function."
10+
]
11+
},
12+
{
13+
"cell_type": "code",
14+
"execution_count": 1,
15+
"metadata": {},
16+
"outputs": [
17+
{
18+
"data": {
19+
"text/plain": [
20+
"SingleEconomy(fiscal=FiscalSummary(tax_revenue=658911285719.5891, federal_tax=658911285719.5891, federal_balance=309089098855.4849, state_tax=0.0, government_spending=349822186864.1042, tax_benefit_programs={'income_tax': 333376287037.05945, 'national_insurance': 52985626776.773834, 'ni_employer': 126330649370.35953, 'vat': 211671832822.39133, 'council_tax': 49007055050.00724, 'fuel_duty': 26506672341.204205, 'tax_credits': -34929879.49872104, 'universal_credit': -73459549194.97665, 'child_benefit': -14311471487.935827, 'state_pension': -132795868621.44594, 'pension_credit': -6252358021.417119}, household_net_income=1566028514855.0789), inequality=InequalitySummary(gini=0.36255397405553097, top_10_share=0.3260927004295773, top_1_share=0.13145609415091833), poverty=[PovertyRateMetric(age_group='child', racial_group='all', gender='male', relative=True, poverty_rate='regular', value=0.0937829241156578), PovertyRateMetric(age_group='child', racial_group='all', gender='male', relative=True, poverty_rate='deep', value=0.006947669200599194), PovertyRateMetric(age_group='child', racial_group='all', gender='male', relative=False, poverty_rate='regular', value=770371.125), PovertyRateMetric(age_group='child', racial_group='all', gender='male', relative=False, poverty_rate='deep', value=57070.984375), PovertyRateMetric(age_group='child', racial_group='all', gender='female', relative=True, poverty_rate='regular', value=0.08119998127222061), PovertyRateMetric(age_group='child', racial_group='all', gender='female', relative=True, poverty_rate='deep', value=0.005070670507848263), PovertyRateMetric(age_group='child', racial_group='all', gender='female', relative=False, poverty_rate='regular', value=866217.375), PovertyRateMetric(age_group='child', racial_group='all', gender='female', relative=False, poverty_rate='deep', value=54092.4140625), PovertyRateMetric(age_group='child', racial_group='all', gender='all', relative=True, poverty_rate='regular', value=0.0866740345954895), PovertyRateMetric(age_group='child', racial_group='all', gender='all', relative=True, poverty_rate='deep', value=0.005887233652174473), PovertyRateMetric(age_group='child', racial_group='all', gender='all', relative=False, poverty_rate='regular', value=1636588.5), PovertyRateMetric(age_group='child', racial_group='all', gender='all', relative=False, poverty_rate='deep', value=111163.3828125), PovertyRateMetric(age_group='working_age', racial_group='all', gender='male', relative=True, poverty_rate='regular', value=0.09058031439781189), PovertyRateMetric(age_group='working_age', racial_group='all', gender='male', relative=True, poverty_rate='deep', value=0.0320294052362442), PovertyRateMetric(age_group='working_age', racial_group='all', gender='male', relative=False, poverty_rate='regular', value=2207394.25), PovertyRateMetric(age_group='working_age', racial_group='all', gender='male', relative=False, poverty_rate='deep', value=780539.625), PovertyRateMetric(age_group='working_age', racial_group='all', gender='female', relative=True, poverty_rate='regular', value=0.06885619461536407), PovertyRateMetric(age_group='working_age', racial_group='all', gender='female', relative=True, poverty_rate='deep', value=0.006544755306094885), PovertyRateMetric(age_group='working_age', racial_group='all', gender='female', relative=False, poverty_rate='regular', value=1406585.625), PovertyRateMetric(age_group='working_age', racial_group='all', gender='female', relative=False, poverty_rate='deep', value=133695.4375), PovertyRateMetric(age_group='working_age', racial_group='all', gender='all', relative=True, poverty_rate='regular', value=0.08067396283149719), PovertyRateMetric(age_group='working_age', racial_group='all', gender='all', relative=True, poverty_rate='deep', value=0.02040824294090271), PovertyRateMetric(age_group='working_age', racial_group='all', gender='all', relative=False, poverty_rate='regular', value=3613979.5), PovertyRateMetric(age_group='working_age', racial_group='all', gender='all', relative=False, poverty_rate='deep', value=914235.1875), PovertyRateMetric(age_group='senior', racial_group='all', gender='male', relative=True, poverty_rate='regular', value=0.019906071946024895), PovertyRateMetric(age_group='senior', racial_group='all', gender='male', relative=True, poverty_rate='deep', value=0.0001492029696237296), PovertyRateMetric(age_group='senior', racial_group='all', gender='male', relative=False, poverty_rate='regular', value=120630.84375), PovertyRateMetric(age_group='senior', racial_group='all', gender='male', relative=False, poverty_rate='deep', value=904.1703491210938), PovertyRateMetric(age_group='senior', racial_group='all', gender='female', relative=True, poverty_rate='regular', value=0.04476610943675041), PovertyRateMetric(age_group='senior', racial_group='all', gender='female', relative=True, poverty_rate='deep', value=0.0012297447538003325), PovertyRateMetric(age_group='senior', racial_group='all', gender='female', relative=False, poverty_rate='regular', value=315600.8125), PovertyRateMetric(age_group='senior', racial_group='all', gender='female', relative=False, poverty_rate='deep', value=8669.693359375), PovertyRateMetric(age_group='senior', racial_group='all', gender='all', relative=True, poverty_rate='regular', value=0.03327473625540733), PovertyRateMetric(age_group='senior', racial_group='all', gender='all', relative=True, poverty_rate='deep', value=0.0007302720914594829), PovertyRateMetric(age_group='senior', racial_group='all', gender='all', relative=False, poverty_rate='regular', value=436231.65625), PovertyRateMetric(age_group='senior', racial_group='all', gender='all', relative=False, poverty_rate='deep', value=9573.8642578125), PovertyRateMetric(age_group='all', racial_group='all', gender='male', relative=True, poverty_rate='regular', value=0.08017819374799728), PovertyRateMetric(age_group='all', racial_group='all', gender='male', relative=True, poverty_rate='deep', value=0.021698515862226486), PovertyRateMetric(age_group='all', racial_group='all', gender='male', relative=False, poverty_rate='regular', value=3098396.25), PovertyRateMetric(age_group='all', racial_group='all', gender='male', relative=False, poverty_rate='deep', value=838514.75), PovertyRateMetric(age_group='all', racial_group='all', gender='female', relative=True, poverty_rate='regular', value=0.06785593926906586), PovertyRateMetric(age_group='all', racial_group='all', gender='female', relative=True, poverty_rate='deep', value=0.005150204990059137), PovertyRateMetric(age_group='all', racial_group='all', gender='female', relative=False, poverty_rate='regular', value=2588403.75), PovertyRateMetric(age_group='all', racial_group='all', gender='female', relative=False, poverty_rate='deep', value=196457.53125), PovertyRateMetric(age_group='all', racial_group='all', gender='all', relative=True, poverty_rate='regular', value=0.07405701279640198), PovertyRateMetric(age_group='all', racial_group='all', gender='all', relative=True, poverty_rate='deep', value=0.013478054665029049), PovertyRateMetric(age_group='all', racial_group='all', gender='all', relative=False, poverty_rate='regular', value=5686797.5), PovertyRateMetric(age_group='all', racial_group='all', gender='all', relative=False, poverty_rate='deep', value=1034972.5)])"
21+
]
22+
},
23+
"execution_count": 1,
24+
"metadata": {},
25+
"output_type": "execute_result"
26+
}
27+
],
28+
"source": [
29+
"from policyengine import Simulation\n",
30+
"\n",
31+
"sim = Simulation({\n",
32+
" \"scope\": \"macro\", # Required for this\n",
33+
" \"country\": \"uk\", # or \"us\"\n",
34+
" \"time_period\": 2025,\n",
35+
"})\n",
36+
"\n",
37+
"sim.calculate()"
38+
]
39+
},
40+
{
41+
"cell_type": "markdown",
42+
"metadata": {},
43+
"source": [
44+
"## Output schema\n",
45+
"\n",
46+
"`calculate_single_economy` or `calculate` (when `scope=macro` and `reform=None`) return the following schema."
47+
]
48+
},
49+
{
50+
"cell_type": "code",
51+
"execution_count": 2,
52+
"metadata": {},
53+
"outputs": [
54+
{
55+
"data": {
56+
"text/plain": [
57+
"{'$defs': {'FiscalSummary': {'properties': {'tax_revenue': {'title': 'Tax Revenue',\n",
58+
" 'type': 'number'},\n",
59+
" 'federal_tax': {'title': 'Federal Tax', 'type': 'number'},\n",
60+
" 'federal_balance': {'title': 'Federal Balance', 'type': 'number'},\n",
61+
" 'state_tax': {'title': 'State Tax', 'type': 'number'},\n",
62+
" 'government_spending': {'title': 'Government Spending', 'type': 'number'},\n",
63+
" 'tax_benefit_programs': {'additionalProperties': {'type': 'number'},\n",
64+
" 'title': 'Tax Benefit Programs',\n",
65+
" 'type': 'object'},\n",
66+
" 'household_net_income': {'title': 'Household Net Income',\n",
67+
" 'type': 'number'}},\n",
68+
" 'required': ['tax_revenue',\n",
69+
" 'federal_tax',\n",
70+
" 'federal_balance',\n",
71+
" 'state_tax',\n",
72+
" 'government_spending',\n",
73+
" 'tax_benefit_programs',\n",
74+
" 'household_net_income'],\n",
75+
" 'title': 'FiscalSummary',\n",
76+
" 'type': 'object'},\n",
77+
" 'InequalitySummary': {'properties': {'gini': {'title': 'Gini',\n",
78+
" 'type': 'number'},\n",
79+
" 'top_10_share': {'title': 'Top 10 Share', 'type': 'number'},\n",
80+
" 'top_1_share': {'title': 'Top 1 Share', 'type': 'number'}},\n",
81+
" 'required': ['gini', 'top_10_share', 'top_1_share'],\n",
82+
" 'title': 'InequalitySummary',\n",
83+
" 'type': 'object'},\n",
84+
" 'PovertyRateMetric': {'properties': {'age_group': {'enum': ['child',\n",
85+
" 'working_age',\n",
86+
" 'senior',\n",
87+
" 'all'],\n",
88+
" 'title': 'Age Group',\n",
89+
" 'type': 'string'},\n",
90+
" 'racial_group': {'enum': ['white', 'black', 'hispanic', 'other', 'all'],\n",
91+
" 'title': 'Racial Group',\n",
92+
" 'type': 'string'},\n",
93+
" 'gender': {'enum': ['male', 'female', 'all'],\n",
94+
" 'title': 'Gender',\n",
95+
" 'type': 'string'},\n",
96+
" 'relative': {'title': 'Relative', 'type': 'boolean'},\n",
97+
" 'poverty_rate': {'enum': ['regular',\n",
98+
" 'deep',\n",
99+
" 'uk_hbai_bhc',\n",
100+
" 'uk_hbai_bhc_half',\n",
101+
" 'us_spm',\n",
102+
" 'us_spm_half'],\n",
103+
" 'title': 'Poverty Rate',\n",
104+
" 'type': 'string'},\n",
105+
" 'value': {'title': 'Value', 'type': 'number'}},\n",
106+
" 'required': ['age_group',\n",
107+
" 'racial_group',\n",
108+
" 'gender',\n",
109+
" 'relative',\n",
110+
" 'poverty_rate',\n",
111+
" 'value'],\n",
112+
" 'title': 'PovertyRateMetric',\n",
113+
" 'type': 'object'}},\n",
114+
" 'properties': {'fiscal': {'$ref': '#/$defs/FiscalSummary'},\n",
115+
" 'inequality': {'$ref': '#/$defs/InequalitySummary'},\n",
116+
" 'poverty': {'items': {'$ref': '#/$defs/PovertyRateMetric'},\n",
117+
" 'title': 'Poverty',\n",
118+
" 'type': 'array'}},\n",
119+
" 'required': ['fiscal', 'inequality', 'poverty'],\n",
120+
" 'title': 'SingleEconomy',\n",
121+
" 'type': 'object'}"
122+
]
123+
},
124+
"execution_count": 2,
125+
"metadata": {},
126+
"output_type": "execute_result"
127+
}
128+
],
129+
"source": [
130+
"from policyengine.outputs.macro.single.calculate_single_economy import SingleEconomy\n",
131+
"\n",
132+
"SingleEconomy.model_json_schema()"
133+
]
134+
}
135+
],
136+
"metadata": {
137+
"kernelspec": {
138+
"display_name": "base",
139+
"language": "python",
140+
"name": "python3"
141+
},
142+
"language_info": {
143+
"codemirror_mode": {
144+
"name": "ipython",
145+
"version": 3
146+
},
147+
"file_extension": ".py",
148+
"mimetype": "text/x-python",
149+
"name": "python",
150+
"nbconvert_exporter": "python",
151+
"pygments_lexer": "ipython3",
152+
"version": "3.10.14"
153+
}
154+
},
155+
"nbformat": 4,
156+
"nbformat_minor": 2
157+
}

0 commit comments

Comments
 (0)