Время между заказами клиента в pandas
Вопрос
Как в pandas посчитать для каждого клиента среднее время между соседними заказами?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Привести `ts` к datetime и отсортировать по `user`, `ts`
`groupby("user")["ts"].diff()` вместо обычного `diff`
Первая строка клиента NaT, её не учитывать
Перевести Timedelta в дни: `.dt.total_seconds() / 86400`
Агрегировать по клиенту: среднее и медиана
Клиенты с одним заказом без значения, их обработать отдельно
Что могут спросить следом
- Почему медиана может быть полезнее среднего?
- Как сделать то же в SQL?
- Как посчитать долю клиентов, вернувшихся в течение 30 дней?
Разбор
Привожу время к datetime через pd.to_datetime, сортирую по клиенту и времени. Затем df["gap"] = df.groupby("user")["ts"].diff(): групповой diff не перескакивает между клиентами, у первого заказа каждого клиента будет NaT. Перевожу в дни через dt.total_seconds() / 86400 и агрегирую groupby("user")["gap_days"].agg(["mean", "median"]), NaT при этом пропускаются. Медиану показываю рядом, потому что интервалы скошены: один перерыв в полгода сильно двигает среднее. Клиенты с одним заказом получат NaN, это отдельный сегмент, их не стоит молча выкидывать. В SQL то же самое делают через LAG(ts) OVER (PARTITION BY user ORDER BY ts).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Окна и сдвиги»
- rolling с center=True в признаках
- Дней с предыдущего заказа клиента
- Самая длинная серия дней подряд: diff и cumsum
- Скользящее среднее за 7 дней с пропусками дат
- Накопительная доля выручки клиента
- Номер заказа клиента
- diff и pct_change
- Порядок шагов: интервалы между заказами