2016-04-18 5 views
4

のパンダローリング・ウィンドウのシリーズを作成は、私は次のコードがあると配列

1 1.0 
2 1.1 
3 1.2 
4 1.3 
5 1.4 

は今、私が作りたいもののローリング・ウィンドウでサイズnが、私は各ウィンドウの平均または標準偏差を取ることを望んでいない、私はちょうど配列が欲しい。したがって、n = 3とします。

1 array([1.0, nan, nan]) 
2 array([1.1, 1.0, nan]) 
3 array([1.2, 1.1, 1.0]) 
4 array([1.3, 1.2, 1.1]) 
5 array([1.4, 1.3, 1.2]) 

私はこれをどのように行うのです:私は、入力s与えられ、次のシリーズを出力変換をしたいですか?

答えて

5

を使用ここでそれを

In [294]: arr = [s.shift(x).values[::-1][:3] for x in range(len(s))[::-1]] 

In [295]: arr 
Out[295]: 
[array([ 1., nan, nan]), 
array([ 1.1, 1. , nan]), 
array([ 1.2, 1.1, 1. ]), 
array([ 1.3, 1.2, 1.1]), 
array([ 1.4, 1.3, 1.2])] 

In [296]: pd.Series(arr, index=s.index) 
Out[296]: 
1 [1.0, nan, nan] 
2 [1.1, 1.0, nan] 
3 [1.2, 1.1, 1.0] 
4 [1.3, 1.2, 1.1] 
5 [1.4, 1.3, 1.2] 
dtype: object 
1

あなたが最初とシリーズの最後に行方不明nan秒を添付する場合は、あなたが簡単なウィンドウ

def wndw(s,size=3): 

    stretched = np.hstack([ 
     np.array([np.nan]*(size-1)), 
     s.values.T, 
     np.array([np.nan]*size) 
    ]) 

    for begin in range(len(stretched)-size): 
     end = begin+size 
     yield stretched[begin:end][::-1] 

for arr in wndw(s, 3): 
    print arr 
4

を行うための一つの方法は、ここでベクトル化されたアプローチだですNumPy broadcasting使用して -

idx = np.arange(n)[::-1] + np.arange(len(s))[:,None] - n + 1 
out = s.get_values()[idx] 
out[idx<0] = np.nan 

する。これはあなたの出力としてを取得します2D配列。あなたは1次元配列の分割アレイのリストを持っているしたい場合、あなたは、出力にnp.splitを使用することができますので、のような -

out_split = np.split(out,out.shape[0],axis=0) 

サンプルの実行 -

In [100]: s 
Out[100]: 
1 1.0 
2 1.1 
3 1.2 
4 1.3 
5 1.4 
dtype: float64 

In [101]: n = 3 

In [102]: idx = np.arange(n)[::-1] + np.arange(len(s))[:,None] - n + 1 
    ...: out = s.get_values()[idx] 
    ...: out[idx<0] = np.nan 
    ...: 

In [103]: out 
Out[103]: 
array([[ 1. , nan, nan], 
     [ 1.1, 1. , nan], 
     [ 1.2, 1.1, 1. ], 
     [ 1.3, 1.2, 1.1], 
     [ 1.4, 1.3, 1.2]]) 

In [104]: np.split(out,out.shape[0],axis=0) 
Out[104]: 
[array([[ 1., nan, nan]]), 
array([[ 1.1, 1. , nan]]), 
array([[ 1.2, 1.1, 1. ]]), 
array([[ 1.3, 1.2, 1.1]]), 
array([[ 1.4, 1.3, 1.2]])] 
2

あなたのデータはストライド配列のようになります。

data=np.lib.stride_tricks.as_strided(np.concatenate(([NaN]*2,s))[2:],(5,3),(8,-8)) 
""" 
array([[ 1. , nan, nan], 
     [ 1.1, 1. , nan], 
     [ 1.2, 1.1, 1. ], 
     [ 1.3, 1.2, 1.1], 
     [ 1.4, 1.3, 1.2]]) 
""" 

その後シリーズに変換:

pd.Series(map(list,data)) 
"""" 
0 [1.0, nan, nan] 
1 [1.1, 1.0, nan] 
2 [1.2, 1.1, 1.0] 
3 [1.3, 1.2, 1.1] 
4 [1.4, 1.3, 1.2] 
dtype: object 
"""" 
関連する問題