我编写了一些在直接输入解释器时有效的代码,但在调用时失败了。
这里有一些代码(这里有很多代码可以让它重现):
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)
。同样,当我以交互方式运行它时(即chunk by chunk,没有类),这可以工作,但是当我导入文件并尝试运行它时,我收到错误。
修改
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)我将尝试将var名称model
更改为其他内容。
4)抱歉语法错误。谢谢,asmeurer,修复。
编辑2:
上面的 3(将var名称model
更改为其他内容)不起作用。
现在有效。这是最新的代码:
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。我以前尝试过它并没有用,所以我不太确定它是如何发生的。
感谢大家的帮助!如果有人能够指出为什么这个变化摆脱了那个特定的错误信息,我将不胜感激。我想知道我在做什么,而不是继续前进并接受它。
答案 0 :(得分:1)
每当您看到AttributeError: 'xxx' object has no attribute 'yyy'
之类的错误时,这只能意味着一件事:您有一个xxx
类型的对象,并且您正在尝试访问属性.yyy
,但该对象不存在没有那个属性。调试的第一条规则:假设错误说实话。
用具体的术语来说,你正在做某些事情:
a = project.generateTable()
...
foo=a.model
当我查看您发布的代码时,我发现无法为类model
定义属性generateTable
。你觉得你把它放在某个地方吗?要么你不是(似乎是这种情况),要么就是你在第一次尝试访问它之后的某个时刻设置它。
答案 1 :(得分:-1)
您必须将project
的全局范围中定义的变量称为project
命名空间的成员。在代码中,您可以调用
import project
a = project.generateTable('/path/to/test.tex', models, center='True', parens='se', var_names=None)
a.createModel()
...变量models
没有绑定任何东西。它是一个空值,当您调用_init_
时,对象属性不会被绑定,并且您获得的Python等效于nullref。要使用它,您需要将其写为project.models
。 (或者你可以在顶部写上from project import models
。)
更新:抱歉,查看您的更新,看起来错误消息和代码之间存在差异。错误消息显示您正在迭代“模型”而不是“self.models”。你说你之前尝试过更改变量名称但它没有用;我打赌你遗漏了“自我。*”资格赛。这会导致您使用不同的“模型”变量。