Ответ вслух Middle Окна и сдвиги спрашивают часто обновлено

Время между заказами клиента в pandas

Вопрос

Как в pandas посчитать для каждого клиента среднее время между соседними заказами?

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

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

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

Коротко

Привожу время к datetime через pd.todatetime, сортирую по клиенту и времени. Затем df["gap"] = df.groupby("user")["ts"].diff(): групповой diff не перескакивает между клиентами, у первого заказа каждого клиента будет NaT.

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

  • Привести `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 ошибок.