Перейти к содержанию
PythonJunior≈ 25 минутУчебная задача HireHero

Выручка по журналу изменений заказов

Из сервиса заказов пришёл журнал событий, а не готовая таблица продаж. Каждый заказ может менять сумму и статус.

Условие

В pandas оставь последнее событие каждого order_id и посчитай количество оплаченных заказов и их суммарную выручку. Последнее событие определяется по updated_at, при одинаковом времени — по большему event_id. Время указано в UTC. Вся сумма заказа хранится в каждом событии; это не приращение.

Данные

event_idorder_idupdated_atstatusamount
11012026-09-01T10:00:00Zpaid1000
21012026-09-01T11:00:00Zpaid1200
31022026-09-01T12:00:00Zpaid900
41032026-09-01T13:00:00Zpaid800
51032026-09-01T14:00:00Zcancelled800

Все данные учебные. Код можно выполнить в своей среде; поле ниже предназначено для черновика, без запуска кода.

Черновик сохраняется в этом браузере. Ничего не отправляется на сервер.

Если нужен следующий шаг

Подсказка 1
Сначала найди последнее состояние каждого заказа, только потом фильтруй paid.
Подсказка 2
drop_duplicates без сортировки выбирает строку по порядку в файле, а не по времени события.

Проверь себя

Показать решение и объяснение
2 оплаченных заказа, выручка 2 100. Заказ 101 учитывается с новой суммой 1 200; заказ 103 исключается, потому что его последнее состояние — cancelled.
Python · pandas
import pandas as pd

df = pd.read_csv('data.csv')
df['updated_at'] = pd.to_datetime(df['updated_at'], utc=True)
latest = (df.sort_values(['updated_at', 'event_id'])
            .drop_duplicates('order_id', keep='last'))
paid = latest.loc[latest['status'].eq('paid')]
print({'paid_orders': len(paid), 'revenue': paid['amount'].sum()})

Порядок операций принципиален. Если сначала удалить отмены, прежнее paid-событие отменённого заказа останется в расчёте. Полные дубли строк и разные состояния одного заказа — разные вещи: обычный drop_duplicates() без order_id здесь не решает задачу.

Проверка решения

  • Перестановка строк исходного файла не меняет результат.
  • Изменение суммы не создаёт новый заказ.
  • Отменённый последним событием заказ не попадает в выручку.

Вопрос на продолжение

Что делать с событиями, пришедшими с опозданием? Как проверить конфликтующие события с одинаковыми временем и event_id?