Skill Tracer
Skills › Scientific Agent Skills › vaex

vaex

skill · 141 lines · MIT license · skills/vaex/SKILL.md

The facts

Its description

Processes large tabular scientific datasets with Vaex expressions, filtered views, streamed statistics, binned visualizations, and file conversion. Use for larger-than-RAM HDF5, Arrow, CSV, or Parquet analysis, virtual feature engineering, or Vaex ML preprocessing; distinguishes these operations from estimators and conversions that materialize data.

The description the agent reads to decide when to use it.

From its settingsline 3

Tools it may use, or may not

allowed-tools: Read Write Edit Bash Grep Glob

Tools it may use while it runs without asking you first.

From its settingsline 4

Runs scripts

bin/python

Scripts the text names. Found by matching words, so treat them as pointers.

Found by matching wordsline 29 line 31

Files it mentions

references/review.md, references/core_dataframes.md, references/data_processing.md, references/performance.md, references/visualization.md (first 5 of 7 lines)

Files the text names, such as ones to read or write. Found by matching words, so treat them as pointers.

Found by matching wordsline 43 line 105 line 106 line 107 line 108

Licence

MIT license, from the skill file

The terms its author shares it under, which let it be shown here.

From its settingsline 5 licence text

Other settings

compatibility: Requires Python 3.9-3.12 for vaex-core 4.19.0; tested on Python 3.12. Install vaex-core plus vaex-hdf5, vaex-viz, or vaex-ml as needed. Package installation and remote data need network access; local workflows need no credentials. metadata: version: "1.3" skill-author: K-Dense Inc. last-reviewed: "2026-10-01"

More settings at the top of the file, shown as written.

From its settingsline 6 line 7
Other files in this skill (7) Close

The text

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1---
2name: vaex
3description: Processes large tabular scientific datasets with Vaex expressions, filtered views, streamed statistics, binned visualizations, and file conversion. Use for larger-than-RAM HDF5, Arrow, CSV, or Parquet analysis, virtual feature engineering, or Vaex ML preprocessing; distinguishes these operations from estimators and conversions that materialize data.
4allowed-tools: Read Write Edit Bash Grep Glob
5license: MIT license
6compatibility: Requires Python 3.9-3.12 for vaex-core 4.19.0; tested on Python 3.12. Install vaex-core plus vaex-hdf5, vaex-viz, or vaex-ml as needed. Package installation and remote data need network access; local workflows need no credentials.
7metadata:
8 version: "1.3"
9 skill-author: K-Dense Inc.
10 last-reviewed: "2026-10-01"
11---
13# Vaex
15## When to use
17Use Vaex for columnar analysis on a single machine when data exceeds RAM, especially
18repeated reductions and histograms over local Vaex HDF5 or Arrow files. Expressions
19and virtual columns defer computation; reductions normally execute immediately.
20Out-of-core storage does not make every operation memory bounded: sorting, joins,
21large group dictionaries, materialization, and many estimator fits need substantial RAM.

When to use

Use Vaex for columnar analysis on a single machine when data exceeds RAM, especially repeated reductions and histograms over local Vaex HDF5 or Arrow files. Expressions and virtual columns defer computation; reductions normally execute immediately. Out-of-core storage does not make every operation memory bounded: sorting, joins, large group dictionaries, materialization, and many estimator fits need substantial RAM.

Raw lines 15 to 22
23## Installation and verified scope
25Use a separate environment; the repository's default Python is newer than this release supports:
27```bash
28uv venv --python 3.12 .venv-vaex
29uv pip install --python .venv-vaex/bin/python "vaex-core==4.19.0" "vaex-hdf5==0.15.0" "vaex-viz==0.6.0"
30# Optional ML (also installs its declared estimator dependencies):
31uv pip install --python .venv-vaex/bin/python "vaex-ml==0.19.0"
32```
34On Windows use `.venv-vaex\Scripts\python.exe` as the interpreter path. The `vaex`
354.19.0 metapackage installs more integrations; it is not needed for the core workflow.
36Core 4.19.0 declares Python `>=3.9,<3.13`, pandas `<3`, Dask `<2024.9`, and NumPy
37`<3`. Do not upgrade these constraints independently. Arrow support is in core;
38FITS needs `vaex-astro`. Compatible binary wheels determine platform availability;
39compiling the optional `annoy` dependency requires a C++ toolchain, not just Python headers.
41Native checks used Python 3.12, core 4.19.0, HDF5 0.15.0, viz 0.6.0, ML 0.19.0,
42NumPy 2.5.3, pandas 2.3.3, PyArrow 25.0.1 and Matplotlib 3.11.2 on macOS ARM.
43See [review and verification](references/review.md) for evidence and optional-integration limits.
44These are correctness checks on small synthetic inputs, not performance benchmarks.

Installation and verified scope

Use a separate environment; the repository's default Python is newer than this release supports:

