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

Python 熊猫在滚动时间窗口中寻找最大值,python,pandas,Python,Pandas,我有一个带有列“timestamp”和“Y”的表df。我想添加另一列“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() 考虑运行速度更快的apply()解决方案。函数返回

我有一个带有列
“timestamp”
“Y”
的表
df
。我想添加另一列
“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()
考虑运行速度更快的
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
将熊猫作为pd导入
从日期时间导入时间增量
def daymax(世界其他地区):
ser=df.Y[(df.timestamp>row)&

(df.timestamp这里有一种重采样/滚动的方法。我使用pandas版本0.18.0和python 3.5得到一个奇怪的警告。我不认为这是一个问题,但不确定为什么会生成它

这假设索引是“时间戳”,如果不是,则在下面的前面加上
df=df.set_index(“时间戳”)

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

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

有什么问题吗

df['MaxY']=df[::-1].Y.shift(-1).滚动('24小时').max()

df[::-1]
反转df(您希望它“向后”)并
shift(-1)
处理“将来”的问题。

帮助我们帮助您!请提供一个包含5-7行的示例数据集以及基于提供的示例的预期输出/结果集。@JohnE,据我所知,
rolling()
只适用于固定行数的窗口。我的是固定时间间隔的。@MaxU,我希望一段简单的代码就足够了。现在我也添加了一个表。它更清晰吗?@JohnE,我也尝试使用
滚动
重新采样
来完成它,但我做不好。请告诉我们怎么做?谢谢!@MaxU好的,就为了你我试了一下。;-)它比我想象的要复杂,但我认为它工作正常。谢谢你和++!我一直在玩“1H”频率,结果总是很糟糕-为什么它使用“30min”频率来玩这个把戏???@MaxU数据中有时像12:30和13:30,所以1H可能不完全一样?我现在看到了,谢谢你的解决方案解释和解释!好吧,这在实际数据上不是很好。
resample()
的参数要么很小,因此会炸毁表(特别是如果表中有任何时间间隔),要么很大,从而产生错误的数字(也许我可以接受)@KarolisJuodelė你真的尝试过吗?如果它在真实数据上没有更快,我会感到惊讶,因为你的方法基本上是做2*n^2不平等性测试,随着数据越来越大,测试速度越来越慢。重新采样和数据有多好是一个公平的观点,但我不确定是否可以做得更多——尽管你可以重新采样如果结果证明足够快的话,这个样品很好。
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
>>> 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