时序数据介绍
1 课程概览
本课介绍时间序列预测。以南方电网电力负荷预测为案例,讲解时序数据的概念、特点和应用价值。
2 核心概念与定义
- 时间序列预测:基于历史时间序列数据预测未来的方法。
- 时序数据:一维的,只有时间,有方向(基于历史预测未来)。
- 电力负荷:类似于功率,变量。
- 前因:历史数据,知道得越多预测越准。
- 阶梯电价:用电低谷时电价便宜。
3 算法与模型详解
3.1 案例背景
案例:南方电网电力负荷预测
目的:基于历史用电量数据预测未来用电量
社会价值:
- 精确预测用电量,节约资源
- 避免发电过剩造成的浪费
- 优化储能和损耗
3.2 电力生产现状
发电方式:
- 风电(受风力影响)
- 光电(受天气影响)
- 核电
- 新能源
- 火电(起调和作用)
问题:
- 新能源发电受天气影响大
- 风大风机不转,风小也转不动
- 阴天影响光电
3.3 阶梯电价
阶梯电价:
- 大半夜用电便宜
- 原因:用电低谷,发电过剩
- 一部分用掉,一部分储能,一部分浪费
工业应用:
- 工厂大半夜开工
- 因为电价便宜
- 烟囱半夜冒白烟
3.4 时序数据特点
特点:
- 一维的,只有时间
- 有方向:基于历史预测未来
- 未来之所以预测不准,是因为前因知道得不够多
数据字段:
- time:时间
- power_load:电力负荷
3.5 时序预测思路
思路:
- 基于历史数据预测未来
- 前因(历史数据)越多,预测越准
- 需要特征工程生成更多字段
4 代码示例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1. 模拟时序数据
print("=== 1. 模拟时序数据 ===")
np.random.seed(42)
# 生成24小时的电力负荷数据
dates = pd.date_range('2024-01-01', periods=24, freq='h')
power_load = []
for hour in range(24):
# 模拟电力负荷(有规律)
if 0 <= hour < 6: # 凌晨低谷
load = np.random.normal(500, 50)
elif 6 <= hour < 9: # 早晨上升
load = np.random.normal(800, 80)
elif 9 <= hour < 17: # 白天平稳
load = np.random.normal(1000, 100)
elif 17 <= hour < 21: # 晚高峰
load = np.random.normal(1200, 120)
else: # 夜晚下降
load = np.random.normal(700, 70)
power_load.append(max(100, load))
data = pd.DataFrame({
'time': dates,
'power_load': power_load
})
print(f"数据形状: {data.shape}")
print(data.head(10))
# 2. 时序数据特点
print("\n=== 2. 时序数据特点 ===")
print(f"时间范围: {data['time'].min()} ~ {data['time'].max()}")
print(f"电力负荷范围: {data['power_load'].min():.2f} ~ {data['power_load'].max():.2f}")
print(f"平均负荷: {data['power_load'].mean():.2f}")
# 3. 可视化时序数据
print("\n=== 3. 可视化时序数据 ===")
plt.figure(figsize=(12, 6))
plt.plot(data['time'], data['power_load'], 'b-o', linewidth=2, markersize=6)
plt.xlabel('时间')
plt.ylabel('电力负荷')
plt.title('24小时电力负荷时序数据')
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('time_series_data.png', dpi=100)
print("时序数据图已保存")
# 4. 时序数据特征
print("\n=== 4. 时序数据特征 ===")
def extract_time_features(data):
"""提取时间特征"""
data = data.copy()
data['hour'] = data['time'].dt.hour
data['day'] = data['time'].dt.day
data['month'] = data['time'].dt.month
data['dayofweek'] = data['time'].dt.dayofweek
data['is_weekend'] = data['dayofweek'].isin([5, 6]).astype(int)
return data
data_with_features = extract_time_features(data)
print(data_with_features.head())
# 5. 生成多天数据
print("\n=== 5. 生成多天数据 ===")
np.random.seed(42)
# 生成7天数据
dates_7days = pd.date_range('2024-01-01', periods=7*24, freq='h')
power_load_7days = []
for i, date in enumerate(dates_7days):
hour = date.hour
dayofweek = date.dayofweek
# 基础负荷
if 0 <= hour < 6:
base_load = 500
elif 6 <= hour < 9:
base_load = 800
elif 9 <= hour < 17:
base_load = 1000
elif 17 <= hour < 21:
base_load = 1200
else:
base_load = 700
# 周末调整
if dayofweek >= 5: # 周末
base_load *= 0.8
# 添加噪声
load = base_load + np.random.normal(0, 50)
power_load_7days.append(max(100, load))
data_7days = pd.DataFrame({
'time': dates_7days,
'power_load': power_load_7days
})
print(f"7天数据形状: {data_7days.shape}")
# 可视化7天数据
plt.figure(figsize=(14, 6))
plt.plot(data_7days['time'], data_7days['power_load'], 'b-', linewidth=1)
plt.xlabel('时间')
plt.ylabel('电力负荷')
plt.title('7天电力负荷时序数据')
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('time_series_7days.png', dpi=100)
print("7天数据图已保存")
# 6. 时序预测思路
print("\n=== 6. 时序预测思路 ===")
print("""
时序预测思路:
1. 收集历史数据(前因)
2. 特征工程(生成更多字段)
3. 模型训练
4. 预测未来
特点:
- 时序数据是一维的,只有时间
- 有方向:基于历史预测未来
- 前因知道得越多,预测越准
""")
# 7. 数据字段说明
print("\n=== 7. 数据字段说明 ===")
print("""
原始数据字段:
- time: 时间
- power_load: 电力负荷
特征工程生成字段:
- hour: 小时
- day: 日
- month: 月
- dayofweek: 星期几
- is_weekend: 是否周末
""")
# 8. 完整流程
def time_series_intro():
"""时序数据介绍完整流程"""
print("=" * 50)
print("时序数据介绍")
print("=" * 50)
print("\n1. 案例背景")
print(" 南方电网电力负荷预测")
print(" 基于历史用电量预测未来用电量")
print("\n2. 社会价值")
print(" 精确预测,节约资源")
print(" 避免发电过剩浪费")
print("\n3. 时序数据特点")
print(" 一维的,只有时间")
print(" 有方向:基于历史预测未来")
print("\n4. 数据字段")
print(" time: 时间")
print(" power_load: 电力负荷")
print("\n" + "=" * 50)
print("介绍完成!")
print("=" * 50)
time_series_intro()
输出示例:
=== 1. 模拟时序数据 ===
数据形状: (24, 2)
time power_load
0 2024-01-01 00:00:00 524.5678
1 2024-01-01 01:00:00 489.1234
...
=== 2. 时序数据特点 ===
时间范围: 2024-01-01 00:00:00 ~ 2024-01-01 23:00:00
电力负荷范围: 423.45 ~ 1234.56
平均负荷: 856.78
=== 4. 时序数据特征 ===
time power_load hour day month dayofweek is_weekend
0 2024-01-01 00:00:00 524.5678 0 1 1 0 0
...
5 重难点与易错提醒
- ❗重点:时序数据是一维的,只有时间。
- ❗重点:时序数据有方向,基于历史预测未来。
- ❗重点:前因知道得越多,预测越准。
- ❗重点:电力负荷预测有巨大社会价值。
- ⚠️易错:混淆时序数据和普通数据。
- ⚠️易错:忘记时序数据的方向性。
- 💡深入理解:时序预测的核心是利用历史数据预测未来。
6 课堂问答精选
Q: 什么是时间序列预测?
A: 时间序列预测是一种基于历史时间序列数据来预测未来的方法。
特点:
- 时序数据是一维的,只有时间
- 有方向:基于历史预测未来
- 前因知道得越多,预测越准
Q: 为什么要做电力负荷预测?
A: 电力负荷预测的社会价值:
- 精确预测用电量,节约资源
- 避免发电过剩造成的浪费
- 优化储能和损耗
- 制定阶梯电价策略
7 本课小结
- 案例:南方电网电力负荷预测。
- 目的:基于历史预测未来用电量。
- 时序数据:一维,有方向。
- 字段:time、power_load。
- 价值:节约资源,避免浪费。
8 延伸思考与实践
- 实践:运行时序数据示例。
- 预习:时序数据分类。
- 思考:如何提高时序预测的准确性?