3주차 미션 - 스트림릿

  • 과제 그대로 복붙해서, 지피티에게 파이썬 코드를 짜달라고 했습니다.

  • 처음에 짜 준 코드에서는 st.session을 쓰고 있지 않은 것 같아서(코드를 읽을 수는 없지만, 눈을 씻고 찾아봐도 st.session이라는 단어가 안보였어요), 구체적으로 “st.session을 사용해서 코드를 짜줘”라고 다시 부탁했습니다.

  • 그랬더니 다음과 같은 코드를 짜주었습니다.

  • 이 코드를 다시 복사 붙여넣기 해서, 상세하게 주석을 달아달라고 했습니다. 그걸 통해 대강 코드의 구조를 이해했구요.

  • 그 다음에는 데이터를 저장만 하지 말고, 저장한 파일을 다운로드하는 기능까지 추가하고 싶어서, 지피티에게 그렇게 요청했습니다.

  • 처음에는 이 추가요청을 수행하면서, 색깔 그래프로 bmi 상태 나타내는 기능은 빼버렸더라구요. 그래서 그 기능도 빼지 말고 반영해서 최종 코드를 달라고 했습니다.


  • import streamlit as st
    import pandas as pd
    from io import StringIO
    
    
    # BMI를 계산하는 함수
    def calculate_bmi(weight, height):
        bmi = weight / (height ** 2)
        return bmi
    
    
    # BMI 범위에 따른 분류 및 색상 반환
    def get_bmi_category(bmi):
        if bmi < 18.5:
            return "저체중", "blue"
        elif 18.5 <= bmi < 25:
            return "정상", "green"
        elif 25 <= bmi < 30:
            return "과체중", "orange"
        else:
            return "비만", "red"
    
    
    # 사용자의 데이터를 문자열로 변환하는 함수
    def convert_data_to_csv(name, age, gender, bmi):
        # 사용자 데이터를 DataFrame으로 생성
        data = pd.DataFrame({
            "이름": [name],
            "나이": [age],
            "성별": [gender],
            "BMI": [f"{bmi:.2f}"]
        })
        # StringIO 객체를 사용하여 DataFrame을 CSV 형식의 문자열로 변환
        output = StringIO()
        data.to_csv(output, index=False)
        return output.getvalue()
    
    
    # Streamlit UI 구성
    st.title("BMI 계산기")
    
    name = st.text_input("이름")
    age = st.number_input("나이", min_value=0, max_value=120)
    gender = st.radio("성별", ["남성", "여성"])
    weight = st.number_input("몸무게(kg)")
    height = st.number_input("키(cm)")
    
    # BMI 계산 및 표시
    if st.button("BMI 계산"):
        height_m = height / 100  # 키를 미터 단위로 변환
        bmi = calculate_bmi(weight, height_m)  # BMI 계산
        category, color = get_bmi_category(bmi)  # 체중 상태 및 색상 결정
        st.write(f"{name}님의 BMI는 {bmi:.2f}입니다. 체중 상태: {category}.")  # 결과 표시
    
        # 프로그레스 바로 BMI 시각화
        progress_value = bmi / 40
        st.progress(progress_value)
        st.markdown(f'<style>.stProgress > div > div > div > div {{background-color: {color};}}</style>',
                    unsafe_allow_html=True)
    
        # 세션 상태에 데이터 저장
        st.session_state['bmi_data'] = convert_data_to_csv(name, age, gender, bmi)
    
    # 데이터 다운로드 버튼
    if 'bmi_data' in st.session_state:
        st.download_button(
            label="데이터 저장",
            data=st.session_state['bmi_data'],
            file_name="bmi_data.csv",
            mime="text/csv",
            help="계산된 BMI 데이터를 CSV 파일로 다운로드합니다."
        )


  • 이 코드를 넣고, 터미널에서 streamlit run [파이썬스크립트파일이름] 넣고 실행했더니, 다음과 같이 결과 잘 시행되었습니다!

  • [데이터 저장]을 눌렀더니 다음과 같이 파일이 잘 다운로드되었어요.


    • 스트림릿 과제 완료!

2
4개의 답글

👉 이 게시글도 읽어보세요