Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ target/
.claude/paper-review/
.claude/scheduled_tasks.lock

# Playwright MCP browser-session artifacts
.playwright-mcp/

# MCP configuration (may contain tokens)
.mcp.json

Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
ignores) with `warn_unused_ignores = true` to keep them from going stale — 23
already-stale ignores were removed. Tightening tracked in TODO.md. No public
API or numerical behavior change.
- **`load_prop99` + `load_walmart` dataset loaders.** California Proposition 99
smoking panel (39 states, single treated unit, Lee-Wooldridge cohort format) and
the Walmart entry county panel (1,277 counties, staggered 1986-1999 openings,
Brown & Butts CBP construction), downloaded with local caching from the
MIT-licensed ancillary data of the authors' Stata `lwdid` package (SSC).
Every byte-load is verified against a pinned SHA-256 and the parsed panels are
validated against their source invariants; if the real data cannot be obtained,
a seeded same-schema synthetic fallback is returned with an explicit
`UserWarning` and `df.attrs["source"] = "synthetic_fallback"`.
- **Internal: rdrobust sharp-RD bandwidth-selection port (`diff_diff/_rdrobust_port.py`).**
Step-1 machinery for the `RegressionDiscontinuity` estimator above: a faithful
pure-Python NumPy/SciPy port of R `rdrobust` 4.0.0's `rdbwselect` sharp-RD path (all 10 data-driven
Expand Down
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ generic sparse-FE, QR+SVD rank-detection redundancy, `check_finite` bypass — m
| ChangesInChanges/QDiD tutorial notebook (2x2 distributional walkthrough: QTE grid, interior range, uniform bands, CiC-vs-QDiD comparison) - deferred from the implementation PR as a documented decision. | `docs/tutorials/` | #682 | Mid | Low |
| Tighten the mypy suppressions that back the enforced-zero posture: burn down `prep_dgp`'s per-module `[index]` override (needs a None-vs-array restructure that preserves the seeded RNG stream), and evaluate re-enabling the globally disabled codes (`arg-type`, `return-value`, `var-annotated`, `assignment`) one at a time — `assignment` alone hid several real annotation drifts found during the 2026-07 triage. | `pyproject.toml` `[tool.mypy]`, `diff_diff/prep_dgp.py` | lint-CI | Mid | Low |
| `practitioner_next_steps()` dedicated handler for `ChangesInChangesResults` (currently falls back to `_handle_generic`, which is safe; a dedicated handler is the established full-integration step, cf. HAD Phase 5). | `diff_diff/practitioner.py` | #682 | Quick | Low |
| Align the four legacy dataset loaders (`load_card_krueger`, `load_castle_doctrine`, `load_divorce_laws`, `load_mpdta`) with the loud-fallback pattern of `load_prop99`/`load_walmart`: `UserWarning` + `df.attrs["source"]` marker on synthetic fallback (currently silent), plus optional checksum pinning for the CSV downloads. | `diff_diff/datasets.py` | LWDiD precursor | Quick | Low |

---

Expand Down
4 changes: 4 additions & 0 deletions diff_diff/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@
load_dataset,
load_divorce_laws,
load_mpdta,
load_prop99,
load_walmart,
)
from diff_diff.diagnostic_report import (
DIAGNOSTIC_REPORT_SCHEMA_VERSION,
Expand Down Expand Up @@ -537,6 +539,8 @@
"load_castle_doctrine",
"load_divorce_laws",
"load_mpdta",
"load_prop99",
"load_walmart",
"load_dataset",
"list_datasets",
"clear_cache",
Expand Down
Loading
Loading