日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

一篇喂飯級教程Python時序預(yù)測常用方法以及代碼演示

 江海博覽 2024-07-27

在時序預(yù)測中,常用的方法包括以下幾種:


  • A.移動平均法
  • B.指數(shù)平滑法
  • C.自回歸(AR)模型
  • D.滑動平均(MA)模型
  • E.自回歸滑動平均(ARMA)模型
  • F.長短期記憶網(wǎng)絡(luò)(LSTM)

下面我將逐一展示每種方法的代碼示例:


1.移動平均法

import numpy as np

# 創(chuàng)建時間序列數(shù)據(jù)
data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

# 簡單平均法預(yù)測
def simple_average(data):
    return np.mean(data)

prediction = simple_average(data)
print(f'Simple Average Prediction: {prediction}')  # 輸出: 19.0
  • (1)生成模擬數(shù)據(jù)
  • (2)計算移動平均
  • (3)繪制實際數(shù)據(jù)和移動平均預(yù)測結(jié)果
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 生成模擬時間序列數(shù)據(jù)
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()

# 創(chuàng)建數(shù)據(jù)框
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = data
df.set_index('date', inplace=True)

# 繪制生成的數(shù)據(jù)
plt.figure(figsize=(12, 6))
plt.plot(df, label='Actual Data')
plt.title('Simulated Time Series Data')
plt.legend()
plt.show()
圖片

2.指數(shù)平滑法

  • 指數(shù)平滑法是一種常用的時間序列預(yù)測方法,通過對過去的數(shù)據(jù)進(jìn)行加權(quán)平均來預(yù)測未來的值,近期的數(shù)據(jù)權(quán)重較大。
import pandas as pd
# 創(chuàng)建時間序列數(shù)據(jù)
data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
series = pd.Series(data)

# 指數(shù)平滑法預(yù)測
alpha = 0.2
exp_smoothing = series.ewm(alpha=alpha).mean()
print(exp_smoothing)

繪制實際數(shù)據(jù)和指數(shù)平滑法預(yù)測結(jié)果

圖片

3.自回歸(AR)模型

  • 自回歸模型通過過去的值來預(yù)測未來的值。我們將使用statsmodels庫來實現(xiàn)AR模型。
from statsmodels.tsa.ar_model import AutoReg
# 創(chuàng)建時間序列數(shù)據(jù)
data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

# 自回歸模型預(yù)測
model = AutoReg(data, lags=1)
model_fit = model.fit()
prediction = model_fit.predict(len(data), len(data))
print(f'AR Prediction: {prediction}')  # 輸出預(yù)測結(jié)果

繪制實際數(shù)據(jù)和自回歸(AR)模型預(yù)測結(jié)果

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg

# 設(shè)置隨機(jī)種子以確??芍貜?fù)性
np.random.seed(42)

# 生成模擬數(shù)據(jù)
n = 200  # 數(shù)據(jù)點數(shù)量
time = np.arange(n)
data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)

# 擬合自回歸模型
lags = 10  # 設(shè)置滯后階數(shù)
model = AutoReg(data, lags=lags).fit()

# 使用模型進(jìn)行預(yù)測
pred_start = n - lags  # 預(yù)測起點
pred_end = n + 20  # 預(yù)測終點
pred = model.predict(start=pred_start, end=pred_end)

# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果
plt.figure(figsize=(12, 6))
plt.plot(time, data, label='實際數(shù)據(jù)')
plt.plot(np.arange(pred_start, pred_end + 1), pred, label='AR模型預(yù)測', color='red')
plt.xlabel('時間')
plt.ylabel('值')
plt.legend()
plt.title('實際數(shù)據(jù)與自回歸(AR)模型預(yù)測結(jié)果')
plt.show()
圖片
  • 上圖展示了生成的時間序列數(shù)據(jù)(藍(lán)色曲線)和自回歸(AR)模型的預(yù)測結(jié)果(紅色曲線).從圖中可以看到,AR模型較好地捕捉到了時間序列數(shù)據(jù)的變化趨勢.

4.滑動平均(MA)模型

  • 滑動平均模型使用過去的誤差項來預(yù)測未來的值。
from statsmodels.tsa.arima.model import ARIMA

# 創(chuàng)建時間序列數(shù)據(jù)
data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

# 滑動平均模型預(yù)測
model = ARIMA(data, order=(0, 0, 1))
model_fit = model.fit()
prediction = model_fit.forecast()
print(f'MA Prediction: {prediction}')  # 輸出預(yù)測結(jié)果

繪制實際數(shù)據(jù)和滑動平均(MA)模型預(yù)測結(jié)果

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# 設(shè)置隨機(jī)種子以確??芍貜?fù)性
np.random.seed(42)

