Repositori ini berisi dua implementasi alternatif untuk memperkirakan prediksi daya fotovoltaik berdasarkan data cuaca. Itu dikembangkan untuk tesis sarjana saya yang membandingkan kedua pendekatan itu. Dua sumber data berfungsi sebagai data sampel output cuaca dan daya.
Saya merekomendasikan Pipenv untuk menyiapkan proyek. Dengan Pipenv terpasang Run pipenv install dari root proyek dan akan menginstal semua dependensi yang diperlukan. Kemudian gunakan pipenv shell untuk memasukkan shell di mana semua dependensi akan tersedia atau hanya pipenv run <command> untuk menjalankan perintah tertentu.
Jika Anda tidak menggunakan PIPENV, dependensi ditentukan dalam pipfile dan versi yang saya gunakan dapat ditemukan di pipfile.lock.
Untuk menggunakan layanan PVWatts yang dijelaskan nanti, Anda perlu mendapatkan kunci API. Kemudian, Anda harus mengaturnya sebagai variabel lingkungan (atau memasukkannya ke dalam kode secara langsung). Jika Anda menggunakan PIPENV, ini dapat dilakukan dalam file .env .
Contoh tentang cara menggunakan proyek dapat ditemukan di file contoh di direktori root. Anda dapat langsung menjalankan file -file tersebut setelah menyelesaikan langkah -langkah yang diperlukan untuk mendapatkan data yang dijelaskan di bagian berikutnya.
pipenv run python example_arima_pvwatts.py
pipenv run python example_arima_uq.py
pipenv run python example_svr_pvwatts.py
pipenv run python example_svr_uq.py
Untuk merencanakan dengan matplotlib, panda mengeluarkan peringatan di masa depan, jadi saya meletakkan baris berikut setelah impor:
from pandas . plotting import register_matplotlib_converters ; register_matplotlib_converters ()Ada dua sumber data yang tersedia importir yang mem -parsing data dalam format yang tepat. Tentu saja dimungkinkan untuk menggunakan sumber lain juga. Pertama ada pembungkus PVWATTS dan kedua untuk data yang diperoleh dari UQ Solar.
Data yang disiapkan dari pvwatts terlihat mirip dengan ini:
| waktu | Tamb | wspd | kekuatan |
|---|---|---|---|
| 2019-06-20 06:00:00 | 16.0 | 0,0 | 957.201 |
| 2019-06-20 07:00:00 | 18.0 | 1.5 | 1648.060 |
| 2019-06-20 08:00:00 | 21.0 | 3.1 | 2260.658 |
| 2019-06-20 09:00:00 | 23.0 | 4.1 | 2647.271 |
| 2019-06-20 10:00:00 | 24.0 | 2.6 | 2838.976 |
Ini dapat diperoleh melalui PVWATTS API publik. Untuk mendapatkan kunci API, Anda harus mendaftar di jaringan pengembang NREL. Kunci API kemudian perlu dimasukkan ke dalam variabel lingkungan PVWATTS_API_KEY . Atau, Anda dapat memasukkannya ke Pvwatt secara langsung. Saat itu selesai, Anda dapat menggunakan
from importers import pvwatts
data = pvwatts . load () Ini memanggil API dan mem -parsing hasilnya sebagai DataFrame PANDAS yang dapat diteruskan ke modul peramalan. Anda juga dapat melewati parameter opsional berikut untuk load :
Untuk informasi tentang parameter ini, silakan merujuk ke deskripsi API PVWATTS V6. Semua parameter memiliki nilai default sehingga memanggil metode tanpa parameter juga dimungkinkan. Data pengembalian diindeks menggunakan DateTimeIndex. Karena PVWATTS tidak menentukan tanggal tetapi selalu mengembalikan data selama setahun penuh, tahun 2019 akan ditetapkan untuk setiap dataaframe yang dikembalikan dari modul ini.
Jika Anda memiliki respons JSON PVWATTS yang disimpan dalam file JSON, Anda juga dimungkinkan untuk menguraikan file itu secara langsung menggunakan metode kenyamanan berikut:
pvwatts . load_from_json ( 'filepath.json' )Data yang disiapkan dari umpan langsung UQ Solar terlihat mirip dengan ini:
| waktu | Airtemp | kelembaban | kecepatan angin | Winddirection | kekuatan |
|---|---|---|---|---|---|
| 2015-06-20 07:00:00 | 9.27 | 75.24 | 1.72 | 191.47 | 25302.00 |
| 2015-06-20 08:00:00 | 11.28 | 68.72 | 2.14 | 201.45 | 78240.83 |
| 2015-06-20 09:00:00 | 13.38 | 59.02 | 2.59 | 214.77 | 128523.08 |
| 2015-06-20 10:00:00 | 14.49 | 54.19 | 2.92 | 201.67 | 162968.83 |
| 2015-06-20 11:00:00 | 15.65 | 51.89 | 2.34 | 203.23 | 172535.83 |
Itu dapat diunduh di situs web Live Feed. Pilih PV Site dan PV Array dari bilah sisi di sebelah kanan. Kemudian klik Download Data dan kemudian Download Daily Logs . Dari sana Anda dapat menentukan rentang tanggal (saya sarankan setahun), dan kemudian unduh file Power & Energy serta file Weather . Pastikan Anda mengunduh keduanya dengan rentang tanggal yang sama yang ditentukan.
Sekarang Anda bisa menggunakan
from importers import uq
data = uq . load ( 'power_file.csv' , 'weather_file.csv' ) dan mengganti kedua parameter dengan jalur file untuk setiap file masing -masing. Metode load menggabungkan kedua file lagi menjadi pandaframe pandas, siap untuk diteruskan ke modul peramalan.
Sekarang setelah DataFrame dengan fitur dan data daya hadir, Anda dapat membuat ramalan. Kedua importir mengembalikan DataFrame yang memiliki fitur yang berbeda, tetapi keduanya memiliki kolom power yang mewakili output daya.
Karena data dari kedua importir memiliki datetimeIndex dapat dibagi menjadi pelatihan dan pengujian data seperti ini:
training_data = data [ '20190601' : '20190607' ] # first week of june 2019
testing_data = data [ '20190608' : '20190614' ] # second week of june 2019 Di sini tanggal dikonversi dari string secara implisit. Misalnya '20190601' menggambarkan 2019/06/01 atau 01 Juni 2019.
Algoritma ini menggunakan implementasi SVR scikit-learn yang didasarkan pada LIBSVM. Untuk menggunakannya, kelas berikut tersedia:
from predictors . svr_model import SVRModelMembuat prediksi tanpa meningkatkan data:
model = SVRModel ( scaling = False )
model . fit ( training_data , kernel = 'rbf' , C = 1e3 , gamma = 0.1 , epsilon = 0.1 )
model . predict ( testing_data ) # returns the prediction data frame containing the testing features and the power prediction
model . prediction . power # use this to access the power prediction Menyaring kolom power dari bingkai testing_data tidak diperlukan, kelas SVRModel melakukannya secara otomatis. Secara opsional dimungkinkan untuk lulus filter=['airtemp', 'humidity'] atau serupa dengan fit untuk membatasi fitur yang digunakan untuk peramalan. Tidak perlu memfilter data secara manual dengan cara ini.
kernel Variabel SVR, C , gamma dan epsilon semuanya opsional, semuanya memiliki nilai default.
Untuk membiarkan skala model data sebelum menerapkan regresi, Anda dapat mengatur parameter penskalaan ke True (ini adalah nilai default):
model = svr_model ( base_data = data , scaling = True ) Dengan begitu Anda harus menentukan base_data yang bisa menjadi dataset untuk satu tahun lagi. Ini tidak akan digunakan untuk regresi, semata -mata untuk menyesuaikan objek scaler yang layak. Untuk informasi lebih lanjut tentang yang merujuk pada implementasi StandartScaler dari Scikit-Learn.
Algoritma ini memanfaatkan paket PMDarima (sebelumnya Pyramid-Arima). Ini dapat digunakan dengan mengimpor kelas yang diperlukan:
from predictors . arima_model import ARIMAModelSekarang untuk membuat prediksi tanpa menggunakan variabel eksogen melakukan hal berikut:
model = ARIMAModel () # scaling is set to true automatically
model . fit ( training_data , order = ( 2 , 1 , 4 ), seasonal_order ( 3 , 1 , 2 , 24 ), use_exogenous = False )
model . predict ( hours = 48 ) # returns the prediction
model . prediction . power # use this to access the power predictionn Memberikan fitur pengujian tidak diperlukan karena modelnya cocok tanpa variabel eksogen. Dalam hal ini, DataFrame yang dikembalikan hanya akan memiliki kolom power . order menentukan parameter (p,d,q) dari model. The seasonal_order menentukan parameter (P,D,Q,s) . Parameter penskalaan dapat diatur saat membuat model, secara default diatur ke True tetapi dapat tidak ada:
model = ARIMAModel ( scaling = false )Jika Anda ingin menambahkan variabel eksogen, set parameter ini:
model . fit ( training_data , order = ( 2 , 1 , 4 ), seasonal_order ( 3 , 1 , 2 , 24 ), use_exogenous = True ) # use_exogenous is True by default
model . predict ( testing_data = testing_data ) Dengan cara ini Anda harus menentukan testing_data saat memprediksi. Kolom power akan secara otomatis dihapus saat membuat prediksi yang sebenarnya. Prediksi DataFrame sekarang akan memiliki kolom testing_data di mana kolom power berisi nilai yang diprediksi.
Jika Anda ingin membiarkan algoritma secara otomatis menemukan parameter p, q, P and Q yang sesuai menggunakan panggilan berikut:
model . fit_auto ( training_data , p = ( 0 , 5 ), q = ( 0 , 5 ), P = ( 0 , 5 ), Q = ( 0 , 5 ), d = 1 , D = 1 ) Tupel menentukan rentang di mana algoritma akan mencari parameter optimal. d dan D dapat ditinggalkan untuk secara otomatis menentukan parameter tersebut. Seperti halnya metode fit , use_exogenous akan diatur ke True secara default, tetapi juga dapat ditentukan untuk False .
Karena dimungkinkan dengan SVRModel , Anda juga dapat melewati array filter agar fit dan fit_auto untuk membatasi fitur mana yang harus dimasukkan dalam proses peramalan.