はじめに
「機械学習するときは、まずデータセットを眺めて概要を掴んでから」といわれます。
PandasのDataFrameを可視化する方法としてPandas Profilingがメジャーですが、もう少しグリグリできるとうれしいです。
OSSのBIツールでアレコレしたら良い感じなのでは?と思い、最近人気急上昇のMetabaseとPandasを組み合わせる方法を共有します。
↓irisデータを読み込ませて、自動探査(X-ray)してみました。
このMetabase、使いやすさと見た目のかっこよさはダントツなのですが、データソースはデータベースからの読み込みのみ(ブラウザ上で「手元のcsvデータをアップロードしてインポートする」ができない)な模様です。そこで、Docker上にMetabaseおよびデータベース(PostgreSQL)を立て、そのデータベースに対してDataframeの中身を書き込みます。
環境
macOS 10.15
やり方
ファイル類はgithubにアップロードしてあります。以下コマンドでローカルに落としてください。
$ git clone git@github.com:nekodango/metabase-pandas.git
コンテナを立てる
Metabase・データベース(PostgreSQL)がまとめて立つようdocker-compose.ymlを書きます。
version: "3"
services:
metabase:
container_name: metabase
image: metabase/metabase:v0.33.3
environment:
MB_DB_FILE: /metabase-data/metabase.db
volumes:
- ./data/metabase_data:/metabase-data
ports:
- "3000:3000"
depends_on:
- postgres
postgres:
container_name: postgres
image: postgres:11.5
environment:
POSTGRES_DB: metabase
POSTGRES_USER: metabase
POSTGRES_PASSWORD: metabase
ports:
- "5432:5432"
volumes:
- ./data/postgres_data:/var/lib/postgresql/data
で、ターミナルからこのdocker-compose.ymlと同じディレクトリを開いて以下を実行してください。
$ docker-compose up -d
Metabaseの初期設定
- ブラウザで http://localhost:3000 を開くと、以下の画面が出ます。
![01.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2Fad653d36-c684-4494-337c-bbb02e72bae1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=dc2b65d603727e46274bb502b519b220)
- 「Let's get started」をクリックすると、アカウント作成画面に進みます。
![01.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2F88aa51f8-4606-0018-f280-87085fc43176.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d333f8b9c0841f240114e46e2303c1fb)
- 必要事項を入れます。
項目名 | 例で入れる値 | 備考 |
---|---|---|
①姓 | neko | |
②名 | dango | |
③メールアドレス | metabase@example.com | 実在しないメールアドレスでもいける |
⑥会社名 | # | 空欄だと先に進めないので、何でもいいので入れる |
![02.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2Fb40ab473-f949-7b0a-dfd7-8bcccfc70cb5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f4ca6e9604027b7a6a52491da6d9400e)
![04.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2F51fbfea0-6a9e-9778-69ea-7e0ac3032db2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=665f082101b9a12700fa3909b5a1ac1d)
- 必要事項を入れます。
項目名 | 例で入れる値 |
---|---|
①設定名 | postgres |
②データベースのホスト名 | postgres |
③ポート番号 | 5432 |
④データベース名 | metabase |
⑤ユーザ名 | metabase |
⑥パスワード | metabase |
![06.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2Fabd7a237-ad32-1082-0f42-8e99affc4af2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7ffc157f8b278db815354a9e2cacec7d)
- 「Next」をクリックすると
![07.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2Fb481bb6e-4316-66e2-8135-b90351ad2696.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=12d229bfcee3eca10d6fb20b3595773e)
- 「匿名データの提供に同意しますか?」と出るので、お好みでスイッチを切り替えてから「Next」をクリックすると
![08.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2Fea80bcab-e11c-42dd-fbd0-1495b92f17d8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=818e6ca743a4ac66b3c25ac738c9f379)
- 「Take me to Metabase」をクリックすると完了です。
![09.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F209681%2Fa60816f3-aba7-375c-3dc1-1eb881e790e7.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1c239f48bf6a37c1e5e264b8ef3efcfa)
表示を日本語に変更する
画面表示が英語のままなので、日本語にします。
一度ログアウトします。
Python環境を作る
Pandas,SQLAlchemy,Psycopg2をAnaconda環境に作ります。
$ conda create -n metabase python=3.6
$ conda activate metabase
$ conda install pandas sqlalchemy psycopg2
irisのcsvをデータベースに書き込む
import pandas as pd
import datetime
from sqlalchemy import create_engine
connection_config = {
'user': 'metabase',
'password': 'metabase',
'host': 'localhost',
'port': '5432',
'database': 'metabase'
}
engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{database}'.format(**connection_config))
df = pd.read_csv('data.csv')
df.to_sql('iris', con=engine, if_exists='replace', index=False)
「data.csv」を同じディレクトリに置いた状態でこの「to_postgres.py」を実行すると、csvを読み込んでデータベースに書き込みます。
ここではirisのcsvをダウンロードして、「to_postgres.py」を実行してみます。
$ curl https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv -o data.csv
$ python to_postgres.py
データベースを同期する
データベースと手動で同期すると、いま投入したirisテーブルが出てきます。