Python 语言 时间序列数据趋势分解 Detrend 方法

Python阿木 发布于 2025-06-08 10 次阅读


阿木博主一句话概括:Python时间序列数据趋势分解方法详解及代码实现

阿木博主为你简单介绍:
时间序列数据在金融、气象、生物统计等领域有着广泛的应用。在分析时间序列数据时,趋势分解是理解数据变化规律的重要步骤。本文将详细介绍Python中常用的时间序列趋势分解方法,并通过实际代码示例进行演示。

一、
时间序列数据是指按照时间顺序排列的数据序列。在分析时间序列数据时,我们通常需要将数据分解为趋势(Trend)、季节性(Seasonality)和随机性(Irregularity)三个部分,以便更好地理解数据的内在规律。本文将围绕Python语言,介绍时间序列数据趋势分解的方法及其代码实现。

二、趋势分解方法
1. 移动平均法
移动平均法是一种简单的时间序列趋势分解方法,通过计算一系列数据点的平均值来平滑时间序列,从而提取出趋势成分。

2. 指数平滑法
指数平滑法是一种更高级的趋势分解方法,它通过赋予近期数据更大的权重来平滑时间序列,从而提取出趋势成分。

3. 傅里叶变换
傅里叶变换是一种将时间序列数据转换为频率域的方法,可以用来分析时间序列数据的周期性成分。

4. 自回归模型(AR)
自回归模型是一种基于历史数据预测未来数据的方法,可以用来提取时间序列数据的趋势成分。

三、Python代码实现
以下将分别介绍上述方法的Python代码实现。

1. 移动平均法
python
import numpy as np
import pandas as pd

创建时间序列数据
data = np.random.normal(0, 1, 100)
data = pd.Series(data, index=pd.date_range('20210101', periods=100))

计算移动平均
window_size = 5
rolling_mean = data.rolling(window=window_size).mean()

趋势分解
trend = rolling_mean
seasonality = None
irregularity = data - trend

输出结果
print("Trend:", trend)
print("Seasonality:", seasonality)
print("Irregularity:", irregularity)

2. 指数平滑法
python
from statsmodels.tsa.api import ExponentialSmoothing

创建时间序列数据
data = np.random.normal(0, 1, 100)
data = pd.Series(data, index=pd.date_range('20210101', periods=100))

指数平滑
model = ExponentialSmoothing(data, trend='add', seasonal='add', seasonal_periods=12)
fitted_model = model.fit()

趋势分解
trend = fitted_model.fittedvalues
seasonality = fitted_model.seasonal
irregularity = data - trend

输出结果
print("Trend:", trend)
print("Seasonality:", seasonality)
print("Irregularity:", irregularity)

3. 傅里叶变换
python
import numpy as np
import pandas as pd
from scipy.fft import fft

创建时间序列数据
data = np.random.normal(0, 1, 100)
data = pd.Series(data, index=pd.date_range('20210101', periods=100))

傅里叶变换
fft_result = fft(data)
frequencies = np.fft.fftfreq(len(data))

趋势分解
trend = np.abs(fft_result)[:len(data)//2]
seasonality = None
irregularity = data - trend

输出结果
print("Trend:", trend)
print("Seasonality:", seasonality)
print("Irregularity:", irregularity)

4. 自回归模型(AR)
python
from statsmodels.tsa.ar_model import AutoReg

创建时间序列数据
data = np.random.normal(0, 1, 100)
data = pd.Series(data, index=pd.date_range('20210101', periods=100))

自回归模型
model = AutoReg(data, lags=5)
fitted_model = model.fit()

趋势分解
trend = fitted_model.fittedvalues
seasonality = None
irregularity = data - trend

输出结果
print("Trend:", trend)
print("Seasonality:", seasonality)
print("Irregularity:", irregularity)

四、结论
本文介绍了Python中常用的时间序列趋势分解方法,并通过实际代码示例进行了演示。通过趋势分解,我们可以更好地理解时间序列数据的内在规律,为后续的数据分析和预测提供有力支持。

注意:以上代码仅为示例,实际应用中可能需要根据具体情况进行调整。