AAYMA
RU
Войти

Jel Boljam (Жел Болжам)

Агент прогноза выработки ВЭС на 48 ч: берёт прогноз погоды, известный на момент выпуска, считает мощность LightGBM, проверяет результат, принимает…

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

О проекте

Команда: Palantir
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Рабочий MVP

Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным

Суть

Агент прогноза выработки ВЭС на 48 ч: берёт прогноз погоды, известный на момент выпуска, считает мощность LightGBM, проверяет результат, принимает или отклоняет выпуск и пишет резюме; Streamlit-дашборд для диспетчера.

Как устроено

SCADA очищается (время UTC+6 определено по сдвигу корреляции ветра), архивы прогнозов Open-Meteo (ансамбль ECMWF + GFS) собираются с проверкой утечки по реальному расписанию выхода NWP. LightGBM на ветре, направлении sin/cos, температуре и календарных признаках, обучение до 01.01.2026, валидация на январе, итоговый прогноз на февраль. Агент ежедневно проигрывает выпуски 31.01–28.02: погода → прогноз → проверки (диапазон, скачки, расхождение моделей, пересмотр) → решение, принятый выпуск заменяет пересекающиеся 24 ч; резюме через gpt-4o-mini или по правилам.

Ключевые решения

  • LightGBM
  • ансамбль NWP ECMWF + GFS
  • проверка утечки по расписанию NWP
  • persistence/climatology/power curve baselines
  • агентный backtest с accept/reject
  • nMAE по горизонтам
  • OpenAI tools для чата по репозиторию

Метрики

nMAE на январе 2026: LightGBM 16.43% (1–24 ч 15.91%, 25–48 ч 16.97%), power curve 21.44%, climatology 29.20%, persistence 33.88%; 29/29 выпусков приняты, 672/672 ч февраля

Особенности

Часовой пояс SCADA определён по сдвигу корреляции ветра; утечка проверяется по реальному расписанию выхода прогнозов NWP, агент отказывается запускаться, если модель видела данные после первого выпуска. Логика пересчёта при обновлении погоды (замена перекрывающихся 24 ч) и журнал решений по каждому выпуску.

Стек

Python · LightGBM · pandas · Streamlit · SQLite · Open-Meteo API

Модели

gpt-4o-mini · OpenAI


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4ff31b88-palantir.

README

README.md

Jel Boljam (Жел Болжам) — агент прогноза выработки ВЭС

«Жел болжам» по-казахски — «прогноз ветра». Агент сам получает прогноз погоды, известный на момент выпуска, рассчитывает почасовую выработку ветроэлектростанции на 24–48 часов, проверяет результат, пишет резюме и пересчитывает прогноз при обновлении данных.

Данные и погода

Источники, правило «без утечки будущего», часовой пояс и очистка SCADA описаны в data/README_data.md. Сборка датасета: python -m data.build_dataset.

Дашборд

python -m streamlit run app/dashboard.py

Откроется в браузере. Вкладки:

  • Прогноз — почасовая мощность на 48 ч для выбранного выпуска и прогноз ветра ECMWF и GFS;
  • Проверки агента — диапазон, скачки, расхождение погодных моделей, согласие с прошлым выпуском; журнал бэктеста агента (решение по каждому выпуску) и итоговый прогноз на февраль;
  • Качество модели — nMAE на январе 2026 и график «факт против прогноза»;
  • Запуск агента — полный цикл вживую: погода Open-Meteo на момент выпуска → признаки → модель → проверки. Выпуск в 12:00 UTC показывает пересчёт при обновлении прогноза погоды.

Модель и метрики

Запуск модели: python -m model.train. Обучение идёт на train.parquet до 01.01.2026, январь 2026 используется для валидации, а февраль — для итогового прогноза. Используются ветер и его ансамбль, направление в sin/cos, температура, час, месяц и календарные циклы. Предсказание обрезается в [0, 1].

