3. 温室环境数据采集与预处理实战

温室环境控制参数优化的效果,很大程度上取决于输入数据的质量。传感器采集到的原始数据往往并不"干净":供电波动会造成瞬时跳变,探头结露会导致湿度读数长时间卡在饱和值,网关断线会留下成段空缺,不同设备的上报周期不一致又会让多源数据难以对齐。如果直接把这些原始数据送入优化模型,模型学到的可能是传感器故障模式,而不是温室真实的热湿动态。本节以一座连栋玻璃温室的实测场景为背景,完整走一遍从原始数据到可用数据集的流程,并说明数据质量如何影响后续参数优化的结论。

一、数据对象与采集背景

假设该温室部署了 6 类传感器:空气温度(℃)、空气相对湿度(%)、CO₂ 浓度(ppm)、光照度(lux)、基质含水量(%)和室外气象站数据(温度、辐照)。采集网关每 1 分钟上报一次,但实际到达时间存在抖动,部分设备因休眠策略实际为 5 分钟一帧。原始数据以长表形式存储,字段包括 device_id、metric、ts、value、quality_flag。教学示例中我们取 7 天数据,约 6 万条记录,其中人为注入约 3% 的缺失、2% 的异常,用于演示处理流程。

二、数据清洗:先统一口径,再谈算法

清洗的第一步不是写代码,而是核对物理量与单位。常见问题包括:温度同时存在 ℃ 与 0.1℃ 整数编码两种上报格式;光照度部分设备用 klux;CO₂ 有 ppm 与 μmol/mol 混用(数值等价但需统一标签)。处理方式是建立一张"指标字典",把 metric 映射到标准名称、单位、合理量程和分辨率。例如空气温度合理量程设为 -10~60℃,分辨率 0.1℃;相对湿度 0~100%;CO₂ 350~5000 ppm。超出量程的记录不直接删除,而是先标记 quality_flag=range,留待异常检测阶段统一判断。

第二步是去重与时间戳规范化。同一设备同一指标在同一分钟内可能重复上报,按 (device_id, metric, ts) 去重并保留最后一条;时间戳统一转换为带时区的本地时间,避免跨零点统计错位。第三步是剔除明显的通信噪声,例如连续 3 帧以上完全相同的数值(传感器卡死)或单帧跳变超过物理可能速率(温度 1 分钟内变化超过 3℃)。

三、缺失值处理:区分"没采到"和"不该有"

缺失分两类。第一类是随机缺失,如偶发丢包,占比小、分布散;第二类是成段缺失,如网关断电 2 小时。对随机缺失,短缺口(≤3 个采样点)可用线性插值或前向填充;对成段缺失,插值会伪造出平滑但虚假的动态,应保留为 NaN 并在建模时按掩码处理,或仅用同期其他相关指标做受限填补。例如空气温度缺失 10 分钟,可参考同温室相邻测点与室外温度做回归填补;而 CO₂ 成段缺失时,由于夜间植物呼吸与通风耦合复杂,强行填补风险较高,更稳妥的做法是标记为不可用区间。

# 示例:按指标设定最大插值缺口(单位:采样点)
rules = {
  "air_temp":   {"max_gap": 3,  "method": "linear"},
  "humidity":   {"max_gap": 3,  "method": "linear"},
  "co2":        {"max_gap": 1,  "method": "ffill"},
  "par":        {"max_gap": 6,  "method": "linear"},
}
# 超过 max_gap 的缺口保持 NaN,并写入 missing_block 标记

四、异常值检测:规则 + 统计双通道

异常检测建议采用"物理规则 + 统计方法"双通道。物理规则负责硬边界,如湿度 >100%、CO₂ <300 ppm、光照夜间为负值;统计方法负责软异常,常用的是滑动中位数绝对偏差(MAD):以 1 小时窗口计算中位数与 MAD,若某点偏离中位数超过 k×1.4826×MAD(k 取 3~5),判为可疑。相比 3σ 法,MAD 对异常本身不敏感,更适合含尖峰的传感器序列。检测出的异常点先置为 NaN,再回到缺失值流程处理,而不是直接替换为均值——均值替换会系统性压低方差,削弱后续优化对极端工况的响应能力。

原始长表 → 清洗 → 缺失/异常处理 → 时间对齐 → 质量评估 原始数据 6类传感器 / 1min 缺失3% 异常2% 口径统一 单位/量程/去重 时间戳规范化 缺失与异常 短缺口插值 MAD+物理规则 时间对齐 重采样至5min 多源合并 数据质量评估指标(按指标×按天统计) 完整率 = 有效点/应有点 · 异常率 = 标记异常/总点 · 最长连续缺口(min) 对齐偏差 = 实际到达时间与标称周期之差的中位数 · 跨设备一致性 = 同温室双测点差值分布 质量合格 → 优化可信 完整率≥95%,异常率≤1% 参数寻优结果稳定、可复现 质量不足 → 优化失真 成段缺失→模型低估通风需求 未处理尖峰→控制阈值被拉偏

五、时间序列对齐:让多源数据"站到同一时刻"

不同指标采样周期不同,直接按行拼接会产生大量错位。推荐做法是先确定分析基准周期(本例取 5 分钟),再对每个指标做重采样:温度、湿度、光照取窗口均值;CO₂ 取窗口末值(更接近瞬时浓度);开关量类信号取窗口内最大值(表示"是否发生过")。重采样后以时间为索引做外连接,得到宽表。需要注意两点:一是重采样会引入相位延迟,均值窗口相当于低通滤波,若后续要做短时控制响应分析,应保留原始高频序列作为对照;二是对齐后要检查时间索引是否连续,缺失的时间片要显式补行并置 NaN,而不是让 pandas 自动跳过,否则后续滑窗统计会错位。

六、数据质量如何影响优化结果

可以用一个对照实验说明影响。以"基于温度与湿度的通风时长优化"为例:方案 A 使用完整清洗后的数据集;方案 B 故意保留成段缺失(不插值、不掩码,直接前向填充)。在同一优化目标(白天温度不超过 28℃、湿度不超过 85% 的时长最大化)下,方案 B 由于前向填充把断电期间的低温低湿状态"延续"到了恢复之后,模型会低估高温时段的通风需求,最终给出的通风时长偏短约 15%~20%(示例量级,用于说明方向而非精确结论)。这说明:缺失处理方式不是中性操作,它会改变优化问题的约束边界。

因此建议在交付数据集时同时交付一份质量报告,至少包含:各指标完整率、异常率、最长连续缺口、对齐偏差中位数,以及"被掩码区间"清单。优化建模时应把掩码作为样本权重或有效区间约束传入,而不是假装数据完整。

实操建议:把清洗规则写成可配置的字典(量程、最大插值缺口、MAD 的 k 值、重采样聚合方式),每次运行输出规则版本号与质量报告。这样当优化结果出现异常时,可以快速回溯是数据规则变了,还是温室工况真的变了。
常见误区:用全局均值填补缺失、用 3σ 法在含趋势的序列上检测异常、对齐时直接按行号拼接。三者都会在不知不觉中改变数据的统计特性,使后续参数优化建立在失真的分布上。