ここからはpythonを使う。


使うといっても、前回、参考にさせてもらった電気予測のコードを入れ替えながらやる。


まず最初にこれ↓
import pandas as pd
import matplotlib


matplotlib.use('Agg') # -----(1)
import matplotlib.pyplot as plt


次にCSVの読込をします。


前回の記事で保存したbase.csv。これを読み込む。



電気のときはこうでした↓
#電力の読込
df_kw = pd.read_csv("juyo-2018.csv",encoding="Shift_JIS",skiprows=1)



自分はUTF-8の文字コードで保存、さらに最初の行からカラム指定しているので、

#電力の読込
df_kw = pd.read_csv("base.csv",encoding="UTF-8")


これで、df_kwの中身はこう↓
umaID,kishuID
0 2016104772 1077
1 2016103444 5339

で、次に過去のレースを読み込みたい。


電気予測では、岡山の気温読込に、こう書かれていた。↓

#岡山
df_temp_oka = read_temp("oka_data.csv")
ここで書かれているread_tempは、関数です。

電気予測では、def read_temp(filename):と書かれているところ。

今回は、関数は使わないので

それに合わせると
#岡山
df_temp_oka = read_temp("kakou.csv",encoding="UTF-8")

これで、df_temp_okaの中身は、こう↓

umaID raceID kishuID r_date r_place r_sihbada r_meter \
0 2016103444 1801020511 1025 2018-09-01 札幌 芝 1800
1 2016103444 1802020205 1025 2018-07-08 函館 芝 1800
2 2016103444 1802020501 1025 2018-07-21 函館 芝 1800
3 2016103444 1805050511 1025 2018-11-17 東京 芝 1800
4 2016103444 1806050911 1025 2018-12-28 中山 芝 2000
5 2016103444 1905021211 1025 2019-05-26 東京 芝 2400
6 2016103444 1906020411 1025 2019-03-03 中山 芝 2000
7 2016103444 1906030811 1025 2019-04-14 中山 芝 2000
8 2016103444 1906040511 1025 2019-09-16 中山 芝 2200
9 2016104772 1809050605 5495 2018-12-16 阪神 芝 2000
10 2016104772 1905020810 1077 2019-05-12 東京 芝 2000
11 2016104772 1906010306 1077 2019-01-12 中山 芝 1600
12 2016104772 1906020606 1075 2019-03-10 中山 芝 2000
13 2016104772 1906040511 1077 2019-09-16 中山 芝 2200

r_time
0 NaN
1 113.6
2 109.7
3 106.6
4 121.9
5 143.1
6 123.7
7 120.1
8 132.1
9 NaN
10 118.3
11 97.4
12 121.2
13 131.9



このとき、r_date(レース日)の2018-08-01という形式が日付なのか?はたまた人名のような文字なのか?はっきりさせておく必要がある。


なので、

df_temp_oka ['r_date'] = pd.to_datetime(df_temp_oka ['r_date'])


様式さえ合っていれば、エラーにはならない・・・・はず。






やっとメインのラベルですが、質的データをラベルします。


日付は、全部ラベルすると大変なので、年と月だけにして日は、捨てます。



まず年と月にします。


電気予測では
df["MONTH"] = df.DATETIME.map(lambda _: _.month)

こういう形で、月にしてました。


なので、年と月は、こうなります。
df_temp_oka["YEAR"] = df_temp_oka.r_date.map(lambda _: _.year)
df_temp_oka["MONTH"] = df_temp_oka.r_date.map(lambda _: _.month)


これで中身は、こうなります。


umaID raceID kishuID r_date r_place r_sihbada r_meter \
0 2016103444 1801020511 1025 2018-09-01 札幌 芝 1800
1 2016103444 1802020205 1025 2018-07-08 函館 芝 1800
2 2016103444 1802020501 1025 2018-07-21 函館 芝 1800
3 2016103444 1805050511 1025 2018-11-17 東京 芝 1800
4 2016103444 1806050911 1025 2018-12-28 中山 芝 2000
5 2016103444 1905021211 1025 2019-05-26 東京 芝 2400
6 2016103444 1906020411 1025 2019-03-03 中山 芝 2000
7 2016103444 1906030811 1025 2019-04-14 中山 芝 2000
8 2016103444 1906040511 1025 2019-09-16 中山 芝 2200
9 2016104772 1809050605 5495 2018-12-16 阪神 芝 2000
10 2016104772 1905020810 1077 2019-05-12 東京 芝 2000
11 2016104772 1906010306 1077 2019-01-12 中山 芝 1600
12 2016104772 1906020606 1075 2019-03-10 中山 芝 2000
13 2016104772 1906040511 1077 2019-09-16 中山 芝 2200

