我使用seaborn和sklearn为时间序列数据集创建了一个线性回归模型。两个模型(seaborn和sklearn)对于一个简单的线性模型y = mx + b
输出相同的斜率和截距。斜率与excel结果匹配。但是,在python中使用这两种方法得到的截距-35874.5873
与在excel中使用-1404.3
得到的截距非常不同。
我的python代码中有一个设置不正确吗?模型计算是否不同?
这是Excel的数据。
Date Column:
1/1/2002
4/1/2002
7/1/2002
10/1/2002
1/1/2003
4/1/2003
7/1/2003
10/1/2003
1/1/2004
Bicarbonate Column:
446
450
454
483
457
465
465
474
495
Python脚本如下:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import scipy
from sklearn import linear_model
df = pd.read_excel(r'TestData.xls')
print(df)
Bicarbonate = df['Bicarbonate']
Date = df['Date']
DateO = df['Date'].apply(lambda x: x.toordinal())
df['DateO'] = DateO
print(DateO)
# Plotting the regression model with seaborn
ax1 = sns.regplot(x = 'DateO', y = 'Bicarbonate', data=df, color='magenta', label='Linear Model', ci =None, scatter=True)
# calculate slope and intercept of regression equation.
slope, intercept, r, p, se = scipy.stats.linregress(x=ax1.get_lines()[0].get_xdata(),
y=ax1.get_lines()[0].get_ydata())
print(slope)
print(intercept)
print(p)
# Linear Regression with sklearn.
x = df['DateO'].values.reshape(-1, 1)
y = df['Bicarbonate'].values.reshape(-1,1)
model = linear_model.LinearRegression().fit(x,y)
print('intercept:', model.intercept_)
print('slope:', model.coef_)
2条答案
按热度按时间6rqinv9w1#
excel和python给予不同的截取的原因是基于两个软件如何处理日期时间。
日期时间序列回归的截距没有任何内在意义,而是取决于
0
的定义。在excel中:
DateTime从
1970/01/01
开始,所以如果您将任何日期转换为数字1970/01/01将是1,并且每个日期将基于此分配一个数字。python中:
您用于按
toordinal()
转换的datetime
软件包将0000/01/01视为开始。如果你真的想把这两个日期对齐(不知道为什么),你必须把你的序号日期减去719163(“1970/01/01”的序号)。
yrdbyhpb2#
x_test = np.arange(0, ax1.get_xlim()[1]).reshape(-1, 1)
预测model.predict(x_test)
并绘制数据,以查看它在计算点处的交叉。'Date'
数据已被转换为序数,并且序数日期1
对应于'0001-01-01 00:00:00'
。考虑到这比数据中最早的日期早≈1971
年,截距是有意义的,特别是考虑到0.00243
的平缓斜率。1970
转换为.total_seconds