Streamlitで業務改善

目次

この記事では、以下の内容についてご紹介します:

はじめに

DX推進部デジタル開発グループとアジャイル推進ユニットのメンバーが、電力事業部電力トレーディンググループの内製化プロジェクト支援を行っています。内製化プロジェクトとは電力の市場入札を考える際の戦略を考えるツール群の予測精度の向上や業務効率改善へ向けて、アジャイル開発を通して日々改善を図っているプロジェクトです。 こちらでは、業務効率改善のための施策の一つでエクセルツール脱却を目指し、Streamlitを活用した業務改善について記載していきます。

Streamlitとは

一言でいうと、PythonでWebアプリケーションを作成するためのフレームワークです。 PythonとStreamlitのライブラリを用意するだけで、Webアプリが作れる優れものとなっています。

他のWebアプリケーションを構築するフレームワークとの違い

StreamlitとDjangoとFlaskの比較表です。私の肌感ですがご参考まで...

Streamlit Django Flask
python知識 必要 必要 必要
学習コスト
HTML/CSS知識 不要 必要 必要

※ HTML知識は不要ですが、あるに越したことはありません。どのフレームワークでもCSSを適用でき、デザインを変えることが可能です。

Streamlitのメリット・デメリット

メリット

  • 初期構築が楽
    • Streamlitのインストールコマンド pip install streamlit
    • main.pyにStreamlitをimportするだけで良い
  • Markdown,Latexに対応している
  • Streamlitに入っている機能が充実している
  • third-party moduleが充実している。詳細はこちら

デメリット

  • Streamlitの実装次第では描画が遅くなる
    • 画面に何か変更が加わると1からプログラムを読み直す構造のため、処理が増えると相対的に描画が遅くなる
  • レイアウトのカスタマイズ性△
    • ある程度フレームワークに則ったデザインとなるため、細かいレイアウト調整は難しい

実装例

描画する処理の部分を抜粋して記載します。st.で記述されている部分がWebブラウザ上でレイアウトを指定している他、ボタンやプルダウンリストを描画している処理です。

# main.py
from datetime import datetime, timedelta

import streamlit as st


class PlantLayoutApp:
    def __init__(self):
        self.target_date = None
        self.danmen = None

    def all_plant_layout(self):
        # 入力欄の設定
        with st.container():
            col1, col2 = st.columns(2)
            with col1:
                # 今日の日付を取得
                today = datetime.today().date()
                # 2日後の日付を計算
                two_days_later = today + timedelta(days=2)
                self.target_date = st.date_input(
                    "対象日付を入力してください", two_days_later)
            with col2:
                # オプションをリストで作成
                start = 1
                end = 20
                options = [str(i) for i in range(start, end + 1, 1)]
                # selectboxを表示
                self.danmen = st.selectbox(
                    "参照したい断面を指定してください", options, 1)
        # タブの設定
        tab1, tab2 = st.tabs(["最終戦略", "テストタブ"])
        with tab1:
            pass
        with tab2:
            st.write(f"対象日:{self.target_date}")
            st.write(f"対象断面:{self.danmen}")


if __name__ == "__main__":
    app = PlantLayoutApp()
    app.all_plant_layout()

実行コマンド

streamlit run main.py

上記を実行すると以下のような形で表示されます。

Streamlitを活用した業務改善

Before

エクセルマクロから、データベースにアクセスし必要なインプットデータを取り込み、エクセルの画面に表示する処理の流れとなっています。 以下の点が課題とされており、日々リカバリ対応に追われています。 * エクセルデータの肥大化によりエクセルがクラッシュすることがある * データ取り込みから計算までエクセルで実施しているため、処理時間が長く、待ち時間が発生する

戦略ツール(全体をぼかしています)

After

Streamlitで必要なデータを必要な時だけ取得し、描画する。 Beforeの課題が解決 * 取得・計算処理はサーバ側で行うため、アプリクラッシュがない * 必要な情報だけを抽出するため、待ち時間が少なくなる

Streamlitでの戦略ツール(一部をぼかしています)

Streamlit導入時の課題

Streamlitを導入することでいくつかのメリットが得られますが、以下のような課題も感じました。

  • エクセルのようにセルごとに関数を直接入力できないため、操作方法がBeforeと比べて変わる
  • 細かなCSSの適用やデザイン調整を行おうとすると、実装コストが上がる
  • 業務フローの変更に伴い、利用者への説明や教育が必要になる
  • 複雑なデータ操作や計算処理を実装する場合、エクセルマクロよりもPythonの知識が求められる

今後はこれらの課題を踏まえ、より使いやすいツールとなるよう改善を進めていきたいと思います。

学び

Streamlitを活用する中で、日々バージョンアップが行われており、利便性が向上していることを実感しています。また、Excelライクな表形式を簡単に作成できることが分かり、業務改善を迅速に進められる有用なライブラリだと感じました。

まとめ

Streamlitは比較的簡単にWebアプリを構築でき、ツールの置き換え等には有効になりそうなライブラリでした。 内製化プロジェクトでは、現在トライアルへ向けて動いているフェーズです。本運用まで稼働出来た際に改めて投稿しようと思います。 最後まで読んでいただきありがとうございました。