wind_power_forecast / windagent
Агент почасового прогноза выработки двух ветровых турбин на 24–48 часов по архивным оперативным прогнозам погоды NOAA GFS; для демонстрации есть…
О проекте
Команда: Build_your_dream
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Агент почасового прогноза выработки двух ветровых турбин на 24–48 часов по архивным оперативным прогнозам погоды NOAA GFS; для демонстрации есть режим с кэшем Open-Meteo. Есть CLI, аудит данных, веб-страница и тесты.
Как устроено
Из архива NOAA GFS 0,25° через HTTP Range скачиваются GRIB-сообщения: ветер на 100 м и температура на 2 м. Для каждого выпуска проверяется, что он был опубликован до момента расчёта (Last-Modified, ETag, задержка 8 ч), так что утечки будущих данных нет. Телеметрия агрегируется в часы только при наличии всех шести 10-минутных замеров. Для каждой турбины сравниваются градиентный бустинг, монотонная кривая «ветер→мощность» и среднее; модель выбирается на последнем хронологическом блоке. Агент работает по явным правилам без LLM: наблюдает входы, выбирает допустимый выпуск, обучает модель, прогнозирует, проверяет результат, сохраняет его или отказывает; при изменении входов пересчитывает и хранит версии в revisions/.
Ключевые решения
- gradient boosting
- CatBoost
- monotone power curve
- NOAA GFS GRIB via HTTP Range
- ecCodes
- leakage control (as-issued forecasts)
- chronological holdout
- rule-based agent controller
Особенности
Строго проверяется, что погодный прогноз был доступен на исторический момент: сверяются Last-Modified и ETag каждого GRIB-объекта, заложена консервативная задержка 8 ч. README честно отмечает, что февральских фактов нет и hindcast-данные Open-Meteo условиям не соответствуют. Хороший пример защиты от утечки данных в задачах прогнозирования.
Стек
Python · ecCodes · Docker · TOML config · HTML/JS/CSS · pytest
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-50369127-build-your-dream.
README
README.mdAgentic AI для почасового прогноза ВЭС
Python-проект для двух турбин: получение архивных погодных выпусков, подготовка телеметрии, обучение, прогноз на 24–48 часов, анализ результата и повторный расчёт при изменении допустимых входных данных.
Основной источник — исходные оперативные прогнозы NOAA GFS. Отдельный режим Open-Meteo воспроизводит демонстрацию из предоставленного кэша. Его февральские IFS-данные относятся к hindcasts и не подтверждают соблюдение требования «использовать прогноз, доступный на исторический момент».
Оба предоставленных CSV фактически заканчиваются 31 января 2026 года, хотя их имена включают февраль. Февральские факты отсутствуют; MAE/RMSE февраля без дополнительных измерений не рассчитываются. Номинальные мощности не указаны: основная выдача — нормализованная средняя мощность каждого часа.
Установка
Для наиболее простой установки GRIB-зависимостей используйте Python 3.11–3.13. Базовый проект также поддерживает 3.14; для Windows 3.14 предусмотрен отдельный вариант подключения библиотеки ecCodes ниже. Команды PowerShell выполняются из корня проекта.
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e '.[dev,gfs]'
В новой копии проекта положите файлы в data/raw/turbine_1.csv и
data/raw/turbine_2.csv. Основной шаблон config/settings.example.toml уже
настроен на NOAA GFS. Если нужен собственный файл настроек:
Copy-Item config/settings.example.toml config/settings.toml
Не перезаписывайте существующую пользовательскую конфигурацию этой командой.
Без config/settings.toml CLI автоматически использует основной шаблон.
Пути, координаты, даты, веса и временные соглашения находятся в TOML; .env
не нужен и не читается. В текущей рабочей папке исходные CSV уже скопированы.
Основной расчёт: NOAA GFS
В основной конфигурации заданы provider = "noaa-gfs", model = "gfs_0p25",
require_as_issued = true. Первый запуск требует интернета и работающего ecCodes.
.\.venv\Scripts\python.exe -m wind_power_forecast audit-data
.\.venv\Scripts\python.exe -m wind_power_forecast forecast-day --date 2026-01-31
.\.venv\Scripts\python.exe -m wind_power_forecast forecast-range
.\.venv\Scripts\python.exe -m wind_power_forecast evaluate
forecast-range по умолчанию выполняет 29 расчётов: с 31 января по 28 февраля
включительно. Каждый сохраняет 48 часов, включая часы за пределами тестового
месяца. После завершения диапазона submission.csv содержит 672 февральских
часа с прогнозами обеих турбин: для каждого часа выбирается выпуск предыдущего
местного календарного дня. all_forecasts.csv содержит все пары «время выпуска —
целевой час», попадающие в февраль, включая пересекающиеся горизонты. Для прогноза
на сутки задайте project.horizon_hours = 24.
После успешного сетевого расчёта тот же диапазон можно воспроизвести из кэша:
.\.venv\Scripts\python.exe -m wind_power_forecast forecast-range --offline
Неполный кэш вызывает отказ или выбор допустимого более раннего выпуска. Импорт Open-Meteo ZIP не создаёт кэш NOAA GFS. Команды выше описывают запуск; наличие полного результата подтверждается файлами конкретного расчёта и его журналом, а не самим наличием исходного кода.
Как проверяется погодная доступность
Источник — оперативный архив NOAA GFS
с сеткой 0,25°. Провайдер скачивает отдельные GRIB-сообщения через HTTP Range:
компоненты ветра на 100 м и температуру на 2 м. Обе турбины используют ближайшую
ячейку 43.75, 78.5; модели мощности обучаются отдельно.
Кандидаты на выпуск ограничиваются консервативной задержкой восемь часов.
Дополнительно для каждого индекса и GRIB-объекта проверяется
run_time <= Last-Modified <= issued_at. Поля одного файла должны иметь одинаковые
ETag и Last-Modified. Проверяются исходное и целевое время GRIB, переменная,
уровень, единицы, почасовая заблаговременность и координаты. Сохраняются адреса,
хэши, байтовые диапазоны и сведения о публикации. Позднейшие копии, реанализ и
неполные горизонты не подставляются вместо разрешённого прогноза.
Для первого расчёта в 18 UTC 31 января начальный кандидат — выпуск 06 UTC,
а 48 целевых часов соответствуют исходным прогнозам f013–f060, без временной
интерполяции. Сетевая проверка индекса 2026-01-31/06/f013.idx показала публикацию
в 09:34:13 UTC, до момента расчёта. Проверка одного индекса сама по себе
не означает завершения полного месячного расчёта.
Время и защита от утечки
По умолчанию расчёт выполняется в 23:00 Asia/Almaty, горизонт начинается
в 00:00 следующих суток. В феврале 2026 года это 18:00 UTC и 19:00 UTC
соответственно. Часовой пояс телеметрии и начало 10-минутного интервала —
неподтверждённые предположения, которые должен уточнить владелец данных.
Архивный проект предполагал UTC; его соглашение не является подтверждением.
Часовая цель пригодна только при наличии всех шести 10-минутных измерений.
Пропуски не заполняются нулями; неоднозначные отметки при смене часового пояса
исключаются с записью в аудит. В обучение попадают только завершённые часы
available_at <= issued_at и только цели до границы training_end_date.
Например, для расчёта 31 января в 23:00 последний час 23:00–24:00 ещё недоступен.
Добавление февральских фактов в CSV не разрешает использовать их для обучения.
Модель, оценка и агент
Для каждой турбины сравниваются градиентный бустинг, монотонная кривая «ветер → мощность» и средняя мощность обучающей выборки. Выбор выполняется на последнем хронологическом блоке, затем модель переобучается на всей разрешённой истории. Входы — ветер, температура и календарные признаки.
Эта внутренняя проверка использует измеренную погоду, поэтому её MAE характеризует выбор модели мощности и не является независимой оценкой прогноза на 24–48 часов. Для проверки всей связки на январе с обучением до января:
.\.venv\Scripts\python.exe -m wind_power_forecast validate-history
Первый запуск загружает январские GFS-выпуски; --offline подходит после
подготовки соответствующего кэша. Оценка сравнивает прогноз с полными наблюдаемыми
часами отдельно для первого и второго дня, по турбинам и по станции. Для станции
требуются факты всех турбин в один час; базовые прогнозы среднего и последнего
доступного часа агрегируются теми же весами. При отсутствии февральских фактов
результат evaluate — unavailable_no_test_actuals.
Агент — автономный контроллер с явными правилами: наблюдение входов → выбор доступного выпуска → обучение или повторное использование модели → прогноз → проверка сетки и диапазона → сохранение либо отказ. При сбоях выполняются повторные запросы и проверка более раннего допустимого выпуска. LLM для этой политики не требуется.
.\.venv\Scripts\python.exe -m wind_power_forecast agent --date 2026-01-31 --offline --cycles 2 --interval-seconds 1
.\.venv\Scripts\python.exe -m wind_power_forecast agent --date 2026-01-31 --refresh --cycles 5 --interval-seconds 60
Неизменившиеся входы дают unchanged; изменение допустимой истории, погоды,
настроек или кода вызывает пересчёт. Предыдущие версии остаются в revisions/.
Исторический момент расчёта фиксирован: поздний выпуск не включается задним числом.
Демонстрация по кэшу Open-Meteo
Этому режиму достаточно зависимостей .[dev], ecCodes не нужен. Он запускается
только с явно указанной демонстрационной конфигурацией:
.\.venv\Scripts\python.exe -m wind_power_forecast import-weather-cache --config config/settings.openmeteo.example.toml --archive 'D:\Загрузки\Telegram Desktop\wind-forecast-hackathon.zip'
.\.venv\Scripts\python.exe -m wind_power_forecast forecast-range --config config/settings.openmeteo.example.toml --offline
.\.venv\Scripts\python.exe -m wind_power_forecast evaluate --config config/settings.openmeteo.example.toml
Официальная документация Open-Meteo Single Runs
описывает ранний IFS-архив как hindcasts цикла 49R1, а переход на цикл 50R1 —
с 12 мая 2026 года 06 UTC. Поэтому февральская демонстрация не считается строгим
воспроизведением исходно опубликованных прогнозов. run, контрольная сумма
и предполагаемая задержка восемь часов не доказывают обратного.
В импортированном кэше преимущественно выпуски 12 UTC; при расчёте в 18 UTC
выпуск того же дня ещё не разрешён политикой +8 часов, поэтому выбирается более
ранний подходящий выпуск. В демонстрационном шаблоне require_as_issued = false;
основной режим GFS этого послабления не использует.
Файлы результатов
| Назначение | NOAA GFS | Демонстрация Open-Meteo |
|---|---|---|
Почасовые прогнозы и submission.csv | data/processed/gfs_forecasts/ | data/processed/forecasts/ |
run_YYYY-MM-DD.json, события агента, ошибки | reports/gfs_runs/ | reports/runs/ |
| Оценка прогнозов | reports/gfs_runs/evaluation.json | reports/runs/evaluation.json |
| Погодные данные | Кэш провайдера внутри data/external/weather/ | Импортированные ответы внутри data/external/weather/ |
forecast_YYYY-MM-DD.csv хранит полный горизонт, issued_at, lead_hours и
выпуск погоды для каждой турбины. Журнал содержит границу обучения, выбор модели,
доказательства доступности погодных входов, хэши и результаты проверок.
reports/data_audit.json и reports/turbine_*_audit.json относятся к телеметрии.
validate-history сохраняет результаты отдельно по источнику:
reports/historical_validation/noaa-gfs/ для основного режима и
reports/historical_validation/open-meteo-single-runs/ для демонстрационного.
Внутри находятся forecasts/, runs/ и итоговая оценка runs/evaluation.json.
Запуски двух источников не перезаписывают отчёты друг друга.
При неизвестных номинальных мощностях weight = 1 задаёт индекс станции
с равными весами. Если известны мощности, укажите capacity_mw для обеих
турбин: появятся суммарные МВт и МВт·ч за час, а нормализованный прогноз
будет взвешен по номинальной мощности.
Windows Python 3.14: внешняя библиотека ecCodes
Если Python-пакет eccodes установлен, но загрузка нативной библиотеки на
Windows 3.14 не работает, используйте включённый
scripts/bootstrap_eccodes_windows.py. Он проверяет закреплённую SHA-256
официального wheel и извлекает только DLL и лицензии. Python-модули и .pyd
другой версии интерпретатора не устанавливаются и не импортируются.
.\.venv\Scripts\python.exe -m pip download eccodes==2.48.0 --platform win_amd64 --python-version 313 --implementation cp --abi cp313 --only-binary=:all: --no-deps --dest .cache/eccodes-wheels
.\.venv\Scripts\python.exe scripts/bootstrap_eccodes_windows.py --wheel .cache/eccodes-wheels/eccodes-2.48.0-cp313-cp313-win_amd64.whl
Скрипт создаёт .cache/eccodes-native/ и выполняет проверку кодирования/декодирования
GRIB2; эта проверка успешно выполнена в текущем Windows-окружении с Python 3.14.
Провайдер автоматически подключает проверенные DLL только внутри своего
процесса. Не устанавливайте CP313 wheel через pip install в Python 3.14.
На системах с обычной рабочей установкой ecCodes этот шаг не требуется.
Проверки и подробная методика
.\.venv\Scripts\python.exe -m pytest -q
.\.venv\Scripts\python.exe -m ruff check src tests scripts
Тесты проверяют временные границы, исключение будущих целей, полноту часов, отдельные модели турбин, метрики станции, погодную доступность, повторные расчёты и целостность сохранённых прогнозов. Проверенные свойства исходных файлов, допущения и различия двух погодных источников описаны в docs/DATA_AND_METHOD.md.
Альтернативная реализация windagent
Wind Agent · Build your dream
Локальная система для кейса «Agentic AI для прогнозирования выработки ВЭС»: почасовой прогноз нормализованной мощности двух турбин на 24–48 часов, журнал решений, проверка входных данных и экспорт.
Подключён реальный проект команды: исходная телеметрия, архив погодных запусков ECMWF, модель CatBoost и сохранённые прогнозы. Данные заканчиваются 31 января 2026, 23:50; фактов февраля нет. Часовой пояс исходных CSV и историческая публикация погоды пока не подтверждены, поэтому результаты не обозначаются готовыми к конкурсной сдаче.
Открыть уже подключённый проект
Нужен Python 3.11+. Основное приложение работает без внешних библиотек; для нового запуска CatBoost используется отдельная среда, описанная ниже. Выполняйте команды из корня репозитория.
python -B -m windagent doctor
python -B -m windagent serve
Откройте http://127.0.0.1:8080. В панели появятся «Реальные данные · архив проекта», источник «Кеш проекта · ECMWF» и время UTC. Для другого порта используйте serve --port 8081; остановка — Ctrl+C.
doctor показывает подключённые данные и проверяет доступность среды модели без сетевых запросов и без запуска прогноза. Поле can_recompute_project=true означает, что проект подключён и CatBoost доступен; это не проверка каждого входного файла и не подтверждение нового обучения. Существующее состояние загружается автоматически: повторять импорт при каждом старте не нужно. Если сервер уже работает, откройте его адрес вместо запуска второго процесса.
Начните с памятки команды: задача простыми словами, цикл агента, речь на 60–90 секунд и проверка перед показом.
Импортировать проект впервые
Этот шаг нужен для пустого рабочего пространства или осознанной замены подключённого проекта. Остановите сервер перед изменением его рабочего пространства.
python -B -m windagent import-project "D:\Загрузки\Telegram Desktop\wind-forecast-hackathon.zip"
Импорт проверяет контрольные суммы и копирует только необходимые данные, отчёты, погодный кеш и native-модель catboost.cbm. Python-скрипты архива не запускаются; joblib/pickle не загружаются. При необходимости сверьте отдельные исходные CSV с копиями внутри ZIP:
python -B -m windagent import-project "D:\Загрузки\Telegram Desktop\wind-forecast-hackathon.zip" --turbine-1 "D:\данные\turbine_1.csv" --turbine-2 "D:\данные\turbine_2.csv"
Передаются оба параметра --turbine-1 и --turbine-2. Используйте полный архив wind-forecast-hackathon.zip: модуль 2 отдельно не содержит обученной модели.
Результаты хранятся в runtime/. Если Windows запрещает запись туда, используется отдельный каталог в %TEMP%/wind-agent/; точный путь выводится в терминале и /api/state. Можно задать свою папку: python -B -m windagent --workspace "D:\данные\wind-agent" serve. Параметр --workspace ставится перед командой; все команды одного сценария должны использовать ту же папку. Не запускайте CLI и веб-сервер одновременно над одним рабочим пространством.
Новый расчёт или сохранённый результат
Готовый показ читает уже сохранённые данные. Новый прогноз запускает существующую обученную модель. Независимое обучение заново подбирает её параметры по истории и требует отдельной проверки — эти три действия различаются.
| Статус результата | Что произошло |
|---|---|
execution=recomputed | Наш отдельный worker загрузил native CBM-модель и выполнил CatBoost на проверенных погодных признаках |
execution=saved_archive | Среда модели не найдена; прочитан готовый прогноз того же выпуска из архива |
reused=true | Повторно использован ранее сохранённый результат с теми же входами |
Панель явно показывает «Сохранённый расчёт из архива», если модель заново не запускалась. При отсутствии подходящего сохранённого выпуска выдаётся ошибка. Ошибка нового расчёта не маскируется успешным чтением старого результата.
Подтверждён первый новый запуск: native CatBoost выдал 96 значений для выпуска 31 января 23:00 UTC с горизонтом 48 часов; максимальное отличие от сохранённых прогнозов — 0. Это проверка одного выпуска. Независимое обучение и новый расчёт всех 29 выпусков этим результатом не подтверждаются; актуальные проверки — в docs/VERIFICATION.md.
Если doctor уже показывает готовую среду, повторно устанавливать зависимости не нужно. Для нового прогноза остановите сервер и выполните:
python -B -m windagent forecast --mode project --as-of "2026-01-31T23:00:00Z" --hours 48 --refresh
Для нового расчёта подготовьте Python 3.12 и отдельную среду с версиями зависимостей из исходного проекта:
py -3.12 -m venv .venv-model
.\.venv-model\Scripts\python.exe -m pip install -r requirements-model.txt
Создание среды требует установленного Python 3.12; установка библиотек — интернета. Основной сервер продолжает работать на своём Python без CatBoost. Локальная .venv-model обнаруживается автоматически. Для уже подготовленной среды укажите путь перед запуском сервера или CLI:
$env:WIND_AGENT_MODEL_PYTHON = "D:\среды\wind-model\Scripts\python.exe"
python -B -m windagent forecast --mode project --as-of "2026-01-31T23:00:00Z" --hours 48 --refresh
В указанной среде должны быть установлены зависимости из requirements-model.txt. Подключение CBM не переобучает модель. Фактически выполненные проверки нового расчёта и их ограничения фиксируются отдельно в docs/VERIFICATION.md.
.env.example — справочный пример переменных. Приложение не читает .env автоматически: задавайте WIND_AGENT_MODEL_PYTHON в PowerShell, как показано выше, до запуска процесса.
Независимое повторное обучение
Это отдельный исследовательский запуск, а не обязательный шаг открытия панели. scripts/retrain_project.py проверяет исходные хеши, собирает признаки из копии кеша и запускает локальный код обучения в новой папке. Активный проект читается без изменения; исходный joblib не загружается.
В подготовленной среде Python 3.12 нужны requirements-models.txt с буквой s: это полный набор для обучения. Файл requirements-model.txt без s предназначен только для нового прогноза готовой модели.
.\.venv-model\Scripts\python.exe -m pip install -r requirements-models.txt
.\.venv-model\Scripts\python.exe -B scripts/retrain_project.py --output "$env:TEMP/wind-agent-retraining"
Если модельная среда находится в другой папке, используйте её Python. Для нестандартной активной папки данных добавьте --workspace с путём из doctor. Скрипт создаёт отдельный каталог эксперимента и reproduction_summary.json. Наличие скрипта не означает, что обучение уже воспроизведено; подтверждённый результат должен быть отдельно записан в docs/VERIFICATION.md.
Февраль и экспорт
Для сценария проекта принят выпуск ежедневно в 23:00 UTC и горизонт 48 часов. UTC — сохранённое допущение архива, а не подтверждённый пояс исходной телеметрии. Если --as-of не указан, берётся отсечка активного сценария; явное время удобно для воспроизведения.
Остановите веб-сервер перед CLI-командами в той же папке результатов:
python -B -m windagent backtest --mode project --hours 48
python -B -m windagent export --kind backtest --output "$env:TEMP/wind-agent-all-origins.csv"
python -B -m windagent export --kind submission --output "$env:TEMP/wind-agent-submission.csv"
python -B -m windagent export --kind forecast --output "$env:TEMP/wind-agent-last-forecast.csv"
Сценарий включает 29 выпусков: 31 января и 1–28 февраля. Мартовские часы последнего выпуска сохраняются в его прогнозе, но исключаются из февральского экспорта.
backtest— все пары «момент выпуска — целевой час» внутри февраля; перекрывающиеся горизонты остаются отдельными строками.submission— первые 24 часа каждого выпуска: одна строка на турбину и час, 1344 строки = 672 × 2. Формат нужно сверить с требованиями организаторов.forecast— последний отдельный выпуск.
В режиме project данные погоды читаются из проверенного локального кеша. Кнопка «Проверить кеш проекта» и --refresh проверяют входы и получение результата; новую погоду из интернета они не скачивают.
Данные и оценка качества
| Проверено | Результат |
|---|---|
| Сырые 10-минутные записи | 142 360 у турбины 1; 149 499 у турбины 2 |
| Период исходных CSV | 11.03.2023 — 31.01.2026 23:50 |
| Полные часы, по шесть отсчётов | 23 667 + 24 785 = 48 452 строки |
| Выборка обучения финальной CatBoost | 36 632 строки согласно отчёту проекта |
| Январские сохранённые прогнозы для проверки | 2 928 строк |
| Январский MAE / RMSE | 0,18603 / 0,25716 доли нормализованной мощности |
| Фактическая мощность февраля | Не предоставлена |
Январские ошибки арифметически перепроверены по сохранённым прогнозам и фактам: MAE 0.18603061746927146, RMSE 0.25715671703426574. Это примерно 18,60 и 25,72 процентного пункта, а не «точность 81,4%». Январская модель независимо заново не обучалась. Проверка арифметики отчёта не равна воспроизведению обучения и не подтверждает качество за февраль.
В панели январские метрики CatBoost и базовых моделей показаны отдельно от проверки простой кривой мощности на измеренном ветре. Интервалы проекта — эмпирические полосы с целевым покрытием 80%, настроенные на январских ошибках; фактическое покрытие будущих значений не гарантируется.
Подробные проверки: аудит исходных CSV, аудит архива и Git bundle.
Погодные ограничения
Проект использует сохранённые запросы к Open-Meteo Single Runs API с конкретным run: ветер на 10/100 м, направление, температуру и давление. Это не замена прогноза фактической погодой.
Однако run_time означает инициализацию модели. Принятая в архиве доступность run_time + 8 часов — допущение. Исторический журнал публикации отсутствует; оперативное происхождение раннего ECMWF-архива, включая вопрос hindcast, не подтверждено. Поэтому полное соответствие требованию «погода была доступна тогда» пока не установлено, даже если технические проверки времени проходят.
Также нужно подтвердить UTC и смысл исходной временной метки: начало или конец 10-минутного интервала. Исправление этих предположений потребует повторного совмещения данных, обучения и оценки. Подробности — docs/WEATHER.md и docs/CASE.md.
Мощность показывается в долях или процентах. МВт и МВт·ч нельзя получить без номинальных мощностей турбин. «Среднее двух турбин» — арифметическое среднее нормализованных значений.
Базовые режимы: демо и новый CSV
Синтетическое демо работает без интернета и внешних библиотек. Используйте отдельную папку, чтобы сохранить реальный проект:
python -B -m windagent --workspace "$env:TEMP/wind-agent-demo" demo --backtest
python -B -m windagent --workspace "$env:TEMP/wind-agent-demo" serve --port 8081
В пустой панели можно нажать «Открыть демо». Его результаты явно помечены синтетическими и не оценивают реальную станцию.
Веб-импорт обычного CSV обучает простую кривую мощности. Нужны обе турбины и поля:
timestamp,turbine_id,wind_speed,temperature,power
2026-01-01T00:00:00+05:00,1,5.2,-4.1,0.14
2026-01-01T00:00:00+05:00,2,5.4,-4.0,0.15
Это пример формата, а не достаточная выборка: нужно минимум 48 доступных часов каждой турбины. Мощность — 0–1; для процентов явно задайте --power-scale 100. Смещение --timezone-offset применяется только к датам без указанного пояса. Обычные часовые CSV должны корректно отражать доступность измерений.
python -B -m windagent --workspace "$env:TEMP/wind-agent-csv" import "D:\данные\history.csv" --timezone-offset 5 --power-scale 1
python -B -m windagent --workspace "$env:TEMP/wind-agent-csv" forecast --mode archive --as-of "2026-01-31T23:00:00+05:00" --hours 48
Отдельные CSV организаторов с русскими заголовками и 10-минутными отсчётами поддерживает import-turbines:
python -B -m windagent --workspace "$env:TEMP/wind-agent-csv" import-turbines "D:\данные\turbine_1.csv" "D:\данные\turbine_2.csv" --timezone-offset 0 --interval-convention start
Значения 0 и start здесь явно повторяют неподтверждённые допущения проекта. Этот путь импортирует телеметрию и обучает базовую модель; для готовой CatBoost и её погоды используйте import-project.
Режим archive обращается к погодному API и требует интернет. Его базовая задержка — 12 часов из config.json; она также не является доказательством исторической публикации. Базовое демо сохраняет свой сценарий UTC+5. Кривая мощности оценивается с измеренной погодой, поэтому её ошибка не равна ошибке полной цепочки с погодным прогнозом.
Агент, проверки и следующие шаги
Управляющий агент работает по правилам: проверяет историю и погоду, выбирает допустимый выпуск, запускает модель либо явно возвращает сохранённый результат, анализирует горизонт и сохраняет версии входов. В текущем интерфейсе LLM не требуется. Для режима project используется импортированная модель; для базового CSV выполняется обучение и выбор кривой по временной проверке.
python -B scripts/test_app.py
node --check web/app.js
Node нужен только для необязательной проверки JavaScript. Тесты с подменёнными ответами API не доказывают историческую доступность внешнего источника. Ключевые модули: windagent/project.py — импорт проекта и кеш, catboost_worker.py — новый расчёт CBM, telemetry.py — исходная телеметрия, agent.py — цикл и экспорт, web/ — панель.
Перед сдачей нужно подтвердить временные предположения и происхождение погоды, воспроизвести обучение и январскую проверку, согласовать метрику и формат сдачи. При появлении отдельных фактов февраля их можно передать только в оценку:
python -B -m windagent evaluate --forecast "$env:TEMP/wind-agent-all-origins.csv" --actuals "D:\данные\february-actuals.csv" --timezone-offset 0
Факты не добавляются в обучение. Сценарий показа — docs/DEMO.md.
Исследовательский бэкенд src/
В репозитории также сохранён исходный исследовательский бэкенд команды: обучение CatBoost, построение признаков, сетевое получение погоды и отдельный контроллер. Его команды и зависимости описаны в README.research.md. Он использует config/config.yaml; веб-приложение windagent использует config.json и состояние своего рабочего пространства. Эти конфигурации не взаимозаменяемы.
VERIFICATION.md и reports/ содержат отчёты исходного проекта. Независимые проверки текущей интеграции и фактический статус среды описаны в docs/VERIFICATION.md. Дополнительные тесты test_pipeline.py и test_models_agent.py требуют исследовательских зависимостей.
Авторы коммитов
История коммитов
- 2026-09-23 17:26Merge branch 'main' of https://github.com/BAITC-Hacks/hack-50369127-build-your-dreamA1cce
- 2026-09-23 17:21реррерA1cce
- 2026-09-23 17:11последние изменения в проекте ехнический цикл работает. Для соответствия конкурсному условию всё ещё нужны подтверждения часового пояса телеметрии и исторического времени публикации погоды.A1cce
- 2026-09-23 16:53ньеееееееееоA1cce
- 2026-09-23 16:44Merge branch 'main' of https://github.com/BAITC-Hacks/hack-50369127-build-your-dreamA1cce
- 2026-09-23 16:38н5н5нA1cce
- 2026-09-23 16:26Обновлён дизайн сайта и унифицированы компоненты интерфейсаA1cce
- 2026-09-23 16:25Обновлён дизайн сайта и унифицированы компоненты интерфейсаA1cce
Все коммиты (10)
- 2026-09-23 16:04Clarify source-only publication while offline data upload awaits authorizationalihanzakianov771-collab
- 2026-09-23 15:56Add wind forecasting source code, configuration, tests and documentationalihanzakianov771-collab
Структура репозитория (104 файлов)
.dockerignore .env.example .gitattributes .gitignore Dockerfile README.md README.research.md VERIFICATION.md config.json config/config.yaml config/settings.example.toml config/settings.openmeteo.example.toml data/example.csv data/external/.gitkeep data/processed/.gitkeep data/raw/.gitkeep docs/ARCHIVE_AUDIT.md docs/CASE.md docs/DATA_AND_METHOD.md docs/DATA_AUDIT.md docs/DATA_PIPELINE.md docs/DEMO.md docs/GITHUB.md docs/PITCH.md docs/TEAM_GUIDE.md docs/VERIFICATION.md docs/WEATHER.md logs/.gitkeep pyproject.toml reports/.gitkeep reports/integration_verification.json reports/replay_report.json reports/training_report.json reports/verification.json requirements-lock-py312.txt requirements-model.txt requirements-models.txt requirements.txt run.py scripts/bootstrap_eccodes_windows.py scripts/retrain_project.py scripts/test_app.py src/__init__.py src/agent/__init__.py src/agent/planner.py src/agent/run.py src/data/__init__.py src/data/build_features.py src/data/fetch_weather.py src/data/preprocess_telemetry.py src/models/__init__.py src/models/estimators.py src/models/features.py src/models/train.py src/report.py src/utils/__init__.py src/utils/common.py src/verify.py src/wind_power_forecast/__init__.py src/wind_power_forecast/__main__.py src/wind_power_forecast/cli.py src/wind_power_forecast/data.py src/wind_power_forecast/evaluation.py src/wind_power_forecast/features.py src/wind_power_forecast/forecast.py src/wind_power_forecast/gfs.py src/wind_power_forecast/model.py src/wind_power_forecast/native.py src/wind_power_forecast/settings.py src/wind_power_forecast/weather.py tests/.gitkeep tests/__init__.py tests/test_agent.py tests/test_data.py tests/test_data_model.py tests/test_evaluation_farm.py tests/test_forecast.py tests/test_gfs.py tests/test_model.py tests/test_models_agent.py tests/test_native.py tests/test_pipeline.py tests/test_project.py tests/test_settings_weather.py tests/test_telemetry.py tests/test_weather.py tests/test_weather_archive.py web/app.js web/index.html web/styles.css windagent/__init__.py windagent/__main__.py windagent/agent.py windagent/catboost_worker.py windagent/common.py windagent/data.py windagent/demo.py windagent/doctor.py windagent/evaluate.py windagent/model.py windagent/project.py windagent/server.py windagent/telemetry.py windagent/weather.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.