Skip to content

Add cuDF agent skill - #22721

Merged
trxcllnt merged 3 commits into
NVIDIA:mainfrom
kjmph:feature/add-cudf-agent-skill
May 29, 2026
Merged

Add cuDF agent skill#22721
trxcllnt merged 3 commits into
NVIDIA:mainfrom
kjmph:feature/add-cudf-agent-skill

Conversation

@kjmph

@kjmph kjmph commented May 29, 2026

Copy link
Copy Markdown
Contributor

Description

Add the NVIDIA-authored cuDF agent skill under the repository-level skills/ directory so compatible agent tooling and the NVIDIA skills publication pipeline can discover it.

The skill includes cuDF usage guidance, reference material, evaluation fixtures, a benchmark report, and current NVSkills validation artifacts for publication review.

Checklist

  • I am familiar with the Contributing Guidelines.
  • New or existing tests cover these changes.
  • The documentation is up to date with these changes.

Add the NVIDIA-authored cuDF agent skill under the repository-level
skills/ directory so compatible agent tooling and the NVIDIA skills
publication pipeline can discover it.

The skill includes cuDF usage guidance, reference material, evaluation
fixtures, a benchmark report, and current NVSkills validation
artifacts for publication review.

Signed-off-by: Kyle Hubert <kjmph@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented May 29, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: d02a21d7-aa92-46bd-a85d-7e2eca6dd8cc

📥 Commits

Reviewing files that changed from the base of the PR and between eff4fea and dd20938.

📒 Files selected for processing (1)
  • .pre-commit-config.yaml
✅ Files skipped from review due to trivial changes (1)
  • .pre-commit-config.yaml

📝 Walkthrough

Summary by CodeRabbit

  • Documentation

    • Added comprehensive GPU DataFrame guides (cuDF, pandas-acceleration, dask-cuDF), API/interop patterns, troubleshooting, memory and performance guidance, and a skill card.
  • Tests

    • Added a broad evaluation suite covering ETL, groupby/joins, null handling, pivot/reshape, timeseries, window functions, string ops, Parquet I/O, and a benchmark report with publication recommendation.
  • Chores

    • Added release metadata and signature bundle; updated pre-commit excludes for skill files.

Walkthrough

Adds a complete accelerated-computing-cudf skill package: skill metadata and benchmark, implementer guide, technical references, an evaluation catalog, and 13+ self-contained example tasks (data generators and pipelines) covering UDFs, ETL, groupby, joins, stream boundaries, null handling, Parquet I/O, reshapes, string ops, timeseries, window functions, and related docs/signature artifacts.

Changes

NVIDIA cuDF GPU DataFrame Skill

