Python记账数据分析源码:pandas清洗与matplotlib可视化消费方向

发布时间:2026/10/11 19:03:31

Python记账数据分析源码:pandas清洗与matplotlib可视化消费方向 简介这是一份面向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, encodingutf-8-sig) # 2. 清洗统一日期格式金额转数值去掉无效行 df[日期] pd.to_datetime(df[日期], errorscoerce) df[金额] pd.to_numeric(df[金额], errorscoerce) df df.dropna(subset[日期, 金额, 类目]) # 3. 按消费类目聚合统计每个方向的总支出 summary df.groupby(类目)[金额].sum().sort_values(ascendingFalse) # 4. 绘图横向条形图更适合类目名较长的场景 plt.rcParams[font.sans-serif] [SimHei] # 中文字体 plt.rcParams[axes.unicode_minus] False summary.plot(kindbarh) plt.xlabel(金额) plt.title(消费方向汇总) plt.tight_layout() plt.savefig(summary.png, dpi150)逐段说明第一步read_csv的encoding参数很关键中文 CSV 用utf-8-sig能避免首列出现乱码字符第二步errorscoerce把无法解析的值变成 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(kindbarh, axax, 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}, vacenter) plt.tight_layout() plt.savefig(summary_v2.png, dpi150)三处增强figsize控制画布大小类目多时调高color统一配色比默认循环色更干净ax.text在条形末尾标数值省得读者对着坐标轴估。vacenter让文字垂直居中f{v:.0f}保留整数。这些参数都不影响数据逻辑纯展示层调整改坏了也不影响分析结果。如果你的数据跨度大比如有一笔几千的大额和一堆几十的小额条形图会被大额压扁。这时可以改用饼图看占比或对金额取对数。常见做法是先看总额分布再决定用哪种图别默认一种图打天下。4. 避坑与排查中文乱码、日期解析、聚合失真的血泪经验这份源码本身不复杂但数据分析的坑往往藏在细节里。下面五条是我在实际跑这类记账分析时反复遇到的按「现象 → 原因 → 解决」写清楚。4.1 图表中文显示成方框现象图能出来但标题和类目名全是方框或乱码。原因matplotlib 默认字体不含中文SimHei在部分系统上不存在。解决先确认系统有哪些中文字体再指定。Linux 上常用WenQuanYi Micro HeimacOS 用Arial Unicode MSWindows 用SimHei或Microsoft YaHei。设置plt.rcParams[font.sans-serif]后还要加plt.rcParams[axes.unicode_minus] False否则负号也会出问题。4.2 日期列解析后全是 NaT现象pd.to_datetime之后日期列全是 NaTdropna把数据全删了图是空的。原因原始日期格式和默认解析不匹配比如2024/1/3、20240103或带时间戳。解决用format参数显式指定如pd.to_datetime(df[日期], format%Y/%m/%d, errorscoerce)。不确定格式时先print(df[日期].head(20))肉眼看别猜。4.3 类目拼写不一致导致聚合碎片化现象聚合后类目特别多每个金额都很小看不出方向。原因同一类消费写了不同名字如「餐饮」「吃饭」「午餐」。解决聚合前做一次映射用df[类目] df[类目].replace({吃饭: 餐饮, 午餐: 餐饮})或先value_counts()找出所有变体再统一。这一步没有捷径只能靠看数据。4.4 金额列混入非数字字符现象to_numeric报错或金额列是 object 类型聚合结果异常。原因金额里带了「元」「¥」或千分位逗号。解决先清洗字符串df[金额] df[金额].astype(str).str.replace(r[^\d.-], , regexTrue)再转数值。errorscoerce能把清不掉的值变 NaN配合dropna兜底。4.5 大额支出压扁图表可读性现象条形图里大部分类目几乎看不见只有一两个特别长。原因金额分布跨度大线性坐标被极值主导。解决要么改用饼图看占比要么对金额取对数np.log1p(summary)后再画要么直接过滤掉极端值单独说明。选哪种取决于你想表达什么没有标准答案但别硬画一张读不了的图。5. 进阶玩法把一次性脚本改成可复用的月度分析习惯跑通一次不难难的是让它变成你每个月都愿意用的东西。这份源码最大的价值不是那张图而是它给了你一个可改的模板。我的习惯是把它改造成「丢一个 CSV 进去自动出当月消费方向图」的小工具省得每次手动改路径。具体做法是加一层命令行参数用argparse接收文件路径和输出目录。这样你每月导出账单后一条命令就能出图不用打开编辑器改代码。import argparse parser argparse.ArgumentParser(description月度消费方向分析) parser.add_argument(--input, requiredTrue, help记账 CSV 路径) parser.add_argument(--output, defaultsummary.png, help输出图片路径) args parser.parse_args() df pd.read_csv(args.input, encodingutf-8-sig) # ... 清洗、聚合逻辑同上 ... plt.savefig(args.output, dpi150) print(f已输出{args.output})改造后运行方式变成python analysis.py --input 2024-01.csv --output jan.png。参数--input必填--output有默认值。这样脚本就从「一次性示例」变成了「可复用工具」这是我认为这份源码最值得动手改的地方。再进一步可以按月份循环处理多个文件把每个月的消费方向图拼成一张趋势对比。常见做法是用for遍历目录下的 CSV聚合后把结果存进一个 DataFrame最后画分组柱状图。这一步涉及多文件读取和结果合并是练 pandas 的好场景。验证方法上我一般会拿两个月的真实数据跑一遍对比总额是否和账单对得上。如果对不上八成是某个月的数据有重复行或漏读。对得上才说明清洗逻辑没问题。这个核对习惯比任何单元测试都直接。提示脚本里别硬编码文件路径用参数传。硬编码的脚本换台机器就跑不了这是最常见的「后悔药」场景。从那以后我每次拿到这类分析源码都强制先跑一遍中间结果核对再动绘图参数——图好看是次要的数据对才是底线。希望这份拆解能帮你把这份源码真正用起来而不是解压完就躺在硬盘里。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/11 19:03:31

