AAYMA
RU
Войти

Vax-Dealers: прогноз ВЭС

CLI-агент почасового 48-часового прогноза нормализованной мощности двух ветротурбин по архивным прогнозам погоды с ежедневными выпусками за февраль…

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

О проекте

Команда: Vax-Dealers
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Рабочий MVP

Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным

Суть

CLI-агент почасового 48-часового прогноза нормализованной мощности двух ветротурбин по архивным прогнозам погоды с ежедневными выпусками за февраль 2026.

Как устроено

prepare собирает полные часы из 10-минутных SCADA-записей и проводит аудит данных/часового пояса; fetch загружает архивные прогнозы GFS через Open-Meteo Previous Runs по координатам турбин; train обучает HistGradientBoostingRegressor (обучение до декабря, подбор на декабре, проверка и калибровка интервалов неопределённости на январе); replay формирует 29 ежедневных 48-часовых выпусков только на прогнозной погоде без утечки фактов, при нехватке погоды — fallback на климатологию. Режим watch повторяет расчёт по расписанию, журнал событий в JSONL.

Ключевые решения

  • HistGradientBoostingRegressor
  • Open-Meteo Previous Runs (GFS)
  • временной сплит без утечки
  • интервалы неопределённости
  • climatology fallback
  • timezone audit

Метрики

MAE (горизонт 1–24 ч, январь): 0.205 турбина 1, 0.207 турбина 2 (доля номинальной мощности)

Особенности

Честная постановка без утечки: в признаки идут только архивные прогнозные значения погоды с фиксированным опережением и 12-часовым запасом; аудит часового пояса SCADA с фиксацией смещения в модели; явные ограничения регламента в таблице.

Стек

Python · scikit-learn · pandas · joblib · Open-Meteo API


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-e935193d-vax-dealers.

README

README.md

Vax-Dealers: запуск прогноза ВЭС

Проект строит почасовой прогноз нормализованной мощности двух турбин на 48 часов. Он воспроизводит 29 ежедневных выпусков с 31 января по 28 февраля 2026 года и формирует отдельную таблицу на все 672 часа февраля для каждой турбины. Число от 0 до 1 — доля номинальной мощности, а не МВт·ч.

Схема работы: CSV турбин → полные часы измерений → архивные прогнозы погоды по координатам → обучение модели → ежедневные выпуски → проверка и сохранение результатов. Прогноз на каждый день использует только архивные прогнозные погодные значения с заданным опережением; фактическая февральская погода и мощность в признаки не подставляются.

Что потребуется

  • Python 3.12 и доступ к интернету для установки зависимостей и загрузки архива погоды.
  • Два исходных CSV в папке raw/. Имена должны оканчиваться на turbine 1.csv и turbine 2.csv. Программа ищет по одному файлу для каждой турбины.
  • Команды ниже выполняются из корня репозитория. API-ключ для Open-Meteo не требуется.

Готовые результаты можно посмотреть без запуска программы: скачайте архив CSV и распакуйте его в корень проекта.

Установка

Windows PowerShell:

py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt

Linux/macOS:

python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt

Полный расчёт

python wind_agent.py prepare --data-dir raw
python wind_agent.py fetch
python wind_agent.py train
python wind_agent.py replay
  1. prepare проверяет CSV, собирает полные часы из шести десятиминутных записей и создаёт data/hourly.csv, reports/data_audit.json и reports/timezone_audit.json.
  2. fetch загружает архивные прогнозы GFS через Open-Meteo по координатам обеих турбин в cache/. По умолчанию берётся период с 01.04.2024 по 02.03.2026; уже скачанные месяцы используются повторно.
  3. train обучает модель и создаёт models/forecast.joblib, reports/model_card.json, reports/january_metrics.csv и reports/january_predictions.csv.
  4. replay повторно получает погоду для расчётного интервала и формирует ежедневные 48-часовые прогнозы. По умолчанию даты выпусков — с 31.01 по 28.02.2026.

Модель HistGradientBoostingRegressor обучается на почасовых значениях мощности до декабря 2025 года, подбирается по декабрю, а финальная версия обучается по 31 декабря. Январь используется для проверки точечного прогноза и настройки диапазонов неопределённости. В феврале модель остаётся зафиксированной, обновляются погодные признаки.

Для повторного расчёта без сетевых запросов после fetch используйте:

python wind_agent.py replay --offline

Если нужно принудительно обновить весь погодный кэш:

python wind_agent.py fetch --refresh

Один выпуск и автоматическое обновление

Для одного исторического выпуска укажите одинаковые начальную и конечную даты:

python wind_agent.py replay --first-issue 2026-02-10 --last-issue 2026-02-10

Чтобы повторять загрузку погоды и расчёт для этой же даты каждый час, запустите:

python wind_agent.py watch --issue-date 2026-02-10 --interval-seconds 3600

watch работает до остановки Ctrl+C. Интервал должен быть не меньше 60 секунд. Дата выпуска зафиксирована параметром --issue-date: процесс сам не переходит к следующему дню. Для автоматического запуска после перезагрузки добавьте эту команду в Планировщик заданий Windows или в cron/systemd с рабочей папкой репозитория и Python из .venv.

Если нужна последовательная обработка всего февраля, используйте одну команду python wind_agent.py replay; она создаёт 29 ежедневных выпусков за один запуск. Для отдельного выпуска результаты записываются в results/cycles/<дата>/, поэтому он не заменяет таблицы полного расчёта.

