AAYMA
RU
Войти

WindAgent

Агентная система прогноза почасовой выработки двух турбин ВЭС на 24–48 часов по архивным прогнозам трёх моделей погоды.

Доведённый продукт
Команда «Machu-Piccu» 19💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Machu-Piccu
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Доведённый продукт

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

Суть

Агентная система прогноза почасовой выработки двух турбин ВЭС на 24–48 часов по архивным прогнозам трёх моделей погоды. Включает реплей 28 ежедневных циклов на февраль 2026, интервалы P10–P90, LLM-разбор для диспетчера и Streamlit-дашборд.

Как устроено

Прогнозы ECMWF IFS, GFS и ICON с Open-Meteo берутся по отдельности из слоёв previous_dayN, то есть с фиксированным упреждением 24/48/72 ч, и усредняются: такой ансамбль дал RMSE ветра 2.44 против 2.84 у best_match. Сдвиг времени SCADA (UTC+6) определён кросс-корреляцией с NWP. Прогноз делает объединённая модель LightGBM с онлайн-калибровкой зимнего смещения и конформной калибровкой интервалов. Есть две политики момента формирования (rolling и strict) и тесты честности. LLM-слой может управлять циклом агента и пишет разбор; для всех 28 циклов февраля сохранены транскрипты, которые прошли аудит.

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

  • LightGBM
  • NWP multi-model ensemble (ECMWF IFS, GFS, ICON)
  • Open-Meteo Historical Forecast previous_dayN
  • conformal prediction P10–P90
  • online bias calibration
  • cross-correlation time alignment
  • rolling replay backtest
  • persistence/climatology baselines

Метрики

122-дневный реплей, D+1: MAE 0.1586, RMSE 0.2134, R² 0.651, −53% к персистентности; strict MAE 0.176; покрытие P10–P90 76.4% (цель 80%); ежедневный пересчёт снижает MAE с 0.1738 до 0.1573

Особенности

Главный выигрыш в точности дала работа с входными данными, а не с моделью: три NWP-модели используются отдельно и усредняются, проверено, что previous_dayN означает фиксированный сдвиг упреждения. Замерено, как свежие входы меняют прогноз (234 из 244 циклов). Кэш погоды и модели закоммичены, всё воспроизводится офлайн, в том числе в Docker. Есть handoff-раздел для ИИ-агента жюри.

Стек

Python · LightGBM · Streamlit · Parquet · Docker · Makefile · pytest

Модели

OpenAI (OPENAI_API_KEY)


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

README

README.md

WindAgent: агентный прогноз почасовой выработки ВЭС на 24–48 часов

English version: README.en.md

Решение кейса HackAlemAI «Agentic AI для прогнозирования выработки ВЭС» (task.md). Система сама забирает архивные прогнозы трёх численных моделей погоды по координатам турбин, готовит признаки, запускает обученную модель, публикует почасовой прогноз на два следующих дня по каждой турбине, анализирует результат, измеряет, насколько свежие входные данные изменили ответ, и учится на собственных проверенных ошибках. Сдача: почасовая нормализованная мощность за 1–28 февраля 2026, полученная реплеем 28 ежедневных циклов («на 31 января, на 1 февраля, … на 27 февраля») по прогнозам погоды, которые были доступны в каждый из этих моментов.

Объект: две турбины в Шелекском ветровом коридоре, Алматинская область (43.645 с.ш., 78.536 в.д., ~400 м друг от друга).

Содержание: Проверка за пять минут · Главные результаты · Задача и данные · Обработка и признаки · Обучение · Оценка · Архитектура агента · Эксперименты · Самооценка · Ограничения · Handoff для ИИ-агента жюри · Структура репозитория


1. Проверка за пять минут

Всё воспроизводится офлайн из репозитория: архив погоды и обученная модель закоммичены, ключи API не нужны. Python 3.11+ (проверено на 3.13, macOS, свежий клон).

brew install libomp                                   # только macOS, LightGBM требует OpenMP
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m pytest -q                         # 14 офлайн-тестов честности, ~5 с
.venv/bin/python -m src.backtest --policy rolling     # сдача за февраль 2026, ~1 мин
.venv/bin/python -m src.agent --date 2026-01-31       # один цикл агента с разбором для диспетчера

Ожидаемый результат: outputs/february_2026_rolling_submission_local.csv на 1 344 строки и строка Submission: ... per turbine {'t1': 672, 't2': 672}. Те же команды есть в Makefile (make test, make replay, make agent); AGENTS.md это шпаргалка на один экран.

Дашборд: .venv/bin/python -m streamlit run app.py, затем открыть http://localhost:8501.

Docker

Тот же набор без установки Python: образ содержит код, кэш погоды, обученную модель и данные, сети и ключей не требует.

docker build -t windagent .
docker run --rm windagent                                   # тесты + сдача за февраль 2026
docker run --rm windagent test                              # только 14 тестов честности
docker run --rm windagent replay strict                     # консервативная политика
docker run --rm windagent verify                            # 122-дневный проверочный реплей, обе политики
docker run --rm windagent agent 2026-01-31                  # один цикл агента с разбором
docker run --rm -p 8501:8501 windagent dashboard            # дашборд на http://localhost:8501
docker run --rm -e OPENAI_API_KEY=... windagent agent-llm   # цикл под управлением LLM
docker run --rm -v "$PWD/outputs:/app/outputs" windagent    # так файлы сдачи попадут на хост

Команды описаны в docker/entrypoint.sh; ключи в образ не попадают (.env в .dockerignore).

Дашборд


2. Главные результаты

Точность измерена на 122-дневном реплее вне обучающей выборки (циклы с 1 октября 2025 по 30 января 2026, 11 436 проверенных часов). Мощность нормализована на номинал, поэтому MAE читается как доля установленной мощности: MAE 0.16 означает 16 % от номинала.

Прогноз на местные сутки D+1Упреждение NWPMAERMSER²Выигрыш к персистентности
WindAgent, политика rolling (основная сдача)24 ч0.15860.21340.65153 %
WindAgent, политика strict (консервативная)48 ч0.17600.23700.57047 %
Кривая мощности по ветру NWP, без ML24–72 ч0.19480.25370.50842 %
Персистентность (вчерашние сутки)—0.33420.4204−0.3500 %
Климатология (среднее по часу суток)—0.31850.36170.0005 %

Что ещё измерено на том же реплее (rolling):

  • Интервал P10–P90 накрывает 76.4 % фактов при цели 80 % после конформной калибровки (69.7 % без неё).
  • Ежедневный пересчёт стоит 9.5 % ошибки. Каждый час прогнозируется дважды: сначала как день D+2, потом как день D+1 по более свежим запускам моделей погоды; на 5 694 одинаковых часах MAE падает с 0.1738 до 0.1573.
  • Свежие входы меняют ответ в 234 из 244 циклов по турбинам сильнее порога 0.02 от номинала (среднее изменение 0.065). Это шаг «повторный расчёт при обновлении входных данных» из задания, измеренный, а не заявленный.
  • Обе турбины прогнозируются одинаково точно (MAE 0.1586 у каждой): они стоят в одной ячейке сетки моделей погоды.

