Python Streamlitを使用した基礎的なWebアプリケーションの作成(1) June, 2025

Basic Learning Python Library Streamlit which easily create web applivation


Streamlitを使って簡単なデータベースとUserInterfaceApplyの作成に挑戦しようと、一念発起です。

 Streamlitの基礎については、PythonVtuberのサプーさんがUploadしているMovieでStudyしました。サプーさんのMovieは解説がわかりやすく、とても勉強になるので、本当に助かります。

 PythonVtuberサプーさんによるStreamlitの基礎がわかるYouTube動画

https://www.youtube.com/watch?v=4nsTce1Oce8&t=153s

 次はStreamlitをどのような環境で実行するか、という点について検討です。おそらくHighSpectなPersonalComputerを持っていたら、AnacondaとJupyterNotebookあるいはJupyterLab、あるいは、Spyderを組み合わせたEnviromentでCodeをDoすることがBetterなのかなぁと思います。

 わたしのLowSpecなLaptopPCでAnacondaのLocalEnviromentでStreamlitをRunしたのですが、Every OperatingがVery SlowでとてもUnbearableでした。

 わたしのようなLowSpec環境だと、やはりGoogleColabを活用した方がよさそうです。

 MasterGeminiにTry to Askしたところ、TkinterはGoogleColab環境では動作しないのですが、Streamlitは動作するということがわかりました。MasterGeminiが提案してくれたCodeをGoogleColab上でRunしてみます。

>The Code that MasterGemini has made<

!pip install streamlit

%%writefile app.py

import streamlit as st

st.title('Colabで動くStreamlitアプリ')
st.write('これはGoogle Colabで実行されているStreamlitのデモです。')

name = st.text_input('お名前を入力してください:', '')
if name:
    st.write(f'こんにちは、{name}さん!')

number = st.slider('数字を選んでください:', 0, 100, 50)
st.write(f'選んだ数字: {number}') 

2行目にWritingしている%%writefile app.pyがPointで、Anaconda環境であれば必要ないCodeですが、GoogleColabでStreamlitを動かすためにはEssenrtialなコードになるようです。このCodeをGoogleColab上でRunすると、GoogleColabのTemporaryなFolderにapp.pyというFileがCreateされます。ちなみにgoogleColabのOutputは’Writing app.py'Onlyです。


このGooleColabのTemporaryFolderにできた'app.py'を左クリックして現れる縦に・が3つならんでるいるDownloadして、AnacondaでCreateしたCodesがSaveされるLocalFolderにMoveします。そして、AnacondaのMenuから’AnacondaPromt'(WindowsStartボタンのapplication選択画面からAnacondaFolderの中にあります。)を起動します。

