2. 数据采集与预处理:数据源类型、数据清洗方法、缺失值处理、异常值检测
大家好,我是老张。在储能行业摸爬滚打了十几年,今天咱们聊聊数据采集与预处理。说实话,很多刚入行的朋友觉得算法模型才是核心,但我得说一句——数据质量不过关,再牛的模型也是白搭。我见过太多项目,前期数据没处理好,后期分析结果根本没法用。
2.1 数据源类型:你从哪儿搞数据?
储能系统的数据源,说白了就三大类。我一个个给你讲清楚。
2.1.1 实时采集数据(SCADA/EMS)
这是最核心的数据来源。BMS(电池管理系统)、PCS(储能变流器)、温控系统,这些设备每秒都在往外吐数据。电压、电流、SOC、SOH、温度……字段多得吓人。
我个人习惯,先把这些数据按频率分个类:
| 数据类别 | 典型字段 | 采集频率 |
|---|---|---|
| 电气量 | 电压、电流、功率 | 100ms - 1s |
| 状态量 | SOC、SOH、充放电状态 | 1s - 10s |
| 环境量 | 温度、湿度 | 10s - 60s |
嗯,这里要注意:不同设备的时钟可能不同步。我在项目中遇到过,BMS和PCS的时间戳差了整整3秒,导致功率曲线对不上。后来我强制要求所有设备统一用NTP对时,才解决了这个问题。
2.1.2 离线/台账数据
这类数据往往被忽视,但其实特别重要。电池出厂测试报告、运维检修记录、设备更换日志……这些数据能帮你理解为什么某个电芯的SOH下降得特别快。
举个例子,有一次我发现某簇电池的容量衰减异常。查了台账才发现,这批电芯在出厂时内阻就偏大。没有台账数据,你根本找不到根因。
2.1.3 外部数据
电价曲线、气象数据、电网调度指令。这些数据虽然不直接来自储能系统,但对分析充放电策略、预测收益至关重要。
2.2 数据清洗方法:脏数据怎么处理?
数据采集回来了,但你会发现——数据是脏的。重复数据、格式不一致、逻辑错误……啥问题都有。
2.2.1 去重
最常见的问题。设备偶尔会重复上报同一时刻的数据。我的做法很简单:按时间戳+设备ID去重,保留第一条或最后一条。
# 伪代码示例
df.drop_duplicates(subset=['timestamp', 'device_id'], keep='first')
2.2.2 格式统一
不同厂家、不同协议的数据格式千奇百怪。有的用Unix时间戳,有的用字符串;有的电压单位是V,有的是mV。我建议你建一个数据字典,强制转换。
2.2.3 逻辑校验
比如SOC不能超过100%,电压不能为负,功率不能超过额定值。这些规则写死在清洗脚本里,自动过滤。
2.3 缺失值处理:数据丢了怎么办?
数据缺失是常态。通信中断、设备重启、传感器故障……原因太多了。处理缺失值,我一般分三步走。
2.3.1 判断缺失类型
- 完全随机缺失: 比如通信偶尔丢包,没啥规律
- 随机缺失: 比如温度传感器只在高温时失效
- 非随机缺失: 比如设备故障后一直没数据
不同类型的缺失,处理方法不一样。你想想看,如果是非随机缺失,你用插值法补全,那结果肯定偏的离谱。
2.3.2 处理方法选择
| 缺失比例 | 推荐方法 | 适用场景 |
|---|---|---|
| < 5% | 前向填充 / 线性插值 | 短时间通信中断 |
| 5% - 20% | KNN插值 / 回归插值 | 传感器偶发故障 |
| > 20% | 直接删除该段数据 | 设备长时间离线 |
我个人习惯,对于时间序列数据,优先用前向填充。因为储能系统的数据变化相对平缓,前一秒的值和后一秒的值差别不大。但如果是突变场景(比如功率跳变),前向填充就不合适了,得用插值。
2.3.3 实战案例
去年有个项目,某簇电池的电压数据连续缺失了2小时。我查了日志,发现是采集模块固件升级导致的。这种情况属于非随机缺失,我直接删除了这2小时的数据,没有做任何补全。为什么?因为补全的数据会误导后续的SOH估算模型。
2.4 异常值检测:揪出那些「不听话」的数据
异常值检测,说白了就是找那些明显不合理的数据点。比如电压突然跳到1000V,或者SOC从50%瞬间变成100%。
2.4.1 基于统计的方法
最基础的方法。3σ原则、箱线图、Z-score。对于储能数据,我一般用箱线图,因为它对异常值不那么敏感。
# 箱线图法示例
Q1 = df['voltage'].quantile(0.25)
Q3 = df['voltage'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
anomalies = df[(df['voltage'] < lower_bound) | (df['voltage'] > upper_bound)]
2.4.2 基于规则的方法
储能系统有很多物理约束。比如:
- 单体电压:2.5V - 4.2V(磷酸铁锂)
- SOC变化率:不超过每分钟5%
- 温度变化率:不超过每分钟2°C
这些规则比任何算法都靠谱。我建议你先把这些硬约束写进清洗脚本,再考虑用算法检测。
2.4.3 基于机器学习的方法
对于大规模数据,可以用孤立森林、LOF等算法。但说实话,在储能领域,我很少用这些复杂方法。为什么?因为储能数据的异常模式相对固定,规则方法已经能覆盖90%以上的场景。杀鸡不用牛刀。
知识体系总览
下面这张图,是我自己梳理的数据采集与预处理知识框架。你可以把它当作一个检查清单,做项目时对照着来。
最后说一句掏心窝子的话:数据预处理这件事,看着琐碎,但真不能偷懒。我见过太多团队,花三个月建模型,结果数据质量不行,模型上线就崩。你想想看,地基没打好,楼能盖得高吗?
好了,这一章就聊到这儿。下一章咱们聊聊数据存储与特征工程,到时候见。
公众号:蓝海资料掘金营,微信deep3321