在时序预测中,常用的方法包括以下几种:
下面我将逐一展示每种方法的代码示例: 1.移动平均法
import numpy as np# 创建时间序列数据 data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 简单平均法预测 def simple_average(data): return np.mean(data) prediction = simple_average(data)print (f'Simple Average Prediction: {prediction}' ) # 输出: 19.0
import pandas as pd import numpy as np import matplotlib.pyplot as plt# 生成模拟时间序列数据 np.random.seed(0) date_rng = pd.date_range(start='2020-01-01' , end='2021-01-01' , freq='D' ) data = np.random.randn(len(date_rng)).cumsum()# 创建数据框 df = pd.DataFrame(date_rng, columns=['date' ]) df['data' ] = data df.set_index('date' , inplace=True)# 绘制生成的数据 plt.figure(figsize=(12, 6)) plt.plot(df, label='Actual Data' ) plt.title('Simulated Time Series Data' ) plt.legend() plt.show()
2.指数平滑法
指数平滑法是一种常用的时间序列预测方法,通过对过去的数据进行加权平均来预测未来的值,近期的数据权重较大。 import pandas as pd# 创建时间序列数据 data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28] series = pd.Series(data)# 指数平滑法预测 alpha = 0.2 exp_smoothing = series.ewm(alpha=alpha).mean()print (exp_smoothing)
绘制实际数据和指数平滑法预测结果
3.自回归(AR)模型
自回归模型通过过去的值来预测未来的值。我们将使用statsmodels库来实现AR模型。 from statsmodels.tsa.ar_model import AutoReg# 创建时间序列数据 data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 自回归模型预测 model = AutoReg(data, lags=1) model_fit = model.fit() prediction = model_fit.predict(len(data), len(data))print (f'AR Prediction: {prediction}' ) # 输出预测结果
绘制实际数据和自回归(AR)模型预测结果
import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.ar_model import AutoReg# 设置随机种子以确保可重复性 np.random.seed(42)# 生成模拟数据 n = 200 # 数据点数量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 拟合自回归模型 lags = 10 # 设置滞后阶数 model = AutoReg(data, lags=lags).fit()# 使用模型进行预测 pred_start = n - lags # 预测起点 pred_end = n + 20 # 预测终点 pred = model.predict(start=pred_start, end=pred_end)# 绘制实际数据和预测结果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='实际数据' ) plt.plot(np.arange(pred_start, pred_end + 1), pred, label='AR模型预测' , color='red' ) plt.xlabel('时间' ) plt.ylabel('值' ) plt.legend() plt.title('实际数据与自回归(AR)模型预测结果' ) plt.show()
上图展示了生成的时间序列数据(蓝色曲线)和自回归(AR)模型的预测结果(红色曲线).从图中可以看到,AR模型较好地捕捉到了时间序列数据的变化趋势. 4.滑动平均(MA)模型
from statsmodels.tsa.arima.model import ARIMA# 创建时间序列数据 data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 滑动平均模型预测 model = ARIMA(data, order=(0, 0, 1)) model_fit = model.fit() prediction = model_fit.forecast()print (f'MA Prediction: {prediction}' ) # 输出预测结果
绘制实际数据和滑动平均(MA)模型预测结果
import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA# 设置随机种子以确保可重复性 np.random.seed(42)# 生成模拟数据 n = 200 # 数据点数量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 拟合滑动平均模型 order = (0, 0, 10) # MA模型的阶数为10 model = ARIMA(data, order=order).fit()# 使用模型进行预测 pred_start = n # 预测起点 pred_end = n + 20 # 预测终点 pred = model.predict(start=pred_start, end=pred_end)# 绘制实际数据和预测结果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='实际数据' ) plt.plot(np.arange(pred_start, pred_end + 1), pred, label='MA模型预测' , color='red' ) plt.xlabel('时间' ) plt.ylabel('值' ) plt.legend() plt.title('实际数据与滑动平均(MA)模型预测结果' ) plt.show()
上图展示了生成的时间序列数据(蓝色曲线)和滑动平均(MA)模型的预测结果(红色曲线).从图中可以看到,MA模型较好地捕捉到了时间序列数据的变化趋势. 5.自回归滑动平均(ARMA)模型
Pip install statsmodels
然后导入
from statsmodels.tsa.arima.model import ARIMA# 创建时间序列数据 data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 自回归滑动平均模型预测 model = ARIMA(data, order=(1, 0, 1)) model_fit = model.fit() prediction = model_fit.forecast()print (f'ARMA Prediction: {prediction}' ) # 输出预测结果
绘制实际数据和和自回归滑动平均(ARMA)模型预测结果
import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA# 设置随机种子以确保可重复性 np.random.seed(42)# 生成模拟数据 n = 200 # 数据点数量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 拟合自回归滑动平均(ARMA)模型 order = (2, 0, 2) # ARMA模型的阶数 model = ARIMA(data, order=order).fit()# 使用模型进行预测 pred_start = n # 预测起点 pred_end = n + 20 # 预测终点 pred = model.predict(start=pred_start, end=pred_end)# 绘制实际数据和预测结果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='实际数据' ) plt.plot(np.arange(pred_start, pred_end + 1), pred, label='ARMA模型预测' , color='red' ) plt.xlabel('时间' ) plt.ylabel('值' ) plt.legend() plt.title('实际数据与自回归滑动平均(ARMA)模型预测结果' ) plt.show()
6.长短期记忆网络(LSTM)
我们需要安装TensorFlow库.如果你的环境中没有安装,请运行以下命令进行安装: pip install tensorflow
import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense# 设置随机种子以确保可重复性 np.random.seed(42) tf.random.set_seed(42)# 生成模拟数据 n = 200 # 数据点数量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 准备数据进行训练 def create_dataset(data, time_step=1): X, Y = [], [] for i in range(len(data)-time_step-1): X.append(data[i:(i+time_step)]) Y.append(data[i + time_step]) return np.array(X), np.array(Y) time_step = 10 X, Y = create_dataset(data, time_step) X = X.reshape(X.shape[0], X.shape[1], 1)# 创建LSTM模型 model = Sequential() model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1))) model.add(LSTM(50, return_sequences=False)) model.add(Dense(1)) model.compile(optimizer='adam' , loss='mean_squared_error' )# 训练模型 model.fit(X, Y, epochs=100, batch_size=1, verbose=0)# 进行预测 train_predict = model.predict(X)# 使用模型预测未来的20个数据点 future_data = list(data[-time_step:]) future_preds = []for _ in range(20): future_input = np.array(future_data[-time_step:]).reshape(1, time_step, 1) future_pred = model.predict(future_input) future_data.append(future_pred[0][0]) future_preds.append(future_pred[0][0])# 绘制实际数据和预测结果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='实际数据' ) plt.plot(np.arange(time_step, len(train_predict) + time_step), train_predict, label='LSTM模型预测' , color='red' ) plt.plot(np.arange(n, n + 20), future_preds, label='LSTM模型未来预测' , color='green' ) plt.xlabel('时间' ) plt.ylabel('值' ) plt.legend() plt.title('实际数据与长短期记忆网络(LSTM)模型预测结果' ) plt.show()
这些示例展示了常见的时序预测方法及其Python实现.不同的方法适用于不同的数据和问题,选择合适的方法是进行准确预测的关键.