技術は使ってなんぼ

自分が得たものを誰かの役に立てたい

Streamlitで公園検索WEBアプリを20行以内で作ってみた


こんにちは。

今回は以前紹介したStreamlitを使って、実際にアプリを作ってみましょう。

Streamlitのインストールや使い方の概要はこちらからどうぞ。
yonesuke0716.hatenablog.com

どんなアプリを作るかというと、エクセルをデータベース代わりに使った公園検索WEBアプリを作ります。

なぜ「公園検索」なのかというと、夏休みに妻が子供を連れていく先に困ってたことがきっかけです。

どこで遊ぶのがいいか、候補を検索するアプリがあればなぁと言っていたので、それをやるならStreamlitで30分程度で作れるなと思いました。

なので今回はそんなテーマで、以下のポイントを押さえた内容にしたいと思います。

・Streamlitを使ってとにかく簡単・最速に作る

「技術は使ってなんぼ」なブログなので、実際の問題にも適用できる可能性を見せる

それではよろしくお願いします。

仕様

ファイル構成はこんな感じです。

構成

test.pyがStreamlitの実行ファイルで、検索用データベースがtest.xlsxになります。

test.xlsxの中身はこんな感じ。

エクセル

データベースは簡易的ならエクセルで代用できると思います。

SQL等の知識がない人でも、エクセルならメンテナンスもできますよね。

出力イメージとしては、「年齢」と「市町村」を選択すれば、「公園」と「URL」が出力されるような仕組みにしたいと思います。

ではそれを実現するためのtest.pyを紹介します。

ソースコード

test.pyの中身は以下です。

import streamlit as st
import pandas as pd

st.markdown(" ## 公園検索")
df = pd.read_excel("test.xlsx", engine='openpyxl')
machi = df['市町村'].unique().tolist()
toshi = df['年齢'].unique().tolist()
m_select = st.sidebar.selectbox("市町村を選択してください", machi)
t_select = st.sidebar.selectbox("年齢を選択してください", toshi)
result_df = df[(df['市町村'] == m_select) & (df['年齢'] == t_select)]
if len(result_df) == 0:
    st.write("一致する結果はありません")
else:
    st.write("一致した場所: ")
    for i in range(len(result_df)):
        st.write(result_df["公園"].values[i])
        url = result_df["URL"].values[i]
        link = f'[{url}]({url})'
        st.markdown(link, unsafe_allow_html=True)

はい、20行以内で作成時間はおよそ30分程度です。

これでWEBアプリの完成です。

とても短くて簡単で早いですよね。

実行結果

まずはエクセルを読むために必要なライブラリをインストールします。

$ pip install openpyxl

あとは以下のコマンドを叩いて実行します。

$ streamlit run test.py

すると次のような画面が出力されます。

公園検索WEBアプリ

一致する条件がなければ、このようになります。

一致しない場合

複数ヒットすれば、複数表示されます。

複数表示

表示されているURLは、クリックするとアクセスできます。

WEBアプリは立ち上げたままでも、エクセルを更新すると自動でWEBアプリにも反映されます。

なので、自宅や社内のIPアドレス内で起動しっぱなしにしておけば、そのURLにアクセスして皆で共有することができます。


いかがだったでしょうか?

Githubで公開しておくので、試してみたいよって方がいましたら以下からご利用ください。
github.com

2次利用としても自由に使ってもらって構いませんが、もしよければ使ってみた感想や、もっとこんなこともできたらみたいなコメント等を一言いただけると私が喜びます。