Files
Data_engineer_test_task/docs/prompts.md
T

31 KiB
Raw Blame History

Исходные промпты проекта

Запросы приведены в порядке их появления в чате. Пометки в квадратных скобках обозначают пропущенные команды терминала.

Оглавление

  1. Постановка задачи и правила работы
  2. План реализации и модель данных
  3. Генерация синтетических данных
  4. Чтение и очистка заказов
  5. Проверка модулей и расширение тестов
  6. Уточнение аналитики и пути экспорта
  7. Статистика качества и экспорт
  8. Транзакционная загрузка и сборка пайплайна
  9. SQL-запросы и отчёт по выручке
  10. Финальная проверка и подготовка к публикации
  11. Сбор исходных промптов
  12. Проверка перед сдачей

1. Постановка задачи и правила работы

Ты выступаешь в роли опытного Senior Data Engineer и помогаешь мне выполнить тестовое задание на позицию Data Engineer и разобраться в принятых решениях.

Задание: Построить простой и надёжный ETL-пайплайн: CSV > очистка > агрегация выручки по дням и категориям > SQLite.

Необходимо:

  1. Обработать дубли, пропуски и разные форматы дат.
  2. Показать количество отброшенных строк и причины.
  3. Подготовить три SQL-запроса с результатами: топ категорий, динамика выручки, аномалии.
  4. Обеспечить идемпотентность: повторный запуск не дублирует данные.
  5. Подготовить README, готовую базу и лог работы с ИИ. Технологии:
  • Python 3.11+.
  • Стандартная библиотека: csv, sqlite3, decimal и другие необходимые модули.
  • pytest для тестов.
  • Дополнительные зависимости — только при обоснованной необходимости.

Общие правила:

  • Создавай и изменяй реальные файлы в рабочей папке.
  • Сначала изучай существующие файлы и применимые инструкции.
  • Не переписывай готовые части без необходимости.
  • Не создавай интерфейс, сервер, Docker и сложную архитектуру.
  • Не выполняй git commit и git push без отдельного указания.
  • Не выдумывай результаты тестов, показатели качества, ошибки ИИ и затраченное время.
  • Явно отмечай допущения и синтетическое происхождение данных.
  • Не изменяй исходный CSV при обработке.
  • Объясняй важные решения простым языком.
  • Работай только над текущим этапом, не переходи к следующему самостоятельно.
  • В конце этапа кратко сообщай: что создано, что проверено, какие ограничения остались.
  • Если запуск проверки недоступен, прямо сообщай об этом.

Веди docs/ai_work_log.md по реальной истории:

  • мои запросы;
  • принятые решения;
  • обнаруженные ошибки и изменения;
  • фактически выполненные проверки. Не придумывай историю работы.

main.py остаётся в корне и только объединяет этапы. Необходимые функции размещаются в src/. Пути к ресурсам определяются относительно корня проекта, а не текущей рабочей папки.

2. План реализации и модель данных

Изучи рабочую папку и подготовь краткий план реализации без написания кода пайплайна.

Зафиксируй модель данных:

  • Одна строка — один заказ с одним товаром.
  • order_id — положительное целое число.
  • order_date — дата заказа.
  • category — категория товара.
  • quantity — положительное целое число.
  • unit_price — цена единицы в рублях.
  • Выручка = quantity × unit_price.
  • Все заказы завершены.
  • Возвраты, скидки, бесплатные товары и несколько валют не рассматриваются.

Правила обработки:

  1. Все поля обязательны, кроме category.
  2. Пустую category заменять на «Не указана».
  3. Категории очищать от внешних и повторяющихся пробелов, приводить к единому регистру.
  4. Даты принимать только в форматах YYYY-MM-DD и DD.MM.YYYY.
  5. Итоговый формат даты — YYYY-MM-DD.
  6. quantity должна быть целой и строго положительной.
  7. unit_price должна быть строго положительной.
  8. Цену разбирать через Decimal, разрешая точку или запятую как десятичный разделитель, без разделителей тысяч.
  9. Цены с более чем двумя знаками после разделителя отклонять.
  10. NaN, Infinity и другие неконечные числовые значения отклонять.
  11. Деньги хранить и суммировать целым числом копеек.
  12. Значения должны помещаться в целые числа SQLite, включая рассчитанную выручку.

Порядок обработки дублей:

  • Сначала удалять точные дубли значений исходных полей, оставляя первое вхождение.
  • Затем нормализовать и проверить оставшиеся записи.
  • Среди валидных записей одинаковые ID с одинаковыми нормализованными значениями считать дублями.
  • Одинаковые ID с разными нормализованными значениями считать конфликтом и отклонять все записи такой группы.
  • Невалидные записи не участвуют в поиске конфликтов среди валидных.
  • Все эти правила явно описать как принятые решения.

