是否有一个设计模式,我可以用它来应用一个函数列表来创建python中的机器学习功能?

时间:2017-02-28 00:10:53

标签: python design-patterns refactoring

我正在使用python构建地址解析工具来标记地址部分。我有一个看起来像这样的pandas数据框。

df = pd.DataFrame({"TOKEN": ['123.', 'Fake', 'street']})

我有很多功能如下:

def f_ends_in_period(s):
    return 'f_ends_in_period' if s[-1] == "." else ''

def f_numeric(s):
    return 'f_numeric' if any([k.isdigit() for k in s]) else ''

def f_capitalized(s):
    return 'f_capitalized' if s[0].isupper() else ''
...

特征功能相当严格。如果字符串f_blah(s)满足某些条件(即条件“blah”),则特征函数s返回“f_blah”,否则返回空字符串。这有点奇怪,但有一种疯狂的方法。

无论如何,现在我正在做的只是在列表中

df['f_ends_in_period'] = df['TOKEN'].apply(f_ends_in_period)
df['f_numeric'] = df['TOKEN'].apply(f_numeric)
df['f_capitalized'] = df['TOKEN'].apply(f_capitalized)

这很好用,除了每次我想创建一个新的特征函数时,我必须至少输入该特征函数的名称4次。这开始变得非常烦人,特别是如果我想要创建许多功能。

我可以使用哪种标准模式来重构这个模式吗?我不确定解决方案的确切含义,我只是在寻找简化此流程的建议。

2 个答案:

答案 0 :(得分:0)

您可能对这段代码感兴趣

from inspect import getmembers, isfunction
import my_module

functions_list = [o for o in getmembers(my_module) if isfunction(o[1])]

它返回一个元组列表,其中包含模块中的所有函数以及它们的名称作为字符串。

答案 1 :(得分:0)

pythonic解决方案是使用函数列表,然后使用理解来构建结果列表。这是一个可以让你顺利的例子:

def f_ends_in_period(s):
    return 'f_ends_in_period' if s[-1] == "." else ''

def f_numeric(s):
    return 'f_numeric' if any([k.isdigit() for k in s]) else ''

funcs = [f_ends_in_period, f_numeric]

result = [f(s) for f in funcs]

您只需添加一次方法或函数,然后将其添加到func列表定义中。

编辑:您可以将Elmex80s的答案与我的相结合,从而以编程方式构建功能列表,甚至可以通过按功能名称进行过滤。例如,获取名称以“validate_”开头的所有成员函数,然后使用上面的te代码遍历该列表。