Win11 WSL2 Ubuntu Python RNN
WSL2 Python RNN Keras 予測値プロット
ここまでで、5つ先の予測値を求めることができました。
引き続きこの予測値をグラフにプロットしていきます。
ModelCheckpoint コ-ルバック確認 予測値プロット
が参考になります。
test_dataset を使用した予測値 pre はすでに計算済ですが、プロットしようとする X軸の値がまだ明確になっていません。
pre の表示位置配列 xx1 を設定します。
今回使用しているデ-タ(サンプル個数) raw_data の総数は 100個(0~99)でした。
テストデータ(生)は、Idx[-100]から最後Idx[-1]まで100個を使用。
test_dataset による最初の予測値は、
sequence_length (20個 0~19番目)
のデ-タから予測しますので、20番目の位置にプロットされるべきです。
そして、test_dataset による最後の予測値は、
sequence_length (20個 80~99番目)
のデ-タから予測しますので、100番目の位置にプロットされるべきです。
Test 予測値 pre は81個あります。
これをコ-ド化すると
len_raw_data = 100
xx1 = np.arange(sequence_length, len_raw_data + 1)
結果(Test 予測値preの位置)
array([20,21,22,・・・・,99,100])
となります。
終点は最終予測値の位置で 100-1+1=100 となります。
5つ先の予測値 future_result のプロット位置 xx3 は
xx3 = np.arange(len_raw_data, len_raw_data + 5)
array([100 101 102 103 104])
となります。
ちなみに pre のラスト pre[-1] と future_result の最初 future_result[0] は同じ値です。
pre[-1] は xx1[-1] = 100 の座標位置に存在します。
よって、xx3[0] = 100 となるはずです。
予測値プロット表示
二種類の予測値を合わせてプロット表示するコ-ドをまとめます。
len_raw_data = 100 sequence_length = 20 xx1 = np.arange(sequence_length, len_raw_data + 1) xx3 = np.arange(len_raw_data, len_raw_data + 5) plt.plot(xx1, pre) plt.plot(xx3, future_result) plt.show()
標準偏差値を元の値に変換
ここまでで表示している予測値はすべて標準偏差値に変換した値です。
これを元の値に変換戻します。
- 予測値を元に戻す
テストデ-タ test_dataset による予測値 pre1(標準偏差値)を pre_chg(元の値)に変換戻しします。
pre_chg = pre.copy()
pre_chg *= std_100
pre_chg += mean_100
これは縦型の配列になっています。
これを横型の配列にして見やすくします。
目的はこれだけで他にはありません。
縦型 縦ベクトルの配列に対して reshape(-1)とすると、 その配列を要素とする横型 横ベクトルの配列となります。
これで閲覧が見やすくなりました。
pre_chg1 = np.reshape(pre_chg, (-1))
print("pre_chg1:")
print(pre_chg1) - 5つ先の予測値を元に戻す
5つ先までの予測値 future_result(標準偏差値)を f_result(元の値)に変換戻しします。
f_result = future_result.copy()
f_result *= std_100
f_result += mean_100
print("f_result:", f_result)
元デ-タと予測値プロット表示
元デ-タと予測値を合わせてプロット表示します。
元デ-タを表示します。
Idx_100 = Idx[-100:] - Idx[-100]
print("Idx_100")
print(Idx_100)
Close_100 = Close1[-100:]
plt.plot(Idx_100, Close_100)
テストデ-タ test_dataset による予測値を表示します。
plt.plot(xx1, pre_chg)
5つ先までの予測値 future_result を表示します。
plt.plot(xx3, f_result)
plt.show()
元デ-タをロ-ソク足表示に変更
予測図の元デ-タをロ-ソク足表示に変更していきます。
ロ-ソク足表示に必要なデ-タは
Idx_100 = Idx[-100:] - Idx[-100]
これは前項で定義済
Date_100 = Date[-100:]
これは次項で説明
Close_100 = Close1[-100:]
Open_100 = Open[-100:]
High_100 = High[-100:]
Low_100 = Low[-100:]
の6列です。
これで100本のローソク足が Idx_100 の位置に表示されます。
X 軸日付処理
mane_chart_go_long.csv デ-タの中の日付は
2020/10/20 00:00:00
のようになっており、そのまま X 軸日付表示をさせるには文字列が長すぎます。
よってこれを 10/20 のように短縮します。
- 型変換
Pandas で抜き取った Date は リスト型になっています。
これを str 型 に変換します。
変換しても CSV 書式がそのまま残っていますので、
2020/10/20 00:00:00
のように変換されます。
余計な文字列が沢山ありますので、これを削除していきます。
必要なのは、月日の /10/20 です。
左から 0~3 の 4 文字と10文字以降は必要ないので
e4 = str(Date[i])[4:10]
とすると、6文字が取得され
e4 には /10/20 が入ります。 - 月日が1桁の時
月日が1桁の時は、/01 のような形をしています。
0 は余計なのでこれを削除します。
Python 組込関数 replace()を使って、一旦 /0 を / に置き換えます。
第一引数に置換元文字列、第二引数に置換先文字列を指定します。
e6 = e4.replace("/0", "/")
e6 には /10/20 が入りました。 もし /01/20 だったら /1/20 が e6 に入ります。 - 左端の / を削除
Python 組込関数 lstrip() で、左端の / を削除します。
e8 = e6.lstrip("/")
e8 には 1/20 が入りました。 - 繰返して X 軸日付処理
xData は X 軸の目盛り日付です。
そして、Python 組込関数 enumerate()を使って Date デ-タがある限り、i = 0 から 順番に for 分で処理を繰り返します。
Date の中に 100個のデ-タが存在するとすれば、i は 0~100 まで変化します。
今回は 10日ごとに X 軸日付を付けたいので、
if(i % 10 == 0):
として 10日ごとに日付を作成します。
また、xD は日付表示位置となります。
まとめると以下のようになります。
xDate = [] xD = [] for i, key in enumerate(Date_100): if(i % 10 == 0): e4 = str(key)[4:10] e6 = e4.replace("/0", "/") e8 = e6.lstrip("/") xDate.append(e8) xD.append(i)
ここまでで予測値プロット表示のための X 軸日付処理が完了しました。
引き続き、予測最終日を取得して行きます。