diffindiff 2.0.7__tar.gz → 2.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {diffindiff-2.0.7 → diffindiff-2.1.1}/PKG-INFO +5 -3
- {diffindiff-2.0.7 → diffindiff-2.1.1}/README.md +4 -2
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/__init__.py +2 -1
- diffindiff-2.1.1/diffindiff/config.py +179 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/didanalysis.py +735 -422
- diffindiff-2.1.1/diffindiff/didanalysis_helper.py +400 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/diddata.py +245 -117
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/didtools.py +258 -103
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/tests/tests_diffindiff.py +9 -8
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff.egg-info/PKG-INFO +5 -3
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff.egg-info/SOURCES.txt +2 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff.egg-info/requires.txt +1 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/setup.py +3 -2
- {diffindiff-2.0.7 → diffindiff-2.1.1}/MANIFEST.in +0 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/tests/__init__.py +0 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/tests/data/Corona_Hesse.xlsx +0 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/tests/data/counties_DE.csv +0 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff/tests/data/curfew_DE.csv +0 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff.egg-info/dependency_links.txt +0 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/diffindiff.egg-info/top_level.txt +0 -0
- {diffindiff-2.0.7 → diffindiff-2.1.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: diffindiff
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.1.1
|
|
4
4
|
Summary: diffindiff: Python library for convenient Difference-in-Differences Analyses
|
|
5
5
|
Author: Thomas Wieland
|
|
6
6
|
Author-email: geowieland@googlemail.com
|
|
@@ -16,9 +16,11 @@ This Python library is designed for performing Difference-in-Differences (DiD) a
|
|
|
16
16
|
Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
## Updates v2.
|
|
19
|
+
## Updates v2.1.1
|
|
20
20
|
- Bugfixes:
|
|
21
|
-
-
|
|
21
|
+
- Checking input parameters in didanalysis.DiffModel.plot()
|
|
22
|
+
- Default verbose = False
|
|
23
|
+
- Notes and warnings related to treatment diagnostics independent of verbose parameter
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
## Features
|
|
@@ -8,9 +8,11 @@ This Python library is designed for performing Difference-in-Differences (DiD) a
|
|
|
8
8
|
Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geowieland@googlemail.com)
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
## Updates v2.
|
|
11
|
+
## Updates v2.1.1
|
|
12
12
|
- Bugfixes:
|
|
13
|
-
-
|
|
13
|
+
- Checking input parameters in didanalysis.DiffModel.plot()
|
|
14
|
+
- Default verbose = False
|
|
15
|
+
- Notes and warnings related to treatment diagnostics independent of verbose parameter
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
## Features
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
from diffindiff.didanalysis import DiffModel, did_analysis
|
|
2
2
|
from diffindiff.diddata import DiffGroups, create_groups, DiffTreatment, create_treatment, DiffData, merge_data, create_data
|
|
3
|
-
from diffindiff.didtools import is_balanced, is_missing, is_simultaneous, is_notreatment, date_counter, check_columns, is_binary, is_parallel, unique, model_wrapper, treatment_times, clean_column_name
|
|
3
|
+
from diffindiff.didtools import is_balanced, is_missing, is_simultaneous, is_notreatment, date_counter, check_columns, is_binary, is_parallel, unique, model_wrapper, treatment_times, clean_column_name
|
|
4
|
+
from diffindiff.didanalysis_helper import create_fixed_effects, create_specific_time_trends, create_specific_treatment_effects, create_spillover
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#-----------------------------------------------------------------------
|
|
2
|
+
# Name: config (diffindiff package)
|
|
3
|
+
# Purpose: Configuration for the diffindiff package
|
|
4
|
+
# Author: Thomas Wieland
|
|
5
|
+
# ORCID: 0000-0001-5168-9846
|
|
6
|
+
# mail: geowieland@googlemail.com
|
|
7
|
+
# Version: 1.0.1
|
|
8
|
+
# Last update: 2025-11-24 17:29
|
|
9
|
+
# Copyright (c) 2025 Thomas Wieland
|
|
10
|
+
#-----------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
# Basic config:
|
|
13
|
+
|
|
14
|
+
VERBOSE = False
|
|
15
|
+
|
|
16
|
+
ROUND_PERCENT = 2
|
|
17
|
+
|
|
18
|
+
# Description texts:
|
|
19
|
+
|
|
20
|
+
DID_DESCRIPTION = "Difference in Differences (DiD) Analysis"
|
|
21
|
+
DDD_DESCRIPTION = "Difference in Difference in Differences (DDD) Analysis"
|
|
22
|
+
|
|
23
|
+
TREATMENT_DESCRIPTION = "Treatment"
|
|
24
|
+
|
|
25
|
+
TREATMENT_GROUP_DESCRIPTION = f"{TREATMENT_DESCRIPTION} group"
|
|
26
|
+
CONTROL_GROUP_DESCRIPTION = "Control group"
|
|
27
|
+
GROUPS_DESCRIPTION = f"{TREATMENT_DESCRIPTION} and {CONTROL_GROUP_DESCRIPTION}"
|
|
28
|
+
|
|
29
|
+
TREATMENT_PERIOD_DESCRIPTION = f"{TREATMENT_DESCRIPTION} period"
|
|
30
|
+
STUDY_PERIOD_DESCRIPTION = "Study period"
|
|
31
|
+
|
|
32
|
+
UNITS_DESCRIPTION = "Units"
|
|
33
|
+
|
|
34
|
+
DDD_GROUP_DESCRIPTION = "Group segmentation"
|
|
35
|
+
|
|
36
|
+
SUMMARY_LABELS = [
|
|
37
|
+
TREATMENT_DESCRIPTION,
|
|
38
|
+
UNITS_DESCRIPTION,
|
|
39
|
+
TREATMENT_GROUP_DESCRIPTION,
|
|
40
|
+
CONTROL_GROUP_DESCRIPTION
|
|
41
|
+
]
|
|
42
|
+
SUMMARY_MAX_WIDTH = max(len(label) for label in SUMMARY_LABELS) + 1
|
|
43
|
+
|
|
44
|
+
# Data management:
|
|
45
|
+
|
|
46
|
+
DELIMITER = "_"
|
|
47
|
+
DELIMITER_INTERACT = "x"
|
|
48
|
+
|
|
49
|
+
COL_ABBREV = "col"
|
|
50
|
+
|
|
51
|
+
DUMMY_PREFIX = "DUMMY"
|
|
52
|
+
LOG_PREFIX = "log"
|
|
53
|
+
OBSERVED_SUFFIX = "observed"
|
|
54
|
+
EXPECTED_SUFFIX = "expected"
|
|
55
|
+
PREDICTED_SUFFIX = "pred"
|
|
56
|
+
CI_LOWER_SUFFIX = "CI_lower"
|
|
57
|
+
CI_UPPER_SUFFIX = "CI_upper"
|
|
58
|
+
PI_LOWER_SUFFIX = "PI_lower"
|
|
59
|
+
PI_UPPER_SUFFIX = "PI_upper"
|
|
60
|
+
|
|
61
|
+
TG_COL = "TG"
|
|
62
|
+
CG_COL = "CG"
|
|
63
|
+
TT_COL = "TT"
|
|
64
|
+
ATT_COL = "ATT"
|
|
65
|
+
TIME_COL = "t"
|
|
66
|
+
UNIT_COL = "unit"
|
|
67
|
+
UNIT_TIME_COL = f"{UNIT_COL}{DELIMITER}{TIME_COL}"
|
|
68
|
+
TIME_COUNTER_COL = "time_counter"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# Modeling config:
|
|
72
|
+
|
|
73
|
+
# Coefficients/effects types:
|
|
74
|
+
|
|
75
|
+
EFFECTS_TYPES = {
|
|
76
|
+
"ATE": {
|
|
77
|
+
"description": "Average treatment effect",
|
|
78
|
+
"model_results_key": "average_treatment_effects"
|
|
79
|
+
},
|
|
80
|
+
"AATE": {
|
|
81
|
+
"description": "Average after-treatment effect",
|
|
82
|
+
"model_results_key": "average_after_treatment_effects"
|
|
83
|
+
},
|
|
84
|
+
"beta_0": {
|
|
85
|
+
"description": "Control group baseline",
|
|
86
|
+
"model_results_key": "control_group_baseline"
|
|
87
|
+
},
|
|
88
|
+
"beta_1": {
|
|
89
|
+
"description": "Treatment group deviation",
|
|
90
|
+
"model_results_key": "treatment_group_deviation"
|
|
91
|
+
},
|
|
92
|
+
"delta_0": {
|
|
93
|
+
"description": "Non-treatment time effect",
|
|
94
|
+
"model_results_key": "non_treatment_time_effect"
|
|
95
|
+
},
|
|
96
|
+
"ATT": {
|
|
97
|
+
"description": "After-treatment time effect",
|
|
98
|
+
"model_results_key": "after_treatment_time_effects"
|
|
99
|
+
},
|
|
100
|
+
"FE": {
|
|
101
|
+
"description": "Fixed effects",
|
|
102
|
+
"model_results_key": "fixed_effects",
|
|
103
|
+
"types": {
|
|
104
|
+
0: {
|
|
105
|
+
"FE": "unit",
|
|
106
|
+
"dummy_prefix": "UNIT",
|
|
107
|
+
"model_config_key": "FE_unit",
|
|
108
|
+
"description": "Fixed effects for observational units"
|
|
109
|
+
},
|
|
110
|
+
1: {
|
|
111
|
+
"FE": "time",
|
|
112
|
+
"dummy_prefix": "TIME",
|
|
113
|
+
"model_config_key": "FE_time",
|
|
114
|
+
"description": "Fixed effects for time points"
|
|
115
|
+
},
|
|
116
|
+
2: {
|
|
117
|
+
"FE": "group",
|
|
118
|
+
"dummy_prefix": "GROUP",
|
|
119
|
+
"model_config_key": "FE_group",
|
|
120
|
+
"description": "Fixed effects for groups"
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"ITT": {
|
|
125
|
+
"description": "Individual time trends",
|
|
126
|
+
"model_results_key": "individual_time_trends",
|
|
127
|
+
"model_config_key": "ITT"
|
|
128
|
+
},
|
|
129
|
+
"ITE": {
|
|
130
|
+
"description": "Individual treatment effects",
|
|
131
|
+
"model_results_key": "individual_treatment_effects",
|
|
132
|
+
"model_config_key": "ITE"
|
|
133
|
+
},
|
|
134
|
+
"GTT": {
|
|
135
|
+
"description": "Group time trends",
|
|
136
|
+
"model_results_key": "group_time_trends",
|
|
137
|
+
"model_config_key": "GTT"
|
|
138
|
+
},
|
|
139
|
+
"GTE": {
|
|
140
|
+
"description": "Group treatment effects",
|
|
141
|
+
"model_results_key": "group_treatment_effects",
|
|
142
|
+
"model_config_key": "GTE"
|
|
143
|
+
},
|
|
144
|
+
"spillover": {
|
|
145
|
+
"description": "Treatment spillover effects",
|
|
146
|
+
"model_results_key": "treatment_spillover_effects",
|
|
147
|
+
"model_config_key": "spillover_effects"
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
FE_TYPES = [value["FE"] for value in EFFECTS_TYPES["FE"]["types"].values()]
|
|
152
|
+
|
|
153
|
+
# Time trends:
|
|
154
|
+
TIME_TRENDS_TYPES = [
|
|
155
|
+
list(EFFECTS_TYPES.keys())[7],
|
|
156
|
+
list(EFFECTS_TYPES.keys())[9]
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
# Specific effects:
|
|
160
|
+
SPECIFIC_EFFFECTS_TYPES = [
|
|
161
|
+
list(EFFECTS_TYPES.keys())[8],
|
|
162
|
+
list(EFFECTS_TYPES.keys())[10]
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
# Predictions:
|
|
166
|
+
PREDICTIONS_SUMMARY_FRAME_COLS = {
|
|
167
|
+
"mean": "Predicted mean",
|
|
168
|
+
"mean_se": "Predicted mean SE",
|
|
169
|
+
"mean_ci_lower": "Lower CI of mean",
|
|
170
|
+
"mean_ci_upper": "Upper CI of mean",
|
|
171
|
+
"obs_ci_lower": "Lower prediction interval",
|
|
172
|
+
"obs_ci_upper": "Upper prediction interval",
|
|
173
|
+
}
|
|
174
|
+
PREDICTIONS_SUMMARY_FRAME_COLS_LIST = list(PREDICTIONS_SUMMARY_FRAME_COLS.keys())
|
|
175
|
+
PREDICTIONS_SUMMARY_FRAME_DESCRIPTIONS = list(PREDICTIONS_SUMMARY_FRAME_COLS.values())
|
|
176
|
+
|
|
177
|
+
# Counterfactual:
|
|
178
|
+
COUNTERFAC_SUFFIX_CF = "counterfac"
|
|
179
|
+
COUNTERFAC_SUFFIX_PRED_CF = f"{DELIMITER}{PREDICTED_SUFFIX}{DELIMITER}{COUNTERFAC_SUFFIX_CF}"
|