2. 运营数据采集与治理:数据采集架构(SCADA/物联网)、数据质量问题的常见类型(缺失、异常、重复)、数据清洗与标准化实战

大家好,我是老张。在储能行业摸爬滚打了十来年,今天咱们聊聊数据采集与治理。说实话,很多项目前期轰轰烈烈,最后运营效果打折扣,十有八九是数据底子没打好。你想想看,如果采集上来的数据都是“垃圾”,那后面再牛的分析模型也是白搭。所以,这一章咱们就把数据采集和治理这件事儿彻底掰扯清楚。

2.1 数据采集架构:SCADA 与物联网的“双轮驱动”

储能系统的数据采集,说白了就是给电池、PCS、BMS、温控这些设备装上“眼睛”和“耳朵”。目前主流架构就两套:SCADA 和物联网。我个人习惯把它们比作“老司机”和“新势力”。

SCADA(监控与数据采集系统),是电力行业的传统方案。它稳定、实时性高,特别适合处理毫秒级的保护信号和遥测数据。我在项目里见过不少老电站,SCADA 系统一跑就是七八年,基本不出大毛病。

物联网(IoT)平台,则是近几年的新宠。它更灵活,能接入海量设备,支持远程升级和边缘计算。说白了,就是让每个设备都能“说话”,而且能“说人话”。

实际项目中,我建议采用混合架构:核心保护走 SCADA,非核心数据走 IoT。这样既保证了安全,又降低了成本。

核心要点:SCADA 负责“保命”,IoT 负责“省钱”。两者结合,才是最优解。

下面这张图,是我自己总结的典型数据采集架构,你可以看看数据是怎么从设备一路跑到数据库的。

储能系统数据采集架构图 BMS 电池管理 PCS 储能变流器 温控/消防系统 电表/传感器 数据采集层(SCADA / IoT 网关) 协议转换(Modbus / IEC 104 / MQTT) | 边缘计算 | 数据缓存 网络传输层(光纤 / 4G / 5G / 局域网) 加密传输 | 断点续传 | 数据压缩 数据平台层(时序数据库 / 数据湖 / 云平台)

2.2 数据质量问题的常见类型

数据采集上来了,但质量怎么样?说实话,我见过太多“脏数据”了。如果不治理,分析结果就是“垃圾进,垃圾出”。常见的质量问题,我归纳为三类:缺失、异常、重复。

2.2.1 数据缺失

这是最普遍的问题。比如某个电芯的电压突然没了,或者某段时间的功率数据全是空值。为什么会这样?可能是传感器故障、网络闪断,或者采集程序挂了。

我在项目中遇到过最头疼的情况:一个 100MW 的储能站,因为某个采集网关的缓存满了,导致凌晨 2 点到 4 点的数据全部丢失。那段时间正好是电网调频的关键时段,数据一丢,后面的性能分析全废了。

避坑指南:我曾经吃过亏,后来强制要求所有采集网关必须配置“环形缓存”和“断点续传”功能。这样即使网络断了,数据也不会丢。

2.2.2 数据异常

异常值,说白了就是“离谱”的数据。比如 SOC 突然从 50% 跳到 120%,或者温度显示 -50°C。这些明显不符合物理规律的值,必须揪出来。

异常值通常分两类:

  • 静态异常:超出合理范围的值。比如电压超过 1.5V(单节磷酸铁锂最高 3.65V)。
  • 动态异常:变化率异常。比如 SOC 在 1 秒内跳变 20%,这显然不合理。

2.2.3 数据重复

重复数据也很烦人。比如同一个时间戳下,出现了两条一模一样的功率数据。这通常是因为采集程序重复上报,或者数据库写入逻辑有 bug。

重复数据会导致统计结果失真。你想想看,如果重复计算了某段时间的充放电量,那效率分析就全错了。

2.3 数据清洗与标准化实战

好了,问题找到了,接下来就是动手清洗。我一般按以下步骤来:

  1. 去重:按时间戳 + 设备 ID 去重,保留第一条或最后一条。
  2. 补缺:缺失值用插值法或前向填充。注意,连续缺失超过 5 个点,建议标记为无效。
  3. 异常值处理:用 3σ 原则或 IQR 方法识别异常,然后剔除或修正。
  4. 标准化:统一时间格式、单位、命名规范。

下面是我常用的一个清洗脚本片段,用 Python 写的,你可以参考一下。

import pandas as pd
import numpy as np

# 加载原始数据
df = pd.read_csv('bms_data.csv', parse_dates=['timestamp'])

# 1. 去重:按时间戳和设备ID去重
df = df.drop_duplicates(subset=['timestamp', 'device_id'])

# 2. 缺失值处理:前向填充,连续缺失超过5个则删除
df['voltage'] = df['voltage'].fillna(method='ffill', limit=5)
df = df.dropna(subset=['voltage'])

# 3. 异常值检测:3σ原则
mean = df['voltage'].mean()
std = df['voltage'].std()
df = df[(df['voltage'] >= mean - 3*std) & (df['voltage'] <= mean + 3*std)]

# 4. 标准化:统一时间格式
df['timestamp'] = pd.to_datetime(df['timestamp'], format='%Y-%m-%d %H:%M:%S')

print(f"清洗后数据量: {len(df)} 条")

注意:清洗不是万能的。如果某个设备连续一周都在报异常数据,那大概率是硬件坏了。这时候别光顾着清洗,赶紧安排人去现场检修。

标准化这块,我建议团队内部统一一个规范。比如时间戳统一用 UTC,单位统一用 kW、kWh,设备命名用“站点-设备类型-编号”的格式。这样后期做跨站分析时,能省不少事。

字段 原始格式 标准化格式
时间戳 2024-01-15 14:30:00 2024-01-15T14:30:00Z (UTC)
功率 1.2 MW 1200 kW
设备ID BMS_01 SITE01-BMS-001

嗯,数据清洗和标准化这块,其实没什么高深的技术,关键是要养成习惯。我见过不少团队,前期图省事,后期花几倍的时间去补坑。所以,从一开始就把数据治理做好,后面才能安心做分析。

专注资料整理