AAYMA
RU
Войти

ALEM WIND

Прототип почасового прогноза мощности двух ветротурбин на 24–48 часов с веб-пультом диспетчера (карта ВЭС, графики, CSV-экспорт) и расчётом для…

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

О проекте

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

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

Суть

Прототип почасового прогноза мощности двух ветротурбин на 24–48 часов с веб-пультом диспетчера (карта ВЭС, графики, CSV-экспорт) и расчётом для новых координат.

Как устроено

10-минутные измерения турбин агрегируются до часа (минимум 4 из 6 точек), соединяются с архивными прогнозами Open-Meteo Previous Runs (ветер, порывы, направление, температура, влажность) плюс календарные признаки, ID турбины, заблаговременность и два лага мощности. CatBoost обучается на данных до 01.10.2025, валидируется на окт.2025–янв.2026 против persistence-базлайна; финальная модель прогнозирует долю номинала [0,1]. FastAPI + SQLite (Alembic) хранит запуски прогноза со статусами, фронтенд на чистом JS с Leaflet.

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

  • CatBoost
  • Open-Meteo Previous Runs
  • persistence baseline
  • seasonal baseline
  • early stopping
  • time-based split
  • FastAPI BackgroundTasks

Метрики

CatBoost MAE 0.1665, RMSE 0.2414 (доля номинала) vs persistence MAE 0.3651; 24ч MAE 0.1594, 48ч MAE 0.1736

Особенности

Использование архивных прогнозов погоды (Previous Runs, previous_day1/2) вместо фактической погоды — честная постановка без утечки будущего; явное сравнение с persistence и сезонными базлайнами, оговорки о допущении по часовому поясу.

Стек

Python · FastAPI · SQLite · Alembic · HTML/CSS/JS · Leaflet


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

README

README.md

ALEM WIND

Почасовой прогноз мощности ветроэлектростанции

Данные турбин · Архив погоды · CatBoost · Пульт диспетчера

HackAlem Status Forecast

Python FastAPI CatBoost SQLite JavaScript Leaflet

СКРИНШОТ СИСТЕМЫ

ALEM WIND — интерфейс системы

Место для скриншота системы
Здесь будет общий вид панели: карта ВЭС, состояние турбины и прогноз на 48 часов.


О проекте

ALEM WIND — прототип системы прогнозирования для энергетического кейса хакатона HackAlem. Он объединяет исторические измерения двух ветротурбин, архивные погодные прогнозы Open-Meteo и модель CatBoost в адаптивном веб-интерфейсе.

Цель проекта — автоматизировать ежедневное получение погоды и расчёт почасовой мощности на следующие 24–48 часов. Сейчас реализованы ML-пайплайн, backend и интерфейс. Полный агентный цикл с ежедневными выпусками за весь февраль 2026 года остаётся следующим этапом.

Текущий режим: архивный выпуск от 1 февраля 2026, 00:00, часы прогноза +1…+48. Карточки турбин показывают последние доступные архивные измерения. Мощность хранится как доля номинала [0, 1], на графиках отображается в процентах.

Содержание

Возможности

РазделЧто доступно
Карта ВЭСВыбор двух исходных турбин, масштабирование, выбор новой точки
Состояние турбиныПоследняя измеренная мощность, ветер, температура, время и полнота измерений
ПрогнозГоризонты 24/48 ч, графики мощности, ветра и температуры, ползунок и воспроизведение по часам
Новая площадкаРучной ввод координат → архив погоды → расчёт сохранённой моделью
ПодробностиПериоды слабого ветра, температурный диапазон, изменение мощности за час
ВыгрузкаПочасовая таблица и CSV с русскими заголовками, датой и временем
Мобильный интерфейсПоследовательные блоки: карта → состояние → прогноз → координаты → подробности
BackendВалидация CSV, хранение запусков и результатов, статусы расчёта, OpenAPI

Быстрый старт

1. Подготовьте окружение и данные

Нужны Python 3.11, curl и интернет для загрузки зависимостей, погоды и карты. Команды ниже предназначены для macOS/Linux и выполняются из корня проекта. Node.js и сборка frontend не требуются.

Положите исходные файлы в ~/Downloads/ с именами:

Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv
Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv

Создайте окружение и установите зависимости:

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

При первом запуске создайте файл настроек:

cp .env.example .env

Если .env уже существует, сохраните его текущие настройки.

2. Подготовьте модель и прогноз

.venv/bin/python run_stage1.py

