Python yield 实现滑动窗口截取时间序列数据(滑动步长可调) | 您所在的位置:网站首页 › python实现窗口 › Python yield 实现滑动窗口截取时间序列数据(滑动步长可调) |
在处理时间序列预测或者时间序列分类任务的时候,经常会遇到“滑动窗口(sliding window)”的概念,包括在之前写的二十几篇有关时间序列预测或者分类的文章中或多或少也反复提及这个概念。与卷积神经网络处理图像的原理类似,在序列数据中“滑动窗口”用来截取序列片段,从而将原始数据重塑为指定长度的样本,以便模型的建模。 滑动窗口的实现方法比较多,可以使用for循环,但是在处理大量数据就显得捉襟见肘了,这时候Python yield就派上用场了。关于Python yield的原理与使用,需要一定基础,之前专门写过一篇文章介绍,感兴趣的可以参考:深入浅出解析 Python yield。 在日常的业务需求中,滑动窗口函数一般是跟训练集测试集的划分是分开定义的。如果是比较简单的情况,可以定义在一个函数中。 方法1下边的例子是家庭用电量预测的例子中的滑动窗口实现方法。 先看一下数据集的情况: 由上图可知,使用的训练集(下面代码中的train)的shape为(1442,8),采样点为1442个,特征数(features)为8个(8列)。通过滑动窗口和切片相结合的方式来将以上采样数据划分成样本(samples),其中滑动窗口的宽度和滑动步长(sw_width) 可以设置为参数,方便后期调参的时候,找到适合自己业务需求的窗口宽度和滑动步长。代码实现: 123456789101112131415161718192021def sliding_window(train, sw_width=7, n_out=7, in_start=0): ''' 该函数实现窗口宽度为7、滑动步长为1的滑动窗口截取序列数据 ''' data = train.reshape((train.shape[0] * train.shape[1], train.shape[2])) # 将以周为单位的样本展平为以天为单位的序列 X, y = [], [] for _ in range(len(data)): in_end = in_start + sw_width out_end = in_end + n_out # 保证截取样本完整,最大元素索引不超过原序列索引,则截取数据;否则丢弃该样本 if out_end < len(data): # 训练数据以滑动步长1截取 train_seq = data[in_start:in_end, 0] train_seq = train_seq.reshape((len(train_seq), 1)) X.append(train_seq) y.append(data[in_end:out_end, 0]) in_start += 1 return np.array(X), np.array(y)有了以上说明,稍微有点基础应该不难理解。感兴趣的可参考这篇文章:时间序列预测15:Multi-input / Multi-head CNN 实现用电量/发电量预测 方法2该方法是单列截取数据,可以结合for循环和np.vstack方法将多列数据堆叠起来,该部分是项目中的一个点,等项目完成,会在以后的文章中介绍。 该方法可以指定滑动窗口的宽度和滑动步长。先看一下数据集的情况,方便理解实现的功能。 由上图可知,数据集(下面代码中的train)的shape为(875,10),采样点为875个,特征数(features)为10个(10列)。代码实现: 12345678910111213141516171819def _slide_window(rows, sw_width, sw_steps): ''' 函数功能: 按指定窗口宽度和滑动步长实现单列数据截取 -------------------------------------------------- 参数说明: rows:单个文件中的行数; sw_width:滑动窗口的窗口宽度; sw_steps:滑动窗口的滑动步长; ''' start = 0 s_num = (rows - sw_width) // sw_steps # 计算滑动次数 new_rows = sw_width + (sw_steps * s_num) # 完整窗口包含的行数,丢弃少于窗口宽度的采样数据; while True: if (start + sw_width) > new_rows: # 如果窗口结束索引超出最大索引,结束截取; return yield start, start + sw_width start += sw_steps使用上边的数据集测试一下: 123456789_test_list = [] for start,end in _slide_window(test_concat_file.shape[0], 100, 40): ''' 此处可以添加for循环或者其他方式,以实现处理多列数据 ''' _test_list.append(test_concat_file['ax'][start:end]) ''' 此处可添加判断条件,以实现数组堆叠 '''查看生成样本列表的长度: 1len(_test_list)输出: 120查看最后一个样本所包含的采样数据信息: 1_test_list[19]输出: 123456789101112760 0.1245 761 0.124742 762 0.124991 763 0.125238 764 0.125482 ... 855 0.185577 856 0.185849 857 0.186137 858 0.186466 859 0.186857 Name: ax, Length: 100, dtype: object当然实现方法有很多,本文只举了两个在用的方法,希望对需要的人有帮助。 |
CopyRight 2018-2019 实验室设备网 版权所有 |