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

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

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

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

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

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

Примечание.

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

Ознакомьтесь с работой записных книжек Azure и узнайте, как их запускать, по инструкциям из этой статьи.

Примечание.

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

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

Чтобы загрузить все необходимые модули и платформы, выполните приведенный ниже скрипт:

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

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

В этом руководстве используются данные о погоде с датчиков, установленных на четырех разных ветряных турбинах. Образец данных состоит из показаний погоды за 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))

Turbine locations

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

# 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()

Grouped data

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

Настроите прогнозируемые значения по дням, для которых они прогнозируются. Этот график позволяет нам видеть изменения скорости и направления ветра в течение следующих 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 дней с момента запроса данных.

Wind speed plotWind direction plot

В этом руководстве вы узнали, как вызвать ИНТЕРФЕЙСы REST API Azure Карты для получения данных прогноза погоды. Кроме того, теперь вы знаете, как визуализировать данные на графиках.

Дополнительные сведения о вызове REST API для Azure Maps из Записных книжек Azure вы можете получить в этой статье.

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

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

Очистка ресурсов

Нет ресурсов, требующих очистки.

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

Дополнительные сведения о службе "Записные книжки Azure" см. в следующей статье: