收藏!时间序列特征提取最全总结

时间序列数据在很多领域都是重要的结构化数据形式,例如金融、经济、生态学、神经科学和物理学。在多个时间点观测或测量的数据形成了时间序列。许多时间序列是固定频率的,也就是说数据是根据相同的规则定期出现的,例如每15秒、每5分钟或每月1次。时间序列也可以是不规则的,没有固定的时间单位或单位间的偏移量

时间序列数据中通常隐藏着以下几个特征,我们可以对分析场景进行深入分析挖掘后,提取能反映时间序列数据信息的特征,作为建模的特征输入

  • 日期特征:提取与日期相关的信息,如年、月、日、星期等。

  • 时间特征:提取与时间相关的信息,如小时、分钟、秒等。

  • 滞后特征:基于先前时间点的数据值创建的新特征,用于捕捉时间序列中的延迟效应。

  • 滚动窗口特征:通过在指定窗口内计算统计量(如均值、总和等)来提取的特征,反映数据的局部趋势。

  • 扩展窗口特征:基于更大时间范围内的数据计算的特征,用于捕捉长期趋势或周期性变化。

  • 领域特定特征:根据特定应用领域的知识提取的特征,以增强模型对特定问题的理解和预测能力。

这篇文章我们基于 train 乘客数据集,包含属性:ID、时间熟悉、乘客数量(可关注微信公众号 Python数据技术极客,在消息框中输入 train,可获取百度网盘下载链接和提取码),来演示如何在时间序列中提取相应特征。

1、日期特征

我们的数据集中时间是以每小时来记录的,上班族的我们都知道在工作日的公交或地铁的乘客数量与周末会有很大差异,所以我们需要提取对应特征。以下为提取年、月、日、星期几特征的实现

import pandas as pd  
data = pd.read_csv('train.csv')  
data['Datetime'] = pd.to_datetime(data['Datetime'],format='%d-%m-%Y %H:%M')  # 年
data['year']=data['Datetime'].dt.year  
# 月
data['month']=data['Datetime'].dt.month  
# 日
data['day']=data['Datetime'].dt.day  
# 星期几(数字表示)
data['dayofweek_num']=data['Datetime'].dt.dayofweek    
# 星期几(英文表示)
data['dayofweek_name']=data['Datetime'].dt.day_name()  data.head()

2、时间特征

我们知道一天中乘客数量存在上班高峰期和下班高峰期,所以如果能够从时间戳中提取'小时'特征,就可以对数据进行更深入的分析。提取基于时间的特征与提取日期相关特征的方法类似,如下所示为提取小时和分钟的数据(因为我们的数据集以小时汇总,所以提取的分钟特征都为0)

import pandas as pd  
data = pd.read_csv('train.csv')  
data['Datetime'] = pd.to_datetime(data['Datetime'],format='%d-%m-%Y %H:%M')  data['Hour'] = data['Datetime'].dt.hour  
data['minute'] = data['Datetime'].dt.minute  data.head()

图片

除以上特征外,还可以提取多种特征,如以下列表汇总所示

# 提取时间特征
data['Year'] = data['Datetime'].dt.year                  # 年
data['Month'] = data['Datetime'].dt.month                # 月
data['Day'] = data['Datetime'].dt.day                    # 日
data['Hour'] = data['Datetime'].dt.hour                  # 小时
data['Minute'] = data['Datetime'].dt.minute              # 分钟
data['Second'] = data['Datetime'].dt.second              # 秒
data['Microsecond'] = data['Datetime'].dt.microsecond    # 微秒
data['Nanosecond'] = data['Datetime'].dt.nanosecond      # 纳秒
data['Weekday'] = data['Datetime'].dt.weekday            # 星期几(0=周一, 6=周日)
data['Day_Name'] = data['Datetime'].dt.day_name()       # 星期几名称
data['Week_Number'] = data['Datetime'].dt.isocalendar().week  # ISO 周数
data['ISO_Year'] = data['Datetime'].dt.isocalendar().year    # ISO 年
data['ISO_Weekday'] = data['Datetime'].dt.isocalendar().day   # ISO 星期几
data['Quarter'] = data['Datetime'].dt.quarter            # 季度
data['Is_Workday'] = data['Datetime'].dt.weekday < 5    # 是否为工作日(布尔值)
data['Is_Month_Start'] = data['Datetime'].dt.is_month_start  # 是否为月初(布尔值)
data['Is_Month_End'] = data['Datetime'].dt.is_month_end      # 是否为月末(布尔值)
data['Is_Quarter_Start'] = data['Datetime'].dt.is_quarter_start  # 是否为季度初(布尔值)
data['Is_Quarter_End'] = data['Datetime'].dt.is_quarter_end      # 是否为季度末(布尔值)
data['Is_Year_Start'] = data['Datetime'].dt.is_year_start        # 是否为年初(布尔值)
data['Is_Year_End'] = data['Datetime'].dt.is_year_end            # 是否为年末(布尔值)

