题目描述
本次比赛提供某市场的出清价格以及市场参与主体相关参数信息,期待选手使用Agent-based model根据历史市场需求、外部环境以及主体基本信息对主体博弈行为进行刻画,预测未来情景下的市场出清价格。
任务:预测未来的市场出清价格
预测的市场出清价格尽可能的接近现实市场中的出清价格。
数据集
- electricity_price.csv: 包含电力市场的出清价格和电力负荷数据,每15分钟记录一次,数据包括日期、时间、负荷和出清价格。
- unit.csv:包含发电机组的技术参数,包括装机容量、煤耗和利用率等信息。
数据预处理
- 合并时间信息:
- 将day和time列合并成timestamp列,以便提取时间戳特征。
- 处理24:00:00的情况,将其调整为第二天的00:00:00。
- 处理发电机组数据:
- 将power consumption rate (%)转换为比例形式。
- 计算adjusted_coal_consumption (g coal/KWh),根据发电厂的利用率对实际的煤耗进行类修正,公式如下:
adjusted_coal_consumption = coal_consumption 1 − power_consumption_rate \text{adjusted\_coal\_consumption} = \frac{\text{coal\_consumption}}{1 - \text{power\_consumption\_rate}} adjusted_coal_consumption=1−power_consumption_ratecoal_consumption
其中:- coal_consumption \text{coal\_consumption} coal_consumption 是原始煤耗,单位为 (g/KWh)。
- power_consumption_rate \text{power\_consumption\_rate} power_consumption_rate 是功率消耗率,单位为百分比(已转换为小数形式)。
- 计算annual_generation (MWh),即年发电量。年发电量计算公式基于发电机组的容量和年利用小时数,公式如下:
annual_generation = Capacity × utilization_hour \text{annual\_generation} = \text{Capacity} \times \text{utilization\_hour} annual_generation=Capacity×utilization_hour
其中:- Capacity \text{Capacity} Capacity 是发电机组的装机容量,单位为 (MW)。
- utilization_hour \text{utilization\_hour} utilization_hour 是发电机组的年利用小时数,单位为 (h)。
出清价格计算
-
排序和计算累积容量:
- 排序: 按照每个发电机组的调整煤耗(
adjusted_coal_consumption (g coal/KWh)
)对发电机组进行升序排序。这样可以确保边际成本最低的发电机组优先考虑。 - 计算累积容量: 计算每个发电机组的累积容量,即所有发电机组的容量之和。这一步是为了在后续计算中找到满足特定需求的最小边际成本。
- 排序: 按照每个发电机组的调整煤耗(
-
计算每个需求的边际成本和年发电量:
get_adjusted_coal_consumption(demand)
函数:- 根据给定的电力需求,找到满足该需求的发电机组的边际成本。具体做法是从累积容量大于或等于需求的发电机组中选择调整煤耗(即边际成本)最低的发电机组。
get_annual_generation(demand)
函数:- 计算满足特定需求的发电机组的年发电量。首先通过
get_adjusted_coal_consumption(demand)
函数找到对应的边际成本,然后根据边际成本查找发电机组的年发电量。
- 计算满足特定需求的发电机组的年发电量。首先通过
-
应用到电力市场数据:
- 计算调整煤耗: 对于电力市场数据中的每个需求值,使用
get_adjusted_coal_consumption
函数计算其对应的调整煤耗,并将结果添加到数据集中。 - 计算年发电量: 对于电力市场数据中的每个需求值,使用
get_annual_generation
函数计算其对应的年发电量,并将结果添加到数据集中。
- 计算调整煤耗: 对于电力市场数据中的每个需求值,使用
特征工程
对数据进行了特征工程处理,包括:
- 特征选择:使用annual_generation (MWh)和adjusted_coal_consumption (g coal/KWh)作为特征。
- 目标变量:出清价格 (clearing price (CNY/MWh))
模型训练与预测
- 模型选择:使用线性回归模型 (LinearRegression) 进行训练。
- 数据拆分:将数据集拆分为训练集和测试集,训练集包含前55392条记录,测试集包含剩余记录。
- 模型训练与预测:对训练集进行训练,并在测试集上进行预测。
- 生成提交文件:将预测结果保存到submit.csv文件中,以便提交。
源代码
import numpy as np
import pandas as pd
from pathlib import Path
from sklearn.linear_model import LinearRegression
base_path = Path("./") # 确保数据都放在同级目录下
# 读取市场数据
electricity_price = pd.read_csv(base_path / "electricity_price.csv")
# 读取市场主体(各发电机组)数据
unit = pd.read_csv(base_path / "unit.csv")
# 准备示例提交数据sample_submit
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)"]]
# 显示前5行数据
print(electricity_price.head())
print(unit.head())
# 处理单位数据
unit['power consumption rate (%)'] = unit['power consumption rate (%)'] / 100
unit['adjusted_coal_consumption (g coal/KWh)'] = unit['coal consumption (g coal/KWh)'] * (1 / (1 - unit['power consumption rate (%)']))
# 计算单位容量的年总发电量
unit['annual_generation (MWh)'] = unit['Capacity(MW)'] * unit['utilization hour (h)']
# 按照边际成本排序并计算累积容量
unit = unit.sort_values("adjusted_coal_consumption (g coal/KWh)")
unit['cumulative_capacity'] = unit['Capacity(MW)'].cumsum()
print(unit)
# 计算每个需求对应的边际成本
def get_adjusted_coal_consumption(demand):
# 找到满足需求的发电机组的边际成本
return unit[unit['cumulative_capacity'] >= demand]["adjusted_coal_consumption (g coal/KWh)"].iloc[0]
def get_annual_generation(demand):
# 找到满足需求的发电机组的边际成本
marginal_cost = unit[unit['cumulative_capacity'] >= demand]['adjusted_coal_consumption (g coal/KWh)'].iloc[0]
# 根据边际成本找到对应的年总发电量
return unit[unit['adjusted_coal_consumption (g coal/KWh)'] == marginal_cost]['annual_generation (MWh)'].iloc[0]
electricity_price['adjusted_coal_consumption (g coal/KWh)'] = electricity_price['demand'].apply(get_adjusted_coal_consumption)
electricity_price['annual_generation (MWh)'] = electricity_price['demand'].apply(get_annual_generation)
# 特征工程
X = electricity_price[["annual_generation (MWh)", "adjusted_coal_consumption (g coal/KWh)"]]
y = electricity_price["clearing price (CNY/MWh)"]
# 拆分训练集和测试集
X_train = X.iloc[:55392]
y_train = y.iloc[:55392]
X_test = X.iloc[55392:]
y_test = y.iloc[55392:]
# 选择模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测和评估
y_pred = model.predict(X_test)
# 生成提交文件
sample_submit["clearing price (CNY/MWh)"] = y_pred
print(sample_submit.head())
sample_submit.to_csv("submit.csv", index=False)