“我的数据”只有很少的100k行和以下列:
Time
(yyyy-MM-dd-hh:MM:ss.ffffff)ID
(字符串)Group1
(int32)Group2
(int32)李>我想计算在每个事件之前,在5分钟的时间窗口内,有多少事件来自相同的Group1
和Group2
。
例如:
ID Time Group1 Group2
61ED2269CCAC 2020-07-27 00:01:05.781 1234 100123
61C2DC4E96FA 2020-07-27 00:01:17.279 1234 100123
FAD0839C1A95 2020-07-27 00:02:38.112 1234 100124
A2750A7B6C24 2020-07-27 00:16:50.592 4321 100123
03F5DF150A3C 2020-07-27 00:17:00.246 4321 100124
有多少事件发生在Timestamp('2020-07-26 23:56:17.279000')
(第二个事件前5分钟)之后,属于Group1
和Group2
组?因此,在本例中,第二个事件的计数器为1。其余组的计数器为0,因为它们的组是唯一的
每个事件都应该有一个计数器,指示之前有多少事件来自同一组
我尝试按组和Time
对数据进行排序,然后运行嵌套循环,一个运行在所有事件上,另一个运行在从启动到当前事件索引的过程中。在1000行之后,进程会显著减慢,这使得此选项不可行。
我想知道是否还有其他优雅而有效的方法来做到这一点
编辑: 我可以用一个for循环而不是一个嵌套循环来实现这一点。对于每个循环,我计算时间和组,并对数据帧进行切片,以包括组中的事件和所需时间帧中的事件,然后将事件数相加:
for i in tqdm(range(len(df))):
time_stamp = df.loc[i, 'Time']
group1 = df.loc[i, 'Group1']
group2 = df.loc[i, 'Group2']
sub_df = df[df['Time'] + timedelta(minutes=-5) > time_stamp]
sub_df = sub_df[sub_df['Time'] < time_stamp]
sub_df = sub_df[sub_df['Group1'] == group1]
sub_df = sub_df[sub_df['Group2'] == group2]
df.loc[i, 'prior_events'] = sub_df.size
尽管如此,TQM显示每秒18次迭代,这对于100k行来说并不是很好
为了得到更具指导性的结果,我扩展了您的数据示例:
假设Time列为datetime类型且其值是唯一的, 您可以按如下方式生成结果(Count列):
结果是:
注意最后一行。Is拥有计数=3,包括刚刚发生的事件 5分钟前。 如果希望此事件不被计数,请删除closed='both' 参数
从14:49Z开始编辑以下注释
显然,您的数据具有重复的时间值,即使是在一个组内 具有相同组1/组2的行数
要解决这一问题,请采取另一种方法:
定义生成计数的函数:
应用它:
这段代码基于您的源数据帧已排序的假设 通过时间
我在一个数据样本上测试了上面的代码,添加了一行重复代码 上一行的时间
结果是:
相关问题 更多 >
编程相关推荐