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 外部数据

电价曲线、气象数据、电网调度指令。这些数据虽然不直接来自储能系统,但对分析充放电策略、预测收益至关重要。

我的小建议: 外部数据尽量用API自动拉取,别手动下载。我见过有人每周手动更新一次电价数据,结果某天电价突变,策略完全没跟上,一天亏了好几万。

2.2 数据清洗方法:脏数据怎么处理?

数据采集回来了,但你会发现——数据是脏的。重复数据、格式不一致、逻辑错误……啥问题都有。

2.2.1 去重

最常见的问题。设备偶尔会重复上报同一时刻的数据。我的做法很简单:按时间戳+设备ID去重,保留第一条或最后一条。

# 伪代码示例
df.drop_duplicates(subset=['timestamp', 'device_id'], keep='first')

2.2.2 格式统一

不同厂家、不同协议的数据格式千奇百怪。有的用Unix时间戳,有的用字符串;有的电压单位是V,有的是mV。我建议你建一个数据字典,强制转换。

避坑指南: 我曾经遇到一个项目,某厂家把电流值放大了100倍上报。如果不做格式校验和范围检查,分析结果会完全失真。

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%以上的场景。杀鸡不用牛刀。

知识体系总览

下面这张图,是我自己梳理的数据采集与预处理知识框架。你可以把它当作一个检查清单,做项目时对照着来。

数据采集与预处理知识体系 数据源类型 数据清洗方法 缺失值处理 异常值检测 实时采集(SCADA/BMS) 离线台账(出厂/运维数据) 外部数据(电价/气象) 去重(时间戳+设备ID) 格式统一(数据字典) 逻辑校验(范围/一致性) 前向填充/线性插值(<5%) KNN/回归插值(5%-20%) 直接删除(>20%) 统计方法(3σ/箱线图) 规则方法(物理约束) 核心原则:数据质量决定分析上限,预处理占整个项目60%的工作量

最后说一句掏心窝子的话:数据预处理这件事,看着琐碎,但真不能偷懒。我见过太多团队,花三个月建模型,结果数据质量不行,模型上线就崩。你想想看,地基没打好,楼能盖得高吗?

好了,这一章就聊到这儿。下一章咱们聊聊数据存储与特征工程,到时候见。


公众号:蓝海资料掘金营,微信deep3321