Empirical economics and causal inference in Python - a scikit-learn-style unified API with Stata/R-grade numerical parity.
Project description
open-econs
open-econs is a Python library for empirical economics and causal inference that reproduces Stata and R results to a verified numerical tolerance — built for researchers migrating off Stata/R and for Python users who need causal inference, it is the econometrics toolkit a Stata/R researcher would reach for, but native in Python.
Unlike statsmodels, linearmodels, or fixest, open-econs is validated against Stata and R across the whole causal-inference stack: 550+ parity tests (330+ vs Stata, 220+ vs R) run in CI on every release, and a numerical mismatch fails the build before it ships. New methods are checked to ≤1e-6; IV, Arellano-Bond, and synthetic control reproduce reference results to machine precision.
It covers 40+ estimators in one consistent API: OLS, fixed effects, IV/2SLS, GMM & Arellano-Bond, logit/probit/mlogit, Oaxaca-Blinder, nonlinear least squares, the full difference-in-differences family (Callaway-Sant'Anna, Sun-Abraham, Gardner DID2S, event studies), regression discontinuity, propensity-score & coarsened-exact matching, synthetic control with permutation inference, and a time-series module (ARIMA, VAR/VECM, GARCH, ARDL/UECM with the Pesaran-Shin-Smith bounds test, unit-root & cointegration).
Install
pip install open-econs # core estimators
pip install open-econs[plot] # + matplotlib for .plot()
pip install open-econs[nls] # + sympy for nls()
pip install open-econs[dev,lint] # + development & linting tools
Requires Python ≥ 3.10.
Quick start
import open_econs as oe
import pandas as pd
df = pd.DataFrame({
"income": [30, 45, 55, 70, 85, 40, 60, 95],
"education": [10, 12, 14, 16, 18, 11, 15, 20],
"age": [25, 30, 35, 40, 45, 28, 38, 50],
"female": [0, 0, 0, 0, 1, 1, 1, 1],
"province": ["A","A","B","B","C","C","A","B"],
})
r = oe.ols("income ~ education + age", data=df, cluster="province")
print(r.tidy()) # coefficient table (named pd.DataFrame)
print(r.summary()) # full OLS results
# Causal estimators use the same API:
oe.did_cs("y ~ x1 + x2 | group + time", data=panel_df) # Callaway-Sant'Anna DiD
oe.psm("treat ~ x1 + x2", data=df) # propensity-score matching
oe.synth(...) # synthetic control
Every result returns named pd.Series / pd.DataFrame outputs and exports to
JSON, CSV, LaTeX, or HTML with one call — .export(), .to_latex(),
.to_html(). Results are immutable after estimation.
Stata / R → open-econs (top mappings)
| Stata / R | open-econs |
|---|---|
regress (Stata) |
oe.ols() |
xtreg, fe (Stata) |
oe.fe() |
ivregress 2sls / AER::ivreg |
oe.iv() |
xtabond2 (Stata) |
oe.abond() |
csdid (Stata) / did (R) |
oe.did_cs() |
eventstudyinteract (Stata) / fixest::sunab (R) |
oe.did_sa() |
did2s (Stata) / fixest::did2s (R) |
oe.did_gardner() |
rdrobust (Stata) |
oe.rdd() |
teffects psmatch (Stata) / MatchIt (R) |
oe.psm() |
synth_runner (Stata) / synth (R) |
oe.synth() / oe.placebo_space() / oe.placebo_time() |
Full mapping: docs/stata-r-mapping.md. Migration guides: Stata / R.
Performance
v1.0.3 hardens hot loops with bit-identical vectorization/parallelization —
no parity tolerance loosened: psm is ~4× faster (k-NN + variance loops
batched), _hac_S Newey-West accumulation is a single einsum, and did_cs
bootstrap runs through an opt-in parallel= pool. GPU offload was evaluated
and deliberately declined (BLAS is already CPU-threaded). Full detail:
docs/performance.md.
Compare
open-econs is the only Python library covering the full causal-inference stack and enforcing Stata/R parity. The side-by-side matrix against statsmodels, linearmodels, and fixest is here: docs/comparison.md.
Documentation
- Methodology — per-estimator math, assumptions, inference, and Stata/R equivalents.
- Tutorials — OLS, FE, IV, DiD, RDD, PSM, synthetic control walkthroughs.
- Roadmap · Changelog · v1.1.0 release notes · v1.0.3 release notes
Development
pip install -e ".[dev]"
python -m pytest tests/
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file open_econs-1.1.0.tar.gz.
File metadata
- Download URL: open_econs-1.1.0.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e535b684d9ee8c093e58438496f27210516415c3e54c722ad28a12536df734a
|
|
| MD5 |
4606036ea88d3d639b206fb0c824b8e5
|
|
| BLAKE2b-256 |
8736ce21bbab8684ba7384deee0e52446ae899250595e6e785d4367d645e9c16
|
Provenance
The following attestation bundles were made for open_econs-1.1.0.tar.gz:
Publisher:
publish.yml on qmanhbeo/open-econs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_econs-1.1.0.tar.gz -
Subject digest:
8e535b684d9ee8c093e58438496f27210516415c3e54c722ad28a12536df734a - Sigstore transparency entry: 2195310684
- Sigstore integration time:
-
Permalink:
qmanhbeo/open-econs@2cab03fce7756cd84f1898747e58ced18e3da5cf -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/qmanhbeo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2cab03fce7756cd84f1898747e58ced18e3da5cf -
Trigger Event:
release
-
Statement type:
File details
Details for the file open_econs-1.1.0-py3-none-any.whl.
File metadata
- Download URL: open_econs-1.1.0-py3-none-any.whl
- Upload date:
- Size: 218.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5bdca1575951148be06e7b933b9b592358aee3c9861672255fe68932d68fe026
|
|
| MD5 |
d0f1051692cb99245c08727a7dcb1ac6
|
|
| BLAKE2b-256 |
5d735ef2cf89b877ac7f0c1bbc3b617d8fd3fec265dacdaafe5616f77345b90e
|
Provenance
The following attestation bundles were made for open_econs-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on qmanhbeo/open-econs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
open_econs-1.1.0-py3-none-any.whl -
Subject digest:
5bdca1575951148be06e7b933b9b592358aee3c9861672255fe68932d68fe026 - Sigstore transparency entry: 2195310724
- Sigstore integration time:
-
Permalink:
qmanhbeo/open-econs@2cab03fce7756cd84f1898747e58ced18e3da5cf -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/qmanhbeo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2cab03fce7756cd84f1898747e58ced18e3da5cf -
Trigger Event:
release
-
Statement type: