Python中基于系数与常数计算预测值的正确性排查
问题诊断与修正
你的代码计算逻辑存在两处关键错误,导致结果和Excel不符:
1. 系数列选取完全错误
mean_coefficients.iloc[:,0:20]试图选取前20列,但你的系数DataFrame只有col1-col5共5列有效系数,多取的列会引入无效值(或NaN),直接破坏计算结果。
2. 系数符号未匹配公式要求
你的公式中col2和col3的项是(-行值*对应系数),但原代码直接使用了系数表中的原始值,没有对这两个系数做符号调整(或者说没有对齐公式的运算逻辑)。
修正代码
步骤1:提取并调整系数
先从系数表中取出对应列的系数,按照公式要求修正col2和col3的符号:
# 提取col1-col5的系数,确保列顺序和月度值表一致 coeffs = mean_coefficients[['col1', 'col2', 'col3', 'col4', 'col5']].values.flatten() # 按公式要求,col2和col3的系数取反 coeffs[1] = -coeffs[1] coeffs[2] = -coeffs[2] # 提取常数项 const = mean_coefficients['constant'].values[0]
步骤2:计算预测值
用调整后的系数做矩阵乘法,再加常数项:
# 确保月度值表的列顺序和系数顺序一致(避免列乱序导致计算错误) selected_columns = selected_columns[['col1', 'col2', 'col3', 'col4', 'col5']] # 计算预测值 selected_columns['predicted_Mcap'] = selected_columns.dot(coeffs) + const
验证示例
用你提供的测试数据计算:
- 月度行值:
col1=16711, col2=17961, col3=0, col4=20, col5=55 - 调整后系数:
col1=2.447697e-07, col2=5.214072e-07, col3=0.000003, col4=0.000006, col5=555 - 常数项:
222
手动计算结果:
222 + (16711×2.447697e-07) + (17961×5.214072e-07) + (0×0.000003) + (20×0.000006) + (55×555) = 30747.01357
你可以用Excel核对这个结果,确认是否匹配。
特殊情况说明
如果你的公式实际是行值直接取负(即预测值=常数 + 行值col1×系数col1 + (-行值col2)×系数col2 + (-行值col3)×系数col3 + 行值col4×系数col4 + 行值col5×系数col5),那调整逻辑要改成对月度值的col2、col3列取负后再计算:
# 对col2、col3行值取负 selected_columns['col2'] = -selected_columns['col2'] selected_columns['col3'] = -selected_columns['col3'] # 提取原始系数 coeffs = mean_coefficients[['col1', 'col2', 'col3', 'col4', 'col5']].values.flatten() # 计算预测值 selected_columns['predicted_Mcap'] = selected_columns.dot(coeffs) + mean_coefficients['constant'].values[0]
这种情况需要你对照Excel的计算步骤,确认到底是系数取负还是行值取负。
内容的提问来源于stack exchange,提问作者Mostafa Bouzari
相关产品推荐
相关产品推荐

