【时间序列】时间序列数据的预处理方法总结

【时间序列】时间序列数据的预处理方法总结

时间序列数据随处可见,要进行时间序列分析,我们必须先对数据进行预处理。时间序列预处理技术对数据建模的准确性有重大影响。

在本文中,我们将主要讨论以下几点:

  • 时间序列数据的定义及其重要性。

  • 时间序列数据的预处理步骤。

  • 构建时间序列数据,查找缺失值,对特征进行去噪,并查找数据集中存在的异常值。

首先,让我们先了解时间序列的定义:

时间序列是在特定时间间隔内记录的一系列均匀分布的观测值。

时间序列的一个例子是黄金价格。在这种情况下,我们的观察是在固定时间间隔后一段时间内收集的黄金价格。时间单位可以是分钟、小时、天、年等。但是任何两个连续样本之间的时间差是相同的。

在本文中,我们将看到在深入研究数据建模部分之前应执行的常见时间序列预处理步骤和与时间序列数据相关的常见问题。

时间序列数据预处理

时间序列数据包含大量信息,但通常是不可见的。与时间序列相关的常见问题是无序时间戳、缺失值(或时间戳)、异常值和数据中的噪声。在所有提到的问题中,处理缺失值是最困难的一个,因为传统的插补(一种通过替换缺失值来保留大部分信息来处理缺失数据的技术)方法在处理时间序列数据时不适用。为了分析这个预处理的实时分析,我们将使用 Kaggle 的 Air Passenger 数据集。

时间序列数据通常以非结构化格式存在,即时间戳可能混合在一起并且没有正确排序。另外在大多数情况下,日期时间列具有默认的字符串数据类型,在对其应用任何操作之前,必须先将数据时间列转换为日期时间数据类型。让我们将其实现到我们的数据集中:

import pandas as pd 
 
passenger = pd.read_csv('AirPassengers.csv') 
passenger['Date'] = pd.to_datetime(passenger['Date'])  
passenger.sort_values(by=['Date'], inplace=True, ascending=True)

时间序列中的缺失值

处理时间序列数据中的缺失值是一项具有挑战性的任务。传统的插补技术不适用于时间序列数据,因为接收值的顺序很重要。为了解决这个问题,我们有以下插值方法:

插值是一种常用的时间序列缺失值插补技术。它有助于使用周围的两个已知数据点估计丢失的数据点。这种方法简单且最直观。处理时序数据时可以使用以下的方法:

  • 基于时间的插值

  • 样条插值

  • 线性插值

让我们看看我们的数据在插补之前的样子:

from matplotlib.pyplot import figure 
import matplotlib.pyplot as plt 
 
figure(figsize=(12, 5), dpi=80, linewidth=10) 
plt.plot(passenger['Date'], passenger['Passengers']) 
plt.title('Air Passengers Raw Data with Missing Values') 
plt.xlabel('Years', fontsize=14) 
plt.ylabel('Number of Passengers', fontsize=14) 
plt.show()

让我们看看以上三个方法的结果:

passenger[‘Linear’] = passenger[‘Passengers’].interpolate(method=’linear’) 
passenger[‘Spline order 3’] = passenger[‘Passengers’].interpolate(method=’spline’, order=3) 
passenger[‘Time’] = passenger[‘Passengers’].interpolate(method=’time’) 
 
methods = ['Linear', 'Spline order 3', 'Time'] 
 
from matplotlib.pyplot import figure 
import matplotlib.pyplot as plt 
for method in methods: 
    figure(figsize=(12, 4), dpi=80, linewidth=10) 
    plt.plot(passenger["Date"], passenger[method]) 
    plt.title('Air Passengers Imputation using: ' + types) 
    plt.xlabel("Years", fontsize=14) 
    plt.ylabel("Number of Passengers", fontsize=14) 
    plt.show()

