30 Days of Streamlitにチャレンジしてみた (Day 1～Day 10)

## Streamlitとは

StreamlitはPython向けのWebアプリケーションフレームワークです。  

https://streamlit.io/

Streamlitを使うとフロントエンドの知識ゼロでもデータを可視化するためのWebアプリケーションを簡単に作れます。以下のような機能が特徴。  
- 変数を地の文に書くだけで、GUIに出力される(**マジックコマンド**)
- `st.radio`や`st.text_input`のようなWidget APIを呼び出すだけで、GUIコンポーネントが生成される

[30 Days of Streamlit](https://blog.streamlit.io/30-days-of-streamlit/)はStreamlitのチュートリアルコンテンツ。SNSに進捗を共有しながらちょっとづつStreamlitを学習できます。  
`#30DaysOfStreamlit`で検索すると先人たちのチャレンジの記録がたくさん！  
やっていきましょう。  

## Day 1

Day 1はローカル環境にPythonとStreamlitをインストールして、ビルトインのデモアプリを起動させるまで。  
ローカル環境と書かれていますが、Python開発コンテナーでも問題ありませんでした。  
`streamlit hello`でデモアプリを起動させるときにメールアドレスの入力を勧められますが、とりあえずスルー。  

```
# streamlit hello

      👋 Welcome to Streamlit!

      If you’d like to receive helpful onboarding emails, news, offers, promotions,
      and the occasional swag, please enter your email address below. Otherwise,
      leave this field blank.

      Email:  

  You can find our privacy policy at https://streamlit.io/privacy-policy

  Summary:
  - This open source library collects usage statistics.
  - We cannot see and do not store information contained inside Streamlit apps,
    such as text, charts, images, etc.
  - Telemetry data is stored in servers in the United States.
  - If you'd like to opt out, add the following to ~/.streamlit/config.toml,
    creating that file if necessary:

    [browser]
    gatherUsageStats = false


  Welcome to Streamlit. Check out our demo in your browser.

  Local URL: http://localhost:8501
  Network URL: http://172.17.0.2:8501

  Ready to create your own Python apps super quickly?
  Head over to https://docs.streamlit.io

  May you create awesome apps!
```

無事にデモアプリが起動しました。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/ee41f561-7277-62c4-b039-bc7d87bb3e11.png)

## Day 2

Day 2は自前のPythonスクリプトでHello worldなWebアプリケーションを起動するまで。  
`streamlit_app.py`を作成して`streamlit run streamlit_app.py`でWebアプリケーションが起動しました。ここからはこの`streamlit_app.py`を編集していくってことですね。  

```python:streamlit_app.py
import streamlit as st

st.write('Hello, world.')
```

シンプル。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/54f173be-2ca2-313b-8424-83757624a835.png)

## Day 3

Day 3はWebアプリケーションにボタンを配置する方法。  

```python:atreamlit_app.py
import streamlit as st

# "Say hello"というキャプションのボタンを作成する
if st.button('Say hello'):
    # ボタンが押されればこちらが表示される
    st.write('Why hello there')
else:
    # ボタンが押されなければこちらが表示される
    st.write('Goodbye')
```

ソースコードは簡単だけど、もしかしてすごいことやっているのでは。  
![streamlit-day3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/da31988c-8d0f-e731-2ab6-8b2a9d17e9c9.gif)

## Day 4

Day 4は動画視聴。  
Ken Jeeさんはデータサイエンスに関する動画やポッドキャストを配信している人気YouTuberらしいです。  
英語は自信ありませんでしたが、自動字幕のおかげで理解できました。  

https://www.youtube.com/watch?v=Yk-unX4KnV4

Streamlitで実践的なダッシュボードを作ることがどれくらい簡単かというのがすごく分かりやすかったです！  
Streamlitとは関係ないんですけど、ライブコーディングの見せ方も参考になりました。  

## Day 5

Day 5はMarkdown、データフレーム、チャートを表示する方法。  
いきなり盛りだくさんですね。  

チャートはAltairを使っていました。Plotlyも使えるらしいのですが、今回は使っていません。  

```python:streamlit_app.py
import numpy as np
import altair as alt
import pandas as pd
import streamlit as st

# ランダムなデータを挿入したデータフレームを生成する(3次元の点×200点)
df_random = pd.DataFrame(np.random.randn(200, 3), columns=['a', 'b', 'c'])
# Altairでチャートを生成する
c = alt.Chart(df_random).mark_circle().encode(x='a', y='b', size='c', color='c', tooltip=['a', 'b', 'c'])
# 生成したチャートを表示
st.write('Chart:', c)
```

対応している変数を`st.write`に渡す、もしくはマジックコマンドを使うだけで表示できるのであっさり。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/9c6f23f6-cb08-8de1-4470-b2120a00fec8.png)

## Day 6

Day 6はGitHubを使ってみよう！という内容でした。  
GitHubにリポジトリを作るだけだから簡単…ではあるんですけど、何をやっているのか何をしたいのかがプログラマじゃないと理解しづらいかもですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/d427f439-8a3f-534e-b391-ab359c77dda1.png)

## Day 7

Day 7はStreamlit Community Cloudを使ってみよう！という内容でした。  
アカウントを登録して、  
GitHubを連携して(このためにDay 6があったのか…)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/69acbcad-81bf-3dbf-70b1-35410db003e3.png)

デプロイするプロジェクトをGUIでポチッと選ぶとデプロイされます！
"Your app is in the oven"(調理中)の演出がオシャレ。オイモー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/06812311-bfdf-583e-f149-e20adcc9b111.png)

数十秒待つとデプロイされました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/467f0b45-04b0-6c42-a875-373137806e33.png)

## Day 8

Day 9はスライダーが登場。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/fde4e5f4-f937-ecfa-4b49-f8b8f1895589.png)

ユーザがスライダーを操作した結果をPythonの変数で受け取れるので、インタラクティブなアプリを作れそう！という感じになってきます。  

```python:streamlit_app.py
values = st.slider('Select a range of values', 0.0, 100.0, (25.0, 75.0))
```
この1行だけで、スライダーを作って操作した結果を```values```に代入できる…すごくない？  

スライダーの数値のフォーマットが何種類か用意されているのも技ありって感じですね。  
参考：[st.slider - Streamlit Docs](https://docs.streamlit.io/library/api-reference/widgets/st.slider)  

## Day 9

Day 8はみんな大好き折れ線グラフ！これから多用しそう！  
```st.line_chart```にデータフレームを渡すだけ。  

```python:streamlit_app.py
chart_data = pd.DataFrame(
     np.random.randn(20, 3),
     columns=['a', 'b', 'c'])

st.line_chart(chart_data)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/a3580e93-db60-424f-76cc-028ec0df732f.png)

データフレームの構造はこんな感じでした。これからはこういう形にデータを整えてあげればいいんですね！  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/1a73bf88-8394-cfb5-dd65-12c63a941609.png)

## Day 10

Day 10はセレクトボックスが登場。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/ea38be0f-b637-af02-1670-0c8d4fec70c8.png)

選択肢は配列かタプルを渡してあげるだけでOK！

## Day 11以降

Day 11以降は[こちら](https://qiita.com/ak-sakatoku/items/9f170e4e8dcdeaffce3d)