【Python】netkeibaから競馬データをスクレイピングする方法

Python

今回の記事ではPythonをつかって競馬データをスクレイピングする方法が書いてあります。

  • Pythonを使ったスクレイピングの流れやコードが見たい
  • netkeibaからデータを取得したい
  • スクレイピングしたいけどコードの意味がよくわからない

という方にはオススメな内容となっています。

netkeibaからのスクレイピングはスクレイピング初心者でもできるくらいの内容だと思っています。

この記事を読んで「俺にもできそうかも」と思ってもらえたら嬉しいです。

それではいきましょう。

取得したい競馬データ

2015年から2021年までに名古屋競馬場で開催されたレースデータを取得します。

競馬情報サイトの「netkeiba」から得たレース情報(結果や過去の出馬表など)を1つのデータフレームにまとめてデータセットにするのが狙いです。

データ元netkeiba
期間2015年から2021年まで
競馬場名古屋競馬場(地方競馬)
取得するデータレース情報、結果、出馬表

作業の流れ

この記事で説明するデータ取得作業の流れはこんな感じです。

  1. 開催日程からレース開催日を取得
  2. 結果ページからデータを取得
  3. 出馬表ページからデータを取得
  4. データを1つにまとめる

1つ1つ丁寧に説明しますので、ついてきてください。

開催日程からレース開催日を取得

引用:https://nar.netkeiba.com/top/calendar.html?jyo_cd=48

まずはnetkeibaにある「開催一覧」ページからその月の何日にレースが開催されるのか取得し、リストに入れたいと思います。

画像にあるように、名古屋競馬場のページにいくとレースがある日に「名古屋」の文字が入っていることが確認できたので、今回はそれを利用しました。

URLから赤枠のカレンダー部分を取り出すにはpandasのread_html()で一発です。

#ライブラリのインポート
import pandas as pd

url_cal = 'https://nar.netkeiba.com/top/calendar.html?jyo_cd=48'
df_cal = pd.read_html(url_cal)[0]

このままだとデータフレーム型なので、扱いやすい(個人的に)ようにリスト形式にしていきます。

list_cal = [str(a) for a in sum(df_cal.values.tolist(),[])]

list_calはさきほど取り出したデータフレームを文字列のリスト化したもの。

df_cal.values.tolist()でデータフレームをリスト化できるのですが、これだと2次元配列なのでちょっと使いづらいです。(これも個人的にですが)

使いやすいようにsum(df_cal.values.tolist(),[])で1次元配列にします。

それをリスト内包表記を使って文字列にしながらlist_calをつくりました。

df_cal.values.tolist()
--> [[nan, nan, '1', '2', '3', 4.0, 5.0], [6.0, '7 名古屋 重', '8 名古屋', '9 名古屋', '10 名古屋', 11.0, 12.0], [13.0, '14', '15', '16', '17', 18.0, 19.0], [20.0, '21 名古屋', '22 名古屋', '23 名古屋 重', '24 名古屋', 25.0, 26.0], [27.0, '28', '29', '30', nan, nan, nan]]

sum(df_cal.values.tolist(),[])
--> [nan, nan, '1', '2', '3', 4.0, 5.0, 6.0, '7 名古屋 重', '8 名古屋', '9 名古屋', '10 名古屋', 11.0, 12.0, 13.0, '14', '15', '16', '17', 18.0, 19.0, 20.0, '21 名古屋', '22 名古屋', '23 名古屋 重', '24 名古屋', 25.0, 26.0, 27.0, '28', '29', '30', nan, nan, nan]

list_cal = [str(a) for a in sum(df_cal.values.tolist(),[])]
list_cal
--> ['nan', 'nan', '1', '2', '3', '4.0', '5.0', '6.0', '7 名古屋 重', '8 名古屋', '9 名古屋', '10 名古屋', '11.0', '12.0', '13.0', '14', '15', '16', '17', '18.0', '19.0', '20.0', '21 名古屋', '22 名古屋', '23 名古屋 重', '24 名古屋', '25.0', '26.0', '27.0', '28', '29', '30', 'nan', 'nan', 'nan']

list_calを使い、またリスト内包表記によって「名古屋」が含まれる文字列を新しいリストlist_dayに加えていきます。

list_day = [i.split()[0].zfill(2) for i in list_cal if '名古屋' in i]

list_day
--> ['07', '08', '09', '10', '21', '22', '23', '24']

