pandas - 计算可变窗口大小的滚动最大值,并根据该窗口大小调整位置

标签 pandas dataframe numpy rolling-computation

我想对数据帧列中的值进行滚动比较,选择特定窗口的最大值。我当前有两列 - 一列包含值,第二列 window 包含我希望执行比较的窗口的大小。我一直在使用这样的滚动函数,如下所示,与设置的窗口大小进行比较:

import pandas as pd
import numpy as np

np.random.seed([3,14])
data = np.random.randn(10).cumsum()
w = [3,2,2,3,2,2,3,2,2,3]

df = pd.DataFrame({'Data': data, 'Window':w})

[print(df)]

       Data  Window
0 -0.602923       3
1 -1.005579       2
2 -0.703250       2
3 -1.227599       3
4 -0.683756       2
5 -0.670621       2
6 -0.997120       3
7  0.387956       2
8  0.255502       2
9 -0.152361       3

max_values = df['Data'][::-1].rolling(3, min_periods=0).max()[::-3].dropna().reset_index(drop=True)

print(max_values)

0   -0.602923 
1   -0.670621
2    0.387956
3   -0.152361

窗口大小如此的原因是每个窗口的最大值与测试中的时间范围相关。比较是在此时间范围内执行的,max_values 是处理后的值列表。 最大值的最终输出将会更小 - 比较会缩小处理的数据。

但是,窗口大小需要根据窗口列中的值来改变,并且下一次比较的位置也需要移动这个可变窗口大小(移动3,然后2,然后2,然后再次3)。我可以在代码中使用此变量来设置相应移动的可变窗口大小吗?这将是我的预期输出:

0   -0.602923 = max (0,1,2)
1   -0.683756 = max (3,4)
2   -0.670621 = max (5,6)
3    0.387956 = max (7,8,9)

max_values 列表将比原始 Data 列小得多。

我对如何以“干净”的方式做到这一点有点迷失,滚动函数在这样使用时提供。任何帮助将不胜感激!

最佳答案

您想要从 Window 的第一个值生成自定义石斑鱼,直到累积和 ≥ len(df),并得到 groupby.max :

group = df.index.repeat(df['Window'])[:len(df)]

out = df.groupby(group)['Data'].max()

输出:

0   -0.602923
1   -0.683756
2   -0.670621
3    0.387956
Name: Data, dtype: float64

关于pandas - 计算可变窗口大小的滚动最大值,并根据该窗口大小调整位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76101118/

相关文章:

python - Pandas 两个数据帧在 CIDR 中查找 IP 并在 CIDR 列中映射

python - 数据集在 Pandas 数据框中每月有多少天有记录?

python - 将 pandas 数据帧转换为 json 或 dict,然后返回到具有非唯一列的 df

python - 为什么 numpy.random.choice 不使用算术编码?

python - 如何在 setup.py 中引导 numpy 安装

python - 制作一个 Python 脚本来加载目录中的所有 npy/npz 文件

python - 如何根据条件替换数据框的值

Python 对多年内同一日历日期记录的值进行排序

python - Pandas :在数据框的所有列中找到最大范围

python - 如何使用 Apache Spark Dataframes 执行 Switch 语句 (Python)