Tutorial: Unir dados de sensor com os dados de previsão do tempo usando o Azure Notebooks (Python)Tutorial: Join sensor data with weather forecast data by using Azure Notebooks (Python)

A energia eólica é uma fonte de energia alternativa aos combustíveis fósseis para combater a alteração climática.Wind power is one alternative energy source for fossil fuels to combat against climate change. Como o vento não é consistente por natureza, os operadores de energia eólica precisam criar modelos de ML (machine learning) para prever a capacidade de energia eólica.Because wind isn't consistent by nature, wind power operators need to build machine learning (ML) models to predict the wind power capacity. Essa previsão é necessária para atender à demanda de eletricidade e garantir a estabilidade da grade.This prediction is necessary to meet electricity demand and ensure the grid stability. Neste tutorial, explicaremos como os dados de previsão do tempo dos Azure Mapas são combinados com os dados de demonstração de leituras do clima.In this tutorial, we walk through how Azure Maps weather forecast data is combined with demo data for weather readings. Os dados de previsão do tempo são solicitados chamando o serviço meteorológico do Azure Mapas.Weather forecast data is requested by calling Azure Maps Weather service.

Neste tutorial, você irá:In this tutorial, you will:

  • Trabalhar com arquivos de dados no Azure Notebooks na nuvem.Work with data files in Azure Notebooks in the cloud.
  • Carregar dados de demonstração do arquivo.Load demo data from file.
  • Chamar as APIs REST dos Azure Mapas no Python.Call Azure Maps REST APIs in Python.
  • Renderizar dados de localização no mapa.Render location data on the map.
  • Enriquecer os dados de demonstração com os dados meteorológicos de previsão diária do Azure Mapas.Enrich the demo data with Azure Maps Daily Forecast weather data.
  • Plotar dados de previsão em gráficos.Plot forecast data in graphs.

Pré-requisitosPrerequisites

Para concluir este tutorial, primeiro você precisará:To complete this tutorial, you first need to:

  1. Criar uma assinatura da conta dos Azure Mapas no tipo de preço S0 seguindo as instruções em Criar uma conta.Create an Azure Maps account subscription in the S0 pricing tier by following instructions in Create an account.
  2. Obter a chave de assinatura primária da sua conta seguindo as instruções em Obter chave primária.Get the primary subscription key for your account, follow the instructions in get primary key.

Para obter mais informações sobre a autenticação nos Azure Mapas, confira Gerenciar a autenticação nos Azure Mapas.For more information on authentication in Azure Maps, see manage authentication in Azure Maps.

Para se familiarizar com o Azure Notebooks e saber como começar, siga as instruções Criar um Azure Notebook.To get familiar with Azure notebooks and to know how to get started, follow the instructions Create an Azure Notebook.

Observação

O arquivo do Jupyter Notebook para este projeto pode ser baixado do Repositório de mapas do clima do Jupyter Notebook.The Jupyter notebook file for this project can be downloaded from the Weather Maps Jupyter notebook repository.

Carregar as estruturas e os módulos necessáriosLoad the required modules and frameworks

Para carregar todas as estruturas e todos os módulos necessários, execute o seguinte script:To load all the required modules and frameworks, run the following script:

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

Importar dados meteorológicosImport weather data

Para este tutorial, usaremos as leituras de dados meteorológicos de sensores instalados em quatro turbinas eólicas diferentes.For the sake of this tutorial, we'll use weather data readings from sensors installed at four different wind turbines. Os dados de exemplo consistem em 30 dias de leituras do clima.The sample data consists of 30 days of weather readings. Essas leituras são coletadas dos data centers meteorológicos próximos a cada localização da turbina.These readings are gathered from weather data centers near each turbine location. Os dados de demonstração contêm leituras de temperatura e velocidade e direção do vento.The demo data contains data readings for temperature, wind speed and, direction. Você pode baixar os dados de demonstração aqui.You can download the demo data from here. O script abaixo importa dados de demonstração para o Azure Notebook.The script below imports demo data to the Azure Notebook.

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

Solicitar dados de previsão diáriaRequest daily forecast data

Em nosso cenário, desejamos solicitar uma previsão diária para cada localização de sensor.In our scenario, we would like to request daily forecast for each sensor location. O script a seguir chama a API de Previsão Diária do serviço Clima dos Azure Mapas.The following script calls the Daily Forecast API of the Azure Maps weather service. Essa API retorna a previsão do tempo para cada turbina eólica, para os próximos 15 dias a contar da data atual.This API returns weather forecast for each wind turbine, for the next 15 days from the current date.

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 service 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={}&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()

O script a seguir renderiza os locais de turbina no mapa chamando o serviço Obter Imagem do Mapa do Azure Mapas.The script below renders the turbine locations on the map by calling the Azure Maps Get Map Image service.

# 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={}&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))

Locais de turbina

Agruparemos os dados de previsão com os dados de demonstração de acordo com a ID da estação.We'll group the forecast data with the demo data based on the station ID. A ID da estação destina-se ao data center meteorológico.The station ID is for the weather data center. Esse agrupamento aumenta os dados de demonstração com os dados de previsão.This grouping augments the demo data with the forecast data.

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

A tabela a seguir exibe os dados históricos e de previsão combinados para um dos locais de turbina.The following table displays the combined historical and forecast data for one of the turbine locations.

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

Dados agrupados

Grouped data

Plotar dados de previsãoPlot forecast data

Plotaremos os valores previstos em relação aos dias para os quais eles são previstos.We'll plot the forecasted values against the days for which they're forecasted. Essa plotagem nos permite ver as alterações de velocidade e direção do vento nos próximos 15 dias.This plot allows us to see the speed and direction changes of the wind for the next 15 days.

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

Os grafos abaixo visualizam os dados de previsão.The graphs below visualize the forecast data. Para a alteração da velocidade do vento, confira o grafo à esquerda.For the change of wind speed, see the left graph. Para a alteração da direção do vento, confira o gráfico à direita.For change in wind direction, see the right graph. Esses dados são a previsão para os próximos 15 dias, a partir do dia em que os dados são solicitados.This data is prediction for next 15 days from the day the data is requested.

Gráfico da velocidade do vento Gráfico da direção do vento

Wind speed plot Wind direction plot

Próximas etapasNext steps

Neste tutorial, você aprendeu a chamar as APIs REST dos Azure Mapas para obter dados de previsão do tempo.In this tutorial you learned, how to call Azure Maps REST APIs to get weather forecast data. Você também aprendeu a visualizar os dados em grafos.You also learned how to visualize the data on graphs.

Para saber mais sobre como chamar as APIs REST do Azure Mapas dentro de Azure Notebooks, consulte Roteamento de EV usando Azure Notebooks.To learn more about how to call Azure Maps REST APIs inside Azure Notebooks, see EV routing using Azure Notebooks.

Para explorar as APIs dos Azure Mapas que são usadas neste tutorial, confira:To explore the Azure Maps APIs that are used in this tutorial, see:

Para obter uma lista completa das APIs REST dos Azure Mapas, confira APIs REST dos Azure Mapas.For a complete list of Azure Maps REST APIs, see Azure Maps REST APIs.

Para saber mais sobre o Azure Notebooks, confira Azure Notebooks.To learn more about Azure Notebooks, see Azure Notebooks.