code: def empty_dataframe(description, data_type=Library.PANDAS):
      """Deserialize empty dataframe from dataframe description.
  
      Args:
          description (dict) : Description of dataframe.
  
      Returns:
          df (DataFrame) : Empty dataframe with Woodwork initialized.
      """
      # TODO: Can we update Woodwork to return an empty initialized dataframe from a description
      # instead of using this function? Or otherwise eliminate? Issue #1476
      logical_types = {}
      semantic_tags = {}
      column_descriptions = {}
      column_metadata = {}
      use_standard_tags = {}
      category_dtypes = {}
      columns = []
      for col in description["column_typing_info"]:
          col_name = col["name"]
          columns.append(col_name)
  
          ltype_metadata = col["logical_type"]
          ltype = ww_type_system.str_to_logical_type(
              ltype_metadata["type"],
              params=ltype_metadata["parameters"],
          )
  
          tags = col["semantic_tags"]
  
          if "index" in tags:
              tags.remove("index")
          elif "time_index" in tags:
              tags.remove("time_index")
  
          logical_types[col_name] = ltype
          semantic_tags[col_name] = tags
          column_descriptions[col_name] = col["description"]
          column_metadata[col_name] = col["metadata"]
          use_standard_tags[col_name] = col["use_standard_tags"]
  
          if col["physical_type"]["type"] == "category":
              # Make sure categories are recreated properly
              cat_values = col["physical_type"]["cat_values"]
              cat_dtype = col["physical_type"]["cat_dtype"]
              cat_object = pd.CategoricalDtype(
                  pd.Index(cat_values, dtype=cat_dtype)
              )
              category_dtypes[col_name] = cat_object
  
      dataframe = pd.DataFrame(columns=columns).astype(category_dtypes)
      if data_type == Library.DASK:
          dataframe = dd.from_pandas(dataframe, npartitions=1)
      elif data_type == Library.SPARK:
          dataframe = ps.from_pandas(dataframe)
  
      dataframe.ww.init(
          name=description.get("name"),
          index=description.get("index"),
          time_index=description.get("time_index"),
          logical_types=logical_types,
          semantic_tags=semantic_tags,
          use_standard_tags=use_standard_tags,
          table_metadata=description.get("table_metadata"),
          column_metadata=column_metadata,
          column_descriptions=column_descriptions,
          validate=False,
      )
  
      return dataframe
  
file_path: featuretools/featuretools/entityset/deserialize.py
imports: import json
  import os
  import tarfile
  import tempfile
  import pandas
  import woodwork.type_sys.type_system
  from woodwork.deserialize import read_woodwork_table
  from featuretools.entityset.relationship import Relationship
  from featuretools.utils.gen_utils import Library, import_or_none
  from featuretools.utils.s3_utils import get_transport_params, use_smartopen_es
  from featuretools.utils.schema_utils import check_schema_version
  from featuretools.utils.wrangle import _is_local_tar, _is_s3, _is_url
label_desc: Use image node_id 2 for calling a global function with example usage: empty_dataframe(description, data_type) and returns: dataframe