そして、AnacondaPromptのComamandLineから'cd'LocalFolder(私の場合、’\user\にChangeDirectryして、CommandLineに'streamlit run app.py'を入力して、app.pyをRunします。

そうすると、自動的にWebブラウザーに新しいTagができて、StreamlitのApplicationが起動します。今回のCodeだと以下のような感じです。

もし、Codeを更新したら、GoogleColabでCodeをRunして、App.pyをDownload&Moveしたあとに、WebブラウザのRenewButtonを押したら、Applicationが更新されるはずです。

StreamlitのWebApplicationのRunのMethodがUndestandできたところで、次の課題に移ります。次は、以前、Foliumで試した国土数値情報の全国のダム地点のデータを都道府県名やダム形式、ダムの目的で絞り込んだうえで、該当するデータを表示するApplicationを作ってみます。といっても自分で作るのでは無く、MasterGeminiに相談です。

>MasterGeminiへのAsking<
Streamlitでメイン画面にgeodataframe'gdf'の一覧を表示して、左側のサブ画面に'都道府県名で選択'、'ダム型式で選択'、'ダムの目的で選択'、アプリを終了'の3種類のボタンを設定するコードを書いて

>MasterGeminiのAnswerCode<…最初からPerfectだった訳ではございません
%%writefile app.py
import streamlit as st
import geopandas as gpd
import pandas as pd

# --- サンプルデータの作成 (実際のgdfに置き換えてください) ---
# 都道府県名、ダム型式、ダムの目的のサンプル値
prefectures = ['東京都', '神奈川県', '大阪府', '京都府', '兵庫県', '愛知県']
dam_types = ['重力式コンクリートダム', 'ロックフィルダム', 'アーチ式コンクリートダム']
dam_purposes = ['治水', '利水', '発電', '治水・利水']

data = {
    '都道府県名': [prefectures[i % len(prefectures)] for i in range(20)],
    'ダム名': [f'ダム{i+1}' for i in range(20)],
    'ダム型式': [dam_types[i % len(dam_types)] for i in range(20)],
    'ダムの目的': [dam_purposes[i % len(dam_purposes)] for i in range(20)],
    'geometry': gpd.points_from_xy([135 + i * 0.1 for i in range(20)], [35 + i * 0.05 for i in range(20)])
}
gdf = gpd.GeoDataFrame(data, crs="EPSG:4326")
# --- サンプルデータの作成ここまで ---

st.set_page_config(layout="wide") # 画面全体を使う設定

st.title("ダム情報ビューア")

# メイン画面
st.header("ダム一覧")

# geometry列をWKT形式の文字列に変換して表示用のDataFrameを作成
# Create a display DataFrame by converting the geometry column to WKT string format
gdf_display = gdf.copy()
gdf_display['geometry'] = gdf_display['geometry'].apply(lambda x: x.wkt)
st.dataframe(gdf_display) # geodataframe 'gdf' の一覧を表示

# サブ画面 (サイドバー)
st.sidebar.header("選択オプション")

# 都道府県名で選択
st.sidebar.subheader("都道府県名で選択")
selected_prefecture = st.sidebar.selectbox(
    "都道府県を選択してください",
    ['全て'] + sorted(gdf['都道府県名'].unique().tolist())
)
if selected_prefecture != '全て':
    gdf_filtered_prefecture = gdf[gdf['都道府県名'] == selected_prefecture]
    # Filtered DataFrameもgeometry列をWKTに変換して表示
    # Convert geometry column to WKT for the filtered DataFrame display as well
    gdf_filtered_prefecture_display = gdf_filtered_prefecture.copy()
    gdf_filtered_prefecture_display['geometry'] = gdf_filtered_prefecture_display['geometry'].apply(lambda x: x.wkt)
    st.header(f"{selected_prefecture}のダム一覧")
    st.dataframe(gdf_filtered_prefecture_display)
else:
    st.header("全てのダム一覧")
    st.dataframe(gdf_display) # 全てのダムを表示する場合は、既に変換済みのgdf_displayを使用


# ダム型式で選択
st.sidebar.subheader("ダム型式で選択")
selected_dam_type = st.sidebar.selectbox(
    "ダム型式を選択してください",
    ['全て'] + sorted(gdf['ダム型式'].unique().tolist())
)
if selected_dam_type != '全て':
    gdf_filtered_type = gdf[gdf['ダム型式'] == selected_dam_type]
    # Filtered DataFrameもgeometry列をWKTに変換して表示
    # Convert geometry column to WKT for the filtered DataFrame display as well
    gdf_filtered_type_display = gdf_filtered_type.copy()
    gdf_filtered_type_display['geometry'] = gdf_filtered_type_display['geometry'].apply(lambda x: x.wkt)
    st.header(f"{selected_dam_type}のダム一覧")
    st.dataframe(gdf_filtered_type_display)

# ダムの目的で選択
st.sidebar.subheader("ダムの目的で選択")
selected_dam_purpose = st.sidebar.selectbox(
    "ダムの目的を選択してください",
    ['全て'] + sorted(gdf['ダムの目的'].unique().tolist())
)
if selected_dam_purpose != '全て':
    gdf_filtered_purpose = gdf[gdf['ダムの目的'] == selected_dam_purpose]
    # Filtered DataFrameもgeometry列をWKTに変換して表示
    # Convert geometry column to WKT for the filtered DataFrame display as well
    gdf_filtered_purpose_display = gdf_filtered_purpose.copy()
    gdf_filtered_purpose_display['geometry'] = gdf_filtered_purpose_display['geometry'].apply(lambda x: x.wkt)
    st.header(f"{selected_dam_purpose}のダム一覧")
    st.dataframe(gdf_filtered_purpose_display)

# アプリを終了ボタン
st.sidebar.subheader("アプリの操作")
if st.sidebar.button("アプリを終了"):
    st.stop() # Streamlitアプリを停止 (開発環境ではブラウザタブを閉じることで終了)

# フィルタリングされたデータフレームの表示 (重複を避けるため、各選択肢のブロック内で表示)
# 注意: 上記のコードでは、最後に選択されたフィルタが適用されます。
# 複数のフィルタを同時に適用したい場合は、ロジックを調整する必要があります。


これをAnacondaPromptでRunするといかのような画面になります。
 

なんとなくですが、仮作成したGeoPandasDataFrameのダム一覧から選択した都道府県名やダム形式のダムを抽出して一覧表を作り直してくれているような気がします。
都道府県はもう少し見やすくしたいので、地方別に都道府県をグループ化して表示することができないか、MasterGeminiに相談してみます。


















コメント