【Streamlit】 st.data_editor()で編集可能なデータフレームを表示する

Streamlit
この記事は約8分で読めます。

こんにちは、JS2IIUです。
Streamlit上で編集可能なデータを表示することができるst.data_editor()について事例を交えて説明していきます。今回もよろしくお願いします。

st.data_editor()とは?

Streamlit の st.data_editor() は、Webアプリケーション内で直接データを対話的に編集できる強力な関数です。従来のデータ表示にとどまらず、ユーザーがリアルタイムでデータを変更、追加、削除できる機能を提供します。

主な特徴と機能

st.data_editor() は以下のような豊富な機能を備えています:

  1. インタラクティブなデータ編集
  • データフレーム内のセルを直接編集可能
  • リアルタイムでのデータ更新
  • 列の追加や削除
  • 行の追加や削除
  1. データ型のサポート
  • 数値
  • 文字列
  • 日付
  • ブール値
  • カスタムオブジェクト
  1. 高度なカスタマイズ
  • 列の編集可否の設定
  • デフォルト値の指定
  • 入力検証
  • 条件付き書式設定

関数シグネチャ

Python
st.data_editor(
    data,
    *,
    key=None,
    num_rows='fixed' | 'dynamic',
    disabled=False,
    column_config=None,
    hide_index=None,
    max_rows=None,
    use_container_width=None
)

主要パラメータ詳細

  • data: 編集対象のデータ(pandas DataFrame、NumPy配列、リストなど)
  • num_rows: 行の追加・削除を制御
  • 'fixed': 行数固定
  • 'dynamic': 行の動的追加・削除可能
  • disabled: 編集の無効化
  • column_config: 列の詳細設定
  • max_rows: 最大表示行数
  • use_container_width: コンテナの幅に合わせる

活用事例 1: タスク管理アプリケーション

Python
import streamlit as st
import pandas as pd
from datetime import datetime, timedelta

def task_management_app():
    st.title('インタラクティブ タスク管理')

    # 初期タスクデータの作成
    initial_tasks = pd.DataFrame({
        'タスク名': ['プロジェクト計画', 'デザインレビュー', 'コーディング'],
        '優先度': ['', '', ''],
        '期限': [
            datetime.now() + timedelta(days=7),
            datetime.now() + timedelta(days=14),
            datetime.now() + timedelta(days=30)
        ],
        '完了': [False, False, False]
    })

    # データエディタでタスクを編集
    edited_tasks = st.data_editor(
        initial_tasks, 
        num_rows='dynamic',
        column_config={
            '優先度': st.column_config.SelectboxColumn(
                '優先度',
                options=['', '', ''],
                required=True
            ),
            '期限': st.column_config.DateColumn('期限'),
            '完了': st.column_config.CheckboxColumn('完了')
        }
    )

    # 編集されたタスクの表示
    st.write('現在のタスクリスト:', edited_tasks)

    # タスク分析
    completed_tasks = edited_tasks[edited_tasks['完了'] == True]
    st.write(f'完了タスク数: {len(completed_tasks)}')

task_management_app()

解説:タスク管理アプリケーション

  1. pandas DataFrameを使用して初期タスクリストを作成
  2. st.data_editor()で以下をカスタマイズ
  • 動的な行追加・削除
  • 優先度のドロップダウン
  • 日付選択
  • チェックボックスでタスク完了状態を管理
  1. 編集されたタスクを表示
  2. 完了タスクの集計

活用事例 2: 売上データ分析アプリ

Python
import streamlit as st
import pandas as pd
import numpy as np

def sales_data_analysis_app():
    st.title('インタラクティブ 売上データ分析')

    # 初期売上データの作成
    initial_sales = pd.DataFrame({
        '製品': ['ノートPC', 'スマートフォン', 'タブレット', 'スマートウォッチ'],
        '単価': [100000, 80000, 50000, 30000],
        '販売数': [50, 75, 100, 120],
    })

    # 売上列を計算
    initial_sales['売上'] = initial_sales['単価'] * initial_sales['販売数']

    # データエディタで売上データを編集
    edited_sales = st.data_editor(
        initial_sales, 
        num_rows='dynamic',
        column_config={
            '単価': st.column_config.NumberColumn('単価(円)', min_value=0),
            '販売数': st.column_config.NumberColumn('販売数', min_value=0),
            '売上': st.column_config.NumberColumn('売上(円)', disabled=True)
        }
    )

    # 売上列を自動更新
    edited_sales['売上'] = edited_sales['単価'] * edited_sales['販売数']

    # 売上分析
    total_sales = edited_sales['売上'].sum()
    st.metric('総売上', f'{total_sales:,}円')

    # 売上チャート
    st.bar_chart(edited_sales.set_index('製品')['売上'])

sales_data_analysis_app()

解説:売上データ分析アプリ

  • 初期売上データをDataFrameで作成
  • st.data_editor()で以下をカスタマイズ
  • 動的な行追加・削除
  • 単価と販売数の数値入力制限
  • 売上列を自動計算(編集不可)
  • 編集に応じて売上を自動再計算
  • 総売上をメトリクスで表示
  • 棒グラフで売上を可視化

まとめ

st.data_editor()は、Streamlitアプリケーションにおけるデータ操作の可能性を大きく広げます。インタラクティブな編集、リアルタイムな更新、高度なカスタマイズにより、より動的で使いやすいアプリケーションを簡単に構築できます。

24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。Poetryについても詳しく説明されています。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

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