Как посчитать weekday avarage?
Датасет https://drive.google.com/file/d/1HVPWEi6AknmOVBPWheizOG9oI225C3-C/view?usp=sharing По примеру статьи https://habr.com/ru/company/ods/blog/327242/
import sys
import warnings
warnings.filterwarnings('ignore')
from tqdm import tqdm
import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error
import statsmodels.formula.api as smf
import statsmodels.tsa.api as smt
import statsmodels.api as sm
import scipy.stats as scs
from scipy.optimize import minimize
import matplotlib.pyplot as plt
def code_mean(data, cat_feature, real_feature):
"""
Возвращает словарь, где ключами являются уникальные категории признака cat_feature,
а значениями - средние по real_feature
"""
return dict(data.groupby(cat_feature)[real_feature].mean())
dataset = pd.read_csv('/content/drive/My Drive/coursera/hour_online.csv')
data = dataset.copy()
data.columns = ["Time","y"]
data['Time'] = pd.to_datetime(data['Time'])
data["hour"] = data['Time'].dt.hour
data["weekday"] = data['Time'].dt.weekday
data['is_weekend'] = data.weekday.isin([5,6])*1
data.head()
lag_start=5
lag_end=20
test_size=0.15
test_index = int(len(data.y)*(1-test_size))
for i in range(lag_start, lag_end):
data["lag_{}".format(i)] = data.y.shift(i)
data['weekday_average'] = map(code_mean(data[:test_index], 'weekday', "y").get, data.weekday)
data["hour_average"] = map(code_mean(data[:test_index], 'hour', "y").get, data.hour)
data.drop(["hour", "weekday"], axis=1, inplace=True)
data = data.dropna()
data = data.reset_index(drop=True)
X_train = data.loc[:test_index].drop(["y"], axis=1)
y_train = data.loc[:test_index]["y"]
X_test = data.loc[test_index:].drop(["y"], axis=1)
y_test = data.loc[test_index:]["y"]
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
X_train = X_train.fillna(0)
X_test = X_test.fillna(0)
TypeError: invalid type promotion
data['weekday_average'] = map(code_mean(data[:test_index], 'weekday', "y").get, data.weekday)
data["hour_average"] = map(code_mean(data[:test_index], 'hour', "y").get, data.hour)
Возвращают объект map, LinearRegression с таким работать не умеет. Как сделать отдельные колонки weekday_average_1 (среднее значение для дня 1), weekday_average_12(среднее значение для дня 2), и т. д.?
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Попробуйте так:
In [27]: data['weekday_average'] = data.groupby("weekday")["y"].transform("mean")
In [28]: data["hour_average"] = data.groupby("hour")["y"].transform("mean")
In [29]: data
Out[29]:
Time y hour weekday is_weekend ... lag_17 lag_18 lag_19 weekday_average \
0 2017-01-01 00:00:00 34002 0 6 1 ... NaN NaN NaN 43392.143603
1 2017-01-01 01:00:00 37947 1 6 1 ... NaN NaN NaN 43392.143603
2 2017-01-01 02:00:00 41517 2 6 1 ... NaN NaN NaN 43392.143603
3 2017-01-01 03:00:00 44476 3 6 1 ... NaN NaN NaN 43392.143603
4 2017-01-01 04:00:00 46234 4 6 1 ... NaN NaN NaN 43392.143603
... ... ... ... ... ... ... ... ... ... ...
2620 2017-04-20 05:00:00 34833 5 3 0 ... 39052.0 40959.0 41789.0 39519.035135
2621 2017-04-20 06:00:00 35932 6 3 0 ... 35257.0 39052.0 40959.0 39519.035135
2622 2017-04-20 07:00:00 38418 7 3 0 ... 30981.0 35257.0 39052.0 39519.035135
2623 2017-04-20 08:00:00 40238 8 3 0 ... 26167.0 30981.0 35257.0 39519.035135
2624 2017-04-20 09:00:00 40763 9 3 0 ... 23643.0 26167.0 30981.0 39519.035135
hour_average
0 31559.781818
1 33213.163636
2 35790.550459
3 40264.745455
4 45419.118182
... ...
2620 48774.745455
2621 51035.481818
2622 53838.000000
2623 55514.927273
2624 56771.663636
[2625 rows x 22 columns]
