AAYMA
RU
Войти

WindMind AI

Почасовой прогноз нормализованной мощности двух ветротурбин на 24/48 ч по SCADA и прогнозной погоде (Open-Meteo Previous Runs, NOAA GFS), с…

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

О проекте

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

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

Суть

Почасовой прогноз нормализованной мощности двух ветротурбин на 24/48 ч по SCADA и прогнозной погоде (Open-Meteo Previous Runs, NOAA GFS), с интерфейсом на Streamlit и исторической проверкой.

Как устроено

10-минутные SCADA-данные агрегируются в часы (час годен при 6 корректных измерениях), для каждой турбины обучается HistGradientBoostingRegressor на скорости ветра и температуре; baseline — средняя мощность по бинам ветра шириной 0,5 м/с. Обучение point-in-time с учётом задержки SCADA, чтобы исключить утечку. Погода берётся из Open-Meteo Previous Runs или архива NOAA GFS (Herbie) со строгим контрактом issued_at/available_at и проверкой SHA-256; агент считает прогноз, пишет версию расчёта и журнал.

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

  • HistGradientBoostingRegressor
  • binned power-curve baseline
  • point-in-time обучение
  • fixed-lead backtest
  • Open-Meteo Previous Runs
  • NOAA GFS через Herbie
  • проверка SHA-256

Метрики

На измеренной погоде за январь MAE 0.0249/0.0270 (T1/T2) против baseline 0.0353/0.0392; на архивной прогнозной погоде MAE около 0.316–0.348, на уровне baseline или чуть хуже

Особенности

Команда прямо сообщает, что на прогнозной погоде модель не лучше baseline, а ошибка прогнозного ветра составляет около 3,2–3,6 м/с. Строгий погодный контракт отклоняет выпуски, которые ещё не были доступны на момент расчёта. Всего 33 unit-теста, включая point-in-time обучение.

Стек

Python · Streamlit · scikit-learn · joblib · pandas · Open-Meteo · Herbie


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

README

README.md

WindMind AI

Система почасового прогноза мощности двух ветроустановок на горизонте 24 или 48 часов.

Проект включает подготовку SCADA-данных, обучение отдельных моделей для двух турбин, историческую проверку, работу с архивной прогнозной погодой и интерфейс на Streamlit.

Что реализовано

В проекте есть два режима работы с погодой:

  1. Интерактивный режим — использует Open-Meteo Previous Runs и выводит почасовой расчёт в Streamlit.
  2. Режим архивных выпусков — принимает прогнозы с известными issued_at и available_at, проверяет источник, полноту горизонта и время доступности данных.

Основной результат модели — predicted_power, нормализованная мощность каждой турбины. Физическая шкала подключается через коэффициенты normalization_to_mw в конфигурации.

Данные

Исходные CSV находятся в каталоге ВЭС/data/raw/.

Период наблюдений:

  • начало: 2023-03-11 00:00;
  • конец: 2026-01-31 23:50;
  • турбина 1: 142 360 строк;
  • турбина 2: 149 499 строк;
  • шаг измерений: 10 минут.

Используемые поля:

  • время измерения;
  • средняя скорость ветра;
  • средняя температура воздуха;
  • нормализованная активная мощность.

Названия некоторых старых файлов содержат слово february, хотя фактические SCADA-данные заканчиваются 31 января 2026 года.

Подготовка данных

Модуль src/data.py:

  • определяет UTF-8, CP1251 или UTF-16;
  • определяет разделитель CSV;
  • проверяет обязательные поля;
  • сохраняет точные нулевые значения мощности;
  • исключает конфликтующие временные метки;
  • не заполняет пропущенные часы вымышленными значениями;
  • агрегирует 10-минутные измерения в почасовые интервалы;
  • помечает часы, пригодные для обучения.

По умолчанию час допускается к обучению, только если содержит шесть корректных 10-минутных измерений.

Настройки находятся в config/settings.json. Смысл временной метки, задержка поступления SCADA и шкала мощности вынесены в конфигурацию и не зашиты в код обработки данных.

Модель

Для каждой турбины обучается отдельный HistGradientBoostingRegressor.

Признаки модели:

  • wind_speed;
  • temperature.

