2017-02-21 28 views
1

Я все еще изучаю различные применения методов класса. У меня есть код, который выполняет линейную регрессию. Поэтому я решил создать общий класс под названием LinRegression и использовать более конкретные методы, которые вызывают класс, основанный на типе линейной регрессии (например, для регрессии используется один трейлинг-день или 5 трейлинг-дней и т. Д.).Каков правильный способ вызова и использования этого класса? Также есть TypeError: missing 1 required positional argument: 'self'

В любом случае, вот оно. Я чувствую, что я делаю что-то неправильно здесь в отношении того, как я определил класс и вызываю класс. Это из файла 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() должен просто выполнить one_day_trailing def, используя self, определенную в init.

Однако, я получаю TypeError: one_day_trailing() отсутствует 1 обязательный позиционный аргумент: 'self'. Некоторая другая информация, переменная, daily_vol_result - это DataFrame, и я конвертирую в np-массив, чтобы выполнить линейную регрессию с помощью sklearn.

Кроме того, когда я пытался испортить код для работы, у меня была дополнительная проблема, когда строка: lr.fit (x, y) дала мне ошибку типа без позиционного arg для y. Я проверил существование и длину y, чтобы убедиться, что он соответствует x и он проверяет. Я довольно смущен тем, как я проходил только один арг.

Ваши идеи и советы приветствуются, спасибо!

ответ

1

я выяснил, что регрессия пакет линейный действует как класс и так lr.fit (сам, x, y) было то, что он хотел в качестве ввода.Я первый экземпляр класса как:

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

Я имел эту строку в моем главном файле:

ASDF = LinRegression.one_day_trailing(daily_vol_result) 

я разобрался более общий способ получения этих функций. Я не нуждался в использовании @classmethod или @staticmethod

1

Дело в том, что вы используете неправильное положение для self способом one_day_trailing(cls, self). Вы указали self на второй позиции в определении метода.

Если что-то и выполняет метод просто, как вы делали во 2-й строке кода не прошло:

lin_reg.one_day_trailing() 

объект класса self будет передан в качестве первого аргумента, так self передается в cls аргумента. И поэтому аргумент self в one_day_trailing() остается неиспользованным.

Interchange аргументы в опр, как это: -

def one_day_trailing(self, cls): 

будет лучше. Но тогда вам нужно передать объект cls, что бы это ни было.

Смотрите следующие вопросы, чтобы узнать больше:

 Смежные вопросы

  • Нет связанных вопросов^_^