見出し画像

JRAレース結果【CSVファイル作成→MySQLインポート】②

前回の続きです。
次にいよいよDBの作成です。

DB作成

先ずは、Windowsならコマンドプロンプト若しくはPowershell。
MacやLinuxはターミナルを起動してください。
実はPythonコーディングしていて、このままPythonでDBとテーブル作成やインポートまで一括しようと考えていました。
ですがこれをしてしまうとエラーの切り分けに時間が掛かり、且つ、修正したものがまたエラー発生すると、デバッグにも時間を要してしまうので、スクレイプ用PythonコードはPythonコード、CSVインポート用SQL文はSQL文で分ける形にしました。
他の修正箇所がデグレる(デグレート)のも心配です。
勿論、バージョン管理にリポジトリやGitHub使うのも良いですが、未だこの程度や段階ならばゴミコードも殖えないので、ローンチ後にバージョン管理するくらいで良いと思っています。
まぁ、そんなこんな小分けでデバッグが可能となります。
Cron内Shellやバッチファイルなど時間バッチを指定するのも、コマンド実行時間を分けて施行すれば解決できます。

では、早速DB作成の説明に移ります。
MySQLのインストール時に、「rootパスワード」を設定したと思います。
rootとは管理者権限(Windowsで言うところのAdministrator権限)になります。
ハックされないように必ず強力なパスワードにしましょう。
以下のようにログイン致します。

mysql --user=root --password

ログイン成功するとプロンプト(行頭)がmysql>となると思います。
そうしたらDBの確認です。
ここで注意ですが、SQL文施行の際のコマンド末尾には必ず「セミコロン";"」を入れてください。
でないとコマンドが永遠に動きません。

SHOW databases;

すると、登録されているデータベースが表示される筈です。
では、自前のデータベースを作成します。(db_nameは任意で変えて下さい。)

CREATE DATABASE db_name;

Query OK,と出れば正しく作成されました。

テーブルの作成

では、続けてテーブルを作成します。
私は以下のようなデータ型でテーブルを作成しています。
カラムのデータ型精査には本当に失敗を繰り返したのですが、その試行錯誤や四苦八苦プロセスは兎も角も以下の情報となります。
タブ以降のスペースまでが、設定するカラム名となります。
一つ注意ですが、カラム名にハイフォン"-"を入れることや、インデント(初めの文字)を数値にするのは止めてください、設定時やCSVインポート時にエラーが発生します。
カラム名の英語表記理由は後述します。

create table jra_race_ms (
	race_d_id BIGINT(15) NOT NULL PRIMARY KEY comment '拡張レースID',
	Kaisai_Date DATE DEFAULT NULL comment '日付',
	Kaisai TEXT DEFAULT NULL comment '開催',
	Race_No INT(2) DEFAULT NULL comment 'レース数',
	Race_Name TEXT DEFAULT NULL comment 'レース名',
	Class TEXT DEFAULT NULL comment 'クラス',
	Course_Type VARCHAR(4) DEFAULT NULL comment 'コース種別',
	Distance INT(4) DEFAULT NULL comment '距離',
	Orbiting_Direct VARCHAR(2) DEFAULT NULL comment '周回',
	Race_Track VARCHAR(4) DEFAULT NULL comment '馬場',
	Weather VARCHAR(4) DEFAULT NULL comment '天気',
	Race_Course VARCHAR(6) DEFAULT NULL comment 'コース',
	Barrier INT(2) DEFAULT NULL comment '枠番',
	Horse_No VARCHAR(4) DEFAULT NULL comment '馬番',
	Horse_Name TEXT DEFAULT NULL comment '馬名',
	Horse_Gender VARCHAR(4) DEFAULT NULL comment '性別',
	Horse_Age INT(2) DEFAULT NULL comment '馬齢',
	Jockey_Name TEXT DEFAULT NULL comment '騎手名',
	Assigned_Wei FLOAT(3,1) DEFAULT NULL comment '斤量',
	Race_Time FLOAT(4,1) DEFAULT NULL comment '走破タイム',
	G3F_Finish FLOAT(3,1) DEFAULT NULL comment '上がり3F',
	Order_Arrival INT(2) DEFAULT NULL comment '着順',
	Length TEXT DEFAULT NULL comment '着差',
	Furlong_Pass VARCHAR(15) DEFAULT NULL comment '通過順',
	Win FLOAT(4,1) DEFAULT NULL comment '単勝オッズ',
	Horse_Pop INT(2) DEFAULT NULL comment '人気',
	Weight INT(3) DEFAULT NULL comment '体重',
	Inc_Dec INT(3) DEFAULT NULL comment '増減',
	Trainer TEXT DEFAULT NULL comment '調教師名',
	Trainer_Aff VARCHAR(4) DEFAULT NULL comment '厩舎所属',
	Owner TEXT DEFAULT NULL comment '馬主名',
	Prize_Money FLOAT(20,1) DEFAULT NULL comment '賞金',
	race_id BIGINT(14) DEFAULT NULL comment 'レースID',
	course_id INT(4) DEFAULT NULL comment 'コースID',
	horse_id BIGINT(13) DEFAULT NULL comment '馬ID',
	jockey_id VARCHAR(12) DEFAULT NULL comment '騎手ID',
	trainer_id VARCHAR(12) DEFAULT NULL comment '調教師ID',
	owner_id VARCHAR(12) DEFAULT NULL comment '馬主ID'
)
default charset=utf8
comment='JRAレース用TBL';

