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
27 changes: 27 additions & 0 deletions diff_diff/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,20 @@
load_mpdta,
)

# Estimator aliases — short names for convenience
DiD = DifferenceInDifferences
TWFE = TwoWayFixedEffects
EventStudy = MultiPeriodDiD
SDiD = SyntheticDiD
CS = CallawaySantAnna
CDiD = ContinuousDiD
SA = SunAbraham
BJS = ImputationDiD
Gardner = TwoStageDiD
DDD = TripleDifference
Stacked = StackedDiD
Bacon = BaconDecomposition

__version__ = "2.6.0"
__all__ = [
# Estimators
Expand All @@ -174,6 +188,19 @@
"TripleDifference",
"TROP",
"StackedDiD",
# Estimator aliases (short names)
"DiD",
"TWFE",
"EventStudy",
"SDiD",
"CS",
"CDiD",
"SA",
"BJS",
"Gardner",
"DDD",
"Stacked",
"Bacon",
# Bacon Decomposition
"BaconDecomposition",
"BaconDecompositionResults",
Expand Down
6 changes: 6 additions & 0 deletions docs/api/estimators.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ for backward compatibility, so you can import any of them using:

from diff_diff import DifferenceInDifferences, TwoWayFixedEffects, MultiPeriodDiD, SyntheticDiD

Most estimators have short aliases (``TROP`` already uses its short canonical name):

.. code-block:: python

from diff_diff import DiD, TWFE, EventStudy, SDiD, CS, CDiD, SA, BJS, Gardner, DDD, Stacked, Bacon

.. module:: diff_diff.estimators

DifferenceInDifferences
Expand Down
3 changes: 3 additions & 0 deletions docs/quickstart.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ The simplest DiD design has two groups (treated/control) and two periods (pre/po
import pandas as pd
from diff_diff import DifferenceInDifferences, generate_did_data

# Tip: most estimators have short aliases, e.g. DiD, TWFE, CS, DDD
# from diff_diff import DiD

# Generate synthetic data with a known treatment effect
data = generate_did_data(
n_units=100,
Expand Down
35 changes: 35 additions & 0 deletions tests/test_aliases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""Tests for estimator short aliases."""

import diff_diff


def test_alias_identity():
"""Each alias is the same class object as the full name."""
assert diff_diff.DiD is diff_diff.DifferenceInDifferences
assert diff_diff.TWFE is diff_diff.TwoWayFixedEffects
assert diff_diff.EventStudy is diff_diff.MultiPeriodDiD
assert diff_diff.SDiD is diff_diff.SyntheticDiD
assert diff_diff.CS is diff_diff.CallawaySantAnna
assert diff_diff.CDiD is diff_diff.ContinuousDiD
assert diff_diff.SA is diff_diff.SunAbraham
assert diff_diff.BJS is diff_diff.ImputationDiD
assert diff_diff.Gardner is diff_diff.TwoStageDiD
assert diff_diff.DDD is diff_diff.TripleDifference
assert diff_diff.Stacked is diff_diff.StackedDiD
assert diff_diff.Bacon is diff_diff.BaconDecomposition


def test_aliases_in_all():
"""All aliases are listed in __all__."""
aliases = [
"DiD", "TWFE", "EventStudy", "SDiD", "CS", "CDiD",
"SA", "BJS", "Gardner", "DDD", "Stacked", "Bacon",
]
for alias in aliases:
assert alias in diff_diff.__all__, f"{alias} missing from __all__"


def test_alias_instantiation():
"""Instantiating via alias produces the correct type."""
model = diff_diff.DiD()
assert isinstance(model, diff_diff.DifferenceInDifferences)