Где находятся результаты

  • results/forecasts_48h.csv — все ежедневные выпуски, по 48 часов для каждой турбины. Поля issue_utc, valid_utc и valid_local показывают время выпуска и прогнозируемый час; prediction — нормализованная мощность от 0 до 1.
  • results/submission_february.csv — по одному прогнозу на каждый час февраля для каждой турбины, выбранному из горизонта 1–24 часа.
  • results/station_february.csv — оба прогноза рядом; столбец equal_capacity_mean_assumption предполагает равную номинальную мощность турбин.
  • results/run_summary.json — число выпусков, строк и случаев резервного расчёта. После нового запуска содержит также fetch_status: refreshed, offline_cache или cache_after_refresh_failure.
  • results/agent_events.jsonl — журнал этапов, проверок и отпечатков входных данных. Каждое повторение дописывает события в этот файл.
  • reports/january_metrics.csv — проверка модели на январских данных.

status=weather_model означает расчёт по погоде. status=fallback_climatology означает, что погодных данных не хватило и использовано историческое среднее; такой результат нужно проверять отдельно. Если обновление архива завершится ошибкой, программа сообщит об этом в терминале и попробует имеющийся кэш. Проверьте fetch_status в сводке: успешный расчёт по кэшу не означает, что сеть сработала.

В январских метриках MAE на горизонте 1–24 часа составляет 0,205 для турбины 1 и 0,207 для турбины 2. Это средняя абсолютная ошибка около 20–21 процентного пункта нормализованной мощности. Февральских фактических значений в предоставленных CSV нет, поэтому заявлять февральскую точность нельзя.

Проверка и настройка времени

Запуск тестов:

python -m unittest discover -s tests -v

CSV не содержат часового пояса. По умолчанию программа считает их метки временем UTC+5. Для проверки признаков времени отдельно запустите:

python wind_agent.py timezone-audit --data-dir raw

Если оператор подтвердит другое смещение, укажите его перед командой во всём цикле подготовки, обучения и расчёта, например:

python wind_agent.py --scada-utc-offset-hours 6 prepare --data-dir raw
python wind_agent.py --scada-utc-offset-hours 6 fetch
python wind_agent.py --scada-utc-offset-hours 6 train
python wind_agent.py --scada-utc-offset-hours 6 replay

Модель хранит выбранное смещение и отклоняет расчёт с другим значением. В исходных CSV нет фактической выработки за февраль, поэтому февральская ошибка в результатах не вычисляется. Значения prediction нормализованы; для перевода в МВт и МВт·ч нужны номинальные мощности турбин.

Что ограничивает проверку регламента

УсловиеЧто есть в проектеЧто ещё нужно
Погода, доступная на момент выпускаOpen-Meteo Previous Runs: ряды с фиксированным опережением 1–3 суток; выбор учитывает дополнительный 12-часовой запас.История отдельных запусков погодной модели с подтверждённым временем публикации. API фиксированного опережения не доказывает точное время доступности каждого значения.
Часовой пояс SCADAДопущение UTC+5 для моделируемого периода, сохранённое в отчёте и модели.Подтверждение от организаторов или оператора турбин. В CSV нет смещения UTC; местное гражданское время само по себе не подтверждает настройки контроллера.
Выработка станции в энергииОтдельный нормализованный прогноз по каждой турбине; условное среднее при одинаковых мощностях.Номинальная мощность каждой турбины, чтобы получить МВт и МВт·ч.

Если запуск остановился

Сообщение или симптомДействие
Expected one turbine ... .csvПроверьте папку raw/ и окончания имён двух CSV.
No weather archive; run fetch firstЗапустите python wind_agent.py fetch; проверьте интернет.
Wrong turbine coordinates или Missing or misalignedУдалите названный в ошибке файл из cache/ и повторите fetch --refresh. Программа отклоняет повреждённый или чужой погодный файл.
Model trained with SCADA UTC offset ...Используйте прежнее смещение либо повторите prepare и train с подтверждённым новым смещением.
Нет models/forecast.joblibВыполните prepare, fetch, train в указанном порядке. Архив готовых CSV не содержит обученную модель.
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
6
Авторы
3
Файлы
14
Ветки
2

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

Batyanr 2rip-bart 2soft 2

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

  • 2026-09-23 16:21Add offline forecast dashboard, result integrity checks and clear demo guideBatyanr
  • 2026-09-23 15:58Harden forecast replay and clarify setup, results, and limitationsrip-bart
  • 2026-09-23 15:37Rewrite README as setup and automation guidesoft
  • 2026-09-23 14:58Audit SCADA timezone and refresh February forecast weatherrip-bart
  • 2026-09-23 14:33Fix historical cutoffs, weather fallback and replay isolation; simplify setup and regenerate forecastsBatyanr
  • 2026-09-23 14:09Add reproducible wind forecasting agent, February forecasts and validationsoft
Структура репозитория (14 файлов)
.gitignore
README.md
reports/artifact_checksums.json
reports/data_audit.json
reports/january_metrics.csv
reports/model_card.json
reports/tests.txt
reports/timezone_audit.json
reports/weather_manifest.json
requirements.txt
results/forecast_results.zip
results/run_summary.json
tests/test_agent.py
wind_agent.py
Ветки (2)

Обсуждение 0 комментариев

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

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