Сессии по таймауту в pandas
Вопрос
Как разбить поток событий пользователей на сессии с таймаутом 30 минут в pandas?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Сортировка по пользователю и времени
Групповой `diff` по времени
Новая сессия: первая строка пользователя или пауза больше 30 минут
`cumsum` булевой маски даёт номер сессии
Агрегаты по сессии: длительность, число событий
Граничные случаи: сессия через полночь, одинаковые ts
Что могут спросить следом
- Как сделать то же в SQL?
- Что поменяется, если сессия ограничена ещё и сутками?
Разбор
Сортирую по user и ts. Считаю паузу: gap = df.groupby("user")["ts"].diff(). Новая сессия начинается, если это первое событие пользователя (gap равен NaT) или пауза больше 30 минут: new = gap.isna() | (gap > pd.Timedelta("30min")). Номер сессии получаю накопительной суммой маски: df["session"] = new.cumsum(), он сквозной и уникальный для всей таблицы. Дальше groupby("session") даёт длительность через max - min и число событий. Сессия через полночь при этом не рвётся, и это обычно правильно, а если продукт требует резать по суткам, добавляю в условие смену даты. В SQL то же делают через LAG и накопительную SUM по флагу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.