Streamlit は、Python のスクリプトをそのままウェブアプリに変えてくれる ライブラリです。HTML / JS / CSS を書く必要がほとんどなく、データ分析の結果を「触れる形」で配るのに向いています。本記事は最短入門として、最小アプリ → ウィジェット → 状態管理 → レイアウトを順に扱います。

目次

  1. インストール
  2. 最小アプリ
  3. 主要ウィジェット
  4. DataFrame・グラフを表示する
  5. キャッシュ(再計算の抑制)
  6. 状態を持つ — session_state
  7. レイアウト
  8. 実用例(株価ビューワーの最小形)
  9. デプロイ
  10. よくあるつまずき

インストール

Terminal window
pip install streamlit

検証バージョン: Python 3.12.5 / streamlit 1.40 系

インストール後、次のコマンドで動作確認用デモが起動します(任意)。

Terminal window
streamlit hello

最小アプリ

app.py という名前で次のファイルを保存します。

import streamlit as st
st.title("はじめての Streamlit")
st.write("Python のスクリプトがそのままアプリになります。")

実行コマンドは python app.py ではなく streamlit run を使います。

Terminal window
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 / False
  • radio / selectbox: 選択肢
  • date_input: 日付ピッカー
  • file_uploader: ファイルアップロード

ユーザーがウィジェットを操作するたび、Streamlit はスクリプト全体を 上から再実行 します。リアクティブに UI が更新される仕組みです。

DataFrame・グラフを表示する

pandas / matplotlib / plotly がそのまま動きます。

import streamlit as st
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
st.header("データとチャート")
# サンプルデータ
rng = np.random.default_rng(seed=42)
n = 200
prices = 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)

キャッシュ(再計算の抑制)

ウィジェット操作のたびにスクリプトが上から再実行されるため、重い処理(API 呼び出し・大量データ読み込み)はそのままだと遅くなります。@st.cache_data デコレータでキャッシュします。

import streamlit as st
import pandas as pd
@st.cache_data
def 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 st
import pandas as pd
st.set_page_config(page_title="株価ビューワー", layout="wide")
st.title("株価ビューワー")
@st.cache_data
def 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 株価ビューワー骨格の見栄えイメージ

デプロイ

ローカルで動かすぶんには streamlit run app.py だけで OK です。共有したい場合は次の選択肢があります。

方法特徴
Streamlit Community CloudGitHub と連携し、無料枠あり
自前サーバー(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 デプロイで使い分け