Я хочу использовать метод Winter-Holts в python, чтобы перебрать большой набор данных со многими ссылками и датами, чтобы составить прогноз для каждого продукта. Я хочу использовать statsmodel, но я изо всех сил пытаюсь заставить его перебирать объекты groupby
Я пытался использовать объекты groupby и безуспешно применять методы к каждой группе.
Набор данных для иллюстрации моей проблемы выглядит следующим образом:
data1 = pd.DataFrame({'Id' : ['001',
'001',
'001',
'001',
'003',
'003',
'003'],
'Date' : ['2020-01-01',
'2020-01-08',
'2020-01-15',
'2020-01-22',
'2020-01-29',
'2020-02-5',
'2020-02-12'],
'Quantity' : [3,4,4,5,6,7,1]
})
, и я сделал:
data1['Date'] =pd.to_datetime(data1['Date'])
data2 = data1.groupby('Id').apply(lambda x: x.set_index('Date').resample('SM').sum())['Quantity'].reset_index()
for i in data2.groupby('Id'):
#train_size = data2.apply(train_size = int(len(data2['Quantity'])* 0.75))
train_size = int(len(data2['Quantity'])* 0.7)
train, test = np.asarray(data2[0:train_size]), np.asarray(data2[train_size:len(data2)])
model = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=12, damped=True)
hw_model = model.fit(optimized=True, use_boxcox=False, remove_bias=False)
pred = model.predict(start=test.index[0], end=test.index[-1])
plt.plot(train.index, train, label='Train')
plt.plot(test.index, test, label='Test')
plt.plot(pred.index, pred, label='Holt-Winters')
plt.legend(loc='best')
plt.show()
Я получаю сообщение об ошибке:
TypeError: float() argument must be a string or a number, not 'Timestamp'
но, честно говоря, я не думаю, что мой код делает то, что я пытаюсь сделать. У кого-нибудь есть совет по этому поводу? Являются ли сгруппированные объекты эффективным способом go для прогноза по нескольким продуктам? Спасибо!
ОБНОВЛЕНИЕ: я попытался изменить оператор for l oop, чтобы получить доступ к объектам groupby индивидуумов:
for i in data2.index.get_level_values(0):
#train_size = data2.apply(train_size = int(len(data2['Quantity'])* 0.75))
train_size = int(len(data2['Quantity'])* 0.7)
train, test = data2[0:train_size], data2[train_size:len(data2)]
model = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=12, damped=True)
hw_model = model.fit(optimized=True, use_boxcox=False, remove_bias=False)
pred = model.predict(start=test.index[0], end=test.index[-1])
, что привело к новой ошибке:
ValueError: Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).
Как я должен go об этом?