Python

【フローで作業を効率化⁉】Streamlitのコンポーネント「barfi」って何?(前編)

今回は、Streamlitのコンポーネントであるbarfiについてです。

barfiって何?

バルフィという「雪」の意を持つお菓子がインドにあるようです。
「雪のようなくちどけ」のお菓子なのでしょうか。
きっと作成者が好きなのでしょう。

barfiは、Streamlitのコンポーネントで、「Pythonをベースとしたグラフィカルなプログラミング環境」を提供してくれます。
ひとたびベースとなる環境を構築してしまえば、ブロックをつなげるだけでやりたい処理ができちゃう優れものです。
さらにフローの保存もできるので、同じ処理を簡単に再現することが可能です。

barfiのgithubより(https://github.com/krish-adi/barfi)

barfiの実装に必要な知識

構成要素は、①ブロック、②フロー図作成エリア、③フロー図作成後の部分(任意)の3つです。

①ブロック

barfiのgithubに用意されているdemo.pyを用いて説明します。
12行目から21行目のsplitterに注目します。

splitter = Block(name='Splitter')
splitter.add_input()
splitter.add_output()
splitter.add_output()
def splitter_func(self):
    in_1 = self.get_interface(name='Input 1')
    value = (in_1/2)
    self.set_interface(name='Output 1', value=value)
    self.set_interface(name='Output 2', value=value)
splitter.add_compute(splitter_func)

1行目(demo.py:12行目)
ブロッククラスはbarfi内で定義されているものを使います。

2~4行目(demo.py:13~15行目)
その後、ブロックの入出力を定義します。入出力は必要な数だけ設定できますし、型を問わないので、様々なフローに適用が可能です。また、オプションの設定も可能です(末尾のコード全文では実際に使用しています)。入力以外に必要な要素はこちらで設定が可能で、上で用いているセレクトボックス以外にも、数値や文字列の入力など幅広く対応しています。(詳しくはこちら

5~9行目(demo.py:16~20行目)
実装したい関数を定義します。今回の場合、入力値を2分割する関数です。selfを用いて入出力やオプションの値への関与が可能です。

10行目(demo.py:21行目)
最後に定義した関数をブロックと紐づけることで、ブロックが完成します。

この型に則ることでブロックの作成が簡単にできます。

②フロー図作成エリア

github内のdemo.pyでのコードは以下の通り。

load_schema = st.selectbox('Select a saved schema:', barfi_schemas())

compute_engine = st.checkbox('Activate barfi compute engine', value=False)

barfi_result = st_barfi(base_blocks=[feed, result, mixer, splitter],
                    compute_engine=compute_engine, load_schema=load_schema)

詳細は割愛しますが、load_schemaは保存したフロー図の選択、compute_engineはフロー図の実行可否、barfi_resultはフロー実行結果の格納が行われています。

3行目のbase_blocksは適宜変える必要がありますが、それ以外はこれをそのまま使えばフロー図を作成する画面を組み込むことができます。

③フロー図作成後の部分(任意)

ブロック内の操作のみで完結する場合は、ここのコードは必要ありません。ただ、フローの途中のデータを確認したかったり、フローの後のデータに対してを用いて何かしたい場合は、ここで操作をするのがいいと思います。

demo.py内では、フロー実行結果の出力を行っていますね。
if文を用いることで、フロー実行時のみ出力される状態を作っています。また、フロー実行結果はjson形式で保存されており、うまくやれば各ブロックの入出力等も確認可能です。

if barfi_result:
    st.write(barfi_result)

最後に

Streamlitのコンポーネントbarfi、いかがだったでしょうか。
一度実装すればノーコードでフローを組んで作業可能になること、ブロックへの関数の実装はPythonでできること、といった点はなかなか魅力的だと感じています。
中編では、実際にbarfiを使ってみたいと思います。

今回はここまで!

yujin
『解像度を上げる』