スポンサーリンク
Pythonstreamlit

📊 Streamlit × AgGridで作る!日経225銘柄マスタ管理アプリを構築してみた

Python
この記事は約9分で読めます。

はじめに

日々の業務で株式銘柄の管理を行う際、Excelでの手作業は煩雑になりがちです。そこで今回は、PythonのWebアプリフレームワーク「Streamlit」と、表形式UIコンポーネント「AgGrid」を組み合わせて、日経225銘柄の選択・登録・削除ができるマスタ管理アプリを構築しました。

このアプリは、CSVファイルをベースに銘柄一覧を表示し、ユーザーが選択した銘柄をマスタとして登録・管理できる仕組みです。業務効率化やデータ整備に役立つ実用的なツールとして、社内利用にも最適です。

🧰 使用技術とインストール手順

使用ライブラリ

  • streamlit:Webアプリケーションの構築
  • pandas:CSVファイルの読み書きとデータ処理
  • st_aggrid:表形式UIコンポーネント(AgGrid)
pip install streamlit pandas streamlit-aggrid

使用データ

使用データは、日経225銘柄の情報をcsv形式にした以下ファイルを使用します。

コード,銘柄名,社名,業種
4151,協和キリン,協和キリン(株),医薬品
4502,武田,武田薬品工業(株),医薬品
4503,アステラス,アステラス製薬(株),医薬品
# ...(日経225の全銘柄データを追加してください)

このCSVファイルは以下のブログで簡単に取得できる方法を紹介しています。

🖥️ アプリの構成と機能

このアプリは、以下の3つの主要機能を持ちます:

  1. 銘柄一覧の表示と選択(左側)
  2. 選択された銘柄の確認(右側)
  3. 対象銘柄マスタの登録・削除(右側)
登録前
登録後

🧪 実装コード

import streamlit as st
import pandas as pd
from st_aggrid import AgGrid, GridOptionsBuilder, DataReturnMode, GridUpdateMode
import os

MASTER_FILE = "selected_stocks.csv"

st.set_page_config(layout="wide")
st.title("日経225銘柄対象銘柄マスタ")

if 'master_stocks' not in st.session_state:
    if os.path.exists(MASTER_FILE):
        st.session_state.master_stocks = pd.read_csv(MASTER_FILE)
    else:
        st.session_state.master_stocks = pd.DataFrame()

col1, col2 = st.columns([1, 1])

with col1:
    st.subheader("銘柄一覧")
    df = pd.read_csv("nikkei225_stocks.csv")

    gb = GridOptionsBuilder.from_dataframe(df)
    gb.configure_selection('multiple', use_checkbox=True)
    grid_options = gb.build()

    grid_response = AgGrid(
        df,
        gridOptions=grid_options,
        data_return_mode=DataReturnMode.AS_INPUT,
        update_mode=GridUpdateMode.MODEL_CHANGED,
        fit_columns_on_grid_load=True,
        key='aggrid_main'
    )

    selected_rows_df = pd.DataFrame(grid_response["selected_rows"])

    if not selected_rows_df.empty:
        if st.button("マスター登録", key="master_button_col1"):
            st.session_state.master_stocks = pd.concat([
                st.session_state.master_stocks,
                selected_rows_df.drop('_selectedRowNodeInfo', axis=1, errors='ignore')
            ]).drop_duplicates(subset=['コード'], keep='first').sort_values('コード').reset_index(drop=True)

            st.session_state.master_stocks.to_csv(MASTER_FILE, index=False)
            st.success(f"選択された銘柄をマスターとして登録し、'{MASTER_FILE}'に保存しました!")
            st.rerun()

with col2:
    st.subheader("選択された銘柄")
    if not selected_rows_df.empty:
        st.write(selected_rows_df.drop('_selectedRowNodeInfo', axis=1, errors='ignore'))
    else:
        st.info("チェックボックスをオンにすると、選択された銘柄がここに表示されます。")

    st.markdown("---")
    st.subheader("現在登録されている銘柄")

    if not st.session_state.master_stocks.empty:
        master_gb = GridOptionsBuilder.from_dataframe(st.session_state.master_stocks)
        master_gb.configure_selection('multiple', use_checkbox=True)
        master_grid_options = master_gb.build()

        master_grid_response = AgGrid(
            st.session_state.master_stocks,
            gridOptions=master_grid_options,
            data_return_mode=DataReturnMode.AS_INPUT,
            update_mode=GridUpdateMode.MODEL_CHANGED,
            fit_columns_on_grid_load=True,
            key='aggrid_master'
        )

        selected_master_rows_df = pd.DataFrame(master_grid_response["selected_rows"])

        if not selected_master_rows_df.empty:
            if st.button("選択項目を削除", key="delete_button_col2"):
                codes_to_delete = selected_master_rows_df['コード'].tolist()
                st.session_state.master_stocks = st.session_state.master_stocks[~st.session_state.master_stocks['コード'].isin(codes_to_delete)]
                st.session_state.master_stocks.to_csv(MASTER_FILE, index=False)
                st.success("選択された銘柄をマスターデータから削除しました!")
                st.rerun()
    else:
        st.info("まだマスターデータは登録されていません。")

💡 実装のポイント

  • セッションステートの活用 st.session_state によって状態を保持し、ページ再読み込み後もデータが維持されます。
  • CSVによる永続化 selected_stocks.csv に保存することで、アプリを閉じてもデータが保持され、再利用可能です。
  • AgGridの柔軟なUI チェックボックス選択や列幅調整など、業務用途に適した操作性を実現しています。
  • 再描画の自動化 st.rerun() によって、登録や削除後に即座に画面を更新。ユーザー体験が向上します。

🚀 応用アイデア

このアプリは、株式銘柄に限らず、以下のような用途にも応用可能です:

  • 商品マスタ管理(SKU選定)
  • 顧客リストの抽出・登録
  • プロジェクトメンバーの選定と管理
  • 業務フローの対象データ管理

📝 まとめ

今回紹介した「日経225銘柄対象マスタ管理アプリ」は、PythonとStreamlitの力で業務効率化を図る一例です。AgGridの導入により、Excelライクな操作性をWeb上で再現できる点も大きな魅力。

「選択 → 登録 → 削除」という一連の流れをシンプルに実装しつつ、CSVによる永続化やセッション管理など、実務に耐えうる設計を意識しました。とはいいつつ少し癖がありますね!!

業務改善や社内DXの一環として、ぜひこのアプリを活用してみてください。

StreamlitとAgGridの組み合わせは、非エンジニアでも直感的に操作できるUIを提供できるため、社内ツールとしての導入にも非常に適しています。

コメント

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