code: def _tile_series_series(cls, op: "DataFrameAlign"):
      nsplits, _, left_chunks, right_chunks = align_series_series(
          op.lhs, op.rhs
      )
      cls._check_align_needed(op, left_chunks, right_chunks)
  
      l_chunks, r_chunks = [], []
      for idx, (lc, rc) in enumerate(zip(left_chunks, right_chunks)):
          kws = [lc.params, rc.params]
          kws[0]["index"] = kws[1]["index"] = (idx,)
  
          chunk_op = op.copy().reset_key()
          l_chunk, r_chunk = chunk_op.new_chunks([lc, rc], kws=kws)
          l_chunks.append(l_chunk)
          r_chunks.append(r_chunk)
      return nsplits, l_chunks, r_chunks
  
imports: from typing import Any, Optional, Union
  import numpy
  from ...None import opcodes
  from ...core import get_output_types, recursive_tile, OutputType
  from ...serialization.serializables import AnyField, KeyField, StringField, Int16Field, Int64Field
  from ...typing import TileableType
  from ..operands import DataFrameOperand, DataFrameOperandMixin
  from ..align import align_dataframe_dataframe, align_dataframe_series, align_series_series
  from ..core import IndexValue
  from ..utils import validate_axis, parse_index, build_empty_df
label_desc: Use image node_id 13 for calling the DataFrameAlign obj's underlying member method code with example usage: obj._tile_series_series(cls, op) and returns: nsplits,  l_chunks,  r_chunks