2017-02-21 2 views
1

私はまだクラスメソッドのさまざまな使い方を学んでいます。私は線形回帰を実行するいくつかのコードを持っています。だから私はLinRegressionと呼ばれる一般的なクラスを作り、線形回帰のタイプに基づいてクラスを呼び出すより具体的なメソッドを使用することにしました(つまり、1つの末尾の日を使用するか、回帰の5日後などを使用します)。このクラスを呼び出して使用する正しい方法は何ですか? TypeError:欠落している1つの位置引数: 'self'

とにかく、ここに行きます。私はクラスをどのように定義し、そのクラスをコールしているかに関して、ここで何か間違っているように感じる。 これはmain.pyファイルからである:私は私がやっている「と思う」とは何ですか

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 = LinRegression(daily_vol_result) 
lin_reg.one_day_trailing() 

そして、これはlinear_regressionファイル(一日だけ末尾の場合を示す)からですlin_regを呼び出すと、私はすでにdaily_vol_resultが渡されています。そして、lin_reg.one_day_trailing()はで定義された自己を使ってone_day_trailingのdefを実行します。

しかし、私はTypeError:one_day_trailing()に1つの必須位置引数 'self'があります。その他の情報、変数、daily_vol_resultはDataFrameで、np配列に変換してsklearnで線形回帰を行います。

また、私はコードをうまく動作させようとしたときに、lr.fit(x、y)という行がyの位置引数なしでタイプエラーを出したという追加の問題がありました。 yの存在と長さを調べて、xと一致するかどうかを調べ、チェックします。どのように私が1つの引数を渡すだけだったかについてはかなり混乱しています。

あなたのアイデアやアドバイスは、ありがとうございます!

答えて

1

私は、自己(線形回帰パッケージには、クラスのように振る舞っのでlr.fitたことが判明x、y)は入力として必要なものでした。私はまた、これらの機能を生成するために、より一般的な方法を考え出し

ASDF = LinRegression.one_day_trailing(daily_vol_result) 

:私は私のメインのファイルに次の行を持っていた

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

:私は、最初のように、クラスをインスタンス化。 @classmethodまたは@staticmethodを使用する必要がなくなりました

1

one_day_trailing(cls, self)では、selfに間違った位置が使用されています。メソッド定義の2番目にselfを指定しました。

あなたは、コードの2行目に行った単に何かを渡され、メソッドを実行していない場合:

lin_reg.one_day_trailing() 

クラスオブジェクトselfは、最初の引数として渡されますので、selfcls引数に渡されます。したがって、one_day_trailing()self引数は未使用のままです。このようなデフで

インターチェンジの引数は: -

def one_day_trailing(self, cls): 

良くなります。しかし、それが何であれ、clsオブジェクトを渡す必要があります。

詳細を知るために以下の質問を参照してください:

関連する問題