使用pandas查找重叠的时间戳

使用pandas查找重叠的时间戳,pandas,vectorization,Pandas,Vectorization,我有一个包含开始时间、结束时间和事务ID的数据帧,如下所示: tid starttime endtime 0 0.0 1537204247.00 1537204309.00 1 1.0 1537204248.00 1537204309.00 2 21.0 1537207170.00 1537207196.00 我需要找到重叠的交易。到目前为止,我能产生的最优化的代码如下: p['overlap'] = False

我有一个包含开始时间、结束时间和事务ID的数据帧,如下所示:

    tid       starttime        endtime
0   0.0     1537204247.00   1537204309.00
1   1.0     1537204248.00   1537204309.00
2   21.0    1537207170.00   1537207196.00
我需要找到重叠的交易。到目前为止,我能产生的最优化的代码如下:

p['overlap'] = False # This is my original dataframe

def compute_overlaps(df):
    for i, row_curr in df.iterrows():
        if( p.loc[row_curr['ix']]['overlap'] != True ):
            overlap_indexes = df[(row_curr['ix'] != df['ix']) & (row_curr['starttime'] < df['endtime']) & (df['starttime'] < row_curr['endtime'])].index
            p['overlap'].loc[row_curr['ix']] = True
            p['overlap'].loc[overlap_indexes] = True

<p_grouped_by_something>.apply(compute_overlaps)
注意,对于每个事务,我只需要确定它是否与最多一个其他事务重叠。如果找到一个,我不需要检查所有其他事务;我可以停在那里,把它标记为重叠


最初,我使用
iterrows
创建了一个嵌套的
for
循环,速度非常慢。然后,我可以对内循环进行矢量化,但外循环仍然存在。有没有办法将整个计算矢量化以使其运行更快?

您可以使用
numpy
boradcast

s1=df.starttime.values
s2=df.endtime.values
sum(np.minimum(s2[:,None],s2)-np.maximum(s1[:,None],s1)>0)>1
Out[36]: array([ True,  True, False])
说明:

第一:超过一圈的射程

(x1,y1)与(x2,y2) 最小值(y2,y1)-最大值(x1,x2)>0则两个范围重叠

第二:为什么它需要大于2,因为我使用了
numpy
braod cast,所以对角线总是表示它自己比较。那么我们需要更大的两个

更新:

假设您有df和splitdf1…dfn(看看np.split)


len(df)
很大时,我遇到了一个内存错误。例如,当
len(df)=172484
时,我相信这将创建多个172484 x 172484矩阵,并且许多计算是不必要的(因为相同的元素在每一行中反复比较)。可以做些什么来优化它?@lostsoul29将您的df拆分为小块,然后执行此操作,并将其返回。我不确定这是否有效,因为我需要计算重叠事务,同时考虑所有事务。如果我在切片上操作,代码不是只确定该切片的重叠事务吗?例如,在问题中的df中,如果
tid=1.0
位于不同的切片中,则不会将其与
tid=0.0
进行比较,并且其
重叠
值可能为
,从而给出不正确的结果。
s1=df.starttime.values
s2=df.endtime.values
sum(np.minimum(s2[:,None],s2)-np.maximum(s1[:,None],s1)>0)>1
Out[36]: array([ True,  True, False])
s1=df.starttime.values
s2=df.endtime.values
l=[df1,df2,df3,df4,df5...]
n=[]
for  x in l: 
       n.append(sum(np.minimum(s2[:,None],x.values)-np.maximum(s1[:,None],x.values)>0)>1)