Python時系列予測ケース

1.Pythonは対応するライブラリをインポートします

ここでは、pythonデータ分析に関連するライブラリをインポートし、描画モジュールを構成します

%matplotlib inline
import pandas as pd
import numpy as np
import datetime
import matplotlib.pylab as plt
import seaborn as sns
import itertools
import statsmodels.api as sm
from matplotlib.pylab import style
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

style.use('ggplot')    
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False  

2.データを読み取ります

まず、付録1に記載されている石炭価格データを読み取り、必要なデータを選択します。元のデータの時間インデックス間隔は不規則であるため、データをリサンプリングする必要があります。2番目の質問の要件に従って、それぞれ日、週、月ごとにデータをリサンプリングし、平均価格の列を予測データとします。

#读取数据
price = pd.read_excel("data.xlsx", index_col=0, parse_dates=[0], header=1)
price = price.rename(columns={
    
    '价格低值(元/吨)':'low', '价格高值(元/吨)':'high', '价格平均值(元/吨)':'mean'})
price_week = price.resample('W-WED').mean().resample('W-WED').interpolate('linear')
price_week = price_week['mean']
price_day = price_week.resample('D').interpolate('linear')
price_month = price_day.resample('MS').mean()

以下は、元の

データの最初の10行です。例として、日数のデータを使用して画像を描画します。

price_day.plot(figsize=(12,8))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("money")
sns.despine()


上の図を分析すると、データの安定性が低く、データを区別する必要があることがわかります。

3.差分法

データの最初の違い

#做一阶差分
def differ(price):
    price_diff = price.diff()
    price_diff = price_diff.dropna()
    plt.figure(figsize=(14, 8))
    plt.plot(price_diff)
    plt.title('一阶差分')
    plt.show()
    return price_diff
#以月为单位的数据为例
day_diff = differ(price_month)

一次差の後に絵を描くと、定常性が非常に高いことがわかりますので、一次差を行うだけです。

4.時系列設定

次数決定の問題は、主に3つのパラメーターp、d、およびqを決定することです。差の次数dは、通常、図を観察することによるものであり、1次または2次の場合があります。私たちは主に次の2つの関数を介してpとqの値を決定します。

1)、自己相関関数ACF(自己相関関数)

自己相関関数ACFは、時系列の観測値と過去の観測値の間の線形相関を記述します。計算式は次のとおりです。

ここで、kはラグ期間の数を表し、k = 2の場合、ytおよびyt-2を表します。

2)、部分自己相関関数PACF(部分自己相関関数)

部分自己相関関数PACFは、時系列観測と中間観測が与えられた過去の観測との間の線形相関を記述します。

要約すると、pとqの順序を決定するためのルールは次のとおりです。

次に、PACFとACFの絵を描きましょう

#画acf和pacf图像
def show_acf(price_diff):
    acf = plot_acf(price_diff, lags=20)
    plt.title("ACF")
    acf.show()
    pacf = plot_pacf(price_diff, lags=20)
    plt.title("PACF")
    pacf.show()
show_acf(month_diff)

結果を図に示します。

5.情報​​基準の設定

テーリングと打ち切りによってモデルの順序を決定する方法は、多くの場合非常に主観的です。したがって、情報基準によって順序を決定できます。一般的に使用される情報基準関数は次のとおりです。

AICガイドライン

AIC基準の正式名称は赤池情報基準であり、計算式は次のとおりです。

ここで、Lはモデルの最大尤度関数を表し、Kはモデルパラメータの数を表します。

BICガイドライン

AIC規格にはいくつかの欠点があります。サンプルサイズが大きい場合、AIC基準のフィッティングエラーによって提供される情報はサンプルサイズによって増幅され、パラメータ数のペナルティ係数はサンプルサイズとは関係ありません。したがって、サンプルサイズが大きい場合は、AIC基準を使用して選択します。モデルは実際のモデルと収束せず、通常、実際のモデルよりも多くの未知のパラメーターが含まれています。BIC(Bayesian Information Criterion)Bayesian Information CriterionはAICの欠点を補い、計算式は次のとおりです。

ここで、nはサンプルサイズを表します。

#信息准则定阶:AIC、BIC、HQIC
def get_pq(data):
    #AIC
    AIC = sm.tsa.arma_order_select_ic(data, max_ar=6, max_ma=4, ic='aic')['aic_min_order']
    #BIC
    BIC = sm.tsa.arma_order_select_ic(data, max_ar=6, max_ma=4, ic='bic')['bic_min_order']
    print('the AIC is{},\nthe BIC is{}\n'.format(AIC,BIC))
get_pq(price_month)

結果は次のとおりです。

the AIC is(4, 0),
the BIC is(1, 1)

BICの結果を取得するため、pとqの値はそれぞれ1、1であると判断できます。

6.モデルをトレーニングし、データを予測します

データを予測し、結果をローカルCSVファイルに保存します

#预测数据
def predict(price, order, start, end, freq=None):
    model = ARIMA(price, order=order, freq=freq)
    result = model.fit()
    pred = result.predict(start, end, dynamic=True, typ='levels')
    plt.figure(figsize=(14, 8))
    plt.xticks(rotation=45)
    plt.plot(pred)
    plt.plot(price)
    return pred

#36月数据
pred_month = predict(price_month, (1, 1, 1), '2020-04', '2023-04', 'MS')
pred_month.to_csv("36月数据.csv")
#35周数据
pred_week = predict(price_week, (5, 1, 0), '2020-04-15', '2020-12-30' 'W-WED')
pred_week.to_csv("35周数据.csv")
#31天数据
pred_day = predict(price_day, (1, 1, 5), '2020-4-15', '2020-6-10')
pred_day.to_csv("31天数据.csv")

例として毎週のデータを取る

おすすめ

転載: blog.csdn.net/UCB001/article/details/107607413