Streamlit は、Python のスクリプトをそのままウェブアプリに変えてくれる ライブラリです。HTML / JS / CSS を書く必要がほとんどなく、データ分析の結果を「触れる形」で配るのに向いています。本記事は最短入門として、最小アプリ → ウィジェット → 状態管理 → レイアウトを順に扱います。
目次
- インストール
- 最小アプリ
- 主要ウィジェット
- DataFrame・グラフを表示する
- キャッシュ(再計算の抑制)
- 状態を持つ — session_state
- レイアウト
- 実用例(株価ビューワーの最小形)
- デプロイ
- よくあるつまずき
インストール
pip install streamlit検証バージョン: Python 3.12.5 / streamlit 1.40 系
インストール後、次のコマンドで動作確認用デモが起動します(任意)。
streamlit hello最小アプリ
app.py という名前で次のファイルを保存します。
import streamlit as st
st.title("はじめての Streamlit")st.write("Python のスクリプトがそのままアプリになります。")実行コマンドは python app.py ではなく streamlit run を使います。
streamlit run app.pyブラウザが自動で開き、http://localhost:8501/ にアプリが表示されます。
主要ウィジェット
入力ウィジェットは関数として呼び出すだけで、戻り値が現在の値 になります。
import streamlit as st
st.header("ウィジェットの基本")
ticker = st.text_input("銘柄コード", value="7203")period = st.slider("期間(日)", min_value=30, max_value=500, value=250, step=10)ma = st.checkbox("移動平均を表示", value=True)mode = st.radio("チャートモード", options=["折れ線", "ローソク足"])
st.write(f"銘柄: {ticker} / 期間: {period} 日 / 移動平均: {ma} / モード: {mode}")text_input: 自由入力slider: 数値スライダーcheckbox: True / Falseradio/selectbox: 選択肢date_input: 日付ピッカーfile_uploader: ファイルアップロード
ユーザーがウィジェットを操作するたび、Streamlit はスクリプト全体を 上から再実行 します。リアクティブに UI が更新される仕組みです。
DataFrame・グラフを表示する
pandas / matplotlib / plotly がそのまま動きます。
import streamlit as stimport numpy as npimport pandas as pdimport matplotlib.pyplot as plt
st.header("データとチャート")
# サンプルデータrng = np.random.default_rng(seed=42)n = 200prices = pd.Series( 100 * np.exp(np.cumsum(rng.normal(0.0005, 0.015, n))), index=pd.date_range("2026-01-01", periods=n, freq="B"), name="C",)
st.line_chart(prices)
st.dataframe(prices.tail(10).to_frame())
fig, ax = plt.subplots(figsize=(8, 4))ax.plot(prices.index, prices.values)ax.set_title("Random walk price")ax.grid(alpha=0.3)st.pyplot(fig)st.line_chart/st.bar_chart: 1 行で書ける簡易チャートst.dataframe: ソート・スクロール可能なテーブルst.pyplot(fig): matplotlib の Figure を埋め込むst.plotly_chart(fig): Plotly の Figure を埋め込む(#4-8「Plotly でインタラクティブな株価チャート」 / #12-1「Plotly 応用 — テクニカル指標を重ねたチャート」 で扱う)
キャッシュ(再計算の抑制)
ウィジェット操作のたびにスクリプトが上から再実行されるため、重い処理(API 呼び出し・大量データ読み込み)はそのままだと遅くなります。@st.cache_data デコレータでキャッシュします。
import streamlit as stimport pandas as pd
@st.cache_datadef load_prices(path: str) -> pd.DataFrame: return pd.read_csv(path, parse_dates=["Date"])
df = load_prices("prices.csv")st.write(df.head())引数が同じ間は キャッシュ済みの結果 が返り、再計算されません。引数が変わったときだけ再実行されます。
状態を持つ — session_state
「クリックされた回数を覚える」のような状態を持たせたい場合は st.session_state を使います。
import streamlit as st
st.header("カウンター")
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']}")session_state はユーザーごと(タブごと)に独立しています。データベースのような永続化は別途必要です。
レイアウト
横並び・タブ・サイドバーが用意されています。
import streamlit as st
# サイドバーwith st.sidebar: st.header("設定") ticker = st.text_input("銘柄コード", value="7203")
# 横並びcol1, col2 = st.columns(2)with col1: st.metric("現在値", "2,925", "+25 (+0.86%)")with col2: st.metric("出来高", "12.5M", "-3%")
# タブtab_chart, tab_table = st.tabs(["チャート", "テーブル"])with tab_chart: st.line_chart([1, 3, 2, 5, 4])with tab_table: st.write("テーブルの内容")st.sidebar: 左サイドバー(全ページ共通の設定置き場)st.columns(n): 横方向の n カラムst.tabs([...]): タブ切り替えst.expander("詳細"): 折りたたみブロック
実用例(株価ビューワーの最小形)
ここまでを組み合わせた、シンプルな株価ビューワーの骨格です。J-Quants との連携は#12-4「Streamlit で株価ビューワーを作る」 で詳しく扱います。
"""app.py — 簡易株価ビューワー(CSV ファイル前提)"""import streamlit as stimport pandas as pd
st.set_page_config(page_title="株価ビューワー", layout="wide")st.title("株価ビューワー")
@st.cache_datadef load_data(path: str) -> pd.DataFrame: return pd.read_csv(path, parse_dates=["Date"])
df = load_data("prices.csv")
with st.sidebar: ticker = st.selectbox("銘柄コード", sorted(df["Code"].unique())) sma_window = st.slider("SMA 期間(日)", 5, 100, 25, step=5)
dfx = df[df["Code"] == ticker].sort_values("Date").copy()dfx["sma"] = dfx["C"].rolling(sma_window).mean()dfx = dfx.set_index("Date")
col1, col2 = st.columns([3, 1])with col1: st.line_chart(dfx[["C", "sma"]])with col2: latest = dfx.iloc[-1] st.metric("最新終値", f"{latest['C']:.0f} 円") st.metric(f"SMA({sma_window})", f"{latest['sma']:.0f} 円" if not pd.isna(latest["sma"]) else "—")
st.dataframe(dfx.tail(50))
デプロイ
ローカルで動かすぶんには streamlit run app.py だけで OK です。共有したい場合は次の選択肢があります。
| 方法 | 特徴 |
|---|---|
| Streamlit Community Cloud | GitHub と連携し、無料枠あり |
| 自前サーバー(VPS / EC2) | 自由度が高いが、運用が必要 |
| Hugging Face Spaces | 機械学習のデモと相性が良い |
学習・自分用ダッシュボードとしては、ローカルで localhost:8501 を開く運用で十分です。
よくあるつまずき
| 症状 | 対処 |
|---|---|
python app.py で動かない | 必ず streamlit run app.py を使う |
| 重くなる | @st.cache_data を使う。データ加工を関数化してキャッシュ |
| ウィジェットの値がリセットされる | st.session_state を使うか、key= を統一する |
| ブラウザが自動で開かない | URL を直接開く(http://localhost:8501/) |
生成AI へのプロンプト例
「自分の分析コードを Streamlit 化したい」ときに依頼する例です。
次の Python スクリプト(prices.py)を Streamlit アプリに変換してください。スクリプトの本質的な処理は変えず、ウィジェットで対話的に操作できる形にします。
【スクリプト】(ここに既存スクリプトを貼る)
【UI 要件】- サイドバーで銘柄コードと期間を選ぶ- メイン領域に終値と SMA(25, 75) のラインチャートを表示- 表示中の銘柄の最新終値・前日比を上部にメトリクス表示- データ読み込みは @st.cache_data でキャッシュ
【制約】- streamlit 1.40 系の API を使う- pandas 2.2 系- ファイル名は app.py- 既存の関数定義は使い回す(再実装しない)まとめ
streamlit run app.pyだけでウェブアプリが起動する- ウィジェットは関数として呼ぶだけで戻り値を取れる
- 重い処理は
@st.cache_dataでキャッシュ - 状態は
st.session_state、レイアウトはcolumns / tabs / sidebar - 自分用ダッシュボードに最適。共有はローカル + Cloud デプロイで使い分け