Базовая модель рассчитывает среднюю мощность по диапазонам скорости ветра шириной 0,5 м/с.

Для исторического расчёта используется point-in-time обучение:

  • берутся только завершённые почасовые интервалы;
  • учитывается настроенная задержка поступления SCADA;
  • данные после момента расчёта не используются;
  • февральские целевые значения в обучение не попадают;
  • модель и базовый метод обучаются на одном и том же доступном срезе.

Прогноз по умолчанию ограничивается диапазоном мощности обучающей выборки. Неограниченный результат сохраняется отдельно в поле raw_predicted_power.

Результаты проверки

Проверка на измеренной погоде

Модель обучается на данных до января 2026 года и проверяется на 744 часах января.

ТурбинаMAE моделиRMSE моделиMAE baselineRMSE baseline
10.0248550.0483310.0353220.058432
20.0270060.0641510.0391810.072893

Эта проверка отдельно измеряет качество преобразования фактической погоды в мощность. Проверка на прогнозной погоде приведена ниже.

Проверка на архивной прогнозной погоде

Для дополнительной проверки используются фиксированные срезы Open-Meteo Previous Runs за 24 и 48 часов до целевого времени.

ТурбинаСрез погодыMAE моделиMAE baseline
124 ч0.31620.3090
148 ч0.34770.3388
224 ч0.31110.3109
248 ч0.34230.3411

Средняя абсолютная ошибка прогнозного ветра относительно SCADA составляет примерно 3,24–3,56 м/с. Сравнение с baseline сохранено в отчёте и используется как ориентир для следующей версии модели.

Open-Meteo Previous Runs используется для fixed-lead проверки. Для точного воспроизведения полного выпуска в проекте предусмотрен отдельный формат с полями issued_at и available_at.

Установка

Требуется Python 3.12.

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install -r requirements.txt

Полный набор закреплённых зависимостей находится в requirements-lock.txt.

Подготовка данных и обучение

.\.venv\Scripts\python.exe -m src.train

Команда:

  • проверяет исходные CSV;
  • создаёт data/processed/hourly.csv;
  • сохраняет отчёт reports/data_quality.json;
  • выполняет январскую валидацию;
  • сохраняет модели в models/validated/;
  • записывает метрики в reports/metrics.json.

После изменения версии scikit-learn, исходных данных или настроек модели необходимо переобучить модели и удалить старый кэш models/point_in_time/.

Запуск интерфейса

.\.venv\Scripts\python.exe -m streamlit run app.py

Или:

.\run.bat

В интерфейсе можно выбрать:

  • дату и час расчёта;
  • горизонт 24 или 48 часов;
  • таблицу почасовых результатов;
  • графики мощности и погоды;
  • исследовательский сценарный расчёт;
  • отчёт январской валидации.

Streamlit объединяет выбор временного среза, графики, таблицу прогноза, сценарный расчёт и отчёты в одном интерфейсе. Расчётное ядро сохраняет нормализованную мощность и сведения о выбранном погодном срезе.

Исследовательский replay

Загрузка или обновление архива Previous Runs:

.\.venv\Scripts\python.exe -m src.previous_runs

Расчёт за февральский период:

.\.venv\Scripts\python.exe -m src.evaluation

Проверка на январских фактических значениях мощности:

.\.venv\Scripts\python.exe -m src.evaluation --january

Диагностический архив хранится в data/weather/diagnostics/. Его SHA-256, период, погодная модель и координаты проверяются перед использованием.

Строгий погодный контракт

Рабочий файл data/weather/forecasts.csv должен содержать:

turbine_id
issued_at
available_at
valid_time
wind_speed
temperature

Все временные поля должны содержать UTC-смещение. Для каждого выпуска требуется data/weather/source.json с источником, единицами измерения, высотой ветра, подтверждением совместимости со SCADA и SHA-256 файла.

Полное описание формата находится в config/WEATHER_INPUT.md.

После подключения архива расчёт запускается командой:

.\.venv\Scripts\python.exe -m src.agent --origin "2026-02-01T00:00:00+05:00" --horizon 48

Режим наблюдения за обновлением файла:

.\.venv\Scripts\python.exe -m src.agent --watch --interval 60

Строгий replay за период:

.\.venv\Scripts\python.exe -m src.backtest

Входной контроль отклоняет неполные выпуски и предотвращает расчёт по данным, которые ещё не были доступны в выбранный момент времени.

Загрузка NOAA GFS

Скрипт fetch_gfs_archive.py загружает отдельные прогнозные поля NOAA GFS через Herbie и формирует forecasts.csv и source.json.

Пример короткой проверки:

.\.venv\Scripts\python.exe fetch_gfs_archive.py --start 2026-01-30 --end 2026-01-30 --max-fxx 6 --cycles 18

Пример архива на 48 часов:

.\.venv\Scripts\python.exe fetch_gfs_archive.py --start 2026-01-30 --end 2026-02-28 --max-fxx 48 --cycles 00,06,12,18

Перед использованием полученного архива необходимо проверить координаты, время доступности выпусков, способ приведения ветра к высоте турбины и совместимость со SCADA.

Тесты

.\.venv\Scripts\python.exe -m unittest discover -s tests -v

Текущий набор содержит 33 теста. Проверяются:

  • разбор и агрегация CSV;
  • дубли, конфликты и пропущенные часы;
  • временные зоны и доступность данных;
  • полнота погодного горизонта;
  • point-in-time обучение;
  • ограничение прогнозов;
  • контроль SHA-256;
  • сохранение версий расчёта;
  • базовый запуск Streamlit.

Структура проекта

app.py                         Streamlit-интерфейс
config/settings.json          настройки данных и расчёта
config/WEATHER_INPUT.md       контракт погодного источника
src/data.py                   чтение и подготовка SCADA
src/train.py                  обучение и январская проверка
src/model_store.py            point-in-time модели и кэш
src/predict.py                проверка входа и прогноз
src/weather_service.py        выбор доступного погодного выпуска
src/previous_runs.py          исследовательский архив Open-Meteo
src/evaluation.py             fixed-lead проверка
src/agent.py                  версия расчёта и журнал событий
src/backtest.py               строгий replay
fetch_gfs_archive.py          загрузка выпусков NOAA GFS
tests/                        автоматические тесты
reports/                      метрики и диагностические отчёты

Развитие проекта

Следующие задачи относятся к подключению проекта к данным конкретной ВЭС:

  • настройка физической шкалы мощности по паспортам турбин;
  • привязка высоты прогнозного ветра к высоте SCADA-измерений;
  • загрузка фактической мощности за февраль для проверки полного периода;
  • добавление статусов работы, остановок и curtailment;
  • калибровка вероятностного интервала прогноза;
  • обновление модели по результатам fixed-lead проверки.

Текущая версия закрывает полный воспроизводимый цикл: исходные SCADA-данные → почасовая агрегация → обучение → историческая проверка → прогноз на 24/48 часов → интерфейс и CSV-выгрузка.

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

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

capn cook 10Rustam Kabdolda 9Medina 8rustamprogrammer 2

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

  • 2026-09-23 18:03fix(ui): ensure strict agent cycle executes only with valid archiveRustam Kabdolda
  • 2026-09-23 17:45fix(ui): reduce false operational risk warningsRustam Kabdolda
  • 2026-09-23 17:31chore: remove emojis from project textRustam Kabdolda
  • 2026-09-23 17:19Rename project and enhance README contentMedina
  • 2026-09-23 17:14fix(ui): execute strict agent cycle without fallbackRustam Kabdolda
  • 2026-09-23 17:11chore: ignore isolated weather downloader environmentRustam Kabdolda
  • 2026-09-23 17:10Create DATA_SOURCES.mdMedina
  • 2026-09-23 17:05fix(ui): eliminate fabricated claims, align units with SCADA reality, and ground AI agent in real inferencecapn cook
