[英]Pandas - Using `.rolling()` on multiple columns
考慮一個看起來像下面的熊貓DataFrame
A B C
0 0.63 1.12 1.73
1 2.20 -2.16 -0.13
2 0.97 -0.68 1.09
3 -0.78 -1.22 0.96
4 -0.06 -0.02 2.18
我想使用函數.rolling()
對t = 0,1,2
執行以下計算:
t
到t+2
的行 S
S
的第75個百分點(或有關S
其他摘要統計信息) 例如,對於t = 1
我們有S = {2.2,-2.16,-0.13,0.97,-0.68,1.09,-0.78,-1.22,0.96},而第75個百分位數是0.97。
我找不到使它與.rolling()
一起工作的方法,因為它顯然將每一列分開。 我現在依靠for循環,但這確實很慢。
您對更有效的方法有何建議?
一種解決方案是stack
數據,然后將窗口大小乘以列數,然后將結果乘以列數。 另外,由於要使用前向窗口,因此請反轉堆疊的DataFrame
的順序
wsize = 3
cols = len(df.columns)
df.stack(dropna=False)[::-1].rolling(window=wsize*cols).quantile(0.75)[cols-1::cols].reset_index(-1, drop=True).sort_index()
輸出:
0 1.12
1 0.97
2 0.97
3 NaN
4 NaN
dtype: float64
對於許多列和一個小窗口:
import pandas as pd
import numpy as np
wsize = 3
df2 = pd.concat([df.shift(-x) for x in range(wsize)], 1)
s_quant = df2.quantile(0.75, 1)
# Only necessary if you need to enforce sufficient data.
s_quant[df2.isnull().any(1)] = np.NaN
輸出: s_quant
0 1.12
1 0.97
2 0.97
3 NaN
4 NaN
Name: 0.75, dtype: float64
您可以使用numpy ravel。 仍然可能需要使用for循環。
for i in range(0,3):
print(df.iloc[i:i+3].values.ravel())
如果t
步長為3s,則可以使用numpy reshape
函數創建n*9
數據幀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.