前提・実現したいこと
現在、特定のデータセットを読み込んで、複数の側面から可視化する
アプリをStreamlitで作成しようと考えています。(あくまで下の図はテスト的なものです)
発生している問題・エラーメッセージ
表示部分はざっくり作ってみたのですが、selectboxにデータカラムを表示させる部分で、
カラム名が日本語でないので(何のデータか)よくわからない、というご指摘をいただき、selectboxに表示させる部分と
カラム名を何とか対応させようと思ってcolumnsを直接対応する日本語名に差し替えようと思ったのですが、
追加要望でデータセットの中で、複数カラムに対し、特定の条件でタグをつけたい(注)という要望があり、
データフレームの列追加が発生してしまうと、直接カラム名を置き換えたタイミングで
データフレームの列が合わないなどの問題が発生してしまいます。
(注:下記図(データは仮でgapminderを使用しています)でいうと、たとえば、1970年代のAsiaだけ、
「インフレ時」のようなラベルを付ける、ような用途で使用したい、というユースケースがあります。)
お聞きしたいこととしては、下記1点です。
①streamlitのselectboxに表示させるときだけ、対応する日本語名を表示させる方法について
ご教示いただけないでしょうか。
※上記において、もとのdataframeは、列の追加が行われる場合でも、正常に動作させるつくりにしたいです。
(列追加をされた場合でも、追加列に対応する日本語を設定したら、selectboxに反映できる)
該当のソースコード
(データフレームの列追加や前処理の部分などは省いています。)
Python3
1 2def a_function(vis_data): 3 cat_list = list(vis_data.select_dtypes(include=[object])) 4 val_list = list(vis_data.select_dtypes(exclude=[object])) 5 # form sample 6 with st.form('my_form_identifier'): 7 f_c1, f_c2, f_c3 = st.columns(3) 8 with f_c1: 9 x_select = st.selectbox("x選択ください", val_list, index=1) 10 x_select2 = st.selectbox("x選択ください", val_list, index=2) 11 with f_c2: 12 y_select = st.selectbox("y選択ください", val_list, index=2) 13 y_select2 = st.selectbox("y選択ください", val_list, index=3) 14 with f_c3: 15 group_select = st.selectbox("層別する対象を選択ください", cat_list, index=1) 16 group_select2 = st.selectbox("層別する対象を選択ください", cat_list, index=2) 17 18 with st.expander('See details'): 19 slider_val = st.slider("Form slider") 20 checkbox_val = st.checkbox("Form checkbox") 21 22 # Every form must have a submit button. 23 submitted = st.form_submit_button("Submit") 24 if submitted: 25 st.write("slider", slider_val, "checkbox", checkbox_val) 26 # 読み込んだデータセットと、formで設定した値を使って、何らかのグラフ描画などを行いたい 27 fig1 = px.scatter(vis_data, x=x_select, y=y_select, color=group_select, 28 marginal_y="violin", marginal_x="box", trendline="ols", template="simple_white") 29 fig2 = px.scatter(vis_data, x=x_select2, y=y_select2, color=group_select2, 30 marginal_y="violin", marginal_x="box", trendline="ols", template="simple_white") 31 # container sample 32 container = st.container() 33 c_col1, c_col2 = container.columns(2) 34 35 with c_col1: 36 st.plotly_chart(fig1, use_container_width=True) 37 with c_col2: 38 st.plotly_chart(fig2, use_container_width=True) 39 40 41def b_function(vis_data): 42 pass 43 44def main(): 45 st.title("ほげほげデータビューワ") 46 47 mode_list = ["a機能", "b機能"] 48 func_sel = st.sidebar.selectbox("機能を選んでください", mode_list) 49 data = pd.DataFrame() 50 51 if 'input_data' not in st.session_state: 52 st.session_state['input_data'] = 0 53 54 # データ取得処理 55 get_data_source = st.sidebar.button("データ取得、更新") 56 if get_data_source: 57 # 何らかのデータ取得処理を記載(ボタン押下時のみ取ってくるようにする) 58 data = px.data.gapminder() 59 st.session_state.input_data = data 60 61 with st.expander('データ詳細'): 62 st.dataframe(st.session_state.input_data) 63 64 if func_sel == "a機能": 65 a_function(st.session_state.input_data) 66 else: 67 b_function(st.session_state.input_data) 68
試したこと
streamlitのリファレンスをチェックした
stackoverflowなどで、問題解決のヒントがないか調べた
補足情報(FW/ツールのバージョンなど)
Python 3.8.7
pandas 1.3.0
streamlit 1.0.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/07 03:07
2021/11/07 03:17
2021/11/07 22:39