在-Python-中探索优先顺序和边际减排成本曲线
在 Python 中探索优先顺序和边际减排成本曲线
towardsdatascience.com/merit-order-and-marginal-abatement-cost-curve-in-python/
减缓技术选项(如可再生能源、电动汽车(EV)、绿色氢等)的实施会产生自己的成本和收益。一个国家电力生成组合中可再生能源和化石燃料的混合不仅决定了二氧化碳排放,还可以影响电力价格。在这篇文章中,我将讨论批发电力市场中电力价格是如何通过优先顺序曲线(基于边际成本的概念)确定的,以及如何根据边际减排成本曲线评估一个国家、地区或组织脱碳机会的成本效益。我将使用 Python 构建这两个曲线,并在过程中讨论实现方法。
让我们开始吧!
优先顺序曲线
一个国家的电力管理局或公用事业公司在其组合中可能有不同类型的发电厂,以向零售商提供电力输出。这被称为批发电力市场(也称为现货市场)。发电的成本根据发电厂的类型而有所不同。例如,太阳能光伏或风力涡轮机发电的电力成本为零或最小,因为它们不需要任何燃料。另一方面,基于化石燃料的发电厂运行成本较高,这取决于燃烧以发电的煤炭、石油或天然气等燃料的价格。在经济学语言中,生产一个额外产品单位的生产成本被称为生产边际成本。在电力系统中,组合中可用的发电厂根据发电的短期边际成本递增顺序安排上线。这个顺序被称为优先顺序。具有最低边际成本的发电厂首先安排满足需求,然后是具有更高边际成本的发电厂,以优化电力供应成本。
在本节中,我将实现构建电力优先级曲线的不同步骤,并讨论电力优先级如何设定批发电力价格。
实现
让我们考虑一个国家的电力投资组合中有九种类型的发电厂,如列表“power_plants”所示。这些发电厂必须按照“边际成本”的升序排列。本例中使用的数据基于我的假设,可以被视为虚拟数据集。
power_plants = ["Solar", "Wind", "Hydro", "Nuclear", "Biomass", "Coal", "Gas", "Oil", "Diesel"]
marginal_costs = [0, 0, 5, 10, 40, 60, 80, 120, 130]
首先,我将这些数据转换为以“power_plants”为索引、“边际成本”为列的数据框。接下来,我遍历数据框的索引,并要求用户输入每个发电厂的可用容量。每个发电厂的可用容量使用“globals()”方法存储在单独的变量中,如下所示。

^(使用循环和“globals()”方法请求用户输入每种发电厂类型的可用容量。)
国家 X 的投资组合中可用的总容量总计为 1800 兆瓦。然后,我创建了一个名为“累积容量(兆瓦)”的新列,它是“可用容量(兆瓦)”的累积总和。

^(包含国家 X 每种发电厂类型的边际成本和可用容量的数据框。图片由作者提供。)
我要求用户输入国家 X 在特定时间段的电力需求。
demand = int(input("Enter total demand (MW): "))
假设“需求”为 1500 兆瓦。
现在数据已经准备好了,我可以开始编译构建电力优先级曲线的构建块。在电力优先级曲线中,发电厂按照发电边际成本的升序排列,以条形图的形式呈现。条形的宽度代表每种发电厂类型的可用容量,高度代表相应的边际成本。由于条形的宽度不相等,它们看起来与正常的条形图相当不同。
第一条形(此处为太阳能)的 x 轴刻度位置与它的“可用容量(兆瓦)”的一半相同。对于其他发电厂类型,位置计算为之前发电厂类型的“累积容量(兆瓦)”总和,加上其“可用容量(兆瓦)”的一半。我已经准备了一个循环来获取“df”的“xpos”列中的这个位置,如下面的代码片段的第一部分所示。
接下来,我分析需求在 x 轴上的位置。电力需求与 x 轴上累积电力供应相交的位置确定了“关断发电厂”。反过来,“关断发电厂”的边际成本决定了在它之前的所有电力优先级发电厂的清算价格,这些发电厂参与批发市场。这个批发市场的电力买家都将支付相同的价格。
#For-loop to determine the position of ticks in x-axis for each bar
df["xpos"] = ""
for index in df.index:
#get index number based on index name
i = df.index.get_loc(index)
if index == "Solar": #First index
df.loc[index, "xpos"] = df.loc[index, "Available capacity (MW)"]
else:
#Sum of cumulative capacity in the row above and the half of available capacity in
df.loc[index, "xpos"] = df.loc[index, "Available capacity (MW)"]/2 + df.iloc[i-1, 2]
#Function to determine the cut_off_power_plant that sets the market clearing price
def cut_off(demand):
#To get the cutoff power plant
for index in df.index:
if df.loc[index, "Cumulative capacity (MW)"] < demand:
pass
else:
cut_off_power_plant = index
print ("Power plant that sets the electricity price is: ", cut_off_power_plant)
break
return cut_off_power_plant
顶部的 for 循环确定每种发电厂类型在 X 轴上的条形位置。底部的 cut_off 函数确定与电力需求相交的发电厂类型。
生成边际效益顺序曲线的代码如下所示。
def merit_order_curve(demand):
plt.figure(figsize = (20, 12))
plt.rcParams["font.size"] = 16
colors = ["yellow","limegreen","skyblue","pink","limegreen","black","orange","grey","maroon"]
xpos = df["xpos"].values.tolist()
y = df["Marginal Costs"].values.tolist()
#width of each bar
w = df["Available capacity (MW)"].values.tolist()
cut_off_power_plant = cut_off(demand)
fig = plt.bar(xpos,
height = y,
width = w,
fill = True,
color = colors)
plt.xlim(0, df["Available capacity (MW)"].sum())
plt.ylim(0, df["Marginal Costs"].max() + 20)
plt.hlines(y = df.loc[cut_off_power_plant, "Marginal Costs"],
xmin = 0,
xmax = demand,
color = "red",
linestyle = "dashed")
plt.vlines(x = demand,
ymin = 0,
ymax = df.loc[cut_off_power_plant, "Marginal Costs"],
color = "red",
linestyle = "dashed",
label = "Demand")
plt.legend(fig.patches, power_plants,
loc = "best",
ncol = 3)
plt.text(x = demand - df.loc[cut_off_power_plant, "Available capacity (MW)"]/2,
y = df.loc[cut_off_power_plant, "Marginal Costs"] + 10,
s = f"Electricity price: \n {df.loc[cut_off_power_plant, 'Marginal Costs']} $/MWh")
plt.xlabel("Power plant capacity (MW)")
plt.ylabel("Marginal Cost ($/MWh)")
plt.show()
merit_order_curve(demand = demand)
最终生成的图表如下所示。
^(所示为给定电力市场的边际效益顺序曲线。X 轴表示发电厂的可用容量。Y 轴表示每个发电厂的边际成本。垂直红色虚线表示需求,与燃气相交。水平红色虚线表示燃气发电的边际成本,它设定了市场出清价格。图片由作者提供。)
在生成的图表中,1500 兆瓦的电力需求由垂直虚线红色的线表示。这恰好与当所有发电厂按边际成本升序排列时的燃气供电相吻合。因此,燃气发电的边际成本即 80 美元/兆瓦时是市场出清价格。这意味着 X 轴上垂直虚线红色线之前和之后的所有发电厂,即太阳能、风能、水能、核能、生物质能、煤炭和燃气,都需要提供电力以满足需求。并且它们都接受由燃气生产边际成本设定的价格。
效益顺序效应
当电力系统中的需求水平发生变化时,批发电价也会相应地做出反应。这在上面的 GIF 图像中得到了演示。为了在 Python 中获得动画,我使用了ipywidgets中的interact函数,如下所示。我还使用了IntSlider小部件来设置用户定义的demand参数以进行交互。为了避免在拖动滑块时闪烁,我将continuous_update设置为 False。
from ipywidgets import *
demand = widgets.IntSlider(
value = 100,
min = 0,
max = df[“Available capacity (MW)”].sum(),
step = 10,
description = “Demand”,
continuous_update = False #False to avoid flickering
)
interactive_plot = interact(merit_order_curve, demand = demand)
^(动画显示了需求变化时截止发电厂和批发电价的变化。图片由作者提供。)
如上图 GIF 图像所示,当需求增加时,需要调度更多位于效益顺序右侧的发电厂,这会增加市场出清价格,反之亦然。如果组合中可再生能源发电厂的可用容量更多,那么更多的需求份额将由可再生能源满足。这往往会导致电价下降,这被称为效益顺序效应。
边际减排成本曲线
减排成本是企业为消除或减少生产过程中产生的外部性(负副产品)而承担的成本。而边际减排成本衡量减少额外单位外部性的成本,例如二氧化碳排放。虽然优势顺序曲线是基于按生产边际成本对技术进行排序,但边际减排成本(MAC)曲线是基于按边际减排成本的升序对不同的缓解机会进行排序。
在 MAC 曲线中,柱状图的宽度代表任何技术或选项的温室气体(GHG)排放减少潜力。柱状图的高度代表使用给定机会减少额外单位温室气体排放的成本。
^(数据基于作者假设。)
此示例的数据基于我的假设,可以被视为一个虚拟数据集。在 Python 中实现 MAC 曲线的方法与优势顺序曲线类似。
^(图像由作者提供。)
柱状图的宽度代表缓解机会的年度温室气体排放减少潜力。柱状图的高度代表在特定年份减少 1 吨二氧化碳当量排放的估计成本。
如上图所示,用 LED 灯替换旧灯是脱碳最有效的措施。某些机会的负边际减排成本意味着在实施这些措施时会有净成本节约(或利润)。当我们向 MAC 曲线的 X 轴右侧移动时,减排一单位温室气体排放的成本就会增加。MAC 曲线上最宽的柱状图,即重新造林,具有最高的整体温室气体排放减少潜力。
因此,MAC 曲线允许将来自各个部门(在此处为电力、交通、建筑、林业和废物)的测量结果在等效的条件下进行比较。虽然 MAC 曲线为各种缓解机会的潜力和成本效益提供了关键性的初步评估,但将这种评估与其他建模工具的见解相结合,为制定政策和投资决策提供了坚实的基础。
结论
随着我们穿越全球能源转型,为了满足我们的能源需求而燃烧更多的化石燃料将很快超过我们需要尊重的排放预算,以实现全球气候目标。目前已经存在技术上证明可行且经济上可行的机会,可以显著减少能源和非能源部门的温室气体排放。此外,随着规模经济的实现,经过验证的减缓技术(例如风能和太阳能)每年都在变得更便宜。
有效地利用经过验证的减缓技术选项对于显著减少排放至关重要。这些减缓选项带来自己的成本和收益。在这篇文章中,我讨论了可再生能源和化石燃料在一个国家电力系统组合中的份额如何通过边际成本曲线(基于生产边际成本)的概念影响批发电力价格。我还介绍了如何根据边际减排成本曲线来评估一个国家减缓机会的减排潜力和成本效益。这些曲线在 Python 中的实现可以在本GitHub 仓库中找到。

浙公网安备 33010602011771号