2016-07-06 4 views
0

私は現在、timeseriesの解析を行うアルゴリズムをリファクタリングする過程にあります。時系列のグループ化されたローリング統計を生成するためにtimeseriesをラップします

アルゴリズムは、timeseriesを24hチャンクにスライスしてDataFrameを生成し、各列が24時間のtimeseriesデータで構成されるように並べます。

次のステップは、その日の(ローリング)統計を前の7日(列)の結合(ローリング)統計と比較することです(データのSNRは非常に悪いそれを強化するために日数を組み合わせる)。問題は、非常に遅い、からdf.loc[]経由でスライスを取るPython自体のforループです。

私はアルゴリズムをスピードアップするためにネイティブパンダの方法をできるだけ使用したいと思いますが、私はこの時点でちょっと立ち往生しています。

私はそう

[[day 0] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] ... 
[nan..] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [day 7] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] ... 
etc.] 

ような大きな対角線DataFrameにデータを配置する必要があり、代わりにループの1つのコマンドで(前の7日から構成される)ローリング「の参照」の統計情報を生成すると仮定それから、単にdf.rolling(foo).whatever()を適用することができます。

私はdf.groupby(pd.TimeGrouper("1d"))の助けを借りて上記のようなDataFrameを生成しようとしましたが、私はループなしでそれを行う方法を考えることができません。

誰かがこのようなフレームを生成する方法を知っている場合、またはこれに取り組むためのよりよい方法を考えることができる場合は、私は助けていただければ幸いです。

編集: これについていくつかのより多くの思考、DataFrameは、各要素は、データの24時間の時系列であるハンケル行列のサブセットのように見えるこの

[[day 0] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] 
[day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [day 7] 
etc.] 

ようになります。

答えて

0

これは私が最初に思ったよりも簡単だったことが分かります。 2番目の例を見ると、各列は単に1日以上シフトした元の時系列のコピーであることがわかります。

# duplicate timeseries 
refFrame = pd.concat([data] * refLen, axis=1) 

# shift each column by samples per day * day index 
refFrame = refFrame.apply(lambda x: x.shift(-int(x.name) * 144), 
          axis=0) 
# drop rows that contain nan after shifting 
refFrame.dropna(inplace=True) 
:私が思いついた何

関連する問題