我几天以来一直在研究非常基本的大熊猫,但我目前的任务很艰难:
我有一个(非规范化的)时间序列,每个时间戳包含一个用户ID。所以类似于:(date,userid,payload)所以想想一个服务器logffile,我想知道在某个时间段内有多少IP返回。
现在我想知道有多少用户在intervall 中有多个项目,例如在4周内等等。因此它更像是一个滑动窗口,而不是t-上的恒定间隔。轴。
所以我的方法是:
可悲的是,我没有找到成功生成结果的方法。 总而言之,我不确定如何用Pandas实现这种搜索,或者这可能更容易在纯Python中实现?或者我只是缺少一些关键字来解决这个问题?
答案 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