家庭收支分析报告 (ym-household-budget)
省去了记账数据导出后不知道怎么分析、分类全靠手动、看不出异常支出的低效。
何时使用
- 用户提到「帮我分析下这个月开销」时
- 用户提到「这个月钱花哪了」时
- 用户提到「家庭支出分析」时
- 用户提到「记账数据分析」时
- 用户提到「帮我看看花了多少钱」时
- 用户提到「收支分析报告」时
- 用户提到「记账app导出的数据」时
- 用户提到「怎么省钱」时
- 用户提到「这个月花太多了正常吗」时
- 用户提到「帮我整理下记账数据」时
- 用户提到「月度开销报告」时
- 用户提到「expense analysis」时
- 用户提到「household budget」时
版本自检(每次动手前先跑)
python scripts/sync.py --json
只读比对线上版本:退出码 0 最新 · 10 有新版建议重装 · 20 主版本不同必须重装 · 30 联网失败按旧版继续。
本技能不自动更新自己 —— 换版本只有一条路:用户明确重装(skillhub install ym-household-budget)。
运行前提
- 依赖:
pandas、matplotlib、jieba;首次使用先跑python scripts/setup.py安装依赖。 - 字体回退顺序:
generate_report.py中 matplotlib 字体回退链为['Microsoft YaHei', 'SimHei', 'Arial Unicode MS', 'PingFang SC', 'WenQuanYi Micro Hei', 'Noto Sans CJK SC', 'DejaVu Sans']。字体缺失时中文渲染为方框(□),不影响数据计算和HTML报告生成,仅影响图表中文标签显示。乱码排查参考references/common-pitfalls.md。 - 配置:运行时配置放
~/.workbuddy/ym-household-budget_config.json,对外只留config/settings.example.json空模板。
适用范围与边界
适用:家庭收支数据的解析、自动分类、月度趋势分析、异常支出识别和可视化HTML报告生成。支持多种记账APP导出格式和文本粘贴。
不适用:
- 企业财务分析(不做损益表、资产负债表、现金流表)
- 投资收益合并计算(不做基金/股票/理财收益的盈亏合并)
- 多币种换算(不做汇率转换,不同币种数据需用户预先换算)
- 税务申报(不做个税计算、专项扣除、年度汇算)
输入数据格式
支持的数据源
| 数据源 | 格式 | 识别方式 | |--------|------|----------| | CSV文件 | .csv | 文件扩展名 + 首行表头 | | 文本粘贴(表格) | 制表符/逗号分隔文本 | 含分隔符的多行文本 | | 文本粘贴(流水账) | 自然语言描述 | 无明显分隔结构、含日期+金额+描述 | | 随手记导出 | CSV | 表头含「交易时间」「分类」「金额」等 | | 鲨鱼记账导出 | CSV | 表头含「日期」「类型」「金额」「备注」 | | 支付宝账单 | CSV | 表头含「交易时间」「交易对方」「金额」等,前几行有说明文本 | | 微信账单 | CSV | 表头含「交易时间」「交易类型」「交易对方」等 |
字段最低要求
必须包含以下字段中的至少一种组合:
- 日期 + 金额 + 备注(或交易对方)
- 日期 + 金额 + 分类(若APP已分类)
缺少日期或金额时,提示用户补充;仅有金额无日期时,按当月1日填充并标注「日期缺失」。
格式自动识别与字段归一化
- 自动识别:读取数据前20行,匹配已知APP的表头特征,确定数据源类型。
- 字段归一化:将各APP的不同字段名映射到标准字段(
date、amount、description、counterparty、type)。映射规则参考references/field-mapping.md。 - 流水账解析模式:自然语言流水账(如「3月5日 买菜 35元」)使用jieba分词提取日期、金额和描述关键词,再走分类流程。
分类体系
一级分类
| 分类 | 说明 | |------|------| | 餐饮 | 外卖、餐厅、买菜、零食、饮品 | | 交通 | 打车、公交、地铁、停车、加油 | | 购物 | 电商、日用品、服装、数码 | | 教育 | 学费、培训、书籍、文具 | | 医疗 | 门诊、药品、体检 | | 娱乐 | 电影、游戏、旅游、健身 | | 住房 | 房租、物业、水电燃气、宽带 | | 人情 | 礼金、红包、请客 | | 其他 | 无法归入以上类别 |
二级分类示例
| 一级 | 二级示例 | |------|----------| | 餐饮 | 外卖、堂食、买菜、零食饮品 | | 交通 | 打车、公共交通、停车过路、加油充电 | | 购物 | 日用百货、服装鞋帽、数码电子、美妆个护 | | 教育 | 学费培训、书籍文具、兴趣班 | | 医疗 | 门诊挂号、药品、体检保健 | | 娱乐 | 影音游戏、旅游出行、运动健身 | | 住房 | 房租房贷、水电燃气、物业宽带 | | 人情 | 礼金红包、请客聚餐 |
分类优先级链
按以下优先级依次匹配,命中即定分类,不再继续:
- 备注关键词匹配(最高优先级)— 备注中含「美团」「饿了么」→ 餐饮
- 交易对方商家名匹配 — 交易对方含「滴滴」「高德」→ 交通
- 金额特征推断(最低优先级)— 无备注和交易对方时,按金额区间粗分
详细关键词映射表和规则参考 references/classification-rules.md。
分析维度
1. 月度总览
| 指标 | 计算方式 | |------|----------| | 总支出 | 当月所有支出金额之和 | | 总收入 | 当月所有收入金额之和 | | 结余率 | (总收入 - 总支出) / 总收入 x 100% | | 日均支出 | 总支出 / 当月天数 |
2. 分类占比分析
- 各一级分类金额占总支出的百分比
- 生成饼图(matplotlib pie chart)
- 标注占比最高的3个分类
3. 趋势分析
- 多月份总支出对比柱状图
- 环比折线图(本月 vs 上月 vs 上上月)
- 各分类环比变化(标注增减幅度最大的分类)
4. 异常支出识别
| 异常类型 | 判定规则 | 标注级别 | |----------|----------|----------| | 单笔大额 | 单笔金额 > 月均支出 x 3 | 高亮 | | 类别突增 | 某分类环比增幅 > 50% | 高亮 | | 非日常消费 | 分类为「人情」「娱乐」且单笔 > 月均 x 2 | 标注 |
节省机会推荐
基于分析结果生成针对性建议:
- 基于分类占比:占比最高的分类给出可缩减的具体建议(如餐饮占比40%→建议每周减少2次外卖)。
- 基于异常支出:标注异常支出并提示「这笔支出是否符合预期?若为偶发可忽略」。
- 基于趋势:若某分类连续多月上升,给出预算目标建议(如「购物连续3月上升,建议下月设上限800元」)。
报告生成
HTML报告结构
使用 templates/report-template.html 模板,包含以下区块:
- 概览卡片区:总支出/总收入/结余率/日均支出(4个数字卡片)
- 分类占比饼图区:matplotlib生成的饼图嵌入为Base64图片
- 月度趋势折线图区:matplotlib生成的折线图嵌入为Base64图片
- 异常支出高亮表格:日期/金额/类别/备注/异常原因
- 预算建议区:针对性节省建议列表
matplotlib中文字体设置
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'Arial Unicode MS']
matplotlib.rcParams['axes.unicode_minus'] = False
执行步骤
当用户需要分析家庭收支数据时,按以下步骤执行:
- 接收数据 — 获取用户提供的数据(文件路径、粘贴文本或APP导出文件);确认数据存在且非空。
- 格式识别与字段归一化 — 读取数据前20行匹配已知APP表头特征,确定数据源类型;参考
references/field-mapping.md将字段名映射到标准字段(date/amount/description/counterparty/type);流水账文本走jieba分词解析模式。执行python scripts/parse_data.py {input},产出归一化CSV到工作目录。若识别失败,提示用户补充表头信息。 - 执行分类 — 对归一化数据执行
python scripts/classify_expenses.py {normalized_csv},按分类优先级链(备注关键词 > 交易对方匹配 > 金额推断)逐条分类;产出带分类标签的CSV。参考references/classification-rules.md。 - 生成报告 — 执行
python scripts/generate_report.py {classified_csv},计算月度总览指标、分类占比、趋势分析和异常支出识别;matplotlib生成饼图和折线图嵌入HTML;使用templates/report-template.html渲染最终报告。产出report_{YYYYMM}.html到工作目录。 - 校验报告 — 打开生成的HTML确认:概览数字合理(总支出 = 各分类之和);饼图无乱码;异常支出表非空(若空则说明无异常,正常);预算建议区有内容。校验失败参考
references/common-pitfalls.md。 - 交付报告 — 将
report_{YYYYMM}.html文件路径告知用户,用file_export声明产物。
目录说明
scripts/— 执行逻辑parse_data.py— 数据解析与字段归一化classify_expenses.py— 自动分类generate_report.py— HTML报告生成sync.py— 版本自检(只读)setup.py— 依赖安装
templates/— HTML报告模板(report-template.html)references/— 分类规则、字段映射、常见坑参考文档
参考资料
references/classification-rules.md— 分类规则和关键词映射表references/field-mapping.md— 各记账APP导出格式字段映射表references/common-pitfalls.md— 常见坑和解决方案
常见坑
-
matplotlib中文乱码 — 现象:生成的饼图和折线图中文字符显示为方框。原因:系统未安装matplotlib默认中文字体,或字体名与系统注册名不一致。规避:在
generate_report.py中设置字体回退链['Microsoft YaHei', 'SimHei', 'Arial Unicode MS'];检查系统字体目录下是否存在中文字体;仍乱码时参考references/common-pitfalls.md手动指定字体路径。 # skill-audit: ignore -
字段KeyError — 现象:
parse_data.py报错KeyError: 'date'或类似字段名错误。原因:不同记账APP导出的字段名不一致(如随手记用「交易时间」、鲨鱼记账用「日期」),字段映射表未覆盖该APP格式。规避:参考references/field-mapping.md检查该APP的字段映射;若为新APP格式,将导出文件的表头前5行与映射表对比,补充缺失映射后再执行。 -
分类全落「其他」 — 现象:报告显示80%以上支出归入「其他」分类,饼图无法反映真实消费结构。原因:备注字段为空或只含交易流水号(如「202403051234」),交易对方也未匹配到已知商家名。规避:在
classify_expenses.py中增加金额特征推断规则(如金额<50元优先归入餐饮/交通);提示用户在记账APP中补充备注信息后再导出;对支付宝/微信账单优先使用交易对方字段做分类。 -
流水账文本无法解析 — 现象:用户粘贴的自然语言流水账(如「3月5号买菜35,打车12块」)解析后字段缺失或金额提取错误。原因:自然语言表述方式多样,jieba分词未能正确识别日期、金额和描述的边界。规避:提示用户按「日期 金额 备注」或「日期 类别 金额」格式分行书写(如「3月5日 35 买菜」每行一条);金额后加「元」字提高识别率;解析失败时改用表格格式重新粘贴。
Scan to join WeChat group