Обзор прогноза

Ошибка по упреждению


3. Задача и данные

3.1 Датасет SCADA

Два CSV-файла (по одному на турбину), UTF-8, шаг 10 минут, с 11.03.2023 00:00 по 31.01.2026 23:50. Колонки: номер записи, время, средняя скорость ветра (м/с), нормализованная активная мощность (0–1), средняя температура окружающей среды (°C). Февраля 2026, тестового месяца, в файлах нет: организаторы держат фактическую выработку у себя и сравнивают с ней сданный прогноз.

Турбина 1Турбина 2
Строк142 360149 499
Пропусков на 10-минутной сетке6.6 %1.9 %
Самая длинная дыра18.05–17.07.2024 (простой, ~2 месяца)57 ч в мае 2024
Потолок мощности0.990.97 (зимой 0.98–0.99)

Нет NaN, дублей и битых строк. Кривая мощности по данным чистая: старт при ~2.5–3 м/с, номинал с ~11–12 м/с, отключения по сильному ветру нет вплоть до 23 м/с. Средний ветер 6.45 м/с, 95-й перцентиль 12.8 м/с; температура от −19 до +44 °C. Турбины почти близнецы: корреляция ветра 0.99, мощности 0.96, температуры 1.00. Простои при ветре выше 6 м/с составляют 0.4–0.6 % часов.

Помесячный КИУМ

3.2 Что показали данные

  • Часы SCADA идут по UTC+6 на всём периоде. 1 марта 2024 Казахстан перевёл Алматы с UTC+6 на UTC+5, поэтому напрашивался излом посреди датасета. Кросс-корреляция SCADA с моделями погоды на 10-минутной сетке его не показывает: пик по ветру на 6.00 ч, по температуре на 6.83 ч (лишний лаг это тепловая инерция датчика в гондоле), стабильно у обеих турбин и в обеих эпохах. Все источники погоды идут в UTC, поэтому при склейке вычитается 6 часов.
  • Узкое место погода, а не машина. По собственному анемометру турбины одна кривая мощности даёт MAE 0.027 (R² 0.98). По ветру NWP с упреждением 24 ч та же кривая даёт 0.19. Почти вся оставшаяся ошибка это ошибка прогноза ветра, поэтому усилия ушли во входные данные.
  • Модели погоды завышают зимний ветер: среднее по ансамблю на +1.0 м/с в январе и феврале против +0.2 … +0.4 м/с летом, в основном ночью. Это ровно те месяцы, которые надо прогнозировать, поэтому онлайн-калибровка стала частью цикла.
  • Обледенения и деградации нет: мощность при 6–10 м/с измеренного ветра держится 0.45–0.50 во все месяцы и годы, значит сезонная ошибка это проблема входа, а не турбины.

3.3 Источники погоды

Open-Meteo, бесплатно и без ключей, по координатам турбин. Три независимые глобальные модели берутся по отдельности вместо готовой смеси best_match: ECMWF IFS 0.25°, NOAA GFS и DWD ICON (региональные модели высокого разрешения не покрывают 78° в.д.). Переменные: скорость ветра на 10 и 100 м, направление на обеих высотах, порывы, температура 2 м, давление, влажность.

Архив Historical Forecast API отдаёт несколько «слоёв» каждой переменной:

ПеременнаяЧто этоГодится для честного реплея?
wind_speed_100mоценка самого свежего запуска, упреждение ~0–24 чнет, это почти анализ
wind_speed_100m_previous_day1что модели предсказывали за 24 ч до целевого часада
wind_speed_100m_previous_day2за 48 ч до целевого часада
wind_speed_100m_previous_day3за 72 ч до целевого часада

Факт, проверенный измерением: previous_dayN это фиксированный сдвиг от целевого часа, а не «запуск 00Z дня D». Ошибка ветра внутри previous_day1 не растёт от 0 до 23 часа суток, как росла бы внутри одного запуска. И это настоящие прогнозы, а не переименованный анализ: точность монотонно падает с упреждением (ветер 100 м против анемометра турбины, 2024–2026):

Слой архиваRMSE, м/сКорреляция
анализ (0–24 ч)2.420.790
previous_day1 (24 ч)2.840.691
previous_day2 (48 ч)3.060.642
previous_day3 (72 ч)3.360.565

Самый большой прирост точности в проекте дал именно вход, а не модель:

Источник (упреждение 24 ч, ветер 100 м)RMSE против анемометра, м/сКорреляция
ECMWF IFS 0.25°2.820.726
ICON2.860.695
GFS3.360.670
смесь best_match Open-Meteo (с неё начинали)2.840.691
среднее трёх моделей2.440.772

Смещение NWP по месяцам

Весь архив, нужный обучению и реплеям (2 турбины × 3 модели × 3 упреждения × 5 полугодовых фрагментов = 90 запросов), закоммичен в cache/ (6.5 МБ parquet), поэтому любой реплей идёт без сети. Если кэш удалить, система скачает его заново (бесплатный лимит: 600 запросов в минуту, 5 000 в час, 10 000 в сутки). Live-режим использует обычный эндпоинт текущего прогноза.

3.4 Честность: две политики момента формирования

Кейс требует прогноз погоды, доступный на момент прогнозирования, а не погоду, ставшую известной позже. Поскольку previous_dayN это фиксированный сдвиг, момент формирования вынесен в явный параметр, целевые сутки всегда местные, а в каждой опубликованной строке стоит честное упреждение nwp_lead_hours:

ПолитикаМомент формирования прогноза «на день D»День D+1 читается изДень D+2Смысл
rolling (основная)конец местного дня D (00:00 дня D+1)previous_day1 (24 ч)previous_day2 (48 ч)Каждый час дня D+1 опирается на прогноз погоды, выпущенный ровно за 24 ч до этого часа, то есть на запуски дня D. Ничего, выпущенного после момента формирования, не используется. Стандартный операционный продукт «24 часа вперёд».
strict (консервативная)начало местного дня D (00:00 дня D)previous_day2 (48 ч)previous_day3 (72 ч)Не используется ничего, выпущенного в сам день D. Самое осторожное прочтение фразы «сформирован 31 января».

Правда для реального диспетчера лежит между ними (выпуская прогноз днём 31 января, он имел бы запуск 00Z с упреждением 12–36 ч); такую точность привязки дают только сырые GRIB-архивы отдельных запусков, см. развитие. Цена строгости измерена на том же 122-дневном реплее: MAE дня D+1 0.1586 (rolling) против 0.1760 (strict), +11 %. Обе сдачи лежат в outputs/; основной мы предлагаем rolling.

Та же дисциплина действует везде: состояние турбины по SCADA читается строго до момента формирования, кривая мощности подгоняется только на обучающих строках, онлайн-калибровка видит только прогнозы, целевой час которых уже прошёл, а лаги и скользящие признаки считаются внутри блока одного цикла и никогда не касаются более поздних запусков. Тесты проверяют это для обеих политик и четырёх дат.


