見出し画像

Webアプリ作成 -Streamlit①-

これまでpythonの基本的な使い方等を投稿してきましたが、「Google Colabを使える環境とかpythonを使用できるように環境設定したPCでないと活用できないのでは…?」と感じている人も多いのではないでしょうか?
実はそんな事はなく、webアプリを作成すればスマホやタブレット、pythonをインストールしていないPCでもpythonで書いたプログラムの恩恵を受けることが出来ます。Streamlitを用いると、簡単にwebアプリが作成できます!


Streamlitとは?

Streamlitは、Pythonでインタラクティブなwebアプリを簡単に作成するためのフレームワークです。通常、webアプリを作成する場合にはHTMLやCSS、JavaScript等の知識が必要になりますが、Streamlitを用いればpythonのコードだけでアプリを作ることが出来ます。
アプリに必要なボタンやスライダー、チェックボックスなどのウィジェット(操作するための部品)も簡単に作成できるのが特徴です。

とりあえず触ってみよう!

実際にどんなものかコードを書きながら体感した方が早いと思うので、早速インストールから始めます。コマンドプロンプトで以下のように入力しインストールします。

pip install streamlit

その後、コマンドプロンプトの画面で次のように入力すると、ブラウザが起動しデモ画面が表示されます。

streamlit hello
Streamlitのデモ画面

例えば、DataFrame Demoの画面では、セレクトボックスから選ぶ選択肢に応じて表(DataFrame)とその下のグラフの中身が変化します。予め作成したグラフを表示することもできますが、このようにユーザーがその場で選んだものを表示させたり計算させたりすることができ、まさに「インタラクティブ」です。
今はデモ画面ですが、このような機能をもったアプリケーションをデプロイ(公開)すれば、スマホなどのpython環境ではないデバイスでも使用できるようになります。これまでpandasやaltairなどの可視化ライブラリについて投稿をしてきましたが、ここでも大活躍します。
ちなみに、デモ画面はコマンドプロンプト上で「Ctrl + C」で停止します。

とりあえず作ってみよう!

以前の投稿(Pythonの基本④ 関数)で、腎機能関連を一気に計算するための関数を作成しました。これを活用して、自作のアプリを作ってみます。

まずは、コード全体を示します。「main.py」という名前で保存します。
defで腎機能関連の計算をする関数を定義していますが、ここは以前の投稿をそのままコピーしています。データの入力と出力のところが少し異なるだけなので比べてみてください。

import streamlit as st

st.title('sample page')

gender = st.selectbox('性別', ['m', 'f'])
age = st.slider('年齢', min_value=0, max_value=100, value=20)
height = st.slider('身長(cm)', min_value=100, max_value=210, value=160)
bw = st.slider('体重(kg)', min_value=20, max_value=150, value=50)
scr = st.slider('血清クレアチニン値(mg/dL)', min_value=0.0, max_value=3.0, value=0.5)

def renal_clearance(gender, age, height, bw, scr):
  #肥満かどうか判定し、肥満の場合はBMI 22となる体重に補正
  BMI = bw/(height/100)**2
  if BMI >= 25:
    bw = 22 * (height/100)**2
    obesity_index = f'肥満(体重は{bw:.1f}kgで計算)'
  else:
    obesity_index = ''
  #CG
  coefficient1 = {'m': 1, 'f': 0.85}
  clcr = (140-age)*bw/(72*scr)*coefficient1[gender]
  #BSA
  BSA = height**0.725 * bw**0.425 * 0.007184
  #eGFR
  coefficient2 = {'m': 1, 'f': 0.739}
  eGFR = 194 * age**-0.287 * scr**-1.094 * coefficient2[gender]
  eGFR_BSAadj = eGFR * BSA/1.73

  return BMI, obesity_index, clcr, BSA, eGFR, eGFR_BSAadj

btn = st.button('計算')
if btn:
    BMI, obesity_index, clcr, BSA, eGFR, eGFR_BSAadj = renal_clearance(gender, age, height, bw, scr)
    st.write(f'BMI: {BMI:.1f} {obesity_index}')
    st.write(f'BSA = {BSA:.2f} (m2)')
    st.write(f'CLcr = {clcr:.1f} (mL/min)')
    st.write(f'eGFR = {eGFR:.1f} (mL/min/1.73)')
    st.write(f'BSA未補正eGFR = {eGFR_BSAadj:.1f} (mL/min)')

ウィジェットの詳細は次回以降の投稿で解説していきますが、st.selectbox()やst.slider()、st.button()など何となくウィジェットを作成してそうだなぁというのが分かります。以前の投稿では、データ入力はinput()を使用していましたが、ウィジェットを配置することで選んだりスライダーを動かすことでデータ入力をすることが出来ます。そして、gender = st.selectbox()のようにウィジェットの入力値をそのまま変数に格納し、defで定義した関数で利用できます。
また、以前の投稿ではprint()で結果のテキストを表示していましたが、streamlitではst.write()を用います。

それでは、作成したmain.pyを実行してみます。まずは、コマンドプロンプトでmain.pyを配置したディレクトリへ移動します。

cd ******

次に、同じくコマンドプロンプトで以下のように入力するとデモ画面と同様にブラウザ上にmain.pyで作成したアプリが起動します。

streamlit run main.py

セレクトボックスで性別を選択し、年齢などスライダーで設定し「計算」を押すと計算結果が表示されます。超簡単に計算アプリを作成することが出来ました。コマンドプロンプトで「Ctrl + C」を押すと停止します。
本来、htmlなどの知識がないとwebアプリは作成できませんが、streamlitを活用することで簡単に作ることが出来ました。webアプリを作成できるとプログラミングで出来ることの幅が拡がります。


「streamlit run ***.py」はローカルホストで動かしただけなので、外部のネットワークに公開されたわけではありません(挙動などのテスト用)。これから何回かに分けてwebアプリ作成方法を紹介していきたいと思います。

この記事が気に入ったらサポートをしてみませんか?