MySQLで以下テーブルを作成して、PandasのDataFrameにセットするところを実施します。テーブル化するとデータの結合が簡単に出来るので楽ですね。ただ、、リモート接続しているので、データ量が増えた時の時間とかメモリ消費量が少し心配です。
データベースには以下2テーブルを作成してデータを入れてあります。
CREATE TABLE `result` ( `ファイル名` varchar(20) NOT NULL, `レース名` varchar(20) NOT NULL, `日にち` varchar(20) NOT NULL, `日付` varchar(20) NOT NULL, `開催地` varchar(20) NOT NULL, `ラウンド名` varchar(10) NOT NULL, `種別` varchar(10) NOT NULL, `天気` varchar(10) NOT NULL, `風向` varchar(10) NOT NULL, `風速` int(3) NOT NULL, `波` int(3) NOT NULL, `着` int(1) NOT NULL, `艇` int(1) NOT NULL, `登番` int(4) NOT NULL, `選手名` varchar(20) NOT NULL, `モーター` int(3) NOT NULL, `ボート` int(3) NOT NULL, `展示` float NOT NULL, `進入` int(1) NOT NULL, `スタートタイミング` float NOT NULL, `レースタイム` varchar(7) NOT NULL, `レースタイム秒` float NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `player` ( `ファイル名` varchar(20) NOT NULL, `登番` int(4) NOT NULL, `名前漢字` varchar(16) NOT NULL, `名前カナ` varchar(15) NOT NULL, `支部` varchar(4) NOT NULL, `級` varchar(2) NOT NULL, `生年月日` varchar(7) NOT NULL, `性別` int(1) NOT NULL, `年齢` int(2) NOT NULL, `身長` int(3) NOT NULL, `体重` int(2) NOT NULL, `血液型` varchar(2) NOT NULL, `勝率` float NOT NULL, `複勝率` float NOT NULL, `1着回数` int(3) NOT NULL, `2着回数` int(3) NOT NULL, `出走回数` int(3) NOT NULL, `優出回数` int(2) NOT NULL, `優勝回数` int(2) NOT NULL, `平均スタートタイミング` float NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
あとは欲しいデータのSQLを作成して「pd.read_sql」を使うだけです。ちなみに、ランダムフォレストで特徴量の重要性を計測したところ、レース結果データにおいては「登番」「モーター」「ボート」以外(天気とか風速とか波とか)は殆ど0に近く、省略する事にしました。
def loaddata(self): db = MySQL() self.mysql = db.open_connection() sql = """ SELECT r.`登番`, r.`モーター`, r.`ボート`, p.`勝率`, p.`複勝率`, p.`1着回数`, p.`2着回数`, p.`優出回数`, p.`優勝回数`, r.`レースタイム秒` FROM `result` r, `player` p WHERE r.`登番` = p.`登番` """ # pandas でMySQLテーブルを読む mem_usage = memory_usage(-1, interval=.2, timeout=1) df = pd.read_sql(sql, self.mysql) print(mem_usage) print(df.head()) db.close_connection()
コメント