File size: 4,027 Bytes
01700f5 79f138c 3017b0b 79f138c 01700f5 79f138c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | import streamlit as st
import pandas as pd
import altair as alt
# ===============================
# 1️⃣ 데이터 불러오기
# ===============================
past_path = '/app/src/2018-2024.xlsx'
future_path = '/app/src/예상수요량_2025예측.xlsx'
past_df = pd.read_excel(past_path)
future_df = pd.read_excel(future_path)
past_df['월'] = past_df['월'].astype(int)
future_df['월'] = future_df['월'].astype(int)
past_df = past_df.rename(columns={'판매량(kg)': 'y'})
future_df = future_df.rename(columns={'예상수요량': 'y'})
past_df['y'] = past_df['y'].astype(int)
future_df['y'] = future_df['y'].round().astype(int)
# ===============================
# 2️⃣ 페이지 설정 & 스타일
# ===============================
st.set_page_config(page_title="과일 수요량 대시보드", layout="wide")
st.markdown("""
<style>
/* 타이틀을 더 아래로 내려서 헤더와 겹치지 않게 */
.main > div:first-child {
padding-top: 50px !important;
}
.title {
font-size: 30px;
font-weight: 700;
margin-top: 25px;
margin-bottom: 20px;
}
</style>
""", unsafe_allow_html=True)
# 페이지 타이틀
st.markdown("<div class='title'>🍎 과일 수요량 대시보드 (과거 + 2025 예측)</div>", unsafe_allow_html=True)
# ===============================
# 3️⃣ 데이터 선택
# ===============================
data_type = st.sidebar.radio("📂 사용할 데이터", ["과거 데이터", "2025년 예측 데이터"])
selected_df = past_df if data_type == "과거 데이터" else future_df
# ===============================
# 4️⃣ 년도 선택 (2025년 예측은 숨김)
# ===============================
if data_type == "과거 데이터":
available_years = sorted(selected_df['년도'].unique())
selected_years = st.multiselect(
"📅 조회할 년도",
available_years,
default=[] # 기본 선택 없음
)
df_filtered = selected_df[selected_df['년도'].isin(selected_years)]
else:
df_filtered = selected_df.copy() # 2025년만 존재 → 자동 고정
# ===============================
# 5️⃣ 과일 선택 (기본 선택 없음)
# ===============================
fruits = sorted(df_filtered['과일종류'].unique())
selected_fruits = st.multiselect(
"🍊 표시할 과일 선택",
fruits,
default=[] # 기본 선택 없음
)
df_chart = df_filtered[df_filtered['과일종류'].isin(selected_fruits)]
# ===============================
# 6️⃣ 그래프 영역
# ===============================
st.subheader("📈 월별 수요량 그래프")
if len(df_chart) > 0:
if data_type == "과거 데이터":
years = sorted(df_chart['년도'].unique())
else:
years = [2025]
for y in years:
st.markdown(f"### 📌 {y}년")
df_year = df_chart[df_chart['년도'] == y]
chart = (
alt.Chart(df_year)
.mark_line(point=True)
.encode(
x=alt.X('월:O', title='월', axis=alt.Axis(labelAngle=0)),
y=alt.Y('y:Q', title='수요량'),
color='과일종류:N',
tooltip=['년도', '과일종류', '월', 'y']
)
.properties(height=350)
)
st.altair_chart(chart, use_container_width=True)
else:
st.info("그래프에 표시할 과일을 선택하세요.")
# ===============================
# 7️⃣ 테이블 영역
# ===============================
st.subheader("📊 상세 데이터")
selected_fruits_table = st.multiselect(
"📋 테이블 표시 과일",
fruits,
default=[]
)
df_table = df_filtered[df_filtered['과일종류'].isin(selected_fruits_table)]
if len(df_table) > 0:
df_show = df_table[['년도', '월', '과일종류', 'y']].rename(columns={'y': '수요량'})
st.dataframe(df_show, use_container_width=True)
else:
st.info("테이블에 표시할 과일을 선택하세요.")
|