用Python从列表创建协方差矩阵

3
有没有一种最快的方法可以在Python(numpy array)中从以下三个列表到协方差矩阵?
Fac2 Fac1  VarCovar
   a    a       1.4
   a    b       0.7
   a    c       0.3
   b    a       0.7
   b    b       1.8
   b    c       6.3
   c    a       0.3
   c    b       6.3
   c    c       2.4
1个回答

5

您可以使用Pandas轻松创建3x3矩阵。从上面的数组中创建一个DataFrame df,并使用pivot_table在第三列上进行旋转。

例如,如果您有以下列表字典d

{'Fac1': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
 'Fac2': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
 'VarCovar': [1.4, 0.7, 0.3, 0.7, 1.8, 6.3, 0.3, 6.3, 2.4]}

像这样创建DataFrame:

df = pd.DataFrame(d)

然后:

>>> df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar')
Fac2    a    b    c
Fac1               
a     1.4  0.7  0.3
b     0.7  1.8  6.3
c     0.3  6.3  2.4

使用 values 属性可以从表格中返回一个 NumPy 数组:
>>> df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar').values
array([[ 1.4,  0.7,  0.3],
       [ 0.7,  1.8,  6.3],
       [ 0.3,  6.3,  2.4]])

如果您没有所有的配对,可以按照相同的方式处理,并使用转置索引对填充缺失的值:

>>> d = {'Fac1': ['a', 'b', 'c' , 'b', 'c', 'c'], 
         'Fac2': ['a', 'a', 'a' , 'b', 'b', 'c'], 
         'VarCovar': [1.4, 0.7, 0.3, 1.8, 6.3, 2.4]}
>>> df = pd.DataFrame(d)
>>> table = df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar')
>>> table.combine_first(table.T)
Fac2    a    b    c
Fac1               
a     1.4  0.7  0.3
b     0.7  1.8  6.3
c     0.3  6.3  2.4

(我从DSM的答案这里中借鉴使用combine_first的想法)


还有一个问题,当我查看数据时发现有一个问题,对于 a-b 和 b-a 对我没有协方差。相反,我只有一个值对,就像下面的例子所示:{'Fac1': ['a', 'b', 'c' , 'b', 'c', 'c'], 'Fac2': ['a', 'a', 'a' , 'b', 'b', 'c'], 'VarCovar': [1.4, 0.7, 0.3, 1.8, 6.3, 2.4]}你有什么办法把它们转化成协方差矩阵吗? - Chaos
太棒了!!非常有用,你真是个明星!为我节省了大量时间。 - Chaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接