Для каждой исходной записи сохранять номер записи в CSV. Не путать номер записи с физической строкой файла: CSV может содержать многострочные поля.

Предложи простые интерфейсы функций между модулями. Выбери одно место для расчёта агрегатов. Для SQLite используем полную перезагрузку обеих таблиц в одной транзакции.

Опиши критерии готовности и возможные неоднозначности. Измени docs/ai_work_log.md с фактическими решениями.

3. Генерация синтетических данных

Реализуй src/generate_data.py.

Требования:

  • Создать data/raw_orders.csv.
  • Ровно 1500 записей без учёта заголовка, включая дубли и ошибочные записи.
  • Поля: order_id, order_date, category, quantity, unit_price.
  • Использовать локальный генератор случайных чисел с seed=42.
  • Использовать фиксированный диапазон дат.
  • Не использовать текущую дату или случайный порядок, зависящий от окружения.
  • Повторный запуск должен создавать идентичное содержимое CSV.
  • Большая часть записей должна быть корректной.

Гарантированно добавить:

  • точные дубли;
  • одинаковые заказы с разными допустимыми форматами даты;
  • конфликтующие order_id;
  • пропуски в разных полях;
  • некорректные даты;
  • пробелы и различный регистр категорий;
  • дробные, нулевые, отрицательные и нечисловые значения quantity;
  • нулевые, отрицательные и нечисловые цены;
  • цены с лишними десятичными знаками.

Использовать синтетические данные без персональной информации. Не подгонять данные под красивые аналитические результаты.

Команда запуска: [Команда терминала опущена.]

Добавь тесты количества записей и воспроизводимости. Тесты должны использовать временные файлы.

Запусти генератор и тесты. Сообщай только фактические результаты. Обнови лог работы с ИИ.

4. Чтение и очистка заказов

Реализуй src/extract.py и src/transform.py по согласованным правилам.

extract.py:

  • чтение CSV;
  • проверка обязательных заголовков;
  • проверка количества полей в записях;
  • присвоение номера исходной записи;
  • понятные сообщения о проблемах файла.

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

transform.py:

  • нормализация категорий и дат;
  • проверка обязательных значений;
  • проверка числовых полей;
  • обработка точных и нормализованных дублей;
  • обработка конфликтующих ID;
  • расчёт unit_price_kopecks и revenue_kopecks.

Не используй float для денежных расчётов. Не исправляй неизвестные значения догадками. Не округляй некорректные цены молча.

Результат:

  1. Принятые записи: order_id, order_date, category, quantity, unit_price_kopecks, revenue_kopecks.
  2. Отброшенные записи: номер исходной записи, исходные значения и список причин.

Каждая исходная запись получает ровно один итоговый статус. Удалённые дубли также считаются отброшенными. Одна отклонённая запись может иметь несколько ошибок полей. Не приписывай ей проверки, которые не выполнялись после более раннего исключения.

Добавь тесты:

  • допустимые и некорректные даты;
  • отсутствующие поля;
  • пустая категория;
  • точный дубль;
  • дубль после нормализации;
  • конфликт ID;
  • невалидная запись с ID валидного заказа;
  • дробное количество;
  • точный расчёт денег;
  • неконечные и слишком большие числа;
  • несколько ошибок в одной записи;
  • пустой CSV с корректным заголовком.

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

5. Проверка модулей и расширение тестов

Посмотри модули в src, тесты, план реализации и журнал работы с ИИ. Сделай точечные улучшения, без переписывания проекта и переименований ради стиля. SQLite и аналитику пока не реализуй.

Что нужно:

  • Дополнить тесты генератора: проверить, что все запланированные дубли, конфликты, пропуски и неверные значения действительно есть в данных.
  • Проверить чтение CSV: неверную UTF-8, ошибку доступа, многострочные поля и правильную нумерацию записей.
  • Проверить очистку: точность денег, порядок обработки дублей и конфликтов, несколько причин ошибок, баланс и порядок записей.
  • Убрать дублирование списка полей CSV простым способом, без лишних модулей.
  • Уточнить план: добавить clean_orders.csv, несколько причин отбраковки, дни с нулевой выручкой и поиск аномалий по отклонению более чем на два стандартных отклонения. При числе дней меньше 7 или нулевой дисперсии аномалии не выдавать.

Не меняй рабочую логику без необходимости. Если найдёшь баг, сначала воспроизведи его тестом. Недостаток тестов сам по себе не называй ошибкой реализации.

Запусти тесты через существующую .venv, проверь, что raw_orders.csv не изменился, и обнови журнал фактическими результатами. Кратко перечисли изменения, результаты проверок и оставшиеся проблемы.

Коммит и push не делай.

