Я пытаюсь расширить панд DataFrame следующим кодомМетод цепочки для производного DataFrame класса
class CustomFrame(DataFrame):
def __init__(self):
DataFrame.__init__(self,{"a":[1,2,3,4],"b":[5,6,7,8]})
def get(self):
return self.loc[1]
def foo(self):
return 2*self
Теперь я хотел цепной метод вызовов, как:
>>> c=CustomFrame()
>>> c.get().foo()
'Series' object has no attribute 'foo'
очевидно .loc
возвращает серию, которая ничего не знает о обычном методе foo
. Есть ли способ сделать эту работу?
Edit:
В идеале я хотел бы сделать что-то вроде
c.method_from_data_frame().method_from_custom_frame().another_method_from_data_frame()
Следуя совету HYRY я переопределен конструктор DataFrame
, однако мне нужно установить некоторые свойства инициализации от CustomFrame
class CustomFrame(DataFrame):
def __init__(self, *args, **kw):
super(CustomFrame, self).__init__(*args, **kw)
self.c = kw.get('c',False)
@property
def _constructor(self):
return CustomFrame
>>> c=CustomFrame(c=5)
>>> print c.c
5
>>> print c.get().c
False
Я попытался использовать functools
partial
@property
def _constructor(self):
return partial(CustomFrame,c=5)
, но я получаю ошибку pandas.core.common.PandasError: DataFrame constructor not properly called!
. Другой способ изменить get
к
def get(self):
ret = self.loc[[1]] # CustomFrame with default .c
ret.c = self.c
return ret
, который, кажется, не очень элегантный
Либо переопределить 'loc' вернуть' CustomFrame', или преобразовать возвращаемое значение в ' get'. – jonrsharpe
@jonrsharpe mmmh overriding 'DataFrame.loc' подразумевает переопределение каждого метода, возвращающего значение, которое я, возможно, хочу связать. – greole
Ну ... да, иначе вы не получите 'CustomFrame'. Я полагаю, вы могли бы что-то сделать с '__getattribute__'. – jonrsharpe