3、滞后特征

考虑这样一个场景 —正在预测一家公司的股票价格。那么前一天的股票价格对做出预测很重要,对吧?换句话说,t时刻的值极大地受到t-1时刻值的影响。这些过去的值被称为滞后,所以t-1是滞后1,t-2是滞后2,依此类推。实现滞后特征提取,我们可以使用 shift 方法,如下所示,lag 列表示的是前 1 个小时的数值

import pandas as pd  
data = pd.read_csv('train.csv')  
data['Datetime'] = pd.to_datetime(data['Datetime'],format='%d-%m-%Y %H:%M')  data['lag_1'] = data['Count'].shift(1)  
data = data[['Datetime', 'lag_1', 'Count']]  
data.head()

我们为序列生成了滞后一特征。但为什么选择滞后1?为什么不是5或7?这是一个值得思考的问题。

我们选择的滞后值应该基于个别值与其过去值的相关性。

如果序列呈现每周趋势,即上周一的值可以用来预测这周一的值,那么创建七天的滞后特征可能更合适。

还可以创建多个滞后特征!假设想要从滞后1到滞后7的特征则可以让模型决定哪个是最有价值的。例如训练一个线性回归模型,它会为滞后特征分配适当的权重(或系数):

import pandas as pd  
data = pd.read_csv('train.csv')  
data['Datetime'] = pd.to_datetime(data['Datetime'],format='%d-%m-%Y %H:%M')  data['lag_1'] = data['Count'].shift(1)  
data['lag_2'] = data['Count'].shift(2)  
data['lag_3'] = data['Count'].shift(3)  
data['lag_4'] = data['Count'].shift(4)  
data['lag_5'] = data['Count'].shift(5)  
data['lag_6'] = data['Count'].shift(6)  
data['lag_7'] = data['Count'].shift(7)  data = data[['Datetime', 'lag_1', 'lag_2', 'lag_3', 'lag_4', 'lag_5', 'lag_6', 'lag_7', 'Count']]  
data.head(10)

确定相关性显著的滞后有多种方法。例如可以使用ACF(自相关函数)和PACF(偏自相关函数)图

  • ACF:ACF图衡量时间序列与其滞后版本之间的相关性

  • PACF:PACF图衡量时间序列与其滞后版本之间的相关性,但在消除了已由中间比较解释的变异之后

对于我们的例子,这里是ACF和PACF图:

               

偏自相关函数显示与第一个滞后高度相关,与第二个和第三个滞后的相关性较低。自相关函数显示缓慢衰减,这表明未来值与其过去值有很强的相关性。

4、滚动窗口特征

滚动窗口特征(Rolling Window Features)是时间序列分析中常用的一种技术,用于提取数据的动态特征。这种方法通过在时间序列上定义一个固定大小的窗口,计算该窗口内的数据统计量,从而生成新的特征,这些特征可以帮助捕捉数据的趋势和波动性。

滚动窗口的基本概念:

  • 窗口大小:指定要在时间序列中考虑的观测值数量。例如,窗口大小为 3 表示每次考虑连续的 3 个观测值。

  • 滑动:窗口在时间序列上移动,通常是一个观测值的步长,这样可以生成覆盖整个序列的特征。

示例代码设置窗口大小为7,然后计算窗口内值的平均值,并将其用作特征。类似地,可以考虑计算选定窗口内的总和、最小值、最大值等作为特征。

import pandas as pd  
data = pd.read_csv('train.csv')  
data['Datetime'] = pd.to_datetime(data['Datetime'],format='%d-%m-%Y %H:%M')  data['rolling_mean'] = data['Count'].rolling(window=7).mean()  
data = data[['Datetime', 'rolling_mean', 'Count']]  
data.head(10)

在时间序列中,近期性是一个重要因素。越接近当前日期的值通常包含更多相关信息。

因此我们可以使用加权平均值,给予最近的观察值更高的权重。数学上,过去7个值在时间t的加权平均值可以表示为:

w_avg = w1(t-1) + w2(t-2) + . . . . + w7*(t-7)

其中,w1>w2>w3> . . . . >w7。

5、扩展窗口特征

