警告:
- DataFrameには多くの属性があります。属性が数値の場合、
DataFrame
おそらくその数値を返したいだけです。ただし、DataFrame
属性がである場合はDataFrame
、おそらくを返しますContainer
。DataFrame
属性がSeries
または記述子である場合はどうすればよいですか?適切に実装するには、属性ごとにContainer.__getattr__
単体テストを作成する必要があります。
- ユニットテストも必要です
__getitem__
。
- また、テスト
__setattr__
と__setitem__
、、、などを定義して単体テストする必要があります。__iter__
__len__
- ピクルスはシリアル化の一形態であるため、ピクルス化できる場合、sが実際にシリアル化
DataFrames
にどのように役立つかはわかりませんContainer
。
いくつかのコメント:
__getattr__
属性がにない場合にのみ呼び出されself.__dict__
ます。if item in self.__dict__
だからあなたはあなたの中に必要はありません__getattr__
。
self.contained.__getattr__(item)
self.contained
の
__getattr__
メソッドを直接呼び出します。これは、Python属性ルックアップメカニズム全体を回避するため、通常は実行したいことではありません。たとえば、属性が記述子を参照している場合、またはself.contained.__dict__
の__dict__
ベースの1つにある可能性を無視します。代わりに。を使用してください。self.contained.__class__
item
getattr(self.contained, item)
import pandas
import numpy as np
def tocontainer(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return Container(result)
return wrapper
class Container(object):
def __init__(self, df):
self.contained = df
def __getitem__(self, item):
result = self.contained[item]
if isinstance(result, type(self.contained)):
result = Container(result)
return result
def __getattr__(self, item):
result = getattr(self.contained, item)
if callable(result):
result = tocontainer(result)
return result
def __repr__(self):
return repr(self.contained)
これは、少なくとも表面的にはsに適切にContainer
委任され、次DataFrame
を返すかどうかをテストするためのランダムなコードContainers
です。
df = pandas.DataFrame(
[(1, 2), (1, 3), (1, 4), (2, 1),(2,2,)], columns=['col1', 'col2'])
df = Container(df)
df['col1'][3] = 0
print(df)
# col1 col2
# 0 1 2
# 1 1 3
# 2 1 4
# 3 2 1
# 4 2 2
gp = df.groupby('col1').aggregate(np.count_nonzero)
print(gp)
# col2
# col1
# 1 3
# 2 2
print(type(gp))
# <class '__main__.Container'>
print(type(gp[gp.col2 > 2]))
# <class '__main__.Container'>
tf = gp[gp.col2 > 2].reset_index()
print(type(tf))
# <class '__main__.Container'>
result = df[df.col1 == tf.col1]
print(type(result))
# <class '__main__.Container'>