Python 利用Pandas确定最优群配置

Python 利用Pandas确定最优群配置,python,pandas,Python,Pandas,我试图找出两个成员之间的重叠,看看他们是否认识对方。我也有一个最低限度的重叠要求(即他们需要相互了解至少两个月才能组成一个小组) 示例输入DF time_together = 5184000 (60 days) person_name start_date end_date cut_off (start + time_together) sally 1540627200 1545638400 1545811200 john 1543046400 1

我试图找出两个成员之间的重叠,看看他们是否认识对方。我也有一个最低限度的重叠要求(即他们需要相互了解至少两个月才能组成一个小组)

示例输入DF

time_together = 5184000 (60 days)

person_name  start_date  end_date    cut_off (start + time_together)
sally        1540627200  1545638400  1545811200
john         1543046400  1548316800  1548230400
edgar        1548316800  1553414400  1553500800
我目前在pandas数据框中的unix时间戳中有开始日期和结束日期。我计算了一个截止时间,即开始时间+最小持续时间。然后,我根据截止日期检查每个人的出勤情况,如果低于我所说的人数,他们将组成一个有效的小组(见下面的代码)

因为莎莉和约翰在一起的时间最短。他们会组成一个小组,但埃德加没有

理想情况下,输出将是一个列表列表 [person1,person2,person5],[person3,person4]]


它的速度也很慢,所以任何关于如何加快速度的建议都是非常好的。

我认为你正在努力实现的目标有很多,但可以分为两个步骤。(我不确定这是否是实现目标最有效的方式)

  • 找出在最短时间内彼此重叠的所有成对的人
  • 将配对列表“压缩”为组
  • 对于第一个任务,一个简单的方法是迭代每个人,并检查是否有其他人有足够的重叠

    从测试数据帧开始(伪随机时间和任意名称):

    我们可以找到以下几对:

    pairs = []
    for i in range(len(test.index)):
        for j in range(len(test.index)-i-1):
            if (min(test.loc[i]['end_date'], test.loc[i+j+1]['end_date']) 
            - max(test.loc[i]['start_date'], test.loc[i+j+1]['start_date']) 
            >= (min_time_together)):
                pairs.append([test.loc[i]['person_name'], test.loc[i+j+1]['person_name']])
    
    这将生成输出:

    [['Angelina', 'Estefana'],
     ['Na', 'Twyla'],
     ['Na', 'Wilfredo'],
     ['Twyla', 'Wilfredo']]
    
    为了“浓缩”这一对的列表涉及到一系列的图论,老实说,我不是这方面的专家,但这里是一个相关StackOverflow问题的答案(非常有趣的主题和该页面上的许多好信息)。如果我们从列表列表中的答案中使用
    concurebk
    函数,我们将得到以下最终输出:

    #condenseBK(*pairs)
    [['Angelina', 'Estefana'], ['Na', 'Twyla', 'Wilfredo']]
    

    你能从
    df
    提供几行示例数据吗?当然!如上所述,您确定当前输出DF正确吗?莎莉和约翰只重叠了30天这真是个好办法!但我实际上是在试图避免O(n^2)运行时,因为我使用的是一个巨大的数据集,您有没有考虑过使用它?我认为您可以用O(n logn)这样的方式构建树,并用O(logn+匹配间隔数)查询它
    pairs = []
    for i in range(len(test.index)):
        for j in range(len(test.index)-i-1):
            if (min(test.loc[i]['end_date'], test.loc[i+j+1]['end_date']) 
            - max(test.loc[i]['start_date'], test.loc[i+j+1]['start_date']) 
            >= (min_time_together)):
                pairs.append([test.loc[i]['person_name'], test.loc[i+j+1]['person_name']])
    
    [['Angelina', 'Estefana'],
     ['Na', 'Twyla'],
     ['Na', 'Wilfredo'],
     ['Twyla', 'Wilfredo']]
    
    #condenseBK(*pairs)
    [['Angelina', 'Estefana'], ['Na', 'Twyla', 'Wilfredo']]