Python数据分析实战:用Pandas+Matplotlib自动化分析个人记账数据
2026/9/9 11:27:04 网站建设 项目流程

简介:本资源是一份面向Python初学者与个人财务管理爱好者的轻量级数据分析实践包,聚焦日常记账数据的清洗、分类统计与可视化呈现,帮助用户直观识别消费结构、发现支出规律并优化预算决策。压缩包共3个文件(20KB),含核心分析脚本(.py)、原始记账数据(.xlsx)及简明使用说明(.txt),结构清晰、开箱即用:Python脚本基于Pandas完成数据读取与类别聚合,调用Matplotlib/Seaborn生成饼图、柱状图等多维度消费视图,覆盖食品、交通、娱乐等常见支出分类逻辑。已有190人学习下载,代码注释详尽、逻辑分层明确,既可作为数据分析入门练手项目,也可直接适配个人Excel记账表进行二次定制——无需复杂环境配置,仅需基础Python库即可运行,是兼顾实用性与教学性的微型自动化财务分析范例。

1. 项目概述:从记账数据到消费洞察的自动化旅程

每次月底看着手机里密密麻麻的记账条目,是不是总感觉有点茫然?钱花了不少,但具体花在哪了,哪些是冲动消费,哪些是必要开支,心里却没个准数。这就是我们大多数人的记账现状:记录有余,分析不足。数据躺在表格里,只是一堆冰冷的数字,无法告诉我们背后的消费行为和趋势。

这个名为“数据分析和图标-可视化分析日常记账数据总结个人消费方向”的Python项目,正是为了解决这个痛点而生。它不是一个复杂的商业BI系统,而是一个轻量、实用、能让你亲手掌控个人财务数据的工具包。核心目标很明确:把你日常记录的流水账(比如Excel、CSV文件),通过Python程序进行自动化清洗、归类和分析,并生成直观的可视化图表,最终帮你清晰地总结出个人的消费方向与习惯

简单来说,它扮演了一个“个人财务数据分析师”的角色。你不需要懂复杂的统计软件,只要会一点基础的Python(甚至照着代码改也行),就能把记账这个“苦差事”变成一次有趣的自我探索。项目适合所有有记账习惯、希望提升财务掌控力的朋友,无论是刚入门的数据分析爱好者,还是想用技术解决生活问题的程序员,都能从中获得直接的收益——看见自己的钱到底去了哪里。

2. 核心思路与技术选型:为什么是Python+Matplotlib/Seaborn?

当我们决定要分析个人记账数据时,面临第一个选择:用什么工具?市面上有现成的记账App自带分析功能,也有强大的Tableau、Power BI等专业工具。但这个项目选择用Python从头构建,其背后的思路值得深究。

2.1 核心思路拆解

项目的逻辑链条非常清晰,可以分解为四个核心阶段,构成了一个完整的数据分析管道(Pipeline):

  1. 数据输入与加载:兼容常见格式(如.csv.xlsx),将原始的、可能杂乱的记账记录读入Python环境。
  2. 数据清洗与预处理:这是最关键也是最耗时的一步。需要处理缺失值、异常值(比如一笔记录误输入为10000元),并将文本描述的消费类别(如“午餐”、“星巴克”)标准化为预设的几大类(如“餐饮”、“娱乐”)。
  3. 数据分析与聚合:基于清洗后的干净数据,按时间(月、年)、按消费类别、按支付方式等维度进行统计计算,如月度总支出、各类别占比、消费趋势等。
  4. 结果可视化与输出:将上一步的统计结果,用图表的形式直观呈现,并生成一份简洁的分析总结报告。

这个流程的优势在于高度定制化和透明度。你可以完全控制分类规则(比如把“买书”归入“教育投资”而非“购物娱乐”),可以设计独特的分析指标(如“非必要消费占比”),所有计算过程一目了然,避免了黑盒软件带来的不信任感。

2.2 技术栈选型解析

为什么选择Python以及相关的库?这是经过实践检验的黄金组合。

  • Python作为核心语言:Python在数据分析领域的生态是无可匹敌的。语法简洁,学习曲线平缓,有pandasnumpy这样的神器处理数据,以及matplotlibseabornplotly等库进行可视化,几乎是为数据分析任务量身定做。
  • Pandas:数据操作的瑞士军刀:项目的绝对核心。pandasDataFrame结构非常适合处理表格型数据。加载数据(pd.read_csv)、筛选(df[df[‘类别’]==’餐饮’])、分组聚合(df.groupby(‘月份’).sum())、数据透视(pd.pivot_table)等操作,用几行代码就能完成,效率极高。
  • Matplotlib + Seaborn:可视化黄金搭档
    • Matplotlib是基础绘图库,功能强大且灵活,可以绘制几乎所有类型的图表,并精细控制每个细节(颜色、字体、标注)。但默认样式较为朴素。
    • Seaborn是基于Matplotlib的高级接口,它简化了创建多种复杂统计图表(如分布图、箱线图、热力图)的流程,并且拥有更美观的默认样式和配色方案。
    • 项目中,通常会结合使用:用Seaborn快速绘制美观的统计图表,再用Matplotlib进行微调和组合排版。
  • 可选辅助库
    • Jupyter Notebook:强烈推荐的开发环境。它以“单元格”为单位运行代码,并即时显示图表和结果,非常适合做探索性数据分析(EDA),所见即所得。
    • PlotlyPyecharts:如果你需要生成交互式图表(可以鼠标悬停查看数值、缩放),它们是更好的选择,但可能会增加部署的复杂性。

注意:对于纯新手,不建议一开始就追求交互式或3D炫酷图表。Matplotlib+Seaborn的组合足以生成专业、清晰的静态图表,且学习资源最丰富,遇到问题更容易找到解决方案。

3. 数据准备与清洗:打造高质量分析原料

数据分析界有句名言:“垃圾进,垃圾出”(Garbage in, garbage out)。原始记账数据往往充满“噪音”,直接分析必然得到扭曲的结论。因此,数据清洗是项目中最需要耐心和细心的一环。

3.1 原始数据结构设计

在分析之前,最好先规范你的记账数据格式。一个结构良好的源数据表格能省去大量清洗功夫。建议的表格列至少包括:

日期金额类别支付方式备注
2023-10-0128.50餐饮支付宝午餐-麦当劳
2023-10-0115.00交通微信地铁通勤
2023-10-02299.00购物信用卡网购-衬衫
  • 日期:统一为YYYY-MM-DD格式,便于后续按时间序列处理。
  • 金额:支出为负数或正数均可,但整个项目需保持一致。建议支出为负,收入为正。
  • 类别:这是分析的关键维度,需要预先定义一套固定的类别体系,如餐饮交通购物娱乐居家学习医疗收入等。
  • 备注:用于记录细节,在清洗时可用于辅助判断类别。

3.2 数据清洗实战步骤

