Streamlit์ Python์ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๋์๋ณด๋๋ฅผ ๋ง๋ค ์ ์๋ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์. Streamlit์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ๊ณผํ์์ ์ ๋๋ฆฌ์คํธ๊ฐ ์ฝ๋ ๋ช ์ค๋ง์ผ๋ก ์๋ฆ๋ค์ด ๋ํํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ฐ์. ๋ค์์ Streamlit์ ์ฌ์ฉํ์ฌ ์น ๋์๋ณด๋๋ฅผ ๋ง๋๋ ๋ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ผ ํ ๋ด์ฉ๋ค์ ๋ํ ์ค๋ช ์ ๋๋ค.
Streamlit์ด ๋ฌด์์ด๊ณ ์ด๊ฑธ๋ก ๋ฌด์์ ํ ์ ์๋๊ณ ์? ๊ทธ๋ผ ์ด์ ํฌ์คํ ์ ์ฐธ๊ณ ํด ์ฃผ์ธ์-!
1. ์ค์น ๋ฐ ๊ธฐ๋ณธ ์ค์
Streamlit ์ค์น
๋จผ์ , Streamlit์ ์ค์นํด์ผ ํฉ๋๋ค. ์ค์น๋ pip์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ํ ์ ์์ต๋๋ค.
pip install streamlit
Streamlit ์ฑ ์คํ
Streamlit ์ ํ๋ฆฌ์ผ์ด์ ์ Python ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ์์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, app.py ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
import streamlit as st
st.title("My First Streamlit App")
st.write("Hello, world!")
์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ ์ ๋ ฅํฉ๋๋ค:
streamlit run app.py
์ด ๋ช ๋ น์ ์คํํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๋ก์ปฌ ์๋ฒ๋ก ์ฐ๊ฒฐ๋ Streamlit ์ฑ์ ์ด ์ ์์ต๋๋ค.
2. ์ฃผ์ ๊ตฌ์ฑ ์์
ํ ์คํธ ๋ฐ ๋ฐ์ดํฐ ํ์
Streamlit์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํ ์คํธ์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- st.write(): ํ ์คํธ, ๋ฐ์ดํฐํ๋ ์, ๋งํฌ๋ค์ด ๋ฑ์ ํ์ํ ์ ์๋ ๋ง๋ฅ ํจ์
- st.text(): ๊ฐ๋จํ ํ ์คํธ ํ์
- st.markdown(): ๋งํฌ๋ค์ด ํ์์ ํ ์คํธ ํ์
- st.code(): ์ฝ๋ ๋ธ๋ก ํ์
- st.latex(): LaTeX ์์ ํ์
st.write("Hello, world!")
st.text("This is a simple text.")
st.markdown("# This is a markdown header")
st.code("print('Hello, world!')", language='python')
st.latex(r"E=mc^2")
์์ ฏ
์ฌ์ฉ์ ์ํธ์์ฉ์ ์ํ ๋ค์ํ ์์ ฏ์ ์ ๊ณตํฉ๋๋ค.
- st.button() : ๋ฒํผ
- st.checkbox() : ์ฒดํฌ ๋ฐ์ค
- st.radio(): ๋ผ๋์ค ๋ฒํผ
- st.selectbox(): ์ ๋ ํธ ๋ฐ์ค
- st.multiselect(): ๋ฉํฐ ์ ๋ ํธ ๋ฐ์ค
- st.slider(): ์ฌ๋ผ์ด๋
- st.text_input(): ์ ๋ ฅ ์์
- st.file_uploader(): ํ์ผ ์ ๋ก๋
if st.button('Say hello'):
st.write('Hello!')
agree = st.checkbox('I agree')
if agree:
st.write('Great!')
option = st.selectbox('Choose an option', ['Option 1', 'Option 2', 'Option 3'])
st.write('You selected:', option)
๋ฐ์ดํฐ ํ์
Streamlit์ ๋ฐ์ดํฐํ๋ ์๊ณผ ์ฐจํธ๋ฅผ ์์ฝ๊ฒ ํ์ํ ์ ์์ต๋๋ค.
- st.dataframe(): ์ํธ์์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐํ๋ ์
- st.table(): ์ ์ ํ ์ด๋ธ
- st.line_chart(), st.bar_chart(), st.area_chart(): ์ฐจํธ ํ์
- st.map(): ์ง๋ ํ์
import pandas as pd
import numpy as np
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
st.dataframe(df)
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
st.line_chart(chart_data)
3. ๋ ์ด์์ ๊ด๋ฆฌ
์ฌ์ด๋๋ฐ
Streamlit์ ์ฌ์ด๋๋ฐ๋ฅผ ํตํด ์ถ๊ฐ์ ์ธ UI ์์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
st.sidebar.title("Sidebar Title")
sidebar_option = st.sidebar.selectbox('Choose an option', ['Option 1', 'Option 2', 'Option 3'])
st.sidebar.write('You selected:', sidebar_option)
์ปฌ๋ผ ๋ ์ด์์
์ปฌ๋ผ ๋ ์ด์์์ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ๋๋ ์ ์์ต๋๋ค.
col1, col2, col3 = st.columns(3)
col1.write("This is column 1")
col2.write("This is column 2")
col3.write("This is column 3")
ํญ
ํญ์ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ๋๋ ์ ์์ต๋๋ค.
tab1, tab2 = st.tabs(["Tab 1", "Tab 2"])
with tab1:
st.write("This is Tab 1")
with tab2:
st.write("This is Tab 2")
4. ํ์ผ ์ ๋ก๋ ๋ฐ ๋ค์ด๋ก๋
ํ์ผ ์ ๋ก๋
ํ์ผ ์ ๋ก๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ ๋ก๋ํ ์ ์์ต๋๋ค.
uploaded_file = st.file_uploader("Choose a file")
if uploaded_file is not None:
df = pd.read_csv(uploaded_file)
st.write(df)
ํ์ผ ๋ค์ด๋ก๋
ํ์ผ ๋ค์ด๋ก๋ ๋งํฌ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
import base64
def get_table_download_link(df):
csv = df.to_csv(index=False)
b64 = base64.b64encode(csv.encode()).decode() # some strings <-> bytes conversions necessary here
href = f'<a href="data:file/csv;base64,{b64}" download="myfilename.csv">Download csv file</a>'
return href
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
st.markdown(get_table_download_link(df), unsafe_allow_html=True)
๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ ์ดํดํ๊ณ ๋๋ฉด, Streamlit์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์น ๋์๋ณด๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค!
๊ณต์ ๋ฌธ์์ ๋ค์ํ ํํ ๋ฆฌ์ผ์ ์ฐธ๊ณ ํ๋ฉด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ผ๋ ์ฐธ๊ณ ํด ๋ณด์ธ์ ๐