Kazu Home Page

Aug 29, 2020
XML
カテゴリ: 競馬
pythonで競馬予想。これまでのバッグナンバーは下記です。今回は配列にチャレンジです。

Python で 競馬予想 第1回(データ取得編 scraping スクレイピング)
Python で 競馬予想 第2回(HTML解析編)
Python で 競馬予想 第3回(Python上でのデータ加工) ​ 
Python で 競馬予想 第4回(Python上での配列定義) ---  今回はここ。

​前回までで馬柱を抜き出す前段階まで到達しました。(下記のような感じです。)


ただ、まだこのままですと、メモ帳に書いてあるのと変わらないので、これを必要な配列に入れていく作業を今回はしたいと思います。まずは配列の定義です。DataFrameでも出来るのかもしれないですが、いろいろと調べるとリストの方が扱いやすそうだったので、リストで配列を定義しました。定義の仕方もいろいろありますが、箱を作るという事だけに専念するのであれば、今回の方法が一番良いと思います。コマンドは結構特殊です。



次にWEBデータを箱に詰めていきます。休養している馬もいるのでその場合は飛ばす処理を追加しています。

出来上がった基本出走馬情報です。

この中で私が使う情報は馬名、休養何週、鞍上、斤量のみなので、それだけ抜き出しました。きれいに並んだと思います。

次に前5走情報を処理します。


詳しいことは割愛しますが、Find関数は便利に使えます。これを使えば文字サーチできて、その場所を返すので非常に有用です。最初の馬の前走と最後の馬の5走前の情報が見事表示できました。レース場所、レース名、芝orダート、距離、走破タイム、馬場状態、頭数、鞍上、斤量、位置、上がり3Fデータを予想に使います。


次は機械学習するために数値化するための前処理をしたいと考えています。

今日のリスト

#馬柱情報を入力するリストを作成する。
# BASIC_INFORMATON[Race_horse_num,i] ... 基本情報
# 予想印,父、馬名、母、母の父、所属・厩舎、休養何週、馬体重、オッズ、人気順、馬齢、鞍上、斤量
#  0    1    2    3   4      5    6      7        8       9     10     11   12   13

# Race_INFORMATON[Race_horse_num,i,j] j --- x走前のレース情報
# 1走前 日付場所、着順、レース名、グレード、芝ダ距離・タイム・馬場状態、頭数・枠・人気・鞍上・斤量、位置・上がり・馬体重、1着馬・着差
#            0       1     2        3        4                        5                              6                7    
#                                :
# 5走前 日付場所、着順、レース名、グレード、芝ダ距離・タイム・馬場状態、頭数・枠・人気・鞍上・斤量、位置・上がり・馬体重、1着馬・着差
#            0       1     2        3        4                        5                              6                7 
#2次元、3次元配列宣言
BASIC_INFORMATION =  [[0 for i in range(13)] for j in range(Race_horse_num)]

Race_INFORMATION =  [[[0 for i in range(7)] for j in range(5)] for k in range(Race_horse_num)]

#すべて情報には”0”を代入している。リストの最大の個所が使えるかを閣員
print(BASIC_INFORMATION[Race_horse_num-1][12],Race_INFORMATION[Race_horse_num-1][4][6])



#WEBデータをリストに詰める作業を開始。休養だった場合は次のレースへ移動する。

line_count = 0
lines_s2=lines_s1

for i in range(Race_horse_num):
    for j in range(13) :
        str =lines_s2[line_count]
        BASIC_INFORMATION[i][j]=str
        line_count +=1
    for j in range(5) :
        for k in range(7) :
            break_flag = lines_s2[line_count].find('休養')
            if break_flag != -1 :   #休養だった場合、次のレースへ移動
                Race_INFORMATION[i][j][k]=lines_s2[line_count]
                line_count +=1
                k = 8
                break
            else :
                skip_flag_1 = lines_s2[line_count].find('芝')
                skip_flag_2 = lines_s2[line_count].find('ダ')
                skip_flag_3 = (k == 2)
                if (skip_flag_1 != -1 or skip_flag_2 !=-1) and (skip_flag_3 != 0) :
                    k=k+1
                    line_count -=1
                Race_INFORMATION[i][j][k]=lines_s2[line_count]       
                line_count +=1  
                for l in range(3):
                    if lines_s2[line_count].isdigit() : #半角整数はTrue
                        line_count +=1
                    else:
                        l = 300
                        break

