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
7 changes: 3 additions & 4 deletions doubleml/did/datasets/dgp_did_CS2021.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,16 +313,15 @@ def make_did_CS2021(n_obs=1000, dgp_type=1, include_never_treated=True, time_typ
if anticipation_periods > 0:
# filter time periods
df = df[df["t"] >= time_periods[anticipation_periods]]
# filter treatment after anticipation periods
df = df[(df["d"] <= time_periods[-(anticipation_periods + 1)]) | pd.isna(df["d"])]
# filter treatment after anticipation periods (never treated: NaT for datetime, inf for float)
never_treated = pd.isna(df["d"]) if time_type == "datetime" else np.isinf(df["d"])
df = df[(df["d"] <= time_periods[-(anticipation_periods + 1)]) | never_treated]

# update time periods by subtracting time delta
if time_type == "datetime":
df = df[(df["d"] <= time_periods[-(anticipation_periods + 1)]) | pd.isna(df["d"])]
df["t"] = df["t"].apply(lambda x: x - pd.DateOffset(months=anticipation_periods))
else:
assert time_type == "float"
df = df[(df["d"] <= time_periods[-(anticipation_periods + 1)]) | np.isinf(df["d"])]
df["t"] = df["t"] - anticipation_periods

return df
15 changes: 15 additions & 0 deletions doubleml/did/tests/test_datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,21 @@ def test_make_did_CS2021_return_types(dgp_type, include_never_treated, time_type
assert isinstance(df, pd.DataFrame)


@pytest.mark.ci
@pytest.mark.parametrize("anticipation_periods", [0, 1, 2])
def test_make_did_CS2021_time_types_equivalent(anticipation_periods):
"""Datetime and float time types simulate the same panel, including all never-treated units."""
np.random.seed(3141)
df_dt = make_did_CS2021(n_obs=200, time_type="datetime", anticipation_periods=anticipation_periods)
np.random.seed(3141)
df_fl = make_did_CS2021(n_obs=200, time_type="float", anticipation_periods=anticipation_periods)

pd.testing.assert_frame_equal(df_dt.drop(columns=["d", "t"]), df_fl.drop(columns=["d", "t"]))
never_treated = np.isinf(df_fl["d"])
np.testing.assert_array_equal(pd.isna(df_dt["d"]), never_treated)
assert never_treated.any()


@pytest.mark.ci
def test_make_did_CS2021_exceptions():
msg = r"time_type must be one of \('datetime', 'float'\). Got 2."
Expand Down
Loading