Pandas экспоненциальное сглаживание внутри групповых объектов - PullRequest
0 голосов
/ 29 января 2020

Я хочу использовать метод 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 об этом?

...