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-pltand 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
Datasetshould 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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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.