カラム名は基本的に英語表記です。
DBアプリケーション開発は元々英語圏のもの。
なので、日本語やその他の言語は後付け開発になります。
従って余り推奨されたものではありません
データ型についての説明は以下公式をご確認ください。

簡単な説明としては、、

INT型は数値のみです。
カッコ内()はLength、つまりはデータ長です。
マイナス"-"も対応しています。
BIGINT型は拡張されたINT型。
つまりはデータ長が長い場合のINTです。

DATE型は年月日のyyyy/mm/dd表記型。
この場合は"/"が"-"に変換されます。

Float型は小数点以下の数値も対応したデータ型。
従来はDecimal表記でしたが、8以降のバージョンで推奨されていないです。
(Version5以降は、Duble型或いはFloat型を選択が推奨されています。)
SELECT文検索では若干時間が掛かるのがデメリットです。
カッコ()内は例えば、(3, 1)なら3が数値のデータ長、1が小数点以下のデータ長です。

次からStrings(str)系統で文字列を表します。
Varchar型は文字列でデータ長を含めたものです。
カッコ()内は同じくデータ長。
昔のコーディングでよくあったデータ長の仕組みと違い、2バイト文字も同じデータ長となります。(×2はしなくて構いません。)
次に同じくText型
こちらのデータ長は任意となり、特に指定はせずに格納が出来ます。

DEFAULT NULLは読んで字の如く、初期値はNull状態許可です。
comment  '~'は、カラム名が英語表記だと日本人の英語表記インタープリタ要素が必要なためのコメント追記です(苦笑)
これで識別がし易いでしょう。

以上ですかね。
なので、インポートするCSVデータの書式に注意してください。
必ず、エンコードは「UTF8」として、改行コードは「LF」とします。
でないとインポート時にエラーが発生します
エラーコードについては公式より、以下をご確認ください。

次からいよいよCSVデータからのDBインポートとなります。
明日以降の投稿となります<(_ _)>

追記
過去データで大事な着差ですが、何馬身差とかはアナログ過ぎるので、、秒着差というものも追加しました。
事前に分→秒変換しておいたのが活きる事象です。
これは1着馬と2着馬の秒差を表したものです。
再度テーブルの作り直しw
あと、「オッズ断層」というのもファクターには在っていいモノなのです。
単勝オッズや複勝オッズの断層値が隔たるものや、一緒のものなどこれが複勝圏内に来るなどの理論があります。
とは言え、これは朝一オッズに関してですが。
しかし、レース結果から読み解く断層値もデータとして持つのも違った角度のオッズの読み方ですし、特定の傾向が出るかもしれませんね。
これは過去問なデータとしてライブラリとして持っておくのもアリでしょう~。
という訳でこの後に及んでも、既に必要カラムが何個か増える訳なのです。
こういった事に対応できるのもDB化の良い所ですね!


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