【时间序列预测/分类】 全系列60篇由浅入深的博文汇总:传送门


在处理时间序列预测或者时间序列分类任务的时候,经常会遇到“滑动窗口(sliding window)”的概念,包括在之前写的二十几篇有关时间序列预测或者分类的文章中或多或少也反复提及这个概念。与卷积神经网络处理图像的原理类似,在序列数据中“滑动窗口”用来截取序列片段,从而将原始数据重塑为指定长度的样本,以便模型的建模。

滑动窗口的实现方法比较多,可以使用for循环,但是在处理大量数据就显得捉襟见肘了,这时候Python yield就派上用场了。关于Python yield的原理与使用,需要一定基础,之前专门写过一篇文章介绍,感兴趣的可以参考:深入浅出解析 Python yield。

在日常的业务需求中,滑动窗口函数一般是跟训练集测试集的划分是分开定义的。如果是比较简单的情况,可以定义在一个函数中。


方法1

下边的例子是家庭用电量预测的例子中的滑动窗口实现方法。

先看一下数据集的情况:

由上图可知,使用的训练集(下面代码中的train)的shape为(1442,8),采样点为1442个,特征数(features)为8个(8列)。通过滑动窗口和切片相结合的方式来将以上采样数据划分成样本(samples),其中滑动窗口的宽度和滑动步长(sw_width) 可以设置为参数,方便后期调参的时候,找到适合自己业务需求的窗口宽度和滑动步长。代码实现:

def 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_widthout_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 += 1return np.array(X), np.array(y)

有了以上说明,稍微有点基础应该不难理解。感兴趣的可参考这篇文章:时间序列预测15:Multi-input / Multi-head CNN 实现用电量/发电量预测


方法2

该方法是单列截取数据,可以结合for循环和np.vstack方法将多列数据堆叠起来,该部分是项目中的一个点,等项目完成,会在以后的文章中介绍。 该方法可以指定滑动窗口的宽度和滑动步长。先看一下数据集的情况,方便理解实现的功能。

由上图可知,数据集(下面代码中的train)的shape为(875,10),采样点为875个,特征数(features)为10个(10列)。代码实现:

def _slide_window(rows, sw_width, sw_steps):'''函数功能:按指定窗口宽度和滑动步长实现单列数据截取--------------------------------------------------参数说明:rows:单个文件中的行数;sw_width:滑动窗口的窗口宽度;sw_steps:滑动窗口的滑动步长;'''start = 0s_num = (rows - sw_width) // sw_steps # 计算滑动次数new_rows = sw_width + (sw_steps * s_num) # 完整窗口包含的行数,丢弃少于窗口宽度的采样数据;while True:if (start + sw_width) > new_rows: # 如果窗口结束索引超出最大索引,结束截取;returnyield start, start + sw_widthstart += sw_steps

使用上边的数据集测试一下:

_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])'''此处可添加判断条件,以实现数组堆叠'''

查看生成样本列表的长度:

len(_test_list)

输出:

20

查看最后一个样本所包含的采样数据信息:

_test_list[19]

输出:

760      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

方法3

完整代码及更多源码将在以下github仓库更新,欢迎star,fork,issue!
https://github.com/datamonday/TimeSeriesMoonlightBox

    def slide_window(self, rows):'''函数功能:生成切片列表截取数据,按指定窗口宽度的50%重叠生成;--------------------------------------------------参数说明:rows:excel文件中的行数;size:窗口宽度;'''start = 0s_num = (rows - self.sw_width) // self.sw_steps  # 计算滑动次数new_rows = self.sw_width + (self.sw_steps * s_num)  # 为保证窗口数据完整,丢弃不足窗口宽度的采样数据while True:if (start + self.sw_width) > new_rows:  # 丢弃不是完整窗口的数据returnyield start, start + self.sw_widthstart += self.sw_stepsdef segment_sensor_signal(self, data_file, label_index='state'):'''参数说明:self.sw_width:滑动窗口宽度;n_features:特征数量;label_index:用于计数的列索引;添加编码后的标签列'''# 计算特征数n_features = data_file.shape[1] - 1# 添加编码后的列名label_index = 'state_encode'# scikit-learn 类,实现将真实标签转化为整型数字;le = preprocessing.LabelEncoder()# 添加新的标签列;ravel 返回包含输入元素的一维数组。data_file[label_index] = le.fit_transform(data_file['state'].values.ravel())print(data_file.columns[:-2])# -----------------------------------------------## label_index = 'state'# 构造一个切片,方便填充数据segments = np.empty((0, self.sw_width, n_features), dtype=np.float64)# 单列标签数据# labels = np.empty((0), dtype=np.float64)labels = []labels_true = np.empty((0))for start, end in self.slide_window(data_file.shape[0]):  # 调用滑动窗口函数,通过yield实现滑动效果;temporary = []  # 每次存放各个特征的序列片段for feature in data_file.columns[:-2]:  # 遍历文件所有特征列temporary.append(data_file[feature][start:end])if (len(data_file[label_index][start:end]) == self.sw_width):  # 如果达到窗口宽度,则截取样本# 将数据通过stack方法堆叠成样本 shape为(none, sw_width, features);segments = np.vstack([segments, np.dstack(temporary)])  # 堆叠为三维数组# scipy.stats.mode函数寻找数组每行/每列中最常出现成员以及出现的次数;实现将一个窗口内采样数据的标签出现次数最多的作为样本标签labels = np.append(labels, stats.mode(data_file[label_index][start:end])[0][0])  # 出现次数最多的标签作为样本标签labels_true = np.append(labels_true, stats.mode(data_file['state'][start:end])[0][0])# labels_true = pd.DataFrame(labels)# labels_onehot = np.asarray(pd.get_dummies(labels), dtype = np.int8)labels = np.asarray(labels, dtype=np.float64)labels_onehot = to_categorical(labels, num_classes=len(np.unique(data_file[label_index].values)))return segments, labels_onehot, labels_true

