def METHOD_NAME(data_path, names_path, **read_kwargs) -> pd.DataFrame:
    # Load column names
    column_map = OrderedDict()
    line_regexp = re.compile(r"^([-\w]+): (.*)[.]$")
    with open(names_path, "r") as f_in:
        lines = f_in.readlines()
        for l in lines:
            match = line_regexp.match(l)
            if not match: continue
            col_name = match.group(1)
            col_values = match.group(2).split(", ")
            if len(col_values) == 1:
                col_values = col_values[0]
            column_map[col_name] = col_values
    # Last column is the target
    column_map[UCI_ADULT_TARGET_COL] = ["<=50K", ">50K"]
    # Load data
    data = pd.read_csv(
        data_path,
        header=None,
        names=list(column_map.keys()),
        index_col=None,
        **read_kwargs)
    # Set correct dtypes
    data = data.astype({
        col_name: (
            float if col_value == "continuous" else "category"
        ) for col_name, col_value in column_map.items()
    })
    # Strip whitespace from categorical values
    for col in data.columns:
        if pd.api.types.is_categorical_dtype(data[col]):
            data[col] = data[col].map(lambda val: val.strip())
    return data