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