Выпуск бинарной метки классификации ECM; Библиотека записей Python 3.x - PullRequest
0 голосов
/ 14 ноября 2018

Я столкнулся с проблемой в Python при использовании библиотеки recordlinkage. Все мои попытки использовать функцию fit объекта ECMClassifier привели к ошибкам. Я попытался осмотреться, но безуспешно, поскольку все представленные решения не относятся к библиотеке recordlinkage.

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

Dataframe1 содержит семь столбцов в следующем порядке: Block_Key, cust_name, physical_padress1, physical_address2, city, state, zip. Dataframe2 имеет восемь столбцов: Block_Key, business_name, tradestyle, sec_trdstl, physical_street, physical_city, physical_state, physical_zip.

Они индексируются с блокировкой, используя Block_Key, чтобы вернуть список MultiIndex.

def block_key_pairing(self, block_keys):
    df1Data = pandas.read_excel(self.Dataframe1)
    df2Data = pandas.read_excel(self.Dataframe2)
    candidate_df = pandas.DataFrame()
    pair_list = []
    for block_key in block_keys:
        bkIndexer = BlockKeyIndexer(block_key)
        pair = bkIndexer.index(df1Data, df2Data)
        for index in pair:
            candidate_df.loc[index] = block_key
        pair_list.append(pair)
    candidate_df.to_excel('C:\\Users\\Documents\\Pairs & Block Keys.xlsx')
    return pair_list

BlockKeyIndexer - это объект класса для пользовательской индексации из-за того, что обычный индексатор возвращает пары с разными блочными ключами, потому что они отличаются на один или два символа.

Функция, которую используют пары кандидатов, показана ниже, а также там, где я возился с классификациями в течение пары дней.

def comparator(self, candidate_links):
    comp = recordlinkage.Compare()

    vector_df = pandas.DataFrame()

    comp.string("cust_name", "business_name", method='levenshtein',label='Business Name')
    comp.string("cust_name", "tradestyle", method='levenshtein',label='Trade Style')
    comp.string("cust_name", "sec_trdstl", method='levenshtein',label='Secondary TS')
    comp.string("physical_address_1", "physical_street", method='levenshtein',label='Primary Address')
    comp.string("physical_address_2", "physical_street", method='levenshtein',label='Secondary Address')
    comp.string("city", "physical_city", method='levenshtein',label='City')
    comp.string("state", "physical_state", method='levenshtein',label='State')
    comp.numeric("zip", "physical_zip",label='Zip')

    df1Data = pandas.read_excel(self.Dataframe1)
    df2Data = pandas.read_excel(self.Dataframe2)

    for candidate_pair in candidate_links:
        vector_df = vector_df.append(comp.compute(candidate_pair,df1Data,df2Data))

    vector_df=vector_df.astype(np.int_)
    ecm=recordlinkage.ECMClassifier(init='jaro',binarize=0.8)
    result_ecm=ecm.fit(vector_df)
    print(len(result_ecm))

    return vector_df

Таким образом, создается векторный фрейм данных с именем vector_df, и при попытке использовать функцию fit он выдает эту ошибку:

ValueError: Only binary labels are allowed for 'jaro'method. Column 2 has 1 different labels.

Я был очень озадачен этим, потому что это, кажется, подразумевает, что столбцы 0 и 1 являются приемлемыми.

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

def comparator(self, candidate_links):
    comp = recordlinkage.Compare()

    vector_df = pandas.DataFrame()

    comp.string("cust_name", "business_name", method='levenshtein',label='Business Name')
    comp.string("cust_name", "tradestyle", method='levenshtein',label='Trade Style')
    #comp.string("cust_name", "sec_trdstl", method='levenshtein',label='Secondary TS')
    comp.string("physical_address_1", "physical_street", method='levenshtein',label='Primary Address')
    comp.string("physical_address_2", "physical_street", method='levenshtein',label='Secondary Address')
    comp.string("city", "physical_city", method='levenshtein',label='City')
    comp.string("state", "physical_state", method='levenshtein',label='State')
    comp.numeric("zip", "physical_zip",label='Zip')

    df1Data = pandas.read_excel(self.Dataframe1)
    df2Data = pandas.read_excel(self.Dataframe2)

    for candidate_pair in candidate_links:
        vector_df = vector_df.append(comp.compute(candidate_pair,df1Data,df2Data))

    vector_df=vector_df.astype(np.int_)
    ecm=recordlinkage.ECMClassifier(init='jaro',binarize=0.8)
    result_ecm=ecm.fit(vector_df)
    print(len(result_ecm))

    return vector_df

Однако это приводит к новой ошибке при запуске:

ValueError: could not broadcast input array from shape (12) into shape (13)

Я попробовал отладку, и я заглянул в библиотеку, чтобы увидеть, каков процесс, но я все еще не могу понять, что мне нужно сделать с vector_df, чтобы мой код работал правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...