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

相关推荐
hunandede2 分钟前
直播相关02-录制麦克风声音,QT 信号与槽,自定义信号和槽
开发语言·qt
lzb_kkk27 分钟前
【Redis】redis5种数据类型(哈希)
开发语言·redis·算法·缓存·哈希算法
易雪寒1 小时前
Maven从入门到精通(三)
java·python·maven
FreakStudio1 小时前
全网最适合入门的面向对象编程教程:49 Python函数方法与接口-函数与方法的区别和lamda匿名函数
python·嵌入式·面向对象·电子diy
Good_tea_h2 小时前
如何实现Java中的多态性
java·开发语言·python
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐-项目评审系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
格林威2 小时前
Baumer工业相机堡盟工业相机如何通过BGAPISDK使用短曝光功能(曝光可设置1微秒)(C语言)
c语言·开发语言·人工智能·数码相机·计算机视觉
老身聊发少年狂2 小时前
R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例
开发语言·r语言
为为-180-3121-14552 小时前
R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用
开发语言·r语言
零 度°2 小时前
Qiskit:量子计算的Python工具包
python