数据获取与探索性分析:公开数据集介绍与实战

做负荷预测,第一步不是调模型,而是搞懂数据。我见过太多人一上来就扔进LSTM,结果跑出来一团糟。说白了,数据质量决定了模型的天花板。

这一章,咱们就聊聊怎么拿到靠谱的数据,以及拿到手后怎么“盘”它。我个人习惯,花在数据探索上的时间,至少占整个项目周期的30%。别嫌多,这钱花得值。

公开数据集:GEFCom2014 到底是个啥?

做负荷预测,GEFCom2014 几乎是绕不开的标杆数据集。这是2014年全球能源预测竞赛发布的数据,包含了电力负荷、温度、湿度等信息。

我当年第一次接触这个数据集,差点被它的格式搞晕。它其实分成了几个部分:

  • 负荷数据:每小时的电力负荷值,单位是MW。时间跨度从2004年到2008年。
  • 气象数据:对应时间点的温度、露点等。注意,有些站点数据是缺失的。
  • 区域信息:数据来自不同的区域(Zone),每个区域的用电模式不太一样。

为什么要用这个数据集?因为它真实。我在项目中遇到过,有些公开数据太“干净”了,反而失去了实战意义。GEFCom2014 里就有缺失值、异常点,这才是真实世界的味道。

核心要点:GEFCom2014 的数据是小时级别的,适合做短期负荷预测。如果你要做超短期(15分钟级),可能需要自己重新采样。

数据加载:别用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,波动不小。这些数字背后,其实已经暗示了模型的难度。

小技巧:如果发现标准差特别大,可以考虑对数据进行标准化或归一化处理。我一般用 MinMaxScaler,把数据缩放到0-1之间。

可视化趋势与季节性:一张图胜过千言万语

统计量只能给你一个模糊的印象。真正要理解数据,还得靠可视化。

我通常会画三张图:

  1. 整体趋势图:看负荷随时间的变化趋势
  2. 季节性分解图:看年、周、日三个周期的规律
  3. 箱线图:看不同季节/月份的分布差异

先来个简单的趋势图:

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 数据集 负荷 + 气象数据 小时级别采样 数据加载 pandas.read_csv() parse_dates 参数 检查缺失值 基本统计量 均值 / 标准差 最小值 / 最大值 分位数分析 可视化分析 整体趋势图 季节性分解 箱线图 模式识别 年周期性 周周期性 日周期性

这张图把本章的核心逻辑串起来了。从数据获取开始,到加载、统计、可视化,最后识别出数据中的模式。每一步都有它的价值,缺一不可。

实战中的避坑指南

最后,分享几个我踩过的坑:

  • 时间索引要唯一:GEFCom2014 的数据里,有时候会有重复的时间戳。如果不处理,后面画图时会出现重叠。我一般用 drop_duplicates() 清理一下。
  • 注意时区问题:数据里的时间是什么时区?如果是UTC,需要转换成当地时间。我曾经因为时区没转换,导致预测结果偏差了整整一个小时。
  • 别只看平均值:平均值会掩盖很多细节。比如某天负荷整体不高,但下午突然有个尖峰。只看均值你根本发现不了这个问题。
我的习惯:每次拿到新数据,我都会先画一张“数据质量报告”,包含缺失值分布、异常值检测、时间连续性检查。这张报告会伴随整个项目周期,随时回来查看。

好了,数据探索这部分就聊到这儿。记住一句话:你对数据了解得越深,模型就越听话。别急着调参,先把数据摸透了再说。

专注资料整理