Skip to main content

Hermes

The Data Engine for Python

Profile. Normalize. Validate. Understand. Build on it. Know where it came from.

Hermes is a source-available (not OSI "open source") Python-native data engine for turning messy external and existing datasets into clean, profiled, well-understood data — with the story of where that data came from kept alongside it.

It is not another dataframe library. Hermes is the pipeline layer around your existing stack (Polars, PyArrow, DuckDB, Parquet): it brings data in, understands it, cleans and validates it, and makes it ready for analysis and machine learning.

Status: Alpha. This project is under active development. Everything in Implemented below actually runs; everything else is explicitly marked In Development and tracked in the roadmap. See License: Hermes is available under Elastic License 2.0.


Quick Start

pip install hermes-plt
import hermes as hr
import polars as pl

df = pl.read_csv("gdp.csv")

# Full statistical profile: types, nulls, uniques, ranges, means, distributions
report = hr.profile(df)
print("rows:", report.row_count, "· columns:", report.column_count)
print("date range:", report.date_range)
print("duplicates:", report.quality.duplicate_count)
for col in report.columns[:3]:
    print(col.name, "|", col.dtype, "| nulls:", col.null_count, "| unique:", col.unique_count)

# Quick glance without a full scan
info = hr.inspect(df)
print("rows:", info.row_count, "· columns:", info.column_count)
print("types:", info.columns)

# You can also profile straight from a file
hr.profile(path="gdp.csv")

# Wrap your data in the Hermes Dataset
ds = hr.Dataset(name="gdp", data_ref="gdp.csv", data=df)
ds.profile()
ds.inspect()

# Interoperate with your stack
polars_df = ds.to_polars()  # polars.DataFrame
arrow_tbl = ds.to_arrow()  # pyarrow.Table
pandas_df = ds.to_pandas()  # pandas.DataFrame

# Persist it (writes out/gdp.parquet)
ds.save("out", format="parquet")  # parquet / csv / json
csv_bytes = ds.export("csv")  # raw bytes for your own storage
# Or from the terminal
hermes profile_data gdp.csv

Implemented Today

Capability Notes
hr.profile(df / path) Column-by-column stats: dtype, nulls, unique values, min/max, mean, median, std, top values; plus completeness, duplicate and anomaly counts, date range, frequency
hr.inspect(df) Fast glance: row/column counts and column types
hr.get_freqs, hr.date_ranges, hr.anomaly_count Frequency detection, temporal range detection, IQR anomaly counts
hr.Dataset The Hermes core object (see below)
Dataset.load(), .inspect(), .profile() Load from parquet/csv/json and analyze
Dataset.to_polars()/to_arrow()/to_pandas() Interchange with the Python data stack
Dataset.save() / .export() Persist (parquet/csv/json) or export to another system
Dataset.metadata_info/ provenance_info / lineage_info / schema_info The beginning of Hermes' provenance story
hr.configure / get_config Logging and configuration
Error taxonomy HermesError, ParseError, SchemaError, NormalizationError, ValidationError, StorageError, QueryError, AcquisitionError and more
CLI hermes version, hermes info, hermes profile_data <path>
Connectors (10, experimental) Binance, Finnhub, FRED, IMF, SEC EDGAR, World Bank, YFinance, OpenSanctions, GDELT, public datasets — currently internal, being ported onto the engine (see roadmap)
Tests 200+ unit tests covering connectors, scheduler, features, and the data API

The Dataset object

Dataset is the center of Hermes. It holds your data and its metadata together, so a dataset is never just a file — it is a file plus its story:

ds = hr.Dataset(name="gdp", data_ref="gs/imports-1985-2024.csv", data=df)
ds.profile()
ds.schema_info  # schema reference
ds.lineage_info  # steps that produced the data
ds.provenance_info  # where the data came from

Over the coming releases, provenance, lineage, validation and versioning will be captured automatically at every stage, so the Dataset's story is trustworthy by construction.


In Development

The core value proposition is being built under a strict, code-first roadmap. The single source of truth — architecture, subsystem spec, engineering guide, roadmap and strategy — is docs/hermes.md.

