Streamlit の細かすぎるけど嬉しいアップデート達。そしてロードマップを眺める


# :streamlit:
Streamlit 1.40 から、`st.markdown` にて、`:streamlit:` で Streamlit ロゴを描画できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/e91a80f9-48d3-503a-482e-8360519ceb4f.png)


下記にソースコードを示します。
```python
import streamlit as st

st.markdown(":streamlit: Hello Streamlit! :streamlit:")
```

なにげに使い所が多そうじゃないですか？


# st.dataframe のマルチインデックス（ヘッダーのみ）対応
Streamlit 1.39 から、`st.dataframe` がヘッダーのマルチインデックスに対応しました。（カラムレベルについては[開発中](https://github.com/streamlit/streamlit/issues/5370)のようです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/cfee909d-a993-09c3-706f-bd28abacbbb2.png)


```python
import streamlit as st
import pandas as pd
import numpy as np

df = pd.DataFrame(
    np.random.randn(3, 5),
    index=["A", "B", "C"],
    columns=pd.MultiIndex.from_tuples(
        [
            ("a", "b", "c"),
            ("a", "b", "d"),
            ("e", "f", "c"),
            ("g", "h", "d"),
            ("", "h", "i"),
        ],
        names=["first", "second", "third"],
    ),
)

st.dataframe(df)
```

# st.pydeck_chart で選択した点の情報を取得できるように
https://qiita.com/toru_hiyama/items/35ec50b7e799fd61d28a

# 様々なデータフレームをネイティブにサポート
Streamlit 1.38 から、Pandas だけでない様々なデータフレーム（Dask、Modin、Numpy、pandas、Polars、PyArrow、Snowpark、Xarray など）をネイティブにサポートするようになりました。これにより、`st.dataframe` や `st.bar_chart` などの Streamlit 関数に直接各データフレームを入力にできるようになります。

# st.feedback, st.dialog, st.fragment の追加
Streamlit 1.37.0 から、下記の機能が追加・一般提供になりました。
- `st.feedback`：ユーザーからの評価を⭐で収集できるようになりました
- `st.dialog`：ウィンドウ上にポップアップ表示されるモーダルダイアログが一般提供になりました（Streamlit 1.34 からプレビュー状態でした）
- `st.fragment`：コードの特定の場所のみを再実行させる機能が一般提供になりました（Streamlit 1.33 からプレビュー状態でした）

どれもこれも活用シーンが多そうですね！

# st.bar_chart の stack オプション
Streamlit 1.37.0 から、`st.bar_chart` のオプションに、`stack` オプションが追加されました。

`st.bar_chart` では、下図のように積み上げの棒グラフがデフォルトの描画仕様となっています。また、Streamlit 1.37 以前では、この描画スタイルを変更することはできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/3b6f0630-ed87-4675-99ff-b806166ac6da.png)

しかし、Streamlit 1.37 で、`stack` オプションが追加されたことによって、下図のように並列棒グラフ・グループ化棒グラフが簡単に描画できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/a7aa514a-7cf5-bd2b-c16e-409ef2e0d3a7.png)

下記にソースコードを示します。
```python 
import streamlit as st
import pandas as pd
import numpy as np

chart_data = pd.DataFrame(np.abs(np.random.randn(5, 3)), columns=["a", "b", "c"])

st.bar_chart(chart_data)

st.bar_chart(chart_data, stack=False)
```

# st.bar_chart の横向き棒グラフ
Streamlit 1.36 から、`st.bar_chart` のオプションに `horizontal=True` を設定することで、棒グラフを横向き表示にできるようになりました。 

# st.navigation & st.Page による柔軟なマルチページ
Streamlit 1.36 から、`st.navigation` & `st.Page` という新たな関数が追加されました。

下記のようなコードを書くことで、関数や任意のディレクトリにあるスクリプトをページとして定義できるようになりました。
```python
import streamlit as st

st.title("これはホームページです")
page = st.navigation([st.Page("page1.py"), st.Page("page2.py")])
page.run()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/adbad4f9-661b-e80a-5fae-60d7d600c1c3.png)

さらに、ページ間で共通の設定項目（ページのタイトル（page1, page2）の変更や絵文字の付与、サイドバーに配置する共通機能、など）を、`main.py`などのエントリポイントファイルに書くだけで良くなったのも非常に助かります。また、ページナビゲーションに階層を設定できるようにもなりました。


# ロードマップからもピックアップ
今後の開発ロードマップを、こちらから確認することができます。
https://roadmap.streamlit.app/

## より多くの要素に境界パラメータを追加する
現状は、確か st.columns の各要素に境界を設定できなかったりするので、もしかするとそれができるようになるのか？と期待しています。

## st.selectbox と st.multiselect で新しいオプションを受け入れる
現状は、新しいオプションを追加すると選択要素がデフォルトに戻ってしまうので、それが改善されるのかな？と期待しています。

## ダウンロードボタン v2
ダウンロードボタン押下によってアプリが再実行されなくなるようです。

## st.app_state
「Streamlit Cloud のすべてのアプリ用の小さな NoSQL データベースです。」とあります。気になりますねぇ。

似たもので、「State and cache visualizer」というものもありました。