Självstudie: Koppla sensordata med väderprognosdata med hjälp av Azure 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 Azure Kartor väderprognosdata kombineras med demodata för väderavläsningar. Väderprognosdata begärs genom att anropa Azure Kartor Weather-tjänster.

I den här självstudien kommer vi att:

  • Arbeta med datafiler i 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 väderdata för Azure Kartor Daily Forecast.
  • Rita prognosdata i diagram.

Förutsättningar

Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Kommentar

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.

Kommentar

Jupyter Notebook-filen för det här projektet kan laddas ned från lagringsplatsen Weather Kartor Jupyter Notebook.

Läs in de moduler och ramverk som krävs

Kör följande skript för att läsa in alla nödvändiga moduler och ramverk:

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

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 Kartor Weather-tjänsterna. 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&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

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

Grouped data

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.

Wind speed plotWind direction plot

I den här självstudien har du lärt dig hur du anropar REST-API:er för Azure Kartor 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.

Information om hur du utforskar Api:er för Azure Kartor som används i den här självstudien finns i:

En fullständig lista över Rest-API:er för Azure Kartor 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