Vax-Dealers: прогноз ВЭС
CLI-агент почасового 48-часового прогноза нормализованной мощности двух ветротурбин по архивным прогнозам погоды с ежедневными выпусками за февраль…
О проекте
Команда: 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.mdVax-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
prepareпроверяет CSV, собирает полные часы из шести десятиминутных записей и создаётdata/hourly.csv,reports/data_audit.jsonиreports/timezone_audit.json.fetchзагружает архивные прогнозы GFS через Open-Meteo по координатам обеих турбин вcache/. По умолчанию берётся период с 01.04.2024 по 02.03.2026; уже скачанные месяцы используются повторно.trainобучает модель и создаётmodels/forecast.joblib,reports/model_card.json,reports/january_metrics.csvиreports/january_predictions.csv.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 не содержит обученную модель. |
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.