簡體   English   中英

熊貓-在多列上使用`.rolling()`

[英]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執行以下計算:

  • 選擇從tt+2的行
  • 從所有列中獲取這3行中包含的9個值。 稱這套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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM