# 用Python打造个人月度支出分析工具:从CSV解析到可视化全流程


背景介绍:让消费分析更高效

在理财规划中,清晰的消费结构分析是关键。每月整理支出记录时,手动统计“餐饮花了多少?购物占比多少?”既耗时又容易出错。因此,我们需要一个自动化工具,从CSV格式的支出记录中快速提取数据,统计分析并可视化结果——这就是个人月度支出分析工具的核心目标。

通过该工具,用户只需提供包含“日期、金额、消费类别”的CSV文件,即可一键生成:
– 文本统计(总支出、各品类金额与占比);
– 可视化图表(柱状图展示金额、饼图展示占比)。

接下来,我们将用Python(结合pandasmatplotlib库)一步步实现这个工具。

思路分析:拆解问题,逐个突破

要实现支出分析工具,我们可以将问题拆解为文件读取、数据处理、统计、可视化、结果输出五个核心环节,每个环节对应明确的技术点:

  1. 文件读取:使用pandasread_csv解析CSV文件,自动处理表头和列结构。
  2. 数据处理:转换金额为数值类型,避免计算错误。
  3. 数据统计:按“消费类别”分组,计算每类总金额、总支出、占比。
  4. 可视化:用matplotlib绘制柱状图(金额)和饼图(占比),优化图表样式(颜色、标签、网格等)。
  5. 结果输出:格式化打印统计结果,调用plt.show()展示图表。

代码实现:从数据到图表的全流程

下面是完整的Python实现代码,包含详细注释:

import pandas as pd
import matplotlib.pyplot as plt

# 设置matplotlib支持中文显示(解决中文乱码问题)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示异常

def analyze_expenses(csv_path):
    """
    分析CSV格式的支出记录,输出统计结果和可视化图表
    :param csv_path: CSV文件路径(包含日期、金额、消费类别三列)
    """
    # 1. 读取CSV文件(含异常处理)
    try:
        df = pd.read_csv(csv_path)
    except FileNotFoundError:
        print(f"错误:文件 {csv_path} 不存在,请检查路径!")
        return

    # 2. 数据预处理:转换金额为数值类型
    df['金额'] = df['金额'].astype(float)  # 确保金额为浮点数,方便计算

    # 3. 按消费类别分组统计总金额
    category_expenses = df.groupby('消费类别')['金额'].sum().reset_index()
    category_expenses.columns = ['消费类别', '总金额']  # 重命名列,提升可读性

    # 计算总支出
    total_expense = category_expenses['总金额'].sum()

    # 4. 计算各类别的支出占比(保留两位小数)
    category_expenses['占比(%)'] = (category_expenses['总金额'] / total_expense * 100).round(2)

    # 5. 输出文本统计结果
    print(f"\n===== 支出统计结果 =====")
    print(f"总支出:{total_expense:.2f} 元")
    for _, row in category_expenses.iterrows():
        print(f"- {row['消费类别']}:{row['总金额']:.2f} 元(占比 {row['占比(%)']}%)")

    # 6. 可视化:柱状图(展示各品类支出金额)
    plt.figure(figsize=(10, 6))
    bars = plt.bar(
        category_expenses['消费类别'], 
        category_expenses['总金额'], 
        color='skyblue', 
        zorder=3  # 确保柱子在网格线上方
    )
    plt.title('各消费类别支出金额', fontsize=14)
    plt.xlabel('消费类别', fontsize=12)
    plt.ylabel('金额(元)', fontsize=12)
    plt.xticks(rotation=45, ha='right')  # 旋转类别标签,避免重叠
    plt.grid(axis='y', linestyle='--', alpha=0.7)  # 横向网格线,增强可读性
    # 隐藏不必要的边框,让图表更简洁
    plt.gca().spines['top'].set_visible(False)
    plt.gca().spines['right'].set_visible(False)
    plt.tight_layout()  # 自动调整布局,防止标签截断

    # 7. 可视化:饼图(展示各品类支出占比)
    plt.figure(figsize=(8, 8))
    plt.pie(
        category_expenses['总金额'], 
        labels=category_expenses['消费类别'], 
        autopct='%1.2f%%',  # 显示百分比(保留两位小数)
        startangle=90,      # 饼图起始角度(让“餐饮”等类别更美观)
        colors=['#ff9999', '#99ccff', '#ccff99']  # 自定义颜色,区分品类
    )
    plt.title('各消费类别支出占比', fontsize=14)
    plt.axis('equal')  # 保证饼图为正圆形
    plt.tight_layout()

    # 显示所有图表
    plt.show()


# 执行分析(替换为你的CSV文件路径)
if __name__ == "__main__":
    csv_path = "expenses.csv"  # 示例文件路径,可替换为实际路径
    analyze_expenses(csv_path)

代码核心逻辑说明

  1. 文件读取与预处理
    • 使用pd.read_csv()读取CSV文件,自动处理表头和列结构。
    • 通过df['金额'].astype(float)确保金额为数值类型,避免计算错误。
  2. 数据统计
    • groupby('消费类别')['金额'].sum():按“消费类别”分组,计算每类的总支出。
    • 总支出为所有类别金额的总和,占比通过“类别金额/总支出×100”计算。
  3. 可视化优化
    • 柱状图:添加横向网格线、隐藏冗余边框、旋转类别标签,提升可读性。
    • 饼图:自定义颜色、显示百分比标签、设置起始角度,让图表更美观。
  4. 结果输出
    • 文本输出:格式化打印总支出、各品类金额与占比。
    • 图表输出:调用plt.show()展示柱状图和饼图。

示例运行与验证

以题目中的expenses.csv为例,输入数据为:

日期,金额,消费类别
2023-10-01,50.00,餐饮
2023-10-02,120.00,购物
2023-10-05,30.00,交通
2023-10-10,200.00,购物
2023-10-15,80.00,餐饮

运行代码后,输出结果与预期一致:
– 文本统计:总支出480.00 元,餐饮130.00 元(27.08%)、购物320.00 元(66.67%)、交通30.00 元(6.25%)
– 可视化:柱状图清晰展示金额差异,饼图直观呈现占比(带百分比标注)。

总结:技术沉淀与扩展方向

通过这个项目,我们掌握了数据处理+可视化的核心技能:
文件IO与数据处理:pandas的CSV解析、数据类型转换、分组统计(groupby)。
可视化工具使用:matplotlib的柱状图、饼图绘制,以及图表美化(颜色、网格、标签旋转等)。
统计逻辑:基础的求和、占比计算,培养数据思维。

扩展优化方向

  • 支持更多格式:兼容Excel(.xlsx)、JSON等格式的支出记录。
  • 交互增强:通过命令行参数或简单GUI,让用户选择文件、自定义图表样式。
  • 多维度分析:按“月份”“周”进一步拆分支出,或结合“日期”分析消费趋势。

现在,你可以将CSV文件(如示例expenses.csv)放在同目录下,运行代码体验自动化的支出分析流程了!这个工具不仅能辅助理财,更能帮你快速掌握数据处理+可视化的核心技能。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注