DataWhale AI夏令营——基于线性回归的电厂出清价格预测

题目描述

本次比赛提供某市场的出清价格以及市场参与主体相关参数信息,期待选手使用Agent-based model根据历史市场需求、外部环境以及主体基本信息对主体博弈行为进行刻画,预测未来情景下的市场出清价格。

任务:预测未来的市场出清价格

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

数据集

  • electricity_price.csv: 包含电力市场的出清价格和电力负荷数据,每15分钟记录一次,数据包括日期、时间、负荷和出清价格。
    在这里插入图片描述
  • unit.csv:包含发电机组的技术参数,包括装机容量、煤耗和利用率等信息。

electricity_price.csv

数据预处理

  1. 合并时间信息:
  • 将day和time列合并成timestamp列,以便提取时间戳特征。
  • 处理24:00:00的情况,将其调整为第二天的00:00:00。
  1. 处理发电机组数据:
  • 将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=1power_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)。

出清价格计算

  1. 排序和计算累积容量:

    • 排序: 按照每个发电机组的调整煤耗(adjusted_coal_consumption (g coal/KWh))对发电机组进行升序排序。这样可以确保边际成本最低的发电机组优先考虑。
    • 计算累积容量: 计算每个发电机组的累积容量,即所有发电机组的容量之和。这一步是为了在后续计算中找到满足特定需求的最小边际成本。
  2. 计算每个需求的边际成本和年发电量:

    • get_adjusted_coal_consumption(demand) 函数:
      • 根据给定的电力需求,找到满足该需求的发电机组的边际成本。具体做法是从累积容量大于或等于需求的发电机组中选择调整煤耗(即边际成本)最低的发电机组。
    • get_annual_generation(demand) 函数:
      • 计算满足特定需求的发电机组的年发电量。首先通过 get_adjusted_coal_consumption(demand) 函数找到对应的边际成本,然后根据边际成本查找发电机组的年发电量。
  3. 应用到电力市场数据:

    • 计算调整煤耗: 对于电力市场数据中的每个需求值,使用 get_adjusted_coal_consumption 函数计算其对应的调整煤耗,并将结果添加到数据集中。
    • 计算年发电量: 对于电力市场数据中的每个需求值,使用 get_annual_generation 函数计算其对应的年发电量,并将结果添加到数据集中。

特征工程

对数据进行了特征工程处理,包括:

  • 特征选择:使用annual_generation (MWh)和adjusted_coal_consumption (g coal/KWh)作为特征。
  • 目标变量:出清价格 (clearing price (CNY/MWh))

模型训练与预测

  1. 模型选择:使用线性回归模型 (LinearRegression) 进行训练。
  2. 数据拆分:将数据集拆分为训练集和测试集,训练集包含前55392条记录,测试集包含剩余记录。
  3. 模型训练与预测:对训练集进行训练,并在测试集上进行预测。
  4. 生成提交文件:将预测结果保存到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)
  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值