用 Python 把亚马逊广告报表自动化:从 2 小时手工到 5 分钟

举报
yd_221640373 发表于 2026/10/30 02:30:49 2026/10/30
【摘要】 一套不依赖第三方工具的轻量方案:requests 拉报表、pandas 做透视、openpyxl 出日报,每天定时推送,把每天的搬运时间压到零。

一、问题:日报的 90% 时间花在搬运上

做亚马逊运营,每天早上第一件事是看昨天的广告数据:花费、ACOS、出单、投产。数据在后台,日报在 Excel,中间靠手工导出粘贴。

一个店铺 8 个广告活动、5 个广告组,导 3 张表、粘贴 6 次、改 4 个公式——熟练也要 40 分钟。铺了 3 个店铺就是 2 小时。

这 2 小时不产生任何决策价值,全是搬运。

二、思路:把"取数—清洗—计算—呈现"拆开

拆成四层,每层都能单独替换:

层 职责 工具
取数 拉广告报表 requests / 官方 SP-API
清洗 统一列名、处理空值 pandas
计算 ACOS、CPC、投产比 pandas groupby
呈现 出 Excel 日报 openpyxl

关键认知:不要一开始就上 SP-API。SP-API 授权流程长、限流严格,先用后台导出的 CSV 把后面三层跑通,收益立刻兑现,等量大再换数据源。

三、核心代码

3.1 统一清洗

后台导出的报表列名带空格和括号,先规范化:

import pandas as pd
import re

def normalize(df):
    df.columns = [re.sub(r"\s+|\(|\)|(|)", "", c.strip()) for c in df.columns]
    rename = {
        "广告活动名称": "campaign",
        "广告花费": "spend",
        "广告销售额": "sales",
        "点击量": "clicks",
        "曝光量": "impressions",
        "广告订单量": "orders",
    }
    return df.rename(columns={k: v for k, v in rename.items() if k in df.columns})

3.2 派生指标

def metrics(df):
    df["cpc"]  = (df["spend"] / df["clicks"].replace(0, pd.NA)).round(2)
    df["acos"] = (df["spend"] / df["sales"].replace(0, pd.NA) * 100).round(1)
    df["ctr"]  = (df["clicks"] / df["impressions"].replace(0, pd.NA) * 100).round(2)
    df["roas"] = (df["sales"] / df["spend"].replace(0, pd.NA)).round(2)
    return df

注意 .replace(0, pd.NA)——分母为 0 时直接给空值,避免 inf 污染后面的排序和汇总。这个细节比指标公式本身更容易踩坑。

3.3 按活动聚合

report = (
    df.groupby("campaign", as_index=False)
      .agg(spend=("spend", "sum"),
           sales=("sales", "sum"),
           clicks=("clicks", "sum"),
           orders=("orders", "sum"))
)
report = metrics(report)
report["投产比"] = (report["sales"] / report["spend"]).round(2)
report.sort_values("spend", ascending=False, inplace=True)

3.4 出日报并标红异常

from openpyxl import load_workbook
from openpyxl.styles import PatternFill

with pd.ExcelWriter("daily.xlsx", engine="openpyxl") as w:
    report.to_excel(w, index=False, sheet_name="日报")

wb = load_workbook("daily.xlsx")
ws = wb["日报"]
red = PatternFill("solid", fgColor="FFC7CE")

for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
    acos = row[6].value          # ACOS 列
    if acos and acos > 35:       # 阈值按品类调整
        for cell in row:
            cell.fill = red
wb.save("daily.xlsx")

ACOS 超过阈值的行整行标红,扫一眼就知道今天要调哪个活动。

四、跑起来之后的变化

  • 取数从 40 分钟压到 0(定时任务在上班前跑完)
  • 每天早上只看两件事:标红的行、投产比下降超过 20% 的活动
  • 决策从"看数据"变成"处理异常"

真正省下来的不是 2 小时,是不用每天重新建立一遍数据认知。人对数字的记忆很短,昨天的 ACOS 今天是记不住的,而 Excel 记得住。

五、下一步

这套架子跑稳之后,三个方向值得加:

  1. 阈值告警——ACOS 连续两天超阈值就推送,不用等看日报
  2. 归因——把广告数据和库存、BSR 合并,判断是投放问题还是转化问题
  3. 换数据源——量上来后用 SP-API 直连,省掉导出这一步

代码不长,但把"每天必须做的事"变成了"不需要想的事"。这大概是自动化最实在的价值。


如果这篇对你有用,评论区聊聊你现在日报是怎么做的——手工的多还是工具的多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。