我仍在学习类方法的各种用途。我有一些执行线性回归的代码。因此,我决定制作一个称为Linrefression的通用类,并使用基于线性回归的类型来调用类的更具体的方法(即使用一个落后日或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,然后使用 init 中的自定义执行one_day_trailing def()。
但是,我得到typeError:one_day_trailing()缺少1所需的位置参数:'self'。其他一些信息,变量,daily_vol_result是一个dataFrame,我将其转换为NP数组以使用Sklearn进行线性回归。
另外,当我尝试将代码弄乱时,我还有一个其他问题,即行:lr.fit(x,y)给了我一个类型错误,而没有位置arg的y。我检查了y的存在和长度,以查看它是否与x匹配并检查。我对我只通过一个arg的方式感到非常困惑。
欢迎您的想法和建议,谢谢!
事实是,您在方法one_day_trailing(cls, self)
中使用了错误的self
位置。您已经在方法定义中的第二个位置指定了self
。
如果不传递任何内容并像在第二行代码中一样执行该方法:
lin_reg.one_day_trailing()
类对象self
将作为第一个参数传递,因此self
在cls
参数中传递。因此,one_day_trailing()
中的self
参数仍未使用。
以下def中的参数互换: -
def one_day_trailing(self, cls):
会更好。但是随后您需要通过cls
对象。
请参阅以下问题以了解更多信息:
- 缺少1所需的位置参数:'self'
- typeError:Attack()缺少1所需的位置参数:'self'
我发现线性回归软件包的作用就像一个类,因此lr.fit(self,x,y)是它想要的输入。我首先将课程实例化为:
A = lr(), then A.fit(x,y).
我的主文件中有这一行:
ASDF = LinRegression.one_day_trailing(daily_vol_result)
我还发现了一种更通用的产生这些功能的方法。我最终不需要使用@classmethod或@staticmethod