[英]Pandas finding max value in rolling window of time
我有一個包含"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()
顯然,像這樣計算它非常慢。 有更好的方法嗎?
在計算"SumY"
的類似情況下,我可以使用cumsum()
技巧來cumsum()
。 然而,這里類似的技巧似乎不起作用。
根據要求,示例表(MaxY 是輸出。輸入僅是前兩列)。
-------------------------------
| timestamp | Y | MaxY |
-------------------------------
| 2016-03-29 12:00 | 1 | 3 | rows 2 and 3 fall within 24 hours, so MaxY = max(2,3)
| 2016-03-29 13:00 | 2 | 4 | rows 3 and 4 fall in the time interval, so MaxY = max(3, 4)
| 2016-03-30 11:00 | 3 | 4 | rows 4, 5, 6 all fall in the interval so MaxY = max(4, 3, 2)
| 2016-03-30 12:30 | 4 | 3 | max (3, 2)
| 2016-03-30 13:30 | 3 | 2 | row 6 is the only row in the interval
| 2016-03-30 14:00 | 2 | nan? | there are no rows in the time interval. Any value will do.
-------------------------------
這是一種重新采樣/滾動的方法。 使用 Pandas 0.18.0 版和 python 3.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
怎么了
df['MaxY'] = df[::-1].Y.shift(-1).rolling('24H').max()
df[::-1]
反轉 df (您希望它“向后”),而shift(-1)
負責“將來”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.