使用熊猫查找重叠的时间戳

时间:2018-10-17 01:33:44

标签: pandas vectorization

我有一个包含开始时间,结束时间和transaction_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)

输出:

    tid       starttime        endtime     overlap
0   0.0     1537204247.00   1537204309.00   True
1   1.0     1537204248.00   1537204309.00   True
2   21.0    1537207170.00   1537207196.00   False

请注意,对于每笔交易,我只需要确定它是否最多与另一笔交易重叠。如果找到一个,则无需检查所有其他事务;我可以在那里停下来并将其标记为重叠。

最初,我使用for嵌套了iterrows循环,速度非常慢。然后,我能够对内部循环进行矢量化处理,但是仍然保留外部循环。有什么方法可以向量化总体计算以使其运行更快?

1 个答案:

答案 0 :(得分:0)

您可以使用numpy广播

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])

说明:

1st:超出范围

(x1,y1)与(x2,y2) min(y2,y1)-max(x1,x2)> 0,然后两个范围重叠

2nd:为什么它需要大于2,因为我使用numpy braod cast,所以对角线总是代表自己进行比较。然后我们需要两个以上。

更新:

假设您拥有df并拆分了df1 .... dfn(请查看np.split)

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)