cake dataset

    Parameters
    ----------
    return_X_y : bool,
        if True, returns a model-ready tuple of data (X, y)
        otherwise, returns a Pandas DataFrame

    Returns
    -------
    model-ready tuple of data (X, y)
        OR
    Pandas DataFrame

    Notes
    -----
    X contains the category of recipe used transformed to an integer,
    the catergory of replicate, and the temperatue.

    y contains the angle at which the cake broke.

    Source:
    https://vincentarelbundock.github.io/Rdatasets/doc/lme4/cake.html

def cake(return_X_y=True):
    """cake dataset

    Parameters
    ----------
    return_X_y : bool,
        if True, returns a model-ready tuple of data (X, y)
        otherwise, returns a Pandas DataFrame

    Returns
    -------
    model-ready tuple of data (X, y)
        OR
    Pandas DataFrame

    Notes
    -----
    X contains the category of recipe used transformed to an integer,
    the catergory of replicate, and the temperatue.

    y contains the angle at which the cake broke.

    Source:
    https://vincentarelbundock.github.io/Rdatasets/doc/lme4/cake.html
    """
    # y is real
    # recommend LinearGAM
    cake = pd.read_csv(PATH + '/cake.csv', index_col=0)
    if return_X_y:
        X = cake[['recipe', 'replicate', 'temperature']].values
        X[:,0] = np.unique(cake.values[:,1], return_inverse=True)[1]
        X[:,1] -= 1
        y = cake['angle'].values
        return _clean_X_y(X, y)
    return cake