Gumball2k5 commited on
Commit
702fca1
·
verified ·
1 Parent(s): 4d5afb9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -138
app.py CHANGED
@@ -21,121 +21,9 @@ st.set_page_config(
21
  layout="wide"
22
  )
23
 
24
- # --- START OF NEW THEME SECTION ---
25
-
26
- def load_css():
27
- """Tải CSS tùy chỉnh để tạo giao diện 'thời tiết'."""
28
- st.markdown("""
29
- <style>
30
- /* ===== FONT CHUNG ===== */
31
- /* Sử dụng font hệ thống mượt mà hơn */
32
- .stApp, .stSidebar {
33
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
34
- }
35
-
36
- /* ===== NỀN CHÍNH (MAIN BACKGROUND) ===== */
37
- /* Tạo hiệu ứng gradient "bầu trời" */
38
- [data-testid="stAppViewContainer"] {
39
- background-image: linear-gradient(to bottom, #B0E0E6, #F0F8FF); /* Từ xanh nhạt (Powder Blue) đến trắng xanh (Alice Blue) */
40
- background-attachment: fixed;
41
- background-size: cover;
42
- }
43
-
44
- /* ===== THANH SIDEBAR ===== */
45
- /* Làm sidebar có nền mờ (frosty glass) */
46
- [data-testid="stSidebar"] {
47
- background-color: rgba(255, 255, 255, 0.7) !important;
48
- backdrop-filter: blur(10px);
49
- border-right: 1px solid rgba(255, 255, 255, 0.2);
50
- }
51
-
52
- /* Chữ trong sidebar */
53
- [data-testid="stSidebar"] .st-emotion-cache-16txtl3 {
54
- color: #0E2A47; /* Xanh đậm */
55
- }
56
-
57
- /* Nút radio được chọn trong sidebar */
58
- .stRadio label[data-baseweb="radio"] div[data-checked="true"] {
59
- background-color: #005aa7 !important; /* Xanh đậm khi được chọn */
60
- }
61
-
62
- /* ===== THẺ DỰ BÁO (METRIC CARDS) ===== */
63
- /* Đây là phần quan trọng nhất */
64
- div[data-testid="stMetric"] {
65
- background-color: rgba(255, 255, 255, 0.85); /* Nền trắng mờ */
66
- border: 1px solid rgba(255, 255, 255, 0.3);
67
- border-radius: 12px; /* Bo góc */
68
- padding: 20px;
69
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); /* Đổ bóng nhẹ */
70
- backdrop-filter: blur(5px);
71
- transition: transform 0.2s ease;
72
- }
73
- /* Hiệu ứng khi di chuột vào thẻ */
74
- div[data-testid="stMetric"]:hover {
75
- transform: translateY(-3px);
76
- box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1);
77
- }
78
-
79
- /* Tiêu đề của thẻ (Forecast for...) */
80
- div[data-testid="stMetricLabel"] p {
81
- font-size: 1.1rem !important;
82
- font-weight: 600 !important;
83
- color: #333333; /* Màu xám đậm */
84
- }
85
-
86
- /* Giá trị nhiệt độ dự báo */
87
- div[data-testid="stMetricValue"] {
88
- font-size: 2.8rem !important;
89
- font-weight: 700 !important;
90
- color: #004080; /* Màu xanh navy đậm */
91
- }
92
-
93
- /* Giá trị "Actual" (delta) */
94
- div[data-testid="stMetricDelta"] {
95
- font-size: 1rem !important;
96
- font-weight: 600 !important;
97
- color: #555555; /* Màu xám vừa */
98
- }
99
-
100
- /* ===== Tiêu đề (H1, H2, H3) ===== */
101
- h1 {
102
- color: #004080; /* Xanh navy đậm */
103
- text-shadow: 1px 1px 3px rgba(255,255,255,0.5);
104
- }
105
- h2, h3 {
106
- color: #005aa7; /* Xanh đậm */
107
- }
108
-
109
- /* ===== EXPANDERS (Training Set Overview) ===== */
110
- div[data-testid="stExpander"] {
111
- background-color: rgba(255, 255, 255, 0.8) !important;
112
- border-radius: 10px !important;
113
- border: 1px solid rgba(0, 0, 0, 0.1) !important;
114
- }
115
-
116
- /* ===== BIỂU ĐỒ (PLOTLY) ===== */
117
- /* Làm nền biểu đồ trong suốt để hòa vào nền gradient */
118
- .plotly-graph-div {
119
- border-radius: 8px;
120
- }
121
-
122
- /* Làm nền bảng (dataframe) đẹp hơn */
123
- .stDataFrame {
124
- border-radius: 8px;
125
- overflow: hidden;
126
- }
127
-
128
- </style>
129
- """, unsafe_allow_html=True)
130
-
131
- # Gọi hàm CSS ngay lập tức
132
- load_css()
133
-
134
- # --- END OF NEW THEME SECTION ---
135
-
136
-
137
  # --- 3. DATA & MODEL LOADING FUNCTIONS (WITH CACHING) ---