Layer / File(s) Summary
Skill metadata and benchmarking results
skills/accelerated-computing-cudf/skill-card.md, skills/accelerated-computing-cudf/BENCHMARK.md, skills/accelerated-computing-cudf/skill.oms.sig
Skill card, benchmark report with tiered NVSkills-Eval results and per-agent scoring, and Sigstore DSSE signature bundle.
Implementer's guide for cuDF workflows
skills/accelerated-computing-cudf/SKILL.md
Implementation guide with compatibility constraints, three execution paths (cudf.pandas, explicit cuDF, dask-cuDF), memory management, troubleshooting, and nullable/fill semantics validation.
Technical reference documentation
skills/accelerated-computing-cudf/references/api-patterns.md, references/cudf-pandas-accelerator.md, references/dask-cudf-patterns.md
Reference guides on cuDF vs pandas semantics, cudf.pandas activation/profiling/fallbacks, and dask-cuDF cluster/partitioning/oom and pattern guidance.
Evaluation task specification
skills/accelerated-computing-cudf/evals/evals.json
JSON catalog of GPU-focused evaluation tasks and starter file mappings covering multiple cuDF operation patterns.
Apply/UDF pipeline example
skills/accelerated-computing-cudf/evals/files/cudf-apply-udf/code/generate_data.py, .../udf_pipeline.py
Claims data generator and UDF-heavy pipeline demonstrating row-wise apply, normalization/winsorization, formatting, and grouped summaries.
CSV-to-Parquet ETL pipeline example
.../cudf-csv-etl/code/generate_data.py, .../etl_pipeline.py
Sales CSV generator and ETL that filters, computes derived columns, aggregates by region/product, and writes Parquet summary.
Groupby aggregation and transform example
.../cudf-groupby-agg/code/generate_data.py, .../groupby_analysis.py
Employee dataset generator with department/multi-key/crosstab aggregations and transform-derived features (z-scores, ranks, cumulative counts).
Multi-table join and aggregation example
.../cudf-multi-join/code/generate_data.py, .../multi_join.py
Three CSV generator and join pipeline with derived metrics and customer/category/tier-channel summaries.
CUDA native stream handoff boundary example
.../cudf-native-stream-handoff-boundary/NOTICE.md, .../run_smoke.sh, .../threaded_handoff.cu
CUDA C++ program and smoke script demonstrating asynchronous producer/consumer stream ordering and checksum verification.
Null/missing value handling example
.../cudf-null-handling/code/generate_data.py, .../null_pipeline.py
Messy data generator with multiple null-injection strategies and a null-analysis/fill pipeline (scalar, dict, group, interpolation, dropna demos).
Parquet I/O and partitioning example
.../cudf-parquet-io/code/generate_data.py, .../parquet_pipeline.py
Partitioned Parquet generator and pipeline: discovery, concat with source tagging, transforms, endpoint/region summaries, and partitioned writes with verification.
Pivot/melt reshape operations example
.../cudf-pivot-melt/code/generate_data.py, .../reshape_analysis.py
Retail sales generator and reshape demos: pivot/multi-agg, melt back, stack/unstack, crosstab, and year-over-year growth.
String operations cleaning pipeline example
.../cudf-string-ops/code/generate_data.py, .../clean_contacts.py
Contacts generator and cleaning pipeline: name/email/phone normalization, address parsing, notes processing and redaction.
Timeseries resampling and rolling stats example
.../cudf-timeseries-resample/code/generate_data.py, .../timeseries_analysis.py
Minute-level sensor generator and resampling/rolling stats pipeline with anomaly detection and day-over-day tracking.
Window functions and feature engineering example
.../cudf-window-functions/code/generate_data.py, .../window_analysis.py
Stock trades generator and window-function feature pipeline (ranks, rolling, expanding, shifts, SMA signals).
Negative example: deep learning training out-of-scope
.../negative-deep-learning-training/code/train.py
PyTorch training script included as a negative/out-of-scope evaluation example.
Nullable fill semantics sourced evaluation example
.../source-cudf-null-fillna-semantics/NOTICE.md, .../code/null_cleanup.py
Attributed example derived from upstream cuDF null-handling tests demonstrating nullable dtype cleanup and aggregation.
Pre-commit exclusion
.pre-commit-config.yaml
Adds top-level exclude to skip ^skills/ files from pre-commit hooks.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

feature request, doc, Python, non-breaking, improvement

Suggested reviewers

  • mroeschke
  • bdice
  • vyasr
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 56.70% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add cuDF agent skill' directly and clearly describes the main change: adding a new cuDF agent skill to the repository.
Description check ✅ Passed The description explains that the PR adds an NVIDIA-authored cuDF agent skill under the skills/ directory with usage guidance, reference material, evaluation fixtures, benchmarks, and validation artifacts—all of which are present in the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 15

🧹 Nitpick comments (12)
skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/multi_join.py (1)

83-99: 💤 Low value

tier_channel_summary returns cross, not the computed pivot.

