code: def downside_risk(
      returns,
      required_return=0,
      period=DAILY,
      annualization=None,
      out=None,
  ):
      """
      Determines the downside deviation below a threshold
  
      Parameters
      ----------
      returns : pd.Series or np.ndarray or pd.DataFrame
          Daily returns of the strategy, noncumulative.
          - See full explanation in :func:`~empyrical.stats.cum_returns`.
      required_return: float / series
          minimum acceptable return
      period : str, optional
          Defines the periodicity of the 'returns' data for purposes of
          annualizing. Value ignored if `annualization` parameter is specified.
          Defaults are::
  
              'monthly':12
              'weekly': 52
              'daily': 252
  
      annualization : int, optional
          Used to suppress default values available in `period` to convert
          returns into annual returns. Value should be the annual frequency of
          `returns`.
      out : array-like, optional
          Array to use as output buffer.
          If not passed, a new array will be created.
  
      Returns
      -------
      downside_deviation : float or pd.Series
          depends on input type
          series ==> float
          DataFrame ==> pd.Series
  
      Note
      -----
      See `<https://www.sunrisecapital.com/wp-content/uploads/2014/06/Futures_
      Mag_Sortino_0213.pdf>`__ for more details, specifically why using the
      standard deviation of the negative returns is not correct.
      """
      allocated_output = out is None
      if allocated_output:
          out = np.empty(returns.shape[1:])
  
      returns_1d = returns.ndim == 1
  
      if len(returns) < 1:
          out[()] = np.nan
          if returns_1d:
              out = out.item()
          return out
  
      ann_factor = annualization_factor(period, annualization)
  
      downside_diff = np.clip(
          _adjust_returns(
              np.asanyarray(returns),
              np.asanyarray(required_return),
          ),
          np.NINF,
          0,
      )
  
      np.square(downside_diff, out=downside_diff)
      nanmean(downside_diff, axis=0, out=out)
      np.sqrt(out, out=out)
      np.multiply(out, np.sqrt(ann_factor), out=out)
  
      if returns_1d:
          out = out.item()
      elif isinstance(returns, pd.DataFrame):
          out = pd.Series(out, index=returns.columns)
      return out
  
imports: from __future__ import division
  import math
  import pandas
  import numpy
  from math import pow
  from scipy import stats, optimize
  from six import iteritems
  from sys import float_info
  from .utils import nanmean, nanstd, nanmin, up, down, roll, rolling_window
  from .periods import ANNUALIZATION_FACTORS, APPROX_BDAYS_PER_YEAR
  from .periods import DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY
label_desc: Use image node_id 18 for calling a global function with example usage: downside_risk(returns, required_return, period, annualization, out) and returns: out, out