Метод добавления панд не выдерживает сериализации
Я пытаюсь добавить метод к пандам, чтобы я мог легко его использовать, если у меня есть доступ к фрейму данных. Однако сериализация "убивает" такой метод, как показано в следующем примере
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()