簡體   English   中英

熊貓在滾動時間窗口中找到最大值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM