code: def excess_sharpe(returns, factor_returns, out=None):
      """
      Determines the Excess Sharpe of a strategy.
  
      Parameters
      ----------
      returns : pd.Series or np.ndarray
          Daily returns of the strategy, noncumulative.
          - See full explanation in :func:`~empyrical.stats.cum_returns`.
      factor_returns: float / series
          Benchmark return to compare returns against.
      out : array-like, optional
          Array to use as output buffer.
          If not passed, a new array will be created.
  
      Returns
      -------
      excess_sharpe : float
  
      Note
      -----
      The excess Sharpe is a simplified Information Ratio that uses
      tracking error rather than "active risk" as the denominator.
      """
      allocated_output = out is None
      if allocated_output:
          out = np.empty(returns.shape[1:])
  
      returns_1d = returns.ndim == 1
  
      if len(returns) < 2:
          out[()] = np.nan
          if returns_1d:
              out = out.item()
          return out
  
      active_return = _adjust_returns(returns, factor_returns)
      tracking_error = np.nan_to_num(
          nanstd(active_return, ddof=1, axis=0)
      )
  
      out = np.divide(
          nanmean(active_return, axis=0, out=out),
          tracking_error,
          out=out,
      )
      if returns_1d:
          out = out.item()
      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 19 for calling a global function with example usage: excess_sharpe(returns, factor_returns, out) and returns: out, out