扩展窗口特征(Expanded Window Features)是对滚动窗口特征的一种改进,旨在通过更灵活的方式提取时间序列数据中的信息。与传统的固定大小窗口不同,扩展窗口特征允许窗口在时间序列中以不同的方式进行定义和使用,从而捕捉更复杂的模式和趋势。

扩展窗口的类型

  • 增量窗口:窗口大小随着时间的推移而增加,从而使得每个时间点的特征包含越来越多的历史信息。这种方式可以捕捉长期趋势。

  • 自适应窗口:根据数据的特性动态调整窗口大小。例如,在数据波动较大的时候使用较小的窗口,而在数据较平稳时使用较大的窗口。

  • 重叠窗口:允许窗口之间有重叠部分,提取相邻窗口之间的特征,增加特征的细粒度

下面示例,我们演示如何在 Python 中使用expanding()函数轻松实现实现增量窗口

import pandas as pd  
data = pd.read_csv('train.csv')  
data['Datetime'] = pd.to_datetime(data['Datetime'],format='%d-%m-%Y %H:%M')  data['expanding_mean'] = data['Count'].expanding(2).mean()  
data = data[['Datetime','expanding_mean','Count' ]]  
data.head(10)

6、领域特定特征

领域特定特征(Domain-Specific Features)是指根据特定领域的知识和经验,从数据中提取的特征。这些特征通常是基于业务逻辑、行业标准或领域内的常识,并且其能够反映出该领域的独特性质和规律,通常在数据分析中起到提升模型性能的重要作用。

例如,可以考虑以下问题:销售是否受当天天气的影响?销售是否会在国定假日期间出现显著变化?如果是,那么可以利用外部数据集,将节假日信息作为一个特征纳入模型。

领域特征需要基于具体问题具体分析,后续我们会选用特定场景来讲解领域特定特征,敬请期待

时间序列分析常被视为一个具有挑战性的主题,而时间序列特征的提取是重中之重,本文我们从简单到复杂详细介绍了 6 种时间序列特征提取:日期特征、时间特征、滞后特征、滚动窗口特征、扩展窗口特征、领域特定特征,希望对你有一定启发!


如果你喜欢本文,欢迎点赞,并且关注我们的微信公众号:Python技术极客,我们会持续更新分享 Python 开发编程、数据分析、数据挖掘、AI 人工智能、网络爬虫等技术文章!让大家在Python 技术领域持续精进提升,成为更好的自己!

添加作者微信(coder_0101),拉你进入行业技术交流群,进行技术交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

骨架侧事件的概念和使用方法总结

一、事件包装类与Send()方法 在骨架侧&#xff0c;服务实现负责通知事件发生。以BrakeEvent事件包装类为例&#xff0c;其提供了Send()方法的两个变体用于发送事件数据&#xff1a; 第一个变体接受SampleType&#xff08;通常为事件数据类型&#xff09;的引用。事件数据由服…

高级IO——五种IO模型

一般我们在写一些简单的小项目的时候&#xff0c;免不了会用到IO接口&#xff0c;比如C语言中的scanf/printf又或者是 C中的cout/cin&#xff0c;或者是在Linux操作系统中的文件IO接口read/write。这些接口默认都是阻塞的&#xff0c; 这又引出了阻塞/非阻塞IO的概念&#xff0…

白平衡之White Patch Algorithm

免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。 读者在使用本文信息时,应…

Lobby——网络游戏大厅设计与参考建议!!!

随着网络游戏越来越多&#xff0c;游戏的主界面也是做的越来越花哨&#xff0c;各种界面层出不穷&#xff01;恨不得&#xff0c;一个主界面直接把所有的业务塞满&#xff01;&#xff01; 看着这十年不换的界面&#xff0c;经久不换&#xff0c;如同嚼蜡&#xff01;你会发现x…

GPU编程(1)GPU架构

总体 显卡结构 风扇在下面&#xff0c;采用热管方式&#xff0c;用气体液体的转化来带走热量。包裹热管的是铜制散热板&#xff0c;外围是铝制格扇&#xff0c;更快排除热量。 视频接口个pcie都是直接连接GPU。 所有的供电模块公用一个PWM芯片。 显存的型号就称之为显存颗粒…

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产&#xff0c;企业管理员必须建立高效的企业终端安全管控机制&#xff0c;确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统&#xff0c;确保任何未经授权的资产变动都能被迅…

Git推送被拒

今天开发完成一个新的需求&#xff0c;将自己的分支合并到test分支后&#xff0c;推送到远程仓库&#xff0c;结果显示推送被拒&#xff1a; 原因是因为有人更新了test分支的代码&#xff0c;我在合并之前没有拉取最新的test分支代码&#xff0c;所以他提示我“推送前需要合并…

