見出し画像

Pythonでコースデータの整理

小回り適性を測る指標として、以下の記事で直線距離の扱いを紹介しましたがそのデータ作成のプロセスを記します。

コースデータを整理

コースデータを整理したものを一度整理しておくと、種牡馬や個別の馬など、あらゆる成績データと結合して分析に使えます。

ツール:TargetとPython

1.データの取り込み

Targetから障害を除く全てのレースについて1着馬に限定して取得します。
データ範囲を広げれば、たくさんのコースが取得できますが、今回は中京コースの改修後の2011年~2020年に限定します。

import pandas as pd
crs = pd.read_csv('course_data_2011to2020.csv')
crs.head(10)

スクリーンショット 2020-07-19 2.01.36

ここからさらにデータを整えていきましょう。

2.データの整形

crs['コース区分'].fillna('なし', inplace=True)
crs['芝(内・外)'].fillna('なし', inplace=True)
crs['place_sur_long'] = crs['場所'] + crs['距離'] \
+ crs['コース区分'] + crs['芝(内・外)']
crs

スクリーンショット 2020-07-19 2.05.42

​欠損値があると後々面倒なので「なし」で埋めておきます。

また芝コースの直線距離については、京都などはAコースとBコースで直線距離が異なるので、場所、距離、コース区分、芝(内・外)をキーとしてコースIDを作ります。(ここではplace_sur_longの列です)

コースのパターンがいくつあるか確認しておきましょう。

#コースの重複列を削除  
crs = crs[~crs.duplicated(subset='place_sur_long')]
crs

スクリーンショット 2020-07-19 2.20.21

この期間では222パターンのコース設定があるようです。

3.コースの特徴の追加

tmp = crs.copy()として以下では処理しています。

まずは直線距離のデータを追加します。

#直線距離を追加

#中山
tmp.loc[tmp['place_sur_long'].str.contains('中山芝'), '直線距離'] =  310
tmp.loc[tmp['place_sur_long'].str.contains('中山ダ'), '直線距離'] =  308

#東京
tmp.loc[tmp['place_sur_long'].str.contains('東京芝'), '直線距離'] =  525.9
tmp.loc[tmp['place_sur_long'].str.contains('東京ダ'), '直線距離'] =  501.6

#札幌
tmp.loc[(tmp['place_sur_long'].str.contains('札幌芝')) & (tmp['コース区分'] =='A') , '直線距離'] =  266.1
tmp.loc[(tmp['place_sur_long'].str.contains('札幌芝')) & (tmp['コース区分'] =='B') , '直線距離'] =  267.6
tmp.loc[(tmp['place_sur_long'].str.contains('札幌芝')) & (tmp['コース区分'] =='C') , '直線距離'] =  269.1

tmp.loc[tmp['place_sur_long'].str.contains('札幌ダ'), '直線距離'] =  264

#函館
tmp.loc[(tmp['place_sur_long'].str.contains('函館芝')) & (tmp['コース区分'] =='A') , '直線距離'] =  262.1
tmp.loc[(tmp['place_sur_long'].str.contains('函館芝')) & (tmp['コース区分'] =='B') , '直線距離'] =  262.1
tmp.loc[(tmp['place_sur_long'].str.contains('函館芝')) & (tmp['コース区分'] =='C') , '直線距離'] =  264.5

tmp.loc[tmp['place_sur_long'].str.contains('函館ダ'), '直線距離'] =  260.3

#福島
tmp.loc[(tmp['place_sur_long'].str.contains('福島芝')) & (tmp['コース区分'] =='A') , '直線距離'] =  292.0
tmp.loc[(tmp['place_sur_long'].str.contains('福島芝')) & (tmp['コース区分'] =='B') , '直線距離'] =  297.5
tmp.loc[(tmp['place_sur_long'].str.contains('福島芝')) & (tmp['コース区分'] =='C') , '直線距離'] =  299.7

tmp.loc[tmp['place_sur_long'].str.contains('福島ダ'), '直線距離'] =  295.7

#新潟
tmp.loc[tmp['place_sur_long'].str.contains('新潟ダ'), '直線距離'] =  354

tmp.loc[tmp['place_sur_long'].str.contains('新潟芝') & (tmp['芝(内・外)'] =='内') , '直線距離'] =  358.7 
tmp.loc[tmp['place_sur_long'].str.contains('新潟芝') & (tmp['芝(内・外)'] =='外') , '直線距離'] =  658.7
tmp.loc[tmp['place_sur_long'].str.contains('新潟芝1000') , '直線距離'] =  1000 #1行目とかぶるのでこれを最後に書くことでクリア