Все коммиты (29)
  • 2026-09-23 16:48fix(ui): collapse stSidebarHeader and stLogoSpacer to completely remove empty top gapcapn cook
  • 2026-09-23 16:45Create FORECAST_LOG.mdMedina
  • 2026-09-23 16:40feat(ui): eliminate top padding in sidebar and make AI insights dynamically generate context-aware situational textcapn cook
  • 2026-09-23 16:33fix(ui): restore sidebar reopen toggle button while keeping deploy button hiddencapn cook
  • 2026-09-23 16:28feat: add reproducible NOAA weather archive loaderRustam Kabdolda
  • 2026-09-23 16:23Update README.mdrustamprogrammer
  • 2026-09-23 16:22Add weather forecast documentation for WindMind AIMedina
  • 2026-09-23 16:15feat(ui): localize interface to Russian for Kazakhstan dispatchers and remove Streamlit deploy buttoncapn cook
  • 2026-09-23 16:10feat(ui): implement enterprise WindMind AI Control Center UI with cinematic hero, dark SCADA theme, and multi-page navigationcapn cook
  • 2026-09-23 16:01feat(ui): redesign SCADA enterprise dark dashboard for dispatchers with P10-P90 bands and turbine intelligencecapn cook
  • 2026-09-23 15:50Add demo guide for WindMind AI projectMedina
  • 2026-09-23 15:48fix: add point-in-time models and reproducible weather evaluationRustam Kabdolda
  • 2026-09-23 15:28Enhance quick demo guide with usage instructionsMedina
  • 2026-09-23 15:27Create quick demo guideMedina
  • 2026-09-23 15:26docs: refine README with natural engineering overview and pipeline specscapn cook
  • 2026-09-23 15:17feat: add Open-Meteo fixed-lead February previewRustam Kabdolda
  • 2026-09-23 14:43fix: validate data and weather forecast provenanceRustam Kabdolda
  • 2026-09-23 14:19Update README.mdMedina
  • 2026-09-23 14:00docs: add full technical implementation blueprint for team AI agentscapn cook
  • 2026-09-23 13:59feat(agentic-ai): Samruk WindPilot AI - wind power forecasting pipeline, LightGBM models, agent closed-loop and Streamlit dashboardcapn cook
  • 2026-09-23 13:54скелет проектаrustamprogrammer
Структура репозитория (71 файлов)
.gitattributes
.gitignore
.streamlit/config.toml
DATA_SOURCES.md
DEMO_GUIDE.md
FORECAST_LOG.md
README.md
TEAM_AGENT_INSTRUCTIONS.md
WEATHER_FORECAST.md
app.py
assets/windfarm-hero.jpg
config/WEATHER_INPUT.md
config/settings.json
data/february_daily_summary_48h.csv
data/february_hourly_walkforward_48h.csv
data/hourly_turbine_1.csv
data/hourly_turbine_2.csv
data/processed/hourly.csv
data/weather/diagnostics/previous_runs_2025-12-31_2026-03-02.csv
data/weather/diagnostics/previous_runs_2025-12-31_2026-03-02.json
data/weather/diagnostics/previous_runs_2026-01-31_2026-03-02.csv
data/weather/diagnostics/previous_runs_2026-01-31_2026-03-02.json
data/weather_cache/february_2026_forecast.csv
fetch_gfs_archive.py
models/turbine_1_model.joblib
models/turbine_2_model.joblib
models/validated/turbine_1.joblib
models/validated/turbine_2.joblib
quick demo guide
reports/IMPLEMENTATION_REVIEW.md
reports/REMEDIATION.md
reports/data_quality.json
reports/february_exploratory.json
reports/february_exploratory_predictions.csv
reports/february_predictions.csv
reports/february_replay.json
reports/january_fixed_lead.json
reports/january_fixed_lead_comparison.csv
reports/january_fixed_lead_largest_errors.csv
reports/january_fixed_lead_predictions.csv
reports/metrics.json
reports/validation_predictions.csv
requirements-lock.txt
requirements.txt
run.bat
src/__init__.py
src/agent.py
src/backtest.py
src/data.py
src/data_loader.py
src/evaluation.py
src/model.py
src/model_store.py
src/physics_features.py
src/predict.py
src/previous_runs.py
src/reporting.py
src/settings.py
src/train.py
src/weather_service.py
tests/test_app.py
tests/test_pipeline.py
tests/test_point_in_time.py
tests/test_previous_runs.py
ВЭС/data/processed/february_daily_summary_48h.csv
ВЭС/data/processed/hourly_turbine_1.csv
ВЭС/data/processed/hourly_turbine_2.csv
ВЭС/data/raw/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv
ВЭС/data/raw/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv
ВЭС/models/turbine_1_model.joblib
ВЭС/models/turbine_2_model.joblib

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

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

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