2016-03-29 24 views
3

"timestamp""Y"のテーブルdfがあります。私は別の列"MaxY"を追加して、最大でYという値を最大24時間後に追加したいと考えています。つまり、それは非常に遅いように計算することは明らかです。より良い方法がありますか?パンダは時間のローリングウィンドウで最大値を見つける

"SumY"を計算するのと同じケースでは、私はcumsum()というトリックを使用してそれを行うことができます。しかし、ここで同様のトリックは動作していないようです。

要求通り、テーブル例(MaxYは出力です。入力は最初の2列のみです)。

------------------------------- 
| 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. 
------------------------------- 
+0

お手伝いをします。提供されたサンプルに基づいて、5-7行と期待される出力/結果セットを持つサンプルデータセットを提供してください。 – MaxU

+0

@ JohnE、私が理解しているように、 'rolling()'は固定数の行のウィンドウのみです。私のものは一定の時間間隔です。 –

+0

@MaxU、私は素朴なコードのスニペットが十分に良いと思っていました。今私はテーブルを追加しました。それは明確ですか? –

答えて

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 
1

ここでは、再サンプリング/ローリングを使用します。私はパンダバージョン0.18.0とPython 3.5を使って奇妙な警告を受け取ります。私はそれが心配だとは思わないが、なぜそれが生成されるのか分からない。

>>> 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 

を、約2倍に高速であると思われるこの小さなデータフレームでは、しかし、あなたがそれをテストする必要があるだろう:これは、インデックスを前提としてい

がない場合は、df = df.set_index('timestamp')と次の前に、「タイムスタンプ」です相対速度の合理的な考え方を得るために、より大きなデータフレーム。

これはやや自立的です。昇順の並べ替えが必要なのは、ローリングが、私が知る限り、後方または中央のウィンドウを許可するだけなのでです。

+0

ありがとう、++!私はいつも「1H」の周波数で遊んでいて、常に悪い結果を出していました。なぜ「30分」周波数を使ってトリックをしましたか? – MaxU

+0

@MaxUデータには12:30と13:30のような時があるので、1時間と全く同じになることはありませんか? – JohnE

+0

私はそれを今見て、ソリューションと説明をありがとう! – MaxU

関連する問題