О проекте
Команда: LowSkillDevs
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Streamlit-MVP для менеджера закупок: импорт Excel-отчётов ИЭК и Systeme Electric, расчёт предложений по пополнению склада с объяснением по артикулу, ручная корректировка и утверждение CSV-заказа.
Как устроено
Импортируются продажи, остатки, динамика, MOQ, сезонность и товар в пути; спрос очищается от сезонности и выбросов (медиана + MAD, порог max(m+3.5s, 2.5m, m+3)), редкий спрос обрабатывается по частоте событий, тренд — медиана попарных наклонов, смешение с ростом категории 40/60. Заказ = округление вверх max(чистая потребность, MOQ) до кратности на горизонте «срок поставки + период + страховой запас». Есть temporal backtest с baseline и опциональный AI-помощник OpenAI с инструментами сценарного анализа по агрегатам.
Ключевые решения
- MAD-детекция выбросов
- сезонная декомпозиция
- обработка прерывистого спроса
- медианный тренд
- MOQ и кратность
- temporal backtest
- tool calling
Особенности
Подробная прозрачная методология с явными формулами порогов, разделение разовых всплесков и регулярного спроса, проверка разрыва запаса до позднего поступления, выборочное утверждение позиций с основанием решения; офлайн HTML-демо на 24 сценариях.
Стек
Python · Streamlit · pandas
Модели
OpenAI
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-e7389344-lowskilldevs.
README
README.mdLogiPilot — заказы поставщикам
LowSkillDevs · HackAlem AI · кейс Электрокомплект (ekt.kz)
Hackathon team repository: hack-e7389344-lowskilldevs · Track/Topic: Logistics.
Менеджер закупок загружает отчёты ИЭК и Systeme Electric, получает предложения по пополнению склада с объяснением по каждому артикулу, корректирует количества и утверждает выгрузку. Приложение учитывает сезонность, динамику продаж, остатки, товары в пути, минимальную партию и кратность. Разовые всплески обрабатываются отдельно от регулярного спроса.
Рабочий MVP на Python и Streamlit: воспроизводимый расчёт, проверка на истории, согласование выбранных позиций и AI-помощник с инструментами сценарного анализа. Основные функции работают без API-ключа. OpenAI подключается отдельно; модели передаются вопрос, названия поставщиков и агрегированные результаты инструментов, без построчных продаж и исходных Excel.
Открыть интерактивное демо для жюри — 9 вымышленных товаров, сценарии, объяснения и CSV. Это публичный резерв демонстрации на заранее рассчитанных результатах; полная версия с импортом и AI запускается ниже.
Для защиты: сценарий на 3 минуты, результаты проверки на реальных данных, автономная интерактивная демонстрация. Скачайте docs/demo.html и откройте в браузере — установка и интернет не нужны. В ней только синтетические данные и 24 заранее рассчитанных сценария того же Python-модуля.
Быстрый запуск
Нужен Python 3.11–3.13; рекомендуем 3.12.
git clone https://github.com/BAITC-Hacks/hack-e7389344-lowskilldevs.git
cd hack-e7389344-lowskilldevs
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m streamlit run app.py
В Windows также можно дважды нажать run.bat. Он создаёт локальное окружение, устанавливает зависимости и запускает приложение.
В Linux/macOS после создания окружения:
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -m streamlit run app.py
Адрес приложения: localhost:8501. Первым открывается демонстрация: 9 синтетических товаров двух поставщиков, сезонность, рост, разовый крупный заказ, дефицит, редкий регулярный спрос и избыточный запас. Дата примера — 22.09.2026.
Работа со своими Excel
- В боковой панели откройте «Загрузить Excel поставщика».
- Выберите поставщика и загрузите его шесть файлов: ежемесячные продажи, ежемесячные остатки, динамику продаж, MOQ, сезонность и товар в пути.
- Нажмите «Импортировать отчёты». При необходимости добавьте второго поставщика отдельно.
- Проверьте дату расчёта, срок поставки, период между заказами и страховой запас. Параметры применяются ко всем выбранным позициям; разные условия поставщиков можно рассчитать отдельно фильтром.
- На вкладке «Данные» прочитайте предупреждения. При наличии подтверждённых сведений внесите актуальный остаток или дату поступления с основанием исправления. На вкладке спроса разберите отдельный артикул и сравните расчёт с обработкой всплесков и без неё.
- В таблице заказов выберите готовые позиции. Спорные позиции можно оставить на проверке или явно отложить; они не блокируют выгрузку остальных. Для включения спорной строки укажите положительное целое количество и основание решения.
- Подтвердите выбранные позиции и скачайте CSV. Любое изменение данных, параметров или решений отменяет подтверждение. В CSV сохраняются предложенное и принятое количества и основание ручного решения.
Никакой автоматической отправки поставщику нет. Итоговый CSV использует UTF-8 с BOM и разделитель ;; его можно открыть в Excel. Стандартная панель таблицы также позволяет скачать черновые данные, которые не являются утверждённым заказом. Совместимость с конкретной конфигурацией импорта 1С требует согласования.
Какие источники используются
| Источник | Участие в расчёте |
|---|---|
| Ежемесячные продажи | Основной ряд спроса по коду номенклатуры; незавершённый месяц не обучает прогноз |
| Ежемесячные остатки | Последний доступный снимок и признаки возможного отсутствия товара в истории |
| Динамика продаж | Дневные продажи и возвраты, обнаружение всплесков, рост по сопоставимым полным периодам; продажи не прибавляются повторно к месячному отчёту |
| Сезонность | Коэффициенты месяцев поставщика с применением к категориям |
| MOQ | Минимальная партия и кратность заказа; сопоставление кодов через справочные поля |
| Товар в пути | Поступления в пределах горизонта; в отчёте Systeme Electric также есть категории и свободный остаток |
Импорт настроен на предоставленные выгрузки ИЭК и Systeme Electric, включая служебные строки и широкие таблицы с русскими месяцами. Другой формат отчёта может потребовать адаптера. Ключ позиции — пара «поставщик + код номенклатуры»; ведущие нули сохраняются. Если категории нет, используется явная группа «Все».
Файлы компании не входят в репозиторий и не требуются для демо. При локальном запуске импорт остаётся на компьютере пользователя. Если приложение запущено на удалённом сервере, загруженные файлы обрабатывает этот сервер.
Методология
Очистка регулярного спроса
Возвраты сохраняются со знаком; отрицательный итог месяца не превращается в положительный спрос. Месячный ряд очищается от сезонности, затем сравнивается с устойчивыми оценками уровня спроса. Аномальные пики заменяются регулярной оценкой; исходные значения остаются доступны на графике. Дневной журнал позволяет дополнительно обнаружить единичные крупные продажи без повторного суммирования с месячной историей.
Для регулярного спроса за последние 24 полных месяца используются медиана m и масштаб s = 1.4826 × median(|x − m|). При наличии хотя бы четырёх наблюдений высокий выброс — значение выше max(m + 3.5s, 2.5m, m + 3). Он заменяется медианой неаномальных значений с возвратом сезонного коэффициента. Дневная проверка требует минимум восьми дней продаж и дополнительно превышения пятикратной медианы и 10 единиц. Вычитается только избыточная часть соответствующего месяца.
Редкий спрос обрабатывается отдельно. Если положительные продажи встречаются не более чем в 60% наблюдаемых месяцев, сравниваются размеры положительных событий, а нулевые месяцы сохраняются. Для выявления крупного события нужны минимум три положительных месяца; порог — max(m + 3.5s, 4m, m + 3). Прогноз строится по средней частоте последних 12 наблюдаемых месяцев. Ряд [0, 0, 10] × 4 сохраняет средний спрос 3,33 единицы в месяц. Единственное положительное событие не обнуляется: оно требует классификации менеджером. Отсутствующие месяцы не подменяются нулями.
При наличии обезличенного customer_id в нормализованных транзакциях алгоритм может отдельно проверить концентрацию объёма у клиента. В предоставленных Excel такого поля нет, поэтому здесь нельзя утверждать, что всплеск вызван конкретным клиентом. Подозрение на разовую продажу является эвристикой и требует проверки менеджером.
Недопродажи, сезонность и рост
Нулевой месячный остаток и низкие продажи используются как признак возможного отсутствия товара. Оценка регулярного спроса восстанавливает часть недопродаж с ограничением величины поправки. Это приближение: месячные снимки не позволяют определить точные дни stockout.
На очищенном ряде регулярного спроса оценивается устойчивый тренд. Он учитывается вместе с ростом из источника динамики и ручной поправкой менеджера. Сезонные коэффициенты применяются по календарным дням прогнозного горизонта. Для прерывистого спроса индивидуальный тренд не экстраполируется из редких событий. Прогнозирование статистическое; LLM используется для выбора инструментов и объяснения сценариев.
Наклон тренда — медиана попарных месячных наклонов за последние 12 месяцев; базовый уровень оценивается по последним шести. Годовой тренд SKU ограничен диапазоном −50…+50%. При наличии роста категории он смешивается с трендом SKU в пропорции 40/60; затем добавляется ручная годовая поправка. Итоговый годовой рост ограничен −80…+100%. Компенсация недопродаж за отдельный месяц ограничена 50% типичного сезонного спроса.
Количество к заказу
Горизонт = срок поставки + период между заказами + страховой запас в днях
Потребность = сумма прогнозного спроса на дни горизонта
Чистая потребность = max(0, потребность − остаток − учитываемый товар в пути)
Заказ при положительной потребности = округлить вверх(max(чистая потребность, MOQ) / кратность) × кратность
Датированные поступления после горизонта не уменьшают заказ. Неизвестные даты прихода, начальный или неподтверждённый месячный остаток и устаревший снимок требуют ручной проверки. Дополнительно проверяется разрыв запаса до позднего поступления: общая сумма товара в пути не должна скрывать дефицит до его прихода. Приоритет отражает риск дефицита за срок поставки. В каждой строке сохраняется объяснение входных чисел и поправок.
Архитектура
flowchart LR
A[Sales and inventory Excel] --> B[Validation and integration]
C[Incoming stock and MOQ] --> B
B --> D[Spike and intermittent demand analysis]
D --> E[Forecast and replenishment rules]
E --> F[Manager review and selected approval]
F --> G[Approved CSV]
E --> H[Temporal backtest and baselines]
I[Optional AI assistant] --> J[Validated scenario tools]
J --> E
Ограничения данных и прототипа
- В ИЭК ежемесячные остатки обозначены как начальные остатки. Их нельзя считать фактическим свободным остатком на 22 сентября. Перед утверждением заказа нужны актуальные складские данные.
- Заголовок Systeme Electric «СЭ в пути 24.09» сам по себе не подтверждает дату прибытия. Такие поступления отмечаются как требующие уточнения.
- В исходных данных нет полного справочника сроков поставки, точных дней отсутствия и обезличенных клиентов. Интерфейс делает соответствующие допущения явными.
- Категории, месячные агрегаты и дневной журнал могут различаться по охвату складов и периодов. Прототип агрегирует поставщика; отдельный фильтр по складу пока не реализован.
- Денежная экономия, повышение точности и снижение дефицита не заявляются как измеренные результаты. Рекомендация требует проверки закупщиком.
Проверка на истории
Вкладка «Проверка на истории» сравнивает три метода на одних и тех же SKU и месяцах: модель LogiPilot, среднее предыдущих трёх месяцев и тот же месяц прошлого года. Для каждого месячного окна история обрезается до его начала; сезонность и рост пересчитываются из доступного прошлого. Недатированные коэффициенты исходных файлов и текущие складские снимки не используются при обучении в прошлом.
Выборка фиксируется до первого контрольного месяца, стратифицируется по поставщику и регулярности спроса; отбор внутри групп детерминирован. Интерфейс показывает MAE, WAPE, смещение, охват, исключения и наличие сведений об остатках. Неизвестный остаток не означает наличие товара.
На 120 SKU и 360 наблюдениях за июнь–август 2026 года WAPE составил 34,88% у LogiPilot, 25,59% у среднего за 3 месяца и 47,41% у прошлогоднего месяца. Простое среднее лучше на этой выборке наблюдаемых продаж. Это диагностическая проверка, без подстройки под контрольный период; подтверждённого преимущества по точности или экономии пока нет. Методология и ограничения: docs/VALIDATION.md.
AI-помощник
Во вкладке «AI-помощник» доступны сценарии задержки поставки, изменения годовой поправки спроса и проверки данных. Без API они выполняются локально по распознаваемым формулировкам. Для настоящего tool calling включите OpenAI API и введите ключ и название доступной вашей команде модели. Ключ остаётся в памяти сессии приложения; кнопка «Забыть ключ» удаляет его из неё. Не помещайте ключ в Git.
Через OpenAI Responses API модель выбирает инструмент, сервер проверяет аргументы, Python рассчитывает сценарий, а модель объясняет результат. Журнал вызовов и сравнение показываются пользователю. Запросы используют store: false; применяются условия обработки данных поставщика API. Вопрос отправляется модели целиком: не включайте в него секреты и данные клиентов. При ошибке API переход на локальный сценарий явно обозначается. Инструменты не утверждают и не отправляют заказы.
Пример: «Поставка ИЭК задержится на 10 дней. Сравни риски». Сценарий увеличивает срок новых поставок и переносит известные даты товара в пути выбранного поставщика на 10 дней. Исходные данные и текущий утверждённый заказ не изменяются. Сценарий роста добавляет процентные пункты к годовой поправке, а не умножает весь заказ на указанный процент.
Тесты и структура
python -m unittest discover -s tests -v
Тесты проверяют расчёт, редкий спрос, влияние источников, всплески, недопродажи, округление, временную изоляцию проверки, ручные решения и протокол вызова AI-инструментов. API проверяется с имитацией ответов; перед защитой нужен отдельный живой запрос с ключом команды. Автоматическая проверка GitHub Actions не настроена.
app.py Интерфейс, редактирование, утверждение и CSV
planner.py Прогноз и расчёт заказа
data_loader.py Адаптеры исходных Excel и проверка данных
demo_data.py Воспроизводимые синтетические сценарии
ai_agent.py Инструменты сценариев, локальный режим и OpenAI tool calling
evaluation.py Проверка на истории без будущих данных
order_workflow.py Выбор, ручные решения, подтверждение и безопасный CSV
docs/ Сценарий защиты, измерения, автономная демонстрация
scripts/ Воспроизводимая сборка автономной демонстрации
tests/ Автоматические проверки
ACCEPTANCE.md Соответствие ТЗ и границы реализации
Демонстрация за три минуты
- Откройте приложение: сразу видны предложения по двум поставщикам.
- Выберите DEMO-002: покажите крупную продажу июня и очищенную историю.
- Выберите DEMO-005: редкие покупки сохраняют регулярную потребность.
- Запустите сценарий задержки поставки в AI-помощнике и покажите вызов инструмента.
- Покажите честное сравнение с базовыми методами на вкладке проверки истории.
- Выберите проверенные позиции, подтвердите заказ и скачайте CSV. Подробный тайминг и ответы жюри: docs/PITCH.md.
Команда: LowSkillDevs.
Владелец кейса: Электрокомплект.
Подробная проверка требований: ACCEPTANCE.md.
Авторы коммитов
История коммитов
- 2026-09-23 17:18Final version of READMEDaniyal-3737
- 2026-09-23 17:14Choosing forecast methods by certain months for frequent demandrucorsev
- 2026-09-23 16:32Merge branch 'main' of https://github.com/BAITC-Hacks/hack-e7389344-lowskilldevsrucorsev
- 2026-09-23 16:30Update app.pyrucorsev
- 2026-09-23 16:29Update app.pyrucorsev
- 2026-09-23 16:26Refactor app.pyrucorsev
- 2026-09-23 16:25Update READMEDaniyal-3737
- 2026-09-23 16:18READMEDaniyal-3737
Все коммиты (18)
- 2026-09-23 16:06Merge team documentation and align it with the verified implementationzhurf14u-sketch
- 2026-09-23 16:06Add auditable AI scenarios, temporal validation and selected order approvalzhurf14u-sketch
- 2026-09-23 15:47Updated README new versionDaniyal-3737
- 2026-09-23 15:30Revise README with project details and methodologyDaniyal-3737
- 2026-09-23 15:17feat: build supplier replenishment MVP for HackAlem AIzhurf14u-sketch
- 2026-09-23 14:52Update READMEDaniyal-3737
- 2026-09-23 14:19Merge pull request #1 from BAITC-Hacks/masterrucorsev
- 2026-09-23 14:16Added progress indecationrucorsev
- 2026-09-23 13:54Slightly updated README, added info about track and details of promptDaniyal-3737
- 2026-09-23 13:45Add Danial to the README.md team listzhurf14u-sketch
Структура репозитория (24 файлов)
.gitattributes .gitignore ACCEPTANCE.md AGENTS.md PROMPTS.md README.md ai_agent.py app.py data_loader.py demo_data.py docs/PITCH.md docs/VALIDATION.md docs/demo.html evaluation.py order_workflow.py planner.py requirements.txt run.bat scripts/build_offline_demo.py tests/test_ai_agent.py tests/test_app.py tests/test_data_loader.py tests/test_evaluation.py tests/test_planner.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.