2. 下游工艺批次数据采集与预处理实战

下游纯化车间的批次数据,本质上是一组多源、异步、采样率不一致的时间序列。层析系统(如 ÄKTA 类设备)以 1 Hz 记录紫外吸收、电导率、pH、系统压力与电导阀状态;在线紫外检测器可能以 2~5 Hz 输出;pH 与电导率探头经变送器后常为 0.2~1 Hz;而人工记录的收样体积、CIP 开始时间等事件则是离散的“点事件”。把这些信号直接拼成一张表,会得到大量错位与空值。本节的任务,就是把它们整理成一张以统一时间轴为索引、可追溯、可分析的批次数据集。

一、先明确时间基准与对齐规则

预处理的第一步不是清洗,而是确定“时间零点”。工程上常用两种基准:绝对时间戳(设备时钟,用于跨设备关联)和批次相对时间(以进样阀切换或 UV 起峰为 t=0,用于批间比较)。建议同时保留两列:timestamp_abs 与 t_rel_s,后者由前者减去批次起点得到,避免夏令时、设备时钟漂移带来的混乱。

对齐策略取决于信号性质。对于连续模拟信号(UV、电导、pH、压力),采用重采样到统一网格:先确定目标采样周期(下游层析常用 1 s),再用“前向填充 + 线性插值”组合处理。对阶跃型信号(如阀位、收集开始/结束标志),必须用前向填充(ffill)而非插值,否则会在阀切换瞬间造出不存在的中间状态。对离散事件(收样瓶号、CIP 阶段),用最近邻匹配挂到时间轴上,并单独标记为事件列。

对齐前务必检查各设备时钟偏差。可在批次开始前用同一台参考时钟对时,或在数据中寻找共同事件(如系统泵启动的 UV 阶跃)估算偏移量,偏移超过 2 s 就应先做时间平移校正再重采样。

二、缺失值的分类与处理

缺失不是一种情况,至少分三类,处理方式完全不同:

  • 短时丢点(如 1~5 个采样周期内无数据):线性插值或样条插值,对 UV 峰形影响可忽略。
  • 长时中断(如探头断连数十秒至数分钟):不得插值,应置为 NaN 并在分析时排除该区间,或整段标记为“不可用”。
  • 结构性缺失(如某批次未接 pH 探头):整列缺失,需在元数据中记录,不能以 0 或均值填充。

一个常见误区是用全局均值填补 pH 缺失。层析过程中 pH 在洗脱段可能变化 1~2 个单位,均值填充会严重扭曲梯度段判断。正确做法是先按工艺阶段(平衡、上样、洗脱、再生)分段,再在段内做短时插值;跨段边界一律不插值。

三、异常点识别:物理约束优先于统计方法

异常识别应先立“物理护栏”,再用统计方法。物理护栏包括:UV 在 0~量程上限之间、电导率非负且不超过饱和值、pH 在 0~14、压力不超过柱压上限且不为负。越界值直接判为无效并置 NaN,而不是先平滑。

统计方法推荐组合使用:对 UV 与压力用滑动中位数 + MAD(中位数绝对偏差)识别尖峰,阈值取 |x - median| > 3 × 1.4826 × MAD;对电导率与 pH 用一阶差分阈值捕捉跳变,因为真实梯度变化是连续的,单点跳变多为气泡或电干扰。注意:层析峰顶的 UV 变化率本身很大,差分阈值必须按阶段设定,否则会把真实峰顶误判为异常。

# 示例:按阶段分段的 MAD 异常标记(参数为教学假设值)
for phase in ["equil", "load", "wash", "elute"]:
    seg = df[df.phase == phase]["uv280"]
    med = seg.rolling(31, center=True, min_periods=10).median()
    mad = (seg - med).abs().rolling(31, center=True, min_periods=10).median()
    df.loc[seg.index, "uv_flag"] = (seg - med).abs() > 3 * 1.4826 * mad

被标记的点不要直接删除,而是新增 uv_flag 布尔列,保留原始值。这样后续既可做“剔除后分析”,也可做“标记但保留”的敏感性对比,符合数据可追溯原则。

四、从清洗结果到可分析数据集

完成上述步骤后,应输出一张宽表:行是统一时间网格,列包括各信号原始值、清洗后值、异常标志、工艺阶段标签与事件列。同时生成一份批次数据质量摘要,记录各信号缺失率、异常点比例、时间偏移校正量、重采样周期。这份摘要本身就是批间可比性的证据——若某批次 UV 缺失率高达 15%,其峰面积积分结果的置信度就应下调。

多源信号 → 清洗 → 时间对齐 → 可分析批次数据集 原始信号源 层析 UV280(1 Hz) 含峰形与基线漂移 在线紫外(2~5 Hz) 采样率不一致 电导率 / pH 变送器 0.2~1 Hz 系统压力 柱压上限约束 阀位 / 收样事件 离散点事件 设备时钟偏差检查 清洗与对齐处理 ① 统一时间基准 绝对时间戳 + 批次相对时间 t_rel ② 重采样到 1 s 网格 模拟量插值 / 阶跃量前向填充 ③ 缺失值分类处理 短时插值 / 长时置 NaN / 结构缺失记录 ④ 异常点识别 物理护栏 + MAD / 差分阈值 异常点标记保留,不直接删除 保证可追溯与敏感性对比 可分析批次数据集 统一时间轴宽表 原始值 / 清洗值 / 异常标志 工艺阶段标签 / 事件列 批次数据质量摘要 缺失率 / 异常比例 时钟偏移量 / 重采样周期 下游分析输入 峰面积积分 / 批间比对 梯度段与收样判定 质量门槛示例 UV 缺失率 > 15% → 峰面积置信度下调 时钟偏移 > 2 s → 先平移再重采样 长时中断段 → 分析时排除

五、一个可复用的处理顺序

把上述内容固化为顺序,能显著减少返工:① 读取各源原始文件并保留原始列;② 检查并校正设备时钟偏移;③ 建立统一 1 s 时间网格;④ 按信号类型分别重采样(模拟量插值、阶跃量 ffill、事件最近邻);⑤ 物理护栏过滤并置 NaN;⑥ 按工艺阶段分段做短时插值与 MAD 异常标记;⑦ 输出宽表与质量摘要。每一步都保留中间列,便于回溯。

不要在对齐之前做异常剔除。若先删除某设备的异常点再重采样,会造成时间轴错位,后续所有批间比较都会偏移。正确顺序永远是“先对齐、后清洗”,或至少保证清洗不改变时间索引。

最后需要强调:预处理的目标不是“让数据看起来干净”,而是“让数据在分析时可信”。异常点标记、缺失率、时钟偏移量这些看似负面的信息,恰恰是判断某批次峰面积、收率计算是否可靠的依据。把质量摘要与宽表一起交付,下游的批间趋势分析、偏差调查和工艺表征才有稳固的数据基础。