Skip to main content

복잡한 대시보드

사이드바

with st.sidebar:
st.markdown('# 사이드바 제목')
st.markdown('사이드바 내용 작성')

tab1, tab2 = st.tabs(["고양이", "강아지"])

with tab1:
st.header("고양이")
st.image("https://static.streamlit.io/examples/cat.jpg", width=200)

with tab2:
st.header("강아지")

화면 분할

left_column, right_column = st.columns(2) # 좌우 2개 컬럼으로

with left_column: # 왼쪽 컬럼에 들어갈 내용
st.markdown('왼쪽')

with right_column: # 오른쪽 컬럼에 들어갈 내용
st.markdown('오른쪽')

페이지

  • 대시보드를 여러 개의 페이지로 나눌 수 있음
  • 페이지 별로 별개의 파일 또는 함수로 구현
  • page_1.py:
import streamlit as st
st.title("Page 1")
  • main.py:
import streamlit as st

def page_2():
st.title("Page 2")

pg = st.navigation(["page_1.py", page_2])
pg.run()

인터랙션

  • 사용자의 입력에 따라 다른 결과를 제시
model = st.selectbox('차종', options=['전체', 'Avante', 'K3'])
if model == '전체':
st.write('## 전체 차종의 가격 분포')
ax = sns.boxplot(y='price', data=df)
else:
st.write(f'## {model} 차종의 가격 분포')
ax = sns.boxplot(y='price', data=df[df['model'] == model])
st.write(ax.figure) # 차트의 그림(figure)

캐시

  • streamlit은 코드를 수정할 때마다 화면을 새로 그리므로, 오래 걸리는 계산이 있을 경우 비효율적
  • 계산 결과를 캐시(cache, 임시 저장 공간)에 저장하면 같은 계산을 반복하지 않으므로 효율적
  • streamlit의 캐시 종류:
    • cache_data: 일반적인 계산 결과나 데이터(데이터베이스에 저장할 수 있음)
    • cache_resource: 용량이 매우 많거나, 데이터베이스에 저장할 수 없는 머신러닝 모델, 데이터베이스 연결 등

cache_data

@st.cache_data # 실행 결과를 캐시에 저장
def load_data(url): # 인터넷에서 데이터를 불러오는 함수(오래 걸림)
df = pd.read_csv(url)
return df

if st.button('데이터 불러오기'): # 처음엔 다운받아 느리지만, 다음에는 캐시에서 로딩해서 빠름
df = load_data("https://github.com/plotly/datasets/raw/master/uber-rides-data1.csv")
st.dataframe(df)
  • 옵션
    • @st.cache_data(ttl=3600): 유효기간 1시간(3600초)
    • @st.cache_data(max_entries=1000): 최대 1000개의 결과만 캐싱
    • @st.cache_data(show_spinner="진행 중..."): 대기 문구 설정

대시보드 상태의 지속성 문제

  • counter.py:
import streamlit as st

count = 0
increment = st.button('증가')

if increment:
count += 1

st.write('Count = ', count)
  • "증가" 버튼을 눌러도 1까지만 증가하고 더 증가하지 않음
  • 버튼을 누를 때마다 처음부터 코드를 다시 실행하기 때문

세션 상태

  • 처음부터 다시 실행해도 세션 상태는 보존
import streamlit as st

if 'count' not in st.session_state: # 세션 상태에 'count'가 없으면
st.session_state.count = 0

if st.button('증가'):
st.session_state.count += 1

st.write('Count = ', st.session_state.count)

퀴즈

사용자 정보 입력
퀴즈를 시작하기 전에 이름과 소속을 입력해주세요.

Q&A