nMAE = 100 * mean(abs(y - pred)); результаты LightGBM записываются в model/metrics_lgbm.csv, прогноз февраля — в model/forecast_lgbm_feb.csv. После появления фактической SCADA скрипт также записывает сравнение LightGBM, persistence, climatology и power curve за февраль в model/metrics_february.csv с разбиением на горизонты 1–24 и 25–48 часов.

Метрики на январе 2026 (валидация, nMAE в % от установленной мощности, меньше — лучше):

Модель1–24 ч25–48 чВсе горизонты
Persistence30.58%37.30%33.88%
Climatology29.26%29.14%29.20%
Power curve21.10%21.80%21.44%
LightGBM15.91%16.97%16.43%

Метрики считаются по фактической мощности power, время SCADA — UTC+6. В валидацию входят только выпуски после конца обучающих данных (с 01.01.2026 00:00 UTC), а кривая для поиска простоев строится без января. LightGBM обучается в несколько потоков, поэтому на другом компьютере его метрика может отличаться в сотых долях процента; значения в таблице — из model/metrics_lgbm.csv в репозитории. Подробнее — в разделе о данных. Пересчёт: python -m model.baseline_nwp и python -m model.train.

LightGBM снижает ошибку на 5 п.п. относительно кривой мощности по прогнозу ветра и почти вдвое относительно persistence.

Агент: полный цикл за февраль

python agent_backtest.py --mode lightgbm --trained-through 2025-12-31T18:00:00+00:00 --out artifacts/agent_run

Агент «проигрывает» тестовый период: каждый день с 31.01 по 28.02.2026 в 00:00 UTC он сам выполняет цикл.

  1. Погода. Берёт прогноз, известный на момент выпуска: data.weather_client, проверка check_no_leakage.
  2. Прогноз. Готовит признаки и считает мощность LightGBM на 48 ч.
  3. Анализ. Проверяет диапазон, пропуски, дубли часов, скачки и пересмотр относительно прошлого выпуска.
  4. Решение. Принимает выпуск или отклоняет его. Принятый выпуск заменяет пересекающиеся 24 ч прошлого прогноза: так работает пересчёт при обновлении входных данных. Отклонённый пишется в журнал, а в силе остаётся прошлый прогноз.

Параметр --trained-through — момент, когда стало известно последнее наблюдение из обучения: 31.12.2025 23:00 по UTC+6, час закончился в 18:00 UTC. Если модель видела данные позже первого выпуска, агент откажется запускаться. Каждый запуск требует новую папку --out.

Готовый прогон уже лежит в репозитории, в artifacts/agent_lgbm/. Агент не перезаписывает прошлые эксперименты, поэтому для повторного запуска нужна новая папка, как artifacts/agent_run в команде выше. Состав результата:

  • february_latest.csv — итоговый почасовой прогноз на 1–28 февраля: 672 ч, время SCADA UTC+6;
  • forecast_history.csv — все версии прогноза по выпускам;
  • runs.jsonl — решение агента, ошибки, предупреждения и резюме по каждому выпуску;
  • summary.json — сводка прогона.

Проверка: 29 из 29 выпусков приняты, 672 из 672 часов февраля. Прогноз агента совпадает с model/forecast_lgbm_feb.csv до последнего знака.

LLM-резюме (необязательно). Нужно выполнить pip install openai, задать переменную окружения OPENAI_API_KEY и добавить --llm-model <модель>. Без ключа или при ошибке API резюме строится по правилам.

Другие режимы и тесты. Бейзлайн запускается с --mode baseline. Тесты агента: python -m unittest discover -s tests -v. Подробности — в docs/agent_integration.md.

Воспроизведение с нуля

Нужен Python 3.10+. Исходные CSV организаторов уже лежат в data/raw/.

На Windows, если команда python открывает Microsoft Store или не находится, используйте лаунчер py вместо python (например, py -m pip install -r requirements.txt). На Linux и macOS может понадобиться python3.

