๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/Python

[python] Streamlit ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ตํžˆ๊ธฐ ! | ํ…์ŠคํŠธ & ๋ฐ์ดํ„ฐ ํ‘œ์‹œ | ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ | ํŒŒ์ผ ์—…๋กœ๋“œ & ๋‹ค์šด๋กœ๋“œ

by ๋ญ…์ฆค 2024. 7. 14.
๋ฐ˜์‘ํ˜•

Streamlit์€ Python์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์š”. Streamlit์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๊ณผํ•™์ž์™€ ์• ๋„๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ ๋ช‡ ์ค„๋งŒ์œผ๋กœ ์•„๋ฆ„๋‹ค์šด ๋Œ€ํ™”ํ˜• ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ๋‹ค์Œ์€ Streamlit์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•  ๋‚ด์šฉ๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

 

Streamlit์ด ๋ฌด์—‡์ด๊ณ  ์ด๊ฑธ๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋ƒ๊ณ ์š”? ๊ทธ๋Ÿผ ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”-!

 

[python] Streamlit ์œผ๋กœ ๋ฐ์ดํ„ฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ! | ๊ฐ„๋‹จํ•œ ๋Œ€์‹œ๋ณด๋“œ & ์›น๋ฐ๋ชจ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ

๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ผ์ด ๋งŽ์œผ์‹ ๊ฐ€์š”? Streamlit์„ ์ด์šฉํ•ด ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋‚˜๋งŒ์˜ ๋ฐ์ดํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”! ๐Ÿ˜Ž  Streamlit์€ Python์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋งŒ์œผ๋กœ๋„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜

mvje.tistory.com


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์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์›น ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๊ณต์‹ ๋ฌธ์„œ์™€ ๋‹ค์–‘ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด ๋ณด์„ธ์š” ๐Ÿ‘

๋ฐ˜์‘ํ˜•