每个月月底,尤其是餐饮行业财务小伙伴的噩梦准时到来。
老板要一份采购数据分析报告:哪家供应商供货最多?退货率是否正常?有没有异常采购?同比去年有什么变化?
你打开ERP系统,导出采购汇总表。发现数据有问题:同一供应商有多个名称(其实是同一家),入库数量和收货数量对不上,退货率那列是文本格式没法排序……
你开始手动清洗数据。复制、粘贴、VLOOKUP、条件格式,一个下午过去了。
报告做完了,老板问:"去年同期的数据有吗?对比一下。"
你愣住了。又要重新导出、重新清洗、重新计算……真想把键盘给砸了
这是我真实经历过的工作场景。 一家80+门店的餐饮企业,每月采购金额300-800万,涉及80多家供应商。以前做一份完整的采购数据分析报告,需要4个小时以上。而且每次老板临时要数据,做数据分析,都得重新折腾一遍。
核心逻辑很简单:把重复性工作交给代码,人只做判断和决策。

从ERP/供应链系统导出采购汇总表(Excel格式)。关键字段包括:
注意:不同系统的导出格式不一样,有的日期是文本,有的金额带"元"字,有的供应商名称前后有空格——这些都要在代码里统一处理。
import pandas as pd# 读取采购数据df = pd.read_excel("采购汇总表.xlsx")# 清洗供应商名称:去空格、统一格式df['供应商名称'] = df['供应商名称'].str.strip()# 统一金额格式:去掉"元"字,转为数值df['收货金额'] = pd.to_numeric(df['收货金额'].astype(str).str.replace('元',''),errors='coerce')# 计算退货率df['退货率'] = df['退货数量'] / df['收货数量']# 标记异常:退货率超过5%的标红df['异常标记'] = df['退货率'].apply(lambda x: '⚠️异常' if x > 0.05 else '')
这段代码的实际效果:原来手工清洗数据需要1小时,现在3秒完成,且零错误。
这是最有价值的部分。从三个维度拆解:
维度一:供应商集中度分析
# TOP10供应商占比top10 = df.groupby('供应商名称')['收货金额'].sum().nlargest(10)top10_ratio = top10.sum() / df['收货金额'].sum()print(f"TOP10供应商占比:{top10_ratio:.1%}")
实际案例:某餐饮企业TOP10供应商占比53.6%,说明供应商集中度偏高,议价能力受限。
维度二:异常收货/采购差异
# 收货金额 vs 采购金额,差异超过10%的标出df['差异率'] = (df['收货金额'] - df['采购金额']) / df['采购金额']abnormal = df[abs(df['差异率']) > 0.1]
实际发现:某供应商"收货/采购差异+271%",原因是无采购单直接收货,系统数据不同步。
维度三:退货率预警
# 退货率TOP20high_return = df.groupby('供应商名称')['退货率'].mean().nlargest(20)
分析报告有两种输出方式:
方式一:Excel报告(适合存档)
with pd.ExcelWriter("采购数据分析报告.xlsx") as writer:df.to_excel(writer, sheet_name="明细数据", index=False)top10.to_excel(writer, sheet_name="TOP10供应商")abnormal.to_excel(writer, sheet_name="异常差异")
方式二:HTML交互式仪表板(适合汇报)
用Python生成包含Chart.js图表的HTML文件,可以直接在浏览器里筛选、排序、查看图表。老板看的是这个。
指标 | 手工方式 | Python自动化 | 提升 |
数据清洗时间 | 60分钟 | 3秒 | 1200倍 |
报告生成时间 | 4小时 | 5分钟 | 48倍 |
数据准确率 | 约95%(人为错误) | 100% | +5% |
每月可复用性 | 每次重新做 | 一键运行 | 完全自动化 |
实际节约:每月至少节约20小时,相当于3个工作日。
更重要的是:老板临时要数据的时候,不用再熬夜加班了。 跑一下脚本,5分钟后把HTML报告发过去,专业、美观、数据有深度。
做采购数据分析自动化,关键是这4点:
你们公司的采购数据分析,现在是怎么做的?
手工Excel?还是已经有自动化工具了?欢迎留言分享你的做法一起研究探讨。
#餐饮财务#Python自动化#采购数据分析#财务效率#Excel技巧#财务数字化转型
数智财库 · 财务数字化转型实战派每周更新干货,欢迎关注
import pandas as pdimport matplotlib.pyplot as pltdef analyze_procurement(file_path):"""采购数据分析主函数"""# 1. 读取数据df = pd.read_excel(file_path)# 2. 数据清洗df['供应商名称'] = df['供应商名称'].str.strip()# ... 更多清洗步骤# 3. TOP10供应商分析top10 = df.groupby('供应商名称')['收货金额'].sum().nlargest(10)# 4. 异常检测df['退货率'] = df['退货数量'] / df['收货数量']abnormal_return = df[df['退货率'] > 0.05]df['差异率'] = (df['收货金额'] - df['采购金额']) / df['采购金额']abnormal_diff = df[abs(df['差异率']) > 0.1]# 5. 输出报告with pd.ExcelWriter("采购数据分析报告.xlsx") as writer:df.to_excel(writer, sheet_name="明细数据", index=False)top10.to_excel(writer, sheet_name="TOP10供应商")abnormal_return.to_excel(writer, sheet_name="异常退货率")abnormal_diff.to_excel(writer, sheet_name="异常差异")return "报告生成完成"# 运行result = analyze_procurement("采购汇总表.xlsx")print(result)