簡體   English   中英

使用包含數字/空格的參數的ols函數

[英]Using ols function with parameters that contain numbers/spaces

我在使用statsmodels.formula.api函數時遇到了很多困難

       ols(formula,data).fit().rsquared_adj 

由於我的預測者名字的性質。 預測者有數字和空格等,顯然不喜歡。 我知道我需要使用像patsy.builtins.Q這樣的東西。所以我要說我的預測器是weight.in.kg,它應該按如下方式輸入:

Q("weight.in.kg")

所以我需要從列表中取出我的公式,並且使用這個patsy.builtin.Q修改列表中的每個項目都會遇到困難。

formula = "{} ~ {} + 1".format(response, ' + '.join([candidate])

[候選人]是我的預測者名單。

我最親愛的python專家的問題是,我是如何將列表[候選者]中的每個單獨項目放在以下表達式的引號中:

Q( '')

這樣ols功能實際上可以讀取它嗎? 抱歉,如果這是非常明顯的,我不擅長python。

現在你開始在你的公式中找到你想要的術語列表,然后嘗試將它們粘貼到一個復雜的字符串中,patsy將解析並轉換回術語列表。 您可以看到patsy為這種公式生成的數據結構( ModelDesc.from_formula是patsy的解析器):

In [7]: from patsy import ModelDesc

In [8]: ModelDesc.from_formula("y ~ x1 + x2 + x3")
Out[8]: 
ModelDesc(lhs_termlist=[Term([EvalFactor('y')])],
          rhs_termlist=[Term([]),
                        Term([EvalFactor('x1')]),
                        Term([EvalFactor('x2')]),
                        Term([EvalFactor('x3')])])

這可能看起來有點令人生畏,但實際上它非常簡單 - 你有一個ModelDesc ,代表一個公式,它有一個左側的術語列表和一個右側的術語列表。 每個術語由Term對象表示,每個Term都有一個因子列表。 (這里每個術語只有一個因素 - 如果你有任何交互,那么這些術語會有多個因素。)此外,“空交互” Term([])是patsy代表截距術語的方式。

所以你可以通過直接創建你想要的術語並將它們傳遞給patsy來避免所有這些復雜的引用/解析,跳過字符串解析步驟

from patsy import ModelDesc, Term, LookupFactor

response_terms = [Term([LookupFactor(response)])]
# start with intercept...
model_terms = [Term([])]
# ...then add another term for each candidate
model_terms += [Term([LookupFactor(c)]) for c in candidates]
model_desc = ModelDesc(response_terms, model_terms)

現在你可以將那個model_desc對象傳遞給你通常傳遞patsy公式的任何函數:

ols(model_desc, data).fit().rsquared_adj

這里有另一個技巧:你會注意到第一個例子有EvalFactor對象,現在我們正在使用LookupFactor對象。 區別在於EvalFactor接受一串任意Python代碼,如果你想編寫像np.log(x1)這樣的東西,這很好,但是如果你有像weight.in.kg這樣的變量,那真的很煩人。 LookupFactor直接獲取變量的名稱以查找數據,因此不需要進一步引用。

或者,您可以使用一些更高級的Python字符串處理來執行此操作,例如:

quoted = ["Q('{}')".format(c) for c in candidates]
formula = "{} ~ {} + 1".format(response, ' + '.join(quoted))

但是,雖然開始時這有點簡單,但它更脆弱 - 例如,考慮(或嘗試)如果您的某個參數包含引號字符會發生什么! 永遠不應該在處理管道中寫這樣的東西,其中候選名稱來自你無法控制的其他地方(例如隨機的CSV文件) - 你可以獲得各種任意代碼執行。 上述解決方案避免了所有這些問題。

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM