今回は、先にダウンロードした各種ボートレースデータファイルから、
必要項目を取得し、データベース(今回はMongoDB)に登録します。
データベースのコレクションは、各データファイル毎に
・番組表
・競走成績
・レーサー期別成績
の3コレクションを作成します。
#1.各種データの取得から登録します。
各種データファイルから必要項目を取得するためのポイントを何点か記録します。
説明は番組表で記述しています。
##1.1.バイナリモードで読み込む
番組表の文字コードはSJISですので、Jetsonにて解析するため、
バイナリモードにてファイルを解析します。
# filePath:番組表ファイルパス
# 'br':バイナリモード読み込み
with open(filePath, 'br') as raceData:
##1.2.日本語はUTF-8で取得
バイナリモードで解析しているため、日本語部分は取得したデータをUTF-8に変換する必要がある。
# 選手名
# line[6:14]:選手名を表す部分バイト位置
# decode('cp932'):SJISからデコードしUTF-8に変換(あってる?)
# cp9321がSJISを意味している。
playerName = line[6:14].decode('cp932')
##1.3.級別など数字でない項目は数値化
級別(A1、A2など)はボートレーサーのランクを表します。
しかし、機械学習させるためには数値化が必須となります。
# 級別
grade = line[22:24].decode('cp932')
# 級別が'A1'である場合
if 'A1' in grade:
# 数値化し1とする
numGrade = 1
# 級別が'A2'である場合
elif 'A2' in grade:
# 数値化し2とする
numGrade = 2
# 級別が'B1'である場合
elif 'B1' in grade:
# 数値化し3とする
numGrade = 3
# 級別がその他である場合
else:
# 数値化し4とする
numGrade = 4
##1.4.MongoDBに登録
MongoDBへは、Pythonの辞書型(Dictionary型)で登録します。
辞書にデータを詰め込み、登録すると言う流れです。
# mongo DB
from pymongo import MongoClient
# mongoDB
client = MongoClient()
# データベース
# DBNAME:データベース名称
db = client[DBNAME]
# プログラムコレクション
# P_COLL:番組表格納コレクション名
pgCol = db[P_COLL]
# 番組表情報辞書
pgDic = {}
# 開催場所格納
# LOCATION:MongoDBに対する開催場のキー名称
# ちなみに私は、「LOCATION = 'location'」で定義しました。
pgDic[LOCATION] = int(location)
# レース番号取得
raceNo = int(line[0:4].decode('cp932'))
# RACENO:MongoDBに対する開催場のキー名称
# ちなみに私は、「RACENO = 'raceno'」で定義しました。
pgDic[RACENO] = raceNo
(以降、必要項目を辞書に登録)
try:
# 番組表情報辞書を登録
# insert_oneは、1件挿入メソッド
result = pgCol.insert_one(pgDic)
# キーが重複する場合
# 番組表コレクションは、「日付、開催場、レース番号」をキーとする。
except pymongo.errors.DuplicateKeyError:
# キー重複例外は無視
pass
#2.MongoDBに関して
##2.1.MongoDBの各種名称を忘れないように。
MongoDBとRDBの名称の比較
MongoDB | RDB | MongoDBの特徴 |
---|---|---|
データベース | データベース | 「CREATE DATABASE」は無く、「USE」でデータベース作成 |
コレクション | テーブル | スキーマ定義が無い |
ドキュメント | レコード | ドキュメントは、JSON形式(キー・バリュー) |
##2.2.MongoDBでユニークインデックスを設定します。
重複データが蓄積させないため、
MongoDBの各コレクションにユニークインデックスを設定
番組表を例に説明します。
番組表は日付、開催場、レース番号で一意に決まるため、ユニークインデックスを作成する。
ちなみに、競走成績も同じキーでユニークインデックスを作成しました。
項目 | MongoDB内での名称 |
---|---|
データベース名 | boatRace |
コレクション名 | program |
日付キー | date |
開催場キー | location |
レース番号キー | raceno |
$ mongo
MongoDB shell version: 3.2.11
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> use boatRace
switched to db boatRace
> boatRace.program.createIndex( { date: 1, location: 1, raceno: 1 }, { unique: true } )
##2.3.MongoDBをビジュアル的に見たい場合
Jetsonはヘッドレスで運用しているため、MongoDBのデータをビジュアル的に見たい場合は、
**MongoDB Compass**を使用することにより、データを確認できます。
#関連(連載)
初心者が機械学習をやってみたら(その0)
[初心者が機械学習をやってみたら(その6)]