line_count
#基本情報を必要な個所だけ抜き出す。
BASIC_INFORMATION_2 = [[0 for i in range(4)] for j in range(Race_horse_num)]
for i in range(Race_horse_num):
    BASIC_INFORMATION_2[i][0]=BASIC_INFORMATION[i][2]   #馬名
    BASIC_INFORMATION_2[i][1]=BASIC_INFORMATION[i][6]   #休養何週?
    BASIC_INFORMATION_2[i][2]=BASIC_INFORMATION[i][11]  #鞍上
    BASIC_INFORMATION_2[i][3]=BASIC_INFORMATION[i][12]  #斤量
BASIC_INFORMATION_2

#近5走の情報の表示で必要な情報をコピー
# Race_INFORMATON[Race_horse_num,i,j] j --- x走前
# 1走前 日付場所、レース名、グレード、芝ダ距離・タイム・馬場状態、頭数・枠・人気・鞍上・斤量、位置・上がり・馬体重、1着馬・着差
#            0    1                2  3     4       5       6              7    8     9    10      
#          [0]      [1]     [2]       [3]                     [4]                      [5]   [6]            [7]
RACE_INFORMATION_2 =  [[[0 for i in range(11)] for j in range(5)] for k in range(Race_horse_num)]
for i in range(Race_horse_num):
    for j in range(5) :
        RACE_INFORMATION_2[i][j][0]=Race_INFORMATION[i][j][0] #場所
        RACE_INFORMATION_2[i][j][1]=Race_INFORMATION[i][j][1] #Race名
        RACE_INFORMATION_2[i][j][2]=Race_INFORMATION[i][j][3] #芝 or ダ
        RACE_INFORMATION_2[i][j][3]=Race_INFORMATION[i][j][3] #距離
        RACE_INFORMATION_2[i][j][4]=Race_INFORMATION[i][j][3] #タイム
        RACE_INFORMATION_2[i][j][5]=Race_INFORMATION[i][j][3] #馬場状態
        RACE_INFORMATION_2[i][j][6]=Race_INFORMATION[i][j][4] #頭数
        RACE_INFORMATION_2[i][j][7]=Race_INFORMATION[i][j][4] #鞍上
        RACE_INFORMATION_2[i][j][8]=Race_INFORMATION[i][j][4] #斤量
        RACE_INFORMATION_2[i][j][9]=Race_INFORMATION[i][j][5] #位置取り
        RACE_INFORMATION_2[i][j][10]=Race_INFORMATION[i][j][5] #上がり       

RACE_INFORMATION_2

#文字の場所指定をすれば、MID$のような使い方が出来る。
# RACE_INFORMATION_2[i][j][0][11]
#find関数は文字がある場所を返す。ない場合は"-1"となる。
fd = RACE_INFORMATION_2[i][j][0].find('\xa0')
print (RACE_INFORMATION_2[i][j][0][11],':',fd,':',RACE_INFORMATION_2[i][j][0][fd+1])

