计算熊猫时间序列中的重复事件

时间:2014-08-08 17:50:33

标签: python pandas time-series

我几天以来一直在研究非常基本的大熊猫,但我目前的任务很艰难:

我有一个(非规范化的)时间序列,每个时间戳包含一个用户ID。所以类似于:(date,userid,payload)所以想想一个服务器logffile,我想知道在某个时间段内有多少IP返回。

现在我想知道有多少用户在intervall 中有多个项目,例如在4周内等等。因此它更像是一个滑动窗口,而不是t-上的恒定间隔。轴。

所以我的方法是:

  • df_users重新索引用户ID
  • 或multiindex?

可悲的是,我没有找到成功生成结果的方法。 总而言之,我不确定如何用Pandas实现这种搜索,或者这可能更容易在纯Python中实现?或者我只是缺少一些关键字来解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为一些虚拟数据适合您的问题。

df = pd.DataFrame({'id': ['A','A','A','B','B','B','C','C','C'],  
                   'time': ['2013-1-1', '2013-1-2', '2013-1-3', 
                        '2013-1-1', '2013-1-5', '2013-1-7', 
                        '2013-1-1', '2013-1-7', '2013-1-12']})
df['time'] = pd.to_datetime(df['time'])

这种方法需要使用某种类型的非缺失数字列,因此只需添加一个虚拟列。

df['dummy_numeric'] = 1

我解决问题的方法是这样的。首先,groupby id并迭代,以便我们一次处理一个用户id值的数据。接下来,resample不规则数据达到每日值,以便进行标准化。

然后,使用rolling_count函数,计算每个X天窗口中的观察数量(此处使用3)。这是有效的,因为上采样数据将用NaN填充而不计算。请注意,只有数字列传递给rolling_count,并且还注意使用双括号(这会导致选择DataFrame而不是系列)。

window_days = 3
ids = []
for _, df_gb in df.groupby('id'):
    df_gb = df_gb.set_index('time').resample('D')
    df_gb = pd.rolling_count(df_gb[['dummy_numeric']], window_days).reset_index()
    ids.append(df_gb)

将所有数据重新组合在一起,用超过观察值标记跨度

df_stack = pd.concat(ids, ignore_index=True)
df_stack['multiple_requests'] = (df_stack['dummy_numeric'] > 1).astype(int)

然后分组并总结,你应该得到正确答案。

df_stack.groupby('time')['multiple_requests'].sum()
Out[356]: 
time
2013-01-01    0
2013-01-02    1
2013-01-03    1
2013-01-04    0
2013-01-05    0
2013-01-06    0
2013-01-07    1
2013-01-08    0
2013-01-09    0
2013-01-10    0
2013-01-11    0
2013-01-12    0
Name: multiple, dtype: int32