Как эффективно найти идентичные индексы в нескольких фреймах данных
У меня есть процесс, который собирает отчеты, сгенерированные в течение недели, и объединяет их для устранения идентичных отчетов.
Я написал функцию, которая идентифицирует идентичные отчеты, находя те, которые имеют идентичные индексы, затем исключает все, кроме одного, которые идентичны и движется дальше. Несмотря на то, что он отлично работает для 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