用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 模型)奠定基础。这些预处理技术是时间序列分析中不可或缺的部分,有助于提高模型的准确性和稳定性。

相关推荐
长河25 分钟前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
Cyan_RA934 分钟前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
再见晴天*_*4 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun08275 小时前
Qt程序单独运行报错问题
开发语言·qt
酷飞飞6 小时前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
hdsoft_huge7 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘7 小时前
39.网络流入门
开发语言·网络·c++·算法
数字化顾问7 小时前
Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
python
未来之窗软件服务8 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
小冯记录编程8 小时前
C++指针陷阱:高效背后的致命危险
开发语言·c++·visual studio