Source code for wntr.metrics.misc
"""
The wntr.metrics.misc module contains metrics that do not fall into the
topographic, hydraulic, water quality, water security, or economic categories.
"""
from wntr.metrics.hydraulic import average_expected_demand
import logging
logger = logging.getLogger(__name__)
[docs]
def query(arg1, operation, arg2):
    """
    Returns a boolean mask using comparison operators, i.e. "arg1 operation arg2".
    For example, this can be used to return the node-time pairs 
    when demand < 90% expected demand.
    Parameters
    -----------
    arg1 : pandas DataFrame, pandas Series, numpy array, list, scalar
        Argument 1
    operation : numpy ufunc
        Numpy universal comparison function, options = np.greater,
        np.greater_equal, np.less, np.less_equal, np.equal, np.not_equal
    arg2 : same size and type as arg1, or a scalar
        Argument 2
    Returns
    -------
    A boolean mask (same size and type as arg1)
    """
    try:
        mask = operation(arg1, arg2)
    except AttributeError:
        logger.error('operation(arg1, arg2) failed')
    return mask 
[docs]
def population(wn, R=0.00000876157):
    r"""
    Compute population per node, rounded to the nearest integer :cite:p:`usepa15`.
    .. math:: pop=\dfrac{Average\ expected\ demand}{R}
    Parameters
    -----------
    wn : wntr WaterNetworkModel
        Water network model. The water network model is needed to 
        get demand timeseries at junctions and options related to 
        duration, timestep, and demand multiplier.
    R : float (optional, default = 0.00000876157 m3/s = 200 gallons/day)
        Average volume of water consumed per capita per day in m3/s
    Returns
    -------
    A pandas Series that contains population per node
    """
    ave_ex_dem = average_expected_demand(wn)
    pop = ave_ex_dem/R
    return pop.round() 
[docs]
def population_impacted(pop, arg1, operation=None, arg2=None):
    """
    Computes population impacted using comparison operators.
    For example, this can be used to find the population impacted when 
    demand < 90% expected.
    Parameters
    -----------
    pop : pd.Series (index = node names)
         A pandas Series that contains population per node
    arg1 : pd.DataFrame (columns = node names) or pd.Series (index = node names)
        Argument 1
    operation : numpy.ufunc
        Numpy universal comparison function, options = np.greater,
        np.greater_equal, np.less, np.less_equal, np.equal, np.not_equal
    arg2 : same size and type as arg1, or a scalar
        Argument 2
        
    Returns
    --------
    A pandas Series that contains population impacted per node
    """
    mask = query(arg1, operation, arg2)
    pop_impacted = mask.multiply(pop)
    return pop_impacted