見出し画像

【競馬】Python でリアルタイムオッズを取得する②

以前の記事で、競馬ソフト『リアルタイムオッズEX』(Free版Pro版があります)から Python の openpyxl ライブラリを使ってデータを取得する用法を紹介しました。

しかし、openpyxl の仕様で Excel 上のデータは保存したものしか取得できないという制約があったため、あまり使い勝手の良いものではありませんでした。

xlwings ライブラリを使えば、そういった制約なしにデータを取得できることが分かったので、今回はそのやり方を紹介したいと思います。

1. xlwings ライブラリのインストール

Anaconda で Python の環境を構築している場合は xlwings ライブラリも同梱されているので追加のインストール作業は不要です。

そうでない場合は、コマンドプロンプトにて

pip install xlwings

でインストールして下さい。

2. リアルタイムオッズEX でオッズデータを取得

リアルタイムオッズEX の使い方はこちらの記事を参照して下さい。

レースを選択し、更新開始ボタンを押し更新処理が行われている状態にしておいて下さい。

3. リアルタイムオッズEX から Python でデータを取得

ライブラリの読み込み

from time import sleep
import datetime
import pandas as pd
import matplotlib.pyplot as plt
import xlwings as xw

リアルタイムオッズEX に接続

# リアルタイムオッズEX_Pro に接続
wb = xw.Book('リアルタイムオッズEX_Pro_ver1.0.0.xlsm')

# 単勝・複勝シート に接続
sheet = wb.sheets['単勝・複勝']

出走馬情報を取得

下図のリアルタイムオッズEX の出走馬情報一覧からデータを取得します。

画像2

# 項目名を取得
colnames = sheet.range('A13:N13').value

# 表内のデータを取得
data = sheet.range('A14:N31').value

# データフレーム化
tansyo_df = pd.DataFrame(data, columns=colnames)
tansyo_df

画像1

画像を撮ったタイミングが違うので少し数値がずれていますが、Excel 上のデータが取得できていますね。

4. Python 側で過去データを保持し、時系列オッズのグラフを描画する

リアルタイムオッズEX では動作を軽くするため過去データは保持していません。
Python 側で過去データを保持しておくと、時系列オッズとして扱うことができます。

馬名を取得

bamei = sheet.range('C14:C31').value

単勝オッズの時系列データを取得

# 時系列単勝オッズを格納するリスト
tansyo_odds_all = list()

# 更新ステータスを更新中で初期化
update_status = '更新中'

# 更新間隔を取得
update_interval = sheet.range('E3').value

# 更新ステータスが更新中になっている間はデータを取得し続ける
# オッズが確定するか、更新停止ボタンを押すと処理が終了する
while update_status == '更新中':
   # 取得した更新間隔でデータを取得
   sleep(sheet.range('E3').value)

   # 最新の更新ステータスを取得
   update_status = sheet.range('I3').value

   # 最新の単勝オッズを取得
   tansyo_odds = [datetime.datetime.now()] + sheet.range('D14:D31').value

   # 最新の単勝オッズを時系列単勝オッズ用リストに append する
   tansyo_odds_all.append(tansyo_odds)

時系列単勝オッズをデータフレーム化

tansyo_odds_all_df = pd.DataFrame(tansyo_odds_all, columns=['time'] + bamei).set_index('time')
tansyo_odds_all_df.head()

画像3

30秒間隔で取得した単勝オッズの時系列データをデータフレーム化することができました。
※30秒というのはリアルタイムオッズEX 側で設定した数値です。

馬ごとの単勝オッズの推移を折れ線グラフで描画

tansyo_odds_all_df.plot()
plt.legend(bbox_to_anchor=(1, 1));

画像4

縦軸に対数をとり折れ線グラフで描画

tansyo_odds_all_df.plot(logy=True)
plt.legend(bbox_to_anchor=(1, 1));

画像5

単勝オッズの時系列推移を描画することができました。
時系列オッズデータはデータフレームの形式になっているので、いろいろな分析に役立てることができそうですね。

5. サンプルプログラム

上記サンプルプログラムを Jupyter Notebook にまとめたものを GitHub にアップしました。興味のある方は参考にしてみて下さい。

画像6


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