code: def _tile_directional_dataframe(cls, op):
      in_df = op.inputs[0]
      df = op.outputs[0]
      is_forward = op.method == "ffill"
  
      n_rows, n_cols = in_df.chunk_shape
  
      # map to get individual results and summaries
      src_chunks = np.empty(in_df.chunk_shape, dtype=object)
      summary_chunks = np.empty(in_df.chunk_shape, dtype=object)
      for c in in_df.chunks:
          new_chunk_op = op.copy().reset_key()
          new_chunk_op.stage = OperandStage.map
          if op.axis == 1:
              summary_shape = (c.shape[0], 1)
          else:
              summary_shape = (1, c.shape[1])
          src_chunks[c.index] = c
          summary_chunks[c.index] = new_chunk_op.new_chunk(
              [c], shape=summary_shape, dtypes=df.dtypes
          )
  
      # combine summaries into results
      output_chunk_array = np.empty(in_df.chunk_shape, dtype=object)
      if op.axis == 1:
          for row in range(n_rows):
              row_src = src_chunks[row, :]
              row_summaries = summary_chunks[row, :]
              for col in range(n_cols):
                  output_chunk_array[row, col] = cls._build_combine(
                      op, row_src, row_summaries, col, is_forward
                  )
      else:
          for col in range(n_cols):
              col_src = src_chunks[:, col]
              col_summaries = summary_chunks[:, col]
              for row in range(n_rows):
                  output_chunk_array[row, col] = cls._build_combine(
                      op, col_src, col_summaries, row, is_forward
                  )
  
      output_chunks = list(
          output_chunk_array.reshape((n_rows * n_cols,))
      )
      new_op = op.copy().reset_key()
      return new_op.new_tileables(
          op.inputs,
          shape=in_df.shape,
          nsplits=in_df.nsplits,
          chunks=output_chunks,
          dtypes=df.dtypes,
          index_value=df.index_value,
          columns_value=df.columns_value,
      )
  
imports: import itertools
  import numpy
  import pandas
  from ...None import opcodes
  from ...config import options
  from ...core import ENTITY_TYPE, Entity, OutputType, get_output_types
  from ...core.operand import OperandStage
  from ...serialization.serializables import StringField, AnyField, BoolField, Int64Field
  from ..align import align_dataframe_dataframe, align_dataframe_series, align_series_series
  from ..core import DATAFRAME_TYPE, SERIES_TYPE
  from ..operands import DataFrameOperandMixin, DataFrameOperand
  from ..utils import validate_axis
label_desc: Use image node_id 16 for calling the FillNA obj's underlying member method code with example usage: obj._tile_directional_dataframe(cls, op) and returns: new_op