Datawhale AI夏令营 AI模拟市场博弈 task1

1 赛事背景与数据

 

        由上图可知,我们需要对价格进行预测,并且评分越低说明预测效果越好。 

2 价格预测

2.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
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)"]]

2.2 ABM模型

Agent-Based Modeling (ABM) 是一种模拟系统复杂行为和动态的计算方法。通过定义系统中的个体(称为“代理”)及其相互作用规则来进行建模。每个代理具有独特的属性和行为,ABM 模型通过模拟代理之间的互动,观察宏观层面的模式和现象,帮助理解复杂系统的行为和演化。

2.3 预测

在这里,市场的主体是各个发电机组,他们在电力现货市场中根据市场信息和其他机组信息进行报价,并以获得最大利润为目标。

这里我们用边际成本定价法作为基线,即每个机组都以其自身每生产一度电的成本进行报价,而不考虑市场信息和其他机组信息。随后,按报价从低到高排序,依次接受报价,直到累计的功率超过了总需求,市场达到出清状态,并以最后一个满足的报价作为市场出清价格的估计。

#排序
sorted_unit = unit.sort_values("coal consumption (g coal/KWh)")
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)


#拟合曲线
model = LinearRegression()
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)

#预测并保存结果
y_pred = model.predict(prices[train_length:])
y_pred = y_pred.flatten()
sample_submit["clearing price (CNY/MWh)"] = y_pred
sample_submit.to_csv("submit.csv", index=False)
``` ​:citation[oaicite:0]{index=0}​

3 上传提交

最后我们得到一个分数,可见仍有很大改进空间,我们将在下一篇笔记详细说明。

感谢Datawhale向广大学习者提供的一切! 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值