我有一个数据帧“data”,它有5列,第一列是开始时间,第二列是结束时间。我有一个名为“all_times”的第二个数据帧,它是所有开始和结束时间的排序数据帧,并且通过获取值随时间的累积和来计算并发计数器。每个开始时间为该值的+1,每个结束时间为该值的-1。我试图找到每个“数据”行中范围内的并发数的最小值/最大值。
我想出了一个如下所示的循环,它适用于我的目的,但速度非常慢。我该如何对这个循环进行矢量化?
data['min_concurrent'] = 0
data['max_concurrent'] = 0
for i in range(data.shape[0]):
timeranges = all_times[data.iloc[i,0]:data.iloc[i,1]]['cumsum']
data.iloc[i,5] = timerange['cumsum'].min()
data.iloc[i,6] = timerange['cumsum'].max()
所需输出的示例:
start end ... min max
2017-01-01 00:00:02.187 2017-01-01 00:00:02.437 ... 1 1
2017-01-01 00:00:03.000 2017-01-01 00:00:04.000 ... 1 2
2017-01-01 00:00:03.700 2017-01-01 00:00:05.000 ... 1 2
2017-01-01 00:00:04.100 2017-01-01 00:00:04.200 ... 2 2
2017-01-01 00:00:04.500 2017-01-01 00:00:06.000 ... 1 2
上面也是“数据”的形状,下面是“all_times”的形状:
timestamp value cumsum
2017-01-01 00:00:02.187 +1 1
2017-01-01 00:00:02.437 -1 0
2017-01-01 00:00:03.000 +1 1
2017-01-01 00:00:03.700 +1 2
2017-01-01 00:00:04.000 -1 1
2017-01-01 00:00:04.100 +1 2
2017-01-01 00:00:04.200 -1 1
2017-01-01 00:00:04.500 +1 2
2017-01-01 00:00:05.000 -1 1
2017-01-01 00:00:06.000 -1 0
那么,有没有办法让矢量/矩阵运算更快?