Esercitazione: Unire i dati dei sensori con i dati delle previsioni meteo usando Azure Notebooks (Python)

L'energia eolica è una delle fonti energetiche alternative ai combustibili fossili per contrastare il cambiamento climatico. Poiché il vento non è coerente per natura, gli operatori di energia eolica devono creare modelli di Machine Learning (ML) per prevedere la capacità di energia eolica. Questa previsione è necessaria per soddisfare la domanda di energia elettrica e garantire la stabilità della rete. Questa esercitazione illustra come combinare i dati delle previsioni meteo di Mappe di Azure con un set di dati demo per le letture del meteo. I dati delle previsioni meteo vengono richiesti chiamando Mappe di Azure servizi meteo.

Questa esercitazione illustra come:

  • Creare ed eseguire un notebook di Jupyter in VS Code.
  • Caricare i dati demo da un file.
  • Chiamare le API REST di Mappe di Azure in Python.
  • Eseguire il rendering dei dati della posizione sulla mappa.
  • Arricchire i dati demo con i dati delle previsioni meteo giornaliere di Mappe di Azure.
  • Tracciare i dati delle previsioni sui grafici.

Nota

Il file di Jupyter Notebook per questo progetto può essere scaricato dal repository di Jupyter Notebook per mappe meteo.

Prerequisiti

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Nota

Per altre informazioni sull'autenticazione in Mappe di Azure, vedere Gestire l'autenticazione in Mappe di Azure.

Installare i pacchetti a livello di progetto

Il progetto EV Routing and Reachable Range ha dipendenze dalle librerie python aiohttp e IPython . È possibile installarli nel terminale di Visual Studio usando pip:

pip install aiohttp
pip install ipython
pip install pandas

Aprire Jupyter Notebook in Visual Studio Code

Scaricare quindi aprire il notebook usato in questa esercitazione:

  1. Aprire il file weatherDataMaps.ipynb nel repository AzureMapsJupyterSamples in GitHub.

  2. Selezionare il pulsante Scarica file non elaborato nell'angolo superiore destro della schermata per salvare il file in locale.

    Screenshot che mostra come scaricare il file notebook denominato weatherDataMaps.ipynb dal repository GitHub.

  3. Aprire il notebook scaricato in Visual Studio Code facendo clic con il pulsante destro del mouse sul file e quindi scegliendo Apri con > Visual Studio Code o tramite il Esplora file vs Code.

Caricare i moduli e i framework necessari

Dopo aver aggiunto il codice, è possibile eseguire una cella usando l'icona Esegui a sinistra della cella e l'output viene visualizzato sotto la cella di codice.

Eseguire lo script seguente per caricare tutti i moduli e i framework necessari.

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

Screenshot che mostra come scaricare la prima cella del notebook contenente le istruzioni import necessarie con il pulsante Esegui evidenziato.

Importare i dati meteo

Questa esercitazione usa le letture dei dati meteo dai sensori installati in quattro turbine eoliche diverse. I dati di esempio sono costituiti da 30 giorni di letture meteo. Queste letture vengono raccolte dai data center meteorologici vicino a ogni posizione della turbina. I dati demo contengono letture dei dati relativi a temperatura, velocità e direzione del vento. È possibile scaricare i dati demo contenuti in weather_dataset_demo.csv da GitHub. Lo script seguente importa i dati demo in Azure Notebooks.

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

Richiedere i dati delle previsioni giornaliere

In questo scenario verranno richieste le previsioni giornaliere per ogni posizione dei sensori. Lo script seguente chiama l'API Previsioni giornaliere dei servizi meteo di Mappe di Azure. Questa API restituisce le previsioni meteorologiche per ogni turbina eolica per i 15 giorni successivi dalla data corrente.

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

Lo script seguente esegue il rendering delle posizioni della turbina sulla mappa chiamando il servizio 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-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))

Screenshot che mostra le posizioni delle turbine in una mappa.

Raggruppare i dati delle previsioni con i dati demo in base all'ID stazione. del data center meteorologico. Questo raggruppamento aumenta i dati demo con i dati di previsione.

# 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'])

La tabella seguente mostra i dati cronologici combinati e i dati delle previsioni per una delle posizioni delle turbine.

# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()

Dati raggruppati

Tracciare i dati delle previsioni

Tracciare i valori previsti rispetto ai giorni per i quali sono previsti. Questo tracciato consente di visualizzare le variazioni di velocità e direzione del vento per i 15 giorni successivi.

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

I grafici seguenti visualizzano i dati delle previsioni. Per le variazioni della velocità del vento, vedere il grafico a sinistra. Per le variazioni della direzione del vento, vedere il grafico a destra. Questi dati rappresentano le previsioni per i 15 giorni successivi dal giorno in cui vengono richiesti i dati.

Screenshot che mostra i tracciati della velocità del vento.

Screenshot che mostra i tracciati della direzione del vento.

In questa esercitazione si è appreso come chiamare Mappe di Azure API REST per ottenere i dati delle previsioni meteo. e visualizzarli su grafici.

Per esplorare le API di Mappe di Azure usate in questa esercitazione, vedere:

Per un elenco completo delle API REST di Mappe di Azure, vedere: API REST di Mappe di Azure.

Passaggi successivi