Ответ вслух Middle pivot, melt и сводные спрашивают часто обновлено

Когортный анализ retention в pandas

Вопрос

Как в pandas построить таблицу retention по месячным когортам из таблицы событий (user_id, event_date)?

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

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

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

Коротко

Сначала определяю когорту: месяц первого события пользователя, transform("min") по userid и toperiod("M"). Затем возраст: разница между месяцем события и месяцем когорты в месяцах, для периодов это просто вычитание и .apply(lambda x: x.n) или через год и месяц.

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

  • Когорта: месяц первого события через `groupby("user_id")["event_date"].transform("min")`

  • Номер месяца жизни: разница периодов `to_period("M")`

  • Уникальные пользователи по `(cohort, age)` через `nunique`

  • `pivot` в таблицу когорта × месяц жизни

  • Деление на нулевой месяц `div(..., axis=0)`

  • Оговорить определение активности и незавершённые когорты

Что могут спросить следом

  • Почему последние когорты выглядят хуже?
  • Чем retention отличается от rolling retention?
  • Как построить такую таблицу в SQL?

Разбор

Сначала определяю когорту: месяц первого события пользователя, transform("min") по user_id и to_period("M"). Затем возраст: разница между месяцем события и месяцем когорты в месяцах, для периодов это просто вычитание и .apply(lambda x: x.n) или через год и месяц. Дальше считаю уникальных пользователей на пару (cohort, age) через groupby и nunique, разворачиваю pivot(index="cohort", columns="age"). Retention: делю каждую строку на нулевой месяц, div(cohorts[0], axis=0). Отдельно оговариваю, что считается активностью, и что у свежих когорт правый край таблицы неполный: последний месяц ещё не закончился, сравнивать его с остальными нельзя.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.