简介:这是一份面向Python初学者与个人理财爱好者的数据分析实战示例,围绕日常记账数据展开,帮助读者用代码梳理个人消费方向、识别支出结构,从而辅助财务决策。压缩包共3个文件,包含1个py源码脚本、1个xlsx记账数据表和1个txt使用说明,整体约20KB,体积轻巧,便于快速运行与二次修改。源码演示了如何借助Pandas完成数据清洗、分类汇总与聚合筛选,并用matplotlib、seaborn绘制柱状图、饼图与趋势线,直观呈现食品、交通、娱乐等类别的占比与时间变化;同时体现自动化思路,可批量读取表格、按规则归类消费记录并定期更新结果。目前已有191人学习下载,适合想练习数据分析与可视化、培养记账习惯的读者参考,也能为后续接入爬虫抓取电商或外卖订单数据打下基础。
1. 记账三年还在靠感觉?这份 Python 源码把消费方向拆成可读图表
每个月工资到账没几天就见了底,打开账单却只看到一堆零散数字,说不清钱到底流向了哪里——这是很多人做记账时的真实状态。这份「数据分析和图标-可视化分析日常记账数据总结个人消费方向-Python源码示例.zip」就是冲着这个场景来的:它用 Python 把一份日常记账流水读进来,做清洗、分类汇总,再输出消费方向的可视化图表,让你一眼看出钱花在哪些类目上。它适合正在学 Python 数据分析、想找一个完整可跑案例的入门者,也适合手头有记账 CSV 却不知道怎么下手的从业者。技术栈是 Python + pandas + matplotlib 这套最常见的组合,不需要数据库,不需要联网,本地跑通即可。下面我按「资源是什么 → 怎么用 → 坑在哪」的顺序,把这份源码拆开讲清楚。
2. 先看清这份源码的骨架:pandas 清洗加 matplotlib 出图
拿到一个 zip 源码包,我习惯先不急着跑,而是把目录结构和依赖摸清楚。这份示例的定位很明确:输入是记账流水,输出是消费方向图表,中间靠 pandas 做数据处理、matplotlib 做可视化。理解这条数据链路,后面改字段、换数据格式才不会翻车。
2.1 目录结构与数据流:从 CSV 到图表的四步链路
常见做法是,这类记账分析源码会包含一个数据文件、一个主分析脚本,可能再加一个绘图脚本或配置。整体数据流大致是四步:读取原始流水 → 清洗与字段规整 → 按消费类目聚合 → 绘图输出。下面是我按这个场景还原出的典型结构,你对照自己解压后的实际文件调整即可。
# 解压后先看目录,别急着运行 unzip "数据分析和图标-可视化分析日常记账数据总结个人消费方向-Python源码示例.zip" -d bookkeeping_demo cd bookkeeping_demo # 列出文件,确认数据文件和脚本位置 ls -R这段命令做两件事:解压到独立目录,避免污染当前工作区;用ls -R递归列出所有文件,确认数据文件(通常是.csv或.xlsx)和 Python 脚本的相对位置。参数上,-d指定解压目标目录,名字随意但要记住。跑之前先看清楚哪个是入口脚本,一般名字里带main、analysis或visual的就是。
数据流的关键在于字段。记账流水通常有日期、金额、类目、备注这几列,源码要能识别它们才能聚合。如果列名对不上,后面聚合就会报 KeyError,这是新手最容易卡住的地方。
2.2 环境准备:pandas 与 matplotlib 的安装与版本确认
这份源码依赖 pandas 和 matplotlib,中文图表还常需要中文字体配置。安装本身不复杂,但版本不匹配会出各种玄学问题,所以先确认环境。
# 建议用虚拟环境隔离,避免和系统包冲突 python -m venv venv # Linux/macOS 激活 source venv/bin/activate # Windows 激活(PowerShell) # .\venv\Scripts\Activate.ps1 # 安装核心依赖 pip install pandas matplotlib openpyxl # 确认版本,pandas 2.x 与 1.x 在部分 API 上有差异 python -c "import pandas, matplotlib; print(pandas.__version__, matplotlib.__version__)"这里openpyxl是为了读.xlsx文件,如果你的数据是 CSV 可以不装。虚拟环境的作用是把依赖锁在项目内,避免不同项目之间版本打架。最后一行打印版本,是为了心里有数:pandas 2.x 之后部分默认行为变了,比如append方法被移除,如果源码里用了老写法就会报错。遇到这类报错,先看版本,再决定是改代码还是降版本。
提示:如果绘图时中文显示成方框,是字体没配好,不是代码逻辑问题,后面避坑章节会专门讲。
2.3 核心脚本逐段拆解:读取、清洗、聚合、绘图
把入口脚本打开,按数据流四步逐段看。下面是我按这份源码场景还原的核心逻辑,字段名以你实际数据为准。
import pandas as pd import matplotlib.pyplot as plt # 1. 读取流水,注意编码,中文 CSV 常见 gbk 或 utf-8-sig df = pd.read_csv("records.csv", encoding="utf-8-sig") # 2. 清洗:统一日期格式,金额转数值,去掉无效行 df["日期"] = pd.to_datetime(df["日期"], errors="coerce") df["金额"] = pd.to_numeric(df["金额"], errors="coerce") df = df.dropna(subset=["日期", "金额", "类目"]) # 3. 按消费类目聚合,统计每个方向的总支出 summary = df.groupby("类目")["金额"].sum().sort_values(ascending=False) # 4. 绘图:横向条形图更适合类目名较长的场景 plt.rcParams["font.sans-serif"] = ["SimHei"] # 中文字体 plt.rcParams["axes.unicode_minus"] = False summary.plot(kind="barh") plt.xlabel("金额") plt.title("消费方向汇总") plt.tight_layout() plt.savefig("summary.png", dpi=150)逐段说明:第一步read_csv的encoding参数很关键,中文 CSV 用utf-8-sig能避免首列出现乱码字符;第二步errors="coerce"把无法解析的值变成 NaN,再用dropna清掉,保证后续聚合不报错;第三步groupby按类目求和并降序排列,sort_values让图表从大到小更直观;第四步设置中文字体后绘图,barh是横向条形图,类目名长时不会挤在一起,tight_layout防止标签被裁掉,savefig的dpi控制清晰度。
参数怎么改:想换成正向柱状图把barh改成bar;想按月份看趋势,把groupby("类目")换成按月份分组;想过滤掉小额支出,在聚合前加df = df[df["金额"] > 10]。这些改动都不影响主流程,是这份源码最实用的扩展点。
3. 把源码跑成自己的:换数据、调参数、出图
骨架看清之后,真正的落地是把它换成你自己的记账数据。这一步的难点不在代码,而在数据格式对齐和参数微调。下面按「准备数据 → 跑通 → 定制图表」推进。
3.1 准备一份能被识别的记账数据
源码能不能跑通,八成取决于你的数据长什么样。合格从业者一般会先把原始账单整理成规整的表格,列名和源码约定一致。下面是一份最小可用的示例数据。
日期,类目,金额,备注 2024-01-03,餐饮,38.5,午餐 2024-01-03,交通,6,地铁 2024-01-05,购物,299,日用品 2024-01-08,餐饮,52,聚餐 2024-01-12,娱乐,88,电影字段说明:日期用YYYY-MM-DD格式,pd.to_datetime能直接解析;类目是聚合的维度,尽量用固定几个词,别一会儿「吃饭」一会儿「餐饮」;金额是纯数字,不要带「元」字;备注可选,不影响分析。如果你的原始数据列名是英文或别的叫法,有两个办法:改 CSV 表头,或在读取后用df.rename(columns={...})映射。我一般选后者,不动原始文件,改代码更安全。
注意:金额列如果混入了收入(正负号不分),聚合出来的「消费方向」会失真。分析前先确认这份数据只含支出,或加一步筛选。
3.2 跑通主流程并核对中间结果
直接跑脚本之前,建议先分步验证,别一口气跑完只看最后那张图。中间结果对了,图基本不会错。
# 分步核对,避免一步到位后不知道哪里出错 print(df.head()) # 看前几行,确认列名和数据类型 print(df.dtypes) # 日期是否为 datetime,金额是否为 float print(df["类目"].value_counts()) # 看类目是否有拼写不一致 print(summary) # 看聚合结果是否符合预期head()确认读取没问题,dtypes确认日期和金额类型正确——如果金额是 object 类型,说明有非数字字符混进去了。value_counts()是排查类目脏数据的利器,如果出现「餐饮」和「餐饮 」这种带空格的重复项,就得先df["类目"] = df["类目"].str.strip()。summary打印出来和你的直觉对一下,比如餐饮是不是最大项,不对就回头查数据。
这一步看着笨,但能省下大量「图不对但不知道哪错」的时间。我见过太多人直接跑绘图,结果图是空的,回头查半天才发现是日期列没解析成功。
3.3 定制可视化:从默认条形图到可读的消费方向图
默认图能出,但往往不够看。这份源码的价值在于它给了你可改的绘图入口,稍微调几个参数,图的可读性就上一个台阶。
# 在默认基础上做三处增强 fig, ax = plt.subplots(figsize=(8, 5)) summary.plot(kind="barh", ax=ax, color="#4C72B0") ax.set_xlabel("支出金额(元)") ax.set_ylabel("消费类目") ax.set_title("个人消费方向分布") # 在每个条形末尾标注数值 for i, v in enumerate(summary.values): ax.text(v, i, f" {v:.0f}", va="center") plt.tight_layout() plt.savefig("summary_v2.png", dpi=150)三处增强:figsize控制画布大小,类目多时调高;color统一配色,比默认循环色更干净;ax.text在条形末尾标数值,省得读者对着坐标轴估。va="center"让文字垂直居中,f"{v:.0f}"保留整数。这些参数都不影响数据逻辑,纯展示层调整,改坏了也不影响分析结果。
如果你的数据跨度大,比如有一笔几千的大额和一堆几十的小额,条形图会被大额压扁。这时可以改用饼图看占比,或对金额取对数。常见做法是先看总额分布,再决定用哪种图,别默认一种图打天下。
4. 避坑与排查:中文乱码、日期解析、聚合失真的血泪经验
这份源码本身不复杂,但数据分析的坑往往藏在细节里。下面五条是我在实际跑这类记账分析时反复遇到的,按「现象 → 原因 → 解决」写清楚。
4.1 图表中文显示成方框
现象:图能出来,但标题和类目名全是方框或乱码。原因:matplotlib 默认字体不含中文,SimHei在部分系统上不存在。解决:先确认系统有哪些中文字体,再指定。Linux 上常用WenQuanYi Micro Hei,macOS 用Arial Unicode MS,Windows 用SimHei或Microsoft YaHei。设置plt.rcParams["font.sans-serif"]后,还要加plt.rcParams["axes.unicode_minus"] = False,否则负号也会出问题。
4.2 日期列解析后全是 NaT
现象:pd.to_datetime之后日期列全是 NaT,dropna把数据全删了,图是空的。原因:原始日期格式和默认解析不匹配,比如2024/1/3、20240103或带时间戳。解决:用format参数显式指定,如pd.to_datetime(df["日期"], format="%Y/%m/%d", errors="coerce")。不确定格式时,先print(df["日期"].head(20))肉眼看,别猜。
4.3 类目拼写不一致导致聚合碎片化
现象:聚合后类目特别多,每个金额都很小,看不出方向。原因:同一类消费写了不同名字,如「餐饮」「吃饭」「午餐」。解决:聚合前做一次映射,用df["类目"] = df["类目"].replace({"吃饭": "餐饮", "午餐": "餐饮"}),或先value_counts()找出所有变体再统一。这一步没有捷径,只能靠看数据。
4.4 金额列混入非数字字符
现象:to_numeric报错,或金额列是 object 类型,聚合结果异常。原因:金额里带了「元」「¥」或千分位逗号。解决:先清洗字符串,df["金额"] = df["金额"].astype(str).str.replace(r"[^\d.-]", "", regex=True),再转数值。errors="coerce"能把清不掉的值变 NaN,配合dropna兜底。
4.5 大额支出压扁图表可读性
现象:条形图里大部分类目几乎看不见,只有一两个特别长。原因:金额分布跨度大,线性坐标被极值主导。解决:要么改用饼图看占比,要么对金额取对数np.log1p(summary)后再画,要么直接过滤掉极端值单独说明。选哪种取决于你想表达什么,没有标准答案,但别硬画一张读不了的图。
5. 进阶玩法:把一次性脚本改成可复用的月度分析习惯
跑通一次不难,难的是让它变成你每个月都愿意用的东西。这份源码最大的价值不是那张图,而是它给了你一个可改的模板。我的习惯是把它改造成「丢一个 CSV 进去,自动出当月消费方向图」的小工具,省得每次手动改路径。
具体做法是加一层命令行参数,用argparse接收文件路径和输出目录。这样你每月导出账单后,一条命令就能出图,不用打开编辑器改代码。
import argparse parser = argparse.ArgumentParser(description="月度消费方向分析") parser.add_argument("--input", required=True, help="记账 CSV 路径") parser.add_argument("--output", default="summary.png", help="输出图片路径") args = parser.parse_args() df = pd.read_csv(args.input, encoding="utf-8-sig") # ... 清洗、聚合逻辑同上 ... plt.savefig(args.output, dpi=150) print(f"已输出:{args.output}")改造后,运行方式变成python analysis.py --input 2024-01.csv --output jan.png。参数--input必填,--output有默认值。这样脚本就从「一次性示例」变成了「可复用工具」,这是我认为这份源码最值得动手改的地方。
再进一步,可以按月份循环处理多个文件,把每个月的消费方向图拼成一张趋势对比。常见做法是用for遍历目录下的 CSV,聚合后把结果存进一个 DataFrame,最后画分组柱状图。这一步涉及多文件读取和结果合并,是练 pandas 的好场景。
验证方法上,我一般会拿两个月的真实数据跑一遍,对比总额是否和账单对得上。如果对不上,八成是某个月的数据有重复行或漏读。对得上,才说明清洗逻辑没问题。这个核对习惯比任何单元测试都直接。
提示:脚本里别硬编码文件路径,用参数传。硬编码的脚本换台机器就跑不了,这是最常见的「后悔药」场景。
从那以后我每次拿到这类分析源码,都强制先跑一遍中间结果核对,再动绘图参数——图好看是次要的,数据对才是底线。希望这份拆解能帮你把这份源码真正用起来,而不是解压完就躺在硬盘里。
本文还有配套的精品资源,点击获取