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
docstr: Parameters
  ----------
    durations: an array, list, pd.DataFrame or pd.Series
      length n -- duration subject was observed for
    event_observed: an array, list, pd.DataFrame, or pd.Series, optional
       True if the the death was observed, False if the event was lost (right-censored). Defaults all True if event_observed==None
    timeline: an array, list, pd.DataFrame, or pd.Series, optional
      return the best estimate at the values in timelines (positively increasing)
    entry: an array, list, pd.DataFrame, or pd.Series, optional
       relative time when a subject entered the study. This is useful for left-truncated (not left-censored) observations. If None, all members of the population
       entered study when they were "born".
    label: string, optional
      a string to name the column of the estimate.
    alpha: float, optional
      the alpha value in the confidence intervals. Overrides the initializing alpha for this call to fit only.
    ci_labels: tuple, optional
          add custom column names to the generated confidence intervals as a length-2 list: [<lower-bound name>, <upper-bound name>]. Default: <label>_lower_<1-alpha/2>
    weights: an array, list, pd.DataFrame, or pd.Series, optional
        if providing a weighted dataset. For example, instead
        of providing every subject as a single element of `durations` and `event_observed`, one could
        weigh subject differently.
  
  Returns
  -------
  self: KaplanMeierFitter
    self with new properties like ``survival_function_``, ``plot()``, ``median_survival_time_``
