インタープリターに直接入力すると機能するが、呼び出されると失敗するコードをいくつか書きました。
ここにいくつかのコードがあります(再現可能にするためにここにたくさんあります):
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 に変更されたことです。私は以前にそれを試しましたが、うまくいきませんでした。なぜそうなったのかよくわかりません。
助けてくれてありがとう!そして、なぜこの変更がその特定のエラーメッセージを取り除いたのかを誰かが指摘できれば、それは大歓迎です. ただ進んでそれを受け入れるのではなく、自分が何をしていたのかを実際に知りたい.