Задача курса

pandas: итоговый отчёт через groupby, merge и validate

Курс «NumPy и pandas: практический тренажёр» · урок «Итоговый практикум — часть 2: агрегация, соединение и финальная схема»

Условие

Финальный отчёт: groupby + agg, merge с validate, вычисляемый столбец и спецификация

Вы реализуете функцию build_client_report, которая принимает две готовые таблицы и возвращает финальный аналитический отчёт.

Что уже дано

Проверяющая система вызывает build_client_report(orders, clients), передавая два готовых pd.DataFrame:

  • orders — таблица заказов со столбцами 'order_id' (int), 'client_id' (int), 'amount' (float). Уже подготовлена: без пропусков, без дублей по 'order_id'.
  • clients — справочник клиентов со столбцами 'client_id' (int), 'segment' (str). Уникальна по 'client_id'.

Что нужно сделать

Реализуйте функцию build_client_report(orders, clients), которая выполняет ровно четыре шага и возвращает итоговый pd.DataFrame.

Шаг 1. Named aggregation. Сгруппируйте orders по 'client_id' с as_index=False и вычислите за один вызов .agg():

  • order_count=('order_id', 'count') — число заказов клиента;
  • total_amount=('amount', 'sum') — суммарная сумма заказов.

Сохраните результат в переменную agg.

Шаг 2. Merge с validate. Соедините agg и clients через pd.merge с параметрами:

  • on='client_id'
  • how='left'
  • validate='many_to_one'

Сохраните результат в переменную result.

Шаг 3. Вычисляемый столбец. Добавьте в result столбец 'avg_amount' как векторное выражение result['total_amount'] / result['order_count'].

Шаг 4. Спецификация. Оставьте в result ровно эти столбцы в указанном порядке:

['client_id', 'segment', 'order_count', 'total_amount', 'avg_amount']

Отсортируйте строки по 'total_amount' по убыванию (ascending=False) и сбросьте индекс через reset_index(drop=True).

Верните итоговый result.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система вызывает build_client_report(orders, clients) и проверяет возвращаемое значение. Функция принимает два аргумента:

  • orders — pd.DataFrame с заказами;
  • clients — pd.DataFrame-справочник клиентов.

Функция должна вернуть pd.DataFrame с пятью столбцами в порядке спецификации, отсортированный по 'total_amount' по убыванию, с чистым RangeIndex.

Пример использования

orders = pd.DataFrame({
 'order_id': [1, 2, 3],
 'client_id': [10, 10, 20],
 'amount': [100.0, 50.0, 200.0],
})
clients = pd.DataFrame({
 'client_id': [10, 20],
 'segment': ['standard', 'premium'],
})
result = build_client_report(orders, clients)
print(result.to_dict(orient='records'))

Результат:

[{'client_id': 20, 'segment': 'premium', 'order_count': 1, 'total_amount': 200.0, 'avg_amount': 200.0}, {'client_id': 10, 'segment': 'standard', 'order_count': 2, 'total_amount': 150.0, 'avg_amount': 75.0}]

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется