1

我想创建一个继承自 pandas.Series 的新类。我通常在 python 中创建子类没有任何问题,但在这种情况下我遇到了问题。

这是一个简单的继承方案:

class Test(object):
    def __new__(cls, *args, **kwargs):
        print "new Test"
        return object.__new__(cls, *args, **kwargs)
    def __init__(self):
        print "init Test"

class A(Test):
    def __new__(cls, *args, **kwargs):
        print "new A"
        return Test.__new__(cls, *args, **kwargs)
    def __init__(self):
        print "init A"

print "creating an instance of A"
a = A()
print "type: ", type(a)

输出:

creating an instance of A
new A
new Test
init A
type:  <class '__main__.A'>  

现在让我们尝试一个系列:

import pandas as pd
class subSeries(pd.Series):
    def __new__(cls, *args, **kwargs):
        print "new subSeries"
        return pd.Series.__new__(cls, *args, **kwargs)

    def __init__(self):
        print "init subSeries"
print "creating an instance of subSeries"
s = subSeries()
print "type: ", type(s)

我们得到:

creating an instance of subSeries
new subSeries
type:  <class 'pandas.core.series.Series'>

为什么是s系列而不是子系列?

4

1 回答 1

1

在 pandas github 网站上有一个关于此主题的问题:

https://github.com/pydata/pandas/issues/60

我自己在为光谱库数据格式(按波长索引)对 Series 进行子类化时遇到了这个问题。这很粗糙,有很多猴子修补和编写方法,它们显式地调用了 Series 方法,但只是在返回之前将其替换为我的 Spectrum 类。我必须在newinit中定义一些逻辑。

它显然与 Cython 和 Python 以及 numpy C API 的混合以及 _constructor() 方法的不一致使用有关。不过,我最近没有检查它。我知道从 ndarray 到另一个中间类 NDFrame 发生了变化,作为 Dataframe 和 Series 父类(或者它可能仍在进行中)。

于 2013-12-11T21:56:17.070 回答