pandas
Python3
BeautifulSoup
Jupyter

jupyterでデータをスクレイピングして簡単な解析を行う(裏代:エ杯で的中させる)

More than 1 year has passed since last update.

競馬データをスクレーピングしてデータを作るという事をしました。
そこまでにデータの加工しましたので参考になればと思います。
今回やった事は現時点で今週行われるエリザベス女王杯の過去データから相関関係のデータを取ることをやります。
ただし、内容はほぼほぼデータ整形です。

from bs4 import BeautifulSoup 
from urllib.request import urlopen
import pandas as pd 

#netkeibaからデータを抜き出す
html = urlopen("http://keibanojouhou.hoge/")
#html形式で抜いてます
soup = BeautifulSoup(html, "html5lib")

#過去レースデータURLを取得
urls=[]
for link in soup.find_all('a'):
    hrefs = link.get('href')
    if hrefs.find('/race/')!=-1:
        #今回のデータに不要なものを抜くための処理
        if hrefs[28:32] !='2017':
            urls.append(hrefs)

#urlからレースリンクの抽出

race_datas=pd.DataFrame()
counter = 1

for race_link in urls:

    race_html = urlopen(race_link)
    #該当URLのhtml形式の中からTable内のデータを取得します。     
    race_fetched_dataframes = pd.io.html.read_html(race_link)
    #今回は該当データの配列が0番に該当したのでそちらを取得します。
    race_data = race_fetched_dataframes[0]
    #データフレーム内に年の情報がなかったのでURL情報が取得し、年情報を作成します。
    race_data['year']= race_link[28:32]
    #jupyter内で作成したデータをCSV形式て出力します。
    race_data.to_csv('race_' + race_link[28:32] + '.csv',encoding='sjis')
    #別途抽出するデータを事前に縦方向に結合します。axisは行列方向を指定します。行(0),列(1)
    race_datas = pd.concat([race_datas,race_data],axis=0)
#結合したデータをCSVで出力します。
race_datas.to_csv('races.csv',encoding='sjis')
#ファイルを読み込む
df = pd.read_csv('races.csv',encoding='sjis')
#この時点のデータをチェックしてます。
df.head()

色々と
スクリーンショット 2017-11-07 8.16.27.png

#列を限定します。
datas1 = df[['year', '0', '1', '2', '3', '4', '7', '10', '11', '12', '13', '14']]
datas1.head()
#ハイフンを抜き出し配列にします。
datas1['tuka'] = df['10'].str.split('-')
datas1.head()
#年齢と性別を分けます。今回は定型的な仕様だったためこんな感じで抜きました。
datas1['sex'] = df['4'].str[0:1]
datas1['age'] = df['4'].str[1:2]
datas1.head()
#馬体重を分ける
datas1['weight'] = df['14'].str[0:3]
datas1.head()
#文字型で認識されているので数値型に変換します。
datas['rank'] = datas2['rank'].astype(float)
datas['wakuban'] = datas2['wakuban'].astype(float)
datas['umaren'] = datas2['umaren'].astype(float)
datas['agari'] = datas2['agari'].astype(float)
datas['ninki'] = datas2['ninki'].astype(float)
datas['ozzu'] = datas2['ozzu'].dropna()
datas['age'] = datas2['age'].astype(float)
datas['weight'] = datas2['weight'].astype(float)
datas2.head()

スクリーンショット 2017-11-07 8.13.32.png

#加工したデータで相関関係を確認します。
datas2.corr()

スクリーンショット 2017-11-07 8.10.36.png

#グラフ化します
pd.scatter_matrix(datas2, figsize=(10,10))
plt.show()

スクリーンショット 2017-11-07 8.09.18.png

上から2段目の内容が順位の相関(ざっくりと言うと値同士に因果関係があるかどうか)です。
一番、相関が高かったのが人気と新しい発見はありませんでした。
しかもエリゼベス女王杯は途中から走行距離が変わっていたりするのでそう言うのも加味しないといけないなと思いました。

また、他のやり方やわからずに飛ばしたものもあります(今回だと時間数値のもの)
ご存知のかた教えたいただけると助かります。

もとい今回は人気どおりに買うことにします。