Альтернатива для модели пространства состояний экспоненциального сглаживания r в python / scikit / numpy

В R мы имеем одну хорошую модель прогнозирования, такую ​​как:

ets(y, model="ZZZ", damped=NULL, alpha=NULL, beta=NULL, gamma=NULL, phi=NULL, additive.only=FALSE, lambda=NULL, lower=c(rep(0.0001,3), 0.8), upper=c(rep(0.9999,3),0.98), opt.crit=c("lik","amse","mse","sigma","mae"), nmse=3, bounds=c("both","usual","admissible"), ic=c("aicc","aic","bic"), restrict=TRUE, allow.multiplicative.trend=FALSE, use.initial.values=FALSE, ...) 

В этом методе, если мы назначаем какую-либо переменную, она автоматически получает тип сезона, тип тренда и типа ошибки, например model="ZZZ"/"AMA"/"MMZ" а некоторые из коэффициентов автоматически настраиваются для получения точных результатов.

  • В python у нас есть что-то похожее на ets в pandas / numpy / scipy / scikit?

    По моим исследованиям:
    Ewma in pandas аналогична, но нам нужно жестко задавать все параметры фиксированным.
    В Holtwinter нам нужно написать подробные методы для всех типов трендов и сезонов.

  • Итак, вместо этого у нас есть какие-либо готовые функции, которые принимают данные в качестве входных данных и обеспечивают прогнозирующие значения, не записывая никаких внутренних функций для самих параметров?

  • Любые тонкие регрессионные модели scikit / statsmodels?

One Solution collect form web for “Альтернатива для модели пространства состояний экспоненциального сглаживания r в python / scikit / numpy”

После поиска немного, я не нашел ничего, что кажется действительно многообещающим, как альтернатива ets для python. Есть несколько попыток: StatsModels и методы прогнозирования pycast , которые вы можете проверить, соответствуют ли они вашим потребностям.

Один из вариантов, который вы можете использовать для обхода отсутствующей реализации, заключается в том, чтобы запустить Rscript из python с помощью модуля подпроцесса . Существует очень хорошая статья о том, как это сделать здесь .

Чтобы сделать это позже:

  1. Вам нужно создать Rscript (например, my_forecast.R ), который будет вычислять (используя ets ) и печатать прогнозы в файле или на stdout (с помощью команды cat() ), чтобы использовать их после запуска скрипта ,
  2. Вы можете запустить Rscript из сценария python следующим образом:

     import subprocess # You need to define the command that will run the Rscript from the subprocess command = 'Rscript' path2script = 'path/to/my_forecast.R' cmd = [command, path2script] # Option 1: If your script prints to a file subprocess.run(cmd) f = open('path/to/created/file', 'r') (...Do stuff from here...) # Option 2: If your script prints to stdout forecasts = subprocess.check_output(cmd, universal_newlines=True) (...Do stuff from here...) 

    Вы также можете добавить аргументы к вашему cmd , который будет использоваться вашими аргументами командной строки Rscript следующим образом:

     args = [arg0, arg1, ...] cmd = [command, path2script] + args Then pass cmd to the subprocess 

РЕДАКТИРОВАТЬ:

Я нашел и образцовую серию статей о Прогнозировании Холт- Зитер: part1 , part2 и part3 . Кроме того, легко понять, анализ в этих статьях, Григорий Трубецкой (автор) предоставил разработанный им код:

Начальная тенденция:

 def initial_trend(series, slen): sum = 0.0 for i in range(slen): sum += float(series[i+slen] - series[i]) / slen return sum / slen # >>> initial_trend(series, 12) # -0.7847222222222222 

Начальные сезонные компоненты:

 def initial_seasonal_components(series, slen): seasonals = {} season_averages = [] n_seasons = int(len(series)/slen) # compute season averages for j in range(n_seasons): season_averages.append(sum(series[slen*j:slen*j+slen])/float(slen)) # compute initial values for i in range(slen): sum_of_vals_over_avg = 0.0 for j in range(n_seasons): sum_of_vals_over_avg += series[slen*j+i]-season_averages[j] seasonals[i] = sum_of_vals_over_avg/n_seasons return seasonals # >>> initial_seasonal_components(series, 12) # {0: -7.4305555555555545, 1: -15.097222222222221, 2: -7.263888888888888, # 3: -5.097222222222222, 4: 3.402777777777778, 5: 8.069444444444445, # 6: 16.569444444444446, 7: 9.736111111111112, 8: -0.7638888888888887, # 9: 1.902777777777778, 10: -3.263888888888889, 11: -0.7638888888888887} 

Наконец, алгоритм:

 def triple_exponential_smoothing(series, slen, alpha, beta, gamma, n_preds): result = [] seasonals = initial_seasonal_components(series, slen) for i in range(len(series)+n_preds): if i == 0: # initial values smooth = series[0] trend = initial_trend(series, slen) result.append(series[0]) continue if i >= len(series): # we are forecasting m = i - len(series) + 1 result.append((smooth + m*trend) + seasonals[i%slen]) else: val = series[i] last_smooth, smooth = smooth, alpha*(val-seasonals[i%slen]) + (1-alpha)*(smooth+trend) trend = beta * (smooth-last_smooth) + (1-beta)*trend seasonals[i%slen] = gamma*(val-smooth) + (1-gamma)*seasonals[i%slen] result.append(smooth+trend+seasonals[i%slen]) return result # # forecast 24 points (ie two seasons) # >>> triple_exponential_smoothing(series, 12, 0.716, 0.029, 0.993, 24) # [30, 20.34449316666667, 28.410051892109554, 30.438122252647577, 39.466817731253066, ... 

Вы можете поместить их в файл, например: holtwinters.py в папку со следующей структурой:

 forecast_folder | └── __init__.py | └── holtwinters.py 

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

  • Python: корреляция порядка ордеров для категориальных данных
  • матрица расстояний кривых в python
  • запустите np.empty во второй раз
  • Использование scipy для минимизации функции, которая также принимает невариантные параметры
  • установление расстояния между сгруппированными штриховыми графиками в matplotlib
  • Установка 2D-гауссовой функции с помощью scipy.optimize.curve_fit - ValueError и minpack.error
  • Почему numpy.array () иногда очень медленный?
  • Множество расстояний до списка (строка, столбец, расстояние)
  • Python - лучший язык программирования в мире.