【问题标题】:Using pandas resample / rolling_sum to calculate seconds time intervals使用 pandas resample / rolling_sum 计算秒时间间隔
【发布时间】:2016-03-13 19:42:26
【问题描述】:

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

(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,看起来它也可以完成这项工作,但我无法让它完成我在这里描述的工作。

【问题讨论】:

    标签: python pandas time-series


    【解决方案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
    

    【讨论】:

    • 太棒了 - 谢谢 - reset_index 调用的目的是什么?
    • 太棒了! reset_index() 是将 pandas groupby 对象转换回数据框(填充所有行)。 Groupbys 维护分层索引。如果不需要,请删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2017-01-07
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多