用 Python 把亚马逊广告报表自动化:从 2 小时手工到 5 分钟
【摘要】 一套不依赖第三方工具的轻量方案: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 记得住。
五、下一步
这套架子跑稳之后,三个方向值得加:
- 阈值告警——ACOS 连续两天超阈值就推送,不用等看日报
- 归因——把广告数据和库存、BSR 合并,判断是投放问题还是转化问题
- 换数据源——量上来后用 SP-API 直连,省掉导出这一步
代码不长,但把"每天必须做的事"变成了"不需要想的事"。这大概是自动化最实在的价值。
如果这篇对你有用,评论区聊聊你现在日报是怎么做的——手工的多还是工具的多。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)