diff-diff 3.9.1__tar.gz → 3.11.0__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.
- {diff_diff-3.9.1 → diff_diff-3.11.0}/PKG-INFO +5 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/README.md +2 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/__init__.py +13 -1
- diff_diff-3.11.0/diff_diff/_crossfit.py +606 -0
- diff_diff-3.11.0/diff_diff/_dr_scores.py +506 -0
- diff_diff-3.11.0/diff_diff/_learners.py +562 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_reporting_helpers.py +61 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_staggered_triple_diff_engine.py +2 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/aggregation.py +30 -4
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/bootstrap_chunking.py +17 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/bootstrap_utils.py +113 -6
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/business_report.py +59 -5
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/chaisemartin_dhaultfoeuille_results.py +8 -4
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did.py +14 -47
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/datasets.py +5 -1
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/diagnostic_report.py +79 -22
- diff_diff-3.11.0/diff_diff/dml_did.py +2327 -0
- diff_diff-3.11.0/diff_diff/dml_did_results.py +257 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did.py +57 -52
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_aggregation.py +36 -7
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_bootstrap.py +99 -15
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_covariates.py +60 -10
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_results.py +122 -26
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/estimators.py +16 -4
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms-autonomous.txt +59 -1
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms-full.txt +141 -19
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms-practitioner.txt +50 -14
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms.txt +4 -2
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/honest_did.py +45 -26
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation.py +9 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation_results.py +8 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/linalg.py +354 -26
- diff_diff-3.11.0/diff_diff/lwdid.py +4499 -0
- diff_diff-3.11.0/diff_diff/lwdid_randomization.py +508 -0
- diff_diff-3.11.0/diff_diff/lwdid_results.py +826 -0
- diff_diff-3.11.0/diff_diff/lwdid_sensitivity.py +907 -0
- diff_diff-3.11.0/diff_diff/lwdid_staggered.py +817 -0
- diff_diff-3.11.0/diff_diff/lwdid_visualization.py +303 -0
- diff_diff-3.11.0/diff_diff/lwdid_wild_bootstrap.py +360 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/mmm.py +21 -1
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/practitioner.py +128 -28
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/pretrends.py +33 -16
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/results.py +2 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/results_base.py +28 -4
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/spillover.py +32 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/stacked_did_results.py +8 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered.py +110 -103
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_aggregation.py +5 -4
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_bootstrap.py +140 -21
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_results.py +151 -32
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_triple_diff.py +2 -2
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_triple_diff_results.py +8 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/sun_abraham.py +8 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/triple_diff.py +10 -24
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/twfe.py +14 -14
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage_results.py +8 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/utils.py +48 -4
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_event_study.py +133 -18
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_staggered.py +87 -16
- {diff_diff-3.9.1 → diff_diff-3.11.0}/pyproject.toml +3 -3
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/Cargo.lock +17 -17
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/Cargo.toml +1 -1
- {diff_diff-3.9.1 → diff_diff-3.11.0}/LICENSE +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_backend.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_base.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_deprecation.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_guides_api.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_nprobust_port.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_rdrobust_port.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/agent_workflow.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/bacon.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/balancing.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/chaisemartin_dhaultfoeuille.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/chaisemartin_dhaultfoeuille_bootstrap.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/changes_in_changes.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/changes_in_changes_results.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/conformal.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/conley.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did_aggregation.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did_bspline.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did_results.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/diagnostics.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_weights.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/__init__.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/had.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/had_pretests.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation_aggregation.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation_bootstrap.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/local_linear.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/lpdid.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/lpdid_results.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/power.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/prep.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/prep_dgp.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/profile.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/rdd.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/rddensity.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/rdplot.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/stacked_did.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/survey.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/synthetic_control.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/synthetic_control_results.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/synthetic_did.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop_global.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop_local.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop_results.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage_aggregation.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage_bootstrap.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/__init__.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_common.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_continuous.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_diagnostic.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_power.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_synthetic.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/wooldridge.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/wooldridge_results.py +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/build.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/alloc_profile.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/batched_solve.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/bootstrap.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/demean.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/lib.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/linalg.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/trop.rs +0 -0
- {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/weights.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diff-diff
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.11.0
|
|
4
4
|
Classifier: Development Status :: 5 - Production/Stable
|
|
5
5
|
Classifier: Intended Audience :: Science/Research
|
|
6
6
|
Classifier: Operating System :: OS Independent
|
|
@@ -21,8 +21,8 @@ Requires-Dist: pytest>=7.0 ; extra == 'dev'
|
|
|
21
21
|
Requires-Dist: pytest-xdist>=3.0 ; extra == 'dev'
|
|
22
22
|
Requires-Dist: pytest-cov>=4.0 ; extra == 'dev'
|
|
23
23
|
Requires-Dist: black==26.5.1 ; extra == 'dev'
|
|
24
|
-
Requires-Dist: ruff==0.16.
|
|
25
|
-
Requires-Dist: mypy==2.3.
|
|
24
|
+
Requires-Dist: ruff==0.16.4 ; extra == 'dev'
|
|
25
|
+
Requires-Dist: mypy==2.3.1 ; extra == 'dev'
|
|
26
26
|
Requires-Dist: maturin>=1.4,<2.0 ; extra == 'dev'
|
|
27
27
|
Requires-Dist: matplotlib>=3.5 ; extra == 'dev'
|
|
28
28
|
Requires-Dist: nbmake>=1.5 ; extra == 'dev'
|
|
@@ -175,6 +175,8 @@ Full guide: `diff_diff.get_llm_guide("practitioner")`.
|
|
|
175
175
|
- [WooldridgeDiD](https://diff-diff.readthedocs.io/en/stable/api/wooldridge_etwfe.html) - Wooldridge (2023, 2025) ETWFE: saturated OLS, logit/Poisson QMLE (ASF-based ATT). Alias `ETWFE`.
|
|
176
176
|
- [LPDiD](https://diff-diff.readthedocs.io/en/stable/api/lpdid.html) - Dube, Girardi, Jorda & Taylor (2025) Local Projections DiD: per-horizon long-difference event study on clean controls (no negative weighting), variance- or equally-weighted ATT, for absorbing or non-absorbing (reversible) treatment
|
|
177
177
|
- [ChangesInChanges](https://diff-diff.readthedocs.io/en/stable/api/changes_in_changes.html) - Athey & Imbens (2006) nonlinear/distributional DiD for the 2x2 design: full counterfactual distribution and quantile treatment effects via CDF transformation, plus the QDiD comparison estimator via `method="qdid"`; bootstrap inference; R qte parity. Alias `CiC`
|
|
178
|
+
- [LWDiD](https://diff-diff.readthedocs.io/en/stable/api/lwdid.html) - Lee & Wooldridge (2025, 2026) rolling-transformation DiD: unit-specific demean/detrend converts panel to cross-section, staggered adoption, `estimation_method` in `reg`/`ipw`/`dr`/`psm` (the papers' RA/IPW/IPWRA plus propensity-score matching), exact small-N inference on the classical collapsed regression
|
|
179
|
+
- [DMLDiD](https://diff-diff.readthedocs.io/en/stable/api/dml_did.html) - Chang (2020) double/debiased machine learning DiD: staggered ATT(g,t) with cross-fitted ML nuisance learners (DML2) and Neyman-orthogonal scores, for flexible/high-dimensional covariate adjustment under conditional parallel trends; panel or declared repeated cross sections (`panel=False`); survey/cluster support on both lanes
|
|
178
180
|
- [BaconDecomposition](https://diff-diff.readthedocs.io/en/stable/api/bacon.html) - Goodman-Bacon (2021) decomposition for diagnosing TWFE bias in staggered settings
|
|
179
181
|
|
|
180
182
|
## Diagnostics & Sensitivity
|
|
@@ -120,6 +120,8 @@ Full guide: `diff_diff.get_llm_guide("practitioner")`.
|
|
|
120
120
|
- [WooldridgeDiD](https://diff-diff.readthedocs.io/en/stable/api/wooldridge_etwfe.html) - Wooldridge (2023, 2025) ETWFE: saturated OLS, logit/Poisson QMLE (ASF-based ATT). Alias `ETWFE`.
|
|
121
121
|
- [LPDiD](https://diff-diff.readthedocs.io/en/stable/api/lpdid.html) - Dube, Girardi, Jorda & Taylor (2025) Local Projections DiD: per-horizon long-difference event study on clean controls (no negative weighting), variance- or equally-weighted ATT, for absorbing or non-absorbing (reversible) treatment
|
|
122
122
|
- [ChangesInChanges](https://diff-diff.readthedocs.io/en/stable/api/changes_in_changes.html) - Athey & Imbens (2006) nonlinear/distributional DiD for the 2x2 design: full counterfactual distribution and quantile treatment effects via CDF transformation, plus the QDiD comparison estimator via `method="qdid"`; bootstrap inference; R qte parity. Alias `CiC`
|
|
123
|
+
- [LWDiD](https://diff-diff.readthedocs.io/en/stable/api/lwdid.html) - Lee & Wooldridge (2025, 2026) rolling-transformation DiD: unit-specific demean/detrend converts panel to cross-section, staggered adoption, `estimation_method` in `reg`/`ipw`/`dr`/`psm` (the papers' RA/IPW/IPWRA plus propensity-score matching), exact small-N inference on the classical collapsed regression
|
|
124
|
+
- [DMLDiD](https://diff-diff.readthedocs.io/en/stable/api/dml_did.html) - Chang (2020) double/debiased machine learning DiD: staggered ATT(g,t) with cross-fitted ML nuisance learners (DML2) and Neyman-orthogonal scores, for flexible/high-dimensional covariate adjustment under conditional parallel trends; panel or declared repeated cross sections (`panel=False`); survey/cluster support on both lanes
|
|
123
125
|
- [BaconDecomposition](https://diff-diff.readthedocs.io/en/stable/api/bacon.html) - Goodman-Bacon (2021) decomposition for diagnosing TWFE bias in staggered settings
|
|
124
126
|
|
|
125
127
|
## Diagnostics & Sensitivity
|
|
@@ -32,6 +32,7 @@ from diff_diff._backend import (
|
|
|
32
32
|
_rust_solve_ols,
|
|
33
33
|
)
|
|
34
34
|
from diff_diff._guides_api import get_llm_guide
|
|
35
|
+
from diff_diff._learners import SieveLearner
|
|
35
36
|
from diff_diff.agent_workflow import agent_workflow
|
|
36
37
|
from diff_diff.aggregation import (
|
|
37
38
|
AggregationResult,
|
|
@@ -95,6 +96,8 @@ from diff_diff.diagnostics import (
|
|
|
95
96
|
run_all_placebo_tests,
|
|
96
97
|
run_placebo_test,
|
|
97
98
|
)
|
|
99
|
+
from diff_diff.dml_did import DMLDiD
|
|
100
|
+
from diff_diff.dml_did_results import DMLDiDResults
|
|
98
101
|
from diff_diff.efficient_did import (
|
|
99
102
|
EDiDBootstrapResults,
|
|
100
103
|
EfficientDiD,
|
|
@@ -160,6 +163,8 @@ from diff_diff.local_linear import (
|
|
|
160
163
|
)
|
|
161
164
|
from diff_diff.lpdid import LPDiD
|
|
162
165
|
from diff_diff.lpdid_results import LPDiDResults
|
|
166
|
+
from diff_diff.lwdid import LWDiD
|
|
167
|
+
from diff_diff.lwdid_results import LWDiDResults
|
|
163
168
|
from diff_diff.mmm import (
|
|
164
169
|
MeridianROIPrior,
|
|
165
170
|
meridian_calibration_mask,
|
|
@@ -366,7 +371,7 @@ def __getattr__(name: str) -> _Any:
|
|
|
366
371
|
raise AttributeError(f"module 'diff_diff' has no attribute {name!r}")
|
|
367
372
|
|
|
368
373
|
|
|
369
|
-
__version__ = "3.
|
|
374
|
+
__version__ = "3.11.0"
|
|
370
375
|
__all__ = [
|
|
371
376
|
# Estimators
|
|
372
377
|
"DifferenceInDifferences",
|
|
@@ -459,6 +464,13 @@ __all__ = [
|
|
|
459
464
|
# LPDiD (Local Projections DiD)
|
|
460
465
|
"LPDiD",
|
|
461
466
|
"LPDiDResults",
|
|
467
|
+
# LWDiD (Lee & Wooldridge rolling transformation DiD)
|
|
468
|
+
"LWDiD",
|
|
469
|
+
"LWDiDResults",
|
|
470
|
+
# DMLDiD (Chang 2020 double/debiased ML DiD)
|
|
471
|
+
"DMLDiD",
|
|
472
|
+
"DMLDiDResults",
|
|
473
|
+
"SieveLearner",
|
|
462
474
|
# Visualization
|
|
463
475
|
"plot_bacon",
|
|
464
476
|
"plot_event_study",
|