О проекте
Команда: 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.mdWindAgent: агентный прогноз почасовой выработки ВЭС на 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 | Упреждение NWP | MAE | RMSE | R² | Выигрыш к персистентности |
|---|---|---|---|---|---|
WindAgent, политика rolling (основная сдача) | 24 ч | 0.1586 | 0.2134 | 0.651 | 53 % |
WindAgent, политика strict (консервативная) | 48 ч | 0.1760 | 0.2370 | 0.570 | 47 % |
| Кривая мощности по ветру NWP, без ML | 24–72 ч | 0.1948 | 0.2537 | 0.508 | 42 % |
| Персистентность (вчерашние сутки) | — | 0.3342 | 0.4204 | −0.350 | 0 % |
| Климатология (среднее по часу суток) | — | 0.3185 | 0.3617 | 0.000 | 5 % |
Что ещё измерено на том же реплее (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 360 | 149 499 |
| Пропусков на 10-минутной сетке | 6.6 % | 1.9 % |
| Самая длинная дыра | 18.05–17.07.2024 (простой, ~2 месяца) | 57 ч в мае 2024 |
| Потолок мощности | 0.99 | 0.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.42 | 0.790 |
previous_day1 (24 ч) | 2.84 | 0.691 |
previous_day2 (48 ч) | 3.06 | 0.642 |
previous_day3 (72 ч) | 3.36 | 0.565 |
Самый большой прирост точности в проекте дал именно вход, а не модель:
| Источник (упреждение 24 ч, ветер 100 м) | RMSE против анемометра, м/с | Корреляция |
|---|---|---|
| ECMWF IFS 0.25° | 2.82 | 0.726 |
| ICON | 2.86 | 0.695 |
| GFS | 3.36 | 0.670 |
смесь best_match Open-Meteo (с неё начинали) | 2.84 | 0.691 |
| среднее трёх моделей | 2.44 | 0.772 |

Весь архив, нужный обучению и реплеям (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)
- Флаги аномалий на 10-минутных записях: ограничение или простой = ветер ≥ 6 м/с при мощности ≤ 0.02; залипший датчик = скорость ветра не меняется шесть записей подряд.
- Часовая агрегация: средние мощности, ветра и температуры; час считается достоверным при ≥ 4 из 6 записей; час помечается аномальным, если аномальна больше половины его записей.
- Перевод часов в 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.
- Календарь: циклические час суток и день года по местному времени.


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.045 | 69.7 % |
| после онлайн-калибровки | 0.1717 | +0.009 | 77.3 % |
| Упреждение NWP | MAE | RMSE | R² | n |
|---|---|---|---|---|
| 24 ч | 0.1571 | 0.2128 | 0.653 | 5 742 |
| 48 ч | 0.1723 | 0.2329 | 0.585 | 5 694 |
| 72 ч | 0.1860 | 0.2486 | 0.528 | 5 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-дневный реплей) | rolling | strict |
|---|---|---|
| День D+1: MAE / RMSE / R² | 0.1586 / 0.2134 / 0.651 | 0.1760 / 0.2370 / 0.570 |
| День D+1: смещение | +0.023 | +0.025 |
| Все часы (D+1 и D+2): MAE | 0.1662 | 0.1816 |
| MAE по упреждению NWP | 24 ч 0.1586, 48 ч 0.1738 | 48 ч 0.1760, 72 ч 0.1872 |
| По турбинам, MAE дня D+1 | 0.1586 / 0.1586 | 0.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.065 | 236 из 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, как в датасете), без пропусков.
| Колонка | Смысл |
|---|---|
turbine | t1 / t2 |
time_local, time_utc | целевой час по местному времени (UTC+6) и по UTC |
policy | rolling или 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-Meteo | RMSE ветра 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, вопрос остаётся открытым.
Развитие, в порядке ожидаемой ценности:
- Точные запуски NWP из сырых GRIB-архивов (NOAA GFS
s3://noaa-gfs-bdp-pds, ECMWF Open Datas3://ecmwf-forecasts): запуск 00Z дня D с упреждением 12–36 ч, строго честно и свежееstrict. - Цель L1 и признаки качества провайдеров по скользящему окну из бенчмарков и независимого конвейера; оба показали меньшую MAE на своих валидациях.
- Члены ансамбля, а не только средние: Ensemble API Open-Meteo даёт 30–50 возмущённых членов на модель; погода это связывающее ограничение.
- Вероятностная диспетчеризация: интервал 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
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.