Python で 競馬予想 第5回(機械学習用の前処理 1)
pythonで競馬予想。これまでのバッグナンバーは下記です。今回は機械学習用の前処理にチャレンジです。Python で 競馬予想 第1回(データ取得編 scraping スクレイピング)Python で 競馬予想 第2回(HTML解析編)Python で 競馬予想 第3回(Python上でのデータ加工) Python で 競馬予想 第4回(Python上での配列定義) Python で 競馬予想 第5回(機械学習用の前処理 1)前回までで、配列まで到達できたので、あとは自由自在に配列をいじって、数値化すれば機械学習の前準備、いわゆる前処理が完成することになります。今回は数値化の前に競馬新聞のような表を作りたいと思います。前回までで馬柱を配列情報に変更するまで到達しました。(下記のような感じです。)これを数値情報にしていきます。私の場合は拾ってきた情報を、独自の評価基準をまとめたエクセル(と言っても大したものではないですが)を使って、競馬場情報、騎手情報を数値化します。<競馬場情報の読み込み><騎手情報の読み込み>簡単に言うと競馬場情報は自分の評価基準の走破タイム、末脚評価(3F)。騎手情報は、前走で乗った場合のポイント乗数、今回乗った場合のポイント乗数です。他にもペースや馬場状態の別表を用いました。まとめると下記のようになります。まずは基本情報です。左から、馬名、休養が何週、鞍上、斤量、予想される戦法となります。次にレース情報です。(前5走のレースデータです。下記はその中から1レースのみを記載)左から開催場所、レース名、芝ダの種別、距離、走破タイム、馬場状態、人気、騎手、斤量、レース時のポジション、3F上がりタイム、着差です。ここまでで、競馬新聞のようにはなったのですが、もう少し機械学習にかけられるようにデータを数値します。左から馬名、休養週、騎手、斤量、戦法、総合指数、1走前のレースの(距離等、ペース、馬場状態、走破タイム(秒表示)、上がり3Fタイム、鞍上、走破タイム指数、3F末脚指数、着差、1走前総合指数、レース名、頭数、位置取り)としました。これが5走前まで1行で表示されます。全プログラムは長くなってきたので割愛ですが、よく使った関数はFind(文字を検索し、見つけた場所を返すコマンドとmath.ceil(切り上げ)コマンドです。<findコマンド 下記だと芝のある場所返す><math.ceilコマンド 切り上げ>下記がプログラムの一部です。下のメイン関数からmake_race_info_4_2ndを呼んで(def定義)、コールバックをする処理をしています。サブルーチンも使えるようになったので冗長なプログラムがなくなって見やすくなりました。 次回は結果ファイルを読み込みしようかと思いましたが、そろそろ機械学習に入りたいのでスキップして、そちらを掲載します。<呼び出され側 サブルーチン>def make_race_info_4_2nd(BASIC_INFORMATION_2,RACE_INFORMATION_4,Race_horse_num,RACE_POSITION_INFORMATION_CALL) : #5走の情報データから馬の戦法(逃げ、先行、差し、追い込み)を決める。 for i in range(Race_horse_num): running_plan = [0,0,0,0] for j in range(5) : if RACE_INFORMATION_4[i][j][13] !=0 : for k in range(4) : if RACE_INFORMATION_4[i][j][13] == RACE_POSITION_INFORMATION_CALL[k][0] : running_plan[k] += 1 #print ('展開',i,j,k,running_plan[0],running_plan[1],running_plan[2],running_plan[3]) else : running_plan[1] += 1 # もし入っていなかったら先行として扱う #一番大きい先方が入っているindexをひろう BASIC_INFORMATION_2[i][4] = RACE_POSITION_INFORMATION_CALL[running_plan.index(max(running_plan))][0] #print (i,max(running_plan)) print ('make_race_info_4_2nd end') return BASIC_INFORMATION_2<メインプログラム ここでエクセルへの書き出し(csv)まで行います。>for iraceloop in range(len(url_info)) : url_text=url_info[iraceloop] str_race= url_text[len(url_text)-2:]+'R' print (str_race) lines_s1_ret,Race_name_ret,Race_place_ret,Race_horse_num_ret,Race_sort_ret,Race_distance_ret = web_scribe(url_text,str_race) BASIC_INFORMATION_ret,Race_INFORMATION_ret = make_race_info(lines_s1_ret,Race_horse_num_ret) BASIC_INFORMATION_2_ret,RACE_INFORMATION_2_ret = make_race_info_2_1st(BASIC_INFORMATION_ret,Race_INFORMATION_ret,Race_horse_num_ret) RACE_INFORMATION_2_2nd_ret = make_race_info_2_2nd(RACE_INFORMATION_2_ret,Race_horse_num_ret) RACE_INFORMATION_3_ret = make_race_info_3(RACE_INFORMATION_2_2nd_ret,Race_horse_num_ret) RACE_INFORMATION_4_1st_ret = make_race_info_4_1st(RACE_INFORMATION_3_ret,Race_horse_num_ret) BASIC_INFORMATION_2_2nd_ret = make_race_info_4_2nd(BASIC_INFORMATION_2_ret,RACE_INFORMATION_4_1st_ret,Race_horse_num_ret,RACE_POSITION_INFORMATION) RACE_INFORMATION_4_2nd_ret = make_race_info_4_3rd(RACE_INFORMATION_4_1st_ret,RACE_INFORMATION_3_ret,Race_horse_num_ret,Race_Place_list,RACE_CONDITION_INFORMATION,Race_Person_list) file_name=str_race+'_'+Race_name_ret+'_'+Race_place_ret+Race_sort_ret+str(Race_distance_ret)+".csv" if iraceloop == 0 : RACE_WRITE_1st_ret = make_write_1st() f = open(file_name, 'w', newline='' , encoding='utf_8_sig') writer = csv.writer(f) writer.writerows(RACE_WRITE_1st_ret) RACE_WRITE_2nd_ret = make_write_2nd(BASIC_INFORMATION_2_2nd_ret,RACE_INFORMATION_4_2nd_ret,Race_horse_num_ret,Race_Person_list) f = open(file_name, 'a', newline='' , encoding='utf_8_sig') writer = csv.writer(f) writer.writerows(RACE_WRITE_2nd_ret) f.close() print (iraceloop+1,'/',len(url_info),'出馬情報スクレイピング完了') print ('抽出完了',file_name)