4. 工艺参数数据采集与预处理

食品产线的工艺参数报表,其可信度并不取决于图表画得多漂亮,而取决于进入报表的那张数据表是否干净。传感器以固定周期向采集网关上报温度、压力、流量、pH、转速等参数,但真实产线上的原始数据几乎不可能"开箱即用":杀菌段温度探头偶发丢包、灌装流量计在清洗切换时出现尖峰、不同设备的时间戳存在秒级漂移、停机时段产生大量重复值。本节围绕缺失值、异常值和时间戳对齐三类问题,给出可落地的清洗规则与重采样方法,最终形成一张字段规范、时间连续、可直接用于报表计算的干净数据集。

一、先明确"干净"的判定标准

在动手写规则之前,需要先定义本节的数据质量目标,否则清洗会变成无休止的修补。对报表用途而言,"干净"应同时满足四条:时间轴统一且等间隔(例如全部对齐到1分钟栅格)、关键参数无缺失(杀菌温度、持温时间等CCP参数不允许空值)、异常值已被识别并合理处置(不是简单删除)、每条记录可追溯(保留原始值或标记清洗动作)。这四条也决定了后续规则的设计顺序:先对齐时间,再处理缺失,再处理异常,最后做重采样与聚合。

二、时间戳对齐:一切清洗的前提

产线上常见三种时间问题:设备本地时钟未同步导致同一时刻的参数落在不同时间点;不同采样周期(温度10秒一次、流量30秒一次)导致无法直接按行合并;停机或通信中断造成时间轴出现空洞。处理方法是统一时区与时钟源,再重采样到统一栅格。工程上通常以网关NTP时间为准,将各设备时间戳换算为UTC+8的本地时间,然后按参数特性选择聚合方式:温度、压力这类缓变量用区间均值;流量、累计产量这类量值用区间求和或末值;状态量(运行/停机)用区间内占多数的状态。

# 示例:将多源传感器数据对齐到1分钟栅格(pandas)
df["ts"] = pd.to_datetime(df["ts"]).dt.tz_localize("Asia/Shanghai")
df = df.set_index("ts").sort_index()

rule = {
    "杀菌温度": "mean",
    "持温时间": "max",
    "灌装流量": "sum",
    "运行状态": lambda s: s.mode().iloc[0] if not s.mode().empty else "未知",
}
grid = df.resample("1min").agg(rule)
grid["数据点数"] = df["杀菌温度"].resample("1min").count()

这里特意增加"数据点数"字段:某分钟内计数为0,说明该区间完全没有上报,属于真实缺失;计数为1而正常应为6,说明存在丢包。这个字段是后续缺失值判定和报表可信度标注的直接依据。

三、缺失值:区分"没采到"与"不该有"

缺失不能一律填补。停机、清洗、换产期间参数本就不应存在,这类缺失应保留为空并标注"非生产时段",若强行插值反而会污染OEE和单耗计算。只有生产运行期间的短时丢包才适合修补。常用策略按缺口长度分级:连续缺失不超过3个采样点(约3分钟),用线性插值;3至15分钟,用前值保持并打"插补"标记;超过15分钟,不插补,标记为"数据中断",在报表中单独统计中断时长。对杀菌温度这类CCP参数,任何插补都必须留痕,报表中应能区分实测值与插补值。

判定"生产时段"可借助设备运行状态信号或PLC的批次开始/结束标志,比单纯依据参数是否为零更可靠——停机时温度探头仍可能读到环境值而非空值。

四、异常值:用物理边界加统计规则双重拦截

异常值分两类。第一类是物理不可能值,如杀菌温度出现-40℃、压力为负、pH大于14,这类直接判无效,按缺失处理。第二类是统计离群值,如流量计在阀门切换瞬间的短时尖峰,数值在物理范围内但明显偏离工况。对第二类,工程上常用"滑动中位数±3倍MAD"或"滑动均值±3σ"做局部检测,并结合变化率约束:温度单分钟内跃变超过5℃即视为可疑。处置方式不是删除,而是置为缺失后按缺失规则处理,同时记录异常标记和原始值,便于追溯。

# 示例:基于滑动中位数与MAD的局部异常检测
med = grid["灌装流量"].rolling(15, min_periods=5, center=True).median()
mad = (grid["灌装流量"] - med).abs().rolling(15, min_periods=5, center=True).median()
mask = (grid["灌装流量"] - med).abs() > 3 * 1.4826 * mad
grid.loc[mask, "灌装流量_原始"] = grid.loc[mask, "灌装流量"]
grid.loc[mask, "灌装流量"] = pd.NA

注意窗口要"居中"且不宜过长:窗口太长会把真实的工艺调整(如升温阶段)误判为异常,窗口太短则对持续偏移不敏感。实际调试时建议先用一周历史数据回放,统计误判率再定参数。

五、重采样与聚合:形成报表粒度

清洗完成后,还需按报表粒度做二次重采样。班报通常按班次(8小时)聚合,日报按自然日聚合。聚合时要区分参数语义:温度取均值并同时保留最大值(用于判断是否超限)、流量取累计、状态取运行时长占比。聚合结果应附带"有效数据覆盖率"字段,覆盖率低于阈值(如85%)的班次在报表中标注为"数据不完整",避免用低质量数据得出误导性结论。

从原始传感器数据到报表数据集的清洗链路 原始采集数据 温度 10s / 流量 30s 多设备时间戳漂移 停机重复值、丢包 ① 时间戳对齐 统一时区 / NTP 重采样到 1min 栅格 统计每分钟数据点数 ② 缺失值分级 ≤3点:线性插值 3~15min:前值+标记 >15min:判数据中断 ③ 异常值双重拦截 物理边界:-40℃ / pH>14 统计规则:中位数±3MAD 置缺失 + 保留原始值 ④ 按报表粒度重采样聚合 温度:均值 + 最大值 流量:累计 状态:运行时长占比 报表干净数据集 含有效数据覆盖率、插补标记、异常标记,可追溯 覆盖率 < 85% 班次标注 “数据不完整”

六、清洗规则的可追溯与验证

清洗不是一次性动作,而应固化为可重复执行的规则集。建议为每个参数维护一张规则表,记录:参数名、物理上下限、采样周期、缺失分级阈值、异常检测窗口与倍数、聚合方式、覆盖率阈值。规则变更需留版本号,因为同一份报表在不同规则版本下结果可能不同,审计时必须能复现。验证环节可用两个手段:一是抽取若干已知工况时段(如一次正常升温、一次计划停机)人工核对清洗前后曲线是否合理;二是统计各参数的插补率与异常率,若某参数插补率长期偏高,说明探头或通信链路本身有问题,应反馈到设备维护,而不是靠算法掩盖。

不要用全局均值填补缺失值。食品产线参数随工艺阶段剧烈变化,全局均值会把升温段和持温段"抹平",导致报表中的温度曲线失真,甚至掩盖CCP超限事实。

完成上述步骤后,得到的数据集应具备统一的一分钟时间栅格、明确的缺失与异常标记、按班次或日聚合的报表字段,以及可追溯的清洗记录。这张表才是后续工艺参数报表计算、趋势分析和超限统计的可靠输入。