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:
- Buat dan jalankan Jupyter Notebook di Visual Studio Code.
- 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.
Catatan
File buku catatan Jupyter untuk proyek ini dapat diunduh dari Repositori Weather Maps Jupyter Notebook.
Prasyarat
Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.
- Akun Azure Maps
- Kunci langganan
- Visual Studio Code
- Pengetahuan kerja tentang Jupyter Notebooks di Visual Studio Code
- Lingkungan disiapkan untuk bekerja dengan Python di Jupyter Notebooks. Untuk informasi selengkapnya, lihat Menyiapkan lingkungan Anda.
Catatan
Untuk informasi selengkapnya tentang autentikasi di Azure Maps, lihat mengelola autentikasi di Azure Maps.
Memasang paket tingkat proyek
Proyek Perutean EV dan Rentang yang Dapat Dijangkau memiliki dependensi pada pustaka python aiohttp dan IPython . Anda dapat menginstalnya di terminal Visual Studio menggunakan pip:
pip install aiohttp
pip install ipython
pip install pandas
Buka Jupyter Notebook di Visual Studio Code
Unduh lalu buka Notebook yang digunakan dalam tutorial ini:
Buka file weatherDataMaps.ipynb di repositori AzureMapsJupyterSamples di GitHub.
Pilih tombol Unduh file mentah di sudut kanan atas layar untuk menyimpan file secara lokal.
Buka Notebook yang diunduh di Visual Studio Code dengan mengklik kanan file lalu pilih Buka dengan > Visual Studio Code, atau melalui File Explorer Visual Studio Code.
Memuat modul dan kerangka kerja yang diperlukan
Setelah kode ditambahkan, Anda dapat menjalankan sel menggunakan ikon Jalankan di sebelah kiri sel dan output ditampilkan di bawah sel kode.
Jalankan skrip berikut untuk memuat semua modul dan kerangka kerja yang diperlukan.
import aiohttp
import pandas as pd
import datetime
from IPython.display import Image, display
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¢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))
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()
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.
Dalam tutorial ini, Anda mempelajari cara memanggil REST API Azure Maps untuk mendapatkan data prakiraan cuaca. Anda juga mempelajari cara memvisualisasikan data di grafik.
Untuk menjelajahi API Azure Maps yang digunakan dalam tutorial ini, lihat:
Untuk mengetahui daftar lengkap REST API Azure Maps, lihat REST API Azure Maps.