#中京
tmp.loc[tmp['place_sur_long'].str.contains('中京芝'), '直線距離'] =  412.5

tmp.loc[tmp['place_sur_long'].str.contains('中京ダ'), '直線距離'] =  410.7

#京都
tmp.loc[(tmp['place_sur_long'].str.contains('京都芝')) & (tmp['コース区分'] =='A') & (tmp['芝(内・外)'] =='内'), '直線距離'] =  328.4
tmp.loc[(tmp['place_sur_long'].str.contains('京都芝')) & (tmp['コース区分'] !='A') & (tmp['芝(内・外)'] =='内'), '直線距離'] =  323.4

tmp.loc[(tmp['place_sur_long'].str.contains('京都芝')) & (tmp['コース区分'] =='A') & (tmp['芝(内・外)'] =='外'), '直線距離'] =  403.7
tmp.loc[(tmp['place_sur_long'].str.contains('京都芝')) & (tmp['コース区分'] !='A') & (tmp['芝(内・外)'] =='外'), '直線距離'] =  398.7

tmp.loc[tmp['place_sur_long'].str.contains('京都ダ'), '直線距離'] =  329.1

#小倉
tmp.loc[tmp['place_sur_long'].str.contains('小倉芝'), '直線距離'] =  293

tmp.loc[tmp['place_sur_long'].str.contains('小倉ダ'), '直線距離'] =  291.3

#阪神
tmp.loc[(tmp['place_sur_long'].str.contains('阪神芝')) & (tmp['コース区分'] =='A') & (tmp['芝(内・外)'] =='内'), '直線距離'] =  356.5
tmp.loc[(tmp['place_sur_long'].str.contains('阪神芝')) & (tmp['コース区分'] =='B') & (tmp['芝(内・外)'] =='内'), '直線距離'] =  359.1

tmp.loc[(tmp['place_sur_long'].str.contains('阪神芝')) & (tmp['コース区分'] =='A') & (tmp['芝(内・外)'] =='外'), '直線距離'] =  473.6
tmp.loc[(tmp['place_sur_long'].str.contains('阪神芝')) & (tmp['コース区分'] =='B') & (tmp['芝(内・外)'] =='外'), '直線距離'] =  476.3

tmp.loc[tmp['place_sur_long'].str.contains('阪神ダ'), '直線距離'] =  352.7

長いですが要は直線距離を条件ごとに加えているだけです。ここはアナログ作業ですので要注意。

次にダートコースのスタートが芝かダートかについての情報を加えます。

#芝スタートに1('新潟ダ1200', '東京ダ1600','中山ダ1200','中京ダ1400','京都ダ1400','阪神ダ1400','阪神ダ2000')、ダートスタートに0をつける

tmp['ダートスタート(芝・ダ)'] = 0

tmp.loc[(tmp['place_sur_long'] == '福島ダ1150なしなし') | (tmp['place_sur_long'] == '新潟ダ1200なしなし') | (tmp['place_sur_long'] == '東京ダ1600なしなし') | (tmp['place_sur_long'] == '中山ダ1200なしなし') |\
       (tmp['place_sur_long'] == '中京ダ1400なしなし' )| (tmp['place_sur_long'] =='京都ダ1400なしなし') | (tmp['place_sur_long'] =='阪神ダ1400なしなし') | (tmp['place_sur_long'] =='阪神ダ2000なしなし') , 'ダートスタート(芝・ダ)'] = 1

ここは特に問題ないでしょう。

右周り・左周りも加えましょう。

#左右周りを追記 左を1とする
tmp['左右'] = 0
tmp.loc[(tmp['場所'] == '新潟') | (tmp['場所'] == '東京') | (tmp['場所'] == '中京'), '左右'] =  1

本当は1コーナーまでの距離なども追加してもいいでしょう。
平均ペースなどいくらでも応用は効くと思います。

ここまでのデータを確認しましょう。

#必要な列に限定
tmp = tmp[['place_sur_long','場所', '芝・ダ', '距離.1', 'コース区分', '芝(内・外)','直線距離','コーナー', 'ダートスタート(芝・ダ)', '左右']]

スクリーンショット 2020-07-19 2.29.45

これで一応はコースデータの作成は完了です。

このコースデータを作っておくと、以下のように成績データとコースデータを結合して活用できます。

スクリーンショット 2020-07-19 2.35.16

不明な点や改善すべき点があればコメントからお願いします。

今後の記事ではこのコースデータを活用したものをどんどん発信していくのでお楽しみに!吉田しげるでした。

この記事が気に入ったらサポートをしてみませんか?