Этап: SQLite и запуск пайплайна

This commit is contained in:
vladslav064 committed 2026-11-12 08:43:34 +03:00
1 parent 626ac21b41
commit d90f1f30b2
15 files changed
+2069 -6

No files matched your search

+32
View File
@@ -35,3 +35,35 @@
**Решения и изменения.** csv.reader в строгом режиме читает UTF-8 с поддержкой BOM и нумерует логические записи после заголовка. Нечитаемый файл, ошибка разбора CSV или неверный заголовок прерывают обработку. Для читаемой записи неверной ширины сохраняются все исходные поля. Точный дубль получает только причину повтора. Для остальных структурно корректных записей собираются ошибки независимых полей. Выручка проверяется при пригодных для расчёта цене и количестве. Среди валидных заказов сначала определяется наличие конфликта во всей группе ID. Номер источника сохраняется и у принятого заказа, но исключён из сравнения нормализованных значений. План обновлён согласно уточнению о нескольких причинах.
**Фактические проверки.** Полный запуск pytest дал 32 passed. На синтетическом raw_orders.csv обработаны 1500 записей, приняты 1482, отброшены 18. Из них 14 имели ошибки значений, одна оказалась точным дублем, одна — нормализованным, две отклонены из-за конфликта ID. Проверено, что номера от 1 до 1500 встречаются в совокупном результате ровно по одному разу. Байты CSV до и после обработки совпали, SHA-256 — `c4b9ffd2eb24c6c79b6a3e2436f3bd348ba86696a1aeb9b7e3083af65c799c67`.
## 12 ноября 2026 — дополнительные проверки генерации, чтения и очистки
**Запрос пользователя.** Проверить запланированные примеры в CSV, обработку ошибок файла, нумерацию, деньги и приоритет причин отбраковки. Устранить повтор схемы CSV и уточнить план экспорта и аналитики.
**Изменения.** Генератор использует FIELDS из extract.py. Добавлено шесть тестов. Они проверяют содержимое созданного во временной папке CSV, неверную кодировку, отказ при открытии файла (подмена PermissionError), многострочное поле с CRLF и нумерацию после него, смешанную группу дублей и конфликтов с проверкой порядка обоих списков, расчёт большой суммы с точностью до копейки. Новые проверки прошли на существующей логике очистки.
**План.** Уточнены состав clean_orders.csv и учёт нескольких причин у одной отброшенной записи. Для будущих отчётов принят календарь между крайними датами принятых заказов. Для аномалий каждой категории учитываются нулевые дни, используется стандартное отклонение генеральной совокупности и строгий двусторонний порог 2σ. При периоде короче семи дней или нулевой дисперсии результат пуст.
**Проверки.** Через существующую .venv выполнен полный pytest до изменений (32 passed) и после (38 passed). На исходном CSV принято 1482 заказа, отклонено 18. SHA-256 перед работой и после проверок совпал — `c4b9ffd2eb24c6c79b6a3e2436f3bd348ba86696a1aeb9b7e3083af65c799c67`. Повторно сгенерированный во временной папке CSV побайтово совпал с исходным.
## 12 ноября 2026 — уточнение аналитики и пути экспорта
По запросу пользователя в плане закреплён путь `outputs/clean_orders.csv` относительно корня проекта. Динамику показываем по общей дневной выручке всех категорий, одной строкой на дату. Аномалии ищем отдельно по дневной выручке каждой категории, используя её собственные среднее и стандартное отклонение.
## 12 ноября 2026 — статистика и экспорт результатов
**Запрос пользователя.** Создать quality.py, выгрузить два CSV в UTF-8 с BOM и отчёт JSON, проверить баланс, повторный запуск и пустой снимок. Предусмотреть сохранение после успешной загрузки БД.
**Решения.** Модуль принимает результаты очистки и отдельное число исходных записей. Проверяет сумму статусов и покрытие всех исходных номеров без повторов. Итоговая причина — первая из обнаруженных в порядке проверок. Отдельные счётчики проблем включают все обнаруженные причины и могут пересекаться. В CSV отбраковки заголовок источника, исходные значения и причины представлены JSON-массивами. Так сохраняются порядок колонок, пустые и лишние поля. Состав чистого CSV уточнён в плане до шести запрошенных колонок. При сборке пайплайна save_outputs будет вызываться после успешного завершения транзакции БД.
**Фактические проверки.** Через существующую .venv выполнен полный pytest — 40 passed. Временный пример проверил несколько причин у одной записи, порядок, кодировку, обратное чтение значений, побайтовое совпадение при повторном экспорте и замену снимка пустым с долей null. Проверено отклонение несогласованных количеств и повторяющихся номеров. Для текущего этапа три файла созданы прямым вызовом экспорта после очистки. Чтение результатов из outputs подтвердило 1482 принятых и 18 отброшенных из 1500, доля 0,988. Суммы обоих счётчиков на этом наборе равны 18. SHA-256 исходного CSV до и после совпал.
## 12 ноября 2026 — транзакционная загрузка и запуск пайплайна
**Запрос пользователя.** Реализовать схему SQLite, полную загрузку заказов и дневных агрегатов и команду python main.py. Проверить повторяемость данных, согласованность CSV, обработку пустого снимка и сохранность предыдущих данных при сбое.
**Решения.** В sql/schema.sql заданы первичные ключи и ограничения значений. src/database.py открывает одну транзакцию до создания и очистки таблиц, вставляет заказы с параметрами, строит daily_category_revenue одним группирующим запросом и фиксирует обе таблицы вместе. main.py проверяет статистику до записи базы. После фиксации он передаёт готовый отчёт в save_reports. Если экспорт завершается ошибкой, CLI указывает, что база уже обновлена, и сохраняет исходную диагностику. Ранее использовавшийся интерфейс save_outputs сохранён.
**Фактические проверки.** В существующей .venv прошли все 45 тестов. Пять новых интеграционных тестов запускали копию проекта во временном каталоге из другой рабочей папки. Переполнение суммы группы откатило изменения обеих таблиц. Испорченный CSV сохранил прежний снимок. Набор без принятых заказов очистил обе таблицы. Сбой экспорта после фиксации базы завершил CLI с ненулевым кодом и сообщением об обновлённой БД.
На рабочем синтетическом CSV команда python main.py создала outputs/orders.db. Вход — 1500 записей, приняты 1482, отброшены 18. Получено 438 групп по дате и категории. Суммарная выручка в обеих таблицах составила 1 687 705 899 копеек. Содержимое обеих таблиц сравнили до и после повторного запуска, заказы сверили по всем шести полям с clean_orders.csv. SHA-256 исходного CSV совпал с исходным замером. Аналитические запросы остаются следующим этапом.