2016-04-29 11 views
5

私は時系列データの大きなパンダデータフレームを持っています。パンダデータフレーム上のスライディングウィンドウ

私は現在、このデータフレームを操作して、10行ごとのローリング平均である新しい小さなデータフレームを作成しています。すなわちローリングウインドウ技術である。テストへ

def create_new_df(df): 
    features = [] 
    x = df['X'].astype(float) 
    i = x.index.values 
    time_sequence = [i] * 10 
    idx = np.array(time_sequence).T.flatten()[:len(x)] 
    x = x.groupby(idx).mean() 
    x.name = 'X' 
    features.append(x) 
    new_df = pd.concat(features, axis=1) 
    return new_df 

コード::このような

columns = ['X'] 
df_ = pd.DataFrame(columns=columns) 
df_ = df_.fillna(0) # with 0s rather than NaNs 
data = np.array([np.arange(20)]*1).T 
df = pd.DataFrame(data, columns=columns) 

test = create_new_df(df) 
print test 

出力:しかし

 X 
0 4.5 
1 14.5 

、私は関数が50%とスライディングウィンドウを使用して、新しいデータフレームを作りたいですオーバーラップ

出力は次のようになります。

 X 
0 4.5 
1 9.5 
2 14.5 

どうすればよいですか?

from itertools import tee, izip 

def window(iterable, size): 
    iters = tee(iterable, size) 
    for i in xrange(1, size): 
     for each in iters[i:]: 
      next(each, None) 
    return izip(*iters) 

for each in window(df, 20): 
    print list(each) # doesn't have the desired sliding window effect 

一部もrolling_mean()方法をパンダを使用することをお勧めかもしれませんが、もしそうなら、私は、ウィンドウの重なりと、この機能を使用する方法を見ることができません。

は、ここで私が試したものです。

ご協力いただければ幸いです。

答えて

5

パンダのローリングテクニックはここではいいと思います。バージョン0.18.0のpandasからはrolling_mean()の代わりにrolling().mean()を使用することに注意してください。

>>> df=pd.DataFrame({ 'x':range(30) }) 
>>> df = df.rolling(10).mean()   # version 0.18.0 syntax 
>>> df[4::5]        # take every 5th row 

     x 
4 NaN 
9 4.5 
14 9.5 
19 14.5 
24 19.5 
29 24.5 
+2

'df [4 :: 5]' - それは素晴らしいです! – MaxU

+0

@マックス私は遠くに行かないだろうが、ありがとう! – JohnE

+1

それは計算力の無駄でしょうか? 64個のサンプルウィンドウに50%のオーバーラップがあるので、基本的には1/32の作業しか使わないとします。怠惰に評価されていない限り、もちろんです。 –

関連する問題