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 クラスと交換しただけでした。newでいくつかのロジックを定義し、 initでいくつかのロジックを定義する必要がありました。

どうやら、Cython と Python と numpy C API の混合、および _constructor() メソッドの一貫性のない使用に関係しているようです。最近はチェックしていませんが。Dataframe および Series の親クラスとして、ndarray から別の中間クラス NDFrame への変更があったことを知っています (または、まだ処理中の可能性があります)。

于 2013-12-11T21:56:17.070 に答える