What's Changed
Major Changes 馃洜
- Add Pipeline workflow with sensitivity checks, report generation, and documentation by @drbenvincent in #749 [EXPERIMENTAL - see below]
- Add
PanelRegressionexperiment class for fixed effects estimation by @drbenvincent with @Copilot in #628 - Add Bayesian Synthetic Difference-in-Differences by @thomaspinder in #823
New Features 馃帀
- feat: add legend_kwargs parameter to BaseExperiment.plot() by @haoyu-haoyu in #831
- Implement summary method for InstrumentalVariable by @anevolbap in #851
- Document and test the outcome-scale prediction contract by @drbenvincent in #1020
Bugfixes 馃悰
- Fix simulate_data.py reproducibility + remove synthetic CSVs by @louismagowan in #794
- Fix mypy type: ignore codes in panel_regression.py by @anevolbap in #853
- ci: pin pyproject2conda==0.22.1 to work around 0.23.0 regression by @drbenvincent in #878
- Standardise HDI_PROB usage across experiments and reporting by @drbenvincent in #891
- Wire hdi_prob through every Bayesian plot method by @drbenvincent in #893
- Fix inline bullet list rendering in docstrings (closes #892) by @drbenvincent in #897
- Fix IPW plot crash with extreme propensity scores by @anevolbap in #854
- fix(ipw): preserve treatment design_info instead of overwriting with covariates by @haoyu-haoyu in #842
- Warn when staggered DiD ATTs lack untreated-period support by @drbenvincent in #949
- Fix #664: clone sklearn models to avoid mutating fit_intercept by @aahammer-eu in #942
- Fix DiD interaction-term matching by @drbenvincent in #1001
- Parse DiD interaction terms with Patsy by @drbenvincent in #1003
- Use Patsy response vectors for transformed formula LHS by @drbenvincent in #1004
- Validate exact treated predictors in RD and RK by @drbenvincent in #1005
- Classify panel fixed effects with Patsy metadata by @drbenvincent in #1006
- Parse PiecewiseITS transforms with Patsy metadata by @drbenvincent in #1008
- Treat datetime formula predictors as continuous by @drbenvincent in #1007
- Reject unsorted or duplicate ITS time indexes before fitting by @drbenvincent in #1019
- Fix residual-shape broadcasting bug in OLS DiD effect_summary (~70x SE inflation) by @Mari1988 in #1026
- Fix biased SE denominator in OLS DiD effect_summary (SSR/n -> SSR/(n-p)) by @Mari1988 in #1025
- Fix biased SE denominator in OLS RD effect_summary (SSR/n -> SSR/(n-p)) by @Mari1988 in #1027
Documentation 馃摉
- Add knowledgebase guide for custom PyMC models by @drbenvincent in #741
- Update
README.mdand docs homepage by @drbenvincent in #648 - Elevate consulting CTA up page + minor docs tweaks by @drbenvincent in #815
- Add central guide for pipeline sensitivity checks by @drbenvincent in #818
- docs: fix Sphinx build warnings by @anevolbap in #834
- Self-hosted contributors image + weekly regen workflow by @drbenvincent in #856
- Replace plot() *args/**kwargs with explicit signatures (#886) by @drbenvincent in #894
- Add PyMarkdown pre-commit hook for repository Markdown files by @drbenvincent in #900
- Add full notebook re-execution mode by @anevolbap in #855
- chore: enforce stricter ruff on docs notebooks (#574) by @anevolbap in #868
- Add StaggeredDiD group-time effect plots by @drbenvincent in #939
- Widen numpydoc-validation checks across causalpy by @drbenvincent in #902
- Enforce single top-level markdown heading per docs notebook by @drbenvincent in #866
- Update contributors image by @github-actions[bot] in #965
- Fix numpydoc docstring section ordering by @drbenvincent in #971
- Comparison notebook: Why flexibility matters? by @cetagostini in #703
- Example Gallery by @juanitorduz in #558
- Fix how-to gallery hidden toctree MyST syntax by @drbenvincent in #986
- Update contributors image by @github-actions[bot] in #1010
- Clarify causal estimand extraction approaches by @drbenvincent in #1033
- docs: restore per-document bibliographies after sphinxcontrib-bibtex 2.7.0 by @anevolbap in #909
Agent-related 馃
- Add scope-drift escalation to pr-to-green by @drbenvincent in #812
- Clarify reuse-first Python environment guidance by @drbenvincent in #808
- Add sub-issue discovery to github-issues skill by @drbenvincent in #817
- Add maintainer PR review skill by @drbenvincent in #920
- Add ARCHITECTURE.md for agent and contributor onboarding by @drbenvincent in #924
- Separate developer and user agent skills by @drbenvincent in #927
- Improve user/agent facing skills by @drbenvincent in #929
- Slim ARCHITECTURE.md and reference it from CONTRIBUTING.md by @drbenvincent in #945
- Add deterministic structural check scripts by @drbenvincent in #948
- Refresh agent skills layout by @drbenvincent in #952
- Redesign CausalPy method selection skill by @drbenvincent in #931
- Align agent skill names with directory and file conventions by @drbenvincent in #1015
- Strengthen PR review probes and summaries by @drbenvincent in #1061
Maintenance 馃敡
- Swap pre-commit workflows to prek by @drbenvincent in #780
- Fix blocking Matplotlib windows during pytest by @drbenvincent in #782
- Update github-issues skill with parent-child sub-issue workflow by @drbenvincent in #784
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #803
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #805
- Fix its_lift_test notebook compatibility with newer pymc-marketing by @drbenvincent in #811
- Handle xtensor BSTS pymc-marketing components by @drbenvincent in #813
- Cap ArviZ below 1.0 pending migration by @drbenvincent in #810
- Add maketables plugin MVP for core experiments by @drbenvincent in #773
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #828
- Clean up experiments/: typos, annotations, and constants by @louismagowan in #796
- Add SoftmaxWeightedSumFitter for synthetic control by @thomaspinder in #822
- docs: improve parameter docstrings in InversePropensityWeighting class by @haoyu-haoyu in #832
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #839
- Remove numpy<2.4 pin now that pytensor fix is released by @drbenvincent in #781
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #859
- chore: pin pymc<6 and pytensor<3 to current major versions by @anevolbap in #906
- fix: SDiD plot() API and sdid_pymc notebook ruff compliance by @drbenvincent in #919
- Fix ITS plot when post-period has a single observation by @drbenvincent in #895
- docs: clarify IV example labels (#499) by @anevolbap in #907
- Fix scalar score coercions for mypy by @drbenvincent in #940
- ci(docs-preview): cancel when not in defined scopes of git diff by @RussellSB in #943
- Add local patch coverage gate by @drbenvincent in #951
- Add outcome falsification, random placebo folds, and model clone support by @cetagostini in #826
- Skip welcome workflow for bot accounts by @drbenvincent in #956
- Bump pre-commit hooks and fix PyMarkdown MD032 violations by @drbenvincent in #957
- ci: harden welcome.yml and silence zizmor dangerous-triggers by @anevolbap in #908
- ci: install test job env via micromamba (refs #279) by @anevolbap in #910
- ci: consolidate pyproject2conda invocation through the prek hook by @drbenvincent in #882
- Consolidate experiment design-matrix attributes into xr.Dataset by @drbenvincent in #849
- refactor: centralize PyMC/sklearn dispatch in ModelAdapter by @drbenvincent in #961
- refactor: normalize sklearn fit inputs and collapse backend branches by @drbenvincent in #962
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #969
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #973
- [plotting] Allow user to specify type of posterior data visualisation by @AllenDowney in #680
- fix: make three-period ITS test fixtures order-independent by @anevolbap in #960
- Rename internal plot_xY to plot_posterior_over_x by @drbenvincent in #987
- Require a valid group*post_treatment interaction term in DiD formulas by @Mari1988 in #993
- Make OLS causal_impact lookup order-independent for the DiD interaction term by @Mari1988 in #994
- docs: rename demo notebooks to descriptive slugs (#840) by @anevolbap in #861
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #1012
- Add validation to _data_setter for non-standard data node names by @drbenvincent in #847
- Add pymc_forecast model-provider adapter for InterruptedTimeSeries by @twiecki in #1014
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #1031
- Align local patch coverage gate with Codecov (split from #1024) by @drbenvincent in #1034
- Unify predict() to a canonical prediction container and delete the parallel legacy paths by @drbenvincent in #1036
- Unify
_bayesian_plot/_ols_plotinto a single backend-agnostic_plotby @drbenvincent in #1053 - Add seeded batch plot-generation script for visual regression review by @drbenvincent in #1054
- Dispatch remaining Bayesian/OLS branches on posterior size, not backend identity by @drbenvincent in #1057
- Make InferenceData capability explicit at adapter seam by @drbenvincent in #1058
- Canonical score contract across model backends by @drbenvincent in #1059
- Prepare 0.9.0 release by @drbenvincent in #1095
New Contributors
- @thomaspinder made their first contribution in #822
- @haoyu-haoyu made their first contribution in #832
- @RussellSB made their first contribution in #943
- @aahammer-eu made their first contribution in #942
- @AllenDowney made their first contribution in #680
- @Mari1988 made their first contribution in #993
- @twiecki made their first contribution in #1014
Full Changelog: 0.8.0...0.9.0
Experimental features and known limitations
The pipeline API is usable, but its newer diagnostic workflows are still evolving. Treat PlaceboInTime results as exploratory: fold selection and end-to-end random-seed reproducibility have known limitations.
The optional pymc-forecast backend for Interrupted Time Series is experimental. Core fitting and impact estimation are supported, but .summary() is not yet supported for forecast-backed models.
BayesianBasisExpansionTimeSeries default priors may be unsuitable for large-magnitude outcomes; inspect fitted counterfactuals and use scale-appropriate priors.