AAYMA
RU
Войти

Прогноз выработки ВЭС

Агент ежедневно выпускает почасовой прогноз на 48 ч для двух турбин с коридором p10/p50/p90 по архивным прогнозам погоды Open-Meteo, анализирует…

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

О проекте

Команда: 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-запуск одной командой.

Основной сценарий

  1. Пользователь выбирает дату выпуска D (31.01.2026 … 28.02.2026) и нажимает «Сформировать прогноз».
  2. Агент получает из 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).
  3. Агент собирает признаки и запускает модель.
  4. Агент записывает 96 строк (48 часов × 2 турбины) в output/forecasts/forecast_<D>.csv.
  5. Агент анализирует результат: сумма нормализованной мощности по часам за каждые сутки (нормализованная мощность × час), изменения к прогнозу предыдущего дня на те же часы (это и есть пересчёт при обновлении входных данных: вчера эти часы шли с упреждением 72 ч, сегодня 48 ч), пары час–турбина низкой уверенности (флаг confidence), часы с ветром выше 25 м/с (гипотеза штатной остановки), ошибка за вчера по факту, если факт есть (январь).
  6. Агент пишет сводку дня в 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 (основной)Модель MAERMSEФакт внутри p10–p90Кривая мощности MAEPersistence MAE
Все 48 ч0.1600.24082.6 %0.1770.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Климатология
MAE0.2060.2150.3760.346
RMSE0.3000.3170.491—
Факт внутри p10–p9076.5 %69.9 %——
День 1 / День 2, MAE0.197 / 0.2150.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_OFFLINE1 запрещает обращения к 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.

  1. Тест (обучение на срезе с 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; длительность не является критерием.

  1. Один день агента:
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 могут отличаться).

  1. Январские и декабрьские метрики в отдельную папку (веса те же, что в 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 секунд до двух минут в зависимости от загрузки машины.

  1. Через 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 проверяется после полного прогона (объёмы выше).

  1. Кривой ввод в командной строке: ... -m agent.run --date 2026-03-05 печатает, что дата вне периода 31.01–28.02.2026, код выхода 2 ($LASTEXITCODE в PowerShell, echo $? в bash).

  2. Сравнительный эксперимент 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.pyoutput/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 с системным запасным. Ранее написанного кода, шаблонов и чужих решений в проекте нет.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
40
Авторы
1
Файлы
240
Ветки
1

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

Timur Alpimov 40

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

  • 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 комментариев

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

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