Streamlitによるダッシュボード

ダッシュボードを作るライブラリとしてはDashを使っているが、ちょっと難しくて初心者には敷居が高いと感じていた。学生や共同研究者に依頼してもPlotlyまではかけるが、Dashは難しいようだ。

もっと簡単なものを探していたら、Streamlitというのを見つけた。

Plotlyの図オブジェクトも入れられる。例えば、ガントチャートはこんな感じだ。

import streamlit as st
st.title('My first app')
import plotly.figure_factory as ff
df = [dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28'),
dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15'),
dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30')]
fig = ff.create_gantt(df)
st.plotly_chart(fig)

Dashと違うのは1ページのダッシュボードを、確認しながらpyファイルをかけることだ。パイソンでコードをかくと、ブラウザにリアルタイムで結果が反映される。Dashもこの辺りのUIを見習って、簡単になってくれると嬉しい。

オフィシャルページにある例を試してみた.コピペしながらブラウザで反応を確認すれば簡単に理解できる.

https://docs.streamlit.io/getting_started.html#import-streamlit
にあるGet Startedの例題とUberの例題.

import streamlit as st
# To make things easier later, we're also importing numpy and pandas for
# working with sample data.
import numpy as np
import pandas as pd
st.title('My first app')
st.write("Here's our first attempt at using data to create a table:")
#if st.checkbox('Show dataframe1'):
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
df
if st.checkbox('Show dataframe2'):
   chart_data = pd.DataFrame(
       np.random.randn(20, 3),
       columns=['a', 'b', 'c'])
   st.line_chart(chart_data)
if st.checkbox('Show dataframe3'):
   map_data = pd.DataFrame(
       np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
       columns=['lat', 'lon'])
   st.map(map_data)
option = st.sidebar.selectbox(
   'Which number do you like best?',
    df['first column'])
'You selected:', option
import time 
# Add a placeholder
if st.checkbox('Show dataframe4'):
   latest_iteration = st.empty()
   bar = st.progress(0)
   for i in range(100):
       # Update the progress bar with each iteration.
       latest_iteration.text(f'Iteration {i+1}')
       bar.progress(i + 1)
       time.sleep(0.1)
   '...and now we\'re done!'

#Uberの例題

import streamlit as st
import numpy as np
import pandas as pd
st.title('Uber pickups in NYC')
DATE_COLUMN = 'date/time'
DATA_URL = ('https://s3-us-west-2.amazonaws.com/'
        'streamlit-demo-data/uber-raw-data-sep14.csv.gz')
@st.cache
def load_data(nrows):
   data = pd.read_csv(DATA_URL, nrows=nrows)
   lowercase = lambda x: str(x).lower()
   data.rename(lowercase, axis='columns', inplace=True)
   data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])
   return data
# Create a text element and let the reader know the data is loading.
data_load_state = st.text('Loading data...')
# Load 10,000 rows of data into the dataframe.
data = load_data(10000)
# Notify the reader that the data was successfully loaded.
data_load_state.text('Loading data...done!')
if st.checkbox('Show raw data'):
   st.subheader('Raw data')
   st.write(data)
if st.checkbox('Show Histgram'):
   st.subheader('Number of pickups by hour')
   hist_values = np.histogram(
       data[DATE_COLUMN].dt.hour, bins=24, range=(0,24))[0]
   st.bar_chart(hist_values)

hour_to_filter = st.slider('hour', 0, 23, 17)  
filtered_data = data[data[DATE_COLUMN].dt.hour == hour_to_filter]
st.subheader(f'Map of all pickups at {hour_to_filter}:00')
st.map(filtered_data)


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