Självstudie: Koppla sensordata med väderprognosdata med Hjälp av Jupyter Notebooks (Python)
Vindkraft är en alternativ energikälla för fossila bränslen för att bekämpa klimatförändringarna. 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 elnätets stabilitet. I den här självstudien går vi igenom hur väderprognosdata i Azure Maps kombineras med demodata för väderavläsningar. Väderprognosdata begärs genom att anropa Azure Maps Vädertjänster.
I den här självstudien kommer vi att:
- Skapa och kör en Jupyter Notebook i VS Code.
- Läs in demodata från filen.
- Anropa REST-API:er för Azure Maps i Python.
- Rendera platsdata på kartan.
- Utöka demodata med väderdata för Azure Maps Daily Forecast .
- Rita prognosdata i diagram.
Kommentar
Jupyter Notebook-filen för det här projektet kan laddas ned från Jupyter Notebook-lagringsplatsen Weather Maps.
Förutsättningar
Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
- Ett Azure Maps-konto
- En prenumerationsnyckel
- Visual Studio Code
- En fungerande kunskap om Jupyter Notebooks i VS Code
- Miljö konfigurerad för att fungera med Python i Jupyter Notebooks. Mer information finns i Konfigurera din miljö.
Kommentar
Mer information om autentisering i Azure Maps finns i Hantera autentisering i Azure Maps.
Installera paket på projektnivå
Projektet EV Routing and Reachable Range har beroenden för python-biblioteken aiohttp och IPython. Du kan installera dessa i Visual Studio-terminalen med pip:
pip install aiohttp
pip install ipython
pip install pandas
Öppna Jupyter Notebook i Visual Studio Code
Ladda ned och öppna sedan notebook-filen som används i den här självstudien:
Öppna filen weatherDataMaps.ipynb på lagringsplatsen AzureMapsJupyterSamples i GitHub.
Välj knappen Ladda ned råfil i det övre högra hörnet på skärmen för att spara filen lokalt.
Öppna den nedladdade notebook-filen i Visual Studio Code genom att högerklicka på filen och sedan välja Öppna med > Visual Studio Code eller via VS Code-Utforskaren.
Läs in de moduler och ramverk som krävs
När koden har lagts till kan du köra en cell med hjälp av ikonen Kör till vänster om cellen och utdata visas under kodcellen.
Kör följande skript för att läsa in alla nödvändiga moduler och ramverk.
import aiohttp
import pandas as pd
import datetime
from IPython.display import Image, display
Importera väderdata
I den här självstudien används väderdataavläsningar från sensorer som installerats vid fyra olika vindkraftverk. Exempeldata består av 30 dagars väderavläsningar. Dessa avläsningar samlas in från väderdatacentra nära varje turbinplats. Demodata innehåller dataavläsningar för temperatur, vindhastighet och riktning. Du kan ladda ned demodata som finns i weather_dataset_demo.csv från GitHub. 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 för daglig prognos för Azure Maps Vädertjänster. Det här API:et returnerar väderprognos för varje vindkraftverk 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-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()
Följande skript renderar turbinplatserna på kartan genom att anropa tjänsten Hämta kartbild.
# 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¢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))
Gruppera prognosdata med demodata baserat på stations-ID:t. Stations-ID:t gäller för väderdatacentret. Den här grupperingen 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 turbinplatserna.
# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()
Rita prognosdata
Rita de prognostiserade värdena mot de dagar för vilka de prognostiseras. Det här diagrammet gör att vi kan se vindens hastighet och riktningsändringar 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")
Följande diagram visualiserar prognosdata. För ändring av vindhastighet, se den vänstra grafen. Information om ändringar i vindriktningen finns i rätt diagram. Dessa data är förutsägelse 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 REST-API:er för Azure Maps för att hämta väderprognosdata. Du har också lärt dig hur du visualiserar data i grafer.
Information om hur du utforskar Azure Maps-API:er som används i den här självstudien finns i:
En fullständig lista över REST-API:er för Azure Maps finns i Rest-API:er för Azure Maps.