'Attach the density estimate to the KDEUnivariate class.
Parameters
kernel : str
The Kernel to be used. Choices are:
- "biw" for biweight
- "cos" for cosine
- "epa" for Epanechnikov
- "gau" for Gaussian.
- "tri" for triangular
- "triw" for triweight
- "uni" for uniform
bw : str, float
The bandwidth to use. Choices are:
- "scott" - 1.059 * A * nobs ** (-1/5.), where A is
`min(std(X),IQR/1.34)`
- "silverman" - .9 * A * nobs ** (-1/5.), where A is
`min(std(X),IQR/1.34)`
- "normal_reference" - C * A * nobs ** (-1/5.), where C is
calculated from the kernel. Equivalent (up to 2 dp) to the
"scott" bandwidth for gaussian kernels. See bandwidths.py
- If a float is given, it is the bandwidth.
fft : bool
Whether or not to use FFT. FFT implementation is more
computationally efficient. However, only the Gaussian kernel
is implemented. If FFT is False, then a \'nobs\' x \'gridsize\'
intermediate array is created.
gridsize : int
If gridsize is None, max(len(X), 50) is used.
cut : float
Defines the length of the grid past the lowest and highest values
of X so that the kernel goes to zero. The end points are
-/+ cut*bw*{min(X) or max(X)}
adjust : float
An adjustment factor for the bw. Bandwidth becomes bw * adjust.'

def fit(self, kernel='gau', bw='normal_reference', fft=True, weights=None, gridsize=None, adjust=1, cut=3, clip=((- np.inf), np.inf)):

    try:
        bw = float(bw)
        self.bw_method = 'user-given'
    except:
        self.bw_method = bw
    endog = self.endog
    if fft:
        if (kernel != 'gau'):
            msg = 'Only    gaussian    kernel    is    available    for    fft'
            raise NotImplementedError(msg)
        if (weights is not None):
            msg = 'Weights    are    not    implemented    for    fft'
            raise NotImplementedError(msg)
        (density, grid, bw) = kdensityfft(endog, kernel=kernel, bw=bw, adjust=adjust, weights=weights, gridsize=gridsize, clip=clip, cut=cut)
    else:
        (density, grid, bw) = kdensity(endog, kernel=kernel, bw=bw, adjust=adjust, weights=weights, gridsize=gridsize, clip=clip, cut=cut)
    self.density = density
    self.support = grid
    self.bw = bw
    self.kernel = kernel_switch[kernel](h=bw)
    self.kernel.weights = weights
    if (weights is not None):
        self.kernel.weights /= weights.sum()
    self._cache = resettable_cache()
