5

我正在尝试创建 Pandas 数据结构的子类,以在我的代码中将 a 的子类替换为 adict的子类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而不是series它可以按预期工作。

非常感谢!

4

2 回答 2

10

当前答案(熊猫 >= 0.13)

Pandas 0.13 中的内部重构极大地简化了子类化。PandasSeries现在可以像任何其他 Python 对象一样被子类化:

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

旧版答案(Pandas <= 0.12)

问题是 Series 使用__new__它来确保实例化 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'

但是,最好使用 has-a 而不是 is-a。或者猴子修补系列对象。原因是由于它的数据存储性质,您在使用 pandas 时经常会丢失您的子类。像这样简单的东西

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

将返回一个 Series 对象而不是您的子类。在内部,数据存储在连续的数组中并针对速度进行了优化。数据仅在需要时与类一起装箱,并且这些类是硬编码的。另外,类似的东西s.ix[:5]是否应该返回相同的子类并不是很明显。这将取决于您的子类的语义以及附加到它的元数据。

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 回答