2016-12-15 2 views
1

Я хотел бы реализовать эквивалент auto.arima() функции R в python.R. Auto.arima() эквивалент в Python

Функция R auto.arima принимает значения временных рядов, поскольку входные данные вычисляют параметры порядка ARIMA (значения p, d, q) и соответствуют модели, нет необходимости предоставлять значения p, d, q в качестве входных данных пользователя ,

Я хочу использовать эквивалент функции auto.arima в python (без вызова auto.arima R) для прогнозирования будущих значений во временном ряду. В следующие временные ряды, выполняющие auto.arima-python на 40 пунктов и предсказывающие следующие 6 значений, затем перемещение окна на 1 пункт и повторное выполнение той же процедуры.

Ниже в качестве примера данные:

value 
0 
2.584751 
2.884758 
2.646735 
2.882105 
3.267503 
3.94552 
4.70788 
5.384803 
54.77972 
62.87139 
78.68957 
112.7166 
155.0074 
170.8084 
196.1941 
237.4928 
254.9718 
175.0717 
217.3807 
244.7357 
274.4517 
304.6838 
373.3202 
345.6252 
461.2653 
443.5982 
472.3653 
469.3326 
506.8819 
532.1639 
542.2837 
514.9269 
528.0194 
540.539 
542.7031 
556.8262 
569.7132 
576.2339 
577.7212 
577.0873 
569.6199 
573.2445 
573.7825 
589.3506 

Я пытался писать функции для вычисления порядка разностного с помощью AD Фуллер тест, проходя дифференцированный временной ряд (который становится неподвижным после разностного исходный временной ряд в соответствии с испытанием adfuller результат) функции выбора порядка arma для вычисления значений порядка P, Q.

Дальнейшее использование этих значений для перехода к функции arima в Statsmodels. Но функции, похоже, не работают.

import numpy as np 
import pandas as pd 
import statsmodels.api as sm 
from statsmodels.tsa.stattools import adfuller 
from statsmodels.tsa.stattools import acf, pacf 

def diff_terms(timeseries): 
    i=1 
    j=0 
    while i != 0: 
     dftest = adfuller(timeseries, autolag='AIC') 
     if dftest[0] <= dftest[4]["5%"]: 
      i = 0 
     else: 
      timeseries = np.diff(timeseries) 
      i = 1 
      j = j + 1 
    return j 

def p_q_values_estimator(timeseries): 
    p=0 
    q=0 
    lag_acf = acf(timeseries, nlags=20) 
    lag_pacf = pacf(timeseries, nlags=20, method='ols') 
    y=1.96/np.sqrt(len(timeseries)) 

    if lag_acf[0] < y: 
     for a in lag_acf: 
      if a < y: 
       q = q + 1 
       break 
    elif lag_acf[0] > y: 
     for c in lag_acf: 
      if c > y: 
       q = q + 1 
       break 

    if lag_pacf[0] < y: 
     for b in lag_pacf: 
      if b < y: 
       p = p + 1 
       break 
    elif lag_pacf[0] > y: 
     for d in lag_pacf: 
      if d > y: 
       p = p + 1 
       break 

    p_q=[p,q] 
    return(p_q) 

def p_q_values_estimator2(timeseries): 
    res = sm.tsa.arma_order_select_ic(timeseries, ic=['aic'], max_ar=5, max_ma=4,trend='nc') 
    return res.aic_min_order 

data1=[] 
data=pd.read_csv('ABC.csv') 
d_value=diff_terms(data.value) 
data1[:]=data[:] 
data = data[0:40] 

i=0 
while i < d_value: 
    data_diff = np.diff(data) 
    i = i+1 

p_q_values=p_q_values_estimator(data) 
p_value=p_q_values[0] 
q_value=p_q_values[1] 

p_q_values2=p_q_values_estimator2(data_diff) 
p_value2=p_q_values2[0] 
q_value2=p_q_values2[1] 


exogx = np.array(range(0,40)) 
fit2 = sm.tsa.ARIMA(np.array(data), (p_value, d_value, q_value), exog = exogx).fit() 
print(fit2.fittedvalues) 
pred2 = fit2.predict(start = 40, end = 45, exog = np.array(range(40,46))) 
print(pred2) 
plt.plot(fit2.fittedvalues) 
plt.plot(np.array(data)) 
plt.plot(range(40,45), np.array(pred2)) 
plt.show() 

ошибки - по использованию порядка ARMA выберите

p_q_values2=p_q_values_estimator2(data_diff) 
line 56, in p_q_values_estimator2 
res = sm.tsa.arma_order_select_ic(timeseries, ic=['aic'], max_ar=5, max_ma=4,trend='nc') 
File "C:\Python27\lib\site-packages\statsmodels\tsa\stattools.py", line 1052, in arma_order_select_ic min_res.update({i + '_min_order' : (mins[0][0], mins[1][0])}) 
IndexError: index 0 is out of bounds for axis 0 with size 0 

ошибки - на использовании функции на основе ACF PACF для вычисления P, Q порядка

fit2 = sm.tsa.ARIMA(np.array(data), (p_value, d_value, q_value), exog = exogx).fit() 
File "C:\Python27\lib\site-packages\statsmodels\tsa\arima_model.py", line 1104, in fit 
callback, **kwargs) 
File "C:\Python27\lib\site-packages\statsmodels\tsa\arima_model.py", line 942, in fit 
armafit.mle_retvals = mlefit.mle_retvals 
AttributeError: 'LikelihoodModelResults' object has no attribute 'mle_retvals' 
+0

Вы видели это: [auto.arima() эквивалент для python] (http://stackoverflow.com/questions/22770352/auto-arima-equivalent-for-python) –

+0

Да, но даже этот подход приводит к той же ошибке , AttributeError: объект «LikelihoodModelResults» не имеет атрибута «mle_retvals». – user245204

ответ

0

Vals моя собственная вещь, но вы можете создать свой собственный индекс с помощью pd.date_range

rdata=ts(traindf.requests_per_active.values,frequency=12) 
#forecasts 
fit=forecast.auto_arima(rdata) 
forecast_output=forecast.forecast(fit,h=6,level=(95.0)) 
#convert forecasts to dataframe  
forecast_results=pd.Series(forecast_output[3], index=vals.index) 
lowerpi=pd.Series(forecast_output[4], index=vals.index) 
upperpi=pd.Series(forecast_output[5], index=vals.index) 
results = pd.DataFrame({'forecast' : forecast_results, 'lowerpi' : lowerpi, 'upperpi' : upperpi}) 
+0

Прогноз модуля также ваш собственный модуль? или вы загрузили из любого репозитория? – user6608138

+0

Мои неправильные утилиты rpy2 и importr для импорта пакета «прогноз» из R в Python – thedon

+0

спасибо за ответ ... но как я могу использовать вывод auto_arima для пакета статистики в python ... когда вы используете тот же R apis в python, вы наблюдали какие-либо улучшения в RMSE ... – user6608138

Смежные вопросы