0

客观的

将公司 B 的会计说明(例如“现金”)与公司 A 的会计说明(例如“现金汇总”)相匹配。

方法

  1. 记录公司 A 和公司 B 的会计说明,将它们放入各自的数据框中(将公司 A 的会计说明指定为“approved_accts”)。制作 A 公司的会计说明 =approved_accts
  2. 使用python的fuzzywuzzy包,比较公司B的会计描述和approved_accts. 如果模糊模糊匹配高于某个阈值,则将“approve_accts”标签附加到公司 B 的会计说明(最好在相邻列中,以免公司 B 的原始说明丢失)。

代码

import pandas as pd
from fuzzywuzzy import process
from fuzzywuzzy import fuzz

fileLoc = r'...\mapping.xlsx'
xls = pd.ExcelFile(fileLoc)

df_plp = xls.parse('PLP')
df_nbg = xls.parse('NBG')

df_plp.head(10)
#Confirmed the plp.head layout matches the excel file

df_nbg.head(10)
#Confirmed the nbg.head layout matches the excel file

#pull out the Account Descriptions for comparison
approved_accts = df_nbg['Account Description']
plp_accts = df_plp['Account Description']

#Test fuzzywuzzy
process.extract('Cash', 'Cash Cash Rollup')

输出

process.extract('Cash', 'Cash Cash Rollup')

[('C', 90), ('a', 90), ('s', 90), ('h', 90), ('C', 90)]

process.extractOne('Cash', 'Cash Cash Rollup')

('C',90)

fuzz.token_set_ratio('Cash', 'Cash Cash Rollup')

100

问题

  1. 在输出 #1、2 中 - FuzzyWuzzy 似乎正在分解每个单独的字符以进行比较(这是不正确的)。我在网上查看并发现以下github 问题。然而,就在昨天,这个实现正在使用另一个示例。我想知道,这可能是什么原因?

  2. 对于每个帐户描述,都有一个唯一的 ID(“帐户号”)。有没有办法我可以携带这个唯一的 ID,以便 B 公司的“​​现金”账户(账户 ID:B123)与 A 公司的批准列表“现金现金汇总”(账户 ID:A321)相匹配,这样我就可以看到哪个帐号需要重新映射吗?从本质上讲,当我们比较每家公司的账户描述时,这些帐号只是“顺路”,但当我深入研究会计软件/ERP 系统时,它们就会变得有价值。

  3. 您是否推荐使用任何其他库(而不是fuzzywuzzy)来协助该过程?

4

2 回答 2

0

RE 1:FuzzyWuzzy 的函数似乎需要process一个列表作为第二个参数,所以它可能会将您的字符串解析为字符列表?请参阅模糊模糊文档.unique()使用 pandas series/df方法来避免处理可能的重复可能也很有意义。

RE 2:如果您有一个包含 A 和 B 列的表以及另一个包含 C 和 D 列的表,并且您有一个从 A 到 C 的映射(例如从模糊字符串匹配),您可以通过加入来获得从 B 到 D 的映射A 和 C 上的两个数据框,然后寻找所有唯一的 B 和 D 对。像这样:joined_df[['B', 'D']].unique()

RE 3:我个人使用 FuzzyWuzzy 在模糊字符串匹配上加入两个单独的数据帧,并且没有编写自己的库来完成相同的任务,我认为这可能是最好的方法。ExtractOne定义一个采用系列并使用 FuzzyWuzzy选择并返回最接近的匹配的函数是快速且相对容易的。

于 2016-12-06T22:37:49.403 回答
0

您是否检查了 process.extract 的文档 https://github.com/seatgeek/fuzzywuzzy/blob/master/fuzzywuzzy/process.py#L132

你需要传入一个可迭代的(列表或字典)

以下作品:

process.extract('Cash', 'Cash Cash Rollup'.split(' '))

[('Cash', 100), ('Cash', 100), ('Rollup', 0)]

于 2016-12-06T22:52:58.430 回答