The wide pivot is only printed and then discarded; the function returns the long-format cross, and tier_ch is never consumed in main(). If the wide table is the intended product, return pivot; otherwise the pivot_table step is dead work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/multi_join.py`
around lines 83 - 99, The function tier_channel_summary currently computes a
wide-format pivot (variable pivot) but returns the long-format cross, discarding
pivot; update tier_channel_summary to return the pivot (or alternatively remove
the pivot computation if wide output is not needed) and ensure the caller in
main uses the returned value (tier_ch) accordingly; locate the pivot_table call
and change the function's return from cross to pivot (and verify any downstream
uses of tier_ch expect the wide-format DataFrame).
skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py (1)

119-149: 💤 Low value

Guard against division-by-zero in growth-rate calculation.

If a store has zero summed revenue for the base year (possible after fill_value=0), the growth ratio produces inf/NaN rather than a meaningful value. For example data this is unlikely but worth a safe fallback in a reference example.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py`
around lines 119 - 149, The growth-rate code in year_over_year_pivot can divide
by zero when a base-year revenue column (e.g., revenue_2022 or revenue_2023) is
zero; update the growth calculation in year_over_year_pivot to guard the
denominator by computing growth only where the base revenue is nonzero and
otherwise assigning a safe fallback (e.g., NaN) — for example, use a boolean
mask or pandas.Series.where to compute (new - base)/base only when base != 0,
then round the result and ensure any inf/-inf are replaced with NaN; apply this
change for both growth_22_23 and growth_23_24 and reference the
revenue_2022/revenue_2023/revenue_2024 column names used in the function.
skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu (2)

1-13: ⚡ Quick win

Add Doxygen documentation for the CUDA source.

Per coding guidelines, C++/CUDA sources must include proper Doxygen documentation. This file has none; consider at minimum a file-level @file/@brief block describing the producer/consumer stream-handoff intent, plus brief docs on fill_kernel, checksum_kernel, NativeGpuTable, and the helper functions.

As per coding guidelines: "C++/CUDA code must include proper Doxygen documentation".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu`
around lines 1 - 13, Add Doxygen comments to this CUDA source by inserting a
file-level block at the top with `@file` and `@brief` describing the
producer/consumer stream-handoff intent and overall purpose; then add brief
Doxygen docblocks (brief + params/return where applicable) immediately above the
key symbols: fill_kernel, checksum_kernel, the NativeGpuTable type/class, and
each helper function used for buffer/stream management so callers understand
inputs, outputs, and thread/stream behavior. Ensure each block follows the
project's Doxygen style (single-line `@brief`, `@param`, `@return` tags as
appropriate) and is placed directly above the corresponding declaration to make
the documentation discoverable.

32-37: 💤 Low value

Spin loop is a no-op and may be eliminated under -O2.

adjusted accumulates + (spin & 1) then - (spin & 1) each iteration, so the final value is provably value. With -O2, nvcc can constant-fold this and drop the loop entirely, removing the artificial delay this fixture relies on to widen the producer/consumer timing window. If the delay is load-bearing for the handoff scenario, use a side-effecting/observable spin (e.g., volatile, or __nanosleep/clock-based wait) instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu`
around lines 32 - 37, The spin loop around adjusted (int adjusted = value; for
(int spin = 0; spin < 4096; ++spin) { adjusted += (spin & 1); adjusted -= (spin
& 1); }) is a no-op and may be optimized away; replace it with an observable
delay so the producer/consumer timing window is preserved — e.g., perform the
loop against a volatile variable or call a short platform sleep/clock wait (use
volatile temp or __nanosleep/clock-based wait) so the compiler cannot elide it,
leaving the final assignment to data[idx] = adjusted unchanged.
skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/parquet_pipeline.py (1)

90-91: 💤 Low value

Consider moving shutil import to the top.

The inline import of shutil is unconventional. While it defers the import until needed, standard practice is to place all imports at module level for clarity and consistency.

♻️ Proposed refactor to move import to module level

Add to the top-level imports:

 import os
+import shutil
 import numpy as np

Then remove the inline import:

     output_path = Path(output_dir)
     if output_path.exists():
