code: def perform_global_dataframe_analysis(
      df: Optional[pd.DataFrame],
  ) -> dict:
      """
      Returns a python dict containing global information about a pandas DataFrame :
      Number of features, Number of observations, missing values...
  
      Parameters
      ----------
      df : pd.DataFrame
          The dataframe that will be used to compute global information.
  
      Returns
      -------
      global_d : dict
          dictionary that contains an ensemble of global information about the input dataframe.
      """
      if df is None:
          return dict()
      missing_values = df.isna().sum().sum()
      global_d = {
          "number of features": len(df.columns),
          "number of observations": df.shape[0],
          "missing values": missing_values,
          "% missing values": missing_values
          / (df.shape[0] * df.shape[1]),
      }
  
      for stat in global_d.keys():
          if stat == "number of observations":
              global_d[stat] = int(
                  global_d[stat]
              )  # Keeping the exact number
          elif isinstance(global_d[stat], float):
              global_d[stat] = round_to_k(global_d[stat], 3)
  
      replace_dict_values(global_d, display_value, ",", ".")
  
      return global_d
  
imports: from typing import Optional
  import pandas
  from shapash.report.common import VarType, display_value, replace_dict_values
  from shapash.webapp.utils.utils import round_to_k
label_desc: Use image node_id 1 for calling a global function with example usage: perform_global_dataframe_analysis(df) and returns: global_d, dict