ここでは、問題がある場合の回避方法を示します。
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
データの例を挙げることはできますか?時間列または数値列を意味しますか? – Vaishali
私はいいえと言うつもりです。 [ドキュメントごと](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html#pandas-dataframe-rolling)... "ウィンドウ:int、またはオフセット サイズこれは、統計を計算するために使用される観測の数です。各ウィンドウは固定サイズになります。 –