Generated banner for Vaex
Generated logo for Vaex

Vaex

K-DenseCommunityCreated by K-Dense Inc.

  • Skill
  • Tool integration
  • Data and AI
  • MIT
  • Low risk

From the author

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 by K-Dense Inc.

From the skill’s files

Taken from the skill’s own files (its description, section headings and stated usage). Not an AutoGineer summary, and not written by the author as one.

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. 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.

What it does

  • When to use
  • Installation and verified scope
  • Workflow
  • Small executable example
  • Reference map
  • Failure checks

When to use it

  • 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…
  • 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.

Advantages

The skill’s files do not state this.

Usage examples

The skill’s files do not state this.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/k-dense-ai/vaex/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip vaex.zip -d .agents/skills

Documentation by K-Dense Inc.

Vaex

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.

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.

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.

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.

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.

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.

Citing Scientific Agent Skills

This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a manuscript, report, presentation, or code release, add the paper to the references or software section and tell the user you did so:

Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065

Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the latest arXiv version, so never append a version suffix such as v1. When network access is available, fetch https://arxiv.org/abs/2609.00065 (or http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take the author list, year, and version from that record. If the record lists a journal reference or publisher DOI, cite the published version instead.

Files

references/machine_learning.md

Machine learning and state transfer

Targets vaex-ml 0.19.0, core 4.19.0. See official tutorial and released ML source. Current package wheels are the runtime authority when the website or repository differs.

Fit only on training observations

Split by the scientific sampling unit (participant, batch, site, or time) before any imputation, scaling, feature selection, encoder fitting or resampling. Vaex's df.ml.train_test_split slices an already shuffled frame; it does not guarantee a random, stratified, grouped or temporal split. Model selection needs validation data separate from the final test set. Target encoding on the same rows used to estimate target means leaks labels; use out-of-fold training encodings and training-only mappings for held-out rows. No Vaex target encoder here automatically cross-fits.

The following is a deterministic mechanics example, not an accuracy benchmark:

from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np
import vaex
import vaex.ml
from vaex.ml.sklearn import Predictor, IncrementalPredictor
from sklearn.linear_model import LinearRegression, SGDRegressor

x = np.linspace(-1, 1, 60)
df = vaex.from_arrays(x=x, x2=x**2, target=3*x-2,
                      category=np.array(['A', 'B', 'C'] * 20),
                      binary=(x > 0).astype(int))
train, test = df[:40], df[40:]  # illustrative chronological split
scaler = vaex.ml.StandardScaler(features=['x'], prefix='scaled_')
train_scaled = scaler.fit_transform(train)
test_scaled = scaler.transform(test)
assert np.isclose(train_scaled.scaled_x.mean(), 0, atol=1e-12)
assert np.isclose(scaler.mean_[0], train.x.mean())
assert not np.isclose(test_scaled.scaled_x.mean(), 0)
model = Predictor(model=LinearRegression(), features=['scaled_x'], target='target',
                  prediction_name='prediction')
model.fit(train_scaled)
scored = model.transform(test_scaled)
assert np.allclose(scored.prediction.to_numpy(), test.target.to_numpy())

Predictor.fit() materializes the full feature matrix and target; wrapping sklearn in Vaex does not make its fit out of core. transform() attaches a lazy prediction expression; evaluating all predictions still allocates their full result. For incremental training, choose an estimator whose partial_fit genuinely supports the problem and configure batches/epochs explicitly:

incremental = IncrementalPredictor(
    model=SGDRegressor(random_state=7, learning_rate='constant', eta0=0.01),
    features=['scaled_x'], target='target', batch_size=8, num_epochs=2,
    prediction_name='online_prediction', shuffle=False,
)
incremental.fit(train_scaled)
assert np.isfinite(incremental.transform(test_scaled).online_prediction.to_numpy()).all()

A classifier usually needs partial_fit_kwargs={'classes': ...} with the fixed class set. Vaex's shuffle=True shuffles within a batch, not necessarily across the whole dataset. Batch training can differ from a single full fit; assess convergence, ordering effects and held-out calibration rather than merely checking finite predictions.

Transformers: current classes and behavior

Transformations generally return a shallow copy with virtual output columns. Fitting still computes statistics/mappings, and these may allocate substantial state. Explicit prefixes make feature references unambiguous; inspect actual output names.

for transformer in [
    vaex.ml.MinMaxScaler(features=['x'], feature_range=(-1, 1)),
    vaex.ml.MaxAbsScaler(features=['x']),
    vaex.ml.RobustScaler(features=['x']),
    vaex.ml.LabelEncoder(features=['category']),
    vaex.ml.OneHotEncoder(features=['category']),
    vaex.ml.FrequencyEncoder(features=['category'], unseen='nan'),
    vaex.ml.KBinsDiscretizer(features=['x'], n_bins=3, strategy='uniform'),
]:
    transformed_train = transformer.fit_transform(train)
    transformed_test = transformer.transform(test)
    assert len(transformed_train) == len(train)
    assert len(transformed_test) == len(test)
    assert len(transformed_test.get_column_names()) > len(test.get_column_names())
