基于克隆映射填充协方差矩阵DataFrame的缺失值
解决方案
我们可以通过遍历克隆映射表,结合Pandas的行列赋值实现需求,核心是处理克隆项的行/列时应用符号系数,同时单独修正对角线值以保持与被克隆项同号。
步骤说明
- 遍历每个克隆项,获取对应的被克隆项和符号系数
- 用被克隆项的列数据乘以符号系数,填充克隆项的列
- 用被克隆项的行数据乘以符号系数,填充克隆项的行
- 单独设置克隆项的对角线值,确保与被克隆项的对角线值一致(不受符号影响)
完整代码
import pandas as pd import numpy as np # 初始化协方差矩阵 covar_data = { 'a': [0.04, np.nan, 0.03, np.nan, -0.04], 'XY': [np.nan, np.nan, np.nan, np.nan, np.nan], 'b': [0.03, np.nan, 0.09, np.nan, 0.00], 'YZ': [np.nan, np.nan, np.nan, np.nan, np.nan], 'c': [-0.04, np.nan, 0.00, np.nan, 0.16] } covar_index = ['a', 'XY', 'b', 'YZ', 'c'] covar = pd.DataFrame(covar_data, index=covar_index) # 初始化克隆映射表 clone_data = { 'cloned_item': ['a', 'b'], 'sign': [1, -1] } clone_index = ['XY', 'YZ'] df = pd.DataFrame(clone_data, index=clone_index) # 处理克隆项 for clone in df.index: original_item = df.loc[clone, 'cloned_item'] sign_coeff = df.loc[clone, 'sign'] original_diag_val = covar.loc[original_item, original_item] # 填充克隆项的列 covar[clone] = covar[original_item] * sign_coeff # 修正对角线值 covar.loc[clone, clone] = original_diag_val # 填充克隆项的行 covar.loc[clone] = covar.loc[original_item] * sign_coeff # 再次修正对角线(行赋值会覆盖之前的列对角线设置) covar.loc[clone, clone] = original_diag_val # 输出结果 print(covar)
输出结果
a XY b YZ c a 0.04 0.04 0.03 -0.03 -0.04 XY 0.04 0.04 0.03 -0.03 -0.04 b 0.03 0.03 0.09 -0.09 0.00 YZ -0.03 -0.03 -0.09 0.09 0.00 c -0.04 -0.04 0.00 0.00 0.16
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

