Source code for openoa.utils.unit_conversion

"""
This module provides basic methods for unit conversion and calculation of basic wind plant variables
"""

from __future__ import annotations

import numpy as np
import pandas as pd

from openoa.utils._converters import series_method


[docs] @series_method(data_cols=["power_col"]) def convert_power_to_energy( power_col: str | pd.Series, sample_rate_min="10min", data: pd.DataFrame = None ) -> pd.Series: """ Compute energy [kWh] from power [kw] and return the data column Args: power_col(:obj:`str` | :obj:`pandas.Series`): The power data, in kW, or the name of the column in :py:attr:`data`. sample_rate_min(:obj:`float`): Sampling rate as a pandas offset alias, in minutes, to use for conversion. Defaults to "10min. data(:obj:`pandas.DataFrame`): The pandas DataFrame containing the col :py:attr:`power_col`. Returns: :obj:`pandas.Series`: Energy in kWh that matches the length of the input data frame :py:attr:'df' """ # Get the number of minutes in the sample_rate_min _dt_range = pd.date_range(start="09/30/2022", periods=2, freq=sample_rate_min) _diff = _dt_range[1] - _dt_range[0] hours = _diff.days * 24 + _diff.seconds / 60 / 60 # Convert the power, in kW, to energy, in kWh return power_col * hours
[docs] @series_method(data_cols=["net_energy", "availability", "curtailment"]) def compute_gross_energy( net_energy: str | pd.Series, availability: str | pd.Series, curtailment: str | pd.Series, availability_type: str = "frac", curtailment_type: str = "frac", data: str | pd.DataFrame = None, ): """ Computes gross energy for a wind plant or turbine by adding reported :py:attr:`availability` and :py:attr:`curtailment` losses to reported net energy. Args: net_energy(:obj:`str` | `pandas.Series`): A pandas Series, the name of the columnn in :py:attr:`data` corresponding to the reported net energy for wind plant or turbine. availability(:obj:`str` | `pandas.Series`): A pandas Series, the name of the columnn in :py:attr:`data` corresponding to the reported availability losses for wind plant or turbine curtailment(:obj:`str` | `pandas.Series`): A pandas Series, the name of the columnn in :py:attr:`data` corresponding to the reported curtailment losses for wind plant or turbine availability_type(:obj:`str`): Either one of "frac" or "energy" corresponding to if the data provided in :py:attr:`availability` is in the range of [0, 1], or representing the energy lost. curtailment_type(:obj:`str`): Either one of "frac" or "energy" corresponding to if the data provided in :py:attr:`curtailment` is in the range of [0, 1], or representing the energy lost. data(:obj:`pd.DataFrame`, optional): The pandas DataFrame containing the net_energy, availability, and curtailment columns. Returns: gross(:obj:`pandas.Series`): Calculated gross energy for wind plant or turbine """ if np.any(availability < 0) | np.any(curtailment < 0): raise ValueError( "Cannot have negative availability or curtailment input values. Check your data" ) if (availability_type == "frac") & (curtailment_type == "frac"): gross = net_energy / (1 - availability - curtailment) elif (availability_type == "frac") & (curtailment_type == "energy"): gross = net_energy / (1 - availability) + curtailment elif (availability_type == "energy") & (curtailment_type == "frac"): gross = net_energy / (1 - curtailment) + availability elif (availability_type == "energy") & (curtailment_type == "energy"): gross = net_energy + curtailment + availability if np.any(gross < net_energy): raise ValueError("Gross energy cannot be less than net energy. Check your input values") return gross
[docs] @series_method(data_cols=["variable"]) def convert_feet_to_meter(variable: str | pd.Series, data: pd.DataFrame = None): """ Compute variable in [meter] from [feet] and return the data column Args: variable(:obj:`str` | `pandas.Series`): A pandas Series, the name of the columnn in :py:attr:`data` corresponding to the data needing to be converted to meters. data(:obj:`pandas.DataFrame`): The pandas DataFrame containing the column :py:attr:`variable`. variable(:obj:`string`): variable in feet Returns: :obj:`pandas.Series`: :py:attr:`variable` in meters """ return variable * 0.3048