Stage What ships
Phase 1 — Core foundation Full dataset lifecycle: parse → normalize → validate → profile → Dataset → save → query → export; automatic provenance & lineage capture; dataset catalog
Phase 2 — Data contracts Versioned schema registry with 7 canonical schemas (economic, financial, market, geopolitical, security, entity, document); normalization engine; validation engine; entity resolution (countries, companies, aliases)
Phase 3 — Data in Acquisition engine (retry, rate limiting, pagination, sync state); parser engine for CSV / JSON / XML / Parquet; public fetch / ingest / read API
Phase 4 — Connectors All 10 existing connectors ported onto one Connector contract + registry, with canonical-schema output, provenance and validation on every source
Phase 5 — Scale DuckDB query engine, dataset versioning / snapshots / diff, export matrix, benchmarks at 10–100M rows

The pipeline we are building:

CSV / JSON / XML / Parquet / API
    ↓  fetch/ingest → parse → normalize → validate → metadata + provenance + lineage
                        ↓
                    Canonical Dataset
                        ↓
        store → query → version → export → features

Design Principles

  • Local first. pip install hermes-plt and start. Local files, local storage, DuckDB, Parquet, Polars — no cloud account, no hosted service, no proprietary storage required.
  • Interoperable, not replaceable. Hermes sits between data sources and your models, and works with Pandas, Polars, PyArrow, DuckDB and the rest. It does not try to be one of them.
  • One auditable object. A Dataset should carry its data and its complete story — schema, metadata, provenance, lineage, version — so you never hold a disconnected file again.
  • Honest by default. What is built is documented as built; what is planned is documented as planned.

Roadmap

The current roadmap is kept in a single document, because the repository is the plan:

  • docs/hermes.md — what Hermes is, the data lifecycle, architecture, the subsystem engineering checklist (the tracked tasks), team & ownership, phased roadmap, and strategy/licensing.

Contributing

Hermes is source-available and built for the community. Contributions are welcome in: connectors, parsers, normalizers, validators, profilers, storage backends, query integrations, documentation, testing, and performance.

Before contributing: read docs/hermes.md for architecture, ownership and what is in flight, and open an issue or PR.


License

Hermes is source-available under the Elastic License 2.0 (ELv2) — the same license family used by Elasticsearch and Couchbase infrastructure. This is not an OSI-approved "open source" license; it is a deliberate choice:

  • You may read, use, modify, fork and redistribute Hermes freely, including for internal commercial use.
  • You may not offer Hermes to third parties as a hosted or managed service (a "cloud Hermes"). Hosting Hermes for third parties is a Hermes Enterprise privilege.
  • You may not strip the notices, remove license-key functionality, or use the trademarks.

Companies and products that need to embed or host Hermes commercially can obtain a Hermes Enterprise license (support, SLAs, enterprise features, managed-hosting rights) from the copyright holders.

Full terms: LICENSE.md.


Bring the data in. Make it usable. Know where it came from. Build on it.

Metadata

Release files for hermes-plt 0.2.17

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hermes-plt 0.2.17
File Size Uploaded Provenance Actions
hermes_plt-0.2.17.tar.gz 445.6 kB Without provenance Details for hermes_plt-0.2.17.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for hermes-plt 0.2.17
File Interpreter ABI Platform Actions
hermes_plt-0.2.17-py3-none-any.whl Python 3 none any Details for hermes_plt-0.2.17-py3-none-any.whl

Total release size: 941.2 kB

Release files / hermes_plt-0.2.17.tar.gz

Download URL hermes_plt-0.2.17.tar.gz
Size 445.6 kB
Tags Source
SHA-256 checksum
How to use checksums
316ed81e30cd79da2f669884b091857bc05d71657f1186502023c89afd2dd286
BLAKE2b-256 checksum
How to use checksums
62cf6cd9d5b1b72d99be2f848aec3c2d6cc3912ec60f3cf7f717856f65551cf5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / hermes_plt-0.2.17-py3-none-any.whl

Download URL hermes_plt-0.2.17-py3-none-any.whl
Size 495.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f83675de3d05291234580dd89f8ed367a08316cecd9e9ec893e7db59bf5ba8c5
BLAKE2b-256 checksum
How to use checksums
ab21b138a4aa76c5ed1a12c95073db3753f2d18071bd60a6a3d2273bb2b49764
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for hermes-plt 0.2.17

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.17 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page