開催一覧からレースのある日を取り出すことができました。

結果ページからデータを取得

引用:https://nar.netkeiba.com/race/result.html?race_id=202248060701&rf=race_list

次は、結果ページから2つのデータを取得します。

  • レースの詳細情報(画像の上側)
  • レースの結果表(画像の下側)

さきにレースの結果表から説明します。

なぜなら先ほど使ったpandasのread_html()を使えば同じように一発だからです。

url_result = 'https://nar.netkeiba.com/race/result.html?race_id=202248060701&rf=race_list'

df_result = pd.read_html(url_result)[0]

df_result
-->
   着順  枠  馬番         馬名  性齢    斤量     騎手     タイム   着差  人気  単勝オッズ   後3F      厩舎  馬体重(増減)
0   1  8   9  ラインストライカー  牡3  56.0   大畑雅章  1:37.6  NaN   2    5.3  40.5  愛知安部幸夫  485(-5)
1   2  1   1  フォートウィリアム  牡3  56.0    岡部誠  1:37.7   クビ   1    1.2  40.7  愛知安部幸夫  515(-2)
2   3  2   2   ウマイウマスギル  牡3  55.0  ☆細川智史  1:39.5    9   3   10.4  41.4  愛知坂口義幸  418(-3)
3   4  4   4        ゼアル  牝3  52.0    宮下瞳  1:39.5   ハナ   4   16.8  42.1  愛知藤ヶ崎一  421(+2)
4   5  7   7    ワイジーコマチ  牝3  54.0   加藤聡一  1:39.9    2   6  104.5  41.5   愛知榎屋充  449(+7)
5   6  5   5   エイシンルーキー  牡3  56.0    柿原翔  1:40.9    5   5   21.3  43.1  愛知藤ヶ崎一  484(+2)
6   7  6   6   エイシンウクラン  牝3  54.0   加藤利征  1:41.9    5   9  169.5  43.3  愛知錦見勇夫  356(+3)
7   8  8   8   アップモンスター  牝3  54.0   友森翔太  1:42.8    4   8  129.8  45.3  愛知井手上慎  450(+4)
8   9  3   3    レディウィット  牝3  53.0  ☆浅野皓大  1:43.0    1   7  120.2  43.6  愛知今津勝之   398(0)

もうひとつ「レースの詳細情報」にいきましょう。

この部分はテーブル(表)の形をしていないのでread_htmlが使えません。

そこでBeautifulSoupを使ってスクレイピングしていきます。

BeautifulSoupはタグやクラスなどの情報からデータを取得できます。

import requests
from bs4 import BeautifulSoup
import re

r = requests.get(url_result)
soup = BeautifulSoup(r.content, 'html.parser')
data1 = soup.find('div', class_='RaceData01').text
#距離
dis = re.findall(r'\d+', data1)[2]
#フィールド
field = data1[data1.find('/')+2 : data1.find('/')+3]
#馬場
condition = data1[data1.find('馬場')+3 : data1.find('馬場')+4]

dis
--> 1500

field
--> ダ

condition
--> 重

soupをつくるまでは呪文のようなものですね。

data1はsoupからdivタグのclass名が「RaceData01」というものを探してテキスト化してつくります。

タグやクラスの確認はChromeのディベロッパー検証が使えますよ。

要素を調べたい箇所を右クリックし、「検証」とクリックすると画面右側にディベロッパーツールが出てきます。

HTMLやCSSといった他の言語の知識がないとわかりづらいと思いますが、タグで囲ってある箇所をfindで指定すればデータを取れることは覚えておきましょう。

出馬表ページからデータを取得

引用:https://nar.netkeiba.com/race/shutuba_past.html?race_id=202248060701&rf=shutuba_submenu

最後に出馬表ページからのデータ取得です。

出馬表の馬柱(5走)というところには、レースに出場する馬が過去5レースでどのような成績だったのかが書いてあります。

過去レースの内容や結果はレース予想には必須なので、しっかり取得しておきたいと思います。

url_past = 'https://nar.netkeiba.com/race/shutuba_past.html?race_id=202248060701&rf=race_list'

df_past = pd.read_html(url_past)[0]

画像を見ておわかりの人も多いでしょうが、このパターンはpandasのread_htmlで一発ですね。

データを1つにまとめる

結果ページと出馬表ページから取得したデータを1つにまとめて新しいデータフレームdf_result_pastに入れたいと思います。

