Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

大外れ。

次にやること

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away