python - Pandas DataFrame 对象继承还是对象使用?

标签 python oop inheritance pandas

我正在构建一个用于处理非常具体的结构化数据的库,并且我正在 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:
  • 可以直接在 CTMatrix 类(如 CTmatrix.sort())上使用 DataFrame 方法,而不必通过封装的 _data 上的方法支持它们选项 #2 中的对象
  • Pandas 中的 Update 和 New 方法是继承的,除了可能被本地类方法覆盖的方法


  • 一些方法的并发症,例如 __init__()并且必须将属性传递给父类(super class) super(MyDF, self).__init__(*args, **kw)

  • 选项 2:
  • 更好地控制类及其行为
  • 可能对 Pandas 的更新更有弹性?


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

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

    最佳答案

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

    GitHub 上有一些围绕此问题的未解决问题,例如:

  • https://github.com/pydata/pandas/issues/60
  • https://github.com/pydata/pandas/issues/2485

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

    关于python - Pandas DataFrame 对象继承还是对象使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32576094/

    相关文章:

    javascript - 获取/设置所有可用属性 (JS)

    JavaScript 继承

    c++ - 以基类为值的 std::map 中的继承

    vb.net - “PlotBackBrush”无法通过类 'IRectangleBrush' 在项目外部公开类型 'PlotSurface2D'

    python - 类型错误 : Can't convert 'int' object to str implicitly Python 3

    python - 使用 Gevents 异步生成函数

    python - 递归斐波那契 yield

    php - 类无需声明变量即可工作?

    java - 类中的静态方法与接口(interface)中的默认方法具有相同的签名

    python - 从列创建列表,保留重复项