warningsを無視して、pandas DataFrameをサブクラス化しようとしています。その理由は次のとおりです。DataFrameのサブクラス化が元のオブジェクトを突然変異させるのはなぜですか?
- 既存のすべてのメソッド
DataFrame
を保持したいと思います。 - クラスのインスタンス化でいくつかの追加の属性を設定したいが、これは後でサブクラスで呼び出すことができる追加のメソッドを定義するために使用されます。ここで
は抜粋です:ここでは
class SubFrame(pd.DataFrame):
def __init__(self, *args, **kwargs):
freq = kwargs.pop('freq', None)
ddof = kwargs.pop('ddof', None)
super(SubFrame, self).__init__(*args, **kwargs)
self.freq = freq
self.ddof = ddof
self.index.freq = pd.tseries.frequencies.to_offset(self.freq)
@property
def _constructor(self):
return SubFrame
は使用例です。
sf = SubFrame(df, freq='M')
print(sf.index)
DatetimeIndex(['2014-07-31', '2014-08-31', '2014-09-30', '2014-10-31',
'2014-11-30'],
dtype='datetime64[ns]', freq='M')
問題は、この修正である:私は私が1つのステップで、その周波数を指定することができますインデックスはSubFrame
を使用して何の周波数
print(df.index)
DatetimeIndex(['2014-07-31', '2014-08-31', '2014-09-30', '2014-10-31',
'2014-11-30'],
dtype='datetime64[ns]', freq=None)
を持っていないDataFrame
print(df)
col0 col1 col2
2014-07-31 0.28393 1.84587 -1.37899
2014-08-31 5.71914 2.19755 3.97959
2014-09-30 -3.16015 -7.47063 -1.40869
2014-10-31 5.08850 1.14998 2.43273
2014-11-30 1.89474 -1.08953 2.67830
を持っていると言いますdf
:
print(df.index.freq)
<MonthEnd>
ここでは何が起こっているのですか?これを避けるにはどうすればよいですか?
また、私はよく、すべてのことを理解していないcopiedコードを使用すると公言します。上記の__init__
内で何が起こっていますか?ここでpop
とargs/kwargsを使用する必要がありますか? (なぜ私はいつものようのparamsを指定することはできません?)
サブクラスの典型的なユースケースは、修正することです/何らかの方法で基本クラスの機能を拡張します。あなたは本当にここでそれをやっていません。 DataFrameを特定の方法で設定するだけです。サブクラス化するのではなく、必要な方法で構築されたDataFrameを返すだけのファクトリタイプの関数/オブジェクトを作成することができます。サブクラス化は、この特定のユースケースに対して多くの意味を持たないようです。 – clockwatcher
"あなたが望む方法で構築されたDataFrameを単に返すファクトリタイプの関数/オブジェクトを作成します。あなたはそれを詳述できますか?今私が持っているのは、データフレームが属性である標準の 'Class(オブジェクト)'です。そして、はい、ここには示されていない、他にもいくつかの方法を定義して機能を拡張しています。 –
パイプでpiRSquaredの2番目の提案を見てください。彼はサブクラス化していないことに注意してください。 DataFrameをセットアップする方法で単にDataFrameを返す関数を作成しています。サブクラス化する必要はありません。あなたは行動を変えていません。ファクトリクラスの使い方の1つは、必要な方法で設定されたオブジェクトを作成することです。新しいDataFrameを最初のコピーに基づいて作成する場合は、既存のDataFrameをパラメータとして使用してコピーし、頻度を追加してからコピーを作成する関数を作成します。サブクラスはありません。 – clockwatcher