2016-11-23 72 views
2

認可請看下面的例子:號作爲變量名不statsmodels.formula.api

import pandas as pd 
from pandas import DataFrame 
import statsmodels.formula.api as smf 
df = DataFrame({'a': [1,2,3], 'b': [2,3,4]}) 
df2 = DataFrame({'177sdays': [1,2,3], 'b': [2,3,4]}) 

然後 smf.ols('a ~ b', df) smf.ols('177sdays ~ b', df2)

而且第一工作和第二個沒有。唯一的區別似乎是變量名中存在數字字符。爲什麼是這樣?

+0

特別是它會生成錯誤無效語法! – user7147790

+0

...有效的python名稱不能以數字開頭。也許在引擎蓋下有一個statsmodels eval。嘗試用下劃線加前綴。 –

+0

'Q'可以「引用」任意變量名稱http://patsy.readthedocs.io/en/latest/builtins-reference.html#patsy.builtins.Q – user333700

回答

3

顯然,statsmodels使用名爲patsy的庫來解釋傳遞給ols的公式。從docs形式的快報:

y ~ a + a:b + np.log(x) 

將構造形式的懦夫對象:

ModelDesc([Term([EvalFactor("y")])], 
     [Term([]), 
     Term([EvalFactor("a")]), 
     Term([EvalFactor("a"), EvalFactor("b")]), 
     Term([EvalFactor("np.log(x)")])]) 

EvalFactor然後 「執行任意的Python代碼」。因此你的變量名必須是有效的Python identifiers.。即 大寫和小寫字母A到Z,下劃線_和第一個字符除外,數字0到9.

+0

謝謝!這很清楚。 – user7147790

+0

這是非常有幫助的。否則,這是一個帶有完全模糊錯誤信息的「疑難雜症」。謝謝! – Jeff