Il y a une pièce de théâtre appelée POG dans les courses de chevaux. Il s'agit de devenir propriétaire d'un cheval fictif et de concourir pour l'activité de chevaux possédés. En général, le prix en argent gagné pendant la période allant du début au derby est souvent utilisé comme indice d'activité.
L'auteur fait du POG depuis environ 5 ans maintenant. Jusqu'à présent, j'ai choisi en quelque sorte de bons chevaux, en m'appuyant sur Aomoto, qui sortira chaque année vers avril.
Cependant, les résultats sont brillants et à la fin de cette année, seuls 2 sur 10 ont gagné.
Afin de surmonter cette situation où le gonflement ne monte pas, j'ai décidé de mettre mon cœur dans l'analyse des données. Cependant, l'auteur n'a pas les compétences nécessaires pour manipuler librement l'apprentissage automatique qui est populaire de nos jours. Par conséquent, le but immédiat est ici de trouver une relation causale entre les informations de base des chevaux (hangar, producteur, pedigree) et les prix remportés pendant la période POG.
Ce qui est important ici, c'est le "prix gagnant pendant la période POG". À ma connaissance, aucun site Web ne publie ces informations. Il y a peut-être des institutions qui l'offrent moyennant des frais, mais je ne veux pas le faire dans des situations où on ne sait pas si cela en vaudra la peine.
Par conséquent, ici, nous avons décidé de prendre les moyens d'acquérir des informations de base sur les chevaux et des données d'historique de course de netkeiba et de calculer le prix pendant la période POG en utilisant les données d'historique de course.
Le langage utilisé est Python. C'est juste quelque chose auquel je suis habitué.
Collectez des données sur les chevaux nés au cours des quatre années de 2010 à 2013. Ici, quatre années de données sont acquises en même temps par traitement parallèle de quatre cœurs. ~~ Cela dépend des spécifications de la machine, mais mon MBA a fini de collecter les données en une heure environ. ~~
MakeUmaDB_151229.py
#!/usr/bin/env python
# encoding: utf-8
import urllib2 as ul
import pandas as pd
import os
import time
import datetime
from lxml import html
import multiprocessing as mp
__PROC__ = 4
def MakeDir(dname):
if not os.path.exists(dname):
os.mkdir(dname)
print 'Make directory:%s' % dname
else:
print '%s is exist' % dname
return 0
def subMakeHorseDB(year):
# Set Directory
o_dname = 'horse_db'
MakeDir(o_dname)
# horse_prof
prof_keys = [
u'Nom du cheval',
u'Anniversaire',
u'Entraîneur',
u'Propriétaire de cheval',
u'Producteur',
u'Origine',
u'Prix de transaction Seri',
u'père',
u'mère',
u'Mère père',
u'Prix de la période POG_demi-période',
u'Prix de la période POG_Toute l'année'
]
# get Uma data from web site
base_url = 'http://db.netkeiba.com/horse/'
idx_from = 100000
idx_to = 111000
masta_d = {}
for idx in range(idx_from, idx_to + 1):
try:
# get html from web
time.sleep(10)
s_idx = str(year)+str(idx).zfill(6)
url = base_url + s_idx
src_html = ul.urlopen(url).read()# get html from url
root = html.fromstring(src_html)
# show progress
print 'idx: %s, (%d, %d/%d)' % (s_idx, year, idx, idx_to)
# not found db
if root.xpath('//title')[0].text.startswith(u'|'):
#print 'DB not found'
continue
# html parse
masta_d[s_idx] = {}
for prof in prof_keys:
if prof == u'Nom du cheval':
horse_name = root.xpath('//div[@class="horse_title"]')[0].text_content().split('\n')[1]
masta_d[s_idx][prof] = horse_name
elif prof == u'père':
masta_d[s_idx][prof] = root.xpath('//td[@rowspan="2"][@class="b_ml"]')[0].text_content().split('\n')[1]
elif prof == u'mère':
masta_d[s_idx][prof] = root.xpath('//td[@rowspan="2"][@class="b_fml"]')[0].text_content().split('\n')[1]
elif prof == u'Mère père':
masta_d[s_idx][prof] = root.xpath('//td[@class="b_ml"]')[2].text_content().split('\n')[1]
elif prof == u'Prix de la période POG_demi-période' or prof == u'Prix de la période POG_Toute l'année':
continue
elif prof == u'Anniversaire':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[0].text_content()
elif prof == u'Entraîneur':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[1].text_content()
elif prof == u'Propriétaire de cheval':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[2].text_content()
elif prof == u'Producteur':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[3].text_content()
elif prof == u'Origine':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[4].text_content()
elif prof == u'Prix de transaction Seri':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[5].text_content()
# calc POG prize
prize_all = 0.0
prize_half = 0.0
deadline_all = datetime.datetime.strptime('%d-07-01'%(year+3), '%Y-%m-%d')
deadline_half = datetime.datetime.strptime('%d-01-01'%(year+3), '%Y-%m-%d')
r_hist = root.xpath('//table[@class="db_h_race_results nk_tb_common"]')
if len(r_hist) == 0:
masta_d[s_idx][u'Prix de la période POG_demi-période'] = '%d' % prize_half
masta_d[s_idx][u'Prix de la période POG_Toute l'année'] = '%d' % prize_all
else:
r_hist_l = root.xpath('//table[@class="db_h_race_results nk_tb_common"]/tbody/tr')
for race in r_hist_l:
r_date = datetime.datetime.strptime(race.text_content().split('\n')[1],'%Y/%m/%d')
try:
prize = float(race.text_content().split('\n')[-2].replace(',',''))
except:
prize = 0.0
if r_date < deadline_all:
prize_all += prize
if r_date < deadline_half:
prize_half += prize
masta_d[s_idx][u'Prix de la période POG_demi-période'] = '%.2f' % prize_half
masta_d[s_idx][u'Prix de la période POG_Toute l'année'] = '%.2f' % prize_all
except:
pass
# make data frame
df = pd.DataFrame(masta_d).T
o_df = pd.DataFrame()
# sort columns
for prof in prof_keys:
o_df = pd.concat([o_df, df[prof]], axis=1)
o_df.index.name = 'Index'
o_fname = 'horse_prof_%d.csv' % year
o_fpath = os.path.join(o_dname, o_fname)
o_df.to_csv(o_fpath, encoding='utf-8')
def main():
year_l = [2010, 2011, 2012, 2013]
pool = mp.Pool(__PROC__)
pool.map(subMakeHorseDB, year_l)
if __name__ == '__main__':
main()
raw_input('Press Enter to Exit¥n')
Je veux trouver la loi de la victoire POG en pétrissant le fichier csv craché.
Recommended Posts