for i in range(Race_horse_num):
    for j in range(5) :
        fd = RACE_INFORMATION_2[i][j][0].find('\xa0')
        if fd != -1 :
            RACE_INFORMATION_2[i][j][0]=RACE_INFORMATION_2[i][j][0][fd+1] #場所
        RACE_INFORMATION_2[i][j][1]=RACE_INFORMATION_2[i][j][1] #Race名
        if RACE_INFORMATION_2[i][j][2] != 0 :
            fd = RACE_INFORMATION_2[i][j][2].find('芝')
            if fd != -1 :
                RACE_INFORMATION_2[i][j][2]="芝" #芝 or ダ
                RACE_INFORMATION_2[i][j][3]=RACE_INFORMATION_2[i][j][3][fd+1:fd+5] #距離
                fd = RACE_INFORMATION_2[i][j][4].find(':')
                if fd != -1 :
                    RACE_INFORMATION_2[i][j][4]=RACE_INFORMATION_2[i][j][4][fd-1:fd+5] #タイム
                length =len(RACE_INFORMATION_2[i][j][5])
                RACE_INFORMATION_2[i][j][5]=RACE_INFORMATION_2[i][j][5][length-1]               
            fd = RACE_INFORMATION_2[i][j][2].find('ダ')
            if fd != -1 :
                RACE_INFORMATION_2[i][j][2]="ダ" #芝 or ダ
                RACE_INFORMATION_2[i][j][3]=RACE_INFORMATION_2[i][j][3][fd+1:fd+5] #距離
                fd = RACE_INFORMATION_2[i][j][4].find(':')
                if fd != -1 :
                    RACE_INFORMATION_2[i][j][4]=RACE_INFORMATION_2[i][j][4][fd-1:fd+5] #タイム
                length =len(RACE_INFORMATION_2[i][j][5])
                RACE_INFORMATION_2[i][j][5]=RACE_INFORMATION_2[i][j][5][length-1]
        if RACE_INFORMATION_2[i][j][6] != 0 :
            fd = RACE_INFORMATION_2[i][j][6].find('頭')
            if fd != -1 :
                RACE_INFORMATION_2[i][j][6]=RACE_INFORMATION_2[i][j][6][:fd] #頭数
                fd1 = RACE_INFORMATION_2[i][j][7].find('人')
                fd2 = RACE_INFORMATION_2[i][j][7].find('.')
                RACE_INFORMATION_2[i][j][7]=RACE_INFORMATION_2[i][j][7][fd1+1:fd2-2] #鞍上
                length =len(RACE_INFORMATION_2[i][j][8])
                RACE_INFORMATION_2[i][j][8]=RACE_INFORMATION_2[i][j][8][length-4:] #斤量
        if RACE_INFORMATION_2[i][j][9] != 0 :
            fd = RACE_INFORMATION_2[i][j][9].find('\xa0(')
            if fd != -1 :
                RACE_INFORMATION_2[i][j][9]=RACE_INFORMATION_2[i][j][9][:fd] #位置取り
                RACE_INFORMATION_2[i][j][10]=RACE_INFORMATION_2[i][j][10][fd+2:fd+6] #上がり       

#欲しいところを取り出した情報 最初の馬の、もっとも最近のレースと、最後の馬の最古のレース情報を表示
#ずれていないか確認
print(RACE_INFORMATION_2[0][0],":",RACE_INFORMATION_2[Race_horse_num-1][4])







お気に入りの記事を「いいね!」で応援しよう

Last updated  Aug 29, 2020 01:13:21 PM
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

PR

Free Space

設定されていません。

Calendar

Comments

kazu_x68k @ Re[1]:2021年ブログ初め 文字化け解消(01/04) グリ太さんへ 遅くなりましたが、明けまし…
グリ太 @ Re:2021年ブログ初め 文字化け解消(01/04) 明けましておめでとうございます。今年も…
グリ太 @ Re:Python で 競馬予想 実践第10回 チャンピオンズカップ他(12/06) 私も相手探しだとは思うのですが、川田がG…
kazu_x68k @ Re[1]:Python で 競馬予想 実践第8回 ジャパンカップ他(11/28) グリ太さんへ さすがに3強には勝てなかっ…

Favorite Blog

ごった煮 グリ太さん
趣味のDVDと投資… チャック・ハウアさん
 TM万太郎の なまら… TM万太郎さん

Archives

Dec , 2024
Nov , 2024
Oct , 2024
Sep , 2024
Aug , 2024

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: