О проекте
Команда: Ordanio
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Агент ежедневно выпускает почасовой прогноз на 48 ч для двух турбин с коридором p10/p50/p90 по архивным прогнозам погоды Open-Meteo, анализирует изменения к вчерашнему выпуску и ведёт журнал; есть веб-страница, прогон всего февраля и LLM-аналитик.
Как устроено
Три квантильные модели HistGradientBoostingRegressor (0.1/0.5/0.9) обучены на парах «прогноз погоды на час → фактическая выработка» (107 417 строк, 15 признаков: ветер 10/100 м, порывы, направление, давление, давность прогноза, куб ветра и др.). Замеры турбины в признаки не входят. В строгом режиме агент на каждый день D берёт previous-runs Open-Meteo с упреждением 48/72 ч и проверяет, что weather_run_time не позже выпуска. Далее признаки → модель → CSV на 96 строк, анализ (пересчёт, часы низкой уверенности, ветер выше 25 м/с, ошибка за вчера) и журнал, затем переход к D+1. OpenAI (по умолчанию gpt-5.5) пишет сводку и отвечает через инструменты, но не меняет прогноз. Веб-часть на FastAPI с SVG-графиками.
Ключевые решения
- quantile HistGradientBoostingRegressor
- Open-Meteo previous-runs
- power curve baseline
- persistence baseline
- climatology baseline
- prediction intervals p10-p90
- agentic daily loop
Метрики
Январь 2026, упреждение 48/72: MAE 0.160, RMSE 0.240, покрытие p10–p90 82.6% против кривой мощности 0.177, persistence 0.365, климатологии 0.272; режим 24/48: MAE 0.144 против 0.158 у кривой
Особенности
Модель обучена на прогнозной погоде, а не на измеренном ветре, с явной давностью прогноза в признаках и строгой проверкой доступности выпуска. Сравнение с тремя базовыми моделями идёт на отложенном январе, дополнительно проведён независимый тест на декабре. Кэш погоды хранится в репозитории для воспроизводимости, есть деплой.
Стек
Python · FastAPI · scikit-learn · joblib · Docker · Docker Compose · pytest · HTML/SVG
Модели
gpt-5.5 · OpenAI
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-b7e991bb-ordanio.
README
README.mdПрогноз выработки ВЭС: агент на архивных прогнозах погоды
Команда Ordanio, HackAlem AI, Астана, 23.09.2026. Задача «Agentic AI для прогнозирования выработки ВЭС» (владелец задачи: Самрук-Казына), трек «Энергетика».
Развёрнутая демонстрационная версия: https://hackathon.ordanio.com (Docker на сервере в Амстердаме; на сервере включены необязательные OpenAI-функции и фоновый ролик). Воспроизводимый сценарий проверки описан для репозитория ниже.
Назначение
Ветростанция должна каждый день заранее сообщать, какую мощность дадут её турбины завтра и послезавтра по часам: ошибка прогноза стоит денег на балансирующем рынке. Проект отвечает на вопрос «какую нормализованную мощность выдадут две турбины по часам на два следующих календарных дня», если известен только прогноз погоды, и делает это сам для каждой даты выпуска с 31 января по 28 февраля 2026; выпуск условно выполняется в 23:59.
Вход: история работы двух турбин (10-минутные замеры с 11.03.2023 по 31.01.2026, выданы
организаторами, data/raw/) и архивные прогнозы погоды Open-Meteo по координатам турбин.
Выход: для каждого дня выпуска почасовой прогноз на 48 часов по каждой турбине с коридором
неопределённости (p10, p50, p90), журнал агента с анализом дня, файлы CSV.
Что реализовано
- Модель прогнозирования по историческим данным турбин: три квантильные модели градиентного бустинга (scikit-learn), обученные на парах «прогноз погоды на этот час → фактическая выработка». Признаки только из прогноза погоды и календаря, замеры турбины в признаки не входят.
- Самостоятельное получение прогнозов погоды по координатам турбин из открытого источника Open-Meteo (без ключа и регистрации), с кэшем ответов в репозитории.
- Почасовой прогноз на 48 часов по двум турбинам с коридором p10–p90.
- Agentic-цикл на каждый день выпуска: архивный прогноз погоды по принятой реконструкции доступности → признаки → модель → CSV → анализ (сравнение с прогнозом предыдущего дня, часы низкой уверенности, экстремальный ветер, ошибка за вчера при наличии факта) → сводка в журнал → следующий день с пересчётом.
- Воспроизведение «как в прошлом» на 31.01–28.02.2026 одной командой: 29 прогнозов и общий журнал.
- Проверка модели на январе 2026, который в обучение не входил: те же веса модели и то же основное
упреждение погоды 48/72 ч, что у февральского агента, против трёх точек отсчёта; отчёт с числами
model/artifacts/report.md. Агент дополнительно применяет правило обнуления при прогнозном ветре выше 25 м/с; в январской и декабрьской проверках таких часов не было (максимум прогнозного ветра на 100 м 12,2 и 14,0 м/с), поэтому оно их результат не меняет. - Веб-страница: при открытии сразу последний готовый прогноз и карточка с метриками проверки;
выбор даты, кнопка, лента шагов агента с временем, графики с интервалом p10–p90 по турбинам,
панель «Что изменилось при пересчёте» (вчерашний прогноз с упреждением 48 ч против сегодняшнего
с 24 ч на одни и те же часы, пересчитанные часы подсвечены), таблица, CSV, прогон всего февраля,
панель проверки на январе и декабре, вопросы агенту (при наличии ключа OpenAI), выгрузка всех
прогнозов одним CSV (
/api/forecasts.csv) и журнала файлом (/api/journal.md). - LLM-аналитик (OpenAI, опционально): сводка дня по числам анализа и ответы на вопросы через
инструменты (прогноз на дату, погода, сравнение запусков, метрики проверки). Модельная сводка
строится для одного дня (кнопка или
--date), при прогоне всего периода сводки шаблонные, чтобы прогон занимал секунды. Без ключа цикл и страница работают полностью, сводка собирается по шаблону, чат отключён с надписью. - Тест сценария
pytest, печатает PASS. Docker-запуск одной командой.
Основной сценарий
- Пользователь выбирает дату выпуска D (31.01.2026 … 28.02.2026) и нажимает «Сформировать прогноз».
- Агент получает из Open-Meteo прогноз погоды на часы D+1 00:00 … D+2 23:00, взятый с упреждением:
в основном (строгом) режиме для каждого часа D+1 значение, предсказанное за 48 часов до него
(
previous_day2), для каждого часа D+2 за 72 часа (previous_day3); наибольшее вычисленное номинальноеweather_run_timeравно D−1 23:00, момент выпуска принят как 23:59 дня D. В файле прогноза у каждой строки стоятissue_timestamp,weather_lead_hoursиweather_run_time, агент проверяет, чтоweather_run_timeне позже момента выпуска. Сравнительный режимWEATHER_STRICT=0берёт упреждение 24 и 48 часов (previous_day1/previous_day2). - Агент собирает признаки и запускает модель.
- Агент записывает 96 строк (48 часов × 2 турбины) в
output/forecasts/forecast_<D>.csv. - Агент анализирует результат: сумма нормализованной мощности по часам за каждые сутки (нормализованная
мощность × час), изменения к прогнозу предыдущего дня на те же часы (это и есть пересчёт при
обновлении входных данных: вчера эти часы шли с упреждением 72 ч, сегодня 48 ч), пары час–турбина низкой
уверенности (флаг
confidence), часы с ветром выше 25 м/с (гипотеза штатной остановки), ошибка за вчера по факту, если факт есть (январь). - Агент пишет сводку дня в
output/journal.mdиoutput/runs/<D>.json, затем переходит к D+1.
Архитектура
данные турбин (10 мин) ──► model/prepare ──► часовые ряды, фильтр простоев
Open-Meteo, архив и previous-runs ──► model/weather (кэш data/weather_cache) ──► model/features ──► model/train
│
▼
день D ──► agent: погода на D ──► признаки ──► model/predict (p10/p50/p90) ──► CSV ──► анализ ──► журнал ──► D+1
│
web/app (FastAPI + одна страница) ◄───────────────────────────────────────────────────────────┘
common/config.py— координаты, пути, период, часовой пояс.data/raw/— данные организаторов (источник вdata/raw/ИСТОЧНИК.md);data/weather_cache/— ответы Open-Meteo, чтобы расчёт воспроизводился из кэша после установки зависимостей.model/— подготовка данных, погода, признаки, обучение, предсказание;model/artifacts/— обученные модели, метрики, отчёт и таблица проверки.agent/— инструменты цикла, суточный запуск, прогон по периоду, LLM-аналитик.web/— API и одна HTML-страница без сборки и внешних библиотек (график в SVG).tests/— проверочный сценарий;examples/— примеры выходных файлов;docs/— контракт модулей, журнал экспериментов, текст ТЗ организаторов.
Что детерминировано, а что делает LLM. Погода, признаки, модель, файлы, правила анализа и журнал
по шаблону работают без ключа и не зависят от доступности Open-Meteo: кэш ответов лежит в репозитории
и используется при WEATHER_OFFLINE=1 или при ошибке сети;
на проверенном окружении при одинаковых весах модели, погодном кэше, режиме и дате значения p10/p50/p90
воспроизводятся (29 дней за секунды на ноутбуке, без обучения и без загрузки погоды). Сравнение
с предыдущим выпуском и флаг confidence зависят от наличия предыдущего выпуска в output/, поэтому
одиночный запуск и та же дата внутри последовательного прогона имеют одинаковые квантили, но могут
отличаться полями анализа; для сравнения с examples/ используется полный последовательный прогон
в свежей копии репозитория. Побайтовое совпадение времени выполнения шагов и LLM-текстов не заявляется;
прогон в Linux-контейнере Docker отличается от прогона на macOS в небольшой доле строк при тех же весах,
см. «Ограничения».
Модель OpenAI используется только для человеческой сводки дня по числам анализа и для ответов
на вопросы через инструменты; она не может изменить прогноз.
Подробный контракт функций и колонок: docs/architecture.md.
Как устроена модель и что показала проверка
Модель учится на прогнозе, а не на измеренном ветре: в день выпуска замеров за завтра ещё нет,
и модель, обученная на точном ветре, ошибается сильнее на прогнозном. Обучающая выборка:
архив свежих прогнозов с 2023 года плюс история прогнозов за сутки и за двое суток с марта 2024.
Один и тот же час факта входит в выборку до трёх раз с разными версиями прогноза (свежий, суточной
и двухсуточной давности), поэтому строк обучения 107 417 при 48 767 часах факта по двум турбинам;
январь 2026 в обучение не входил. 15 признаков: ветер на 10 и 100 м,
порывы, направление, температура, давление, час, месяц, турбина, давность прогноза, куб и сглаженный
ветер. Три модели HistGradientBoostingRegressor(loss="quantile") на квантили 0.1, 0.5, 0.9.
Проверка на январе 2026 повторяет работу агента в основном (строгом) режиме, упреждение 48/72 ч:
31 дата выпуска (с 31.12.2025 по 30.01.2026), 2 914 записей «выпуск, целевой час, турбина» с фактом;
уникальных часов по двум турбинам 1 481,
почти каждый час проверен дважды, как день 1 и как день 2, поэтому записи не независимы.
Точки отсчёта считаются на тех же записях: persistence берёт для даты выпуска D факт дня D
в тот же час (для дня 2 тоже факт дня D, а не D+1), кривая мощности берёт тот же прогноз ветра.
Ошибки в шкале нормализованной мощности 0…1; MAE и RMSE усреднены по всем записям, то есть по обеим турбинам
и обоим горизонтам вместе, срезы по горизонту и по турбине лежат в metrics.json.
| Январь 2026, режим 48/72 (основной) | Модель MAE | RMSE | Факт внутри p10–p90 | Кривая мощности MAE | Persistence MAE |
|---|---|---|---|---|---|
| Все 48 ч | 0.160 | 0.240 | 82.6 % | 0.177 | 0.365 |
| День 1 (упреждение погоды 48 ч) | 0.156 | — | — | 0.168 | — |
| День 2 (упреждение погоды 72 ч) | 0.165 | — | — | 0.185 | — |
Третья точка отсчёта, климатология (константа, медиана выработки по обучению 0.235): MAE 0.272.
Сравнительный режим 24/48 (WEATHER_STRICT=0, model/artifacts_lead24/) на том же январе:
модель 0.144, RMSE 0.218, покрытие 85.3 %, кривая 0.158, persistence 0.365; по горизонтам модель
0.135 и 0.154 против кривой 0.149 и 0.168. Лишние сутки упреждения стоят модели около 0.016 MAE.
На январской валидации в основном режиме MAE модели ниже на 9,2 % относительно кривой «ветер → мощность»
(0,160 против 0,177) и в 2,3 раза ниже правила «завтра как сегодня» (0,365); выигрыш держится на обоих
горизонтах. Веса модели одни и те же в обоих режимах (md5 в metrics.json, поле weights_md5),
обучение шло на архиве свежих прогнозов и на previous_day1/day2, упреждение 72 ч в обучении не
представлено, проверка на нём идёт «как есть».
Январь использовался и для выбора версии модели (docs/experiments.md), поэтому это валидация,
а не независимый тест. Дополнительная ретроспективная проверка сделана на декабре 2025 с отсечкой
обучения 30.11.2025: та же конфигурация без изменений, даты выпуска 30.11 … 30.12, 2 912 записей,
1 480 пар турбина–час, тот же основной режим 48/72. Декабрьская модель на декабрьских ответах не училась, но конфигурация
выбиралась по январю моделями, обученными по 31.12, то есть декабрь входил в их обучающие данные;
полностью нетронутым внешним тестом это назвать нельзя, поэтому и не называем.
В декабре ошибки прогноза мощности выше, чем в январе: MAE кривой мощности 0,215 против 0,177. Сами по себе
эти метрики не устанавливают причину различия между месяцами. Модель сохраняет меньшую MAE относительно
всех трёх точек отсчёта:
| Декабрь 2025, режим 48/72, ретроспективная проверка | Модель | Кривая мощности | Persistence | Климатология |
|---|---|---|---|---|
| MAE | 0.206 | 0.215 | 0.376 | 0.346 |
| RMSE | 0.300 | 0.317 | 0.491 | — |
| Факт внутри p10–p90 | 76.5 % | 69.9 % | — | — |
| День 1 / День 2, MAE | 0.197 / 0.215 | 0.204 / 0.225 | — | — |
В сравнительном режиме 24/48 декабрь даёт модель 0.196, кривая 0.206 (model/artifacts_dec2025_lead24/).
Числа и отчёты: model/artifacts_dec2025/metrics.json, report.md.
Коридор: интервал между оценками квантилей 0,1 и 0,9; наблюдаемое покрытие в основном режиме на январе
82,6 % при средней ширине 0,55 в шкале нормализованной мощности, на декабре 76,5 % при ширине 0,56; у кривой мощности
78,2 % и 69,9 %. Покрытие меняется между месяцами, стабильная калибровка на 80 % не подтверждена;
широкий интервал покрывает факт легко, поэтому ширина указана рядом с покрытием. Снижение MAE
относительно кривой: 9,2 % в январе и около 4 % в декабре, это положительный результат на двух
месяцах, а не доказательство устойчивого выигрыша во всех сезонах. Флаг confidence в файле прогноза
это эвристика по ширине интервала (порог: 75-й процентиль ширины по январской проверке того режима,
чьи артефакты лежат в model/artifacts/) и по изменению к вчерашнему прогнозу, а не вероятность.
Фильтр неполных часов и простоев применён и к обучению, и к проверке: в январе он убрал 7 из
1 488 пар турбина–час; метрики без фильтра лежат в блоке validation_unfiltered в metrics.json
каждой папки проверки и отличаются от отфильтрованных в третьем знаке (в режиме 24/48: 0,1436
против 0,1440).
Что пробовали и что не помогло: docs/experiments.md. Полный отчёт с фильтром данных,
самопроверкой выравнивания по времени и параметрами: model/artifacts/report.md.
Паспорт данных и модели
| Что | Значение |
|---|---|
| Данные турбин | data/raw/turbine_1.csv, turbine_2.csv, шаг 10 минут, 11.03.2023 00:00 … 31.01.2026 23:50, 142 360 и 149 499 строк; нормализованная мощность 0…1, ветер м/с, температура °C; время местное |
| Часовой пояс | данные приняты как местное время Asia/Almaty; Казахстан перешёл на UTC+5 01.03.2024; Open-Meteo отдаёт все даты с постоянным UTC+5, модуль переводит их в UTC и затем в Asia/Almaty; самопроверка сдвига по корреляции ветра дала 0 ч до и после 01.03.2024 |
| Погода | Open-Meteo, точка 43.6442, 78.5372; переменные wind_speed_10m, wind_speed_100m, wind_gusts_10m, wind_direction_100m, temperature_2m, surface_pressure; wind_speed_unit=ms, timezone=Asia/Almaty |
| Архив для обучения | Historical Forecast API 11.03.2023 … 31.01.2026 (свежий прогноз на каждый час) плюс Previous Runs API с 01.03.2024 (previous_day1, previous_day2); кэш data/weather_cache/, 189 файлов |
| Погода для агента | Previous Runs API, основной режим: для D+1 previous_day2 (упреждение 48 ч), для D+2 previous_day3 (72 ч); сравнительный WEATHER_STRICT=0: previous_day1/previous_day2 (24/48 ч); кэш обоих режимов по датам выпуска 30.11.2025 … 28.02.2026 |
| Граница обучения | боевые модели model/artifacts/ обучены по 31.12.2025 включительно, январь 2026 отложен для проверки; агент в феврале работает этими же моделями |
| Модели | model_q10.joblib, model_q50.joblib, model_q90.joblib: HistGradientBoostingRegressor, loss=quantile, random_state=0; power_curve.joblib: кривая по бинам ветра 0,5 м/с |
| Проверка выходов | тест: 96 строк, 96 уникальных пар турбина–час, часы D+1 00:00 … D+2 23:00, без пропусков, 0 ≤ p10 ≤ p50 ≤ p90 ≤ 1, weather_run_time не позже issue_timestamp |
| Сбой погоды | при ошибке сети или WEATHER_OFFLINE=1 берётся кэш, источник пишется в шаг fetch_weather; кэш в репозитории полный (все 91 дата в обоих режимах, пустых значений нет); отдельной проверки на частично пустой ответ провайдера в прототипе нет, это известное ограничение |
| Ретроспективная проверка | декабрь 2025, та же конфигурация, обучение по 30.11.2025, 102 977 строк: model/artifacts_dec2025/metrics.json, report.md; сравнительный режим в model/artifacts_dec2025_lead24/ |
| Веса модели | одни и те же во всех проверках января, md5 в metrics.json (weights_md5), model_q50.joblib 2060bcca… |
Технологии
Python 3.12, pandas, numpy, scikit-learn, httpx, joblib, FastAPI, uvicorn, python-dotenv, openai, pytest. Одна HTML-страница без сборки. Docker. Источник погоды: Open-Meteo (Historical Forecast API и Previous Runs API). LLM: OpenAI API, опционально.
Установка
Получите репозиторий через доступ, предоставленный организаторами; после клонирования перейдите в папку проекта. Все команды ниже выполняются из корня репозитория.
git clone https://github.com/BAITC-Hacks/hack-b7e991bb-ordanio.git repo
cd repo
Два пути: Docker (рекомендуется, локальный Python не нужен) или локальный запуск (Python 3.12, активация виртуального окружения не требуется, интерпретатор вызывается по пути).
Docker: установлен и запущен Docker, Docker Compose 2.24 или новее (проверить docker compose version),
порт 8000 свободен. Для проверки без LLM возьмите свежую копию без .env.
Windows PowerShell (нужен Python 3.12 с Python Launcher py; команды выполнять по одной):
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe --version
$env:PYTHONUTF8="1"
$env:WEATHER_STRICT="1"
$env:WEATHER_OFFLINE="1"
macOS или Linux (Python 3.12 доступен как python3.12):
python3.12 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python --version
Ключ OpenAI не обязателен. Если он есть: скопировать .env.example в .env и вписать OPENAI_API_KEY.
Переменные $env: в PowerShell сохраняются до конца сессии: Remove-Item Env:WEATHER_STRICT снимает
настройку режима погоды, Remove-Item Env:PYTHONUTF8 настройку UTF-8. Основные результаты проверяются
с WEATHER_STRICT=1; после сравнительного запуска с 0 верните 1 перед обучением, прогнозом или
запуском сервера.
Запуск
Docker:
docker compose up --build -d
Открыть http://localhost:8000. Выбрать дату, нажать «Сформировать прогноз».
PowerShell:
.\.venv\Scripts\python.exe -m web.app
macOS или Linux:
WEATHER_STRICT=1 WEATHER_OFFLINE=1 .venv/bin/python -m web.app
Обученные модели лежат в репозитории, обучение повторять не нужно. Прогон всего периода из командной строки (Docker / PowerShell / macOS):
docker compose exec -T -e WEATHER_STRICT=1 -e WEATHER_OFFLINE=1 app python -m agent.run --from 2026-01-31 --to 2026-02-28
.\.venv\Scripts\python.exe -m agent.run --from 2026-01-31 --to 2026-02-28
WEATHER_STRICT=1 WEATHER_OFFLINE=1 .venv/bin/python -m agent.run --from 2026-01-31 --to 2026-02-28
Результат: output/forecasts/forecast_2026-01-31.csv … forecast_2026-02-28.csv, output/journal.md,
output/runs/*.json. Ожидаемые объёмы: 29 файлов × 96 записей = 2 784 записи; из них 2 640 с целевыми
часами внутри февраля (1 344 уникальные пары час–турбина), остальные 144 относятся к 1–2 марта;
weather_lead_hours принимает значения 48 и 72. В Docker папка output/ смонтирована на компьютер
пользователя. Переменные -e действуют только для команды exec и не перенастраивают работающий
веб-процесс; его настройки задаются через .env при запуске.
Зависимости
Версии зафиксированы в requirements.txt. Погодные данные получены из Open-Meteo; после установки
зависимостей расчёт из полного кэша (data/weather_cache/, 189 файлов) работает без обращений
к Open-Meteo при WEATHER_OFFLINE=1. OpenAI используется опционально для LLM-сводки и чата.
Первичная загрузка репозитория, установка зависимостей и сборка Docker-образа могут требовать сеть;
шрифт и фоновый ролик относятся к оформлению страницы. Обученные модели лежат в model/artifacts/
и воспроизводятся командой обучения (random_state=0).
Параметры окружения
.env.example:
| Переменная | Назначение |
|---|---|
OPENAI_API_KEY | ключ OpenAI для LLM-сводки дня и чата; без ключа сводка формируется по шаблону, чат отключён, прогнозы, анализ и журнал работают |
OPENAI_MODEL | модель OpenAI для чата, по умолчанию gpt-5.5 |
OPENAI_MODEL_NOTE | модель для сводки дня, по умолчанию gpt-5.4 (4–5 с на сводку) |
WEATHER_OFFLINE | 1 запрещает обращения к Open-Meteo, погода только из кэша в репозитории; OpenAI и ресурсы оформления этой настройкой не отключаются |
WEATHER_STRICT | по умолчанию 1, основной режим: упреждение погоды 48 и 72 часа; 0 включает сравнительный режим 24/48 (см. «Ограничения») |
HERO_VIDEO_URL | адрес фонового ролика для заставки; пусто по умолчанию, тогда заставка со спокойным фоном |
Как проверить основной сценарий
Проверенное окружение: macOS 15 (Apple Silicon), Python 3.12.14, Docker 29.4, Compose 2.40; чистое
скачивание репозитория с GitHub, чистое виртуальное окружение. Протокол выполненных проверок с выводом
команд: docs/proverka-zapuska.md. Ниже команды в трёх вариантах: Docker / PowerShell / macOS.
- Тест (обучение на срезе с 2 ноября 2025 во временную папку, прогон одного дня из кэша во временную
папку, проверка формы файла, кривой ввод; боевые
output/иmodel/artifacts/не меняются):
docker compose exec -T -e WEATHER_STRICT=1 -e WEATHER_OFFLINE=1 app python -m pytest -q -s tests
.\.venv\Scripts\python.exe -m pytest -q -s tests
WEATHER_STRICT=1 WEATHER_OFFLINE=1 .venv/bin/python -m pytest -q -s tests
Ожидается: шесть пройденных тестов, в выводе есть строка PASS; длительность не является критерием.
- Один день агента:
docker compose exec -T -e WEATHER_STRICT=1 -e WEATHER_OFFLINE=1 app python -m agent.run --date 2026-02-05
.\.venv\Scripts\python.exe -m agent.run --date 2026-02-05
WEATHER_STRICT=1 WEATHER_OFFLINE=1 .venv/bin/python -m agent.run --date 2026-02-05
Ожидается файл output/forecasts/forecast_2026-02-05.csv на 96 записей (48 часов × 2 турбины)
с колонками issue_date, target_time, lead_hours, issue_timestamp, weather_lead_hours, weather_run_time, turbine, ws100_forecast, temp_forecast, p10, p50, p90, confidence, note, значения p10 ≤ p50 ≤ p90
в пределах 0…1, weather_lead_hours 48 или 72, weather_run_time не позже issue_timestamp, и раздел
«Выпуск 2026-02-05» в output/journal.md со строками «Режим погоды: строгий, упреждение 48/72 ч.» и
«По номинальному упреждению все значения погоды рассчитаны не позже момента выпуска: самое позднее
время расчёта 4 февраля 23:00 при выпуске 5 февраля 23:59». Пример файла и раздела: examples/
(взяты из полного последовательного прогона: там у 5 февраля есть предыдущий выпуск и заполнено
сравнение; при одиночном запуске квантили те же, а поля сравнения и confidence могут отличаться).
- Январские и декабрьские метрики в отдельную папку (веса те же, что в
model/artifacts/):
docker compose exec -T -e WEATHER_STRICT=1 -e WEATHER_OFFLINE=1 app python -m model.train --artifacts-dir output/check_january_strict
docker compose exec -T -e WEATHER_STRICT=1 -e WEATHER_OFFLINE=1 app python -m model.train --validation-month 2025-12 --artifacts-dir output/check_december_strict
.\.venv\Scripts\python.exe -m model.train --artifacts-dir output/check_january_strict
.\.venv\Scripts\python.exe -m model.train --validation-month 2025-12 --artifacts-dir output/check_december_strict
WEATHER_STRICT=1 WEATHER_OFFLINE=1 .venv/bin/python -m model.train --artifacts-dir output/check_january_strict
WEATHER_STRICT=1 WEATHER_OFFLINE=1 .venv/bin/python -m model.train --validation-month 2025-12 --artifacts-dir output/check_december_strict
Ожидается: январь MAE около 0.160, покрытие около 82.6 %; декабрь MAE около 0.206, покрытие около 76.5 %
(metrics.json и report.md в указанных папках). Обучение занимает от 15 секунд до двух минут
в зависимости от загрузки машины.
- Через API при работающем сервере (второе окно терминала):
Invoke-RestMethod -Method Post -Uri "http://localhost:8000/api/run?issue_date=2026-02-05"
curl -X POST "http://localhost:8000/api/run?issue_date=2026-02-05"
Ожидается JSON с полем steps (семь шагов с временем: погода, признаки, модель, файл, анализ, сводка,
журнал) и 96 записями прогноза. Кривая дата: .../api/run?issue_date=abc отвечает HTTP 400 с текстом
по-русски (в PowerShell код можно увидеть через curl.exe -s -o NUL -w "%{http_code}" -X POST "...").
Проверка HTTP-кодов подтверждает доступность маршрутов; состав выгрузки /api/forecasts.csv проверяется
после полного прогона (объёмы выше).
-
Кривой ввод в командной строке:
... -m agent.run --date 2026-03-05печатает, что дата вне периода 31.01–28.02.2026, код выхода 2 ($LASTEXITCODEв PowerShell,echo $?в bash). -
Сравнительный эксперимент 24/48 (не для основного допуска), артефакты в отдельную папку:
docker compose exec -T -e WEATHER_STRICT=0 -e WEATHER_OFFLINE=1 app python -m model.train --artifacts-dir output/check_january_lead24
$env:WEATHER_STRICT="0"
.\.venv\Scripts\python.exe -m model.train --artifacts-dir output/check_january_lead24
$env:WEATHER_STRICT="1"
WEATHER_STRICT=0 WEATHER_OFFLINE=1 .venv/bin/python -m model.train --artifacts-dir output/check_january_lead24
Ожидается январь MAE около 0.144. Сравнительный agent.run пишет в общую папку output/ и заменяет
файл выбранной даты; перед проверкой основного набора и выгрузкой общего CSV повторите весь период
с WEATHER_STRICT=1.
Соответствие требованиям задачи
| Требование ТЗ | Где в коде | Как проверить |
|---|---|---|
| Модель прогнозирования почасовой выработки по историческим данным | model/prepare.py, model/features.py, model/train.py, model/predict.py | команда обучения из п. 3 раздела «Как проверить» создаёт metrics.json и report.md; таблица выше |
| Самостоятельное получение прогнозов погоды по координатам ВЭС из открытых источников, доступных на момент прогнозирования | model/weather.py (get_issued_forecast), agent/tools.py (fetch_weather) | шаг fetch_weather в output/runs/<D>.json показывает источник, сеть или кэш; CSV содержит issue_timestamp, weather_lead_hours и вычисленное номинальное weather_run_time; основной режим использует упреждение 48/72 ч; доступность к моменту выпуска реконструируется при допущении о задержке публикации не более 6 ч, фактическое время публикации каждого значения источник не предоставляет, подробности в «Ограничениях» |
| Прогноз на 24–48 часов с почасовой детализацией | agent/tools.py (save_forecast) | файл на 96 строк, часы D+1 00:00 … D+2 23:00 |
| Agentic AI: получение погоды → подготовка → модель → прогноз → анализ → повторный расчёт при обновлении | agent/run.py (run_day, run_period), agent/tools.py (analyze), agent/analyst.py | output/runs/<D>.json со всеми шагами и полями recomputed_rows, changed_rows_over_threshold; в output/journal.md раздел следующего дня содержит «Пересчитаны 48 записей …»; пример двух выпусков: examples/peresvet_2026-02-04_2026-02-05.md |
| Воспроизведение как в прошлом: 31.01 → 1.02 → … → 28.02 с архивными прогнозами | agent/run.py --from --to | прогон периода из раздела «Запуск» даёт 29 файлов, 2 784 записи и журнал |
Данные и внешние сервисы
Данные турбин выданы организаторами (data/raw/ИСТОЧНИК.md): шаг 10 минут, 11.03.2023–31.01.2026,
нормализованная мощность 0…1, замеренный ветер и температура. Погода: Open-Meteo, архив прогнозов
и предыдущие запуски по точке 43.6442, 78.5372 (турбины стоят в 240 м друг от друга, одна ячейка
погодной сетки). Открытые данные, лицензия CC BY 4.0. Кэш ответов в репозитории, 189 файлов, 3,9 МБ.
LLM: OpenAI API по ключу пользователя, опционально; модель получает подготовленный приложением контекст анализа дня и диалог, чат может вызывать инструменты получения прогноза, погоды, сравнения выпусков и метрик (agent/analyst.py).
Ограничения
Известные ограничения проекта, честно по факту:
- Фактической выработки за февраль 2026 в предоставленных данных нет. Качество оценено на январской валидации и дополнительной декабрьской ретроспективной проверке; для февральских дней ошибка по факту не вычисляется, агент пишет «ошибка за вчера: нет факта».
- Агент использует архивные прогнозные значения погоды с фиксированным упреждением относительно каждого целевого часа: 48/72 ч в основном режиме и 24/48 ч в сравнительном. Повторный расчёт выполняется раз в сутки для следующей даты выпуска, внутрисуточные обновления в этом сценарии не используются.
- Часовой пояс данных принят как местное время; Казахстан перевёл часы на UTC+5 в марте 2024,
самопроверка выравнивания (
model/artifacts/report.md) показывает нулевой целый сдвиг в обоих периодах, но дробная часть часа не исправляется. - Номинальное покрытие интервала p10–p90 составляет 80 %. Наблюдаемое покрытие в основном режиме 82,6 % в январе и 76,5 % в декабре при средней ширине 0,55 и 0,56 в шкале нормализованной мощности; стабильная калибровка на 80 % не подтверждена. Суммы почасовых p10 и p90 в журнале не являются границами 80-процентного интервала суточной выработки.
- Доступность погоды на момент выпуска. Поле
weather_run_timeвычислено как целевой час минус упреждение; это номинальный порядок во времени, а не метка публикации от провайдера (Previous Runs API отдаёт значения по фиксированному упреждению и не сообщает время публикации конкретного прогона). Момент выпуска принят как 23:59 дня D. Основной режим (по умолчанию) берёт упреждение 48 и 72 часа (previous_day2/previous_day3): наибольшее вычисленное номинальноеweather_run_timeравно D−1 23:00, при задержке публикации у глобальных моделей до 6 часов он доступен к D 05:00, за 19 часов до выпуска. Это консервативная реконструкция доступности при явно заданном допущении о задержке публикации, а не подтверждение фактического времени публикации каждого значения: Previous Runs API его не сообщает. Сравнительный режимWEATHER_STRICT=0(упреждение 24/48, bash:WEATHER_STRICT=0 python -m model.train --artifacts-dir model/artifacts_lead24; PowerShell:$env:WEATHER_STRICT="0"отдельной строкой) точнее на 0,016 MAE, но часть его значений для последних часов суток могла стать доступна уже в первые часы D+1; он оставлен как эксперимент с этой подписью. - Время в данных турбин это начало 10-минутного интервала, часовое значение это среднее шести
интервалов,
target_timeэто начало часа;lead_hoursсчитается от 00:00 дня выпуска. - Обнуление при ветре выше 25 м/с это гипотеза о штатной остановке по типовому порогу, параметры
этих турбин неизвестны; такие часы помечаются
confidence=lowс пометкой вnote, чтобы интервал [0; 0] не читался как уверенность; правило действует только в агенте, в проверке на январе не применялось (в январе 2026 таких часов в прогнозе не было). - Ранняя остановка бустинга использует случайную внутреннюю выборку 10 % обучающих примеров, поэтому разные версии прогноза одного и того же часа могут оказаться по обе стороны этого разбиения; это ограничение внутреннего выбора сложности модели (числа деревьев), а не утечка проверочных месяцев: январь и декабрь в обучение соответствующих моделей не входили.
- Момент выпуска 23:59 и последний интервал факта: замер 23:50 описывает интервал 23:50–00:00, который к 23:59 ещё не завершён; persistence в проверке берёт полный час дня выпуска, то есть допускает доступность последнего часа к моменту выпуска. На прогноз модели это не влияет, на точку отсчёта persistence влияет в пределах одного часа из 24.
lead_hoursв CSV это календарное смещение от 00:00 дня выпуска (24 … 71), а не упреждение от момента выпуска 23:59; упреждение погоды указано отдельно вweather_lead_hours.- Переобучение и совпадение md5 моделей проверены на macOS Apple Silicon в указанном окружении;
на Windows и других процессорах этим протоколом не подтверждены. Округлённые метрики служат ориентиром
для сравнения, побайтовое совпадение между платформами не заявляется: прогон февраля в Linux-контейнере
Docker при тех же весах (md5 совпадает) отличается от прогона на macOS в 106 строках из 2 784, обычно
на 0,005–0,01, десять значений на 0,05–0,085, в двух строках сменился флаг
confidence; переобучение на декабре в контейнере дало MAE 0,204 против 0,206 на macOS. По нашей оценке, причина в разных сборках numpy и scikit-learn: значение признака у порога разбиения дерева уходит в соседний лист. Файлыexamples/получены на macOS, сравнивайте их с прогоном той же платформы; объёмы, даты, упреждения и порядок величин совпадают на обеих. - Последние даты выпуска (27 и 28 февраля) прогнозируют также 1 и 2 марта: февральский набор
выделяется по
target_time, происхождение каждой строки видно поissue_dateиweather_run_time. - Мощность представлена в нормализованной шкале 0…1, предоставленной организаторами. Параметры нормализации и номинальная мощность турбин не подтверждены, поэтому значения не переводятся в МВт и МВт·ч; MAE это ошибка в шкале нормализованной мощности, суммы по часам выражены в единицах нормализованной мощности × час.
- Координаты турбин взяты из ссылок в ТЗ; параметры турбин (высота ступицы, номинал) неизвестны, поэтому выработка нормирована так же, как в данных.
- Из обучающего набора исключены 149 часов вероятного простоя и 120 неполных часов; фильтрация применяется также к проверке, объёмы исключений и метрики без фильтра приведены в отчётах; ремонтные графики неизвестны.
- LLM-сводка дня и чат требуют ключ OpenAI; шаблонная сводка и основной цикл доступны без ключа, при ошибке OpenAI агент продолжает основной расчёт.
Раскрытие: инструменты, модели и сторонние материалы
Весь код, тесты и документация написаны 23.09.2026 в ходе хакатона с помощью AI-агентов Claude
(Anthropic, модели Fable и Opus) под руководством участника; задача, архитектура, приёмка и решения
по методике за участником. Сторонние библиотеки перечислены в requirements.txt с версиями
(лицензии BSD, MIT, Apache 2.0). Данные турбин принадлежат владельцу задачи и выданы для хакатона.
Погодные данные Open-Meteo, CC BY 4.0. Фоновый ролик заставки на развёрнутой версии: Pexels,
видео 4404136 «Windmills in the farmland», лицензия Pexels (свободное использование, без указания
автора), в репозиторий не входит, подключается переменной HERO_VIDEO_URL. Шрифт IBM Plex, OFL,
через Google Fonts с системным запасным. Ранее написанного кода, шаблонов и чужих решений в проекте нет.
Авторы коммитов
История коммитов
- 2026-09-23 17:42Страница: скругления 12px, тени карточек, графики выше, линия ветра заметнееTimur Alpimov
- 2026-09-23 17:40Заставка: ролик открыт полностью, светлое поле только слева под текстом и переход в фон снизу без стыкаTimur Alpimov
- 2026-09-23 17:28README, протокол и .env.example: измеренное расхождение Docker-прогона с macOS при тех же весах, единая шкала нормализованной мощности, проверка правила 25 м/с для декабря, протокол Docker-команд на 3Timur Alpimov
- 2026-09-23 17:12README и протокол по четвёртой рецензии: команды для Docker, PowerShell и macOS без активации окружения, один основной режим 48/72 во всех разделах, точные формулировки покрытия, воспроизводимости, шкTimur Alpimov
- 2026-09-23 17:07Страница: ссылка на дату в адресе, клавиши для листания дней, карточка «Сводка дня», стиль печатиTimur Alpimov
- 2026-09-23 16:58Заставка: светлое поле под текстовой колонкой, читаемый подзаголовокTimur Alpimov
- 2026-09-23 16:54Страница: единая светлая стилистика, заставка с текстом слева и плавным переходом ролика в фон, полоса фактов, ярлыки разделов, светлые карточки графиковTimur Alpimov
- 2026-09-23 16:41Протокол: финальный прогон на замороженном коммите с объёмами, двумя выпусками, режимами, декабрём, обучением и DockerTimur Alpimov
Все коммиты (40)
- 2026-09-23 16:38Основной режим погоды 48/72 (строгий): умолчание, артефакты и проверки января и декабря, сравнительный режим 24/48 отдельно; страница и README под него; аудиты прорабов: подписи, защита папок, тексты Timur Alpimov
- 2026-09-23 16:27Заставка с фоновым роликом по переменной, тёмные графики со свечением, градиентом и метками экстремумов; журнал агента: пары час–турбина, номинальное упреждение, защита от битого вчерашнего файла; тесTimur Alpimov
- 2026-09-23 16:23README: таблица соответствия ТЗ, происхождение погоды по фактическим колонкам и журналуTimur Alpimov
- 2026-09-23 16:19README: команды для PowerShell, кодировка консоли, версия Compose, семь шагов агента, раскрытие ролика заставки и шрифтаTimur Alpimov
- 2026-09-23 16:11Модель: флаги CLI для воспроизведения декабря, проверка января в строгом режиме погоды (MAE 0,160 против 0,177 у кривой); README: строгий режим и его числаTimur Alpimov
- 2026-09-23 16:11Агент: часы предполагаемой остановки помечаются как низкая уверенность с пометкой, упреждение погоды берётся из данных погоды (строгий режим автоматически)Timur Alpimov
- 2026-09-23 16:09Страница: блок «О проекте»; погода: строгий режим WEATHER_STRICT (упреждение 48/72), кэш строгих выпусков, колонка упреждения в данных погодыTimur Alpimov
- 2026-09-23 16:07Протокол чистого запуска с выводом команд; README: ссылка на негоTimur Alpimov
- 2026-09-23 16:07Графики: подсказка при наведении, линия ветра по правой оси, заливка и ночные часы, раскраска разницы при пересчёте; примеры двух последовательных выпусков; README по второй рецензииTimur Alpimov
- 2026-09-23 16:02README: формулировки про кэш погоды вместо обещания работы без сетиTimur Alpimov
- 2026-09-23 15:58Страница: обход по шагам с подсветкой и «Пропустить», ссылка «Как пользоваться»; README: усреднение метрик и независимость декабряTimur Alpimov
- 2026-09-23 15:53Страница: кнопка «Следующий день», вопросы-подсказки к агенту, выгрузка всех прогнозов и журнала, штамп версии модели и данныхTimur Alpimov
- 2026-09-23 15:51Страница: стиль по спецификации (палитра, IBM Plex, сетка, компактная шапка, коридор 14 %), правки подписей; API: все прогнозы одним CSV, журнал файлом, сведения о модели в статусеTimur Alpimov
- 2026-09-23 15:44Примеры из финального прогона; README: возможности страницы и проверенное окружениеTimur Alpimov
- 2026-09-23 15:43Страница: единая типографика и ширина, лента шагов агента с временем, таблица с зеброй и закреплённой шапкой, кнопки одного стиляTimur Alpimov
- 2026-09-23 15:39Страница: панель «Что изменилось при пересчёте», вчерашний и сегодняшний прогноз на одни часы с подсветкой пересчитанныхTimur Alpimov
- 2026-09-23 15:38Убрана проверка GitHub Actions: у организации заблокирован биллинг Actions, прогоны не стартуютTimur Alpimov
- 2026-09-23 15:37GitHub Actions: установка, тест и один день агента на Linux, Windows и Mac; сборка и запуск DockerTimur Alpimov
- 2026-09-23 15:37Тест пишет во временную папку и не трогает боевые прогнозы; страница при открытии показывает последний прогноз и карточку метрик; строка про независимый тест на декабре; README уточнёнTimur Alpimov
- 2026-09-23 15:32Агент: момент выпуска и происхождение погоды в каждой строке прогноза (issue_timestamp, weather_lead_hours, weather_run_time), проверка доступности; тест под новые колонки; примеры обновленыTimur Alpimov
- 2026-09-23 15:31Независимый тест на декабре 2025 и метрики января без фильтра; README по замечаниям рецензии: точные формулировки, паспорт данных и модели, ограниченияTimur Alpimov
- 2026-09-23 15:15README: вводные строки в разделах установки и ограниченийTimur Alpimov
- 2026-09-23 15:14README: развёрнутая версия с работающими LLM-функциямиTimur Alpimov
- 2026-09-23 15:00Сводка дня на отдельной быстрой модели (OPENAI_MODEL_NOTE), таймауты; README: переменные и примечание про развёрнутую версиюTimur Alpimov
- 2026-09-23 14:57Чат агента: инструмент прогноза по целевому дню, модель gpt-5.5 по умолчанию; сводки периода по шаблону, модельная сводка для одного дня; примеры и README обновленыTimur Alpimov
- 2026-09-23 14:45Итоговый README: что реализовано, установка и запуск для двух систем, проверка сценария, таблица соответствия ТЗ, ограничения, раскрытие; порог низкой уверенности по 75-му процентилю проверкиTimur Alpimov
- 2026-09-23 14:42Модель: обучение на истории previous-runs и архиве, 15 признаков, ранняя остановка; MAE 0,144 против 0,158 у кривой мощности; панель проверки на январе; журнал экспериментовTimur Alpimov
- 2026-09-23 14:31Артефакты обучения после чистого прогона train.py: модели квантилей, метрики, отчёт, проверка на январеTimur Alpimov
- 2026-09-23 14:31Порог низкой уверенности 0,7 по ширине коридора; артефакты обучения с проверкой на январе; примеры на обученной модели; контракт уточнёнTimur Alpimov
- 2026-09-23 14:26Страница и API, Docker и compose, тест сценария с PASS, примеры выходных файлов; агент проверен на стыке с модельюTimur Alpimov
- 2026-09-23 14:23Погода Open-Meteo с кэшем, подготовка данных, признаки, кривая мощности; инструменты и цикл агента; API веб-сервиса, зависимости, DockerfileTimur Alpimov
- 2026-09-23 14:11Задача, сценарий, архитектура и контракт модулей; данные организаторов; структура папокTimur Alpimov
Структура репозитория (240 файлов)
.dockerignore .env.example .gitignore Dockerfile README.md agent/__init__.py agent/analyst.py agent/run.py agent/tools.py common/__init__.py common/config.py data/raw/turbine_1.csv data/raw/turbine_2.csv data/raw/ИСТОЧНИК.md data/weather_cache/.gitkeep data/weather_cache/historical_2023-03-11_2023-12-31.json data/weather_cache/historical_2024-01-01_2024-12-31.json data/weather_cache/historical_2025-01-01_2025-12-31.json data/weather_cache/historical_2026-01-01_2026-01-31.json data/weather_cache/issued_2025-11-30.json data/weather_cache/issued_2025-12-01.json data/weather_cache/issued_2025-12-02.json data/weather_cache/issued_2025-12-03.json data/weather_cache/issued_2025-12-04.json data/weather_cache/issued_2025-12-05.json data/weather_cache/issued_2025-12-06.json data/weather_cache/issued_2025-12-07.json data/weather_cache/issued_2025-12-08.json data/weather_cache/issued_2025-12-09.json data/weather_cache/issued_2025-12-10.json data/weather_cache/issued_2025-12-11.json data/weather_cache/issued_2025-12-12.json data/weather_cache/issued_2025-12-13.json data/weather_cache/issued_2025-12-14.json data/weather_cache/issued_2025-12-15.json data/weather_cache/issued_2025-12-16.json data/weather_cache/issued_2025-12-17.json data/weather_cache/issued_2025-12-18.json data/weather_cache/issued_2025-12-19.json data/weather_cache/issued_2025-12-20.json data/weather_cache/issued_2025-12-21.json data/weather_cache/issued_2025-12-22.json data/weather_cache/issued_2025-12-23.json data/weather_cache/issued_2025-12-24.json data/weather_cache/issued_2025-12-25.json data/weather_cache/issued_2025-12-26.json data/weather_cache/issued_2025-12-27.json data/weather_cache/issued_2025-12-28.json data/weather_cache/issued_2025-12-29.json data/weather_cache/issued_2025-12-30.json data/weather_cache/issued_2025-12-31.json data/weather_cache/issued_2026-01-01.json data/weather_cache/issued_2026-01-02.json data/weather_cache/issued_2026-01-03.json data/weather_cache/issued_2026-01-04.json data/weather_cache/issued_2026-01-05.json data/weather_cache/issued_2026-01-06.json data/weather_cache/issued_2026-01-07.json data/weather_cache/issued_2026-01-08.json data/weather_cache/issued_2026-01-09.json data/weather_cache/issued_2026-01-10.json data/weather_cache/issued_2026-01-11.json data/weather_cache/issued_2026-01-12.json data/weather_cache/issued_2026-01-13.json data/weather_cache/issued_2026-01-14.json data/weather_cache/issued_2026-01-15.json data/weather_cache/issued_2026-01-16.json data/weather_cache/issued_2026-01-17.json data/weather_cache/issued_2026-01-18.json data/weather_cache/issued_2026-01-19.json data/weather_cache/issued_2026-01-20.json data/weather_cache/issued_2026-01-21.json data/weather_cache/issued_2026-01-22.json data/weather_cache/issued_2026-01-23.json data/weather_cache/issued_2026-01-24.json data/weather_cache/issued_2026-01-25.json data/weather_cache/issued_2026-01-26.json data/weather_cache/issued_2026-01-27.json data/weather_cache/issued_2026-01-28.json data/weather_cache/issued_2026-01-29.json data/weather_cache/issued_2026-01-30.json data/weather_cache/issued_2026-01-31.json data/weather_cache/issued_2026-02-01.json data/weather_cache/issued_2026-02-02.json data/weather_cache/issued_2026-02-03.json data/weather_cache/issued_2026-02-04.json data/weather_cache/issued_2026-02-05.json data/weather_cache/issued_2026-02-06.json data/weather_cache/issued_2026-02-07.json data/weather_cache/issued_2026-02-08.json data/weather_cache/issued_2026-02-09.json data/weather_cache/issued_2026-02-10.json data/weather_cache/issued_2026-02-11.json data/weather_cache/issued_2026-02-12.json data/weather_cache/issued_2026-02-13.json data/weather_cache/issued_2026-02-14.json data/weather_cache/issued_2026-02-15.json data/weather_cache/issued_2026-02-16.json data/weather_cache/issued_2026-02-17.json data/weather_cache/issued_2026-02-18.json data/weather_cache/issued_2026-02-19.json data/weather_cache/issued_2026-02-20.json data/weather_cache/issued_2026-02-21.json data/weather_cache/issued_2026-02-22.json data/weather_cache/issued_2026-02-23.json data/weather_cache/issued_2026-02-24.json data/weather_cache/issued_2026-02-25.json data/weather_cache/issued_2026-02-26.json data/weather_cache/issued_2026-02-27.json data/weather_cache/issued_2026-02-28.json data/weather_cache/issued_strict_2025-11-30.json data/weather_cache/issued_strict_2025-12-01.json data/weather_cache/issued_strict_2025-12-02.json data/weather_cache/issued_strict_2025-12-03.json data/weather_cache/issued_strict_2025-12-04.json data/weather_cache/issued_strict_2025-12-05.json data/weather_cache/issued_strict_2025-12-06.json data/weather_cache/issued_strict_2025-12-07.json data/weather_cache/issued_strict_2025-12-08.json data/weather_cache/issued_strict_2025-12-09.json data/weather_cache/issued_strict_2025-12-10.json data/weather_cache/issued_strict_2025-12-11.json data/weather_cache/issued_strict_2025-12-12.json data/weather_cache/issued_strict_2025-12-13.json data/weather_cache/issued_strict_2025-12-14.json data/weather_cache/issued_strict_2025-12-15.json data/weather_cache/issued_strict_2025-12-16.json data/weather_cache/issued_strict_2025-12-17.json data/weather_cache/issued_strict_2025-12-18.json data/weather_cache/issued_strict_2025-12-19.json data/weather_cache/issued_strict_2025-12-20.json data/weather_cache/issued_strict_2025-12-21.json data/weather_cache/issued_strict_2025-12-22.json data/weather_cache/issued_strict_2025-12-23.json data/weather_cache/issued_strict_2025-12-24.json data/weather_cache/issued_strict_2025-12-25.json data/weather_cache/issued_strict_2025-12-26.json data/weather_cache/issued_strict_2025-12-27.json data/weather_cache/issued_strict_2025-12-28.json data/weather_cache/issued_strict_2025-12-29.json data/weather_cache/issued_strict_2025-12-30.json data/weather_cache/issued_strict_2025-12-31.json data/weather_cache/issued_strict_2026-01-01.json data/weather_cache/issued_strict_2026-01-02.json data/weather_cache/issued_strict_2026-01-03.json data/weather_cache/issued_strict_2026-01-04.json data/weather_cache/issued_strict_2026-01-05.json data/weather_cache/issued_strict_2026-01-06.json data/weather_cache/issued_strict_2026-01-07.json data/weather_cache/issued_strict_2026-01-08.json data/weather_cache/issued_strict_2026-01-09.json data/weather_cache/issued_strict_2026-01-10.json data/weather_cache/issued_strict_2026-01-11.json data/weather_cache/issued_strict_2026-01-12.json data/weather_cache/issued_strict_2026-01-13.json data/weather_cache/issued_strict_2026-01-14.json data/weather_cache/issued_strict_2026-01-15.json data/weather_cache/issued_strict_2026-01-16.json data/weather_cache/issued_strict_2026-01-17.json data/weather_cache/issued_strict_2026-01-18.json data/weather_cache/issued_strict_2026-01-19.json data/weather_cache/issued_strict_2026-01-20.json data/weather_cache/issued_strict_2026-01-21.json data/weather_cache/issued_strict_2026-01-22.json data/weather_cache/issued_strict_2026-01-23.json data/weather_cache/issued_strict_2026-01-24.json data/weather_cache/issued_strict_2026-01-25.json data/weather_cache/issued_strict_2026-01-26.json data/weather_cache/issued_strict_2026-01-27.json data/weather_cache/issued_strict_2026-01-28.json data/weather_cache/issued_strict_2026-01-29.json data/weather_cache/issued_strict_2026-01-30.json data/weather_cache/issued_strict_2026-01-31.json data/weather_cache/issued_strict_2026-02-01.json data/weather_cache/issued_strict_2026-02-02.json data/weather_cache/issued_strict_2026-02-03.json data/weather_cache/issued_strict_2026-02-04.json data/weather_cache/issued_strict_2026-02-05.json data/weather_cache/issued_strict_2026-02-06.json data/weather_cache/issued_strict_2026-02-07.json data/weather_cache/issued_strict_2026-02-08.json data/weather_cache/issued_strict_2026-02-09.json data/weather_cache/issued_strict_2026-02-10.json data/weather_cache/issued_strict_2026-02-11.json data/weather_cache/issued_strict_2026-02-12.json data/weather_cache/issued_strict_2026-02-13.json data/weather_cache/issued_strict_2026-02-14.json data/weather_cache/issued_strict_2026-02-15.json data/weather_cache/issued_strict_2026-02-16.json data/weather_cache/issued_strict_2026-02-17.json data/weather_cache/issued_strict_2026-02-18.json data/weather_cache/issued_strict_2026-02-19.json data/weather_cache/issued_strict_2026-02-20.json data/weather_cache/issued_strict_2026-02-21.json data/weather_cache/issued_strict_2026-02-22.json data/weather_cache/issued_strict_2026-02-23.json data/weather_cache/issued_strict_2026-02-24.json data/weather_cache/issued_strict_2026-02-25.json data/weather_cache/issued_strict_2026-02-26.json data/weather_cache/issued_strict_2026-02-27.json data/weather_cache/issued_strict_2026-02-28.json data/weather_cache/previous_runs_2024-03-01_2024-12-31.json data/weather_cache/previous_runs_2025-01-01_2025-12-31.json data/weather_cache/previous_runs_2026-01-01_2026-01-31.json docker-compose.yml docs/architecture.md docs/experiments.md docs/proverka-zapuska.md docs/tz-organizatorov.txt examples/.gitkeep examples/forecast_2026-02-04.csv examples/forecast_2026-02-05.csv examples/journal_fragment_2026-02-05.md examples/peresvet_2026-02-04_2026-02-05.md examples/validation_summary.md model/__init__.py model/artifacts/metrics.json model/artifacts/model_q10.joblib model/artifacts/model_q50.joblib model/artifacts/model_q90.joblib model/artifacts/power_curve.joblib model/artifacts/report.md model/artifacts/validation.csv model/artifacts_dec2025/metrics.json model/artifacts_dec2025/report.md model/artifacts_dec2025_lead24/metrics.json model/artifacts_dec2025_lead24/report.md model/artifacts_lead24/metrics.json model/artifacts_lead24/report.md model/features.py model/predict.py model/prepare.py model/train.py model/weather.py output/.gitkeep requirements.txt tests/test_scenario.py web/__init__.py web/app.py web/static/index.html
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.