2012-08-16 12 views
5

Ich versuche, eine Unterklasse einer Panda-Datenstruktur zu schaffen, in meinem Code zu ersetzen, eine Unterklasse einer dict mit einer Unterklasse einer Series, ich verstehe nicht, warum dieser Code Beispiel nicht funktioniertUnterklassen des Pandas-Objekts arbeiten anders als die Unterklasse eines anderen Objekts?

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

Wahrscheinlich nicht die beste Methode ist, um die Konfiguration einiger Objekte zu ändern, trotzdem fand ich dieses sehr nützlich in meinem Code und vor allem möchte ich verstehen, warum mit dict statt Serie es funktioniert wie ich es erwarte.

Vielen Dank!

Antwort

10

Aktuelle Antwort (Pandas> = 0,13)

Ein interner refactor in Pandas 0,13 drastisch vereinfacht Subklassifizieren. Pandas Series kann nun wie jedes andere Python-Objekt subclassed werden:

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

Legacy-Antwort (Pandas < = 0,12)

Das Problem ist, dass Series __new__ verwendet, die, dass eine Serie Objekt ist sichergestellt wird, instanziiert.

Sie können Ihre Klasse wie so ändern:

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' 

Allerdings ist es wahrscheinlich am besten ein zu tun hat-a anstelle von a-a. Oder Affen patch das Serienobjekt. Der Grund ist, dass Sie aufgrund der Art des Datenspeichers oft Ihre Unterklasse verlieren, wenn Sie Pandas benutzen. So einfach wie

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

Gibt ein Series-Objekt anstelle Ihrer Unterklasse zurück. Intern werden die Daten in zusammenhängenden Arrays gespeichert und auf Geschwindigkeit optimiert. Die Daten werden nur bei Bedarf mit einer Klasse eingerahmt, und diese Klassen sind fest codiert. Plus, es ist nicht sofort offensichtlich, wenn etwas wie s.ix[:5] die gleiche Unterklasse zurückgeben sollte. Das hängt von der Semantik Ihrer Unterklasse ab und welche Metadaten an sie angehängt sind.

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb hat einige Hinweise.

+0

Es funktioniert! Aber Sie haben Recht ... wahrscheinlich war es nicht die beste Wahl, eine Unterklasse zu implementieren! Vielen Dank !!! – Francesco

2

Support() gibt ein Objekt Series zurück.

Auf Klassifizieren von Serien und Datenrahmen siehe auch: 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 
Verwandte Themen