code: def read_partitioned_to_cudf(
      cls,
      file,
      partitions: Dict,
      partition_keys: Dict,
      columns=None,
      nrows=None,
      **kwargs,
  ):
      # cudf will read entire partitions even if only one partition provided,
      # so we just read with pyarrow and convert to cudf DataFrame
      file = pq.ParquetFile(file)
      t = file.read(columns=columns, **kwargs)
      t = t.slice(0, nrows) if nrows is not None else t
      t = pa.table(t.columns, names=t.column_names)
      raw_df = cudf.DataFrame.from_arrow(t)
      for col, value in partition_keys.items():
          dictionary = partitions[col].tolist()
          codes = cudf.core.column.as_column(
              dictionary.index(value), length=len(raw_df)
          )
          raw_df[col] = cudf.core.column.build_categorical_column(
              categories=dictionary,
              codes=codes,
              size=codes.size,
              offset=codes.offset,
              ordered=False,
          )
      return raw_df
  
imports: import os
  from typing import Dict
  from urllib.parse import urlparse
  import numpy
  import pandas
  from ...None import opcodes
  from ...config import options
  from ...lib.filesystem import file_size, get_fs, glob, open_file, FileSystem
  from ...serialization.serializables import AnyField, BoolField, DictField, ListField, StringField, Int32Field, Int64Field
  from ...utils import is_object_dtype, lazy_import
  from ..arrays import ArrowStringDtype
  from ..operands import OutputType
  from ..utils import parse_index, to_arrow_dtypes, contain_arrow_dtype
  from .core import IncrementalIndexDatasource, ColumnPruneSupportedDataSourceMixin, IncrementalIndexDataSourceMixin, merge_small_files
label_desc: Use image node_id 3 for calling the CudfEngine obj's underlying member method code with example usage: obj.read_partitioned_to_cudf(cls, file, partitions, partition_keys, columns, nrows) and returns: raw_df