我可以使用抽象方法导入 (Python) pandas 数据的文件特定格式吗?

Can I use abstract methods to import file-specific formatting of (Python) pandas data?

我有一个 class FileSet 方法 _process_series,它包含一堆 if-elif 块做 filetag - 不同 pandas.Series:

的特定格式
    elif filetag == "EntityA":
        ps[filetag+"_Id"] = str(ps[filetag+"_Id"]).strip()
        ps[filetag+"_DateOfBirth"] = str(pd.to_datetime(ps[filetag+"_DateOfBirth"]).strftime('%Y-%m-%d')).strip()
        ps[filetag+"_FirstName"] = str(ps[filetag+"_FirstName"]).strip().capitalize()
        ps[filetag+"_LastName"] = str(ps[filetag+"_LastName"]).strip().capitalize()
        ps[filetag+"_Age"] = relativedelta(datetime.today(), datetime.strptime(ps[filetag+"_DateOfBirth"], "%Y-%m-%d")).years
        return ps

我想在 class 中定义一个抽象的 format 方法,并将这些格式块保存在单独的模块中,当为给定的 _process_series 调用时导入这些模块 filetag。原谅伪代码,但类似:

for tag in filetag:
    from my_formatters import tag+'_formatter' as fmt
    ps = self.format(pandas_series, fmt)
    return ps

并且该模块将包含格式化块:

# my_formatters.EntityA_formatter
    ps[filetag+"_Id"] = str(ps[filetag+"_Id"]).strip()
    ps[filetag+"_DateOfBirth"] = str(pd.to_datetime(ps[filetag+"_DateOfBirth"]).strftime('%Y-%m-%d')).strip()
    ps[filetag+"_FirstName"] = str(ps[filetag+"_FirstName"]).strip().capitalize()
    ps[filetag+"_LastName"] = str(ps[filetag+"_LastName"]).strip().capitalize()
    ps[filetag+"_Age"] = relativedelta(datetime.today(), datetime.strptime(ps[filetag+"_DateOfBirth"], "%Y-%m-%d")).years
    return ps

您可以在它自己的 .py 文件中创建一个函数并将其导入。如果您在每个文件中创建相同的函数,您就可以调用它。

这里是f1.py:

def gimme():
    return 'format 1'

这里是 f2.py:

def gimme():
    return 'format 2'

那么你的主文件:

module_names = ['f1','f2']

for module_name in module_names:
    import_test = __import__(module_name)
    result = import_test.gimme()
    result = import_test.gimme()
    print(result)

给出输出:

format 1
format 2

你的伪代码可以像这样变成真正的代码:

import my_formatters

for tag in filetag:
    fmt = getattr(my_formatters, tag + '_formatter')
    ps = self.format(pandas_series, fmt)
    return ps

为什么不使用带星号的 globals:

from my_formatters import *

for tag in filetag:
    fmt = globals()[tag + '_formatter']
    ps = self.format(pandas_series, fmt)
    return ps

我把你的伪代码转换成了真正的代码。

globals documentation:

Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).