所有的方法都给出了还不错的结果。当缺失值窗口(缺失数据的宽度)很小时,这些方法更有意义。但是如果丢失了几个连续的值,这些方法就更难估计它们。

时间序列去噪

时间序列中的噪声元素可能会导致严重问题,所以一般情况下在构建任何模型之前都会有去除噪声的操作。最小化噪声的过程称为去噪。以下是一些通常用于从时间序列中去除噪声的方法:

滚动平均值

滚动平均值是先前观察窗口的平均值,其中窗口是来自时间序列数据的一系列值。为每个有序窗口计算平均值。这可以极大地帮助最小化时间序列数据中的噪声。

让我们在谷歌股票价格上应用滚动平均值:

rolling_google = google_stock_price['Open'].rolling(20).mean() 
plt.plot(google_stock_price['Date'], google_stock_price['Open']) 
plt.plot(google_stock_price['Date'], rolling_google) 
plt.xlabel('Date') 
plt.ylabel('Stock Price') 
plt.legend(['Open','Rolling Mean']) 
plt.show()

傅里叶变换

傅里叶变换可以通过将时间序列数据转换到频域来帮助去除噪声,我们可以过滤掉噪声频率。然后应用傅里叶反变换得到滤波后的时间序列。我们用傅里叶变换来计算谷歌股票价格。

