库存管理,几乎是每家制造、零售、电商企业的命脉。库存太少,断货丢订单;库存太多,资金被占用,滞销风险飙升。那么,有没有一套简单易行的库存分析方案,能快速摸清家底、发现问题、指导决策?
告别“拍脑袋”备货,用数据驱动库存管理
今天,我就用Python写一个库存分析脚本,只需一份Excel导出数据,就能自动生成7张核心报表:健康度总览、ABC分类、分类汇总、滞销品预警、供应商绩效、库龄分布、紧急补货清单。
文章最后会附上完整代码,你也可以直接拿去用。
一、你只需要准备一张Excel表格
ERP系统能导出这样的“库存数据”表(Sheet名为“库存数据”),至少包含以下字段:
产品编码、产品名称、分类
脚本会自动计算“可用数量”和“库存金额”,无需你手动处理。
二、7张报表,全方位透视库存健康度
1. 库存健康度总览 —— 一眼看清整体风险
脚本会输出:
管理者可以快速判断: 当前库存是整体偏多还是偏少?资金占用是否合理?
2. ABC分类 —— 抓住重点,管好“二八原则”
按照库存金额将产品分为A、B、C三类:
输出每个类别的SKU数、库存金额、占比。你会发现,往往20%的A类产品占用了80%的资金。
3. 按产品分类汇总 —— 各品类表现对比
例如“原材料”“半成品”“成品”“包材”“辅料”等。输出各分类的SKU数、库存总量、库存金额、紧急补货数量、金额占比。哪类产品积压最严重?哪类最容易缺货? 一目了然。
4. 滞销品预警 —— 识别“不动库存”
定义:库龄 > 60天 且 可用数量 > 安全库存的1.5倍。这些产品占用了大量资金,却很少被消耗或卖出。脚本会列出前10大滞销品,并统计总占用资金。及时处理滞销品,可以快速回笼资金。
5. 供应商绩效分析 —— 谁家的货不好管?
按供应商分组,统计:
平均库龄高、超安全库存多的供应商,往往意味着交付不稳定或质量有问题,需要重点沟通。
6. 库龄分布 —— 库存“年龄”结构
将产品按库龄分为:
并统计每个区间的SKU数和库存金额占比。如果“关注”和“滞销”区间占比过高,说明库存周转太慢,需要采取促销或减产措施。
7. 紧急补货清单 —— 今天必须下单的产品
可用数量 < 安全库存 × 0.5 的产品,系统标为“紧急补货”。脚本会列出这些产品的编码、名称、分类、可用数量、安全库存、供应商等信息。采购人员拿着这张表直接下单,不会漏掉任何一个缺货风险。
三、运行脚本后,你还能得到一份Excel报告
除了在控制台打印结果,脚本还会自动生成 库存分析报告.xlsx,包含5个Sheet:
你可以直接把这个Excel文件发给管理层或相关部门,不需要二次整理。
四、附:完整代码(复制即可用)
import pandas as pdimport numpy as np# 1. 从 Excel 读取库存数据input_file = "inventory.xlsx"# 请确保该文件存在,且包含所需的列df = pd.read_excel(input_file, sheet_name="库存数据")# 补充计算if"可用数量"notin df.columns: df["可用数量"] = df["库存数量"] - df["已分配数量"]if"库存金额"notin df.columns: df["库存金额"] = (df["库存数量"] * df["单价"]).round(2)print(f"从 {input_file} 读取数据,共 {len(df)} 行\n")# 2. 库存分析total_value = df["库存金额"].sum()avg_turnover = (df["库存数量"] / df["安全库存"]).mean()# ABC分类df["ABC分类"] = pd.cut( df["库存金额"], bins=[0, df["库存金额"].quantile(0.6), df["库存金额"].quantile(0.85), float("inf")], labels=["C类", "B类", "A类"])# 预警等级df["预警"] = df.apply(lambda x: "紧急补货"if x["可用数量"] < x["安全库存"] * 0.5else ("库存偏低"if x["可用数量"] < x["安全库存"]else ("正常"if x["可用数量"] < x["安全库存"] * 2else"库存偏高")), axis=1)print("="*60)print("库存健康度总览")print("="*60)print(f""" 总SKU数量 : {len(df)} 库存总金额 : ¥{total_value:,.2f} 平均周转率 : {avg_turnover:.2f}x 超安全库存品 : {len(df[df["可用数量"] < df["安全库存"]])} 个 ({len(df[df["可用数量"] < df["安全库存"]])/len(df)*100:.1f}%) 紧急补货品 : {len(df[df["预警"] == "紧急补货"])} 个 库存偏低品 : {len(df[df["预警"] == "库存偏低"])} 个 偏高库存品 : {len(df[df["预警"] == "库存偏高"])} 个""")print("="*60)print("ABC分类库存金额分布")print("="*60)abc_summary = df.groupby("ABC分类").agg( SKU数=("产品编码", "count"), 库存金额=("库存金额", "sum"), 占比=("库存金额", lambda x: x.sum() / df["库存金额"].sum() * 100)).round(2)print(abc_summary)print("\n" + "="*60)print("按产品分类汇总")print("="*60)cat_summary = df.groupby("分类").agg( SKU数=("产品编码", "count"), 库存总量=("库存数量", "sum"), 库存金额=("库存金额", "sum"), 紧急补货=("预警", lambda x: (x == "紧急补货").sum())).sort_values("库存金额", ascending=False)cat_summary["金额占比"] = (cat_summary["库存金额"] / total_value * 100).round(1)print(cat_summary)print("\n" + "="*60)print("滞销品预警(库龄>60天 且 库存量偏高)")print("="*60)slow_moving = df[(df["库龄(天)"] > 60) & (df["可用数量"] > df["安全库存"] * 1.5)]slow_moving_summary = slow_moving[["产品编码", "产品名称", "分类", "库存数量","安全库存", "库龄(天)", "库存金额"]].sort_values("库存金额", ascending=False)print(f"滞销品数量: {len(slow_moving)} 个,占用资金 ¥{slow_moving['库存金额'].sum():,.2f}")print(slow_moving_summary.head(10).to_string(index=False))print("\n" + "="*60)print("供应商绩效分析")print("="*60)supplier_stats = df.groupby("供应商").agg( SKU数=("产品编码", "count"), 库存金额=("库存金额", "sum"), 平均库龄=("库龄(天)", "mean"), 超安全库存品=("预警", lambda x: (x == "库存偏低").sum() + (x == "紧急补货").sum())).sort_values("库存金额", ascending=False)supplier_stats["平均库龄"] = supplier_stats["平均库龄"].round(1)print(supplier_stats)print("\n" + "="*60)print("库龄分布")print("="*60)age_bins = pd.cut(df["库龄(天)"], bins=[0, 7, 30, 60, 90], labels=["0-7天(新鲜)", "8-30天(正常)", "31-60天(关注)", "61-90天(滞销)"])age_dist = df.groupby(age_bins, observed=True).agg( SKU数=("产品编码", "count"), 库存金额=("库存金额", "sum"))age_dist["金额占比"] = (age_dist["库存金额"] / total_value * 100).round(1)print(age_dist)print("\n" + "="*60)print("紧急补货清单")print("="*60)urgent = df[df["预警"] == "紧急补货"].sort_values("库存金额", ascending=False)print(urgent[["产品编码", "产品名称", "分类", "可用数量", "安全库存", "预警", "供应商"]].to_string(index=False))# 3. 保存分析结果到 Excel 报告output_file = "库存分析报告.xlsx"with pd.ExcelWriter(output_file, engine="openpyxl") as writer: df.to_excel(writer, sheet_name="原始数据", index=False) cat_summary.to_excel(writer, sheet_name="分类汇总") slow_moving_summary.to_excel(writer, sheet_name="滞销品", index=False) supplier_stats.to_excel(writer, sheet_name="供应商分析") urgent[["产品编码", "产品名称", "分类", "可用数量", "安全库存", "供应商"]].to_excel( writer, sheet_name="紧急补货清单", index=False )print(f"\n分析完成!报告已保存至: {output_file}")
五、如何用好这份报告?
- 紧急补货清单直接发给采购,同时复盘为什么会出现紧急缺货(是预测不准?还是供应商交期太长?)。
很多中小企业还在用Excel手工统计库存,耗时且容易出错。用Python自动化分析,不仅节省时间,更能从数据中发现隐藏的问题——哪个产品占用了最多的资金?哪个供应商总是导致缺货?哪些库存已经“沉睡”了三个月?
这套脚本完全开源,你可以根据自己的业务调整预警阈值(例如把库龄>60天改为>90天),或者增加更多分析维度。
如果觉得有用,欢迎转发给需要的朋友。也欢迎在评论区留言,聊聊你在库存管理中遇到的那些坑。
获取和交流
需要本章或其他文章的源码和数据的同学,关注+三连,在对应文章下评论“6666“,加下面微信,发你!也可以拉你进群交流学习,加群备注:IT小本本学习
为了能随时获取最新动态,大家可以动动小手将公众号添加到“星标⭐”哦,点赞 + 关注,用时不迷路!!!!
关注公众号:IT小本本 👇