Команда проверяет CSV, агрегирует измерения до часа, получает архив погоды, обучает модель и сохраняет метрики и прогноз в outputs/. Повторные запуски используют погодный кэш из data/weather_cache/.

Если модель и необходимые CSV уже подготовлены в outputs/, переходите к запуску приложения.

3. Запустите приложение

Примените миграции базы данных:

.venv/bin/alembic upgrade head

Запуск интерфейса и API одной командой:

.venv/bin/uvicorn hackalem_api.app:app --app-dir src --reload
АдресНазначение
localhost:8000Панель диспетчера
localhost:8000/docsИнтерактивная документация API
localhost:8000/healthПроверка доступности API и БД

Если порт занят, добавьте --port 8001 и откройте localhost:8001.

Как работает система

flowchart LR
    CSV[Архив измерений CSV] --> Hourly[Почасовая агрегация]
    Weather[Open-Meteo Previous Runs] --> Features[Погодные и календарные признаки]
    Hourly --> Features
    Features --> ML[Обучение CatBoost и валидация]
    ML --> Model[Сохранённая модель]
    ML --> Artifacts[Метрики и прогноз CSV / JSON]
    Artifacts --> API[FastAPI]
    Coords[Координаты новой площадки] --> Inference[Погода по координатам и расчёт]
    Weather --> Inference
    Model --> Inference
    Inference --> API
    API --> UI[Карта и адаптивная панель]
    API --> DB[(SQLite: запуски и результаты)]

Система поддерживает два сценария:

  1. Исходные турбины. Панель читает архивные измерения и подготовленный прогноз из результатов ML-пайплайна.
  2. Новые координаты. Backend запрашивает архив погоды для точки, строит признаки и вызывает сохранённую CatBoost-модель. Неизвестные лаги мощности передаются как пропуски. Показания датчиков для новой площадки отсутствуют.

Сервис forecast-runs хранит запуски в SQLite со статусами queued → running → completed / failed. Сейчас он загружает результаты из подготовленного forecast_48h.csv. Фоновая обработка реализована через FastAPI BackgroundTasks внутри процесса приложения.

Данные и модель

Исходные измерения

Фактический период предоставленных данных: 11.03.2023–31.01.2026. Несмотря на дату в названиях файлов, фактических измерений за февраль 2026 в них нет.

Поле CSVСодержание
IDИдентификатор строки
Статистическое времяВременная отметка с шагом 10 минут
Средняя скорость ветра(m/s)Измеренная скорость ветра
Нормализованная активная мощностьМощность в диапазоне [0, 1]
Средняя температура окружающей среды(°C)Измеренная температура

Предоставленные файлы используют UTF-8 с BOM и запятую-разделитель. Проверка выявляет некорректные значения, дубликаты и пропуски времени. Часовое значение рассчитывается как среднее при наличии минимум 4 из 6 измерений для каждого показателя. Исходные CSV сохраняются без изменений; данные турбин агрегируются отдельно.

Погода и признаки

Источник — Open-Meteo Previous Runs. Для исходных близко расположенных турбин используется одна погодная точка сетки; при ручном вводе координат выполняется отдельный запрос с кэшированием по параметрам.

Модель использует:

  • архивные прогнозы ветра, направления ветра, порывов, температуры и влажности;
  • календарные признаки;
  • идентификатор турбины и заблаговременность прогноза;
  • два лага мощности, доступные к моменту выпуска.

Поля observed_wind_ms и observed_temp_c в объединённых данных оставлены для диагностики и не передаются модели как будущие признаки.

Время и разделение выборок

  • Временные отметки CSV не содержат UTC offset; сейчас они трактуются как локальные и сопоставляются с Asia/Almaty без сдвига. Это допущение требует подтверждения владельцем телеметрии.
  • Обучение backtest-модели: данные до 01.10.2025.
  • Валидация: 01.10.2025–31.01.2026.
  • Февраль 2026 исключён из обучения и валидации.
  • Погодные признаки берутся из previous_day1 и previous_day2.
  • После валидации финальная модель обучается на допустимых данных до 01.02.2026; её прогноз ограничивается диапазоном [0, 1].

Результаты валидации

Сохранённый результат из outputs/metrics.json. Ошибки приведены в долях номинальной мощности: MAE 0,1665 соответствует 16,65 процентного пункта номинала, а не проценту ошибки относительно фактической выработки.

Модель / горизонтMAE ↓RMSE ↓Число примеров
CatBoost — все примеры0,16650,241411 580
Persistence — все примеры0,36510,484411 580
CatBoost — 24 ч0,15940,23155 790
CatBoost — 48 ч0,17360,25095 790

