Skip to main content

Energy database: hierarchy + series metadata on Postgres, bitemporal I/O via timedb

Project description

⚡ EnergyDB

Persistent storage for energy portfolios — assets, grid topology, and bitemporal time series, in one connected database.

PyPI Python Versions License Slack


🏗️ What is EnergyDB?

EnergyDB is a database for energy portfolios. It stores three things together in one connected system:

Layer Description Real-World Example
🌳 Asset hierarchy Arbitrary-depth tree of portfolios, sites, and assets "Offshore-1 → WindTurbine T01 → power"
🔗 Grid topology Typed edges (lines, transformers, pipes, interconnections) connecting any two assets "Cable-1: BusA → BusB"
⏱️ Bitemporal time series Actuals and versioned forecasts attached to any node or edge, queryable as-of any point in time "power_flow on Cable-1, valid Wed 12:00, known Mon 18:00"

Structure lives in PostgreSQL, values live in ClickHouse, and stable UUID identity lets Python objects round-trip to the database without losing any structural state. (A separate change_time audit field tracks corrections without polluting the bitemporal model.)

EnergyDB extends TimeDB with persistent storage for EnergyDataModel hierarchies.


✨ Why EnergyDB?

Most time-series systems are agnostic about what their series represent — they treat data as opaque (series_id, timestamp, value) triples. EnergyDB knows it is a portfolio, and links every series back to the asset or grid edge it describes.

  • 🔁 Round-trip persistence: Every Element keeps its UUID7 from in-memory object to row primary key — renames, moves, and property edits become silent UPDATEs, never delete-then-insert.
  • 📋 Diffable structural changes: dry_run=True previews every insert, rename, move, and delete before you apply — no surprise data loss on replace_subtree.
  • ⏱️ Bitemporal queries: Forecast revisions, corrections, and time-of-knowledge backtests, powered by TimeDB.
  • 🧭 Lazy fluent navigation: client.get_node("Portfolio", "Site", "T01").read(...) resolves to one indexed SQL query, regardless of subtree size.
  • ⚖️ Unit conversion at the boundary: Declare canonical units once; pint rescales every read and write automatically.

🚀 Quick Start

1. Installation

pip install energydb

Requires Python 3.12+, PostgreSQL (asset hierarchy + series catalog), and ClickHouse (time-series values).

2. Usage Example

from datetime import UTC, datetime

import energydb as edb
import pandas as pd

client = edb.Client()  # reads TIMEDB_PG_DSN / TIMEDB_CH_URL from env
client.create()        # PostgreSQL schema + ClickHouse series_values table

# 1. Declare a turbine and the series it will hold (metadata only).
t01 = edb.wind.WindTurbine(
    name="T01", lat=55.01, lon=3.02, capacity=3.5, hub_height=80,
    timeseries=[
        edb.TimeSeries(name="power", unit="MW",
                       data_type=edb.DataType.ACTUAL),
    ],
)

# 2. Wrap it in a site and a portfolio.
site = edb.Site(name="Offshore-1", lat=55.0, lon=3.0, members=[t01])
portfolio = edb.Portfolio(name="my-portfolio", members=[site])

# 3. Persist structure (nodes, edges, series declarations). Idempotent.
client.register_tree(portfolio)

# 4. Write a day of hourly values for the turbine's power series.
start = datetime(2026, 1, 1, tzinfo=UTC)
df = pd.DataFrame({
    "valid_time": pd.date_range(start, periods=24, freq="1h", tz="UTC"),
    "value": [2.5 + 0.05 * i for i in range(24)],
})
client.get_node("my-portfolio", "Offshore-1", "T01").write(
    df, name="power", data_type="actual",
)

# 5. Read back — single asset, or across the whole portfolio.
client.get_node("my-portfolio", "Offshore-1", "T01").read(name="power", data_type="actual")
client.get_node("my-portfolio").read(name="power", data_type="actual")

# 6. Reconstruct the full EDM tree from the database.
tree = client.get_tree("my-portfolio", include_series=True)

🧪 Try it in Google Colab

Want to try EnergyDB without a local setup? Open our Quickstart in Colab — the first cell automatically installs PostgreSQL + ClickHouse inside the VM.

Open In Colab

Note: Data persists only within the active Colab session. Additional notebooks are available in the examples/ directory.


📚 Documentation & Resources


📦 Related Projects

Project Description
TimeDB Bitemporal time-series database with auditability and overlapping-forecast support
TimeDataModel Pythonic data model for time series
EnergyDataModel Data model for energy assets (solar, wind, battery, grid, ...)

🤝 Contributing

Contributions are welcome! If you're interested in improving EnergyDB, please see our Development Guide for local setup instructions.


Licensed under the Apache-2.0 License.

Find a bug or have a feature request? Open an Issue.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

energydb-0.5.0.tar.gz (63.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

energydb-0.5.0-py3-none-any.whl (48.7 kB view details)

Uploaded Python 3

File details

Details for the file energydb-0.5.0.tar.gz.

File metadata

  • Download URL: energydb-0.5.0.tar.gz
  • Upload date:
  • Size: 63.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for energydb-0.5.0.tar.gz
Algorithm Hash digest
SHA256 addcc3af8251cadc0ef3dc01b901d66f3b121573450ab4e2da91186c229f2a21
MD5 60a7e4156b01c3b11cc93bd87f5d0bba
BLAKE2b-256 1fa3bcd12d8ea9d283105aa18dc54ff23c9c59f2a9e96efd0ef64f3fa3989dcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for energydb-0.5.0.tar.gz:

Publisher: publish.yml on rebase-energy/energydb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file energydb-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: energydb-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 48.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for energydb-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 911f976aba4436fabec6738cf12e1fe41b5d90b57ebf3f30f1dbfcbef57d0cb9
MD5 69bc8d35dde8ec282edd49748ce35506
BLAKE2b-256 ac68db197efaa3f6b6ff691907cecb2c40e5d6f6a0f019edd853dd082647c333

See more details on using hashes here.

Provenance

The following attestation bundles were made for energydb-0.5.0-py3-none-any.whl:

Publisher: publish.yml on rebase-energy/energydb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page