code: def get_numerical_features(
      fnum, fname, df, nvalues, dt, sentinel, logt, plevel
  ):
      r"""Transform numerical features with imputation and possibly
      log-transformation.
  
      Parameters
      ----------
      fnum : int
          Feature number, strictly for logging purposes
      fname : str
          Name of the numerical column in the dataframe ``df``.
      df : pandas.DataFrame
          Dataframe containing the column ``fname``.
      nvalues : int
          The number of unique values.
      dt : str
          The values ``'float64'``, ``'int64'``, or ``'bool'``.
      sentinel : float
          The number to be imputed for NaN values.
      logt : bool
          If ``True``, then log-transform numerical values.
      plevel : float
          The p-value threshold to test if a feature is normally distributed.
  
      Returns
      -------
      new_values : numpy array
          The set of imputed and transformed features.
      new_fnames : list
          The new feature name(s) for the numerical variable.
  
      """
      feature = df[fname]
      if len(feature) == nvalues:
          logger.info(
              "Feature %d: %s is a numerical feature of type %s with maximum number of values %d",
              fnum,
              fname,
              dt,
              nvalues,
          )
      else:
          logger.info(
              "Feature %d: %s is a numerical feature of type %s with %d unique values",
              fnum,
              fname,
              dt,
              nvalues,
          )
      # imputer for float, integer, or boolean data types
      new_values = impute_values(feature, dt, sentinel)
      # log-transform any values that do not fit a normal distribution
      new_fname = fname
      if logt and np.all(new_values > 0):
          _, pvalue = sps.normaltest(new_values)
          if pvalue <= plevel:
              logger.info(
                  "Feature %d: %s is not normally distributed [p-value: %f]",
                  fnum,
                  fname,
                  pvalue,
              )
              new_values = np.log(new_values)
          else:
              new_fname = USEP.join([new_fname, "log"])
      return new_values, [new_fname]
  
imports: from alphapy.globals import BSEP, LOFF, NULLTEXT
  from alphapy.globals import PSEP, SSEP, USEP
  from alphapy.globals import Encoders
  from alphapy.globals import ModelType
  from alphapy.globals import Scalers
  from alphapy.variables import Variable
  from alphapy.variables import vparse
  import category_encoders
  from importlib import import_module
  import itertools
  import logging
  import math
  import numpy
  import os
  import pandas
  import re
  from scipy import sparse
  import scipy.stats
  from sklearn.cluster import MiniBatchKMeans
  from sklearn.decomposition import PCA
  from sklearn.feature_extraction.text import TfidfVectorizer
  from sklearn.feature_selection import chi2
  from sklearn.feature_selection import f_classif
  from sklearn.feature_selection import f_regression
  from sklearn.feature_selection import SelectFdr
  from sklearn.feature_selection import SelectFpr
  from sklearn.feature_selection import SelectFwe
  from sklearn.feature_selection import SelectKBest
  from sklearn.feature_selection import SelectPercentile
  from sklearn.feature_selection import VarianceThreshold
  from sklearn.impute import SimpleImputer
  from sklearn.manifold import Isomap
  from sklearn.manifold import TSNE
  from sklearn.preprocessing import MinMaxScaler
  from sklearn.preprocessing import PolynomialFeatures
  from sklearn.preprocessing import StandardScaler
  import sys
label_desc: Use image node_id 4 for calling a global function with example usage: get_numerical_features(fnum, fname, df, nvalues, dt, sentinel, logt, plevel) and returns: new_values,  list