3. Read across the whole portfolio in one fluent call.

May 28, 2026 ยท View on GitHub

โšก EnergyDB

Persistent storage for energy portfolios โ€” assets, grid topology, and 3-dimensional 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:

LayerDescriptionReal-World Example
๐ŸŒณย Asset hierarchyArbitrary-depth tree of portfolios, sites, and assets"Offshore-1 โ†’ WindTurbine T01 โ†’ power"
๐Ÿ”—ย Grid topologyTyped edges (lines, transformers, pipes, interconnections) connecting any two assets"Cable-1: BusA โ†’ BusB"
โฑ๏ธย 3-dimensional time seriesActuals 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.

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.
  • โฑ๏ธ Time-of-knowledge queries: Forecast revisions, corrections, and as-of 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.

TimeDB demo

๐Ÿš€ 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
client.create()

# 1. Declare your portfolio: a tree of typed assets with their series.
t01 = edb.wind.WindTurbine(
    name="T01", capacity=3.5, hub_height=80,
    timeseries=[edb.TimeSeries(name="power", unit="MW",
                               data_type=edb.DataType.ACTUAL)],
)
portfolio = edb.Portfolio(
    name="my-portfolio",
    members=[edb.Site(name="Offshore-1", members=[t01])],
)
client.register_tree(portfolio)   # create-only; edit existing nodes via scope mutators

# 2. Write hourly power for that turbine.
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",
)

# 3. Read across the whole portfolio in one fluent call.
client.get_node("my-portfolio").read(name="power", data_type="actual")

๐Ÿงช 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


ProjectDescription
TimeDB3-dimensional time-series storage on ClickHouse with auditability and overlapping-forecast support
TimeDataModelPythonic data model for time series
EnergyDataModelData 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.