熊猫在时间滚动窗口中寻找最大值

2024-03-29 06:09:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表df,其中有"timestamp""Y"列。我想添加另一列"MaxY",它在未来最多24小时内包含最大的Y值。那就是

df.MaxY.iloc[i] = df[(df.timestamp > df.timestamp.iloc[i]) &
                     (df.timestamp < df.timestamp.iloc[i] + timedelta(hours=24))].Y.max()

显然,像那样计算它是非常缓慢的。有更好的方法吗?在

在一个类似的计算"SumY"的例子中,我可以使用cumsum()的技巧来完成。不过,在这里类似的把戏似乎行不通。在

根据要求,一个示例表(MaxY是输出。输入仅前两列)。在

^{pr2}$

Tags: 方法示例df技巧maxtimestamp例子timedelta
2条回答

这里有一个重新采样/滚动的方法。使用pandas版本0.18.0和python3.5时,我收到一个奇怪的警告。我不认为这是一个问题,但不知道它为什么会产生。在

这假设索引是“timestamp”,如果不是,请在下面的前面加上df = df.set_index('timestamp')

>>> df2 = df.resample('30min').sort_index(ascending=False).fillna(np.nan)
>>> df2 = df2.rolling(48,min_periods=1).max()
>>> df.join(df2,rsuffix='2')

                     Y   Y2
timestamp                  
2016-03-29 12:00:00  1  3.0
2016-03-29 13:00:00  2  4.0
2016-03-30 11:00:00  3  4.0
2016-03-30 12:30:00  4  4.0
2016-03-30 13:30:00  3  3.0
2016-03-30 14:00:00  2  2.0

在这个小小的数据帧上,它的速度似乎是它的两倍,但是你必须在一个更大的数据帧上测试它,以获得相对速度的合理概念。在

希望这有点自我解释。升序排序是必要的,因为滚动只允许向后或居中的窗口。在

考虑一个运行速度更快的apply()解决方案。函数返回每行中时间条件序列的最大值。在

import pandas as pd
from datetime import timedelta

def daymax(row):         
    ser = df.Y[(df.timestamp > row) &
               (df.timestamp <= row + timedelta(hours=24))]
    return ser.max()

df['MaxY'] = df.timestamp.apply(daymax)

print(df)

#            timestamp  Y  MaxY
#0 2016-03-29 12:00:00  1   3.0
#1 2016-03-29 13:00:00  2   4.0
#2 2016-03-30 11:00:00  3   4.0
#3 2016-03-30 12:30:00  4   3.0
#4 2016-03-30 13:30:00  3   2.0
#5 2016-03-30 14:00:00  2   NaN

相关问题 更多 >