# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # Курс «Машинное обучение в бизнесе»

# ## Урок 4. Кейс 1. Построение и оценка модели

# ### Домашнее задание к уроку 4

# +
# %matplotlib inline
import matplotlib.pyplot as plt

import numpy as np
import pandas as pd 
import seaborn as sns

import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARIMA
import itertools

from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score 
import os

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error, median_absolute_error, r2_score

import warnings
# -

# #### Задание 1

# Прочитайте базу my_PJME_MW.csv и сделайте ее перерасчет (ресемплинг) в представление по неделям.

data = pd.read_csv('my_PJME_MW.csv', index_col=[0], parse_dates=[0])

data.head()

data.describe()

plt.figure(figsize =(20,6))
plt.plot( data.index, data['PJME_MW'], 'b' )
plt.title('PJM East потребление энергии' )
plt.ylabel ( 'МВт' )
plt.show()

data_w = data['PJME_MW'].resample('W').mean()

data_w.plot(figsize=(20, 6), title='PJM East потребление энергии')


# #### Задание 2

# Постройте модель предсказания 4-й точки от текущей (h = 4), используя результаты автокорреляционного анализа из предшествующих уроков.

def exponential_smoothing(series, alpha):
    result = [series[0]] # first value is same as series
    for n in range(1, len(series)):
        result.append(alpha * series[n] + (1 - alpha) * result[n-1])
    return result


def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100


data_exp_1 = exponential_smoothing(data['PJME_MW'], 0.05)

b_s = pd.DataFrame(data = data[['PJME_MW']])

data_exp_1 = pd.DataFrame(data = data_exp_1, index = b_s.index)

df_end= pd.DataFrame(data_exp_1)

# +
scl = StandardScaler()
scly = StandardScaler()

# сделаем примеры и модель 
def split_data_b( data, split_date ):
    return data.loc[data.index.get_level_values('Date') <= split_date].copy(), \
           data.loc[data.index.get_level_values('Date') >  split_date].copy()

train_b, test_b = split_data_b(df_end, '10-10-2014')

X_train_b = train_b.iloc[:-1,:]
y_train_b = train_b[df_end.columns[0]].values[1:]
X_test_b = test_b.iloc[:-1,:]
y_test_b = test_b[df_end.columns[0]].values[1:]
# -

model_gb = GradientBoostingRegressor(max_depth=15, random_state=0, n_estimators=100)
model_gb.fit(X_train_b, y_train_b) 
X_test_pred_gb = model_gb.predict(X_test_b)

# +
h = 4
X_train_b = train_b.iloc[:-h,:]
y_train_b = train_b[df_end.columns[0]].values[h:]
X_test_b = test_b.iloc[:-h,:]
y_test_b = test_b[df_end.columns[0]].values[h:]

model_gb.fit(X_train_b, y_train_b) 
X_test_pred_gb = model_gb.predict(X_test_b)
# -

warnings.filterwarnings("ignore")
for i in range(4):
    X_test_b.loc[len(X_test_b)] = model_gb.predict(X_test_b[-1:])

print('Значение предсказания четвертой точки от текущей:', X_test_b[-1:])

# Ничего не понял. Сделал как понял.

# #### Задание 3

# Постройте модель предсказания 1-й точки от текущей (h = 1), используя результаты автокорреляционного анализа из предшествующих уроков.

print('Значение предсказания первой точки от текущей:', X_test_b[-4:-3])

# #### Задание 4

# Примените авторекурсию и сравните результат в 4-й точке путем прямого моделирования и путем рекурсивного моделирования на длине выборки из 4-х точек.

# +
# Ничего не понял. Вернусь к этому позже.
# -

# #### Задание 5

# Оцените рост ошибки прогнозирования рекурсивной модели в интервалах от 1-й до 10-й, от 10-й до 20-й, от 20-й до 30-й, .. .10*i-й до (i+1)*10 -й,... ,от 90 до 100-й точках (используйте осреднение по десяткам точек).

# +
# Ничего не понял. Вернусь к этому позже.
# -

# #### Задание 6

# Сделайте вывод о том, как изменилось поведение ошибки предсказания ряда.

# +
# Ничего не понял. Вернусь к этому позже.

StarcoderdataJupyterScriptsDedupFiltered