ОЧИЩЕННЯ ТА ОБ’ЄДНАННЯ ДАНИХ
Демонстраційний кейс для портфоліо Viktoriia Boiko

Усі записи вигадані. Це відтворюваний приклад підготовки даних, а не результат роботи з реальним клієнтом. Немає персональних даних, підключень до облікових записів або платних сервісів.

ЩО ВІДКРИТИ
clean-data.xlsx — оформлений знімок перевіреного запуску з формулами фінансових показників, фільтрами та журналом.
results/report.html — локальний звіт у браузері; оновлюється кожним запуском Python.
results/summary.json — точні контрольні суми та SHA-256 джерел.
results/validation.json — результати восьми контрольних звірок.
results/row_ledger.csv — кожен вхідний рядок із рішенням, причиною та початковими значеннями.
results/rejected_rows.csv — 27 рядків, що не включені: 8 дублів і 19 відхилених.

ПОВТОРНИЙ ЗАПУСК
Потрібен Python 3.9 або новіший. Додаткові бібліотеки не потрібні.
Розпакуйте архів, відкрийте термінал у його папці та виконайте:

python3 pipeline.py --input inputs --output results --month 2026-09
python3 test_pipeline.py

У Windows замість python3 можна використати py.
Для нового набору CSV з тією самою схемою:

python3 pipeline.py --input new-inputs --output new-results --month 2026-10

Збережіть початкові CSV окремо. Скрипт не змінює джерела; результати у вибраній output-папці перезаписуються. Однакові джерела та місяць дають побайтово однакові CSV, JSON і HTML. Тести використовують демонстраційні файли inputs і не змінюють їх.

Python оновлює CSV, JSON і HTML; він не перезаписує XLSX. Оформлений XLSX — окремий перевірений знімок. Його формули перераховують суми при зміні підготовлених замовлень, але приєднання довідників і повернень виконує Python. Після нового імпорту потрібне окреме оновлення XLSX. Для повторного оформлення збережено JS-сценарій build_workbook.mjs; він використовує @oai/artifact-tool у середовищі Codex і поточну демонстраційну структуру, а не є автономним Python-експортером.

Відтворення XLSX у налаштованому Node.js-середовищі з доступним @oai/artifact-tool:
node build_workbook.mjs
Або з іншого робочого каталогу:
node build_workbook.mjs /path/to/data-cleaning-case
Сценарій читає results/workbook_data.json, перевіряє контрольні суми демонстраційного набору, перераховує формули й експортує XLSX. Для іншої кількості рядків чи місяця треба адаптувати діапазони та підписи у сценарії; це не універсальний Excel-конвертер.

ДЖЕРЕЛА І ДЕТАЛІЗАЦІЯ
products.csv: один рядок на product_id. Назва, категорія, собівартість одиниці, валюта.
orders.csv: один рядок на order_id; одне замовлення містить один товар. Замовлення з кількома товарними позиціями потребують line_id та іншого правила ключа.
returns.csv: один рядок на return_id; повернення прив’язане до order_id.
ad_spend.csv: один рядок на spend_id. Кілька витрат одного каналу за день дозволені, якщо це різні записи.

Заголовки CSV та їх порядок мають відповідати демонстраційним файлам. UTF-8 з BOM або без нього, роздільник — кома; значення з комою беруться в лапки. Усі чотири джерела потрібні. Порожні файли лише із заголовком дозволені окремо; повністю порожній набір завершується зрозумілою помилкою без нового звіту.

ПРАВИЛА
1. Пробіли навколо значень прибираються. Валюта uah нормалізується до UAH.
2. Дати приймаються лише YYYY-MM-DD або DD.MM.YYYY. Рядок 09/10/2026 не вгадується.
3. Числа: цифри і необов’язкова десяткова крапка або кома, максимум два знаки після неї. Роздільники тисяч не допускаються. 1,250.50 відхиляється.
4. Порожні ID, невідомі товари, канали, статуси, неіснуючі дати, від’ємні суми та недодатні кількості відхиляються.
5. completed, paid, «оплачено», «виконано» означають completed. cancelled і «скасовано» означають cancelled. Регістр неважливий. Інші значення відхиляються.
6. Спочатку перевіряються поля. Серед валідних записів однаковий ID та однакові нормалізовані значення дають один прийнятий запис і решту дублів. Це рівність після нормалізації, а не побайтова рівність CSV. Якщо валідні записи одного ID суперечать один одному, відхиляється вся група. Жоден варіант не обирається навмання.
7. Повернення допускаються лише для прийнятого виконаного замовлення, не раніше його дати. Якщо сумарна кількість валідних повернень перевищує куплену, відхиляється вся група повернень замовлення.
8. Замовлення, повернення та реклама мають лежати у вибраному місяці. Це звіт когорти одного місяця, не повний бухгалтерський облік. Для повернень попередніх місяців потрібна історія продажів.
9. Суми Python зберігає цілими копійками. Знижка застосовується до ціни одиниці, результат округлюється до копійки (ROUND_HALF_UP), потім множиться на кількість.
10. Продажі враховують тільки completed. Повернення оцінюються за ціною продажу зі знижкою. Повернені товари вважаються повністю придатними до повторного продажу; їх собівартість віднімається від витрат.

ПРИКЛАДИ НА ТИХ САМИХ РЯДКАХ
orders.csv, рядок 4, O0003: order_date «03.09.2026» стає «2026-09-03».
orders.csv, рядок 5, O0004: status «Оплачено» стає «completed».
orders.csv, рядок 242, O0001: повтор нормалізованого запису з рядка 2; виключений як duplicate_exact.
orders.csv, рядок 247, O0901: «09/10/2026» відхилено як ambiguous_date.
orders.csv, рядки 256 і 257, O0999: різні кількості одного ID; обидва відхилені як duplicate_conflict.
У row_ledger.csv початковий запис збережений у raw_json поряд із рішенням; у clean_orders.csv є source_row для прямого зіставлення.

ПЕРЕВІРЕНИЙ РЕЗУЛЬТАТ
351 вхідний рядок = 324 прийняті + 8 дублів + 19 відхилених.
324 прийняті = 6 товарів + 240 замовлень + 18 повернень + 60 записів реклами.
226 виконаних і 14 скасованих замовлень.
Продажі до повернень: 693 301,00 грн.
Повернення: 24 973,00 грн.
Виторг після повернень: 668 328,00 грн.
Собівартість проданих неповернених товарів: 365 130,00 грн.
Валовий прибуток: 303 198,00 грн.
Реклама: 41 910,00 грн.
Після собівартості й реклами: 261 288,00 грн.

Остання сума не є чистим прибутком: доставка, зарплати, податки та інші витрати не включені. Канал замовлення використано для описового групування; він не доводить причинний вплив реклами.

ПЕРЕВІРКА ЯКОСТІ
13 автоматичних тестів: повний облік рядків і незалежна фінансова звірка; побайтова повторюваність; дублі без подвоєння сум; конфліктні ID; сумарні повернення понад продаж; неоднозначні дати й числа; валюта; межі місяця; зайві поля; неправильні заголовки; конфлікт товару та залежні замовлення; новий валідний запис; повністю порожній набір.
Вісім контрольних звірок у кожному запуску. Фінансові формули XLSX звірено з Python; зміна ціни дала очікувану зміну підсумку, потім початкове значення відновлено. Помилок формул у перевірених діапазонах немає. Усі сім вкладок візуально перевірені.
Перерахунок перевірено в Artifact Tool. Microsoft Excel desktop окремо не запускали. У файлі дати — числові дати Excel із форматом YYYY-MM-DD; суми — числа, а не текст.
