Python

[Python] Streamlit 소개 및 기초 사용법

dev-grace 2024. 11. 29. 17:26

1. Streamlit 소개

Streamlit은 파이썬을 활용하여 데이터 분석 도구와 웹 대시보드를 제작할 수 있는 라이브러리이다.

HTML/CSS와 같은 웹 개발 지식 없이도 간단한 파이썬 코드만으로 데이터 업로드, 처리, 결과 확인이 가능한 웹 페이지를 손쉽게 구현할 수 있다.

1-1. 주요 기능

  • 간단한 웹 애플리케이션 개발
  • 데이터 시각화 및 분석
  • 파일 업로드/다운로드 지원
  • 인터랙티브 위젯 제공
  • 실시간 데이터 처리

1-2. 설치 방법

  • pip를 통한 설치
pip install streamlit

 

 

2. Streamlit 기본 사용법

2-1. 애플리케이션 구조

  • 기본 레이아웃 설정
import streamlit as st

# 타이틀 설정
st.title("앱 제목")

# 헤더 설정
st.header("섹션 제목")

# 텍스트 출력
st.write("일반 텍스트")
  • 위젯 사용
# 파일 업로더
uploaded_file = st.file_uploader("파일 선택", type=["xlsx"])

# 선택 박스
option = st.selectbox("옵션 선택", ["옵션1", "옵션2"])

# 버튼
if st.button("실행"):
    st.write("버튼이 클릭되었습니다!")

 

2-2. 애플리케이션 실행 및 관리

2-2. 1) 실행 방법

  • 터미널에서 다음 명령어 실행:
streamlit run app_name.py

 

2-2. 2) 개발 모드

  • 코드 변경 시 자동 새로고침
  • 실시간 오류 확인 가능


3. 활용 예시

해당 예시는 다수의 엑셀 파일을 업로드하여 사업장별로 데이터를 처리한 결과를 새로운 엑셀 파일로 변환하여 다운로드가능한 템플릿 코드이다.

 

주요 기능

  • n개의 엑셀 파일 동시 업로드
  • 사업장별 데이터 가공 및 변환
  • 처리된 데이터 엑셀 다운로드
  • 실시간 처리 상태 표시
import streamlit_sample as st
import pandas as pd
from io import BytesIO


def process_data(files, location):
    pass


def main():
    st.title("엑셀 데이터 변환")

    # 파일 업로드 섹션
    st.header("1. 파일 업로드")
    files = []
    for i in range(4):
        file = st.file_uploader(f"엑셀 파일 {i+1} 선택", type=["xlsx", "xls"])
        files.append(file)

    # 사업장 선택
    st.header("2. 사업장 선택")
    location = st.selectbox("사업장을 선택하세요", ["본사", "안성", "대구"])

    # 변환 버튼
    if st.button("변환하기"):
        if all(files):  # 모든 파일이 업로드되었는지 확인
            try:
                # 이곳에 실제 데이터 변환 로직 구현
                # processed_df = process_data(files, location)
                processed_df = pd.DataFrame(
                    {
                        "금액": [100000, 200000, 300000],
                        "사업장": [location, location, location],
                    }
                )

                # 엑셀 파일을 메모리에 저장
                buffer = BytesIO()
                with pd.ExcelWriter(buffer, engine="openpyxl") as writer:
                    processed_df.to_excel(writer, index=False)

                buffer.seek(0)

                # 결과 다운로드 버튼
                st.success("변환이 완료되었습니다!")
                st.download_button(
                    label="변환된 파일 다운로드",
                    data=buffer,
                    file_name=f"변환결과({location}).xlsx",
                    mime="application/vnd.ms-excel",
                )

            except Exception as e:
                st.error(f"오류가 발생했습니다: {str(e)}")
        else:
            st.warning("모든 파일을 업로드해주세요.")


if __name__ == "__main__":
    main()

 

3-1. 파일 업로드 및 데이터 처리

  • 다중 엑셀 파일 업로드
files = []
for i in range(4):
    file = st.file_uploader(f"엑셀 파일 {i+1} 선택", type=["xlsx", "xls"])
    files.append(file)

 

3-2. 데이터 변환 및 다운로드

  • DataFrame 생성 및 처리
def process_data(files, location):
    pass

# processed_df = process_data(files, location)
processed_df = pd.DataFrame({
    "금액": [100000, 200000, 300000],
    "사업장": [location, location, location]
})
  • 엑셀 파일 생성
buffer = BytesIO()
with pd.ExcelWriter(buffer, engine="openpyxl") as writer:
    processed_df.to_excel(writer, index=False)

 

3-3. 사용자 피드백 제공

  • 성공/실패 메시지 표시
st.success("변환이 완료되었습니다!")
st.error("오류가 발생했습니다")
st.warning("모든 파일을 업로드해주세요")