Могу ли я использовать абстрактные методы для импорта файлового форматирования данных (Python) pandas?

avatar
d8aninja
9 августа 2021 в 00:09
161
3
6

У меня есть класс FileSet с методом _process_series, который содержит набор блоков if-elif, выполняющих filetag-специфичное форматирование различных <74845804>06404804>6404804>

    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

Я хотел бы определить абстрактный метод 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

Источник
Alex Waygood
17 августа 2021 в 21:55
1

Извините, в чем именно вопрос?

Raha Moosavi
19 августа 2021 в 13:34
1

не могли бы вы уточнить свой вопрос? Вы получаете какие-либо специальные ошибки?

Kyle Parsons
19 августа 2021 в 21:24
0

Есть ли конкретная причина, по которой вы хотите, чтобы ваши форматировщики файловых тегов были модулями? Я думаю, что было бы более распространенным просто сделать их функциями или классами, если им нужно хранить немного состояния. У вас может быть<25866333509959> какая-то сложная логика "регистрации", но вы также можете просто жестко закодировать сопоставление файловых тегов с форматтерами в FileSet.

Ответы (3)

avatar
U12-Forward
21 августа 2021 в 02:57
1

Почему бы не использовать globals со звездочкой:

from my_formatters import *

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

Я преобразовал ваш псевдокод в реальный код.

globals документация:

Возвращает словарь, представляющий текущую глобальную таблицу символов. Это всегда словарь текущего модуля (внутри функции или метода это модуль, в котором он определен, а не модуль, из которого он вызывается).

avatar
Will Da Silva
19 августа 2021 в 14:04
0

Ваш псевдокод можно преобразовать в настоящий код следующим образом:

import my_formatters

for tag in filetag:
    fmt = getattr(my_formatters, tag + '_formatter')
    ps = self.format(pandas_series, fmt)
    return ps
avatar
Brian Z
18 августа 2021 в 19:05
2

Вы можете создать функцию в собственном файле .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