Parameters
        ----------
          bandwidth: float
            the bandwidth to use in the Epanechnikov kernel. > 0
          hazard_: numpy array
            a computed (n,) numpy array of estimated hazard rates. If none, uses ``smoothed_hazard_``

def smoothed_hazard_confidence_intervals_(self, bandwidth, hazard_=None):
        """
        Parameters
        ----------
          bandwidth: float
            the bandwidth to use in the Epanechnikov kernel. > 0
          hazard_: numpy array
            a computed (n,) numpy array of estimated hazard rates. If none, uses ``smoothed_hazard_``
        """
        if hazard_ is None:
            hazard_ = self.smoothed_hazard_(bandwidth).values[:, 0]

        timeline = self.timeline
        z = inv_normal_cdf(1 - self.alpha / 2)
        self._cumulative_sq.iloc[0] = 0
        var_hazard_ = self._cumulative_sq.diff().fillna(self._cumulative_sq.iloc[0])
        C = var_hazard_.values != 0.0  # only consider the points with jumps
        std_hazard_ = np.sqrt(
            1.0
            / (bandwidth ** 2)
            * np.dot(
                epanechnikov_kernel(timeline[:, None], timeline[C][None, :], bandwidth) ** 2, var_hazard_.values[C]
            )
        )
        values = {
            self.ci_labels[0]: hazard_ * np.exp(z * std_hazard_ / hazard_),
            self.ci_labels[1]: hazard_ * np.exp(-z * std_hazard_ / hazard_),
        }
        return pd.DataFrame(values, index=timeline)