denoised_google_stock_price = fft_denoiser(value, 0.001, True) 
plt.plot(time, google_stock['Open'][0:300]) 
plt.plot(time, denoised_google_stock_price) 
plt.xlabel('Date', fontsize = 13) 
plt.ylabel('Stock Price', fontsize = 13) 
plt.legend([‘Open’,’Denoised: 0.001']) 
plt.show()

时间序列中的离群值检测

时间序列中的离群值是指趋势线的突然高峰或下降。导致离群值可能有多种因素。让我们看一下检测离群值的可用方法:

基于滚动统计的方法

这种方法最直观,适用于几乎所有类型的时间序列。在这种方法中,上限和下限是根据特定的统计量度创建的,例如均值和标准差、Z 和 T 分数以及分布的百分位数。例如,我们可以将上限和下限定义为:

取整个序列的均值和标准差是不可取的,因为在这种情况下,边界将是静态的。边界应该在滚动窗口的基础上创建,就像考虑一组连续的观察来创建边界,然后转移到另一个窗口。该方法是一种高效、简单的离群点检测方法。

孤立森林

顾名思义,孤立森林是一种基于决策树的异常检测机器学习算法。它通过使用决策树的分区隔离给定特征集上的数据点来工作。换句话说,它从数据集中取出一个样本,并在该样本上构建树,直到每个点都被隔离。为了隔离数据点,通过选择该特征的最大值和最小值之间的分割来随机进行分区,直到每个点都被隔离。特征的随机分区将为异常数据点在树中创建更短的路径,从而将它们与其余数据区分开来。

K-means 聚类

K-means 聚类是一种无监督机器学习算法,经常用于检测时间序列数据中的异常值。该算法查看数据集中的数据点,并将相似的数据点分组为 K 个聚类。通过测量数据点到其最近质心的距离来区分异常。如果距离大于某个阈值,则将该数据点标记为异常。K-Means 算法使用欧几里得距离进行比较。

可能的面试问题

如果一个人在简历中写了一个关于时间序列的项目,那么面试官可以从这个主题中提出这些可能的问题:

  • 预处理时间序列数据的方法有哪些,与标准插补方法有何不同?

  • 时间序列窗口是什么意思?

  • 你听说过孤立森林吗?如果是,那么你能解释一下它是如何工作的吗?

  • 什么是傅立叶变换,我们为什么需要它?

  • 填充时间序列数据中缺失值的不同方法是什么?

总结

在本文中,我们研究了一些常见的时间序列数据预处理技术。我们从排序时间序列观察开始;然后研究了各种缺失值插补技术。因为我们处理的是一组有序的观察结果,所以时间序列插补与传统插补技术不同。此外,还将一些噪声去除技术应用于谷歌股票价格数据集,最后讨论了一些时间序列的异常值检测方法。使用所有这些提到的预处理步骤可确保高质量数据,为构建复杂模型做好准备。

【时间序列】时间序列数据的预处理方法总结

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 时间序列数据预处理主要包括三个部分: 数据清洗, 数据转换和数据建模。 1. 数据清洗: 对数据进行清理, 删除重复数据, 缺失值, 异常值等。 2. 数据转换: 将数据转换为可供模型使用的格式, 如时间序列格式, 序列标准化, 时间序列重采样等。 3. 数据建模: 根据业务场景和模型类型来选择建模方法, 如时间序列分类, 时间序列预测, 时间序列聚类等。 ### 回答2: 时间序列数据预处理是指对时间序列数据进行一系列的处理操作,以提取和修正数据中的噪声,处理缺失值,调整数据的分布等,为后续的分析和模型建立提供更可靠和准确的数据基础。 首先,时间序列数据预处理包括数据的平稳性检验和平滑处理。平稳性检验可以通过ADF检验或KPSS检验等方法来判断数据是否具有平稳性。若数据不平稳,可以采用差分或对数变换等方式进行处理,使数据具有平稳性。平滑处理可以采用滑动平均法或指数平滑法等方法去除数据中的季节性和趋势性变动。 其次,时间序列数据还需要进行异常值和噪声的处理。异常值是指与其他数据显著不同的数据点,可以通过箱线图或Z-Score等方法检测和处理。噪声数据中的随机波动,可以通过滤波和平滑方法,如去除异常点或使用移动平均进行平滑处理来减小噪声的影响。 此外,时间序列数据中可能还存在缺失值。针对缺失值,常用的处理方法包括删除缺失值、插值法和回归法。删除缺失值的方法一般适用于缺失值较少的情况下,插值法可以通过线性插值、拉格朗日插值或KNN插值等方法来填补缺失值,回归法则通过建立回归模型来预测缺失值。 最后,时间序列数据预处理还需要对数据进行规范化和分布调整,以便于后续的建模和分析。常用的处理方法包括标准化和归一化等。标准化可以通过Z-score或最小-最大规范化等方法数据规范化到特定的范围。归一化则可以将数据映射到[0,1]的范围内。 总之,时间序列数据预处理是保证数据质量和准确性的重要步骤,通过对数据的平稳性处理、异常值和噪声处理、缺失值处理以及数据规范化和分布调整等操作,使得时间序列数据能够更好的用于后续的分析和建模。 ### 回答3: 时间序列数据预处理是指对时间序列数据进行清洗、转换和规范化等操作,以便更好地应用于时间序列分析和建模的过程。 首先,清洗时间序列数据预处理的第一步。这包括处理缺失值、异常值和噪声等问题。对于缺失值,可以采用插值或删除的方式进行填补;对于异常值,可以使用统计方法或离群点检测算法进行识别和处理;对于噪声,可以使用平滑或滤波技术进行降噪。 其次,转换时间序列数据是为了使数据更符合时间序列分析的假设。常见的转换方法包括差分、对数转换和平稳化等。差分可以用来消除非平稳性和季节性,对数转换可以使数据更稳定,并且平稳化可以通过去除趋势和周期性来生成平稳序列。 最后,规范化时间序列数据是为了将不同尺度和幅度的数据放在同一量级上,以减小尺度效应。常见的规范化方法有最大最小值归一化、z-score标准化和均方根归一化等。最大最小值归一化通过将数据缩放到0到1之间;z-score标准化将数据转换为均值为0,标准差为1的分布;均方根归一化则将数据结构化为单位根。 综上所述,时间序列数据预处理包括清洗、转换和规范化等步骤,以确保数据的可用性、合理性和可比性。这些步骤有助于提升时间序列数据分析和建模的准确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值