首页 > 数据库 > 数据库开发技术 > Python时序预测常用方法代码实现
时序预测是预测未来一段时间内的数据,它是根据历史数据来预测未来的数据。Python中常用的时序预测方法包括:移动平均法(Moving Average, )、指数平滑法(Exponential Smoothing)、自回归模型(Autoregressive Model)、自回归移动平均模型(Autoregressive Moving Average Model)。
这里我们先以移动平均法为例,介绍如何使用Python实现时序预测。
首先,我们导入库,生成模拟数据:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(0)
data = np.random.randn(100).cumsum()
df = pd.DataFrame(data, columns=['value'])
df.plot()
plt.show()
接下来,我们使用移动平均法进行预测,并绘制预测结果:
from statsmodels.tsa.api import ExponentialSmoothing
# 创建移动平均模型
model = ExponentialSmoothing(df['value'], trend='add', seasonal='add', seasonal_periods=12)
model_fit = model.fit()
# 预测下一轮数据
forecast = model_fit.forecast(steps=10)
print("后几轮预测值:", forecast.values)
# 绘制预测结果
plt.figure(figsize=(12, 6))
plt.plot(df['value'], label='原始数据')
plt.plot(model_fit.fittedvalues, label='拟合值')
plt.plot(forecast, label='预测值', color='red')
plt.legend()
plt.show()
指数平滑法是一种时间序列预测方法,它通过给予最近的数据更高的权重来平滑数据,适用于具有趋势或季节性的数据。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 生成模拟数据:正弦波加上随机噪声
np.random.seed(42)
dates = pd.date_range('20230101', periods=100)
data = np.sin(np.linspace(0, 2 * np.pi, 100)) + np.random.normal(0, 0.1, 100)
df = pd.DataFrame(data, index=dates, columns=['Value'])
# 定义并拟合指数平滑模型
model_es = ExponentialSmoothing(df['Value'], trend='add', seasonal='add', seasonal_periods=4)
fit_model_es = model_es.fit()
# 预测下一轮数据
forecast_es = fit_model_es.forecast(5)
# 画图展示原始数据和预测结果
plt.figure(figsize=(12, 6))
plt.plot(df['Value'], label='Original')
plt.plot(forecast_es, label='Forecast', color='red')
plt.legend()
plt.title('Exponential Smoothing Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.grid(True)
plt.show()
自回归模型是一种线性预测模型,它使用时间序列的过去值作为未来值的预测因子。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima_process import ArmaProcess
# 设置随机种子以获得可重复的结果
np.random.seed(42)
# 定义自回归参数
ar_params = [0.8]
# 生成自回归过程的模拟数据
arma_process = ArmaProcess(ar=ar_params)
simulated_data = arma_process.generate_sample(nsample=250)
# 将模拟数据转换为Pandas Series
dates = pd.date_range('20230101', periods=250)
df_arma = pd.Series(simulated_data, index=dates)
from statsmodels.tsa.arima.model import ARIMA
# 定义ARIMA模型,这里p=1表示一阶自回归
model_ar = ARIMA(df_arma, order=(1, 0, 0))
# 拟合模型
model_ar_fit = model_ar.fit()
# 进行预测,预测未来10个时间点的数据
forecast_ar = model_ar_fit.forecast(steps=10)
# 画图展示原始数据和预测结果
plt.figure(figsize=(12, 6))
plt.plot(df_arma, label='Historical Data')
plt.plot(pd.date_range(dates[-1], periods=10, freq='D'), forecast_ar, label='Forecast', color='red')
plt.legend()
plt.title('AR Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.grid(True)
plt.show()
ARMA模型结合了AR和MA模型的特点,使用时间序列的过去值和误差项的过去值作为未来值的预测因子。
# 假设df_arma是具有ARMA特性的模拟数据
# 这里使用statsmodels生成ARMA过程的模拟数据
from statsmodels.tsa.arima_process import arma_generate_sample
np.random.seed(42)
ar_params = [1, -0.5]
ma_params = [0.7, -0.3]
dates_arma = pd.date_range('20230101', periods=100)
arma_data = arma_generate_sample(nsample=100, ar=ar_params, ma=ma_params)
df_arma = pd.Series(arma_data, index=dates_arma, name='Value_ARMA')
# 定义并拟合ARMA模型
model_arma = ARIMA(df_arma, order=(1, 0, 2))
fit_model_arma = model_arma.fit()
# 预测下一轮数据
forecast_arma = fit_model_arma.predict(start=len(df_arma), end=len(df_arma)+4, typ='levels')
# 画图展示原始数据和ARMA预测结果
plt.figure(figsize=(10, 4))
plt.plot(df_arma, label='Original')
plt.plot(forecast_arma, label='Forecast ARMA', color='purple')
plt.legend()
plt.title('ARMA Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.grid(True)
plt.show()
上述代码中的模拟数据和预测结果仅用于简单模拟。在实际应用中,可能需要根据具体数据调整模型参数,并进行模型诊断和分析以确保预测的准确性。
原文作者:Python学习杂记;如有侵权,请联系管理员删除。