スポンサーリンク

【Streamlit】Session Stateを使ったデータ管理の基本

記事内に広告が含まれています。

Streamlitでは、アプリケーションの再レンダリングが行われるたびに、ウィジェットの状態や入力データがリセットされてしまいます。

この問題を解決するために利用できるのがsession_stateです。

セッション間で状態を保持し、インタラクティブなアプリケーションを構築できます。

スポンサーリンク

基本的な使い方

session_stateは、Streamlitのセッションごとにデータを保持するための辞書型のオブジェクトです。

このオブジェクトを使って、ユーザーの操作や計算結果を保存し、再利用できます。

以下では、st.session_stateを利用してカウンターを実装する例を紹介します。

コード例

import streamlit as st

# 初期化: セッション状態がまだ存在しない場合に初期値を設定
if 'count' not in st.session_state:
    st.session_state.count = 0

# ボタンを押すとカウントが増える
if st.button('増やす'):
    st.session_state.count += 1

# カウンターのリセット
if st.button('リセット'):
    st.session_state.count = 0

# 現在のカウントを表示
st.write(f"現在のカウント: {st.session_state.count}")

実行結果

  1. 「増やす」ボタンをクリックするとカウントが1ずつ増えます。
  2. 「リセット」ボタンを押すとカウントが0に戻ります。
  3. ページを再読み込みしても状態は維持されます。
スポンサーリンク

ウィジェットの状態を保持する

セッション状態を利用して、ウィジェットの選択内容を保持することも可能です。

コード例

import streamlit as st

# 初期化
if 'selected_option' not in st.session_state:
    st.session_state.selected_option = 'Option 1'

# セッション状態に基づいて初期値を設定
selected = st.radio(
    "オプションを選択してください:",
    ['Option 1', 'Option 2', 'Option 3'],
    index=['Option 1', 'Option 2', 'Option 3'].index(st.session_state.selected_option)
)

# 状態を更新
st.session_state.selected_option = selected

# 結果を表示
st.write(f"現在選択されているオプション: {st.session_state.selected_option}")

実行結果

ウィジェットの選択状態がセッション内で保持され、ページの再レンダリングでも値が変わりません。

実用例 入力フォームの状態管理

フォームに入力された値を保持することで、ページを再レンダリングしても入力内容を失わないようにできます。

コード例

import streamlit as st

# 初期化
if 'user_input' not in st.session_state:
    st.session_state.user_input = ""

# コールバック関数
def update_input():
    st.session_state.user_input = st.session_state.input_box

# テキスト入力
st.text_input(
    "名前を入力してください:",
    key="input_box",
    value=st.session_state.user_input,
    on_change=update_input
)

# 入力内容を表示
st.write(f"こんにちは、{st.session_state.user_input}さん!")

実行結果

テキストボックスに入力された名前が保持され、再レンダリングしても消えません。

注意点

  1. メモリ使用量の管理
    • st.session_stateに大量のデータを保持し続けると、メモリ使用量が増加する可能性があります。
    • 古いデータは適宜削除するか、不要なデータを保持しないように設計しましょう。
  2. データ型の整合性
    • st.session_stateは辞書型ですが、値としてリストや辞書などの複雑なデータ型も保存できます。保存したデータ型が意図した通りであることを確認してください。
  3. ページ間での共有
    • Streamlitのマルチページアプリケーションでst.session_stateを利用する場合、ページ間でデータが共有されます。この特性を活用して情報を引き継げます。

実用例 シンプルなToDoリスト

以下は、st.session_stateを活用してToDoリストを構築する例です。

import streamlit as st

# 初期化
if 'tasks' not in st.session_state:
    st.session_state.tasks = []

# タスクの追加
new_task = st.text_input("新しいタスクを入力してください:")
if st.button("タスクを追加"):
    if new_task:
        st.session_state.tasks.append(new_task)
        st.rerun()  # 再レンダリング

# タスクの表示
if st.session_state.tasks:
    st.write("ToDoリスト:")
    for i, task in enumerate(st.session_state.tasks, start=1):
        st.write(f"{i}. {task}")
else:
    st.write("ToDoリストは空です。")

まとめ

session_stateは、Streamlitでインタラクティブなアプリケーションを構築する際に有用です。入力データや計算結果、ウィジェットの状態を保持することで、ユーザー体験を向上させることができます。適切な初期化と状態管理を行い、効率的に使用しましょう。

スポンサーリンク
PythonStreamlit
著者SNS
タイトルとURLをコピーしました