Tutorial: Bergabung dalam data sensor dengan data prakiraan cuaca dengan menggunakan Azure Notebooks (Python)

Tenaga angin adalah salah satu sumber energi alternatif untuk bahan bakar fosil guna memerangi perubahan iklim. Karena angin sifatnya tidak konsisten, operator tenaga angin perlu membuat model pembelajaran mesin (ML) untuk memprediksi kapasitas tenaga angin. Prediksi ini diperlukan untuk memenuhi permintaan listrik dan memastikan stabilitas jaringan. Dalam tutorial ini, kita membahas bagaimana data prakiraan cuaca Azure Maps digabungkan dengan data demo untuk pembacaan cuaca. Data prakiraan cuaca diminta dengan memanggil layanan Cuaca Azure Maps.

Dalam tutorial ini, Anda akan:

  • Bekerja dengan file data di Azure Notebook di cloud.
  • Memuat data demo dari file.
  • Panggil REST API Azure Maps dengan Python.
  • Merender data lokasi di peta.
  • Memperkaya data demo dengan data cuaca Prakiraan Harian Azure Maps.
  • Merencanakan data prakiraan dalam grafik.

Prasyarat

Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

Catatan

Untuk informasi selengkapnya tentang autentikasi di Azure Maps, lihat mengelola autentikasi di Azure Maps.

Untuk memahami buku catatan Azure dan mengetahui cara memula, ikuti petunjuk Membuat Buku Catatan Azure.

Catatan

File buku catatan Jupyter untuk proyek ini dapat diunduh dari Repositori Weather Maps Jupyter Notebook.

Memuat modul dan kerangka kerja yang diperlukan

Untuk memuat semua modul dan kerangka kerja yang diperlukan, jalankan skrip berikut:

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

Mengimpor data cuaca

Tutorial ini menggunakan pembacaan data cuaca dari sensor yang dipasang pada empat turbin angin yang berbeda. Sampel data terdiri dari 30 hari pembacaan cuaca. Pembacaan ini dikumpulkan dari pusat data cuaca di dekat setiap lokasi turbin. Data demo berisi pembacaan data untuk suhu, kecepatan angin, dan arah. Anda dapat mengunduh data demo yang terkandung dalam weather_dataset_demo.csv dari GitHub. Skrip di bawah mengimpor data demo ke Azure Notebook.

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

Meminta data perkiraan harian

Dalam skenario kami, kami ingin meminta perkiraan harian untuk setiap lokasi sensor. Skrip berikut memanggil API Prakiraan Harian layanan Azure Maps Weather. API ini menampilkan prakiraan cuaca untuk setiap turbin angin, selama 15 hari ke depan dari tanggal saat ini.

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

Skrip berikut merender lokasi turbin di peta dengan memanggil layanan Dapatkan Gambar Peta.

# 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

Kelompokkan data prakiraan dengan data demo berdasarkan ID stasiun. ID stasiun adalah untuk pusat data cuaca. Pengelompokan ini menambah data demo dengan data perkiraan.

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

Tabel berikut menampilkan gabungan data historis dan prakiraan untuk salah satu lokasi turbin.

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

Grouped data

Merencanakan data perkiraan

Plot nilai yang diperkirakan terhadap hari yang diperkirakan. Plot ini memungkinkan kami melihat perubahan kecepatan dan arah angin selama 15 hari ke depan.

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

Grafik berikut memvisualisasikan data prakiraan. Untuk perubahan kecepatan angin, lihat grafik kiri. Untuk perubahan arah angin, lihat grafik kanan. Data ini adalah prediksi untuk 15 hari ke depan dari hari data diminta.

Wind speed plotWind direction plot

Dalam tutorial ini, Anda mempelajari cara memanggil AZURE Peta REST API untuk mendapatkan data prakiraan cuaca. Anda juga mempelajari cara memvisualisasikan data di grafik.

Untuk mempelajari lebih lanjut tentang cara memanggil REST API Azure Maps di dalam Azure Notebook, lihat Perutean EV menggunakan Azure Notebooks.

Untuk menjelajahi API Azure Maps yang digunakan dalam tutorial ini, lihat:

Untuk mengetahui daftar lengkap REST API Azure Maps, lihat REST API Azure Maps.

Membersihkan sumber daya

Tidak ada sumber daya yang memerlukan pembersihan.

Langkah berikutnya

Untuk mempelajari selengkapnya tentang Notebooks, lihat