class_docstr: Descriptor data type for Pandas Dataframe
class_docstr_tok: ["Descriptor","data","type","for","Pandas","Dataframe"]
code: def generate_catalog_entries(
      self, is_input=False
  ) -> List[Type[FunctionIOCatalogEntry]]:
      catalog_entries = []
  
      if not self.column_types:
          self.column_types = [NdArrayType.ANYTYPE] * len(self.columns)
  
      if not self.column_shapes:
          self.column_shapes = [Dimension.ANYDIM] * len(self.columns)
  
      # check that columns, column_types and column_shapes are of same length
      if len(self.columns) != len(self.column_types) or len(
          self.columns
      ) != len(self.column_shapes):
          raise FunctionIODefinitionError(
              "columns, column_types and column_shapes should be of same length if specified. "
          )
  
      for column_name, column_type, column_shape in zip(
          self.columns, self.column_types, self.column_shapes
      ):
          catalog_entries.append(
              FunctionIOCatalogEntry(
                  name=column_name,
                  type=ColumnType.NDARRAY,
                  is_nullable=False,
                  array_type=column_type,
                  array_dimensions=column_shape,
                  is_input=is_input,
              )
          )
  
      return catalog_entries
  
file_path: evadb/evadb/functions/decorators/io_descriptors/data_types.py
imports: from typing import List, Tuple, Type
  from evadb.catalog.catalog_type import ColumnType, Dimension, NdArrayType
  from evadb.catalog.models.function_io_catalog import FunctionIOCatalogEntry
  from evadb.functions.decorators.io_descriptors.abstract_types import IOArgument, IOColumnArgument
  from evadb.utils.errors import FunctionIODefinitionError
label_desc: Use image node_id 2 for calling the PandasDataframe obj's underlying member method code with example usage: obj.generate_catalog_entries(is_input) and returns: catalog_entries