第二届世界科学智能大赛社会科学赛道:市场博弈和价格预测 # Datawhale AI 夏令营 # task1

       这是Datawhale2024暑期夏令营的第三期,该期夏令营同样依托于AI竞赛,DW选择了由上海科学智能研究院、复旦大学联合阿里云在上智院·天池平台发布的“第二届世界科学智能大赛”。(竞赛官网网站为:上海科学智能研究院 (sais.com.cn)

       一共分了五个赛道,分别是:


        在社会科学赛道中(市场博弈和价格预测),赛题背景为“电力现货市场”(可以类比证券交易市场),泛指短时间内的电能量交易市场。基于市场出清机制,预测电力市场的市场出清价格。并且主办方提出希望参赛成员使用ABM模型建模方法。最终成绩评价指标为MSE(均方误差)和RMSE(均方根误差)的均值。

        大赛提供了两个文件:electricity price.csv和unit.csv。其中electricity price数据为电力市场的市场出清价格。unit.csv数据为市场供给者(各发电机组)的参数信息。目的是通过已提供的市场出清价格(训练集,范围为2021年12月1日到2023年6月30日)来预测之后的市场出清价格(测试集,范围2023年7月1日到2024年4月18日)。


1. 代码分析(DW提供baseline)

        接下来,浅析一下DW在task1中为我们提供的baseline。我将省略环境配置和导入库等基础部分。

1.1 数据预处理

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 = 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)"]]

Step1:首先先读取文件中的数据,将electricity price.csv中的数据保存在electricity price中,将unit.csv中的数据保存在unit中。

Step2:将electricity price缺失出清价格的部分提取出来,保存在sample_submit中,并且删除demand整列。

Step3:将electricity price中的“day”和“time”两列合并,并将“24:00:00”替换为“00:00”。

Step4:比较electricity price中timestamp这一列中哪些数据正好是“00:00:00”,将布尔值保存在mask中,这里的mask为布尔索引。

Step5:将布尔值为Ture的部分的日期加一天,也就是说这两步的意思是将7月25日24:00

变成7月26日00:00。为了之后数据处理的连贯性。

Step6:设置列的顺序,同时去除day和time列。

1.2 找到市场出清状态(依据边际成本定价方法遍历电力需求)

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]

Step1:按照每一度电的耗煤量(coal consumption)升序排序,这里假设机组报价和发电成本正相关,即是按照边际成本定价策略,不考虑市场信息和其他机组信息等因素。

Step2:按照边际成本升序排序后,再计算包含从第一行到当前行“Capacity(MW)”列值的累积总和,保存在新列“cumulative_capacity”中。

Step3:遍历electricity price中的电力需求(demand),找到第一个累积容量大于等于当前需求的发电单元(即达到了市场出清状态),并获取它相应的煤炭消耗量。

Step4:将煤炭消耗量添加到列表prices中。

1.3 转换煤炭消耗量为机组报价(建立关系)

        在上一步骤中,我们按照边际成本定价法假设机组报价和煤炭消耗量成正相关,并找到了达到市场出清状态对应的煤炭消耗量,但是我们不知道对应的报价是多少(即市场出清价格)。所以这一步我们需要建立耗煤量和报价的关系。

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)

model.coef_, model.intercept_

Step1:创建一个线性回归模型实例model。

Step2:将prices列表(耗煤量)转换为二维数组。

Step3:提取二维数组prices的前55392个元素(训练集部分)赋给x,提取electricity price的出清价格这一列的前55392个元素(训练集部分)赋给y。

Step4:根据提供的特征数据 x 和目标数据 y 来训练机器学习模型。

Step5:获取线性回归模型的斜率和截距。

1.4 使用训练好的关系预测报价

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

Step1:使用训练好的线性回归模型model对55392个元素之后的部分(测试集部分)进行预测。

Step2:将预测结果拍平成一维数组。(为了后续输出结果)。

1.5 保存结果(出清价格)

sample_submit["clearing price (CNY/MWh)"] = y_pred

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

2. 思路总结

        在上述部分,我们已经将代码分析的很透彻了。在这里我将使用思维导图形式,对代码思路进行进一步的总结和归纳。

3. 存在问题 

        baseline存在的主要问题DW的学习手册也点明了,就是实际电力市场并不是按照边际成本报价的,实际的市场会考虑到很多方面的问题,导致和边际成本的定价方式相差较大。这样粗暴地按照成本价排序,会导致结果存在较大偏差。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值