Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

4 Commits

Folders and files

Repository files navigation

Расчёт продаж по дням и артикулам

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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages