用DeepSeek+Python自动化数据处理:从Excel清洗到可视化报告一键生成
一个完整的实操教程:利用DeepSeek API结合Python,实现从原始Excel数据清洗、分析到生成可视化报告的全自动流程。
场景:每周都在做的重复性数据工作
如果你是运营、财务或产品经理,大概率每周都在做类似的事:从系统导出Excel → 在表里做筛选、透视、公式 → 复制到PPT → 写分析结论。这个过程耗时且容易出错。
本文将教你用 DeepSeek API + Python + Jinja2模板 搭建一个全自动的数据处理管线。
系统架构
原始Excel → [DeepSeek理解需求] → Python清洗脚本 → 统计计算
↓
HTML报告 ← [DeepSeek生成分析结论]
核心思路:用DeepSeek处理需要理解语义的部分(字段映射、异常识别、分析结论撰写),用Python处理计算部分(统计、聚合、图表渲染)。
第一步:智能列名映射(DeepSeek处理)
原始Excel有一堆不规则中文列名,比如”下单日期(勿删)""商品名称(必填)""金额¥”。
import openai
import pandas as pd
client = openai.OpenAI(
base_url="https://api.deepseek.com/v1",
api_key="sk-your-key"
)
df = pd.read_excel("raw_sales.xlsx")
# 让DeepSeek理解列名含义并生成映射
response = client.chat.completions.create(
model="deepseek-v4",
messages=[{
"role": "user",
"content": f"""
这是某电商平台的销售数据列名:{list(df.columns)}
请将其映射为标准字段名(英文小写),格式为JSON:
{{
"下单日期(勿删)": "order_date",
"商品名称(必填)": "product_name",
...
}}
输出纯JSON,不要其他文字。
"""
}]
)
import json
mapping = json.loads(response.choices[0].message.content)
df = df.rename(columns=mapping)
实测效果:DeepSeek对95%以上的列名能正确映射。遇到不确定的列(如”备注123”),它会在JSON中以”remark”命名——你可以手动调整边界情况。
第二步:数据清洗Pipeline
def clean_data(df):
# 1. 删除完全空的行列
df = df.dropna(how="all").dropna(axis=1, how="all")
# 2. 统一日期格式
df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce")
# 3. 金额转浮点数(处理 ¥1,234.56 这类格式)
df["amount"] = df["amount"].astype(str).str.replace("¥", "").str.replace(",", "")
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
# 4. 用DeepSeek检查异常值
anomalies = detect_anomalies_with_ai(df)
return df, anomalies
def detect_anomalies_with_ai(df):
"""让AI识别数据中的异常"""
stats = df.describe().to_dict()
resp = client.chat.completions.create(
model="deepseek-v4",
messages=[{
"role": "user",
"content": f"""
数据统计摘要:{json.dumps(stats, ensure_ascii=False)}
请指出3个最可能的异常数据问题(返回JSON数组)。
例如:[{{"field": "amount", "issue": "存在0元订单", "suggestion": "确认是否为退款"}}]
"""
}]
)
return json.loads(resp.choices[0].message.content)
第三步:AI分析结论生成
def generate_insights(df):
"""让DeepSeek根据数据生成分析结论"""
# 提取关键指标
metrics = {
"total_orders": len(df),
"total_revenue": float(df["amount"].sum()),
"avg_order_value": float(df["amount"].mean()),
"top_product": df.groupby("product_name")["amount"].sum().nlargest(3).to_dict(),
"daily_trend": df.groupby(df["order_date"].dt.date)["amount"].sum().head(30).to_dict()
}
resp = client.chat.completions.create(
model="deepseek-v4",
messages=[{
"role": "system",
"content": "你是一个数据分析师。基于数据给出简洁的分析结论,指出关键趋势和行动建议。"
}, {
"role": "user",
"content": f"分析以下数据并生成300字以内的业务洞察:{json.dumps(metrics, ensure_ascii=False)}"
}]
)
return resp.choices[0].message.content
第四步:生成HTML报告
使用Jinja2模板将分析结果渲染为美观的HTML:
from jinja2 import Template
import matplotlib.pyplot as plt
import base64
from io import BytesIO
def generate_report(df, insights):
# 生成图表(转base64嵌入HTML)
fig, ax = plt.subplots(figsize=(10, 5))
df.groupby(df["order_date"].dt.date)["amount"].sum().plot(ax=ax)
buf = BytesIO()
plt.savefig(buf, format="png", dpi=120)
chart_b64 = base64.b64encode(buf.getvalue()).decode()
template = Template("""
<!DOCTYPE html>
<html><head><title>销售周报</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head><body>
<div class="container mt-4">
<h1>📊 销售周报</h1>
<div class="row">
<div class="col-md-3"><div class="card"><div class="card-body">
<h5>总订单</h5><p class="display-6">{{ metrics.total_orders }}</p>
</div></div></div>
<div class="col-md-3"><div class="card"><div class="card-body">
<h5>总营收</h5><p class="display-6">¥{{ "%.2f"|format(metrics.total_revenue) }}</p>
</div></div></div>
</div>
<img src="data:image/png;base64,{{ chart }}" class="img-fluid my-4" />
<div class="alert alert-info"><h5>💡 AI分析结论</h5><p>{{ insights }}</p></div>
</div></body></html>
""")
html = template.render(metrics=metrics, chart=chart_b64, insights=insights)
with open("report.html", "w", encoding="utf-8") as f:
f.write(html)
一键运行
将以上所有步骤封装为 auto_report.py,然后:
python auto_report.py raw_sales.xlsx
执行后自动生成 report.html,浏览器打开即可看到包含图表和AI分析结论的完整报告。整个过程不到10秒。
扩展思路
- 接入钉钉/飞书机器人:自动发送报告到工作群
- 定时任务:
crontab每天6点自动跑 - 对比分析:上周vs本周趋势变化,AI自动标注异常波动
这套方案最妙的地方是:把AI用在最需要”理解”的地方,把计算留给Python。 不追求100%自动化,而是让AI做它擅长的事,你只需要检查结果即可。