Как эффективно найти идентичные индексы в нескольких фреймах данных

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

Я написал функцию, которая идентифицирует идентичные отчеты, находя те, которые имеют идентичные индексы, затем исключает все, кроме одного, которые идентичны и движется дальше. Несмотря на то, что он отлично работает для 5000–10 000 отчетов, на обработку, скажем, более 50 000 отчетов, уходит значительное время, что с течением времени будет становиться все более распространенным.

Было бы неплохо, если бы я мог упреждающе удалить отчеты и избежать этого шага, но процесс создания отчетов этого не позволяет. Итак, я хочу найти способ сделать эту или аналогичную функцию более эффективной.

Код ниже, любая помощь и идеи будут высоко оценены!

def report_diff_index(self,dnc_data,folders):
    master_report_dict, master_val_dict = self.report_orderer(folders)
    sorts = self.report_sorter(dnc_data,master_report_dict)
    keys = [k for k in sorts.keys()]
    consolidated_sorts = keys
    print('Original Report Size: ', len(consolidated_sorts))
    for k in keys:
        if k in consolidated_sorts:
            for j in keys[keys.index(k)+1:]:
                if j in consolidated_sorts:
                    if len(list(set(sorts[k].index).symmetric_difference(sorts[j].index))) == 0:
                        consolidated_sorts.remove(j)
    print('Consolidated Report Size: ', len(consolidated_sorts))
    consolidated_report = {}
    consolidated_val = {}
    for s in consolidated_sorts:
        consolidated_report[s] = master_report_dict[s]
        consolidated_val[s] = master_val_dict[s]
    return consolidated_report, consolidated_val

2 ответа

Решение

Я не знаю, правильно ли я понимаю вашу проблему, и даже если я это сделаю, я не знаю, будет ли это быстрее, но было бы невозможно создать дикт, где вы используете уникальный индекс отчета в качестве ключа (например, используя frozenset), а затем ключ отчета в качестве значения. Это похоже на более быстрый способ создания уникального списка, но я могу быть выключен:

def report_diff_index(self,dnc_data,folders):
    master_report_dict, master_val_dict = self.report_orderer(folders)
    sorts = self.report_sorter(dnc_data,master_report_dict)
    print('Original Report Size: ', len(sorts))
    unique_reports = dict()
    for report_key, report in sorts.items:
        key = frozenset(report.index)
        # Alt 1. Replace with new (identical) repoirt
        unique_reports[key] = report_key
        # Alt 2. Keep first report
        if key not in unique_reports:
            unique_reports[key] = report_key
    consolidated_sorts = unique_reports.values()
    print('Consolidated Report Size: ', len(consolidated_sorts))
    consolidated_report = {}
    consolidated_val = {}
    for s in consolidated_sorts:
        consolidated_report[s] = master_report_dict[s]
        consolidated_val[s] = master_val_dict[s]
    return consolidated_report, consolidated_val

Как видите, в обновлении dict есть также два параметра, которые зависят от того, хотите ли вы сохранить первый найденный отчет или это не имеет значения.

Вставка в диктовку должна приближаться к O(1), поэтому я полагаю, что это довольно быстро.

Поправьте меня, если я ошибаюсь, но это выглядит так:

consolidated_sorts = keys
print('Original Report Size: ', len(consolidated_sorts))
for k in keys:
    if k in consolidated_sorts:
        for j in keys[keys.index(k)+1:]:
            if j in consolidated_sorts:
                if len(list(set(sorts[k].index).symmetric_difference(sorts[j].index))) == 0:
                    consolidated_sorts.remove(j)

только о поиске уникальных отчетов. На самом деле, итерации являются избыточными, потому что вы сначала установите consolidated_sorts равно keysзатем повторите эти значения и спросите, consolidated_sortsоткуда они пришли.

Если вам просто нужны уникальные ключи, вы можете попробовать что-то вроде этого:

def report_diff_index(self,dnc_data,folders):
    master_report_dict, master_val_dict = self.report_orderer(folders)
    sorts = self.report_sorter(dnc_data,master_tree)

    # New code to create unique set of keys
    unique_keys = set(sorts.keys())

    consolidated_report = {}
    consolidated_val = {}

    for key in unique_keys:
        consolidated_report[key] = master_report_dict[key]
        consolidated_val[key] = master_val_dict[key]

    return consolidated_report, consolidated_val
Другие вопросы по тегам