我想扩展dask.dataframe Dataframe对象并添加新的属性/方法,而无需重写大多数预先存在的Dask函数。
例如,如果我有一个课程:
from dask.dataframe import DataFrame
class MyExtendedDataframe(DataFrame):
def __init__(self, df):
super(DataFrame, self).__init__(df.dask, df._name, df._meta, df.divisions)
self.myAttribute = "Dog"
def myMethod(self):
return self.dropna()
我可以创建此对象的实例(下),该实例具有Dask DataFrame对象的所有属性。
df = dd.read_csv('mydata.csv')
mydf = MyExtendedDataframe(df)
print(type(mydf))
此打印:“ MyExtendedDataframe”
然后我可以在MyExtendedDataframe
对象上调用Pandas链接函数。
mydf = mydf['field1', 'field2']]
print(type(mydf))
以上显示:dask.dataframe.core.DataFrame
,显然属性MyAttribute
和方法MyMethod
不是结果实例的成员。
换句话说,我希望新类具有dask.dataframe.core.DataFrame
类的所有属性,但是当我调用属于dask.dataframe.core.DataFrame
的方法时,我希望它返回{{1 }}完成给定的操作。例如:
MyExtendedDataframe
应打印“ MyExtendedDataframe”和
mydf = mydf[['field1', 'field2']]
print(type(mydf))
索引操作后应打印“ Dog”。
我知道我可以为所有默认的Dask方法创建一个包装方法,该方法将重构并返回类的实例。但这似乎很麻烦,并且如果Dask发生更改,将需要我更新模块。有没有更简单的方法来实现此行为?
另一种可能的解决方案是使我的print(mydf.myAttribute)
对象成为我的自定义类的属性,但是这种接缝显得笨拙,而且要访问和设置数据框,我将不得不不断使用类似的东西:
dask.dataframe.core.DataFrame