Whats the correct way to call and use this class? Also have TypeError: missing 1 required positional argument: 'self'
Whats the correct way to call and use this class? Also have TypeError: missing 1 required positional argument: 'self'
我仍在学习 class 方法的各种用途。我有一些执行线性回归的代码。所以我决定制作一个通用的 class 称为 LinRegression 并使用更具体的方法调用 class 基于线性回归的类型(即使用一个尾随日或 5 个尾随日等进行回归) .
无论如何,就这样吧。我觉得我在定义 class 和调用 class 方面做错了什么。
这是来自 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
我 "think" 我正在做的是当我调用 lin_reg 时,我已经通过了 daily_vol_result,然后 lin_reg.one_day_trailing() 应该只执行 one_day_trailing def 使用 init.
中的自定义
但是,我得到 TypeError: one_day_trailing() missing 1 required positional argument: 'self'。其他一些信息,变量 daily_vol_result 是一个 DataFrame,我将其转换为 np 数组以使用 sklearn 进行线性回归。
此外,当我尝试修改代码工作时,我遇到了一个额外的问题,其中行:lr.fit(x, y) 给我一个类型错误,没有 y 的位置参数。我检查了 y 的存在和长度,看它是否与 x 匹配,然后检查出来。我很困惑我是如何只传递一个参数的。
欢迎您提出意见和建议,谢谢!
问题是,您在方法 one_day_trailing(cls, self)
中为 self
使用了错误的位置。您在方法定义的第二个位置指定了 self
。
如果没有传递任何东西并像在第二行代码中那样简单地执行该方法:
lin_reg.one_day_trailing()
class 对象 self
将作为第一个参数传递,因此 self
在 cls
参数中传递。因此,one_day_trailing()
中的 self
参数仍未使用。
像这样交换 def 中的参数:-
def one_day_trailing(self, cls):
会更好。但是你需要传递 cls
对象,不管它是什么。
查看以下问题了解更多:
- missing 1 required positional argument:'self'
- TypeError: attack() missing 1 required positional argument: 'self'
我发现线性回归包的行为类似于 class,因此 lr.fit(self, x, y) 是它想要的输入。我首先将 class 实例化为:
A = lr(), then A.fit(x,y).
我的主文件中有这一行:
ASDF = LinRegression.one_day_trailing(daily_vol_result)
我还想出了一个更通用的方法来生成这些函数。我最终不需要使用@class方法或@staticmethod
我仍在学习 class 方法的各种用途。我有一些执行线性回归的代码。所以我决定制作一个通用的 class 称为 LinRegression 并使用更具体的方法调用 class 基于线性回归的类型(即使用一个尾随日或 5 个尾随日等进行回归) .
无论如何,就这样吧。我觉得我在定义 class 和调用 class 方面做错了什么。 这是来自 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
我 "think" 我正在做的是当我调用 lin_reg 时,我已经通过了 daily_vol_result,然后 lin_reg.one_day_trailing() 应该只执行 one_day_trailing def 使用 init.
中的自定义但是,我得到 TypeError: one_day_trailing() missing 1 required positional argument: 'self'。其他一些信息,变量 daily_vol_result 是一个 DataFrame,我将其转换为 np 数组以使用 sklearn 进行线性回归。
此外,当我尝试修改代码工作时,我遇到了一个额外的问题,其中行:lr.fit(x, y) 给我一个类型错误,没有 y 的位置参数。我检查了 y 的存在和长度,看它是否与 x 匹配,然后检查出来。我很困惑我是如何只传递一个参数的。
欢迎您提出意见和建议,谢谢!
问题是,您在方法 one_day_trailing(cls, self)
中为 self
使用了错误的位置。您在方法定义的第二个位置指定了 self
。
如果没有传递任何东西并像在第二行代码中那样简单地执行该方法:
lin_reg.one_day_trailing()
class 对象 self
将作为第一个参数传递,因此 self
在 cls
参数中传递。因此,one_day_trailing()
中的 self
参数仍未使用。
像这样交换 def 中的参数:-
def one_day_trailing(self, cls):
会更好。但是你需要传递 cls
对象,不管它是什么。
查看以下问题了解更多:
- missing 1 required positional argument:'self'
- TypeError: attack() missing 1 required positional argument: 'self'
我发现线性回归包的行为类似于 class,因此 lr.fit(self, x, y) 是它想要的输入。我首先将 class 实例化为:
A = lr(), then A.fit(x,y).
我的主文件中有这一行:
ASDF = LinRegression.one_day_trailing(daily_vol_result)
我还想出了一个更通用的方法来生成这些函数。我最终不需要使用@class方法或@staticmethod