【Datawhale AI 夏令营第三期学习笔记Task1】 跑通baseline #Datawhale AI 夏令营

 市场博弈和价格预测   AI夏令营 #Datawhale #夏令营

赛题

简单概括赛题任务:

使用Agent-based model根据历史市场需求、外部环境以及主体基本信息对主体博弈行为进行刻画,预测未来情景下的市场出清价格。

市场博弈是社会科学研究中的重要范畴且对博弈行为的精准预测是比较困难的,它会直接决定市场政策的制定以及效果。

赛题任务

1、预测未来的市场出清价格

2、预测的市场出清价格尽可能的接近现实市场中的出清价格

 赛题数据简介

公开数据包含构造的某电力市场的市场出清价格,市场需求和市场参与者的相关信息。市场出清频率为每15分钟一次,即每15分钟生成一个出清电价。数据集中共包含55000个初晴电价和电力负荷数据。在市场参与者相关参数信息中,包含了构造出的发电机组的ID,机组类型,装机容量,供电煤耗,利用小时数等机组相关技术参数。

  1. electricity price.csv : 每一行代表一个样本;每一列代表一个时间点,每一行代表该时间点对应的出清电价和负荷。
  2. unit.csv : 每一行代表一个机组。其中utilization hour是电厂的年平均运行小时数,power consumption rate指发电厂的利用率,指电厂单位时间内耗电量与发电量的百分比。

 具体步骤 

Step1:报名赛事!(点击即可跳转)

http://赛事链接:http://competition.sais.com.cn/competitionDetail/532232/format

Step2:下载文件

  • 模型训练的代码脚本文件

  • 训练模型所用到的数据集(赛题指定数据集) 

  1. electricity price.csv:电力市场的市场出清价格,市场需求等信息

  2. unit.csv:存放市场供给者(各发电机组)的参数信息

Step3:启动魔搭CPU环境(点击即可跳转)

http://魔搭链接:https://modelscope.cn/my/mynotebook/preset

跑通baseline

 根据task1跑通baseline

注册账号

直接注册魔搭账号和绑定阿里云账号 

Step4:运行baseline代码

  1. 1.上传baseline文件
  1. 新建data/文件夹,将比赛数据集electricity price.csvunit.csv放入data 

新建 data/文件夹后,双击打开并上传数据集文件

然后回到前面baseline所在目录(点击文件夹图标即可)

点击全部运行cell 

代码运行

步骤一:安装第三方库

有两种方法 

  1. 你可以选择本地已经配置好的的conda环境,或者创建新的虚拟环境来安装

conda env list # 查看已有环境

conda create -n abm python=3.9 # 创建新的环境

conda activate abm # 激活环境

pip install numpy pandas scikit-learn matplotlib seaborn # 安装第三方库

     2.直接安装第三方库

pip install numpy pandas scikit-learn matplotlib seaborn

步骤二:下面进入baseline代码 

import numpy as np
import pandas as pd
from pathlib import Path
from sklearn.linear_model import LinearRegression

base_path = Path("data")  # 确保数据都放在同级的data目录下
# 读取市场数据
electricity_price = pd.read_csv(base_path / "electricity price.csv")
# 读取市场主体(各发电机组)数据
unit = pd.read_csv(base_path / "unit.csv")

"""
准备示例提交数据sample_submit
1. electricity_price["clearing price (CNY/MWh)"].isna()找到出清价格为缺失值的行,即要预测的目标
2. 去除demand列,符合最后的提交格式 
"""

sample_submit = electricity_price[electricity_price["clearing price (CNY/MWh)"].isna()].drop(columns="demand")
sample_submit.to_csv(base_path / "sample_submit.csv", index=False)

# 将day和time列合并成timestamp列,便于提取时间戳特征
electricity_price["timestamp"] = pd.to_datetime(
    electricity_price["day"] + " " + electricity_price["time"].str.replace("24:00:00", "00:00"))

# 处理24:00:00的情况,即表示第二天的00:00:00
mask = electricity_price['timestamp'].dt.time == pd.Timestamp('00:00:00').time()

# 需要将这些行的日期部分加一天
electricity_price.loc[mask, 'timestamp'] += pd.Timedelta(days=1)

# 设置列的顺序,同时去除day和time列
electricity_price = electricity_price[["timestamp", "demand", "clearing price (CNY/MWh)"]]

市场数据,这里包含约55000个出清电价和电力负荷数据,市场每15分钟生成一次出清电价

  1. timestamp:时间戳
  2. demand:区域内电力总负荷(总需求),单位为MW
  3. clearing price (CNY/MWh):市场出清电价,单位为元/MW·h。其中MW为功率单位,MW·h为能量单位,表示1MW的电器运行一小时产生的能量(例如1度电就是1KW·h) 
electricity_price.head()  # 显示前5行数据

 

