2015-01-20 84 views
3

我已经设置了一个小函数,它接受一个pandas DataFrame和几个参数,然后尝试使用statsmodels创建一个OLS回归。它旨在让我从循环中调用它,用一些简单的代码运行许多不同的回归。不幸的是,它不起作用,我希望得到一些指导,说明我需要做些什么才能使它工作。这里的功能:通过字符串变量访问熊猫DataFrame的列

def regressReturns(rawData, predictor, horizon): x = rawData.eval(predictor) x = sm.add_constant(x) y = rawData.eval(str(horizon) + '_Yr_Return') results = sm.OLS(y,x).fit() return results.params

我得到比语法错误没有什么其他的,如果我把它从一个循环:

for rh in retunHorizons: regressReturns(rawData,'Earnings_Yield', rh)

我在做什么错?另外,我是一个熊猫新手,所以一个例子和一个解释将不胜感激。

在此先感谢您的帮助。

托马斯飞利浦

+1

有什么语法错误? – Amit 2015-01-20 22:58:03

回答

1

我假设RAWDATA是你的数据框,而且你有你的evals什么是您试图访问的列的名称。如果是这样的话,以下将起作用:

x = rawData[predictor] 
y = rawData[str(horizon) + '_Yr_Return'] 

列可以作为属性和像字典访问。第一种方法更简洁一些,但如果要将变量用作列名称,第二种方法更加灵活。

+0

事实上他们是,而你的建议起作用。非常感谢你!我现在得到了一些回归的消息,说该数组不能包含NaN上的infs。我知道NaN在开始时(因为我没有关于预测变量的数据)或最后(因为相关的时间段没有发生(例如2013年开始的10年前向回报)。我该如何切割在预测变量和响应的相关部分,以便他们都有数据? – 2015-01-20 23:21:26

+0

@ThomasPhilips关于nans:你可以像elyase的例子那样使用pandas'dropna'方法,或者使用'missing ='drop'参数作为statsmodels OLS模型在elyase的示例中,如果在回归中没有使用nans的其他变量/列,即使在x和y列中没有nans,也会删除行。 – user333700 2015-01-21 04:39:13

0

您可以直接大熊猫做OLS:

from pandas.stats.api import ols 

def regressReturns(rawData, predictor, horizon): 
    rawData.dropna(inplace=True) 
    results = ols(y=rawData[str(horizon) + '_Yr_Return'] , 
        x=rawData[predictor]) 
    return res.sm_ols.params 
+0

[使用时要小心熊猫提供的回归](http://stackoverflow.com/questions/17708643/unexpected-standard-errors-with-weighted-least-squares-in-python-pandas)。它通常是自制的总结计算的奇怪混合物并直接报告来自'statsmodel的中间结果s'。标准误差计算的自由度等问题可能会导致结果不匹配,或者结果似乎不可重现,除非您知道存在诸如自由度之类的所有隐藏状态。总是使用其他库的回归代码是一个令人信服的理由。 – ely 2015-01-21 00:36:26

+0

点好了。统计算法很难编码,因为它们在非常广泛(和不可控制的)输入范围内对稳定性,精度和速度的要求相互冲突。在实践中更好地实现通过经过时间检验的实现来完成统计繁重的工作,这通常在专门的统计软件包中找到。 Python自己的统计模块是朝着正确方向迈出的一步,尽管目前几乎没有任何功能。 – 2015-01-21 02:57:07

+0

@ThomasPhilips,pandas使用'statsmodels'(如果已安装),否则'scikit learn'只是调用相同函数的更直接方式。 – elyase 2015-01-21 03:08:01