为了账号安全,请及时绑定邮箱和手机立即绑定

排名聚合:将本地子排名合并到全球排名

排名聚合:将本地子排名合并到全球排名

慕婉清6462132 2022-07-12 10:12:09
我有一个包含多个本地商店排名的数据集,我希望以编程方式将其聚合/组合成一个国家排名。我知道本地排名是按销量排名,但我没有给出销量,所以必须使用相对排名来创建尽可能准确的全国排名。举个简短的例子,假设我们有 3 个本地排名列表,从最佳排名(第一)到最差排名(最后),它们代表可以相互重叠的不同地理边界。ranking_1 = ['J','A','Z','B','C']ranking_2 = ['A','H','K','B']ranking_3 = ['Q','O','A','N','K']我们知道 J 或 Q 是排名最高的商店,因为它们分别在排名_1 和排名_3 中最高,并且它们出现在排名_2 最高的 A 之上。我们知道 O 是下一个,因为它在ranking_3 中高于 A。接下来是A,依此类推...如果我在纸上正确地做到了这一点,这个简短示例的输出将是:global_ranking = [('J',1.5),('Q',1.5),('O',3),('A',4),('H',6),('N',6),('Z',6),('K',8),('B',9),('C',10)]请注意,当我们没有足够的数据来确定两个商店中哪个排名更高时,我们认为它是平局(即我们知道 J 或 Q 之一是排名最高的商店,但不知道哪个更高,所以我们把它们都放在1.5)。在实际数据集中,每个列表中有 100 多个 1000 多个项目。我很高兴尝试解决这个问题,并且很好奇是否有人有任何聪明的方法。
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

修改的合并排序算法将在这里有所帮助。修改应考虑到无与伦比的商店,并通过构建您愿意视为平等的无与伦比的元素组(如 Q 和 J)



查看完整回答
反对 回复 2022-07-12
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

该方法旨在分析排名靠前的所有商店。如果它们在任何其他排名列表中的位置不低于第一位,则它们属于该前级并被添加到“级别”列表中。接下来,将它们从领先者中删除,并调整所有列表,以便有新的领先者。重复这个过程,直到没有商店离开。


def rank_stores(rankings):

    """

    Rank stores with rankings by volume sales with over lap between lists. 

    :param rankings: list of rankings of stores also in lists.

    :return: Ordered list with sets of items at same rankings.

    """


    rank_global = []


    # Evaluate all stores in the number one postion, if they are not below 

    # number one somewhere else, then they belong at this level. 

    # Then remove them from the front of the list, and repeat. 

    while sum([len(x) for x in rankings]) > 0:

        tops = []


        # Find out which of the number one stores are not in a lower position 

        # somewhere else.

        for rank in rankings: 

            if not rank: 

                continue

            else:

                top = rank[0]

                add = True


            for rank_test in rankings:

                if not rank_test:

                    continue

                elif not rank_test[1:]:

                    continue

                elif top in rank_test[1:]:

                    add = False

                    break

                else:

                    continue

            if add: 

                tops.append(top)


        # Now add tops to total rankings list, 

        # then go through the rankings and pop the top if in tops. 

        rank_global.append(set(tops))



        # Remove the stores that just made it to the top.

        for rank in rankings: 

            if not rank:

                continue

            elif rank[0] in tops:

                rank.pop(0)

            else:

                continue


    return rank_global

对于提供的排名:


ranking_1 = ['J','A','Z','B','C']

ranking_2 = ['A','H','K','B']

ranking_3 = ['Q','O','A','N','K']

rankings = [ranking_1, ranking_2, ranking_3]

然后调用函数:


rank_stores(rankings)

结果是:


[{'J', 'Q'}, {'O'}, {'A'}, {'H', 'N', 'Z'}, {'K'}, {'B'}, {'C'}]

在某些情况下,可能没有足够的信息来确定明确的排名。试试这个顺序。


['Z', 'A', 'B', 'J', 'K', 'F', 'L', 'E', 'W', 'X', 'Y', 'R', 'C']

我们可以得出以下排名:


a = ['Z', 'A', 'B', 'F', 'E', 'Y']

b = ['Z', 'J', 'K', 'L', 'X', 'R']

c = ['F', 'E', 'W', 'Y', 'C']

d = ['J', 'K', 'E', 'W', 'X']

e = ['K', 'F', 'W', 'R', 'C']

f = ['X', 'Y', 'R', 'C']

g = ['Z', 'F', 'W', 'X', 'Y', 'R', 'C']

h = ['Z', 'A', 'E', 'W', 'C']

i = ['L', 'E', 'Y', 'R', 'C']

j = ['L', 'E', 'W', 'R']

k = ['Z', 'B', 'K', 'L', 'W', 'Y', 'R']

rankings = [a, b, c, d, e, f, g, h, i, j, k]

调用函数:


rank_stores(rankings)

结果是:


[{'Z'},

 {'A', 'J'},

 {'B'},

 {'K'},

 {'F', 'L'},

 {'E'},

 {'W'},

 {'X'},

 {'Y'},

 {'R'},

 {'C'}]

在这种情况下,没有足够的信息来确定“J”相对于“A”和“B”的位置。只是它在“Z”和“K”之间的范围内。


当在数百个排名和商店中相乘时,某些商店将无法按绝对数量正确排名。


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信