Docker上のMetabaseでPandasのDataFrameをお手軽に眺める

# はじめに
「機械学習するときは、まずデータセットを眺めて概要を掴んでから」といわれます。

PandasのDataFrameを可視化する方法として[Pandas Profiling](https://github.com/pandas-profiling/pandas-profiling)がメジャーですが、もう少しグリグリできるとうれしいです。

OSSのBIツールでアレコレしたら良い感じなのでは?と思い、最近人気急上昇の[Metabase](https://www.metabase.com/)とPandasを組み合わせる方法を共有します。

↓irisデータを読み込ませて、自動探査(X-ray)してみました。
![iris.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/acf5e890-36a6-8efd-2f43-0f6c22d99260.gif)

このMetabase、使いやすさと見た目のかっこよさはダントツなのですが、データソースはデータベースからの読み込みのみ(ブラウザ上で「手元のcsvデータをアップロードしてインポートする」ができない)な模様です。そこで、Docker上にMetabaseおよびデータベース(PostgreSQL)を立て、そのデータベースに対してDataframeの中身を書き込みます。

# 環境
macOS 10.15

# やり方
ファイル類は[github](https://github.com/nekodango/metabase-pandas)にアップロードしてあります。以下コマンドでローカルに落としてください。

```
$ git clone git@github.com:nekodango/metabase-pandas.git
```


## コンテナを立てる
Metabase・データベース(PostgreSQL)がまとめて立つようdocker-compose.ymlを書きます。

```yml: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の初期設定
1. ブラウザで http://localhost:3000 を開くと、以下の画面が出ます。
<img width="591" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/ad653d36-c684-4494-337c-bbb02e72bae1.png">

2. 「Let's get started」をクリックすると、アカウント作成画面に進みます。
<img width="591" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/88aa51f8-4606-0018-f280-87085fc43176.png">

3. 必要事項を入れます。

|項目名|例で入れる値| 備考 |
|:-------------------|:-------------------------|:---------------------------------|
|①姓|neko||
|②名|dango||
|③メールアドレス|metabase@example.com|実在しないメールアドレスでもいける|
|⑥会社名|#|空欄だと先に進めないので、何でもいいので入れる|

<img width="613" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/b40ab473-f949-7b0a-dfd7-8bcccfc70cb5.png">


4. 「Next」をクリックすると、
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/ac3d1be4-1068-353b-95ac-5e26237ddae8.png)

5. データベース設定画面になります。「PostgreSQL」を選んで、
<img width="613" alt="04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/51fbfea0-6a9e-9778-69ea-7e0ac3032db2.png">

6. 必要事項を入れます。

|項目名|例で入れる値|
|:-------------------|:--------------------|
|①設定名|postgres|
|②データベースのホスト名|postgres|
|③ポート番号|5432|
|④データベース名|metabase|
|⑤ユーザ名|metabase|
|⑥パスワード|metabase|

<img width="613" alt="06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/abd7a237-ad32-1082-0f42-8e99affc4af2.png">




7. 「Next」をクリックすると
<img width="613" alt="07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/b481bb6e-4316-66e2-8135-b90351ad2696.png">

8. 「匿名データの提供に同意しますか?」と出るので、お好みでスイッチを切り替えてから「Next」をクリックすると
<img width="613" alt="08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/ea80bcab-e11c-42dd-fbd0-1495b92f17d8.png">


9. 「Take me to Metabase」をクリックすると完了です。
<img width="613" alt="09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/a60816f3-aba7-375c-3dc1-1eb881e790e7.png">

## 表示を日本語に変更する
画面表示が英語のままなので、日本語にします。
<img width="613" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/d43149fe-089f-8dbb-64f1-9fc783c43f2e.png">
<img width="613" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/527ebe25-0bad-f016-5d8c-b2661d5df8b3.png">
<img width="613" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/94324907-9aa7-b122-195d-e07d6e450dac.png">
<img width="613" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/0248086b-d7bf-c711-59eb-074ad2f13a14.png">
一度ログアウトします。
<img width="613" alt="15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/3ead44ea-1268-5fad-1974-32d9b0ffca54.png">


# Python環境を作る
Pandas,SQLAlchemy,Psycopg2をAnaconda環境に作ります。

```
$ conda create -n metabase python=3.6 
$ conda activate metabase
$ conda install pandas sqlalchemy psycopg2
```

# irisのcsvをデータベースに書き込む
```python:to_postgres.py
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テーブルが出てきます。
<img width="613" alt="16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/97a4bf66-3911-d579-595b-0fd8b3d77e4b.png">
<img width="613" alt="17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/61419feb-ea65-c85b-dd11-71ddc27aac7d.png">
<img width="613" alt="18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/d2713b65-26ac-c8e8-ab21-b04300cb96f8.png">
<img width="613" alt="19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/0fff61d8-1052-e73c-2414-441c722c7317.png">
<img width="613" alt="20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/02bd4be0-a49a-c5c2-2851-7adc94670b49.png">
<img width="613" alt="21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/5a6ba90f-fd48-fccf-3d07-32e1f16106a8.png">
<img width="613" alt="24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/502ce53b-cd09-db5f-0ae6-f490b5d6651c.png">

## 先ほど投入したデータが出ていることを確認する
動機が完了すると、先ほど作ったテーブルが表示されます。
<img width="613" alt="25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/594ce19c-f5e1-428e-3f4d-d81dde219093.png">

自動探査(X-ray)できます。
<img width="725" alt="26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209681/2a0796a6-0c20-1206-ab85-7a0ebf343091.png">