Compartir por


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.

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:

  1. Abra el archivo weatherDataMaps.ipynb en el repositorio AzureMapsJupyterSamples en GitHub.

  2. Seleccione el botón Descargar archivo sin procesar en la esquina superior derecha de la pantalla para guardar el archivo localmente.

    Captura de pantalla que muestra cómo descargar el archivo notebook denominado weatherDataMaps.ipynb desde el repositorio de GitHub.

  3. 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

Captura de pantalla que muestra cómo descargar la primera celda del cuaderno que contiene las instrucciones de importación necesarias con el botón ejecutar resaltado.

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

Captura de pantalla que muestra las ubicaciones de las turbinas en un mapa.

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

Datos agrupados

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.

Captura de pantalla que muestra trazados de velocidad del viento.

Captura de pantalla que muestra trazados de dirección del viento.

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.

Pasos siguientes