Skip to main content

Python client for the ISOview energy forecasting API

Project description

isoview-client

Python client for the ISOview energy forecasting API — demand, wind, solar, LMP, and natural gas forecasts across US ISOs, returned as dicts or pandas DataFrames.

Installation

pip install isoview-client

Requires Python 3.10+. Installs requests and pandas as dependencies.

Authentication

Sign up at isoview.io and grab your API key from the Portal.

from isoview import Client

client = Client("your-api-key")

How It Works

The client dynamically builds methods from the API's OpenAPI spec at init time. This means it automatically stays in sync with the API — no client updates needed when new endpoints are added. The spec is cached locally for 1 hour.

# See all available methods
dir(client)

# Get help on any method
help(client.get_regional_forecast)

Quick Start

from isoview import Client

client = Client("your-api-key")

# Get the latest PJM demand forecast as a dict
data = client.get_regional_forecast("pjm", "demand")

# Or get it directly as a pandas DataFrame
df = client.get_regional_forecast("pjm", "demand", as_df=True)
print(df.head())

Timeseries endpoints accept an as_df=True keyword argument to return a pandas DataFrame with a UTC DatetimeIndex and MultiIndex columns like ("pjm_total", "forecast"). Without it, you get the raw API response as a dict.

Examples

Regions

Forecasts for geographic regions within an ISO — demand, wind, solar, outages, and population-weighted temperature.

# See what regions are available
regions = client.list_regions("pjm", "demand")
# Returns a list of dicts: [{"id": "pjm_total", "name": "PJM Total", ...}, ...]

# Latest forecast as a DataFrame
df = client.get_regional_forecast("pjm", "demand", id="pjm_total", as_df=True)

# Stitched historical forecast — what did the day-ahead forecast
# look like at 10am each day?
df = client.get_region_continuous_forecast(
    "miso", "wind",
    start="2025-01-01T00:00:00Z",
    end="2025-06-01T00:00:00Z",
    latest_hour=10,
    days_ahead=1,
    as_df=True,
)

# Probabilistic ensemble forecast (multiple scenarios)
data = client.get_ensemble_forecast("pjm", "demand", id="pjm_total")

# Day-ahead backcast for model evaluation
data = client.get_region_day_ahead_backcast("pjm", "demand")

# Everything at once — demand, wind, solar, outages, temp, LMP
data = client.get_iso_summary("pjm")

Plants

Generation forecasts for individual wind and solar facilities.

# Browse plants in ERCOT
plants = client.list_plants("ercot", "wind")
print(plants[0]["name"], plants[0]["capacity_mw"], "MW")

# Get a forecast as a DataFrame
df = client.get_plant_forecast("ercot", "wind", id=str(plants[0]["id"]), as_df=True)

Counties

County-level electricity demand forecasts, disaggregated from regional data.

counties = client.list_counties("isone")
df = client.get_county_forecast("isone", id=counties[0]["id"], as_df=True)

Gas

Natural gas price forecasts for major trading hubs.

hubs = client.list_gas_hubs()
df = client.get_gas_price_forecast(id=hubs[0]["id"], as_df=True)

LMP

Locational Marginal Price forecasts for electricity market nodes.

nodes = client.list_lmp_nodes("pjm", "dalmp")
df = client.get_lmp_forecast("pjm", "dalmp", id=nodes[0]["id"], as_df=True)

Working with Responses

Timeseries (as dict)

All forecast, continuous, ensemble, backcast, and summary endpoints return a dict by default:

data = client.get_regional_forecast("pjm", "demand")

data["model"]       # 'optimized'
data["created_at"]  # datetime — when the forecast was generated
data["units"]       # 'MW'
data["timezone"]    # 'America/New_York'
data["time_utc"]    # list of datetime objects
data["columns"]     # [["pjm_total", "forecast"], ...]
data["values"]      # [[1234.5, ...], ...]

Timeseries (as DataFrame)

Pass as_df=True to any timeseries endpoint:

df = client.get_regional_forecast("pjm", "demand", as_df=True)

The DataFrame has a DatetimeIndex and MultiIndex columns (e.g. ("pjm_total", "forecast")).

Metadata

List endpoints return plain dicts:

regions = client.list_regions("pjm", "demand")
for r in regions:
    print(r["id"], r["name"], r["timezone"])

plants = client.list_plants("ercot", "solar")
for p in plants:
    print(p["name"], f"{p['capacity_mw']} MW", p["state"])

Automatic Chunking

Requests spanning more than 365 days are automatically split into yearly chunks and merged:

df = client.get_region_day_ahead_backcast(
    "pjm", "demand",
    start="2023-01-01T00:00:00Z",
    end="2025-06-01T00:00:00Z",
    as_df=True,
)

Error Handling

The client raises requests.HTTPError on API errors (401, 403, 422, etc.):

import requests

try:
    data = client.get_regional_forecast("pjm", "demand")
except requests.HTTPError as e:
    print(e.response.status_code, e.response.text)

Links

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

isoview_client-1.0.2.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

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

isoview_client-1.0.2-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file isoview_client-1.0.2.tar.gz.

File metadata

  • Download URL: isoview_client-1.0.2.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for isoview_client-1.0.2.tar.gz
Algorithm Hash digest
SHA256 43eee5f700bff44392d9280d9730584c4215abc626eb1852d05d0a7c3c13005a
MD5 ac50537584789fd650f0c3dd51fb3e11
BLAKE2b-256 13c4bb585fec0fbfd77e753df423c1ee84b72dfdbab381c1dbd7c11dbc7bea39

See more details on using hashes here.

Provenance

The following attestation bundles were made for isoview_client-1.0.2.tar.gz:

Publisher: publish.yml on isoview-io/isoview-client

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

File details

Details for the file isoview_client-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: isoview_client-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 8.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for isoview_client-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 974c9880945482b0f436538c29a2a05bb5f66aeb8097e9bac7e837c99a0215e5
MD5 660bdeaeba4332d4c18e1bc80817e562
BLAKE2b-256 8fb755656b555165063b20d2158bd8c55d4f05a9c2118f099b85afb7901788c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for isoview_client-1.0.2-py3-none-any.whl:

Publisher: publish.yml on isoview-io/isoview-client

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