code: def gzscore(x):
      
      from scipy.stats import gmean
      # Geometric mean
      geo_mean = gmean(x)
      # Geometric standard deviation
      gstd = np.exp(np.sqrt(np.sum((np.log(x / geo_mean))**2) / (len(x) - 1)))
      # Geometric z-score
      return np.log(x / geo_mean) / np.log(gstd)
docs: Geometric standard (Z) score.
  
      Parameters
      ----------
      x : array_like
          Array of raw values
  
      Returns
      -------
      gzscore : array_like
          Array of geometric z-scores (same shape as x)
  
      Notes
      -----
      Geometric Z-scores are better measures of dispersion than arithmetic
      z-scores when the sample data come from a log-normally distributed
      population.
  
      Given the raw scores :math:`x`, the geometric mean :math:`\\mu_g` and
      the geometric standard deviation :math:`\\sigma_g`,
      the standard score is given by the formula:
  
      .. math:: z = \\frac{log(x) - log(\\mu_g)}{log(\\sigma_g)}
  
      References
      ----------
  
      .. [1] https://en.wikipedia.org/wiki/Geometric_standard_deviation
  
      Examples
      --------
      Standardize a log-normal array
  
      >>> import numpy as np
      >>> from pingouin import gzscore
      >>> np.random.seed(123)
      >>> raw = np.random.lognormal(size=100)
      >>> z = gzscore(raw)
      >>> print(round(z.mean(), 3), round(z.std(), 3))
      -0.0 0.995