# One scalar period per transformer, not a list of periods.
cycle = vaex.ml.CycleTransformer(features=['x'], n=24)
cyclic = cycle.fit_transform(train)
assert np.allclose(cyclic.x_x.to_numpy()**2 + cyclic.x_y.to_numpy()**2, 1)
pca = vaex.ml.PCA(features=['x', 'x2'], n_components=2)
pca.fit(train)
projected = pca.transform(test)
assert projected[['PCA_0', 'PCA_1']].values.shape == (20, 2)
assert np.isclose(sum(pca.explained_variance_ratio_), 1)
random_projection = vaex.ml.RandomProjections(features=['x', 'x2'], n_components=2)
assert len(random_projection.fit_transform(train)) == len(train)
  • RandomProjections is plural; KBinsDiscretizer replaces the nonexistent Discretizer example.

  • MaxAbsScaler uses the default absmax_scaled_ prefix. One-hot outputs depend on fitted category values; do not infer a fixed naming/schema contract from a toy example.

  • Labels encode categories as integers without establishing a scientific order. One-hot state can be very large for high cardinality; define unseen/missing policy.

  • BayesianTargetEncoder(features=[...], target=..., weight=..., unseen='nan') is the current class. Unseen choices are 'nan' or 'zero', not automatically the global mean. WeightOfEvidenceEncoder requires a meaningful binary target and training-only estimates. Neither repairs label leakage.

  • Standard scaling divides by standard deviation, not variance. Check zero/near-zero dispersion, missingness and nonfinite results before model fitting.

  • RobustScaler and quantile discretization use approximate percentile machinery; their boundaries need independent scientific checks. PCA covariance state is quadratic in feature count; scale comparable quantities when appropriate and retain loadings/explained variance. Component signs may flip without changing the subspace.

K-means

from vaex.ml.cluster import KMeans
clusterer = KMeans(features=['x', 'x2'], n_clusters=2, max_iter=10,
                   random_state=7, prediction_label='cluster')
clusterer.fit(train)
clusters = clusterer.transform(test)
assert len(clusterer.cluster_centers) == 2
assert set(clusters.cluster.tolist()) <= {0, 1}

The class lives in vaex.ml.cluster; fitted centers are cluster_centers, without an underscore. Default prediction name is prediction_kmeans. It uses Numba kernels and repeated passes. Empty clusters, scaling, seeds and convergence require checking; finite labels in a toy test do not demonstrate useful clusters or biological subtypes.

Boosting adapters

Current classes live in vaex.ml.xgboost.XGBoostModel, vaex.ml.lightgbm.LightGBMModel, and vaex.ml.catboost.CatBoostModel. params and num_boost_round belong in the constructor, not as duplicate keywords to .fit. Tiny native fits were run with XGBoost 3.4.1, LightGBM 4.7.0 and CatBoost 1.2.10; these establish API execution only.

from vaex.ml.xgboost import XGBoostModel
booster = XGBoostModel(
    features=['x'], target='target', prediction_name='boost_prediction',
    params={'objective': 'reg:squarederror', 'max_depth': 2, 'nthread': 2},
    num_boost_round=3,
)
booster.fit(train)
boosted = booster.transform(test)
assert np.isfinite(boosted.boost_prediction.to_numpy()).all()

XGBoost and LightGBM adapters construct full in-memory training matrices; their Vaex wrappers do not imply external-memory learning. LightGBM fit accepts valid_sets/valid_names and converts its callback options internally. CatBoost accepts evals and optional batch_size; its batch mechanism trains/sums models, which is not interchangeable with one full-data fit. Set prediction semantics explicitly: CatBoost defaults to prediction_type='Probability'; labels and probabilities are different outputs. For regression set prediction_type='RawFormulaVal'; the default probability mode can produce two columns even for an RMSE-trained model. For sklearn use prediction_type='predict_proba' when needed, and choose the desired class column using the fitted estimator's classes_.

TensorFlow: source-verified only

There is no vaex.ml.keras module in 0.19.0. vaex.ml.tensorflow.KerasModel wraps a fitted model for inference; its .fit() deliberately raises NotImplementedError. Train with TensorFlow's own API or the optional df.ml.tensorflow.to_keras_generator after checking that integration against the actual TensorFlow/Keras version. TensorFlow was not installed or executed for this review. Do not promise a target/epochs training interface on this wrapper or model serialization portability across Keras versions.

Save attached predictions and preserve target rows

# Fitting alone does not attach prediction expressions to the frame being saved.
train_with_prediction = model.transform(train_scaled)
with TemporaryDirectory() as directory:
    state = Path(directory) / 'pipeline.json'
    train_with_prediction.state_write(str(state))
    fresh = df[40:].copy()
    fresh.state_load(str(state), set_filter=False, trusted=True)
    assert len(fresh) == len(test)
    assert fresh.x.tolist() == test.x.tolist()
    assert np.allclose(fresh.prediction.to_numpy(), scored.prediction.to_numpy())

Only load trusted state: models/functions can use pickle-like executable serialization. State restores transformations, not raw data or experimental provenance. Confirm names, types, units, row membership, class order and package versions on load; a training filter must not silently become an inference filter. Evaluate with design-appropriate held-out metrics and uncertainty; fold standard deviation is not a confidence interval. Resampling/weights and feature selection belong inside training folds, never on the test population. Exact row alignment must be preserved between targets and predictions.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Declares allowed tools, Needs network access, Needs Python

The author says: 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.

Security

What our scanner noticed· Low risk

  • Instructions that use the network

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
K-Dense Inc.
Publisher
K-Dense (Community)
Source
K-Dense-AI/scientific-agent-skills · skills/vaex · commit a25cf9e
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE.md)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by K-Dense Inc. or K-Dense.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download vaex.zip