You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于零售扫描数据,使用Python检测高/低销量商品缺货问题

Python实现商品缺货检测(区分高/低销量商品)

看起来你已经拿到了门店扫描机的销售数据,想要针对高销量和低销量商品做差异化的缺货检测——这个需求很贴合实际业务场景,毕竟高销量商品断货影响更大,得提前预警,而低销量商品可能不用太敏感。

先把你提供的示例数据整理成清晰的表格:

ProductDateQuantityStatus
A01/01/201857ok
A02/01/201879ok
A03/01/201895ok
A04/01/201881ok
A05/01/201810ok
A06/01/20185ok
A07/01/20180oos

下面我给你一套可落地的Python实现方案,用pandas来处理数据会很高效:

核心思路

要做好差异化检测,得先解决两个关键问题:

  1. 怎么区分高/低销量商品:用历史销量的平均值(或中位数)设定阈值,比如平均日销量>50就算高销量
  2. 不同商品的缺货规则:
    • 高销量商品:不能只等库存为0才标记缺货,销量大幅下滑(比如低于平均的20%)就要预警
    • 低销量商品:可以宽松一些,比如连续2天销量为0再标记缺货(或者直接0库存就标记,看你业务需求)

代码实现

import pandas as pd

# 1. 加载数据(实际场景可以替换成从CSV/数据库/消息队列读取扫描机数据)
sample_data = {
    'Product': ['A']*7,
    'Date': ['01/01/2018', '02/01/2018', '03/01/2018', '04/01/2018', '05/01/2018', '06/01/2018', '07/01/2018'],
    'Quantity': [57,79,95,81,10,5,0],
    'Status': ['ok']*6 + ['oos']
}
df = pd.DataFrame(sample_data)

# 转换日期格式,方便后续排序和时间维度的计算
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

# 2. 计算商品销量统计,区分高/低销量类型
product_sales_stats = df.groupby('Product')['Quantity'].agg(['mean']).reset_index()
# 这里的阈值50可以根据你的实际业务调整,也可以用中位数代替平均值
product_sales_stats['Sales_Type'] = product_sales_stats['mean'].apply(lambda x: 'High' if x > 50 else 'Low')

# 将销量类型合并回原始数据
df = df.merge(product_sales_stats[['Product', 'Sales_Type']], on='Product')

# 3. 自定义缺货检测逻辑
def detect_stockout(row, product_avg_sales):
    if row['Sales_Type'] == 'High':
        # 高销量商品规则:0库存直接标记缺货,销量低于平均20%标记预警
        if row['Quantity'] == 0:
            return 'oos'
        elif row['Quantity'] < product_avg_sales * 0.2:
            return 'warning'
        else:
            return 'ok'
    else:
        # 低销量商品规则:这里简单处理为0库存标记缺货,你可以改成连续N天0销量的逻辑
        return 'oos' if row['Quantity'] == 0 else 'ok'

# 按商品和日期排序,确保时间顺序正确
df = df.sort_values(['Product', 'Date'])

# 应用检测函数,生成检测后的状态
df['Detected_Status'] = df.apply(
    lambda row: detect_stockout(row, product_sales_stats[product_sales_stats['Product'] == row['Product']]['mean'].values[0]),
    axis=1
)

# 输出结果查看
print(df[['Product', 'Date', 'Quantity', 'Sales_Type', 'Detected_Status']])

结果说明

运行代码后,你会看到商品A被标记为高销量(平均日销量约58.4),其中:

  • 05/01的销量10低于平均的20%(≈11.7),会被标记为warning
  • 07/01销量0,标记为oos
  • 其他日期正常,标记为ok

优化建议

  1. 销量分类更合理:如果数据中有极端值(比如某天突然卖了几百件),用中位数代替平均值会更准确
  2. 高销量商品的连续下滑检测:可以增加逻辑,比如连续3天销量低于平均的30%才预警,减少误报
  3. 实时集成:如果是实时接收扫描机数据,可以把检测逻辑封装成函数,每次收到新数据就调用一次,直接输出缺货状态
  4. 低销量规则调整:比如低销量商品连续2天销量为0才标记缺货,避免偶尔一天没卖就误判

内容的提问来源于stack exchange,提问作者MisterT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:04:31