見出し画像

審判ファンの文系SEがFlaskでプロ野球審判出場記録アプリを作る⓾

怒涛の10月が終わった

前回から一か月ほど更新が止まってしまいました。さすがにさとう式の課題動画を撮りつつ、友達の結婚式のために二重太鼓を練習しつつ、データサイエンスの研修を終わらせつつ、ちゃっかり日本シリーズも観に行きつつ、本スクリプトを完成させるのはスケジュール的に無理がありました。

11月に入ってからスクリプトは触ってたんですけど燃え尽き症候群で死んでいたので全然進んでいません。いかんです。

私が燃え尽きている間に審判界ではなにやら不穏なニュースが飛び出てきていますが、まあ気にせずアプリを完成させましょう。記録に罪はないですからね!「罪を憎んで人を憎まず」って香港国際警察 NEW POLICE STORYのジャッキーチェンが言ってました。ジャッキーチェンの映画はラッシュアワーシリーズ(得にラッシュアワー2がお気に入り)とこの香港国際警察 NEW POLICE STORYが好きです。このnoteもエドウィンスターのwarを聴きながらノリノリで書いています。香港国際警察 NEW POLICE STORY正直すごい面白いとは言い難いですけど、悪役が悪役しているのでいいのです。スティーブンセガールの暴走特急もそうですけど悪役がとことん悪役でむかつく映画はいい映画ですよね。

月別審判別の出場試合数を算出する

10月末にアマチュアの審判の某T村さんとK塚さんとA村さんと飲んでいるときにK塚さんから「誰それはシーズンの後半あんまり出てないはず」という話が出てきて、審判員の詳細ページで月毎の試合数の推移は出していましたが一覧だと「この人後半から試合数伸びてるな~」とか分かって面白そうだなと思ったので、算出していきます。

Flaskで記述する際にリストだと要素番号の何番目がその年の出場試合数だから~と把握するのが分かりにくいので11月入ってからリストで出していたものを辞書型に地味に修正しているのでここでも辞書型を使っていきましょう。(jinja2でどうやって辞書型ループさせるのか知らんけどまあなんとかなるだろう精神)

そもそも月をどうやって出すか問題

大体、3月から10月ですけど2020年みたいに6月から開幕になったり、2021年みたいに11月までもつれ込むこともあるので、月は定数にできません。なのでデータベースの日時から月だけ取り出す作戦にします。


def ump_month_pos(year):
  con3 = engine.connect()
  # 月を取得する
  month_execute = con3.execute("SELECT date FROM game" + year + "").fetchall()
  # 月を格納するリスト
  month_list = []
  
  for i in range(len(month_execute)):
        dte = datetime.datetime.strptime(month_execute[i][0], "%Y年%m月%d日")
        dte = int(dte.month)
    
    #重複を削除します
         if dte not in month_list:
             month_list.append(dte)

試合日時の部分だけSELECTしてmonth_executeという変数に入れておきます。fetchall()でexecuteしたデータはタプルで格納されているので要素数分ループさせながら文字列から日付型に変換して、月だけdteという変数に格納します。

あとは各年の試合に出場してる審判員名をSELECTして重複を削除してリストに入れたものをループしつつSELECTしてけばいいのですが、審判員名のリストの順番がバラバラになってしまうのでなんとかクルーチーフから審判員までいい感じにソートできないかなとなりました。各年の出場試合数一覧の時はそれを考えるのが面倒だったので出場試合数が多い順で並べてたんですけど、月別はきれいに並んでいた方が見やすいですよね。なので、前回でも使った、各年の審判員のプロフィールページの名前seleniumで取得してリストに入れて、条件分岐でどうにかすればどうにかなるのでは、とひらめきました。

審判員名は同じclassで書かれているのでclassをループさせれば審判長からコーディネーター、じゃなくて技術委員じゃなくて、スーパーバイザーまで順番通りにリストに格納することができます!2016年から2022年までループさせてページ遷移させ、辞書型に入れて、pandasでデータフレームに変換してデータベースに入れます。

こんな感じ

umire_listというテーブルに入れたので、dateが取り出したい年の行だけSELECTしてリストに入れます。これと、出場試合記録から取得した審判員のリストをループさせて、部分一致した名前だけリストに格納すれば役職順にソートできるはずです。


# 一軍試合に出場した審判員名のリストを取得    
umpire_list = umpire_list_create(con3, year)     
# その年のプロフィールの役職のリストを取得   
 ump_pos_list = []   
 ump_list = []    
ump_pos_list_execute = con3.execute( "select * from umpire_list where year = '" + year + "'" ).fetchone()     

for result in ump_pos_list_execute:        
 if not type(result) == int and not result == None:            
  ump_list.append(result)    
  for full_name in ump_list:        
   for name in umpire_list:           
     if not full_name == "森口壽樹":                
      if full_name in name:                    
        ump_pos_list.append(full_name)
if not type(result) == int and not result == None:

行をexecuteしたときに無駄な空白やインデックス番号も入ってしまうのでint型じゃない時とNoneじゃない時に処理を行います。

if not full_name == "森口壽樹"

森口さんすまん…!!部分一致で「森」だったときに森口が森になってしまうので、"森口壽樹”じゃない場合を付け足しました。一軍に出たら消せる分岐なので消せるように頑張ってほしい(謎の上から目線)。

これで一軍の試合に出ている審判かつ役職順なリストが完成しましたので、月のリストと合わせてSELECTして色々すれば…。



こんな感じで辞書型に格納することができました。辞書型は業務で使って色々と発見があったので別に書こうと思います。

辞書型にしているのでFlask側も色々書き換えなきゃいけないんですけどめんど…でも頑張ります。


いいなと思ったら応援しよう!