はじめに
下図のように、Metabaseで変数を設定したSQLクエリに対して、PythonからAPIを叩いて、クエリ結果を取得します。
環境
$sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G14042
Metabase への接続についてはmetabase_apiを使用しました。
pip install metabase-api
でインストール済みです。
Metabaseの構築についてはこちらを参照。
Pythonコード
Metabaseへのリクエスト送信用のコードが下になります。
MetabaseConnector.py
from metabase_api import Metabase_API
from enum import Enum
from typing import List, Union
import pandas as pd
import json
import os
class MbVariableType(Enum):
NUMBER = 'number'
DATE = 'date/single'
TEXT = 'category'
class MaVariable:
def __init__(self, var_name: str, var_type: MbVariableType, var_value: Union[str, int, float]):
self.var_name: str = var_name
self.var_type: MbVariableType = var_type
self.var_value: Union[str, int, float] = var_value
class MetabaseConnector:
def __init__(self):
self.mbcon = Metabase_API(
domain=os.getenv("METABASE_DOMAIN"),
email=os.getenv("METABASE_EMAIL"),
password=os.getenv("METABASE_PASSWORD")
)
def getQuestionToDf(self, id: int, params: List[MaVariable]=None ) -> pd.DataFrame:
url = '/api/card/' + str(id) + '/query/json'
if params is not None:
parameters = []
for iparam in params:
parameters_ = {
'type': iparam.var_type.value,
'target':['variable', ['template-tag', iparam.var_name]],
'value': iparam.var_value
}
parameters.append( json.dumps(parameters_, ensure_ascii=False) )
url += '?parameters=['+','.join(parameters)+']'
response = self.mbcon.post(url)
return pd.DataFrame(data=response)
上記のコードでは、Metabaseへリクエストを投げた結果をpandas
のDataFrame
に変換したかったため、JSONフォーマットで出力するAPIを叩いています。
APIについては公式ドキュメントを参照してください。
実行用のコードが下です。
run.py
from MetabaseConnector import MbVariableType, MaVariable, MetabaseConnector
params = [
MaVariable("from", MbVariableType.DATE, '2021-03-10'),
MaVariable("minNumLgtm", MbVariableType.NUMBER, 3),
MaVariable("keyword", MbVariableType.TEXT, "%変換%")
]
df = MetabaseConnector().getQuestionToDf(id=11, params=params)
print(df.head())
print(len(df))
本記事の一番上に添付した画面キャプチャに示している変数の設定と同じにしています。
実行すると192行分のデータが取得できるはず。
環境変数にMetabaseのURL、ユーザ名、パスワードを設定しておきます。
export METABASE_DOMAIN="http://192.168.0.20" # MetabaseのURL
export METABASE_EMAIL="user@sample.com" # Metabaseのユーザ名
export METABASE_PASSWORD="PASSWORD" # Metabaseのユーザパスワード
実行します。
$python run.py
numPV title
0 15488 Box-Cox変換を理解してみる
1 15490 Box-Cox変換を理解してみる
2 15490 Box-Cox変換を理解してみる
3 15490 Box-Cox変換を理解してみる
4 15490 Box-Cox変換を理解してみる
192
Metabase上で実行した結果と同じ結果を得ました。