Ответ вслух Senior Даты и время обновлено

Сессии по таймауту в pandas

Вопрос

Как разбить поток событий пользователей на сессии с таймаутом 30 минут в pandas?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сортирую по user и ts. Считаю паузу: gap = df.groupby("user")["ts"].diff().

Что должно прозвучать в ответе

  • Сортировка по пользователю и времени

  • Групповой `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 ошибок.

Термины по теме