基于零售扫描数据,使用Python检测高/低销量商品缺货问题
Python实现商品缺货检测(区分高/低销量商品)
看起来你已经拿到了门店扫描机的销售数据,想要针对高销量和低销量商品做差异化的缺货检测——这个需求很贴合实际业务场景,毕竟高销量商品断货影响更大,得提前预警,而低销量商品可能不用太敏感。
先把你提供的示例数据整理成清晰的表格:
| Product | Date | Quantity | Status |
|---|---|---|---|
| A | 01/01/2018 | 57 | ok |
| A | 02/01/2018 | 79 | ok |
| A | 03/01/2018 | 95 | ok |
| A | 04/01/2018 | 81 | ok |
| A | 05/01/2018 | 10 | ok |
| A | 06/01/2018 | 5 | ok |
| A | 07/01/2018 | 0 | oos |
下面我给你一套可落地的Python实现方案,用pandas来处理数据会很高效:
核心思路
要做好差异化检测,得先解决两个关键问题:
- 怎么区分高/低销量商品:用历史销量的平均值(或中位数)设定阈值,比如平均日销量>50就算高销量
- 不同商品的缺货规则:
- 高销量商品:不能只等库存为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
优化建议
- 销量分类更合理:如果数据中有极端值(比如某天突然卖了几百件),用中位数代替平均值会更准确
- 高销量商品的连续下滑检测:可以增加逻辑,比如连续3天销量低于平均的30%才预警,减少误报
- 实时集成:如果是实时接收扫描机数据,可以把检测逻辑封装成函数,每次收到新数据就调用一次,直接输出缺货状态
- 低销量规则调整:比如低销量商品连续2天销量为0才标记缺货,避免偶尔一天没卖就误判
内容的提问来源于stack exchange,提问作者MisterT
相关产品推荐
相关产品推荐

