Я столкнулся с проблемой в 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
, чтобы мой код работал правильно.