清洗过程通常在pandas中完成,主要处理以下几类问题:

  1. 处理缺失值:检查是否有空白的日期、金额或类别。

    # 检查缺失值 print(df.isnull().sum()) # 删除金额或类别为空的记录(谨慎操作,最好先查看) df_clean = df.dropna(subset=[‘金额‘, ’类别‘]) # 对于备注等非关键字段的缺失,可以填充为空字符串 df[‘备注‘].fillna(‘’, inplace=True)
  2. 格式标准化

    • 日期格式化:确保日期列是datetime类型。
      df[‘日期’] = pd.to_datetime(df[‘日期’]) df[‘月份’] = df[‘日期’].dt.to_period(‘M’) # 提取月份,便于分组
    • 金额清洗:去除货币符号,统一为浮点数。处理可能存在的文本错误。
      # 假设金额列里混有‘28.5元‘这样的字符串 df[‘金额’] = df[‘金额’].astype(str).str.replace(‘元‘, ‘’).astype(float)
  3. 异常值检测与处理:通过描述性统计或可视化(如箱线图)发现异常大额或小额记录。

    # 查看金额的统计描述 print(df[‘金额’].describe()) # 假设我们认为单笔支出超过10000元为异常,进行查看 outliers = df[df[‘金额’].abs() > 10000] print(outliers) # 根据备注信息判断是否为误记,决定是修正还是删除
  4. 消费类别归并:这是最核心的清洗步骤。原始记录的“类别”可能非常随意(如“奶茶”、“咖啡”、“聚餐”)。

    • 方法一:映射字典法。创建一个类别映射字典,将细项映射到大类。
      category_map = { ‘奶茶‘: ‘餐饮‘, ‘咖啡‘: ‘餐饮‘, ‘午餐‘: ‘餐饮‘, ‘晚餐‘: ‘餐饮‘, ‘地铁‘: ‘交通‘, ‘打车‘: ‘交通‘, ‘买书‘: ‘学习‘, ‘线上课程‘: ‘学习‘, # ... 其他映射 } df[‘大类’] = df[‘类别’].map(category_map) # 处理未能映射的类别(设为‘其他‘或手动检查) df[‘大类’].fillna(‘其他‘, inplace=True)
    • 方法二:关键词匹配法。对于备注信息丰富的记录,可以通过备注中的关键词来判断类别,作为映射法的补充。

实操心得:清洗规则不是一次就能定好的。建议先做一轮粗略清洗和初步可视化,根据图表结果回头调整清洗逻辑(比如发现某个类别支出畸高,检查是否是分类错误)。这是一个迭代的过程。

4. 数据分析与聚合:挖掘数据背后的故事

数据清洗完毕后,我们就得到了一份干净、规整的DataFrame。接下来,就可以用pandas强大的分组聚合功能,从不同维度切片分析我们的消费行为。

4.1 基础统计分析

首先,获取一些全局性的数字感知:

total_expense = df[df[‘金额’] < 0][‘金额’].sum() # 总支出(假设支出为负) total_income = df[df[‘金额’] > 0][‘金额’].sum() # 总收入 avg_daily_expense = df[df[‘金额’] < 0].groupby(df[‘日期’].dt.date)[‘金额’].sum().mean() # 日均支出 most_expensive_category = df[df[‘金额’] < 0].groupby(‘大类’)[‘金额’].sum().idxmin() # 支出最多的类别

这些基础统计量能快速给你一个财务健康度的概览。

4.2 多维度聚合分析

真正的洞察来自于多维度的交叉分析。

  1. 按消费类别分析:这是最核心的分析维度。

    # 计算各大类支出总额和占比 expense_by_category = df[df[‘金额’] < 0].groupby(‘大类’)[‘金额’].sum().abs() expense_by_category_pct = expense_by_category / expense_by_category.sum() * 100 print(expense_by_category.sort_values(ascending=False)) # 按支出从高到低排序

    这个结果直接回答了“我的钱主要花在哪几个方面”的问题。

  2. 按时间趋势分析:观察消费随时间的变化。

    # 月度支出趋势 monthly_expense = df[df[‘金额’] < 0].groupby(‘月份’)[‘金额’].sum().abs() # 可以计算环比、同比增长率 monthly_expense_pct_change = monthly_expense.pct_change() * 100

    趋势分析能帮你发现消费的季节性规律(如年底购物多),或者评估某项省钱计划是否有效。

  3. 按支付方式分析

    expense_by_payment = df[df[‘金额’] < 0].groupby(‘支付方式’)[‘金额’].sum().abs()

    了解自己更依赖哪种支付工具,有时能间接反映消费习惯(信用卡可能更容易产生冲动消费)。

  4. 复合维度分析:例如,分析每个月的消费结构变化。

    # 使用数据透视表 pivot_table = pd.pivot_table(df[df[‘金额’] < 0], values=‘金额’, index=‘月份’, columns=‘大类’, aggfunc=‘sum’).abs()

    这张透视表可以清晰地展示,随着时间推移,你在“餐饮”、“购物”等类别上的投入是如何变化的。

5. 可视化呈现:让数据自己说话

数字表格不够直观,图表才是传递信息的利器。这里介绍几种最适用于个人消费分析的可视化图表及其Seaborn实现。

5.1 消费结构分析:饼图与环形图

用于展示各类别支出的占比。但类别不宜过多(建议不超过8个),否则会显得杂乱。

import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(10, 8)) # 提取类别和金额数据 categories = expense_by_category.index values = expense_by_category.values # 绘制饼图 plt.pie(values, labels=categories, autopct=‘%1.1f%%’, startangle=90) plt.title(‘月度消费结构分布‘) plt.show() # 更时尚的环形图 plt.pie(values, labels=categories, autopct=‘%1.1f%%’, startangle=90, wedgeprops=dict(width=0.3)) centre_circle = plt.Circle((0,0),0.70,fc=‘white’) fig = plt.gcf() fig.gca().add_artist(centre_circle) plt.title(‘月度消费结构(环形图)‘)

注意:当各类别占比相差不大时,饼图是有效的。如果某个类别占比过高(如超过50%),其他类别会挤在一起难以分辨,此时考虑使用条形图。

5.2 消费对比与排序:条形图

条形图是对比各类别支出金额最清晰的方式,尤其适合类别较多时。