-        import shutil
         shutil.rmtree(output_path)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/parquet_pipeline.py`
around lines 90 - 91, The inline import of shutil just before calling
shutil.rmtree(output_path) should be moved to the module-level imports for
clarity and consistency; add a top-level "import shutil" with the other imports
and remove the inline "import shutil" so the code simply calls
shutil.rmtree(output_path) (reference the shutil.rmtree call and output_path
usage to locate the spot to change).
skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/window_analysis.py (3)

55-55: ⚡ Quick win

Rename unused loop variable to comply with Ruff linter.

The loop control variable ticker is not used within the loop body. As per coding guidelines, Python code must pass Ruff linter checks, which flags this as B007. Rename to _ticker to indicate it's intentionally unused.

♻️ Proposed fix
-    for ticker, group in df.groupby("ticker"):
+    for _ticker, group in df.groupby("ticker"):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/window_analysis.py`
at line 55, The loop control variable `ticker` in the comprehension `for ticker,
group in df.groupby("ticker")` is unused and triggers Ruff B007; rename it to
`_ticker` (i.e., `for _ticker, group in df.groupby("ticker")`) to mark it as
intentionally unused so the linter passes, keeping the `group` variable
unchanged.

82-82: ⚡ Quick win

Rename unused loop variable to comply with Ruff linter.

The loop control variable ticker is not used within the loop body. As per coding guidelines, Python code must pass Ruff linter checks, which flags this as B007. Rename to _ticker to indicate it's intentionally unused.

♻️ Proposed fix
-    for ticker, group in df.groupby("ticker"):
+    for _ticker, group in df.groupby("ticker"):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/window_analysis.py`
at line 82, The loop in window_analysis.py uses an unused control variable named
ticker in the statement for ticker, group in df.groupby("ticker"): which
triggers Ruff B007; rename ticker to _ticker (e.g., for _ticker, group in
df.groupby("ticker"): ) so the linter recognizes it as intentionally unused and
update any related references if present inside the loop (the group variable and
loop body remain unchanged).

100-100: ⚡ Quick win

Rename unused loop variable to comply with Ruff linter.

The loop control variable ticker is not used within the loop body. As per coding guidelines, Python code must pass Ruff linter checks, which flags this as B007. Rename to _ticker to indicate it's intentionally unused.

♻️ Proposed fix
-    for ticker, group in df.groupby("ticker"):
+    for _ticker, group in df.groupby("ticker"):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/window_analysis.py`
at line 100, The for-loop in window_analysis.py uses an unused loop variable
named "ticker" which triggers Ruff B007; rename "ticker" to "_ticker" in the
loop header (for _ticker, group in df.groupby("ticker")) so the intent is clear
and the linter warning is resolved, leaving the rest of the loop body and the
"group" variable unchanged.
skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/timeseries_analysis.py (2)

62-62: ⚡ Quick win

Rename unused loop variable to comply with Ruff linter.

The loop control variable sensor_id is not used within the loop body. As per coding guidelines, Python code must pass Ruff linter checks, which flags this as B007. Rename to _sensor_id to indicate it's intentionally unused.

♻️ Proposed fix
-    for sensor_id, group in hourly.groupby("sensor_id"):
+    for _sensor_id, group in hourly.groupby("sensor_id"):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/timeseries_analysis.py`
at line 62, The loop variable sensor_id in the for loop "for sensor_id, group in
hourly.groupby('sensor_id'):" is unused and triggers Ruff B007; rename it to
_sensor_id to signal intentional unused status (i.e., change sensor_id ->
_sensor_id) so the loop in timeseries_analysis.py passes the linter while
leaving the grouping behavior and the group variable unchanged.

92-92: ⚡ Quick win

Rename unused loop variable to comply with Ruff linter.

The loop control variable sensor_id is not used within the loop body. As per coding guidelines, Python code must pass Ruff linter checks, which flags this as B007. Rename to _sensor_id to indicate it's intentionally unused.

♻️ Proposed fix
-    for sensor_id, group in daily.groupby("sensor_id"):
+    for _sensor_id, group in daily.groupby("sensor_id"):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/timeseries_analysis.py`
at line 92, Rename the unused loop variable to satisfy Ruff B007: change the
for-loop header in timeseries_analysis.py that reads for sensor_id, group in
daily.groupby("sensor_id"): to use a throwaway name (e.g., _sensor_id) so the
loop becomes for _sensor_id, group in daily.groupby("sensor_id"): ensuring you
only reference the used variable group inside the loop.
skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py (2)

