Metabaseのカードからデータを取得しデータフレームにしたい

無料で便利なMetabaseですが、クエリに対し、1グラフだったり、取り回しが悪いことがあります。

そこで、大枠のクエリだけはMetabase上で書き、
Python/Rで集計軸を変えたり、結合するといったことをしたくなりました。

基本的な手順

  1. session_idを取得
  2. 上記を使い、カードからデータを取得する

という順番で行きます。

1つめは/session,2つ目は/card//queryというAPIを叩けば良さそうです。

ただし、2つめのAPIは二種類(実際のカード表示/ファイル出力)あり、
ファイルDLのAPIでないと、全量とれないようです。

コード

とりあえず、だらだら書くとこんな感じです。

import requests
import json

base_url = "your metabase url"


# session_idを取得
ipass = {'username':'your_user_name','password':'your pass'}
res = requests.post(base_url + '/api/session',json=ipass)

headers = {
   'X-Metabase-Session':json.loads(res.text)['id],
   'Content-Type':'application/json'
}

# データを取得
import pandas as pd

card_id = '100'
res_format = 'json'

url = base_url + '/api/card/{0}/query/{1}'.format(card_id.res_format)
res_data = requests.post(url,headers = headers)

df = pd.read_json(res_data.text)

▼read_jsonに関してはこちら(時々日付を勝手にparseするので、、、)

esu-ko.hatenablog.com

再利用性をあげるために

上記をクラスかなんかにすると便利です。

class Metabase:
    def __init__(self,user,pass,base_url):
        self.user_name = user
        self.pass = pass
        self.base_url = base_url

        self.session_id = #上のsession_idとるところ

      def get_data(self,card_id):
        #上のデータをとるところ
        return df

この.pyを読み込み、インスタンス化してあげれば、毎回使いまわせますね。