【Streamlit】ExcelデータをPandasで読み込んで表示させる

スポンサーリンク

別の記事でも、Streamlitの良さについて書きましたが、今回はExcelの表データを
Streamlitの画面に表示させる方法について書こうと思います。

pandasのread_excelを使うと簡単に表示させることができます。また、ウィジットも色々な機能があるのでよく使うものを一部紹介したいと思います。

おそらく、Excelの表データを一番手っ取り早く、きれいにWEB表示させる方法だと思います。

データを準備する

データは、2021年の都道府県別人口のデータをExcelに作りました。データは,大体csv形式の場合やDBに格納されていたりしますが今回は、Excelに格納されているものとします。

格納先は、C:\dataに2021年都道府県別人口.xlsxという形式で保存しています。

データを読み込んで表示する

そのまま表示してみる

Excelのデータが整理されている表になっていることが前提ですが、pandasのread_excelを使うと簡単に、dataframe形式で読み込むことができます。シート名は,[2021年人口]にしているのでsheet_name=’シート名’の形で指定します。

import streamlit as st
import pandas as pd

st.title('2021年都道県別人口')

df = pd.read_excel(r'C:\data\2021年都道府県別人口.xlsx',sheet_name='2021年人口')
st.table(df)

上記コードを書いて、streamlitを起動すると以下の画面が表示されました。たった5行で書けます。

インデックスが邪魔

read_excelのパラメータを指定していなかったので、自動で0から始まるインデックスが表示されてします。インデックスがあった方がいいこともありますが今回は県コードをインデックスに指定したほうが見やすそうなので県コードを指定して再表示させます。

df = pd.read_excel(r'C:\data\2021年都道府県別人口.xlsx',sheet_name='2021年人口',
        index_col='県コード')

県コードがインデックスになりました。

ボタンを押してから表示させる

このデータは、件数が少ないので常に表示させても良いかなと思いますが、ボタンを押してから表示処理を行うようにします。この場合はstreamlitのst.buttonを使用すれば簡単にできます。if st.button(‘表示する’):でボタンが押されたときにデータを読み込み表示させるようにします。

import streamlit as st
import pandas as pd


st.title('2021年都道県別人口')
if st.button('表示する'):
    df = pd.read_excel(r'C:\data\2021年都道府県別人口.xlsx',sheet_name='2021年人口',
        index_col='県コード')
    st.table(df)

表示ボタンのみが表示されデータは表示されない。

表示ボタンを押すとデータが表示される。

列の合計値を求めて表示させる

表で全国の合計人数がわからないので、すべての件を足した人数を表示させてみます。この場合は人口(千人)列の数値をすべて合わせた合計人数が全国の総人口になります。なので以下のようにように書けば合計人数を求めることができます。

df_sum = df['人口(千人)'].sum()

総人口をst.metricで書く

合計人数を表示する場合は、計算結果を入れたdataframeをそのままst.writeなどで表示しても良いですが、今回はst.metricで表示させてみます。また、総人口を表の上に表示させたいので、以下のようにプレースホルダーで先に表示領域を確保して後から表示させるようにします。

(コード)

import streamlit as st
import pandas as pd

st.title('2021年都道県別人口')
#ボタンが押された場合の処理
if st.button('表示する'):
    df = pd.read_excel(r'C:\data\2021年都道府県別人口.xlsx',sheet_name='2021年人口',
        index_col='県コード')
    #プレースホルダーphという変数をテーブル表示より先に割り当てる
    ph = st.empty()
    st.table(df)
    df_sum = df['人口(千人)'].sum()
  #計算した総人口をプレースホルダーに代入する。
    ph.metric('総人口:',str(df_sum) + '(千人)')

プレースホルダー

ここでは、変数をphにしていますが、何でも構いません。st.tableの内容を表示するより先に空の領域を確保しておき、計算が終わったらphの変数に総人口の計算結果を表示させています。streamlitは、画面にウィジットを書いた順番で表示していくようになるのでこのプレースホルダーは結構使うと思います。

st.metric

st.metricは、よく株価などの前日との差異などを表示するときに使われています。あまり使うことはないかもしれませんが、最近知ったウィジットなので使ってみました。ちなみに前年などのデータがあれば、こんな感じで表示させることもできます。

※例 前年より1000人減少した場合などはこんな感じで表示させたりすることも可能です。

まとめ

  • Excelの表データをStreamlit上に表示させるのはpandasのread_excelを使えば簡単
  • read_excelのパラメータでインデックスを指定することも可能
  • df[‘列名’].sum()で合計値を計算することが可能
  • st.buttonでボタンを押すと表示させるようにすると、画面がすっきりする
  • 先に領域を仮で確保しておくプレースホルダーはStreamlitでは結構使う
  • st.metricは、株価や前日比などを扱うデータの場合は、結構使う

コメント

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