python线性回归按日期预测

时间:2016-10-24 11:35:13

标签: python date pandas linear-regression

我想通过简单的线性回归预测未来某个日期的值,但由于日期格式,我无法预测。

这是我的数据框:

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")

5 个答案:

答案 0 :(得分:8)

线性回归不适用于日期数据。因此我们需要将其转换为数值。以下代码将日期转换为数值:

import datetime as dt
data_df['Date'] = pd.to_datetime(data_df['Date'])
data_df['Date']=data_df['Date'].map(dt.datetime.toordinal)

答案 1 :(得分:2)

转换:

1)数据框索引的日期

df = df.set_index('date', append=False)

2)将datetime对象转换为float64对象

df = df.index.to_julian_date()

运行回归,日期为自变量。

答案 2 :(得分:1)

线性回归适用于数值数据。日期时间类型不适合这种情况。您应该将该列拆分为三个单独的列(年,月和日)后删除该列。

答案 3 :(得分:0)

使用时

dt.datetime.toordinal

请注意,它只会转换日期值,而不会考虑分钟,秒等。有关从完整日期时间对象生成序数的完整答案,您可以使用以下内容:

df['Datetime column'],apply(lambda x: time.mktime(x.timetuple()))

答案 4 :(得分:0)

区分要用于回归/分类的数据类型真的很重要。

在使用时间序列时,这是另一种情况,但是如果要将时间数据用作数字数据类型作为输入,则应将数据类型从日期时间转换为浮点型(如果data_df['conv_date]是日期时间对象,如果不是,则应首先使用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是我的数据的另一个示例输出,它随秒的变化而变化。