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.
Files changed (127) hide show
  1. {diff_diff-3.9.1 → diff_diff-3.11.0}/PKG-INFO +5 -3
  2. {diff_diff-3.9.1 → diff_diff-3.11.0}/README.md +2 -0
  3. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/__init__.py +13 -1
  4. diff_diff-3.11.0/diff_diff/_crossfit.py +606 -0
  5. diff_diff-3.11.0/diff_diff/_dr_scores.py +506 -0
  6. diff_diff-3.11.0/diff_diff/_learners.py +562 -0
  7. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_reporting_helpers.py +61 -0
  8. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_staggered_triple_diff_engine.py +2 -0
  9. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/aggregation.py +30 -4
  10. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/bootstrap_chunking.py +17 -0
  11. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/bootstrap_utils.py +113 -6
  12. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/business_report.py +59 -5
  13. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/chaisemartin_dhaultfoeuille_results.py +8 -4
  14. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did.py +14 -47
  15. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/datasets.py +5 -1
  16. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/diagnostic_report.py +79 -22
  17. diff_diff-3.11.0/diff_diff/dml_did.py +2327 -0
  18. diff_diff-3.11.0/diff_diff/dml_did_results.py +257 -0
  19. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did.py +57 -52
  20. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_aggregation.py +36 -7
  21. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_bootstrap.py +99 -15
  22. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_covariates.py +60 -10
  23. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_results.py +122 -26
  24. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/estimators.py +16 -4
  25. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms-autonomous.txt +59 -1
  26. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms-full.txt +141 -19
  27. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms-practitioner.txt +50 -14
  28. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/llms.txt +4 -2
  29. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/honest_did.py +45 -26
  30. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation.py +9 -3
  31. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation_results.py +8 -3
  32. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/linalg.py +354 -26
  33. diff_diff-3.11.0/diff_diff/lwdid.py +4499 -0
  34. diff_diff-3.11.0/diff_diff/lwdid_randomization.py +508 -0
  35. diff_diff-3.11.0/diff_diff/lwdid_results.py +826 -0
  36. diff_diff-3.11.0/diff_diff/lwdid_sensitivity.py +907 -0
  37. diff_diff-3.11.0/diff_diff/lwdid_staggered.py +817 -0
  38. diff_diff-3.11.0/diff_diff/lwdid_visualization.py +303 -0
  39. diff_diff-3.11.0/diff_diff/lwdid_wild_bootstrap.py +360 -0
  40. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/mmm.py +21 -1
  41. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/practitioner.py +128 -28
  42. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/pretrends.py +33 -16
  43. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/results.py +2 -0
  44. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/results_base.py +28 -4
  45. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/spillover.py +32 -0
  46. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/stacked_did_results.py +8 -3
  47. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered.py +110 -103
  48. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_aggregation.py +5 -4
  49. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_bootstrap.py +140 -21
  50. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_results.py +151 -32
  51. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_triple_diff.py +2 -2
  52. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/staggered_triple_diff_results.py +8 -3
  53. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/sun_abraham.py +8 -3
  54. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/triple_diff.py +10 -24
  55. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/twfe.py +14 -14
  56. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage_results.py +8 -3
  57. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/utils.py +48 -4
  58. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_event_study.py +133 -18
  59. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_staggered.py +87 -16
  60. {diff_diff-3.9.1 → diff_diff-3.11.0}/pyproject.toml +3 -3
  61. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/Cargo.lock +17 -17
  62. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/Cargo.toml +1 -1
  63. {diff_diff-3.9.1 → diff_diff-3.11.0}/LICENSE +0 -0
  64. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_backend.py +0 -0
  65. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_base.py +0 -0
  66. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_deprecation.py +0 -0
  67. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_guides_api.py +0 -0
  68. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_nprobust_port.py +0 -0
  69. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/_rdrobust_port.py +0 -0
  70. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/agent_workflow.py +0 -0
  71. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/bacon.py +0 -0
  72. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/balancing.py +0 -0
  73. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/chaisemartin_dhaultfoeuille.py +0 -0
  74. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/chaisemartin_dhaultfoeuille_bootstrap.py +0 -0
  75. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/changes_in_changes.py +0 -0
  76. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/changes_in_changes_results.py +0 -0
  77. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/conformal.py +0 -0
  78. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/conley.py +0 -0
  79. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did_aggregation.py +0 -0
  80. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did_bspline.py +0 -0
  81. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/continuous_did_results.py +0 -0
  82. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/diagnostics.py +0 -0
  83. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/efficient_did_weights.py +0 -0
  84. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/guides/__init__.py +0 -0
  85. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/had.py +0 -0
  86. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/had_pretests.py +0 -0
  87. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation_aggregation.py +0 -0
  88. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/imputation_bootstrap.py +0 -0
  89. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/local_linear.py +0 -0
  90. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/lpdid.py +0 -0
  91. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/lpdid_results.py +0 -0
  92. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/power.py +0 -0
  93. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/prep.py +0 -0
  94. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/prep_dgp.py +0 -0
  95. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/profile.py +0 -0
  96. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/rdd.py +0 -0
  97. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/rddensity.py +0 -0
  98. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/rdplot.py +0 -0
  99. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/stacked_did.py +0 -0
  100. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/survey.py +0 -0
  101. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/synthetic_control.py +0 -0
  102. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/synthetic_control_results.py +0 -0
  103. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/synthetic_did.py +0 -0
  104. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop.py +0 -0
  105. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop_global.py +0 -0
  106. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop_local.py +0 -0
  107. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/trop_results.py +0 -0
  108. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage.py +0 -0
  109. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage_aggregation.py +0 -0
  110. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/two_stage_bootstrap.py +0 -0
  111. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/__init__.py +0 -0
  112. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_common.py +0 -0
  113. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_continuous.py +0 -0
  114. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_diagnostic.py +0 -0
  115. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_power.py +0 -0
  116. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/visualization/_synthetic.py +0 -0
  117. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/wooldridge.py +0 -0
  118. {diff_diff-3.9.1 → diff_diff-3.11.0}/diff_diff/wooldridge_results.py +0 -0
  119. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/build.rs +0 -0
  120. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/alloc_profile.rs +0 -0
  121. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/batched_solve.rs +0 -0
  122. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/bootstrap.rs +0 -0
  123. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/demean.rs +0 -0
  124. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/lib.rs +0 -0
  125. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/linalg.rs +0 -0
  126. {diff_diff-3.9.1 → diff_diff-3.11.0}/rust/src/trop.rs +0 -0
  127. {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.9.1
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.2 ; extra == 'dev'
25
- Requires-Dist: mypy==2.3.0 ; extra == 'dev'
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.9.1"
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",