2017-10-20 65 views
0

我正在使用patsy爲迴歸準備分類數據,並且想要將列名映射到其DesignMatrix中的索引。我已嘗試使用DesignInfo對象的column_name_indexes屬性,但列名已被修改以反映編碼。patsy中未修改的列名索引

實施例使用從docs數據:

>>> from patsy import demo_data, dmatrix 
>>> data = demo_data("a", nlevels=3) 
>>> data 
{'a': ['a1', 'a2', 'a3', 'a1', 'a2', 'a3']} 

>>> x = dmatrix("a", data) 
>>> x 
DesignMatrix with shape (6, 3) 
    Intercept a[T.a2] a[T.a3] 
      1  0  0 
      1  1  0 
      1  0  1 
      1  0  0 
      1  1  0 
      1  0  1 
    Terms: 
    'Intercept' (column 0) 
    'a' (columns 1:3) 

>>> x.design_info.column_name_indexes 
OrderedDict([('Intercept', 0), ('a[T.a2]', 1), ('a[T.a3]', 2)]) 

我想能夠訪問的例如列索引'a2'致電:

x.design_info.column_name_indexes['a2'] 

當然,返回KeyError: 'a2',但。所以不是我要構建修改密鑰自己,以獲得所需的列索引1

x.design_info.column_name_indexes['a[T.a2]'] 

是否有參照未修改的功能/列名訪問列索引的方式,即'a2'而不是必須構造修改後的密鑰,即'a[T.a2]'

回答

1

一般而言,分類值(如a2)與設計矩陣列之間不存在一對一的映射關係。你談論的專欄已經比這更復雜 - 它是a2a1值之間的治療對比 - 並且事情可以任意地比這更復雜(例如考慮Helmert或多項式編碼)。

如果你知道你想查找與可變aa2相關的治療相反,那麼你可以使用

def column_for_treatment(design_info, factor, value): 
    column_name = "{}[T.{}]".format(factor, value) 
    return design_info.column_name_indexes[colum_name] 

column_for_treatment(x.design_info, "a", "a2") 

這是一個有點傻看的,但它應該工作,和我我不確定考慮到上面提到的一般問題會有什麼更好的。