def data_profiling_num_vars(df, col_name):
    """
    This function computes basic statistics for the numerical column col_name in the dataframe df
    
    params: df a dataframe that contains the column col_name
            col_name a string with the name of the numerical variable from which we want to compute the statistics
    returns: dic a dictionary with the name and values of the basic statistics
    """
    top = df[col_name].value_counts().head(3).index.tolist()
    
    #Check all lists have the same lenght
    if len(top) != 3:
        if len(top) == 2:
            top.extend(['-'])
        else:
            top.extend(['-', '-'])
    
    dic = {'n_observations': df[col_name].count(),
           'max': df[col_name].max(),
           'min': df[col_name].min(),
           'mean': df[col_name].mean(),
           'std_dev': df[col_name].std(),
           '25%': df[col_name].quantile(0.25),
           'median': df[col_name].median(),
           '75%': df[col_name].quantile(0.75),
           'kurtosis': df[col_name].kurtosis(),
           'skewness': df[col_name].skew(),
           'n_unique_values': df[col_name].nunique(),
           '%_missings': df[col_name].isna().mean()*100,
           'Top1_most_common': top[0],
           'Top2_most_common': top[1],
           'Top3_most_common': top[2]
          }
           
    return dic