4. 数据质量评估:缺失值统计、异常值初步识别、重复值检测、数据一致性检查
数据清洗之前,咱们得先摸个底。
说白了,就是看看这批数据到底有多「脏」。我个人的习惯是,拿到风场数据后,第一件事不是急着写清洗代码,而是先做一轮质量评估。你想想看,连数据烂到什么程度都不知道,就开始动手洗,很容易洗过头或者漏掉关键问题。
4.1 缺失值统计
风电数据里,缺失值太常见了。传感器故障、通讯中断、停机维护,都会导致数据没记上。
我一般用两个指标来衡量缺失情况:
- 缺失率:缺失值占总数据量的比例
- 缺失模式:是随机缺失,还是连续一大段缺失
举个例子,某台风机SCADA系统每10分钟记录一次数据。如果某天通讯断了,那当天144条记录全没了。这种连续缺失,比随机缺失几个点要严重得多。
核心指标速查表
| 缺失率范围 | 处理建议 |
|---|---|
| < 1% | 直接删除或简单填充 |
| 1% - 5% | 需要分析缺失原因,选择合适填充方法 |
| 5% - 20% | 谨慎处理,建议用插值或模型预测 |
| > 20% | 该变量可能不可靠,考虑是否保留 |
# 快速统计缺失值
import pandas as pd
df = pd.read_csv('wind_turbine_data.csv')
missing_count = df.isnull().sum()
missing_rate = missing_count / len(df) * 100
print("各字段缺失率:")
print(missing_rate[missing_rate > 0].sort_values(ascending=False))
我的小技巧:别只看总数。我曾经遇到一个风场,整体缺失率只有0.3%,但仔细一看,全是某台风机在特定风速段缺失的。这种模式性缺失,往往暗示着传感器有系统性问题。
4.2 异常值初步识别
异常值,就是那些明显不合常理的数据点。
比如风速显示-5m/s,或者功率在风速20m/s时突然飙到额定功率的2倍。这些数据,要么是传感器抽风,要么是传输过程出了错。
我常用的初步识别方法有3种:
- 物理阈值法:根据设备参数设定合理范围。比如风速0~40m/s,功率0~额定功率×1.1
- 统计法:用3σ原则或箱线图,找出离群点
- 变化率法:相邻两个点的变化幅度不能太离谱
注意:异常值不一定是错误值。比如台风过境时,风速确实可能超过切出风速。这时候如果一刀切删掉,反而丢失了极端工况下的宝贵数据。
# 物理阈值法示例
def flag_anomalies(df):
# 风速合理范围:0~40 m/s
wind_flag = (df['wind_speed'] < 0) | (df['wind_speed'] > 40)
# 功率合理范围:0~额定功率×1.1
rated_power = 2000 # kW
power_flag = (df['active_power'] < 0) | (df['active_power'] > rated_power * 1.1)
df['is_anomaly'] = wind_flag | power_flag
return df
4.3 重复值检测
重复数据,在风电里其实比想象中常见。
我记得有一次,某风场的数据采集系统因为网络抖动,同一时刻的数据被重复上传了3次。如果不处理,后续的功率曲线分析就会出问题。
重复值分两种:
- 完全重复:所有字段都一样
- 部分重复:时间戳相同,但其他字段略有差异
对于时间序列数据,我建议重点检查时间戳是否唯一。因为风电数据是按时间对齐的,时间戳重复意味着数据打架。
# 检测重复时间戳
duplicated_timestamps = df[df.duplicated(subset=['timestamp'], keep=False)]
print(f"重复的时间戳数量:{len(duplicated_timestamps)}")
# 查看具体重复情况
if len(duplicated_timestamps) > 0:
print(duplicated_timestamps.head(10))
避坑指南:我曾经遇到一个情况,重复值检测出来0条,但数据量明显不对。后来发现是时间戳精度问题——两个记录差了1毫秒,肉眼看着像重复,但程序认为不同。所以检测时,建议先统一时间精度。
4.4 数据一致性检查
一致性检查,说白了就是看数据之间有没有「打架」。
比如:
- 风速为0,但功率不为0 → 不合理
- 风机处于停机状态,但发电量还在增加 → 矛盾
- 温度传感器显示-50℃,但该地区历史最低温才-20℃ → 异常
我一般会建立一些业务规则来检查:
| 检查项 | 规则 | 示例 |
|---|---|---|
| 风速-功率一致性 | 风速=0时,功率应为0 | 风速0.1m/s,功率500kW → 异常 |
| 状态-数据一致性 | 停机状态时,发电量不应增加 | 状态码=停机,功率=200kW → 异常 |
| 时序逻辑一致性 | 时间戳不能倒流 | 后一条记录时间早于前一条 → 异常 |
# 一致性检查示例
def consistency_check(df):
# 规则1:风速为0时功率应为0
mask1 = (df['wind_speed'] < 0.1) & (df['active_power'] > 10)
# 规则2:停机状态功率应为0
mask2 = (df['status'] == 'stopped') & (df['active_power'] > 10)
df['consistency_flag'] = mask1 | mask2
return df
总结一下:数据质量评估不是一次性工作。我建议每次拿到新数据,都跑一遍这四步检查。花10分钟做评估,能省下后面2小时的调试时间。
最后说一句:质量评估报告一定要留档。我习惯把每次评估的结果存成一个JSON文件,方便后续回溯。万一清洗结果不理想,还能回头看看是不是评估阶段漏了什么。