AAYMA
RU
Войти

wind_power_forecast / windagent

Агент почасового прогноза выработки двух ветровых турбин на 24–48 часов по архивным оперативным прогнозам погоды NOAA GFS; для демонстрации есть…

Рабочий MVP
Команда «Build_your_dream» 15💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

Agentic 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.csvdata/processed/gfs_forecasts/data/processed/forecasts/
run_YYYY-MM-DD.json, события агента, ошибкиreports/gfs_runs/reports/runs/
Оценка прогнозовreports/gfs_runs/evaluation.jsonreports/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
Период исходных CSV11.03.2023 — 31.01.2026 23:50
Полные часы, по шесть отсчётов23 667 + 24 785 = 48 452 строки
Выборка обучения финальной CatBoost36 632 строки согласно отчёту проекта
Январские сохранённые прогнозы для проверки2 928 строк
Январский MAE / RMSE0,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 требуют исследовательских зависимостей.

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

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

A1cce 8alihanzakianov771-collab 2

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

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

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

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