/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2023/03/16 読んだ記事まとめ(Streamlit で Snowflake のデータを編集, Looker+Streamlit)

Streamlit のデータ編集機能と、それを利用した Snowflake テーブル編集についての記事の紹介です。最後に Looker と Streamlit を合わせて使っている記事を見つけたので、それも紹介します。

Streamlit data editor

Streamlit のプレビュー機能ですが、編集可能なテーブルが先月2023年2月に登場しました。以下の gif は公式ドキュメントのサンプルをキャプチャしたものです。セルをダブルクリックすることで編集モードとなり、値が編集できます。

使うのは簡単で、データフレームなどのデータオブジェクトを st.experimental_data_editor メソッドへ渡すだけです。返り値もデータオブジェクトとなり、上の例では rating が最も高いコマンドを動的に表示しています。

import streamlit as st
import pandas as pd

df = pd.DataFrame(
    [
       {"command": "st.selectbox", "rating": 4, "is_widget": True},
       {"command": "st.balloons", "rating": 5, "is_widget": False},
       {"command": "st.time_input", "rating": 3, "is_widget": True},
   ]
)
edited_df = st.experimental_data_editor(df, num_rows="dynamic")

favorite_command = edited_df.loc[edited_df["rating"].idxmax()]["command"]
st.markdown(f"Your favorite command is **{favorite_command}** 🎈")

docs.streamlit.io

Editable Snowflake Tables in Streamlit (a Demo)

medium.com

この機能を利用して、Snowflake のテーブルを Streamlit から編集している記事を見つけました。

コードサンプルから要点だけ取り出すと、st.experimental_data_editor で編集した結果を write_pandas メソッドへ渡し、Snowflake の COPY INTO コマンドを呼び出しています:

dataset = session.table("ESG_SCORES_DEMO")

with st.form("data_editor_form"):
    edited = st.experimental_data_editor(dataset, use_container_width=True, num_rows="dynamic")
    submit_button = st.form_submit_button("Submit")

if submit_button:
    try:
        session.write_pandas(edited, "ESG_SCORES_DEMO", overwrite=True)

ここでは overwrite=True が設定されていて、テーブルに COPY INTO を発行する前に TRUNCATE してデータを毎回上書きするようになっています。公式ドキュメントではこのオプションは記載されていませんでしたが、GitHub 側のコードを見ると実装されていました:

https://github.com/snowflakedb/snowflake-connector-python/pull/1186/files#diff-f2583c6f84c950d04a20645f1f39f6055f4a4f63f28700b2f246fdfceb82fbddR51

データリテラシーが高くないけれど自分で Snowflake にデータを作りたい…といった場合に選択肢の一つになりそうです。ただ今だと Streamlit をローカルで動かす必要があるので、データリテラシーが高くない人へ向けたデータ編集機能というとちょっと矛盾しています。Snowflake とのインテグレーションが完了したら、ビジネスユーザに向けたマスタテーブルの編集機能として提供するなど、いろいろな使い道がありそうです。

Building a Data Visualization App with Looker, Streamlit, and Plotly

medium.com

Looker には詳しくないのですが、Looker に保存されたクエリを Streamlit から実行して可視化する記事がありました。

Streamlit は Python のフレームワークですが、Streamlit も Looker も、どちらも主にデータの可視化として使われるツールです。その2つを組み合わせると見たときに冗長だなと思ったのですが、Looker のレイヤで Google Cloud, AWS, Azure, オンプレミスデータ基盤などいろいろなデータとの連携をして抽象化することで、セマンティックレイヤとして見ることができる…かもしれません。Streamlit はデータサイエンティストがダッシュボードを作りやすいようなフレームワークとして開発されているかと思うのであちらこちらでアプリケーション開発がされるはずで、そうすると接続環境をどこかで抽象化したい場合に、Looker や、あとは前に紹介した dbt のセマンティックレイヤの機能などが使えるかもしれません。