Streamlit機能解説SPA

Streamlit機能解説 SPA

1. はじめに (Introduction)

このセクションでは、Streamlitの基本的な概要、主な特徴と利点、そしてインストール方法と基本的な使い方について解説します。StreamlitはPythonだけでインタラクティブなWebアプリを迅速に作成できる強力なフレームワークです。

Streamlitとは?

Streamlitは、Pythonの知識だけで、洗練されたユーザーインターフェースを持つWebアプリケーションを驚くほど簡単に作成できるツールです。特にデータサイエンティストや機械学習エンジニアが、複雑なフロントエンド技術(HTML、CSS、JavaScriptなど)を習得することなく、自身の分析結果やモデルをインタラクティブな形で共有できるよう設計されています。

主な特徴と利点
  • 迅速な開発サイクル
  • Python中心
  • インタラクティブ性
  • データ可視化
  • 容易なデプロイ
  • 活発なコミュニティと豊富なリソース
インストールと基本的な使い方

Streamlitの利用開始は非常に簡単です。まず、Python環境にpipコマンドを使ってStreamlitをインストールします。

pip install streamlit

インストール後、Pythonスクリプトを作成し、`import streamlit as st` のようにインポートします。アプリケーションを起動するには、ターミナルで以下のコマンドを実行します。

streamlit run your_script.py

2. 基本的な要素の表示

Streamlitはテキスト、データ、メッセージ、メディアファイルなど、様々な情報をWebページ上に表示するための豊富なコマンドを提供します。このセクションでは、これらの基本的な表示要素について詳しく見ていきます。

テキスト表示
  • st.title("メインタイトル"): 最も大きな見出し。
  • st.header("セクションヘッダー"): 2番目に大きなヘッダー。
  • st.subheader("サブヘッダー"): 3番目に大きなヘッダー。
  • st.text("プレーンテキスト"): 固定幅フォントで表示。
  • st.markdown("## Markdownテキスト"): Markdown記法でリッチテキスト表示。
  • st.write("万能表示コマンド"): 様々なデータ型を適切に表示。
  • st.code("print('Hello')", language="python"): シンタックスハイライト付きコードブロック。
  • st.latex(r"\int_a^b f(x) dx"): LaTeX形式で数式表示。
  • st.caption("これはキャプションです"): 小さなフォントでキャプション表示。
  • st.divider(): 水平線を表示。
  • st.html("<p>HTMLコンテンツ</p>"): HTMLコードを直接埋め込み。
import streamlit as st

st.title("マイアプリのタイトル")
st.header("主要セクション")
st.markdown("これは **太字** と *イタリック* を含むMarkdownです。")
st.code("for i in range(5):\n  print(i)", language="python")
データ表示
  • st.dataframe(df): インタラクティブなテーブルとしてDataFrameを表示。
  • st.data_editor(df): DataFrameを編集可能なテーブルとして表示。
  • st.column_config: DataFrameの列表示をカスタマイズ。
  • st.table(df): 静的なテーブルとして表示。
  • st.metric(label, value, delta): KPIなどを目立たせて表示。
  • st.json(json_data): JSONデータを整形して表示。
import streamlit as st
import pandas as pd
import numpy as np

data = np.random.randn(10, 5)
df = pd.DataFrame(data, columns=[f"Col{i+1}" for i in range(5)])

st.dataframe(df.head())
st.metric(label="売上", value="120万円", delta="15万円 (前月比)")
メッセージ表示
  • st.error("エラーメッセージ"): 赤色のエラーボックス。
  • st.warning("警告メッセージ"): 黄色の警告ボックス。
  • st.info("情報メッセージ"): 青色の情報ボックス。
  • st.success("成功メッセージ"): 緑色の成功ボックス。
  • st.exception(e): 例外情報を表示。
  • st.toast("通知メッセージ"): 短時間表示されるトースト通知。
  • st.balloons(): お祝いの風船アニメーション。
  • st.snow(): 雪が降るアニメーション。
メディア表示
  • st.image(image, caption, width): 画像を表示。ローカルファイル、URL、PILイメージ、NumPy配列など対応。
  • st.logo(image_path): アプリのロゴを表示。
  • st.audio(data, format): 音声ファイルを再生。
  • st.video(data, format): 動画ファイルを再生。YouTube URLも対応。

静的ファイルの提供: .streamlit/config.toml[server]\n enableStaticServing = trueと記述し、プロジェクトルートにstaticフォルダを作成すると、その中のファイルを提供できます。

3. インタラクティブなウィジェット

Streamlitの真価は、ユーザーが操作できるインタラクティブな要素(ウィジェット)を簡単に組み込める点にあります。これらウィジェットの多くは`key`引数で一意な識別子を指定し、`on_change`や`on_click`コールバックでイベント駆動型の処理が可能です。

