用Python实现时间序列模型实战——Day 3: 时间序列数据预处理

一、学习内容
1. 时间序列的差分运算

差分运算

  • 差分运算是时间序列平稳化的一种方法,通过计算相邻时间点的差值来消除序列中的趋势和季节性成分。

  • 一阶差分用于去除线性趋势,公式为:

    其中:

是时间 的原始值,

是一阶差分后的值。

  • 二阶差分用于去除更复杂的趋势,公式为:

其中:

是时间 的原始值,

是一阶差分后的值,

是二阶差分后的值。

2. 时间序列的去趋势与去季节性

去趋势

  • 去趋势是指通过去除时间序列中的长期趋势成分,使数据更适合用于建模。常见的方法包括差分法和回归法。

去季节性

  • 去季节性是指消除时间序列中的季节性成分,以便更好地分析数据的长期趋势和随机成分。通常通过移动平均法或季节性差分来实现。
3. 时间序列的平滑技术(移动平均法)

移动平均法

  • 移动平均法是一种通过计算数据的平均值来平滑时间序列的方法,帮助减少数据中的波动,使趋势和季节性更加明显。
  • 简单移动平均 (SMA) 是最常见的平滑方法,计算方式为:

其中:

是时间 的原始值,

是移动平均的窗口大小。

是时间 计算得到的移动平均值。

二、实战案例
1. 数据加载与原始数据可视化
python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

# 加载时间序列数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')

# 绘制原始数据的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data['Passengers'], label='Original')
plt.title('Original Time Series')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

输出结果:

原始数据的时间序列图:图表显示了航空乘客数量的时间序列,存在明显的上升趋势和季节性波动。

程序解释:

我们首先加载了 airline_passengers 数据集,该数据集记录了 1949 年至 1960 年期间的航空乘客数量。

然后,我们绘制了原始数据的时间序列图,显示乘客数量随时间的变化。

2. 一阶差分
python 复制代码
# 一阶差分
data_diff = data.diff().dropna()

# 绘制一阶差分后的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data_diff['Passengers'], label='First Order Differencing', color='orange')
plt.title('First Order Differencing')
plt.xlabel('Date')
plt.ylabel('Differenced Passengers')
plt.legend()
plt.grid(True)
plt.show()

输出结果:

一阶差分后的时间序列图:差分后的序列消除了线性趋势,数据围绕零上下波动,说明差分操作有效地去除了趋势成分。

程序解释:

我们计算了时间序列的一阶差分,以消除数据中的线性趋势。

使用 data.diff() 计算一阶差分,.dropna() 去除首行的 NaN 值(因为差分操作会导致首行数据为空)。

差分后的时间序列图显示了去趋势后的数据波动情况。

3. 移动平均去趋势
python 复制代码
# 移动平均去趋势 (12个月的窗口)
data['12-months SMA'] = data['Passengers'].rolling(window=12).mean()

# 绘制移动平均后的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data['Passengers'], label='Original')
plt.plot(data['12-months SMA'], label='12-Months SMA', color='red')
plt.title('12-Months Simple Moving Average (SMA)')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

输出结果:

移动平均去趋势的时间序列图:使用 12 个月的窗口计算的 SMA 平滑了数据,使得趋势更加明显,同时保留了数据中的季节性成分。

程序解释:

我们使用 12 个月的简单移动平均 (SMA) 来平滑数据,消除季节性波动,使长期趋势更加明显。

使用 rolling(window=12).mean() 计算 12 个月的 SMA,并将其绘制在原始数据的图上进行比较。

4. 去季节性处理
python 复制代码
# 去季节性 (差分一年)
data_seasonal_diff = data['Passengers'].diff(periods=12).dropna()

# 绘制去季节性后的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data_seasonal_diff, label='Seasonal Differencing (12 months)', color='green')
plt.title('Seasonal Differencing (12 months)')
plt.xlabel('Date')
plt.ylabel('Differenced Passengers')
plt.legend()
plt.grid(True)
plt.show()

输出结果:

去季节性后的时间序列图:季节性差分有效地去除了数据中的季节性波动,序列变得更平稳。

程序解释:

通过季节性差分 (period=12) 去除数据中的季节性成分。

绘制去季节性后的时间序列图,显示差分处理后的序列变化。

三、运行结果分析
1. 一阶差分

差分运算有效地去除了时间序列中的趋势成分。差分后的数据不再表现出明显的趋势,变得更加平稳,适合进一步的时间序列建模。

2. 移动平均去趋势

移动平均法通过平滑数据,消除了数据中的短期波动,使长期趋势更加明显。然而,这种方法可能会滞后于实际趋势,且移动平均后的数据仍保留了季节性成分。

3. 去季节性处理

季节性差分消除了序列中的季节性波动,使得数据更加平稳。这是建模和预测前的重要步骤,尤其是对于存在明显季节性的时间序列。

通过这些预处理步骤,我们能够将原始的非平稳时间序列转化为平稳序列,从而为后续的时间序列建模(如 ARIMA 模型)奠定基础。这些预处理技术是时间序列分析中不可或缺的部分,有助于提高模型的准确性和稳定性。

相关推荐
深蓝海拓10 分钟前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
无须logic ᭄17 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
百流30 分钟前
scala文件编译相关理解
开发语言·学习·scala
Channing Lewis30 分钟前
flask常见问答题
后端·python·flask
Channing Lewis32 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月1 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉
Evand J2 小时前
matlab绘图——彩色螺旋图
开发语言·matlab·信息可视化
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
深度混淆2 小时前
C#,入门教程(04)——Visual Studio 2022 数据编程实例:随机数与组合
开发语言·c#