2012-08-16 31 views
5

Ben Series bir alt sınıf, benim kodunda, bir dict bir alt sınıfını yerine bir panda veri yapısının bir alt sınıfı oluşturmak için çalışıyorum, ben anlamıyorumalt sınıfları, diğer nesnenin alt sınıfından farklı mı çalışır? Bu örnek kod neden çalışmıyor

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() 

Muhtemelen bazı nesnelerin yapılandırmasını değiştirmek için en iyi yöntem değildir, zaten benim kodunda bu usefull bulundu ve en önemlisi ben dict yerine serisi ile çalıştığını anlamak istiyorum beklediğim gibi.

Çok teşekkürler!

cevap

10

Güncel Cevap (Pandalar> = 0.13) Pandalar 0.13 yılında

Bir iç refactor ölçüde basitleştirilmiş sınıflara. Pandalar Series şimdi başka bir Python nesne gibi sınıflandırma yapılabilir:

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

Legacy Cevap (Pandalar < = 0,12)

sorun Serisi Seri nesne örneği sağlanmasıdır __new__ kullanmasıdır.

Çok sevdiği sınıf değiştirebilirsiniz:

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' 

Ancak bunun yerine bir bir has-is-a bir yapmak en iyisidir. Veya maymun dizi nesnesini yamaya. Bunun nedeni, veri saklama alanının doğası gereği pandaları kullanırken alt sınıfınızı sık sık kaybetmenizdir.

Alt sınıf yerine bir seri nesnesi döndürecektir. Dahili olarak, veriler bitişik dizilerde saklanır ve hız için optimize edilir. Veriler gerektiğinde sadece bir sınıf ile kutlanır ve bu sınıflar kodlanır. Ayrıca, s.ix[:5] gibi bir şeyin aynı alt sınıfı döndürmesi gerekiyorsa hemen belli olmaz. Bu, alt sınıfınızın semantiklerine ve metadata ne bağlı olduğuna bağlı olacaktır. http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb bazı notlara sahiptir.

+0

Çalışıyor! Ama haklısınız ... muhtemelen bir alt sınıfı uygulamak için en iyi seçim değildi! Çok teşekkürler! – Francesco

2

Support(), Series nesnesini döndürür. Serisi ve DataFrame ait subclassing günü

ayrıca bkz: 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 
İlgili konular