LoginSignup
0
0

More than 3 years have passed since last update.

初心者が機械学習をやってみたら(その5)

Posted at

今回は、先にダウンロードした各種ボートレースデータファイルから、
必要項目を取得し、データベース(今回は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)]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0