import os import streamlit as st import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import matplotlib.font_manager as fm from matplotlib import rc # 사이드바에 목차 추가 st.sidebar.title("목차") page = st.sidebar.radio("페이지 선택", ["연령대 및 성별에 따른 상위 5개 대출 도서", "연령대 및 성별에 따른 상위 3개 장르"]) def load_data(file_path): try: if os.path.isfile(file_path): df = pd.read_excel(file_path, sheet_name=None) return pd.concat(df.values()) else: st.error(f"파일을 찾을 수 없습니다: {file_path}") return pd.DataFrame() except Exception as e: st.error(f"데이터를 로드하는 동안 오류가 발생했습니다: {e}") return pd.DataFrame() if page == "연령대 및 성별에 따른 상위 5개 대출 도서": st.title("연령대 및 성별에 따른 상위 5개 대출 도서") # 데이터 로드 df = load_data('상위_5_도서.xlsx') if df.empty: st.stop() # 연령대 및 성별에 따른 도서 대출 건수 집계 book_patterns = df.groupby(['도서명', '연령', '성별'])['대출건수'].sum().reset_index() # 상위 5개 도서 추출 함수 def get_top_books(data, top_n=5): return data.groupby(['연령', '성별']) \ .apply(lambda x: x.nlargest(top_n, '대출건수')) \ .reset_index(drop=True) # 상위 5개의 도서 데이터 추출 top_books = get_top_books(book_patterns) # 연령대와 성별 선택 ages = top_books['연령'].unique() genders = top_books['성별'].unique() selected_age = st.selectbox("연령대 선택", options=ages) selected_gender = st.selectbox("성별 선택", options=genders) filtered_books = top_books[(top_books['연령'] == selected_age) & (top_books['성별'] == selected_gender)] # 막대 그래프 시각화 if not filtered_books.empty: font_path = 'NanumGothic-Regular.ttf' fontprop = fm.FontProperties(fname=font_path) plt.rc('font', family=fontprop.get_name()) plt.rcParams['font.family'] = fontprop.get_name() st.write(f"상위 5 도서 (연령대: {selected_age}, 성별: {selected_gender})") fig, ax = plt.subplots(figsize=(10, 6)) sns.barplot(data=filtered_books, x='도서명', y='대출건수', palette='viridis', ax=ax) ax.set_title(f'{selected_age} - {selected_gender}의 상위 5 도서', fontproperties=fontprop) ax.set_xlabel('도서명', fontproperties=fontprop) ax.set_ylabel('대출건수', fontproperties=fontprop) plt.xticks(rotation=45, ha='right', fontproperties=fontprop) st.pyplot(fig) else: st.write("선택한 조건에 맞는 데이터가 없습니다.") elif page == "연령대 및 성별에 따른 상위 3개 장르": st.title("연령대 및 성별에 따른 상위 3개 장르") # 데이터 로드 df = load_data('상위_3_장르.xlsx') if df.empty: st.stop() # 연령대 문자열 처리 df['연령대'] = df['연령대'].astype(str) # 연령대 및 성별 선택 ages = df['연령대'].unique() genders = df['성별'].unique() selected_age = st.selectbox("연령대 선택", options=ages) selected_gender = st.selectbox("성별 선택", options=genders) # 필터링된 데이터 추출 filtered_df = df[(df['연령대'] == selected_age) & (df['성별'] == selected_gender)] # 주제 분류명 목록 출력 genre_list = filtered_df['주제분류명'].unique() st.write(f"{selected_age} - {selected_gender}에 따른 주제 분류명:") st.write(genre_list) # 이미지 파일 경로 image_path = 'heat_map_page-0001.jpg' # 이미지 업로드 및 표시 if os.path.isfile(image_path): st.image(image_path, caption="히트맵", use_column_width=True) else: st.write("이미지 파일을 찾을 수 없습니다.")