Lean Baseball

No Engineering, No Baseball.

メジャーリーグ全162試合,約72万球のデータをBigQueryに保存する方法(なお分析はまだ) #大晦日ハッカソン

f:id:shinyorke:20171231223526p:plain

やきう大好きなら,こういうのやりたいでしょ?(なおメジャーリーグ).

という,野球好きの為のHackを年末にやってみました.

なお,こちらは本年(2017年)の#大晦日ハッカソン成果物のメモです.

#大晦日ハッカソンは毎年大晦日に好きな場所で成果を呟きながら年内にやり残したhackをやる(多分)世界最大のオフライン型ハッカソンです,今みて「ああ,参加したい!!!」って公開した方は是非2018年よろしくおねがいします!

atnd.org

メジャーリーグ全162試合のデータ,特に投球データをGoogle BigQueryにいい感じに移送して分析できるようにしたのでノウハウを残したいと思います.

申し遅れましたが「Pythonで野球の人」こと@shinyorkeともうします.

TL;DR

  • メジャーリーグのデータセットをサクッと手に入れるならpitchpxを使おう(威圧感)
  • 沢山あるcsvファイルをいい感じにまとめて一箇所にするのにPythonのpathlibとpandas良かった
  • BigQueryをpandasから使うのすごく楽

おしながき

メジャーリーグは「一球速報データ」がコマンド一発で手に入るんです!

正確に言うと,

メジャーリーグの一球速報データをコマンド一発で手に入れるためのライブラリを2年前(2015年)の大晦日ハッカソンで公開しました!(私が)

shinyorke.hatenablog.com

こちらで紹介しているpitchpxというライブラリをインストールすることにより,一球速報データ(と打席・試合・選手にコーチ、審判のデータ)がcsvという使い易いフォーマットで手に入れることができます.

$ pip install pitchpx
$ pitchpx -s 20170402 -e 20170402 -o .  # 開幕日のメジャーリーグ全データを取得
$ ls -l
mlbam_action_20170402.csv   mlbam_boxscore_20170402.csv mlbam_game_20170402.csv     mlbam_player_20170402.csv
mlbam_atbat_20170402.csv    mlbam_coach_20170402.csv    mlbam_pitch_20170402.csv    mlbam_umpire_20170402.csv

なお,実際のデータは流石に1日ずつ取るのも面倒なので,一ヶ月ごと取りました.

※この後はデータが「./data」直下にある前提で進めます

$ pitchpx -s 20170402 -e 20170430 -o ./data
$ pitchpx -s 20170501 -e 20170531 -o ./data
$ pitchpx -s 20170601 -e 20170630 -o ./data
$ pitchpx -s 20170701 -e 20170731 -o ./data
$ pitchpx -s 20170801 -e 20170831 -o ./data
$ pitchpx -s 20170901 -e 20170930 -o ./data
$ pitchpx -s 20171001 -e 20171001 -o ./data

ちなみにですが,メジャーリーグは162試合,投じられるボールは約72万球です!

全データをGoogle BigQueryにUploadする

上記のコマンドで一年分のデータを取れます...が,

  • 保存の単位が1日ずつ
  • データのファイルは以下の8つの種別で保存される
    • game(試合情報)
    • atbat(打席毎の情報)
    • pitch(一球ごとの試合情報)
    • boxscore(試合のスコア(得点)情報)
    • action(試合中の選手交代など,イベント情報)
    • player(試合ごとのベンチ入り選手情報)
    • coach(試合ごとの監督・コーチ情報)
    • umpire(試合毎の審判出場情報)
  • 8つの情報×試合が行われた日 = ファイル数!

なお,上記ルールに則ってデータを集めた結果,メジャーリーグのレギュラーシーズンは183日間なので, 8 * 183 = 1464個のファイルができました(震え)

Google BigQueryに対してはcsvファイルを愚直にアップロードすることにより,データを保存できたりするのですが,流石にファイル数が多すぎるので,

  • 8つの種別ごとにcsvファイルとして集約する&すべてをGoogle StorageにUploadする
  • Google BigQueryには,UploadしたファイルをそのままTableとして保存する

という方針で処理して対応しました.

具体的にはPythonのpathlibライブラリ(公式)と,pandasを使いました.

この作業だけならpandasいらないと思いつつもどうせこの後前処理と分析で使うし...って事で使いました.

pitchpxで入手したデータをデータ種別毎にまとめるサンプル

Google Cloud StorageにはGUIからUpload,BigQueryへの移送は公式の手順を参考にやりました.

Cloud StorageからのBigQuery読み込み(公式)

ここまで出来た後に,BigQueryの画面でQueryを打って試した結果がこちら.

私はPythonistaなので,Pythonから使えたら今夜(今年)はOKとしたいと思います(決めつけ)

pandasのDataFrameをBigQueryかからいい感じに作る&使う

pandasにはread_gbqという,BigQueryからDataFrameを作る関数があるのでそちらを使いました.

なお,今回のデータ分析環境はanaconda + BigQueryを使う場合はpipで入れるライブラリも複数あるため,こんな感じで環境を作りました.

$ conda create -n ohtani2018 python=3.6
$ source activate ohtani2018
(ohtani2018)$ conda install -y pandas jupyter notebook matplotlib
(ohtani2018)$ conda install pandas-gbq -c conda-forge
(ohtani2018)$ pip install google-auth-oauthlib google-auth-httplib2

この環境でゴニョっと作った後,

(ohtani2018)$ jupyter notebook

とやってnotebookを起動後,試しにクエリー打って試しました.

挨拶代わりに,今年2017年にイチロー選手に対して投じられた全投球データをググってみます

今年のイチロー選手の全投球データを取得

うん,上手く行ってそうです :excellent:

というかBigQueryとPython楽すぎてヤバイです(震え

来年(2018)にやりたいこと

anacondaの環境名(ohtani2018)にある通り,本来は大谷翔平に関する分析がやりたくてですね...

年明けはそっちで頑張りたいと思います.

来年もよろしくおねがいします,良いお年を!