使用 Python 进行时间序列分析的基础步骤是什么?
进行时间序列分析的基础步骤通常包括数据准备、探索性数据分析(EDA)、建模和预测等。以下是一个典型的 Python 时间序列分析 的流程,结合了常用的库如 pandas、matplotlib、statsmodels 和 scikit-learn。
1. 数据准备
首先,确保数据的时间戳(时间序列)是正确的格式,并且按时间顺序排列。
导入相关库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
读取数据:
df = pd.read_csv('data.csv', parse_dates=['date_column'], index_col='date_column')
确保将时间列 date_column 转换为日期类型,并将其设置为 DataFrame 的索引。
2. 数据清理
检查缺失值:
df.isnull().sum() # 检查每列的缺失值数量
处理缺失值,可以使用插值、填充或者删除缺失的数据:
df = df.fillna(method='ffill') # 向前填充缺失值
检查和处理异常值或不合理的时间点。
3. 探索性数据分析(EDA)
绘制时间序列图:
df['value_column'].plot()
plt.title('Time Series Plot')
plt.show()
观察趋势、季节性和周期性:可以通过分解时间序列来观察这些特征。
使用 statsmodels 库中的 seasonal_decompose:
from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(df['value_column'], model='additive', period=12) # 假设周期为 12
decomposition.plot()
plt.show()
自相关图(ACF)和偏自相关图(PACF): 这些图用于检查时间序列的自相关性,帮助选择 ARMA 模型的阶数。
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(df['value_column'])
plot_pacf(df['value_column'])
plt.show()
4. 平稳性检验
为了进行 ARIMA 等时间序列模型的建模,需要数据是平稳的。常用的平稳性检验方法包括 单位根检验(例如,ADF 检验)。
ADF 检验:
from statsmodels.tsa.stattools import adfuller
result = adfuller(df['value_column'])
print('ADF Statistic:', result[0])
print('p-value:', result[1])
如果 p-value 小于显著性水平(通常是 0.05),则可以拒绝原假设(单位根存在),说明数据是平稳的。如果数据不平稳,通常需要进行差分处理。
5. 数据差分(如果需要)
如果数据是非平稳的,可以通过差分操作使其平稳。
一次差分:
df['diff'] = df['value_column'].diff()
df['diff'].dropna().plot()
plt.title('Differenced Time Series')
plt.show()
季节性差分(如果数据存在季节性):
df['seasonal_diff'] = df['value_column'] - df['value_column'].shift(12) # 假设季节性周期为 12
df['seasonal_diff'].dropna().plot()
plt.show()
6. 建模
ARIMA 模型(自回归积分滑动平均模型):如果时间序列是平稳的,可以使用 ARIMA 模型来建模。
选择 AR, I, MA 阶数:通过 ACF 和 PACF 图选择合适的阶数,或者使用 网格搜索(GridSearch)。
建立 ARIMA 模型:
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(df['value_column'], order=(p, d, q)) # p, d, q 根据 ACF/PACF 图确定
model_fit = model.fit()
查看模型拟合结果:
print(model_fit.summary())
预测:
forecast = model_fit.forecast(steps=10) # 预测未来 10 个时间点
print(forecast)
7. 模型评估
残差分析:通过检查残差(预测值与真实值之间的差异),判断模型是否拟合良好。
绘制残差图:
residuals = model_fit.resid
plt.plot(residuals)
plt.title('Residuals')
plt.show()
绘制残差的 ACF 图,查看是否存在自相关性:
plot_acf(residuals)
plt.show()
预测精度评估:使用 RMSE(均方根误差) 或 MAE(平均绝对误差) 等指标来评估模型的预测能力。
from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(actual_values, forecasted_values))
print('RMSE:', rmse)
8. 未来预测
如果模型评估良好,可以使用模型进行长期预测,生成未来的时间序列数据。
forecast = model_fit.forecast(steps=20) # 预测未来 20 个时间点
plt.plot(forecast)
plt.title('Future Forecast')
plt.show()
总结:
数据准备和清理:确保数据按时间顺序排列,没有缺失值。
探索性数据分析:绘制时间序列图,观察趋势和季节性。
平稳性检验:使用 ADF 检验检查数据是否平稳。
模型选择与建模:使用 ARIMA、SARIMA 等模型。
模型评估与预测:通过残差分析和精度指标评估模型效果,进行预测。