4. Обработка данных и признаки

4.1 Обработка SCADA (src/scada.py)

  1. Флаги аномалий на 10-минутных записях: ограничение или простой = ветер ≥ 6 м/с при мощности ≤ 0.02; залипший датчик = скорость ветра не меняется шесть записей подряд.
  2. Часовая агрегация: средние мощности, ветра и температуры; час считается достоверным при ≥ 4 из 6 записей; час помечается аномальным, если аномальна больше половины его записей.
  3. Перевод часов в UTC (−6 ч). Часы с залипшим датчиком не обучают модель никогда; часы с ограничением исключаются из обучения, но остаются в оценке, потому что это реальное операционное состояние.

4.2 Ансамбль погоды (src/dataset.py)

Прогноз каждой модели хранится своими колонками (ecmwf_ifs025__wind_speed_100m, …), плюс консенсус (для направлений круговое среднее) и статистика разброса ветра на 100 м: стандартное отклонение, минимум, максимум и размах по трём моделям.

4.3 Блоки прогноза (src/features.py)

Единица работы это блок одного цикла: 48 часов местных суток D+1 и D+2, каждые сутки вырезаны из того слоя архива, который предписывает политика. Лаги, рампы и скользящие признаки считаются внутри блока, никогда через границу циклов.

4.4 Признаки (61)

  • Физика: плотность влажного воздуха по температуре, давлению и влажности; скорость ветра с поправкой на плотность по IEC 61400-12; показатель сдвига между 10 и 100 м; удельная мощность потока ½ρv³; порывистость как прокси турбулентности; поворот ветра с высотой; sin/cos направления на обеих высотах.
  • Рампы: ветер в соседние часы (±3 ч), скорость изменения за 1 и 3 ч, центрированные скользящие среднее и разброс за 3/6/12 ч, среднее и разброс блока.
  • Ансамбль: ветер каждой модели на 10 и 100 м, разброс/минимум/максимум/размах; кривая мощности площадки, применённая к каждой модели, и разброс этих значений, потому что 2 м/с расхождения значат много у колена кривой и ничего выше номинала.
  • Физический априор: эмпирическая кривая мощности площадки, подогнанная на прогнозном ветре, чтобы впитать смещение NWP, а не предполагать согласие прогноза и анемометра.
  • Состояние турбины: средняя мощность и доступность за 24 ч до момента формирования. Измеренный вес ниже 0.5 % gain; потеря их в феврале (SCADA кончается 31 января) стоит +0.0007 MAE.
  • Календарь: циклические час суток и день года по местному времени.

Важность признаков

Кривая мощности: анемометр против NWP


5. Обучение модели

python -m src.train собирает обучающую таблицу, реплеируя каждую дату выпуска с 1 марта 2024 (начало архива упреждений) в блоки прогноза с приложенной фактической выработкой, и обучает:

ЭлементВыбор
АлгоритмLightGBM, одна общая модель на обе турбины
Точечная цельрегрессия L2; 31 лист, ≥ 150 строк на лист, learning rate 0.02, доля признаков 0.7, бэггинг 0.8, L1 0.5, L2 5.0
Неопределённостьтри квантильных регрессора (P10/P50/P90), те же деревья; квантили сортируются построчно
Обучающие строки25 810 часов только с упреждением 24 ч (см. эксперимент ниже)
Ранняя остановка168 итераций, по строкам отложенной выборки с упреждением 24 ч
Разбиениедаты выпуска до 1 октября 2025 обучение; 1 октября 2025 – 30 января 2026 отложенная выборка (последний цикл, чьи целевые часы дня D+1 измерены)
Априор кривой мощностиподогнан только на обучающих строках

Деревья намеренно маленькие: вход несёт ограниченное количество информации, и более крупные модели запоминали обучающие сезоны. Модель учится только на строках с упреждением 24 ч и применяется на любом упреждении: на отложенной выборке модель, обученная сразу на строках 24/48/72 ч, оказалась хуже на каждом упреждении (24 ч: сырая MAE 0.171 против 0.162; 72 ч: 0.197 против 0.189), потому что более шумный вход на длинных упреждениях учит более размытой связи «ветер → мощность». Поэтому одна модель обслуживает обе политики, а строки 48 и 72 ч реплеятся только для оценки.

Сводка по отложенной выборке (artifacts/validation_summary.json, все три упреждения):

ЭтапMAEСмещениеПокрытие P10–P90
сырая модель0.1757+0.04569.7 %
после онлайн-калибровки0.1717+0.00977.3 %
Упреждение NWPMAERMSER²n
24 ч0.15710.21280.6535 742
48 ч0.17230.23290.5855 694
72 ч0.18600.24860.5285 674

Онлайн-калибровка (src/calibration.py) пересчитывается каждый цикл по уже проверенным прогнозам, только по часам, целевое время которых прошло: адаптивное смещение (средняя знаковая ошибка за последние 14 дней, ограничение ±0.12) и split-conformal коэффициент ширины интервала (последний 21 день), восстанавливающий номинальное покрытие 80 % в единицах собственной полуширины интервала модели.


6. Оценка

6.1 Протокол

python -m src.backtest --start 2025-10-01 --end 2026-01-30 --label verified --policy <rolling|strict> реплеирует 122 ежедневных цикла ровно так же, как реплеируется февраль, с 30-дневным прогревом, чтобы калибратор стартовал с историей. Каждый цикл видит только то, что существовало в его момент формирования. Метрики: MAE, RMSE, смещение, R² по нормализованной мощности; покрытие интервала; ценность ежедневного пересчёта (одни и те же часы, спрогнозированные как D+2 и затем как D+1); как часто свежие входы существенно сдвинули дневной прогноз (порог 0.02 от номинала). Базовые прогнозы считаются на тех же часах.

6.2 Результаты

Метрика (122-дневный реплей)rollingstrict
День D+1: MAE / RMSE / R²0.1586 / 0.2134 / 0.6510.1760 / 0.2370 / 0.570
День D+1: смещение+0.023+0.025
Все часы (D+1 и D+2): MAE0.16620.1816
MAE по упреждению NWP24 ч 0.1586, 48 ч 0.173848 ч 0.1760, 72 ч 0.1872
По турбинам, MAE дня D+10.1586 / 0.15860.1761 / 0.1759
Покрытие P10–P90 (цель 80 %)76.4 %74.8 %
Выигрыш ежедневного пересчёта (те же часы)0.1738 → 0.1573, 9.5 %0.1872 → 0.1741, 7.0 %
Циклов, где входы существенно сдвинули прогноз234 из 244, среднее 0.065236 из 244, среднее 0.077

Базовые прогнозы на той же отложенной выборке: кривая мощности по ветру NWP 0.1948, климатология 0.3185, персистентность 0.3342 (MAE). Отчёты: outputs/verified_<policy>_report.json, почасовая детализация в outputs/verified_<policy>_hourly_*.csv.

6.3 Сдача за февраль 2026

