2012-08-16 8 views
5
私は、私のコードでは、置換する Seriesのサブクラスで dictのサブクラスをパンダのデータ構造のサブクラスを作成しようとしています

この例のコードが動作しない理由を、私は理解していませんパンダのオブジェクトのサブクラスは、他のオブジェクトのサブクラスとは異なる動作をしますか?

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

はおそらく、それはいくつかのオブジェクトの設定を変更するための最良の方法ではありませんが、とにかく私は私のコードでは、この便利を発見し、私はそれが動作する理由辞書代わりのシリーズと理解したいすべての大半私が期待する通り。

ありがとうございます!

答えて

10

現在回答(​​パンダ> = 0.13)

パンダ0.13劇的に簡略化されたサブクラスに内部リファクタリング。パンダSeriesは現在、他のPythonオブジェクトと同様にサブクラス化することができる。

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

レガシー回答(パンダ< = 0.12)

問題シリーズシリーズオブジェクトがインスタンス化されることを保証され__new__を使用することです。

あなたはそうのようなあなたのクラスを変更することができます。

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' 

しかし、それは代わりに持って-ある-行うにはおそらく最善です。またはMonkeyはSeriesオブジェクトにパッチを当てます。その理由は、データストレージの性質上、パンダを使用しているときにサブクラスを失うことが多いからです。

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

あなたのサブクラスではなくSeriesオブジェクトを返します。内部的には、データは連続配列に格納され、速度を最適化します。データは、必要に応じてクラスでボックス化され、それらのクラスはハードコードされています。さらに、s.ix[:5]のようなものが同じサブクラスを返さなければならないことはすぐには分かりません。これは、サブクラスのセマンティクスとそれに付随するメタデータに依存します。

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynbいくつかの注意点があります。

+0

それは働きます!しかし、あなたは正しいです...おそらくサブクラスを実装するのが最良の選択ではありませんでした! ありがとうございました! – Francesco

2

Support()は、Seriesオブジェクトを返します。シリーズおよびデータフレームのサブクラスで

も参照してください。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 
関連する問題