Skip to content

Commit 388a951

Browse files
Fix alg2 (#206)
* Calculate values related to `arbeitsl_geld_2`, `wohngeld`, `kinderzuschlag`, `kindergeld` at appropriate level of aggregation (hh and/or tu). * Several refactorings, corrected typos, and bugfixes Co-authored-by: Hans-Martin von Gaudecker <[email protected]>
1 parent d672a6d commit 388a951

29 files changed

+317
-343
lines changed

CHANGES.rst

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ releases are available on `Anaconda.org <https://anaconda.org/gettsim/gettsim>`_
99
0.3.2 - 2020-06-xx
1010
------------------
1111

12-
* :gh:`197` adds all functions which build the tax and transfer system to the
13-
documentation (:ghuser:`tobiasraabe`).
12+
* :gh:`206` fixes several bugs in `arbeitsl_geld_2` and related transfers, calculating
13+
them at the appropriate (household) level (:ghuser:`MaxBlesch`).
14+
* :gh:`202` fixes bugs that surfaced for negative incomes (:ghuser:`MaxBlesch`).
1415
* :gh:`200` adds a debug mode to gettsim and documents the feature
1516
(:ghuser:`tobiasraabe`).
16-
* :gh:`202` fixes bugs that surfaced for negative incomes (:ghuser:`MaxBlesch`).
17+
* :gh:`197` adds all functions which build the tax and transfer system to the
18+
documentation (:ghuser:`tobiasraabe`).
1719
* :gh:`196` adds docstring to `policy_for_date.py` and improves its interface
1820
(:ghuser:`MaxBlesch`).
1921

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,44 @@
11
import numpy as np
22

33

4-
def regelbedarf_m(regelsatz_m, kost_unterk_m):
4+
def arbeitsl_geld_2_m_hh(
5+
arbeitsl_geld_2_m_minus_eink_hh,
6+
wohngeld_vorrang_hh,
7+
kinderzuschlag_vorrang_hh,
8+
wohngeld_kinderzuschlag_vorrang_hh,
9+
rentner_in_hh,
10+
):
11+
out = arbeitsl_geld_2_m_minus_eink_hh.clip(lower=0)
12+
cond = (
13+
wohngeld_vorrang_hh
14+
| kinderzuschlag_vorrang_hh
15+
| wohngeld_kinderzuschlag_vorrang_hh
16+
| rentner_in_hh
17+
)
18+
out.loc[cond] = 0
19+
return out
20+
21+
22+
def regelbedarf_m_hh(regelsatz_m_hh, kost_unterk_m_hh):
523
"""Basic monthly subsistence level, including cost of dwelling.
624
725
Parameters
826
----------
9-
regelsatz_m
10-
kost_unterk_m
27+
regelsatz_m_hh
28+
kost_unterk_m_hh
1129
1230
Returns
1331
-------
1432
1533
"""
16-
return regelsatz_m + kost_unterk_m
34+
return regelsatz_m_hh + kost_unterk_m_hh
1735

1836

19-
def alleinerziehenden_mehrbedarf(
20-
alleinerziehend,
37+
def alleinerziehenden_mehrbedarf_hh(
38+
alleinerziehend_hh,
2139
anz_kinder_hh,
22-
anz_kind_zwischen_0_6_per_hh,
23-
anz_kind_zwischen_0_15_per_hh,
40+
anz_kind_zwischen_0_6_hh,
41+
anz_kind_zwischen_0_15_hh,
2442
arbeitsl_geld_2_params,
2543
):
2644
"""Compute alleinerziehenden_mehrbedarf.
@@ -32,16 +50,17 @@ def alleinerziehenden_mehrbedarf(
3250
"""
3351
lower = arbeitsl_geld_2_params["mehrbedarf_anteil"]["min_1_kind"] * anz_kinder_hh
3452
value = (
35-
(anz_kind_zwischen_0_6_per_hh >= 1)
36-
| ((2 <= anz_kind_zwischen_0_15_per_hh) & (anz_kind_zwischen_0_15_per_hh <= 3))
53+
(anz_kind_zwischen_0_6_hh >= 1)
54+
| ((2 <= anz_kind_zwischen_0_15_hh) & (anz_kind_zwischen_0_15_hh <= 3))
3755
) * arbeitsl_geld_2_params["mehrbedarf_anteil"]["kind_unter_7_oder_mehr"]
3856

39-
return alleinerziehend * value.clip(
57+
out = alleinerziehend_hh * value.clip(
4058
lower=lower, upper=arbeitsl_geld_2_params["mehrbedarf_anteil"]["max"]
4159
)
60+
return out
4261

4362

44-
def kindersatz_m_bis_2010(
63+
def kindersatz_m_hh_bis_2010(
4564
hh_id,
4665
kind_zwischen_0_6,
4766
kind_zwischen_7_13,
@@ -56,10 +75,10 @@ def kindersatz_m_bis_2010(
5675
+ anteile["kinder_14_24"] * kind_zwischen_14_24
5776
)
5877

59-
return per_child.groupby(hh_id).transform("sum")
78+
return per_child.groupby(hh_id).sum()
6079

6180

62-
def kindersatz_m_ab_2011(
81+
def kindersatz_m_hh_ab_2011(
6382
hh_id,
6483
kind_zwischen_0_6,
6584
kind_zwischen_7_13,
@@ -72,48 +91,44 @@ def kindersatz_m_ab_2011(
7291
+ arbeitsl_geld_2_params["regelsatz"][4] * kind_zwischen_14_24
7392
)
7493

75-
return per_child.groupby(hh_id).transform("sum")
94+
return per_child.groupby(hh_id).sum()
7695

7796

78-
def regelsatz_m_bis_2010(
79-
hh_id,
97+
def regelsatz_m_hh_bis_2010(
8098
anz_erwachsene_hh,
81-
alleinerziehenden_mehrbedarf,
82-
kindersatz_m,
99+
alleinerziehenden_mehrbedarf_hh,
100+
kindersatz_m_hh,
83101
arbeitsl_geld_2_params,
84102
):
85-
anz_erwachsene_in_hh = hh_id.replace(anz_erwachsene_hh)
86103
data = np.where(
87-
anz_erwachsene_in_hh == 1,
88-
arbeitsl_geld_2_params["regelsatz"] * (1 + alleinerziehenden_mehrbedarf),
104+
anz_erwachsene_hh == 1,
105+
arbeitsl_geld_2_params["regelsatz"] * (1 + alleinerziehenden_mehrbedarf_hh),
89106
arbeitsl_geld_2_params["regelsatz"]
90107
* (
91-
(2 + alleinerziehenden_mehrbedarf)
108+
(2 + alleinerziehenden_mehrbedarf_hh)
92109
* arbeitsl_geld_2_params["anteil_regelsatz"]["zwei_erwachsene"]
93-
+ (anz_erwachsene_in_hh - 2).clip(lower=0)
110+
+ (anz_erwachsene_hh - 2).clip(lower=0)
94111
* arbeitsl_geld_2_params["anteil_regelsatz"]["weitere_erwachsene"]
95112
),
96113
)
97114

98-
return kindersatz_m + data
115+
return kindersatz_m_hh + data
99116

100117

101-
def regelsatz_m_ab_2011(
102-
hh_id,
118+
def regelsatz_m_hh_ab_2011(
103119
anz_erwachsene_hh,
104-
alleinerziehenden_mehrbedarf,
105-
kindersatz_m,
120+
alleinerziehenden_mehrbedarf_hh,
121+
kindersatz_m_hh,
106122
arbeitsl_geld_2_params,
107123
):
108-
anz_erwachsene_in_hh = hh_id.replace(anz_erwachsene_hh)
109124
data = np.where(
110-
anz_erwachsene_in_hh == 1,
111-
arbeitsl_geld_2_params["regelsatz"][1] * (1 + alleinerziehenden_mehrbedarf),
112-
arbeitsl_geld_2_params["regelsatz"][2] * (2 + alleinerziehenden_mehrbedarf)
125+
anz_erwachsene_hh == 1,
126+
arbeitsl_geld_2_params["regelsatz"][1] * (1 + alleinerziehenden_mehrbedarf_hh),
127+
arbeitsl_geld_2_params["regelsatz"][2] * (2 + alleinerziehenden_mehrbedarf_hh)
113128
+ (
114129
arbeitsl_geld_2_params["regelsatz"][3]
115-
* (anz_erwachsene_in_hh - 2).clip(lower=0)
130+
* (anz_erwachsene_hh - 2).clip(lower=0)
116131
),
117132
)
118133

119-
return kindersatz_m + data
134+
return kindersatz_m_hh + data
Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,54 @@
1-
def kost_unterk_m(_berechtigte_wohnfläche, _miete_pro_sqm):
2-
"""
3-
Only 'appropriate' housing costs are paid. Two possible options:
4-
1. Just pay rents no matter what
5-
return household["miete"] + household["heizkost"]
6-
2. Add restrictions regarding flat size and rent per square meter (set it 10€,
7-
slightly above average)
1+
def kost_unterk_m_hh(berechtigte_wohnfläche_hh, miete_pro_qm_hh):
2+
"""Justified costs of living.
83
94
Parameters
105
----------
11-
_berechtigte_wohnfläche
12-
_miete_pro_sqm
6+
berechtigte_wohnfläche_hh
7+
miete_pro_qm_hh
138
149
Returns
1510
-------
1611
1712
"""
18-
return _berechtigte_wohnfläche * _miete_pro_sqm
13+
return berechtigte_wohnfläche_hh * miete_pro_qm_hh
1914

2015

21-
def _miete_pro_sqm(kaltmiete_m, heizkost_m, wohnfläche):
16+
def miete_pro_qm_hh(kaltmiete_m_hh, heizkosten_m_hh, wohnfläche_hh):
2217
"""
2318
2419
Parameters
2520
----------
26-
kaltmiete_m
27-
heizkost_m
28-
wohnfläche
21+
kaltmiete_m_hh
22+
heizkosten_m_hh
23+
wohnfläche_hh
2924
3025
Returns
3126
-------
3227
3328
"""
34-
return ((kaltmiete_m + heizkost_m) / wohnfläche).clip(upper=10)
29+
return ((kaltmiete_m_hh + heizkosten_m_hh) / wohnfläche_hh).clip(upper=10)
3530

3631

37-
def _berechtigte_wohnfläche(wohnfläche, bewohnt_eigentum, haushaltsgröße):
32+
def berechtigte_wohnfläche_hh(wohnfläche_hh, bewohnt_eigentum_hh, haushaltsgröße_hh):
3833
"""
3934
4035
Parameters
4136
----------
42-
wohnfläche
43-
bewohnt_eigentum
44-
haushaltsgröße
37+
wohnfläche_hh
38+
bewohnt_eigentum_hh
39+
haushaltsgröße_hh
4540
4641
Returns
4742
-------
4843
4944
"""
50-
out = wohnfläche * 0
51-
out.loc[bewohnt_eigentum] = wohnfläche.loc[bewohnt_eigentum].clip(
52-
upper=(80 + (haushaltsgröße.loc[bewohnt_eigentum] - 2).clip(lower=0) * 20)
45+
out = wohnfläche_hh * 0
46+
out.loc[bewohnt_eigentum_hh] = wohnfläche_hh.loc[bewohnt_eigentum_hh].clip(
47+
upper=(80 + (haushaltsgröße_hh.loc[bewohnt_eigentum_hh] - 2).clip(lower=0) * 20)
5348
)
54-
out.loc[~bewohnt_eigentum] = wohnfläche.loc[~bewohnt_eigentum].clip(
55-
upper=(45 + (haushaltsgröße.loc[~bewohnt_eigentum] - 1).clip(lower=0) * 15)
49+
out.loc[~bewohnt_eigentum_hh] = wohnfläche_hh.loc[~bewohnt_eigentum_hh].clip(
50+
upper=(
51+
45 + (haushaltsgröße_hh.loc[~bewohnt_eigentum_hh] - 1).clip(lower=0) * 15
52+
)
5653
)
5754
return out
Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,44 @@
1-
def arbeitsl_geld_2_m(
2-
arbeitsl_geld_2_m_basis,
3-
wohngeld_m_vorrang,
4-
kinderzuschlag_vorrang,
5-
wohngeld_m_kinderzuschlag_vorrang,
6-
anz_rentner_per_hh,
1+
def arbeitsl_geld_2_m_minus_eink_hh(
2+
_regelbedarf_m_vermögens_check_hh,
3+
kindergeld_m_hh,
4+
unterhaltsvors_m_hh,
5+
arbeitsl_geld_2_eink_hh,
76
):
8-
cond = (
9-
wohngeld_m_vorrang | kinderzuschlag_vorrang | wohngeld_m_kinderzuschlag_vorrang
7+
out = (
8+
_regelbedarf_m_vermögens_check_hh
9+
- arbeitsl_geld_2_eink_hh
10+
- unterhaltsvors_m_hh
11+
- kindergeld_m_hh
1012
)
11-
return arbeitsl_geld_2_m_basis.where(~cond & (anz_rentner_per_hh == 0), 0)
13+
return out
1214

1315

14-
def wohngeld_m(
15-
_wohngeld_basis_hh_vermögens_check,
16-
wohngeld_m_vorrang,
17-
wohngeld_m_kinderzuschlag_vorrang,
18-
arbeitsl_geld_2_m_basis,
19-
anz_rentner_per_hh,
16+
def wohngeld_vorrang_hh(
17+
wohngeld_vermögens_check_hh, arbeitsl_geld_2_m_minus_eink_hh,
2018
):
21-
cond = (
22-
~wohngeld_m_vorrang
23-
& ~wohngeld_m_kinderzuschlag_vorrang
24-
& (arbeitsl_geld_2_m_basis > 0)
25-
)
26-
return _wohngeld_basis_hh_vermögens_check.where(
27-
~cond & (anz_rentner_per_hh == 0), 0
28-
)
19+
rest_arbeitsl_geld_2 = (
20+
arbeitsl_geld_2_m_minus_eink_hh - wohngeld_vermögens_check_hh
21+
).clip(lower=0)
22+
return (rest_arbeitsl_geld_2 == 0) & (arbeitsl_geld_2_m_minus_eink_hh > 0)
2923

3024

31-
def kinderzuschlag_m(
32-
_kinderzuschlag_m_vermögens_check,
33-
kinderzuschlag_vorrang,
34-
wohngeld_m_kinderzuschlag_vorrang,
35-
arbeitsl_geld_2_m_basis,
36-
anz_rentner_per_hh,
25+
def kinderzuschlag_vorrang_hh(
26+
kinderzuschlag_vermögens_check_hh, arbeitsl_geld_2_m_minus_eink_hh,
3727
):
38-
cond = (
39-
~kinderzuschlag_vorrang
40-
& ~wohngeld_m_kinderzuschlag_vorrang
41-
& (arbeitsl_geld_2_m_basis > 0)
42-
)
43-
return _kinderzuschlag_m_vermögens_check.where(~cond & (anz_rentner_per_hh == 0), 0)
28+
rest_arbeitsl_geld_2 = (
29+
arbeitsl_geld_2_m_minus_eink_hh - kinderzuschlag_vermögens_check_hh
30+
).clip(lower=0)
31+
return (rest_arbeitsl_geld_2 == 0) & (arbeitsl_geld_2_m_minus_eink_hh > 0)
32+
33+
34+
def wohngeld_kinderzuschlag_vorrang_hh(
35+
wohngeld_vermögens_check_hh,
36+
kinderzuschlag_vermögens_check_hh,
37+
arbeitsl_geld_2_m_minus_eink_hh,
38+
):
39+
rest_arbeitsl_geld_2 = (
40+
arbeitsl_geld_2_m_minus_eink_hh
41+
- wohngeld_vermögens_check_hh
42+
- kinderzuschlag_vermögens_check_hh
43+
).clip(lower=0)
44+
return (rest_arbeitsl_geld_2 == 0) & (arbeitsl_geld_2_m_minus_eink_hh > 0)

0 commit comments

Comments
 (0)