一、学习内容
1. 时间序列的差分运算
差分运算:
-
差分运算是时间序列平稳化的一种方法,通过计算相邻时间点的差值来消除序列中的趋势和季节性成分。
-
一阶差分用于去除线性趋势,公式为:
其中:
是时间 的原始值,
是一阶差分后的值。
-
二阶差分用于去除更复杂的趋势,公式为:
其中:
是时间 的原始值,
是一阶差分后的值,
是二阶差分后的值。
2. 时间序列的去趋势与去季节性
去趋势:
- 去趋势是指通过去除时间序列中的长期趋势成分,使数据更适合用于建模。常见的方法包括差分法和回归法。
去季节性:
- 去季节性是指消除时间序列中的季节性成分,以便更好地分析数据的长期趋势和随机成分。通常通过移动平均法或季节性差分来实现。
3. 时间序列的平滑技术(移动平均法)
移动平均法:
- 移动平均法是一种通过计算数据的平均值来平滑时间序列的方法,帮助减少数据中的波动,使趋势和季节性更加明显。
- 简单移动平均 (SMA) 是最常见的平滑方法,计算方式为:
其中:
是时间 的原始值,
是移动平均的窗口大小。
是时间 计算得到的移动平均值。
二、实战案例
1. 数据加载与原始数据可视化
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. 一阶差分
# 一阶差分
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. 移动平均去趋势
# 移动平均去趋势 (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. 去季节性处理
# 去季节性 (差分一年)
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 模型)奠定基础。这些预处理技术是时间序列分析中不可或缺的部分,有助于提高模型的准确性和稳定性。