企业级业务架构和IT架构规划方案(120页PPT下载)

方案内容综述 方案涵盖了从战略分析到具体实施路径的内容。提出了IT架构规划的工作思路&#xff0c;包括项目启动、部门访谈、资料收集、内部数据库搜索与先进实践研究等步骤&#xff0c;旨在通过这些步骤完成现状及差距分析&#xff0c;并基于此设计未来的应用架构、数据架构…

面向对象基础-继承

1.继承定义 继承是一种**“is-a”**&#xff08;“是一个”&#xff09;关系&#xff0c;它表示一个类是另一个类的特殊化版本。 2.继承作用 通过继承&#xff0c;子类能够获取父类的属性和方法&#xff0c;并且可以对这些属性和方法进行增强、扩展或重写 3.继承特点 3.1子…

计算机网络——应用层(DNS域名系统、文件传输协议FTP、远程终端协议TELNET、万维网)

应用层概述 不同网络应用的应用进程之间&#xff0c;还需要用不同的通信规则。因此在运输层协议之上&#xff0c;还需要有应用层协议。 每个应用层协议都是为了解决某一类应用问题&#xff0c;而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成。…

C++算法练习-day2——27.移除元素

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 给定一个有序数组和一个目标值&#xff0c;题目要求从数组中移除所有等于目标值的元素&#xff0c;并返回移除后数组的新长度。注意&#xff0c;题目要求原地修改数组&#xff0c;即不使用额外的…

YoloV8改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用

摘要 在计算机视觉领域,目标检测与实例分割任务一直是研究的热点。YoloV8作为目标检测领域的佼佼者,凭借其出色的性能和效率赢得了广泛的认可。然而,随着技术的不断进步,如何进一步提升YoloV8的性能成为了我们追求的目标。近期,我们引入了ContextAggregation模块对YoloV8…

信息安全工程师(53)网络安全审计机制与实现技术

前言 网络安全审计机制是指为了保护网络安全并发现潜在风险和漏洞而进行的一系列审计活动。审计的目的是检查并评估网络系统的安全性&#xff0c;以确保其符合相关法律法规和安全标准。 一、网络安全审计机制的重要性 网络安全审计机制对于保护组织的信息资产和敏感数据至关重要…

LabVIEW提高开发效率技巧----高效文件I/O

在LabVIEW开发中&#xff0c;文件I/O操作常常是性能瓶颈之一&#xff0c;特别是处理大数据时&#xff0c;如何高效地存储和读取数据显得尤为重要。本文将详细介绍如何利用TDMS Streaming来实现高效的文件I/O&#xff0c;并结合具体例子说明在实际开发中的应用技巧。 1. 什么是T…

[漏洞挖掘与防护] 04.Windows系统安全缺陷之5次Shift漏洞启动计算机机理分析

这是作者新开的一个专栏——“漏洞挖掘与防护”,前期会复现各种经典和最新漏洞,并总结防护技巧;后期尝试从零学习漏洞挖掘技术,包括Web漏洞和二进制及IOT相关漏洞,以及Fuzzing技术。新的征程,新的开启,漫漫长征路,偏向虎山行。享受过程,感谢您的陪伴,一起加油~ 欢迎关…

迅为RK3562开发板/核心板240PIN引脚全部引出,产品升级自如

可应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)、车牌识别、物体识别等。 iTOP-3562开发板/核心板采用瑞芯微RK3562处理器&#xff0c;内部集成了四核A53Mali G52架构&#xff0c;主频2GHZ&#xff0c;内置1TOPSNPU算力&#xff0c;R…

Gin框架操作指南08:日志与安全

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

Redis Geo 数据类型解析:基于 ZSET 的高效地理位置管理0708

根据官网介绍&#xff1a; Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type which is treated like a bit vector. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to s…

【回顾一下AQS知识,关于公平锁与非公平锁】

文章目录 一.什么是AQS二.公平锁和非公平锁实现三.公平锁和非公平锁的区别四.小结 一.什么是AQS AQS&#xff0c;全称 AbstractQueuedSynchronizer&#xff0c;是 Java 中用于构建锁和同步器的一个基础框架类&#xff0c;位于 java.util.concurrent.locks 包中。AQS 通过一个先…

Android 15 推出新安全功能以保护敏感数据

Android 15 带来了增强的安全功能&#xff0c;可保护您的敏感健康、财务和个人数据免遭盗窃和欺诈。 它还为大屏幕设备带来了生产力改进&#xff0c;并对相机、消息和密钥等应用进行了更新。 Android 防盗保护 Google 开发并严格测试了一套全面的功能&#xff0c;以在盗窃之…