Руководство по присоединению данных датчика к данным прогноза погоды с помощью записных книжек Azure (Python)

Сила ветра является одним из источников энергии, способных заменить ископаемое топливо и остановить изменение климата. Поскольку ветер по своей природе не постоянен, операторам ветроэнергетических установок необходимо построить модели машинного обучения (ML) для прогнозирования ветроэнергетической мощности. Этот прогноз необходим для удовлетворения спроса на электричество и обеспечения стабильной работы сетки. Из этого руководства мы узнаем, как объединить данные прогноза погоды из Azure Maps с демонстрационным набором данных. Данные о прогнозе погоды извлекаются с помощью запроса к Службе погоды Azure Maps.

При работе с этим руководством вы сделаете следующее:

  • Создайте и запустите Jupyter Notebook в VS Code.
  • Загружать примеры данных из файла.
  • Вызывать REST API Azure Maps с помощью Python.
  • Отображать на карте данные о местоположении.
  • Обогащать пример данных, используя дневные прогнозы из Azure Maps.
  • Наносить данные прогнозов погоды на графики.

Примечание.

Файл записной книжки Jupyter для этого проекта можно скачать из репозитория записной книжки Jupyter Notebook для Azure Maps.

Необходимые компоненты

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Примечание.

Дополнительные сведения о проверке подлинности в Azure Maps см. в этой статье.

Установка пакетов на уровне проекта

Проект маршрутизации и доступного диапазона EV имеет зависимости от библиотек python aiohttp и IPython . Их можно установить в терминале Visual Studio с помощью pip:

pip install aiohttp
pip install ipython
pip install pandas

Открытие Jupyter Notebook в Visual Studio Code

Затем скачайте записную книжку, используемую в этом руководстве:

  1. Откройте файл weatherDataMaps.ipynb в репозитории AzureMapsJupyterSamples в GitHub.

  2. Нажмите кнопку "Скачать необработанный файл" в правом верхнем углу экрана, чтобы сохранить файл локально.

    Снимок экрана: скачивание файла Notebook с именем weatherDataMaps.ipynb из репозитория GitHub.

  3. Откройте скачаемую записную книжку в Visual Studio Code, щелкнув правой кнопкой мыши файл, а затем выберите "Открыть с > помощью Visual Studio Code" или проводник VS Code.

Загрузка необходимых модулей и платформ

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

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

import aiohttp
import pandas as pd
import datetime
from IPython.display import Image, display

Снимок экрана: скачивание первой ячейки в записной книжке, содержащей необходимые инструкции импорта с выделенной кнопкой запуска.

Импорт данных о погоде

В этом руководстве используются данные о погоде с датчиков, установленных на четырех разных ветряных турбинах. Образец данных состоит из показаний погоды за 30 дней. Эти показания собираются в метеорологических центрах, расположенных рядом с каждой точкой размещения ветрогенератора. Пример данных включает сведения о температуре, скорости и направлении ветра. Демонстрационные данные, содержащиеся в weather_dataset_demo.csv, можно скачать с GitHub. Следующий скрипт импортирует демонстрационные данные в записную книжку Azure.

df = pd.read_csv("./data/weather_dataset_demo.csv")

Запрос данных прогноза по дням

В нашем сценарии мы будем получать прогноз по дням для местоположений каждого датчика. Следующий скрипт вызывает API прогноза погоды по дням Службы погоды Azure Maps. Этот интерфейс API возвращает ежедневный прогноз погоды для каждого ветрогенератора на 15 дней от текущей даты.

subscription_key = "Your Azure Maps key"

# Get a lists of unique station IDs and their coordinates 
station_ids = pd.unique(df[['StationID']].values.ravel())
coords = pd.unique(df[['latitude','longitude']].values.ravel())

years,months,days = [],[],[]
dates_check=set()
wind_speeds, wind_direction = [], []

# Call azure maps Weather services to get daily forecast data for 15 days from current date
session = aiohttp.ClientSession()
j=-1
for i in range(0, len(coords), 2):
    wind_speeds.append([])
    wind_direction.append([])
    
    query = str(coords[i])+', '+str(coords[i+1])
    forecast_response = await(await session.get("https://atlas.microsoft.com/weather/forecast/daily/json?query={}&api-version=1.0&subscription-key={Your-Azure-Maps-Subscription-key}&duration=15".format(query, subscription_key))).json()
    j+=1
    for day in range(len(forecast_response['forecasts'])):
            date = forecast_response['forecasts'][day]['date'][:10]
            wind_speeds[j].append(forecast_response['forecasts'][day]['day']['wind']['speed']['value'])
            wind_direction[j].append(forecast_response['forecasts'][day]['day']['windGust']['direction']['degrees'])
            
            if date not in dates_check:
                year,month,day= date.split('-')
                years.append(year)
                months.append(month)
                days.append(day)
                dates_check.add(date)
            
await session.close()

В следующем скрипте отображаются расположения турбин на карте путем вызова службы "Получить изображение карты".

# Render the turbine locations on the map by calling the Azure Maps Get Map Image service
session = aiohttp.ClientSession()

pins="default|la-25+60|ls12|lc003C62|co9B2F15||'Location A'{} {}|'Location B'{} {}|'Location C'{} {}|'Location D'{} {}".format(coords[1],coords[0],coords[3],coords[2],coords[5],coords[4], coords[7],coords[6])

image_response = "https://atlas.microsoft.com/map/static/png?subscription-key={Your-Azure-Maps-Subscription-key}&api-version=1.0&layer=basic&style=main&zoom=6&center={},{}&pins={}".format(subscription_key,coords[7],coords[6],pins)

static_map_response = await session.get(image_response)

poi_range_map = await static_map_response.content.read()

await session.close()

display(Image(poi_range_map))

Снимок экрана: расположения турбин на карте.

Группируйте данные прогноза с демонстрационными данными на основе идентификатора станции. Идентификатор станции требуется для центра обработки данных погоды. Эта группировка дополняет демонстрационные данные данными прогноза.

# Group forecasted data for all locations
df = df.reset_index(drop=True)
forecast_data = pd.DataFrame(columns=['StationID','latitude','longitude','Year','Month','Day','DryBulbCelsius','WetBulbFarenheit','WetBulbCelsius','DewPointFarenheit','DewPointCelsius','RelativeHumidity','WindSpeed','WindDirection'])

for i in range(len(station_ids)):
    loc_forecast = pd.DataFrame({'StationID':station_ids[i], 'latitude':coords[0], 'longitude':coords[1], 'Year':years, 'Month':months, 'Day':days, 'WindSpeed':wind_speeds[i], 'WindDirection':wind_direction[i]})
    forecast_data = pd.concat([forecast_data,loc_forecast], axis=0, sort=False)
    
combined_weather_data = pd.concat([df,forecast_data])
grouped_weather_data = combined_weather_data.groupby(['StationID'])

В следующей таблице показан объединенный набор исторических и прогнозируемых данных по расположению одного из ветрогенераторов.

# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()

Сгруппированные данные

График прогнозируемых данных

Настроите прогнозируемые значения по дням, для которых они прогнозируются. Этот график позволяет нам видеть изменения скорости и направления ветра в течение следующих 15 дней.

# Plot wind speed
curr_date = datetime.datetime.now().date()
windsPlot_df = pd.DataFrame({ 'Location A': wind_speeds[0], 'Location B': wind_speeds[1], 'Location C': wind_speeds[2], 'Location D': wind_speeds[3]}, index=pd.date_range(curr_date,periods=15))
windsPlot = windsPlot_df.plot.line()
windsPlot.set_xlabel("Date")
windsPlot.set_ylabel("Wind speed")
#Plot wind direction 
windsPlot_df = pd.DataFrame({ 'Location A': wind_direction[0], 'Location B': wind_direction[1], 'Location C': wind_direction[2], 'Location D': wind_direction[3]}, index=pd.date_range(curr_date,periods=15))
windsPlot = windsPlot_df.plot.line()
windsPlot.set_xlabel("Date")
windsPlot.set_ylabel("Wind direction")

На следующих графиках можно визуализировать данные прогноза. Изменение скорости ветра см. на диаграмме слева. Сведения об изменении направления поворота см. на диаграмме справа. Эти данные являются прогнозом на следующие 15 дней с момента запроса данных.

Снимок экрана: графики скорости ветра.

Снимок экрана: графики направления ветра.

В этом руководстве вы узнали, как вызывать REST API Azure Maps для получения данных прогноза погоды. Кроме того, теперь вы знаете, как визуализировать данные на графиках.

Для изучения API-интерфейсов Azure Maps, используемых в этом руководстве, прочтите следующие статьи:

Полный список API-интерфейсов Azure Maps вы найдете на этой странице.

Следующие шаги