class_docstr: Class for fitting the Kaplan-Meier estimate for the survival function.
  
  Parameters
  ----------
  alpha: float, optional (default=0.05)
      The alpha value associated with the confidence intervals.
  label: string, optional
      Provide a new label for the estimate - useful if looking at many groups.
  
  Examples
  --------
  .. code:: python
  
      from lifelines import KaplanMeierFitter
      from lifelines.datasets import load_waltons
      waltons = load_waltons()
  
      kmf = KaplanMeierFitter(label="waltons_data")
      kmf.fit(waltons['T'], waltons['E'])
      kmf.plot()
  
  
  Attributes
  ----------
  survival_function_ : DataFrame
      The estimated survival function (with custom timeline if provided)
  median_survival_time_ : float
      The estimated median time to event. np.inf if doesn't exist.
  confidence_interval_ : DataFrame
      The lower and upper confidence intervals for the survival function. An alias of
      ``confidence_interval_survival_function_``. Uses Greenwood's Exponential formula ("log-log" in R).
  confidence_interval_survival_function_ : DataFrame
      The lower and upper confidence intervals for the survival function. An alias of
      ``confidence_interval_``. Uses Greenwood's Exponential formula ("log-log" in R).
  cumulative_density_ : DataFrame
      The estimated cumulative density function (with custom timeline if provided)
  confidence_interval_cumulative_density_ : DataFrame
      The lower and upper confidence intervals for the cumulative density.
  durations: array
      The durations provided
  event_observed: array
      The event_observed variable provided
  timeline: array
      The time line to use for plotting and indexing
  entry: array or None
      The entry array provided, or None
  event_table: DataFrame
      A summary of the life table
code: def _bounds(self, estimate_, cumulative_sq_, alpha, ci_labels):
      # This method calculates confidence intervals using the exponential Greenwood formula.
      # See https://www.math.wustl.edu/%7Esawyer/handouts/greenwood.pdf
      z = inv_normal_cdf(1 - alpha / 2)
      df = pd.DataFrame(index=self.timeline)
      v = np.log(estimate_.values)
  
      if ci_labels is None:
          ci_labels = [
              "%s_lower_%g" % (self._label, 1 - alpha),
              "%s_upper_%g" % (self._label, 1 - alpha),
          ]
      assert (
          len(ci_labels) == 2
      ), "ci_labels should be a length 2 array."
  
      df[ci_labels[0]] = np.exp(
          -np.exp(
              np.log(-v)
              - z * np.sqrt(cumulative_sq_.values[:, None]) / v
          )
      )
      df[ci_labels[1]] = np.exp(
          -np.exp(
              np.log(-v)
              + z * np.sqrt(cumulative_sq_.values[:, None]) / v
          )
      )
      return df.fillna(1.0)
  
imports: from __future__ import annotations
  import warnings
  import numpy
  import pandas
  import typing
  from lifelines.fitters import NonParametricUnivariateFitter
  from lifelines.exceptions import StatError, StatisticalWarning
  from lifelines.utils import _preprocess_inputs, _additive_estimate, _to_1d_array, inv_normal_cdf, median_survival_times, qth_survival_time, check_nans_or_infs, coalesce, CensoringType, pass_for_numeric_dtypes_or_raise_array, check_nans_or_infs
  from lifelines.plotting import loglogs_plot, _plot_estimate
  from lifelines.fitters.npmle import npmle, reconstruct_survival_function, npmle_compute_confidence_intervals
label_desc: Use image node_id 13 for calling the KaplanMeierFitter obj's underlying member method code with example usage: obj._bounds(estimate_, cumulative_sq_, alpha, ci_labels) and returns: df