一、前言
在第十七天的學習中,我已經為個人健康習慣追蹤系統加入資料修改與刪除的概念,讓使用者可以管理已經保存的健康紀錄。至此,系統已經逐步具備新增、查詢、修改與刪除四項基本資料管理功能。
然而,即使系統已經能夠保存大量健康紀錄,如果使用者每次都必須逐筆閱讀資料,才能了解自己的生活習慣,操作上仍然不夠方便。
因此,今天將開始建立「個人健康儀表板」,把原本分散在資料表中的資訊整理成簡單、清楚的摘要,讓使用者一開啟系統,就能快速查看目前的健康紀錄概況。
今天的學習重點是運用 Pandas 整理健康資料,再透過 Streamlit 的數值指標、文字摘要與資料表格,呈現喝水量、睡眠時間、運動時間及蔬菜水果攝取紀錄,讓系統從單純的資料管理工具,逐步發展成能協助使用者觀察生活習慣的應用程式。
二、什麼是健康儀表板?
儀表板(Dashboard)是一種將重要資訊集中呈現的介面,通常會將資料整理成數值、摘要、表格或圖表,讓使用者不必逐筆查看原始資料,就能快速掌握整體狀況。
在個人健康習慣追蹤系統中,儀表板可以呈現以下資訊:

需要注意的是,儀表板呈現的是使用者輸入的紀錄,不代表這些數值本身就能判斷健康狀況。系統的主要目的,是協助使用者整理與觀察自己的生活習慣。
三、讀取並整理健康資料
建立儀表板之前,首先需要取得先前保存的健康資料。
在前幾天的學習中,我已經使用 Pandas 讀取 CSV,因此今天可以繼續使用相同的方法。
import pandas as pd
from pathlib import Path
FILE_PATH = Path("health_records.csv")
if FILE_PATH.exists():
records = pd.read_csv(FILE_PATH)
else:
records = pd.DataFrame(
columns=[
"date",
"water_ml",
"sleep_hours",
"exercise_minutes",
"vegetables_fruits",
"notes"
]
)
print(records)
這段程式會先檢查 CSV 檔案是否存在。如果檔案存在,就讀取其中的資料;如果尚未建立檔案,則建立具有固定欄位的空資料表。
透過這個方法,即使使用者第一次開啟系統時還沒有任何紀錄,也能避免因為找不到檔案而直接中斷程式。
接著,為了讓資料能夠依照日期排序,可以將日期欄位轉換成日期型態。
if not records.empty:
records["date"] = pd.to_datetime(
records["date"],
errors="coerce"
)
records = records.dropna(subset=["date"])
records = records.sort_values(
by="date",
ascending=False
)
其中,ascending=False 表示由新到舊排序,讓最近的健康紀錄排在前面。
四、使用 Streamlit 顯示數值指標
Streamlit 提供 st.metric(),可以用來顯示重要的數值資訊,例如紀錄總筆數、最近一次喝水量及最近一次睡眠時間。
以下是一個簡單的儀表板範例:
import streamlit as st
import pandas as pd
from pathlib import Path
FILE_PATH = Path("health_records.csv")
st.title("個人健康習慣追蹤系統")
st.header("健康儀表板")
if FILE_PATH.exists():
records = pd.read_csv(FILE_PATH)
else:
records = pd.DataFrame()
if records.empty:
st.info("目前還沒有健康紀錄,請先新增資料。")
else:
records["date"] = pd.to_datetime(
records["date"],
errors="coerce"
)
records = records.dropna(subset=["date"])
records = records.sort_values(
by="date",
ascending=False
)
if records.empty:
st.warning("目前沒有有效的日期紀錄。")
else:
latest = records.iloc[0]
st.metric(
"健康紀錄總筆數",
len(records)
)
col1, col2, col3 = st.columns(3)
with col1:
st.metric(
"最近一次喝水量",
f"{latest['water_ml']} 毫升"
)
with col2:
st.metric(
"最近一次睡眠時間",
f"{latest['sleep_hours']} 小時"
)
with col3:
st.metric(
"最近一次運動時間",
f"{latest['exercise_minutes']} 分鐘"
)
st.subheader("最近的健康紀錄")
st.dataframe(
records,
use_container_width=True
)
將程式儲存為 app.py 後,在終端機執行:
python -m streamlit run app.py
如果使用 python3,也可以執行:
python3 -m streamlit run app.py
成功啟動後,網頁會顯示健康儀表板。
當 CSV 中存在資料時,系統會將最新日期的紀錄放在最前面,再顯示相關數值與歷史資料表。如果尚未新增資料,則會顯示提醒訊息。
這裡的「最近一次」是指 CSV 中日期最新的一筆紀錄,不一定代表使用者今天實際完成的紀錄。
五、使用欄位摘要了解健康習慣
除了顯示最新一筆紀錄,儀表板也可以提供簡單的文字摘要,讓使用者更容易閱讀資料。
例如,可以根據最近一次的紀錄,顯示是否有填寫蔬菜水果攝取情況。
vegetables_fruits = latest["vegetables_fruits"]
if pd.isna(vegetables_fruits):
st.info("最近一筆紀錄尚未填寫蔬菜水果攝取情況。")
elif str(vegetables_fruits).strip().lower() in [
"true", "1", "yes"
]:
st.success("最近一筆紀錄:有攝取蔬菜水果。")
elif str(vegetables_fruits).strip().lower() in [
"false", "0", "no"
]:
st.info("最近一筆紀錄:未勾選蔬菜水果攝取。")
else:
st.warning("蔬菜水果欄位的資料格式需要確認。")
這段程式會依照欄位中的值,顯示不同的訊息。
之所以需要檢查多種文字形式,是因為布林值在 CSV 中可能被讀取成不同的表示方式,例如 True、False、1 或 0。
此外,「未勾選」不一定代表使用者確定沒有攝取,也可能是沒有完成填寫。因此,若未來需要更精確地區分這兩種情況,可以在資料結構中加入「未填寫」的狀態。
六、讓儀表板更容易閱讀
儀表板的目的不只是顯示資料,更重要的是讓資訊容易理解。因此,介面設計也需要注意以下幾點。
例如,先顯示紀錄總筆數與最近一次的健康數據,再呈現完整的歷史紀錄表格。
這樣使用者開啟網頁時,就能先看到摘要,而不必立即閱讀所有資料。
喝水量應以毫升表示,睡眠時間以小時表示,運動時間則以分鐘表示。
保持單位一致,可以減少使用者誤讀數值的情況,也有助於後續統計。
當 CSV 不存在、資料表為空,或日期無法解析時,系統應顯示清楚的提示,而不是直接發生錯誤。
儀表板可以呈現使用者的紀錄,但不應只憑單次喝水量、睡眠時間或運動時間,就判定使用者是否健康。
目前的系統仍以個人習慣紀錄與資料觀察為主,未來可以再加入使用者自行設定的目標,協助追蹤習慣完成情況。
七、今日實作與測試
完成程式後,可以依照以下步驟進行測試:
使用第十五天的表單新增幾筆不同日期的健康紀錄。
確認 health_records.csv 中存在正確的資料。
啟動 Streamlit,查看健康儀表板是否能正常顯示。
確認紀錄總筆數是否與 CSV 的資料筆數一致。
比較日期排序結果,確認最近一筆紀錄是否正確。
修改 CSV 中的測試資料,再重新載入網頁,確認顯示結果是否更新。
暫時將 CSV 移至其他位置,測試系統在沒有資料時是否會顯示提醒。
恢復 CSV 後,再次確認資料能否正常顯示。
如果以上測試都能完成,就代表系統已經具備基本的健康儀表板功能。
八、今日成果與學習心得
透過今天的學習,我將先前累積的健康紀錄與資料管理功能進一步整合,使用 Pandas 整理資料,再透過 Streamlit 將重要數值與歷史紀錄集中呈現在同一個頁面。
今天學習了 st.metric()、st.columns() 與 st.dataframe() 等功能,也練習處理空資料、日期排序及不同資料型態的問題。
這代表健康習慣追蹤系統已經不只是輸入與保存資料的工具,而是開始具備簡單的資料呈現能力。使用者可以更快速地了解目前累積了多少紀錄,以及最近一次輸入的健康習慣內容。
不過,目前的儀表板主要顯示單筆最新紀錄與資料總數,還無法充分呈現一段時間內的習慣變化。因此,接下來需要進一步學習資料統計,讓健康數據能提供更多有用的資訊。
九、下一步學習方向
Day 19 將學習「睡眠與喝水量統計——計算平均值」。
接下來會利用 Pandas 的資料分析功能,計算一段時間內的平均睡眠時間與平均喝水量,並將結果顯示在健康儀表板中,讓使用者不只能查看最新紀錄,也能從多筆資料中觀察自己的生活習慣變化。