数据获取与探索性分析:公开数据集介绍与实战
做负荷预测,第一步不是调模型,而是搞懂数据。我见过太多人一上来就扔进LSTM,结果跑出来一团糟。说白了,数据质量决定了模型的天花板。
这一章,咱们就聊聊怎么拿到靠谱的数据,以及拿到手后怎么“盘”它。我个人习惯,花在数据探索上的时间,至少占整个项目周期的30%。别嫌多,这钱花得值。
公开数据集:GEFCom2014 到底是个啥?
做负荷预测,GEFCom2014 几乎是绕不开的标杆数据集。这是2014年全球能源预测竞赛发布的数据,包含了电力负荷、温度、湿度等信息。
我当年第一次接触这个数据集,差点被它的格式搞晕。它其实分成了几个部分:
- 负荷数据:每小时的电力负荷值,单位是MW。时间跨度从2004年到2008年。
- 气象数据:对应时间点的温度、露点等。注意,有些站点数据是缺失的。
- 区域信息:数据来自不同的区域(Zone),每个区域的用电模式不太一样。
为什么要用这个数据集?因为它真实。我在项目中遇到过,有些公开数据太“干净”了,反而失去了实战意义。GEFCom2014 里就有缺失值、异常点,这才是真实世界的味道。
数据加载:别用Excel硬扛
拿到数据后,第一件事就是加载。我个人强烈建议用 Python 的 pandas 库。为什么?因为快,而且处理时间序列很方便。
来看看代码怎么写:
import pandas as pd
# 加载负荷数据
load_data = pd.read_csv('GEFCom2014/Load.csv', parse_dates=['datetime'], index_col='datetime')
# 看一眼数据长什么样
print(load_data.head())
# 检查数据维度
print(f'数据形状: {load_data.shape}')
嗯,这里要注意一点。很多新手加载数据时,忘了设置 parse_dates 参数。结果时间列变成了字符串,后面做时间序列分析时各种报错。我曾经因为这个bug排查了整整一下午,后来发现就是少了个参数。
加载完数据,我习惯先看看数据的基本信息:
# 查看数据基本信息
print(load_data.info())
# 检查缺失值
print(load_data.isnull().sum())
你想想看,如果缺失值太多,后面模型训练时就会出问题。所以这一步不能省。
基本统计量:数字会说话
数据加载完了,别急着画图。先算算基本统计量,心里有个底。
我一般会看这几个指标:
- 均值(Mean):整体负荷水平
- 标准差(Std):负荷波动程度
- 最小值/最大值:极端情况
- 分位数(25%/50%/75%):数据分布情况
用 pandas 一行代码就能搞定:
# 描述性统计
print(load_data.describe())
输出结果大概长这样:
| 统计量 | 负荷值 (MW) |
|---|---|
| count | 35064 |
| mean | 1523.45 |
| std | 456.78 |
| min | 512.30 |
| 25% | 1189.20 |
| 50% | 1487.60 |
| 75% | 1823.40 |
| max | 2896.10 |
看到这个表格,你能读出什么信息?均值1523,但最大值接近2900,说明存在明显的尖峰负荷。标准差456,波动不小。这些数字背后,其实已经暗示了模型的难度。
可视化趋势与季节性:一张图胜过千言万语
统计量只能给你一个模糊的印象。真正要理解数据,还得靠可视化。
我通常会画三张图:
- 整体趋势图:看负荷随时间的变化趋势
- 季节性分解图:看年、周、日三个周期的规律
- 箱线图:看不同季节/月份的分布差异
先来个简单的趋势图:
import matplotlib.pyplot as plt
# 画整体趋势
plt.figure(figsize=(15, 5))
plt.plot(load_data.index, load_data['load'], linewidth=0.5, color='blue')
plt.title('电力负荷整体趋势 (2004-2008)')
plt.xlabel('时间')
plt.ylabel('负荷 (MW)')
plt.grid(True, alpha=0.3)
plt.show()
画出来你会看到什么?每年都有明显的周期性波动。夏天和冬天负荷高,春秋季相对低。这就是季节性。
再看看更细粒度的模式:
# 取一周的数据看看
weekly_data = load_data['2006-07-01':'2006-07-07']
plt.figure(figsize=(12, 4))
plt.plot(weekly_data.index, weekly_data['load'], marker='o', linestyle='-')
plt.title('一周负荷变化 (2006年7月)')
plt.xlabel('时间')
plt.ylabel('负荷 (MW)')
plt.grid(True, alpha=0.3)
plt.show()
你会发现,工作日的负荷明显高于周末。每天也有两个高峰:上午10点左右和晚上7点左右。这就是日周期性。
linewidth=0.5 让线条细一点,否则看起来就是一团黑。
知识体系:一张图看懂本章核心
说了这么多,咱们用一张图来总结一下本章的知识结构:
这张图把本章的核心逻辑串起来了。从数据获取开始,到加载、统计、可视化,最后识别出数据中的模式。每一步都有它的价值,缺一不可。
实战中的避坑指南
最后,分享几个我踩过的坑:
- 时间索引要唯一:GEFCom2014 的数据里,有时候会有重复的时间戳。如果不处理,后面画图时会出现重叠。我一般用
drop_duplicates()清理一下。 - 注意时区问题:数据里的时间是什么时区?如果是UTC,需要转换成当地时间。我曾经因为时区没转换,导致预测结果偏差了整整一个小时。
- 别只看平均值:平均值会掩盖很多细节。比如某天负荷整体不高,但下午突然有个尖峰。只看均值你根本发现不了这个问题。
好了,数据探索这部分就聊到这儿。记住一句话:你对数据了解得越深,模型就越听话。别急着调参,先把数据摸透了再说。