【競馬】Pythonでリアルタイムオッズを取得する①
2021年6月に公開した競馬ソフト『リアルタイムオッズEX』(Free版とPro版があります)、ありがたいことに競馬ファンの方々に使って頂けているようです。
とはいえ Excel 上でリアルタイムオッズが取得できるだけでは物足りない!という方もいらっしゃるかと思います。
レース直前までオッズの数値を分析したい、という要望にお答えできるように、『リアルタイムオッズEX』から Python でデータを取得する方法を紹介したいと思います。
1. リアルタイムオッズEX でオッズデータを取得する
『リアルタイムオッズEX』は Excel で簡単に中央競馬のリアルタイムオッズが取得できる競馬ソフトです。
JRA-VAN データラボの会員の方であれば Free版は無料で使うことができます。
使い方はこちらの記事をご覧下さい。
取得したいレースを選択し、[更新開始]ボタンを押すとリアルタイムでオッズデータが取得できます。
欲しいデータが取得できたら Excel を上書き保存しておきます。(←ここ重要です!)
2. Python でリアルタイムオッズEX 上のデータを取得する
2.1 openpyxl を使った方法
Python から Excel を操作するためのライブラリに openpyxl があります。
外部ライブラリなので、使う際は
pip install openpyxl
でインストールしておいて下さい。
今回は[単勝・複勝]シートから出走馬に関するデータを取得してみましょう。
コードは次のようになります。
import openpyxl
wb = openpyxl.load_workbook('リアルタイムオッズEX_Pro_ver1.0.0.xlsm', data_only=True)
# シートを選択
ws_tansyo = wb['単勝・複勝']
# セル範囲を選択
uma_list = ws_tansyo['A14:D31']
# 取得結果を表示
for row in uma_list:
for cell in row:
print(cell.value, ' ', end='')
print('')
実行結果は次のようになります。
アイビスサマーダッシュに出走する馬の枠番、馬番、馬名、単勝オッズが取得できていますね。
セルの選択範囲を広げれば他の項目も簡単に Python 側に取得することができます。
2.2 pandas の read_excel を使った方法
openpyxl をインストールしておけば、pandas ライブラリの read_excel 関数を使って Excel 上のデータを取得することもできます。
コードは次のようになります。
import pandas as pd
df = pd.read_excel('リアルタイムオッズEX_Pro_ver1.0.0.xlsm',
sheet_name='単勝・複勝', header=12)
df
実行結果は次のようになります。
Excel 上のデータがデータフレームとして取得できていますね。
2.3 openpyxl と pandas の read_excel 、どちらを使うべきか
Excel 上のデータがきれいな表形式になっている場合は pandas の read_excel を使うのが簡単で良いかと思います。
かたや openpyxl はデータ取得位置をセル単位で指定できるので、pandas の read_excel ではうまく取得できないような箇所ではこちらを使うと良いでしょう。
3. 注意事項
openpyxl の仕様で、Excel 上のデータは保存されたものしか取得できない、というのがあります。
リアルタイムオッズEX では更新中ステータスだと数十秒ごとにリアルタイムオッズデータが更新されますが、そのままでは保存されていないため Python 側では最後に保存された時点の値しか取得できません。
なので手順 1 で上書き保存する必要があったんですね。
openpyxl を使って Excel を上書き保存すればいいのでは?
このように考えてやってみたのですが、結論から言うとうまくいきませんでした。
・Excel が開いている状態では openpyxl を使って保存することができない(Excel の排他処理が働いている)
・複雑なマクロが入っている Excel は正常に保存できない(マクロが壊れてしまう)
などが原因でした。
まとめ
競馬ソフト『リアルタイムオッズEX』で取得したオッズデータを Python 側で取得する方法を紹介しました。
実際に使うときには、
1. リアルタイムオッズEX で更新中ステータスにする
2. 適当なタイミングで Excel を上書き保存する
3. Python 側でデータを取得する
という流れになります。
興味のある方は是非使ってみて下さい!
この記事が気に入ったらサポートをしてみませんか?