質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7853閲覧

Streamlitのselectboxで項目を選択した際の挙動について

kunishou123

総合スコア0

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/08/09 10:18

編集2021/08/09 10:47

概要

Streamlitの練習を兼ねて簡単な機械学習アプリを作成しようと
しておりますが、作成したコードをローカルマシン上で実行すると、
ページ途中に設置したselectboxにて項目を選択した際にページがリロードされ、
「ファイル読み込み」のボタンのところからやり直しになります。

もし原因が分かる方がいればご教示願います。

実行環境

Windows10 64bit
Python 3.7.6
Streamlit 0.86.0

ソースコードについて

Python

1import streamlit as st 2import pandas as pd 3 4 5st.title('Test') 6 7uploaded_file = st.file_uploader('1. ファイルをアップロードする。', type='csv') 8 9if uploaded_file is not None: 10 11 button1 = st.button('2. ファイル読み込み') 12 13 if button1: 14 st.markdown('### 読み込みデータ表示') 15 16 df1 = pd.read_csv(uploaded_file) 17 18 st.write(df1) 19 20 target = st.selectbox('3. 目的変数を選択',tuple(df1.columns)) # ここで項目を選択するとページがリロード 21 22 st.write(target)

「目的変数を選択」のselectboxで項目を選択すると
ページがリロードされ、「ファイル読み込み」のボタンの
ところからやり直しになります。

動作テストで読み込ませているデータは、Kaggleのタイタニック号乗客の生存予測コンペの
データです。

どうぞよろしくお願いいたします。

(補足)

「if button1:」の行を無くせばリロードされることはなくなります。ですが、ボタンを
押下してからファイル読み込みが開始される仕様にしたいため、「if button1:」はそのままに
したいと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以下のStreamlit公式のDiscussをヒントに解決することができました。

https://discuss.streamlit.io/t/streamlit-selectbox-setting-value/15639/3

問題があったのはselectboxではなく、その手前のbutton widgetでした。
button widgetは押された瞬間のみTrueになりますが、その後Falseに戻ります。

そのため、button以降に別のwidget(今回の場合、selectbox)があり、そのwidgetで
操作をした時点でbuttonはFalseに戻ります。

Streamlitはコード内の変数に変化があった場合リロードされるため、今回は
buttonのところまで戻ってしまう状態でした。

以下の通り、StreamlitのSession State機能で変数の状態を保持することで
この問題を解決することができました。

Python

1import streamlit as st 2import pandas as pd 3 4 5st.title('Test') 6 7uploaded_file = st.file_uploader('1. ファイルをアップロードする。', type='csv') 8 9if uploaded_file: 10 11 if 'push1' not in st.session_state: # ここを追加 12 st.session_state.push1 = False #push1がsession_stateに追加されていない場合,False 13 14 button1 = st.button('2. ファイル読み込み') 15 16 if button1: # ここを追加 17 st.session_state.push1 = True #button1が押下された場合,Trueを保持 18 19 if st.session_state.push1: 20 21 st.markdown('### 読み込みデータ表示') 22 23 df1 = pd.read_csv(uploaded_file) 24 25 st.write(df1) 26 27 target = st.selectbox('3. 目的変数を選択',tuple(df1.columns)) 28 29 st.write(target)

Session Stateの使用方法については以下の記事を参考にしました。

【Streamlit】Session Stateで変数の値を保持する方法

投稿2021/08/09 14:29

kunishou123

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問