In [1]:
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdate
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import seaborn; seaborn.set()
In [2]:
r11 = pd.read_csv("2011.csv", sep=';', na_values='#N/D!',\
usecols=["Data",'Godzina', 'Krajowe zapotrzebowanie na moc [MW]'], parse_dates=["Data"], index_col=['Data'])
r12 = pd.read_csv("2012.csv", sep=";", na_values='#N/D!',\
usecols=["Data",'Godzina', 'Krajowe zapotrzebowanie na moc [MW]'], parse_dates=["Data"], index_col=['Data'])
r13 = pd.read_csv("2013.csv", sep=";", na_values='#N/D!',\
usecols=["Data",'Godzina', 'Krajowe zapotrzebowanie na moc [MW]'], parse_dates=["Data"], index_col=['Data'])
r14 = pd.read_csv("2014.csv", sep=";", na_values='#N/D!',\
usecols=["Data",'Godzina', 'Krajowe zapotrzebowanie na moc [MW]'], parse_dates=["Data"], index_col=['Data'])
r15 = pd.read_csv("2015.csv", sep=";", na_values='#N/D!',\
usecols=["Data",'Godzina', 'Krajowe zapotrzebowanie na moc [MW]'], parse_dates=["Data"], index_col=['Data'])
r16 = pd.read_csv("2016.csv", sep=";", na_values='#N/D!',\
usecols=["Data",'Godzina', 'Krajowe zapotrzebowanie na moc [MW]'], parse_dates=["Data"], index_col=['Data'])
r17 = pd.read_csv("2017.csv", sep=";", na_values='#N/D!',\
usecols=["Data",'Godzina', 'Krajowe zapotrzebowanie na moc'], parse_dates=["Data"], index_col=['Data'])
In [3]:
r17['Krajowe zapotrzebowanie na moc [MW]'] = r17['Krajowe zapotrzebowanie na moc']
r17.drop('Krajowe zapotrzebowanie na moc', axis=1, inplace=True)
zapotrzebowanie = pd.concat([r11, r12, r13, r14, r15, r16, r17])
zapotrzebowanie.columns = ['godz', 'zapotrzebowanie']
In [4]:
zapotrzebowanie.head()
Out[4]:
In [5]:
zapotrzebowanie = zapotrzebowanie.replace(' ', '', regex=True)
zapotrzebowanie['zapotrzebowanie'] = pd.to_numeric(zapotrzebowanie['zapotrzebowanie'])
In [6]:
zapotrzebowanie.head()
Out[6]:
In [7]:
tt = pd.DataFrame(zapotrzebowanie.groupby([zapotrzebowanie.index])['godz'].count())
qwe = tt[(tt.godz < 24) | (tt.godz > 24)].index
qwe
Out[7]:
In [8]:
zapotrzebowanie.drop(qwe, inplace=True)
In [9]:
tt2 = pd.DataFrame(zapotrzebowanie.groupby([zapotrzebowanie.index])['godz'].count())
tt2[(tt2.godz < 24) | (tt2.godz > 24)]
zapotrzebowanie.info()
In [10]:
rt = pd.DataFrame(pd.date_range('2011-02-10 00:59:59', '2017-10-15 23:59:59', freq='H', close='left'))
rt['zxc'] = rt[0]
rt = rt.set_index(rt[0])
rt.head(3)
a = rt
In [11]:
daty = ['2011-03-27', '2011-10-30', '2012-03-25', '2012-10-28',
'2013-03-31', '2013-10-27', '2014-03-30', '2014-10-26',
'2015-03-29', '2015-10-25', '2016-03-27', '2016-10-30',
'2017-03-26']
In [12]:
for i in range(13):
rt.drop(rt.loc[daty[i]].index,inplace=True)
In [13]:
d = rt.index
In [14]:
clean = zapotrzebowanie
clean = clean.set_index(d)
clean.tail(4)
Out[14]:
In [15]:
clean['zapotrzebowanie'].plot(figsize=(20,10), title='Zapotrzebowanie na energie w latach 2011 - 2017');
In [16]:
days = ['Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob', 'Nie']
for i in range(7):
clean[days[i]] = (clean.index.weekday == i).astype(float)
clean['tydzien'] = clean.index.month.astype(float)
clean.head()
Out[16]:
In [17]:
godz = ['1', '2', '3', '4', '5', '6','7', '8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24']
for i in range(24):
clean[godz[i]] = (clean.index.hour+1 == i+1).astype(float)
In [18]:
clean.drop(['godz'], inplace=True, axis=1)
In [19]:
clean.head()
Out[19]:
In [20]:
clean.groupby(clean.index.year)['zapotrzebowanie'].describe()
Out[20]:
In [21]:
tygodniowe = clean['zapotrzebowanie'].resample('W').sum()
tygodniowe.rolling(20, center=True).mean().plot(figsize=(20,10));
In [22]:
fig, ax = plt.subplots(1, 2, figsize=(20,7))
by_time = clean.groupby(clean.index.time).mean()
hourly_ticks = 4 * 60 * 60 * np.arange(6)
by_time.zapotrzebowanie.plot(ax=ax[0], xticks=hourly_ticks, title='Średnie zapotrzebowanie w danej godzinie')
by_weekday = clean.groupby(clean.index.dayofweek).mean()
by_weekday.index = ['Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob', 'Nie']
by_weekday.zapotrzebowanie.plot(ax=ax[1], title='Średnie zapotrzebowanie w danym dniu tygodnia',);
In [23]:
by_weekday
Out[23]:
In [24]:
def dlugosc_dnia(dane, axis=21.01, latitude=52.23):
days = (dane - pd.datetime(2000, 12, 21)).days
m = (1. - np.tan(np.radians(latitude))
* np.tan(np.radians(axis) * np.cos(days * 2 * np.pi / 365.25)))
return 24. * np.degrees(np.arccos(1 - np.clip(m, 0, 2))) / 180. - 0.20
clean['d_dnia'] = list(map(dlugosc_dnia, clean.index))
fig, ax = plt.subplots(2, figsize=(20,7))
clean['d_dnia'].plot( ax=ax[0],figsize=(20,10), title='Długość dnia')
clean['zapotrzebowanie'].plot( ax=ax[1],figsize=(20,10),title='Zapotrzebowanie na energie w latach 2011 - 2017' );
In [37]:
column_names = ['Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob', 'Nie', 'tydzien', 'd_dnia','1', '2', '3', '4', '5', '6', '8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24']
X = clean[column_names]
y = clean['zapotrzebowanie']
model = LinearRegression(fit_intercept = False)
model.fit(X, y)
clean['szacunek'] = model.predict(X)
In [38]:
clean[['zapotrzebowanie', 'szacunek']].plot(alpha=0.5, figsize=(20,10));
In [45]:
clean[clean['zapotrzebowanie'] == clean['zapotrzebowanie'].min()]
Out[45]:
In [27]:
print('Współczynnik determinacji wynosi: %.2f' % r2_score(clean['zapotrzebowanie'], clean['szacunek']))
In [28]:
s = pd.date_range('2017-10-16 00:59:59', '2017-10-22 23:59:59', freq='H', close='left')
nowe = pd.DataFrame(index=s)
for i in range(7):
nowe[days[i]] = (nowe.index.weekday == i).astype(float)
nowe['tydzien'] = nowe.index.month.astype(float)
nowe['d_dnia'] = list(map(dlugosc_dnia, nowe.index))
for i in range(24):
nowe[godz[i]] = (nowe.index.hour+1 == i+1 ).astype(float)
In [29]:
nowe.head(2)
Out[29]:
In [30]:
X = nowe[column_names]
nowe['szacunek'] = model.predict(X)
In [31]:
nowe.head(24)
Out[31]:
In [32]:
nowe['szacunek'].plot(alpha=0.5, figsize=(20,10));