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