使用 pandas resample / rolling_sum 计算秒时间间隔

Using pandas resample / rolling_sum to calculate seconds time intervals

我有一个包含以下列的数据框:

(Pdb) self.df.columns
Index([u'distinct_id', u'event_name', u'item_id', u'player_time', u'time',
       u'video_id'],
      dtype='object')

player_time 是一个浮点值,不是唯一的。我的最终目标是计算在任何给定秒 (player_time) 发生的事件 (event_name) 的数量,然后如果需要,在不同的时间间隔内执行滚动求和:

要获取在任何给定秒内发生的事件数,我可以使用 groupby:

(Pdb) grouped_df = self.df.groupby(self.df.player_time).count(); grouped_df
             distinct_id  event_name  item_id  time  video_id
player_time
16                     1           1        1     1         1
25                     0           2        1     1         1
28                     1           1        1     1         1
29                     1           1        1     1         1
36                     1           1        1     1         1
46                     1           1        1     1         1
70                     1           1        1     1         1
77                     1           1        1     1         1
95                     1           1        1     1         1
107                    1           1        1     1         1
117                    1           1        1     1         1
118                    1           1        1     1         1
131                    0           2        1     1         1
153                    1           1        1     1         1
155                    1           1        1     1         1
163                    1           1        1     1         1
177                    1           1        1     1         1
182                    1           1        1     1         1
183                    1           1        1     1         1
196                    1           1        1     1         1

如您所见,除了 25 和 131 之外,每一秒都有一个事件。现在我想做的是类似于

(Pdb) grouped_df.resample('10s',how='sum')
*** TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex

但我现在还没有准备好这样做。实现这个目标的最佳方式是什么?我查看了 pandas.rolling_sum,看起来它也可以完成这项工作,但我无法让它完成我在这里描述的内容。

考虑一个级数求和函数并将其应用于 groupby():

# RESET TO DATA FRAME
grouped_df = self.df.groupby(self.df.player_time).count().reset_index()

# SERIES SUM FUNCTION (SUMS EVERY LAST 10 VALUES OF PLAYER_TIME)
def intsum(x):
    if x < 10:        
        ser = groupdf.event_name[(groupdf.player_time < x)]
    else:
        ser = groupdf.event_name[(groupdf.player_time >= x - 10) & (groupdf.player_time < x)]
    return ser.sum()    

# APPLY FUNCTION
groupdf['intervalSum'] = groupdf['player_time'].apply(intsum)

print(groupdf)

输出

    player_time  distinct_id  event_name  item_id  time  video_id  intervalSum
0            16            1           1        1     1         1            0
1            25            0           2        1     1         1            1
2            28            1           1        1     1         1            2
3            29            1           1        1     1         1            3
4            36            1           1        1     1         1            2
5            46            1           1        1     1         1            1
6            70            1           1        1     1         1            0
7            77            1           1        1     1         1            1
8            95            1           1        1     1         1            0
9           107            1           1        1     1         1            0
10          117            1           1        1     1         1            1
11          118            1           1        1     1         1            1
12          131            0           2        1     1         1            0
13          153            1           1        1     1         1            0
14          155            1           1        1     1         1            1
15          163            1           1        1     1         1            2
16          177            1           1        1     1         1            0
17          182            1           1        1     1         1            1
18          183            1           1        1     1         1            2
19          196            1           1        1     1         1            0