python -m pip install -r requirements.txt
python -m data.build_dataset       # архив прогнозов Open-Meteo + SCADA -> data/processed/
python -m model.baseline_nwp       # бейзлайны и метрики на январе
python -m model.train              # LightGBM: метрики на январе, прогноз на февраль
python agent_backtest.py --mode lightgbm --trained-through 2025-12-31T18:00:00+00:00 --out artifacts/agent_run
python -m streamlit run app/dashboard.py

Февральские метрики считаются по целевым часам 01.02–28.02 (target_time_local). Фактической мощности за февраль в выданных данных нет, поэтому model/metrics_february.csv заполнится, когда эти данные появятся в data/raw/.

Проверка по критериям кейса

КритерийЧем закрыт
Соответствие задачепочасовой прогноз на 48 ч по каждому выпуску; архивные прогнозы погоды, а не факт; февраль целиком, 672 ч
Техническая реализациямодули data / model / агент; проверка утечки по реальному расписанию выхода NWP; ансамбль ECMWF + GFS; LightGBM; агент с проверками, журналом и LLM-резюме
README и воспроизводимостькоманды выше; кэш погоды; тесты агента; фиксированные сиды
ЦенностьnMAE на январе: 16,4% у LightGBM против 21,4% у кривой мощности и 33,9% у persistence; дашборд для диспетчера
ПотенциалSingle Runs API для пересчёта на каждом прогоне 00/06/12/18 UTC; дополнительные модели NWP; квантильный прогноз
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
42
Авторы
3
Файлы
59
Ветки
1

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

Bauyrzhan 31Sermyyt 8mikaqp 4

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

  • 2026-09-23 17:41README: название Jel Boljam, без раздела веб-агентаBauyrzhan
  • 2026-09-23 17:35README: убран раздел веб-агентаBauyrzhan
  • 2026-09-23 17:33Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4ff31b88-palantirBauyrzhan
  • 2026-09-23 17:32README: 16,4% в таблице критериевBauyrzhan
  • 2026-09-23 17:32Merge remote-tracking branch 'origin/codex/openai-repository-agent'Bauyrzhan
  • 2026-09-23 17:30Merge pull request #3 from BAITC-Hacks/codex/openai-repository-agentbaurvtm-stack
  • 2026-09-23 17:22ui: add animated wind farm and polished agent dashboardbaurvtm-stack
  • 2026-09-23 17:01agent: add OpenAI repository tools and standalone data chatbaurvtm-stack
