← Назад к списку
ПрограммированиеData Science и MLJunior

Дан DataFrame с заказами (user_id, order_date, amount). Посчитайте для каждого пользователя число заказов, суммарную выручку и дату последнего заказа, а затем выделите топ-5 пользователей по выручке.

Короткий ответ

  • groupby по user_id с именованными агрегатами agg
  • count для числа заказов, sum для выручки, max для даты
  • reset_index, чтобы вернуть обычный DataFrame
  • Топ-5 через nlargest или sort_values с head
  • Проверить типы: order_date должен быть datetime
  • Обсудить пропуски в amount до агрегации

Задача решается одним groupby-agg с именованными агрегатами и выбором топа через nlargest — важно проговорить типы данных и пропуски.

Как сказать вслух

пример ответа

Это классический groupby: группирую по пользователю и одним вызовом agg считаю количество заказов, сумму и максимум даты. Потом беру топ пять по выручке через nlargest. Вслух я бы ещё проговорил проверки: что дата приведена к datetime, а в суммах нет пропусков, иначе агрегаты посчитаются не так, как ожидаем.

Подробный ответ

Основной ответ

Базовая задача на владение pandas: groupby по user_id и метод agg с именованными агрегациями, который сразу даёт понятные имена колонок. Число заказов — count (или size, если нужны строки с NaN), выручка — sum, последний заказ — max по дате. Для топ-5 идиоматичен nlargest(5, 'revenue') — он читабельнее и быстрее полной сортировки. Хороший кандидат проговаривает граничные случаи: order_date нужно привести через pd.to_datetime, пропуски в amount решить явно (count их игнорирует, sum считает как 0 после fillna), а при желании добавить средний чек как производную колонку. На больших данных стоит упомянуть, что цепочка groupby-agg эффективнее циклов по группам на порядки.

Ключевые моменты

  • Именованные агрегаты. agg(orders=('amount','count'), revenue=('amount','sum')) даёт чистые имена без MultiIndex.
  • nlargest вместо сортировки. Для топ-N nlargest читабельнее и не сортирует весь DataFrame.
  • count против size. count не учитывает NaN в колонке, size считает все строки группы — разница важна при пропусках.
  • Типы данных. Строковая дата сломает max по смыслу; сначала pd.to_datetime.

Практический контекст

Такое задание дают на лайвкодинге в первые десять минут, чтобы проверить повседневную беглость: аналитик делает подобное ежедневно при подготовке витрин и отчётов. Смотрят не только на результат, но и на стиль: именованные агрегаты, отсутствие циклов, проговаривание проверок данных. Часто просят развить: добавить средний чек, отфильтровать период, разбить по месяцам.

Пример кода

import pandas as pd

df["order_date"] = pd.to_datetime(df["order_date"])

stats = (
    df.groupby("user_id")
    .agg(
        orders=("amount", "count"),
        revenue=("amount", "sum"),
        last_order=("order_date", "max"),
    )
    .reset_index()
)

top5 = stats.nlargest(5, "revenue")
print(top5)

Частые ошибки

  • Пишут цикл по пользователям вместо groupby
  • Забывают reset_index и путаются в MultiIndex при дальнейшей работе
  • Не проверяют тип колонки с датой перед взятием максимума

ИП Кочкин Алексей Сергеевич · ИНН 390509026279 · ОГРНИП 325390000030973 · jiniys2005@yandex.ru