code: def write(self, df: "DataFrame", name=None, namespace=None):
      self.artifact.consumed()
      logger.debug(
          f"start writing dataframe to artifact: {self.artifact}, name={name}, namespace={namespace}"
      )
      from fate.arch import dataframe
  
      if name is not None:
          self.artifact.metadata.name = name
      if namespace is not None:
          self.artifact.metadata.namespace = namespace
  
      table = dataframe.serialize(self.ctx, df)
      if "schema" not in self.artifact.metadata.metadata:
          self.artifact.metadata.metadata["schema"] = {}
      table.save(
          uri=self.artifact.uri,
          schema=self.artifact.metadata.metadata["schema"],
          options=self.artifact.metadata.metadata.get("options", None),
      )
      # save data overview
      count = df.count()
      samples = df.data_overview()
      from fate.components.core.spec.artifact import DataOverview
  
      self.artifact.metadata.data_overview = DataOverview(
          count=count, samples=samples
      )
  
      logger.debug(
          f"write dataframe to artifact: <uri={self.artifact.uri}, type_name={self.artifact.type_name}>"
      )
  
file_path: FATE/python/fate/components/core/component_desc/artifacts/data/_dataframe.py
imports: import logging
  import typing
  from fate.components.core.essential import DataframeArtifactType
  from .._base_type import ArtifactDescribe, DataOutputMetadata, Metadata, _ArtifactType, _ArtifactTypeReader, _ArtifactTypeWriter
label_desc: Use image node_id 1 for calling the DataframeWriter obj's underlying member method code with example usage: obj.write(df, name, namespace) without return types