2015-01-20 38 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