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