ボタン類

  • st.button(label, on_click): クリック可能なボタン。
  • st.download_button(label, data, file_name, mime): ファイルダウンロードボタン。
  • st.chat_input(placeholder): チャット用入力フィールド。

選択系ウィジェット

  • st.checkbox(label, value, on_change): オン/オフ切り替えチェックボックス。
  • st.radio(label, options, index, horizontal): ラジオボタン群(単一選択)。
  • st.selectbox(label, options, index): ドロップダウンリスト(単一選択)。
  • st.multiselect(label, options, default): 複数選択可能なリスト。

入力系ウィジェット

  • st.slider(label, min_value, max_value, value, step): 数値スライダー(範囲選択も可)。
  • st.select_slider(label, options, value): リストから値を選択するスライダー。
  • st.text_input(label, value, type, placeholder): 1行テキスト入力。
  • st.text_area(label, value, height, placeholder): 複数行テキスト入力。
  • st.number_input(label, min_value, max_value, value, step): 数値入力。
  • st.date_input(label, value, min_value, max_value): 日付入力(期間選択も可)。
  • st.time_input(label, value, step): 時刻入力。
  • st.file_uploader(label, type, accept_multiple_files): ファイルアップロード。
  • st.color_picker(label, value): カラーピッカー。
import streamlit as st

name = st.text_input("お名前を入力してください:", "Streamlitユーザー")
age = st.slider("年齢を選択してください:", 0, 100, 25)
options = st.multiselect(
'好きな色を選んでください(複数可):',
['緑', '黄', '赤', '青'],
['青', '緑'])

if st.button("情報を表示"):
st.write(f"こんにちは、{name}さん! あなたは{age}歳で、好きな色は{', '.join(options)}ですね。")

4. レイアウトとコンテナ

Streamlitは、ウィジェットや表示要素をページ上に効果的に配置し、情報を整理するための多様なレイアウト機能を提供します。

ページ設定 (st.set_page_config)

アプリ全体の基本設定(ページタイトル、アイコン、レイアウト幅、サイドバー初期状態など)を行います。スクリプトの最初に一度だけ呼び出します。

st.set_page_config(
page_title="マイアプリ",
page_icon="🚀",
layout="wide",
initial_sidebar_state="expanded" # この設定はサイドバーがない場合は影響しません
)
カラム (st.columns)

ページを複数の縦列に分割。spec引数で列数や比率、gapで間隔、vertical_alignmentで垂直配置、borderで境界線を設定できます。

コンテナ (st.container, st.empty)

st.container(): 複数の要素をグループ化。with構文で使用。

st.empty(): 単一要素のプレースホルダー。後から内容を上書き更新可能。

エキスパンダー (st.expander)

クリックで内容を展開・折り畳みできるセクションを作成。labelでタイトル、expandedで初期状態を指定。

タブ (st.tabs)

複数のタブを作成し、各タブに異なるコンテンツを配置。タブ名のリストを渡して使用。

フォーム (st.form, st.form_submit_button)

複数のウィジェット入力をまとめて送信。送信ボタンが押されるまでスクリプトは再実行されません。

5. グラフと可視化

Streamlitはデータの可視化を強力にサポートします。標準グラフや主要なPython可視化ライブラリとの連携が可能です。

Streamlit標準グラフ

Pandas DataFrameから簡単に基本的なチャートを作成できます。

  • st.line_chart(df): 折れ線グラフ
  • st.area_chart(df): エリアチャート
  • st.bar_chart(df): 棒グラフ
  • st.scatter_chart(df): 散布図

以下はChart.jsを使用した折れ線グラフのデモです(Streamlitのst.line_chartの出力を模しています):

地図 (st.map)

緯度経度データを持つDataFrameから地図上に点をプロットします。

外部ライブラリ連携

主要なPython可視化ライブラリとシームレスに連携できます。

  • st.pyplot(fig): Matplotlibの図を表示。
  • st.altair_chart(chart): Altairのチャートを表示。
  • st.plotly_chart(fig): Plotlyのインタラクティブグラフを表示。
  • st.bokeh_chart(p): Bokehの図を表示。
  • st.vega_lite_chart(spec): Vega-Liteの仕様でグラフを表示。
  • st.pydeck_chart(deck): PyDeckによる3D地理空間データを表示。
  • st.graphviz_chart(dot_graph): Graphvizのグラフ構造を表示。

主要グラフライブラリ比較表:

