3、数据准备阶段:历史需求数据采集规范与清洗规则

安全库存参数配置的准确性,高度依赖历史需求数据的质量。本阶段的核心任务是将分散在ERP、WMS、POS等异构系统中的原始业务数据,按照统一规范进行采集、清洗与标准化,形成可供统计模型直接使用的“干净需求序列”。

3.1 数据采集范围与字段规范

历史需求数据并非简单的“出库数量”,而是指在特定时间粒度下,客户或下游环节对物料的实际消耗或独立需求。采集时需明确以下核心字段与约束:

字段名称 数据类型 采集规范说明 示例值
物料编码 VARCHAR(50) 必须与ERP主数据一致,区分SKU变体(包装、版本) SKU-10086-A
需求日期 DATE 精确到自然日,禁止使用财务期间或周别替代 2025-03-15
需求数量 DECIMAL(18,3) 以标准库存单位(EA/KG/L)记录,不含负值 1250.000
需求类型 VARCHAR(20) 区分“客户订单”、“预测消耗”、“调拨出库” 客户订单
渠道/客户编码 VARCHAR(30) 用于后续按渠道分层计算安全库存 CHN-华东-01
数据来源系统 VARCHAR(10) 标记ERP、WMS、POS等,用于溯源与对账 ERP-SAP
采集周期建议: 对于常规快消品,至少采集过去24个月的日级需求数据;对于长周期或项目型物料,建议覆盖36个月或覆盖至少3个完整生命周期。

3.2 数据清洗规则与异常处理

原始数据中普遍存在缺失、重复、异常峰值、负值等问题。以下清洗规则按优先级顺序执行,确保进入模型的数据序列平稳且可解释。

  1. 去重与合并: 按“物料编码+需求日期+需求类型”去重,保留最新系统时间戳的记录;若同一日存在多个同类型需求,合并为单条记录。
  2. 负值过滤: 剔除需求数量小于0的记录(退货、冲销等业务应单独归入“退货流”,不参与安全库存计算)。
  3. 缺失值填充: 对于无需求的自然日,填充为0;对于连续缺失超过7天的物料,标记为“间歇性需求”,单独建模。
  4. 异常峰值识别: 使用3σ原则或IQR(四分位距)法识别离群点。超出均值±3σ的需求点,需人工核实是否为促销、新品上市或数据录入错误。
  5. 时间序列对齐: 将日级数据按业务日历聚合为周级或月级序列,确保所有物料的时间跨度一致。
关键原则: 清洗过程必须保留原始数据快照与清洗日志。任何对异常值的剔除或修正,都应在数据集中增加“清洗标记”字段,便于后续审计与模型调优时追溯。

3.3 数据清洗流程架构

下图展示了从原始数据采集到标准化需求序列的完整清洗链路,各节点之间通过ETL调度任务串联,确保数据处理的自动化与可重复性。

历史需求数据清洗流程架构 历史需求数据清洗流程架构 ERP / WMS / POS 统一采集接口 清洗规则引擎 异常值处理 时间序列标准化 干净需求序列 清洗规则优先级 ① 去重合并 → ② 负值过滤 ③ 缺失填充 → ④ 异常识别 ⑤ 时间对齐 → ⑥ 标记输出 输出要求 • 日/周/月三级序列并存 • 保留清洗标记与原始值

3.4 数据质量校验清单

清洗完成后,必须通过以下校验项方可进入安全库存计算阶段。建议将校验规则固化到自动化脚本中,每次数据刷新后自动输出校验报告。

校验项 通过标准 校验方法
完整性 每个物料在时间跨度内无连续7天以上缺失 SQL窗口函数统计缺失天数
一致性 物料编码与主数据表100%匹配 LEFT JOIN 主数据表检查空值
准确性 异常峰值占比不超过总记录数的1% 3σ或IQR方法统计离群点比例
时效性 最新数据日期与系统日期相差不超过2个工作日 MAX(需求日期) 与当前日期对比
可追溯性 每条记录均保留原始系统来源与清洗标记 检查清洗标记字段是否为空
常见陷阱: 不要直接使用ERP中的“发货单”数据作为需求序列。发货数据可能包含补发、换货等非独立需求,且时间戳为发货操作时间而非客户实际需求时间。优先使用“客户订单创建日期”或“预测消耗日期”作为需求时间基准。

3.5 数据标准化输出格式

清洗后的数据应输出为以下标准格式,供后续安全库存模型直接读取。建议以CSV或Parquet格式存储,并建立数据版本管理机制。

-- 标准化需求序列表结构示例(DDL)
CREATE TABLE clean_demand_series (
    material_code    VARCHAR(50)    NOT NULL,
    demand_date      DATE           NOT NULL,
    demand_qty       DECIMAL(18,3)  NOT NULL,
    demand_type      VARCHAR(20)    NOT NULL,
    channel_code     VARCHAR(30),
    source_system    VARCHAR(10),
    clean_flag       VARCHAR(10)    DEFAULT 'CLEAN',
    original_qty     DECIMAL(18,3),
    create_time      TIMESTAMP      DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (material_code, demand_date, demand_type)
);

-- 数据示例(前5行)
-- material_code | demand_date | demand_qty | demand_type | channel_code | clean_flag
-- SKU-10086-A   | 2025-01-01  | 1250.000   | 客户订单    | CHN-华东-01  | CLEAN
-- SKU-10086-A   | 2025-01-02  | 980.000    | 客户订单    | CHN-华东-01  | CLEAN
-- SKU-10086-A   | 2025-01-03  | 0.000      | 客户订单    | CHN-华东-01  | CLEAN
-- SKU-10086-A   | 2025-01-04  | 2100.000   | 客户订单    | CHN-华东-01  | PEAK_CHECK
-- SKU-10086-A   | 2025-01-05  | 1100.000   | 客户订单    | CHN-华东-01  | CLEAN

完成上述数据准备后,即可进入下一阶段:需求模式识别与统计分布拟合,为安全库存参数计算提供数学基础。