6. Уточнение аналитики и пути экспорта

Уточни план реализации и журнал работы с ИИ: аномалии будем искать отдельно по каждой категории, а динамику показывать по общей дневной выручке.

Также исправь путь очищенного CSV на outputs/clean_orders.csv.

В журнале зафиксируй текущее уточнение, не переписывая историю. Код пока не изменяй, коммит и push не делай.

7. Статистика качества и экспорт

Реализуй src/quality.py: формирование статистики и сохранение CSV/JSON.

Создаваемые файлы:

  1. outputs/clean_orders.csv Поля: order_id, order_date, category, quantity, unit_price_kopecks, revenue_kopecks.

  2. outputs/rejected_rows.csv Номер исходной записи, исходные значения и причины отбраковки. Причины сохранять в однозначном формате.

  3. outputs/quality_report.json

  • число исходных записей;
  • число принятых;
  • число отброшенных;
  • разбивка по итоговым причинам отбраковки;
  • счётчики отдельных обнаруженных проблем;
  • доля принятых записей.

Обязательно:

  • исходные = принятые + отброшенные;
  • каждая запись учитывается один раз в итоговых количествах;
  • счётчики проблем могут пересекаться — явно поясни это;
  • при пустом входном наборе долю принятых укажи как null;
  • статистика получается из реальных результатов обработки.

CSV сохраняй в utf-8-sig для корректного отображения кириллицы в Excel. Порядок записей и причин должен быть детерминированным. При повторном запуске файлы перезаписываются. Пустые CSV должны содержать заголовки.

Модуль не должен повторно очищать данные. Предусмотри вызов сохранения файлов после успешной загрузки БД.

Добавь необходимые проверки статистики и экспорта к существующим тестам. Запусти их и обнови лог.

8. Транзакционная загрузка и сборка пайплайна

Реализуй sql/schema.sql, src/database.py и main.py.

База: outputs/orders.db.

Таблица orders:

  • order_id;
  • order_date;
  • category;
  • quantity;
  • unit_price_kopecks;
  • revenue_kopecks.

Таблица daily_category_revenue:

  • order_date;
  • category;
  • order_count;
  • revenue_kopecks.

Требования:

  • первичный ключ order_id для orders;
  • составной ключ «дата + категория» для агрегатов;
  • NOT NULL и CHECK для важных инвариантов;
  • значения в SQL передавать параметрами;
  • очищенные заказы и агрегаты полностью перезагружать в одной транзакции;
  • при ошибке сохранять предыдущее содержимое обеих таблиц;
  • корректно обрабатывать пустой набор принятых записей;
  • агрегацию выполнять только в одном месте.

main.py должен быть коротким и вызывать функции модулей.

Команда: [Команда терминала опущена.]

Последовательность:

  1. Чтение CSV.
  2. Очистка и формирование статистики.
  3. Транзакционная запись заказов и агрегатов.
  4. Сохранение clean_orders.csv, rejected_rows.csv и quality_report.json.
  5. После следующего этапа — выполнение аналитических запросов и сохранение результатов.

При критической ошибке выводить понятное сообщение и завершаться с ненулевым кодом. Не сообщать об успехе до завершения всех операций. Не скрывать неожиданные исключения общим сообщением без диагностических деталей.

SQLite и отчёты не имеют общей транзакции. Если запись файлов не удалась после обновления БД, явно сообщать об этом.

Добавь интеграционные тесты:

  • полный запуск;
  • повторный запуск даёт одинаковое содержимое обеих таблиц;
  • агрегаты совпадают с заказами;
  • clean_orders.csv совпадает с orders;
  • сбой во время загрузки откатывает изменения;
  • неверный входной файл не меняет существующую базу.

Сравнивай данные таблиц, а не байты файла SQLite. Все тесты выполняй во временных каталогах. Запусти проверки и обнови лог.

9. SQL-запросы и отчёт по выручке

Реализуй три SQL-запроса и подключи их выполнение к main.py. Не добавляй отдельный модуль, если достаточно небольшой функции в database.py.

  1. sql/top_categories.sql Категория, число заказов, общая выручка. Сортировка по убыванию выручки и затем по категории.

  2. sql/daily_revenue.sql Выручка по дням. Включить все дни между минимальной и максимальной датой принятых заказов. Дни без заказов показывать с нулём. Сортировка по дате.

  3. sql/anomalies.sql Аномалии дневной выручки на том же календарном диапазоне.

Метод:

  • отклонение от среднего более чем на два стандартных отклонения;
  • дисперсия генеральной совокупности;
  • рассчитать среднее и затем средний квадрат отклонения через AVG;
  • сравнивать квадрат отклонения с четырьмя дисперсиями;
  • не использовать STDDEV и SQRT;
  • при количестве дней меньше 7 или нулевой дисперсии аномалии не выдавать.

