gpt4 book ai didi

python - Pandas 对象的子类与其他对象的子类工作方式不同?

转载 作者:太空狗 更新时间:2023-10-30 00:33:20 25 4
gpt4 key购买 nike

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

非常感谢!

最佳答案

当前答案( Pandas >= 0.13)

Pandas 0.13 中的内部重构大大简化了子类化。 Pandas Series 现在可以像任何其他 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。或者猴子修补 Series 对象。原因是由于数据存储的性质,您在使用 pandas 时经常会丢失子类。像

这样简单的东西
s.ix[:5] 
s.cumsum()

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

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb有一些笔记。

关于python - Pandas 对象的子类与其他对象的子类工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11979194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com