Pandas DataFrame 对象继承还是对象使用?
我正在建立一个库,用来处理一些特定结构的数据,并且我的基础设施是基于Pandas的。目前,我正在为不同的使用场景编写各种数据容器,比如CTMatrix,用于存储国家和时间的数据,以便为所有国家和时间结构的数据提供合适的方法。
我现在在考虑两种选择:
选项1:对象继承
class CTMatrix(pd.DataFrame):
methods etc. here
或者 选项2:对象使用
class CTMatrix(object):
_data = pd.DataFrame
then use getter, setter methods to control access to _data etc.
从软件工程的角度来看,这里有没有明显的选择?
到目前为止,我的想法是:
选项1:
- 可以直接在CTMatrix类上使用DataFrame的方法(比如
CTmatrix.sort()
),而不需要通过选项2中的封装对象_data
来支持这些方法。 - Pandas中的更新和新方法会被继承,除了那些可能会被本地类方法覆盖的方法。
但是
- 一些方法会比较复杂,比如
__init__()
,需要把属性传递给父类super(MyDF, self).__init__(*args, **kw)
。
选项2:
- 对类及其行为有更多的控制。
- 可能对Pandas的更新更具韧性?
但是
- 需要使用getter()或者非隐藏属性来像使用DataFrame那样使用对象,比如 (
CTMatrix.data.sort()
)。
选择选项1还有其他缺点吗?
2 个回答
1
因为遇到了一些类似的问题,还有Matti John的回答,我为我的一个项目写了一个 _pandas_wrapper
类,因为我也想从pandas的DataFrame继承。
这个类的唯一目的是提供一个看起来像pandas DataFrame的东西,但它是安全的,可以被继承。
如果你的项目是LGPL许可证的,你可以毫无问题地重复使用它。
5
我建议不要去继承 DataFrame
,因为很多 DataFrame
的方法会返回一个新的 DataFrame
,而不是你自己定义的 CTMatrix
对象。
在GitHub上有一些相关的问题,比如:
更一般来说,这涉及到组合和继承的问题。我特别要提醒你注意第二个好处。现在看起来可能很不错,但如果你不时刻关注Pandas的更新(而且它更新得很快),你可能会遇到意想不到的问题,导致你的代码和Pandas紧密纠缠在一起。