Streamlit Bootcamp #1

Kairi Senou
The Finatext Tech Blog
11 min readDec 18, 2023

--

この記事はFinatextグループ10周年記念アドベントカレンダーの19日目の記事です。
昨日は@toshiponさんが「レガシーなマクロ付きExcelファイルをAPI化する話」という記事を公開しています。

はじめに

こんにちは、Fiantextグループのナウキャストでデータエンジニアをしている瀬能です。

ナウキャストではDatahubというsnowflakeを用いたデータ分析基盤を活用しています。先日、Snowflakeのsnowsight上でStreamlitが実行できるようになりましたので、社内でのStreamlitの普及のために社内勉強会を実施しました。今回はそちらの勉強会で使った資料をこちらで公開します。

Streamlitとは

StreamlitはWebアプリを作成するためのpythonのフレームワークです。特にデータ分析やLLMを使用したチャット形式のアプリの作成などに特化しています。

StreamlitはHTMLやCSS、JavaScriptを使わなくても、pythonのみで普段データ分析に使用しているpythonスクリプトを簡単にwebアプリ化できます。pythonさえ知っていれば開発できるハードルの低さと、既存の分析用ノートブックなどからの移行のしやすさが一番の利点だと思います。

Streamlitの特徴

Streamlitのチュートリアルは公式や先人の作成された記事に任せて、ここではStreamlitを開発していく上で知っておくと役に立つStreamlitの特徴について記載します。

Streamlitのサーバー

Streamlitは動的なWebアプリなので、実行するためにサーバーを起動する必要があります。ちょうどjupyter notebookを起動するのと同じように、streamlit_app.pyを作成し、streamlitをimportして下記のコマンドを実行することでサーバーが立ち上がります。

streamlit run streamlit_app.py

Streamlitでの入力とデータの表示

streamlitでWebアプリにUIを配置するには専用の関数を呼び出します。ユーザーの入力を受け取って画面上に表示する例を示します。

import streamlit as st
x = st.slider('x')
st.write(x, 'square is ' x * x)

他にもデータフレームやグラフを表示することもできます。

import pandas as pd
import streamlit as st
df = pd.DataFrame(
[['a', 100, True], ['b', 200, False], ['c', 300, False]],
columns=['col1', 'col2', 'col3'])
st.dataframe(df)
st.bar_chart(df, x='col1', y='col2')

Streamlitのデータフロー

Streamlitはフレームワークによくある複雑なアーキテクチャなどを必要とせず、通常のpythonと同じようにアプリを書くことができます。
これを実現するために、Streamlitは画面上のコンポーネントを更新する必要がある場合にpythonスクリプト全体を上から下まで再実行します。
この再実行は以下の状況で起こります。

  • ソースコードが変更された時
  • ユーザーがアプリのウィジェットを操作する時

例えばアプリの実行に5秒かかる場合はユーザーが操作するたびにその間待たされるようになるわけですが、それを解決するためにStreamlitには@st.cache_dataデコレータなどの便利な機能があり、重たい処理をキャッシュしてスキップできるようになっています。

下記のコードを実行して見てください。これはロードしたデータを選択した閾値で絞り込むためのサンプルスクリプトですが、スライダーを操作するたびにスクリプト全体が再実行され、sleep関数によって待たされることがわかります。

このようなケースでは@st.cache_dataデコレータが役に立ちます。下記のコードのコメントアウトを解除して実行して下さい。今度はload_data関数の戻り値がキャッシュされ、再実行がスムーズに行われることが確認できると思います。

import time
import pandas as pd
import streamlit as st

# @st.cache_data
def load_data():
time.sleep(3)
return pd.DataFrame([['a', 100, True], ['b', 200, False], ['c', 300, False]], columns=['col1', 'col2', 'col3'])

with st.spinner('loading data...'):
df = load_data()
x = st.slider('Select a threshold', min_value=0, max_value=500, value=100, step=100)
st.dataframe(df[df['col2'] >= x])

フォーム

上記のデータフローによる再実行は単に重たい処理が再実行されてしまう以外にも問題があります。
例えばユーザーが認証情報を入力したり、ダッシュボードでデータに対する複雑なフィルターを適用する時など、いちいち再実行するのではなく一連の入力が終わった後にまとめて再実行したいことがあると思います。
そのような場合にはst.form()st.form_submit_button()を利用すれば複数のユーザーインターフェースをフォームにまとめてsubmitボタンを押すまで再実行を保留することができます。

