code: def predict_proba(self, time):
          
          check_is_fitted(self, "unique_time_")
          time = check_array(time, ensure_2d=False)
  
          # K-M is undefined if estimate at last time point is non-zero
          extends = time > self.unique_time_[-1]
          if self.prob_[-1] > 0 and extends.any():
              raise ValueError("time must be smaller than largest "
                               "observed time point: {}".format(self.unique_time_[-1]))
  
          # beyond last time point is zero probability
          Shat = numpy.empty(time.shape, dtype=float)
          Shat[extends] = 0.0
  
          valid = ~extends
          time = time[valid]
          idx = numpy.searchsorted(self.unique_time_, time)
          # for non-exact matches, we need to shift the index to left
          eps = numpy.finfo(self.unique_time_.dtype).eps
          exact = numpy.absolute(self.unique_time_[idx] - time) < eps
          idx[~exact] -= 1
          Shat[valid] = self.prob_[idx]
  
          return Shat
docs: Return probability of an event after given time point.
  
          :math:`\\hat{S}(t) = P(T > t)`
  
          Parameters
          ----------
          time : array, shape = (n_samples,)
              Time to estimate probability at.
  
          Returns
          -------
          prob : array, shape = (n_samples,)
              Probability of an event.