code: def describe(df, dtype=None):
      
      if dtype is None:
          dtype = {}
      print('Number of datapoints: {datapoints}'.format(datapoints=len(df)))
      column_info, column_info_meta = _get_column_info(df, dtype)
  
      if len(column_info['int']) > 0:
          _describe_int(df, column_info)
  
      if len(column_info['float']) > 0:
          _describe_float(df, column_info)
  
      if len(column_info['category']) > 0:
          _describe_category(df, column_info, column_info_meta)
  
      if len(column_info['time']) > 0:
          _describe_time(df, column_info, column_info_meta)
  
      if len(column_info['other']) > 0:
          _describe_other(df, column_info, column_info_meta)
  
      column_types = {}
      for column_type, columns in column_info.items():
          for column_name in columns:
              if column_type == 'other':
                  column_type = 'str'
              column_types[column_name] = column_type
      return column_types
docs: Print a description of a Pandas dataframe.
  
      Parameters
      ----------
      df : Pandas.DataFrame
      dtype : dict
          Maps column names to types