【问题标题】:Pandas DataFrame Object Inheritance or Object Use?Pandas DataFrame 对象继承还是对象使用?
【发布时间】:2014-08-21 16:31:03
【问题描述】:

我正在构建一个用于处理非常具体的结构化数据的库,并且我正在 Pandas 之上构建我的基础架构。目前,我正在为不同的用例编写一堆不同的数据容器,例如用于 Country x Time Data 的 CTMatrix 等,以容纳适用于所有 CountryxTime 结构化数据的方法。

我目前正在争论

选项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:

  1. 可以直接在 CTMatrix 类(如 CTmatrix.sort())上使用 DataFrame 方法,而无需通过选项 #2 中封装的 _data 对象上的方法来支持它们
  2. Pandas 中的更新和新方法是继承的,但可能被本地类方法覆盖的方法除外

但是

  1. 与 __init__() 等某些方法的复杂性以及必须将属性传递给超类 super(MyDF, self).__init__(*args, **kw)

选项 2:

  1. 对类及其行为的更多控制
  2. 可能对 Pandas 中的更新更具弹性?

但是

  1. 必须使用 getter() 或非隐藏属性才能像数据框一样使用对象,例如 (CTMatrix.data.sort())

采用选项 #1 中的方法是否还有其他缺点?

【问题讨论】:

标签: python oop inheritance pandas


【解决方案1】:

我会避免子类化DataFrame,因为许多DataFrame 方法将返回一个新的DataFrame,而不是您的CTMatrix 对象的另一个实例。

在 GitHub 上有一些未解决的问题,例如:

更一般地说,这是一个组合与继承的问题。我会特别警惕好处#2。现在看起来不错,但除非您密切关注 Pandas 的更新(而且它是一个快速移动的目标),否则您很容易会遇到意想不到的后果,并且您的代码最终会与 Pandas 交织在一起。

【讨论】:

    【解决方案2】:

    由于类似的问题和 Matti John 的回答,我为我的一个项目写了一个 _pandas_wrapper 类,因为我也想从 pandas Dataframe 继承。

    https://github.com/mcocdawc/chemcoord/blob/bdfc186f54926ef356d0b4830959c51bb92d5583/src/chemcoord/_generic_classes/_pandas_wrapper.py

    这个类的唯一目的是提供一个可以安全继承的 pandas DataFrame。

    如果您的项目获得 LGPL 许可,您可以毫无问题地重复使用它。

    【讨论】:

    • 链接已失效,请勿点击。
    • 很抱歉给您带来不便。它现在指向一个特定的快照而不是分支。
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2011-03-16
    • 2012-01-05
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多