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/jsonl/xml 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.parse() / hr.normalize() / hr.validate() Parsing engine (csv/json/jsonl/parquet/xml) plus 17 normalization rules and 22 validation rules
Credentials hr.set_cred()/get_cred()/has_cred()/list_creds()/delete_cred() and the hermes cred CLI
Scheduler @hermes.core.scheduler.schedule cron/interval jobs
Error taxonomy HermesError, ParseError, SchemaError, NormalizationError, ValidationError, StorageError, QueryError, AcquisitionError and more
CLI hermes version, hermes info, hermes profile_data <path>, hermes cred ...
Connectors (10, experimental) Binance, Finnhub, FRED, IMF, SEC EDGAR, World Bank, YFinance, OpenSanctions, GDELT (stub), public datasets — currently internal, being ported onto the engine (see roadmap)
Tests 385 unit tests covering connectors, scheduler, features, parsing, normalization, validation, 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.19

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.19
File Size Uploaded Provenance Actions
hermes_plt-0.2.19.tar.gz 464.8 kB Without provenance Details for hermes_plt-0.2.19.tar.gz

Built distribution (wheel)

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

Total release size: 983.9 kB

Release files / hermes_plt-0.2.19.tar.gz

Download URL hermes_plt-0.2.19.tar.gz
Size 464.8 kB
Tags Source
SHA-256 checksum
How to use checksums
ad1757c961f500267a6926ef81f17108e0f6127da762d9eab852979b19564ee3
BLAKE2b-256 checksum
How to use checksums
38d72f2b25ff7cdad5cb234c399180ebdca94a7ae633d4d8e2c551257fc75fa4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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.19-py3-none-any.whl

Download URL hermes_plt-0.2.19-py3-none-any.whl
Size 519.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e2dd5ebbcd263b7a9991fac41c9d8d0dd91911b4be80b252017b903e6d363568
BLAKE2b-256 checksum
How to use checksums
b781c2f12c53ba8ec0d590ff11099becfdddebc35996d98e47f8e1d4a6c6ee54
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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.19

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