2012-08-16 9 views
5

estoy tratando de crear una subclase de una estructura de datos de la panda de sustituir, en mi código, una subclase de un dict con una subclase de un Series, no entiendo por qué este código de ejemplo no funcionasubclases de trabajo objeto pandas diferente a subclase de otro objeto?

from pandas import Series  

class Support(Series): 
    def supportMethod1(self): 
     print 'I am support method 1'  
    def supportMethod2(self): 
     print 'I am support method 2' 

class Compute(object): 
    supp=None   
    def test(self): 
     self.supp() 

class Config(object): 
    supp=None   
    @classmethod 
    def initializeConfig(cls): 
     cls.supp=Support() 
    @classmethod 
    def setConfig1(cls): 
     Compute.supp=cls.supp.supportMethod1 
    @classmethod 
    def setConfig2(cls): 
     Compute.supp=cls.supp.supportMethod2    

Config.initializeConfig() 

Config.setConfig1()  
c1=Compute() 
c1.test() 

Config.setConfig2()  
c1.test() 

Probablemente no es el mejor método para cambiar la configuración de algunos objetos, de todos modos me encontré con esta muy útil en mi código y la mayor parte de todo lo que quiero entender por qué con dict en lugar de serie funciona como espero

¡Muchas gracias!

Respuesta

10

respuesta actual (pandas> = 0,13)

Un refactor interna en pandas 0,13 subclases simplificado drásticamente. Pandas Series ahora pueden ser subclases como cualquier otro objeto Python:

class MySeries(pd.Series): 
    def my_method(self): 
     return "my_method" 

Legado respuesta (pandas < = 0,12)

El problema es que Series utiliza __new__ que es asegurarse de que un objeto de la serie se crea una instancia.

Usted puede modificar su clase, así:

class Support(pd.Series): 
    def __new__(cls, *args, **kwargs): 
     arr = Series.__new__(cls, *args, **kwargs) 
     return arr.view(Support) 

    def supportMethod1(self): 
     print 'I am support method 1'  
    def supportMethod2(self): 
     print 'I am support method 2' 

Sin embargo, es probable que sea mejor para hacer un HAS-A en lugar de a es-a. O mono parche el objeto Serie. La razón es que a menudo perderás tu subclase al usar pandas debido a la naturaleza de su almacenamiento de datos. Algo tan simple como

s.ix[:5] 
s.cumsum() 

Devolverá un objeto Serie en lugar de su subclase. Internamente, los datos se almacenan en matrices contiguas y se optimizan para la velocidad. Los datos solo se incluyen con una clase cuando es necesario y esas clases están codificadas. Además, no es inmediatamente obvio si algo como s.ix[:5] debe devolver la misma subclase. Eso dependería de la semántica de su subclase y de los metadatos que se le atribuyen.

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb tiene algunas notas.

+0

funciona! Pero tienes razón ... ¡probablemente no fue la mejor opción implementar una subclase! Muchas gracias! – Francesco

2

Support() devuelve un objeto Series.

En la subclasificación de la serie y trama de datos vea también: https://github.com/pydata/pandas/issues/60

In [16]: class MyDict(dict): 
    ....:  pass 
    ....: 

In [17]: md = MyDict() 

In [18]: type(md) 
Out[18]: __main__.MyDict 

In [21]: class MySeries(Series): 
    ....:  pass 
    ....: 

In [22]: ms = MySeries() 

In [23]: type(ms) 
Out[23]: pandas.core.series.Series 
Cuestiones relacionadas