从另一个对象的子类大熊猫对象工作方式不同的子类?(subclasses of pandas'

2019-06-27 01:49发布

我想创建一个大熊猫数据结构来代替,在我的代码的子类,一类的子类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()

也许这不是要改变一些对象的配置是最好的方法,反正我发现这个有用的在我的代码和最重要的是我想知道为什么用字典而不是串联它的工作原理如我所料。

非常感谢!

Answer 1:

电流应答(熊猫> = 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'

但是,它可能是最好做一个有-A,而不是为-A。 或猴子修补系列对象。 其原因是,在使用熊猫你常常会失去你的子类,由于自然它的数据存储。 有些事情是如此简单

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

将返回子类的系列对象,而不是。 在内部,数据被存储在连续的阵列和优化速度。 在需要时,数据只与类盒装和这些类是硬编码。 此外,它不是很明显,如果像s.ix[:5]应该返回相同的子类。 这将取决于你的子类,哪些元数据附加到它的语义。

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb有一些注意事项。



Answer 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


文章来源: subclasses of pandas' object work differently from subclass of other object?