【问题标题】:Python class can't find memberPython类找不到成员
【发布时间】:2019-09-03 06:17:29
【问题描述】:

我尝试将 pandas 数据帧的一些基本预处理操作放到一个单独的类中:

import pandas as pd
import numpy as np
from numba import jit

class MyClass:
    def _init_(self):
        pass

    @jit

    def preprocess_dataframe(self, path):
        self.df = pd.read_csv(path, index_col=False, delimiter=' ' , names=['Time', 'Downloads', 'ServerID', 'Server', 'Date'], usecols=['Time', 'Downloads', 'Server', 'Date'])

        print(self.df.head(5))
        self.df['Date'] = self.df['Date'].astype(str)
        self.df['Timestamp'] = pd.to_datetime(self.df['Time'] +' '+ self.df['Date'], format='%H:%M:%S %Y%m%d')
        self.df[['Server_alone', 'Instance']] = self.df['Server'].str.split('-' ,expand=True)

        self.df.drop(columns=['Time'], inplace=True)

        self.df['Date'] = pd.to_datetime(self.df['Date'], format='%Y-%m-%d')

        self.df.set_index(self.df['Date'])

        return self.df

当我在主脚本中调用此函数时(见下文),我收到错误:

AttributeError: module 'MyClass' has no attribute 'preprocess_dataframe'

这是我的主脚本的相关部分:

import MyClass as mc

path = 'Data.txt'

df = mc.preprocess_dataframe(path)

>>>AttributeError: module 'MyClass' has no attribute 'preprocess_dataframe'

我查了其他几个问题,包括this。然而,尽管我认为修复很容易,但没有任何解决我的问题。感谢您的帮助!

【问题讨论】:

  • 我认为你应该这样做obj = mc.MyClass()
  • 你需要一个类的实例来调用它的方法或使方法静态
  • @Sparky05 如何让它成为静态的?
  • 我收到错误'module' object is not callable @SamMason

标签: python pandas function class dataframe


【解决方案1】:

您尚未创建MyClass 的实例。 您可以通过以下方式纠正它:

df = mc().preprocess_dataframe(path)

还将导入语句更改为:from filename import MyClass as mc

您还可以将 preprocess_dataframe 设为 cmets 中提到的静态方法。

【讨论】:

  • 我收到错误'module' object is not callable
  • 我预料到了这个错误。您还将导入语句更改为:` from MyClassfilename import MyClass as mc`
  • 我想我们已经接近了,现在我在调用函数TypeError: preprocess_dataframe() missing 1 required positional argument: 'path' 时收到此错误。它必须连接到方法定义。我也必须为自己提供一些东西吗?
  • 您是否按照答案中的建议添加了 mc().preprocess_dataframe(path) ?强调mc()
  • 是的,我包含了它
【解决方案2】:

你应该将方法设为静态

import pandas as pd
import numpy as np
from numba import jit

class MyClass:
    @jit
    @staticmethod
    def preprocess_dataframe(path):
        df = pd.read_csv(path, index_col=False, delimiter=' ' , names=['Time', 'Downloads', 'ServerID', 'Server', 'Date'], usecols=['Time', 'Downloads', 'Server', 'Date'])

        print(self.df.head(5))
        df['Date'] = df['Date'].astype(str)
        df['Timestamp'] = pd.to_datetime(df['Time'] +' '+ df['Date'], format='%H:%M:%S %Y%m%d')
        df[['Server_alone', 'Instance']] = df['Server'].str.split('-' ,expand=True)

        df.drop(columns=['Time'], inplace=True)

        sdf['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')

        df.set_index(df['Date'])

        return df

并按以下方式调用它

from filename import MyClass

path = 'Data.txt'

df = MyClass.preprocess_dataframe(path)

【讨论】:

  • 这个答案可能非常接近。但是,我现在收到此错误:TypeError: preprocess_dataframe() missing 1 required positional argument: 'path' 也许它与之前将(self, path 作为参数有关?
  • 您必须删除 self 参数。我也改变了方法。 (删除所有对自我的引用)
  • 现在完美运行。我在我的代码中以不同的方式命名 MyClass。这是一个示例代码。无法在复制粘贴时正确替换所有内容。非常感谢!
  • 如果你不想在这个类中捆绑多个函数,你不需要这个类,可以简单地定义和调用函数
  • 因为我在我的类中定义了多个其他函数,所以我会将它保留在这个结构中。但是感谢您的输入,这可能与其他有相同问题的用户相关。 :)
猜你喜欢
  • 2014-08-28
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2012-09-23
  • 2011-11-03
  • 1970-01-01
  • 2015-10-08
相关资源
最近更新 更多