Streamlitは、データ分析や機械学習の成果を手軽に共有するためのWebアプリケーションを、Pythonスクリプトのみで迅速に開発できるフレームワークです。HTMLやCSS、JavaScriptといったWeb専門の知識がなくとも、インタラクティブなUIを持つアプリケーションを構築できます。
Streamlitの主な利点
- 簡潔な記述: Pythonの知識だけでWebアプリケーションが完成します。
- データサイエンスとの親和性: PandasのDataFrameや各種グラフ描画ライブラリとの連携が容易で、分析結果を直感的に可視化、共有できます。
- 迅速な開発サイクル: わずかなコードでUIコンポーネントを配置でき、プロトタイピングやアイデアの具現化を素早く行えます。
開発環境の準備
Streamlitを利用するには、Python 3.9 以降が推奨されています。インストールはpipコマンドで簡単に行えます。
pip install streamlit
インストールが完了したら、以下のコマンドを実行して動作を確認します。
streamlit hello
このコマンドを実行すると、ブラウザが自動的に起動し、Streamlitのデモページが表示されます。
基本的なアプリケーションの作成
Streamlitの基本的な動作とコンポーネントの使い方を、段階的なコードで解説します。
Step 1: テキストの入力と表示
まず、ユーザーが入力したテキストをリアルタイムで表示する、最もシンプルなアプリを作成します。
コード
以下のコードを app.py という名前で保存してください。
import streamlit as st st.title('Streamlit 入門') # テキスト入力ウィジェットの作成 name = st.text_input('名前を入力してください') # 入力内容に基づいたメッセージの表示 if name: st.write(f'こんにちは、{name}さん!')
説明
st.text_input は、ユーザーからのテキスト入力を受け付けるためのウィジェットです。Streamlitでは、ウィジェットの値が変更されるとスクリプトが自動的に再実行され、画面が更新されます。そのため、このコードでは入力欄に文字をタイプするたびに st.write が実行され、メッセージが即座に表示されます。
アプリケーションの実行
ターミナルで app.py が保存されているディレクトリに移動し、以下のコマンドを実行します。
streamlit run app.py
ブラウザでアプリケーションが表示され、動作を確認できます。
Step 2: フォームによる一括送信
複数の入力項目を一度にまとめて処理したい場合、st.form を使用します。これにより、ユーザーが「送信」ボタンを押したタイミングで、すべての入力値を確定させることができます。これは、意図しない再実行を防ぎ、安定した動作を実現する上で推奨される方法です。
処理内容 名前の入力と、好きなフルーツの選択という2つの入力をフォーム内に配置し、送信ボタンが押されたら結果を表示します。
コード
import streamlit as st st.title('サンプルフォーム') # フォームのコンテキストを開始 with st.form(key='profile_form'): # テキスト入力 name = st.text_input('名前') # セレクトボックス fruit = st.selectbox( '好きなフルーツを選択してください', ('リンゴ', 'バナナ', 'イチゴ') ) # フォーム用の送信ボタン submit_button = st.form_submit_button(label='送信') # 送信ボタンが押された後の処理 if submit_button: st.write(f'こんにちは、{name}さん。{fruit}がお好きなようですね。')
解説
with st.form(...) ブロック内に配置されたウィジェットは、st.form_submit_button がクリックされるまで値の送信を保留します。ボタンがクリックされると、フォーム内のすべてのウィジェットの最新の値が確定し、if submit_button: 以下の処理が一度だけ実行されます。
状態管理 (Session State)
Streamlitはウィジェット操作のたびにスクリプトを再実行するため、通常の変数に格納した値は失われてしまいます。入力値や計算結果をセッション内で保持し続けるためには st.session_state を利用します。
処理内容 ボタンをクリックするたびにカウンターの数値を増やし、その回数を表示します。このカウント数は、他のウィジェットを操作してもリセットされません。
コード
import streamlit as st st.title('カウンターアプリ') # session_state の初期化 if 'count' not in st.session_state: st.session_state['count'] = 0 # ボタンがクリックされたらカウントを増やす if st.button('カウントアップ'): st.session_state['count'] += 1 # 現在のカウント数を表示 st.write(f"現在のカウント: {st.session_state['count']}")
解説
st.session_state は辞書のように振る舞うオブジェクトです。最初に 'count' というキーが存在するか確認し、なければ 0 で初期化します。ボタンがクリックされるたびに、この st.session_state['count'] の値を直接変更することで、アプリケーションのセッションが続く限り値を保持できます。
主要なUIウィジェット
Streamlitは、インタラクティブなアプリケーションを構築するための豊富なウィジェットを提供しています。以下に代表的なものを紹介します。
| カテゴリ | ウィジェット | 説明 | コード例 |
|---|---|---|---|
| テキスト入力 | st.text_input |
1行のテキスト入力欄を設置します。 | st.text_input('メールアドレス') |
st.text_area |
複数行のテキスト入力欄を設置します。 | st.text_area('フィードバック') |
|
st.number_input |
数値専用の入力欄を設置します。 | st.number_input('年齢', min_value=0, max_value=120) |
|
| 選択肢 | st.selectbox |
ドロップダウンリストから単一の項目を選択させます。 | st.selectbox('プラン', ['A', 'B', 'C']) |
st.multiselect |
複数の項目を選択可能なリストを設置します。 | st.multiselect('トッピング', ['チーズ', 'ベーコン']) |
|
st.radio |
ラジオボタンで単一の項目を選択させます。 | st.radio('配送方法', ['通常便', '速達便']) |
|
| ボタン・その他 | st.button |
クリックイベントを発生させるボタンを設置します。 | if st.button('実行'): ... |
st.checkbox |
オン/オフを切り替えるチェックボックスを設置します。 | if st.checkbox('利用規約に同意する'): ... |
|
st.slider |
指定範囲内の値をスライドバーで選択させます。 | st.slider('満足度', 0, 100, 50) |
|
st.file_uploader |
ファイルをアップロードするためのウィジェットです。 | st.file_uploader('ファイルをアップロード') |
|
st.date_input |
日付を選択するためのカレンダーウィジェットです。 | st.date_input('予約日') |
応用: フォーム入力に基づくデータ表示
サイドバーに入力フォームを配置し、その内容に応じてメインエリアに表示するデータを切り替える、より実践的なアプリケーションを作成します。ここではデータ操作ライブラリのPandasを利用します。
処理内容 サイドバーで表示したいデータの種類と行数を選択させ、メインエリアにその条件でフィルタリングしたデータフレームと、対応するグラフを表示します。
コード
import streamlit as st import pandas as pd import numpy as np # --- サイドバー (入力) --- with st.sidebar: st.header('表示設定') with st.form('settings_form'): # 表示するデータの種類を選択 data_type = st.selectbox('データを選択', ['A', 'B']) # 表示する行数をスライダーで選択 num_rows = st.slider('表示行数を選択', 1, 20, 10) submitted = st.form_submit_button('適用') # --- メインエリア (出力) --- st.title('データ可視化ダッシュボード') # ダミーデータの生成 @st.cache_data def create_data(): data = { 'A': pd.DataFrame(np.random.randn(20, 3), columns=['x', 'y', 'z']), 'B': pd.DataFrame(np.random.randn(20, 3), columns=['p', 'q', 'r']) } return data chart_data = create_data() # 選択されたデータと行数に基づいて表示 st.header(f'{data_type}タイプのデータ') st.write(f'表示行数: {num_rows}行') # データフレームの表示 st.dataframe(chart_data[data_type].head(num_rows)) # 折れ線グラフの表示 st.line_chart(chart_data[data_type].head(num_rows))
解説
st.sidebarを使うことで、ウィジェットを画面左側のサイドバーに配置できます。これにより、入力操作と結果表示のエリアを明確に分離できます。@st.cache_dataデコレータは、関数の実行結果をキャッシュする機能です。引数が同じであれば、関数を再実行せずにキャッシュされた結果を返すため、データ生成のような時間のかかる処理のパフォーマンスを向上させます。- サイドバーのフォームで「適用」ボタンが押されると、選択された
data_typeとnum_rowsに基づいてメインエリアの表示が更新されます。
まとめ
Streamlitは、Pythonの知識を活かして、データ入力フォームや可視化ダッシュボードといったWebアプリケーションを迅速に開発するための優れたツールです。本記事で紹介したフォーム (st.form) や状態管理 (st.session_state)、キャッシュ (st.cache_data) などの機能を活用することで、より堅牢で実用的なアプリケーションを効率的に構築できます。
より詳細な情報や高度な機能については、公式ドキュメントを参照してください。
Streamlit公式ドキュメント: https://docs.streamlit.io/
Streamlitの学習に有効なUdemyのオンラインコースを紹介します。
[PR]
