个人账单统计与可视化工具:从CSV解析到数据可视化的实践


背景介绍

在日常财务管理中,记账数据的统计与可视化分析能帮助我们更清晰地了解消费结构和支出趋势。开发一个“个人账单统计与可视化工具”,不仅能自动处理CSV格式的账单数据,还能通过图表直观展示消费占比、月度支出等信息,是Python数据处理与可视化的典型实战场景。

思路分析

该工具的核心功能可拆解为四个模块:
1. 文件解析:读取CSV账单,处理日期(提取月份)、金额(转换为数值)等数据类型。
2. 数据统计:按“消费类别”统计支出总和与占比,按“月份”统计支出并计算月均。
3. 可视化输出:用matplotlib绘制饼图(类别占比)和柱状图(月度支出)。
4. 文本报告:格式化输出总支出、类别占比、月均支出等统计结果。

代码实现(Python)

我们使用pandas处理数据、matplotlib可视化,代码如下(含详细注释):

import pandas as pd
import matplotlib.pyplot as plt

# 解决matplotlib中文显示问题(需系统安装对应中文字体)
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]

def analyze_bills(csv_path):
    # 1. 读取并处理CSV数据
    # 读取CSV,自动解析日期列,转换金额为浮点数
    df = pd.read_csv(csv_path, parse_dates=['日期'])
    df['金额'] = df['金额'].astype(float)  # 确保金额为数值类型
    df['月份'] = df['日期'].dt.month  # 提取月份(1-12)

    # 2. 数据统计
    ## 按消费类别统计总支出
    category_sum = df.groupby('消费类别')['金额'].sum()
    ## 按月份统计总支出
    month_sum = df.groupby('月份')['金额'].sum()
    ## 总支出
    total = df['金额'].sum()
    ## 月份数量(去重后)
    months = df['月份'].nunique()
    ## 月均支出
    average_month = total / months if months > 0 else 0
    ## 计算类别支出占比(保留两位小数)
    category_percent = (category_sum / total * 100).round(2)

    # 3. 生成文本报告
    print(f"总支出:{total:.2f} 元")
    print(f"月均支出:{average_month:.2f} 元(共{months}个月)\n")
    print("消费类别统计:")
    for category, amount in category_sum.items():
        percent = category_percent[category]
        print(f"- {category}:{amount:.2f} 元(占比{percent:.2f}%)")

    # 4. 可视化:饼图(类别支出占比)
    plt.figure(figsize=(8, 6))
    plt.pie(
        category_sum, 
        labels=category_sum.index, 
        autopct='%1.2f%%',  # 百分比格式(保留两位小数)
        startangle=90, 
        colors=['#FF9999', '#66B3FF', '#99FF99', '#FFCC99']  # 自定义颜色
    )
    plt.title('消费类别支出占比')
    plt.axis('equal')  # 保证饼图为正圆形
    plt.tight_layout()  # 调整布局

    # 可视化:柱状图(月度支出)
    plt.figure(figsize=(8, 6))
    month_labels = [f"{month}月" for month in month_sum.index]  # 格式化月份标签(如“1月”)
    plt.bar(month_labels, month_sum, color='#66B3FF', width=0.6)
    plt.title('月度支出统计')
    plt.xlabel('月份')
    plt.ylabel('支出金额(元)')
    plt.xticks(rotation=0)  # x轴标签不旋转
    plt.tight_layout()

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

    # 返回统计结果(可选,用于扩展)
    return {
        'total': total,
        'average_month': average_month,
        'category_sum': category_sum,
        'month_sum': month_sum,
        'category_percent': category_percent
    }

# 运行入口(需替换为你的CSV文件路径)
if __name__ == "__main__":
    csv_path = "bills.csv"  # 示例CSV文件路径
    analyze_bills(csv_path)

代码说明

  1. 文件解析
    • 使用pd.read_csv读取CSV,parse_dates自动解析日期列,astype(float)确保金额为数值。
    • 提取月份:df['日期'].dt.month将日期转换为1-12的月份数字。
  2. 数据统计
    • 分组统计:groupby按“消费类别”和“月份”分组,sum()计算总支出。
    • 总支出与月均:通过sum()nunique()(去重月份数)计算,避免除以0的错误。
    • 占比计算:通过“类别总支出/总支出*100”得到百分比,round(2)保留两位小数。
  3. 文本报告
    • 格式化输出总支出、月均、类别统计,清晰展示每类支出的金额和占比。
  4. 可视化
    • 饼图:plt.pie绘制类别占比,autopct显示百分比,colors自定义颜色。
    • 柱状图:plt.bar展示月度支出,month_labels美化x轴标签(如“1月”)。

测试与扩展

测试数据(bills.csv):

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

输出结果:

  • 文本报告
    总支出:575.00 元  
    月均支出:191.67 元(共3个月)  
    
    消费类别统计:  
    - 餐饮:130.00 元(占比22.61%)  
    - 购物:320.00 元(占比55.65%)  
    - 交通:25.00 元(占比4.35%)  
    - 娱乐:100.00 元(占比17.39%)  
    
  • 可视化图表
    • 饼图:餐饮占22.61%、购物占55.65%等。
    • 柱状图:1月170元、2月105元、3月300元。

进阶扩展:

  1. GUI界面:用Tkinter/PyQt开发文件选择、统计、可视化的交互流程。
  2. 数据筛选:支持按日期范围、类别筛选账单,分析特定维度的支出。
  3. 报告导出:将统计结果和图表导出为PDF/Excel,方便分享。

总结

该项目通过CSV解析→数据统计→可视化的完整流程,帮助我们掌握Python在日常数据处理中的核心技能。从文件读取到图表生成,每一步都围绕“数据驱动决策”展开:
– 巩固了文件处理、分组统计的基础技巧;
– 学会用可视化让数据“说话”,直观展示消费结构;
– 项目贴近生活,可通过扩展(如GUI、数据筛选)提升工程化能力。

若遇到问题(如中文显示、CSV格式错误),可检查字体配置或CSV列名是否与代码匹配。祝你在数据统计与可视化的实践中收获满满!


发表回复

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