r_time YEAR MONTH
0 NaN 2018 9
1 113.6 2018 7
2 109.7 2018 7
3 106.6 2018 11
4 121.9 2018 12
5 143.1 2019 5
6 123.7 2019 3
7 120.1 2019 4
8 132.1 2019 9
9 NaN 2018 12
10 118.3 2019 5
11 97.4 2019 1
12 121.2 2019 3
13 131.9 2019 9





ちなみにこの段階で、r_dateはいらないので削除してもらってもいいです。


削除の仕方はこうです。


del df_kw['r_date']


続いてデータで、不足している行は、削除します。


電気予測ではこうでした↓
# null値の削除
df = df.dropna()


これに合わせると

# null値の削除
df_temp_oka = df_temp_oka.dropna()


これで欠損データは、削除されます。


いよいよone-hotラベル作業です。


対象となるとone-hotラベルは、


  1. 馬ID
  2. レースID
  3. 騎手ID
  4. 開催場所
  5. 芝ダ



距離とタイムは、量的データだと思うので対象外にします。


one-hotラベルは、電気予測ではこうでした。↓

cols = ["MONTH","WEEK","HOUR"]
for col in cols:
df = df.join(pd.get_dummies(df[col], prefix=col))



これに合わせるとこうなります↓

cols = ["umaID","raceID","kishuID","r_place","r_shibada","YEAR","MONTH"]
for col in cols:
df_temp_oka = df_temp_oka.join(pd.get_dummies(df_temp_oka[col], prefix=col))


これでone-hotラベル貼りました。


df_temp_okaはこうなります。


umaID raceID kishuID r_place r_shibada r_meter r_time YEAR \
0 2016103444 1801020511 1025 札幌 芝 1800 NaN 2018
1 2016103444 1802020205 1025 函館 芝 1800 113.6 2018
2 2016103444 1802020501 1025 函館 芝 1800 109.7 2018
3 2016103444 1805050511 1025 東京 芝 1800 106.6 2018
4 2016103444 1806050911 1025 中山 芝 2000 121.9 2018
5 2016103444 1905021211 1025 東京 芝 2400 143.1 2019
6 2016103444 1906020411 1025 中山 芝 2000 123.7 2019
7 2016103444 1906030811 1025 中山 芝 2000 120.1 2019
8 2016103444 1906040511 1025 中山 芝 2200 132.1 2019
9 2016104772 1809050605 5495 阪神 芝 2000 NaN 2018
10 2016104772 1905020810 1077 東京 芝 2000 118.3 2019
11 2016104772 1906010306 1077 中山 芝 1600 97.4 2019
12 2016104772 1906020606 1075 中山 芝 2000 121.2 2019
13 2016104772 1906040511 1077 中山 芝 2200 131.9 2019

MONTH umaID_2016103444 ... YEAR_2018 YEAR_2019 MONTH_1 MONTH_3 \
0 9 1 ... 1 0 0 0
1 7 1 ... 1 0 0 0
2 7 1 ... 1 0 0 0
3 11 1 ... 1 0 0 0
4 12 1 ... 1 0 0 0
5 5 1 ... 0 1 0 0
6 3 1 ... 0 1 0 1
7 4 1 ... 0 1 0 0
8 9 1 ... 0 1 0 0
9 12 0 ... 1 0 0 0
10 5 0 ... 0 1 0 0
11 1 0 ... 0 1 1 0
12 3 0 ... 0 1 0 1
13 9 0 ... 0 1 0 0

MONTH_4 MONTH_5 MONTH_7 MONTH_9 MONTH_11 MONTH_12
0 0 0 0 1 0 0
1 0 0 1 0 0 0
2 0 0 1 0 0 0
3 0 0 0 0 1 0
4 0 0 0 0 0 1
5 0 1 0 0 0 0
6 0 0 0 0 0 0
7 1 0 0 0 0 0
8 0 0 0 1 0 0
9 0 0 0 0 0 1
10 0 1 0 0 0 0
11 0 0 0 0 0 0
12 0 0 0 0 0 0
13 0 0 0 1 0 0

[14 rows x 44 columns]


次、学習編