Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/code/curtailment_eastern.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
from powersimdata import Scenario

from postreise.plot.plot_curtailment_ts import plot_curtailment_time_series
Expand Down
15 changes: 11 additions & 4 deletions postreise/analyze/generation/emissions.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import numpy as np
import pandas as pd
from powersimdata.input.check import _check_grid_type, _check_time_series
from powersimdata.network.model import ModelImmutables
from powersimdata.scenario.check import _check_scenario_is_in_analyze_state

from postreise.analyze.generation.costs import calculate_costs
Expand All @@ -24,7 +23,7 @@ def generate_emissions_stats(scenario, pollutant="carbon", method="simple"):
are off (detected by pg < 1 MW).
"""
_check_scenario_is_in_analyze_state(scenario)
mi = ModelImmutables(scenario.info["grid_model"])
mi = scenario.get_grid().model_immutables
allowed_methods = {
"carbon": {"simple", "always-on", "decommit"},
"nox": {"simple"},
Expand Down Expand Up @@ -124,7 +123,15 @@ def carbon_diff(scenario_1, scenario_2):
generate_emissions_stats(scenario_2), scenario_2.get_grid()
)

sum_1 = sum(carbon_by_bus_1["coal"].values()) + sum(carbon_by_bus_1["ng"].values())
sum_2 = sum(carbon_by_bus_2["coal"].values()) + sum(carbon_by_bus_2["ng"].values())
grid = scenario_1.state.get_grid()
coal_resource_types = grid.model_immutables.plants["group_all_resources"]["coal"]
ng_resource_types = grid.model_immutables.plants["group_all_resources"]["ng"]
resource_types = coal_resource_types.union(ng_resource_types)

sum_1 = 0
sum_2 = 0
for rtype in resource_types:
sum_1 = sum_1 + sum(carbon_by_bus_1[rtype].values())
sum_2 = sum_2 + sum(carbon_by_bus_2[rtype].values())

return 100 * (1 - sum_2 / sum_1)
10 changes: 9 additions & 1 deletion postreise/analyze/generation/summarize.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ def sum_generation_by_state(scenario: Scenario) -> pd.DataFrame:
totals for the interconnects and for all states.

:param powersimdata.scenario.scenario.Scenario scenario: scenario instance.
:raises ValueError:
if grid model is not supported.
:return: (*pandas.DataFrame*) -- total generation per resource, by area.
"""
# Start with energy by type & zone name
Expand All @@ -59,8 +61,14 @@ def sum_generation_by_state(scenario: Scenario) -> pd.DataFrame:
energy_by_type_zonename = energy_by_type_zoneid.rename(zoneid2zonename, axis=1)
# Build lists to use for groupbys
zone_list = energy_by_type_zonename.columns
if grid.grid_model == "usa_tamu":
loadzone2area = "loadzone2state"
elif grid.grid_model == "europe_tub":
loadzone2area = "loadzone2country"
else:
raise ValueError("grid model is not supported")
zone_states = [
grid.model_immutables.zones["loadzone2state"][zone] for zone in zone_list
grid.model_immutables.zones[loadzone2area][zone] for zone in zone_list
]
zone_interconnects = [
grid.model_immutables.zones["loadzone2interconnect"][zone] for zone in zone_list
Expand Down
3 changes: 0 additions & 3 deletions postreise/analyze/generation/tests/test_emissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ def test_method_value(self, scenario):

class TestCarbonCalculation:
def test_carbon_calc_always_on(self, scenario, mock_plant):

carbon = generate_emissions_stats(scenario, method="always-on")
_test_emissions_structure(carbon, mock_plant, scenario.state.get_pg())

Expand All @@ -118,7 +117,6 @@ def test_carbon_calc_always_on(self, scenario, mock_plant):
)

def test_carbon_calc_decommit(self, scenario, mock_plant):

carbon = generate_emissions_stats(scenario, method="decommit")
_test_emissions_structure(carbon, mock_plant, scenario.state.get_pg())

Expand All @@ -136,7 +134,6 @@ def test_carbon_calc_decommit(self, scenario, mock_plant):
)

def test_carbon_calc_simple(self, scenario, mock_plant):

carbon = generate_emissions_stats(scenario, method="simple")
_test_emissions_structure(carbon, mock_plant, scenario.state.get_pg())

Expand Down
15 changes: 15 additions & 0 deletions postreise/plot/colors.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,18 @@
"red",
"darkred",
]

grid_colors = {
"usa_tamu": {
"Western": be_blue,
"Eastern": be_purple,
"Texas": be_lightblue,
},
"europe_tub": {
"ContinentalEurope": be_blue,
"Baltic": "#fed53d",
"Nordic": be_lightblue,
"GreatBritain": be_purple,
"Ireland": be_green,
},
}
26 changes: 14 additions & 12 deletions postreise/plot/plot_bar_generation_max_min_actual.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import pyplot as plt
from powersimdata.input.check import _check_resources_are_in_grid_and_format

