Агрегирование рангов: объединение локальных подранков в глобальный рейтинг - PullRequest
1 голос
/ 28 января 2020

У меня есть набор данных из нескольких локальных рейтингов магазинов, которые я собираюсь программно объединить / объединить в один национальный рейтинг. Я знаю, что местные рейтинги по объему продаж, но мне не дают объем продаж, поэтому я должен использовать относительные рейтинги, чтобы создать максимально точный национальный рейтинг.

В качестве краткого примера, скажем, что мы иметь 3 локальных рейтинговых списка, от лучшего (1-го) до наихудшего (последнего), которые представляют различные географические c границы, которые могут перекрываться друг с другом.

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. Мы знаем, что O следующий, так как он выше A в рейтинге_3. Далее идет 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)]

Обратите внимание, что когда у нас нет Достаточно данных, чтобы определить, какое из двух хранилищ имеет более высокий рейтинг, мы рассматриваем его как ie (т.е. мы знаем, что один из J или Q является самым высоко оцененным хранилищем, но не знаем, какое из них выше, поэтому мы ставим их оба в 1.5). В фактическом наборе данных есть более 100 списков по 1000+ элементов в каждом.

Мне было весело пытаться разобраться в этой проблеме, и мне любопытно, есть ли у кого-нибудь разумные подходы к это.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Изменено Алгоритм сортировки слиянием поможет здесь. Модификация должна учитывать несопоставимые магазины и, хотя, создавать группы несопоставимых элементов, которые вы готовы считать равными (например, Q и J)

0 голосов
/ 29 января 2020

Этот метод стремится проанализировать все магазины в начале рейтинга. Если они не расположены ниже первой позиции в каком-либо другом списке рейтинга, то они принадлежат этому переднему уровню и добавляются в список «уровней». Затем они удаляются из лидеров, и весь список корректируется таким образом, чтобы появились новые участники. Повторяйте процесс, пока не останется ни одного магазина.

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».

При умножении на сотни рейтингов и магазинов некоторые магазины не будут правильно ранжированы по абсолютному объему.

...