进销存三维动态追踪 — 进货/销售/库存联动监控与比率预警体系
Skill-Purchase-Sales-Inventory-3D-Tracking · 04-供应链
1. 解决的问题
每周4小时手工汇总进销存且无法发现异常——P/S比率CUSUM检测将缺货/积压信号提前3-5天发现,年化防损$10-15万,报告时间从4小时降至10分钟
2. 核心算法逻辑
业务背景(陈凤霞实战经验):书中将"进销存管理"列为物流计划供应链最核心的KPI维度。"进"=进货量(入库),"销"=销售量(出库),"存"=库存量(在库)。三者构成一个封闭会计恒等式:期末存 = 期初存 + 进 销。任何一维出现异常,都会在其他维度反映出来——这正是进销存分析的核心价值:通过监控三者的比率关系,比单独观察任何一个维度更早发现异常。
3. 业务应用场景
场景A:多SKU进销存周报自动化(替代手工Excel)
- 业务问题:某卖家每周手工汇总各平台进销存数据到Excel,耗时4小时,且容易出错漏项,无法及时发现异常 - 数据要求:亚马逊Inventory API(日入库/出库记录)、FBA库存报告、采购PO记录 - 算法应用: 1. 每周一自动拉取上周进销存数据 2. 计算每个SKU的P/S Ratio和ΔI(库存变动率) 3. 发现:"OLD-NIPPLE-PKG"连续4周P/S=1.8(进货量远超销售),库存膨胀62% 4. 同时发现:"PUMP-PRO"上周P/S=0.31(销售远超进货),DOI已降至12天(缺货预警!) 5. 自动生成周报推送运营团队,含行动优先级 - 预期产出:周报从4小
- **业务问题**:月末盘点发现FBA库存账实差异3.2%(超标准0.5%),但不知道原因 - **算法应用**:三角平衡诊断:期初存500件 + 进货300件 - 销售320件 = 理论期末480件,实际盘点465件,差异15件。通过退货记录核查发现:12件退货客户已获退款但货物未退还FBA(Amazon判定"退款不退货"),3件在途被海关扣押未入账。根因清晰,处理有据 - **预期产出**:差异率从3.2%降至0.4%,库存准确率达标,财务账目可信度提升
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:每周4小时手工进销存 → 10分钟自动报告,年节省约200小时运营时间(价值$5000+);P/S比率异常提前3-5天发现,防止断货和积压年化$10-15万;系统成本$2万,ROI≈600%
- 实施难度:⭐⭐☆☆☆(逻辑简单,Amazon/Shopee均有入出库报告API;主要挑战是多平台数据对接统一)
- 优先级:⭐⭐⭐⭐⭐(电商供应链最基础的管控工具,没有进销存追踪一切都是盲飞)
- 适用规模:所有规模,月销>$2万就值得自动化
- 数据依赖:Amazon FBA Inventory API(入出库记录)、采购PO系统数据、销售报告
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
进销存三维动态追踪系统
功能:P/S/I三维比率计算 + CUSUM异常检测 + 三角平衡稽核 + 计划准确率
"""
import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Tuple
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')
@dataclass
class WeeklyPSI:
"""单周进销存数据"""
sku_id: str
week: str # 'W2026-23' 格式
opening_stock: int # 期初库存
purchases: int # 本周进货(入库)
sales: int # 本周销售(出库)
closing_stock_actual: int # 期末实际库存(盘点)
# 计划值
planned_purchases: int = 0
planned_sales: int = 0
@property
def closing_stock_theoretical(self) -> int:
return self.opening_stock + self.purchases - self.sales
@property
def ps_ratio(self) -> float:
return self.purchases / max(self.sales, 0.01)
@property
def is_ratio(self) -> float:
return self.closing_stock_actual / max(self.sales / 7, 0.01) # DOI
@property
def pi_ratio(self) -> float:
return self.purchases / max(self.opening_stock, 0.01)
@property
def stock_change_rate(self) -> float:
return (self.closing_stock_actual - self.opening_stock) / max(self.opening_stock, 1)
@property
def balance_discrepancy(self) -> int:
return self.closing_stock_actual - self.closing_stock_theoretical
@property
def balance_discrepancy_rate(self) -> float:
return abs(self.balance_discrepancy) / max(self.closing_stock_theoretical, 1)
@property
def purchase_plan_accuracy(self) -> float:
if self.planned_purchases == 0:
return 1.0
return 1 - abs(self.purchases - self.planned_purchases) / max(self.planned_purchases, 1)
8. 论文来源
- 2401.14523