データフレームをまとめる(結合する)ときにはmerge関数が便利です。

df_result_past = pd.merge(df_result, df_past, on='馬番')
df_result_past['距離'] = dis
df_result_past['フィールド'] = field
df_result_past['馬場'] = condition
df_result_past['レースID'] = '202248060701'

merge関数をつかえば、2つのデータフレームを横方向に結合することができます。

今回、注意しないといけないのは結果表ページと出馬表ページのデータの順番が違っていることです。

画像を見てもらえてばわかるのですが、結果表ページでは1着から順に、出馬表ページでは馬番の順になっています。

なのでこのまま結合してしまうとデータが噛み合いません。

それを防ぐために、merge関数のなかでon=’馬番’」とし、「馬番をキーにして結合する」という処理にしました。

あとは

  • 距離
  • フィールド
  • 馬場
  • レースID

をデータフレームに追加するだけです。

結果的にdf_result_pastの中身はこうなりました。(見づらくてスミマセン)


着順枠_x馬番馬名性齢斤量騎手タイム着差人気単勝オッズ後3F厩舎馬体重(増減)枠_y馬名 オッズ騎手斤量前走2走3走4走5走距離フィールド馬場レースID
0189ラインストライカー牡356.0大畑雅章1:37.6
25.340.5愛知安部幸夫485(-5)8
コパノリッキー ラインストライカー サンキャッチャー (シンボリクリスエス) 愛知・安部幸夫 中1週 485kg(-5)  5.3 (2人気)牡3黒鹿 大畑雅 56.02022.05.27 名古屋 2 3歳8組 ダ1500 1:37.0 不 11頭 1番 2人 大畑雅章 56.0 6-8-2 (39.4) 490(0) ラクレット(0.4)2022.05.19 名古屋 4 3歳8組 ダ1500 1:39.2 良 11頭 3番 2人 大畑雅章 56.0 7-6-7 (39.7) 490(-3) サリヴァン(0.8)2022.05.05 名古屋 5 3歳7組 ダ1500 1:38.1 良 12頭 9番 2人 大畑雅章 56.0 8-8-6 (39.5) 493(+1) サヴァンナナイツ(1.1)2022.04.25 名古屋 2 3歳7組 ダ1500 1:39.5 重 10頭 10番 6人 大畑雅章 56.0 5-4-3 (41.4) 492(-7) アカクマドリ(0.9)2022.04.13 名古屋 5 3歳8組 ダ1500 1:41.1 良 12頭 3番 6人 丹羽克輝 56.0 7-4-3 (42.2) 499(+7) ルブアルハリ(1.3)1500202248060701
1211フォートウィリアム牡356.0岡部誠1:37.7クビ11.240.7愛知安部幸夫515(-2)1
モーリス フォートウィリアム シーリーコート (Distorted Humor) 愛知・安部幸夫 連闘 515kg(-2)  1.2 (1人気)牡3栗 岡部誠 56.02022.05.30 名古屋 1 3歳12組 ダ1500 1:37.4 良 9頭 4番 1人 岡部誠 56.0 6-4-2 (39.6) 517(+7) フライシュッツ(-0.9)2022.05.01 阪神 10 3歳未勝利 芝2400(外) 2:33.0 稍 12頭 12番 12人 酒井学 56.0 11-11-12-12 (38.0) 510(-10) スズノマーベリック(3.4)2022.04.16 阪神 14 3歳未勝利 ダ2000 2:13.2 稍 16頭 11番 13人 角田大河 53.0 13-13-14-14 (40.6) 520(-8) オブジェダート(4.0)2022.01.09 中京 12 3歳未勝利 ダ1900 2:05.9 良 15頭 8番 10人 西村淳也 56.0 14-13-8-12 (41.3) 528(-2) サンライズジャスト(4.0)2021.12.26 阪神 7 2歳新馬 ダ1800 2:00.3 良 16頭 16番 10人 西村淳也 55.0 12-12-12-10 (40.9) 530(0) オステリア(2.5)1500202248060701
2322ウマイウマスギル牡355.0☆細川智史1:39.59310.441.4愛知坂口義幸418(-3)2
オウケンブルースリ ウマイウマスギル キューバンマンボ (スズカマンボ) 愛知・坂口義幸 中1週 418kg(-3)  10.4 (3人気)牡3鹿 細川智 55.02022.05.27 名古屋 3 3歳7組 ダ1500 1:37.4 不 11頭 5番 3人 細川智史 55.0 10-8-7 (39.7) 421(+1) メイショウクモジ(0.7)2022.05.19 名古屋 2 3歳8組 ダ1500 1:38.4 良 11頭 6番 5人 細川智史 55.0 4-4-3 (39.0) 420(-19) サリヴァン(0.0)2022.05.05 名古屋 4 3歳8組 ダ1500 1:39.1 良 10頭 7番 2人 細川智史 55.0 7-7-6 (39.7) 439(+9) チーママ(1.1)2022.04.25 名古屋 2 3歳9組 ダ1500 1:39.3 重 12頭 5番 10人 細川智史 55.0 9-9-5 (39.8) 430(-2) レクシー(0.0)2022.04.13 名古屋 11 3歳9組 ダ1500 1:42.8 良 12頭 2番 9人 柿原翔 56.0 11-11-11 (41.8) 432(+2) プロボノ(5.5)1500202248060701
3444ゼアル牝352.0宮下瞳1:39.5ハナ416.842.1愛知藤ヶ崎一421(+2)4
アドマイヤムーン ゼアル グリーンアイズII (Green Desert) 愛知・藤ヶ崎一 中1週 421kg(+2)  16.8 (4人気)牝3芦 宮下瞳 52.02022.05.27 名古屋 4 3歳7組 ダ1500 1:37.6 不 11頭 7番 7人 宮下瞳 52.0 7-7-6 (40.2) 419(-3) メイショウクモジ(0.9)2022.05.19 名古屋 3 3歳8組 ダ1500 1:38.7 良 11頭 11番 4人 宮下瞳 52.0 6-3-4 (39.5) 422(0) サリヴァン(0.3)2022.05.05 名古屋 4 3歳7組 ダ1500 1:38.0 良 12頭 12番 7人 宮下瞳 52.0 6-6-4 (39.6) 422(-2) サヴァンナナイツ(1.0)2022.04.22 名古屋 9 3歳6組 ダ1500 1:41.1 重 12頭 11番 5人 宮下瞳 52.0 2-2-4 (44.0) 424(+2) メッチャサス(2.1)2022.04.12 名古屋 7 3歳6組 ダ1500 1:42.3 良 12頭 11番 3人 宮下瞳 52.0 2-2-6 (43.3) 422(+6) ロバリアスピード(2.9)1500202248060701
4577ワイジーコマチ牝354.0加藤聡一1:39.926104.541.5愛知榎屋充449(+7)7
エスケンデレヤ ワイジーコマチ パリスブルー (ゼンノロブロイ) 愛知・榎屋充 中2週 449kg(+7)  104.5 (6人気)牝3栗 加藤聡 54.02022.05.19 名古屋 8 3歳7組 ダ1500 1:40.0 良 11頭 6番 9人 加藤聡一 54.0 9-9-9 (40.9) 442(-4) ディラック(1.3)2022.05.05 名古屋 8 3歳6組 ダ1500 1:40.0 良 12頭 2番 8人 加藤聡一 54.0 11-11-9 (40.2) 446(+1) アイファーラニオー(2.5)2022.04.22 名古屋 6 3歳5組 ダ1500 1:40.3 重 12頭 11番 8人 丸山真一 54.0 7-7-9 (41.9) 445(-2) プロボノ(1.9)2022.04.11 名古屋 6 3歳5組 ダ1500 1:40.7 良 12頭 12番 12人 木之前葵 52.0 7-6-4 (42.3) 447(+6) ビッグベッター(2.2)2022.02.02 名古屋 9 3歳4組 ダ1400 1:37.3 良 11頭 5番 9人 木之前葵 52.0 8-8-10 (42.7) 441(-3) マボンヌ(3.7)1500202248060701
5655エイシンルーキー牡356.0柿原翔1:40.95521.343.1愛知藤ヶ崎一484(+2)5
ザファクター エイシンルーキー エイシンフレア (エイシンデピュティ) 愛知・藤ヶ崎一 中1週 484kg(+2)  21.3 (5人気)牡3鹿 柿原翔 56.02022.05.27 名古屋 6 3歳7組 ダ1500 1:38.3 不 11頭 11番 6人 柿原翔 56.0 1-1-1 (42.3) 482(-2) メイショウクモジ(1.6)2022.05.19 名古屋 3 3歳7組 ダ1500 1:39.0 良 11頭 7番 5人 柿原翔 56.0 1-1-1 (42.5) 484(+1) ディラック(0.3)2022.05.05 名古屋 3 3歳7組 ダ1500 1:38.0 良 12頭 7番 5人 柿原翔 56.0 2-2-2 (40.7) 483(+4) サヴァンナナイツ(1.0)2022.04.22 名古屋 4 3歳6組 ダ1500 1:40.3 重 12頭 12番 7人 柿原翔 56.0 3-3-3 (43.2) 479(-1) メッチャサス(1.3)2022.04.12 名古屋 6 3歳6組 ダ1500 1:41.4 良 12頭 3番 6人 村上弘樹 56.0 5-7-8 (41.8) 480(+12) ロバリアスピード(2.0)1500202248060701
6766エイシンウクラン牝354.0加藤利征1:41.959169.543.3愛知錦見勇夫356(+3)6
エイシンアポロン エイシンウクラン エイシンシルダリア (キングカメハメハ) 愛知・錦見勇夫 中1週 356kg(+3)  169.5 (9人気)牝3栗 加藤利 54.02022.05.26 名古屋 10 3歳6組 ダ1500 1:44.3 良 10頭 1番 9人 大畑雅章 54.0 9-10-10 (43.4) 353(+1) ザビッグマン(7.6)2022.05.17 名古屋 12 3歳6組 ダ1500 1:41.8 良 12頭 11番 12人 加藤利征 54.0 11-11-11 (42.6) 352(+2) サトミン(4.6)2022.05.05 名古屋 11 3歳5組 ダ1500 1:41.6 良 12頭 5番 11人 浅野皓大 53.0 10-11-11 (42.8) 350(0) ブルーインサニティ(5.3)2022.04.22 名古屋 10 3歳5組 ダ1500 1:42.1 重 12頭 12番 10人 浅野皓大 52.0 11-10-10 (42.8) 350(-2) プロボノ(3.7)2022.04.11 名古屋 12 3歳5組 ダ1500 1:44.9 良 12頭 1番 11人 大畑雅章 54.0 11-12-12 (43.9) 352(+4) ビッグベッター(6.4)1500202248060701
7888アップモンスター牝354.0友森翔太1:42.848129.845.3愛知井手上慎450(+4)8
バトルプラン アップモンスター スピネッタ (シンボリクリスエス) 愛知・井手上慎 中1週 450kg(+4)  129.8 (8人気)牝3栗 友森翔 54.02022.05.27 名古屋 10 3歳7組 ダ1500 1:42.1 不 11頭 9番 8人 加藤聡一 54.0 3-4-9 (45.1) 446(-3) メイショウクモジ(5.4)2022.05.17 名古屋 10 3歳6組 ダ1500 1:41.3 良 12頭 3番 9人 友森翔太 54.0 10-10-8 (42.5) 449(+4) サトミン(4.1)2022.05.05 名古屋 10 3歳6組 ダ1500 1:40.6 良 12頭 8番 10人 戸部尚実 54.0 6-5-7 (42.6) 445(-5) アイファーラニオー(3.1)2022.04.22 名古屋 11 3歳5組 ダ1500 1:43.6 重 12頭 8番 6人 友森翔太 54.0 3-3-8 (45.6) 450(0) プロボノ(5.2)2022.04.11 名古屋 10 3歳5組 ダ1500 1:44.1 良 12頭 8番 10人 友森翔太 54.0 5-4-9 (46.1) 450(-9) ビッグベッター(5.6)1500202248060701
8933レディウィット牝353.0☆浅野皓大1:43.017120.243.6愛知今津勝之398(0)3
ダノンレジェンド レディウィット プレイガール (Caerleon) 愛知・今津勝之 中1週 398kg(0)  120.2 (7人気)牝3鹿 浅野皓 53.02022.05.26 名古屋 8 3歳6組 ダ1500 1:40.6 良 10頭 10番 10人 浅野皓大 53.0 9-9-9 (40.4) 398(+3) ザビッグマン(3.9)2022.05.17 名古屋 11 3歳6組 ダ1500 1:41.6 良 12頭 7番 11人 浅野皓大 53.0 8-9-10 (43.0) 395(+1) サトミン(4.4)2022.03.09 名古屋 9 ありがとう ダ1400 1:37.0 良 10頭 2番 9人 浅野皓大 52.0 9-9-10 (40.8) 394(+3) リヤンフォルス(4.3)2022.03.02 名古屋 10 風雅16歳 ダ1400 1:37.8 稍 11頭 4番 10人 浅野皓大 52.0 7-7-9 (43.1) 391(-7) ヴァルゴ(2.4)2022.02.02 名古屋 10 3歳4組 ダ1400 1:37.3 良 11頭 9番 10人 浅野皓大 52.0 11-11-11 (42.0) 398(+8) マボンヌ(3.7)1500202248060701

全コード

これまでの作業をまとめ、2015年から2021年のレースデータを取得するコードはこうなりました。

#ライブラリのインポート
import pandas as pd
import requests
from bs4 import BeautifulSoup
import re

df_shutuba = pd.DataFrame()

for year in range(2015,2022):
    for month in range(1,13):
        url_cal = 'https://nar.netkeiba.com/top/calendar.html?year={}&month={}&jyo_cd=48'.format(str(year),str(month))

        df_cal = pd.read_html(url_cal)[0]
        list_cal = [str(a) for a in sum(df_cal.values.tolist(), [])]
        list_day = [i.split()[0].zfill(2) for i in list_cal if '名古屋' in i]


        for day in list_day:
            for race_no in range(1,13):
                race_id = '{}48{}{}{}'.format(str(year), str(month).zfill(2), day, str(race_no).zfill(2))
                url_race = 'https://nar.netkeiba.com/race/result.html?race_id={}&rf=race_list'.format(race_id)
                url_past = 'https://nar.netkeiba.com/race/shutuba_past.html?race_id={}&rf=shutuba_submenu'.format(race_id)
                print(url_race)
                try:
                    df_result = pd.read_html(url_race)[0]
                    df_past = pd.read_html(url_past)[0]
                    df_result_past = pd.merge(df_result, df_past, on='馬番')
                    
                    r = requests.get(url_race)
                    soup = BeautifulSoup(r.content, 'html.parser')
                    data1 = soup.find('div', class_='RaceData01').text
                    df_result_past['距離'] = re.findall(r'\d+', data1)[2]
                    df_result_past['フィールド'] = data1[data1.find('/')+2: data1.find('/')+3]
                    df_result_past['馬場'] = data1[data1.find('馬場')+3: data1.find('馬場')+4]
                except:
                    continue
                df_result_past['レースID'] = race_id
                df_shutuba= pd.concat([df_shutuba, df_result_past])