plt.figure(figsize=(12, 6)) # 按金额排序 expense_sorted = expense_by_category.sort_values() # 水平条形图,阅读更舒适 sns.barplot(x=expense_sorted.values, y=expense_sorted.index, palette=“Blues_r”) plt.xlabel(‘支出金额(元)‘) plt.title(‘各类别支出金额排序‘) plt.grid(axis=‘x’, linestyle=‘--’, alpha=0.7) plt.show()

5.3 消费趋势分析:折线图

展示月度总支出或某个重点类别支出的变化趋势。

plt.figure(figsize=(14, 6)) # 将Period类型的月份索引转换为字符串,便于绘图 monthly_expense.index = monthly_expense.index.astype(str) plt.plot(monthly_expense.index, monthly_expense.values, marker=‘o’, linewidth=2) plt.xlabel(‘月份‘) plt.ylabel(‘支出金额(元)‘) plt.title(‘月度总支出趋势‘) plt.xticks(rotation=45) # 旋转x轴标签避免重叠 plt.grid(True, linestyle=‘--’, alpha=0.5) # 可以在峰值或谷值添加标注 max_month = monthly_expense.idxmax() max_value = monthly_expense.max() plt.annotate(f‘峰值:{max_value:.0f}‘, xy=(max_month, max_value), xytext=(max_month, max_value*1.05), arrowprops=dict(arrowstyle=‘->’)) plt.show()

5.4 消费分布与异常值:箱线图

箱线图可以直观显示某个类别(如“餐饮”)支出的分布情况、中位数和异常值(可能是某次特别奢侈的消费)。

plt.figure(figsize=(10, 6)) # 筛选出餐饮数据 dining_data = df[(df[‘大类’] == ‘餐饮’) & (df[‘金额’] < 0)][‘金额’].abs() sns.boxplot(y=dining_data) plt.ylabel(‘单次餐饮支出(元)‘) plt.title(‘餐饮支出分布箱线图‘) plt.show()

5.5 多图组合与排版

一份好的分析报告往往需要将多个关联图表放在一起对比。Matplotlibsubplots功能可以轻松实现。

fig, axes = plt.subplots(2, 2, figsize=(16, 12)) # 2行2列,共4个子图 # 子图1:消费结构饼图 axes[0, 0].pie(values, labels=categories, autopct=‘%1.1f%%’) axes[0, 0].set_title(‘消费结构‘) # 子图2:月度趋势折线图 axes[0, 1].plot(monthly_expense.index.astype(str), monthly_expense.values, ‘g-o’) axes[0, 1].set_title(‘月度支出趋势‘) axes[0, 1].tick_params(axis=‘x’, rotation=45) # 子图3:类别支出条形图 sns.barplot(ax=axes[1, 0], x=expense_sorted.values, y=expense_sorted.index, palette=“viridis”) axes[1, 0].set_title(‘类别支出排序‘) # 子图4:餐饮支出箱线图 sns.boxplot(ax=axes[1, 1], y=dining_data) axes[1, 1].set_title(‘餐饮支出分布‘) plt.tight_layout() # 自动调整子图间距,避免重叠 plt.show()

6. 从分析到洞察:生成你的消费总结报告

可视化的图表是“现象”,我们最终需要的是“洞察”和“行动建议”。这部分需要你结合自身的分析结果进行解读。一个简单的文本报告生成思路如下:

