【问题标题】:building class that inherits pandas DataFrame继承 pandas DataFrame 的构建类
【发布时间】:2015-04-05 15:57:37
【问题描述】:

我正在尝试为我正在处理的一些自定义数据编写一个继承 pandas 的 DataFrame 类的类。

class EquityDataFrame(DataFrame):
    def __init__(self, *args, **kwargs):
        DataFrame.__init__(self, *args, **kwargs)

    def myfunc1(self,...)
        ... # does something

    def myfunc2(self, ...)
        ... # does something

在 PyCharm 中,我收到以下关于类名称 EquityDataFrame 的警告:

Class EquityDataFrame must implement all abstract methods 

This inspection detects when there aren't all abstract properties/methods defined in the subclass

我尝试使用谷歌搜索,但找不到有关此警告的有用描述。有人能帮我看看这个警告是什么意思吗?

【问题讨论】:

  • 将有助于检查此错误是否特定于 pycharm,或者如果您尝试独立运行程序是否还会遇到一些相关错误
  • 无法在 Python 2 或 Python 3 下复制此问题。也许您的代码的其他部分会触发该问题,但不仅仅是 DataFrame 的这种简单的子类化。
  • 是的,我在 SO 上发现了更多关于子类化 DataFrame 的帖子。可能是因为这个
  • @uday,您找到发生这种情况的原因了吗?我在 python 2.7 中的继承类中也有同样的警告,但我没有找到如何使它正确。
  • @SecerH.,不,我没有。但我最终编写了自己的 DataFrame 类,它有一个 Pandas DataFrame 作为一个字段,然后在新类中,我重写了很多 Pandas 功能,以将其自定义为类似于 R 的工作方式(并使其在一些地区)。这样我的类可以被继承,我什至编写了一些继承这个类的子类,并根据需要具有额外的自定义功能。花了我好一阵子。如果你想做同样的事情,你可以编写自己的__getitem____setitem____dir____getattr__ 方法等。

标签: python-3.x pandas


【解决方案1】:

找了6年,pylint给了我答案:
[W0223(abstract-method), CustomDataFrame] Method '_constructor_expanddim' is abstract in class 'DataFrame' but is not overridden

确实在实施

@property
def _constructor_expanddim(self) -> Type["CustomDataFrame"]:
    raise NotImplementedError("Not supported for CustomDataFrames!")

使警告消失。

【讨论】:

    【解决方案2】:

    试试下面的方法

    import pandas as pd
    
    class MyDataframe(pd.DataFrame):
    
    def __init__(self, *args, **kwargs):
        super(MyDataframe, self).__init__(*args, **kwargs)
    
    @property
    def function_1(self, x):
    
    
    @property
    def function_2(self):
    

    【讨论】:

      【解决方案3】:

      创建一个可链接的类似于 pandas Dataframe 的类

      from pandas import DataFrame
      
      class PrepPandas(DataFrame):
        """Class that inherits from pandas.DataFrame then customizes it with additonal methods."""
        def __init__(self, *args, **kwargs):
          super().__init__(*args, **kwargs)
      
        @property
        def _constructor(self):
            """
            Creates a self object that is basically a pandas.Dataframe.
            self is a dataframe-like object inherited from pandas.DataFrame
            self behaves like a dataframe + new custom attributes and methods.
            """
            return PrepPandas
      
        def mult2(self):
          """
          Method to demo chanining multiple function calls. Ex: pdf.mult2().mult2()
          
          Example:
            pdf = PrepPandas({'a': [1,2,3], 'b':[4,5,6]})
            print(pdf, pdf.mult2(),  pdf.mult2().mult2(), pdf.__class__, pdf.mult2().__class__)
          """
          return self * 2
      

      使用示例

      pdf = PrepPandas({'a': [1,2,3], 'b':[4,5,6]})  # Creates a pandas df.
      pdf, pdf.mult2(),  pdf.mult2().mult2(), pdf.__class__, pdf.mult2().__class__   #  Adds a cutom mult2 function to the pdf.
      

      输出:

      Out[5]: 
       (   
          a  b
       0  1  4
       1  2  5
       2  3  6,
          a   b
       0  2   8
       1  4  10
       2  6  12,
           a   b
       0   4  16
       1   8  20
       2  12  24,
       __main__.PrepPandas,
       __main__.PrepPandas
       )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-23
        • 2014-08-09
        • 1970-01-01
        • 2014-08-21
        • 2023-02-09
        • 1970-01-01
        • 2014-02-08
        • 2023-04-08
        相关资源
        最近更新 更多