Используй SQL стандартной SQLite и CTE для читаемости. Для пустой базы запросы должны возвращать пустой результат.

Денежные суммы в результатах SQL оставляй целыми копейками. При представлении в Markdown можно выводить рубли с двумя знаками через Decimal.

После [команда терминала опущена] должен появляться outputs/query_results.md:

  • краткое описание запросов;
  • фактические результаты;
  • единицы измерения;
  • пояснение метода аномалий.

Если аномалий нет, прямо укажи это. Не изменяй данные ради получения аномалий.

Объясни, что аномалия — сигнал для проверки, а не доказанная ошибка. Укажи ограничения: короткая выборка, влияние выбросов и отсутствие учёта сезонности. Нулевые дни внутри диапазона считаем днями без заказов — это допущение, а не подтверждение полноты исходных данных.

Добавь тесты запросов на маленьких контрольных наборах с известными результатами. Проверь явный выброс, постоянную выручку, пропущенный день и пустую базу. Не изменяй итоговую базу во время тестов.

Запусти проверки и обнови лог.

10. Финальная проверка и подготовка к публикации

Проведи финальную проверку проекта и подготовь его к ручной публикации.

README.md должен содержать:

  1. Назначение проекта.
  2. Указание, что данные синтетические.
  3. Быстрый запуск в Windows PowerShell: создание виртуального окружения, установка pytest, генерация данных, запуск пайплайна, запуск тестов.
  4. Структуру проекта и назначение модулей.
  5. Этапы обработки.
  6. Правила очистки, дублей и конфликтов.
  7. Схему таблиц и единицы денежных значений.
  8. Фактические результаты качества.
  9. Описание SQL-запросов и ссылку на результаты.
  10. Механизм идемпотентности.
  11. Ограничения и допущения.

Проверь наличие артефактов:

  • data/raw_orders.csv;
  • outputs/clean_orders.csv;
  • outputs/rejected_rows.csv;
  • outputs/quality_report.json;
  • outputs/orders.db;
  • outputs/query_results.md;
  • docs/ai_work_log.md.

Исходные синтетические данные и готовые артефакты включаем в репозиторий. В .gitignore исключаем виртуальное окружение, кэши, секреты и временные файлы. Не исключай готовую SQLite-базу общим правилом *.db.

Проверь:

  • генератор воспроизводим;
  • исходный CSV не изменяется при обработке;
  • баланс строк сходится;
  • деньги считаются точно;
  • CSV и база содержат одинаковые очищенные заказы;
  • агрегаты соответствуют заказам;
  • повторный запуск не меняет данные;
  • SQL выполняется;
  • инструкция запуска соответствует реализации.

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

Обнови лог ИИ по фактической истории. Не придумывай ошибки и исправления. Не создавай коммиты и не выполняй push.

В финале кратко сообщи:

  • что создано;
  • что фактически проверено;
  • результаты обработки и тестов;
  • что осталось незавершённым;

11. Сбор исходных промптов

Создай docs/prompts.md с исходными промптами, которые я использовал при работе над проектом.

Бери тексты из доступной истории чата. Сохраняй формулировки, разбей по этапам и добавь оглавление. Не включай ответы ИИ и команды терминала.

Если полный текст запроса недоступен, не восстанавливай его по догадкам или журналу. Укажи, что оригинал не сохранился; краткое изложение явно пометь как пересказ.

В docs/ai_work_log.md добавь ссылку на prompts.md. Остальную историю, код и результаты проверок не меняй. Коммит и push не делай.

12. Проверка перед сдачей

Проведи финальную подготовку проекта к сдаче по заданию Data Engineer.

Проверь, что на месте и согласованы:

  • код загрузки, очистки, агрегации и записи в SQLite;
  • исходный CSV, очищенные данные, отбраковка и отчёт качества;
  • готовая база;
  • три SQL-запроса и фактические результаты;
  • README, журнал ИИ и исходные промпты.

Не расширяй функциональность и не переименовывай файлы ради стиля. Если найдёшь ошибку, сначала воспроизведи её, затем исправь минимально.

Запусти тесты и проверь повторный запуск пайплайна. Убедись, что исходный CSV не изменился, данные не дублируются, суммы заказов и агрегатов совпадают, а clean_orders.csv соответствует базе.

В README добавь фактический результат тестов и проверенные версии Python, SQLite и pytest. Проверь команды запуска и ссылки. Кратко укажи ограничения, включая раздельное обновление базы и отчётов и особенности поиска аномалий.

Проверь доступность результатов для обычного пользователя Windows.

Обнови журнал только реальными действиями.

В конце сообщи:

  • что исправлено;
  • что проверено и с каким результатом;