数据采集基础:传感器类型、数据采集频率、数据清洗与预处理
做工艺参数异常定位,第一步不是分析数据,而是搞清楚数据是怎么来的。我见过太多人拿到数据就直接建模,结果发现传感器坏了都不知道。说白了,数据采集是整个异常定位的根基,根基不稳,后面全是白搭。
传感器类型:你选对了吗?
传感器就是工艺现场的「眼睛」。我习惯把它们分成三类:
- 物理量传感器:温度、压力、流量、液位。这些最常见,也最成熟。
- 化学量传感器:pH值、浓度、成分分析。这类传感器娇贵,容易漂移。
- 状态量传感器:开关信号、位置信号、振动信号。简单粗暴,但很可靠。
举个例子。我在一条化工产线上遇到过一个问题:反应釜温度一直显示正常,但产品就是不合格。后来发现,温度传感器安装位置离加热夹套太近,测的是局部温度,不是物料真实温度。你想想看,传感器选型对了,安装位置不对,照样白费。
选型要点:
- 量程要覆盖工艺波动范围,留20%余量
- 精度等级要匹配工艺要求,别用0.5级的传感器去测±1℃的工艺
- 响应时间要快于工艺变化速度,否则数据滞后
数据采集频率:不是越快越好
很多人有个误区:采集频率越高越好。其实不是。频率太高,数据量爆炸,存储和计算都扛不住;频率太低,关键变化抓不到。
我一般遵循一个原则:采集频率至少是工艺变化频率的10倍。比如温度变化周期是10秒,那采集频率至少1秒一次。
| 工艺参数 | 典型变化速度 | 建议采集频率 |
|---|---|---|
| 温度(反应釜) | 慢(分钟级) | 1-10秒 |
| 压力(管道) | 中(秒级) | 0.1-1秒 |
| 振动(旋转设备) | 快(毫秒级) | 1-10毫秒 |
| 流量(连续过程) | 中(秒级) | 0.5-2秒 |
我的经验:如果拿不准频率,先按高频率采一周数据,然后做频谱分析,看看信号的主要频率成分在哪,再确定最终采集频率。这样最科学。
数据清洗与预处理:脏数据比没数据更可怕
数据采回来了,但能用吗?我敢说,现场数据至少30%是有问题的。数据清洗就是把这些「垃圾」筛出去。
常见的数据问题
- 缺失值:传感器断线、通讯中断、存储故障
- 异常值:传感器漂移、干扰、设备故障
- 重复值:采集程序bug、重复存储
- 时间戳错乱:时钟不同步、缓存延迟
我曾经处理过一个案例:某产线压力数据每天下午3点准时出现一个尖峰,排查了三个月没找到原因。后来发现是采集服务器的定时任务在3点整执行,导致CPU占用飙升,数据采集延迟了2秒。嗯,这种问题,你不做数据清洗根本发现不了。
清洗流程
我个人的清洗流程是这样的:
- 去重:检查时间戳,删除完全重复的记录
- 补缺:短时间缺失用插值,长时间缺失直接丢弃
- 去噪:用移动平均或中值滤波,去掉随机噪声
- 剔除异常:用3σ原则或IQR方法,剔除明显偏离的值
- 对齐时间:把不同传感器的数据统一到同一个时间轴上
注意:清洗不是越狠越好。过度清洗会抹掉真实的工艺异常信号。我见过有人把异常波动当噪声滤掉了,结果异常定位模型怎么都训练不好。
代码示例:简单的数据清洗
import pandas as pd
import numpy as np
# 读取原始数据
df = pd.read_csv('sensor_data.csv', parse_dates=['timestamp'])
# 1. 去重
df = df.drop_duplicates(subset=['timestamp'])
# 2. 补缺(线性插值)
df['temperature'] = df['temperature'].interpolate(method='linear')
# 3. 去噪(移动平均)
df['pressure_smooth'] = df['pressure'].rolling(window=5).mean()
# 4. 剔除异常(3σ原则)
mean = df['flow'].mean()
std = df['flow'].std()
df = df[(df['flow'] > mean - 3*std) & (df['flow'] < mean + 3*std)]
# 5. 重采样到统一频率(1秒)
df = df.set_index('timestamp').resample('1S').mean().reset_index()
知识体系结构图
下面这张图,是我自己总结的数据采集基础框架。你看一眼就能明白整个逻辑。
一句话总结:传感器选型决定数据质量,采集频率决定数据密度,数据清洗决定数据可用性。这三步走扎实了,后面的异常定位才能有的放矢。
公众号:蓝海资料掘金营,微信deep3321