时间序列挖掘
绘制一日内出清价格与时间散点图
由Task1知中国电力现货市场15分钟结算一次,一天共96个交易点,但由散点图可知出清价格在一小时中是保持不变的,即1天有24个交易点。
该结论也可直接查看数据集得出:
electricity_price.head(12)
出清价格在一小时中是保持不变的,但需求会在一小时内有变化。
查看出清价格和总负荷的分布
使用Seaborn库绘制分布图
# 使用 Seaborn 库绘制总负荷数值的分布图
# sns.displot(...) 函数用于绘制数据的分布图
ax = sns.displot(
electricity_price, # 输入数据,包含绘制所需的列
x="demand", # 指定绘图的列,这里是 "demand" 列
aspect=1.5, # 图形的宽高比,1.5 表示宽度是高度的 1.5 倍
height=5, # 图形的高度设置为 5 英寸
kde=True # 启用核密度估计(KDE),用于绘制数据的平滑概率密度曲线
)
# 设置图形的标题
ax.set(title="总负荷数值分布")
可以看出总负荷近似成正态分布
ax=sns.displot(electricity_price,x="price",aspect=1.5,height=5,kde=True);
ax.set(title="出清价格数值分布")
可以看出出清价格中有大量异常负价格,可猜测是受光伏发电的竞争影响。
Task2文档中指出:1-100之间的低价格较多,表明这些时候火电有一定的异常高价(800以上),不知此处是否有错误,因为由分布可看出价格主要分布在300-500,而不是1-100。
分时统计总负荷和电价
分析不同年份下,一天不同小时的总负荷和电价
# 从 DataFrame 的索引中提取时间信息,并添加为新的列
# 假设索引为 DatetimeIndex 类型
# 提取小时信息,并创建一个新列 "hour"
electricity_price["hour"] = electricity_price.index.hour
# 提取月份信息,并创建一个新列 "month"
electricity_price["month"] = electricity_price.index.month
# 提取日期信息,并创建一个新列 "day"
electricity_price["day"] = electricity_price.index.day
# 提取星期几的信息(0 = 周一, 6 = 周日),并创建一个新列 "weekday"
electricity_price["weekday"] = electricity_price.index.weekday
# 提取年份信息,并创建一个新列 "year"
electricity_price["year"] = electricity_price.index.year
# 创建一个包含两个子图的绘图区域,图形大小为 20x9 英寸,并启用约束布局
fig, ax = plt.subplots(
1, # 子图的行数为 1
2, # 子图的列数为 2
figsize=(20, 9), # 设置整个图形的大小为 20x9 英寸
constrained_layout=True # 启用约束布局以自动调整子图位置和大小
)
# 绘制不同年份的分时电价线图
sns.lineplot(
electricity_price.groupby(["hour", "year"])["price"].mean().reset_index(), # 按小时和年份分组,计算每组的平均电价,并重置索引
x="hour", # x 轴数据为小时
y="price", # y 轴数据为平均电价
ax=ax[0], # 将图绘制到第一个子图 (ax[0])
marker="o", # 数据点标记为圆圈
hue="year", # 根据年份不同设置不同的颜色
palette="Set1" # 使用 "Set1" 调色板
)
ax[0].set_title("不同年份的分时电价") # 设置第一个子图的标题
ax[0].set_xticks(range(24)) # 设置 x 轴刻度为 0 到 23(小时范围)
# 绘制不同年份的分时总负荷线图
sns.lineplot(
electricity_price.groupby(["hour", "year"])["demand"].mean().reset_index(), # 按小时和年份分组,计算每组的平均总负荷,并重置索引
x="hour", # x 轴数据为小时
y="demand", # y 轴数据为平均总负荷
ax=ax[1], # 将图绘制到第二个子图 (ax[1])
marker="o", # 数据点标记为圆圈
hue="year", # 根据年份不同设置不同的颜色
palette="Set1" # 使用 "Set1" 调色板
)
ax[1].set_title("不同年份的分时总负荷") # 设置第二个子图的标题
ax[1].set_xticks(range(24)); # 设置 x 轴刻度为 0 到 23(小时范围)
此处的曲线表现为鸭子曲线,即两高峰,一低谷,原因为火电和光伏发电互为替代品,当一天太阳出来后,太阳能逐渐开始替代火电,形成低谷,傍晚太阳落山,火电需求上升,价格上升。
可以得出:
- 考虑光伏发电对预测价格意义重大,而光伏受天气、季节影响,故而应考虑天气数据
- 随着新能源发展,光伏会在更大程度上代替火电,可猜测2024年火电价格会下降,可分析逐年火电价格的变化趋势来对2024年的整体趋势做出预测。
下面采用透视图分析不同月份电价变化趋势,可将数据进行汇总。
# 创建一个透视表,计算不同月份和时间下的电价
pivot = pd.pivot_table(
electricity_price, # 输入的 DataFrame
values="price", # 透视表中要填充的值,这里是 "price"
index="month", # 设置行索引为月份
columns="hour" # 设置列索引为小时
)
# 将透视表中的数据类型转换为整数
pivot = pivot.astype(int)
pivot
用热力图表示透视表,更直观
# 创建一个图形,大小为 17x10 英寸
plt.figure(figsize=(17, 10))
# 绘制热图,显示不同月份和时间下的电价
sns.heatmap(
pivot, # 透视表数据
cmap="coolwarm", # 使用 "coolwarm" 调色板,显示热图的颜色
linewidths=0.5, # 设置单元格之间的分隔线宽度为 0.5
annot=True, # 启用单元格值的注释
fmt=".0f", # 注释的格式为整数
annot_kws={"size": 12, # 注释文本的大小设置为 12
"weight": "bold", # 注释文本的字体加粗
"color": "black"} # 注释文本的颜色为黑色
)
# 设置图形的标题
plt.title("不同月份和时间下的电价")
- 沿横轴从左至右观察,即按照小时,总体仍呈现两高峰,一低谷的趋势
- 沿纵轴从上至下观察,即按照月份可得:
- 从1月到到5月,出清电价峰谷不断扩大,价格持续走低
- 6-8月出清电价开始回升,并在8月达到顶峰
- 9-12月出清电价开始迅速下降,但在11-12月略有回暖
- 月份特征通过热力图呈现不够明显,尝试画成折线图观察一下
负电价与高电价
负电价
分别绘制出负电价按小时分布与按月分布的频数图
8到15时容易出现负电价,可知是由于光伏发电竞争影响
春夏季容易出现负电价,也是收到光伏发电的冲击
通过按负电价出现频数排序,可以发现最典型的一次集中的负电价发生在2022年的五一假期中,连续出现了7次的负电价。
实现:统计负电价出现最多的日期
(
# 选择不满足 minus_mask 条件的数据
electricity_price[minus_mask]
# 按月份和日期分组,计算每个组合的记录数量
.groupby(["month", "day"])["price"]
.size() # 计算每个分组的大小(即每个分组的记录数)
.reset_index() # 重置索引,使 groupby 结果成为 DataFrame,并保留分组字段为列
.sort_values("price", # 按 "price" 列排序
ascending=False) # 降序排序
.head(15) # 选择排序后的前 15 行
)
可以看出,排名前四的日期均发生在五一假期,可猜测负电价与假期有关
疑问:
- 4月也有三日负电价频数高,和5月1日与5月6日相似,此处应如何解释
- 经过探查,春节假期集中出现负电价,但是否所有假期都是如此呢,十一假期呢
小测试:尝试画出2023年春节放假期间,1月21日-1月27日中的电价波动,并对比2023年的1月28日-2月6日电价情况,这是否更加证明假期特征的重要性?
2023年春节假期容易出现负电价,更能印证春节假期间容易出现负电价,但不一定能印证假期特征的重要性
高电价
疑问:查看原代码,是以电价绘图,此处图片的标题是否应是电价,而不是电量?
高电价出现频数小时分布
- 日落后光伏发电下降,火电价格上升
高电价出现频数月分布
- 可看出8月份高电价出现频数最高,通过分析2022年8月3日-8月6日的电价与总需求,可以发现其在总需求上并不突出,甚至比后续日期中总需求更高的时间段价格还高,表明其受到了外部因素的影响
疑问:这种几日内的电价的提高是否有探究价值,如何根据这样的变化影响之后的预测,此外,这种外部因素会是什么呢?可以看其他年份这几日是否有这样的趋势,如果有的话会对2024年这几日电价的预测有帮助。
双变量分析
可分析各变量与价格的相关关系
在本案例中,demand和price的相关系数为0.34,可以看出二者有较高的线性相关性,可直接尝试回归,作为上分方向
总结与启示
- 不同月份/小时下的出清价格受市场竞争影响较大
- 回顾对数据做出的挖掘,可学习到一些时间序列挖掘的方法和步骤
- 绘制出清价格在一日内的变化趋势
- 绘制总负荷和出清价格分布,出清价格存在负电价和高电价,之后进行进一步分析
- 按小时/月分析总负荷和电价,并分析原因
- 分析负电价和高电价按小时/月分布的频数,并分析原因
- 通过时间序列挖掘,对电价随时间/季节的变化有了进一步的认识,这种影响可统一用天气作为衡量指标,气温高有太阳,电价会下降,可获取天气信息作为特征进行预测
- 因为对绘图库不太熟悉,所以此次学习着重在理解分析的逻辑,并未对代码进行逐行阅读,但之后如有需要进行相似的分析,会借鉴这次的代码