使用 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
我有一个包含以下列的数据框:
(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