Все коммиты (42)
  • 2026-09-23 16:49Revert "api: сервис агента на FastAPI (цикл, прогноз, журнал, расписание), Dockerfile"Bauyrzhan
  • 2026-09-23 16:46api: сервис агента на FastAPI (цикл, прогноз, журнал, расписание), DockerfileBauyrzhan
  • 2026-09-23 16:33agent: прогон с LLM-резюме (gpt-4o-mini)Bauyrzhan
  • 2026-09-23 16:28agent: прогон с LLM-резюмеBauyrzhan
  • 2026-09-23 16:10docs: новая папка для повторного запуска агента, актуальный статус LightGBMBauyrzhan
  • 2026-09-23 16:03fix: ключ кэша дашборда, проверка полной сетки 48 ч, кривая мощности без будущих часовBauyrzhan
  • 2026-09-23 15:58README: метрики из закоммиченных файловBauyrzhan
  • 2026-09-23 15:55fix: валидация без утечки, очистка SCADA без января, дашборд (полнота, одна модель, кэш), хеш моделиBauyrzhan
  • 2026-09-23 15:47Merge remote-tracking branch 'origin/codex/agent-backtest'Bauyrzhan
  • 2026-09-23 15:46README: агент и воспроизведение; дашборд читает журнал агента; LFBauyrzhan
  • 2026-09-23 15:29README: метрики LightGBM на январеBauyrzhan
  • 2026-09-23 15:28model: обучение через lgb.train без scikit-learn, обученный LightGBM и прогноз на февральBauyrzhan
  • 2026-09-23 15:17Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4ff31b88-palantirBauyrzhan
  • 2026-09-23 15:12Merge branch 'main' into model-person2Bauyrzhan
  • 2026-09-23 15:12fix(model): убрать NaN из цели, метрика по power, subsample_freq=1Bauyrzhan
  • 2026-09-23 15:12Integrate team weather and prediction modules in agent branch; validate baseline backtestmikaqp
  • 2026-09-23 15:08docs: document rubric coverage and reproducible runSermyyt
  • 2026-09-23 15:01data: координаты турбины 2, проверка утечки по реальному расписанию NWP; app: дашбордBauyrzhan
  • 2026-09-23 14:56Add agent analysis and stub backtest with revision historymikaqp
  • 2026-09-23 14:52docs: sync baseline metrics with CSVSermyyt
  • 2026-09-23 14:51app: Streamlit-дашборд прогноза и живой запуск агентаBauyrzhan
  • 2026-09-23 14:36fix: calculate February metrics after baseline predictionsSermyyt
  • 2026-09-23 14:35model: restrict February metrics to February targetsSermyyt
  • 2026-09-23 14:31Limit PR to a standalone stub agent skeleton; preserve current mainmikaqp
  • 2026-09-23 14:28fix: время SCADA = UTC + 6, метрики безлайновBauyrzhan
  • 2026-09-23 14:28model: add February baseline comparisonSermyyt
  • 2026-09-23 14:23fix: время SCADA = UTC+6(сдвиг по корреляции ветра)Bauyrzhan
  • 2026-09-23 14:192 modelsermyyt
  • 2026-09-23 14:17Add station forecast agent, daily backtest and revision auditmikaqp
  • 2026-09-23 14:07model: безлайны и метрики на январе 2026Bauyrzhan
  • 2026-09-23 13:58data: train/test parquestBauyrzhan
  • 2026-09-23 13:53delete zavozBauyrzhan
  • 2026-09-23 13:52data: очистка SCADA, клиент Open-Meteo, сборка датасетаBauyrzhan
  • 2026-09-23 12:16zavozmserikbai
Структура репозитория (59 файлов)
.gitattributes
.gitignore
.streamlit/config.toml
README.md
agent_analysis.py
agent_backtest.py
agent_real.py
agent_skeleton.py
app/agent_theme.css
app/dashboard.py
app/repository_agent.py
app/wind_scene.py
artifacts/agent_lgbm/backtest.sqlite
artifacts/agent_lgbm/february_latest.csv
artifacts/agent_lgbm/forecast_history.csv
artifacts/agent_lgbm/runs.jsonl
artifacts/agent_lgbm/summary.json
artifacts/agent_lgbm_llm/backtest.sqlite
artifacts/agent_lgbm_llm/february_latest.csv
artifacts/agent_lgbm_llm/forecast_history.csv
artifacts/agent_lgbm_llm/runs.jsonl
artifacts/agent_lgbm_llm/summary.json
data/README_data.md
data/__init__.py
data/build_dataset.py
data/config.py
data/features.py
data/processed/meta.json
data/processed/scada_hourly.parquet
data/processed/test_features.parquet
data/processed/train.parquet
data/raw/.gitkeep
data/raw/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv
data/raw/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv
data/scada.py
data/weather_client.py
docs/agent_integration.md
docs/agent_stage2.md
docs/repository_agent.md
model/baseline_nwp.py
model/forecast_baseline_feb.csv
model/forecast_lgbm_feb.csv
model/lightgbm_features.json
model/lightgbm_model.txt
model/metrics_baseline.csv
model/metrics_february.csv
model/metrics_lgbm.csv
model/power_curve.json
model/train.py
repository_agent.py
repository_data.py
requirements-agent.txt
requirements.txt
tests/test_agent_real.py
tests/test_agent_stage2.py
tests/test_repository_agent.py
tests/test_repository_agent_sdk.py
tests/test_repository_agent_ui.py
tests/test_repository_data.py

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

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

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