ライブラリ名 主な特徴 インタラクティブ性 主なユースケース
Matplotlib 静的グラフ、出版品質、細かい制御 学術論文用グラフ、高精度な静的図
Altair 宣言的、Vega-Liteベース、簡潔 中~高 探索的データ分析、インタラクティブなダッシュボード
Plotly 高度なインタラクティブ性、3D、アニメーション Webダッシュボード、複雑なインタラクション
Bokeh Webネイティブ、ストリーミングデータ対応 リアルタイム監視ダッシュボード、大規模データセット
PyDeck 地理空間データ(3D)、deck.glベース 3D地図、都市データ可視化
Graphviz グラフ構造 (ネットワーク、フローチャート) システム構成図、決定木
Streamlit標準 Pandas DataFrameから直接、手軽 低~中 迅速なプロトタイピング、基本的なデータ概要

6. 状態管理とインタラクティビティ

Streamlitアプリケーションはユーザー操作のたびにスクリプト全体が再実行されます。状態を保持するためには以下の機能が重要です。

セッション状態 (st.session_state)

各ユーザーセッションに紐づく辞書ライクなオブジェクト。スクリプト再実行後もデータが保持されます。

if 'count' not in st.session_state:
st.session_state.count = 0

if st.button("カウントアップ"):
st.session_state.count += 1
st.write("カウント:", st.session_state.count)
プレースホルダーと動的更新 (st.empty)

単一要素のプレースホルダー。後から内容を上書き更新でき、リアルタイム表示などに利用します。

コールバック関数

ウィジェットの`on_change`や`on_click`引数に関数を指定し、イベント発生時に実行します。

7. データ連携

Streamlitは様々な外部データソースと連携できます。

データベース接続 (st.connection)

SQLAlchemy互換DB、Snowflake、Google Sheetsなどに対応。接続情報は.streamlit/secrets.tomlで管理。

# .streamlit/secrets.toml に設定
# [connections.my_sqlite_db]
# url = "sqlite:///path/to/your/database.db"

conn = st.connection("my_sqlite_db", type="sql")
df = conn.query("SELECT * FROM my_table LIMIT 5;")
st.dataframe(df)
API連携

requestsライブラリなどで外部Web APIからデータを取得。APIキーはst.secretsで管理。

8. 高度な機能と応用例

Streamlitはより洗練されたアプリケーション構築のための高度な機能も提供します。

キャッシュ (st.cache_data, st.cache_resource)

@st.cache_data: シリアライズ可能なデータ(DataFrame等)を返す関数の結果をキャッシュ。

@st.cache_resource: MLモデルやDB接続などグローバルリソースを返す関数の結果をキャッシュ。

機械学習モデルの統合とデプロイ

訓練済みMLモデルをWebアプリとして簡単にデプロイ。ユーザー入力に基づき予測結果をインタラクティブに表示。

カスタムコンポーネント

標準機能で不足する場合、HTML/CSS/JSで独自のコンポーネントを作成・利用可能。コミュニティ製も多数。

認証 (st.login, st.user, st.logout)

OpenID Connect (OIDC) を利用した組み込みユーザー認証機能。.streamlit/secrets.tomlでプロバイダ設定。

マルチページアプリ

プロジェクトのpages/サブディレクトリにPythonファイルを配置するだけでマルチページアプリを構築。

9. アプリケーションのデプロイ

開発したStreamlitアプリは様々なプラットフォームにデプロイできます。

デプロイオプション比較
デプロイ先 簡易性 コスト感 スケーラビリティ
Streamlit Community Cloud無料低~中
Heroku無料枠あり/従量
AWS EC2従量/中~高カスタム
AWS ECS/Fargate低~中従量/中~高
GCP Cloud Run従量/低~中高 (サーバーレス)
GCP App Engine従量/中~高
Azure Web App従量/中~高
Docker (Self-host)可変カスタム
Snowflake中~高従量/高Snowflake依存

10. 学習リソースとコミュニティ

Streamlitの学習やスキル向上に役立つリソースは豊富にあります。

  • 公式ドキュメント: APIリファレンス、チュートリアル、チートシートなど網羅的な情報源。
  • 公式ブログとチュートリアル: 新機能、ベストプラクティス、応用例の紹介。
  • コミュニティフォーラム: 質問、情報交換、プロジェクト共有の場。
  • アプリギャラリー: 様々なStreamlitアプリの展示。インスピレーションや実装例の参考に。
  • GitHubリポジトリとサンプルコード: 公式・コミュニティ開発のプロジェクト多数。
  • YouTubeなどの動画チュートリアル: 視覚的な学習資料。

11. まとめ

Streamlitは、Pythonプログラマーが迅速かつ容易にインタラクティブなWebアプリケーションを開発できる強力なフレームワークです。豊富なUIコンポーネント、強力な可視化能力、柔軟なレイアウト、状態管理、データ連携、MLモデル統合、多様なデプロイオプションなどを提供し、プロトタイピングから実用的なデータアプリケーション開発まで幅広く対応します。

今後の学習では、実際に手を動かして各機能を試し、公式ドキュメントやコミュニティを活用することが重要です。

コピーしました!

コメント

タイトルとURLをコピーしました