我有一个包含时间序列的pandas df,从t(0)开始,我需要向前看t(n)并查看前面的最大值和最小值,在一个由列“from”和“to”。
这是我的解决方案,虽然有效,但速度极慢:
df[‘max_ahead’] = df.apply(lambda x: df[‘value’][int(df[‘from’]):int(df[‘to’])].max(), axis=1)
df[‘min_ahead’] = df.apply(lambda x: df[‘value’][int(df[‘from’]):int(df[‘to’])].min(), axis=1)
有没有办法在熊猫或numpy数组中加快速度?我的df包含数百万行,上面的代码需要太长时间。
答案 0 :(得分:1)
由于切片的窗口似乎是常量(在你的情况下是100),试试这个:
df['max_ahead'] = df[value].rolling(window=100).max()
df['max_ahead'] = df['max_ahead'].shift(-100)
最后的转变会重新创建你想要的解决方案,而不必使用应用lambda,这可能很慢。
答案 1 :(得分:1)
您的移动窗口修复为100,然后我们可以在此处应用rolling
例如:对于此示例数据框,我选择移动窗口= 2
df=pd.DataFrame({'V':[1,2,3,4,5,6,7,8,9,10]})
df.rolling(window=2).min()
Out[474]:
V
0 NaN
1 1.0
2 2.0
3 3.0
4 4.0
5 5.0
6 6.0
7 7.0
8 8.0
9 9.0