outputs/february_2026_rolling_submission_local.csv (основной) и outputs/february_2026_strict_submission_local.csv, по 1 344 строки: 2 турбины × 28 дней × 24 часа, местное время площадки (UTC+6, как в датасете), без пропусков.

КолонкаСмысл
turbinet1 / t2
time_local, time_utcцелевой час по местному времени (UTC+6) и по UTC
policyrolling или strict
issue_dateдень D цикла: прогноз «на 31 января» имеет issue_date = 2026-01-31
issue_time_localобъявленный момент формирования (rolling: 00:00 дня D+1; strict: 00:00 дня D)
lead_hoursгоризонт: часов от момента формирования до целевого часа
nwp_lead_hoursчестное упреждение: за сколько часов до целевого часа выпущен лежащий в основе прогноз погоды (24 у rolling, 48 у strict)
forecastожидаемая нормализованная мощность, 0–1
p10, p50, p90калиброванный интервал неопределённости

Полный вывод каждого цикла, включая день D+2, лежит в outputs/february_2026_<policy>_hourly_all_leads.csv; ежедневные разборы агента с измеренными ревизиями в outputs/february_2026_<policy>_daily_briefings.json (в феврале свежие запуски существенно сдвигали дневной прогноз в 54 из 56 циклов по турбинам, в среднем на 0.088). Сумма по ВЭС это сумма двух колонок турбин; перевод в МВт·ч требует номинальной мощности, которой в датасете нет.

6.4 Оговорки

Февраль 2026 здесь проверить нельзя (датасет кончается 31 января); все цифры точности взяты со 122 дней непосредственно перед ним. Февраль зимний месяц, когда смещение ветра у моделей максимально, а онлайн-калибровка затухает по ходу месяца, потому что новый факт не поступает, так что февральская ошибка, скорее всего, будет выше 0.16 (та же схема на феврале 2025 давала 0.21–0.24). Подача факта по мере появления восстанавливает калибровку без изменения кода.


7. Агентная архитектура

                     ┌──────────────────── цикл агента, раз в сутки ─────────────────────┐
                     │                                                                     │
  Open-Meteo         │  1. получить погоду     ECMWF + GFS + ICON на упреждении политики    │
  архив / live ──────┼─▶ 2. подготовить данные  блок на местные сутки D+1, D+2; 61 признак   │
                     │  3. запустить модель    LightGBM: точечный прогноз + P10/P50/P90       │
  история SCADA ─────┼─▶ 4. откалибровать      смещение и интервал по своим проверенным ошибкам│
                     │  5. проанализировать    энергия, рампы, разброс моделей, уверенность  │
                     │  6. опубликовать        почасовой CSV + JSON-разбор                    │
                     │  7. проверить входы ────┐ новые запуски изменили ответ? ─▶ ревизия    │
                     └─────────────────────────┴─────────────────────────────────────────────┘

Шаги 1–6 это обычные методы src/pipeline.py. Шаг 7 сравнивает дневной прогноз с тем, что предыдущий цикл сказал о тех же часах (для него это был день D+2), и записывает величину и направление ревизии; в live-режиме прогноз погоды запрашивается заново, и при сдвиге цикл пересчитывается. Запись каждого цикла замыкает петлю: когда эти часы измерены, калибровка следующего цикла видит свою ошибку.

Два способа запустить агента (src/agent.py):

  • Автономный (по умолчанию): детерминированная политика проходит цикл целиком. Без ключей, воспроизводимо байт-в-байт; так работают реплеи и так получены все цифры выше.
  • Рассуждающий (--reason): те же шаги отданы LLM как пять инструментов: inspect_weather, run_forecast_cycle, recent_performance, check_input_updates, publish_forecast. LLM решает, что посмотреть, оценивает, требует ли разброс моделей осторожности, сверяется с точностью за последние 14 проверенных дней, фиксирует, насколько новые запуски пересмотрели вчерашний прогноз, и пишет разбор для диспетчера. Слой провайдера (src/llm.py) общий: OpenAI function calling (по умолчанию gpt-5-mini) или tool runner Anthropic (claude-opus-5), выбор по ключу в .env или флагом --llm. Один цикл это 3–8 вызовов инструментов и 6–15 тысяч токенов, около половины цента на gpt-5-mini; реплей месяца останавливается сам при превышении --budget-usd.

В обоих режимах действует одно правило: языковая модель не выдумывает ни одного числа. Каждая цифра, которую она сообщает, пришла из инструмента, запустившего реальную модель. Весь февраль 2026 прогнан в рассуждающем режиме; 28 транскриптов (вызовы инструментов с аргументами и результатами, расход токенов, разбор) лежат в outputs/agent_transcripts/, общий расход $0.135. python -m src.audit_transcripts проверяет каждый транскрипт: ни одного отказа инструмента, обе цифры энергии в разборе взяты из ответа инструмента, единицы не перепутаны, числа цикла совпадают с детерминированным реплеем той же даты. Результат: 28 из 28.

Тесты (python -m pytest -q, 14 офлайн-тестов, ~3 с): ни один час не использует прогноз погоды, выпущенный позже момента формирования (обе политики, четыре даты); блоки это ровно местные сутки; состояние турбины и калибровка читают только прошлое; ошибка растёт с упреждением 24 → 48 → 72 ч; трёхдневный реплей даёт полный файл сдачи с упорядоченными квантилями и измеренной ревизией в каждом цикле.

Дашборд (app.py, Streamlit): выбираешь дату цикла и политику, «Рассчитать прогноз» запускает детерминированный цикл за секунду (график на 48 часов с полосой P10–P90, карточки, ревизия относительно вчера, разбор), «Спросить агента» прогоняет тот же цикл через LLM и показывает ход рассуждений и стоимость; вкладки «Февраль 2026» и «Точность» читают уже посчитанные файлы и работают без сети.


8. Эксперименты

Что пробовали, измеряли и оставили или отвергли. Числа это MAE в долях номинала.