uv venv --python 3.12 .venv-vaex
uv pip install --python .venv-vaex/bin/python "vaex-core==4.19.0" "vaex-hdf5==0.15.0" "vaex-viz==0.6.0"
# Optional ML (also installs its declared estimator dependencies):
uv pip install --python .venv-vaex/bin/python "vaex-ml==0.19.0"

On Windows use .venv-vaex\Scripts\python.exe as the interpreter path. The vaex 4.19.0 metapackage installs more integrations; it is not needed for the core workflow. Core 4.19.0 declares Python >=3.9,<3.13, pandas <3, Dask <2024.9, and NumPy <3. Do not upgrade these constraints independently. Arrow support is in core; FITS needs vaex-astro. Compatible binary wheels determine platform availability; compiling the optional annoy dependency requires a C++ toolchain, not just Python headers.

Native checks used Python 3.12, core 4.19.0, HDF5 0.15.0, viz 0.6.0, ML 0.19.0, NumPy 2.5.3, pandas 2.3.3, PyArrow 25.0.1 and Matplotlib 3.11.2 on macOS ARM. See review and verification for evidence and optional-integration limits. These are correctness checks on small synthetic inputs, not performance benchmarks.

Raw lines 23 to 45
Runs code bin/python :29
Reads a file references/review.md :43
46## Workflow
481. Establish row identity, units, schema, missing-value codes, and expected counts.
49 Inspect CSV raw headers before parsers rename duplicates; supply explicit types
50 for IDs and late-appearing values. Keep dates, time zones, and sampling cadence explicit.
512. Open files with `vaex.open`. HDF5 must use a compatible table layout; arbitrary
52 HDF5 scientific arrays are not automatically a Vaex table. CSV opening performs
53 indexing/schema work; Parquet must decode compressed data. Neither is an instant,
54 zero-memory operation.
553. Select needed columns and use expressions for derived values. A virtual column
56 avoids a full stored array but still needs expression metadata and evaluation buffers.
574. Record filters/selections and missingness before reductions. Batch independent
58 statistics with `delay=True`, then `df.execute()` and each promise's `.get()`.
595. Validate counts, units, join cardinality, and numerical results against a small
60 independently computed subset. Binned or approximate summaries need explicit limits/resolution.
616. Plot aggregated grids or a bounded sample. A count heatmap and a mean heatmap
62 answer different questions; show coverage and avoid hiding rare/extreme observations silently.
637. Export directly in chunks; exporting evaluates virtual columns without needing
64 `materialize()` first. Reopen and check counts/schema/values before replacing source data.

Workflow

  1. Establish row identity, units, schema, missing-value codes, and expected counts. Inspect CSV raw headers before parsers rename duplicates; supply explicit types for IDs and late-appearing values. Keep dates, time zones, and sampling cadence explicit.
  2. Open files with vaex.open. HDF5 must use a compatible table layout; arbitrary HDF5 scientific arrays are not automatically a Vaex table. CSV opening performs indexing/schema work; Parquet must decode compressed data. Neither is an instant, zero-memory operation.
  3. Select needed columns and use expressions for derived values. A virtual column avoids a full stored array but still needs expression metadata and evaluation buffers.
  4. Record filters/selections and missingness before reductions. Batch independent statistics with delay=True, then df.execute() and each promise's .get().
  5. Validate counts, units, join cardinality, and numerical results against a small independently computed subset. Binned or approximate summaries need explicit limits/resolution.
  6. Plot aggregated grids or a bounded sample. A count heatmap and a mean heatmap answer different questions; show coverage and avoid hiding rare/extreme observations silently.
  7. Export directly in chunks; exporting evaluates virtual columns without needing materialize() first. Reopen and check counts/schema/values before replacing source data.
Raw lines 46 to 65
66## Small executable example
68Run in a writable working directory; output names must not refer to existing data.
70```python
71from pathlib import Path
72import numpy as np
73import vaex
75out = Path('vaex-example.hdf5')
76if out.exists():
77 raise FileExistsError(out)
78df = vaex.from_arrays(
79 x=np.arange(1., 7.), y=np.arange(6.) ** 2,
80 category=np.array(['A', 'B', 'A', 'B', 'A', 'B']),
82df['energy'] = df.x ** 2 + df.y
83selected = df[df.x >= 3]
84mean_task = selected.energy.mean(delay=True)
85count_task = selected.count(delay=True)
86selected.execute()
87assert count_task.get() == 4
88assert np.isclose(mean_task.get(), 35.0)
89summary = df.groupby('category', agg={
90 'rows': vaex.agg.count(), 'energy_sum': vaex.agg.sum('energy'),
91})
92assert int(summary.rows.sum()) == len(df)
93df.export_hdf5(str(out), chunk_size=2)
94reopened = vaex.open(str(out))
95assert reopened.get_column_names() == df.get_column_names()
96assert np.allclose(reopened.energy.to_numpy(), df.energy.to_numpy())
97```
99For a large real input, replace the in-memory fixture with `vaex.open('input.hdf5')`.
100The small `.to_numpy()` comparison above is a fixture check; do not apply it to a
101whole larger-than-RAM dataset. Compare sampled rows and streamed summaries instead.

