Skip to main content

Hermes

The Data Engine for Python

Fetch. Parse. Normalize. Validate. Profile. Transform. Query. Export.

Hermes is an open source, Python native data engine designed to make working with external and existing datasets dramatically easier.

Instead of writing a different pipeline for every API, CSV, JSON response, database, or public dataset, Hermes provides one consistent system for bringing data in, understanding it, cleaning it, validating it, transforming it, and making it ready for analysis and machine learning.

import hermes as hr

data = hr.fetch("world_bank", dataset="gdp")

data = data.parse()
data = data.normalize()
data = data.validate()

print(data.profile())

df = data.to_polars()

Hermes is built around a simple idea:

Data should be as easy to work with as the models and applications built on top of it.


Why Hermes?

Modern data work is full of repetitive engineering.

Every new source means dealing with different APIs, authentication methods, formats, schemas, naming conventions, missing values, types, timestamps, units, identifiers, duplicates, and validation rules.

The result is usually the same pattern repeated across hundreds of projects:

Fetch
Clean
Rename
Cast
Validate
Deduplicate
Normalize
Save
Repeat

Hermes turns that repeated work into reusable infrastructure.

data = hr.fetch(source)

data = data.parse()
data = data.normalize()
data = data.validate()

data.profile()
data.inspect()

data.save("my_dataset")

The goal is not to replace Pandas, Polars, DuckDB, PyArrow, or other excellent tools.

The goal is to make them easier to use together.


What Hermes Is

Hermes is a general purpose data lifecycle engine.

It provides a common system for:

  • Acquiring data
  • Parsing raw data
  • Inferring schemas
  • Defining schemas
  • Normalizing data
  • Converting types
  • Converting units
  • Aligning timestamps
  • Cleaning datasets
  • Validating data
  • Profiling datasets
  • Detecting anomalies
  • Detecting duplicates
  • Transforming data
  • Resolving entities
  • Versioning datasets
  • Tracking provenance
  • Tracking lineage
  • Querying datasets
  • Storing datasets
  • Loading datasets
  • Exporting datasets

The same core system can work with completely different domains.

Finance.

Defense.

Healthcare.

Trade.

Energy.

Climate.

Geopolitics.

Research.

Enterprise data.

Private datasets.

The core does not need to understand every domain.

Domain specific knowledge can be added on top.


The Hermes Ecosystem

Hermes Core provides the general data engine.

Additional Hermes packages provide specialized capabilities.

Hermes Core
    |
    + Hermes Finance
    |
    + Hermes Defense
    |
    + Hermes Healthcare
    |
    + Hermes Trade
    |
    + Hermes Energy
    |
    + Hermes Climate
    |
    + Hermes Geopolitics
    |
    + Hermes Corporate
    |
    + Hermes Entity
    |
    + Hermes Features
    |
    + Hermes Connectors

This allows Hermes to remain small and general while the ecosystem grows around it.

A developer working with financial data should not need to install defense infrastructure.

A developer working with healthcare data should not need the finance package.

The core remains universal.

The ecosystem becomes specialized.


The Core API

Hermes is designed around a small, understandable API.

Function Purpose
fetch() Retrieve data from an external source
ingest() Bring an existing dataset into Hermes
parse() Convert raw data into structured records
normalize() Convert data into a consistent representation
validate() Verify that data satisfies defined rules
profile() Analyze the structure and quality of a dataset
inspect() Explore data, schema, metadata and quality
transform() Apply transformations to data
resolve() Connect records to canonical entities
deduplicate() Detect and handle duplicate records
query() Query Hermes datasets
save() Persist datasets
load() Load datasets
export() Export data to other systems
snapshot() Create an immutable dataset version
diff() Compare dataset versions
metadata() Retrieve dataset information
lineage() Show how data was produced
provenance() Show where data came from

The API is intentionally composable.

dataset = hr.fetch("source")

dataset = dataset.parse()
dataset = dataset.normalize()
dataset = dataset.validate()

dataset.profile()
dataset.inspect()

dataset.save("dataset")

Fetch Anything

Hermes provides a common interface for acquiring external data.

data = hr.fetch("world_bank", dataset="gdp")

The source can eventually be anything supported by a Hermes connector.

APIs.

Bulk downloads.

CSV files.

JSON.

XML.

Parquet.

Databases.

Data streams.

Custom sources.

The connector handles communication with the source.

Hermes Core handles what happens after the data arrives.


Ingest Existing Data

Not every dataset comes from an API.

Hermes can ingest datasets that already exist.

data = hr.ingest("dataset.parquet")
data = hr.ingest("dataset.csv")
data = hr.ingest("dataset.json")

The same Hermes lifecycle can then be applied.

data.profile()
data.validate()
data.normalize()
data.save("my_dataset")

Parse

Raw data should not immediately become a final dataset.

Hermes separates acquisition from interpretation.

data = hr.fetch(source)

structured = data.parse()

Parsing deals with the representation of the source.

JSON becomes records.

CSV becomes records.

XML becomes records.

Compressed archives become usable data.

Source specific parsing logic remains inside the appropriate parser.


Normalize

