fullfish 2025. 10. 29. 17:10

Python 코드만으로 대시보드나 웹앱을 간단하게 제작 있는 프레임워크

 

import streamlit as st
st.title("Streamlit 입문")
st.header("Streamlit의 기본 구조")
st.write("Streamlit은 스크립트 전체 재실행 기반의 웹앱 프레임워크 입니다.")

스크립트 구조: 위에서 아래로 한 번 실행
사용자 이벤트 발생 시: 전체 스크립트 재실행
웹서버 실행
 ▪ streamlit run app.py

st.title()                페이지 제목  
st.header() / st.subheader()   섹션 제목  
st.write()                텍스트, 수치, 데이터, Markdown 자동 인식  
st.markdown()             Markdown 직접 렌더링  
st.code()                 코드 블록 표시  
st.caption()              설명 문구 (작은 글씨)  
st.latex()                수식 출력

st.line_chart(df) 선형 그래프
st.bar_chart(df) 막대 그래프
st.area_chart(df) 영역 그래프

 

 

 

import streamlit as st
import pandas as pd
st.title("Streamlit 기본 출력 예제")
st.header("텍스트 출력")
st.write("`st.write()`는 다양한 자료형을 자동으로 인식합니다.")
st.text("이건 단순 텍스트")
st.subheader("Markdown 예시")
st.markdown("""
- **굵게**
- _기울임_
- [공식문서](https://docs.streamlit.io)
""")

import streamlit as st
import pandas as pd

st.header("데이터 출력")
df = pd.DataFrame({"이름": ["철수", "영희", "민수"], "점수": [80, 95, 88]})
st.dataframe(df)
st.table(df)
st.caption("출처: 예시 데이터셋")
import streamlit as st
import pandas as pd

st.title("기본 시각화 함수")
month = ["3월", "4월", "5월", "6월"]
df = pd.DataFrame({"영어": [80, 90, 100, 95], "수학": [60, 70, 85, 100]}, index=month)
st.line_chart(df)
st.bar_chart(df)
st.area_chart(df)

import streamlit as st
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

st.title("Matplotlib & Seaborn 예제")
df = sns.load_dataset("tips")
fig, ax = plt.subplots()
sns.scatterplot(x="total_bill", y="tip", hue="sex", data=df, ax=ax)
st.pyplot(fig)
import streamlit as st
import pandas as pd
import numpy as np

st.title("지도 시각화 예제")
df = pd.DataFrame(
    {
        "lat": np.random.uniform(37.4, 37.6, 100),
        "lon": np.random.uniform(126.8, 127.1, 100),
    }
)
st.map(df)

 

입력 위젯

st.button("버튼")  bool  클릭 시 True
st.checkbox("체크")  bool  체크 여부
st.radio()  str  단일 선택
st.selectbox()  str  드롭다운 선택
st.slider()  int/float  값 선택
st.text_input()  str  텍스트 입력
st.number_input()  int/float  수치 입력
st.file_uploader()  BytesIO  파일 업로드

 

import streamlit as st
st.title(" 입력 위젯 예제")
name = st.text_input("이름을 입력하세요")
age = st.number_input("나이 입력", min_value=1, 
max_value=100)
color = st.color_picker("좋아하는 색상 선택")
agree = st.checkbox("개인정보 제공에 동의합니다")
if st.button("제출"):
    if agree:
        st.success(f"{name}님({age}세)의 좋아하는 색상은 {color}입니
다.")
    else:
        st.warning("동의하지 않으면 제출할 수 없습니다.")
import streamlit as st

st.title("Form 활용 예제")
with st.form("survey_form"):
    name = st.text_input("이름")
    gender = st.radio("성별", ["남성", "여성"])
    score = st.slider("만족도", 0, 10, 5)
    submitted = st.form_submit_button("제출")
if submitted:
    st.success(f"{name}({gender})님의 만족도: {score}/10")

 

import streamlit as st

st.sidebar.title("설정 메뉴")
option = st.sidebar.selectbox("과목 선택", ["영어", "수학", "과학"])
level = st.sidebar.slider("난이도", 1, 10, 5)
st.title("사이드바 실습")
st.write(f"선택한 과목: {option}")
st.write(f"난이도: {level}")
st.title(" Layout 예제")
col1, col2 = st.columns(2)
with col1:
    st.subheader("왼쪽")
    st.write("왼쪽 컬럼 내용")
with col2:
    st.subheader("오른쪽")
    st.write("오른쪽 컬럼 내용")
tab1, tab2 = st.tabs(["차트", "표"])
with tab1:
    st.line_chart({"A": [1,2,3], "B": [3,2,1]})
with tab2:
    st.table({"이름": ["철수", "영희"], "점수": [80, 90]})

 

csv파일 보는 예제

# 더미 csv 파일 생성
from altair.utils.core import P
import pandas as pd
import numpy as np

name = [
    "홍창기",
    "신민재",
    "오스틴",
    "김현수",
    "문보경",
    "오지환",
    "박동원",
    "박해민",
    "구본혁",
]
subjects = ["C++", "Java", "Python", "JavaScript"]

scores = [np.random.randint(90, 100, 4).tolist() for _ in range(len(name))]
print(scores)

df = pd.DataFrame(scores, columns=subjects)
# df=['stu_nmae']=name
print(df)

df.insert(0, "stu_name", name)
print(df)

df.to_csv("score.csv", index=False)


'''
stu_name,C++,Java,Python,JavaScript
홍창기,90,97,98,94
신민재,97,99,92,90
오스틴,93,95,93,98
김현수,94,90,96,98
문보경,95,97,93,95
오지환,91,97,95,90
박동원,97,98,96,99
박해민,90,93,96,93
구본혁,90,90,95,98
'''
import streamlit as st
import pandas as pd

st.title("학생 점수 분석 대시보드")
uploaded = st.file_uploader("CSV 파일 업로드", type=["csv"])
if uploaded:
    df = pd.read_csv(uploaded)
    st.subheader(" 데이터 미리보기")
    st.dataframe(df.head())

    subjects = df.columns[1:]
    subject = st.selectbox("과목 선택", subjects)
    st.line_chart(df[subject])
    min_score = st.slider("최소 점수", 0, 100, 50)
    filtered = df[df[subject] >= min_score]
    st.write(f"{subject} {min_score}점 이상 학생:")
    st.table(filtered)

    with st.form("feedback_form"):
        name = st.text_input("이름")
        feedback = st.text_area("피드백")
        submit = st.form_submit_button("저장")
        if submit:
            st.success(f"{name}님의 피드백이 저장되었습니다.")
else:
    st.info("CSV 파일을 업로드해주세요 (예: name, english, math, science)")