Kurz: Spojení dat snímačů s daty předpovědi počasí pomocí Azure Notebooks (Python)

Větrná energie je jedním z alternativních zdrojů energie pro fosilní paliva v boji proti změně klimatu. Vzhledem k tomu, že vítr není ze své podstaty konzistentní, musí operátoři větrné energie vytvářet modely strojového učení (ML), aby předpověděly kapacitu větrné energie. Tato předpověď je nezbytná ke splnění poptávky po elektřině a zajištění stability sítě. V tomto kurzu si ukážeme, jak se data předpovědi počasí v Azure Mapy kombinují s ukázkovými daty pro čtení počasí. Data předpovědi počasí se požadují voláním služeb Azure Mapy Weather.

V tomto kurzu:

  • Práce s datovými soubory v Azure Notebooks v cloudu
  • Načtěte ukázková data ze souboru.
  • Volání rozhraní REST API Azure Mapy v Pythonu
  • Vykreslujte data o poloze na mapě.
  • Obohacení ukázkových dat o data o počasí v Azure Mapy Denní předpověď
  • Vykreslení dat prognózy v grafech

Požadavky

Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.

Poznámka:

Další informace o ověřování v Azure Mapy najdete v tématu správa ověřování v Azure Mapy.

Pokud se chcete seznámit s poznámkovými bloky Azure a zjistit, jak začít, postupujte podle pokynů k vytvoření poznámkového bloku Azure.

Poznámka:

Soubor poznámkového bloku Jupyter pro tento projekt si můžete stáhnout z úložiště Weather Mapy Jupyter Notebook.

Načtení požadovaných modulů a architektur

Pokud chcete načíst všechny požadované moduly a architektury, spusťte následující skript:

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

Import dat o počasí

V tomto kurzu se používají údaje o počasí ze senzorů nainstalovaných ve čtyřech různých větrných turbínách. Ukázková data se skládají z 30 dnů čtení počasí. Tato čtení se shromažďují z datových center počasí v blízkosti každé lokality turbíny. Ukázková data obsahují údaje o teplotě, rychlosti větru a směru. Ukázková data obsažená v weather_dataset_demo.csv si můžete stáhnout z GitHubu. Následující skript naimportuje ukázková data do poznámkového bloku Azure.

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

Vyžádání dat denní prognózy

V našem scénáři bychom chtěli požádat o denní prognózu pro každé umístění senzoru. Následující skript volá rozhraní API denní prognózy služeb Azure Mapy Weather. Toto rozhraní API vrátí předpověď počasí pro každou větrnou turbínu za příštích 15 dnů od aktuálního data.

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

Následující skript vykreslí umístění turbíny na mapě voláním služby Získat mapový obrázek.

# 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

Seskupte data prognózy s ukázkovými daty podle ID stanice. ID stanice je určené pro datové centrum počasí. Toto seskupení rozšiřuje ukázková data o data prognózy.

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

V následující tabulce jsou zobrazena souhrnná historická data a data prognózy pro jedno z lokalit turbíny.

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

Grouped data

Vykreslení dat prognózy

Vykreslujte předpovídané hodnoty na dny, pro které jsou předpovídané. Tento graf nám umožňuje zobrazit změny rychlosti a směru větru po dobu následujících 15 dnů.

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

Následující grafy vizualizují data prognózy. Změna rychlosti větru najdete v levém grafu. Informace o změně směru větru najdete v pravém grafu. Tato data jsou predikovaná po dobu následujících 15 dnů od dne, kdy se data požadují.

Wind speed plotWind direction plot

V tomto kurzu jste zjistili, jak volat rozhraní REST API služby Azure Mapy k získání dat předpovědi počasí. Dozvěděli jste se také, jak vizualizovat data v grafech.

Další informace o volání rozhraní REST API azure Mapy v Azure Notebooks najdete v tématu Směrování EV pomocí Azure Notebooks.

Pokud chcete prozkoumat rozhraní API azure Mapy, která se používají v tomto kurzu, podívejte se na:

Úplný seznam rozhraní REST API služby Azure Mapy najdete v tématu Rozhraní REST API služby Azure Mapy.

Vyčištění prostředků

Nejsou k dispozici žádné prostředky, které by vyžadovaly vyčištění.

Další kroky

Další informace o službě Azure Notebooks najdete v tématu