Spring Boot微信小程序竞拍平台实战:从并发控制到支付闭环

最近有个朋友问我,做一个带竞拍功能的微信小程序大概要多久,能不能直接用现成的商城框架改一改。我告诉他,拍卖和普通电商完全是两码事——普通购物车是“加购-下单-支付”,拍卖的核心是“出价-超时-成交”,中间还有保…

2026/10/11 19:03:31

EasyExcel按行拆分Excel并打包ZIP下载的完整实践

做后端的兄弟应该都碰到过这类需求:业务方丢过来一个 Excel,说“把每行数据拆成一个新的 Excel 文件,再打个包给我下载”。第一次听到这需求,我第一反应是用 POI 直接读、直接写,但一轮做完就发现,小文件还…

2026/10/11 19:03:31

Flutter适配OpenHarmony实战:猫咪管家App从零到跑通

Flutter 开发者踩坑 OpenHarmony,把猫咪管家 App 从零跑起来,说实话比我想象中有意思。这篇文章不聊空泛的概念,直接聚焦“实现”——从工程搭建、UI 布局、状态管理到真机适配,每一步怎么想、为什么这么做、踩了什么坑&#xff0…

2026/10/11 20:08:35

SAP_Tutor:面向SAP GUI的操作行为捕获与审计工具

简介:SAP_Tutor是一款专为SAP系统用户设计的专业录屏与教学辅助工具,面向企业ERP实施人员、SAP初学者、内部培训师及IT支持工程师,解决SAP操作过程难以复现、知识传递低效、新员工上手慢等实际问题。资源包共92个文件,涵盖25个HTM…

2026/10/11 20:08:35

从Cursor迁回命令行:AI时代下CLI与IDE的取舍与融合

我最近干了一件让同事觉得我是“自虐狂”的事:把主力开发环境从 Cursor 迁回了纯命令行,一套 Neovim tmux 各种 CLI 工具链的组合。很多人不理解,说你有现成的 AI 加持 IDE 不用,非得回终端里敲命令,这不是开倒车吗。…

2026/10/11 20:08:35

数据库原理教学闭环:可验证实验路径设计与实践

简介:本资源是《数据库原理(第四版)》配套教学课件,面向高校计算机、软件工程及相关专业本科生与数据库初学者,系统解决数据库基础理论与核心模型理解难题。课件以PPT格式呈现,共1个文件,大小28…

2026/10/11 20:03:34

MFA令牌完全解读:原理、TOTP与实操指南

前阵子有朋友问我,说自己的某个平台账号提示“请绑定MFA令牌”,他也不知道这是什么,随手扫了个码绑定了事,结果后来越来越多地方要这玩意儿。其实不只是个人账号,现在很多企业内部系统、云服务平台、代码仓库都强制要求…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