Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~

introduction

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é.

Code source

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')

à partir de maintenant

Je veux trouver la loi de la victoire POG en pétrissant le fichier csv craché.

Recommended Posts

Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~
Analyse des données pour améliorer POG 2 ~ Analyse avec le notebook jupyter ~
Analyse de données pour améliorer POG 3 ~ Analyse de régression ~
Grattage WEB avec Python (pour mémo personnel)
[Pour les débutants] Essayez le web scraping avec Python
Analyse de données avec python 2
Analyse de données avec Python
[Python] Flux du scraping Web à l'analyse des données
Web scraping avec python + JupyterLab
Python pour l'analyse des données Chapitre 4
Python pour l'analyse des données Chapitre 2
Web scraping débutant avec python
Python pour l'analyse des données Chapitre 3
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Modèle de prétraitement pour l'analyse des données (Python)
Web scraping pour les débutants en Python (1)
Analyse de données à partir de python (visualisation de données 1)
Web scraping pour les débutants en Python (4) -1
Analyse de données à partir de python (visualisation de données 2)
Grattage avec Python
Outil de visualisation Python pour le travail d'analyse de données
Grattage avec Python
Analyse de données python
Premiers pas avec Python Web Scraping Practice
[Note personnelle] Scraping de pages Web en python3
Site de courses de chevaux Web scraping avec Python
Premiers pas avec Python Web Scraping Practice
Analyse de données à partir de python (pré-traitement des données-apprentissage automatique)
Pratiquer le web scraping avec Python et Selenium
Scraping Web facile avec Python et Ruby
Préparation au grattage au python [Saveur chocolat]
Créer un Ubuntu de démarrage USB avec un environnement Python pour l'analyse des données
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: chargement des données
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)
Extraire des données d'une page Web avec Python
Grattage en Python (préparation)
Essayez de gratter avec Python.
Présentation de l'analyse de données python
Grattage avec Python + PhantomJS
Analyse vocale par python
Modèle d'analyse de données Python
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Analyse vocale par python
Scraping RSS avec Python
Acquisition de données à partir de l'API d'analyse avec l'application Web Client API Google pour python Partie 2
Analysez les informations de prix bas du chèque-cadeau Amazon avec Web scraping & R avec Python
Web scraping pour les débutants en Python (1) Version améliorée
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Note de lecture: Introduction à l'analyse de données avec Python
Construction d'un environnement d'analyse de données avec Python (notebook IPython + Pandas)
Scrapage Web rapide avec Python (tout en prenant en charge le chargement JavaScript)
Défiez l'analyse des composants principaux des données textuelles avec Python