Metadata-Version: 2.4
Name: differences
Version: 0.3.0
Summary: difference-in-differences estimation and inference in Python
Author-email: Bernardo Dionisi <bernardo.dionisi@gmail.com>
License: GPLv3
Project-URL: Homepage, https://github.com/bernardodionisi/differences
Project-URL: Source, https://github.com/bernardodionisi/differences
Project-URL: Issues, https://github.com/bernardodionisi/differences/issues
Project-URL: Documentation, https://bernardodionisi.github.io/differences/latest/
Keywords: did,difference-in-differences,panel data,econometrics,causal inference
Classifier: Intended Audience :: Science/Research
Classifier: Intended Audience :: Education
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy>=1.19
Requires-Dist: scipy>=1.8
Requires-Dist: pandas>=1.2
Requires-Dist: statsmodels<1.0,>=0.14
Requires-Dist: formulaic<2,>=1.0
Requires-Dist: tqdm>=4.64.1
Requires-Dist: joblib>=1.2.0
Requires-Dist: typing_extensions>=4.0.0
Requires-Dist: polars>=1.32
Provides-Extra: all
Requires-Dist: numpy>=1.19; extra == "all"
Requires-Dist: scipy>=1.8; extra == "all"
Requires-Dist: pandas>=1.2; extra == "all"
Requires-Dist: statsmodels<1.0,>=0.14; extra == "all"
Requires-Dist: formulaic<2,>=1.0; extra == "all"
Requires-Dist: tqdm>=4.64.1; extra == "all"
Requires-Dist: joblib>=1.2.0; extra == "all"
Requires-Dist: typing_extensions>=4.0.0; extra == "all"
Requires-Dist: linearmodels; extra == "all"
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: pytest-cov; extra == "test"
Requires-Dist: pytest-xdist; extra == "test"
Requires-Dist: nox; extra == "test"
Requires-Dist: pyarrow; extra == "test"
Provides-Extra: lint
Requires-Dist: ruff==0.9.2; extra == "lint"
Provides-Extra: typing
Requires-Dist: mypy; extra == "typing"
Provides-Extra: docs
Requires-Dist: sphinx-tutorials==0.0.7; extra == "docs"
Dynamic: license-file

<img src="./docs/imgs/logo/bw/logo_name_bw.png" alt="drawing" width="200"
style="display: block;margin-left: auto;margin-right: auto;width: 80%;"/>

difference-in-differences estimation and inference for Python

**For the following use cases**

- Balanced panels, unbalanced panels & repeated cross-section
- Two + Multiple time periods
- Fixed + Staggered treatment timing
- Binary + Multi-Valued treatment
- Heterogeneous treatment effects & triple difference
- Parallelized estimation & multiplier bootstrap (joblib, via `n_jobs`)

see the [Documentation](https://bernardodionisi.github.io/differences/latest/) for more details.

## Installing

The latest release can be installed using pip

```bash
pip install differences
```

requires Python >= 3.10

## Quick Start

### ATTgt

the ATTgt class implements the estimation procedures suggested by [Callaway and Sant'Anna (2021)
](https://www.sciencedirect.com/science/article/abs/pii/S0304407620303948), [Sant'Anna and Zhao
(2020)](https://www.sciencedirect.com/science/article/abs/pii/S0304407620301901) and the
multi-valued treatment case discussed
in [Callaway, Goodman-Bacon & Sant'Anna (2021)](https://arxiv.org/abs/2107.02637)

```python
import differences

df = differences.generate_data()  # requires the [all] extra: pip install differences[all]

att_gt = differences.ATTgt(data=df, cohort_column='cohort')

att_gt.fit(formula='y', n_jobs=-1)

att_gt.aggregate('event')
```

*differences* ATTgt was inspired by
- Callaway & Sant'Anna's [did](https://github.com/bcallaway11/did)
- Sant'Anna and Zhao's [DRDID](https://github.com/pedrohcgs/DRDID)
