作者:oupingsong108 | 来源:互联网 | 2023-09-24 08:01
目录
- 撰写背景
- 什么是数据滑窗
- 代码实现
- 单特征时间序列
- 多特征时间序列
- 注意事项
- 总结
撰写背景
面向数据分析的小白,水平有限,错误难免,欢迎指正。
什么是数据滑窗
进行机器学习时,一般都要涉及到划分训练集和测试集的步骤。特别地,在做数据预测时,一般把预测的依据(也就是历史数据)称作X,把需要预测的数据称为y。即首先把原始数据划分为train_X, train_y这两个训练数据集和test_X, test_y这两个测试数据集。
对于时间序列数据的预测,往往是建立由好几个历史数据预测下一时刻的未来数据,这时候为了充分利用全部数据,应该对原始数据集进行滑窗操作,如下图所示。
这里展示的是多个特征的时间序列,其中每一行数据均属于同一时刻。假设,我们要以H( humidity)、PT(pressure)、PE(power)三个特征为预测依据,取当前和上三个时刻共四个时刻的已知数据对下一时刻的PE(功率)进行预测,那么对于X数据集的滑窗就应该如上图所示,而对y数据集的滑窗应该如下图所示。
下面给出滑窗实例。
代码实现
滑窗函数
def sliding_window(DataSet, X_width, y_width, gap = 1, multi_vector = None, X_data = True):
'''
DataSet has to be as a DataFrame
'''
if X_data:
if multi_vector:
a,b = DataSet.shape
else:
a = DataSet.shape[0]
b = 1
c = (a-X_width-y_width-a%gap)/gap
X = np.reshape(DataSet.iloc[0:X_width,:].values,(1,X_width,b))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap
tmp = DataSet.iloc[j:j + X_width,:].values
tmp = np.reshape(tmp,(1,X_width,b))
X = np.concatenate([X,tmp],0)
return X
else:
if multi_vector:
print('y_data-error:expect 1D ,given %dD'%DataSet.shape[1])
return;
else:
a = DataSet.shape[0]
c = (a-X_width-y_width-a%gap)/gap
y = np.reshape(DataSet.iloc[X_width:X_width + y_width,0].values,(1,y_width))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap + X_width
tmp = DataSet.iloc[j:j + y_width,:].values
tmp = np.reshape(tmp,(1,y_width))
y = np.concatenate([y,tmp])
return y
单特征时间序列
单特征时间序列是指仅有一个特征的一维时间序列,如股票收盘价、风电场风速数据、日营业额等。对单特征时间序列滑窗操作如下:
#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width)
train_y = sliding_window(DataSet, X_width, y_width, X_data = None)
假设训练数据集是一个100*1的序列,使用24个数据预测未来的1个数据,那么滑窗操作就将原数据做了这样的变换:
多特征时间序列
多特征时间序列指时间序列的特征不止一个,如上文所举的H、PT、PE三特征序列。这种数据一般使用在待预测的数据跟多个特征相关性较高的场合中,如气象数据嵌入的风速预测、股市数据嵌入的收盘价格预测等。进行多特征时间序列滑窗操作如下:
#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#multi_vector是否为多特征
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width, multi_vector = True)
test_y = sliding_window(DataSet, X_width, y_width, multi_vector = True, X_data = None)
假设训练数据集是一个100*3的序列,使用24个数据预测未来的1个数据,那么滑窗操作就将原数据做了这样的变换:
注意事项
DataSet必须是DataFrame格式。
y数据集只能是一维。
总结
目录
- 撰写背景
- 什么是数据滑窗
- 代码实现
- 单特征时间序列
- 多特征时间序列
- 注意事项
- 总结
撰写背景
面向数据分析的小白,水平有限,错误难免,欢迎指正。
什么是数据滑窗
进行机器学习时,一般都要涉及到划分训练集和测试集的步骤。特别地,在做数据预测时,一般把预测的依据(也就是历史数据)称作X,把需要预测的数据称为y。即首先把原始数据划分为train_X, train_y这两个训练数据集和test_X, test_y这两个测试数据集。
对于时间序列数据的预测,往往是建立由好几个历史数据预测下一时刻的未来数据,这时候为了充分利用全部数据,应该对原始数据集进行滑窗操作,如下图所示。
这里展示的是多个特征的时间序列,其中每一行数据均属于同一时刻。假设,我们要以H( humidity)、PT(pressure)、PE(power)三个特征为预测依据,取当前和上三个时刻共四个时刻的已知数据对下一时刻的PE(功率)进行预测,那么对于X数据集的滑窗就应该如上图所示,而对y数据集的滑窗应该如下图所示。
下面给出滑窗实例。
代码实现
滑窗函数
def sliding_window(DataSet, X_width, y_width, gap = 1, multi_vector = None, X_data = True):
'''
DataSet has to be as a DataFrame
'''
if X_data:
if multi_vector:
a,b = DataSet.shape
else:
a = DataSet.shape[0]
b = 1
c = (a-X_width-y_width-a%gap)/gap
X = np.reshape(DataSet.iloc[0:X_width,:].values,(1,X_width,b))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap
tmp = DataSet.iloc[j:j + X_width,:].values
tmp = np.reshape(tmp,(1,X_width,b))
X = np.concatenate([X,tmp],0)
return X
else:
if multi_vector:
print('y_data-error:expect 1D ,given %dD'%DataSet.shape[1])
return;
else:
a = DataSet.shape[0]
c = (a-X_width-y_width-a%gap)/gap
y = np.reshape(DataSet.iloc[X_width:X_width + y_width,0].values,(1,y_width))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap + X_width
tmp = DataSet.iloc[j:j + y_width,:].values
tmp = np.reshape(tmp,(1,y_width))
y = np.concatenate([y,tmp])
return y
单特征时间序列
单特征时间序列是指仅有一个特征的一维时间序列,如股票收盘价、风电场风速数据、日营业额等。对单特征时间序列滑窗操作如下:
#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width)
train_y = sliding_window(DataSet, X_width, y_width, X_data = None)
假设训练数据集是一个100*1的序列,使用24个数据预测未来的1个数据,那么滑窗操作就将原数据做了这样的变换:
多特征时间序列
多特征时间序列指时间序列的特征不止一个,如上文所举的H、PT、PE三特征序列。这种数据一般使用在待预测的数据跟多个特征相关性较高的场合中,如气象数据嵌入的风速预测、股市数据嵌入的收盘价格预测等。进行多特征时间序列滑窗操作如下:
#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#multi_vector是否为多特征
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width, multi_vector = True)
test_y = sliding_window(DataSet, X_width, y_width, multi_vector = True, X_data = None)
假设训练数据集是一个100*3的序列,使用24个数据预测未来的1个数据,那么滑窗操作就将原数据做了这样的变换:
注意事项
DataSet必须是DataFrame格式。
y数据集只能是一维。
总结