Выручка по журналу изменений заказов
Из сервиса заказов пришёл журнал событий, а не готовая таблица продаж. Каждый заказ может менять сумму и статус.
Условие
В pandas оставь последнее событие каждого order_id и посчитай количество оплаченных заказов и их суммарную выручку. Последнее событие определяется по updated_at, при одинаковом времени — по большему event_id. Время указано в UTC. Вся сумма заказа хранится в каждом событии; это не приращение.
Данные
| event_id | order_id | updated_at | status | amount |
|---|---|---|---|---|
| 1 | 101 | 2026-09-01T10:00:00Z | paid | 1000 |
| 2 | 101 | 2026-09-01T11:00:00Z | paid | 1200 |
| 3 | 102 | 2026-09-01T12:00:00Z | paid | 900 |
| 4 | 103 | 2026-09-01T13:00:00Z | paid | 800 |
| 5 | 103 | 2026-09-01T14:00:00Z | cancelled | 800 |
Все данные учебные. Код можно выполнить в своей среде; поле ниже предназначено для черновика, без запуска кода.
Если нужен следующий шаг
Подсказка 1
Подсказка 2
Проверь себя
Показать решение и объяснение
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?