Основная метрика — MAE, дополнительная — RMSE. Persistence использует последнюю доступную мощность на момент выпуска. Дополнительно рассчитываются сезонные baseline: тот же час предыдущего дня для горизонта 24 ч и двух дней назад для 48 ч.

Эти результаты относятся к валидации исходных турбин. Та же выборка используется для выбора числа итераций через early stopping; отдельная итоговая тестовая оценка ещё не выполнена. Метрики не подтверждают качество на новых координатах или за февраль 2026.

API

МетодEndpointНазначение
GET/healthДоступность API и базы данных
GET/api/v1/dashboardТурбины, архивные наблюдения, прогнозы и метрики
POST/api/v1/locations/forecastРасчёт для введённых координат
POST/api/v1/data/validateВалидация CSV, multipart-поле file
POST/api/v1/forecast-runsСоздание запуска на 24 или 48 часов
GET/api/v1/forecast-runsСписок запусков, параметр limit
GET/api/v1/forecast-runs/{run_id}Статус и количество результатов
GET/api/v1/forecast-runs/{run_id}/resultsРезультаты с пагинацией limit / offset

Пример расчёта новой площадки:

curl -X POST http://127.0.0.1:8000/api/v1/locations/forecast \
  -H 'Content-Type: application/json' \
  -d '{"latitude":43.6600,"longitude":78.5500,"horizon_hours":48,"reference_turbine_id":"1"}'

horizon_hours принимает 24 или 48, reference_turbine_id — "1" или "2". Новая площадка рассчитывается для того же фиксированного архивного выпуска. Ответ содержит почасовые прогнозы, координаты погодной сетки и описание ограничений переноса модели.

Настройки

Backend читает .env через Pydantic Settings. Пути по умолчанию определяются относительно корня проекта.

ПеременнаяНазначение / значение по умолчанию
DATABASE_URLSQLite: data/hackalem.db
FORECAST_CSV_PATHoutputs/forecast_48h.csv
HOURLY_CSV_PATHoutputs/hourly_power.csv
MODEL_PATHoutputs/catboost_power.cbm
METRICS_PATHoutputs/metrics.json
WEATHER_CACHE_DIRdata/weather_cache/
MAX_UPLOAD_BYTESЛимит входного CSV: 26 214 400 байт (25 МиБ)

Погодные запросы в текущем коде выполняются без API-ключа. Поля WEATHER_SOURCE и OPEN_METEO_API_KEY в .env.example зарезервированы и пока не переключают источник или авторизацию. Скрипты этапа 1 используют собственные пути и параметры, а не настройки backend.

Экспорт CSV

Кнопка «Выгрузить прогноз» сохраняет выбранную турбину или новую площадку на выбранном горизонте 24/48 ч.

  • Русские заголовки и подписи единиц измерения.
  • Отдельные столбцы даты ДД.ММ.ГГГГ и времени ЧЧ:ММ:СС для выпуска и каждого часа прогноза.
  • Явный часовой пояс Asia/Almaty; время не пересчитывается в часовой пояс браузера.
  • Координаты, название площадки, режим расчёта, мощность, ветер и температура.
  • Кодировка UTF-8 с BOM, разделитель ;, десятичная запятая.

При ручном импорте в Excel или другой табличный редактор выберите эти параметры. Мощность в CSV сохраняется как доля номинала 0–1. Этот пользовательский формат экспорта отличается от внутренних CSV пайплайна.

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

.
├── frontend/                  # Интерфейс: HTML, CSS, JavaScript
│   └── vendor/leaflet/         # Локальная библиотека карты
├── src/hackalem_api/           # FastAPI, настройки, модели БД
│   └── services/              # CSV-валидация, запуски, расчёт по координатам
├── scripts/
│   ├── inspect_turbine_data.py # Аудит исходных измерений
│   ├── build_hourly_dataset.py # Почасовая агрегация
│   ├── join_weather_data.py    # Получение и присоединение погоды
│   └── train_stage1.py         # Обучение, валидация, прогноз
├── migrations/                # Миграции Alembic
├── tests/                     # Проверки API и сервисов
├── data/                      # SQLite и погодный кэш
├── outputs/                   # Модели, прогнозы и метрики
├── .env.example               # Пример конфигурации
├── requirements.txt           # Зависимости Python
└── run_stage1.py               # Последовательный запуск ML-пайплайна
Артефакты ML-пайплайна
Файл в outputs/Содержимое
hourly_power.csvПочасовые измерения и целевая мощность
hourly_training_weather.csvЦелевые значения и архивные погодные признаки
catboost_backtest.cbmМодель для валидации
catboost_power.cbmФинальная модель до тестового периода
metrics.jsonМетрики CatBoost и baseline
backtest_predictions.csvФакты и прогнозы на валидации
forecast_48h.csv48-часовой прогноз отдельно для каждой турбины
forecast_48h.jsonТот же прогноз в JSON

