I have a pandas Dataframe of events like the following:
| date | user | amount |
|---|---|---|
| 2021-01-01 | Adam | 10 |
| 2021-01-01 | Bernice | 15 |
| 2021-01-02 | Adam | 5 |
| 2021-01-06 | Carl | 8 |
And a pandas Series of dates like ["2021-01-03", "2021-01-12"]
I'm trying to collect stats about the events for the 7 days before each date in the dates series. My target output looks like this:
| date | unique_users | average_amount | total_amount |
|---|---|---|---|
| 2021-01-03 | 2 | 10 | 30 |
| 2021-01-12 | 1 | 8 | 8 |
Is there an efficient way to do this in Pandas? This is my current solution, but it doesn't leverage pandas functions so is pretty slow:
import datetime as dt
import pandas as pd
df = pd.DataFrame({
"date": [dt.date(2021, 1, 1), dt.date(2021, 1, 1), dt.date(2021, 1, 2), dt.date(2021, 1, 6)],
"user": ["a", "b", "a", "c"],
"amount": [10, 15, 5, 8],
})
dates = pd.Series([dt.date(2021, 1, 3), dt.date(2021, 1, 12)])
records = []
for date in dates:
idx = (
(df["date"] < date)
& (df["date"] >= date - dt.timedelta(days=7))
)
filtered = df.loc[idx]
record = {
"date": date,
"unique_users": filtered["user"].nunique(),
"average_amount": filtered["amount"].mean(),
"total_amount": filtered["amount"].sum(),
}
records.append(record)
df2 = pd.DataFrame(records)
print(df2)