О проекте
Команда: 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.mdJel 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 ч | Все горизонты |
|---|---|---|---|
| Persistence | 30.58% | 37.30% | 33.88% |
| Climatology | 29.26% | 29.14% | 29.20% |
| Power curve | 21.10% | 21.80% | 21.44% |
| LightGBM | 15.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 он сам выполняет цикл.
- Погода. Берёт прогноз, известный на момент выпуска:
data.weather_client, проверкаcheck_no_leakage. - Прогноз. Готовит признаки и считает мощность LightGBM на 48 ч.
- Анализ. Проверяет диапазон, пропуски, дубли часов, скачки и пересмотр относительно прошлого выпуска.
- Решение. Принимает выпуск или отклоняет его. Принятый выпуск заменяет пересекающиеся 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; квантильный прогноз |
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.