ЭкспериментРезультатРешение
Три отдельные модели NWP против смеси best_match Open-MeteoRMSE ветра 2.44 против 2.84 м/с; MAE мощности улучшилась соответственнооставить ансамбль, расхождение как признаки
Обучение только на строках 24 ч против 24/48/72 ч вместе24 ч: 0.162 против 0.171 сырой; 72 ч: 0.189 против 0.197обучение на одном упреждении
Общая модель против модели на каждую турбину0.1709 против 0.1771 / 0.1722; признак турбины получил нулевой gainобщая
Явная сезонная дебиас-коррекция ветра как признакипомогла голой кривой мощности (0.186 → 0.176), но ухудшила ML-модель (0.178 → 0.186)отвергнута; вместо неё скользящая калибровка смещения
Онлайн-калибровка смещения (окно 14 дней)0.1757 → 0.1717 на отложенной выборке, смещение +0.045 → +0.009; февраль 2025 0.231 → 0.218 на модели кривой мощностиоставить
Конформное масштабирование интервалапокрытие 69.7 % → 77.3 %оставить
Признаки состояния турбины (мощность и доступность за 24 ч)0.5 % gain; без них +0.0007оставить, вес задокументирован как малый
Политика strict против rolling+11 % MAE при упреждении 48 ч вместо 24 чсдаются обе, rolling основная
Первый прогон рассуждающего режима31 отказ инструментов (порядок вызовов), 14 циклов расходились с детерминированными числами (короче прогрев), 3 разбора цитировали не то поле энергииинструменты сделаны самодостаточными, поля переименованы, прогрев выровнен; повторный прогон проходит сверку 28 из 28
Бенчмарк алгоритмов (src/benchmark.py, reports/model_comparison.json): LightGBM с L2 против L1 против CatBoost, среднее по фолдам0.1717 / 0.1636 / 0.1695цель L1 это первый кандидат на следующую итерацию
Исследование нейросетей (src/deep.py, reports/deep_comparison.json): RNN, LSTM, BiLSTM, малые MLP против LightGBM на одной оценкесети 0.150–0.159, LightGBM L1 0.146, LightGBM L2 0.164остаются деревья; сети не окупаются при таком объёме данных
Независимый проверочный конвейер (power_forecasting/): LightGBM на 15 признаках, walk-forward по четырём последним месяцам с as-of чекпоинтами, 42 своих тестав целом 0.151, D1 0.142, D2 0.159 (своя валидация, напрямую не сравнима)оставлен как независимое подтверждение уровня ошибки; агентного цикла в нём нет

Экспериментальные модули требуют pip install -r requirements-experiments.txt (PyTorch) и не входят в конвейер.


9. Самооценка по критериям кейса

КритерийПодтверждение в репозиторииНаша оценка
Соответствие задаче и работоспособность основного сценария (25)28 последовательных ежедневных циклов с 31 января по 27 февраля, каждый только по архивной погоде, доступной на объявленный момент формирования; почасовой прогноз на D+1 и D+2 по турбинам с неопределённостью; live-режим на текущем прогнозе; одна команда воспроизводит сдачу за минутуВыполнено полностью. Основной сценарий брифа работает от начала до конца, офлайн и детерминированно.
Техническая реализация, архитектура, использование agentic AI (25)Слои weather → dataset/features → model → calibration → pipeline → agent; момент as-of как явный, покрытый тестами параметр; ансамбль трёх моделей; измеряемый шаг обновления входов; LLM управляет реальными инструментами, транскрипты сохранены, автосверка доказывает, что она не изменила ни одного числаВыполнено полностью. Реализация совпадает с заявленной логикой, а части, которые проще всего сымитировать (честность реплея, шаг пересчёта), измерены, а не заявлены.
README и воспроизводимость (25)Этот документ на двух языках; кэш погоды и обученная модель в репозитории; свежий клон воспроизводит сдачу байт-в-байт; 14 тестов; AGENTS.md и Makefile; каждая заглавная цифра прослеживается до файлаВыполнено полностью. Проверяющий подтверждает каждое утверждение без сети и ключей.
Ценность и применимость (15)Вдвое меньше ошибка, чем у наивных прогнозов; калиброванные интервалы P10–P90 для решений о резерве; разборы для диспетчера с уверенностью и ревизиями; честная разметка упреждения, которой может доверять диспетчерскаяВыполнено на высоком уровне для площадки из двух турбин; масштабирование на парк описано в развитии.
Потенциал развития и оригинальность (10)Две политики честности с измеренной ценой; калибровка по собственным проверенным ошибкам; конформные интервалы; находка, что обучение на одном упреждении обобщается лучше; описанный путь к точным запускам NWP и ансамблевым членам; независимый проверочный конвейер, сошедшийся с основным на одном уровне ошибкиВыполнено. Подход оригинален там, где это важно (честность и самопроверка), и имеет ясный путь роста.

10. Ограничения и развитие

Ограничения, которые мы называем открыто: февраль 2026 здесь не верифицируется, а зимнее смещение делает заявленную точность оптимистичной для него; онлайн-калибровка затухает в феврале без нового факта; архив упреждений начинается в марте 2024, поэтому с согласованным упреждением обучаются только ~2 года; покрытие интервала 76 % при цели 80 %; ограничения мощности (~0.7 % часов) по погоде не предсказываются; разброс ансамбля предсказывает ошибку слабо (корреляция 0.14 с модулем ошибки ветра); сдвиг часов SCADA по двум методам UTC+6, по методу независимого конвейера UTC+5, разница корреляций 0.007, вопрос остаётся открытым.

