'Returns the kernel smoothing estimate for point x based on x-values
xs and y-values ys.
Not expected to be called by the user.
Special implementation optimised for Biweight.'

def smooth(self, xs, ys, x):

    (xs, ys) = self.in_domain(xs, ys, x)
    if (len(xs) > 0):
        w = np.sum(square(subtract(1, square(divide(subtract(xs, x), self.h)))))
        v = np.sum(multiply(ys, square(subtract(1, square(divide(subtract(xs, x), self.h))))))
        return (v / w)
    else:
        return np.nan
