
TMLをPythonでまとめて加工・出力する方法についてご紹介します。
こんにちは!ShintaroInomataです。
TML(ThoughtSpot Modeling Language)は、ThoughtSpot上のオブジェクトをYAML形式で表現できる便利な仕組みです。しかし、実際の業務では同じ形式のライブボードやAnswerを複数用意したい場面も多く、一つひとつを手作業で編集するのは大変です。
そこで今回の記事では、あらかじめ定義リストを準備しておき、そのリストを参照しながらまとめてTMLを生成する方法を解説します。この方法を使えば、データソース名やグラフの種類、配色などをリストで管理し、スクリプトを実行するだけで複数のTMLファイルを一括で出力できます。
TMLについてはこちらの記事をご覧ください。
thoughtspot-tmlについて
ThoughtSpotのTMLをプログラムから加工するためのライブラリが、公式にGitHubで公開されています。READMEには、詳細な使い方やサンプルコードが記載されていますので、初めて触る方はまずそちらを確認すると理解がスムーズです。
https://github.com/thoughtspot/thoughtspot_tml
基本的な使い方について簡単に解説します。
ライブラリはPythonの標準的なパッケージ管理ツールで簡単にインストールできます。以下のコマンドを実行してください。
pip install thoughtspot-tml
以下のコードでは、ローカル環境に保存されているTMLファイルを読み込みます。ここではAnswerのTMLファイルを読み込んでいます。
from thoughtspot_tml import Answer
tml=Answer.load("Input.tml") #tmlファイルをロード
このオブジェクトがどういう中身になっているか確認するには以下のコードで確認することができます。オブジェクトは辞書やリストに基づいた構造になっています。
このコードから、プログラムからどのようにアクセスするかが分かります。
tml.to_dict()
例えば、Answerの名前を参照・変更したい場合は以下のように記述します。
print(tml.answer.name) #現在のAnswer名を参照
tml.answer.name = "新しい名前" # Answer名を更新
編集を終えたら、変更内容をファイルに書き出します。以下のコードで「Output.tml」として保存することができます。
tml.dump("Output.tml")
TMLの加工
加工内容の概要
ここからは、先ほどインストールしたライブラリを実際に利用して、TMLを加工していきます。
今回の加工対象は以下の3点です。
- ライブボード名の変更
- グラフの種類の変更
- グラフの色の変更
こうした加工を行うことで、同じレイアウトのライブボードを複数のデータソースで展開したり、可視化スタイルを一括調整することができます。
今回テンプレートとするライブボードは、以下のようなシンプルな構成です。
- 使用列: 「product」 と 「amount」
- 配置: テーブルとグラフを表示
- データソースの列数を 「number of row」 として表示
このライブボードを基盤とし、後ほど異なるデータソースや可視化設定を適用していきます。
上記ライブボードのTMLは事前にローカル環境へエクスポートしておきます。
エクスポート方法の詳細については、先ほどご紹介した記事「ThoughtSpot Modeling Language(TML)について」をご覧ください。
次に、ThoughtSpot上にあらかじめ3つの異なるデータソースを用意します。
これらはすべて、テンプレートTMLと同じフォーマットを持つため、加工後のライブボードにスムーズに適用できます。
変更内容は以下になります。
- Normal_3rows
→ライブボード名のみ変更。可視化の種類や色はそのまま。
- Pie_4rows
→ライブボード右側のグラフを 円グラフ(PIE) に変更。
- HorizontalBar_5rows
→グラフを 横棒グラフ(BAR) に変更し、さらに色を 赤(#ff0000) に変更。
TMLの編集
まずは加工対象を定義したリストを作成します。このリストをもとに、後ほどコードでTMLの加工を行います。
definitions = [
{
"table_name": "TML_Liveboard_Normal_3rows",
"datasource_name": "Normal_3rows",
"chart_type": "COLUMN",
"chart_color": None
},
{
"table_name": "TML_Liveboard_Pie_4rows",
"datasource_name": "Pie_4rows",
"chart_type": "PIE",
"chart_color": None
},
{
"table_name": "TML_Liveboard_HorizontalBar_5rows",
"datasource_name": "HorizontalBar_5rows",
"chart_type": "BAR",
"chart_color": "#ff0000"
}
]
ここでは、ライブボード名、データソース名、チャートタイプ、色をキーとして定義しています。
以下が編集コードになります。for文を使って書き換えるシンプルなコードです。
for defn in definitions:
tml=Liveboard.load("Input.tml") #テンプレートTMLを読み込む
for key, val in defn.items():
if val is None:
continue
if key=="table_name":
tml.liveboard.name=val #テーブル名の変更
elif key =="datasource_name":
for i in range(0,len(tml.liveboard.visualizations)):
#データソースの変更
tml.liveboard.visualizations[i].answer.tables[0].id=val
tml.liveboard.visualizations[i].answer.tables[0].name=val
elif key =="chart_type":
tml.liveboard.visualizations[1].answer.chart.type=val #グラフの変更
elif key=="chart_color":
#グラフの色の変更
tml.liveboard.visualizations[1].answer.chart.client_state_v2=tml.liveboard.visualizations[1].answer.chart.client_state_v2.replace("#2E75F0", val)
tml.dump(f"{defn["table_name"]}.tml") #加工済みTMLを出力
このコードを実行することで、定義リストに基づき3種類のTMLファイルが自動的に生成されます。
インポートと結果確認
作成した3つのTMLファイルは「データワークスペース」からインポートすることができます。
インポートが完了すると、ライブボードの一覧画面に新しく3つのライブボードが追加されていることを確認できます。
ここから実際の加工結果を順番に見ていきます。
最初の「Normal_3rows」では、ライブボード名が変更されています。また、「number of row」を確認すると、データソースが切り替わり、行数が新しいデータソースに基づいた値に更新されていることが分かります。
次に「Pie_4rows」です。こちらでは、右側のグラフが円グラフ(Pie Chart)に変更されています。
最後に「HorizontalBar_5rows」です。このライブボードでは、グラフが横棒グラフに変更され、さらに色が赤に変更されています。
まとめ
今回紹介したように、thoughtspot-tml ライブラリ を使うと、あらかじめ定義したルールに基づいてTMLをまとめて加工・生成することが可能です。
皆さんもぜひ thoughtspot-tml を使ってみてください!