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

时间:2015-12-08 18:37:55

标签: python pandas time-series

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

(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是一个浮点值,它不是唯一的。我的最终目标是计算在任何给定秒钟(event_name)发生的事件数量(player_time),然后根据需要在不同的时间间隔内执行滚动总和:

要获得在任何给定秒钟内发生的事件数量,我可以使用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,看起来它也可以完成这项工作,我只是不能把它做到我在这里所描述的。

1 个答案:

答案 0 :(得分:1)

考虑一系列求和函数并将其应用于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
相关问题