def generate_report(df): # 基于前面计算的各种指标 report_lines = [] report_lines.append(“=== 个人消费分析报告 ===\n“) report_lines.append(f“分析周期:{df[‘日期’].min().date()} 至 {df[‘日期’].max().date()}\n“) # 1. 总体情况 total_exp = df[df[‘金额’] < 0][‘金额’].sum() total_inc = df[df[‘金额’] > 0][‘金额’].sum() savings_rate = (total_inc + total_exp) / total_inc * 100 if total_inc != 0 else 0 # 储蓄率 report_lines.append(f“1. 总体财务状况:“) report_lines.append(f“ - 总收入:{total_inc:.2f} 元“) report_lines.append(f“ - 总支出:{abs(total_exp):.2f} 元“) report_lines.append(f“ - 结余:{total_inc + total_exp:.2f} 元“) report_lines.append(f“ - 估算储蓄率:{savings_rate:.1f}%\n“) # 2. 消费结构洞察 top3_categories = expense_by_category.nlargest(3) report_lines.append(f“2. 核心消费方向:“) for i, (cat, amt) in enumerate(top3_categories.items(), 1): pct = amt / expense_by_category.sum() * 100 report_lines.append(f“ {i}. {cat}:{amt:.2f} 元,占总支出 {pct:.1f}%“) # 3. 趋势洞察 latest_month = monthly_expense.index[-1] latest_exp = monthly_expense.iloc[-1] prev_month = monthly_expense.index[-2] if len(monthly_expense) > 1 else None prev_exp = monthly_expense.iloc[-2] if len(monthly_expense) > 1 else None report_lines.append(f“\n3. 近期消费趋势:“) report_lines.append(f“ - 最近月份({latest_month})支出:{latest_exp:.2f} 元“) if prev_month: change_pct = (latest_exp - prev_exp) / prev_exp * 100 report_lines.append(f“ - 较上月({prev_month})变化:{‘上升‘ if change_pct > 0 else ‘下降‘} {abs(change_pct):.1f}%“) # 4. 初步建议(基于简单规则) report_lines.append(f“\n4. 初步分析与建议:“) if savings_rate < 20: report_lines.append(f“ - 储蓄率偏低,建议审视非必要开支,尝试制定预算。“) if ‘餐饮‘ in top3_categories.index and top3_categories[‘餐饮‘] / expense_by_category.sum() > 0.4: report_lines.append(f“ - 餐饮支出占比过高,可考虑增加自己做饭的频率。“) if monthly_expense.pct_change().std() > 0.15: # 支出波动较大 report_lines.append(f“ - 月度支出波动较大,建议记录大额支出原因,平滑消费。“) return “\n“.join(report_lines) print(generate_report(df))

这份报告将数字和图表转化为直白的语言,直接指出问题所在和可能的改进方向,完成了从“数据”到“信息”再到“决策支持”的闭环。

7. 项目部署与自动化:让分析成为习惯

手动运行脚本毕竟麻烦,我们可以让这个分析过程自动化,定期(如每月)生成报告。

7.1 脚本化与参数化

将上述所有步骤封装到一个Python脚本(如personal_finance_analysis.py)中,并通过命令行参数指定数据文件路径和报告月份。

# personal_finance_analysis.py import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import sys import os def main(data_file, report_month=None): # 1. 加载数据 df = pd.read_csv(data_file) # 2. 数据清洗 (调用清洗函数) df = clean_data(df) # 3. 如果指定了月份,则过滤数据 if report_month: df = df[df[‘月份’] == report_month] # 4. 分析与可视化 analyze_and_visualize(df) # 5. 生成报告 report = generate_report(df) # 6. 保存报告和图表 with open(f‘finance_report_{report_month or “all“}.txt‘, ‘w‘) as f: f.write(report) plt.savefig(f‘finance_charts_{report_month or “all“}.png‘, dpi=300, bbox_inches=‘tight’) print(f“分析完成!报告和图表已保存。“) if __name__ == “__main__“: if len(sys.argv) < 2: print(“用法:python personal_finance_analysis.py <数据文件路径> [报告月份, 如 2023-10]“) sys.exit(1) data_file = sys.argv[1] report_month = sys.argv[2] if len(sys.argv) > 2 else None main(data_file, report_month)

然后可以在终端运行:python personal_finance_analysis.py ./my_expenses.csv 2023-10

7.2 定时任务与邮件发送

在Windows上可以使用“任务计划程序”,在Mac/Linux上可以使用cron,定期(如每月1号)执行脚本。更进一步,可以结合smtplibemail库,将生成的报告和图表通过邮件自动发送给自己。

# 邮件发送功能示例 (需配置邮箱SMTP信息) import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage def send_email_report(report_text, chart_path): # 配置发件人、收件人、SMTP服务器等信息 sender = “your_email@gmail.com“ receiver = “your_email@gmail.com“ password = “your_app_password“ # 注意:使用授权码,非邮箱密码 msg = MIMEMultipart() msg[‘Subject’] = f‘个人消费分析报告 - {pd.Timestamp.now().strftime(“%Y-%m”)}‘ msg[‘From’] = sender msg[‘To’] = receiver # 添加文本报告 msg.attach(MIMEText(report_text, ‘plain‘)) # 添加图表图片 with open(chart_path, ‘rb‘) as f: img = MIMEImage(f.read()) img.add_header(‘Content-ID‘, ‘<ChartImage>‘) msg.attach(img) # 发送邮件 with smtplib.SMTP_SSL(‘smtp.gmail.com‘, 465) as server: # 以Gmail为例 server.login(sender, password) server.send_message(msg)

将这段代码集成到main函数末尾,就能实现全自动的分析-报告-推送流程。

8. 常见问题与排查技巧实录

在实际动手操作这个项目的过程中,你几乎一定会遇到下面这些问题。这里记录了我踩过的坑和解决方案。

