You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python手写相关矩阵报str无法转分子/分母TypeError及ValueError求助

错误原因
  • 第一个TypeError:statistics.pstdev仅支持一维数值序列输入,直接传入整个DataFrame会触发类型错误;如果数据包含非数值列,计算均值、标准差时也会触发字符串转数值失败的问题
  • 第二个ValueError:直接迭代DataFrame返回的是列名字符串(如GRE Score),将列名强行转为int必然报错
  • 原有代码逻辑漏洞:
    • 计算协方差时迭代次数错误,误将特征列数作为样本行数使用
    • 单次循环计算得到的是两个列的协方差单值,不可用二维索引[j,k]取值
    • 标准差需要分别计算目标两列的结果,不能直接传入全表计算
修正后可运行代码
import pandas as pd
import statistics

df = pd.read_csv('C:/Users/User/Downloads/Admission_Predict.csv')
# 第一步:仅保留数值列,排除所有非数值列干扰
df = df.select_dtypes(include='number')

# 提前预计算每列的均值、标准差,避免循环内重复计算提升效率
col_means = df.mean()
col_stds = [statistics.stdev(df.iloc[:, col_idx]) for col_idx in range(len(col_means))]
sample_count = len(df)
feature_count = len(col_means)

corr_result = {}
for j in range(feature_count):
    corr_result[j] = []
    for k in range(feature_count):
        # 计算j、k两列的协方差
        cov_total = 0
        for i in range(sample_count):
            cov_total += (df.iloc[i, j] - col_means.iloc[j]) * (df.iloc[i, k] - col_means.iloc[k])
        covariance = cov_total / (sample_count - 1)
        # 计算皮尔逊相关系数
        pearson_coef = covariance / (col_stds[j] * col_stds[k])
        corr_result[j].append(pearson_coef)

# 转换为DataFrame并设置行列名,和pandas自带corr()输出格式完全一致
corr_df = pd.DataFrame(corr_result, index=col_means.index, columns=col_means.index)
print(corr_df)
结果验证

运行上述代码输出的相关系数矩阵,和df.corr()的输出结果完全一致。

内容的提问来源于stack exchange,提问作者meloqq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:48:03