34-34: 💤 Low value

Consider simplifying the regex pattern.

The dot and dash characters inside a character class don't require escaping. The pattern could be simplified to r"@([a-z0-9.-]+)$" for better readability.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py`
at line 34, The regex used when extracting email domains in the
df["email_domain"] assignment is over-escaped; simplify the character class by
replacing r"@([a-z0-9\.\-]+)$" with r"@([a-z0-9.-]+)$" in the extract call so
the dot and dash need not be escaped and the pattern is more readable while
preserving behavior.

41-49: 💤 Low value

Phone formatting assumes 10-digit input.

The string slicing in lines 46-48 assumes that digits contains exactly 10 characters. While this works correctly for the generated data (which always produces 10-digit phone numbers), it would silently produce malformed output if applied to phone numbers with fewer than 10 digits in real-world scenarios.

For evaluation code with controlled input, this is acceptable. For production use, consider adding length validation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py`
around lines 41 - 49, normalize_phones currently assumes digits contains exactly
10 digits and slices digits.str[...] blindly; change it to validate length
before formatting by computing a boolean mask on digits.str.len() == 10 (use
variable names digits and df["phone_clean"]), create df["phone_clean"]
defaulting to None or original phone, and only assign the formatted string
"(XXX) XXX-XXXX" for rows where the mask is True; leave non-10-digit numbers
untouched or set to a clear sentinel (e.g., None/NaN) so malformed inputs don't
produce silent garbage.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@skills/accelerated-computing-cudf/BENCHMARK.md`:
- Line 48: Update the mistaken plural in the benchmark description: replace the
string "Negative tasks: 1 tasks where no skill was expected." with "Negative
tasks: 1 task where no skill was expected." so the singular/plural agrees;
locate and edit the exact line containing that sentence in BENCHMARK.md.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-apply-udf/code/udf_pipeline.py`:
- Around line 4-7: The module docstring references the removed
pandas.DataFrame.applymap(); update the docstring in udf_pipeline.py to reflect
the current pandas API by replacing "applymap()" with the supported alternative
"map()" (and/or note using vectorized functions or Series.map where appropriate)
so the docstring now mentions apply(), map(), and custom functions for row-wise
and element-wise transformations on a pandas DataFrame.
- Around line 103-105: The normalize_score function can divide by zero when the
series is constant; update normalize_score to compute denom = series.max() -
series.min() and if denom == 0 (or very close to 0) return a zero-filled series
of the same shape (or series - series.min()) instead of performing the division;
otherwise perform (series - series.min()) / denom — ensure you modify the
normalize_score definition to include this guard and return a Series of the same
dtype/index.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/etl_pipeline.py`:
- Around line 60-62: The avg_discount_impact computation can raise
ZeroDivisionError when summary["total_revenue"] is zero; update the assignment
for summary["avg_discount_impact"] (which currently uses
summary["total_discounted"] / summary["total_revenue"]) to handle zero revenue
defensively—e.g., check summary["total_revenue"] == 0 and set impact to 0 or
np.nan for those groups, otherwise compute 1 - summary["total_discounted"] /
summary["total_revenue"]; apply this change where summary["avg_discount_impact"]
is set so it never attempts division by zero.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-groupby-agg/code/groupby_analysis.py`:
- Around line 10-11: Remove the unused numpy import by deleting the line "import
numpy as np" from groupby_analysis.py; ensure only "import pandas as pd" remains
(or any other actually used imports), then run the linter/formatters
(ruff/black/isort) to confirm the F401 warning is resolved and imports are
correctly ordered.
- Around line 100-108: The groupby apply in top_performers_per_dept uses
df.groupby("department").apply(...) which currently relies on include_groups
default behavior and will trigger a pandas 2.2 deprecation; update the call to
pass include_groups=False (i.e., df.groupby("department").apply(...,
include_groups=False)) or alternatively pre-select only the non-grouping
column(s) used by nlargest before calling groupby to avoid including the
grouping columns in the applied function and eliminate the deprecation warning.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/multi_join.py`:
- Around line 10-11: The import of numpy as np at the top of multi_join.py is
unused and causes a lint F401; remove the line "import numpy as np" so only
"import pandas as pd" remains (locate the import block in multi_join.py near the
top of the file to remove the unused np import).