このコードによってdf_shutubaというデータフレームにすべてのデータが入ることになります。

データセットの完成です。

このようにデータを取得し、機械学習に使えるようデータを処理する作業にシフトしていきます。

たくさんのfor文(ループ処理)が出てきて混乱してしまうかもしれませんが、プログラミングでループ処理はまず抑えておきたい内容の1つです。

がんばって勉強していきましょう。

いきなりこれくらい複雑なコードを書くのは初心者にはむずかしいですよね。(僕もまだ無理です)

僕がコードを書くとき気をつけているのは「小さい作業から書いていく」ということです。

「2015年から2021年のデータが欲しいけど、まずは1レース分のデータを取ることから始める」とか「カッコいい書き方ではないけれど、1つずつ中身を表示して確認しながら進む」とか。

何から書いていいかわからなくなる人は、1歩1歩進んでいくイメージで書いていきましょう。

まとめ

この記事では競馬情報サイト「netkeiba」からスクレイピングする方法を書きました。

おさえておきたいポイントは次の3つです。

  • 表データがあるならpandasのread_htmlが最強
  • read_html以外ならBeautifulSoupを使えば大丈夫
  • コードは小さい作業から書いていく

1年分のデータを取る前にまずは1日分、いや1レース分から始めてみましょう。

小さな作業の積み重ねを大きくするのは割とカンタンです。それがプログラミングの良いところであり、おもしろいところでもありますね。

僕もまだまだわからないことだらけなので、引き続き勉強していきたいと思います。

それではまた。

コメント

  1. まこちゃん より:

    地方競馬に興味が出てなかなか勝てないので機械学習で予測できないか探していたところこちらにたどり着きました。
    こちらは名古屋の2015年から2022年を参照していました。
    今回大井の2012年から2022年に変更して実行してみると2015年からしかはじまりません。
    変更前
    for year in range(2015,2022)
    変更後
    for year in range(2012,2022)

    競馬場の数字を変えると大井に変わることは確認できました。

    • まこちゃん より:

      開催日の一覧を確認したところ2015年からしか存在しないことを確認しました。
      失礼しました。