見出し画像

審判ファンの文系SEがFlaskでプロ野球審判出場記録アプリを作る⑥【Python】【numpy】【Sqlite】

ベクトルの計算なんて……

今回も全く内容と関係の無いヘッダー写真はつい最近のファウルを宣告する私の推しぴ・白井さんです。かわよくないですか!?ファウル!って厳つい表情で宣告しているところなのですが私は推しの一瞬の可愛さを見逃しませんでした。今期のベストかわよ推しぴ賞グランプリです。お疲れ様でした。

前々回でSQL文を使って審判別ポジション別のデータを引っ張ることに成功しましたが、球団別ポジション別の試合数も審判ファンなら気になるところなので集計したいです。審判別ポジション別集計の際は審判名のリスト分ループの中にポジションのリスト(6)のループを入れていたので更にここにチーム名のリスト(12)のループを入れる……三重ループにしてあげれば良さそうです。三重ループってはじめて使うんですけど上手くいくでしょうか……?

# 審判名でループ
for p in umpire_name_list:
   # チーム名でループ
   for q in team_list:
       # ポジション名でループ
       for f in possition_list:
           #ビジターの集計
           pos_ump_list1.append(
               cur.execute(
                   "select count() from game"
                   + year
                   + " where 先攻チーム = '"
                   + q
                   + "' and  "
                   + f
                   + " = '"
                   + p
                   + "'"
               ).fetchmany()
           )
           #ホームの集計
           pos_ump_list2.append(
               cur.execute(
                   "select count() from game"
                   + year
                   + " where 後攻チーム = '"
                   + q
                   + "' and  "
                   + f
                   + " = '"
                   + p
                   + "'"
               ).fetchmany()
           )
           

出力は恐ろしい数が出てくるので省きますが多分これで合っているはずです。要らないカッコを省く処理をして、リストの分割を行っていきます。1回目は6分割(ポジション毎に)、2回目は12分割(球団毎に)。

出力した結果

[[[4, 4, 2, 3, 0, 0], [0, 0, 0, 0, 0, 0], [3, 3, 3, 3, 0, 0], [3, 3, 3, 3, 0, 0], [3, 3, 3, 1, 0, 0], [1, 0, 1, 3, 0, 0], [0, 0, 0, 0, 0, 0], [1, 0, 1, 2, 0, 0], [1, 2, 2, 2, 0, 0], [1, 1, 2, 0, 0, 0], [4, 3, 2, 1, 0, 0], [2, 1, 2, 2, 0, 0]], [[2, 2, 1, 0, 0, 0], [1, 3, 4, 4, 0, 0], [4, 3, 2, 1, 0, 0], [2, 2, 1, 2, 0, 0], [1, 1, 0, 1, 0, 0], [3, 2, 0, 1, 0, 0], [1, 2, 4, 3, 0, 0], [2, 2, 2, 2, 0, 0], [1, 1, 2, 2, 0, 0], [1, 2, 2, 3, 0, 0], [2, 1, 1, 0, 0, 0], [1, 1, 1, 1, 0, 0]]…

[[[1球団目のポジション別の試合数][2球団目のポジション別の試合数]…[12球団目のポジション別の試合数]],[[1球団目のポジション別の試合数][2球団目のポジション別の試合数]…[12球団目のポジション別の試合数]]…]という構成になっています。あとは先攻の試合数と後攻の試合数を足せばOKですね!

……リストのリストのリスト同士の要素の計算ってどうするんだ????

[[[1,2,3],[4,5,6],[8,9,10],[…]

[[[1,2,3],[4,5,6],[8,9,10]]]←足す

[[[2,4,6],[8,10,12],[16,18,20]]]みたいな感じにしたいのですが…リスト同士の要素の計算なんて使う機会ないだろうとなめていたらこんなところで出てきてしまいました。さすがに分からなかったので会社の有識者の人たちに助けを求めた結果、「numpyを使えば瞬殺」ということが分かりました!

numpyを使った要素の計算

import numpy
# 先攻と後攻のリストを足す
ump_numpy = numpy.add(team_pos_umpire_number1, team_pos_umpire_number2)
sum_ump = ump_numpy.tolist()

numpy配列にしてから足して、tolistでリストにしている…らしい…うーん説明を読んでもよく分かりません。numpy配列のump_numpyをprintしてみると

[[[5 4 2 4 0 0]
[7 5 5 6 0 0]
[4 4 4 3 0 0]
...
[2 2 3 1 0 0]
[4 3 3 2 0 0]
[2 1 2 2 0 0]]…

というようになるので、イメージとしてはpandasのデータフレーム的な感じでしょうか。表にしているから計算が容易になる…みたいなことだと認識しました。っていうか、numpyのアイデミーの授業は受講したはずでは…使わないと忘れてしまいますね。そして辞書型に追加して出力すると、

{'丹波': [[5, 4, 2, 4, 0, 0], [7, 5, 5, 6, 0, 0], [4, 4, 4, 3, 0, 0], [7, 8, 7, 6, 0, 0], [3, 3, 3, 1, 0, 0], [4, 2, 2, 5, 0, 0], [4, 3, 5, 5, 0, 0], [2, 2, 3, 3, 0, 0], [2, 3, 3, 2, 0, 0], [2, 2, 3, 1, 0, 0], [4, 3, 3, 2, 0, 0], [2, 1, 2, 2, 0, 0]], 
'原': [[4, 3, 1, 1, 0, 0], [1, 3, 4, 4, 0, 0], [7, 5, 3, 4, 0, 0], [4, 5, 2, 3, 0, 0], [3, 5, 3, 3, 0, 0], [7, 7, 3, 2, 0, 0], [1, 2, 4, 3, 0, 0], [2, 2, 4, 4, 0, 0], [3, 3, 5, 5, 0, 0], [3, 5, 7, 6, 0, 0], [4, 3, 3, 2, 0, 0], [3, 1, 1, 3, 0, 0]],
 '吉本': [[4, 4, 5, 3, 0, 0], [6, 7, 7, 7, 0, 0], [4, 3, 2, 3, 0, 0], [3, 5, 4, 2, 0, 0], [3, 1, 0, 1, 0, 0], [4, 3, 1, 2, 0, 0], [7, 8, 8, 11, 0, 0], [2, 3, 3, 4, 0, 0], [1, 4, 6, 6, 0, 0], [1, 3, 2, 2, 0, 0], [2, 1, 3, 2, 0, 0], [1, 2, 1, 1, 0, 0]], 
'名幸': [[4, 2, 2, 5, 0, 0], [2, 2, 2, 1, 0, 0], [5, 5, 3, 3, 0, 0], [5, 5, 4, 3, 0, 0], [4, 6, 7, 8, 0, 0], [7, 5, 5, 5, 0, 0], [2, 2, 2, 2, 0, 0], [1, 2, 4, 3, 0, 0], [2, 1, 4, 3, 0, 0], [2, 3, 2, 0, 0, 0], [4, 4, 4, 5, 0, 0], [4, 5, 9, 6, 0, 0]],…

といった感じにできました。これだと分かりにくいので試しに私の推しぴ・白井さんの出場記録をFlaskで表示させてみましょう。

画像1

オリックス戦の試合と阪神の試合だけ異様に試合数が多いところからしてもこれで合っていそうな感じがしますね!

そして「審判別、球団別、ポジション別の出場試合数を集計したい」ただそれだけの願いだったのに知らない間に私はベクトルの計算をしていたみたいです。

ベクトルなんて習ったって使うことはないだろうと思っていたのにこんなところで使うことになるとは…!「高校の数学の成績が2でもプログラミングはできますか?」と、プログラミングスクールのメンターに入学前に訊ねて、

「論理的思考ができれば大丈夫です!」」

と言われて「私でもできるのか!」と思って入りましたが、いよいよ数学から逃れられないような気がしてきました。

試合数で取得したいデータは概ね揃ってきた気がするので平均の試合時間を出したいですね。

この記事が気に入ったらサポートをしてみませんか?