1行ごとに直近時間内における処理を求めたいのですが、いくつか試したコードのどれもが処理に時間がかかってしまい困っています。
用いるデータ
ここでは例ですが、実際は何万行ものデータです。
df = pd.DataFrame([['2018-12-01 00:00:00', 2], ['2018-12-01 00:00:00', 5], ['2018-12-01 00:01:00', 0], ['2018-12-01 00:03:00', 2], ['2018-12-01 00:08:00', 1], ['2018-12-01 00:08:00', 7], ['2018-12-01 00:09:00', 2], ['2018-12-01 00:015:00', 2]], columns=['time', 'num']) df['time'] = pd.to_datetime(df['time']) df
time | num | |
---|---|---|
0 | 2018-12-01 00:00:00 | 2 |
1 | 2018-12-01 00:00:00 | 5 |
2 | 2018-12-01 00:00:01 | 0 |
3 | 2018-12-01 00:00:03 | 2 |
4 | 2018-12-01 00:00:08 | 1 |
5 | 2018-12-01 00:00:08 | 7 |
6 | 2018-12-01 00:00:09 | 2 |
7 | 2018-12-01 00:00:15 | 2 |
試したコード
1行ずつに対して直近5分間の合計を求めてみます。下で4つのパターンを試してみました。
import datetime import numpy as np import pandas as pd
# パターン1 def func1(i): shifted_time = df['time'][i] - datetime.timedelta(minutes=5) for k, v in enumerate(df['time']): if shifted_time < v: break return sum(df['num'][k: i+1]) df.index.to_series().apply(func1)
# パターン2 time_arr = np.array(df['time']) def func2(i): shifted_time = np.datetime64(pd.to_datetime(str(time_arr[i])) - datetime.timedelta(minutes=5)) index = np.where(shifted_time < time_arr)[0][0] return sum(df['num'][index: i+1]) df.index.to_series().apply(func2)
# パターン3 def func3(i): return df['num'][(df['time'][i] - datetime.timedelta(minutes=5) < df['time']) \ & (df['time']<= df['time'][i])].sum() df.index.to_series().apply(func3)
# パターン4 # timeカラムをindexにする df.index = df['time'] y = [] def func4(): for i, sr in df.iterrows(): y.append(df['num'][(i - pd.offsets.Minute(5) < df.index) & (df.index<= i)].sum()) return y ret = func4() ret
パターン1, 2が求めたい結果です。パターン3, 4は処理する行のindexよりも大きいindexを含んでしまっているため求めたい答えと結果が異なっています。
問題は試した全てのパターンで数万行のデータに適用すると、処理結果が遅いことです。
どのようにすれば処理速度が向上するでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/12/21 11:29