我想对数据帧列中的值进行滚动比较,选择特定窗口的最大值。我当前有两列 - 一列包含值,第二列 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/