Import bibliotek.

In [1]:
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from sklearn import metrics
import seaborn; seaborn.set()
Wczytanie tabel i przypisanie ich do zmiennych.

In [2]:
solarGe = pd.read_csv("Actual Generation per Production Type_201501010000-201501020000.csv", sep=",")
solarSz = pd.read_csv("Generation Forecasts - Day Ahead for Wind and Solar_201501010000-201501020000.csv", sep=",")

In [3]:
solarGe.head(2)


Out[3]:
Area MTU Solar - Actual Aggregated [MW] Solar - Actual Consumption [MW]
0 Germany (DE) 01.01.2015 00:00 - 01.01.2015 00:15 (CET) 0 0
1 Germany (DE) 01.01.2015 00:15 - 01.01.2015 00:30 (CET) 0 0

In [4]:
solarSz.head()


Out[4]:
MTU (CET) Generation - Sum [MW] (D) / Germany (DE) Generation - Solar [MW] (D) / Germany (DE)
0 01.01.2015 00:00 - 01.01.2015 00:15 (CET) 0 0
1 01.01.2015 00:15 - 01.01.2015 00:30 (CET) 0 0
2 01.01.2015 00:30 - 01.01.2015 00:45 (CET) 0 0
3 01.01.2015 00:45 - 01.01.2015 01:00 (CET) 0 0
4 01.01.2015 01:00 - 01.01.2015 01:15 (CET) 0 0
Połaczenie tabel oraz wczytanie nazw kolumn by ułatwić usunięcie zbędnych.

In [5]:
solar = pd.concat([solarGe, solarSz], axis=1)
solar.columns


Out[5]:
Index(['Area', 'MTU', 'Solar  - Actual Aggregated [MW]',
       'Solar  - Actual Consumption [MW]', 'MTU (CET)',
       'Generation - Sum [MW] (D) / Germany (DE)',
       'Generation - Solar  [MW] (D) / Germany (DE)'],
      dtype='object')
Usunięcie niepotrzebnych kolum oraz zmiana nazwy pozostałych.

In [6]:
solarC = solar.drop(['Area','MTU','Solar  - Actual Consumption [MW]','Generation - Sum [MW] (D) / Germany (DE)','MTU (CET)'],axis=1)
solarC.columns = ['Gen','Szac']
Sprawdzenie infomracji o utworzonej tabeli.

In [7]:
solarC.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 96 entries, 0 to 95
Data columns (total 2 columns):
Gen     96 non-null int64
Szac    96 non-null int64
dtypes: int64(2)
memory usage: 1.6 KB
Utowrzenie nowego indeksu tabeli.

In [8]:
range = pd.date_range('2015-01-01 00:15:00', '2015-01-02 00:00:00', freq='15min')
solarC = solarC.set_index(range)
Wygenerowanie wykresu pozawalajacego na wizualne porównanie różnicy miedzy rzeczywistą, a szacunkową generacja energii.

In [9]:
solarC.plot(figsize=(20,10), x_compat=True, title='Rzeczywista generacja energii vs szacunkowa')
plt.gca().xaxis.set_major_locator(mdates.HourLocator())
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H : %M'));


Dodanie wysokości błędu bezwględnego w prognozie dla poszczególnych godzin.

In [10]:
solarC['error'] = np.abs(solarC['Gen'] - solarC['Szac'])

In [11]:
solarC['error'].describe()


Out[11]:
count      96.000000
mean      156.916667
std       321.652302
min         0.000000
25%         0.000000
50%         0.000000
75%       103.250000
max      1262.000000
Name: error, dtype: float64
Obliczenie RMSE.

In [12]:
print(np.sqrt(metrics.mean_squared_error(solarC['Gen'], solarC['Szac'])))


356.378076393
Analiza: Średni błąd bezwzględny(MAE) modelu wynosi 156,91. Natomiast pierwiastek błędu średniokwadratowego(RMSE) wynosi 356,37. Znacząca różnica wartości między MAE i RMSE wskazuje na występowanie w okresie prognozy błędów o bardzo dużych wartościach. Największy błąd w prognozie wynosi 1262 MW a odchylenie standardowe błędów wynosi 321 MW. Na wykresie doskonale widać, że prognoza w porannych godzinach bardzo przypomina rzeczywistą wartość wygenerowanej energii, podobnie w godzinach popołudniowych kiedy generacja energii maleje. Niestety w okresie między 10 a 15 kiedy rzeczywista generacja wzrasta w bardzo szybkim tempie i osiąga swoje maksimum(zapewne w momencie kiedy słońce znajduje się najwyżej na horyzoncie), model predykcyjny coraz bardziej niedoszacowuje wartości wygenerowanej energii. Brak danych z wcześniejszego okresu na stronie skąd pobrane zostały dane może sugerować brak danych historycznych oraz początki wdrożenia modelu prognozującego, dlatego zaobserwowane rozbieżności mogą wynikać z prostoty modelu. Jeśli spojrzymy na wykres prognozowanych wartości, że ma on prawie symetryczny kształt co może wskazywać na wykorzystanie w modelu jednego parametru za pomocą którego dokonywana jest predykcja.