3. 数据采集与预处理:传感器选型、数据清洗、缺失值处理
各位工程师朋友,咱们接着聊。上一章我们把储能系统的故障模式梳理清楚了,也确定了要监控哪些关键参数。那下一步是什么?说白了,就是怎么把这些参数“抓”到手,并且让它们变成干净、可用的数据。
这一章,我重点讲三个环节:传感器选型、数据清洗、缺失值处理。这三个环节,任何一个出问题,后面的模型都是白搭。我见过太多项目,算法调得天花乱坠,结果一查,传感器数据本身就是错的。嗯,咱们得从源头把好关。
3.1 传感器选型:别让“眼睛”骗了你
传感器就是模型的“眼睛”。眼睛花了,模型再聪明也白搭。我个人习惯,选型时主要看三个维度:精度、量程、响应时间。
举个例子,测电池表面温度。你想想看,热失控前那几分钟,温度上升速率非常快。如果你选了个响应时间5秒的传感器,等它反应过来,火都烧起来了。我建议,对于温度突变场景,响应时间最好控制在1秒以内。
下面这张表,是我在项目中常用的传感器选型参考,你可以直接拿来用:
| 监测参数 | 推荐传感器类型 | 精度要求 | 采样频率 | 避坑指南 |
|---|---|---|---|---|
| 单体电压 | 高精度ADC + 隔离运放 | ±1mV | ≥10Hz | 注意共模电压干扰,我曾经遇到过因为地线没处理好,导致所有电压数据整体偏移了20mV |
| 充放电电流 | 霍尔电流传感器 | ±0.5% FS | ≥100Hz | 霍尔传感器有温漂,夏天和冬天数据差异很大,需要做温度补偿 |
| 表面温度 | NTC热敏电阻 / PT100 | ±0.1℃ | ≥1Hz | NTC是非线性的,必须查表或做多项式拟合,别直接用ADC读数 |
| 内阻 | 交流注入法 (EIS) | ±1% | 按需触发 | 在线测量干扰大,建议在静置状态下触发测量 |
3.2 数据清洗:把“垃圾”筛出去
数据采集上来,第一件事不是建模,而是清洗。为什么?因为工业现场太脏了。电磁干扰、通信丢包、传感器偶发故障,都会产生“脏数据”。
我一般把清洗分为三步:去重、去噪、去异常。
3.2.1 去重
有时候通信协议设计不好,或者数据缓存机制有问题,会导致同一时间戳出现多条重复记录。这个简单,直接按时间戳去重,保留第一条或最后一条即可。
3.2.2 去噪
去噪我常用两种方法:滑动平均滤波和中值滤波。
- 滑动平均滤波:适合去除高频噪声,比如电流采样上的毛刺。但缺点是会引入延迟,窗口越大延迟越大。
- 中值滤波:对付“椒盐噪声”特别有效。比如电压数据突然跳变到0V然后又恢复,用中值滤波一滤就没了。
给你看段代码,这是我常用的滑动平均滤波实现:
def moving_average(data, window_size=5):
"""
滑动平均滤波
:param data: 原始数据列表
:param window_size: 窗口大小,建议奇数
:return: 滤波后的数据
"""
filtered = []
for i in range(len(data)):
if i < window_size - 1:
# 窗口未满时,取当前可用数据的均值
filtered.append(sum(data[:i+1]) / (i+1))
else:
# 窗口满后,取窗口内数据的均值
window = data[i - window_size + 1 : i + 1]
filtered.append(sum(window) / window_size)
return filtered
# 使用示例
raw_voltage = [3.51, 3.52, 3.50, 3.51, 3.53, 3.49, 3.52]
clean_voltage = moving_average(raw_voltage, window_size=3)
print(clean_voltage)
3.2.3 去异常
去异常,就是剔除那些明显不符合物理规律的数据。比如,电压突然变成-5V,或者温度瞬间跳到200℃。这些数据,直接删掉就好,别犹豫。
我常用的方法是3σ原则和箱线图法。对于正态分布的数据,3σ原则很好用。对于非正态分布,箱线图法更稳健。
3.3 缺失值处理:别让“空洞”毁了模型
数据清洗完了,你会发现有些时间戳上数据是空的。原因很多:传感器离线、通信中断、数据被当成异常删掉了。怎么办?填上。
但怎么填,有讲究。我总结了几种常见方法:
- 前向填充:用上一个有效值填充。适合电压、温度这种变化缓慢的参数。简单,但会引入滞后。
- 线性插值:用缺失值前后两个有效值,拉一条直线,取中间点。适合电流这种线性变化的参数。
- 多项式插值:用多个点拟合一条曲线。适合SOC这种非线性变化的参数。但注意,过拟合风险高。
- 模型预测填充:用其他相关参数(如电压、电流)来预测缺失的温度值。精度高,但计算量大。
我个人习惯,对于连续缺失不超过5个点的情况,用线性插值就够了。如果缺失超过10个点,我会直接丢弃这段数据,因为插值出来的数据可信度太低。
下面这张图,展示了整个数据采集与预处理的流程,你可以对照着看:
好了,数据采集和预处理就聊到这儿。记住一句话:垃圾进,垃圾出。数据质量不过关,后面所有工作都是白费。下一章,咱们聊聊特征工程,看看怎么从这些干净数据里,挖出真正能预测故障的“金矿”。