<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def effective_sample_size(data, *, var_names=None):
 r"""Calculate estimate of the effective sample size. Parameters data : obj Any object that can be converted to an az.InferenceData object Refer to documentation of az.convert_to_dataset for details At least 2 posterior chains are needed to compute this diagnostic of one or more stochastic parameters. var_names : list Names of variables to include in the effective_sample_size report Returns ------- ess : xarray.Dataset Return the effective sample size, :math:`\hat{N}_{eff}` Notes ----- The diagnostic is computed by: .. math:: \hat{N}_{eff} = \frac{MN}{\hat{\tau}} .. math:: \hat{\tau} = -1 + 2 \sum_{t'=0}^K \hat{P}_t' where :math:`\hat{\rho}_t` is the estimated _autocorrelation at lag t, and T is the first odd positive integer for which the sum :math:`\hat{\rho}_{T+1} + \hat{\rho}_{T+1}` is negative. The current implementation is similar to Stan, which uses Geyer's initial monotone sequence criterion (Geyer, 1992; Geyer, 2011). References https://mc-stan.org/docs/2_18/reference-manual/effective-sample-size-section.html Section 15.4.2 Gelman et al. BDA (2014) Formula 11.8 """

    if isinstance(data, np.ndarray):
        return _get_ess(data)

    dataset = convert_to_dataset(data, group="posterior")
    var_names = _var_names(var_names, dataset)

    dataset = dataset if var_names is None else dataset[var_names]
    return xr.apply_ufunc(_ess_ufunc, dataset, input_core_dims=(("chain", "draw"),))