欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 用Python实现时间序列模型实战——Day 3: 时间序列数据预处理

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

2024/10/24 20:22:58 来源:https://blog.csdn.net/qq_41698317/article/details/141614181  浏览:    关键词:用Python实现时间序列模型实战——Day 3: 时间序列数据预处理
一、学习内容
1. 时间序列的差分运算

差分运算

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

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

    y'_t = y_t - y_{t-1}

    其中:

        y_t是时间 t 的原始值,

        y'_t 是一阶差分后的值。

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

    y''_t = y'_t - y'_{t-1} = (y_t - y_{t-1}) - (y_{t-1} - y_{t-2}) = y_t - 2y_{t-1} + y_{t-2}]

        其中:

        y_t是时间 t 的原始值,

        y'_t是一阶差分后的值,

        y''_t是二阶差分后的值。

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

去趋势

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

去季节性

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

移动平均法

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

         SMA_t = \frac{y_t + y_{t-1} + \dots + y_{t-n+1}}{n}

        其中:

        y_t是时间 t 的原始值,

        n 是移动平均的窗口大小。

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com