code: def test_shuffle(setup):
      from ....dataframe import DataFrame
  
      chunk_size, n_rows = 10, 100
      df = DataFrame(
          pd.DataFrame(np.random.rand(n_rows, 3), columns=list("abc")),
          chunk_size=chunk_size,
      )
      chunk_graph = (
          df.groupby(["a"]).apply(lambda x: x).build_graph(tile=True)
      )
      [proxy_chunk] = [
          c for c in chunk_graph if isinstance(c.op, ShuffleProxy)
      ]
      successors = chunk_graph.successors(proxy_chunk)
      n_reducers = successors[0].op.n_reducers
      assert n_reducers == len(successors), (
          n_reducers,
          len(successors),
      )
      assert len(set(c.op.n_reducers for c in successors)) == 1
      assert sorted([c.op.reducer_ordinal for c in successors]) == list(
          range(n_reducers)
      )
  
imports: import numpy
  import pandas
  import pytest
  from ....dataframe import core
  from ...None import OutputType
  from ..None import Operand, TileableOperandMixin, execute, estimate_size, ShuffleProxy
label_desc: Use image node_id 5 for calling a global function with example usage: test_shuffle(setup) without return types