Database schema
A live map of the energy_prod PostgreSQL database for anyone integrating with or exploring the data. Column types and example rows are read from the database on every load; the descriptions are curated.
How to read this
- Two schemas. core holds the canonical tables written by ingestion (the write side, owned by Alembic). mart exposes read-only views for consumers — start here unless you need raw detail.
- Time. Every fact carries delivery_ts_utc (UTC), delivery_ts_local and timezone. granularity_minutes is the native resolution; the *_15min views resample everything onto one uniform 15-minute grid.
- Versioning. Forecasts and Aurora data keep every version_date; is_latest flags the newest, and the *_latest* views pre-filter to it.
- Currency & zones. Prices are EUR/MWh; mart.v_market_prices_local converts to local currency via ECB rates. market_zone is an ENTSO-E EIC code (→ core.market_zones).
- Access. A read-only role can SELECT on mart only (ADR-013).
Tables & views
core · reference
Registries the pipeline reads to decide what to ingest and how to label it.
core.countries
table~4 rows5 columnsRegistry of countries the pipeline tracks. ENTSO-E ingestion only pulls countries flagged is_active (ADR-020).
| Column | Type | Null? | Description |
|---|---|---|---|
country_codePK | text | no | ISO-3166 alpha-2 code (primary key). |
country_name | text | no | Display name. |
currency_code | text | no | ISO-4217 local currency; used by mart.v_market_prices_local for FX conversion. |
timezone | text | no | IANA timezone used to derive local timestamps for this country. |
is_active | boolean | no | When false, the ingestion skips this country. |
- country_code
- IT
- country_name
- Italy
- currency_code
- EUR
- timezone
- Europe/Rome
- is_active
- true
core.market_zones
table~10 rows4 columnsBidding / market zones per country, keyed by ENTSO-E EIC code. Ingestion reads the active zones to know which areas to request (ADR-020).
| Column | Type | Null? | Description |
|---|---|---|---|
zone_codePK | text | no | ENTSO-E EIC code (primary key), e.g. 10Y1001A1001A73I. |
country_code | text | no | Owning country → core.countries.country_code. |
zone_name | text | no | Display name (e.g. Italy North). |
is_active | boolean | no | When false, the ingestion skips this zone. |
- zone_code
- 10Y1001A1001A73I
- country_code
- IT
- zone_name
- Italy North
- is_active
- true
core.sources
table~3 rows6 columnsCatalog of data providers. Descriptive only — each source is wired by a Python connector in the ingestion service; this table does not enable or disable ingestion.
| Column | Type | Null? | Description |
|---|---|---|---|
source_idPK | bigint | no | Surrogate primary key. |
source_nameunique | text | no | Unique provider key (entsoe / aurora / ecb). |
source_type | text | no | api or file. |
base_url | text | yes | Informational endpoint / URL. |
is_active | boolean | no | Informational flag — not read by the backend. |
created_at | timestamp with time zone | no | When the source row was created. |
- source_id
- 1
- source_name
- entsoe
- source_type
- api
- base_url
- https://web-api.tp.entsoe.eu/api
- is_active
- true
- created_at
- 2026-06-16 13:50:15
core · market data
The canonical facts written by ingestion. Prices and forecasts are in EUR/MWh; generation in MW.
core.market_prices
table~3080 rows12 columnsCanonical electricity prices per delivery interval, zone and source. Always EUR/MWh (ENTSO-E settles in EUR). Grain: one row per (delivery_ts_utc, country, zone, source, granularity, version_date).
| Column | Type | Null? | Description |
|---|---|---|---|
idPK | bigint | no | Surrogate primary key (auto-increment). |
delivery_ts_utcunique | timestamp with time zone | no | Start of the delivery interval, in UTC. |
delivery_ts_local | timestamp without time zone | no | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
timezone | text | no | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_codeunique | text | no | ISO-3166 alpha-2 country code → core.countries.country_code. |
market_zoneunique | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
price_eur_mwh | numeric | yes | Price in EUR per MWh. |
currency_code | text | no | Always EUR here; local conversion lives in mart.v_market_prices_local. |
source_nameunique | text | no | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutesunique | integer | no | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_dateunique | date | yes | Vintage for revisable prices (NULL for ENTSO-E spot). |
ingested_at | timestamp with time zone | no | When the row was written into the database. |
- id
- 1
- delivery_ts_utc
- 2026-06-11 22:00:00
- delivery_ts_local
- 2026-06-12 00:00:00
- timezone
- Europe/Rome
- country_code
- IT
- market_zone
- 10Y1001C--00096J
- price_eur_mwh
- 144.590000
- currency_code
- EUR
- source_name
- entsoe
- granularity_minutes
- 15
- version_date
- NULL
- ingested_at
- 2026-06-16 13:50:27
core.generation
table~6528 rows12 columnsActual electricity generation in MW per technology, delivery interval and zone (ENTSO-E actual generation; currently Solar & Wind).
| Column | Type | Null? | Description |
|---|---|---|---|
idPK | bigint | no | Surrogate primary key (auto-increment). |
delivery_ts_utcunique | timestamp with time zone | no | Start of the delivery interval, in UTC. |
delivery_ts_local | timestamp without time zone | no | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
timezone | text | no | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_codeunique | text | no | ISO-3166 alpha-2 country code → core.countries.country_code. |
market_zoneunique | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
production_type | text | no | Human-readable generation technology (e.g. Solar, Wind Onshore). |
psr_typeunique | text | no | ENTSO-E PSR code for the technology (e.g. B16 = Solar, B19 = Wind Onshore). |
generation_mw | numeric | yes | Generated power in MW for the interval. |
source_nameunique | text | no | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutesunique | integer | no | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
ingested_at | timestamp with time zone | no | When the row was written into the database. |
- id
- 1
- delivery_ts_utc
- 2026-06-11 22:00:00
- delivery_ts_local
- 2026-06-12 00:00:00
- timezone
- Europe/Rome
- country_code
- IT
- market_zone
- 10Y1001C--00096J
- production_type
- Solar
- psr_type
- B16
- generation_mw
- 0.000
- source_name
- entsoe
- granularity_minutes
- 15
- ingested_at
- 2026-06-16 13:50:28
core.forecast_prices
table~0 rows15 columnsPrice forecasts per delivery interval, zone, scenario and market type. Versioned: every published vintage is kept (version_date), with is_latest flagging the newest.
| Column | Type | Null? | Description |
|---|---|---|---|
idPK | bigint | no | Surrogate primary key (auto-increment). |
delivery_ts_utcunique | timestamp with time zone | no | Start of the delivery interval, in UTC. |
delivery_ts_local | timestamp without time zone | no | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
timezone | text | no | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_codeunique | text | no | ISO-3166 alpha-2 country code → core.countries.country_code. |
market_zoneunique | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
forecast_value | numeric | yes | Forecast price. |
unit | text | no | Price unit (default EUR/MWh). |
source_nameunique | text | no | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutesunique | integer | no | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_dateunique | date | no | Publication vintage of the data; lets multiple revisions coexist. |
is_latest | boolean | no | True for the most recent version_date of each series (set by the loader). |
ingested_at | timestamp with time zone | no | When the row was written into the database. |
scenariounique | text | no | Forecast scenario name (e.g. Central). |
market_typeunique | text | no | Market segment the price refers to (e.g. Day-ahead, Intraday). |
No rows yet.
core.assumptions
table~0 rows12 columnsLong-term scenario assumptions loaded from Aurora workbooks (fuel prices, FX, demand drivers…), keyed by geography, scenario, variable and year. Versioned by version_date.
| Column | Type | Null? | Description |
|---|---|---|---|
idPK | bigint | no | Surrogate primary key (auto-increment). |
source_nameunique | text | no | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
geographyunique | text | yes | Region the assumption applies to (e.g. Italy). |
scenariounique | text | no | Forecast scenario name (e.g. Central). |
category | text | yes | Grouping for the variable (e.g. FX rates). |
variableunique | text | no | Assumption name. |
unit | text | yes | Unit of value. |
yearunique | integer | no | Calendar year the assumption refers to. |
value | numeric | yes | Numeric value. |
version_dateunique | date | no | Publication vintage of the data; lets multiple revisions coexist. |
is_latest | boolean | no | True for the most recent version_date of each series (set by the loader). |
ingested_at | timestamp with time zone | no | When the row was written into the database. |
No rows yet.
core.fx_rates
table~6740 rows7 columnsDaily foreign-exchange reference rates from the ECB, base EUR. Used to convert EUR prices to local currency.
| Column | Type | Null? | Description |
|---|---|---|---|
idPK | bigint | no | Surrogate primary key (auto-increment). |
baseunique | text | no | Base currency (always EUR). |
quoteunique | text | no | Quote currency (e.g. RON). |
rate_dateunique | date | no | Date the rate applies to. |
rate | numeric | no | Units of quote currency per 1 unit of base. |
sourceunique | text | no | Provider (ecb). |
ingested_at | timestamp with time zone | no | When the row was written into the database. |
- id
- 1
- base
- EUR
- quote
- RON
- rate_date
- 2010-02-14
- rate
- 1.00000000
- source
- ecb
- ingested_at
- 2026-06-16 13:50:29
core · operations & app
Job audit log, on-demand run queue, file uploads and dashboard settings.
core.ingestion_runs
table~5 rows10 columnsAudit log of ingestion job executions — one row per run, with status, row counts and timing. Powers the Job Runs page.
| Column | Type | Null? | Description |
|---|---|---|---|
run_idPK | bigint | no | Surrogate primary key. |
source_name | text | no | Source the run ingested. |
provider | text | yes | Connector / provider key used. |
country_code | text | yes | Country the run targeted (if scoped). |
started_at | timestamp with time zone | no | Run start time. |
finished_at | timestamp with time zone | yes | Run end time (NULL while running). |
status | text | no | running / success / error. |
rows_inserted | integer | yes | Rows newly inserted. |
rows_updated | integer | yes | Rows updated (idempotent re-runs). |
error_message | text | yes | Populated on failure. |
- run_id
- 1
- source_name
- entsoe
- provider
- entsoe
- country_code
- IT
- started_at
- 2026-06-16 13:50:18
- finished_at
- 2026-06-16 13:50:27
- status
- success
- rows_inserted
- 2695
- rows_updated
- 0
- error_message
- NULL
core.ingestion_requests
table~0 rows11 columnsOn-demand 'Run now' queue (ADR-023). The Job Runs page writes a pending row when an operator triggers an ingestion; the scheduler polls, runs the matching job, and updates the status. Decoupled from the web (Postgres only) — mirrors core.file_uploads.
| Column | Type | Null? | Description |
|---|---|---|---|
idPK | bigint | no | Surrogate primary key. |
kind | text | no | What to run: entsoe-prices / entsoe-generation / ecb-fx. |
country_code | text | yes | Target country (NULL for country-agnostic kinds like ecb-fx). |
status | text | no | pending / processing / done / failed. |
requested_by | text | yes | Who triggered it (e.g. dashboard). |
requested_at | timestamp with time zone | no | When the request was enqueued. |
started_at | timestamp with time zone | yes | When the scheduler started processing it. |
finished_at | timestamp with time zone | yes | When processing finished. |
run_id | bigint | yes | Best-effort link to the ingestion run it spawned → core.ingestion_runs.run_id. |
rows_inserted | integer | yes | Rows inserted by the triggered job. |
error_message | text | yes | Populated on failure. |
No rows yet.
core.file_uploads
table~0 rows14 columnsUploaded Aurora workbooks before/after processing. The binary file lives in content; the lifecycle is tracked via status. Read mart.v_file_uploads to avoid the binary column.
| Column | Type | Null? | Description |
|---|---|---|---|
idPK | bigint | no | Surrogate primary key. |
filename | text | no | Original file name. |
content | bytea | no | Raw uploaded bytes (redacted here). |
byte_size | integer | no | File size in bytes. |
source_name | text | no | Source the file belongs to. |
kind | text | no | Workbook kind (e.g. aurora). |
version_date | date | no | Vintage the upload represents. |
status | text | no | pending / processed / error. |
uploaded_by | text | yes | Who uploaded it. |
uploaded_at | timestamp with time zone | no | Upload time. |
processed_at | timestamp with time zone | yes | When processing finished. |
run_id | bigint | yes | Ingestion run that processed it → core.ingestion_runs.run_id. |
rows_loaded | integer | yes | Rows loaded from the file. |
error_message | text | yes | Populated on failure. |
No rows yet.
core.app_settings
table~3 rows4 columnsEditable key/value pipeline settings (ADR-019). The Configuration page writes here; an environment variable, where set, takes precedence.
| Column | Type | Null? | Description |
|---|---|---|---|
keyPK | text | no | Setting name (e.g. ingest_interval_days). |
value | text | yes | Setting value (stored as text). |
updated_by | text | yes | Who last changed it. |
updated_at | timestamp with time zone | no | When it was last changed. |
- key
- ingest_interval_days
- value
- 3
- updated_by
- NULL
- updated_at
- 2026-06-16 13:50:15
core.api_keys
table~0 rows6 columnsEncrypted provider credentials, one row per provider. Secrets are encrypted at rest with pgcrypto (ADR-012) and are never exposed by the dashboard.
| Column | Type | Null? | Description |
|---|---|---|---|
providerPK | text | no | Provider key (primary key). |
key_value | bytea | no | Encrypted secret (bytea, redacted here). |
status | text | no | active / disabled. |
expires_at | timestamp with time zone | yes | Optional expiry. |
updated_by | text | yes | Who last set it. |
updated_at | timestamp with time zone | no | When it was last set. |
No rows yet.
mart · views — start here
Read-optimised views with names joined in and uniform 15-min variants. Consumers (BI, integrations) should read from mart, not core.
mart.v_market_prices
view13 columnscore.market_prices enriched with country & zone names. EUR/MWh, native granularity. General-purpose price view.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
price_eur_mwh | numeric | yes | |
currency_code | text | yes | |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
- delivery_ts_local
- 2026-06-12 00:00:00
- delivery_ts_utc
- 2026-06-11 22:00:00
- timezone
- Europe/Rome
- country_code
- IT
- country_name
- Italy
- market_zone
- 10Y1001C--00096J
- zone_name
- Italy Calabria
- price_eur_mwh
- 144.590000
- currency_code
- EUR
- source_name
- entsoe
- granularity_minutes
- 15
- version_date
- NULL
- ingested_at
- 2026-06-16 13:50:27
mart.v_market_prices_15min
view13 columnsLike v_market_prices but resampled to a uniform 15-minute grid (hourly values are expanded), so every zone aligns on one time axis.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
price_eur_mwh | numeric | yes | |
currency_code | text | yes | |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
- delivery_ts_local
- 2026-06-12 00:00:00
- delivery_ts_utc
- 2026-06-11 22:00:00
- timezone
- Europe/Rome
- country_code
- IT
- country_name
- Italy
- market_zone
- 10Y1001C--00096J
- zone_name
- Italy Calabria
- price_eur_mwh
- 144.590000
- currency_code
- EUR
- source_name
- entsoe
- granularity_minutes
- 15
- version_date
- NULL
- ingested_at
- 2026-06-16 13:50:27
mart.v_market_prices_local
view16 columnsPrices converted to each country's local currency using the ECB rate effective on the delivery date.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
price_eur_mwh | numeric | yes | |
local_currency | text | yes | Country's local currency (from core.countries). |
price_local_mwh | numeric | yes | price_eur_mwh converted to local currency. |
fx_rate | numeric | yes | EUR→local rate applied. |
fx_rate_date | date | yes | Date of the FX rate used. |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
- delivery_ts_local
- 2026-06-12 00:00:00
- delivery_ts_utc
- 2026-06-11 22:00:00
- timezone
- Europe/Rome
- country_code
- IT
- country_name
- Italy
- market_zone
- 10Y1001C--00096J
- zone_name
- Italy Calabria
- price_eur_mwh
- 144.590000
- local_currency
- EUR
- price_local_mwh
- 144.590000
- fx_rate
- NULL
- fx_rate_date
- NULL
- source_name
- entsoe
- granularity_minutes
- 15
- version_date
- NULL
- ingested_at
- 2026-06-16 13:50:27
mart.v_generation
view13 columnscore.generation enriched with country & zone names. MW, native granularity.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
production_type | text | yes | Human-readable generation technology (e.g. Solar, Wind Onshore). |
psr_type | text | yes | ENTSO-E PSR code for the technology (e.g. B16 = Solar, B19 = Wind Onshore). |
generation_mw | numeric | yes | |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
- delivery_ts_local
- 2026-06-12 00:00:00
- delivery_ts_utc
- 2026-06-11 22:00:00
- timezone
- Europe/Rome
- country_code
- IT
- country_name
- Italy
- market_zone
- 10Y1001C--00096J
- zone_name
- Italy Calabria
- production_type
- Solar
- psr_type
- B16
- generation_mw
- 0.000
- source_name
- entsoe
- granularity_minutes
- 15
- ingested_at
- 2026-06-16 13:50:28
mart.v_generation_15min
view13 columnsGeneration resampled to a uniform 15-minute grid.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
production_type | text | yes | Human-readable generation technology (e.g. Solar, Wind Onshore). |
psr_type | text | yes | ENTSO-E PSR code for the technology (e.g. B16 = Solar, B19 = Wind Onshore). |
generation_mw | numeric | yes | |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
- delivery_ts_local
- 2026-06-12 00:00:00
- delivery_ts_utc
- 2026-06-11 22:00:00
- timezone
- Europe/Rome
- country_code
- IT
- country_name
- Italy
- market_zone
- 10Y1001C--00096J
- zone_name
- Italy Calabria
- production_type
- Solar
- psr_type
- B16
- generation_mw
- 0.000
- source_name
- entsoe
- granularity_minutes
- 15
- ingested_at
- 2026-06-16 13:50:28
mart.v_forecast_all
view16 columnsEvery forecast vintage (all version_dates), with names joined in. Use it to compare how a forecast changed across publications.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
scenario | text | yes | Forecast scenario name (e.g. Central). |
market_type | text | yes | Market segment the price refers to (e.g. Day-ahead, Intraday). |
forecast_value | numeric | yes | |
unit | text | yes | Unit of the value. |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
is_latest | boolean | yes | True for the most recent version_date of each series (set by the loader). |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
No rows yet.
mart.v_forecast_latest
view15 columnsOnly the latest vintage (is_latest) of each forecast series — the current forecast.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
scenario | text | yes | Forecast scenario name (e.g. Central). |
market_type | text | yes | Market segment the price refers to (e.g. Day-ahead, Intraday). |
forecast_value | numeric | yes | |
unit | text | yes | Unit of the value. |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
No rows yet.
mart.v_forecast_latest_15min
view15 columnsLatest forecast vintage resampled to a uniform 15-minute grid.
| Column | Type | Null? | Description |
|---|---|---|---|
delivery_ts_local | timestamp without time zone | yes | Same instant as delivery_ts_utc, in the zone's local wall-clock time. |
delivery_ts_utc | timestamp with time zone | yes | Start of the delivery interval, in UTC. |
timezone | text | yes | IANA timezone the local timestamp is expressed in (e.g. Europe/Rome). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
country_name | text | yes | Human-readable country name (joined from core.countries). |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
zone_name | text | yes | Human-readable zone name (joined from core.market_zones). |
scenario | text | yes | Forecast scenario name (e.g. Central). |
market_type | text | yes | Market segment the price refers to (e.g. Day-ahead, Intraday). |
forecast_value | numeric | yes | |
unit | text | yes | Unit of the value. |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
No rows yet.
mart.v_forecast_versions
view11 columnsCatalog of available forecast vintages: one row per series + version_date, with counts and delivery coverage. Discover what vintages exist before querying the detail views.
| Column | Type | Null? | Description |
|---|---|---|---|
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
country_code | text | yes | ISO-3166 alpha-2 country code → core.countries.country_code. |
market_zone | text | yes | ENTSO-E bidding-zone EIC code → core.market_zones.zone_code (NULL = country-wide). |
scenario | text | yes | Forecast scenario name (e.g. Central). |
market_type | text | yes | Market segment the price refers to (e.g. Day-ahead, Intraday). |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
granularity_minutes | integer | yes | Native resolution in minutes (60 = hourly, 15 = quarter-hourly). |
rows_count | bigint | yes | Number of forecast points in the vintage. |
min_delivery_ts_local | timestamp without time zone | yes | Earliest delivery covered. |
max_delivery_ts_local | timestamp without time zone | yes | Latest delivery covered. |
last_ingested_at | timestamp with time zone | yes | When the vintage was last loaded. |
No rows yet.
mart.v_assumptions_latest
view10 columnsLatest vintage (is_latest) of each assumption series from core.assumptions.
| Column | Type | Null? | Description |
|---|---|---|---|
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
geography | text | yes | |
scenario | text | yes | Forecast scenario name (e.g. Central). |
category | text | yes | |
variable | text | yes | |
unit | text | yes | Unit of the value. |
year | integer | yes | |
value | numeric | yes | |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
No rows yet.
mart.v_fx_rates
view6 columnsECB FX reference rates (passthrough of core.fx_rates) for joining / conversion.
| Column | Type | Null? | Description |
|---|---|---|---|
base | text | yes | |
quote | text | yes | |
rate_date | date | yes | |
rate | numeric | yes | |
source | text | yes | |
ingested_at | timestamp with time zone | yes | When the row was written into the database. |
- base
- EUR
- quote
- RON
- rate_date
- 2010-02-14
- rate
- 1.00000000
- source
- ecb
- ingested_at
- 2026-06-16 13:50:29
mart.v_file_uploads
view13 columnscore.file_uploads without the binary content column — safe to list upload history & status.
| Column | Type | Null? | Description |
|---|---|---|---|
id | bigint | yes | Surrogate primary key (auto-increment). |
filename | text | yes | |
byte_size | integer | yes | |
source_name | text | yes | Originating data source → core.sources.source_name (entsoe / aurora / ecb). |
kind | text | yes | |
version_date | date | yes | Publication vintage of the data; lets multiple revisions coexist. |
status | text | yes | |
uploaded_by | text | yes | |
uploaded_at | timestamp with time zone | yes | |
processed_at | timestamp with time zone | yes | |
run_id | bigint | yes | |
rows_loaded | integer | yes | |
error_message | text | yes |
No rows yet.