Datawhale AI夏令营 社会科学赛道 时间序列挖掘+ABM构建模型

时间序列挖掘

绘制一日内出清价格与时间散点图

在这里插入图片描述
由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,可以看出二者有较高的线性相关性,可直接尝试回归,作为上分方向
在这里插入图片描述

总结与启示

  • 不同月份/小时下的出清价格受市场竞争影响较大
  • 回顾对数据做出的挖掘,可学习到一些时间序列挖掘的方法和步骤
    • 绘制出清价格在一日内的变化趋势
    • 绘制总负荷和出清价格分布,出清价格存在负电价和高电价,之后进行进一步分析
    • 按小时/月分析总负荷和电价,并分析原因
    • 分析负电价和高电价按小时/月分布的频数,并分析原因
  • 通过时间序列挖掘,对电价随时间/季节的变化有了进一步的认识,这种影响可统一用天气作为衡量指标,气温高有太阳,电价会下降,可获取天气信息作为特征进行预测
  • 因为对绘图库不太熟悉,所以此次学习着重在理解分析的逻辑,并未对代码进行逐行阅读,但之后如有需要进行相似的分析,会借鉴这次的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值