Tutorial: Combinación de datos de sensores con datos de previsión meteorológica mediante Azure Notebooks (Python)
La energía eólica es una fuente de energía alternativa a los combustibles fósiles para combatir el cambio climático. Dado que el viento no es coherente por naturaleza, los operadores de energía eólica necesitan crear modelos de aprendizaje automático (ML) para predecir la capacidad de la energía del viento. Esta predicción es necesaria para satisfacer la demanda de electricidad y garantizar la estabilidad de la red. En este tutorial, veremos cómo se combinan los datos de previsión meteorológica de Azure Maps con los datos de demostración de las lecturas meteorológicas. Los datos de previsión meteorológica se solicitan mediante una llamada al servicio Weather de Azure Maps.
En este tutorial, aprenderá lo siguiente:
- Cree y ejecute un Cuaderno de Jupyter Notebook en VS Code.
- Cargar datos de demostración desde un archivo.
- Llamada a las API REST de Azure Maps en Python.
- Representar datos de ubicación en el mapa.
- Enriquecer los datos de demostración con datos meteorológicos de la previsión diaria de Azure Maps.
- Trazar datos de previsión en gráficos.
Nota:
El archivo de Jupyter Notebook de este proyecto se puede descargar desde el repositorio de Jupyter Notebook de Azure Maps.
Requisitos previos
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
- Una cuenta de Azure Maps
- Una clave de suscripción
- Visual Studio Code
- Conocimientos prácticos de Cuadernos de Jupyter Notebook en VS Code
- Entorno configurado para trabajar con Python en Cuadernos de Jupyter Notebook. Para obtener más información, consulte Configuración del entorno.
Nota:
Para más información sobre la autenticación en Azure Maps, consulte Administración de la autenticación en Azure Maps.
Instalación de los paquetes de nivel de proyecto
El proyecto de Enrutamiento y rango accesible EV tiene dependencias en las bibliotecas aiohttp y IPython python. Puede instalarlos en el terminal de Visual Studio mediante pip:
pip install aiohttp
pip install ipython
pip install pandas
Apertura de Jupyter Notebook en Visual Studio Code
Después, abra el cuaderno usado en este tutorial:
Abra el archivo weatherDataMaps.ipynb en el repositorio AzureMapsJupyterSamples en GitHub.
Seleccione el botón Descargar archivo sin procesar en la esquina superior derecha de la pantalla para guardar el archivo localmente.
Para abrir el cuaderno descargado en Visual Studio Code, haga clic con el botón derecho en el archivo y seleccione Abrir con > Visual Studio Codeo a través del Explorador de archivos de VS Code.
Carga de los módulos y marcos necesarios
Una vez agregado el código, puede ejecutar una celda mediante el icono Ejecutar a la izquierda de la celda y la salida se muestra debajo de la celda de código.
Ejecute el siguiente script para cargar todos los módulos y marcos necesarios.
import aiohttp
import pandas as pd
import datetime
from IPython.display import Image, display
Importación de datos meteorológicos
En este tutorial se usan las lecturas de datos meteorológicos de los sensores instalados en cuatro turbinas eólicas diferentes. Los datos de ejemplo se componen de 30 días de lecturas meteorológicas. Estas lecturas se recopilan de centros de datos meteorológicos próximos a cada ubicación de las turbinas. Los datos de demostración contienen lecturas de datos para la temperatura, la velocidad del viento y la dirección. Puede descargar los datos de demostración contenidos en weather_dataset_demo.csv desde GitHub. El script siguiente importa los datos de demostración en Azure Notebooks.
df = pd.read_csv("./data/weather_dataset_demo.csv")
Solicitud de los datos de previsión diarios
En nuestro escenario, nos gustaría solicitar la previsión diaria de cada ubicación de sensores. El siguiente script llama a Daily Forecast API de los servicios Weather de Azure Maps. Esta API devuelve el pronóstico meteorológico de cada molino de viento para los próximos 15 días a partir de la fecha actual.
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()
El siguiente script representa las ubicaciones de las turbinas en el mapa mediante una llamada al servicio 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¢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))
Agrupar los datos de previsión con los de demostración en función del identificador de la estación. El identificador de la estación es para el centro de datos meteorológicos. Esta agrupación aumenta los datos de demostración con los datos de previsión.
# 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'])
En la tabla siguiente se muestran los datos históricos y de previsión combinados de una de las ubicaciones de las turbinas.
# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()
Trazado de los datos de previsión
Trazar los valores pronosticados con respecto a los días para los que están previstos. Este trazado nos permite ver los cambios de velocidad y dirección del viento durante los próximos 15 días.
# 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")
En los gráficos siguientes se visualizan los datos de previsión. Para el cambio de velocidad del viento, consulte el gráfico de la izquierda. Para ver el cambio de la dirección del viento, consulte el gráfico de la derecha. Estos datos representan la predicción durante los próximos 15 días a partir del día en que se solicitan los datos.
En este tutorial, ha aprendido cómo llamar a las API REST de Azure Maps para obtener los datos de previsión meteorológica. También ha aprendido cómo visualizar los datos en gráficos.
Para explorar las API de Azure Maps que se usan en este tutorial, consulte:
Para obtener una lista completa de las API REST de Azure Maps, consulte API REST de Azure Maps.