机组数据包含549个不同的火电机组

  1. unit ID:每个机组唯一的ID
  2. Capacity(MW):机组的额定容量(额定功率),越高机组的发电能力越强
  3. utilization hour (h) :电厂的年平均运行小时数,需要注意多个机组可能共同属于一个电厂,有相同的utilization hour (h)
  4. coal consumption (g coal/KWh):每发一度电需要耗费多少煤炭,为成本参数
  5. power consumption rate:电厂单位时间内耗电量与发电量的百分比,例如单位时间耗电量为500度电,发电量为10000度电,利用率就是500/10000=5%。

 

sorted_unit = unit.sort_values("coal consumption (g coal/KWh)")  # 按照一度电的耗煤量(近似为边际成本)降序排序
sorted_unit.head()

# 预先计算 sorted_unit 的累积和
sorted_unit['cumulative_capacity'] = sorted_unit['Capacity(MW)'].cumsum()

prices = []

# 找到最后一个满足总需求的机组报价
for demand in electricity_price["demand"]:
    price = sorted_unit[sorted_unit['cumulative_capacity'] >= demand]["coal consumption (g coal/KWh)"].iloc[0]
    prices.append(price)

print(len(prices))
prices[:5]

 

model = LinearRegression()
# 55392为训练集的长度
train_length = 55392
prices = np.array(prices).reshape(-1, 1)
X = prices[:train_length]
y = electricity_price["clearing price (CNY/MWh)"].iloc[:train_length].values.reshape(-1, 1)
model.fit(X, y) //可以看出我们的拟合方程式是:P=11.26*N-2763.16,其中N为耗煤量,P为机组报价 

model.coef_, model.intercept_    //使用边际成本定价的机组报价为出清价格估计

y_pred = model.predict(prices[train_length:])
y_pred = y_pred.flatten()  # 2维矩阵转为1维
y_pred[:5]

 

sample_submit.to_csv("submit.csv", index=False)

步骤三 :保存结果为submit.csv 并提交至官网 

转换成功后就可以提交官网:

http://competition.sais.com.cn/competitionDetail/532232/mySubmissions

知识点 

  1. ABM 

ABM(Agent-Based Modeling),即基于个体的建模,是一种模拟系统复杂行为的工具。它通过模拟个体(代理)的行为和相互作用,来研究系统整体的动态变化

ABM有很多应用案例,例如康威的生命游戏(Game of Life),新冠传染病传播模型、政府企业博弈模型、鸟群模型……

你会发现这和DW数学建模教程中的微分方程和动力系统如此相似,事实上二者一脉相承,不过ABM不关注复杂的数学,只关注如何用简单的交互规则模拟复杂系统。

例如在模拟两种生物种群相互作用的捕食者-被捕食者(Predator-Prey)模型中,数学建模用洛特卡-沃尔泰拉(Lotka-Volterra)方程来描述作用关系,并用数值方法解微分方程观察结果:

  • 被捕食者种群变化率:$$\frac{dN}{dt} = rN - aNP$$,被捕食者种群的增长率来自自身的自然增长(rN)和捕食者捕食造成的减少(aNP)

  • 捕食者种群变化率:$$\frac{dP}{dt} = baNP - mP$$,捕食者种群的增长率来自捕食被捕食者获得的增长(baNP)和自身的自然死亡(mP)

但现实中,并不是所有模型都能用方程表示,尤其在交互更加复杂,参数逐渐增多的时候。因此ABM提供了一个更简单的方案——从简单的个体交互规则涌现系统的复杂性。在ABM中,实现相似的模拟结果,只需要三个规则:

  • 每个智能体有初始的能量,移动会消耗能量,进食会增加能量

  • 当能量过低,智能体死亡;当能量足够高,智能体会繁育

  • 如果移动后遇到食物(对于羊来说是青草,捕食者来说是羊),则吃下它

总结来说,一个典型的ABM模型由以下几个部分组成:

  • 代理(Agent):系统中的基本个体,每个代理都有自己的属性和行为规则。

  • 环境(Environment):代理活动的空间或网络,可能影响代理的行为。

  • 交互规则(Interaction Rules):代理之间、代理与环境之间的相互作用规则。

  • 时间步(Time Steps):系统按离散的时间步推进,模拟出系统的动态变化过程。

定义了这些规则后,我们就可以开始模拟,并从模拟中发现ABM的核心“涌现现象”,即个体的行为涌现出了总体的变化。

        2.市场出清价格(Market Cleaning Price)如何形成 

电力市场的出清价格形成类似证券市场早上9:15-9:25的集合竞价,由于赛题只提供了总需求,我们可以认为需求曲线是一条直线。

出清价格的形成步骤如下:

  1. 所有发电机组申报自己卖出的电价和电量

  2. 市场根据机组报价,从低到高排序,依次从低价开始成交

  3. 当成交的容量和大于等于总需求时,达到市场出清(供需平衡),这时候最后一个达成交易的机组报价为市场出清价格

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值