AAYMA
RU
Войти

LogiPilot

Streamlit-MVP для менеджера закупок: импорт Excel-отчётов ИЭК и Systeme Electric, расчёт предложений по пополнению склада с объяснением по артикулу…

Рабочий MVP
Команда «LowSkillDevs» 2💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

LogiPilot — заказы поставщикам

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

  1. В боковой панели откройте «Загрузить Excel поставщика».
  2. Выберите поставщика и загрузите его шесть файлов: ежемесячные продажи, ежемесячные остатки, динамику продаж, MOQ, сезонность и товар в пути.
  3. Нажмите «Импортировать отчёты». При необходимости добавьте второго поставщика отдельно.
  4. Проверьте дату расчёта, срок поставки, период между заказами и страховой запас. Параметры применяются ко всем выбранным позициям; разные условия поставщиков можно рассчитать отдельно фильтром.
  5. На вкладке «Данные» прочитайте предупреждения. При наличии подтверждённых сведений внесите актуальный остаток или дату поступления с основанием исправления. На вкладке спроса разберите отдельный артикул и сравните расчёт с обработкой всплесков и без неё.
  6. В таблице заказов выберите готовые позиции. Спорные позиции можно оставить на проверке или явно отложить; они не блокируют выгрузку остальных. Для включения спорной строки укажите положительное целое количество и основание решения.
  7. Подтвердите выбранные позиции и скачайте 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      Соответствие ТЗ и границы реализации

Демонстрация за три минуты

  1. Откройте приложение: сразу видны предложения по двум поставщикам.
  2. Выберите DEMO-002: покажите крупную продажу июня и очищенную историю.
  3. Выберите DEMO-005: редкие покупки сохраняют регулярную потребность.
  4. Запустите сценарий задержки поставки в AI-помощнике и покажите вызов инструмента.
  5. Покажите честное сравнение с базовыми методами на вкладке проверки истории.
  6. Выберите проверенные позиции, подтвердите заказ и скачайте CSV. Подробный тайминг и ответы жюри: docs/PITCH.md.

Команда: LowSkillDevs.

Владелец кейса: Электрокомплект.

Подробная проверка требований: ACCEPTANCE.md.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
18
Авторы
3
Файлы
24
Ветки
2

Авторы коммитов

Daniyal-3737 7rucorsev 7zhurf14u-sketch 4

История коммитов

  • 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
Ветки (2)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.