8.1 数据加载与编码问题

  • 问题:用pd.read_csv读取文件时,出现UnicodeDecodeError
  • 原因:原始数据文件可能包含非UTF-8编码的中文字符(如从某些旧版WPS或记事本保存的GBK编码文件)。
  • 解决:指定正确的编码参数。尝试encoding=‘gbk‘encoding=‘gb2312‘encoding=‘utf-8-sig‘
    df = pd.read_csv(‘data.csv‘, encoding=‘gbk‘)

8.2 日期处理混乱

  • 问题:日期列被识别为字符串或错误的日期格式,导致无法按月份分组。
  • 解决:强制转换并统一格式。pd.to_datetime非常强大,可以自动解析多种格式,也可以指定格式。
    df[‘日期’] = pd.to_datetime(df[‘日期’], format=‘%Y/%m/%d‘) # 如果格式是2023/10/01 # 或者用 errors=‘coerce‘ 将解析失败的设为NaT,方便后续检查 df[‘日期’] = pd.to_datetime(df[‘日期’], errors=‘coerce‘) print(df[df[‘日期’].isna()]) # 查看哪些行日期解析失败

8.3 消费类别映射遗漏

  • 问题:使用映射字典后,发现df[‘大类’]中存在大量NaN或“其他”,说明很多原始类别没有映射到。
  • 解决
    1. 批量查看未映射项unmapped = df[df[‘大类’].isna()][‘类别’].unique(),打印出来,补充到映射字典里。
    2. 使用模糊匹配:对于无法穷举的情况,可以写一个函数,根据关键词模糊匹配。例如,备注里含有“火锅”、“烧烤”、“餐厅”的都归为“餐饮”。
      def categorize_by_notes(note): note = str(note).lower() if any(word in note for word in [‘火锅‘, ‘烧烤‘, ‘餐厅‘, ‘外卖‘]): return ‘餐饮‘ elif any(word in note for word in [‘滴滴‘, ‘地铁‘, ‘公交‘, ‘油费‘]): return ‘交通‘ # ... 其他规则 else: return ‘其他‘ # 如果‘大类‘为空,则用备注来推断 df.loc[df[‘大类’].isna(), ‘大类’] = df.loc[df[‘大类’].isna(), ‘备注’].apply(categorize_by_notes)

8.4 可视化图表中文显示为方框

  • 问题:生成的图表中,标题、标签的中文显示为乱码或小方框。
  • 解决:这是Matplotlib的默认字体不包含中文字符所致。有两种方法:
    1. 临时设置(推荐):在绘图前添加以下代码,使用系统自带的中文字体。
      import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif’] = [‘SimHei‘, ‘Microsoft YaHei‘, ‘DejaVu Sans‘] # 指定默认字体 plt.rcParams[‘axes.unicode_minus’] = False # 解决负号‘-‘显示为方块的问题
    2. 永久设置:修改Matplotlib的配置文件,一劳永逸,但步骤稍复杂。

8.5 图表布局重叠或显示不全

  • 问题:多个子图挤在一起,或X轴标签太长导致重叠。
  • 解决
    • 使用plt.tight_layout()自动调整子图间距。
    • 调整figsize(图形大小),给图表更多空间。
    • 旋转X轴标签:plt.xticks(rotation=45)
    • 对于条形图,如果类别名很长,可以考虑使用水平条形图(sns.barplot(..., orient=‘h’))。

8.6 脚本自动化执行失败

  • 问题:在任务计划程序或cron中运行脚本,可能因环境变量(如Python路径、工作目录)问题导致失败。
  • 排查
    1. 在脚本开头打印当前工作目录和Python路径:import os; print(os.getcwd())import sys; print(sys.executable)。确保脚本能找到数据文件(使用绝对路径最保险)。
    2. 在cron中,命令最好使用绝对路径,并重定向输出到日志文件以便调试。
      # crontab 示例:每月1号上午9点运行 0 9 1 * * /usr/bin/python3 /home/user/finance_analysis.py /home/user/data/expenses.csv >> /home/user/finance_analysis.log 2>&1

这个项目最大的价值不在于代码本身,而在于它为你建立了一个可迭代、可优化的个人财务分析框架。你可以从最基础的分类、统计开始,逐步加入更复杂的分析,比如设置预算并与实际对比、分析消费地点(通过备注中的关键词)、甚至预测下个月的支出。每一次运行脚本,都是一次对自身消费行为的审视和优化。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询