import streamlit as st

with st.form('key'):
mail = st.text_input('Enter your mail')
password = st.text_input('Enter your password', type='password')
submitted = st.form_submit_button('Submit')

if submitted:
st.write('Your mail is', mail)
st.write('Your password is', password)

Streamlitでどんなアプリが作れるのか

  • データ可視化
  • LLMチャットボット
  • ダッシュボード
  • 簡単なデータ入力(アノテーション)アプリ

など様々なアプリを作成できます。

公式のギャラリーでは実際に触ったりコードを見られるデモがいくつもあるので参考になります。

Streamlitが得意なこと

  • ユーザー入力周りのウィジェットは充実している。
  • グラフの可視化。自前の可視化用関数はまだ不十分だが、plotlyやaltair、bokehなどのサードパーティのグラフを埋め込むことができる。plotlyなどインタラクティブなグラフを生成するものは、Streamlit上でもインタラクティブに扱える。
  • データの可視化。st.dataframe()でソートしたり拡大・縮小できる状態で可視化できる。
  • st.data_editor()で上記のデータフレームを直接インタラクティブに編集できる。

Streamlitが苦手なこと

細かなレイアウトの調整や、ウィジェットのスタイルの調整など

  • レイアウトは現状sidebar, tab, columns, expander, containerくらいしかないのでアラインメントやマージンなどの調節ができない
  • 基本的にFront-endでCSS触るような調整ができない
  • スタイルの調整はHTMLを用いたカスタムコンポーネントを使わないとできない
  • モーダル、カルーセル、ナビゲーションバーなどの複雑なコンポーネントは未対応
  • バージョン更新でトグルボタンが追加されたりしているので今後に期待

Streamlit in Snowflake とは

Streamlit in Snowflakeとは、SnowflakeのWebインターフェースであるSnowsight上でStreamlitを開発・実行できるサービスです。Snowflakeのコンピューティング環境や認証基盤を利用できるので既にSnowflakeのデータ基盤を持っている場合は非常に簡単にStreamlitアプリを構築・展開できます。

StreamlitとStreamlit in Snowflake の違い

Streamlit in Snowflakeにはサポートされていない機能がいくつか存在します。代表的なものを下記に示します。

詳細:https://docs.snowflake.com/ja/developer-guide/streamlit/limitations

Streamlit in Snowflakeを使うメリット

  • StreamlitのアプリでSnowflakeの強力なコンピューティング環境とインフラが使用できる。
  • 想定ユーザーに対してSnowflakeの権限を付与できる場合、Snowflakeの認証基盤を利用できる。
  • Snowflake Native Appsを使ってStreamlitのアプリ自体をマネタイズすることができる。

Streamlit in Snowflakeを使うデメリット

  • Streamlit in SnowflakeはWarehouseを使ってStreamlitのサーバーの実行とStreamlit内部からのクエリの実行を行っているが、Streamlitのサーバーの実行はアプリを使用している間常にWarehouseが起動しているので、コストが増大しやすい。また、現状サーバーの実行に使うWarehouseとアプリが呼び出すクエリの実行に使うWarehouseは分けられないため、クエリ実行に大きなWarehouseが必要になればその分だけアプリの実行時間あたりにかかるコストも増加する。
  • 利用できるpythonライブラリに制限がある。Streamlit in Snowflakeの環境はanacondaで提供されているため、snowflake anaconda channelに記載されていない外部パッケージを利用するためには、パッケージを直接SnowflakeのStageにアップロードする必要がある。

詳細:https://docs.snowflake.com/ja/developer-guide/streamlit/about-streamlit#guidelines-for-selecting-a-warehouse-in-sis

まとめ

Streamlit in Snowflakeによって、pythonのみでデータ分析やダッシュボードなどのWebアプリが作れるStreamlitが、Snowflake環境で簡単に使えるようになりました。ナウキャストでは現在社内の定常的なデータ分析の一部をStreamlit in Snowflakeで行ったりしており、今後もStreamlitの活用を進めていく予定です。

明日は辻中さんによる「3つのポイントで振り返る世界のオルタナティブデータ業界動向2023」という記事です。お楽しみに!

おわりに
ナウキャストでは一緒に働く仲間を募集中です。少しでも興味を持たれた方は採用デックを是非ご覧ください!

--

--