Прогнозирование продаж с набором данных за 6 лет - python - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь прогнозировать спрос на основе набора данных за 6 лет 01.01.2014 ==> 01.01.2020. Сначала я попытался перегруппировать спрос по месяцам, и в результате я получил набор данных из 2 столбцов (месяц и продажи) и 72 строк (12 месяцев * 6 лет). PS: Я работаю с python.

Мой первый вопрос: достаточно ли получить прогнозы на следующий год (2020), зная тот факт, что у меня всего 72 строки.

Мой второй вопрос: есть ли модели, с которыми вы можете посоветовать мне поработать, и это дало бы мне хорошую точность?

Я пытался работать с моделью арима в сочетании с сезонностью (саримакс) и LSTM, хотя она не работала, я не уверен, правильно ли я это делаю.

Мой третий вопрос: есть ли любой тест в python, который говорит вам, есть ли сезонность или нет?

enter image description here

#shrink the dataset
dataa=data[(data['Produit']=='ACP NOR/STD')&(data['Région']=='Europe')]

gb2=dataa.groupby(by=[dataa['Mois'].dt.strftime('%Y, %m')])['Chargé (T)'].sum().reset_index()
gb2.Mois=pd.to_datetime(gb2.Mois)

[#create a time serie][2]
series = pd.Series(gb2['Chargé (T)'].values, index=gb2.Mois)


#decompose the dataset to 3 things: trend, seasonality and noise
from pylab import rcParams
import statsmodels.api as sm
rcParams['figure.figsize'] = 18, 8
decomposition = sm.tsa.seasonal_decompose(series, model='additive')
fig = decomposition.plot()
plt.show()


    #calculate acf and pacf to know in which order to stop

    from statsmodels.graphics.tsaplots import plot_acf
    from statsmodels.graphics.tsaplots import plot_pacf
    from matplotlib import pyplot

    pyplot.figure()
    pyplot.subplot(211)
    plot_acf(series, ax=pyplot.gca())
    pyplot.subplot(212)
    plot_pacf(series, ax=pyplot.gca())
    pyplot.show()

import itertools
p = d = q = range(0, 5)
pdq = list(itertools.product(p, d, q))
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
print('Examples of parameter combinations for Seasonal ARIMA...')
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))


    import warnings
    warnings.filterwarnings("ignore")
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(series,
                                                order=param,
                                                seasonal_order=param_seasonal,
                                                enforce_stationarity=False,
                                                enforce_invertibility=False)

                results = mod.fit()

                print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
            except:
                continue

mod = sm.tsa.statespace.SARIMAX(series,
                                order=(0, 1, 2),
                                seasonal_order=(0, 4, 0, 12),
                                enforce_stationarity=False,
                                enforce_invertibility=False)

    results = mod.fit()

    print(results.summary().tables[1])
    results.plot_diagnostics(figsize=(16, 8))
    plt.show()
    #get predictions
    pred = results.get_prediction(start=pd.to_datetime('2019-01-01'), dynamic=False)
    pred_ci = pred.conf_int()

    ax = series['2014':].plot(label='observed')
    pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.8, figsize=(14, 7))

    ax.fill_between(pred_ci.index,
                    pred_ci.iloc[:, 0],
                    pred_ci.iloc[:, 1], color='k', alpha=.2)

    ax.set_xlabel('Date')
    ax.set_ylabel('Chargé (T)')
    plt.legend()

    plt.show()

Предсказания не имеют ничего общего с реальностью .. Я был бы очень признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020
  1. Как я знаю, мы можем произвести значимый прогноз, используя такой объем данных (это означает, что для каждого месяца вы используете 6 точек данных, чтобы соответствовать модели), но постарайтесь использовать как можно больше данных - тогда Ваша точность будет только увеличиваться.
  2. Почти всегда есть некоторая сезонность во временных рядах, даже больше, также есть тенденция. Таким образом, вам необходимо разложить исходные временные ряды на тренды, сезоны и остатки, и все прогнозы будут сделаны с остатками. Что касается модели - ARIMA достаточно для прогнозирования временных рядов, чтобы сделать ее более точной, просто настройте ваши параметры (p и q), используя PACF и ACF.
  3. Мы делаем разложение, чтобы сделать наш временной ряд стационарным, другими словами
    • , чтобы извлечь из него остатки (мы должны обучать нашу модель только на стационарных данных). Скорее, вы можете проверить стационарность, а не сезонность
    • есть тест ADF для него.

Я провел много исследований по этому вопросу и имел один проект по прогнозированию, здесь является примером, где описаны все шаги:

0 голосов
/ 12 февраля 2020

Ответ на ваш первый вопрос: Собранные вами данные выглядят небольшими, и было бы здорово, если бы вы могли собирать их по дням, чтобы ваша модель работала великолепно. Поскольку рекуррентные нейронные сети хорошо работают с элементами данных, собранными с меньшей разницей во времени, я предлагаю вам собирать данные в течение дня, которые могут привести вас к (12 x 30 x 6). Это может стать лучшим источником информации для любой модели.

Ответ на второй вопрос: Я лично предлагаю вам попробовать LSTM с большим количеством данных, ценными параметрами и хорошей коллекцией, приведенной в этой средней публикации. Средняя публикация

Производительность варьируется с изменением параметров, поэтому будьте осторожны при выборе параметров, которые вводятся.

Ответ на третий вопрос: Сезонность обычно определяется с использованием метода, называемого «Обнаружение аномалий». Небольшая дискуссия также обсуждается в средней статье, приведенной выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...