개발자가 빠르고 쉽게 대화형 웹 애플리케이션을 만들 수 있도록 도와주는 오픈 소스 파이썬 프레임워크
streamlit run 파일명.py
text를 제목이나 마크다운, 수학적 표기 등을 가능하게하는 text elements를 제공한다.
st.title('제목이름')
title
/ header
/ subheader
/ text
/ caption
st.code('x=1234') # 복사하기 쉽다!
code
st.write
st.write('titanic data',titanic.head(15)) # write에서만 '~~' 사용할 수 있음!
이미지, 오디오, 비디오를 앱에 쉽게 포함시킬 수 있다.
st.image('링크', caption='설명')
image
/ audio
/ video
데이터를 여러 형태로 시각화하는 기능을 제공해 준다.
st.metric(label='', value='', delta='')
# columns(여러 metric을 같이 표시 가능)
Q. dataframe
/ table
의 차이는?
st.dataframe()은 스크롤, 열 크기조정, 열 정렬, 테이블 확대가 가능하지만,
st.table()은 고정 형태이다!
여러 위젯들을 통해 상호작용이 가능하다.
button
if st.button('Say hello'):
st.write('Hello')
else:
st.write('Goodbye')
radio
genre = st.radio('영화 장르 선택', ['코미디','SF','로맨스'])
if genre == '코미디':
st.write('꿀잼')
elif genre == 'SF':
st.write('멋있어!')
else:
st.write('설레!')
checkbox
agree = st.checkbox('I agree')
if agree:
st.write('😄'*10)
selectbox
option = st.selectbox('연락 방법',['이메일', '휴대전화', '사무실 번호'])
st.write(option)
multiselect
options = st.multiselect('선호하는 색 선택',
['녹색', '노란색', '빨강색', '파란색'],
['노란색', '빨강색']) # Default
st.write('선호 색상: ')
for i in options:
st.write(i)
input
title = st.text_input('최애 영화를 입력하세요', '상속자들')
st.write('내 최애 영화는 ', title)
slider
# 나이
age = st.slider('나이는?', 0, 100, 25) # 0, 100 : 입력허용 구간 / 25 : 최초 세팅 값
st.write('나는 ',age,'살')
# 날짜 구간
slider_date = st.slider(
'날짜 구간 선택하세요',
datetime(2023,1,1), datetime(2023,12,31),
value=(datetime(2023,10,1), datetime(2023,10,31)),
format='YY/MM/DD')
st.write('slider date :', slider_date)
여러 구성요소의 화면 상 위치 조정 기능을 제공한다.
sidebar
with st.sidebar:
st.header('1.사이드바')
add_selectbox = st.sidebar.selectbox(
'연락 수단 방법',
('이메일','휴대 전화','사무실 번호'))
if add_selectbox == '이메일':
st.sidebar.title('📧')
elif add_selectbox == '휴대 전화':
st.sidebar.title('📱')
else:
st.sidebar.title('☎︎')
columns
col1, col2 = st.columns(2)
with col1:
st.text('제목1')
st.image()
with col2:
st.text('제목2')
st.image()
tabs
tab1, tab2 = st.tabs(['제목1','제목2'])
with tab1:
st.caption('제목1')
st.image( , width=200)
with tab2:
st.caption('제목2')
st.image( , width=200)
Q. columns 와 tabs의 차이는?
column은 사진과 설명이 한번에 보이지만
tab은 해당 클릭한 사진과 설명만 보인다!
multipage
# 페이지 선언
def main_page():
st.title('Main Page 🎈')
st.sidebar.title('Side Main 🎈')
def page2():
st.title('Main 2 ❄️')
st.sidebar.title('Side 2 ❄️')
def page3():
st.title('Main 3 🎉')
st.sidebar.title('Side 3 🎉')
# 딕셔너리 선언 { ‘selectbox항목’ : ‘페이지명’ … }
page_names_to_funcs = {'Main Page': main_page, 'Page 2': page2, 'Page 3': page3}
# 사이드 바에서 selectbox 선언 & 선택 결과 저장
selected_page = st.sidebar.selectbox('Select a page', page_names_to_funcs.keys())
# 해당 페이지 부르기
page_names_to_funcs[selected_page]()
[참고]
pd.melt : unpivot (행렬 -> 테이블)
df_melted = pd.melt(df, id_vars=['key'], var_name='var', value_name='val')
그래프 크기 조정, 이동, 데이터 설명을 표시한다.
st.line_chart(chart_data)
st.bar_chart(chart_data)
st.area_chart(chart_data)
데이터 컬럼과 x축, y축, 색상 크기가 가능하고 데이터 설명도 표시한다.
차트에 값 표시가 가능하다.
chart = alt.Chart(변경 데이터, title=' ').mark_line().encode(x='', y='', color='').properties(width=650, height=350)
st.altair_chart(chart, use_container_width=True) # use_container_width=True 가로로 화면에 채워 줌
chart = alt.Chart(변경 데이터, title=' ').mark_bar().encode(
x='', y='', color='')
text = alt.Chart(변경 데이터).mark_text(dx=0, dy=0, color='black').encode(
x='', y='', detail
='', text=alt.Text() )
st.altair_chart(chart+text, use_container_width=True)
chart = alt.Chart(데이터).mark_circle().encode(x = '', y='', color = '')
st.altair_chart(chart, use_container_width=True)
범례 선택으로 그래프 모양 변경, 데이터 설명 표시가 가능하다
import plotly.express as px
fig = px.pie(데이터, names = '', values = '', title='', hole=.3 )
fig.update_traces(textposition='inside', textinfo = 'percent+label+value’)
fig.update_layout(font = dict(size = 14))
# 범례 표시 제거 : fig.update(layout_showlegend=False)
st.plotly_chart(fig)
fig = px.bar(데이터, x="", y=["gold", "silver", "bronze"],
text_auto=True, title="") # text_auto=True 값 표시 여부
fig.update_layout(width=800, height=600 ) # 그래프 크기 조절
# fig.update_traces(textangle=0) # 그래프 안의 텍스트가 바로 씌여지게 설정
st.plotly_chart(fig)
scatterplot으로 위치 표시
값을 보여주거나 원의 크기 조절 불가
data = pd.DataFrame({
'lat':[-34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97]
'lon':[-58, 2, 145, 30.32, -4.03, -73.57, 36.82 , -38.5],
})
# 지도 그리기
st.map(data,
latitude='lat', # 위도
longitude='lon') # 경도
Leaflet.js 기반으로 한 지도 시각화 라이브러리
지도 생성 / 마커, 값 추가 / HTML 출력
# 지도에 원형, 값 추가
for index, row in map_data.iterrows(): # 데이터프레임 한 행 씩 index, row에 담아서 처리
folium.CircleMarker( # 원 표시 선언
location=[row['lat'], row['lon']], # 원 중심-위도, 경도
radius=row['value'] / 5, # 원의 반지름
color='pink', # 원의 테두리 색상
fill=True, # 원을 채움
fill_opacity=1.0 # 원의 내부를 채울 때의 투명도
).add_to(my_map) # my_map에 원형 마커 추가
folium.Marker( # 값 표시 선언
location=[row['lat'], row['lon']], # 값 표시 위치-위도, 경도
icon=folium.DivIcon(html=f"<div>{row['name']} {row['value']}</div>"),
).add_to(my_map) # my_map에 값 추가
# 지도 그리기
st.components.v1.html(my_map._repr_html_(), width=800, height=600)