1

のサブクラスを書きたいと思いpandas.core.index.Indexます。numpy documentationにあるndarrayをサブクラス化するためのガイドに従っています。これが私のコードです:

import numpy as np
import pandas as pd

class InfoIndex(pd.core.index.Index):

    def __new__(subtype, data, info=None):
        # Create the ndarray instance of our type, given the usual
        # ndarray input arguments.  This will call the standard
        # ndarray constructor, but return an object of our type.
        # It also triggers a call to InfoArray.__array_finalize__
        obj = pd.core.index.Index.__new__(subtype, data)
        # set the new 'info' attribute to the value passed
        obj.info = info
        # Finally, we must return the newly created object:
        return obj

ただし、機能しません。オブジェクトのみを取得しIndexます:

In [2]: I = InfoIndex((3,))

In [3]: I
Out[3]: Int64Index([3])

私は何を間違っていますか?

4

3 に答える 3

3

このメソッドを実装する__array_finalize__と、多くの操作でメタデータが確実に保持されるようになります。一部のインデックス メソッドでは、サブクラスで実装を提供する必要があります。もう少しヘルプが必要な場合は、http://docs.scipy.org/doc/numpy/user/basics.subclassing.htmlを参照してください。

于 2012-10-20T16:17:24.230 に答える
3

インデックス コンストラクターは、入力が特殊な場合 (すべての int または datetime など) に賢くしようとし、最後にビューへの呼び出しをスキップします。したがって、それを明示的に入れる必要があります。

In [150]: class InfoIndex(pd.Index):
   .....:     def __new__(cls, data, info=None):
   .....:         obj = pd.Index.__new__(cls, data)
   .....:         obj.info = info
   .....:         obj = obj.view(cls)
   .....:         return obj
   .....:     

In [151]: I = InfoIndex((3,))

In [152]: I
Out[152]: InfoIndex([3])

emptor の警告: サブクラスではなく、多くのメソッドが明示的に Index を返すため、pandas オブジェクトのサブクラス化には注意してください。また、Index のサブクラスには、注意しないと失われる機能もあります。

于 2012-10-17T17:55:54.570 に答える