我有一个多个本地商店排名的数据集,我希望通过编程将这些排名汇总/合并为一个全国排名。我知道本地排名是按销量划分的,但是没有给出销量,因此必须使用相对排名来尽可能准确地创建国家排名。
作为一个简短的例子,我们有3个本地排名列表,从最佳排名(第一)到最差排名(最后),它们代表可以相互重叠的不同地理边界。
ranking_1 = ['J','A','Z','B','C']
ranking_2 = ['A','H','K','B']
ranking_3 = ['Q','O','A','N','K']
[我们知道J或Q是排名最高的商店,因为它们分别在rank_1和rank_3中都最高,并且它们出现在A之上,而后者在rank_2中是最高的。我们知道O位居第二,因为它在rank_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多个项目。
我很乐于找出这个问题,并且很好奇是否有人对此有任何明智的方法。
修改后的Merge Sort algorithm将在这里有所帮助。修改应考虑到无与伦比的存储,并且尽管您希望将无可比拟的元素构建成组,但您希望将它们视为相等(例如Q和J)]
此方法旨在分析排名最前面的所有商店。如果它们不位于任何其他排名列表中的第一位,则它们属于此最前面的级别,并被添加到“级别”列表中。接下来,将它们从领跑者中删除,并调整所有列表,以便有新的领跑者。重复该过程,直到没有库存。
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”之间的范围内。
[在数百个排名和商店中相乘时,某些商店将无法按绝对数量进行正确排名。