我试图根据过去5年的可用数据预测未来7天的股价。数据看起来像这样
我正在尝试在此数据集上应用支持向量回归。我已经使用data.Date = pd.to_datetime(data.Date)
将date列转换为pandas datetime,但是仍然出现此错误
float() argument must be a string or a number, not 'Timestamp'
。
我的代码如下
from sklearn.svm import SVR
adaniPorts = data[data.Symbol == 'ADANIPORTS']
from sklearn.cross_validation import train_test_split
X = adaniPorts[['Symbol', 'Date']]
Y = adaniPorts['Average Price']
x_train, x_test, y_train, y_test = train_test_split(X, Y)
classifier = SVR().fit(x_train, y_train)
有什么方法可以解决日期时间问题?
答案 0 :(得分:1)
训练SVR时,只能使用数字功能。包含datetime
信息的一种方法是使用pd.to_timedelta(df.date).dt.total_seconds()
,因此在这种情况下,还向回归器提供了代表日期的数字特征。另一种方法是将日期时间对象的不同字段,年,月,日作为预测变量。
但是,如果这些功能提供了足够的信息来克服时间分量,那么使用SVR进行时间序列预测就更有意义了。
此外,您正在使用train_test_split
,它将根据原始数据生成随机训练和测试子集。
这不能直接应用于时间序列数据,因为它假设观测值之间没有关系。在处理时间序列时,必须按照观察值的时间顺序对数据进行拆分。
我建议您也看看Recurrent neural networks或ARIMA模型
答案 1 :(得分:0)
就像Alexandre的回答一样,仅支持数字功能。如果使用字符串功能,它将自动转换为数字。您有几种选择。第一个就像他一样,将每个日期转换为数字秒,但我认为最好将日期的每个部分转换为单编码。
data['day'] = data.Date.dt.day
data['month'] = data.Date.dt.month
data['year'] = data.Date.dt.year
通过此功能,您可以将日,月和年分开。现在,您可以像一键编码一样进行编码。这是为每个元素构建一个0的向量,然后在您的工作日期填充一个。例如,一个月的第三个月将是:
[0,0,1,0,....,0] -> 1x31
要使用熊猫来做到这一点,您可以使用类似的东西。
data = pd.concat([data, pd.get_dummies(data.year, prefix='year')], axis=1, sort=False)
data = pd.concat([data, pd.get_dummies(data.month, prefix='month')], axis=1, sort=False)
data = pd.concat([data, pd.get_dummies(data.day, prefix='day')], axis=1, sort=False)
添加工作日也可能会很有趣,因为在周末世界是塞子。
data['week_day'] = data.Date.dt.dayofweek
在传递到SVR之前,请先删除Date
列。 data.drop(['Date'], axis=1, inplace=True)
我希望这行得通
PS。我建议您为此任务使用LSTM(神经网络)或Arima(统计模型)。