docstr_tok: ["Parameters","--","--","--","--","--","durations",":","an","array",",","list",",","pd.DataFrame","or","pd.Series","length","n","--","duration","subject","was","observed","for","event_observed",":","an","array",",","list",",","pd.DataFrame",",","or","pd.Series",",","optional","True","if","the","the","death","was","observed",",","False","if","the","event","was","lost","(","right-censored",")",".","Defaults","all","True","if","event_observed==None","timeline",":","an","array",",","list",",","pd.DataFrame",",","or","pd.Series",",","optional","return","the","best","estimate","at","the","values","in","timelines","(","positively","increasing",")","entry",":","an","array",",","list",",","pd.DataFrame",",","or","pd.Series",",","optional","relative","time","when","a","subject","entered","the","study",".","This","is","useful","for","left-truncated","(","not","left-censored",")","observations",".","If","None",",","all","members","of","the","population","entered","study","when","they","were","``","born","''",".","label",":","string",",","optional","a","string","to","name","the","column","of","the","estimate",".","alpha",":","float",",","optional","the","alpha","value","in","the","confidence","intervals",".","Overrides","the","initializing","alpha","for","this","call","to","fit","only",".","ci_labels",":","tuple",",","optional","add","custom","column","names","to","the","generated","confidence","intervals","as","a","length-2","list",":","[","<","lower-bound","name",">",",","<","upper-bound","name",">","]",".","Default",":","<","label",">","_lower_","<","1-alpha\/2",">","weights",":","an","array",",","list",",","pd.DataFrame",",","or","pd.Series",",","optional","if","providing","a","weighted","dataset",".","For","example",",","instead","of","providing","every","subject","as","a","single","element","of","`","durations","`","and","`","event_observed","`",",","one","could","weigh","subject","differently",".","Returns","--","--","--","-","self",":","KaplanMeierFitter","self","with","new","properties","like","``","survival_function_","``",",","``","plot","(",")","``",",","``","median_survival_time_","``"]
code: def _fit(
      self,
      durations,
      event_observed=None,
      timeline=None,
      entry=None,
      label: t.Optional[str] = None,
      alpha=None,
      ci_labels=None,
      weights=None,
  ):  # pylint: disable=too-many-arguments,too-many-locals
      """
      Parameters
      ----------
        durations: an array, list, pd.DataFrame or pd.Series
          length n -- duration subject was observed for
        event_observed: an array, list, pd.DataFrame, or pd.Series, optional
           True if the the death was observed, False if the event was lost (right-censored). Defaults all True if event_observed==None
        timeline: an array, list, pd.DataFrame, or pd.Series, optional
          return the best estimate at the values in timelines (positively increasing)
        entry: an array, list, pd.DataFrame, or pd.Series, optional
           relative time when a subject entered the study. This is useful for left-truncated (not left-censored) observations. If None, all members of the population
           entered study when they were "born".
        label: string, optional
          a string to name the column of the estimate.
        alpha: float, optional
          the alpha value in the confidence intervals. Overrides the initializing alpha for this call to fit only.
        ci_labels: tuple, optional
              add custom column names to the generated confidence intervals as a length-2 list: [<lower-bound name>, <upper-bound name>]. Default: <label>_lower_<1-alpha/2>
        weights: an array, list, pd.DataFrame, or pd.Series, optional
            if providing a weighted dataset. For example, instead
            of providing every subject as a single element of `durations` and `event_observed`, one could
            weigh subject differently.
  
      Returns
      -------
      self: KaplanMeierFitter
        self with new properties like ``survival_function_``, ``plot()``, ``median_survival_time_``
  
      """
      durations = np.asarray(durations)
      self._check_values(durations)
  
      if event_observed is not None:
          event_observed = np.asarray(event_observed)
          self._check_values(event_observed)
  
      self._label = coalesce(label, self._label, "KM_estimate")
  
      if weights is not None:
          weights = np.asarray(weights)
          if (weights.astype(int) != weights).any():
              warnings.warn(
                  """It looks like your weights are not integers, possibly propensity scores then?
    It's important to know that the naive variance estimates of the coefficients are biased. Instead use Monte Carlo to
    estimate the variances. See paper "Variance estimation when using inverse probability of treatment weighting (IPTW) with survival analysis"
    or "Adjusted Kaplan-Meier estimator and log-rank test with inverse probability of treatment weighting for survival data."
                    """,
                  StatisticalWarning,
              )
      else:
          weights = np.ones_like(durations, dtype=float)
  
      # if the user is interested in left-censorship, we return estimate the cumulative density, not survival function
      is_left_censoring = CensoringType.is_left_censoring(self)
      primary_estimate_name = "survival_function_"
      secondary_estimate_name = "cumulative_density_"
  
      (
          self.durations,
          self.event_observed,
          self.timeline,
          self.entry,
          self.event_table,
          self.weights,
      ) = _preprocess_inputs(
          durations, event_observed, timeline, entry, weights
      )
  
      alpha = alpha if alpha else self.alpha
      log_estimate, cumulative_sq_ = _additive_estimate(
          self.event_table,
          self.timeline,
          self._additive_f,
          self._additive_var,
          is_left_censoring,
      )
  
      if entry is not None:
          # a serious problem with KM is that when the sample size is small and there are too few early
          # truncation times, it may happen that is the number of patients at risk and the number of deaths is the same.
          # we adjust for this using the Breslow-Fleming-Harrington estimator
          n = self.event_table.shape[0]
          net_population = (
              self.event_table["entrance"] - self.event_table["removed"]
          ).cumsum()
          if net_population.iloc[: int(n / 2)].min() == 0:
              ix = net_population.iloc[: int(n / 2)].idxmin()
              raise StatError(
                  """There are too few early truncation times and too many events. S(t)==0 for all t>%g. Recommend BreslowFlemingHarringtonFitter."""
                  % ix
              )
  
      # estimation
      if is_left_censoring:
          self.cumulative_density_ = pd.DataFrame(
              np.exp(log_estimate), columns=[self._label]
          )
          self.survival_function_ = 1 - self.cumulative_density_
          self.confidence_interval_ = 1 - self._bounds(
              self.cumulative_density_, cumulative_sq_, alpha, ci_labels
          )
  
      else:
          self.survival_function_ = pd.DataFrame(
              np.exp(log_estimate), columns=[self._label]
          )
          self.cumulative_density_ = 1 - self.survival_function_
          self.confidence_interval_ = self._bounds(
              self.survival_function_, cumulative_sq_, alpha, ci_labels
          )
  
      self.confidence_interval_survival_function_ = (
          self.confidence_interval_
      )
      self.confidence_interval_cumulative_density_ = (
          1 - self.confidence_interval_
      )
      self.confidence_interval_cumulative_density_[:] = np.fliplr(
          self.confidence_interval_cumulative_density_.values
      )
      self._median = median_survival_times(self.survival_function_)
      self._cumulative_sq_ = cumulative_sq_
  
      # estimation methods
      self._estimation_method = "survival_function_"
      self._estimate_name = "survival_function_"
  
      return self
  
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 4 for calling the KaplanMeierFitter obj's underlying member method code with example usage: obj._fit(durations, event_observed, timeline, entry, label, alpha, ci_labels, weights) and returns: self