【リメイク版#3】1年分のレース結果データをまとめて取得する方法【競馬AI開発】

  Рет қаралды 3,840

競馬予想で始めるデータ分析・機械学習

競馬予想で始めるデータ分析・機械学習

Күн бұрын

📘動画中のソースコードや補足解説はこちら
note.com/dijzpeb/n/nab9049e04924
📘目次
0:00 オープニング
0:26 はじめに
1:23 なるべくhtmlを直接保存しよう
7:19 htmlの取得・保存方法
13:21 scrape_html_race()の作成
29:25 レース結果データをテーブルにまとめる
38:57 create_results()の作成
📘関連動画
【リメイク版#1】レース開催日一覧をスクレイピング
• 【リメイク版#1】レース開催日一覧をスクレイ...
【リメイク版#2】ChromeDriverによるレースid一覧のスクレイピング
• 【リメイク版#2】ChromeDriverに...
📘Twitter
@ejkaqfc
📘プロフィール
東京大学大学院(物理系) 卒業

WEBマーケティング調査会社のデータアナリスト

大手IT系事業会社のデータサイエンティスト

Пікірлер: 14
@user-ej3zj6kv9z
@user-ej3zj6kv9z 3 ай бұрын
📘動画中のソースコードや補足解説はこちら note.com/dijzpeb/n/nab9049e04924 📘目次 0:00 オープニング 0:26 はじめに 1:23 なるべくhtmlを直接保存しよう 7:19 htmlの取得・保存方法 13:21 scrape_html_race()の作成 29:25 レース結果データをテーブルにまとめる 38:57 create_results()の作成 📘関連動画 【リメイク版#1】レース開催日一覧をスクレイピング kzbin.info/www/bejne/iaqVanSoidR3p5Y 【リメイク版#2】ChromeDriverによるレースid一覧のスクレイピング kzbin.info/www/bejne/aImzo41jrNWFbdU
@nozomi4829
@nozomi4829 2 ай бұрын
29:25のlen(html_paths_race)で質問です。 動画に沿って実行したところ 1度目のscrape_html_race()で事前に[:3]で作成した分のファイルがリストに入りますが、次にscrape_html_race()を実行した時にhtml_path_list = []が初期化されるので、skipされた[:3]はhtml_paths_raceにいないと考えています。 動画内では29:25のlen(html_paths_race)で3456となっていますが、これは動画にしていないだけで一度全部やり直しているのでしょうか。
@user-ej3zj6kv9z
@user-ej3zj6kv9z 2 ай бұрын
たしかに、おっしゃる通りですね...! 撮影の都合上、事前に取得したものをhtml_paths_raceに入れて実行してしまっていました。 もし再現しようと思うと、 html_paths_race = list(scraping.HTML_RACE_DIR.glob("*.bin")) でできると思います!
@nozomi4829
@nozomi4829 2 ай бұрын
@@user-ej3zj6kv9z ありがとうございます。 次の動画で似たようなことをされていたので、そちらを参考にして同じ動作になりました!
@8230snote
@8230snote 24 күн бұрын
いつも動画ありがとうございます。質問があります。 !mkdir ../dataの実行後、主様のようにdataファイルが左の欄に表示されません。この原因がなにかわかりますでしょうか? デスクトップ上にdataファイルは作成されているのは確認できますので、おそらくvscodeの設定なのかなと思います。 また、「ワークスペースにフォルダを追加」を行い無理やり左の欄表示をさせたあと、dataファイル内にhtmlファイルを作成しても、主様のようにdata/htmlのような表示にはならず、data v html のようにhtmlファイルが改行されてしまいます。初心者でわからないため、ご教示いただけると幸いです。
@user-ej3zj6kv9z
@user-ej3zj6kv9z 24 күн бұрын
多分vscode上で開いているフォルダの場所が違っている気がします。src/フォルダを開いていたりしませんか? vscodeで新規ウィンドウを開いた後、フォルダマークの「Open Folder」から、data/とsrc/がどちらも含まれるフォルダを開いてみてください
@8230snote
@8230snote 23 күн бұрын
@@user-ej3zj6kv9z ご教示ありがとうございます!主様と同じような表示になりました!
@hiro29865
@hiro29865 3 ай бұрын
いつも 動画 ありがとうございます 走破タイムを 補正するツールを作りたくて 動画 拝見させていただいてます 私のしたいことですが 1、開催日の10レース以降でしたいレースだけの出走表を抽出する 2,そのレースの出走馬毎で過去から今までの成績データを抽出する 3, 抽出したデータから馬毎に下記を行う 開催何日目かによっての補正 馬場状態の補正 4,馬毎の走破タイムを、選んだ 競馬場に 変換する ( 競馬場と距離によってタイム差があるので) 5、変換した 一番速い走破タイム だけを 競馬場と距離別で   馬毎に出す 4番目の選んだ 競馬場に変換するところですがここはどこの競馬場でも 変換できるようにはしたいです したいこと 色々書きましたが こういうプログラムを書くことは 可能でしょうか? というより月とか年とかの総合データもいいですが開催日の 1レースを色々な条件で絞ったり変換したりした動画とかも 見てみたいです 希望です よろしくお願いします
@yukkuri-ds-lab
@yukkuri-ds-lab 3 ай бұрын
@hiro29865 さん 投稿主じゃなくて申し訳ありません。 質問のヒントになればと思いコメントさせて頂きます。 扱うデータ形式によって処理内容が変わるかと思いますが、pandasのDataFrame形式を想定して話します 【扱うデータ:変数】 ・df: 過去の全件レースデータをDataFrame形式にしたもの - カラム(抜粋) raceId: レースID raceDate: 開催日 place: 競馬場 distance: 距離 horseId: 出走馬ID time: 走破タイム 【質問】 項番1: 1日の開催レース数である12レースのうちの10レース以降の出走表が欲しいと捉えて話します。 上記の場合は、raceIdの末尾2桁が開催レース番号を表してるためraceIdの末尾2桁が'10', '11', '12'のものを抽出します。 コード例 df_R10over = df[df["raceId"].astype(str).str[-2:].isin(["10", "11", "12"])] 項番2: 馬ごとに過去のレース結果を取得したいという意図だと思います。 DataFrameの場合だとかなり処理が難しいと思います。 その後の分析でどのようにデータを扱っていくかによって処理が変わって来るかと思いますが、 単純に分析したいレースに出走する馬ごとに過去のレース結果の取得をしたい場合は 以下のようなコードを実行すると良いと思います。 コード例 # 1. 事前に全件レースデータをraceDate順にソートしておく df.sort_values(["raceDate", "raceId"]).reset_index(drop=True, inplace=True) # 2. 項番1の実行 df_R10over = df[df["raceId"].astype(str).str[-2:].isin(["10", "11", "12"])] # 3. まずは項番1で取得したレース情報から出走している競走馬のリストを取得します horseId_list = df_R10over["horseId"].unique().tolist() # 4. 全件データがあるdfから、horseIdのリストの要素を含むものだけに絞り込みます df_filterR10_horse = df[df["horseId"].isin(horseId_list)] # 5. 競走馬ごとのデータに分けたい場合はgroupbyを使う dfhorse_group = df_filterR10_horse.groupby('horseId') # 6. やや煩雑になりますが、項番1で絞り込んだレースの出走馬ごとの # レース出走時点の過去の成績をまとめたいとのことなので、 # 辞書型でデータを管理するようにするのが一案としてあります。 horse_race_history = {} # ここに各レースごとの出走馬の過去成績を納めます # 7. 集計対象である項番1で絞り込んだレース一覧であるdf_R10overのDataFrameについて、 # raceIdでgroupbyしたものでfor文処理を行います。 # (もう少し上手なやり方がありますが、可読性の観点からレースごとに処理をします。) df_race_group = df_R10over.groupby('raceId') # groupbyにすることでfor文処理でレースごとの出走情報だけのDataFrameで扱える for raceId, dfg_race in df_race_group: horse_race_history[raceId] = {} # raceIdのkeyを追加して、馬ごとの過去データを格納するためにvalueに空辞書を入れます # 8. 変数のdfg_raceには、raceIdに対応したDataFrameが入ってます # 必要なのはhorseIdのみなので、出走馬のhorseId一覧をリストで取り出します race_horseId_list = dfg_race["horseId"].tolist() # 9. horseIdごとにfor文で処理して、過去の成績一覧を対象の辞書に追加していきます for horseId in race_horseId_list: dfh = dfhorse_group.get_group(horseId) # コメント「5.」で作成したhorseIdごとにgroupbyしたものを使う # 処理中のraceId時点から過去の成績データに絞り込む target_idx = dfh[dfh["raceId"].isin([raceId])].index[0] # 出走時点のraceIdのインデクスを取得 horse_race_history[raceId][horseId] = dfh.loc[:target_idx-1] # 11. データの一部確認 target_raceId = list(horse_race_history.keys())[0] print("対象レースIDと出走馬一覧") print(f"レースID: {target_raceId},", "出走馬ID一覧:", list(horse_race_history[target_raceId].keys())) print("適当な出走馬一頭の過去成績を参照") target_horseId = list(horse_race_history[target_raceId].keys())[0] print("出走馬ID:", target_horseId) print("過去成績") print(horse_race_history[target_raceId][target_horseId]) 項番3: 意図が汲み取れなくて申し訳ないのですが、上記の項番2で作成したhorse_race_historyの辞書を使えば 過去成績データごとに処理が出来ると思います。参考にしてください。 項番4: 選んだ競馬場が何を表しているのか分からないので、回答しようがありません。すみません。。 項番5: 項番4と関連しているように思うため、項番4が分からないと回答できません。すみません。。
@hiro29865
@hiro29865 3 ай бұрын
@@yukkuri-ds-lab ありがとうございます。 項番3: 意図が汲み取れなくて申し訳ないのですが、上記の項番2で作成したhorse_race_historyの辞書を使えば 過去成績データごとに処理が出来ると思います。参考にしてください。 これについては 該当するレースの出走馬毎の全成績の走破タイムから 開催日 1,2日目の芝で走った 成績については +1秒 馬場状態が 芝の場合(稍重-1秒、重-2秒、不良-3秒) ダートの場合(稍重+1秒、重+2秒、不良+3秒) を加味してタイムを出す 項番4: 選んだ競馬場が何を表しているのか分からないので、回答しようがありません。すみません。。 これについては 例えば 該当するレースが京都の10レース 芝1800mだった時 京都 1800mの 基準タイムが110秒として 札幌競馬場の1800m が111秒だとした 場合、1秒の差があります こうした時に札幌競馬場1800m を110秒で走った 成績 を京都競馬場に変換すると 1秒 京都の方が速いので 京都1800m に変換すると この成績は109秒になります ( それぞれの競馬場と距離に対してのこの基準タイム表は私が作って あります) 項番5: 項番4と関連しているように思うため、項番4が分からないと回答できません。すみません。。 項番4で変換すると同じ距離に複数出てくる場合があると思いますが その場合は 馬毎にそれぞれの距離で一番速い 走破タイムだけを残す そして京都競馬場に ない距離を走ってる馬もいてると思いますのでその場合は そのままの成績を残す( 例えば 小倉芝 2600mなら そのまま 小倉 2600m で 走破タイムを 複数あれば一番速い走破タイムを表示) そうすることで 該当レースの 出走馬全頭の距離ごとの比較が 可能になります 例えば それぞれの競馬場やそれぞれ 距離で変換できるようにできれば すごく 使い勝手が良くなるのではと思っています
@user-ej3zj6kv9z
@user-ej3zj6kv9z 2 ай бұрын
@hiro29865 さん、コメントありがとうございます。@yukkuri-ds-lab さんもかなり詳しく、ありがとうございます...! 走破タイムを補正したものは機械学習モデルに入れる予測材料としてもかなり有効だと思うので、いただいたコメントも参考にして、作成方法に動画にできないか検討してみようと思います!(おそらく順番的に、投稿するのは後の方になってしまいそうですが)
@hiro29865
@hiro29865 2 ай бұрын
@@user-ej3zj6kv9z ありがとうございます。よろしくお願いいたします。
【リメイク版#4】馬の過去成績テーブルを取得する【競馬AI開発】
46:01
競馬予想で始めるデータ分析・機械学習
Рет қаралды 3 М.
100❤️
00:19
MY💝No War🤝
Рет қаралды 21 МЛН
孩子多的烦恼?#火影忍者 #家庭 #佐助
00:31
火影忍者一家
Рет қаралды 51 МЛН
🤔Какой Орган самый длинный ? #shorts
00:42
Selenium(Python)によるWebスクレイピング実装10問
37:21
いまにゅのプログラミング塾
Рет қаралды 33 М.
【リメイク版#1】レース開催日一覧をスクレイピング【競馬AI開発】
35:49
競馬予想で始めるデータ分析・機械学習
Рет қаралды 9 М.
ChatGPTでの仕事時短術5選~仕事の生産性をChatGPTで上げたい人、必見!
40:15
リモートワーク研究所【リモ研】
Рет қаралды 283 М.
【8分で分かる】データサイエンティストとデータアナリストの違い
7:37
スタビジ【誰でもAIデータサイエンス】byウマたん
Рет қаралды 38 М.
【最新版】データサイエンス初心者が絶対に読むべき本7選
19:14
はやたす | Python・データサイエンスコーチ
Рет қаралды 17 М.
小学生でもわかるデータベース設計入門。実際に設計しながら基礎を学ぼう
1:31:28
だれでもエンジニア / 山浦清透
Рет қаралды 119 М.
Choose a phone for your mom
0:20
ChooseGift
Рет қаралды 7 МЛН
iPhone 16 с инновационным аккумулятором
0:45
ÉЖИ АКСЁНОВ
Рет қаралды 8 МЛН
Clicks чехол-клавиатура для iPhone ⌨️
0:59