Different sources rarely describe data in exactly the same way.

One source might use:

country

Another:

country_name

Another:

CountryName

Another:

location

Hermes provides a normalization layer that can map these different representations into consistent schemas.

data = data.normalize()

Normalization can handle:

  • Names
  • Types
  • Dates
  • Timezones
  • Units
  • Currencies
  • Country codes
  • Identifiers
  • Categories
  • Frequencies
  • Source specific representations

The goal is simple:

Different sources should become easier to use together.


Validate

Hermes does not assume that data is correct just because it successfully downloaded.

report = data.validate()

Validation can check:

  • Required fields
  • Data types
  • Missing values
  • Invalid values
  • Duplicate records
  • Identifier validity
  • Date consistency
  • Range constraints
  • Schema compatibility
  • Referential integrity
  • Domain specific rules

Validation results remain inspectable.

report.valid
report.errors
report.warnings

Profile

Before working with a dataset, you should be able to understand it immediately.

profile = data.profile()

Hermes can provide information such as:

Rows
Columns
Types
Missing values
Unique values
Duplicates
Value ranges
Distributions
Date ranges
Frequency
Schema
Quality checks

The objective is simple:

Open a dataset and understand what you are dealing with.


Inspect

Hermes provides a higher level inspection interface for developers.

data.inspect()

Inspection can expose:

  • Dataset information
  • Schema
  • Sample records
  • Metadata
  • Validation results
  • Profile
  • Quality information
  • Source
  • Lineage
  • Version
  • Entity information

A dataset should not be a black box.


Transform

Hermes should work with the tools developers already use.

data = data.transform(my_function)

Complex transformations can be composed into pipelines.

data = data.transform(clean_dates).transform(calculate_features).transform(remove_invalid_records)

Hermes does not try to become another dataframe library.

Instead, it provides the pipeline layer around existing data tools.


Entity Resolution

Data from different sources often refers to the same real world entity in different ways.

Hermes provides an interface for connecting those records.

data = data.resolve()

For example:

Apple Inc.
Apple Computer Inc.
Apple Computer, Inc.
AAPL
US0378331005

can potentially be connected to a canonical entity.

The actual resolution logic can come from specialized Hermes packages.

This allows the same infrastructure to support:

  • Companies
  • Countries
  • Securities
  • Organizations
  • Locations
  • Vessels
  • Other domain specific entities

Dataset Versioning

Data changes.

Sources revise historical values.

Schemas change.

Pipelines improve.

Hermes treats datasets as evolving objects.

dataset.snapshot()
dataset.version()
dataset.diff("v1", "v2")

This makes it possible to understand what changed between dataset versions.

Historical data should remain reproducible instead of silently changing underneath your application.


Provenance

Every dataset should answer:

Where did this data come from?

Hermes keeps provenance information alongside the dataset.

For example:

dataset.provenance()

could return:

WorldBank
parser@1.3.0
mapper@0.9.3
normalizer@1.4.7
validator@3.4.8
dataset@gdp_v2

A much more complex system can eventually be built on top of this.

The foundation remains simple.


Lineage

Hermes records how data moves through the system.

For example:

WorldBank
    ↓
Parser
    ↓
Mapper
    ↓
Normalizer
    ↓
Validator
    ↓
Entity Resolver
    ↓
Dataset

The important thing is that the final dataset is not disconnected from the process that produced it.

Developers should be able to trace data back through the pipeline.


Works With Your Data Stack

Hermes is designed to work with the Python data ecosystem.

Potential integrations include:

Tool Hermes Integration
Pandas DataFrame conversion
Polars DataFrame conversion
PyArrow Arrow data interchange
DuckDB Analytical querying
NumPy Numerical processing
Parquet Dataset storage
SQL databases Data ingestion and export
Machine learning frameworks ML ready datasets

Hermes should make existing tools work together rather than force developers into a proprietary data model.


Connectors

Hermes connectors provide access to external sources.

A connector should primarily answer:

How do I get this source's data?

Hermes Core handles the rest.

A connector can provide:

  • Authentication
  • Requests
  • Pagination
  • Rate limiting
  • Retries
  • Source specific parsing
  • Source metadata

Connectors can be independently developed and distributed.

This allows the ecosystem to grow without constantly changing Hermes Core.


Domain Packages

Hermes Core provides the infrastructure.

Domain packages provide knowledge.

For example:

Hermes Finance

Financial datasets, securities, companies, economic indicators, market data, financial statements and financial features.

Hermes Defense

Defense expenditure, conflicts, military organizations, equipment, arms transfers, security events and defense indicators.

Hermes Healthcare

Healthcare statistics, diseases, organizations, hospitals, medicines and public health datasets.

Hermes Trade

Trade flows, commodities, customs information, ports, countries and supply chain datasets.

The same core engine can power all of them.


Feature Engineering

Hermes can also provide reusable feature engineering through specialized packages.

For example:

features = finance.features(data)

or:

features = defense.features(data)

Features should have explicit definitions and dependencies.

This makes them reusable across research, analytics and machine learning systems.


Designed for Developers

Hermes should feel natural in Python.

import hermes as hr

