2017-10-20 74 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") 

这是一个有点傻看的,但它应该工作,和我我不确定考虑到上面提到的一般问题会有什么更好的。