# 生成模擬數(shù)據(jù)
n = 200  # 數(shù)據(jù)點數(shù)量
time = np.arange(n)
data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)

# 擬合滑動平均模型
order = (0, 0, 10)  # MA模型的階數(shù)為10
model = ARIMA(data, order=order).fit()

# 使用模型進(jìn)行預(yù)測
pred_start = n  # 預(yù)測起點
pred_end = n + 20  # 預(yù)測終點
pred = model.predict(start=pred_start, end=pred_end)

# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果
plt.figure(figsize=(12, 6))
plt.plot(time, data, label='實際數(shù)據(jù)')
plt.plot(np.arange(pred_start, pred_end + 1), pred, label='MA模型預(yù)測', color='red')
plt.xlabel('時間')
plt.ylabel('值')
plt.legend()
plt.title('實際數(shù)據(jù)與滑動平均(MA)模型預(yù)測結(jié)果')
plt.show()
圖片
  • 上圖展示了生成的時間序列數(shù)據(jù)(藍(lán)色曲線)和滑動平均(MA)模型的預(yù)測結(jié)果(紅色曲線).從圖中可以看到,MA模型較好地捕捉到了時間序列數(shù)據(jù)的變化趨勢.

5.自回歸滑動平均(ARMA)模型

  • 首先要安裝:
Pip install statsmodels

然后導(dǎo)入

from statsmodels.tsa.arima.model import ARIMA
# 創(chuàng)建時間序列數(shù)據(jù)
data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

# 自回歸滑動平均模型預(yù)測
model = ARIMA(data, order=(1, 0, 1))
model_fit = model.fit()
prediction = model_fit.forecast()
print(f'ARMA Prediction: {prediction}')  # 輸出預(yù)測結(jié)果

繪制實際數(shù)據(jù)和和自回歸滑動平均(ARMA)模型預(yù)測結(jié)果

圖片
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# 設(shè)置隨機(jī)種子以確??芍貜?fù)性
np.random.seed(42)
# 生成模擬數(shù)據(jù)
n = 200  # 數(shù)據(jù)點數(shù)量
time = np.arange(n)
data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)
# 擬合自回歸滑動平均(ARMA)模型
order = (2, 0, 2)  # ARMA模型的階數(shù)
model = ARIMA(data, order=order).fit()
# 使用模型進(jìn)行預(yù)測
pred_start = n  # 預(yù)測起點
pred_end = n + 20  # 預(yù)測終點
pred = model.predict(start=pred_start, end=pred_end)
# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果
plt.figure(figsize=(12, 6))
plt.plot(time, data, label='實際數(shù)據(jù)')
plt.plot(np.arange(pred_start, pred_end + 1), pred, label='ARMA模型預(yù)測', color='red')
plt.xlabel('時間')
plt.ylabel('值')
plt.legend()
plt.title('實際數(shù)據(jù)與自回歸滑動平均(ARMA)模型預(yù)測結(jié)果')
plt.show()

6.長短期記憶網(wǎng)絡(luò)(LSTM)

  • 我們需要安裝TensorFlow庫.如果你的環(huán)境中沒有安裝,請運行以下命令進(jìn)行安裝:
pip install tensorflow
  • 然后導(dǎo)入 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

# 設(shè)置隨機(jī)種子以確??芍貜?fù)性
np.random.seed(42)
tf.random.set_seed(42)

# 生成模擬數(shù)據(jù)
n = 200  # 數(shù)據(jù)點數(shù)量
time = np.arange(n)
data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)

# 準(zhǔn)備數(shù)據(jù)進(jìn)行訓(xù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)

# 創(chuàng)建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')

# 訓(xùn)練模型
model.fit(X, Y, epochs=100, batch_size=1, verbose=0)

# 進(jìn)行預(yù)測
train_predict = model.predict(X)

# 使用模型預(yù)測未來的20個數(shù)據(jù)點
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])

# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果
plt.figure(figsize=(12, 6))
plt.plot(time, data, label='實際數(shù)據(jù)')
plt.plot(np.arange(time_step, len(train_predict) + time_step), train_predict, label='LSTM模型預(yù)測', color='red')
plt.plot(np.arange(n, n + 20), future_preds, label='LSTM模型未來預(yù)測', color='green')
plt.xlabel('時間')
plt.ylabel('值')
plt.legend()
plt.title('實際數(shù)據(jù)與長短期記憶網(wǎng)絡(luò)(LSTM)模型預(yù)測結(jié)果')
plt.show()
  • 這些示例展示了常見的時序預(yù)測方法及其Python實現(xiàn).不同的方法適用于不同的數(shù)據(jù)和問題,選擇合適的方法是進(jìn)行準(zhǔn)確預(yù)測的關(guān)鍵.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多