2017-05-07 30 views
2

私は、statsmodel AR model againstを適用しようとしている不規則な間隔の時系列からのプロジェクトコストのデータフレームを持っています。私はpredict機能でstartendを使用する方法を理解するに苦労していますstatsmodels.tsa.ar_model.AR.predict関数の開始/終了パラメータを正しく設定する方法

   cost 
date    
2015-07-16 35.98 
2015-08-11 25.00 
2015-08-11 43.94 
2015-08-13 26.25 
2015-08-18 15.38 
2015-08-24 77.72 
2015-09-09 40.00 
2015-09-09 20.00 
2015-09-09 65.00 
2015-09-23 70.50 
2015-09-29 59.00 
2015-11-03 19.25 
2015-11-04 19.97 
2015-11-10 26.25 
2015-11-12 19.97 
2015-11-12 23.97 
2015-11-12 21.88 
2015-11-23 23.50 
2015-11-23 33.75 
2015-11-23 22.70 
2015-11-23 33.75 
2015-11-24 27.95 
2015-11-24 27.95 
2015-11-24 27.95 
... 
2017-03-31 21.93 
2017-04-06 22.45 
2017-04-06 26.85 
2017-04-12 60.40 
2017-04-12 37.00 
2017-04-12 20.00 
2017-04-12 66.00 
2017-04-12 60.00 
2017-04-13 41.95 
2017-04-13 25.97 
2017-04-13 29.48 
2017-04-19 41.00 
2017-04-19 58.00 
2017-04-19 78.00 
2017-04-19 12.00 
2017-04-24 51.05 
2017-04-26 21.88 
2017-04-26 50.05 
2017-04-28 21.00 
2017-04-28 30.00 

これは、データフレーム、それをだのデータのサンプルです。 the docsによると

start : int, str, or datetime Zero-indexed observation number at which to start forecasting, ie., the first > forecast is start. Can also be a date string to parse or a datetime type.

end : int, str, or datetime Zero-indexed observation number at which to end forecasting, ie., the first forecast is start. Can also be a date string to parse or a datetime type.

私はそれに私の不規則な間隔の時系列データを追加し、空の日々の時系列を持つデータフレームを作成し、モデルを適用してみてください。私が使用しようとすると

pred = ar_res.predict(start='2016-01-01', end='2016-06-01')  

私はより具体的な日付を使用しようとするとpandas.tslib.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 605-12-31 00:00:00のエラーで

data = pd.read_csv('data.csv', index_col=1, parse_dates=True) 
df = pd.DataFrame(index=pd.date_range(start=datetime(2015, 1, 1), end=datetime(2017, 12, 31), freq='d')) 
df = df.join(data) 
df.cost.interpolate(inplace=True) 
ar_model = sm.tsa.AR(df, missing='drop', freq='D') 
ar_res = ar_model.fit(maxlag=9, method='mle', disp=-1) 
pred = ar_res.predict(start='2016', end='2016') 

predict関数の結果は、私はエラーの同じタイプを取得します整数の場合、別のエラーが表示されます。

pred = ar_res.predict(start=0, end=len(data)) 
Wrong number of items passed 202, placement implies 197 

実際にdatetimeno rule for interpreting endというエラーが表示されます。

私はここで一生懸命壁に当たっています。私は何かが欠けているに違いないと思っています。

最終的に、モデルを使用してサンプル外の予測(次の四半期の予測など)を取得したいと考えています。

+1

ARMAは、間隔が等間隔の標準時系列データを想定しています。あなたの日付は一意ではなく、明確な頻度はありません。 1つの可能性は、時間指数(例えば、単純な配列)を用いずに作業し、観察の時間間隔を無視すること、またはそれらを毎日の系列に集約/平均することであろう。 – user333700

+0

この日付と日時の処理はstatsmodels masterでリファクタリングされています。私はこのような不規則なケースで明示的な例外が発生すると考えています。ナノ秒に変換すると、数年をカバーするナノ秒で時間差を作成しようとすると、これがどこかでオーバーフローする可能性があります。 – user333700

+0

"あなたの日付は一意ではありません" - それはgroupby関数が必要なものだった – getglad

答えて

0

(だから私は等間隔時系列の要件を考慮して、毎日のインデックスを作成していたが、それはまだ非ユニーク推移@ user333700によるコメント)。

groupby機能を追加して重複した日付を合計し、関数をdatetimeオブジェクト(@ andy-haydenによる回答)を使用して実行することができました。結果を提供predict機能付

df = df.groupby(pd.TimeGrouper(freq='D')).sum() 
... 
ar_res.predict(start=min(df.index), end=datetime(2018,12,31)) 

、私は今、結果を分析し、有益な何かを得るためにのparamsを微調整することができています。

0

あなたはdatetime(というよりもdate)を渡す場合、これは動作します:

from datetime import datetime 

... 
pred = ar_res.predict(start=datetime(2015, 1, 1), end=datetime(2017,12,31)) 

In [21]: pred.head(2) # my dummy numbers from data 
Out[21]: 
2015-01-01 35 
2015-01-02 23 
Freq: D, dtype: float64 

In [22]: pred.tail(2) 
Out[22]: 
2017-12-30 44 
2017-12-31 44 
Freq: D, dtype: float64 
+0

これは私に 'year is range 'のエラーを与えます。私が小さい範囲の 'ar_res.predict(start = datetime(2016,1,1)、end = datetime(2016,6,1))'を試しても、私はまだこの 'out of bounds nanosecond timestamp'エラーを受け取ります。これはまた、pd.date_rangeが 'date'の代わりに' datetime'を使うように更新した場合にも起こります。コードを上に更新します – getglad

+0

もしあなたが 'data'を提供すればうまくいきます。 –

+0

'data'のサンプルが追加され、' pd.dataframe'が生成されました – getglad

関連する問題