In
`@skills/accelerated-computing-cudf/evals/files/cudf-null-handling/code/null_pipeline.py`:
- Line 131: The unpacked variables from analyze_nulls() are unused and trigger
Ruff RUF059; rename them to indicate intentional unused values (e.g., prefix
with an underscore) by changing the unpacking from report, group_nulls =
analyze_nulls(df) to _report, _group_nulls = analyze_nulls(df) (or use a single
underscore if both are intentionally ignored) so the linter recognizes them as
deliberately unused while leaving analyze_nulls and df untouched.
- Line 78: The loop unpacks (station, group) from df.groupby("station_code") but
never uses station, causing a Ruff B007 warning; rename the unused loop variable
to a throwaway name (e.g., _station or _) in the loop head where the
comprehension occurs (for _station, group in df.groupby("station_code"): ) so
the code continues to use group unchanged and the linter warning is resolved.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/generate_data.py`:
- Around line 6-9: The import ordering in generate_data.py violates isort rules:
move the standard-library import "from pathlib import Path" so it appears after
"import os" and before the third-party imports "import numpy as np" and "import
pandas as pd"; update the top-of-file imports to the order (stdlib, then
third-party) and re-run ruff/isort to confirm the file passes linting.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/parquet_pipeline.py`:
- Around line 10-15: The imports in parquet_pipeline.py are out of isort order;
reorder them so stdlib imports (e.g., from pathlib import Path, import os) come
first, then third-party imports (import numpy as np, import pandas as pd), and
finally local application imports (from generate_data import generate); adjust
the import block accordingly to satisfy Ruff/isort grouping rules.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/generate_data.py`:
- Around line 6-8: The import block in generate_data.py mixes stdlib and
third-party imports on consecutive lines, causing Ruff/Isort failures; separate
the standard-library import "os" from third-party imports "numpy" and "pandas"
by inserting a single blank line after the "os" import so imports are grouped as
stdlib then third-party.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py`:
- Around line 152-171: Ruff flags in main(): replace unused bindings by either
dropping them or prefacing with underscores (e.g., change unstacked, stacked =
stack_unstack_demo(df) to _unstacked, _stacked = stack_unstack_demo(df) or
simply call stack_unstack_demo(df) without assignment; do the same for ct_count,
ct_sat, ct_norm from crosstab_analysis(df)), and remove the unnecessary f-string
prefix on the final print (change print(f"\nAll reshape operations completed
successfully.") to print("\nAll reshape operations completed successfully.")).
Ensure modifications target the calls pivot_revenue_by_product_quarter,
pivot_multi_agg, melt_pivot_back, stack_unstack_demo, crosstab_analysis, and the
final print in main().

In `@skills/accelerated-computing-cudf/skill-card.md`:
- Line 80: Replace the non-descriptive link text "here" with a descriptive
phrase that conveys the destination and purpose (e.g., "NVIDIA VDP vulnerability
reporting page" or "NVIDIA AI Concerns reporting form") in the markdown sentence
that currently reads "Please report quality, risk, security vulnerabilities or
NVIDIA AI Concerns
[here](https://app.intigriti.com/programs/nvidia/nvidiavdp/detail)."; update the
link anchor so it improves accessibility and scanability while preserving the
existing URL and surrounding punctuation.
- Around line 64-67: Add a blank line before and after the markdown table that
follows the "## Evaluation Results: <br>" header so the table (starting with the
line beginning "| Dimension | Num | `claude-code` | `codex` |") is separated by
empty lines on both sides to satisfy MD058 and ensure consistent rendering.

---

Nitpick comments:
In
`@skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/multi_join.py`:
- Around line 83-99: The function tier_channel_summary currently computes a
wide-format pivot (variable pivot) but returns the long-format cross, discarding
pivot; update tier_channel_summary to return the pivot (or alternatively remove
the pivot computation if wide output is not needed) and ensure the caller in
main uses the returned value (tier_ch) accordingly; locate the pivot_table call
and change the function's return from cross to pivot (and verify any downstream
uses of tier_ch expect the wide-format DataFrame).

In
`@skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu`:
- Around line 1-13: Add Doxygen comments to this CUDA source by inserting a
file-level block at the top with `@file` and `@brief` describing the
producer/consumer stream-handoff intent and overall purpose; then add brief
Doxygen docblocks (brief + params/return where applicable) immediately above the
key symbols: fill_kernel, checksum_kernel, the NativeGpuTable type/class, and
each helper function used for buffer/stream management so callers understand
inputs, outputs, and thread/stream behavior. Ensure each block follows the
project's Doxygen style (single-line `@brief`, `@param`, `@return` tags as
appropriate) and is placed directly above the corresponding declaration to make
the documentation discoverable.
- Around line 32-37: The spin loop around adjusted (int adjusted = value; for
(int spin = 0; spin < 4096; ++spin) { adjusted += (spin & 1); adjusted -= (spin
& 1); }) is a no-op and may be optimized away; replace it with an observable
delay so the producer/consumer timing window is preserved — e.g., perform the
loop against a volatile variable or call a short platform sleep/clock wait (use
volatile temp or __nanosleep/clock-based wait) so the compiler cannot elide it,
leaving the final assignment to data[idx] = adjusted unchanged.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/parquet_pipeline.py`:
- Around line 90-91: The inline import of shutil just before calling
shutil.rmtree(output_path) should be moved to the module-level imports for
clarity and consistency; add a top-level "import shutil" with the other imports
and remove the inline "import shutil" so the code simply calls
shutil.rmtree(output_path) (reference the shutil.rmtree call and output_path
usage to locate the spot to change).

In
`@skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py`:
- Around line 119-149: The growth-rate code in year_over_year_pivot can divide
by zero when a base-year revenue column (e.g., revenue_2022 or revenue_2023) is
zero; update the growth calculation in year_over_year_pivot to guard the
denominator by computing growth only where the base revenue is nonzero and
otherwise assigning a safe fallback (e.g., NaN) — for example, use a boolean
mask or pandas.Series.where to compute (new - base)/base only when base != 0,
then round the result and ensure any inf/-inf are replaced with NaN; apply this
change for both growth_22_23 and growth_23_24 and reference the
revenue_2022/revenue_2023/revenue_2024 column names used in the function.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py`:
- Line 34: The regex used when extracting email domains in the
df["email_domain"] assignment is over-escaped; simplify the character class by
replacing r"@([a-z0-9\.\-]+)$" with r"@([a-z0-9.-]+)$" in the extract call so
the dot and dash need not be escaped and the pattern is more readable while
preserving behavior.
- Around line 41-49: normalize_phones currently assumes digits contains exactly
10 digits and slices digits.str[...] blindly; change it to validate length
before formatting by computing a boolean mask on digits.str.len() == 10 (use
variable names digits and df["phone_clean"]), create df["phone_clean"]
defaulting to None or original phone, and only assign the formatted string
"(XXX) XXX-XXXX" for rows where the mask is True; leave non-10-digit numbers
untouched or set to a clear sentinel (e.g., None/NaN) so malformed inputs don't
produce silent garbage.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/timeseries_analysis.py`:
- Line 62: The loop variable sensor_id in the for loop "for sensor_id, group in
hourly.groupby('sensor_id'):" is unused and triggers Ruff B007; rename it to
_sensor_id to signal intentional unused status (i.e., change sensor_id ->
_sensor_id) so the loop in timeseries_analysis.py passes the linter while
leaving the grouping behavior and the group variable unchanged.
- Line 92: Rename the unused loop variable to satisfy Ruff B007: change the
for-loop header in timeseries_analysis.py that reads for sensor_id, group in
daily.groupby("sensor_id"): to use a throwaway name (e.g., _sensor_id) so the
loop becomes for _sensor_id, group in daily.groupby("sensor_id"): ensuring you
only reference the used variable group inside the loop.

In
`@skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/window_analysis.py`:
- Line 55: The loop control variable `ticker` in the comprehension `for ticker,
group in df.groupby("ticker")` is unused and triggers Ruff B007; rename it to
`_ticker` (i.e., `for _ticker, group in df.groupby("ticker")`) to mark it as
intentionally unused so the linter passes, keeping the `group` variable
unchanged.
- Line 82: The loop in window_analysis.py uses an unused control variable named
ticker in the statement for ticker, group in df.groupby("ticker"): which
triggers Ruff B007; rename ticker to _ticker (e.g., for _ticker, group in
df.groupby("ticker"): ) so the linter recognizes it as intentionally unused and
update any related references if present inside the loop (the group variable and
loop body remain unchanged).
- Line 100: The for-loop in window_analysis.py uses an unused loop variable
named "ticker" which triggers Ruff B007; rename "ticker" to "_ticker" in the
loop header (for _ticker, group in df.groupby("ticker")) so the intent is clear
and the linter warning is resolved, leaving the rest of the loop body and the
"group" variable unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 2f0e160d-f89e-4feb-9689-f89ed0a9c98a

📥 Commits

Reviewing files that changed from the base of the PR and between b99f73f and eff4fea.

📒 Files selected for processing (34)
  • skills/accelerated-computing-cudf/BENCHMARK.md
  • skills/accelerated-computing-cudf/SKILL.md
  • skills/accelerated-computing-cudf/evals/evals.json
  • skills/accelerated-computing-cudf/evals/files/cudf-apply-udf/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-apply-udf/code/udf_pipeline.py
  • skills/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/etl_pipeline.py
  • skills/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-groupby-agg/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-groupby-agg/code/groupby_analysis.py
  • skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/multi_join.py
  • skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/NOTICE.md
  • skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/run_smoke.sh
  • skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu
  • skills/accelerated-computing-cudf/evals/files/cudf-null-handling/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-null-handling/code/null_pipeline.py
  • skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/parquet_pipeline.py
  • skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py
  • skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py
  • skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/timeseries_analysis.py
  • skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/generate_data.py
  • skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/window_analysis.py
  • skills/accelerated-computing-cudf/evals/files/negative-deep-learning-training/code/train.py
  • skills/accelerated-computing-cudf/evals/files/source-cudf-null-fillna-semantics/NOTICE.md
  • skills/accelerated-computing-cudf/evals/files/source-cudf-null-fillna-semantics/code/null_cleanup.py
  • skills/accelerated-computing-cudf/references/api-patterns.md
  • skills/accelerated-computing-cudf/references/cudf-pandas-accelerator.md
  • skills/accelerated-computing-cudf/references/dask-cudf-patterns.md
  • skills/accelerated-computing-cudf/skill-card.md
  • skills/accelerated-computing-cudf/skill.oms.sig

Comment thread skills/accelerated-computing-cudf/BENCHMARK.md
Comment thread skills/accelerated-computing-cudf/skill-card.md
Comment thread skills/accelerated-computing-cudf/skill-card.md
Skip the repository-level skills/ directory in pre-commit. Agent skill
artifacts are validated and signed by the NVIDIA skills pipeline, so
cuDF source hooks should not rewrite them during publication PRs.

Signed-off-by: Kyle Hubert <kjmph@users.noreply.github.com>
@kjmph
kjmph requested a review from a team as a code owner May 29, 2026 22:43
@kjmph
kjmph requested a review from jameslamb May 29, 2026 22:43
@vyasr vyasr added improvement Improvement / enhancement to an existing function non-breaking Non-breaking change labels May 29, 2026
@trxcllnt
trxcllnt merged commit 9ab352b into NVIDIA:main May 29, 2026
55 checks passed
@kjmph
kjmph deleted the feature/add-cudf-agent-skill branch May 29, 2026 23:00
@coderabbitai coderabbitai Bot mentioned this pull request Jun 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

improvement Improvement / enhancement to an existing function non-breaking Non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants