iT邦幫忙

2026 iThome 鐵人賽

DAY 17
0
ChatGPT & Codex

AI 時代的輕量化開發:ChatGPT 打造 LINE 多模態記帳與續訂預警 Agent系列 第 17

[Day 17] 消費分析再進化!SubWise 揪出最高單筆消費與支出重點

  • 分享至 

  • xImage
  •  

前言

前幾天已經讓 SubWise 能夠計算分類支出、找出最高支出類別,並比較本月與上月的變化。但目前的分析結果還缺少兩個很直覺的資訊:「我這段期間到底消費了幾次?」以及「哪一筆花得最多?」

單純知道「這個月花了 NT$930」,不如同時知道「這是 9 筆消費累積出來的」,也不如知道「其中最貴的一筆是 NT$150」——這些細節資訊,能讓使用者對自己的消費行為有更具體的畫面,而不只是一個抽象的總金額。因此今天的重點,是在 analysis_service.py 補上這兩項統計。


今日實作實錄

一、加入消費筆數統計

除了總支出之外,現在也會統計指定期間內一共有幾筆消費,讓分析結果變成:

💵 總支出:NT$930
🧾 消費筆數:9 筆
📊 平均每日:NT$52

這讓使用者可以同時掌握「花了多少」以及「花了幾次」,例如本週測試結果是「總支出 NT$320,共 3 筆,平均每日 NT$46」,今天則因為還沒有任何消費紀錄,顯示「總支出 NT$0,0 筆」。

二、建立「最高單筆消費」函式

新增 get_highest_expense(records),從指定期間的消費紀錄中找出金額最高的一筆。以目前測試資料為例,程式會從九筆消費裡找出金額最高的「NT$150|Food|Lunch」,最後在 LINE 顯示:

💳 最高單筆消費:
NT$150|Food|Lunch

這個功能看似簡單,但它和原本的「最高支出類別」其實是兩種不同的資訊:最高支出類別回答「我的錢主要花在哪裡?」(例如「Food:NT$830,89.2%」),最高單筆消費回答「哪一筆消費最貴?」(例如「NT$150|Food|Lunch」)。兩者結合後,分析就不再只是單純的加總,而是同時看得到「整體結構」跟「個別極端值」。

三、補強「沒有資料」情境的顯示格式

當使用者問「幫我分析今天的消費」而今天還沒有任何紀錄時,程式需要正常顯示,而不是因為找不到資料就出錯:

📊 SubWise 消費分析

📅 分析期間:today
💵 總支出:NT$0
🧾 消費筆數:0 筆
📊 平均每日:NT$0

🔥 最高支出類別:
目前沒有消費資料

💳 最高單筆消費:
目前沒有消費資料

📂 分類支出:
目前沒有消費資料

💡 目前沒有足夠的消費資料可以分析。

不只是讓「正常情況」可以運作,也要處理「沒有資料」的情況,這是今天開發中特別重要的一部分。

四、Analysis Service 的分層架構更加清楚

今天新增的兩個函式,同樣遵循既有的責任分工方式,各自只負責一件事,再由 get_expense_analysis() 統一串接:

get_expense_analysis()
├── filter_expenses()
├── calculate_expense_total()
├── calculate_category_totals()
├── calculate_category_percentages()
├── get_top_category()
├── calculate_daily_average()
├── get_highest_expense() ← 今天新增
└── compare_monthly_expenses()

format_analysis_result()

例如今天新增最高單筆消費時,沒有直接修改一大段既有程式,而是先建立 get_highest_expense(records) 讓它只負責一件事情,再把它加入 get_expense_analysis(),最後才交給 format_analysis_result() 負責顯示。這種做法讓未來如果要再加入其他分析指標(例如「平均單筆消費」),也可以用相同方式擴充。


測試結果

先確認語法:python -m py_compile analysis_service.py 沒有任何錯誤。接著分別測試三種期間的最高單筆消費:

  • 本月{'Date': '2026-08-08', 'Category': 'Food', 'Amount': 150, 'Note': 'Lunch'}
    https://ithelp.ithome.com.tw/upload/images/20260818/20178527t2h9YZsMCv.png

  • 本週{'Date': '2026-08-13', 'Category': 'Food', 'Amount': 120, 'Note': '午餐'}
    https://ithelp.ithome.com.tw/upload/images/20260818/20178527GZKmnb2RJ3.png

  • 今天(無資料):None
    https://ithelp.ithome.com.tw/upload/images/20260818/201785275RJ8l5yej6.png

三種情境都符合預期,代表新函式在有資料與無資料時都能正確運作。

最後透過 process_ai_message('幫我分析這個月的消費') 進行完整整合測試,確認「消費筆數」與「最高單筆消費」已經成功接進既有的 Gemini → 分析服務 → Google Sheets → LINE 完整流程,不是獨立存在的功能。


今日完成

  • 加入消費筆數統計(today / week / month 三種期間皆驗證通過)
  • 建立 get_highest_expense(),找出指定期間內金額最高的單筆消費
  • 補強無消費資料時的完整顯示格式
  • 完成本地測試與 LINE 整合測試

目前 SubWise 的消費分析已經涵蓋:

分析項目 功能
📅 分析期間 今天/本週/本月
💵 總支出 計算期間總消費
🧾 消費筆數 統計消費次數
📊 平均每日 計算每日平均支出
🔥 最高支出類別 找出花最多錢的類別
📂 分類支出 顯示各類別金額與比例
💳 最高單筆消費 找出期間內最昂貴的一筆
📊 月度比較 比較本月與上月
💡 智慧消費提醒 根據消費比例提供提醒
🛡️ 無資料處理 沒有消費時正常回覆

明日預告

目前 SubWise 已經能分析總支出、平均消費、最高單筆與分類支出,但還不知道「哪一天花最多」。明天 Day 18,我將新增最高單日消費,讓分析多一個時間維度:

  • 統計每日支出:將同一天的消費金額加總
  • 找出最高消費日:例如 08/11 一共支出 NT$410
  • 加入 LINE 分析結果:在原本的分析中新增「最高消費日」
  • 升級智慧提醒:除了指出主要消費類別,也能補充最高消費日,讓分析不只是數字,而是多一層消費洞察

讓 SubWise 的消費分析更完整,開始從「統計」走向「洞察」。我們明天見!


上一篇
[Day 16] 消費數據不再只是數字:SubWise 加入月度比較分析
下一篇
[Day 18] 消費資料也能做 Data Aggregation?SubWise 實作每日支出分析
系列文
AI 時代的輕量化開發:ChatGPT 打造 LINE 多模態記帳與續訂預警 Agent18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言