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
Download the skill as a ZIP:
https://autogineer.com/agent-skills/k-dense-ai/vaex/downloadUnzip 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
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.
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.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.
Record filters/selections and missingness before reductions. Batch independent statistics with
delay=True, thendf.execute()and each promise's.get().Validate counts, units, join cardinality, and numerical results against a small independently computed subset. Binned or approximate summaries need explicit limits/resolution.
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.
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.vizmethods, 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.quantileis not a core 4.19.0 API.Use explicit
vaex.aggobjects to name grouped outputs. Do not assume pandas dictionary aggregation or arbitrary group callbacks have the same contract.joindefaults to left; declarehow, 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 sklearnPredictor.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
- ATTRIBUTION.mdAdded by AutoGineer959 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md7.5 KiB
- references/core_dataframes.md4.6 KiB
- references/data_processing.md7.1 KiB
- references/io_operations.md7.6 KiB
- references/machine_learning.md9.8 KiB
- references/performance.md5.1 KiB
- references/review.md4.5 KiB
- references/visualization.md5.0 KiB
references/io_operations.md
File I/O and remote data
Targets core 4.19.0 / HDF5 0.15.0. Official I/O guide and released readers/writers define these contracts.
Local format round trips
This small fixture uses a temporary directory. Real exports overwrite existing paths by default: choose a new destination, verify it, then manage replacement explicitly.
from pathlib import Path
from tempfile import TemporaryDirectory
import csv
import numpy as np
import pyarrow as pa
import pyarrow.csv as pacsv
import vaex
workspace = TemporaryDirectory()
root = Path(workspace.name)
df = vaex.from_arrays(id=np.array(['001', '002', '003']), x=np.array([1., 2., 3.]))
df['twice'] = 2 * df.x
paths = {ext: root / ('data.' + ext) for ext in ['hdf5', 'arrow', 'feather', 'parquet', 'csv']}
df.export_hdf5(str(paths['hdf5']), chunk_size=2)
df.export_arrow(str(paths['arrow']), chunk_size=2) # Arrow IPC stream by default
df.export_feather(str(paths['feather']), compression='lz4')
df.export_parquet(str(paths['parquet']), compression='snappy', chunk_size=2)
df.export_csv(str(paths['csv']), index=False, chunk_size=2)
for ext in ['hdf5', 'arrow', 'feather', 'parquet']:
reopened = vaex.open(str(paths[ext]))
assert reopened.id.tolist() == ['001', '002', '003']
assert reopened.twice.tolist() == [2., 4., 6.]
# Arrow stream and Arrow file readers differ:
with pa.input_stream(str(paths['arrow'])) as source:
table = pa.ipc.open_stream(source).read_all() # this small fixture fits in RAM
assert table.num_rows == 3HDF5 means the Vaex tabular layout, not arbitrary HDF5. export_hdf5 has no
compression= keyword. mode='a' appends a different group, not rows to the same
table. Do not implement incremental row export by repeatedly writing /table in append
mode. For compression use a tested Parquet/Feather format and verify type/null fidelity.
Nested Arrow structures and multidimensional columns have format-specific limits;
round-trip a representative fixture before a full conversion.
export_arrow defaults to a stream (as_stream=True); request as_stream=False
when an Arrow IPC file is required. export_feather uses its own Feather writer and
can materialize a table; do not assume its memory profile matches chunked Arrow export.
Compressed buffers cannot provide the same memory-map behavior as uncompressed columns.
CSV types, chunking and conversion
# Check raw column names before a CSV parser silently renames duplicates.
with paths['csv'].open(newline='', encoding='utf-8') as handle:
headers = next(csv.reader(handle))
assert len(headers) == len(set(headers))
options = pacsv.ConvertOptions(column_types={'id': pa.string(), 'x': pa.float64(), 'twice': pa.float64()})
lazy = vaex.from_csv_arrow(str(paths['csv']), lazy=True, convert_options=options,
chunk_size='1MiB')
assert lazy.id.tolist() == ['001', '002', '003']
# pandas-backed reader is eager unless chunk_size or conversion is requested.
eager = vaex.from_csv(str(paths['csv']), dtype={'id': str})
assert eager.id.tolist() == ['001', '002', '003']
part_paths = []
for index, chunk in enumerate(vaex.from_csv(str(paths['csv']), chunk_size=2, dtype={'id': str})):
chunk['offset'] = chunk.x + 10
path = root / f'part-{index:04d}.hdf5'
chunk.export_hdf5(str(path))
part_paths.append(str(path))
combined = vaex.open_many(part_paths)
assert combined.offset.tolist() == [11., 12., 13.]
converted = vaex.from_csv(str(paths['csv']), convert=str(root / 'converted.hdf5'),
chunk_size=2, dtype={'id': str})
assert converted.id.tolist() == ['001', '002', '003']Use vaex.from_csv(..., chunk_size=...) for the iterator; there is no public
from_csv_chunked function. from_csv(..., convert=...) writes intermediate parts
and a combined file, so budget temporary disk space as well as the final output.
Lazy CSV does schema/index work and does not support compressed CSV files in this
release. convert_options is the correct parameter for Arrow column type hints.
Inspect null spellings, delimiter, quoting, encoding and units. The metadata cache and
conversion-reuse logic are conveniences, not content-addressed provenance: record source
checksums and use a fresh destination when inputs change.
For SQL, use a bounded pandas/SQLAlchemy chunk iterator and export each chunk to a
separate file, then vaex.open_many. Collecting all chunks in a list retains all data
in RAM. SQL import/export is not a native Vaex database endpoint; parameter binding,
transactions and schema belong to the chosen database client. Never interpolate user
values into SQL or put passwords in examples/logs.
State is separate from data
state_path = root / 'expressions.json'
df.state_write(str(state_path))
fresh = vaex.from_arrays(id=np.array(['001', '002', '003']), x=np.array([1., 2., 3.]))
fresh.state_load(str(state_path), set_filter=False, trusted=True)
assert fresh.twice.tolist() == [2., 4., 6.]
workspace.cleanup()A state file stores definitions, variables, selections and serialized functions; it is
not a data backup. Loading it can alter filters/columns and execute deserialized Python
objects. Use only trusted state plus matching schema/units/software versions.
set_filter=False prevents importing the training filter; validate target row count
and identities after transfer. Models appear only after their prediction transform is
attached to the saved DataFrame. See ML.
Remote/cloud I/O: source-verified, not service-tested
Core has native S3 handling through PyArrow with an s3fs fallback and GCS handling
through gcsfs. fs_options keys are backend-specific; an explicit fs object and
fs_options should not be combined. Remote reads may create a local file cache.
Examples below are illustrative and require an accessible object plus credentials
configured outside the code. They were checked against source, not run against accounts.
s3 = vaex.open('s3://example-bucket/measurements.parquet',
fs_options={'profile': 'research', 'region': 'us-east-1'})
gcs = vaex.open('gs://example-bucket/measurements.parquet',
fs_options={'project': 'research-project'})Do not assume installing adlfs makes an az:// URI understood by every Vaex reader.
For another backend, configure its filesystem and verify a representative read with
fs= using that backend's current documentation. Native HDF5 writer is path/h5py based;
it does not offer fs/fs_options and should not be advertised as a cloud writer.
Stage locally, verify, and upload with the authorized storage client. Arrow/Parquet
writers expose filesystem options, but authenticated writes were not tested in this review.
Vaex server: separate optional package
The current server guide and vaex-server 0.10.0 source use vaex server:
# Illustrative: requires vaex-server and a compatible file; local interface only.
vaex server --host 127.0.0.1 --port 9000 measurements=measurements.hdf5# Illustrative: server must already be running.
remote = vaex.open('ws://127.0.0.1:9000/measurements')
remote_mean = remote.mean('x')The Python client uses the WebSocket protocol, not a guessed REST /data endpoint.
The name here is the explicit measurements= alias. Use the server's schema/docs
for REST clients; the skill does not define custom endpoints or pagination. External
access needs deployment-specific authentication and TLS; the basic CLI is not a
production authentication setup. Server startup/client compatibility and authenticated
remote operations were not executed here. Server guide.
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