我正在用Python编写一个ETL脚本,用于获取CSV文件中的数据,验证和清理数据,以及根据某些规则对每一行进行分类或分类,最后将其加载到postgresql数据库中。
数据看起来像这样(简化):
ColA, ColB, Timestamp, Timestamp, Journaltext, AmountA, AmountB
每一行都是金融交易。 我想要做的是根据一些规则对交易进行分类或分类。 规则基本上是与Journaltext列中的文本匹配的正则表达式。
所以我想做的是这样的事情:
transactions = [] for row in rows: t = Transaction(category=classify(row.journaltext)) transactions.append(t)
我不确定如何有效地编写classify()函数。
这就是分类规则的工作原理:
确定。那么如何在Python中表示这些类别和相应的规则呢?
我非常感谢您的意见。即使你无法提供完整的解决方案。任何暗示我朝着正确方向发展的事情都会很棒。感谢。
答案 0 :(得分:2)
没有任何额外的毛茸茸:
categories = [
('cat1', ['foo']),
('cat2', ['football']),
('cat3', ['abc', 'aba', 'bca'])
]
def classify(text):
for category, matches in categories:
if any(match in text for match in matches):
return category
return None
在Python中,您可以使用in
运算符来测试字符串的子集。您可以添加一些内容,例如isinstance(match, str)
,以检查您是使用简单字符串还是正则表达式对象。它取得的进步取决于你。
答案 1 :(得分:2)
伪python中的这个解决方案怎么样:
def classify(journaltext):
prio_list = ["FOO", "BAR", "UPS", ...] # "..." is a placeholder: you have to give the full list here.
# dictionary:
# - key is the name of the category, must match the name in the above prio_list
# - value is the regex that identifies the category
matchers = {"FOO": "the regex for FOO", "BAR": "the regex for BAR", "UPS":"...", ...}
for category in prio_list:
if re.match(matchers[category], journaltext):
return category
return "UNKOWN" # or you can "return None"
特点:
您甚至可以从配置文件中读取优先级类别列表和正则表达式,但这仍然是读者的练习......