docs: def semicovariance(prices, benchmark=0, frequency=252):
      """
      Estimate the semicovariance matrix, i.e the covariance given that
      the returns are less than the benchmark.
  
      .. semicov = E([min(r_i - B, 0)] . [min(r_j - B, 0)])
  
      :param prices: adjusted closing prices of the asset, each row is a date
                     and each column is a ticker/id.
      :type prices: pd.DataFrame
      :param benchmark: the benchmark return, defaults to 0.
      :type benchmark: float
      :param frequency: number of time periods in a year, defaults to 252 (the number
                        of trading days in a year)
      :type frequency: int, optional
      :return: semicovariance matrix
      :rtype: pd.DataFrame
      """
      if not isinstance(prices, pd.DataFrame):
          warnings.warn("prices are not in a dataframe", RuntimeWarning)
          prices = pd.DataFrame(prices)
      daily_returns = daily_price_returns(prices)
      drops = np.fmin(daily_returns - benchmark, 0)
      return drops.cov() * frequency