見出し画像

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

ちょっと前に秋村さんが0.57秒で判定を変えたことが話題になりましたが、この人も負けてはいません(負けている)!脚長イケメン(…)こと石山さんを今回のヘッダーにしてみました。この動画、大好き過ぎて高校生の時iPodに入れていました(?)。石山さん何かと判定した後に脚がぴょーんってなるのが昔から好きです。

↑秋村さん

↑2013年の石山さん

重複なくDBに最新の出場記録を追加したい

さて、前回Seleniumで最新の試合記録を取得するところまで紹介したわけですが、CSVファイルなどに出力せずに一発でデータベースに入れていきたいものです。更新分だけ試合の記録を取れたらよいのですが、試合詳細ページへ飛ぶCLASSNAMEは複数あるし日付で区切るのが難しそうなのでEXCELで集計していた時は遷移できるところまでクリックしてCSVにまとめて、重複はVBAで削除していました。DB側での重複削除は色々とめんどくさそうなのでPandasのデータフレームを使って更新していきたいと思います。

まずはおさらい

必要な情報を入れた辞書型・dic_game_infoをPnadasのデータフレームに変換します。

import pandas as pd
#データフレームに変換
df = pd.DataFrame(dic_game_info)

ここからCSV出力させるには

import pandas as pd
df = pd.DataFrame(dic_game_info)

df.to_csv('2022_todaygame_csv',encoding="cp932")

encodingで文字コードを指定します。日本語をCSV出力する際に文字化けするのを防ぐために入れています。cp932はJISの文字コードの一種です。UTF-8で試してみたところエラーが出たのでcp932の方を使っていますが、どうやらcp932の方が旧字体の漢字にも対応できるようです。橘髙とか眞鍋辺りがUTF-8ではだめみたいです。余談ですが高校生の時に私が審判ファンであることを知った英語の先生(阪神ファン)に「橘髙って審判…いるよね。橘高(川崎市立橘高校のこと)だよね…いや…それだけ…」と授業中言われたことがあります。

データベースをデータフレームにする

ここからが新しく習得した内容です。sqlite3に入れているデータをデータフレームにします。

import pandas as pd
import sqlite3
#データベースの場所を指定します
DATABASE = ほにゃらら
#データベースを接続します
con = sqlite3.connect(DATABASE)
#テーブルをデータベースに変換
df_DB =  pd.read_sql_query('game2022',con)

色々なやり方がありそうでしたがread_sql_query()を使ったやり方が一番楽そうでした。これでdf_DBにデータベースのテーブルの情報が入りました。先程入れた最新分のデータフレームと連結させればよさげです。縦方向の連結なのでconcatを使います。

import pandas as pd
import sqlite3
df_concat =  pd.concat([df, df_DB])

これで連結させることができます。

重複の削除

Pandasはとても便利なのでカラム毎に重複があるかどうか判断させて削除することができるようです。duplicatedを使用します。subsetでカラム名を指定します。リストにすれば何個でも追記できるようです。今回は日時と球場名で重複があるか判断します。

import pandas as pd
import sqlite3
df_concat = df_concat.duplicated(subset=['日時’,'球場名'])

これで重複を削除することができます。あとは重複分を削除したデータフレームをデータベースに入れればOKです。

import pandas as pd
import sqlite3
df_concat.to_sql('game2022',con,if_exists='replace

if_existsは同じ名前のテーブルがあったときの処理を決めています。replaceは全部とっかえ、appendは後ろに追記という感じです。この場合はdf_concatに全試合分入っているのでreplaceします。これで重複を削除してデータベースを更新させることができました。

ことは全てエレガントに

PandasもCSV出力することしか知らなかったので全試合分書いたCSVを更新して…重複してるところだけ別のCSVにして…という方法しか思い浮かばなかったのですが、もっとエレガントにいけないかなとなり、データベースをデータフレームにする方法を思いつきました。プログラミングではエレガントさが大事!



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