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

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.18
File Size Uploaded Provenance Actions
hermes_plt-0.2.18.tar.gz 462.6 kB Without provenance Details for hermes_plt-0.2.18.tar.gz

Built distribution (wheel)

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

Total release size: 977.8 kB

Release files / hermes_plt-0.2.18.tar.gz

Download URL hermes_plt-0.2.18.tar.gz
Size 462.6 kB
Tags Source
SHA-256 checksum
How to use checksums
912aa1b41b1020df6e6d15df06f1a120af98098e08a3527a430e0aa7e7f80438
BLAKE2b-256 checksum
How to use checksums
282d7084be0dab3b6866bb953bd549d6ce9aceac0b3f89c1708c2edff2f6d099
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.18-py3-none-any.whl

Download URL hermes_plt-0.2.18-py3-none-any.whl
Size 515.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6f251d74fbec7307dd0044c2763a968ab69c9f1f229647d6cf88e5a636ee7974
BLAKE2b-256 checksum
How to use checksums
d9e3b301fda06648ff189f3eb66c642c7ee86c3e9136098da0c6e559b3512b5b
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.18

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