Что такое временной ряд?

Временной ряд - это последовательность данных, полученных во времени. Время, такое как минуты, часы, дни и т. Д. Анализ временных рядов является частью статистической техники. Временные ряды широко используются в финансовой сфере, прогнозировании погоды, прогнозировании землетрясений, классификации закономерностей и многом другом.

Для прогнозирования или прогнозирования результатов доступны разные типы методов временных рядов, поэтому давайте рассмотрим каждый метод временных рядов.

1. Методы временных рядов:

Основные методы временных рядов имеют несколько типов техники. Они перечислены ниже.

1.1 Простая скользящая средняя.

1.2 Взвешенная скользящая средняя.

1.3. Единичное экспоненциальное сглаживание.

1.4. Двойное экспоненциальное сглаживание.

1.5. Тройное экспоненциальное сглаживание.

1.1 Простое скользящее среднее

Простое скользящее среднее - это очень старый метод, но он является очень мощным методом для определения тенденций или прогнозов бизнеса. SMA (простая скользящая средняя) простыми словами: «сложение цены продуктов за определенный период или интервал, а затем деление суммы на количество периодов или интервалов».

Давайте разберемся на простом примере. Предположим, у нас есть цена продуктов в 12, 15, 16, 18, 20, 23, 26, 30, 23, 29 долларов, и мы хотим найти SMA для числа интервалов или периодов как m = 4. Она будет рассчитана следующим образом 12. + 15 + 16 + 18/4 = 15,25. Следующая итерация будет выглядеть как 15 + 16 + 18 + 20/4 = 17,25. и так далее . Это означает, что когда мы вычисляем SMA, мы одновременно скользим значением или элементами.

Посмотрим SMA в пандах:

  1. 2 взвешенной скользящей средней.

Взвешенная скользящая средняя аналогична простой скользящей средней. В WMA (взвешенное скользящее среднее) данные каждого периода умножаются на вес. Взвешивание определяется количеством интервалов или периодов. Смотрим WMA на простом примере. Предположим, у нас есть такой набор данных

Предположим, что нам нужно найти WMA за 5 дней (период или интервал), а вес задан как 0,5,0,4, 0,3, 0,2, 0,1

Прогнозируйте WMA на дни с 1 по 5 дни, то есть на 6 дней

Примечания. Здесь мы уделили большое внимание недавнему событию.

f6 = (days5 * w1 + days4 * w2 + days3 * w3_days4 * w4 + days5 * w5) / sum (вес)

f6 = 28*0.5+41*0.4+32*0.3+28*0.2+25*0.1 =48.1/1.5 = 39.26

Прогнозируйте WMA от 2 до 6 дней, то есть на 7 дней

f7 = (days6 * w1 + days5 * w2 + days4 * w3_days3 * w4 + days2 * w5) / sum (вес)

f7= 24*0.5+28*0.4+41*0.3+32*0.2+28*0.1 = 44.7/1.5 = 29.8

и так далее….

Окончательные результаты WMA для этого набора данных приведены ниже.

  1. 3 однократное экспоненциальное сглаживание

В взвешенной скользящей средней (WMA) мы можем придать больший вес недавнему событию, но мы ограничены последними m наблюдениями, для улучшения техники WMA мы используем экспоненциальную скользящую среднюю. В экспоненциальной скользящей средней мы принимаем во внимание предыдущее наблюдение. Одиночное (простое) экспоненциальное сглаживание использует взвешенное скользящее среднее с экспоненциально убывающими весами.

α = постоянная сглаживания, 0≤α≤1

t = период времени

Мы просматриваем этот набор данных и вычисляем экспоненциальное сглаживание следующим образом, а значения альфа = 0,2.

Ft = α*At+(1-α)*Ft

F2 = 0.2*25+0.8*25 = 25

F3 = 0.2*29+0.8*25 = 25.8

F4 = 0.2*32+0.8*25.8 = 27.04

F5 = 0.2*22+0.8*27.04 = 26.03

и так далее…

Окончательные результаты показаны на этом изображении:

Простое экспоненциальное сглаживание по моделям состояний

Загрузите набор данных

df1 = df['Open']
df1.plot(kind="line",figsize=(10,5))

from statsmodels.tsa.api import SimpleExpSmoothing 
Open_log = np.log(df1)
Open_log.plot(kind="line",figsize=(10,5))

ses = SimpleExpSmoothing(Open_log).fit(smoothing_level=0.6,optimized=False)
ses1 = ses.forecast(len(Open_log))
Open_log.plot(kind="line",figsize=(10,5))
ses1.plot(kind="line",figsize=(10,5),color='orange')

  1. 4 двойное экспоненциальное сглаживание или двойное экспоненциальное сглаживание Холтса:

Двойное экспоненциальное сглаживание (DWA) также называется двойным экспоненциальным сглаживанием Холтса. Двойное экспоненциальное сглаживание - это расширенная форма простого экспоненциального сглаживания. Метод двойного экспоненциального сглаживания используется для прогнозирования с данными трендов. Он имеет уровень и тренд, но не имеет сезонности. DWA или HDWA (двойное экспоненциальное сглаживание Холтса) имеет два уравнения сглаживания:

если предполагаемый уровень и тенденция в момент времени t-1 равны Lt-1 и Tt-1, соответственно, то прогноз для Yt, который был бы сделан во время t-1, равен Lt-1 + Tt-1. Когда наблюдается фактическое значение, обновленная оценка уровня вычисляется рекурсивно путем интерполяции между Yt и его прогнозом, Lt-1 + Tt-1, с использованием весов α и 1-α:

Lt - значение точки пересечения (серии) в момент времени t.

Изменение расчетного уровня, а именно Lt - Lt ‑ 1, можно интерпретировать как зашумленное измерение тренда в момент времени t. Обновленная оценка тренда затем вычисляется рекурсивно путем интерполяции между Lt - Lt ‑ 1 и предыдущей оценкой тренда, Tt-1, с использованием весов β и 1-β:

Tt - значение наклона (тренда) в момент времени t.

альфа и бета - параметры сглаживания HDES. Всегда лучше выбрать значение по умолчанию для альфа и бета соответственно 0,2 и 0,15.

Диапазон альфа должен находиться в пределах 0≤alpha≤1, а диапазон бета должен находиться в диапазоне 0≤beta≤1.

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
#Importing data
df = pd.read_csv('dataset.csv')
#Printing head
df.head()

#Index 11856 marks the end of year 2013
df = pd.read_csv('dataset.csv', nrows = 11856)
#Creating train and test set 
#Index 10392 marks the end of October 2013 
train=df[0:10392] 
test=df[10392:]
#Aggregating the dataset at daily level
df.Timestamp = pd.to_datetime(df.Datetime,format='%d-%m-%Y %H:%M') 
df.index = df.Timestamp 
df = df.resample('D').mean()
train.Timestamp = pd.to_datetime(train.Datetime,format='%d-%m-%Y %H:%M') 
train.index = train.Timestamp 
train = train.resample('D').mean() 
test.Timestamp = pd.to_datetime(test.Datetime,format='%d-%m-%Y %H:%M') 
test.index = test.Timestamp 
test = test.resample('D').mean()
#Plotting data
train.Count.plot(figsize=(15,8), title= 'Daily Ridership', fontsize=14)
test.Count.plot(figsize=(15,8), title= 'Daily Ridership', fontsize=14)
plt.show()

import statsmodels.api as sm
sm.tsa.seasonal_decompose(train.Count).plot()
result = sm.tsa.stattools.adfuller(train.Count)
plt.show()

from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt
y_hat_avg = test.copy()
fit1 = Holt(np.asarray(train['Count'])).fit(smoothing_level = 0.3,smoothing_slope = 0.1)
y_hat_avg['Holt_linear'] = fit1.forecast(len(test))
plt.figure(figsize=(16,8))
plt.plot(train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['Holt_linear'], label='Holt_linear')
plt.legend(loc='best')
plt.show()

# We will now calculate RMSE to check to accuracy of our model.
from sklearn.metrics import mean_squared_error
rms = np.sqrt(mean_squared_error(test.Count, y_hat_avg.Holt_linear))
print(rms)
43.056259611507286
  1. 5 тройное экспоненциальное сглаживание:

Тройное экспоненциальное сглаживание также известно как «метод остановки-зимы». Когда у нас есть уровень, тенденция и сезонность в наборе данных, мы используем тройное экспоненциальное сглаживание или зимний метод остановок. Это похоже на двойное экспоненциальное сглаживание, мы добавляем один дополнительный параметр гаммы (сезонность) для зимнего метода остановок. В зимнем методе остановок есть три параметра сглаживания: альфа (α), бета (β), гамма (γ).

Значения по умолчанию трех параметров сглаживания соответственно равны α = 0,2, β = 0,15 и γ = 0,05.

Диапазон трех параметров сглаживания:

для α: 0≤α≤1, для β : 0≤ β≤1, для γ: 0≤γ≤1

Чтобы предсказать особенности, мы используем следующие отношения.

Прогноз = уровень + тренд + сезонность

Окончательные результаты =

y_hat_avg = test.copy()
fit1 = ExponentialSmoothing(np.asarray(train['Count']) ,seasonal_periods=7 ,trend='add', seasonal='add',).fit()
y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))
plt.figure(figsize=(8,6))
plt.plot( train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['Holt_Winter'], label='Holt_Winter')
plt.legend(loc='best')
plt.show()

rms = np.sqrt(mean_squared_error(test.Count, y_hat_avg.Holt_Winter))
print(rms)
23.961492566159794

Мы видим, что среднеквадратичная ошибка меньше для метода Halt Winter по сравнению с методом двойного экспоненциального сглаживания.

Код здесь: https://github.com/gitskp/Time-series

Во второй части мы рассмотрим другие концепции и примеры временных рядов.

Если у вас есть вопросы, не стесняйтесь спрашивать.

Использованная литература:

  1. Https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm
  2. Https://www.youtube.com/watch?v=DUyZl-abnNM&index=18&list=PLoK4oIB1jeK0LHLbZW3DTT05e4srDYxFq
  3. Http://www.real-statistics.com/time-series-analysis/
  4. Https://www.analyticsvidhya.com/blog/2018/02/time-series-forecasting-methods/
  5. https: www.appliedaicourse.com
  6. Https://machinelearningmaster.com/time-series-forecasting-methods-in-python-cheat-sheet/