Process results with Python¶
This tutorial demonstrates how to use the stride Data API to query and analyze energy projection data programmatically.
Prerequisites¶
A stride project created using
stride projects createPython environment with stride installed
Load a project¶
First, load your project and create an API client:
from stride.project import Project
from stride.api import APIClient
# Load an existing project
project = Project.load("my_project_path")
# Create an API client
client = APIClient(project)
Explore available data¶
The API client provides methods to discover what data are available:
# Get available scenarios
scenarios = client.scenarios
print(f"Scenarios: {scenarios}")
# Get available model years
years = client.get_years()
print(f"Model years: {years}")
# Get unique sectors and end uses
sectors = client.get_unique_sectors()
end_uses = client.get_unique_end_uses()
print(f"Sectors: {sectors}")
print(f"End uses: {end_uses}")
Query annual consumption¶
Get total annual electricity consumption across scenarios:
# Get total consumption for all scenarios and years
df = client.get_annual_electricity_consumption()
print(df)
# Filter to specific scenarios and years
df = client.get_annual_electricity_consumption(
scenarios=["baseline", "ev_projection"],
years=[2030, 2040, 2050]
)
# Break down by sector
df = client.get_annual_electricity_consumption(
scenarios=["baseline"],
group_by="Sector"
)
print(df)
Example output:
scenario year sector value
0 baseline 2025 Commercial 1.234567e+09
1 baseline 2025 Industrial 2.345678e+09
2 baseline 2025 Residential 1.876543e+09
3 baseline 2030 Commercial 1.345678e+09
...
Query peak demand¶
Get annual peak demand values:
# Get peak demand for all scenarios
df = client.get_annual_peak_demand()
print(df)
# Peak demand broken down by sector at the peak hour
df = client.get_annual_peak_demand(
scenarios=["baseline"],
years=[2030],
group_by="Sector"
)
Load duration curves¶
Generate load duration curves for capacity planning:
# Load duration curve for a single year, comparing scenarios
df = client.get_load_duration_curve(
years=2030,
scenarios=["baseline", "ev_projection"]
)
print(df.head())
# Load duration curve comparing multiple years for one scenario
df = client.get_load_duration_curve(
years=[2030, 2040, 2050],
scenarios=["baseline"]
)
The result has hours sorted from highest to lowest demand:
baseline ev_projection
0 12500000.0 13200000.0
1 12450000.0 13150000.0
2 12400000.0 13100000.0
...
8759 3200000.0 3400000.0
Time series comparison¶
Compare time series across model years:
# Daily mean consumption for multiple years
df = client.get_time_series_comparison(
scenario="baseline",
years=[2030, 2050],
resample="Daily Mean"
)
print(df.head())
# Weekly mean with sector breakdown
df = client.get_time_series_comparison(
scenario="baseline",
years=[2030],
group_by="Sector",
resample="Weekly Mean"
)
Seasonal load patterns¶
Analyze load patterns by season and day type:
# Average daily load profile by season
df = client.get_seasonal_load_lines(
scenario="baseline",
years=[2030],
group_by="Seasonal",
agg="Average Day"
)
print(df.head())
# Seasonal patterns split by weekday/weekend
df = client.get_seasonal_load_lines(
scenario="baseline",
years=[2030],
group_by="Seasonal and Weekday/Weekend",
agg="Average Day"
)
Secondary metrics¶
Query economic and demographic data:
# Get GDP data
gdp = client.get_secondary_metric(
scenario="baseline",
metric="GDP",
years=[2030, 2040, 2050]
)
print(gdp)
# Get population data
population = client.get_secondary_metric(
scenario="baseline",
metric="Population"
)
# GDP per capita (calculated automatically)
gdp_per_capita = client.get_secondary_metric(
scenario="baseline",
metric="GDP Per Capita"
)
Weather data¶
Query weather metrics for analysis:
# Get daily mean temperature (BAIT)
weather = client.get_weather_metric(
scenario="baseline",
year=2030,
wvar="BAIT",
resample="Daily Mean"
)
print(weather.head())
# Heating degree days (cooling degree days are similar)
hdd = client.get_weather_metric(
scenario="baseline",
year=2030,
wvar="HDD",
resample="Daily Mean"
)
Create visualizations¶
Use the queried data with plotly for interactive visualizations:
import plotly.express as px
# Plot annual consumption by scenario
df = client.get_annual_electricity_consumption()
fig = px.bar(
df,
x="year",
y="value",
color="scenario",
barmode="group",
title="Annual Electricity Consumption by Scenario",
labels={"value": "Consumption (MWh)", "year": "Year", "scenario": "Scenario"}
)
fig.write_html("consumption_by_scenario.html")
fig.show()
import plotly.graph_objects as go
# Plot load duration curves
ldc = client.get_load_duration_curve(years=2030, scenarios=["baseline", "ev_projection"])
fig = go.Figure()
for col in ldc.columns:
fig.add_trace(go.Scatter(
x=list(range(len(ldc))),
y=ldc[col],
mode="lines",
name=col
))
fig.update_layout(
title="Load Duration Curve - 2030",
xaxis_title="Hours",
yaxis_title="Demand (MW)",
legend_title="Scenario"
)
fig.write_html("load_duration_curve.html")
fig.show()
# Plot seasonal load profiles
seasonal = client.get_seasonal_load_lines(
scenario="baseline",
years=[2030],
group_by="Seasonal"
)
fig = px.line(
seasonal,
x="hour_of_day",
y="value",
color="season",
title="Average Daily Load Profile by Season - 2030",
labels={"hour_of_day": "Hour of Day", "value": "Load (MW)", "season": "Season"}
)
fig.write_html("seasonal_profiles.html")
fig.show()
# Plot consumption breakdown by sector as stacked area
df = client.get_annual_electricity_consumption(
scenarios=["baseline"],
group_by="Sector"
)
fig = px.area(
df,
x="year",
y="value",
color="sector",
title="Annual Consumption by Sector - Baseline",
labels={"value": "Consumption (MWh)", "year": "Year", "sector": "Sector"}
)
fig.write_html("consumption_by_sector.html")
fig.show()
Export to CSV or Excel¶
Save results for use in other tools:
# Export consumption data to CSV
df = client.get_annual_electricity_consumption(group_by="Sector")
df.to_csv("consumption_by_sector.csv", index=False)
# Export to Excel with multiple sheets
with pd.ExcelWriter("stride_results.xlsx") as writer:
consumption = client.get_annual_electricity_consumption()
consumption.to_excel(writer, sheet_name="Consumption", index=False)
peak = client.get_annual_peak_demand()
peak.to_excel(writer, sheet_name="Peak Demand", index=False)
ldc = client.get_load_duration_curve(years=2030)
ldc.to_excel(writer, sheet_name="Load Duration", index=False)
Complete example¶
Here’s a script that prints a summary report to console:
from stride.project import Project
from stride.api import APIClient
# Use context manager to automatically close the project
with Project.load("my_project_path") as project:
client = APIClient(project)
# Print project info
print(f"Project: {project.config.project_id}")
print(f"Country: {project.config.country}")
print(f"Scenarios: {client.scenarios}")
print(f"Years: {client.get_years()}")
print()
# Summary statistics
for scenario in client.scenarios:
print(f"=== {scenario} ===")
consumption = client.get_annual_electricity_consumption(scenarios=[scenario])
peak = client.get_annual_peak_demand(scenarios=[scenario])
for year in client.get_years():
cons_val = consumption[consumption["year"] == year]["value"].values[0]
peak_val = peak[peak["year"] == year]["value"].values[0]
print(f" {year}: {cons_val/1e9:.2f} TWh, Peak: {peak_val/1e6:.2f} GW")
print()
Learn More¶
Data API - Complete API documentation