def METHOD_NAME(
    nrows: int = 30,
    ncols: int = 30,
    na_ratio: float = 0.0,
    str_col_name_max_len: int = 100,
    random_state: Union[int, np.random.RandomState] = 0,
) -> pd.DataFrame:
    """
    Return a randomly generated dataframe.
    The column name, data types are both randomly generated.
    Note that if na_ratio is not 0.0, then the column type may not contain all types,
    since there is a type transform when add NA to some series, e.g., boolean.
    Parameters
    ----------
    nrows: int
        Number of rows of the generated dataframe.
    na_ratio:
        Ratio of NA values.
    str_col_name_max_len:
        max length of string column name
    ncols: int
        Number of columns of the generated dataframe.
    seed: int
        Random Seed
    """
    rand = _resolve_random_state(random_state)
    dtypes = ["int", "float", "boolean", "datetime", "string", "object"]
    # Generate random columns
    col_types = rand.choice(dtypes, size=ncols)
    series_list = {}
    for i in range(ncols):
        series = gen_random_series(nrows, dtype=col_types[i], na_ratio=na_ratio, random_state=rand)
        series_list[i] = series
    df = pd.DataFrame(series_list)
    # Generate random column names and index.
    col_names = gen_random_series(
        size=ncols,
        dtype="object",
        na_ratio=0.1,
        str_max_len=str_col_name_max_len,
        random_state=rand,
    )
    df.columns = col_names
    df.index = gen_random_series(
        df.index.shape[0], na_ratio=0.1, str_max_len=str_col_name_max_len, random_state=rand
    )
    return df