from postreise.analyze.generation.summarize import (
Expand Down Expand Up @@ -35,7 +35,9 @@ def plot_bar_generation_max_min_actual(
:raises TypeError:
if ``interconnect`` and ``gen_type`` are not str
if ``fontsize`` is not an integer or a float and/or
:raises ValueError: if ``interconnect`` is not valid
:raises ValueError:
if ``interconnect`` is not valid
if grid model is not supported.
"""
if not isinstance(interconnect, str):
raise TypeError("interconnect must be a str")
Expand All @@ -53,26 +55,26 @@ def plot_bar_generation_max_min_actual(
raise ValueError(
f"interconnect must be one of {sorted(mi.zones['interconnect'])}"
)
if (
len(
mi.zones["interconnect2abv"][interconnect]
- mi.zones["interconnect2abv"][scenario.info["interconnect"]]
)
!= 0
):
raise ValueError("interconnect is incompatible with scenario's interconnect")

hour_num = (
pd.Timestamp(scenario.info["end_date"])
- pd.Timestamp(scenario.info["start_date"])
).total_seconds() / 3600 + 1
if show_as_state:
if grid.grid_model == "usa_tamu":
abv2area = "abv2state"
loadzone2area = "loadzone2state"
elif grid.grid_model == "europe_tub":
abv2area = "abv2country"
loadzone2area = "loadzone2country"
else:
raise ValueError("grid model is not supported")
zone_list = [
mi.zones["abv2state"][abv]
mi.zones[abv2area][abv]
for abv in mi.zones["interconnect2abv"][interconnect]
]
all_max_min = (
plant.groupby(plant.zone_name.map(mi.zones["loadzone2state"]))[
plant.groupby(plant.zone_name.map(mi.zones[loadzone2area]))[
["Pmax", "Pmin"]
].sum()
* hour_num
Expand Down
20 changes: 12 additions & 8 deletions postreise/plot/plot_bar_generation_stack.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import os

import matplotlib.pyplot as plt
import pandas as pd
from powersimdata.network.model import ModelImmutables, area_to_loadzone
from matplotlib import pyplot as plt
from powersimdata.network.model import area_to_loadzone
from powersimdata.scenario.scenario import Scenario

from postreise.analyze.generation.curtailment import (
Expand Down Expand Up @@ -95,7 +95,10 @@ def plot_bar_generation_stack(
s_list = []
for sid in scenario_ids:
s_list.append(Scenario(sid))
mi = ModelImmutables(s_list[0].info["grid_model"])
mi = s_list[0].state.get_grid().model_immutables
# TODO: fix in mi
mi.plants["curtailable2color"]["offwind-dc"] = "#74c6f2"

type2color = mi.plants["type2color"]
type2color.update(
{k + "_curtailment": v for k, v in mi.plants["curtailable2color"].items()}
Expand All @@ -116,13 +119,14 @@ def plot_bar_generation_stack(

all_loadzone_data = dict()
for sid, scenario in zip(scenario_ids, s_list):
if scenario.info["interconnect"] in ["USA", "Europe"]:
loadzones = mi.zones["loadzone"]
else:
loadzones = mi.zones["interconnect2loadzone"][scenario.info["interconnect"]]

curtailment = calculate_curtailment_time_series_by_areas_and_resources(
scenario,
areas={
"loadzone": mi.zones["interconnect2loadzone"][
scenario.info["interconnect"]
]
},
areas={"loadzone": loadzones},
)
for area in curtailment:
for r in curtailment[area]:
Expand Down
6 changes: 3 additions & 3 deletions postreise/plot/plot_bar_generation_vs_capacity.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import matplotlib.pyplot as plt
import pandas as pd
from powersimdata.network.model import ModelImmutables, area_to_loadzone
from matplotlib import pyplot as plt
from powersimdata.network.model import area_to_loadzone
from powersimdata.scenario.scenario import Scenario

from postreise.analyze.generation.capacity import sum_capacity_by_type_zone
Expand Down Expand Up @@ -83,7 +83,7 @@ def plot_bar_generation_vs_capacity(
scenario_data = {}
for i, sid in enumerate(scenario_ids):
scenario = Scenario(sid)
mi = ModelImmutables(scenario.info["grid_model"])
mi = scenario.state.get_grid().model_immutables
all_loadzone_data[sid] = {
"gen": sum_generation_by_type_zone(scenario, time_range, time_zone).rename(
columns=mi.zones["id2loadzone"]
Expand Down
22 changes: 11 additions & 11 deletions postreise/plot/plot_bar_renewable_max_profile_actual.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import pyplot as plt
from powersimdata.input.check import (
_check_resources_are_in_grid_and_format,
_check_resources_are_renewable_and_format,
Expand Down Expand Up @@ -58,14 +58,6 @@ def plot_bar_renewable_max_profile_actual(
raise ValueError(
f"interconnect must be one of {sorted(mi.zones['interconnect'])}"
)
if (
len(
mi.zones["interconnect2abv"][interconnect]
- mi.zones["interconnect2abv"][scenario.info["interconnect"]]
)
!= 0
):
raise ValueError("interconnect is incompatible with scenario's interconnect")

if "wind" in gen_type:
profile = scenario.get_wind().sum()
Expand All @@ -76,11 +68,19 @@ def plot_bar_renewable_max_profile_actual(
- pd.Timestamp(scenario.info["start_date"])
).total_seconds() / 3600 + 1
if show_as_state:
if grid.grid_model == "usa_tamu":
abv2area = "abv2state"
loadzone2area = "loadzone2state"
elif grid.grid_model == "europe_tub":
abv2area = "abv2country"
loadzone2area = "loadzone2country"
else:
raise ValueError("grid model is not supported")
zone_list = [
mi.zones["abv2state"][abv]
mi.zones[abv2area][abv]
for abv in mi.zones["interconnect2abv"][interconnect]
]
group_criteria = plant.zone_name.map(mi.zones["loadzone2state"])
group_criteria = plant.zone_name.map(mi.zones[loadzone2area])
profile_gen = profile.groupby(group_criteria).sum().rename("profile")
total_capacity = plant.groupby(group_criteria)["Pmax"].sum() * hour_num
actual_gen = sum_generation_by_state(scenario)[gen_type] * 1000
Expand Down
2 changes: 1 addition & 1 deletion postreise/plot/plot_bar_shortfall.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import pyplot as plt
from powersimdata.design.generation.clean_capacity_scaling import (
add_demand_to_targets,
add_resource_data_to_targets,
Expand Down
Loading