Es gibt ein Stück namens POG im Pferderennen. Dies soll ein fiktiver Pferdebesitzer werden und um die Aktivität von eigenen Pferden konkurrieren. Im Allgemeinen wird das Preisgeld, das in der Zeit vom Debüt bis zum Derby gewonnen wurde, häufig als Aktivitätsindex verwendet.
Der Autor macht seit ungefähr 5 Jahren POG. Bisher habe ich irgendwie gute Pferde ausgewählt und mich auf Aomoto verlassen, das jedes Jahr im April veröffentlicht wird.
Die Ergebnisse sind jedoch brillant und bis Ende dieses Jahres haben nur 2 von 10 gewonnen.
Um diese Situation zu überwinden, in der die Schwellung nicht ansteigt, habe ich mich entschlossen, mein Herz in die Datenanalyse zu stecken. Der Autor verfügt jedoch nicht über die Fähigkeiten, das heutzutage beliebte maschinelle Lernen frei zu manipulieren. Daher besteht das unmittelbare Ziel hier darin, einen kausalen Zusammenhang zwischen den grundlegenden Informationen von Pferden (Stall, Erzeuger, Stammbaum) und den während der POG-Periode gewonnenen Preisen zu finden.
Was hier wichtig ist, ist der "Gewinnerpreis während der POG-Periode". Soweit ich weiß, veröffentlicht keine Website diese Informationen. Vielleicht gibt es Institutionen, die es gegen eine Gebühr anbieten, aber ich möchte es nicht in Situationen tun, in denen unklar ist, ob es die Kosten wert ist.
Aus diesem Grund haben wir uns hier entschlossen, grundlegende Informationen zu Pferden und Daten zur Rennhistorie von Netkeiba zu erhalten und den Preis während des POG-Zeitraums anhand der Daten zur Rennhistorie zu berechnen.
Die verwendete Sprache ist Python. Das ist nur etwas, an das ich gewöhnt bin.
Sammeln Sie Daten zu Pferden, die in den vier Jahren von 2010 bis 2013 geboren wurden. Hier werden gleichzeitig Daten im Wert von vier Jahren durch parallele Verarbeitung von vier Kernen erfasst. ~~ Es hängt von den Maschinenspezifikationen ab, aber mein MBA hat die Datenerfassung in ungefähr einer Stunde abgeschlossen. ~~
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'Pferdename',
u'Geburtstag',
u'Trainer',
u'Pferdebesitzer',
u'Produzent',
u'Ursprung',
u'Seri Transaktionspreis',
u'Vater',
u'Mutter',
u'Mutter Vater',
u'POG-Preis_halbe Periode',
u'POG-Preis_Das ganze Jahr'
]
# 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'Pferdename':
horse_name = root.xpath('//div[@class="horse_title"]')[0].text_content().split('\n')[1]
masta_d[s_idx][prof] = horse_name
elif prof == u'Vater':
masta_d[s_idx][prof] = root.xpath('//td[@rowspan="2"][@class="b_ml"]')[0].text_content().split('\n')[1]
elif prof == u'Mutter':
masta_d[s_idx][prof] = root.xpath('//td[@rowspan="2"][@class="b_fml"]')[0].text_content().split('\n')[1]
elif prof == u'Mutter Vater':
masta_d[s_idx][prof] = root.xpath('//td[@class="b_ml"]')[2].text_content().split('\n')[1]
elif prof == u'POG-Preis_halbe Periode' or prof == u'POG-Preis_Das ganze Jahr':
continue
elif prof == u'Geburtstag':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[0].text_content()
elif prof == u'Trainer':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[1].text_content()
elif prof == u'Pferdebesitzer':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[2].text_content()
elif prof == u'Produzent':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[3].text_content()
elif prof == u'Ursprung':
masta_d[s_idx][prof] = root.xpath('//table[@class="db_prof_table"]/tr/td')[4].text_content()
elif prof == u'Seri Transaktionspreis':
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'POG-Preis_halbe Periode'] = '%d' % prize_half
masta_d[s_idx][u'POG-Preis_Das ganze Jahr'] = '%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'POG-Preis_halbe Periode'] = '%.2f' % prize_half
masta_d[s_idx][u'POG-Preis_Das ganze Jahr'] = '%.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')
Ich möchte das Gesetz des POG-Gewinns finden, indem ich die ausspuckende CSV-Datei knete.
Recommended Posts