0

インタープリターに直接入力すると機能するが、呼び出されると失敗するコードをいくつか書きました。

ここにいくつかのコードがあります(再現可能にするためにここにたくさんあります):

import scikits.statsmodels.api as sm
import pandas as pd
data = sm.datasets.longley.load()
df = pd.DataFrame(data.exog, columns=data.exog_name)
y = data.endog
df['intercept'] = 1.
olsresult = sm.OLS(y, df).fit()
olsresult2 = sm.OLS(y, df[['GNP', 'UNEMP', 'ARMED']]).fit()
olsresult3 = sm.OLS(y, df[['GNP', 'POP', 'ARMED', 'YEAR']]).fit()
models = [olsresult, olsresult2, olsresult3]

class generateTable(object):

    def __init__(self, output, models, center='True', parens='se', var_names=None):
        self.output = output
        self.models = models
        self.center = center
        self.parens = parens
        self.var_names = var_names

    def createModel(self):
        results = []
        for model in self.models:
            params = dict(model.params)
            bse = dict(model.bse)
            pvals = dict(model.pvalues)
            results.append(dict((k, [params[k], bse[k], pvals[k]]) for k in sorted(params.iterkeys())))

        tempModel = {}
        for key in results[0]:
            tempModel[key] = [results[0][key]]

        for model in results[1:len(results)]:
            for key in model:
                if key not in tempModel:
                    tempModel[key] = [['', '', '']]

        for i in range(1,len(results)):
            diff = set(tempModel) - set(results[i])
            for key in results[i]:
                tempModel[key].append(results[i][key])
            for key in diff:
                tempModel[key].append(['','',''])


        if self.var_names == None:
            self.inputModel = tempModel
        elif type(self.var_names) == list:
            replace = self.var_names
            newResults = []
            resultsList = sorted(tempModel.iteritems())
            for item in resultsList:
                newVar = list(item)
                newResults.append(newVar)
            for i in range(len(newResults)):
                newResults[i][0] = replace[i]
                self.inputModel = dict(newResults)

スクリプトを実行しようとすると、エラーが発生しますAttributeError: 'generateTable' object has no attribute 'model'。IPython は行を指摘しますbse = dict(model.bse)。繰り返しますが、これはインタラクティブに実行すると (つまり、チャンクごとに、クラスなしで) 動作しますが、ファイルをインポートして実行しようとすると、エラーが発生します。

編集:

1) どのように作成されていますか?

import project

a = project.generateTable('/path/to/test.tex', models, center='True', parens='se', var_names=None)
a.createModel()

2) トレースバック全体は次のとおりです。

In [26]: a.createModel()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/path/to/project/<ipython-input-26-6774b6d1804c> in <module>()
----> 1 a.createModel()

/path/to/project/project.py in createModel(self)
     39         for model in models:
     40             params = dict(model.params)
---> 41             bse = dict(model.bse)
     42             pvals = dict(model.pvalues)
     43             results.append(dict((k, [params[k], bse[k], pvals[k]]) for k in sorted(params.iterkeys())))

3) 変数名modelを別のものに変更してみます。

4) 構文エラーについて申し訳ありません。asmeurerさん、修正ありがとうございます。

編集2:

上記の 3 (var 名modelを別のものに変更) は機能しませんでした。

編集3:

それは今動作します。最新のコードは次のとおりです。

def __init__(self, output, models, center='True', parens='se', var_names=None):
    self.output = output
    self.models = models
    self.center = center
    self.parens = parens
    self.var_names = var_names

def createModel(self):
    results = []
    for test_model in self.models:
        params = dict(test_model.params)
        bse = dict(test_model.bse)
        pvals = dict(test_model.pvalues)
        results.append(dict((k, [params[k], bse.get(k), pvals.get(k)]) for k in sorted(params.iterkeys())))

唯一の違いは、for ループのモデルが test_model に変更されたことです。私は以前にそれを試しましたが、うまくいきませんでした。なぜそうなったのかよくわかりません。

助けてくれてありがとう!そして、なぜこの変更がその特定のエラーメッセージを取り除いたのかを誰かが指摘できれば、それは大歓迎です. ただ進んでそれを受け入れるのではなく、自分が何をしていたのかを実際に知りたい.

4

2 に答える 2

1

のようなエラーが表示された場合AttributeError: 'xxx' object has no attribute 'yyy'、それが意味することは 1 つだけです: タイプ のオブジェクトがありxxx、その属性にアクセスしようとしています.yyyが、そのオブジェクトにはその属性がありません。デバッグの最初のルール: エラーが真実を語っていると仮定します。

具体的に言えば、どこかで次のようなことをしています。

a = project.generateTable()
...
foo=a.model

あなたが投稿したコードを見るとmodel、 class の属性が定義されている場所がどこにもありませんgenerateTable。どこかに設定していると思いますか?そうではないか (そうであると思われます)、そうですが、最初にアクセスしようとした後のある時点で設定しています。

于 2012-08-16T23:09:19.513 に答える
-1

名前空間projectのメンバーとしてのグローバル スコープで定義した変数を参照する必要があります。projectコード内で呼び出す場所

import project

a = project.generateTable('/path/to/test.tex', models, center='True', parens='se', var_names=None)
a.createModel()

...変数modelsは何にもバインドされていません。これは null 値であり、オブジェクト属性は を呼び出すときにバインドされず_init_、Python で nullref に相当するものを取得します。それを使用するには、次のように記述する必要がありますproject.models。(または、一番上に書くこともできますfrom project import models。)

更新: 申し訳ありませんが、あなたの更新を見ると、エラー メッセージとコードの間に矛盾があるようです。エラー メッセージは、「self.models」ではなく「models」を繰り返し処理していたことを示しています。以前に変数名を変更しようとしたことがありましたが、うまくいきませんでした。「self.*」修飾子を省略したに違いありません。これにより、別の「モデル」変数を使用することになります。

于 2012-08-16T23:16:37.820 に答える