【问题标题】:Create a numpy covariance matrix from a pandas DataFrame of covariances从协方差的 pandas DataFrame 创建一个 numpy 协方差矩阵
【发布时间】:2019-09-24 03:57:27
【问题描述】:

我有以下 pandas.DataFrame 对象,它提供因子之间的协方差:

import pandas as pd

df = pd.DataFrame({"factor1": ["A", "A", "A", "B", "B", "C"],
                   "factor2": ["A", "B", "C", "B", "C", "C"],
                   "covar": [-1.2, -1, 2, 3.4, -4, 6.2]})

我的目标是将 DataFrame 重新格式化为正半定协方差 numpy.ndarray。

我已经开发了一个可行的解决方案,但是速度非常慢:

unique_factors = df.factor1.unique()
F = pd.DataFrame(columns=unique_factors, index=unique_factors)
for index, row in df.iterrows():
    F.loc[row["factor1"], row["factor2"]] = row["covar"]**2
    F.loc[row["factor2"], row["factor1"]] = row["covar"]**2 #inefficient
F = F.to_numpy()

其输出为:

[[1.44 1.0                4.0               ]
 [1.0  11.559999999999999 16.0              ]
 [4.0  16.0               38.440000000000005]]

我希望我可以利用 numpy 的原生方法更有效地实现我的目标。至少我希望能够删除注释#inefficient 的行并反映关于对角线的上三角矩阵。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas numpy matrix vectorization


    【解决方案1】:

    你的情况

    s=df.pivot(*df.columns)**2
    s=s.fillna(s.T)
    
    Out[230]: 
    factor2     A      B      C
    factor1                    
    A        1.44   1.00   4.00
    B        1.00  11.56  16.00
    C        4.00  16.00  38.44
    

    【讨论】:

    • 这明显更快⁠—谢谢!请问df.columns前面的星号是做什么用的?
    • @Clade 获取要列出的列名并将这些信息作为索引列值传递给枢轴
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多