ChatGPT处理Excel表格实战:从数据清洗到自动化报告生成

1次阅读
没有评论

共计 2642 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

目录

开发者常见痛点

处理 Excel 数据时,开发者常遇到以下问题:

ChatGPT 处理 Excel 表格实战:从数据清洗到自动化报告生成

  • 格式解析错误:合并单元格、空行、特殊符号导致 pandas 读取异常
  • 结构理解偏差:ChatGPT 误判表头与数据关系
  • API 限制
  • 每分钟请求次数限制(RPM)
  • 每次请求的 token 上限(4096 for gpt-3.5-turbo)
  • 结果不稳定:相同输入得到不同输出

技术方案对比

方案 优点 缺点
直接调用 OpenAI API 响应快,控制粒度细 需自行处理上下文管理
LangChain 内置记忆模块,支持链式调用 抽象层级高,调试复杂
AutoGPT 自动任务分解 资源消耗大,不适合轻量级场景

核心实现

数据预处理

import pandas as pd
from typing import List, Dict

def clean_excel(file_path: str) -> pd.DataFrame:
    """标准化处理原始 Excel 文件"""
    df = pd.read_excel(file_path, engine='openpyxl')

    # 处理常见问题
    df = df.dropna(how='all')  # 删除全空行
    df = df.ffill()  # 向前填充合并单元格
    df.columns = df.columns.str.strip()  # 清理列名空格

    return df

关键操作说明:

  1. 强制使用 openpyxl 引擎确保兼容性
  2. 对金融数据建议增加千分位符清洗:df.replace('[\\$,]', '', regex=True)
  3. 日期统一格式化:pd.to_datetime(df['日期列'], errors='coerce')

Prompt 构造

有效 prompt 结构示例:

你是一个专业数据分析助手,请按以下要求处理表格数据:- 输入数据格式:| 姓名 | 年龄 | 部门 |
  |------|------|------|
  | 张三 | 32   | 技术部 |

- 处理任务:统计各部门平均年龄,结果按 JSON 格式返回
- 特殊说明:年龄为空的值按 30 计算

构造技巧:

  1. 显式定义列名与示例数据
  2. 指定输出格式要求
  3. 注明异常数据处理规则

API 调用实现

带错误处理的完整实现:

import openai
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def analyze_with_chatgpt(data: str, task: str) -> Dict:
    """
    :param data: 格式化后的表格数据(Markdown 格式):param task: 具体分析任务描述
    :return: API 响应 JSON
    """
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "system", "content": "你是一个专业数据分析助手"},
                {"role": "user", "content": f"表格数据:\n{data}\n\n 分析任务:{task}"}
            ],
            temperature=0.3  # 降低随机性
        )
        return response.choices[0].message.content
    except openai.error.RateLimitError as e:
        print(f"速率限制触发:{e}")
        raise

性能优化

分块处理策略

def chunk_process(df: pd.DataFrame, chunk_size: int = 500):
    """大数据量分块处理"""
    results = []
    for i in range(0, len(df), chunk_size):
        chunk = df.iloc[i:i + chunk_size]
        # 将 chunk 转为 Markdown 格式
        md_table = chunk.to_markdown(index=False)
        results.append(analyze_with_chatgpt(md_table, "..."))
    return pd.concat(results)

异步请求

使用 aiohttp 实现异步调用:

import aiohttp
import asyncio

async def async_request(session, payload):
    async with session.post(
        "https://api.openai.com/v1/chat/completions",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json=payload
    ) as resp:
        return await resp.json()

async def batch_process(tasks: List):
    connector = aiohttp.TCPConnector(limit=10)  # 控制并发量
    async with aiohttp.ClientSession(connector=connector) as session:
        return await asyncio.gather(*[async_request(session, task) 
            for task in tasks
        ])

避坑指南

敏感数据脱敏

  1. 在预处理阶段使用哈希处理:
    import hashlib
    df['姓名'] = df['姓名'].apply(lambda x: hashlib.sha256(x.encode()).hexdigest()[:8])
  2. 对数值类数据添加随机噪声:
    import numpy as np
    df['金额'] = df['金额'] * np.random.uniform(0.95, 1.05)

非结构化表格处理

针对扫描版 PDF 转换的 Excel:

  1. 使用正则提取有效数据:
    import re
    df['提取字段'] = df['原始列'].str.extract(r'(\\d{4}-\\d{2}-\\d{2})')
  2. 用 OpenCV 识别表格结构(需安装 opencv-python)

拓展应用

相同方法可适用于:

  1. CSV 文件:改用 pd.read_csv() 读取
  2. Google Sheets:通过 gspread 库获取数据
  3. 数据库查询结果:直接处理 SQL 查询返回的 DataFrame

完整项目示例见 GitHub 仓库(需替换为真实链接)

正文完
 0
评论(没有评论)