Python 3.10+, сторонние зависимости не нужны.
python calculate.py --input sales.csv --output daily_by_sku.csv
python -m unittest -vВ архив включена исходная выгрузка под именем sales.csv, но git её игнорирует. Результат — daily_by_sku.csv с колонками sku, order_date, orders, revenue.
- orders — количество уникальных order_id по артикулу и дню, включая отменённые заказы. quantity не является числом заказов.
- revenue — сумма quantity × price только для delivered. Для денег используется Decimal, вывод — два знака после точки.
- Найдено 13 858 строк, из них 60 повторных строк. После удаления дублей осталось 13 798 заказов. Конфликтующих строк с одним order_id нет.
- Удаляются внешние пробелы; статус приводится к нижнему регистру. canceled считается cancelled. В исходных строках 35 статусов отличаются от канонического написания: delivered с пробелом — 11, Delivered — 7, DELIVERED — 7, Cancelled — 4, CANCELLED — 3, canceled — 3.
- В четырёх отменённых заказах нет quantity: 1012637, 1010495, 1013303, 1013394. Заказы учитываются в orders; их выручка равна нулю по статусу. Количество не восстанавливается и не подменяется единицей.
- Других пропусков и некорректных дат/чисел в предоставленном файле не найдено.
- Повторный order_id с отличающимися нормализованными данными вызывает ошибку. Без времени обновления нельзя обоснованно выбрать версию. В этой выгрузке один order_id соответствует одному артикулу; многопозиционные заказы потребовали бы уточнения ключа дедупликации.
- Неизвестный статус, пустой ключ, неверная дата, неположительное количество, некорректная цена или отсутствие количества у delivered останавливают расчёт с номером строки. Ошибочные заказы не исключаются молча. Существующий результат при ошибке проверки входных данных не перезаписывается.
python -m unittest -v
python verify_sql.pyВыполнены четыре теста (включая подслучаи): дубли и нормализация статусов, пропуск количества у отменённого заказа, сортировка, точность денежных сумм, конфликт одного order_id, невалидные значения и пустой CSV с заголовком.
Независимая проверка verify_sql.py загружает исходный CSV в SQLite, удаляет точные дубли через SELECT DISTINCT и считает GROUP BY с CASE. Денежные суммы считает в целых копейках. Она сравнивает все четыре колонки каждой строки с результатом Python, включая порядок. Все 631 строки совпали. Проверка SQL рассчитана именно на предоставленные данные; полноценная валидация входа находится в calculate.py.
| Контроль | Значение |
|---|---|
| Исходные строки | 13 858 |
| Дубли | 60 |
| Уникальные заказы и сумма orders | 13 798 |
| Выкупленные заказы | 12 047 |
| Отменённые заказы | 1 751 |
| Артикулы | 12 |
| Строки результата | 631 |
| Общая выручка | 10 276 540.00 ₽ |
| Артикул | Заказы | Выручка ₽ |
|---|---|---|
| UYT-0001 | 1 538 | 1 320 090 |
| UYT-0002 | 1 638 | 1 217 160 |
| UYT-0003 | 1 808 | 1 191 210 |
| UYT-0004 | 1 372 | 1 178 680 |
| UYT-0005 | 1 565 | 1 086 150 |
| UYT-0006 | 2 039 | 1 321 600 |
| UYT-0007 | 1 457 | 1 180 500 |
| UYT-0008 | 1 729 | 1 280 640 |
| UYT-0009 | 218 | 178 020 |
| UYT-0010 | 175 | 163 760 |
| UYT-0011 | 218 | 135 700 |
| UYT-0012 | 41 | 23 030 |
Решение подготовлено с помощью ChatGPT Codex: анализ CSV, код, тесты, независимая SQL-проверка и README. При подготовке отдельно учтены четыре отменённых заказа без quantity: они сохраняются в числе заказов. Предусмотрены Decimal для денег и отказ от произвольного выбора строки при конфликте order_id. Ошибок расчёта при выполненных проверках не обнаружено. Ручная проверка и понимание кода кандидатом этим не подтверждаются — перед сдачей код нужно самостоятельно разобрать и запустить.
Обязательные части задания реализованы. Предположение: order_id обозначает один заказ с одним артикулом, что соответствует данному файлу. Пропуски в календаре не заполняются: выводятся только сочетания артикула и дня, которые присутствуют в данных. Возвраты и отрицательные количества условием не предусмотрены. Данные и множество уникальных заказов помещаются в память; для существенно большей выгрузки нужен другой способ хранения ключей.
Git-история отражает реальные этапы подготовки ассистентом, без изменения дат и имитации самостоятельной работы кандидата. Архив содержит скрытую папку .git. Проверка истории: git log --oneline.