2016-12-15 23 views
1

auto.arima()相当の機能をRpythonに実装したいと思います。PythonでRのauto.arima()に相当する

R auto.arima関数では、入力としてARIMA次数パラメータ(p、d、q値)を計算し、モデルにフィットする時系列値を取るため、ユーザーがp、d、q値を入力する必要はありません。

私は、時系列で将来の値を予測するために、(auto.arima Rを呼び出さずに)pythonでauto.arima関数に相当するものを使いたいと思います。次の時系列で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 

Iはadfuller試験ごとに、元の時系列を差分した後に定常になる(分化した時系列を渡し、ADフラー試験を用いて差分の順序を計算するための関数を書くことを試みました結果)をP、Q次数値を計算するarma order select関数に渡します。

これらの値をStatsmodelsのarima関数に引き継ぐためにさらに使用します。しかし、機能は動作していないようです。

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() 

エラー -

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 

エラーを選択ARMA順序を使用して - Pの計算にPACF基づく関数ACF使用上、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()equivalent for python](http://stackoverflow.com/questions/22770352/auto-arima-equivalent-for-python) –

+0

はい、しかしその方法でも同じエラーが発生します。 AttributeError: 'LikelihoodModelResults'オブジェクトには属性 'mle_retvals'がありません。 – user245204

答えて

0

ヴァルスは、私自身のことですが、あなたは独自のインデックスを作成することができます。

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を使って、PythonのRから "forecast"パッケージをインポートする – thedon

+0

返信ありがとう...しかし、pythonでstatsパッケージのauto_arima出力を使う方法は?同じR APIをPythonで使うと、 RMSEの改善が見られましたか? – user6608138