时间序列分类05:滑动窗口处理时间序列分类数据相关推荐

  1. 基于滑动窗口的时间序列数据相关性分析计算

    在以往的项目中,我们想要计算时间序列的相关性的话,大都是把整体的数据中不同维度的数据当做是一个整体序列来进行两两序列之间的相关性分析计算,也比较简洁实用一些,这里今天遇上一个新的需求就是,我们需要把滑 ...

  2. 时间序列预测01:如何将时间序列预测转化为监督学习问题

    时间序列预测可以被构造为一个监督学习问题.通过对时间序列数据的重构,可以针对不同问题使用相关的机器学习算法.本文介绍了如何将时间序列问题重新构造为机器学习中的监督学习问题. [时间序列预测/分类] 全 ...

  3. 深度学习笔记(35) 滑动窗口的卷积实现

    深度学习笔记(35) 滑动窗口的卷积实现 1. 卷积实现 2. 减少计算成本 1. 卷积实现 为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层 假设对象检测算法输入一个14× ...

  4. 【算法】滑动窗口、713、209

    滑动窗口 1.基本概念 滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口. 分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口. 应用:利用滑动窗口获取平滑的数据 ...

  5. LIC-Fusion 2.0:基于滑动窗口法平面特征跟踪的激光雷达惯性相机里程计

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 摘要 来自商用惯性.视觉和激光雷达传感器的多模态测量的多传感器融合提供了鲁棒和精确的6自由度姿态估计, ...

  6. 网络(6)-TCP/IP对拥塞控制、滑动窗口如何实现可靠性?

    一.拥塞控制 在拥塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法).该算法主要包括四个主要部分: 1.慢启动 每当建立一个TCP连接时或一个TCP连接发生超时重传后,该连接便进入慢启动阶 ...

  7. Zlib压缩算法:LZ77、LZ78、霍夫曼编码、滑动窗口、Rabin-Karp算法、哈希链、I/O缓冲区

    Table of Contents 1.简介 1.1 什么是zlib 2.压缩算法 2.1 放气 2.2 LZ77 2.2.1 滑动窗口 2.2.2 长距离对 2.3 霍夫曼编码 3. zlib的实现 ...

  8. Sentinel 滑动窗口实现原理 侵删

    要实现限流.熔断等功能,首先要解决的问题是如何实时采集服务(资源)调用信息.例如将某一个接口设置的限流阔值 1W/tps,那首先如何判断当前的 TPS 是多少?Alibaba Sentinel 采用滑 ...

  9. 【计算机网络】TCP协议经典十五连问(半连接、重传、滑动窗口、流量窗口、拥塞控制、SYN Flood攻击、粘包拆包)

    文章目录 1. 讲下TCP三次握手流程 2.TCP握手为什么是三次,不能是两次?不能是四次? 2.1 为什么握手不能是两次呢? 2.2 为什么握手不能是四次呢? 3. 讲下TCP四次挥手过程 4. T ...

最新文章

  1. 操作系统结构-外核结构
  2. 关于frame的样式
  3. php适合响应式吗,响应式和自适应
  4. Spark没有读取HDFS文件的方法?那textFile是怎么读的?
  5. python lib库_python_lib基础库
  6. jQuery实现checkBox全选全取消
  7. SpringMVC框架----SpringMVC的入门程序
  8. 转贴XML的写法建议
  9. CSS样式(四)- CSS定位
  10. L2TP-***通用原理取证及在华为防火墙上的实施
  11. jq的attr、prop和data区别
  12. 电子元器件如何检测和筛选
  13. excel熵值法计算权重_如何用熵值法确定指标权重?
  14. python字符编码(一看就懂)
  15. ajax上传图片的方法,ajax上传图片的方法
  16. html背景图片怎么设置圆角,div+css实现圆角背景文字导航条
  17. android 自定义indicator,Android自定义Indicator
  18. Mybatis报错: Could not find resource mapper
  19. 看我如何快速拿下整个C段主机权限
  20. <figure> <figcaption>筆記

热门文章

  1. 六大原则之迪米特法则
  2. Java实现 计算数的平方根
  3. 分享多张图片到微信朋友圈
  4. 陈绮贞 《吉他手》 吉他谱子 图片+文字
  5. C语言多轴插补,C语言算法- 插补搜寻法
  6. Git综合应用及常见问题汇总
  7. qcc 蓝牙耳机 TWS与TWS plus的区别
  8. AppStore上线审核
  9. 当WebRTC Pion示例无音频流的时候,如何添加音频模块并通过浏览器播放?
  10. ChatGPT官宣数学能力再升级,网友:终于精通十以内加减法了