138
- # ... (Phần còn lại của code giữ nguyên) ...
 
139
  @st.cache_data
140
  def load_feature_data(file_path="data/final_dataset_tree.csv"):
141
  """Loads features and targets, converts index to datetime."""
@@ -174,8 +62,7 @@ def load_champion_models():
174
  "Ensure the 5 .pkl files are in the 'models/' directory.")
175
  return []
176
 
177
- @st.cache_data
178
- def load_performance_data(file_path="data/final_5_day_results_df.csv"):
179
  """Loads pre-calculated performance data for Tab 3."""
180
  try:
181
  df = pd.read_csv(file_path)
@@ -185,6 +72,7 @@ def load_performance_data(file_path="data/final_5_day_results_df.csv"):
185
  return pd.DataFrame()
186
 
187
  # --- 4. INITIALIZE DATA & SPLIT TEST SET ---
 
188
  # Load all data and models
189
  all_data_df = load_feature_data()
190
  models = load_champion_models()
@@ -192,7 +80,9 @@ perf_df = load_performance_data()
192
 
193
  # --- CRITICAL CUSTOMIZATION ---
194
  TARGET_COLS = ['temp_next_1_day', 'temp_next_2_day', 'temp_next_3_day', 'temp_next_4_day', 'temp_next_5_day']
195
- CURRENT_TEMP_COL = 'temp' # Split test set (based on checklist dates)
 
 
196
  TEST_START_DATE = "2024-02-18"
197
  TEST_END_DATE = "2025-09-26"
198
 
@@ -221,25 +111,8 @@ else:
221
  st.error("Could not load main data, application cannot continue.")
222
  st.stop()
223
 
224
- # --- 5. GIAO DIỆN SIDEBAR (THANH ĐIỀU HƯỚNG) ---
225
-
226
- st.sidebar.title("Forecast Input") # Đổi tiêu đề sidebar
227
- selected_date = None
228
-
229
- # Hiển thị date input cố định trên sidebar
230
- if not X_test.empty:
231
- min_date = X_test.index.min()
232
- max_date = X_test.index.max()
233
-
234
- selected_date = st.sidebar.date_input(
235
- "Select a date from the test set:",
236
- value=min_date,
237
- min_value=min_date,
238
- max_value=max_date,
239
- format="YYYY-MM-DD"
240
- )
241
- else:
242
- st.sidebar.error("Test data could not be loaded.")
243
 
244
  # --- 6. GIAO DIỆN CHÍNH (MAIN PANEL) ---
245
 
@@ -296,8 +169,29 @@ with tab1:
296
  with tab2:
297
  # --- MỤC 4 TRONG CHECKLIST ---
298
  st.title("Live 5-Day Forecast")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299
 
300
- # Biến 'selected_date' được lấy từ sidebar
 
 
301
  if selected_date and not X_test.empty and models:
302
  st.header(f"5-Day Forecast from: {selected_date.strftime('%Y-%m-%d')}")
303
 
@@ -423,7 +317,11 @@ with tab2:
423
  st.plotly_chart(fig_comp, use_container_width=True)
424
 
425
  else:
426
- st.warning("Please wait... Loading data or models.")
 
 
 
 
427
 
428
  # --------------------------------------------------------------------
429
 
 
21
  layout="wide"
22
  )
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  # --- 3. DATA & MODEL LOADING FUNCTIONS (WITH CACHING) ---
25
+ # Checklist Items 1 & 2: Cache all heavy operations
26
+
27
  @st.cache_data
28
  def load_feature_data(file_path="data/final_dataset_tree.csv"):
29
  """Loads features and targets, converts index to datetime."""
 
62
  "Ensure the 5 .pkl files are in the 'models/' directory.")
63
  return []
64
 
65
+ @st.cache_datadef load_performance_data(file_path="data/final_5_day_results_df.csv"):
 
66
  """Loads pre-calculated performance data for Tab 3."""
67
  try:
68
  df = pd.read_csv(file_path)
 
72
  return pd.DataFrame()
73
 
74
  # --- 4. INITIALIZE DATA & SPLIT TEST SET ---
75
+
76
  # Load all data and models
77
  all_data_df = load_feature_data()
78
  models = load_champion_models()
 
80
 
81
  # --- CRITICAL CUSTOMIZATION ---
82
  TARGET_COLS = ['temp_next_1_day', 'temp_next_2_day', 'temp_next_3_day', 'temp_next_4_day', 'temp_next_5_day']
83
+ CURRENT_TEMP_COL = 'temp'
84
+
85
+ # Split test set (based on checklist dates)
86
  TEST_START_DATE = "2024-02-18"
87
  TEST_END_DATE = "2025-09-26"
88
 
 
111
  st.error("Could not load main data, application cannot continue.")
112
  st.stop()
113
 
114
+ # --- 5. GIAO DIỆN SIDEBAR (ĐÃ XÓA) ---
115
+ # Toàn bộ phần sidebar đã bị xóa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
  # --- 6. GIAO DIỆN CHÍNH (MAIN PANEL) ---
118
 
 
169
  with tab2:
170
  # --- MỤC 4 TRONG CHECKLIST ---
171
  st.title("Live 5-Day Forecast")
172
+
173
+ # --- ĐÃ DI CHUYỂN LOGIC DATE INPUT VÀO ĐÂY ---
174
+ st.subheader("Forecast Input")
175
+ selected_date = None
176
+
177
+ if not X_test.empty:
178
+ min_date = X_test.index.min()
179
+ max_date = X_test.index.max()
180
+
181
+ selected_date = st.date_input( # Đã xóa st.sidebar.
182
+ "Select a date from the test set:",
183
+ value=min_date,
184
+ min_value=min_date,
185
+ max_value=max_date,
186
+ format="YYYY-MM-DD"
187
+ )
188
+ else:
189
+ st.error("Test data could not be loaded.") # Đã xóa st.sidebar.
190
+ # --- KẾT THÚC DI CHUYỂN ---
191
 
192
+ st.divider() # Thêm đường kẻ ngang
193
+
194
+ # Biến 'selected_date' GHI Giờ đã được định nghĩa ở trên
195
  if selected_date and not X_test.empty and models:
196
  st.header(f"5-Day Forecast from: {selected_date.strftime('%Y-%m-%d')}")
197
 
 
317
  st.plotly_chart(fig_comp, use_container_width=True)
318
 
319
  else:
320
+ # Điều chỉnh lại cảnh báo này
321
+ if not selected_date:
322
+ st.warning("Test data could not be loaded.")
323
+ else:
324
+ st.warning("Please wait... Loading data or models.")
325
 
326
  # --------------------------------------------------------------------
327