2016年11月6日

Jupyter NotebookからPostgreSQLに接続してデータを可視化する

最近、なんだかんだとデータに触る機会が増えてきております。

Unix系エンジニア兼DBAとしては、CLI(コマンドラインインターフェース)が生産性が高くて好きだけど、一方で可視化もお手軽にやりたい、というケースが多々あります。

Jupyter Notebookでデータベースに接続して可視化できる、という話は以前から聞いたことがあったのですが、実際に試してみたことがありませんでした。

今回、軽くPostgreSQLで試してみたのでその手順を簡単にご紹介します。

■セットアップ


以下の3つのモジュールをpipでインストールします。
  • jupyter
  • psycopg2
  • ipython-sql
[snaga@localhost]$ ipython notebook --ip=\* --port=8080
[W 16:01:11.273 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[W 16:01:11.273 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using authentication. This is highly insecure and not recommended.
[I 16:01:11.276 NotebookApp] Serving notebooks from local directory: /disk/disk1/snaga
[I 16:01:11.276 NotebookApp] 0 active kernels
[I 16:01:11.276 NotebookApp] The IPython Notebook is running at: http://[all ip addresses on your system]:8080/
[I 16:01:11.276 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

と起動してブラウザから接続できるようにします。

■PostgreSQLデータベースへの接続


まず、sql拡張をロードして、PostgreSQLへ接続します。

%load_ext sql
%sql postgresql://snaga@localhost/testdb

「Connected」と表示されたら成功です。

■クエリの実行


クエリを実行するには、「%sql」に続けてクエリを入力します。

%sql select table_catalog,table_schema,table_name,table_type from information_schema.tables where table_schema = 'public'
%sql select count(*) from orders

SQLの実行だけを行うと、その結果が表形式で表示されます。

■問い合わせ結果の利用


問い合わせ結果は「_」という変数に格納されていますので、これを取り出します。

ここでは、顧客ごとの売り上げを集計するクエリを実行し、その後で変数 res に結果を取り出します。

 # https://pypi.python.org/pypi/ipython-sql
%config SqlMagic.displaylimit=5

%sql select c_name,sum(o_totalprice) from customer left outer join orders on c_custkey = o_custkey group by c_name order by 2 desc

res = _

■問い合わせ結果の可視化


最後にmatplotlibを使って可視化します。

取り出した問い合わせ結果は普通にfor文で1レコードずつ取り出すことができますし、そのレコードはカラムのリストになっていますので、通常のSQLアクセスと同じようにデータを取り出します。

そして matplotlib に渡してグラフを描画します。
import matplotlib.pyplot as plt
%matplotlib inline

x = [rr[0] for rr in res]
y = [rr[1] for rr in res]

plt.bar(range(len(x)), y)


matplotlibの詳細については、長くなるのでここでは割愛します。(というか、私もまだ詳しくないので・・・)

■まとめ


今回は、Jupyter Notebookから直接SQLを発行して取得したデータを可視化する方法を試してみました。

Jupyter Notebookは探索的にデータを分析したり、作業の過程を記録に残したりするのに非常に便利です。また、matplotlibはさまざまなチャートを描くことができます。

ぜひ、このようなツールを活用しつつ、データでいろいろ遊んでみていただければと思います。

私ももう少しmatplotlibを活用できるように勉強をしてみようと思います。

では。

■参考文献


0 件のコメント:

コメントを投稿