Small executable example

Run in a writable working directory; output names must not refer to existing data.

from pathlib import Path
import numpy as np
import vaex

out = Path('vaex-example.hdf5')
if out.exists():
    raise FileExistsError(out)
df = vaex.from_arrays(
    x=np.arange(1., 7.), y=np.arange(6.) ** 2,
    category=np.array(['A', 'B', 'A', 'B', 'A', 'B']),
)
df['energy'] = df.x ** 2 + df.y
selected = df[df.x >= 3]
mean_task = selected.energy.mean(delay=True)
count_task = selected.count(delay=True)
selected.execute()
assert count_task.get() == 4
assert np.isclose(mean_task.get(), 35.0)
summary = df.groupby('category', agg={
    'rows': vaex.agg.count(), 'energy_sum': vaex.agg.sum('energy'),
})
assert int(summary.rows.sum()) == len(df)
df.export_hdf5(str(out), chunk_size=2)
reopened = vaex.open(str(out))
assert reopened.get_column_names() == df.get_column_names()
assert np.allclose(reopened.energy.to_numpy(), df.energy.to_numpy())

For a large real input, replace the in-memory fixture with vaex.open('input.hdf5'). The small .to_numpy() comparison above is a fixture check; do not apply it to a whole larger-than-RAM dataset. Compare sampled rows and streamed summaries instead.

Raw lines 66 to 102
103## Reference map
105- [Core DataFrames](references/core_dataframes.md): loaders, expression/array distinctions, inspection and schema.
106- [Data processing](references/data_processing.md): filtering, missingness, strings/dates, grouped statistics and joins.
107- [Performance](references/performance.md): delayed/async execution, caching, buffers, materialization and profiling.
108- [Visualization](references/visualization.md): supported `df.viz` methods, grid geometry, finite plotting limits and widgets.
109- [Machine learning](references/machine_learning.md): train-only fitting, native transformers, estimator memory and state transfer.
110- [I/O](references/io_operations.md): chunked CSV conversion, HDF5/Arrow/Parquet round trips and remote boundaries.

Reference map

  • Core DataFrames: loaders, expression/array distinctions, inspection and schema.
  • Data processing: filtering, missingness, strings/dates, grouped statistics and joins.
  • Performance: delayed/async execution, caching, buffers, materialization and profiling.
  • Visualization: supported df.viz methods, grid geometry, finite plotting limits and widgets.
  • Machine learning: train-only fitting, native transformers, estimator memory and state transfer.
  • I/O: chunked CSV conversion, HDF5/Arrow/Parquet round trips and remote boundaries.
Raw lines 103 to 111
112## Failure checks
114- `df.x.mean()` returns a computed result; it is not a lazy expression.
115- Use `df.percentile_approx('x', percentage=50)` for approximate percentiles;
116 `Expression.quantile` is not a core 4.19.0 API.
117- Use explicit `vaex.agg` objects to name grouped outputs. Do not assume pandas
118 dictionary aggregation or arbitrary group callbacks have the same contract.
119- `join` defaults to left; declare `how`, validate keys, and extract filtered inputs
120 when the filter must define join membership. Joins accept one key expression per side.
121- `.values`, `.to_numpy()`, unchunked `.to_pandas_df()`, `.materialize()`, and
122 ordinary sklearn `Predictor.fit()` can allocate full arrays.
123- State files carry transformations and potentially serialized executable objects;
124 load only trusted artifacts. They do not carry the original dataset or prove its provenance.

Failure checks

  • df.x.mean() returns a computed result; it is not a lazy expression.
  • Use df.percentile_approx('x', percentage=50) for approximate percentiles; Expression.quantile is not a core 4.19.0 API.
  • Use explicit vaex.agg objects to name grouped outputs. Do not assume pandas dictionary aggregation or arbitrary group callbacks have the same contract.
  • join defaults to left; declare how, validate keys, and extract filtered inputs when the filter must define join membership. Joins accept one key expression per side.
  • .values, .to_numpy(), unchunked .to_pandas_df(), .materialize(), and ordinary sklearn Predictor.fit() can allocate full arrays.
  • State files carry transformations and potentially serialized executable objects; load only trusted artifacts. They do not carry the original dataset or prove its provenance.
Raw lines 112 to 125
Boilerplate, lines 126 to 141. The same text appears in 125 other files here. Close
126## Citing Scientific Agent Skills
128This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a
129manuscript, report, presentation, or code release, add the paper to the references or
130software section and tell the user you did so:
132> Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent
133> Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065.
134> https://doi.org/10.48550/arXiv.2609.00065
136Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the
137latest arXiv version, so never append a version suffix such as `v1`. When network access is
138available, fetch https://arxiv.org/abs/2609.00065 (or
139http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take
140the author list, year, and version from that record. If the record lists a journal reference
141or publisher DOI, cite the published version instead.

From K-Dense-AI/scientific-agent-skills at 5f2bc03, 2026-10-26. Not read by a model yet. Summary and techniques by Claude Opus 5.5 on 2026-11-06.