'Cumulative distribution function for the conditional density.
Parameters
endog_predict: array_like, optional
The evaluation dependent variables at which the cdf is estimated.
If not specified the training dependent variables are used.
exog_predict: array_like, optional
The evaluation independent variables at which the cdf is estimated.
If not specified the training independent variables are used.
Returns
cdf_est: array_like
The estimate of the cdf.
Notes
For more details on the estimation see [2]_, and p.181 in [1]_.
The multivariate conditional CDF for mixed data (continuous and
ordered/unordered discrete) is estimated by:
.. math::
F(y|x)=\frac{n^{-1}\sum_{i=1}^{n}G(\frac{y-Y_{i}}{h_{0}}) W_{h}(X_{i},x)}{\widehat{\mu}(x)}
where G() is the product kernel CDF estimator for the dependent (y)
variable(s) and W() is the product kernel CDF estimator for the
independent variable(s).
References
.. [1] Racine, J., Li, Q. Nonparametric econometrics: theory and
practice. Princeton University Press. (2007)
.. [2] Liu, R., Yang, L. "Kernel estimation of multivariate cumulative
distribution function." Journal of Nonparametric
Statistics (2008)'

def cdf(self, endog_predict=None, exog_predict=None):

    if (endog_predict is None):
        endog_predict = self.endog
    else:
        endog_predict = _adjust_shape(endog_predict, self.k_dep)
    if (exog_predict is None):
        exog_predict = self.exog
    else:
        exog_predict = _adjust_shape(exog_predict, self.k_indep)
    N_data_predict = np.shape(exog_predict)[0]
    cdf_est = np.empty(N_data_predict)
    for i in range(N_data_predict):
        mu_x = (gpke(self.bw[self.k_dep:], data=self.exog, data_predict=exog_predict[i, :], var_type=self.indep_type) / self.nobs)
        mu_x = np.squeeze(mu_x)
        cdf_endog = gpke(self.bw[0:self.k_dep], data=self.endog, data_predict=endog_predict[i, :], var_type=self.dep_type, ckertype='gaussian_cdf', ukertype='aitchisonaitken_cdf', okertype='wangryzin_cdf', tosum=False)
        cdf_exog = gpke(self.bw[self.k_dep:], data=self.exog, data_predict=exog_predict[i, :], var_type=self.indep_type, tosum=False)
        S = (cdf_endog * cdf_exog).sum(axis=0)
        cdf_est[i] = (S / (self.nobs * mu_x))
    return cdf_est