Сущности базы данных: Turbine, Measurement, WeatherForecast, ForecastRun, ForecastValue.

Тесты

.venv/bin/pytest

В проекте есть проверки API, валидации входных параметров, данных панели, расчёта новой площадки и разделения погодного кэша по координатам. Набор тестов не является оценкой точности модели на новых ВЭС.

Ограничения

  • Фиксированный выпуск. Выбор произвольной даты и ежедневный пересчёт за весь февраль ещё не реализованы.
  • Архивная телеметрия. Живые датчики не подключены; статус выработки определяется по мощности. Аварийные сигналы не предоставлены.
  • Новые площадки. Перенос модели двух турбин на другие координаты экспериментальный; его точность не оценена.
  • Сильный мороз. В исходной истории температура опускается примерно до −19 °C. Для −30 °C качество модели не подтверждено; одна температура не позволяет диагностировать обледенение.
  • Единицы мощности. Для перевода в МВт и расчёта энергии в МВт·ч нужны номинальные мощности турбин и подтверждённая схема нормализации.
  • Историческая доступность погоды. Перед итоговой защитой требуется проверить соответствие архивных погодных выпусков фактическому моменту принятия решения для каждого дня тестового периода.
  • Инфраструктура MVP. Распределённая очередь, восстановление фоновых задач после перезапуска и пользовательская авторизация пока отсутствуют.

Карта использует Leaflet 1.9.4 и тайлы OpenStreetMap с атрибуцией. Лицензия Leaflet находится в frontend/vendor/leaflet/LICENSE. Загрузка карты и получение новой погоды требуют интернета; ошибки погодного источника отображаются в интерфейсе.

План развития

  • Аудит CSV и почасовая агрегация.
  • Архивные погодные признаки, CatBoost и baseline.
  • Валидация по времени и сохранение артефактов.
  • FastAPI, SQLite, SQLAlchemy и миграции Alembic.
  • Адаптивная панель, интерактивная карта и расчёт по координатам.
  • Экспорт CSV с русскими заголовками и временем.
  • Подтверждение часового пояса исходной телеметрии.
  • Ежедневный агентный цикл за 01–28 февраля 2026 с журналом действий.
  • Контроль времени доступности погодных выпусков и повторные попытки при сбоях.
  • Независимая итоговая оценка и интервалы неопределённости.
  • Учёт простоев, технических ограничений и условий сильного холода.
  • Онлайн-телеметрия, авторизация и устойчивая очередь расчётов.

ALEM WIND · HackAlem · Энергетика

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

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

Seyilbek Sauytbekov 6

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

  • 2026-09-23 17:39Replace screenshot placeholder with instructionsSeyilbek Sauytbekov
  • 2026-09-23 17:38Add files via uploadSeyilbek Sauytbekov
  • 2026-09-23 17:29Change screenshot path in READMESeyilbek Sauytbekov
  • 2026-09-23 17:28Finalizing BuildSeyilbek Sauytbekov
  • 2026-09-23 16:53Second StepSeyilbek Sauytbekov
  • 2026-09-23 14:59First StepSeyilbek Sauytbekov
Структура репозитория (28 файлов)
README.md
alembic.ini
backend/app/__init__.py
backend/requirements.txt
frontend/app.js
frontend/index.html
frontend/styles.css
migrations/env.py
migrations/script.py.mako
migrations/versions/91dbd1086032_initial_schema.py
pyproject.toml
requirements.txt
run_stage1.py
screenshot.png
scripts/build_hourly_dataset.py
scripts/inspect_turbine_data.py
scripts/join_weather_data.py
scripts/train_stage1.py
src/hackalem_api/__init__.py
src/hackalem_api/app.py
src/hackalem_api/config.py
src/hackalem_api/database.py
src/hackalem_api/models.py
src/hackalem_api/schemas.py
src/hackalem_api/services/__init__.py
src/hackalem_api/services/csv_validation.py
src/hackalem_api/services/dashboard.py
src/hackalem_api/services/forecast_runs.py

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

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

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