Streamlit + Snowpark for Python してみた
📜 この記事は
Snowflake Advent Calendar 2022 Calendar 2 Day 25 の記事になります。Snowflake で Sales Engineer をしております、@tmasuo がお届けします。
この記事で触れる Snowflake の各機能のリリース状態は 2022 年 12 月 1 日時点に基づきます。
Snowflake ❤️ Python
Snowflake は製品の重要な特徴として PROGRAMMABLE という要素があります。SQL はもちろん、好みの言語で開発ができる選択肢を提供しています。
Snowflake Summit 2022 Keynote より
その中でも今年は特に Python に関する発表が多かったです。その中でも特に今後の Snowflake を占う 2 つの大きな発表をおさらいしてみます。
❄️ Snowpark for Python
2022 年 11 月に GA しました。詳細は以下の記事にまとめていますが、Snowflake のデータを Python の世界で扱う上で大きなマイルストーンとなった機能でした。以下の記事でまとめています。
🎈 Streamlit
Snowpark for Python により Snowflake のデータを Python で扱うことが容易になりましたが、その成果を分析者やビジネスユーザが活用していく上ではまだ壁がありました。それがアプリケーションのレイヤで、そのミッシングリンクを埋めるのが Streamlit となります。
Streamlit が何者か?そして Streamlit と Snowflake がどのような世界観をもたらすかは以下の記事でまとめています。
端的に言うと、Python だけでアプリケーション開発ができることが Streamlit の最大の利点です。データアクセス、バックエンドそしてフロントエンドすべて Python でまかなえるため、アプリケーション開発の裾野が大きく拡がる可能性を秘めているのです。
🪄 Snowpark for Python + Streamlit
Snowflake と Python の距離が縮まり、データ活用の裾野が拡がっていく世界観、ワクワクしませんか?そして、この Snowpark for Python と Streamlit 一緒に動かしてみたいですよね?
その Magic🪄 を体感できる Quickstart がこちらになります。この記事では、この Quickstart を動かしてみて、両者を活用してアプリケーション開発する上でポイントとなりそうな点を整理してみたいと思います。
Pandas DataFrame or Snowpark DataFrame
DataFrame 形式でデータ操作するのは Python でデータをハンドリングしたことがある方ならば馴染みがある手法かなと思います。
Pandas および Snowpark の提供する DataFrame、両者の違いについてはこちらでまとめていますが、Streamlit によるアプリケーション開発の観点からは以下がポイントと思いました。
1. Streamlit の引数として取るのは Pandas DataFrame
こちらのコードで、st.dataframe
や st.bar_chart
などのメソッドを利用しています。これらの API Reference を見ると分かる通り、pandas.DataFrame
を引数として取ります。そのため、Snowpark DataFrame を toPandas
してから Streamlit のメソッドにわたす必要があります。
2. DataFrame の変数名に対する命名規則
上記の通り、Pandas DataFrame も Snowpark DataFrame どちらも利用するため、df_xxx
のような変数名にするとどちらの DataFrame か判断がつかず、可読性が下がります。そのため Pandas DataFrame は pd_df_xxx
、Snowpark DataFrame は snow_df_xxx
のようにどちらの DataFrame の Placeholder となっているか一目でわかるようにしておくことがとても重要です。実際にそのようになっていますね。
Pandas DataFrame がハイライト
またこれにより、Streamlit の UI で生じた変化を Snowpark DataFrame で処理することで Snowflake の柔軟なエンジンをうまく活用してデータ変換をかけることもできます。
# スライダでしきい値取得
emissions_threshold = st.slider(
label='Emissions Threshold',
min_value=5000,
value=20000,
step=5000
)
# Snowpark DataFrame でしきい値の値をフィルタして Pandas DataFrame に変換
pd_df_co2_top_n = snow_df_co2
.filter(col('Total CO2 Emissions') > emissions_threshold)
.to_pandas()
# Streamlit で表示
st.bar_chart(
data=pd_df_co2_top_n.set_index('Location Name'),
width=850,
height=500,
use_container_width=True
)
Snowpark Session 永続化
Snowpark for Python を利用するにはまず Snowpark セッションを確立する必要があります。このセッションを使い回すために、Streamlit のセッションステートを利用することができます。こちらのコードで実施してます。
if "snowpark_session" not in st.session_state:
session = Session.builder.configs(
json.load(open("connection.json"))
).create()
st.session_state['snowpark_session'] = session
else:
session = st.session_state['snowpark_session']
これをする利点はステートフルなアプリでセッションを使い回せる点や、Multipage App において複数ページ間でセッションが使い回せる点などにあると思います。
st.experimental_memo
キャッシュ - 基本的に IO は処理的に重いです。つまりアプリ観点だとユーザを待たせてしまう結果となるためうまくキャッシュを利用する必要があります。
Streamlit の API では st.cache
と呼ばれるキャッシュ API がありましたが、このコンテンツでは別の API を利用しています。それが st.experimental_memo
になります。
なぜ Streamlit がいくつかの Cache API を用意しているかというと、st.cache
を単一のキャッシュ API として開発していた結果、複雑な引数を理解して利用しなければならなくなったりパフォーマンスに関して課題が生じてしましました。これを解決するために使いやすく早い API を新たに開発しています。詳細な背景は以下のまとまっています。
今回のコンテンツで利用している st.experimental_memo
に関しては、データ自体をキャッシュする機構になっています。これを活用することで都度 Snowflake にアクセスすることなく Streamlit でデータ操作することを実現しています。
データロードをキャッシュして効率化
✅ さいごに
Snowpark for Python と Streamlit を活用することで Python コードのみで Snowflake データを活用したアプリが開発できるようになります。
そしてアプリは使いやすくないと定着しないですよね。そのために Snowpark DataFrame を活用したスケーラブルな処理やキャッシュを利用した Pandas DataFrame データの再利用など、トレードオフを意識した開発がキモになってきそうです。
そしてなんと言っても Streamlit が Snowflake 上で動くのが楽しみです!
また Streamlit 自体も進化してます!2023 そしてその先の Roadmap は以下からご確認いただけます。
ぜひ Snowpark for Python と Streamlit 試してみてください!!
Happy Streamlit-ing! 🎈 & Wish you have Happy Holidays! 🎄
Discussion