5

Pandas データ構造のサブクラスを作成して、コード内で a のサブクラスを a のサブクラスに置き換えようとしていますが、dictこのSeriesコード例が機能しない理由がわかりません

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

おそらく、一部のオブジェクトの構成を変更するのは最善の方法ではありませんが、コードでこれが役立つことがわかりました。何よりも、シリーズではなくdictを使用すると期待どおりに機能する理由を理解したいと思います。

どうもありがとう!

4

2 に答える 2

10

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

Pandas 0.13 の内部リファクタリングにより、サブクラス化が大幅に簡素化されました。PandasSeriesは、他の Python オブジェクトと同じようにサブクラス化できるようになりました。

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

従来の回答 (パンダ <= 0.12)

問題は__new__、Series オブジェクトがインスタンス化されることを保証する Series の使用です。

次のようにクラスを変更できます。

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'

ただし、is-a の代わりに has-a を実行することをお勧めします。または、シリーズ オブジェクトにモンキー パッチを適用します。その理由は、データ ストレージの性質上、pandas を使用しているときにサブクラスを失うことがよくあるためです。次のような単純なもの

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

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

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

于 2012-08-16T07:34:54.043 に答える
2

Support()オブジェクトを返しSeriesます。

Series と DataFrame のサブクラス化については、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
于 2012-08-16T07:37:02.683 に答える