Свойства объекта теряются при использовании pickle с классом, производным от Pandas DataFrame - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь обновить поведение травления для производного класса, но не могу сохранить свойства объекта для сохранения в травлении.

import pandas as pd

class Fruit(pd.DataFrame): 
    def __init__(self):
        super(Fruit, self).__init__()
        self.codebook={3:4}

sdf = Fruit()

sdf.codebook ={1:2}

import pickle

with open('mypickle.pickle', 'wb') as f:
    pickle.dump(sdf, f)
with open('mypickle.pickle') as f:
    loaded_obj = pickle.load(f)        
assert  loaded_obj.__class__ == Fruit
assert loaded_obj.codebook

Окончательное утверждение не выполнено. AttributeError: 'Fruit' object has no attribute 'codebook'

Если мое определение класса вместо class Fruit(): pass, тогда оно работает нормально.

Как мне выбрать объект и включить новые свойства "точка" (.codebook)?

(Этот вопрос связан с открытым проектом по добавлению информации и функциональных возможностей кодовой книги данных обследования в класс Pandas DataFrame: https://github.com/cpbl/surveypandas)

Обновление:

Я попытался заменить DataFrame.to_pickle на собственный Fruit, который напрямую использует pickle.dump (self), и это не помогло тем же способом. (Почему?)

Вот неуместное усилие, которое преуспевает в записи всего, но приводит к чему-то, что не может быть понято pandas.read_pickle (). Также это кажется излишне неловким:

from pandas import DataFrame 
import cPickle as pkl

class Fruit(DataFrame): 
    def __init__(self, data=None, codebook =None):
        super(Fruit, self).__init__(data)
        self.codebook=codebook
    def to_pickle(self, path, compression='infer',
              protocol= pkl.HIGHEST_PROTOCOL):
        """ See pandas.io.pickle and pandas.DataFrame.to_pickle """
        from pandas.io.pickle import to_pickle as pandas_to_pickle
        return pandas_to_pickle( {'o': self, 'c':self.codebook}, path, compression=compression, protocol=protocol)

sdf = Fruit({'foo':[1,2,3]}, codebook={1:2})
sdf.to_pickle('mypickle.pickle')

with open('mypickle.pickle') as f:
    loaded_obj = pkl.load(f)
sdf2 = Fruit(loaded_obj['o'], codebook = loaded_obj['c'])

assert sdf2.__class__ == Fruit
assert sdf2.codebook
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...