Condividi tramite


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:

  • Usare file di dati in Azure Notebooks nel cloud.
  • 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.

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.

Per acquisire familiarità con Azure Notebooks e per informazioni introduttive, seguire le istruzioni riportate in Creare un notebook di Azure.

Nota

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

Caricare i moduli e i framework necessari

Per caricare tutti i moduli e i framework necessari, eseguire lo script seguente:

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

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 Previsione giornaliera 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))

Turbine locations

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] (./media/weather-service-tutorial/grouped-data.png)

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.

! [Tracciato velocità vento] (./media/weather-service-tutorial/speed-date-plot.png) ! [Tracciato direzione vento] (./media/weather-service-tutorial/direction-date-plot.png)

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

Per altre informazioni su come chiamare le API REST di Mappe di Azure all'interno di Azure Notebooks, vedere Pianificare itinerari per veicoli elettrici con Azure Notebooks.

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.

Pulire le risorse

Non sono presenti risorse che richiedono la pulizia.

Passaggi successivi

Per altre informazioni su Azure Notebooks, vedere