WindMind AI
Почасовой прогноз нормализованной мощности двух ветротурбин на 24/48 ч по SCADA и прогнозной погоде (Open-Meteo Previous Runs, NOAA GFS), с…
О проекте
Команда: 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.mdWindMind AI
Система почасового прогноза мощности двух ветроустановок на горизонте 24 или 48 часов.
Проект включает подготовку SCADA-данных, обучение отдельных моделей для двух турбин, историческую проверку, работу с архивной прогнозной погодой и интерфейс на Streamlit.
Что реализовано
В проекте есть два режима работы с погодой:
- Интерактивный режим — использует Open-Meteo Previous Runs и выводит почасовой расчёт в Streamlit.
- Режим архивных выпусков — принимает прогнозы с известными
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 baseline | RMSE baseline |
|---|---|---|---|---|
| 1 | 0.024855 | 0.048331 | 0.035322 | 0.058432 |
| 2 | 0.027006 | 0.064151 | 0.039181 | 0.072893 |
Эта проверка отдельно измеряет качество преобразования фактической погоды в мощность. Проверка на прогнозной погоде приведена ниже.
Проверка на архивной прогнозной погоде
Для дополнительной проверки используются фиксированные срезы Open-Meteo Previous Runs за 24 и 48 часов до целевого времени.
| Турбина | Срез погоды | MAE модели | MAE baseline |
|---|---|---|---|
| 1 | 24 ч | 0.3162 | 0.3090 |
| 1 | 48 ч | 0.3477 | 0.3388 |
| 2 | 24 ч | 0.3111 | 0.3109 |
| 2 | 48 ч | 0.3423 | 0.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-выгрузка.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.