2017-08-25 13 views
1

パンダ0.18.0以降、タイムスパンを指定することで、時系列のローリングウィンドウサイズを可変にすることができます。例えば、データフレームdftで2秒のウィンドウの上に和のためのコードは次のようになります。特定の数値スパンのパンダローリング関数?

dft.rolling('2s').sum() 

非日時スパンで同じことを行うことは可能でしょうか?このように見えるデータフレーム与え例えば

、:

A B 
0 1 1 
1 2 2 
2 3 3 
3 5 5 
4 6 6 
5 7 7 
6 10 10 

ので、列「A」で言う3の窓スパンを指定して、計算列「B」の合計を持ってすることが可能です出力は次のようになります。

A B 
0 1 NaN 
1 2 NaN 
2 3 5 
3 5 10 
4 6 14 
5 7 18 
6 10 17 
+0

データの例を挙げることはできますか?時間列または数値列を意味しますか? – Vaishali

+0

私はいいえと言うつもりです。 [ドキュメントごと](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html#pandas-dataframe-rolling)... "ウィンドウ:int、またはオフセット サイズこれは、統計を計算するために使用される観測の数です。各ウィンドウは固定サイズになります。 –

答えて

2

rolling()のようになります。

[可変サイズのウィンドウ] datetimelikeインデックスに対してのみ有効です。window引数のdocumentationを参照してください。

本文:

ウィンドウ:int型、または移動ウィンドウの
サイズを相殺しました。これは、統計の計算に使用された観測数です。各ウィンドウは固定サイズになります。
オフセットの場合、これは各ウィンドウの期間になります。各ウィンドウは、期間に含まれる観測値に基づいてサイズが変更されます。これは、datetimikkeのインデックスに対してのみ有効です。

1

ここでは、問題がある場合の回避方法を示します。

df = pd.DataFrame({'A' : np.arange(10), 
        'B' : np.arange(10,20)}, 
        index=[1,2,3,5,8,9,11,14,19,20]) 

def var_window(df, size, min_periods=None): 
    """Operates on the index.""" 
    result = [] 
    df = df.sort_index() 
    for i in df.index: 
     start = i - size + 1 
     res = df.loc[start:i].sum().tolist() 
     result.append(res) 
    result = pd.DataFrame(result, index=df.index) 
    if min_periods: 
     result.loc[:min_periods - 1] = np.nan 
    return result 

print(var_window(df, size=3, min_periods=3, inclusive=True)) 
     0  1 
1 NaN NaN 
2 NaN NaN 
3 3.0 33.0 
5 5.0 25.0 
8 4.0 14.0 
9 9.0 29.0 
11 11.0 31.0 
14 7.0 17.0 
19 8.0 18.0 
20 17.0 37.0 

説明:インデックスをループします。各値で、DataFrameを末尾のウィンドウサイズに切り捨てます。ここで「サイズ」はカウントではなく、定義した範囲です。

上記のインデックス値8では、インデックスが8,7、または6であるAの値を合計しています(つまり、8 - 3 + 1)。その範囲内にある唯一のインデックス値は8です。したがって、合計は単純に元のフレームからの値です。これと比較して、インデックス値が11の場合、合計に9と11の値が含まれます(5 + 6 = 11、Aの結果の合計)。

は、標準的な圧延OPSとこれを比較してください。私はあなたの質問を誤解していた場合

print(df.rolling(window=3).sum()) 
     A  B 
1 NaN NaN 
2 NaN NaN 
3 3.0 33.0 
5 6.0 36.0 
8 9.0 39.0 
9 12.0 42.0 
11 15.0 45.0 
14 18.0 48.0 
19 21.0 51.0 
20 24.0 54.0 

、私は方法を知ってみましょう。それは明らかにかなり遅いです:

%timeit df.rolling(window=3).sum() 
1000 loops, best of 3: 627 µs per loop 

%timeit var_window(df, size=3, min_periods=3) 
100 loops, best of 3: 3.59 ms per loop 
関連する問題