リモートサーバ上のMySQLからデータを引っ張ってきて、pandasで処理したかったのです。環境は以下です。
- python 3.5.2
- pandas 0.19.2
rdbからデータ取得するための関数が、pandasには用意されています。「pandas.read_sql_query」は、実行したSQL結果をデータフレームにしてくれます。「pandas.read_sql_table」は、指定したテーブル内のデータをデータフレームにしてくれます。今回はクエリーを実行したいので、「pandas.read_sql_query」を利用します。
公式ドキュメントはこちら。
pandas.read_sql_query — pandas 0.19.2 documentation
使い方はこちら。
pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)
基本的にsqlとconのパラメータを与えます。その他パラメータは必要に応じて確認。sqlはその名の通り実行するクエリーを与えてあげればよく、conは接続先のdb情報を教えてあげます。接続情報はSQLAlchemyを利用したコネクションで与えることになります。
SQLAlchemyとは、僕も今回知りましたが、「SQL Toolkit and Object Relational Mapper」と説明されるもので、データベースとオブジェクト指向言語の間を繋いでくれるやつですね。
使い方は以下の通り。これでpythonとrdb間のコネクションを貼ってくれます。事前にpipでSQLAlchemyをインストールしておきます。
from sqlalchemy import create_engine
engine = create_engine('dialect+driver://username:password@host:port/database')
公式で、各RDB毎のサンプルを記載してくれています。
Engine Configuration — SQLAlchemy 1.1 Documentation
MySQLでの詳細サンプルはこちら。丁寧なサイトですね。
MySQL — SQLAlchemy 1.1 Documentation
尚、通常のPython環境ではMySQLのドライバなんてインストールされていないので、事前にドライバを入れておく必要あります。入っていない場合、以下のように怒られます。
ImportError: No module named 'MySQLdb
今回はなるべく軽めのものということで、「PyMySQL」というやつを利用することとしました。
公式。「a pure-Python MySQL client library」と説明されてます。pipで「PyMySQL」をインストールしておきましょう。
GitHub - PyMySQL/PyMySQL: Pure Python MySQL Client
ということで以上の事前準備を踏まえ、今回の目的であった「pandas.read_sql_query」を書くと以下みたくなります。
import pandas from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root:password@192.168.1.24:3306/kessan') sql = "select code, stock_price, Date_Day from kessan.stock_price where Date_Day between '2016-08-01' and '2016-12-30'" df = pandas.read_sql_query(sql, engine)
これでクエリー結果がdfというデータフレームになってくれてます。