python线性回归按日期预测
Posted
技术标签:
【中文标题】python线性回归按日期预测【英文标题】:python linear regression predict by date 【发布时间】:2017-03-06 04:03:10 【问题描述】:我想用简单的线性回归预测未来某个日期的值,但由于日期格式的原因我不能。
这是我拥有的数据框:
data_df =
date value
2016-01-15 1555
2016-01-16 1678
2016-01-17 1789
...
y = np.asarray(data_df['value'])
X = data_df[['date']]
X_train, X_test, y_train, y_test = train_test_split
(X,y,train_size=.7,random_state=42)
model = LinearRegression() #create linear regression object
model.fit(X_train, y_train) #train model on train data
model.score(X_train, y_train) #check score
print (‘Coefficient: \n’, model.coef_)
print (‘Intercept: \n’, model.intercept_)
coefs = zip(model.coef_, X.columns)
model.__dict__
print "sl = %.1f + " % model.intercept_ + \
" + ".join("%.1f %s" % coef for coef in coefs) #linear model
我尝试转换日期失败
data_df['conv_date'] = data_df.date.apply(lambda x: x.toordinal())
data_df['conv_date'] = pd.to_datetime(data_df.date, format="%Y-%M-%D")
【问题讨论】:
可能想研究 ARMA 或 ARIMA 模型以获取时间序列数据 【参考方案1】:线性回归不适用于日期数据。因此我们需要将其转换为数值。下面的代码会将日期转换为数值:
import datetime as dt
data_df['Date'] = pd.to_datetime(data_df['Date'])
data_df['Date']=data_df['Date'].map(dt.datetime.toordinal)
【讨论】:
很遗憾这不起作用 - 我收到此错误消息 TypeError: descriptor 'toordinal' requires a 'datetime.date' object but received a 'str' 我可以这样做吗? data_df['date'] = pd.to_datetime(data_df['date'],format='%Y-%m-%d') 嗨 jeangelj,请添加以下行: import datetime as dt data_df['Date'] = pd.to_datetime(data_df['Date']) data_df['Date']=data_df['Date' ].map(dt.datetime.toordinal) 请分享代码 sn-p 将其转换回原始值,这是因为一旦我将日期转换为数字并预测了数字日期值,我想将其转换回原始格式。 【参考方案2】:转换:
1) 数据帧索引的日期
df = df.set_index('date', append=False)
2) 将 datetime 对象转换为 float64 对象
df = df.index.to_julian_date()
以日期为自变量运行回归。
【讨论】:
【参考方案3】:线性回归适用于数值数据。日期时间类型不适合这种情况。您应该在将该列分成三个单独的列(年、月和日)后删除该列。
【讨论】:
【参考方案4】:使用时
dt.datetime.toordinal
请注意,它只转换日期值,不考虑分钟、秒等。要获得从完整日期时间对象生成序数的完整答案,您可以使用以下内容:
df['Datetime column'].apply(lambda x: time.mktime(x.timetuple()))
【讨论】:
【参考方案5】:区分要用于回归/分类的数据类型非常重要。
当您使用时间序列时,这是另一种情况,但如果您想使用时间数据作为数字数据类型作为输入,那么您应该将数据类型从日期时间转换为浮点数(如果您的 data_df['conv_date]
是datetime 对象,如果不是,则应先使用转换它;data_df['conv_date'] = pd.to_datetime(data_df.date, format="%Y-%M-%D")
)
我同意 Thomas Vetterli 的回答。请注意您使用的是哪种时间数据。
如果您只使用年月数据,那么dt.datetime.toordinal
就足够了;
>>import datetime
>>data_df['conv_date'] = pd.to_datetime(data_df.date, format="%Y-%M-%D")
>>data_df['conv_date'] = data_df['conv_date'].map(datetime.datetime.toordinal)
737577
但如果您还想使用小时、分钟和秒信息,那么time.mktime()
更适合;
>>import time
>>data_df['conv_date'] = pd.to_datetime(data_df.date, format="%Y-%M-%D")
>>data_df['conv_date'] = data_df['conv_date'].apply(lambda var: time.mktime(var.timetuple()))
1591016041.0
另外 1591016044.0 是我的数据的另一个示例性输出,它随秒数的变化而变化。
【讨论】:
以上是关于python线性回归按日期预测的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 python 中使用数据集中的变量计数以日期作为预测变量来运行线性回归?
Python:使用 Statsmodels 预测 y 值 - 线性回归
机器学习之路: python 线性回归LinearRegression, 随机参数回归SGDRegressor 预测波士顿房价