dataset = hr.fetch("source")

dataset = dataset.parse().normalize().validate()

dataset.profile()

df = dataset.to_polars()

No giant framework is required to get started.

No forced cloud account.

No mandatory hosted service.

No requirement to use a proprietary storage system.

Hermes Core is open source.


Local First

Hermes is designed to work locally.

A developer should be able to:

pip install hermes-plt

and start working with data immediately.

Local files can be used.

Local storage can be used.

DuckDB can be used.

Parquet can be used.

Polars can be used.

A database can be added when the project needs one.

Cloud infrastructure should be an extension of Hermes, not a requirement for using it.


Built for Growth

Hermes starts small.

A single developer can use it for a single dataset.

A research team can use it for hundreds of datasets.

A company can build internal data pipelines around it.

Larger deployments can eventually introduce:

  • Remote datasets
  • Distributed processing
  • Object storage
  • Dataset catalogs
  • Continuous ingestion
  • Hosted APIs
  • Large scale querying
  • Team access
  • Enterprise controls

The same core concepts remain intact.


What Hermes Is Not

Hermes Core is not trying to be:

  • A replacement for Pandas
  • A replacement for Polars
  • A replacement for DuckDB
  • A data warehouse
  • A machine learning framework
  • A dashboarding platform
  • An intelligence application
  • A knowledge graph by itself

Hermes exists to sit between data sources and the applications that depend on that data.


Philosophy

Data should be composable

A dataset from one source should be usable alongside a dataset from another source.

Data should be inspectable

Developers should know what they received before building on it.

Data should be reproducible

The same pipeline should be understandable and repeatable.

Data should be traceable

Every important dataset should have a clear origin.

Data should be interoperable

Hermes should work with the ecosystem instead of locking developers into Hermes.

Data infrastructure should be reusable

The same ingestion, validation and transformation infrastructure should work across domains.


Roadmap

Phase 1

Hermes Core foundation.

  • Fetch
  • Ingest
  • Parse
  • Normalize
  • Validate
  • Profile
  • Inspect
  • Transform
  • Export
  • Dataset abstraction
  • Connector system
  • Schema system

Phase 2

Reliable data infrastructure.

  • Dataset storage
  • Dataset versions
  • Snapshots
  • Provenance
  • Lineage
  • Better validation
  • Better profiling
  • Caching
  • Query interface

Phase 3

Ecosystem.

  • Hermes Finance
  • Hermes Defense
  • Hermes Healthcare
  • Hermes Trade
  • Hermes Energy
  • Hermes Climate
  • Hermes Geopolitics
  • Hermes Corporate
  • Hermes Entity
  • Hermes Features

Phase 4

Scale.

  • Remote datasets
  • Object storage
  • Distributed processing
  • Continuous ingestion
  • Large dataset querying
  • Cloud execution

Phase 5

Hermes Cloud.

A managed infrastructure layer built around Hermes Core.

  • Hosted datasets
  • APIs
  • Dataset catalogs
  • Continuous pipelines
  • Versioned data
  • Team access
  • Usage controls
  • Enterprise infrastructure

The Vision

Hermes starts as a Python library.

It can grow into a complete ecosystem for data.

The long term goal is simple:

Make high quality data infrastructure accessible through one consistent developer experience.

Instead of every developer building their own ingestion system.

Instead of every company rebuilding the same normalization pipelines.

Instead of every project implementing its own validation framework.

Instead of datasets becoming disconnected collections of files.

Hermes provides the common foundation.

One engine.

One ecosystem.

Any data.


Contributing

Hermes is open source and built for developers.

Contributions can include:

  • Connectors
  • Parsers
  • Normalizers
  • Validators
  • Profilers
  • Storage backends
  • Query integrations
  • Domain packages
  • Documentation
  • Testing
  • Performance improvements

Build something useful.

Share it.

Improve it.

Build on top of it.


License

[License information will be added here.]


Hermes

The data engine for the Python ecosystem.

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

Metadata

Release files for hermes-plt 0.2.16

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.16
File Size Uploaded Provenance Actions
hermes_plt-0.2.16.tar.gz 409.6 kB Without provenance Details for hermes_plt-0.2.16.tar.gz

Built distribution (wheel)

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

Total release size: 868.4 kB

Release files / hermes_plt-0.2.16.tar.gz

Download URL hermes_plt-0.2.16.tar.gz
Size 409.6 kB
Tags Source
SHA-256 checksum
How to use checksums
647ec152e855439cac2504ee7f2ef8b3ae560fdb3d13ae92d0833b7cb9192d31
BLAKE2b-256 checksum
How to use checksums
713cc8dff2a440ef358c2716d0545a12a4f31ebbd699d477acccbfb09ccbd618
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"44","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

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

Download URL hermes_plt-0.2.16-py3-none-any.whl
Size 458.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c99e4aab3f70709f1505b5df2216225d10c6db4bb6eef71ccfc6801aef729b76
BLAKE2b-256 checksum
How to use checksums
44e6bc309f4a43692bb9f86fd47a7d7d83ab1f109c828a428073e118c317dacb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"44","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for hermes-plt 0.2.16

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