一江山水的随笔

当前位置:首页 - 技术 - 正文

Enjoy life!

效果先看:AI智能体生成的月度账单报告长这样

我受够了每月手动整理微信和支付宝账单——导出CSV、分类统计、画图表,一套流程下来至少半小时。现在,我让AI智能体帮我搞定一切:它自动读取账单文件,分析消费结构,找出可疑的异常支出,并生成一份图文并茂的HTML报告。下图是上个月的报告示例:

(这里插入一张截图,展示报告首页,包括总支出、分类饼图、异常支出列表)

报告内容包括:

  • 月度总支出和收入概览
  • 消费分类占比(如餐饮、交通、购物等)
  • 异常支出提醒(比如突然的大额消费)
  • 趋势图表(可选)

整个过程全自动,我只需把账单文件丢进指定文件夹,运行脚本就行。下面分享具体实现步骤。

第一步:准备账单数据——从微信/支付宝导出CSV

AI智能体需要原始数据,所以先得从微信和支付宝导出账单。操作很简单:

  • 微信:打开「我」->「服务」->「钱包」->「账单」->右上角「常见问题」->「下载账单」->选择「用于个人对账」->导出CSV。
  • 支付宝:打开「我的」->「账单」->右上角「…」->「开具交易流水证明」->「用于个人对账」->选择时间范围->导出CSV。

导出的文件通常命名如 微信支付账单(20250101-20250131).csvalipay_record_20250101_20250131.csv。把它们放到一个文件夹,比如 ./bills/

吐槽:支付宝的CSV格式偶尔会变,得注意适配——不过我的代码已经处理了常见情况。

第二步:编写Python代码,让AI智能体分析账单

我用Python写了个脚本,核心功能包括:读取CSV、清洗数据、分类消费、检测异常、生成报告。这里分块解释关键代码。

1. 安装依赖库

确保安装了以下库:

pip install pandas matplotlib jinja2

pandas 用于数据处理,matplotlib 画图,jinja2 生成HTML报告。

2. 读取和合并账单数据

脚本自动扫描 ./bills/ 文件夹,读取所有CSV文件,合并成一个DataFrame。微信和支付宝的字段不同,需要统一处理:

import pandas as pd
import os

def load_bills(folder_path='./bills/'):
    all_data = []
    for file in os.listdir(folder_path):
        if file.endswith('.csv'):
            path = os.path.join(folder_path, file)
            try:
                if '微信' in file:
                    df = pd.read_csv(path, encoding='gbk', skiprows=16)  # 微信CSV有表头偏移
                    df = df.rename(columns={'交易时间': 'time', '交易类型': 'type', '金额(元)': 'amount', '商品': 'description'})
                elif 'alipay' in file:
                    df = pd.read_csv(path, encoding='gbk')
                    df = df.rename(columns={'交易创建时间': 'time', '收/支': 'type', '金额(元)': 'amount', '商品名称': 'description'})
                else:
                    continue
                df['source'] = '微信' if '微信' in file else '支付宝'
                all_data.append(df[['time', 'type', 'amount', 'description', 'source']])
            except Exception as e:
                print(f"读取 {file} 失败: {e}")
    if not all_data:
        return pd.DataFrame()
    return pd.concat(all_data, ignore_index=True)

这段代码处理了编码和表头差异,统一了字段名。

3. 数据清洗和分类

合并后,清洗数据并添加分类标签。我基于描述关键词来分类,比如包含“餐厅”或“外卖”的归为“餐饮”:

def categorize_bills(df):
    # 清洗:去除收入记录,只保留支出
    df = df[df['type'].str.contains('支出|付款', na=False)]
    df['amount'] = df['amount'].astype(str).str.replace('¥', '').astype(float)
    
    # 分类规则
    categories = {
        '餐饮': ['餐厅', '外卖', '美食', '咖啡', '奶茶'],
        '交通': ['打车', '地铁', '公交', '加油', '停车'],
        '购物': ['淘宝', '京东', '超市', '购物', '服饰'],
        '娱乐': ['电影', '游戏', 'KTV', '旅游'],
        '生活': ['水电', '房租', '话费', '维修'],
        '其他': []  # 默认类别
    }
    
    def get_category(desc):
        desc = str(desc).lower()
        for cat, keywords in categories.items():
            for kw in keywords:
                if kw in desc:
                    return cat
        return '其他'
    
    df['category'] = df['description'].apply(get_category)
    return df

你可以根据自己的消费习惯调整关键词,提高分类准确率。

4. 异常支出检测

AI智能体用简单统计方法找异常:比如金额超过平均值的2倍,或突然出现不常见类别。

def detect_anomalies(df):
    anomalies = []
    avg_amount = df['amount'].mean()
    std_amount = df['amount'].std()
    
    for _, row in df.iterrows():
        # 规则1: 金额大于平均值+2倍标准差
        if row['amount'] > avg_amount + 2 * std_amount:
            anomalies.append({
                'time': row['time'],
                'amount': row['amount'],
                'description': row['description'],
                'reason': '大额支出'
            })
        # 规则2: 类别为“其他”且金额较高
        elif row['category'] == '其他' and row['amount'] > 100:
            anomalies.append({
                'time': row['time'],
                'amount': row['amount'],
                'description': row['description'],
                'reason': '未分类高额支出'
            })
    return anomalies

这只是一个基础示例,你可以加入更复杂的机器学习模型来改进。

5. 生成图表和HTML报告

用matplotlib画饼图展示消费结构,然后用Jinja2模板生成HTML报告。

import matplotlib.pyplot as plt
from jinja2 import Template

def generate_report(df, anomalies, output_path='report.html'):
    # 生成饼图
    category_sum = df.groupby('category')['amount'].sum()
    plt.figure(figsize=(8, 6))
    plt.pie(category_sum.values, labels=category_sum.index, autopct='%1.1f%%')
    plt.title('月度消费分类占比')
    chart_path = 'category_pie.png'
    plt.savefig(chart_path)
    plt.close()
    
    # HTML模板
    template_str = """
    
    
    月度账单报告
    
        

月度账单分析报告

分析时间: {{ time }}

总支出: ¥{{ total_amount }}

消费分类

消费分类饼图

异常支出提醒

{% if anomalies %}
    {% for item in anomalies %}
  • {{ item.time }} - ¥{{ item.amount }} - {{ item.description }} (原因: {{ item.reason }})
  • {% endfor %}
{% else %}

无异常支出。

{% endif %} """ template = Template(template_str) html_content = template.render( time=pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S'), total_amount=df['amount'].sum(), chart_path=chart_path, anomalies=anomalies ) with open(output_path, 'w', encoding='utf-8') as f: f.write(html_content) print(f"报告已生成: {output_path}")

报告保存为HTML,可以在浏览器中打开查看。

第三步:运行脚本,查看结果

把以上代码整合成一个主函数,运行即可:

def main():
    df = load_bills()
    if df.empty:
        print("未找到账单文件,请检查./bills/文件夹。")
        return
    df = categorize_bills(df)
    anomalies = detect_anomalies(df)
    generate_report(df, anomalies)
    print("分析完成!打开report.html查看报告。")

if __name__ == '__main__':
    main()

完整代码已上传到我的GitHub(链接在文末),你可以直接下载使用。

注意事项和优化建议

  • 数据隐私:账单包含敏感信息,建议在本地运行脚本,不要上传到云端。
  • 分类准确性:关键词分类可能不完美,你可以根据账单描述手动调整规则,或考虑用NLP模型改进。
  • 扩展功能:可以添加月度趋势对比、预算提醒、自动邮件发送报告等功能。
  • 错误处理:支付宝/微信的CSV格式可能更新,如果脚本报错,检查字段名是否匹配。

我用了这个AI智能体几个月,每月省下至少30分钟,还能清晰看到钱花哪儿了。它帮我发现过几次忘记的订阅扣费,挺实用的。

总结

通过Python脚本实现AI智能体管理家庭账单,核心步骤是:导出CSV、用pandas处理数据、基于规则分类和检测异常、生成可视化报告。代码简单易修改,你可以根据自己的需求定制。自动化后,理财变得更轻松——试试看,让你的AI助手帮你管账吧!

(完整代码和示例文件:GitHub链接

本文来源:一江山水的随笔

本文地址:https://blog.298.name/post/192.html

主要内容:AI智能体帮我管账:每月自动分析微信/支付宝账单,生成可视化报告

版权声明:如无特别注明,转载请注明本文地址!

想找什么搜索会更快哦!
站点信息
  • 文章总数:171
  • 页面总数:1
  • 分类总数:4
  • 标签总数:170
  • 评论总数:61
  • 浏览总数:1643341
控制面板
您好,欢迎到访网站!
  查看权限
Top