code: def stochastic_from_data(name, data, lower=-np.inf, upper=np.inf,
                           value=None, observed=False, trace=True, verbose=-1, debug=False):
      
      pdf = gaussian_kde(data)  # automatic bandwidth selection
  
      # account for tail contribution
      lower_tail = upper_tail = 0.
      if lower > -np.inf:
          lower_tail = pdf.integrate_box(-np.inf, lower)
      if upper < np.inf:
          upper_tail = pdf.integrate_box(upper, np.inf)
      factor = 1. / (1. - (lower_tail + upper_tail))
  
      def logp(value):
          prob = factor * pdf(value)
          if value < lower or value > upper:
              return -np.inf
          elif prob <= 0.:
              return -np.inf
          else:
              return np.log(prob)
  
      def random():
          res = pdf.resample(1)[0][0]
          while res < lower or res > upper:
              res = pdf.resample(1)[0][0]
          return res
  
      if value is None:
          value = random()
  
      return Stochastic(logp=logp,
                        doc='Non-parametric density with Gaussian Kernels.',
                        name=name,
                        parents={},
                        random=random,
                        trace=trace,
                        value=value,
                        dtype=float,
                        observed=observed,
                        verbose=verbose)
docs: Return a Stochastic subclass made from arbitrary data.
  
      The histogram for the data is fitted with Kernel Density Estimation.
  
      :Parameters:
        - `data`  : An array with samples (e.g. trace[:])
        - `lower` : Lower bound on possible outcomes
        - `upper` : Upper bound on possible outcomes
  
      :Example:
         >>> from pymc import stochastic_from_data
         >>> pos = stochastic_from_data('posterior', posterior_samples)
         >>> prior = pos # update the prior with arbitrary distributions
  
      :Alias:
        Histogram