有馬記念をきっかけに機械学習を始める

# pythonを知る

# とりあえず馬のマスタデータを集める

```
# coding: UTF-8

# CSV
import csv

# 時間
from datetime import datetime
import time

# httpリクエスト
from urllib.parse import urlparse
import urllib.request, urllib.error
import requests

# htmlparse
from bs4 import BeautifulSoup

# pandas
import pandas as pd

# data init
data_scheme   = ['name', 'age', 'total_attend', 'bad_attend', 'good_rate']
csv_head      = ["名前", "年齢", "生涯出走回数", "4位以下になった回数", "1位から3位に入る打率"]
target_horses = ["ヤマカツエース", "キタサンブラック", "クイーンズリング", "ブレスジャーニー", "トーセンビクトリー", "サトノクロニクル", "シャケトラ", "レインボーライン", "サクラアンプルール", "シュヴァルグラン", "ルージュバック", "サトノクラウン", "ミッキークイーン", "スワーヴリチャード", "カレンミロティック", "サウンズオブアース"]

# CSV init
csv_lists = []
csv_lists.append(csv_head)

class Scrape:
    def current_time(self):
        # 現在の時刻を年、月、日、時、分、秒で取得します
        time = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        return time

    def create_search_horse_url(self, horse):
        # アクセスするURL
        search_template = 'https://keiba.yahoo.co.jp/directory/horsesearch/?status=1&fhn=&mhn=&mfhn=&mmhn=&tn=&on=&bn=&minage=&maxage=&hn='
        url_string = search_template + horse
        request_url = urlparse(url_string)
        query = urllib.parse.quote_plus(request_url.query, safe='=&')
        url = '{}://{}{}{}{}{}{}{}{}'.format(
            request_url.scheme, request_url.netloc, request_url.path,
            ';' if request_url.params else '', request_url.params,
            '?' if request_url.query else '', query,
            '#' if request_url.fragment else '', request_url.fragment)
        return url

class Horse:
    def get_attr(self, name):
        element = ''
        if name is 'name':
            element = soup.find("h1", class_="fntB").get_text()
        elif name is 'age':
            element = soup.find(id="dirTitName").find_all("p")[0].get_text()[-3:-2] # 今回は競走馬が1けたのためこれでOK
        elif name is 'total_attend':
            element = soup.find_all(class_="mgnBL")[0].find_all("td")[5].get_text()
        elif name is 'bad_attend':
            element = soup.find_all(class_="mgnBL")[0].find_all("td")[4].get_text()
        else:
            print("Marcos Vechionacci")
        return element

for i in range(len(target_horses)):
    scrape = Scrape()
    horse = Horse()

    # 1カラム目に時間を挿入します
    #csv_list.append(time_)
    url = scrape.create_search_horse_url(target_horses[i])
    res = requests.get(url)
    if res.status_code == 200:
        soup = BeautifulSoup(res.text, 'lxml')
        # aタグの取得
        r_horse_name = horse.get_attr('name')
        if r_horse_name == target_horses[i]:
            r_horse_age = horse.get_attr('age')
            r_horse_total_attend = horse.get_attr('total_attend')
            r_horse_bad_attend = horse.get_attr('bad_attend')
            r_horse_good_rate = 1 - float(int(r_horse_bad_attend)) / int(r_horse_total_attend)

            csv_list = [r_horse_name, r_horse_age, r_horse_total_attend, r_horse_bad_attend, r_horse_good_rate]
            csv_lists.append(csv_list)

df = pd.DataFrame(csv_lists, columns=data_scheme)
# CSV ファイル (employee.csv) として出力
df.to_csv("mst_horse.csv")

```

# 結果.csv

```
,name,age,total_attend,bad_attend,good_rate
0,名前,年齢,生涯出走回数,4位以下になった回数,1位から3位に入る打率
1,ヤマカツエース,5,7,6,0.1428571428571429
2,キタサンブラック,5,13,2,0.8461538461538461
3,クイーンズリング,5,8,6,0.25
4,ブレスジャーニー,3,1,1,0.0
5,トーセンビクトリー,5,3,3,0.0
6,サトノクロニクル,3,1,1,0.0
7,シャケトラ,4,4,4,0.0
8,レインボーライン,4,8,5,0.375
9,サクラアンプルール,6,2,2,0.0
10,シュヴァルグラン,5,7,3,0.5714285714285714
11,ルージュバック,5,9,8,0.11111111111111116
12,サトノクラウン,5,9,6,0.33333333333333337
13,ミッキークイーン,5,9,3,0.6666666666666667
14,スワーヴリチャード,3,2,1,0.5
15,カレンミロティック,9,8,5,0.375
16,サウンズオブアース,6,9,6,0.33333333333333337
```


ちょっと雑に始めてみて継続的に改修しようかと。

# 買ってみた
2-13-10 3連単
13-2-10 3連単
9       単勝

を100円ずつ

# 有馬記念の結果
2-3-10

大外れ。

# 次にやること
レース結果を元に解析することで有馬記念の反省を行う。