О проекте
Команда: Pairadox
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Интерфейс поддержки закупок по данным IEK. Считает рекомендуемый объём заказа поставщику с прозрачной раскладкой: прогноз спроса, остаток, товары в пути, страховой запас, кратность, приоритет и риск. Есть сценарный анализ.
Как устроено
Backend на FastAPI загружает Excel-файлы IEK (продажи, остатки, MOQ, товары в пути, сезонность) и нормализует их. Пайплайн исключает аномалии, корректирует stockout, учитывает сезонность, тренд и структурные сдвиги, прогнозирует спрос, считает потребность на срок поставки (1 месяц) и страховой запас (95% сервиса) и округляет заказ до кратности. Frontend на React выводит таблицу рекомендаций с приоритетами critical/high/medium/low и панель объяснений. POST /counterfactual сравнивает сценарии с отключёнными поправками. Экспорт в CSV/XLSX.
Ключевые решения
- прогноз спроса (statsmodels)
- детекция аномалий
- коррекция stockout
- сезонность
- структурный сдвиг
- страховой запас
- MOQ/кратность
- counterfactual-сценарии
Особенности
Counterfactual-сравнение: менеджер отключает отдельные поправки (аномалии, stockout, сезонность, тренд) и видит, как меняется рекомендация. Отдельный раздел контроля качества данных. Внешние AI API не используются. Явного шага утверждения заказа менеджером в README нет.
Стек
Python · FastAPI · Uvicorn · pandas · NumPy · SciPy · scikit-learn · statsmodels · openpyxl · React 19 · TypeScript · Vite
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-866564aa-pairadox.
README
README.mdPairadox
Краткое описание
Pairadox — интерфейс поддержки закупочных решений. Система помогает специалисту по закупкам понять, какие товары требуют пополнения, какое количество рекомендуется заказать и какие данные повлияли на расчёт.
Проект решает проблему непрозрачных закупочных рекомендаций: вместо одного итогового числа пользователь видит прогноз спроса, текущий остаток, товары в пути, страховой запас, кратность заказа, приоритет и риск.
Что реализовано
- загрузка рекомендаций из FastAPI backend;
- таблица рекомендаций с постраничным просмотром по 50 товаров;
- поиск по SKU и доступным полям ответа API;
- отображение прогноза, остатка, товаров в пути, страхового запаса и рекомендуемого заказа;
- приоритеты
critical,high,mediumиlow; - категории риска backend;
- панель с объяснением расчёта выбранного товара;
- сравнение сценариев с включением и отключением исключения аномалий, коррекции stockout, сезонности и тренда роста;
- отдельный график прогнозируемого спроса;
- раздел контроля качества данных и ограничений расчёта;
- экспорт отфильтрованных рекомендаций в CSV;
- состояния загрузки, ошибки backend и повторная попытка подключения.
Как работает решение
- Backend загружает предоставленные Excel-файлы IEK и нормализует продажи, остатки, товары в пути, кратность заказа и сезонность.
- Аналитический pipeline рассчитывает прогноз спроса, потребность на срок поставки, страховой запас и рекомендуемое количество заказа.
- Frontend запрашивает рекомендации страницами через
GET /recommendationsи показывает их в закупочном рабочем пространстве. - Пользователь выбирает SKU и проверяет составляющие базового расчёта.
- При необходимости пользователь меняет параметры сценария. Frontend отправляет их в
POST /counterfactual, после чего показывает сравнение с базовой рекомендацией. - Пользователь может скачать текущий отфильтрованный список в CSV.
Технологии
- Python;
- FastAPI;
- Uvicorn;
- pandas;
- NumPy;
- SciPy;
- scikit-learn;
- statsmodels;
- openpyxl;
- React 19;
- TypeScript;
- Vite;
- CSS и SVG-графика;
- Git и GitHub.
Внешние AI API, API-ключи и база данных для запуска проекта не требуются.
Архитектура проекта
hackathon_alemai/
├── backend/
│ ├── main.py # FastAPI-приложение и API-маршруты
│ ├── config.py # пути к файлам и параметры расчёта
│ ├── models/schemas.py # схемы API
│ └── services/ # загрузка данных и аналитический pipeline
├── data/IEK/ # исходные Excel-файлы IEK
├── frontend/
│ ├── src/App.tsx # интерфейс рабочего пространства
│ ├── src/App.css # стили интерфейса
│ ├── src/services/api.ts # frontend-адаптер API
│ └── vite.config.ts # локальный proxy /api → backend
├── requirements.txt
└── README.md
Frontend и backend запускаются как два процесса. В режиме разработки Vite перенаправляет запросы /api на http://127.0.0.1:8000.
Установка и запуск
Требования: macOS или Linux, Python 3.10+, Node.js 20.19+ или 22.12+, npm и Git.
Скачайте репозиторий и перейдите в его корень:
git clone https://github.com/BAITC-Hacks/hack-866564aa-pairadox.git
cd hack-866564aa-pairadox
Создайте окружение Python, установите зависимости и запустите backend в первом терминале:
python3 -m venv .venv/mac
source .venv/mac/bin/activate
python -m pip install -r requirements.txt
python -m uvicorn backend.main:app --reload --port 8000
Дождитесь сообщения Application startup complete.. Первый запуск читает Excel-файлы и может занять несколько минут. Терминал backend должен оставаться запущенным.
Во втором терминале установите frontend-зависимости и запустите Vite:
cd frontend
npm install
npm run dev
Откройте адрес, который напечатает Vite, обычно http://localhost:5173.
Для production-проверки frontend:
npm run build
Как проверить решение
- Убедитесь, что backend сообщает
Application startup complete.. - Откройте адрес Vite и дождитесь статуса
Backend connected. - Откройте раздел
Recommendationsи выберите строку товара. - Сверьте в правой панели месячный прогноз, потребность на срок поставки, страховой запас, остаток, товары в пути и рекомендуемый заказ.
- В блоке
Compare a scenarioотключите один параметр, напримерExclude one-off anomalies, и нажмитеCalculate scenario. - Сравните новый результат с базовой рекомендацией. Базовая цифра в таблице сохраняется отдельно от сценарного результата.
- Выполните поиск по SKU и нажмите
Export CSV, чтобы проверить экспорт отфильтрованных строк. - Откройте раздел
Forecasts, выберите другой SKU и проверьте прогнозные точки. - Откройте раздел
Data quality, чтобы увидеть допущения и ограничения исходных данных.
Данные и API
Backend использует файлы из data/IEK/:
- динамика продаж с датами документов;
- ежемесячные продажи;
- ежемесячные остатки;
- MOQ и кратность отгрузки;
- товары в пути;
- коэффициенты сезонности.
Основные маршруты:
GET /health— состояние API и количество рассчитанных рекомендаций;GET /recommendations— рекомендации с фильтрами и пагинацией;GET /recommendations/{sku}— детали товара и прогнозы;POST /counterfactual— сравнение сценария по query-параметрам;GET /suppliers— сводка по поставщикам;GET /export?format=csvилиGET /export?format=xlsx— экспорт backend-данных.
Frontend использует локальный proxy /api, поэтому в обычной локальной установке отдельный адрес API указывать не нужно.
Ограничения
- Backend в текущей конфигурации обрабатывает набор IEK.
- Исходные данные — снимки Excel, а не подключение к системе склада в реальном времени.
- Срок поставки по умолчанию задан как один месяц; уровень обслуживания — 95%. Это параметры планирования, а не измеренная статистика поставщика.
- Количество товаров в пути суммируется; frontend отдельно не проверяет, успеет ли каждая поставка прибыть в срок заказа.
- Месячные пустые значения нормализуются backend в ноль; последний доступный период может быть неполным.
- Отрицательные месячные значения сохраняются, а транзакционные количества для прогнозирования приводятся к модулю.
- Категория риска является эвристической оценкой, а не калиброванной вероятностью дефицита.
- Исторические продажи не вынесены в отдельный frontend endpoint; раздел
Forecastsпоказывает прогнозные точки backend. - Точность прогноза и экономический эффект не оцениваются на отдельном контрольном наборе.
- Внешняя deployed-версия проекта не используется; запуск выполняется локально.
Авторы коммитов
История коммитов
- 2026-09-23 17:51Merge pull request #5 from BAITC-Hacks/ingkar-frontenddaaingkaryaad
- 2026-09-23 17:45rewrite project README in RussianIngkar Adilbek
- 2026-09-23 17:36Merge pull request #4 from BAITC-Hacks/ingkar-frontenddaaingkaryaad
- 2026-09-23 17:33connect frontend to backend recommendations and scenariosIngkar Adilbek
- 2026-09-23 17:33stop tracking generated Python cache filesIngkar Adilbek
- 2026-09-23 17:22Merge pull request #3 from BAITC-Hacks/farida-backenddaaingkaryaad
- 2026-09-23 17:20Merge remote-tracking branch 'origin/farida-backend' into ingkar-frontendIngkar Adilbek
- 2026-09-23 17:12Remove virtual environment from repositoryFarida Dovletbaeva
Все коммиты (22)
- 2026-09-23 17:07Complete backend API and add gitignoreFarida Dovletbaeva
- 2026-09-23 16:46Merge remote-tracking branch 'origin/farida-backend' into ingkar-frontendIngkar Adilbek
- 2026-09-23 16:44обновление кодаFarida Dovletbaeva
- 2026-09-23 16:24add project READMEIngkar Adilbek
- 2026-09-23 16:20обновление кодаFarida Dovletbaeva
- 2026-09-23 14:56build explainable purchasing dashboardIngkar Adilbek
- 2026-09-23 14:02initialize frontend recommendation table and ignore generated filesIngkar Adilbek
- 2026-09-23 13:57Merge pull request #2 from BAITC-Hacks/ingkar-frontenddaaingkaryaad
- 2026-09-23 13:47add shared gitignoreIngkar Adilbek
- 2026-09-23 13:44Merge pull request #1 from BAITC-Hacks/ingkar-frontenddaaingkaryaad
- 2026-09-23 13:35add project directory structureIngkar Adilbek
- 2026-09-23 13:33remove duplicate readmeIngkar Adilbek
- 2026-09-23 13:30Merge remote-tracking branch 'origin/main' into ingkar-frontendIngkar Adilbek
- 2026-09-23 13:29initial local project setupIngkar Adilbek
Структура репозитория (53 файлов)
.gitignore README.md backend/.gitkeep backend/config.py backend/main.py backend/models/__init__.py backend/models/schemas.py backend/services/__init__.py backend/services/anomaly_detection.py backend/services/explanations.py backend/services/forecasting.py backend/services/pipeline.py backend/services/preprocessing.py backend/services/replenishment.py backend/services/seasonality.py backend/services/stockout.py backend/services/structural_shift.py data/IEK/MOQ ИЭК.xlsx data/IEK/Динамика продаж_2025-2026.xlsx data/IEK/Ежемесячные остатки продукции за последние 2 года ИЭК.xlsx data/IEK/Ежемесячные продажи в количественном выражении за последние 2 года.xlsx data/IEK/Путь ИЭК 22.09.2026.xlsx data/IEK/Сезонность ИЭК.xlsx frontend/.env.example frontend/.gitignore frontend/.oxlintrc.json frontend/README.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/public/favicon.svg frontend/public/icons.svg frontend/src/App.css frontend/src/App.tsx frontend/src/assets/hero.png frontend/src/assets/react.svg frontend/src/assets/vite.svg frontend/src/components/RecommendationTable.tsx frontend/src/components/SkuDetails.tsx frontend/src/data/dashboardDemo.ts frontend/src/data/mockRecommendations.ts frontend/src/index.css frontend/src/main.tsx frontend/src/services/api.ts frontend/src/services/dashboard.ts frontend/src/services/scenario.ts frontend/src/types/dashboard.ts frontend/src/types/recommendation.ts frontend/tsconfig.app.json frontend/tsconfig.json frontend/tsconfig.node.json frontend/vite.config.ts requirements.txt
Ветки (3)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.