Развитие, в порядке ожидаемой ценности:

  1. Точные запуски NWP из сырых GRIB-архивов (NOAA GFS s3://noaa-gfs-bdp-pds, ECMWF Open Data s3://ecmwf-forecasts): запуск 00Z дня D с упреждением 12–36 ч, строго честно и свежее strict.
  2. Цель L1 и признаки качества провайдеров по скользящему окну из бенчмарков и независимого конвейера; оба показали меньшую MAE на своих валидациях.
  3. Члены ансамбля, а не только средние: Ensemble API Open-Meteo даёт 30–50 возмущённых членов на модель; погода это связывающее ограничение.
  4. Вероятностная диспетчеризация: интервал P10–P90 вместе с ценами небаланса превращается в рекомендацию по резерву; переобучение по расписанию с триггером от журнала верификации, обнаружение дрейфа в котором уже есть.

11. Handoff для ИИ-агента жюри

Этот раздел написан для автоматического проверяющего. Всё ниже выполняется без сети и без ключей API.

Окружение. Python 3.11+ (проверено 3.13) или Docker (docker build -t windagent ., см. начало документа). На macOS нужен brew install libomp для LightGBM. Установка: python3 -m venv .venv && .venv/bin/pip install -r requirements.txt (pandas, numpy, scikit-learn, lightgbm, pyarrow, requests, matplotlib, pytest, streamlit, plotly; SDK LLM опциональны и нужны только для --reason).

Команды и что они дают.

КомандаВремяРезультат / проверка
.venv/bin/python -m pytest -q~3 с14 passed: тесты честности из раздела 7
.venv/bin/python -m src.backtest --policy rolling~1 минoutputs/february_2026_rolling_submission_local.csv, 1 344 строки; печатает Submission: ... per turbine {'t1': 672, 't2': 672}
.venv/bin/python -m src.backtest --policy strict~1 минконсервативная сдача
.venv/bin/python -m src.backtest --start 2025-10-01 --end 2026-01-30 --label verified --policy rolling~1 минoutputs/verified_rolling_report.json с метриками раздела 2 (MAE дня D+1 0.1586)
.venv/bin/python -m src.agent --date 2026-01-31~6 содин детерминированный цикл с напечатанным разбором; файлы в outputs/cycles/
.venv/bin/python -m src.audit_transcripts~1 с28 transcripts, 0 with failures по outputs/agent_transcripts/
.venv/bin/python -m src.train~3 минпереобучение модели из закоммиченного кэша; artifacts/validation_summary.json воспроизводит раздел 5
.venv/bin/python -m src.report~10 сперерисовывает все картинки в reports/
.venv/bin/python -m streamlit run app.py—дашборд на http://localhost:8501 (?autorun=1 запускает цикл по умолчанию при загрузке)
.venv/bin/python -m src.agent --date 2026-01-31 --reason~40 сцикл под управлением LLM; нужен OPENAI_API_KEY или ANTHROPIC_API_KEY в .env

Где живёт каждое утверждение. Заглавные метрики: outputs/verified_rolling_report.json и outputs/verified_strict_report.json. Сводка обучения и базовые прогнозы: artifacts/validation_summary.json. Файлы сдачи: outputs/february_2026_*_submission_local.csv. Разборы по циклам с ревизиями: outputs/*_daily_briefings.json. Транскрипты LLM и стоимость реплея: outputs/agent_transcripts/. Архив погоды: cache/ (90 parquet-фрагментов). Обученная модель: artifacts/pooled_model.joblib. Бенчмарки моделей: reports/model_comparison.json, reports/deep_comparison.json; независимый проверочный конвейер: power_forecasting/ со своим README.

Порядок чтения кода. src/config.py (координаты, источники, две политики) → src/features.py (issue_moment_utc, build_block) → src/pipeline.py (семь шагов, revision_vs_previous) → src/agent.py (инструменты, автономная политика, рассуждающий режим) → src/backtest.py (реплей и запись сдачи) → tests/test_honesty.py.

Детерминизм. Seed модели и число потоков LightGBM зафиксированы; свежий клон на другой машине дал байт-в-байт те же файлы сдачи. При наличии cache/ реплеи не делают сетевых запросов.

Что не входит в задачу. Фактов за февраль 2026 в репозитории нет, поэтому февральская точность здесь не считается; power_forecasting/predictions/final_forecast.csv это оценка независимого конвейера, а не файл сдачи.


12. Структура репозитория

src/
  config.py            координаты, источники погоды, политики as-of, окна времени
  scada.py             загрузка SCADA, флаги аномалий, часовая агрегация, кривые мощности
  weather.py           клиент Open-Meteo: архив по упреждению и live, с дисковым кэшем
  dataset.py           сборка ансамбля; реплей истории в обучающие строки (упреждения 24/48/72 ч)
  features.py          блоки прогноза по местным суткам и 61 признак
  model.py             LightGBM: точечная модель + квантили
  calibration.py       онлайн-коррекция смещения и конформное масштабирование интервала
  pipeline.py          детерминированный цикл прогноза и проверка обновления входов
  agent.py             инструменты агента, автономная политика, LLM-режим, реплей с бюджетом
  llm.py               слой провайдера: OpenAI и Anthropic, учёт токенов и стоимости
  backtest.py          последовательный ежедневный реплей, оценка, файлы сдачи
  metrics.py           метрики и базовые прогнозы, которые нужно превзойти
  train.py             обучение
  audit_transcripts.py сверка транскриптов LLM-режима с выводом инструментов и реплеем
  report.py            картинки для этого README
  benchmark.py, deep.py   бенчмарки алгоритмов и исследование нейросетей (опционально, requirements-experiments.txt)
tests/                 офлайн-тесты честности (pytest)
power_forecasting/     независимый проверочный конвейер, свой README и тесты
dataset/               два CSV-файла SCADA
cache/                 фрагменты архива Open-Meteo (parquet): реплеи работают без сети
artifacts/             обученная модель и сводка валидации
outputs/               сдачи, отчёты, ежедневные разборы; agent_transcripts/ (LLM-режим)
reports/               картинки и результаты бенчмарков
app.py                 дашборд Streamlit
Dockerfile, docker/    образ с кэшем и моделью; entrypoint с командами check/test/replay/verify/agent/dashboard
AGENTS.md, Makefile    шпаргалка и те же команды как цели make
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
20
Авторы
4
Файлы
307
Ветки
2

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

Baglan 14Makaroshka-1 3shurik 2Makaroshka-1 1

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

  • 2026-09-23 17:51docker: image with cache and model, entrypoint commands, build instructions at the top of both READMEsBaglan
  • 2026-09-23 17:46readme: russian version primary, english as README.en.mdBaglan
  • 2026-09-23 17:46fixBaglan
  • 2026-09-23 17:37README in English and Russian: data, processing, features, training, evaluation, experiments, self-assessment, jury handoff; new figures and dashboard screenshotBaglan
  • 2026-09-23 17:16Package trained models and offline jury evaluation with reproducible replayshurik
  • 2026-09-23 17:14accept1: the build to hand in (without per-cycle scratch outputs and internal notes)Baglan
  • 2026-09-23 17:11Bring in the third participant's isolated power_forecasting pipeline as an independent studyBaglan
  • 2026-09-23 17:10Merge remote-tracking branch 'origin/feature/power-forecasting' into feature/asof-policy-and-fixesBaglan
Все коммиты (20)
  • 2026-09-23 17:03Merge main (partner's model experiments) into the feature branchBaglan
  • 2026-09-23 17:00Streamlit dashboard: deterministic cycle, LLM agent on a button, February and accuracy tabsBaglan
  • 2026-09-23 16:57Add isolated compact power forecasting pipeline and validation reportsshurik
  • 2026-09-23 16:51Regenerated February LLM transcripts (28/28 pass the audit) + audit scriptBaglan
  • 2026-09-23 16:41Unambiguous energy fields, 30-day warm-up for the LLM replayBaglan
  • 2026-09-23 16:38February 2026 in reasoning mode: 28 LLM transcripts, per-cycle outputs in outputs/cyclesBaglan
  • 2026-09-23 16:27LLM layer for both providers, honesty tests, single README for reviewersBaglan
  • 2026-09-23 16:02deep nn testMakaroshka-1
  • 2026-09-23 15:56more models experimentsMakaroshka-1
  • 2026-09-23 15:47Honest as-of policy, real input-update step, offline replay, Russian READMEBaglan
  • 2026-09-23 14:55implementation of baseline modelsarsenbay.m
  • 2026-09-23 14:53real initial baseline implementationsarsenbay.m
Структура репозитория (307 файлов)
.dockerignore
.gitignore
AGENTS.md
Dockerfile
Makefile
README.en.md
README.md
app.py
artifacts/pooled_model.joblib
artifacts/pooled_model.json
artifacts/validation_summary.json
cache/om_07d9788a3da42737fd63.parquet
cache/om_130d2dd983446dd456e0.parquet
cache/om_135044c5f49f7fba430d.parquet
cache/om_162e01a7d6d3f15c1d45.parquet
cache/om_17d31b877f74a64a0a8f.parquet
cache/om_19dcbabf0ad9da235473.parquet
cache/om_19dfc2d0c324a5509673.parquet
cache/om_1a30b693cff7ce095639.parquet
cache/om_1d5ca1ef13afc16556f5.parquet
cache/om_1d8305db886ec2253801.parquet
cache/om_20ca0463dc49336acde2.parquet
cache/om_2a579783763d1e629376.parquet
cache/om_2c20e9a5624480544713.parquet
cache/om_308545274cf16b85a8d0.parquet
cache/om_3355d208d6a0d95c0ce7.parquet
cache/om_3ba73a7ade7427e86117.parquet
cache/om_3d7000b49ebf256b1185.parquet
cache/om_3d7419c0fc50666c34a8.parquet
cache/om_3ea8e1f0e5801a57cf1d.parquet
cache/om_3fa2e829e53487d63db9.parquet
cache/om_3fd09ab3e187f6e00650.parquet
cache/om_406e19b46a3b49fe1c82.parquet
cache/om_42d565c4bd02dbfa19e8.parquet
cache/om_42dc3d39972c483ec123.parquet
cache/om_46692d4c2d50cf94ebb0.parquet
cache/om_470dd6ca7e4135342157.parquet
cache/om_4cb9af7475a87b5f1214.parquet
cache/om_4ea08554c97ee9dbfd6e.parquet
cache/om_520e02bd081453d6e4b1.parquet
cache/om_536a606175fb0e07194a.parquet
cache/om_572e524ee3f55c084a0b.parquet
cache/om_5cab1a658cc23f8ea623.parquet
cache/om_5db01e0e75474cd27aef.parquet
cache/om_601d2afdc851f70e9004.parquet
cache/om_67d195f99875ece7f3e8.parquet
cache/om_68a55b6e0a518e23f77c.parquet
cache/om_6b92247e6c9960594e51.parquet
cache/om_6d01b5e328e91db9644a.parquet
cache/om_70a9e35d71d2c3c04435.parquet
cache/om_758c930352ab6c4bbb0b.parquet
cache/om_75b86e0462427bdcb39f.parquet
cache/om_77f347c40e96c9a36e38.parquet
cache/om_7a14fd079eaca6423e1c.parquet
cache/om_7a4e5c817edac0b7978a.parquet
cache/om_7fa3edb83e04ee888dcd.parquet
cache/om_80a9b8a41b2e3249b3ea.parquet
cache/om_874c62ce8306a95e44c6.parquet
cache/om_877cbafb595436211344.parquet
cache/om_884bf219f9a7602bf854.parquet
cache/om_8c80cea1909637bdd8da.parquet
cache/om_8ddc8558d390b007dfda.parquet
cache/om_96c132b6e63404f53693.parquet
cache/om_9a404f7f5c27e49e309e.parquet
cache/om_9db5af2872ba9cdf2330.parquet
cache/om_9dc94d53bdd6d925dbe3.parquet
cache/om_a0d068907823b08d96bf.parquet
cache/om_a25a1a22dbc30feae278.parquet
cache/om_a2f6988c314576e57dd7.parquet
cache/om_a405076b25548e286aa4.parquet
cache/om_a6b99f0db4bdba9e528b.parquet
cache/om_a97487db46d5fca6bcbe.parquet
cache/om_a9999603bef540ebacd7.parquet
cache/om_ad50fad308ea15531681.parquet
cache/om_aef3bd211087ad51b3db.parquet
cache/om_b3c6012b23b4b2991658.parquet
cache/om_b92f6b3de4a88eb1d78a.parquet
cache/om_baf6350eba9fa55de25c.parquet
cache/om_be46f47005af78bc3f58.parquet
cache/om_bf7af3e778c0be3baf59.parquet
cache/om_c01c7256f9f3b5a70d29.parquet
cache/om_c4bae66bf33a336822d9.parquet
cache/om_d046df012549b4f78953.parquet
cache/om_d52e7f101b49cc60aaf1.parquet
cache/om_db514e3492ef6cd74bf1.parquet
cache/om_e4100797e70eb8e460ab.parquet
cache/om_e49352d549adb6937252.parquet
cache/om_e786ae111c6e298ead92.parquet
cache/om_e7efb8b17406770a4d1a.parquet
cache/om_e960c46165b032ae6715.parquet
cache/om_e9a81f34a962a0a9abb9.parquet
cache/om_ed850505326ea81d6e75.parquet
cache/om_f3717b944d6e45b722db.parquet
cache/om_f4fd5e0946d49b6152c4.parquet
cache/om_f7d74b850e18ad19d5eb.parquet
cache/om_f80eb33e43045744e081.parquet
cache/om_f9c70b8cb4188ebeef1c.parquet
cache/om_fa51b958d43f4d1e3864.parquet
cache/om_fbbd9a7cf04843a86df5.parquet
cache/om_fd1b54416e1a2121d026.parquet
cache/om_fe2401030b786c04fd62.parquet
dataset/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv
dataset/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv
docker/entrypoint.sh
outputs/.gitkeep
outputs/agent_transcripts/briefing_20260131_rolling.md
outputs/agent_transcripts/briefing_20260201_rolling.md
outputs/agent_transcripts/briefing_20260202_rolling.md
outputs/agent_transcripts/briefing_20260203_rolling.md
outputs/agent_transcripts/briefing_20260204_rolling.md
outputs/agent_transcripts/briefing_20260205_rolling.md
outputs/agent_transcripts/briefing_20260206_rolling.md
outputs/agent_transcripts/briefing_20260207_rolling.md
outputs/agent_transcripts/briefing_20260208_rolling.md
outputs/agent_transcripts/briefing_20260209_rolling.md
outputs/agent_transcripts/briefing_20260210_rolling.md
outputs/agent_transcripts/briefing_20260211_rolling.md
outputs/agent_transcripts/briefing_20260212_rolling.md
outputs/agent_transcripts/briefing_20260213_rolling.md
outputs/agent_transcripts/briefing_20260214_rolling.md
outputs/agent_transcripts/briefing_20260215_rolling.md
outputs/agent_transcripts/briefing_20260216_rolling.md
outputs/agent_transcripts/briefing_20260217_rolling.md
outputs/agent_transcripts/briefing_20260218_rolling.md
outputs/agent_transcripts/briefing_20260219_rolling.md
outputs/agent_transcripts/briefing_20260220_rolling.md
outputs/agent_transcripts/briefing_20260221_rolling.md
outputs/agent_transcripts/briefing_20260222_rolling.md
outputs/agent_transcripts/briefing_20260223_rolling.md
outputs/agent_transcripts/briefing_20260224_rolling.md
outputs/agent_transcripts/briefing_20260225_rolling.md
outputs/agent_transcripts/briefing_20260226_rolling.md
outputs/agent_transcripts/briefing_20260227_rolling.md
outputs/agent_transcripts/llm_replay_rolling_summary.json
outputs/agent_transcripts/transcript_20260131_rolling.json
outputs/agent_transcripts/transcript_20260201_rolling.json
outputs/agent_transcripts/transcript_20260202_rolling.json
outputs/agent_transcripts/transcript_20260203_rolling.json
outputs/agent_transcripts/transcript_20260204_rolling.json
outputs/agent_transcripts/transcript_20260205_rolling.json
outputs/agent_transcripts/transcript_20260206_rolling.json
outputs/agent_transcripts/transcript_20260207_rolling.json
outputs/agent_transcripts/transcript_20260208_rolling.json
outputs/agent_transcripts/transcript_20260209_rolling.json
outputs/agent_transcripts/transcript_20260210_rolling.json
outputs/agent_transcripts/transcript_20260211_rolling.json
outputs/agent_transcripts/transcript_20260212_rolling.json
outputs/agent_transcripts/transcript_20260213_rolling.json
outputs/agent_transcripts/transcript_20260214_rolling.json
outputs/agent_transcripts/transcript_20260215_rolling.json
outputs/agent_transcripts/transcript_20260216_rolling.json
outputs/agent_transcripts/transcript_20260217_rolling.json
outputs/agent_transcripts/transcript_20260218_rolling.json
outputs/agent_transcripts/transcript_20260219_rolling.json
outputs/agent_transcripts/transcript_20260220_rolling.json
outputs/agent_transcripts/transcript_20260221_rolling.json
outputs/agent_transcripts/transcript_20260222_rolling.json
outputs/agent_transcripts/transcript_20260223_rolling.json
outputs/agent_transcripts/transcript_20260224_rolling.json
outputs/agent_transcripts/transcript_20260225_rolling.json
outputs/agent_transcripts/transcript_20260226_rolling.json
outputs/agent_transcripts/transcript_20260227_rolling.json
outputs/february_2026_rolling_daily_briefings.json
outputs/february_2026_rolling_hourly_all_leads.csv
outputs/february_2026_rolling_hourly_day_ahead.csv
outputs/february_2026_rolling_report.json
outputs/february_2026_rolling_submission_local.csv
outputs/february_2026_strict_daily_briefings.json
outputs/february_2026_strict_hourly_all_leads.csv
outputs/february_2026_strict_hourly_day_ahead.csv
outputs/february_2026_strict_report.json
outputs/february_2026_strict_submission_local.csv
outputs/verified_rolling_daily_briefings.json
outputs/verified_rolling_hourly_all_leads.csv
outputs/verified_rolling_hourly_day_ahead.csv
outputs/verified_rolling_report.json
outputs/verified_strict_daily_briefings.json
outputs/verified_strict_hourly_all_leads.csv
outputs/verified_strict_hourly_day_ahead.csv
outputs/verified_strict_report.json
power_forecasting/.gitignore
power_forecasting/INTEGRATION.md
power_forecasting/README.md
power_forecasting/config.yaml
power_forecasting/data/final/feature_columns.json
power_forecasting/data/final/run_config.json
power_forecasting/ml_config.json
power_forecasting/models/environment.json
power_forecasting/models/feature_groups.json
power_forecasting/models/final_features.json
power_forecasting/models/model_registry.json
power_forecasting/predict.py
power_forecasting/predictions/final_forecast.csv
power_forecasting/predictions/final_forecast.parquet
power_forecasting/reports/ablation_study.csv
power_forecasting/reports/ablation_study.md
power_forecasting/reports/archive_decision.md
power_forecasting/reports/dataset_report.md
power_forecasting/reports/dataset_row_counts.csv
power_forecasting/reports/dataset_summary.json
power_forecasting/reports/download_status.json
power_forecasting/reports/ecmwf_hres_probe.csv
power_forecasting/reports/ensemble_weight_distribution.csv
power_forecasting/reports/error_analysis.csv
power_forecasting/reports/error_analysis.md
power_forecasting/reports/feature_count_experiment.csv
power_forecasting/reports/feature_importance.csv
power_forecasting/reports/feature_importance.png
power_forecasting/reports/feature_importance_by_model.csv
power_forecasting/reports/feature_missingness.csv
power_forecasting/reports/feature_safety_report.md
power_forecasting/reports/feature_selection_methodology.md
power_forecasting/reports/feature_selection_training_only.csv
power_forecasting/reports/final_feature_selection.md
power_forecasting/reports/final_ml_report.md
power_forecasting/reports/final_removed_features.csv
power_forecasting/reports/final_selected_features.csv
power_forecasting/reports/input_data_profile.json
power_forecasting/reports/input_data_report.md
power_forecasting/reports/ml_data_audit.md
power_forecasting/reports/ml_data_schema.csv
power_forecasting/reports/ml_excluded_features.csv
power_forecasting/reports/ml_reproducibility.md
power_forecasting/reports/ml_summary.json
power_forecasting/reports/ml_training_status.json
power_forecasting/reports/model_fold_metrics.csv
power_forecasting/reports/model_leaderboard.csv
power_forecasting/reports/model_leaderboard.md
power_forecasting/reports/model_segment_metrics.csv
power_forecasting/reports/multi_weather_value.csv
power_forecasting/reports/output_manifest.json
power_forecasting/reports/point_in_time_validation.md
power_forecasting/reports/power_model_ratios.csv
power_forecasting/reports/prediction_validation.json
power_forecasting/reports/reproducibility.md
power_forecasting/reports/shap_importance.csv
power_forecasting/reports/tests_report.json
power_forecasting/reports/timezone_decision.json
power_forecasting/reports/timezone_decision.md
power_forecasting/reports/timezone_inference.csv
power_forecasting/reports/timezone_ranking.csv
power_forecasting/reports/validation_folds.csv
power_forecasting/reports/weather_coverage_report.csv
power_forecasting/reports/weather_preflight_report.csv
power_forecasting/reports/weather_provider_metrics.csv
power_forecasting/reports/weather_request_manifest.csv
power_forecasting/requirements-ml.txt
power_forecasting/requirements.txt
power_forecasting/src/__init__.py
power_forecasting/src/dataset_builder.py
power_forecasting/src/download_weather.py
power_forecasting/src/feature_engineering.py
power_forecasting/src/input_data.py
power_forecasting/src/ml_data.py
power_forecasting/src/ml_experiments.py
power_forecasting/src/ml_final.py
power_forecasting/src/ml_models.py
power_forecasting/src/ml_reporting.py
power_forecasting/src/ml_selection.py
power_forecasting/src/ml_training.py
power_forecasting/src/reporting.py
power_forecasting/src/run_tests.py
power_forecasting/src/scada.py
power_forecasting/src/timeline.py
power_forecasting/src/timezone_inference.py
power_forecasting/src/validation.py
power_forecasting/src/weather_cache.py
power_forecasting/src/weather_client.py
power_forecasting/src/weather_ensemble.py
power_forecasting/src/weather_evaluation.py
power_forecasting/src/weather_quality.py
power_forecasting/tests/test_leakage.py
power_forecasting/tests/test_ml.py
power_forecasting/tests/test_preflight.py
power_forecasting/train.py
pytest.ini
reports/dashboard.png
reports/deep_comparison.json
reports/error_vs_lead.png
reports/feature_importance.png
reports/forecast_overview.png
reports/model_comparison.json
reports/monthly_profile.png
reports/nwp_bias_by_month.png
reports/power_curve.png
requirements-experiments.txt
requirements.txt
src/__init__.py
src/agent.py
src/audit_transcripts.py
src/backtest.py
src/benchmark.py
src/calibration.py
src/config.py
src/dataset.py
src/deep.py
src/features.py
src/llm.py
src/metrics.py
src/model.py
src/pipeline.py
src/report.py
src/scada.py
src/train.py
src/weather.py
task.md
tests/test_honesty.py
Ветки (2)

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

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

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