def METHOD_NAME(df, options, num_bins=None, sample_size=None):
    """get per column data stats from dataframe"""
    results_dict = {}
    if df.empty:
        return results_dict
    if sample_size and df.shape[0] > sample_size:
        df = df.sample(sample_size)
    num_bins = num_bins or default_num_bins
    if InferOptions.get_common_options(options, InferOptions.Index) and df.index.names:
        df = df.reset_index()
    for col, values in df.describe(include="all", datetime_is_numeric=True).items():
        stats_dict = {}
        for stat, val in values.dropna().items():
            if isinstance(val, (float, np.floating, np.float64)):
                stats_dict[stat] = float(val)
            elif isinstance(val, (int, np.integer, np.int64)):
                # boolean values are considered subclass of int
                if isinstance(val, bool):
                    stats_dict[stat] = bool(val)
                else:
                    stats_dict[stat] = int(val)
            else:
                stats_dict[stat] = str(val)
        if InferOptions.get_common_options(
            options, InferOptions.Histogram
        ) and pd.api.types.is_numeric_dtype(df[col]):
            # store histogram
            try:
                hist, bins = np.histogram(df[col], bins=num_bins)
                stats_dict["hist"] = [hist.tolist(), bins.tolist()]
            except Exception:
                pass
        results_dict[col] = stats_dict
    return results_dict