一篇喂饭级教程Python时序预测常用方法以及代码演示

在时序预测中,常用的方法包括以下几种:


  • A.移动平均法

  • B.指数平滑法

  • C.自回归(AR)模型

  • D.滑动平均(MA)模型

  • E.自回归滑动平均(ARMA)模型

  • F.长短期记忆网络(LSTM)

下面我将逐一展示每种方法的代码示例:


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
  • (1)生成模拟数据

  • (2)计算移动平均

  • (3)绘制实际数据和移动平均预测结果

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
  • 然后导入 numpy as np

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实现.不同的方法适用于不同的数据和问题,选择合适的方法是进行准确预测的关键.

  • 感谢大家的关注和支持!想了解更多Python编程精彩知识内容,请关注我的 微信公众号:python小胡子,有最新最前沿的的python知识和人工智能AI与大家共享,同时,如果你觉得这篇文章对你有帮助,不妨点个赞,并点击关注.动动你发财的手,万分感谢!!!

  • 原创文章不易,求点赞、在看、转发或留言,这样对我创作下一个精美文章会有莫大的动力!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python茶水实验室

你的关注,是我创作的最大动力.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值