Метод добавления Pandas не выдерживает сериализацию

#python #python-3.x #pandas #methods #dill

#python #python-3.x #pandas #методы #укроп

Вопрос:

Я пытаюсь добавить метод в pandas, чтобы я мог легко его использовать, если у меня есть доступ к фрейму данных. Однако сериализация «убивает» метод, как показано в следующем примере

 import dill

class Foo:
    def sayhello(self):
        print("hello")

f = Foo()
dill.dump(f, open("./foo.pickle", "wb"))

f1 = dill.load(open("./foo.pickle", "r"))
f1.sayhello()

def addto(instance):
    def decorator(f):
        import types
        f = types.MethodType(f, instance, instance.__class__)
        setattr(instance, f.func_name, f)
        return f
    return decorator

@addto(f)
def saygoodbye(self):
    print("goodbye")

dill.dump(f, open("./foo.pickle", "wb"))

f1 = dill.load(open("./foo.pickle", "r"))

f1.sayhello()
f1.saygoodbye()

import pandas as pd

df = pd.DataFrame([0,1])
@addto(df)
def saygoodbye(self):
    print("goodbye")

dill.dump(df, open("./dframe.pickle", "wb"))
df1 = dill.load(open("./dframe.pickle", "r"))
df1.saygoodbye()
  

что вызывает у меня AttributeError: 'DataFrame' object has no attribute 'saygoodbye'

1) Вы видите, что вызывает проблему?

2) Есть ли у вас какие-либо идеи, как сериализовать добавленный метод в фрейме данных?

Спасибо

Ответ №1:

1) Вы видите, что вызывает проблему?

Вам нужно добавить метод в класс вместо экземпляра, например

 df = pd.DataFrame([0,1])
@addto(pd.DataFrame)
def saygoodbye(self):
    print("goodbye")
  

2) Есть ли у вас какие-либо идеи, как сериализовать добавленный метод в фрейме данных?

Если я правильно понял, вы хотите сериализовать экземпляр dataframe в файл pickle, а затем десериализовать его позже. Мое предложение — создать новый класс, наследующий от DataFrame.

 class MyDataFrame(pd.DataFrame):
    def saygoodbye(self):
        print 'saygoodbye'

df = MyDataFrame([0,1])
dill.dump(df, open("./dframe.pickle", "wb"))
df1 = dill.load(open("./dframe.pickle", "r"))
df.saygoodbye()
  

Комментарии:

1. Есть ли способ использовать декораторы для достижения этой цели? Предположим, у меня много функций для многих фреймов данных, тогда создание пользовательского класса для каждого фрейма данных кажется сложным.