ともだちはすくないです

30代既婚男子。子供2人。日経先物トレードとかプログラミングとか英語とか

pythonで日経先物分析をするために、データを格納するmysqlを作成する②

前回MySQLを作成しましたが、データベースを作るだけではあまり意味がありません。中にデータを入れなきゃ使えません。ということでwebサイトから日経先物のデータを取得して、そのデータをMySQLに格納することにようやく成功しました。ちなみに言語はRubyでやりました。分析はpythonでやるんだからデータ取得、格納もpythonでやればよかったかなとちょっと後悔してますが、Rubyのほうが馴染みがあったので。今回はつまづいたポイントをいくつかメモとして残しておきます。


1、RubyプログラムからMySQLへの書き込み

ruby on railsではMySQLを利用したことあったんだけど、単純なrubyプログラムからのMySQL利用はやったことありませんでした。そのため割と時間がかかりました。ていうか、railsと同じくActiveRecordで出来るんやね。知らなったよ。てっきり「MySQL2」ライブラリとか使ってinsertするのかと思ってたよ。時間かかった。(そもそもpythonでやればもっと簡単だったのかも)

require "active_record"

class Nk225day < ActiveRecord::Base
end

# スクレイピングで取得した項目を「nk225day」テーブルの各項目に格納して、保存する。
nk225day = Nk225day.where(date: date, time: time).first_or_create
nk225day.start = start
nk225day.high  = high
nk225day.low   = low
nk225day.end   = endx
nk225day.volume = volume
nk225day.value = value
nk225day.save



2,TOPIX先物は小数点があった。

TOPIX先物のデータを格納するMySQLのテーブルを日経先物と同じように作成していました。で、データを格納した後に気づいたこと。。小数点が落ちてる。。てっきり忘れてました。ターミナルから以下のコマンドで型を変更

#「tpdays」テーブルの「start」カラムをFLOAT型に変更。FLOATの後ろのカッコは6桁表示でうち2桁は小数点という定義。 

mysql> ALTER TABLE tpdays CHANGE start start FLOAT(6,2);



3,売買代金が格納できない。

以下のエラーメッセージ。

`ensure_in_range': 7395934775 is out of range for ActiveRecord::Type::Integer with limit 4 (RangeError)

ふむふむ、どうやらint型では桁数が足りないとのこと。調べているとrubyのint型の範囲は「-2147483647〜2147483648」らしい。うん、これじゃ売買代金多い日は足りない。もっと大きな範囲を指定できる型にしないといけないようだ。

ということで「int」型を「bigint」型に変更します。mysqlのコマンドで「days」テーブルの売買代金「value」の型変更。

mysql> alter table days change value value bigint;

ちなみにTOPIXの売買代金は小数点を表示しないといけないので以下のようになる。

#topixの売買代金は12桁、うち2桁は小数点以下で指定。
mysql> alter tpdays days change value value DOUBLE(12,2);




4,CSVのインポート

csv名を指定するときにパス名が必要って多くのサイトに記載あったけど、パス名は不要。(パスつけるとエラーになる。)

#「n225.csv」を「nk225days」テーブルにインポート。

mysql> LOAD DATA LOCAL INFILE 'n225.csv' INTO TABLE nk225days FIELDS TERMINATED BY ',' 

結局csvのインポートは使いませんでした。







5,CSVの出力

MySQLで色んなエラーが出てえらい時間かかった。解決方法をメモ。


MySQLの中身をcsvに出力しようとしたら以下のエラー。

mysql> SELECT * FROM nk225fifteens INTO OUTFILE 'nikkei.csv' FIELDS TERMINATED BY ',';;

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

ここを真似した。ちなみに/usr/はターミナルで「open /usr」で開く。
qiita.com


#/usr/local/etc/my.cnfに追記

# *** upgrade to a newer version of MySQL.

[mysqld]
secure-file-priv = ""



上を解決したら、次は以下のエラー

$ mysql -uroot -p

Enter password: xxxxxx

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)


とか

ERROR! MySQL server PID file could not be found!


これは

$ ps ax | grep mysql

76560   ??  S      0:00.03 /bin/sh /usr/local/opt/mysql/bin/mysqld_safe --bind-address=127.0.0.1 --datadir=/usr/local/var/mysql
76780   ??  S      0:01.21 /usr/local/Cellar/mysql/5.7.17/bin/mysqld --basedir=/usr/local/Cellar/mysql/5.7.17 --datadir=/usr/local/var/mysql --plugin-dir

sudo kill TERM 76560
sudo kill TERM 76780

で解決。

ERROR! MySQL server PID file could not be found! - 世界を疑え





で、普通にMySQLを起動してようやくcsv化の完了。

mysql> SELECT * FROM nk225fifteens INTO OUTFILE 'nikkei.csv' FIELDS TERMINATED BY ',';

#格納場所は「/usr/local/var/mysql/nikkei」


疲れた。。


さて、ようやくpythonで分析しよう。