Files
Data_engineer_test_task/docs/ai_work_log.md
T

11 KiB
Raw Blame History

Отчёт о работе с ИИ

Для разработки использовался OpenAI Codex. Предложения ИИ обсуждались и проверялись запусками. Работа велась по этапам 12 ноября 2026 года. ИИ помогал с планированием, кодом, тестами и документацией. Этот отчёт описывает фактический ход работы. Запросы ниже пересказаны; исходные тексты собраны в prompts.md.

1. План и правила обработки

Задача. Разобрать требования и выбрать простое решение для CSV → очистка → SQLite → аналитика.

Решение. Использовать стандартную библиотеку Python, SQLite и pytest. Оставить main.py точкой запуска, разделить чтение, очистку, отчёты и загрузку по модулям. Деньги хранить в копейках, а цену разбирать через Decimal. Подробные правила записаны в плане.

До написания кода определили разницу между точными дублями, одинаковыми заказами после нормализации и конфликтами ID. Первоначальное описание одной причины отбраковки уточнили: у записи может быть несколько ошибок полей, но итоговый статус у неё один.

2. Генерация исходных данных

Задача. Создать 1500 синтетических записей с гарантированными примерами ошибок.

Результат. Генератор использует Random(42) и даты с 1 января по 31 марта 2024 года. В набор добавлены пропуски, неверные даты и числа, точный дубль, дубль с другим форматом даты и конфликт ID. Персональных данных нет.

Проверка. Два запуска дали одинаковый CSV. Первые два теста проверили количество записей и воспроизводимость. Для тестов создано виртуальное окружение; после неудачной попытки установки через настроенный источник pytest установлен из PyPI.

3. Чтение и очистка

Задача. Сохранить исходные значения и номера записей, нормализовать поля и объяснить отбраковку.

Результат. Читатель проверяет заголовок и структуру CSV. Очистка собирает ошибки независимых полей, проверяет деньги и обрабатывает дубли в два этапа. Конфликты определяются среди валидных записей; ошибочная строка сама по себе не делает корректный заказ конфликтным.

Проверка. Прошли 32 теста. Проверены даты, обязательные поля, деньги на границе SQLite INTEGER, переполнение выручки, дубли, конфликты и сохранность источника. Каждый исходный номер оказался ровно в одном результате: принятом или отброшенном.

4. Дополнительная проверка предложений ИИ

Задача. Проверить крайние случаи и улучшить тесты без переписывания рабочей логики.

Что изменилось. Первоначальные тесты генератора проверяли размер и повторяемость файла, но не наличие всех запланированных ошибок. Добавлена такая проверка, а также тесты неверной UTF-8, отказа доступа, многострочных полей, порядка записей и большой суммы с точностью до копейки. Список полей CSV стал общим для генератора и читателя.

Что не стали менять. Другой ИИ предложил заменить расчёт через as_integer_ratio(), переименовать атрибут отбраковки и использовать .get() для категории. При разборе текущего кода эти замечания не подтвердились: расчёт точный, атрибуты согласованы, наличие колонки проверяет читатель. Предложения не приняли.

Проверка. После расширения покрытия прошли 38 тестов. Ошибок существующей логики очистки новые тесты не выявили. Рабочий CSV не изменился.

5. Отчёт качества и экспорт

Задача. Сохранить очищенные заказы, отклонённые записи и статистику.

Результат. Созданы clean_orders.csv, rejected_rows.csv и quality_report.json в outputs/. CSV записываются в UTF-8 с BOM. В отбраковке сохраняются исходные поля и все причины. Итоговая причина — первая по порядку проверок; отдельные счётчики проблем могут пересекаться.

Проверка. Прошли 40 тестов. Проверены баланс строк, несколько ошибок у записи, обратное чтение исходных значений, повторный экспорт и пустой результат.

6. SQLite и полный запуск

Задача. Объединить обработку в python main.py и обеспечить безопасный повторный запуск.

Результат. Заказы и дневные агрегаты полностью заменяются в одной транзакции. Агрегация выполняется в SQLite. При ошибке загрузки предыдущие данные сохраняются. Отчёты записываются после фиксации базы; при сбое программа сообщает, что база уже обновлена.

Проверка. Прошли 45 тестов. Интеграционные проверки запускали копию проекта во временной папке: повторная загрузка, совпадение CSV с базой, откат при переполнении суммы, повреждённый вход и набор без принятых заказов. Отдельно проверен сбой экспорта после обновления базы.

7. SQL-аналитика

Задача. Подготовить топ категорий, дневную динамику и поиск аномалий с сохранёнными результатами.

Уточнение по ходу работы. В раннем плане аномалией считался рост категории более чем вдвое к предыдущему наблюдению. Затем выбрали отклонение более чем на два стандартных отклонения. После обсуждения оставили отдельный расчёт для каждой категории, а динамику — общей по всем категориям. Путь чистого CSV уточнили до outputs/clean_orders.csv.

Результат. Запросы используют календарь с нулевыми днями внутри периода. Аномалии не выдаются для периода короче семи дней и при нулевой дисперсии. Метод не учитывает сезонность и может выделять обычные продажи редкой категории, поэтому результат считается поводом для проверки, а не доказательством ошибки.

Проверка. Прошёл 51 тест. Проверены сортировка, пропущенные дни, рост и падение, постоянная выручка, короткий период, точная граница 2σ и пустая база. Тесты не изменили рабочую базу.

8. Итоговые проверки и комплект сдачи

Подготовлены README, база, исходные и очищенные данные, отбраковка, отчёт качества, SQL-запросы и их результаты. В Git исключены окружение, кэши и секреты. Для исходного CSV закреплены окончания строк LF, база отмечена как двоичный файл.

Проверка в новом окружении на Python 3.14.4 с SQLite 3.50.4 и pytest 9.2.0 воспроизвела генерацию и запуск с нуля. Все 51 тест прошли. В рабочем окружении повторные запуски дали те же строки таблиц и текстовые отчёты. integrity_check вернул ok; деньги дополнительно пересчитаны по исходным ценам через Decimal.

Результат Значение
Исходных записей 1500
Принято 1482
Отброшено 18
Ошибки значений 14
Точные / нормализованные дубли 1 / 1
Конфликтующие записи 2
Группы «дата + категория» 438
Выручка 1 687 705 899 копеек
Строки результатов: топ / динамика / аномалии 5 / 91 / 18

Исходный CSV сохранил SHA-256: c4b9ffd2eb24c6c79b6a3e2436f3bd348ba86696a1aeb9b7e3083af65c799c67.