gpt4 book ai didi

python - Pandas - 在多列上使用 `.rolling()`

转载 作者:太空宇宙 更新时间:2023-11-04 00:13:45 39 4
gpt4 key购买 nike

考虑一个如下所示的 pandas 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 循环,但它真的很慢。

您对更有效的方法有什么建议吗?

最佳答案

一种解决方案是堆叠 数据,然后将窗口大小乘以列数,然后将结果除以列数。此外,由于您想要一个前瞻性窗口,因此反转堆叠的 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

关于python - Pandas - 在多列上使用 `.rolling()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51615849/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com