見出し画像

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

イースタンからの東都大学野球

日曜日にチケットを頂いたので東京ドームで行われた巨人ヤクルトのイースタン戦を観に行ってきました。イースタンを観るのは何年ぶりでしょうか。

球審は青木、一塁は山本力、三塁は笹という審判団でした。試合も終わりという時にTwitterで東都大学野球の第3試合の審判団が書かれたメンバー表が回ってきて、二塁佐々木という文字列を見てしまい、「日曜日の佐々木さんはレアでは!?」となり、急遽ダブルヘッダーしてしまいました。いや〜、佐々木さんはやっぱりレベルが違いますね。さすが元プロです!

佐々木は元気だよ、ってSNSで拡散しといて!」と言われたのでここでも宣伝しときますね!

マウンドに登る(?)佐々木さん

存分に推し活を楽しんだ週末でした。今週もプログラミングしていきましょう。

審判別の平均試合時間を求める

以前、橋本さんが現役の時に出演していた斉藤一美アナの番組の中で審判の平均試合時間の話が出てから試合時間について気にするようになりました。その時の天候や選手の活躍の具合で変動するものではありますが、面白いので求めていきます。

VBAで集計していた時はaverageifかなんかで出していましたが、Sqliteだと日付型で入れても文字列型になってしまうので、そこをどうすればいいかずっと考えていました。sql文で日付型に変更する手もありそうでしたが初心者の私には難しかったので……。今日朝出勤している時にふと「Pandasでデータフレームにして型変換して計算出来ないか?」というアイデアが浮かんできました。私の推しぴ・白井さんの平均試合時間を出します。

#平均試合時間を求める
#データベースをデータフレームに変換する
name = "白井"

#白井さんの出場した試合の試合時間をデータフレームに変換する
df = pd.read_sql_query("select 試合時間 from umpire__" 
                      + year 
                      + " where '" 
                      + name 
                      + "' 
                      IN(球審,
                         一塁,
                         二塁,
                         三塁,
                         線審(左),
                         線審(右))",
                       con)

#試合時間を文字列からDate型に変換する
df["time"]=pd.to_datetime(df['試合時間'],format='%H:%M')

今回は試合時間だと取り出せれば良いのでselect 試合時間とします。型変換した列はtimeと名付けます。pd.to_datetimeで列ごとに型変換が出来ました。便利ですね。これでデータフレーム上で試合時間が日付型になりました。


出力した結果
試合時間 time
0 3:55 1900-01-01 03:55:00
1 2:55 1900-01-01 02:55:00
2 2:58 1900-01-01 02:58:00
3 2:54 1900-01-01 02:54:00
4 3:9 1900-01-01 03:09:00
.. ... ...
86 4:4 1900-01-01 04:04:00
87 3:9 1900-01-01 03:09:00
88 2:37 1900-01-01 02:37:00
89 2:36 1900-01-01 02:36:00
90 3:12 1900-01-01 03:12:00

さてデータフレームでどうやって平均試合時間を計算するのか、と思っていたらドンピシャな質問と回答がありました。

正直なんでこれでいけるのかなんとなくでしか分かりませんがまあ良しとしましょう。


#平均の試合時間を求めます
#numpyを使ってある日の0時0分からの時間差を「1日」で除した余りを平均します
base_time = numpy.datetime64(0,'ns')
avg_time = ((df['time'].to_numpy() -base_time) % numpy.timedelta64(1,'D')).mean()
print(avg_time)

出力した結果
11762637362637 nanoseconds

ナノ秒って初めて見ました。ググりました。

とりあえずこれを時分に変換すればよさそうですが、この辺りで沼りました。

型変換からの型変換

色々試行錯誤した結果、もっと賢いやり方はありそうですが、ひとまずこれでうまくいきました。timedelta64型から直接timestamp型にはできなかったのでintにしたり、intから日付変換もできなかったので文字列にしたりと型変換からの型変換をすることでようやくいつものstrftimeまでたどり着きました。

#ナノ秒を秒に変換
second_dara = avg_time.astype("timedelta64[s]")
#秒をint型に変換(
second_int = second_data.astype(int)
#numpy配列のままなのでリストに変換
time_data = second.tolist()
# timestamp型にしてさらに文字列に変換
avrage = str(datetime.timedelta(seconds=time_data))
# 文字列を日付型に変換
avrage = datetime.datetime.strptime(avrage, "%H:%M:%S")
# 日付型を文字列に変換
avrage_time = avrage.strftime("%H:%M")

出力した結果
白井さんの平均試合時間
03:16

これで私の推しぴ・白井さんの平均試合時間を出すことができました。Pandasは操作が慣れてくると便利な機能がたくさんあって使い勝手がよいです。出したいデータは一通り揃ってきたし、「Flaskで~」と言っておきながらFlaskに一切触れてきていないので明日以降はFlaskとHTMLをいじります。





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