数据质量:异常值检测、缺失值处理、数据对齐与时间戳标准化
各位同行,咱们做风电后评估,最怕什么?不是风不好,也不是机组故障,而是数据本身有问题。我见过太多项目,辛辛苦苦算了一周,最后发现是数据采集器坏了三个月——白忙活一场。
数据质量这块,说白了就是「垃圾进,垃圾出」。你模型再牛,算法再花哨,原始数据一塌糊涂,结果就是废纸一张。今天咱们就聊聊,怎么把脏数据洗干净。
核心原则:数据清洗不是炫技,是保命。宁可少算,不要算错。
异常值检测:别让一个坏点毁了整条曲线
异常值检测,我习惯分三步走。第一步,物理限值检查。风速不可能超过50m/s,功率不可能超过额定值的1.2倍。这些硬边界,写死在代码里。
# 物理限值检查示例
def physical_limit_check(df):
# 风速范围:0-40 m/s
df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 40)]
# 功率范围:0-额定功率*1.1
df = df[(df['active_power'] >= 0) & (df['active_power'] <= rated_power * 1.1)]
return df
第二步,统计方法。我常用的是IQR(四分位距法)。为什么?因为它对极端值不敏感。均值±3σ那套,遇到长尾分布就废了。
我的习惯:先做物理限值,再做统计检测。顺序不能反。物理限值能干掉明显错误,减少统计方法的误判。
第三步,也是容易被忽略的——上下文检测。比如,风速突然从5m/s跳到25m/s,又跳回来。单点看都在范围内,但变化率明显不合理。我在河北一个风场就遇到过,测风塔的传感器松动,数据忽高忽低,用变化率检测一抓一个准。
# 变化率检测
def rate_of_change_check(df, column, max_rate):
# 计算相邻点变化率
df['roc'] = df[column].diff().abs()
# 标记异常
df['flag'] = df['roc'] > max_rate
return df
缺失值处理:补还是不补,这是个问题
缺失值处理,我个人的原则是:能不用就不用。为什么?因为任何插值方法都会引入人为误差。你想想看,风是随机的,你用线性插值去补一个湍流段,那不是自欺欺人吗?
我一般这样处理:
- 缺失率 < 5%:用前后均值或线性插值。注意,只补短缺口(连续缺失不超过3个点)。
- 缺失率 5%-20%:用同类机组同期数据做回归填补。比如A机组缺了,用B机组同风速段的功率来推算。
- 缺失率 > 20%:直接剔除该时段。别补了,补出来也是假的。
避坑指南:我曾经在一个项目里,用插值补了30%的缺失数据,结果发电量算出来比实际高了8%。业主拿着报告问我:这多出来的电去哪了?我哑口无言。从那以后,超过20%缺失率的时段,我直接标注「数据不可用」。
| 缺失率 | 处理方法 | 适用场景 |
|---|---|---|
| < 5% | 线性插值 / 前后均值 | 短时通信中断 |
| 5% - 20% | 回归填补 / 同类机组替代 | 单机组传感器故障 |
| > 20% | 剔除该时段 | 长时间停机或采集系统故障 |
数据对齐:时间戳是数据的身份证
数据对齐,听起来简单,做起来全是坑。SCADA系统、测风塔、电表,三个系统的时间戳可能差着好几分钟。你直接合并,那算出来的发电量偏差能让你怀疑人生。
我建议的做法:
- 统一时区:全部转成UTC+8,别混着用。我见过一个项目,SCADA用北京时间,测风塔用UTC,差了8个小时,愣是没发现。
- 统一频率:10分钟数据就全部对齐到整10分钟点。比如10:00、10:10、10:20。用前向填充或后向填充,看你的业务逻辑。
- 时间戳标准化:全部转成datetime格式,别用字符串。字符串比较慢,还容易出错。
# 时间戳标准化示例
def standardize_timestamp(df, time_col):
# 转为datetime格式
df[time_col] = pd.to_datetime(df[time_col])
# 设置时区
df[time_col] = df[time_col].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')
# 对齐到整10分钟
df[time_col] = df[time_col].dt.floor('10min')
return df
小技巧:对齐之后,一定要检查时间戳的连续性。用diff()看看有没有跳点。我习惯画一个时间戳间隔的直方图,一眼就能看出有没有缺失。
知识体系:数据质量处理的完整流程
下面这张图,是我自己总结的数据质量处理流程。每次做项目前,我都会对着它过一遍,确保没有遗漏。
这个流程看起来简单,但每一步都有讲究。异常值检测不是一次性的,我建议做两轮。第一轮粗筛,干掉明显错误。第二轮细筛,用更精细的模型去查。我在内蒙古一个风场就是这么干的,第一轮筛掉3%的数据,第二轮又筛掉1.5%,最后数据质量从82%提升到96%。
记住:数据质量不是越高越好,是够用就好。你花80%的时间去提升最后5%的数据质量,不如把这时间花在模型优化上。性价比,永远是工程师的必修课。
好了,数据质量这块就聊到这儿。下一节咱们聊聊发电量计算的具体方法,到时候会用到今天清洗好的数据。嗯,先把数据洗干净,后面的事就好办了。