时间序列线性回归模型与Excel结果不符:截距差异排查
问题解答
核心结论
你的Python代码没有错误,截距差异完全是因为Python和Excel使用的日期转换数值尺度不同,模型计算逻辑完全一致。
原因分析
线性回归的截距计算公式是:截距b = y的平均值 - 斜率m × x的平均值
你在Python中用toordinal()把日期转换成了公元纪年序数(比如2002年1月1日对应730851,代表从公元1年1月1日到该日期的总天数),这个数值量级极大;而Excel默认使用的日期序列号是从1900年1月0日开始计数(2002年1月1日对应37258),数值量级远小于Python的ordinal。
两者的x平均值差异巨大:
- Python中x的平均值约为731215
- Excel中x的平均值约为37622
即使斜率m完全相同,代入截距公式后,必然会得到差异极大的截距结果——这是数学上的必然,和模型计算方式无关。
验证计算
根据你的结果反推,斜率m≈0.0497:
- Python截距:
465.44 - 0.0497×731215 ≈ -35874.56,和代码输出一致 - Excel截距:
465.44 - 0.0497×37622 ≈ -1404.36,和Excel结果完全匹配
统一结果的解决方法
如果想让Python输出和Excel一致的截距,只需把日期转换成Excel风格的序列号:
# 将日期转换为Excel兼容的序列号(适配Excel的1900年闰年bug) df['ExcelDate'] = df['Date'].apply(lambda x: (x - pd.Timestamp('1899-12-30')).days)
之后用ExcelDate作为x变量进行回归,就能得到和Excel完全一致的斜率与截距。
内容的提问来源于stack exchange,提问作者Holly Miller
相关产品推荐
相关产品推荐

