这个类的正确调用和使用方法是什么?还有 TypeError:缺少 1 个必需的位置参数:'self'

问题描述 投票:0回答:2

我仍在学习类方法的各种用途。我有一些执行线性回归的代码。因此,我决定创建一个名为 LinRegression 的通用类,并使用更具体的方法来根据线性回归的类型调用该类(即使用 1 个跟踪日或 5 个跟踪日等进行回归)。

不管怎样,就这样吧。我觉得我在定义类和调用类的方式上做错了。 这是来自 main.py 文件:

lin_reg = LinRegression(daily_vol_result)
lin_reg.one_day_trailing()

这是来自 Linear_regression 文件(仅显示一天的尾随情况):

class LinRegression:
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.linear_model import LinearRegression as lr
    from sklearn.metrics import mean_squared_error as mse
    from SEplot import se_plot as SE

    def __init__(self, daily_vol_result):
        """
        :param daily_vol_result: result from def daily_vol_calc
        """
        import numpy as np
        data = np.asarray(daily_vol_result['Volatility_Daily'])
        self.data = data

    @classmethod
    def one_day_trailing(cls, self):
        """
        Compute one day trailing volatility
        :return: Mean Squared error, slope: b, and y-int: c
        """

        x = self.data[:-1]
        y = self.data[1:]
        x = x.reshape(len(x), 1)
        cls.lr.fit(x, y)
        b = cls.lr.coef_[0]
        c = cls.lr.intercept_
        y_fit1 = b * x + c
        MSE1 = cls.mse(y, y_fit1)
        print("MSE1 is " + str(MSE1))
        print("intercept is " + str(c))
        print("slope is " + str(b))

        cls.SE(y, y_fit1)

        return MSE1, b, c

我“认为”我正在做的是,当我调用 lin_reg 时,我已经传递了 daily_vol_result,然后 lin_reg.one_day_trailing() 应该使用 init 中的自我定义来执行 one_day_trailing def。

但是,我收到 TypeError: one_day_trailing() Missing 1 requiredpositional argument: 'self'。其他一些信息,变量 daily_vol_result 是一个 DataFrame,我转换为 np 数组以使用 sklearn 进行线性回归。

此外,当我尝试弄乱代码来工作时,我遇到了一个额外的问题,其中行: lr.fit(x, y) 给了我一个类型错误,没有 y 的位置参数。我检查了 y 的存在性和长度,看看它是否与 x 匹配,然后检查出来。我很困惑我是如何只传递一个参数的。

欢迎您的想法和建议,谢谢!

python pandas scikit-learn class-method positional-argument
2个回答
1
投票

问题是,您在方法

self
中使用了错误的
one_day_trailing(cls, self)
位置。您已在方法定义中的第二个位置指定了
self

如果没有传递任何内容并按照第二行代码执行该方法:

lin_reg.one_day_trailing()

类对象

self
将作为第一个参数传递,因此
self
cls
参数中传递。因此,
self
中的
one_day_trailing()
参数仍然未使用。

像这样交换 def 中的参数:-

def one_day_trailing(self, cls):

会更好。但接下来你需要传递

cls
对象,无论它是什么。

请参阅以下问题以了解更多信息:


1
投票

我发现线性回归包的行为就像一个类,因此 lr.fit(self, x, y) 就是它想要的输入。我首先将类实例化为:

A = lr(), then A.fit(x,y).

我的主文件中有这一行:

ASDF = LinRegression.one_day_trailing(daily_vol_result)

我还找到了一种更通用的方法来生成这些函数。我最终不需要使用@classmethod或@staticmethod

© www.soinside.com 2019 - 2024. All rights reserved.