数据采集与预处理:SCADA系统、激光雷达测风、数据清洗与异常值处理

各位同学,今天我们来聊聊数据采集与预处理。说实话,这部分工作看着不起眼,但在我多年的风场项目里,数据质量直接决定了后续分析的成败。你想想看,模型再漂亮,算法再高级,喂进去的是脏数据,出来的结果你敢信吗?

我个人习惯把数据采集比作「打地基」。地基不稳,楼盖得再高也是危房。咱们风场数字孪生也一样,SCADA 和激光雷达就是我们的「眼睛」和「耳朵」,而数据清洗就是给这些信息「去伪存真」。

一、SCADA系统:风场的「黑匣子」

SCADA,全称是数据采集与监视控制系统。说白了,它就是风电机组的「行车记录仪」加「仪表盘」。每一台风机从出生到退役,所有关键数据都会被它记录下来。

SCADA 主要采集哪些数据?

  • 电气参数:有功功率、无功功率、电压、电流、频率。这些是判断机组发电性能的核心指标。
  • 机械参数:叶轮转速、发电机转速、桨距角、偏航角度、齿轮箱油温、轴承温度。
  • 环境参数:风速、风向、环境温度、气压、湿度。
  • 状态信息:运行状态(运行/停机/故障/维护)、累计发电量、运行小时数。

我记得有一次,某风场连续三个月发电量不达标。运维团队查了各种原因,最后发现是 SCADA 系统里风速仪结冰了,采集到的风速数据偏低,导致机组一直没满发。你看,数据源出了问题,后面所有分析都是白费功夫。

核心要点:SCADA 数据的时间分辨率通常是 10 分钟或 1 分钟。做数字孪生时,我建议至少保留 1 分钟级数据,因为 10 分钟平均会抹掉很多瞬态特征,比如湍流、阵风响应这些关键信息。

二、激光雷达测风:看得更远、更准

SCADA 虽然好,但它有个硬伤——只能测机舱后面的风速。你想想看,风先打到叶轮,再吹到机舱上的风速仪,这时候测得的风速已经不是「来风」了,而是「去风」。这叫尾流效应,测出来的风速偏低。

激光雷达就不一样了。它用激光束提前扫描前方 50米、100米、甚至 200米处的风速。说白了,就是给风机装了一双「千里眼」。

激光雷达的优势很明显:

  • 提前感知:可以提前 5-10 秒知道来风的风速和风向变化,给变桨和偏航系统留出响应时间。
  • 三维测风:能测出不同高度层的风速廓线,这对复杂地形风场特别重要。
  • 无机械磨损:不像杯式风速仪有轴承磨损问题,激光雷达基本免维护。

不过,激光雷达也有坑。我曾经在沿海项目上吃过亏——盐雾腐蚀导致激光发射窗口模糊,数据质量直线下降。所以,安装位置和防护等级一定要选对,别省那点钱。

我的经验:如果预算允许,我建议 SCADA 和激光雷达数据同时采集。SCADA 负责长期连续监测,激光雷达负责短期精细校准。两者互补,效果最好。

三、数据清洗与异常值处理:把「垃圾」筛出去

数据采集回来了,但别急着用。我先问大家一个问题:SCADA 数据里有多少是「脏数据」?根据我的经验,一个运行 5 年以上的风场,原始数据里至少有 5%-10% 是无效或异常的。如果不处理,这些数据会像「老鼠屎」一样坏掉整锅汤。

常见的异常类型:

异常类型 典型表现 产生原因
缺失值 某段时间数据为空 传感器故障、通信中断、存储溢出
死值 连续多个时间点数值完全不变 传感器卡死、信号线松动
跳变值 瞬间从 5m/s 跳到 50m/s 又跳回 电磁干扰、信号毛刺、传感器损坏
限幅值 功率长期卡在额定值附近不动 机组限功率运行、电网调度限制
不合理值 风速 3m/s 时功率却达到 1500kW 数据错位、时间戳对齐错误

数据清洗的「三板斧」:

  1. 范围检查:先设定物理合理范围。比如风速 0-40m/s,功率 0-额定功率×1.1。超出这个范围的,直接标记为异常。
  2. 变化率检查:相邻两个时间点的变化不能太离谱。比如风速 1 秒内从 5m/s 跳到 25m/s,这明显不合理。
  3. 相关性检查:利用风速-功率曲线做逻辑校验。风速 8m/s 时功率应该在 300-500kW 之间,如果显示 1000kW,那肯定有问题。

嗯,这里要注意:不要一棍子打死所有异常值。比如限功率运行时的数据,虽然不符合理论曲线,但它是真实工况,应该保留并打标签,而不是直接删除。

避坑指南:我曾经接手过一个项目,前同事用 3σ 法则粗暴地删掉了所有「离群点」。结果呢?把阵风工况下的真实数据全删了,导致功率曲线模型严重偏乐观。记住:异常 ≠ 错误,先分析原因,再决定处理方式。

四、知识体系总览

下面这张图是我自己总结的,把数据采集与预处理的核心逻辑串起来了。大家可以对照着看,心里有个全局观。

数据采集与预处理知识体系 SCADA 系统 激光雷达测风 电气参数 | 机械参数 | 环境参数 | 状态信息 | 风速廓线 | 提前感知 缺失值 死值 跳变值 限幅/不合理值 范围检查 变化率检查 相关性检查 高质量清洗数据 → 数字孪生模型

五、代码实战:快速清洗 SCADA 数据

光说不练假把式。下面给一段 Python 代码,是我项目里常用的清洗流程。大家可以直接拿去改改用。

import pandas as pd
import numpy as np

# 读取 SCADA 数据(假设有风速、功率、温度三列)
df = pd.read_csv('scada_data.csv', parse_dates=['timestamp'])
df.set_index('timestamp', inplace=True)

# 1. 范围检查
df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 40)]
df = df[(df['active_power'] >= 0) & (df['active_power'] <= 2500)]

# 2. 死值检测:连续 10 个点数值完全不变,标记为异常
dead_value_mask = (df.diff(periods=1) == 0).rolling(window=10).sum() >= 10
df.loc[dead_value_mask.any(axis=1), 'quality_flag'] = 'dead_value'

# 3. 变化率检查:风速 1 秒内变化超过 10m/s 视为跳变
df['ws_diff'] = df['wind_speed'].diff().abs()
df.loc[df['ws_diff'] > 10, 'quality_flag'] = 'spike'

# 4. 相关性检查:利用功率曲线经验公式做逻辑校验
# 假设额定风速 12m/s,切入风速 3m/s
def power_curve_check(row):
    ws = row['wind_speed']
    p = row['active_power']
    if ws < 3 and p > 10:
        return False
    if ws > 12 and p < 2000:
        return False
    return True

df['logic_ok'] = df.apply(power_curve_check, axis=1)
df.loc[~df['logic_ok'], 'quality_flag'] = 'logic_error'

# 输出清洗结果
print(f"原始数据量:{len(df)}")
print(f"异常数据量:{df['quality_flag'].notna().sum()}")
print(f"清洗后数据量:{df['quality_flag'].isna().sum()}")

小技巧:清洗后的数据不要直接覆盖原文件。我习惯加一列 quality_flag,用标签区分「正常」「异常-死值」「异常-跳变」「异常-逻辑错误」。这样后续分析时,可以根据需要灵活选择是否剔除。

好了,关于数据采集与预处理,今天就聊到这儿。记住一句话:数据质量决定模型上限。SCADA 和激光雷达是我们的「数据粮仓」,而数据清洗就是「粮食质检员」。把这一步做扎实了,后面的数字孪生模型才能跑得稳、跑得准。


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