(x_train)
return new_x, shadow_names
Take all X variables, creating copies and randomly shuffling them
    :param x_train: the dataframe to create shadow features on
    :return: dataframe 2x width and the names of the shadows for removing later
Take all X variables, creating copies and randomly shuffling them
    :param x_train: the dataframe to create shadow features on
    :return: dataframe 2x width and the names of the shadows for removing later
Take all X variables creating copies and randomly shuffling them : param x_train : the dataframe to create shadow features on : return : dataframe 2x width and the names of the shadows for removing later
def _create_shadow(x_train):
    """
    Take all X variables, creating copies and randomly shuffling them
    :param x_train: the dataframe to create shadow features on
    :return: dataframe 2x width and the names of the shadows for removing later
    """
    x_shadow = x_train.copy()
    for c in x_shadow.columns:
        np.random.shuffle(x_shadow[c].values)
    # rename the shadow
    shadow_names = ["ShadowVar" + str(i + 1) for i in range(x_train.shape[1])]
    x_shadow.columns = shadow_names
    # Combine to make one new dataframe
    new_x = pd.concat([x_train, x_shadow], axis=1)
    return new_x, shadow_names
def _create_shadow ( x_train ) : x_shadow = x_train . copy ( ) for c in x_shadow . columns : np . random . shuffle ( x_shadow [ c ] . values ) # rename the shadow shadow_names = [ "ShadowVar" + str ( i + 1 ) for i in range ( x_train . shape [ 1 ] ) ] x_shadow . columns = shadow_names # Combine to make one new dataframe new_x = pd . concat ( [ x_train , x_shadow ] , axis = 1 ) return new_x , shadow_names