Självstudie: Koppla sensordata till väderprognosdata med hjälp av Azure Notebooks (Python)
Vindkraft är en alternativ energikälla för att bekämpa klimatförändringar. Eftersom vind inte är konsekvent av naturen måste vindkraftsoperatörer bygga maskininlärningsmodeller (ML) för att förutsäga vindkraftskapaciteten. Den här förutsägelsen är nödvändig för att möta elbehovet och säkerställa rutnätets stabilitet. I den här självstudien går vi igenom hur Azure Kartor data för väderprognoser kombineras med demodata för väderavläsningar. Väderprognosdata begärs genom att anropa Azure Kartor Weather Services.
I de här självstudierna får du:
- Arbeta med datafiler Azure Notebooks i molnet.
- Läs in demodata från filen.
- Anropa Azure Kartor REST-API:er i Python.
- Rendera platsdata på kartan.
- Utöka demodata med Azure Kartor väderdata för dagliga prognoser.
- Rita prognosdata i grafer.
Förutsättningar
För att slutföra den här självstudien måste du först:
- Skapa en Azure Kartor-kontoprenumeration på prisnivån S0 genom att följa anvisningarna i Skapa ett konto.
- Hämta den primära prenumerationsnyckeln för ditt konto. Följ instruktionerna i Hämta primärnyckel.
Mer information om autentisering i Azure Kartor finns i Hantera autentisering i Azure Kartor.
Om du vill bekanta dig med Azure Notebooks och veta hur du kommer igång följer du anvisningarna Skapa en Azure Notebook.
Anteckning
Jupyter Notebook-filen för det här projektet kan laddas ned från lagringsplatsen Weather Kartor Jupyter Notebook.
Läsa in de moduler och ramverk som krävs
Om du vill läsa in alla nödvändiga moduler och ramverk kör du följande skript:
import pandas as pd
import datetime
from IPython.display import Image, display
!pip install aiohttp
import aiohttp
Importera väderdata
För den här självstudien använder vi väderdataavläsningar från sensorer som installerats på fyra olika vindturbiner. Exempeldata består av 30 dagars väderavläsningar. Dessa avläsningar samlas in från väderdatacenter nära varje turbinplats. Demodata innehåller dataavläsningar för temperatur, vindhastighet och riktning. Du kan ladda ned demodata härifrån. Skriptet nedan importerar demodata till Azure Notebook.
df = pd.read_csv("./data/weather_dataset_demo.csv")
Begära dagliga prognosdata
I vårt scenario vill vi begära daglig prognos för varje sensorplats. Följande skript anropar API:et Daily Forecast för Azure Kartor Weather Services. Det här API:et returnerar väderprognoser för varje vindturbin under de kommande 15 dagarna från det aktuella datumet.
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-Primary-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()
Skriptet nedan återger turbineplatserna på kartan genom att anropa Tjänsten Azure Kartor Get Map Image.
# 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-Primary-Subscription-key}&api-version=1.0&layer=basic&style=main&zoom=6¢er={},{}&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))

Vi grupperar prognosdata med demodata baserat på stations-ID:t. Stations-ID:t är för väderdatacentret. Den här gruppgruppen utökar demodata med prognosdata.
# 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'])
I följande tabell visas kombinerade historiska data och prognosdata för en av turbinens platser.
# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()
Plotta prognosdata
Vi ritar de prognostiserade värdena mot de dagar då de prognostiserades. Med det här ritytan kan vi se vindhastigheten och riktningsändringarna under de kommande 15 dagarna.
# 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")
Diagrammen nedan visualiserar prognosdata. Ändring av vindhastighet finns i den vänstra grafen. Om du vill ändra vindriktningen kan du se den högra grafen. Dessa data är förutsägelser för de kommande 15 dagarna från den dag då data begärs.

I den här självstudien har du lärt dig hur du anropar Azure Kartor REST API:er för att hämta väderprognosdata. Du har också lärt dig hur du visualiserar data i grafer.
Mer information om hur du anropar Azure Kartor REST API:er i Azure Notebooks finns i EV-routning med hjälp av Azure Notebooks.
Om du vill utforska Azure Kartor-API:er som används i den här självstudien kan du se:
En fullständig lista över Azure Kartor REST-API:er finns i Azure Kartor REST API:er.
Rensa resurser
Det finns inga resurser som kräver rensning.
Nästa steg
Mer information om Azure Notebooks finns i