Streamlit

って一体何?と思いつつWebで調べたり書籍を買って読んでみたりした。

結局、Pythonで手軽にWebアプリが作れるもの、ということのよう。ただ、その中でも特にグラフ描画とかが簡単にできるのでデータサイエンス向け、と言われているのかな?あとは、所謂データサイエンティストであって、Web開発がメインでない人でもすぐ扱える、というところもそう言われる所以かもしれない。逆に大規模で信頼性の高いサイトが構築できるわけではなくて、データの可視化をユーザ側にインタラクティブな形で提供するお手軽ツール、というのが自分が理解したところ。たぶん、何十万ものデータを扱うのは厳しいのではないかと思う(ので自分にはあまり使い道がないかも)。

 

例えばここにあるコードを下記のように少し書き換えて、test.pyで保存する。

 

import streamlit as st

from sklearn.datasets import load_digits
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import seaborn as sns

digits = load_digits()

tsne = TSNE(n_components=2, random_state=42)
digits_tsne = tsne.fit_transform(digits.data)

plt.figure(figsize=(10, 10))
plot = sns.scatterplot(x=digits_tsne[:, 0], y=digits_tsne[:, 1], hue=digits.target, palette=sns.color_palette("hsv", 10))

st.pyplot(plot.get_figure())

 

そして、

streamlit run test.py

で実行すると、Webブラウザが開いて、結果が表示される。あとはいろいろインタラクティブな要素を付加するとstreamlitらしくなるのではないかと思う。ということで、scikit-learnに含まれているデータを切り替えられるようにし、なおかつグラフ自体インタラクティブに操作できるplotlyに変更してみたのが以下。ただ、どうしても色が思いどおりにならない。

 

import streamlit as st

from sklearn.datasets import load_digits
from sklearn.datasets import load_breast_cancer
from sklearn.datasets import load_wine
from sklearn.datasets import load_iris
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px

selected_dataset = st.selectbox('データセット', ['手書き文字', '乳がん', 'ワイン', 'アヤメ'])

if selected_dataset == '手書き文字':
    data = load_digits()
elif selected_dataset == '乳がん':
    data = load_breast_cancer()
elif selected_dataset == 'ワイン':
    data = load_wine()
elif selected_dataset == 'アヤメ':
    data = load_iris()
else:
    pass

tsne = TSNE(n_components=2, random_state=42)
data_tsne = tsne.fit_transform(data.data)

plt.figure(figsize=(10, 10))

colors = sns.color_palette("hsv", 10).as_hex() 

fig = px.scatter(data_tsne, x=data_tsne[:, 0], y=data_tsne[:, 1], color=data.target, color_discrete_sequence=colors)
st.plotly_chart(fig)