У меня есть файл .csv, содержащий 5-летние временные ряды, с почасовым разрешением (товарная цена). Исходя из исторических данных, я хочу создать прогноз цен на 6-й год.Прогнозирование с помощью статистических моделей
Я прочитал несколько статей на www об этих типах процедур, и в основном я основывал свой код на коде, размещенном там, поскольку мои знания как в Python (особенно в статистических моделях), так и в статистике наиболее ограничены.
Те ссылки, для тех, кто интересуется:
http://www.seanabu.com/2016/03/22/time-series-seasonal-ARIMA-model-in-python/
http://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/
Прежде всего, здесь приведен пример файла .csv. В этом случае данные отображаются с ежемесячным разрешением, это не реальные данные, просто случайным образом выбирают числа, чтобы привести пример здесь (в этом случае я надеюсь, что один год достаточно, чтобы иметь возможность разработать прогноз на 2-й год, а если нет, полный файл CSV доступен):
Price
2011-01-31 32.21
2011-02-28 28.32
2011-03-31 27.12
2011-04-30 29.56
2011-05-31 31.98
2011-06-30 26.25
2011-07-31 24.75
2011-08-31 25.56
2011-09-30 26.68
2011-10-31 29.12
2011-11-30 33.87
2011-12-31 35.45
Мой текущий прогресс заключается в следующем:
После прочтения входного файла и установив столбец даты в качестве индекса даты и времени, то follwing сценарий был использован для разработки прогноза для имеющиеся данные
model = sm.tsa.ARIMA(df['Price'].iloc[1:], order=(1, 0, 0))
results = model.fit(disp=-1)
df['Forecast'] = results.fittedvalues
df[['Price', 'Forecast']].plot(figsize=(16, 12))
, wh ич дает следующий результат:
Теперь, как я уже сказал, я не получил ни одного статистических навыков, и я практически не имею идей, как я попал на этот вывод (в основном, изменение атрибутов порядка внутри первая строка меняет результат), но «фактический» прогноз выглядит неплохо, и я хотел бы продлить его еще на один год (2016 год).
Для того, чтобы сделать это, дополнительные строки создаются в dataframe, следующим образом:
start = datetime.datetime.strptime("2016-01-01", "%Y-%m-%d")
date_list = pd.date_range('2016-01-01', freq='1D', periods=366)
future = pd.DataFrame(index=date_list, columns= df.columns)
data = pd.concat([df, future])
Наконец, когда я использую функцию .predict из statsmodels:
data['Forecast'] = results.predict(start = 1825, end = 2192, dynamic= True)
data[['Price', 'Forecast']].plot(figsize=(12, 8))
что я получаю поскольку прогноз - это прямая линия (см. ниже), которая не кажется совсем не прогнозом. Более того, если я продлю диапазон, который теперь с 1825 года по 2192-й день (2016 год), на протяжении всего 6-летнего промежутка времени, линия прогноза является прямой линией на весь период (2011-2016 годы).
Я также попытался использовать метод statsmodels.tsa.statespace.sarimax.SARIMAX.predict, который учитывает сезонные изменения (что имеет смысл в этом случае), но я получаю некоторую ошибку в отношении «модуля», не имеет атрибута «SARIMAX». Но это второстепенная проблема, при необходимости, в деталях.
Где-то я теряю хватку, и я понятия не имею, где. Спасибо за прочтение. Ура!
У меня есть аналогичная проблема. Могли ли вы это решить? Спасибо – kthouz
нет, я не решил. Я бросил его в какой-то момент из-за некоторого перерыва в моей работе и никогда не возвращался к этому. – davidr