Python Pandas - 查找具有最大聚合值的连续组

phi*_*hem 5 python grouping numpy python-2.7 pandas

我有一个包含日期时间和整数的数据框

import numpy as np
import pandas as pd

df = pd.DataFrame()
df['dt'] = pd.date_range("2017-01-01 12:00", "2017-01-01 12:30", freq="1min")
df['val'] = np.random.choice(xrange(1, 100), df.shape[0])
Run Code Online (Sandbox Code Playgroud)

给我

                    dt  val
0  2017-01-01 12:00:00   33
1  2017-01-01 12:01:00   42
2  2017-01-01 12:02:00   44
3  2017-01-01 12:03:00    6
4  2017-01-01 12:04:00   70
5  2017-01-01 12:05:00   94*
6  2017-01-01 12:06:00   42*
7  2017-01-01 12:07:00   97*
8  2017-01-01 12:08:00   12
9  2017-01-01 12:09:00   11
10 2017-01-01 12:10:00   66
11 2017-01-01 12:11:00   71
12 2017-01-01 12:12:00   25
13 2017-01-01 12:13:00   23
14 2017-01-01 12:14:00   39
15 2017-01-01 12:15:00   25
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到连续的哪一N组给我最大总和? dtval

在这种情况下,如果N=3,那么结果应该是:

                    dt  val
5  2017-01-01 12:05:00   94
6  2017-01-01 12:06:00   42
7  2017-01-01 12:07:00   97
Run Code Online (Sandbox Code Playgroud)

(上面标有星星)

unu*_*tbu 6

您可以使用rolling/sumnp.nanargmax查找与第一次出现的最大值关联的索引:

import numpy as np
import pandas as pd

df = pd.DataFrame({'dt': ['2017-01-01 12:00:00', '2017-01-01 12:01:00', '2017-01-01 12:02:00', '2017-01-01 12:03:00', '2017-01-01 12:04:00', '2017-01-01 12:05:00', '2017-01-01 12:06:00', '2017-01-01 12:07:00', '2017-01-01 12:08:00', '2017-01-01 12:09:00', '2017-01-01 12:10:00', '2017-01-01 12:11:00', '2017-01-01 12:12:00', '2017-01-01 12:13:00', '2017-01-01 12:14:00', '2017-01-01 12:15:00'], 'val': [33, 42, 44, 6, 70, 94, 42, 97, 12, 11, 66, 71, 25, 23, 39, 25]})
df.index = df.index*10

N = 3
idx = df['val'].rolling(window=N).sum()
i = np.nanargmax(idx) + 1
print(df.iloc[i-N : i])
Run Code Online (Sandbox Code Playgroud)

版画

                     dt  val
50  2017-01-01 12:05:00   94
60  2017-01-01 12:06:00   42
70  2017-01-01 12:07:00   97
Run Code Online (Sandbox Code Playgroud)

iloc使用序数索引.loc使用基于标签的索引.条件是i-Ni是有效的索引,df.iloc[i-N : i]将抓住的窗口长度的(子数据帧)N.相反,如果索引使用连续的整数,df.loc[i-N, i]则只会抓取一个长度窗口N.上面的示例显示了一个DataFrame,df.loc由于df.index具有非连续的整数值,因此无法工作.


mir*_*ulo 6

您可以使用np.convolve获取正确的起始索引并从那里开始.

def cons_max(df, N):
    max_loc = np.convolve(df.val, np.ones(N, dtype=int), mode='valid').argmax()
    return df.loc[max_loc:max_loc+N-1]
Run Code Online (Sandbox Code Playgroud)

演示

>>> cons_max(df, 3)
                   dt  val
5 2017-01-01 12:05:00   94
6 2017-01-01 12:06:00   42
7 2017-01-01 12:07:00   97

>>> cons_max(df, 5)
                   dt  val
4 2017-01-01 12:04:00   70
5 2017-01-01 12:05:00   94
6 2017-01-01 12:06:00   42
7 2017-01-01 12:07:00   97
8 2017-01-01 12:08:00   12
Run Code Online (Sandbox Code Playgroud)

这可以有效地"滑动"我们的输入中的内核(一组数组),并将我们的大小窗口中的元素N一起累加.