你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用 Azure Notebooks (Python) 将传感器数据与天气预报数据相联接

风力发电是可以替代化石燃料的,有助于应对气候变化的一种能源。 因为风天生就不稳定,所以风力发电运营商需要建立机器学习 (ML) 模型来预测风力发电能力。 为满足电力需求,保证电网稳定运行,需要进行此预测。 本教程逐步讲解如何将 Azure Maps 天气预报数据与用于天气读数的演示数据结合使用。 可以通过调用 Azure Maps 天气服务来请求天气预报数据。

在本教程中,将:

  • 在云中的 Azure Notebooks 中处理数据文件。
  • 从该文件加载演示数据。
  • 在 Python 中调用 Azure Maps REST API。
  • 在地图上呈现位置数据。
  • 使用 Azure Maps 的每日预报天气数据来扩充演示数据。
  • 在图中绘制预报数据。

先决条件

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

注意

有关 Azure Maps 中身份验证的详细信息,请参阅在 Azure Maps 中管理身份验证

若要熟悉 Azure Notebooks 并了解如何开始使用它,请参考创建 Azure 笔记本中的说明。

注意

可以从 Maps 天气 Jupyter Notebook 存储库下载此项目的 Jupyter Notebook 文件。

加载所需的模块和框架

若要加载全部所需的模块和框架,请运行以下脚本:

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

导入天气数据

本教程使用安装在四个不同风力涡轮机上的传感器发送的天气数据。 示例数据包含 30 天的天气读数。 这些读数是从每个位置附近的天气数据中心收集的。 演示数据包含温度、风速和风向的数据读数。 可以从 GitHub 下载 weather_dataset_demo.csv 中包含的演示数据。 以下脚本将演示数据导入 Azure 笔记本。

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

请求每日预报数据

在我们的方案中,我们希望请求每个传感器位置的每日预报数据。 以下脚本调用 Azure Maps 天气服务的每日预报 API。 此 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

基于工作站 ID 将预报数据与演示数据组合在一起。 工作站 ID 适用于天气数据中心。 此分组使用预报数据补充了演示数据。

# 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

在本教程中,你已了解了如何调用 Azure Maps REST API 来获取天气预报数据。 你还了解了如何在图表上将数据可视化。

若要详细了解如何在 Azure Notebooks 中调用 Azure Maps REST API,请参阅使用 Azure Notebooks 规划电动车路线

若要了解本教程中使用的 Azure Maps API,请参阅:

有关 Azure Maps REST API 的完整列表,请参阅 Azure Maps REST API

清理资源

没有需要清理的资源。

后续步骤

若要详细了解 Azure Notebooks,请参阅: