diff --git a/diff_diff/__init__.py b/diff_diff/__init__.py index f6eb9a20..2fe3f160 100644 --- a/diff_diff/__init__.py +++ b/diff_diff/__init__.py @@ -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 @@ -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", diff --git a/docs/api/estimators.rst b/docs/api/estimators.rst index 01764379..92585015 100644 --- a/docs/api/estimators.rst +++ b/docs/api/estimators.rst @@ -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 diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 41a3690b..2ba32cec 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -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, diff --git a/tests/test_aliases.py b/tests/test_aliases.py new file mode 100644 index 00000000..a6d51112 --- /dev/null +++ b/tests/test_aliases.py @@ -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)