CompanyNameMatcherxlsx.py

Сопоставление данных
 avatar
user_2065311
python
8 months ago
2.9 kB
3
Indexable
Never
# CompanyNameMatcherxlsx.py

'''

Краткое описание: Этот скрипт Python, использующий библиотеку pandas для работы с Excel файлами и fuzzywuzzy для нечеткого сопоставления, автоматизирует процесс сопоставления небрежно записанных названий компаний или ФИО заказчиков с их точными названиями и ИНН. Скрипт считывает данные из файла "2021.xlsx", который содержит два листа: "договоры" с названиями компаний и "ИНН" с точными названиями и ИНН. Затем он ищет наилучшее совпадение для каждого названия из листа "договоры" среди названий из листа "ИНН", используя нечеткое сопоставление, и обновляет лист "договоры" найденными соответствиями и ИНН, если совпадение превышает пороговое значение 85%. Результаты сохраняются в новом файле Excel "2021_updated.xlsx".

'''

import pandas as pd
from fuzzywuzzy import process

def find_best_match(name, choices, threshold=85):  # Lowered threshold for closer matches
    # Use fuzzy matching to find the best match above a certain threshold
    best_match = process.extractOne(name, choices, score_cutoff=threshold)
    return best_match

def main():
    file_path = '2021.xlsx'
    output_path = '2021_updated.xlsx'

    contracts_df = pd.read_excel(file_path, sheet_name='договоры')
    inn_df = pd.read_excel(file_path, sheet_name='ИНН')
    
    # Pre-process: Create a list of names for matching
    choices = inn_df['Наименование'].tolist()

    for index, row in contracts_df.iterrows():
        name = row['Наименование']
        best_match = find_best_match(name, choices)
        if best_match:
            matched_name, score = best_match
            # Update the DataFrame with the match results
            contracts_df.at[index, 'Matched Name'] = matched_name
            contracts_df.at[index, 'Match Score'] = score
            # Find the INN for the matched name
            matched_inn = inn_df.loc[inn_df['Наименование'] == matched_name, 'ИНН'].values[0]
            contracts_df.at[index, 'Matched INN'] = matched_inn
            
            print(f"Matched '{name}' to '{matched_name}' with score {score}")
        else:
            print(f"No match found for '{name}'")

    # Save the updates to a new Excel file
    contracts_df.to_excel(output_path, index=False)
    print("Update completed, results saved in file:", output_path)

if __name__ == "__main__":
    main()