Helpers and Plotting#
Importing and Converting From Old Versions#
- wombat.core.library.load_yaml(path, fname)[source]#
Loads and returns the contents of the YAML file.
- Parameters:
path (str | Path) -- Path to the file to be loaded.
fname (str | Path) -- Name of the file (ending in .yaml or .yml) to be loaded.
- Return type:
Any- Returns:
Any -- Whatever content is in the YAML file.
- wombat.core.library.create_library_structure(library_path, *, create_init=False)[source]#
Creates the following library structure at
library_path. Iflibrary_pathdoes not exist, then the method will fail.<library_path>/ └── project └── config <- Project-level configuration files └── port <- Port configuration files └── plant <- Wind farm layout files └── cables <- Export and Array cable configuration files └── substations <- Substation configuration files └── turbines <- Turbine configuration and power curve files └── vessels <- Land-based and offshore servicing equipment configuration files └── weather <- Weather profiles └── results <- The analysis log files and any saved output data- Parameters:
library_path (str | Path) -- The folder under which the subfolder structure should be created.
create_init (bool) -- If True, create "__init__.py" in each of the folders so that python installation processes will register the files, and if False, only create the folders, by default False.
- Raises:
FileNotFoundError -- Raised if
library_pathis not a directory- Return type:
None
- wombat.core.library.convert_failure_data(configuration, which, save_name=None, *, return_dict=False)[source]#
Converts the pre-v0.10 failure configuration data for cable, turbine, substation data in both individual files or consolidated configurations to be in the v0.10+ style.
- Parameters:
configuration (str | Path | dict) -- The configuration file or dictionary containing failure data.
which (str) -- The type of configuration. Muat be one of "cable", "substation", "turbine", or "configuration" where "configuration" is a consolidated simulation configuration file containing any or all of the different types.
save_name (str | Path | None, optional) -- The file path and name of where to save the converted configuration, by default None.
return_dict (bool, optional) -- Use True to return the converted dictionary, by default False.
- Return type:
None|dict- Returns:
None | dict -- If
return_dictis True, then dict, otherwise None.- Raises:
FileNotFoundError -- Raised if the
configurationcan't be found.ValueError -- Raised if
configurationcan't be converted to a dictionary because a dictionary was not passed nor was a valid file path to load.ValueError -- Raised if
whichreceived an invalid input.
Plotting#
Provides expoerimental plotting routines to help with simulation diagnostics.
- wombat.utilities.plot.plot_farm_layout(windfarm, figure_kwargs=None, plot_kwargs=None, *, return_fig=False)[source]#
Plot the graph representation of the windfarm as represented through WOMBAT.
- Args:
- figure_kwargsdict, optional
Customized keyword arguments for matplotlib figure instantiation that will passed as
plt.figure(**figure_kwargs). Defaults to {}.- plot_kwargsdict, optional
Customized parameters for
networkx.draw()that can will passed asnx.draw(**figure_kwargs). Defaults towith_labels=True,horizontalalignment=right,verticalalignment=bottom,font_weight=bold,font_size=10, andnode_color=#E37225.- return_figbool, optional
Whether or not to return the figure and axes objects for further editing and/or saving. Defaults to False.
- Return type:
None|tuple[figure,axes]- Returns:
None | tuple[plt.figure, plt.axes]: _description_
- Parameters:
windfarm (Windfarm)
figure_kwargs (dict | None)
plot_kwargs (dict | None)
return_fig (bool)
- wombat.utilities.plot.plot_farm_availability(sim, which='energy', *, individual_turbines=False, farm_95_CI=False, figure_kwargs=None, plot_kwargs=None, legend_kwargs=None, tick_fontsize=12, label_fontsize=16, return_fig=False)[source]#
Plots a line chart of the monthly availability at the wind farm level.
- Parameters:
sim (Simulation) -- A
Simulationobject that has been run.which (str) -- One of "time" or "energy", to indicate the basis for the availability calculation, by default "energy".
individual_turbines (bool, optional) -- Indicates if faint gray lines should be added in the background for the availability of each turbine, by default False.
farm_95_CI (bool, optional) -- Indicates if the 95% CI area fill should be added in the background.
figure_kwargs (dict, optional) -- Custom parameters for
plt.figure(), by defaultfigsize=(15, 7)anddpi=300.plot_kwargs (dict, optional) -- Custom parameters to be passed to
ax.plot(), by default a label consisting of the simulation name and project-level availability.legend_kwargs (dict, optional) -- Custom parameters to be passed to
ax.legend(), by defaultfontsize=14.tick_fontsize (int, optional) -- The x- and y-axis tick label fontsize, by default 12.
label_fontsize (int, optional) -- The x- and y-axis label fontsize, by default 16.
return_fig (bool, optional) -- If
True, return the figure and Axes object, otherwise don't, by default False.
- Return type:
tuple[Figure|Axes] |None- Returns:
tuple[plt.Figure, plt.Axes] | None -- See
return_figfor details. _description_
- wombat.utilities.plot.plot_operational_levels(sim, figure_kwargs=None, cbar_label_fontsize=14, *, return_fig=False)[source]#
Plots an hourly view of the operational levels of the wind farm and individual turbines as a heatmap.
- Parameters:
sim (Simulation) -- A
Simulationobject that has been run.figure_kwargs (dict, optional) -- Custom settings for
plt.figure(), by defaultfigsize=(15, 10)anddpi=300.cbar_label_fontsize (int, optional) -- The default fontsize used in the color bar legend for the axis label, by default 14.
return_fig (bool, optional) -- If
True, return the figure and Axes object, otherwise don't, by default False.
- Returns:
tuple[plt.Figure, plt.Axes] | None -- See
return_figfor details.
Logging functions#
General logging methods.
- wombat.utilities.logging.setup_logger(logger_name, log_file, level=20, capacity=500)[source]#
Creates the logging infrastructure for a given logging category.
TODO: Figure out how to type check
logging.INFO;Callable?- Parameters:
logger_name (str) -- Name to assign to the logger.
log_file (Path) -- File name and path for where the log data should be saved.
level (Any, optional) -- Logging level, by default logging.INFO.
capacity (int)
- Return type:
None
- wombat.utilities.logging.format_events_log_message(simulation_time, env_time, system_id, system_name, part_id, part_name, system_ol, part_ol, agent, action, reason, additional, duration, request_id, location='na', materials_cost=0, hourly_labor_cost=0, salary_labor_cost=0, equipment_cost=0)[source]#
Formats the logging messages into the expected format for logging.
- Parameters:
simulation_time (datetime64) -- Timestamp within the simulation time.
env_time (float) -- Environment simulation time (
Environment.now).system_id (str) -- Turbine ID,
System.id.system_name (str) -- Turbine name,
System.name.part_id (str) -- Subassembly, component, or cable ID,
_.id.part_name (str) -- Subassembly, component, or cable name,
_.name.system_ol (int | float) -- System operating level,
System.operating_level. Use an empty string for n/a.part_ol (int | float) -- Subassembly, component, or cable operating level,
_.operating_level. Use an empty string for n/a.agent (str) -- Agent performin the action.
action (str) -- Action that was taken.
reason (str) -- Reason an action was taken.
additional (str) -- Any additional information that needs to be logged.
duration (float) -- Length of time the action lasted.
request_id (str) -- The
RepairRequest.request_idor "na".location (str) -- The location of where the event ocurred: should be one of site, port, enroute, or system, by default "na".
materials_cost (int | float, optional) -- Total cost of materials for action, in USD, by default 0.
hourly_labor_cost (int | float, optional) -- Total cost of hourly labor for action, in USD, by default 0.
salary_labor_cost (int | float, optional) -- Total cost of salaried labor for action, in USD, by default 0.
equipment_cost (int | float, optional) -- Total cost of equipment for action, in USD, by default 0.
- Return type:
str- Returns:
str -- Formatted message for consistent logging.[summary]
Time Calculations#
General methods for time-based calculations.
- wombat.utilities.time.parse_date(value)[source]#
Thin wrapper for
dateutil.parser.parsethat converts string dates and returns back None or the original value if it's None or adatetime.datetimeobject, respectively.- Parameters:
value (str | None | datetime.datetime) -- A month/date or month-date formatted string to be converted to a
datetime.datetimeobject, ordatetime.datetimeobject, or None.- Return type:
datetime|None- Returns:
datetime.datetime | None -- A converted
datetime.datetimeobject or None.
- wombat.utilities.time.convert_dt_to_hours(diff)[source]#
Convert a
datetime.timedeltaobject to number of hours at the seconds resolution.- Parameters:
diff (datetime.timedelta) -- The difference between two
datetime.datetimeobjects.- Return type:
float- Returns:
float -- Number of hours between to
datetime.datetimeobjects.
- wombat.utilities.time.hours_until_future_hour(dt, hour)[source]#
Number of hours until a future hour in the same day for
hour<= 24, otherwise, it is the number of hours until a time in the proceeding days.- Parameters:
dt (datetime.datetime) -- Focal datetime.
hour (int) -- Hour that is later in the day, in 24 hour time.
- Return type:
float- Returns:
float -- Number of hours between the two times.
- wombat.utilities.time.check_working_hours(env_start, env_end, workday_start, workday_end)[source]#
Checks the working hours of a port or servicing equipment, and overrides a default (-1) to the environment's settings, otherwise returns back the input hours.
- Parameters:
env_start (int) -- The starting hour for the environment's shift
env_end (int) -- The ending hour for the environment's shift
workday_start (int) -- The starting hour to be checked.
workday_end (int) -- The ending hour to be checked.
- Return type:
tuple[int,int]- Returns:
tuple[int, int] -- The starting and ending hour to be applied back to the port or servicing equipment.
- wombat.utilities.time.calculate_cost(duration, rate, n_rate=1, *, daily_rate=False)[source]#
Calculates the equipment cost, or labor cost for either salaried or hourly employees.
- Parameters:
duration (int | float) -- Length of time, in hours.
rate (float) -- The labor or equipment rate, in $USD/hour.
n_rate (int) -- Total number of of the rate to be applied, more than one if``rate`` is broken down by number of individual laborers (if rate is a labor rate), by default 1.
daily_rate (bool, optional) -- Indicator for if the
rateis a daily rate (True), or hourly rate (False), by default False.
- Return type:
float- Returns:
float -- The total cost of the labor performed.
Miscellaneous#
Provides various utility functions that don't fit within a common theme.
- wombat.utilities.utilities._mean(*args)[source]#
Multiplies two numbers. Used for a reduce operation.
- Parameters:
args (int | float) -- The values to compute the mean over
- Return type:
float- Returns:
float -- The average of the values provided
- wombat.utilities.utilities.create_variable_from_string(string)[source]#
Creates a valid Python variable style string from a passed string.
- Parameters:
string (str) -- The string to convert into a Python-friendly variable name.
- Return type:
str- Returns:
str -- A Python-valid variable name.
Examples
>>> example_string = "*Electrical!*_ _System$*_" >>> print(create_variable_from_string(example_string)) 'electrical_system'
- wombat.utilities.utilities.IEC_power_curve(windspeed_column, power_column, bin_width=0.5, windspeed_start=0.0, windspeed_end=30.0)[source]#
Direct copyfrom OpenOA: NREL/OpenOA Use IEC 61400-12-1-2 method for creating wind-speed binned power curve.
- Parameters:
windspeed_column (np.ndarray | pandas.Series) -- The power curve's windspeed values, in m/s.
power_column (np.ndarray | pandas.Series) -- The power curve's output power values, in kW.
bin_width (float) -- Width of windspeed bin, default is 0.5 m/s according to standard, by default 0.5.
windspeed_start (float) -- Left edge of first windspeed bin, where all proceeding values will be 0.0, by default 0.0.
windspeed_end (float) -- Right edge of last windspeed bin, where all following values will be 0.0, by default 30.0.
- Return type:
Callable- Returns:
Callable -- Python function of the power curve, of type (Array[float] -> Array[float]), that maps input windspeed value(s) to ouptut power value(s).
- wombat.utilities.utilities.calculate_stack_current(power, p1, p2, p3, p4, p5)[source]#
Convert power produced, in kW to current, in amperes (I) using the efficiency curve from the H2Integrage PEM electrolysis model.
\[i_{stack} = p1 * power^{3} + p2 * power^{2} + p3 * power + p4 * power^{1/2} + p5\]- Parameters:
power (np.ndarray | pd.Series) -- Power produced, in kW.
p1 (int | float) -- First coefficient.
p2 (int | float) -- Second coefficient.
p3 (int | float) -- Third coefficient
p4 (int | float) -- Fourth coefficient.
p5 (int | float) -- Intercept.
- Return type:
ndarray|Series- Returns:
np.ndarray | pd.Series -- Converted current from the farm's power production.
- wombat.utilities.utilities.calculate_hydrogen_production(rated_capacity, FE=0.9999999, n_cells=135, turndown_ratio=0.1, *, efficiency_rate=None, p1=None, p2=None, p3=None, p4=None, p5=None)[source]#
Create the hydrogen production curve for an electrolyzer. One of
efficiency_rateor a complete set of polynomial values (p1,p2,p3,p4, andp5) for the power to current conversion must be provided.kWh are converted to current using the following efficiency formulation when the polynomial inputs are all provided, and the
efficiency_rateis nonzero. .. math:i_{stack} = p1 * power^{3} + p2 * power^{2} + p3 * power + p4 * power^{1/2} + p5
- Parameters:
rated_capacity (float) -- Rated maximum input power of the electrolyzer, in kW.
FE (float, optional) -- Faradic efficiency, by default 0.9999999.
n_cells (int, optional) -- Number of cells per 1 MW stack, by default 135.
turndown_ratio (float, optional) -- Minimum input power as a ratio of the rated capacity, by default 0.1.
efficiency_rate (float, optional) -- Energy efficiency in kWh per kg H2. Required if
p1through ``p5 are not provided.p1 (int | float | None) -- First coefficient of the efficiency polynomial curve. Required if
efficiency_rateis not provided, by default None.p2 (int | float | None) -- Second coefficient of the efficiency polynomial curve. Required if
efficiency_rateis not provided, by default None.p3 (int | float | None) -- Third coefficient of the efficiency polynomial curve. Required if
efficiency_rateis not provided, by default None.p4 (int | float | None) -- Fourth coefficient of the efficiency polynomial curve. Required if
efficiency_rateis not provided, by default None.p5 (int | float | None) -- Intercept of the efficiency polynomial curve. Required if
efficiency_rateis not provided, by default None.
- Return type:
Callable- Returns:
Callable -- Function to calculate H₂ production (kg/hr) from power input (kW).
- Raises:
ValueError -- Raised when
turndown_ratiois outside the range [0, 1].ValueError -- Raised when
efficiency_rateis provided and less than or equal to 0.ValueError -- Raised when neither the
efficiency_ratenor polynomial values (p1throughp5) are provided.ValueError -- Raised both the
efficiency_rateand polynomial values (p1throughp5) are provided.
- wombat.utilities.utilities.calculate_windfarm_operational_level(operations, turbine_id, turbine_weights, substation_turbine_map)[source]#
Calculates the overall wind farm operational level, accounting for substation downtime by multiplying the sum of all downstream turbine operational levels by the substation's operational level.
- Parameters:
operations (pd.DataFrame) -- The turbine and substation operational level DataFrame.
turbine_id (np.ndarray | list[str]) -- The turbine ids that match
Windfarm.turbine_id.turbine_weights (pd.DataFrame) -- The turbine weights, coming from
Windfarm.turbine_weights.substation_turbine_map (dict[str, dict[str, np.ndarray]]) -- The
Windfarm.substation_turbine_map.
- Return type:
DataFrame
Notes
This is a crude cap on the operations, and so a smarter way of capping the availability should be added in the future.
- Return type:
DataFrame- Returns:
pd.DataFrame -- The aggregate wind farm operational level.
- Parameters:
operations (DataFrame)
turbine_id (ndarray | list[str])
turbine_weights (DataFrame)
substation_turbine_map (dict[str, dict[str, ndarray]])