我正在学习时间序列,并试图根据我已经掌握的数据(大约一年)来预测未来两周的收盘价。
我已经使用Pandas shift创建了7个lag特性,所以我有t-7, t-6, ..., t-1特性和我的整个DataFrame df的当天收盘价。我做了一个test_df,它只是最近两周的数据。对于每一行的滞后特性,test_df都具有真实值。
我想通过将自己限制在训练集中的值(过去两周之前df中的所有值)和我的预测来模拟预测未来的值。
所以我打算这样做:
# for each row in test_df
# prediction = model.predict(row)
# row["t"] = prediction我认为这很接近,但它没有修复其他落后的功能,如t-1, t-2, ..., t-7。我需要这样做:
row 2, t = prediction for row 1
row 2, t-1 = t for row 1
...
row 2, t-i = t-i+1 for row 1我将对test_df中的所有行重复此操作。
我可以通过编写自己的函数来做到这一点,但我想知道是否有一种方法可以利用Pandas来更容易地做到这一点。
为清晰起见进行编辑:
假设我正在查看我的第一个测试行。我没有closing_price,所以我使用我的模型根据滞后的特征进行预测。在预测之前,我的df是这样的:
closing_price t-1 t-2 t-3 t-4 t-5
0 None 7 6 5 4 3假设我对closing_price的预测是15,那么我更新后的DataFrame应该是这样的:
closing_price t-1 t-2 t-3 t-4 t-5
0 15.0 7.0 6.0 5.0 4.0 3.0
1 NaN 15.0 7.0 6.0 5.0 4.0谢谢!
发布于 2018-03-09 04:38:09
编辑:因此,您实际上根本不需要时间序列拆分,因为您只尝试预测一行的值。看起来您知道如何创建移位后的数据帧,因此假设您已经将列车数据存储在一个数据帧df中,其中最后一行的'closing_price‘元素是None。您将使用:
Xtrain = df[:-1]
ytrain = Xtrain.pop('closing_price')
Xtest = df.tail(1)
Xtest.pop('closing_price')
reg.fit(Xtrain, ytrain)
prediction = reg.predict(Xtest)在此基础上,您可以使用df.set_value将prediction放入现有的数据帧中,或者完全创建一个新的数据帧(如果您正在逐步执行此操作)。
如果我对你的问题的理解是正确的(如果我没有理解正确,请评论!),我想你正在寻找的是scikit learn Time Series Split。这将允许您仅使用历史数据在不同的时间点创建多个预测。
从他们的文档中:
from sklearn.model_selection import TimeSeriesSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
tscv = TimeSeriesSplit(n_splits=3)
print(tscv)
for train_index, test_index in tscv.split(X):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]https://stackoverflow.com/questions/49181653
复制相似问题