diff --git a/.gitattributes b/.gitattributes
index 0118b206..62ec5f6a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,6 +5,11 @@ tools/inputs/operations.json linguist-generated=true
tools/inputs/esr-operations.json linguist-generated=true
tools/inputs/products.json linguist-generated=true
tools/inputs/*-sample.json linguist-generated=true
+# Keep captured HTML byte-for-byte, including ERCOT's trailing whitespace.
+tools/inputs/*-index.html linguist-generated=true -whitespace
tools/inputs/samples/** linguist-generated=true
tools/inputs/dashboards/** linguist-generated=true
# Hand-maintained mappings, overrides and evidence remain visible.
+tools/inputs/generation-profiles/csv-header-samples.json linguist-generated=true
+tinyercot/_generated_esr.py linguist-generated=true
+tools/inputs/esr/operations.json linguist-generated=true
diff --git a/CLAUDE.md b/CLAUDE.md
index 65689f7f..b47299d7 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -3,7 +3,12 @@
Keep the SDK small and fully typed. Product methods and row models are generated;
handwritten code handles shared transport, typed metadata, and public dashboards.
+Focus the release on actionable market and operational time series for retailers,
+battery operators, and energy traders. Planning studies, profile-key workbooks,
+and document-specific summary extraction are outside the release scope.
+
- `tinyercot/_client.py`: authentication, sync/async retrieval, pagination, metadata, ZIP downloads.
+- `tinyercot/_history.py`: shared typed CSV and nested ZIP readers. Verified mappings live in `tools/inputs/history-formats.json`.
- `tinyercot/_generated.py`: generated typed product namespaces; never edit manually.
- `tinyercot/_dashboards.py`: typed public dashboard payloads and retrieval.
- `tools/generate_client.py`: offline generation from `tools/inputs/operations.json`
diff --git a/MANIFEST.in b/MANIFEST.in
index 72879b4a..41982bd0 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,3 +1,5 @@
include api_response_fields.json
-recursive-include tools *.py *.json
+recursive-include tools *.py *.md *.json *.csv *.xlsx *.pdf *.zip *.html
recursive-include tests *.py
+recursive-include examples *.py *.md
+recursive-include docs *.md
diff --git a/README.md b/README.md
index 0432b62f..0008b3e0 100644
--- a/README.md
+++ b/README.md
@@ -1,79 +1,109 @@
# tinyercot
-A small, fully typed client for ERCOT public data.
+A small, fully typed ERCOT data client for retailers, battery operators, and
+energy traders. Query recent data, stream historical archives and monthly
+bundles, or read public load and generation files. Coverage focuses on data for market
+decisions, settlement and resource planning.
-**Development status:** all 242 Public Reports endpoints have typed methods and captured-response tests. The separate ESR API is awaiting an enabled subscription key. MIS is not included.
+## Install and connect
+
+This development branch contains the API described below. Install from its checkout:
+
+```sh
+pip install .
+```
+
+Set `ERCOT_USERNAME`, `ERCOT_PASSWORD`, and `ERCOT_SUBSCRIPTION_KEY`, or pass
+`username`, `password`, and `subscription_key` to `Client`. Credentials are read
+lazily; anonymous public downloads do not need them.
```python
from datetime import date
from tinyercot import Client
with Client() as ercot:
- prices = ercot.np4_190_cd.dam_stlmnt_pnt_prices_iter(
- deliveryDateFrom=date(2026, 1, 1),
- deliveryDateTo=date(2026, 1, 2),
+ for price in ercot.np4_190_cd.dam_stlmnt_pnt_prices_iter(
+ deliveryDateFrom=date(2026, 9, 1),
+ deliveryDateTo=date(2026, 9, 1),
settlementPoint="HB_HOUSTON",
- )
- for price in prices:
+ ):
print(price.deliveryDate, price.settlementPointPrice)
```
-Pass `username`, `password`, and `subscription_key` to `Client`, or set
-`ERCOT_USERNAME`, `ERCOT_PASSWORD`, and `ERCOT_SUBSCRIPTION_KEY`.
-Authentication is lazy; the client refreshes tokens and retries transient failures.
+Methods have named, typed filters and Pydantic row models. A method returns one
+`Page[Row]`; `_iter` streams every page. `_async` and `_iter_async` provide async
+access. Dates, decimals, missing values, and DST flags retain their source meaning.
-Each product exposes generated methods with named, typed filters and Pydantic row
-models. A method returns one `Page[Row]`; its `_iter` variant streams all pages.
-`_async` and `_iter_async` provide asynchronous access. Date and decimal values
-retain their Python types. Nullable source cells are represented by `None`.
+## Get the available history
-```python
-from pathlib import Path
-from tinyercot import Client
+Use the same method name with `_history`. `backfill()` combines monthly bundles
+with individual archives, including older and bundle-only reports:
+```python
with Client() as ercot:
- products = ercot.products()
- history = ercot.archives("np4-190-cd")
- document = history.archives[0]
- Path("prices.zip").write_bytes(
- ercot.download("np4-190-cd", [document.docId])
- )
-
- bundles = ercot.bundles("np4-190-cd")
- Path("monthly.zip").write_bytes(
- ercot.download("np4-190-cd", [bundles.bundles[0].docId], kind="bundle")
- )
+ history = ercot.np4_190_cd.dam_stlmnt_pnt_prices_history
+ for price in history.backfill(
+ where=lambda row: row.settlementPoint == "HB_HOUSTON",
+ batch_size=25,
+ ):
+ print(price.deliveryDate, price.hourEnding, price.settlementPointPrice)
```
-Archive and bundle listings expose typed metadata. Downloads return the original
-ZIP bytes. Listing metadata includes the server's total and page counts; `iter_documents()` streams all listing pages.
+This requests all retained publications and can take considerable time. The
+predicate filters typed rows after download. Original document IDs prevent
+fetching the same publication twice; distinct corrections and repeated source
+rows remain intact. Output is streamed without sorting.
+
+`posted_from` and `posted_to` select **publication times**, which can differ from
+operating dates. Omit them for the widest history, including bundle-only reports.
+Use `publications()` to retain each archive's original posting metadata for
+forecast backtests. A bundle's timestamp does not establish when its forecasts
+were available. `read(zip_bytes)` decodes saved downloads with the same types.
+
+Runnable exports from this repository:
+
+```sh
+uv run python -m examples.market_day 2026-09-01 --point HB_HOUSTON --output market-data
+uv run python -m examples.price_history dam --point HB_HOUSTON --output dam-history.jsonl
+uv run python -m examples.price_history rt --point HB_HOUSTON --output rt-history.jsonl
+```
+
+See the [market-data guide](docs/market-data.md) to choose price, load, forecast,
+ancillary-service, outage, and disclosure readers, and the
+[examples](examples/README.md) for export details and forecast vintages.
+
+## Coverage
+
+The September 7, 2026 inventory check matched **242 Public Reports queries** and
+**249 HTTP operations** including shared metadata/download operations. Generated
+history readers cover **289 tables across 113 products**. This establishes API
+and known-format coverage, not uninterrupted history for every dataset.
+
+Full-source comparisons cover retained DAM settlement prices, DAM ancillary
+prices, and weather-zone actual load. Other products have sampled historical
+layout checks; see the [coverage evidence](docs/data-coverage.md). Available
+history and source gaps differ by product. The separate ESR service adds one
+generated query and its history reader through `ESRClient`, using
+`ERCOT_ESR_SUBSCRIPTION_KEY` with the same username/password. See the
+[ESR workflow](docs/usage.md#energy-storage-four-second-data) for verified retention
+and source freshness. MIS remains outside the current scope.
+
+Direct public services include `hourly_load`, `fuel_mix`, `load_profiles`,
+`loss_factors`, `load_forecast_performance`, and `dashboards`. Install `tinyercot[files]` for XLS/XLSX/XLSB readers
+or `tinyercot[pdf]` for supported PDF tables. Detailed source-specific examples
+remain in the [usage reference](docs/usage.md).
## Development
-Runtime dependencies are `httpx`, `httpx-retries`, and `pydantic`. The handwritten
-core handles authentication, transport, pagination, and metadata. Product methods
-and row models are generated from saved ERCOT operation and field definitions.
+Product methods and row models are generated from saved ERCOT definitions. The
+runtime depends on `httpx`, `httpx-retries`, and `pydantic`; optional file parsers
+are loaded when used. Source fixtures support tests and generation and are
+excluded from the installed wheel.
```sh
uv sync --group dev
uv run python tools/generate_client.py
-uv run mypy tinyercot tests/typing_client.py --strict --follow-untyped-imports
+uv run mypy tinyercot tests/typing_client.py examples --strict --follow-untyped-imports
uv run pytest
uv build
```
-
-Generation fails if an endpoint has no field schema. During discovery only,
-`--allow-incomplete` emits available endpoints and reports the missing count.
-Public dashboards are available through `ercot.dashboards`: fuel mix, grid
-conditions, energy storage, generation outages, DC-tie flows, system prices,
-supply/demand, combined wind/solar, system demand, ancillary services, weather,
-and the current locational price map.
-
-Source-specific corrections live in `tools/inputs/type-overrides.json`,
-`row-fields.json`, and `query-defaults.json`. ERCOT declares hour-ending labels
-and offer identifiers as numeric on two reports. The ESR-west report includes
-two metadata-only columns absent from its rows and has an invalid default sort;
-its generated method uses `SCEDTimestamp` by default. Captured responses support
-these small corrections. Large forecasts may need a date filter or a longer
-client timeout. Specify `sort` when supplying `dir`. Tests use saved public responses and mocked
-HTTP; credentials are not part of the test suite.
diff --git a/docs/data-coverage.md b/docs/data-coverage.md
new file mode 100644
index 00000000..9d1a96cc
--- /dev/null
+++ b/docs/data-coverage.md
@@ -0,0 +1,1615 @@
+# Historical formats and source coverage
+
+These notes describe verified source layouts and limitations, rather than a claim
+of uninterrupted history. Paths under `tools/inputs/` are relative to the repository
+root. See the [quick start](../README.md) and [runnable examples](../examples/README.md).
+
+Source-specific corrections live in `tools/inputs/type-overrides.json`,
+`row-fields.json`, and `query-defaults.json`. ERCOT declares hour-ending labels
+and offer identifiers as numeric on two reports. The ESR-west report includes
+two metadata-only columns absent from its rows and has an invalid default sort;
+its generated method uses `SCEDTimestamp` by default. Captured responses support
+these small corrections. Large forecasts may need a date filter or a longer
+client timeout. Specify `sort` when supplying `dir`. Tests use saved public responses and mocked
+HTTP; credentials are not part of the test suite. A separate live check used fresh
+clients with the default transports to authenticate, query typed prices, read
+May 2014 archives, recover a January 2018 bundle through its published GET link,
+and make an async query. See `tools/inputs/history/sdk-workflow-evidence.json`
+for the bounded queries and public response metadata.
+
+Disclosure readers select their own CSV member from the shared ZIP. For example,
+`ercot.np3_966_er._60_dam_load_res_data_history` returns generated historical rows
+that preserve the old `RRSAwarded` field separately from newer `RRSPFRAwarded`,
+`RRSFFRAwarded`, and `RRSUFRAwarded` fields. Fields absent in a captured schema
+are `None`. The current API row contracts remain unchanged. Reading a ZIP that
+predates a table raises a missing-member error when using `read()` or `download()`.
+For full-range retrieval, `backfill()` skips absent named tables in shared CSV
+reports, including bundle members and remaining individual archive downloads.
+This also handles tables that disappear from later reports without inventing an
+introduction or retirement date. A missing generic CSV report, empty ZIP, corrupt
+ZIP or invalid selected table still raises.
+A live SCED disclosure check returned zero ESR rows for May 1, 2014 and all
+96,480 ESR rows for September 6, 2026, matching the saved original. The selected
+table is absent from the older file. See `tools/inputs/history/sparse-table-evidence.json`.
+
+Archive-only CSV products also have generated namespaces: resource ownership
+(`ercot.np3_988_er.resources_history`), public load estimation counts
+(`ercot.copg_316.load_estimation_counts_history`), and confidentiality-expired
+adjusted meter load (`ercot.np1_300.adjusted_meter_load_history`). These expose the same typed
+`read`, `download`, and `rows` methods without inventing row-query API endpoints.
+DUNS identifiers remain strings, counts are integers, and percentages are decimals.
+
+`ercot.eia_930_er.daily_operations_history` reads both captured EIA daily layouts.
+Its `HR1` through `HR25` cells are `Decimal | datetime | None`: demand, generation,
+and flow values stay numeric, while UTC rows carry timezone-aware timestamps.
+A published `24:00:00Z` becomes midnight on the following date. The older
+`postedDate` and `interconnectedBalancingAuthorityCode` fields are preserved
+separately from the newer `dataDate` and `dataCode` fields. This reader preserves
+wide source rows; it does not join timing rows to measurement rows.
+
+Additional historical readers cover DAM energy bought/sold, PTP obligation
+results, system lambda, real-time bus and settlement-point LMPs, ancillary-service
+plans, and wind actuals/forecasts. Legacy bus `LMP` is separate from newer capped
+and uncapped prices. The wind history model preserves the old combined west/north
+region and full `hourEndingTimestamp` separately from newer region fields and
+integer `hourEnding`. API posting timestamps absent from a CSV remain `None`.
+
+Known optional columns can appear in intermediate combinations. Required model
+fields still apply, and unknown columns, duplicate aliases, or ambiguous reused
+headers raise an error. This supports compatible schema evolution without
+silently discarding source columns or assuming changed fields mean the same thing.
+
+Install `tinyercot[files]` for typed XLS/XLSX archives. This adds workbook support
+without changing the dependencies needed for API and CSV access:
+
+```python
+with Client() as ercot:
+ for row in ercot.np1_346_er.outages_history.rows(
+ posted_from=datetime(2026, 8, 1),
+ posted_to=datetime(2026, 8, 2),
+ ):
+ print(row.resourceName, row.actualOutageStart, row.plannedEndDate)
+```
+
+Workbook readers also cover monthly load-resource demand response
+(`ercot.np3_108.demand_response_history`) and ancillary-service deployment factors
+(`ercot.np5_520_er.deployment_factors_history`). `sourceSheet` preserves the source
+worksheet, including separate CLR and NCLR demand response tables; older reports
+have a single `Report Data` sheet. Month fields are dates on the first of the month.
+Older outage reports expose `returnToServiceDate`; newer reports expose separate
+`plannedEndDate` and `actualEndDate` fields. Missing fields remain `None`.
+These readers have been checked against the oldest available and recent sampled
+workbooks, not every intervening publication.
+
+
+Historical readers also cover five-minute wind and solar generation, hourly solar
+forecasts, geographical wind/solar generation and forecasts, and system-wide
+demand. Use the API method name with `_history`, for example
+`ercot.np4_742_cd.wpp_hrly_actual_fcast_geo_history.rows(...)`.
+The older five-minute wind layout preserves its combined region as `LZWestNorth`;
+individual west/north values remain `None`. Older solar forecasts preserve a full
+`hourEndingTimestamp` instead of inventing a delivery date and integer hour.
+Archived five-minute timestamps retain their seconds where supplied.
+
+In the September 2026 archive probes, oldest downloadable samples reached April
+2014 for five-minute wind and February 2016 for solar. Regional reports started
+later, and the system-wide demand listing reached only March 2026. These are
+observed archive bounds, not guarantees of complete intervening data or permanent
+retention; inspect each product's listings when selecting a backfill.
+
+System-lambda and price-adder history preserves the older ORDC fields separately
+from current reliability-deployment adders. For example,
+`ercot.np6_323_cd.rt_price_adder_sced_history` exposes legacy `RTORPA` and `RTOFFPA`
+alongside `RTRDPA`; absent source columns are `None`. The older SCED lambda report
+has `systemLambda`, while newer files have `cappedSystemLambda` and
+`uncappedSystemLambda`. Reading an older file does not invent capped values.
+The same `_history` workflow covers RTD indicative adders, state-estimator total
+generation and DC-tie flows, HDL/LDL summaries, and SCED shadow prices. Publication
+bounds select archive files; typed predicates can select timestamps, ties, or
+constraints inside them. In the sampled listings, price-adders reached 2014,
+state-estimator reports reached 2019, and HDL/LDL summaries reached April 2026.
+
+
+Load-forecast history includes forecast/actual comparisons, seven-day forecasts
+by forecast and weather zone, intra-hour weather-zone forecasts, and forecasts by
+model/weather zone or study area. Use each generated method's `_history` property.
+Hour-ending labels such as `24:00` remain strings where the report uses them;
+model identifiers and in-use flags remain available for filtering.
+
+To retain which publication each forecast came from, keep the listing metadata
+alongside the rows:
+
+```python
+with Client() as ercot:
+ history = ercot.np3_561_cd._7d_load_fcast_by_wzn_history
+ for document in ercot.iter_documents(
+ "np3-561-cd",
+ posted_from=datetime(2026, 8, 1),
+ posted_to=datetime(2026, 8, 2),
+ ):
+ for forecast in history.download([document.docId]):
+ print(document.postDatetime, forecast.deliveryDate, forecast.coast)
+```
+
+`document.postDatetime` is ERCOT's publication time, not a guarantee of an earlier
+model issue time. These CSVs omit `postedDatetime`, so that row field remains
+`None` when reading the file; a delivery date must not substitute for publication
+or issue time. Distinct publications can contain forecasts for the same delivery
+hour, and are retained without deduplication.
+
+Outage and adequacy history includes seven-day and longer planned-outage margins,
+hourly resource outage capacity, short-term system adequacy, hourly RUC status,
+and approved DC-tie schedules. For example,
+`ercot.np3_233_cd.hourly_res_outage_cap_history.rows(...)` reads old system totals
+as `totalResourceMW` and `totalIRRMW`; regional fields absent from those files
+remain `None`. Old RUC reports similarly preserve `sumSCEDTotal` separately from
+newer regional values. RUC and SCED timestamps retain their seconds, and DC-tie
+schedules retain both GMT and local interval-ending fields. System-adequacy
+hour-ending labels remain strings, including `24:00`.
+
+Ancillary-service offers and sales, peaker net margin, system-wide offer caps,
+RMR deployments, and day-ahead point-to-point option prices also expose typed
+`_history` readers. Legacy offers retain `RRS` separately from later RRS
+categories; legacy offer-cap files retain `SWCAP` separately from `DASWCAP` and
+`RTSWCAP`. Missing later columns remain `None`. The latest listed total-offers
+archive in the September 2026 probe was from December 2025; an archive listing
+must be checked before assuming a product has current historical publications.
+
+Renewable forecast archives include hourly forecasts by model (NP4-442/443) and
+intra-hour regional forecasts (NP4-751/752). Each row keeps its `region`, `model`,
+and `inUseFlag`; forecasts from alternative models are not merged. To select
+ERCOT's in-use forecast for one region:
+
+```python
+with Client() as ercot:
+ for forecast in ercot.np4_752_cd.ih_solar_fcast_geo_history.rows(
+ posted_from=datetime(2026, 8, 1),
+ posted_to=datetime(2026, 8, 2),
+ where=lambda row: row.region == "CENTEREAST" and row.inUseFlag is True,
+ ):
+ print(forecast.intervalEnding, forecast.model, forecast.value)
+```
+
+`SYSTEM_TOTAL` rows remain separate from regional rows; summing both would count
+both the total and its components. As with load forecasts, preserve document
+metadata when publication time matters because these CSVs omit `postedDatetime`.
+
+Weekly, daily and hourly RUC ancillary-service deployment factors (NP5-525/527/528)
+and projected deployment factors (NP5-526) have generated `_history` readers.
+For example, `ercot.np5_527_cd.druc_as_deploy_factors_history.rows(...)` retains the
+RUC execution timestamp separately from delivery date/hour, service type, and the
+decimal factor. The oldest files listed in the September 2026 probes were from
+December 2025; these products do not establish a common start date for other
+ancillary-service history.
+
+DAM/SCED and hourly, daily, and weekly RUC ancillary-service demand curves
+(NP4-212/213/214/215) expose typed `_history` readers. Each source point retains
+its `demandCurvePoint`, `quantity`, `price`, service type, and delivery hour;
+RUC curves also retain execution timestamps. For example,
+`ercot.np4_214_cd.druc_as_demand_curves_history.rows(...)` returns every point,
+including adjacent points with equal prices. Large curve publications are read
+one downloaded file at a time by default; increasing batch size increases memory
+use. Preserve document metadata when comparing separate publications.
+
+Real-time ancillary-service history includes total available capability
+(NP6-328), RTD indicative MCPCs (NP6-329), 15-minute clearing prices (NP6-331), and
+SCED clearing prices (NP6-332). Use each product's `_history` reader. Indicative
+prices retain the RTD execution time and forecast interval separately, with both
+repeated-hour flags. SCED history retains legacy `MCPC` separately from newer
+`cappedMCPC` and `uncappedMCPC`; missing source fields remain `None`. The products
+remain distinct so indicative prices are not confused with clearing prices.
+
+Daily and hourly RUC transmission constraints (NP5-754/755) and RTD indicative
+LMPs (NP6-970) also expose typed `_history` readers. Constraint rows retain IDs,
+station names, decimal voltage values, and execution timestamps. RTD price rows
+retain the run timestamp separately from the forecast interval and preserve old
+settlement-point type codes. For example,
+`ercot.np6_970_cd.rtd_lmp_node_zone_hub_history.rows(...)` reads indicative prices;
+it does not replace the SCED LMP or settlement-price products. The oldest sampled
+RTD archive in the September 2026 probe was from May 2014.
+
+Mapping-report history covers electrically similar settlement points (NP4-158),
+load distribution factors (NP4-159), de-energized settlement points (NP4-200), and
+heuristic-pricing electrical bus mappings (NP4-231). Each exposes its generated
+`_history` property. Load IDs and MRIDs remain strings, preserving leading zeros,
+braces, and case. Older `LoadDistributionFactor` headers map to the same typed
+`distributionFactor` field as newer files. Keep document publication metadata
+when comparing mapping versions; source row dates describe the report's data.
+
+DAM and RTM price-correction archives expose a history reader for each correction
+subtype. These archives mix document types, so generated readers select matching
+document names before downloading and the matching CSV member before decoding:
+
+```python
+with Client() as ercot:
+ for correction in ercot.np4_196_m.dam_price_corrections_eblmp_history.rows(
+ posted_from=datetime(2025, 12, 8),
+ posted_to=datetime(2025, 12, 10),
+ ):
+ print(correction.electricalBus, correction.LMPOriginal, correction.LMPCorrected)
+```
+
+All eleven DAM/RTM correction subtypes found in the catalog have generated
+readers, including SOG, shadow-price, settlement-point and ancillary-service
+corrections. Original and corrected values remain separate. Older
+LMP fields and legacy SOG `RTORDPA` fields are preserved rather than assigned to
+newer fields. Publication, delivery/SCED, and correction timestamps keep their
+source meanings; correction records are not automatically applied to other
+reports. `ercot.np4_412_cd.epp_cumulative_hours_history` also reads emergency-pricing
+cumulative-hour reports.
+
+SOG real-time prices (NP6-326), SOG LMPs with adders (NP6-327), and weather
+assumptions (NP4-722) have generated `_history` readers. SOG meter identifiers
+remain strings even when entirely numeric, and legacy `RTORPA`/`RTORDPA` columns
+remain separate from newer `RTRDPA`. Weather assumptions retain the published
+zone values and hour labels; they are a distinct product from actual load and
+load forecasts.
+
+`ercot.np4_19_cd.dam_agg_as_offer_curve_history` reads aggregated ancillary-service
+offer curves, including the sampled March 2014 layout. Service codes such as
+legacy `OFFNS` and newer `ECRSM` remain as published. Prices and quantities retain
+decimal precision and source order; sort explicitly if an application requires
+ascending prices. Offer curves remain distinct from ancillary-service demand
+curves.
+
+Highest-price SCED bids (NP3-257), SCED ancillary-service offers (NP3-914), DAM
+ancillary-service offers (NP3-915), and SCED energy offers (NP3-916) expose typed
+`_history` readers. For example,
+`ercot.np3_915_ex._3d_dam_high_as_offers_history.rows()` includes the sampled
+March 2014 DAM layout. Older SCED batch identifiers remain strings; QSE and DME
+values absent from historical files remain `None`. Published duplicate rows,
+proxy-extension and penalty flags, and full decimal prices are preserved.
+
+SCED ancillary-service offer disclosures (NP3-906) have nine typed history
+readers, one for each published service. DAM energy-curve disclosures (NP3-907)
+have fifteen: demand, supply and minimum supply, each for the system and four
+regions. For example, `ercot.np3_907_ex._2d_agg_edc_north_history` selects the
+North demand table from the shared ZIP; `ercot.np3_906_ex._2day_agg_sced_as_offers_regdn_history`
+selects SCED regulation-down offers. These preserve every published curve point,
+including negative prices and decimal MW quantities. The sampled archive
+boundaries for these products are December 2025; this does not establish their
+complete historical retention.
+
+Two-day DAM bid/offer disclosures (NP3-909) and real-time generation/load
+summaries (NP3-910) have 26 typed history readers, including their regional
+tables. Historical PTP bid IDs remain strings. Older non-wind generation fields
+remain separate from non-intermittent generation; absent storage or solar
+fields remain `None`. DSR load summaries are present in the sampled 2014 archive
+but absent from the sampled current ZIP. Explicit `read()` and `download()`
+raise a missing-table error; `backfill()` skips that absent table.
+
+SCED energy-curve history (NP3-908) has readers for wind, solar, non-intermittent
+and storage supply and controllable-load demand, including four regional tables
+for each. Older files also contain DAM demand, supply and minimum-supply curves
+under `_2d_agg_dam_*_history`, plus separate `_2d_agg_esc_non_wind*_history`
+readers. These older categories are retained explicitly. The sampled March 2014
+ZIP contains tables no longer included in the sampled August 2026 ZIP. Explicit
+`read()` and `download()` reject missing tables; `backfill()` skips them.
+Header-only tables yield no rows.
+
+DAM ancillary-service disclosures (NP3-911) have 36 readers matching the API
+report tables and seven legacy RRS readers. Aggregate offer curves and the newer
+DAM-specific curves keep separate `_2d_agg_as_offers_*_history` and
+`_2d_agg_dam_as_offers_*_history` names. Legacy RRS load/generation cleared and
+self-arranged quantities, and `RRSNC`, `RRSLD`, `RRSGN` offer curves, remain
+separate from newer RRS response categories. The sampled 2014, 2025 and current
+archives cover different sets of tables. Explicit `read()` and `download()`
+reject missing tables; `backfill()` skips them. No reader substitutes another
+category for an absent table.
+
+COP adjustment-period snapshots (NP1-301) and ancillary-service obligations
+(NP1-302) have typed history readers. COP history preserves combined legacy
+`RRS` separately from newer response categories and keeps `hourEnding` labels
+such as `01:00` as strings. Older obligation and responsibility fields remain
+separate from advisory/final obligations; absent values remain `None`. Archive
+publication dates differ from the delivery dates in these delayed reports.
+
+Seven-day event-trigger reports (NP3-987) have separate LMP, DAM MCPC and
+real-time MCPC history readers. These tables are conditional: the latest ZIP
+may contain only one of them. Sixty-day SASM disclosures (NP3-990) have four
+readers for generation/load offers and awards. SASM IDs parse as timestamps,
+including the AM/PM format in award files; legacy combined-RRS offers and
+awards stay separate from newer response categories. Header-only files are
+valid and yield no rows. A sampled populated SASM archive was published in
+January 2026 for November 2025 activity, while the latest listed February file
+was empty; latest publication does not imply recent activity.
+
+`ercot.np3_991_ex._60_cop_all_updates_history` reads complete COP update history,
+including the sampled 2018 layout. Update and submission timestamps remain
+separate; the reader accepts the explicitly mapped minute and second formats.
+Cancellation flags and all revisions remain as published. Legacy combined `RRS`
+remains separate from newer response categories. Applications must select the
+appropriate revision themselves; the reader does not collapse updates.
+
+Sixty-day SCED disclosures (NP3-965) have eleven typed historical readers,
+covering generation, load, storage, offer curves, updates, manual overrides,
+self-arranged services and legacy demand-side response loads. Readers select
+individual tables from the shared archive. Older QSE/DME fields may be absent,
+and legacy `RRSGN`, `RRSLD`, `RRSNC` quantities remain separate from newer service
+categories. Curve points and reported revisions remain as published.
+
+Historical SCED and 15-minute price-adder workbooks (NP6-792/793) expose
+`price_adders_history` readers with `tinyercot[files]`. Monthly sheets retain
+`sourceSheet`; older ORDC/reserve fields and newer component adders stay
+separate, with absent columns represented by `None`. Delivery dates, SCED
+timestamps and published batch IDs remain available. A workbook's year label
+does not guarantee a complete year: the sampled early 2018 SCED file contains
+only January rows.
+
+The capacity workbooks also have typed readers:
+`ercot.np6_794_er.capability_history`,
+`ercot.np6_795_er.clearing_prices_history` (SCED), and
+`ercot.np6_796_er.clearing_prices_history` (15-minute). Resource capability
+combinations retain their reported fields; historical `MCPC` remains separate
+from `cappedMCPC` and `uncappedMCPC`. Monthly sheet names, service types and the
+SCED timestamp or delivery interval identify each row. These readers use the
+existing `tinyercot[files]` extra.
+
+Exceptional fuel-cost submissions (NP4-494) expose
+`fuel_cost_submissions_history` through the optional workbook reader. Delivery
+hours remain as reported, including the documented repeated-hour value 25.
+Monthly path-specific adders (NP7-535) expose `path_adders_history`, reading the
+CSV in each archive. Target date and start date remain separate, with source,
+sink, time-of-use and signed decimal coefficients preserved. In both sampled
+archives, every CSV row matched its XML counterpart.
+
+`ercot.eia_930_cd.hourly_operations_history` reads EIA same-day hourly reports.
+Hour fields contain either UTC timestamps or demand values, according to the
+row's `dataType`, and unreported hours remain `None`. Julian data dates are
+parsed as dates. Date-bounded archive queries work for this product; older
+unfiltered attempts timed out, while the latest check succeeded. The oldest
+file in that listing was posted April 30, 2026, despite the product's earlier
+catalog start date. This is observed availability, not a retention guarantee.
+
+Annual SCED and wind samples from 2015–2025 were checked against the generated
+readers (CSV headers and up to three rows, not every retained file). The 2016
+wind layout preserves `HOUR_BEGINNING` as `hourBeginningTimestamp`; the 2017
+layout retains its delivery date and hour number. Both retain combined
+West/North values without assigning them to separate regions. All 431 rows
+in those two wind files decoded successfully. Source evidence is in
+`tools/inputs/history/annual-evidence.json`.
+
+Annual DAM disclosure and regional solar checks decoded all 3,639,815 rows
+in 146 CSV files from 14 downloaded publications. DAM samples cover one
+January publication in each year from 2015–2025; the regional solar product
+returned January files only for 2023–2025 in this check. Earlier empty January
+listings are recorded, without inferring a product start date. Every decoded
+file count matched an independent CSV row count. These files needed no reader
+changes. See `tools/inputs/history/annual-dam-solar-evidence.json` for publication
+queries, document IDs, source hashes and counts.
+
+Annual 2015–2025 energy-curve and solar checks matched all 324 CSV members to
+generated readers. The aggregate controllable-load reader accepts the older
+`Aggr` filename spelling, including header-only files, while excluding regional
+tables. Solar history accepts the intermediate delivery-date/hour layout with
+`ACTUAL_SYSTEM_WIDE`. All 4,970,040 rows in the 20 selected controllable-load and
+solar tables decoded, with independent CSV counts matching. Other curve tables
+were checked only through their headers and first three rows. Publication IDs,
+hashes and scope are recorded in `tools/inputs/history/annual-curves-solar-evidence.json`.
+
+Intermediate SCED price-adder workbooks preserve `RTRUCCST30HSL` and
+`RTNCLRNSCAP` as separate decimal fields. All 55,173 rows in seven January
+publications from 2019–2025 decoded; timestamps, repeat-hour flags, system
+lambda and both added fields matched the source cells on every row. Eight
+demand-response workbooks from 2018–2025 also decoded all 816 rows, with all
+seven data values per row matching their source cells. Their January 2024/2025
+samples have 120 rows, compared with 96 in earlier samples. The separate
+monthly deployment-factor product returned no January archives for 2015–2025.
+The related 15-minute price-adder workbooks from 2018–2025 decoded 20,832
+rows with all seven source values matching, including interval labels and
+legacy price components. Newer components absent from those files remain
+`None`. Each sampled workbook contains only the January worksheet.
+Queries, document IDs, hashes and worksheet counts are recorded in
+`tools/inputs/history/annual-workbooks-evidence.json`.
+
+Annual ancillary-service disclosures from 2015–2025 decoded all 89,849 rows
+in 208 CSV tables with independent row counts matching. Combined with six
+COP-update samples, all 214 CSV members matched a generated reader. The COP
+checks cover only headers and up to three rows; their January listings before
+2020 were empty. No reader changes were needed. Publication queries, source
+hashes and per-table counts are in `tools/inputs/history/annual-as-evidence.json`.
+
+Quarterly outage samples from 2023–2025 decoded all 4,519 rows, preserving
+separate planned and actual end dates. Annual load-forecast samples from
+2019–2025 decoded 1,344 rows, preserving hour labels and DST flags. All source
+data values matched independently in both checks; neither required reader
+changes. Earlier January load-forecast listings in this probe were empty.
+See `tools/inputs/history/outage-load-evidence.json` for the bounded query
+periods, document IDs, hashes and counts.
+
+The latest checks for NP6-569, NP6-655 and NP6-913 returned no archives or bundles.
+Their typed catalog/document operations remain usable, but no historical row
+schema is inferred from absent files. Point-in-time listing evidence is recorded
+in `tools/inputs/history/availability-observations.json`.
+
+Public ESR Integration Report PDFs (NP4-765-ER) expose five generated readers:
+`daily_values_history`, `power_records_history`, `penetration_records_history`,
+`soc_records_history` and `hourly_percentages_history`. Install `tinyercot[pdf]` for this optional support.
+This report belongs to Public Reports and uses the same credentials.
+
+```python
+from datetime import datetime
+from tinyercot import Client
+
+with Client() as ercot:
+ for row in ercot.np4_765_er.daily_values_history.rows(
+ posted_from=datetime(2026, 9, 1),
+ where=lambda row: row.peakLoadMW is not None and row.peakLoadMW > 80_000,
+ ):
+ print(row.reportDate, row.peakLoadMW, row.maxDischargeMW)
+```
+
+The table readers extract the first page's published tables. `reportDate` is the
+operating date printed in the report; publication bounds select documents.
+Power and energy fields name their MW/MWh units, percentage fields preserve
+published percentages, and clocks retain the source's unspecified timezone.
+`sourceNotes` preserves the daily table's definitions, including changes in
+capacity terminology between older and newer reports. Record tables retain
+separate power and penetration records, even when their MW values differ.
+Older reports without a record section yield no record rows. Unsupported table
+layouts raise. `hourly_percentages_history` reads the printed labels in the three percentage
+charts: discharge/installed discharge capacity, charge/installed charge capacity,
+and net output/ERCOT load. Values retain the printed decimal percentages. An
+unlabelled bar has value `None`, not zero. `hourEnding` preserves source strings:
+the sampled spring transition skips "03", and autumn charts show only "01"
+through "24" without separately labelling a repeated hour. No extra hour or
+timezone is inferred. The reader matches labels to the printed hour axis; it
+does not estimate numbers from bar heights. Exact MW time series in the other
+line charts remain outside the PDF reader's coverage.
+
+Verified PDF table samples span December 2023, September 2024, September 2025
+and September 2026. The first three omit the all-time record section; the 2026
+sample contains seven record rows. These samples do not establish the exact
+record-table introduction date or continuous historical completeness.
+
+
+Intermediate 2020 and 2023 samples require additional historical layouts. The
+SCED load-resource reader preserves all 35 published bid-curve points in the
+2020 file, including blank points, alongside `HASL` and `LASL`. Older self-arranged
+AS timestamps containing spaces before colons parse explicitly. Historical
+ancillary-service responsibilities and quantities remain separate from newer
+award/capability fields; the published `ECRSM ` header is recognized as well.
+
+The wind reader preserves `actualLoadZoneSouthHouston`, `actualLoadZoneWest` and
+`actualLoadZoneNorth` in the intermediate layouts. These fields remain distinct
+from older combined-region and current `genLoadZone*` fields. With a separate
+`deliveryDate`, the intermediate `HOUR_ENDING` value is an hour number rather than
+the oldest layout's timestamp. All 213,456 rows across seven affected files were
+decoded; the broader saved-file audit checks headers and short samples only and
+does not establish continuous historical completeness.
+
+## Direct historical retail load profiles
+
+`Client.load_profiles` reads the annual files linked from
+[ERCOT's historical load-profile index](https://www.ercot.com/mktinfo/loadprofile/alp).
+All 30 linked archives (1997–2026) were downloaded and their worksheet headers
+inspected. Six profile header layouts and a separate adjustment-factor layout
+span XLS and XLSX files, including three profile layouts within 2012.
+Compact source-derived test workbooks retain notes, headers, dates,
+and selected data rows; their source and fixture hashes are recorded in
+`tools/inputs/public-load-profiles-evidence.json`.
+
+Each row contains one profile/weather-zone combination and trade date, with all
+numbered 15-minute kWh columns preserved (100 in the annual backcasts, 96 in the
+2008 original-profile companion table). Blank cells remain `None`. The
+2013 source samples contain 92 nonempty cells on the spring transition and 100
+on the autumn transition. No UTC timestamp is inferred. Optional `ADDTIME` is
+retained as `sourceAddTime`, without assuming a timezone or public release time.
+[ERCOT's published file layout](https://www.ercot.com/files/docs/2011/08/29/fileformatsloadprofiles.xls)
+describes backcasts as settlement profiles using observed weather inputs.
+
+The 2007 ZIP includes a separate auxiliary workbook. Its rows keep
+`kind="auxiliary"` and their original filename. Workbook notes distinguish old
+and new profile models around May 14, 2007; auxiliary production ends November
+14. Do not collapse these overlapping rows into the main backcast series.
+
+The 2008 archive also includes original pre-adjustment COAST profiles and
+Hurricane Ike adjustment factors for September 13–28. Original rows have
+`kind="original"`. `adjustments()` and `read_adjustments()` expose the factors
+through their own typed model, with date, interval number and weather zone.
+All 1,536 factors were compared with the complete original source table;
+factors are never silently applied to energy values.
+The direct factor download was verified byte-for-byte equal to the companion
+workbook in the annual ZIP, so `adjustments()` fetches that smaller file directly.
+
+Complete original-file comparisons cover 1997, 2007, 2008, 2012 and 2026:
+255,408 profile-days and 25,540,160 interval cells. Each typed value, date, interval
+number and source identity was independently compared with the original workbook.
+The older checked years have no missing dates within their observed ranges;
+1997 begins January 3, as its source note explains. These checks establish those
+files' contents; the other linked years have header-layout evidence only.
+
+Every field and all 5,232,800 interval cells in the complete 2026 archive were
+independently compared with the source workbook: 52,328 rows, 248 profiles,
+211 dates spanning January 1–August 30. All of May is absent. This is the
+published file's coverage, not a guarantee of continuous historical availability.
+
+`load_profiles.counts()` and `read_counts()` decode the underlying Data sheets in
+[the public profile-count archive](https://www.ercot.com/files/docs/2021/10/21/Profile_Type_Counts.zip).
+All 97,924 assignment records in 141 workbooks were independently compared with
+the original cells: 97,924 integer counts and 391,696 dimension values (weather
+zone, IDR/NIDR meter data type, TDSP and profile type). The pivot sheets are
+filtered aggregate views over those Data tables; they are not counted as extra
+assignments. Four header layouts differ only by an empty helper column.
+
+The 139 dated workbooks have 138 distinct filename dates from April 9, 2013
+through August 6, 2026; the original and corrected March 12, 2018 snapshots are
+both retained. These are source labels, not availability timestamps. Two other
+filenames contain `201500803` and `201605614`; their 1,382 records retain those
+labels with `snapshotDate=None`, without using workbook-modification times to
+guess dates. Unbounded reads include them; date-bounded reads exclude them.
+Five May 2024 records have blank weather zones. They remain `weatherZone=None`,
+including repeated dimension combinations with distinct counts. Blank trailing
+rows are skipped; counts are neither aggregated nor filled. Source comparisons
+and an eleven-workbook fixture are recorded in the load-profile evidence file.
+
+## Historical settlement loss factors
+
+`Client.loss_factors` follows the [data aggregation index](https://www.ercot.com/mktinfo/data_agg)
+and its 25 linked annual pages. All **72 interval-data downloads**, totaling
+215,272,347 bytes, were independently compared with the typed reader using
+xlrd/openpyxl: **301,829 series/day rows, 28,975,512 numeric factors, and 478,576
+blank interval cells**, including every identifier, timestamp and source column.
+The [source manifest](../tools/inputs/public-loss-history-sources.csv) records each
+actual URL, SHA-256, row/value counts and operating-date coverage.
+
+Source dates span **July 31, 2001–July 31, 2026**. Series coverage is uneven:
+actual distribution history begins **December 7, 2006**, with 25 dates in that
+annual download. Index years, upload dates and worksheet titles are not coverage
+guarantees. The 2003 distribution sheet labeled “Jan thru Jun” also contains
+later dates; date filters use the records themselves. Files and sheets remain
+separate, including overlapping fall-back rows.
+
+Modern workbooks expose 100 numbered INTV positions; older XLS/XLSX workbooks
+use clock columns and separate fall-back sheets. Each interval keeps its
+position, unscaled factor and `sourceLabel`, including repeated clocks and
+24:00. Blanks remain `None`. The 2013 actual TLF annual sheet contains one
+100-interval fall-back row beneath a 96-interval header: all values and its
+trailing timestamp are retained, and its interval labels are `None`. The
+companion DST-sheet record is not silently deduplicated. Trailing 2003 orphan
+loss-code labels without dates or values are not observations.
+
+Recorder IDs, TDSP names and loss codes stay distinct. Nineteen 2014 forecast
+DLF DST rows use `DISTLOSSFACT_...` recorder IDs and an unlabeled numeric second
+column. These remain `recorder` and `sourceSecondaryIdentifier`; TDSP/loss code
+are `None`. Legacy column-four markers remain in `sourceMarker`. Other legacy
+second-column labels are also retained, alongside the typed loss code.
+
+Early distribution workbooks omit the actual/forecast distinction internally.
+Live reads retain the actual index link in `sourceFile` and use its forecast
+label. Saved reads can provide `source_file=archive`; otherwise unidentifiable
+`kind` values stay `None`. START TIME/STARTTIME and TIMESTAMP/LSTIME are parsed
+without an inferred timezone or public-availability claim. Date bounds are
+inclusive; `where` accepts a typed predicate. MIS routes remain excluded.
+
+The original 2026 comparison and four-date fixture remain in
+`tools/inputs/public-loss-factors-evidence.json`. New historical evidence is in
+`tools/inputs/public-loss-history-evidence.json`, with all 26 original index
+pages and nine complete, unchanged legacy workbooks used in tests. These cover
+header variants, timestamps, repeated intervals, missing identifiers, orphan
+labels and the misaligned 2013 row. Fixtures are excluded from the wheel.
+
+## Annual transmission-loss coefficients and seasonal operator load shares
+
+`Client.transmission_loss_coefficients` follows the same 26 data-aggregation
+indexes as the interval-loss reader. It exposes the final published SSC/SIC
+coefficients and the separate SONL/SOFFL/SONLF/SOFFLF input basis from **all 26
+annual workbooks, 2001–2026**. All **948 area/season records**, **5,682 numeric
+cells** and **six blanks** were compared directly with original XLS/XLSX cells,
+including year/as-of headings, area labels, source rows and effective periods.
+The six blanks are the LPL spring 2021 entry; it remains a record with missing
+values. Both coefficient columns and all four input columns survive.
+
+Areas are matched by published labels because the 2002 COCS coefficient columns
+are shifted relative to their input columns. PUB and BPUB labels remain distinct,
+as do Rayburn and TEXLA. Final and input ERCOT correction labels are retained
+separately. SSC and SIC carry percent/MW and percent units; the on/off-peak input
+loss-factor cells retain their fractional values. In all populated NOIE cases,
+the original SSC × load + SIC matches the input loss factor × 100. The SDK does
+not recalculate or apply coefficients. Internal base-case and “For Testing Only”
+calculation tables remain in the downloadable original workbooks.
+
+The 2001–2010 workbooks have no effective-period tables (**348 records**).
+The source winter ranges in 2020 and 2026 are reversed (**19 records**):
+`12/01/2021 - 02/28/2021` and `12/01/2027 - 02/28/2027`. Their raw text remains in
+`sourceEffectivePeriod`, with both usable date bounds `None`; dates are not
+repaired or inferred. The remaining **581 records** retain explicit bounds,
+including the change from an August summer end in 2011 to September in 2012,
+and leap-year winter ends. Workbook as-of dates and versions remain separate
+from any claim about public availability. Live queries attach the original
+`PublicFile`; saved reads accept it through `source_file`. Overlaps and revisions
+are not deduplicated by year, area or season.
+
+`Client.load_shed` reads both current workbooks linked from the
+[load page](https://www.ercot.com/gridinfo/load). All **42 operator load-share
+values**, headings, operator names, effective dates and notes were compared with
+the originals. Summer starts **April 1, 2026**, winter **September 1, 2026**,
+according to the workbook notes rather than upload dates. These are published
+load percentages, not actual shed MW or probabilities. Delegation footnotes
+remain attached; no end date or renormalized percentages are invented.
+
+Both readers support original saved workbooks/ZIPs and typed predicates with
+`tinyercot[files]`. The source manifest is
+`tools/inputs/public-seasonal-tables-sources.csv`; verification and fixture
+provenance are in `tools/inputs/public-seasonal-tables-evidence.json`. All 28
+complete original workbooks are used in regression tests and excluded from the
+wheel. Coefficient discovery reuses the 26 captured original index pages.
+
+## CRR time-of-use hours and POLR territory totals
+
+`Client.crr_hours` discovers the calendar linked from
+[ERCOT's CRR page](https://www.ercot.com/mktinfo/crr). The complete captured
+workbook contains 48 monthly records for January 2026–December 2029. Every
+OffPeak, PeakWD, PeakWE and Total cell is compared with the typed result, along
+with the delivery month and source identity. Counts are retained as published,
+including 743 hours in March 2026, 721 in November 2026, and 696 in February
+2028. This is a trading calendar, not observations of future market activity.
+
+`Client.polr` discovers the counts/energy reports linked from
+[ERCOT's retail page](https://www.ercot.com/mktinfo/retail). All 24 rows in the
+captured 2026 report are compared with the original workbook: six territories
+and four premise classes, with 24 active-ESIID counts and 24 annual-kWh totals.
+Counts describe active ESIIDs with usage on March 31, 2026. Energy describes
+all ESIIDs active during April 1, 2025–March 31, 2026. These are distinct
+populations; no per-customer usage ratio is calculated. The source uses the
+most current premise-type assignment, as retained in its cover notes.
+
+Both services expose `files()`, `download(file)`, `rows(where=...)` and
+`read(data, filename=..., where=...)`. Predicates receive concrete typed rows.
+Dates come from table contents, not filenames or index labels. Saved ZIPs keep
+overlapping members distinct. Both complete original workbooks are included
+as regression fixtures, byte-for-byte. Source URLs, hashes and comparison
+counts are in `tools/inputs/public-market-tables-evidence.json`. No older
+history is inferred from the years embedded in download URLs.
+
+## Retail transaction history
+
+`Client.retail_transactions` discovers the monthly transaction archive linked
+from [ERCOT's retail page](https://www.ercot.com/mktinfo/retail). The complete
+inspected archive has 20 workbooks and 444 sheets, covering January 2025–August
+2026. All 9,126 records were independently compared against the original files:
+277,433 daily counts, 9,126 reported totals, 9,126 reported averages, every date,
+transaction code and workbook/sheet identity. All 608 calendar dates appear in
+the source headers. This describes aggregate transaction counts, not individual
+customer records or metered energy.
+
+There are 30 original transaction codes and a Grand Total row in each sheet.
+Typed `transactionCode=None` identifies those 444 total rows. `sourceSheet`
+retains each original category. Territory, customer-class and ERCOT-wide views
+overlap and must not be added together. Four sheets in April 2025 and January
+2026 are literally named ` Inbound` and ` Outbound`; their eight records retain
+these labels without an invented category. Codes retain their literal spelling,
+including suffixes such as `814_06_MVI` and `814_06_SW`.
+
+Monthly totals match the sum of their published daily counts in this archive.
+The 8,848 rounded averages remain exactly as published rather than being
+recomputed. Each typed month keeps its daily dates/counts and separate reported
+total/average. The `where` predicate can select dates, codes and categories.
+`files()`, `download(file)` and `read(data, filename=..., where=...)` support
+direct discovery and saved archives. Original member names and overlapping
+files remain separate; the current archive filename does not limit the dates
+that can be queried.
+
+Evidence is recorded in `tools/inputs/public-retail-transactions-evidence.json`.
+The regression fixture retains five complete original workbooks byte-for-byte,
+covering all 30 codes, first/latest months, 28/30/31-day months and every unnamed
+category. It contains 2,280 records and 68,864 daily counts. No older coverage is
+inferred from the year embedded in the source URL.
+
+## Interim indicative ORDC archive
+
+`Client.indicative_ordc` reads the archive linked under the interim scarcity
+pricing section on [ERCOT's real-time market page](https://www.ercot.com/mktinfo/rtm/index.html).
+The complete original ZIP contains 34 CSVs and 9,826 records, spanning October
+17, 2013 at 00:00:16 through November 19 at 23:55:08, with all 34 calendar dates.
+The page description says November 20, but no record on that date is present.
+All 49,130 numeric fields, timestamps, repeat-hour flags and member identities
+were independently compared with the original CSVs. The entire original ZIP
+is retained as the regression fixture; provenance is in
+`tools/inputs/public-indicative-ordc-evidence.json`.
+
+Every record is explicitly `indicative=True`, separate from the generated
+realized ORDC/settlement histories. ERCOT labels this section as interim pricing
+before June 1, 2014. The fields preserve SYSTEM_LAMBDA, RTOLCAP, RTOFFCAP, RTORPA
+and RTOFFPA as decimals under their source names, without applying adders or
+constructing a combined price. Original timestamp text is retained beside the
+parsed naive timestamp. The source's `00:xx AM` notation maps to midnight;
+9,814 N flags and 12 Y flags remain literal, including the November 3 repeat
+hour. No UTC offset or uniform five-minute sampling is inferred. Nested ZIPs,
+standalone CSVs and typed predicates are supported without optional packages.
+
+## MORA forecast percentiles
+
+`Client.resource_outlook.files()` discovers workbook links on the
+[resource adequacy page](https://www.ercot.com/gridinfo/resource) and its linked
+historical year indexes. All 37 downloaded workbooks have a PRRM Percentile
+Results sheet. Their reporting months span December 2023–November 2026, with
+36 distinct months and two December 2023 versions. The typed `percentiles()`
+and `read_percentiles()` readers cover **27,500 original values**: 9,240 gross
+demand, 8,228 solar, 9,592 wind, 374 thermal-outage, 33 non-extreme-weather outage
+and 33 extreme-weather outage values. Every value, percentile, hour/daily label,
+metric heading, report month, footnote and source identity was independently
+compared with the original workbooks. No selected value was blank in this capture.
+
+Source hour labels vary. December 2023 supplies solar hours 8–18 and wind hours
+7–22, with daily thermal-outage percentiles and no gross-demand table. Later
+files expand the hour coverage and introduce new demand definitions. No omitted
+hour or metric is synthesized. Daily outages retain `hour=None`; percent strings
+are normalized to fractions while original labels remain visible. Winter
+weather-outage regimes and their explanatory footnotes stay distinct.
+
+The 27,478 values whose headings specify MW retain that unit. The two earliest
+daily-outage tables omit a unit in their labels, so their 22 values retain
+`sourceUnit=None`. These are assessment-month forecast distributions, not dated
+realized observations or joint scenarios. Report-month labels and member names
+preserve the available revisions. URL dates and revision labels do not establish
+point-in-time public availability.
+
+Evidence is in `tools/inputs/public-mora-percentiles-evidence.json`. The fixture
+retains nine complete original workbooks, byte-for-byte, containing 6,006 values
+and every supported metric family. Resource-detail, capacity-summary and
+load/resource-balance tables have separate readers described below.
+
+## MORA resource capacities
+
+`Client.resource_outlook.resources()` and `read_resources()` cover the Resource
+Details sheets in the same **37 workbooks**, December 2023–November 2026. All
+**61,949 rows** were compared against their original B–J source cells: **60,766
+unit rows and 1,183 summary rows**. Counts include repeated monthly records and
+both December 2023 versions, not distinct generating units. Summary rows include
+totals, capacity contributions and adjustments; some have identifiers in the
+source's unit-code column. Unit rows have an INR, county, zone or service field;
+the source summaries lack those fields. Original names, codes, fuel labels,
+categories, rating labels, worksheet rows and footer notes are retained.
+
+There are 60,331 service years, 280 service dates, three literal `#N/A` errors and
+1,335 blank service fields. No service date is inferred from the reporting month.
+The 87 blank installed capacities and 14 blank reported capacities remain `None`;
+zero and negative values remain numeric. The October 2025 workbook omits the
+initial category heading, so its first 402 records retain `category=None`.
+Unheaded helper cells beyond column J are excluded from the named resource table;
+they include repeated capacity values and a zero beside a section heading.
+
+These are assessment-month ratings, not measurements of generation or proof that
+planned resources are in operation. Seasonal and monthly rating labels remain
+explicit, as do planned, unavailable and mothballed categories. Footnotes explain
+that battery fleet contribution is calculated separately, and that planned
+resources approved for synchronization can be assumed available for the season.
+Summaries and their underlying unit capacities should not be added together.
+
+`tools/inputs/public-mora-resources-evidence.json` records the full source
+comparison. Tests reuse the nine complete originals in `mora-percentiles.zip`
+and add three complete originals in `mora-resources.zip` for service dates,
+missing categories and helper columns. Fixtures are excluded from the wheel.
+
+## MORA category capacities and load/resource balance
+
+The `capacities()` / `read_capacities()` readers expose **1,494 category rows**,
+with **1,494 installed-capacity values and 1,854 expected-capacity values**.
+`balance()` / `read_balance()` expose **990 load/resource-balance rows**, with
+**1,221 scenario values across 33 typed metrics**. All **4,569 numeric cells**
+in both sheets of the same 37 workbooks were independently compared with the
+source, including row coverage, scenario labels, report months, notes, clocks,
+time-zone labels and category hierarchy. No numeric cell was blank in this capture.
+
+Category rows distinguish operational, planned and total resources. The original
+Excel indentation supplies `resourcePath`, keeping e.g. Wind/Other separate from
+Storage/Other. Indentation levels need not be consecutive. Parent and child rows
+both retain their source values and must not be added together. Installed capacity
+is stored once per category; expected values form a typed list of scenarios.
+The March 2024 expected-capacity header is blank and remains `None`.
+
+Older workbooks publish two scenario columns. December 2023 has 8 a.m. and 5 p.m.
+values; March 2024 distinguishes late-March conditions at 6 p.m. from early-March
+cold conditions at 8 a.m. April 2024 includes two different wind scenarios at the
+same 8 p.m. hour. Each original scenario label is retained, with its parsed local
+clock and explicit CST/CDT label where present. The 840 scenario values without
+a zone retain `timeZone=None`; the others comprise 1,692 CDT and 543 CST values.
+No dated operating hour or UTC timestamp is inferred from the reporting month.
+
+Balance metrics retain distinct large-load and large-flexible-load adjustments,
+and distinguish thermal capacity that explicitly excludes emergency agreements.
+Original metric labels and source notes accompany the stable typed names. These
+are forecast/scenario quantities, not realized demand, supply or operating reserves.
+The scenario tables do not provide the hour-by-hour probability images or embedded
+risk-chart data; those are not counted in this coverage.
+
+`tools/inputs/public-mora-summaries-evidence.json` records the source comparisons.
+Tests reuse twelve original workbooks already retained for other MORA readers and
+add the complete March 2024 workbook in `mora-summaries.zip`. The thirteen originals
+contain 526 category rows (727 expected-capacity values), 338 balance rows (461
+scenario values), all 33 metrics, and the missing heading. Fixtures stay outside
+the wheel; category hierarchy requires the `files` extra and original XLSX format.
+
+## Capacity changes and project histories
+
+`Client.capacity_changes` discovers all **169 linked XLSX workbooks** on the
+[resource page](https://www.ercot.com/gridinfo/resource) and its 26 historical-year
+indexes. The source set covers **96 reporting months, August 2018–July 2026**,
+including annual/monthly companion files and corrections. The current and
+historical link captures were compared with the SDK discovery results, including
+the older `Monthly Capacity Changes` title and capitalization differences.
+
+The project reader exposes **42,628 records**. Every named field was compared
+with the original workbooks, including projected COD, agreement and synchronization
+dates, original identifiers, source year, technology, MW rating and financial
+security. Repeated headers and one-cell group/footnote rows are not projects.
+Resource codes in the INR column remain valid identifiers. The source year can
+differ from the projected-COD year and is preserved independently.
+
+There are 82 missing agreement dates and 13 literal agreement-status strings:
+`12/31/1899` once, `Not Required` once and `Date Not Available` eleven times.
+The literal 1899 marker is not converted into a real agreement date. The source
+also has 52 missing fuel values and 58 missing financial-security values. Original
+October 2023 reports retain their blanks; corrected versions retain the filled
+values and the accompanying correction text. Comments about partial or rescinded
+synchronization approval remain attached to their project records.
+
+The totals reader exposes **16,554 rows with 92,312 numeric values and four blank
+capacity cells**, all compared against the original source. Installed, synchronized
+and operational measures retain separate typed fields. The combined installed/
+operational-and-signed measures retain their original column labels; they are not
+substituted for a total including every planned category. Other-planned capacity,
+distributed generation, small generators and DGR comments stay distinct.
+
+Periods comprise 10,722 integer years, 4,770 dates under `Month/Year`, and **1,062
+dates under a `Year` heading**. The reader keeps each original period and heading,
+including the twentieth day used in monthly charts. Period years span 1999–2033;
+later points are source projections, not observed future capacity. A September
+2018 battery sheet has seven annual totals and no project table; both readers
+handle that distinction. Values from parent totals, components and companion
+reports should not be added indiscriminately.
+
+Live queries retain `sourceFile` with the original URL and title, distinguishing
+the two November 2018 downloads that share a filename. Saved ZIPs retain member
+paths. Different companion-file dates are not reconciled: July 2026 reports give
+different projected CODs for the Wise County repower project. A report-month label
+or source URL does not prove immutable publication time or actual commissioning.
+
+Source URLs, hashes and per-file counts are recorded compactly in
+`tools/inputs/public-capacity-changes-sources.csv`; comparison details and fixture
+provenance are in `public-capacity-changes-evidence.json`. Seventeen complete
+original workbooks are retained in the test ZIP, with URL-date folders preserving
+same-name revisions. Fixtures and evidence are excluded from the wheel. Coverage
+here concerns the underlying project and capacity tables; it does not assert that
+every chart-specific annotation or other resource-page document is parsed.
+
+## Historical zonal weather
+
+`Client.historical_weather.rows()` and `read()` cover all eight zonal workbooks in
+[ERCOT's historical weather ZIP](https://www.ercot.com/files/docs/2002/12/11/weather1996_2000.zip).
+Each contains four worksheets: CLOUDCOVER, WINDSPEED, DEWPOINT and DRYBULB TEMP.
+The source notes describe a weighted combination of weather stations. The public
+index labels the archive 1996–2000 and says additional weather data is unavailable
+under contractual limitations; the actual workbooks extend through January 10,
+2001. Bounds use those actual dates.
+
+Independent comparison covers every source cell: 58,784 variable/day records and
+1,410,816 hourly values across 32 worksheets. Each zone/variable has 1,837
+consecutive dates from January 1, 1996 to January 10, 2001, with 24 numeric cells
+per date. Dates, zone identities, variable names, hour-column numbers and source
+notes were also compared. A compact fixture retains six dates from all 32 sheets,
+including leap day, both DST transition dates and the final January 2001 date.
+Source hashes and comparison scope are in `tools/inputs/public-weather-evidence.json`.
+
+The workbooks do not state measurement units; `sourceUnit` stays `None`, and no
+scale conversion is performed. Hour numbers are the published column numbers,
+without an inferred hour-ending convention, DST flag or UTC offset. The reader
+can retain blank hourly cells as `None`, although none occur in this original
+archive. No newer or continuous present-day weather history is claimed.
+
+## Historical four-coincident-peak allocations
+
+`Client.coincident_peaks.allocations()` reads the annual allocation tables in
+[ERCOT's public 1996–2020 archive](https://www.ercot.com/files/docs/2022/01/13/1996-2020_FourCoincidentPeakCalculations.zip).
+The source includes originals, revised filings, comparison tables, and revision
+components. They remain separate records with source member, sheet and section;
+`kind` distinguishes allocation, comparison and revision-detail tables. The
+reader does not select a supposedly final revision or recalculate reported shares.
+
+The 1996 summary includes monthly loads in kW and loss-adjustment components.
+The 1997 summary occurs below monthly submitted-load tables and contains annual
+averages and adjustment percentages, but no monthly load columns. Its `peaks`
+list is empty. Subsequent tables retain kW or MW as published. `adjustmentUnit`
+is `factor` for the 1996 calculation and `percent` for the older tables whose
+headers specify percentages; no scale conversion is performed. DUNS and entity
+codes remain strings. Peak clocks are parsed only when supplied by the annual
+column headers, with no inferred timezone or public-availability timestamp.
+
+Independent extraction of the original archive verifies 4,345 rows across 43
+annual worksheets and all 25 years: 27,290 numeric values plus source identity,
+year, record kind, identifiers and published peak clocks. Tests retain all annual
+worksheets from the source workbooks, rewritten with their cached values and
+notes; the fixture omits unrelated workbook sheets. Hashes and comparison scope
+are recorded in `tools/inputs/public-four-cp-evidence.json`.
+
+`monthly()` and `read_monthly()` cover all 86 monthly peak tables in that archive:
+7,633 records spanning 1997–2007, checked independently against 22,950 original
+numeric cells, every peak timestamp, 5,249 settlement-metadata records, and
+source identifiers. This is the monthly-table range, distinct from the annual
+allocation range. Submitted kW, loss-adjusted peak kW and settled MW/MWh remain
+distinct via `loadType`, `unit`, `energyMWh` and named adjustment fields. Relative
+differences retain their dimensionless source values. SIS report cells have no
+explicit published unit and remain unscaled in `sisLoadReport`.
+
+Totals are retained, including three unlabeled 1997 totals (`entity=None`). An
+unlabeled cross-month transmission-loss calculation below the 1997 peak tables
+is not represented as a monthly load. Source row numbers, headers, table notes
+and row notes are preserved. Original and revised 2001 files report different
+August peak dates; both remain queryable by their actual peak dates. The August
+2005 preliminary workbook has a worksheet named July; the source heading controls
+the date. Peak clocks have no inferred timezone. Settlement run dates/times and
+explicit stage/channel labels remain separate; missing times are `None`. The
+source typo `9/17/032` is preserved with `runDate=None`, without guessing a year.
+Preliminary report labels remain separate from FINAL settlement-run labels.
+
+Tests retain all monthly worksheets from 29 source workbooks (68 sheets), including
+their cached values and notes. Supporting calculation matrices and contact lists
+are outside these peak-table readers.
+The current NP9-83-M product page exposes report type 13037 through MIS listing
+and download routes, which were inspected without calling MIS. The public direct
+ZIP therefore supplies history through 2020, not recent 4CP filings.
+
+The inspected UFE page provides annual PowerPoint analysis reports. No slide
+extraction was added: these reports fall outside this release's operational
+and market time-series focus.
+
+## Distribution-loss formula parameters
+
+`Client.distribution_loss_coefficients.files/download/rows/read` covers all 28
+summary workbooks linked from the [distribution methodology index](https://www.ercot.com/mktinfo/metering/dlfmethodology),
+2001–2026. Both 2007 and 2024 period variants remain separate. Discovery tolerates
+the source's 2023 “Lost Factors” title. The complete bundles remain downloadable;
+the typed reader selects the ERCOT summary, excluding narrative attachments and
+hypothetical example curves.
+
+All **466 records and 1,398 numeric parameters** were compared against direct
+spreadsheet reads: 114 legacy AAL/K/ADLF records and 352 F1/F2/F3 records. The six
+explicit nullable parameter fields retain the two formula families. Source TDSP
+names and loss codes remain unchanged. ERCOT annual MWh, interval count, average
+interval MWh and optional peak MW preserve the published cached baseline values.
+Negative parameters and rounded baseline averages are not corrected or rescaled.
+
+The filename year is a label, not an effective date. Baseline dates describe the
+load inputs. The 2026 workbook's Start title says 2025; both are retained. Formula
+text, original baseline label, member, sheet, column and optional `PublicFile`
+provide source context. No publication or coefficient applicability dates are
+inferred, and no loss formula is applied by this reader.
+
+Seventeen original XLS summaries use Excel's built-in workbook protection.
+The optional files extra uses msoffcrypto-tool to read those originals with the
+public default key; it does not require ERCOT credentials. Core-only discovery
+and downloads remain independent of spreadsheet and decryption dependencies.
+
+`tools/inputs/public-distribution-coefficients-sources.csv` records original
+archive and summary hashes. `public-distribution-coefficients-evidence.json`
+records verification and limitations. The fixture ZIP contains all 28 complete,
+unchanged summaries, including protected bytes; the original discovery HTML is
+also retained. Regression tests compare every parameter and the baseline fields
+against direct spreadsheet reads, exercise anonymous discovery, preserve both
+revisions, and check source-year conflicts and JSON round trips. Fixtures are
+included in the source distribution, excluded from the installed wheel.
+
+## Daily 4CP source energy
+
+`Client.coincident_peaks.daily_files()` follows the current and 25 historical
+aggregation indexes. Their one direct daily-source link is the
+[2017 4CP source workbook](https://www.ercot.com/files/docs/2018/01/23/4CP_Daily_Posting_2017-11-27.xlsx).
+`download(file)`, `daily()` and `read_daily()` expose its original workbook and
+typed daily records, independently of MIS and API credentials. The existing
+no-argument `download()` still retrieves the annual 1996–2020 allocation archive.
+
+The daily workbook contains **16,445 rows in each of INITIAL and FINAL**, spanning
+**2017-06-01 through 2017-09-30**: 135 source entities, 122 dates, and **3,157,440
+numeric interval values** in total. INITIAL uses source channel 1, FINAL channel
+2; their values differ and both remain queryable. The source includes ERCOT and
+individual entities, so rows are not an additive partition. FARMERS ELECTRIC CO
+OP INC PRTN RC (TDSP) has only 97 dates in each sheet; other entities have all 122.
+No missing rows are synthesized.
+
+`CoincidentPeakDay` retains the operating day, entity, settlement, channel,
+`EnergyInterval` records, original unit header, file/member/sheet and one-based
+source row. Each interval contains its original one-based position, source label
+and nullable `energyMWh`. These files have 96 columns, including the original
+`24:00` label, and no blank numeric cells. Clock labels have no inferred timezone.
+The source's MWh values are not converted to MW or peak allocation shares.
+Inclusive date filters and typed predicates do not combine settlement versions.
+A file URL date or settlement stage does not establish historical availability.
+
+The complete original workbook is retained unchanged in
+`tools/inputs/coincident-peaks/daily-2017.xlsx`. Original URL/hash, coverage and
+limitations are recorded in `public-daily-4cp-evidence.json`. Tests compare every
+numeric interval and entity/date/channel/header directly with openpyxl, verify
+all entity date sets, preserve the initial/final difference, and exercise exact
+source-index discovery with anonymous date-filtered queries. The fixture ships
+in the source distribution and is excluded from the installed wheel.
+
+## Historical zonal-market energy
+
+`Client.zonal_energy.files/download/rows/read` covers all ten generation/load
+MWh workbooks linked from the [public aggregation indexes](https://www.ercot.com/mktinfo/data_agg),
+2001–2005. `totals/read_totals` retain the published summary and detail aggregates
+separately. Files are anonymous downloads; parsing uses the optional files extra.
+Inclusive operating-date bounds and typed predicates apply to daily reads.
+Bare unnamed workbooks require an explicit generation/load kind; live reads
+attach the actual file link. Zone codes retain the original market vintage.
+
+Source comparisons cover **13,886 daily records**, **1,332,244 numeric interval
+values and 29,016 blank interval cells**, **1,170 additional source numbers**,
+and **88 published totals** (52 summary, 36 detail). One undated `Grand` row has
+96 interval-column aggregates, retained only among the totals. Generation raw
+sheets for 2001–2004 duplicate the published daily values; they remain in the
+original download without emitting duplicate daily observations. Cached summary
+and detail totals can differ: the 2001 generation grand totals are respectively
+115512611.682897 and 115512613.08008096 MWh. Neither is silently corrected.
+
+Coverage begins **2001-07-31 for generation** and **2001-08-01 for load**.
+All vintage zones have full calendar-year dates in 2002–2004; load also covers
+all of 2005. Generation in 2005 has only 328 dates per zone, missing June 22
+through July 28 in all five zones. No rows are synthesized to fill the gap.
+Source clock/position labels do not establish UTC instants or modern-zone mappings.
+
+Nine load rows extend to 100 values under 96 interval headers: four zones on
+2003-10-26 and five on 2005-10-30. Those extra values reconcile with the original
+daily totals; all 100 remain available, with clock labels `None` for the
+misaligned rows. The 805 additional generation numbers instead remain typed
+`ZonalSourceNumber` records with their original column and header, without an
+assumed unit or interval meaning. The 2003 W03 source calls a numeric column
+`ORIGIN`; its 365 daily values and one aggregate remain source numbers, leaving
+`totalMWh=None`. String origin markers, recorder/channel fields and the actual
+trailing timestamps are also retained. Numeric energy cells accidentally
+formatted as dates in the XLS files remain their original numbers.
+
+`ZonalEnergyTotal.scope` separates summary from detail totals; `share` retains
+the original fractional value and `sourceShareHeader` retains its displayed
+label. Original labels, headers and notes accompany totals, including unlabeled
+grand totals. Values are never recomputed or rescaled. The filename year and
+source timestamps do not establish observation availability or settlement finality.
+
+`tools/inputs/public-zonal-energy-sources.csv` records all original URLs/hashes;
+`public-zonal-energy-evidence.json` records counts and limitations. All ten complete
+original workbooks are retained unchanged in `public-tables/zonal-energy.zip`,
+including summaries and duplicate raw sheets. Regression tests compare each daily
+interval, numeric metadata cell, source timestamp and published total directly
+with xlrd, verify the missing dates and source quirks, and exercise anonymous
+index discovery and typed saved/live queries. Fixtures remain outside the wheel.
+
+## MORA conditional wind/BESS risk curves
+
+`Client.resource_outlook.risk_points/read_risk_points` reads exact numerical
+coordinates from the original chart caches and follows workbook/drawing
+relationships to the source worksheet. All 37 retained MORA workbooks were
+checked: three contain native numerical risk curves, yielding **72 points and
+144 numeric coordinates**. June 2026 has ten points per EEA/EEA3-load-shed series;
+October and November have thirteen per series. The remaining 34 reports do not
+supply these numerical chart caches and yield no points through this method.
+Their original graphics remain available in the workbook download.
+
+`MoraRiskPoint` retains the reporting month, event, wind MW, fractional
+probability, fixed BESS availability MW, simulation count, chart/scenario hours,
+original axis/series labels, complete worksheet notes, original zero-based point
+index and file/member/sheet/chart provenance. Values are parsed directly from
+XML decimal strings, without interpolation or image digitization. The zero final
+EEA3 probability in October remains zero. Revisions are not deduplicated.
+
+The three source scenarios fix BESS at 2,070 MW (June), 4,473 MW (October) and
+4,394 MW (November), with 10,000 model runs stated in each worksheet. These are
+conditional modeled outcomes, not realized operating observations or an
+unconditional forecast. November's chart hour is 20:00 while its worksheet
+scenario hour is 19:00; both remain explicit. Neither an assessment month nor
+source file URL establishes when the forecast became available, and no timezone
+is inferred for these chart labels.
+
+`tools/inputs/public-mora-risk-evidence.json` records source URLs/hashes, fixture
+locations, comparison scope and limits. Two additional complete original
+workbooks are retained in `public-tables/mora-risk.zip`; existing original
+November and March fixtures are reused. Tests compare every original coordinate,
+scenario context, both hours, zero probability and JSON round trips, and exercise
+anonymous typed queries plus a report without numerical curves. Fixtures remain
+outside the installed wheel.
+
+
+## Complete intermediate and annual CSV checks
+
+A subsequent check decoded every row in **221 distinct intermediate/annual CSV samples**
+across **92 history readers and eight products**, totaling **28,881,274 rows**.
+These cover SCED/DAM disclosures, aggregated offer curves, highest-offer data,
+wind actuals, and load/solar forecasts. The earlier cross-product audit had checked
+only their headers and up to three rows. Each complete file now decodes through
+its concrete generated reader, with its row count cross-checked against a
+separate CSV reader. No parser changes were needed.
+
+The 433 oldest/current CSV members already had corresponding full-file decode
+receipts in the per-product evidence, so those files were not decoded again.
+The three saved audits contain 661 CSV entries, including seven files reused
+between the intermediate and annual checks; those repeats are excluded from the
+new totals. Every entry now has a complete-file decode receipt. It does not establish every intervening publication's layout,
+gap-free history, or an independent comparison of every numerical value.
+
+`tools/inputs/history/intermediate-full-files.csv` records each reader, original
+archive/member identity, source hash, byte size, and source/decoded row count.
+`intermediate-full-file-evidence.json` records the decoder commit and hashes,
+scope, and totals. The same evidence records the separately listed annual DAM/RT
+hub/load-zone and DAM ancillary-price products that use ICE/MIS routes; those
+remain outside the no-MIS scope. Their oldest years were not queried, so the
+Public Reports archive bounds are not a claim about all price history ERCOT holds.
+
+## Modeled generation profiles
+
+`Client.generation_profiles` adds typed access to direct wind and solar planning
+profile downloads on the resource adequacy pages. It supports `DATE` with `TIME`
+or `TIME_CST` CSV layouts (including an extra leading year column), embedded
+Excel site metadata, and ZIPs containing those supported tables. Source column
+labels are retained as keys in `GenerationProfileHour.generationMW`; site
+metadata has its own `GenerationProfileSite` model.
+
+Eight complete original downloads were checked against separate CSV/openpyxl
+reads: **789,073 hourly rows and 18,187,437 generation values**. They cover the
+1980–2020 metropolitan and rural distributed-solar series, 2020 single/dual-axis
+hypothetical solar and operational/planned/hypothetical wind CSVs, and the
+2020–2021 operational/planned solar and wind workbooks. The workbook numeric
+comparison uses openpyxl's stored-number interpretation, not exact XML lexemes.
+All embedded metadata fields for 377 workbook sites were also compared. Live
+discovery found 69 datasets: 25 CSVs, 19 workbooks and 25 ZIPs.
+All 25 discovered direct CSV header samples and their first two rows also decode;
+that sample check does not establish their complete-file coverage.
+
+Both workbooks retain repeated 01:00 clocks on November 1, 2020 and November 7,
+2021. The wind workbook also contains January 1, 2022 at 00:00; its filename ends
+in 2020–2021. The parser neither clips dates to filenames nor deduplicates clocks.
+
+These are **modeled generation scenarios**, not metered historical generation or
+point-in-time forecasts. The source's [development report](https://www.ercot.com/files/docs/2022/12/19/ERCOT_1980-2021_WindSolarGenProfiles_FINAL_public.pdf)
+describes weather reconstruction and calibration to generation observations.
+Separate profile vintages should not be combined as an observed fleet history.
+Older ZIP layouts and the remaining Excel profile vintages remain unverified
+or unsupported; this addition does not close those gaps. The four companion key
+workbooks are covered below.
+
+`tools/inputs/generation-profiles/evidence.json` records the eight original file
+URLs, hashes, counts and boundaries. `profiles.zip` retains three complete,
+unchanged originals for regression tests; `csv-header-samples.json` explicitly
+contains only captured header/row excerpts. All fixtures stay outside the wheel.
+
+
+### Generation-profile site keys
+
+`generation_profiles.key_files()` discovers all four directly linked wind/solar
+key workbooks for the 1980–2020 and 1980–2021 profile vintages. `read_keys()` yields
+`GenerationProfileKey` objects containing typed site/unit rows, summary rows and
+located source notes. Fresh downloads match all four original fixture hashes.
+
+All source cells in **11 site/unit tables (1,828 rows)** and all numeric summary
+rows (**32 rows**) were compared with independent original worksheet positions.
+The reader preserves both solar table sections across repeated headers, detailed
+wind unit mappings, distributed-solar metro and rural metadata, capacities,
+coordinates, equipment descriptions and source labels such as `Lat`/`NA` tilt.
+The older wind workbook's legend marks four sites and twelve unit rows as modeled
+queued plants; those flags were checked without mistaking the adjacent legend for
+a site's own flag. The newer workbooks have no such legend and return `None`.
+
+Two source inconsistencies remain explicit. The 1980–2020 solar summary reports
+313 utility profiles while detailed scenario totals sum to 331. In the
+1980–2021 solar publication, 163 of 164 key unit codes match profile columns;
+`TREBA_UNIT 1` in the key differs from `TREBA_UNIT1` in the profile. Neither is
+silently normalized or repaired. Site families and publication vintages are never
+automatically joined.
+
+The four unchanged originals total 183,426 bytes under
+`tools/inputs/generation-profiles/keys/`; their source URLs, hashes, table counts,
+legend checks and identifier mismatch are recorded in `evidence.json`. Tests
+exercise the originals, source-summary discrepancies, nested workbook ZIPs and
+credential-free discovery/downloads. Fixtures remain excluded from the wheel.
+
+
+### Older wind archives and hypothetical-solar workbooks
+
+The generation-profile reader supports the older `YYYYMMDD` / `HHMM(CST)` CSV
+headers and separates side-by-side date/clock tables into independently dated
+records. `sourceBlock` identifies the original table on both records and site
+metadata. Timestamp columns never enter the MW mapping, and an entirely empty
+trailing block does not create an observation.
+
+All **76 CSV members in seven wind archives** were inspected. They contain
+**40 distinct CSV bodies**, with 36 byte-identical copies reused across archives.
+Independent CSV comparisons cover every date, clock and MW value in those 40
+bodies: **499,446 decoded records and 40,418,046 generation values**. These counts
+retain overlapping source data; they are not unique market observations.
+
+In `ERCOT_onshore_2011.CSV`, the first table contains 2011 data while the adjacent
+offshore table contains 2013 data. The last six rows have an empty, shortened
+offshore block. The parser retains 8,760 onshore and 8,754 offshore records with
+their respective dates. Single-table files can also extend beyond filename years:
+the 2016 wind files begin December 31, 2015 at 18:00 and end December 31, 2016 at
+23:00. Clocks are retained without an inferred UTC conversion.
+
+Both 2020–2021 hypothetical-solar workbooks were compared completely, covering
+**35,088 hourly records and 5,228,112 generation values** across 149 sites per
+workbook. All embedded site metadata was checked, including `SINGLE`/`DUAL`
+tracking, 50 MW capacities, counties, CDR zones and hypothetical plant status.
+The reader now exposes the original `Tracking` field as `site.tracking`.
+
+Original file/member hashes, archive overlap and comparison scope are recorded
+in `tools/inputs/generation-profiles/formats/evidence.json` and
+`legacy-wind-members.csv`. Regression tests use the original 2015 wind ZIP,
+a complete original compound-table CSV member and the unchanged dual-axis
+workbook. Fixtures are excluded from the installed wheel.
+
+The two older wind-shape workbook layouts are also supported. Complete original
+workbook comparisons cover **131,496 records / 12,229,128 values / 93 sites**
+for existing sites and **131,472 records / 17,485,776 values / 133 sites** for
+hypothetical sites. Existing-site records run from December 31, 1996 at 19:00
+through January 1, 2012 at 18:00; hypothetical records run from January 1, 1997
+at 00:00 through December 31, 2011 at 23:00. Source boundaries are preserved.
+
+Numeric site IDs, separate calendar columns, AWS names, annual energy and
+capacity factors, and raw hypothetical summaries remain typed. The generic
+`Sum` field is preserved without inferring its unit. Empty sheets and formatting
+rows are ignored. [Comparison receipts](../tools/inputs/generation-profiles/legacy-workbooks/evidence.json)
+record original URLs, hashes, reader versions and scope. Regression tests use
+clearly labelled source-cell excerpts; the two original workbooks, each over
+100 MB, are kept out of the repository and installed package.
+
+Remaining profile formats include the earliest solar shapes, whose columns
+include weather years and `TMY3`.
+Those solar shapes require separate treatment of units and non-calendar-year
+values. Fifteen of the nineteen newer profile workbooks remain unverified.
+
+
+### Backfill startup on real-time settlement prices
+
+Unbounded `backfill()` streams bundles before requesting the archive listing,
+then pages through uncovered archives. Publication-bounded reads still select
+archive IDs first. Both paths retain document-ID deduplication and distinct
+corrections; row order remains source order.
+
+A live NP6-905-CD check returned the first 1,000 rows after one bundle-listing
+request and one bundle download, with **zero archive requests**. All seven
+fields matched an independent CSV parser of the downloaded source. The first
+row arrived in 11.757 seconds in that run; this is an observation, not a latency
+guarantee. The [receipt](../tools/inputs/history/backfill-first-rows-evidence.json)
+records the source and decoder hashes and request paths. This startup check
+does not establish complete real-time price history coverage.
+
+
+## Public peak-demand forecast scenarios
+
+`Client.peak_demand_forecasts` covers all **11 XLS/XLSX peak-demand scenario
+workbooks** linked from the live [load forecast index](https://www.ercot.com/gridinfo/load/forecast)
+and its annual pages at the September 8, 2026 check. The 155 forecast-year rows
+include **2,276 weather-scenario MW values**, **286 summary values** and **150
+unlabelled auxiliary values**. Target years span 2014–2033 and weather scenarios
+span 2002–2023 across vintages; these are not issue-date or actual-load bounds.
+
+Regression tests compare complete original workbook tables using separately
+recorded source row coordinates, including every numeric cell on forecast rows.
+They cover old XLS headers and P50/P90 labels, gross/net/rooftop-PV blocks,
+2024 large-load summaries and the 2025 TSP/adjusted sheets. The 2023 rooftop-PV
+table starts at source year 2022 despite the gross/net tables starting at 2023;
+that difference is retained. Its unlabelled auxiliary cells have source-column
+keys without invented units. Excel's Compatibility Report is not forecast data.
+
+[Source manifests and receipts](../tools/inputs/peak-forecasts/evidence.json)
+record the comparison scope. All 11 unchanged original workbooks (268,611 bytes
+before fixture compression) and captured index pages are retained under
+`tools/inputs/peak-forecasts/` for offline tests and excluded from the wheel.
+Source URLs distinguish identically named files in different publication paths.
+Monthly, seasonal and weekly peak workbooks use separate readers below.
+The main hourly long-term forecast workbooks and regional weather-year scenarios
+are covered below; performance workbooks remain a known coverage gap.
+
+
+## Public monthly peak-demand and energy forecasts
+
+`Client.monthly_load_forecasts` discovers all **11 linked monthly XLS/XLSX
+workbooks** from the public forecast index and its annual pages at the September
+8, 2026 check. The reader returns **1,705 source rows and 3,408 numeric peak/energy
+values**, with source target years spanning 2014–2044 across publications.
+These bounds are not actual-load dates or publication/retention dates.
+
+Tests compare every year/month/peak/energy cell using independently recorded
+source coordinates in complete original workbooks. They retain both side-by-side
+2025 scenarios: 240 ERCOT-adjusted rows and 241 TSP rows. The first TSP value pair
+has no date, and the final December 2044 pair has blank values. The source's
+apparent date/value offset is not repaired. All 481 rows in this workbook keep
+unknown units because its column headings omit units. Earlier explicit MW/MWh
+labels are represented in the unit fields. The 2024 large-load/4CP assumption
+note remains available with each row.
+
+[Comparison evidence](../tools/inputs/monthly-forecasts/evidence.json) and source
+manifests accompany the 11 unchanged original files (264,087 bytes before fixture
+compression). Tests reuse the peak-forecast index captures and verify discovery,
+source-file predicates and both readers after their shared discovery refactor.
+These fixtures are excluded from the installed wheel.
+
+
+## Seasonal and weekly weather-zone peak tables
+
+The September 8, 2026 live discovery matched **22 seasonal workbooks and two
+weekly workbooks** in the [public load-forecast indexes](https://www.ercot.com/gridinfo/load/forecast).
+Complete original-source comparisons cover **615 seasonal rows / 5,535 peak
+values**, including 352 forecast and 263 historical rows, plus **263 weekly
+forecast rows / 2,367 peak values**. Values include eight weather zones and the
+independently published total. Counts retain overlapping source publications.
+
+Historical year labels span 2002–2022 across vintages; seasonal target periods
+span 2014–2033. Weekly begin dates span August 18, 2024–August 8, 2027 and their
+end dates extend through August 14, 2027. These are source period labels, not
+publication dates or evidence of uninterrupted unique observations.
+
+Tests address every source date/year/period/hour and zone/total cell using
+recorded table coordinates. They cover regional column reordering, historical
+sections with misleading `Forecast Year` headers, separate gross/net/PV blocks,
+parallel coincident/non-coincident tables, TSP/adjusted scenarios and winter
+periods. Live download-title percentile labels are applied before filtering,
+including the 2022 P90 workbook that omits that label inside the tables; saved
+workbook reads leave such a percentile unknown. Historical rows retain no
+forecast percentile. Original numeric totals and declared units are preserved.
+
+[Evidence and manifests](../tools/inputs/zonal-peaks/evidence.json) accompany
+24 unchanged original workbooks (560,216 bytes before fixture compression).
+Tests reuse the existing forecast-index captures. Fixtures remain outside the
+installed wheel. Hourly forecasts and forecast-performance workbooks remain
+separate implementation gaps.
+
+## Public hourly long-term load forecasts
+
+`Client.hourly_load_forecasts` discovers the six main hourly forecast workbooks
+on the public forecast index and its annual pages at the September 8, 2026 check.
+Complete original-source comparisons cover **701,294 rows and 32,084,130 numeric
+load-component values**:
+
+| Publication | Source target dates | Rows | Numeric values |
+| --- | --- | ---: | ---: |
+| 2021 | 2021-01-01–2030-12-31 | 87,648 | 788,832 |
+| 2022 | 2022-01-01–2031-12-31 | 87,664 | 2,366,640 |
+| 2023 | 2023-01-01–2032-12-31 | 87,670 | 2,366,874 |
+| 2024 | 2024-01-01–2033-12-31 | 87,672 | 5,874,024 |
+| 2025 TSP provided | 2025-01-01–2044-12-31 | 175,320 | 10,168,560 |
+| 2025 ERCOT adjusted | 2025-01-01–2044-12-31 | 175,320 | 10,519,200 |
+
+These are overlapping planning vintages, not counts or bounds of actual demand.
+All eight weather zones and published ERCOT totals have concrete typed fields.
+Gross/base/net load, rooftop PV, EVs, flexible loads, contracts and officer-letter
+loads remain separate. The 2024 flexible-load contract/officer-letter columns
+are also distinct from the corresponding general load additions. Missing totals
+and regions remain `None`, and negative source PV values are retained.
+
+The originals contain 33 differences between the separate Date column and the
+year/month/day columns, plus repeated hour labels and 23-/25-row dates.
+`forecastDate` follows year/month/day; `sourceDate` keeps the separate Date value.
+No hours are inserted, removed or timezone-adjusted. The 2022 workbook has
+87,664 rows and the 2023 workbook has 87,670, despite different calendar lengths;
+neither is reshaped to a conventional hourly grid. Formatted trailing blank rows
+in the 2024 sheet are not data. The 2023 merged MW header establishes units for
+all its numeric columns; the other five workbooks omit that explicit unit label.
+
+Calamine is an optional `files` dependency, used locally by this reader for XLSX
+and XLSB. Independent complete comparisons used openpyxl and pyxlsb respectively.
+Offline tests use original row excerpts, retained binary/XML cell records,
+independently extracted expected values, and the existing public index snapshots.
+[Evidence and source manifests](../tools/inputs/hourly-forecasts/evidence.json)
+distinguish full-source verification from the smaller offline fixtures. Fixtures
+are excluded from the installed wheel.
+
+The eight separate weather-year regional scenario files are covered below. The
+winter reliability-standard forecast and forecast-performance families remain
+additional gaps.
+
+## Regional hourly weather-year scenarios
+
+`Client.hourly_load_scenarios` discovers all eight files in the public
+[2025 weather-year forecast index](https://www.ercot.com/gridinfo/load/forecast/2025).
+The September 8, 2026 complete-source check covers **771,233 regional
+hourly rows**, **34,704,958 numeric weather-year predictions**
+and **3,566,972 numeric adjustment values**. Every source hour
+has 45 labelled predictions for historical weather years 1980–2024. Forecast
+dates span 2025-01-01 through 2035-12-31; these are scenario target dates, not
+observed loads from the historical weather years.
+
+| Region | Source hourly rows | Repeated hour labels |
+| --- | ---: | ---: |
+| Coast | 96,408 | 11 |
+| East | 96,397 | 0 |
+| Far West | 96,408 | 11 |
+| North Central | 96,408 | 11 |
+| North | 96,408 | 11 |
+| South Central | 96,408 | 11 |
+| South | 96,398 | 11 |
+| West | 96,398 | 11 |
+
+Calendar fields follow named columns, including North's Day/Hour/year/month/date
+order. South and West have no separate Date column. South Central has no wzone
+column, so its worksheet supplies the source zone; it also puts PV before EV.
+West also contains 515 blank prediction cells, returned as None without a marker.
+East, South and West publish no flexible-load adjustment column. Missing
+components remain None, and the source EV/PV/flexible/contract/officer-letter
+adjustments are preserved separately from each prediction.
+
+South contains seven `#REF!` errors and five literal dot markers in `Pred_2017`.
+For example, source row 27984 contains `#REF!`
+(2028-03-12 hour 3). The typed numeric value is None, with that error label
+in `sourceMarkers`; a blank value has no error marker. This real source cell
+and all eleven other marker rows are retained in a regression fixture. The reader uses the shared streaming
+XLSX reader, which preserves spreadsheet errors. Units are unlabelled in these
+workbooks, and no timezone, DST flag or net-demand interpretation is inferred.
+
+All numeric cells, clock values, errors, zone labels and original row positions
+were compared against original worksheets using separately specified source
+coordinates. The smaller offline fixtures retain original XML row excerpts,
+with expected cells captured separately. [Evidence and manifests](../tools/inputs/load-scenarios/evidence.json)
+distinguish these two verification scopes. Fixtures are excluded from the wheel.
+
+## Separate ESR API
+
+`ESRClient` adds the generated `rptesr_m._4_sec_esr_charging_mw` query, its sync
+and async iterators, and `_4_sec_esr_charging_mw_history`. The September 8, 2026
+service inventory contains eight operations: one row query and seven shared
+metadata/listing/download operations. These are additional to the 242 Public
+Reports queries, 249 Public Reports operations, and 289 Public Reports history
+tables. The offline generator reads normalized ESR operations, live response
+fields and the CSV mapping under `tools/inputs/esr`.
+
+The service reported 4,087,281 query rows, 54,490 archive documents and zero
+bundles. The oldest and newest query rows observed were May 29, 2025 20:20:00
+and December 4, 2025 23:54:58 CPT; the oldest/newest archive postings were
+May 29, 2025 20:27:53 and December 4, 2025 23:55:10. These are observed bounds,
+not uninterrupted coverage or current operational freshness. Product metadata's
+`lastPostDatetime` is later than the newest returned archive and is not used to
+claim a later data boundary.
+
+The complete oldest, middle and newest archived CSV samples contain 225 rows.
+All five fields match independent CSV parsing, live paginated typed queries,
+archive downloads and bounded publications. Live sync/async paging and all 13
+query parameters were exercised. CSV `N` flags decode to false; local and UTC
+timestamps retain their separate source values, without inferred timezone
+offsets. The original nested ZIPs and API fixtures are used in regression tests.
+The shared transport normalizes ESR metadata identifiers through aliases while
+selecting the ESR base URL and separate subscription key. No bundles were
+available to verify a live bundle download, and intervening archives have not
+all been compared. [Verification receipt](../tools/inputs/esr/evidence.json).
+
+## Hourly forecast-performance workbooks
+
+`Client.load_forecast_performance` discovers all 48 currently linked hourly
+metric workbooks from the load-forecast index and its annual pages. The two
+2026 files have misleading Backcast link titles, so discovery also checks their
+actual Metrics filenames. The separate monthly Forecast/Backcast workbooks
+are not claimed by this reader.
+
+Complete source-cell comparisons cover **316,123 hourly/calculation rows**,
+**21,150 summary rows**, and **4,412,079 numeric values** in the 48 original
+files (73,656,757 bytes). Of the hourly/calculation rows, 315,668 have a timestamp;
+source timestamps range from February 1, 2022 01:00 through March 1, 2026 00:00.
+These are source records, not unique observations or proof of uninterrupted
+history. ERCOT and all eight weather zones retain their separate series.
+
+The hourly reader preserves original actual/selected/model-code values and
+published errors. Summaries distinguish average errors, frequency counts and
+monthly MAPE, including the older layout's vertically stacked chart tables.
+Duplicate pivot/helper tables are not added as extra market observations.
+Six regression fixtures retain original sample and error cells from both
+layouts, including the December 2023 negative/fractional Hour values and
+calculation-only tails. Source Hour numbers remain `sourceHour`; valid whole
+1–24 values additionally populate `hour`. Missing actuals remain missing.
+
+The 924 preserved markers include Excel errors such as `#DIV/0!` and
+zero/time-only secondary clocks. Timestamps, row locations and publication-file
+identity remain separate from summary buckets; no issuance time or timezone is
+inferred. All values retain their published scale. The November 2025 source's
+hourly MAPE formula multiplies absolute relative error by 100, and its Monthly
+cell averages that MAPE column; the reader preserves cached values rather than
+recomputing them. [Complete comparison receipt](../tools/inputs/forecast-performance/evidence.json)
+and [regression source coordinates](../tools/inputs/forecast-performance/samples.json).
+
+## Monthly forecast-performance tables
+
+`Client.monthly_forecast_performance` reads all 15 linked monthly Forecast/Backcast
+workbooks. Live discovery matches the captured index, and fresh downloads of
+all 15 originals match the committed fixture hashes byte for byte. The two
+hourly Metrics files misleadingly linked as Backcast are handled by the
+separate hourly reader.
+
+Every monthly table cell was compared across the complete originals:
+**3,330 records**, including **3,255 numeric values** and 75 blank future
+values. Each file contains 125 forecast/target records, 72 year/month Backcast
+records and 25 rolling Day-Ahead Backcast records. Source month labels span
+January 2020–December 2026; the latest nonempty month is August 2026. Those
+counts include overlapping tables and publication vintages, not unique months.
+
+The 2,250 explicitly percentage-formatted values support a typed `percent`
+conversion. Unlabelled Backcast scales remain raw `value` numbers with
+`percent=None`. Original Excel date days, formats, source series, notes and
+coordinates are retained. Calendar months are normalized separately, and
+Goal/Stretch targets are distinct from forecast/backcast errors.
+
+The complete source fixtures total 522,853 bytes before outer ZIP compression.
+Tests compare all monthly values, labels, date pairs and number formats, plus
+discovery, source metadata, scale handling and blank future values. Charts,
+external chart references, an empty Average label, and two unlabelled diagnostic
+error cells outside the monthly tables are not interpreted as additional
+observations. [Verification receipt](../tools/inputs/monthly-performance/evidence.json).
+
+
+### Anonymous dated market displays
+
+Five HTML routes now have typed `client.dashboards` methods: `dam_spp`,
+`real_time_spp`, `dam_mcpc`, `actual_loads_of_forecast_zones` and
+`actual_loads_of_weather_zones`. Optional operating dates select ERCOT's
+`YYYYMMDD_` URLs. Headers determine the finite typed series keys; values remain
+Decimals, and operating days must agree with both the requested day and the
+page heading. Literal period labels retain leading zeroes and repeated-hour
+markers. No display time is assigned an inferred UTC offset.
+
+Fixtures preserve 23 complete original HTML responses. All table cells are
+compared independently in tests. Live dated comparisons verified 6,268 numeric
+values across 13 nonempty displays plus two DAM responses correctly rejected
+for a different day and missing market table. This includes 100/92 RT intervals
+and 25/23 load hours on fall-back/spring-forward days. DAM spring-forward files
+contain 23 hours. Both November 2025 DAM URLs instead returned an unavailable
+market message for November 3; no coverage is claimed for those missing prices.
+Three older sampled dates (2010-12-01, 2014-05-01, 2020-01-01) returned 404 for
+all five routes. These observations establish neither earliest retention nor
+continuous coverage. See `tools/inputs/market-displays/evidence.json`.
+
+
+### Demand dashboard before day-ahead publication
+
+The September 8, 2026 afternoon `system-wide-demand.json` response omitted
+`dayAheadForecast` and `dayAheadHsl` from all 24 next-day hours. These values
+are now optional typed decimals. The rest of the response remains available,
+including the current day's actual load and next day's current load forecast.
+Original pre-publication and published-response regression fixtures compare all
+five demand/capacity series, clocks and flags. The 217 chart points in the current
+and previous-day Load Forecast vs. Actual HTML matched the existing typed JSON
+series after rounding to whole MW (ties to even). This checks those two snapshots,
+not historical publication timing. See `tools/inputs/dashboards/demand-availability-evidence.json`.
+
+The combined wind/solar dashboard has the same publication boundary: all six
+next-day day-ahead fields were explicitly null in 24 rows (144 values). Their
+types now admit `None`; full original pre-publication and published captures
+verify that current forecasts and observed zero generation remain intact.
+
+
+### Unavailable public LMP changes
+
+A September 8, 2026 public LMP snapshot contained `-` in the five-minute LMP
+change column for APPALOSA_ALL, HB_NORTH and MIDP_SLR_RN. `lmpChange` now admits
+`None` for this marker, so all 1,123 settlement-point rows remain accessible.
+Prices and the changes including adders remain exactly as published. The complete
+original HTML is compressed in the regression fixture; every displayed field is
+compared, with separate cases for negative changes, zero and unrecognized text.
+
+
+### Complete retained wind backfill
+
+The September 8, 2026 unbounded `np4_732_cd.wpp_hrly_avrg_actl_fcast_history`
+backfill compared **21,676,139 rows across 108,275 original publications**, using
+102 monthly bundles and 34 archive download batches. All 35 typed fields in every
+row matched independent stdlib CSV/date/Decimal decoding, including missing
+fields. A separate recursive source-file pass checked every original hash and
+row count; all listed archive IDs were represented. A fresh listing bounded by
+the captured latest publication matched the count and both endpoints. No wind
+runtime or generated-reader changes were needed.
+
+The retained archive postings run from May 1, 2014 at 00:32:32.026 through
+September 8, 2026 at 12:55:12. These are source publication times with no supplied
+UTC offset. The report-period fields have separate bounds:
+
+| Source period field | First | Last |
+| --- | --- | --- |
+| `hourEndingTimestamp` | April 29, 2014 01:00 | February 8, 2015 10:00 |
+| `hourBeginningTimestamp` | February 4, 2015 12:00 | June 30, 2016 09:00 |
+| `deliveryDate` | June 21, 2016 | September 15, 2026 |
+
+Five layouts preserve their distinct generation/actual fields, combined versus
+separate regional series, and beginning/ending clocks. Rows include overlapping
+forecast vintages; the count is not a count of distinct observed hours, and
+September 15 is a forecast horizon, not future actual generation. The check does
+not establish uninterrupted actual-hour coverage, earlier ERCOT holdings, or an
+atomic snapshot against retroactive listing changes. Use `publications()` to
+retain archive posting metadata when evaluating forecasts as issued.
+
+[Full comparison and source-accounting receipt](../tools/inputs/history/wind-backfill-evidence.json)
+records the row-model fields, layouts, reader hashes, manifest hashes, listing
+recheck and limits. Source downloads remain outside the installed package.
diff --git a/docs/market-data.md b/docs/market-data.md
new file mode 100644
index 00000000..83f44450
--- /dev/null
+++ b/docs/market-data.md
@@ -0,0 +1,174 @@
+# Choosing market data
+
+Start with the dataset that matches the decision or target you are modeling.
+Scope is public data for pricing, dispatch, hedging, load forecasting, settlement,
+and resource planning. Compliance-only legacy summaries and narrative documents
+are outside that scope. Older market observations remain useful historical data.
+
+All paths below are relative to a `Client()` named `ercot`. Each history reader
+returns concrete Pydantic rows and supports `read`, `rows`, and `backfill`.
+
+| Data | Typed history reader | Preserve when using it |
+| --- | --- | --- |
+| DAM settlement prices | `np4_190_cd.dam_stlmnt_pnt_prices_history` | Settlement point, hour ending, DST flag |
+| RT settlement prices | `np6_905_cd.spp_node_zone_hub_history` | Point type, delivery hour and interval, DST flag |
+| SCED settlement-point LMPs | `np6_788_cd.lmp_node_zone_hub_history` | SCED timestamp and original price fields |
+| RTD indicative LMPs | `np6_970_cd.rtd_lmp_node_zone_hub_history` | Run timestamp and forecast interval |
+| SCED price adders | `np6_323_cd.rt_price_adder_sced_history` | Legacy ORDC and newer reliability-adder fields separately |
+| DAM ancillary-service prices | `np4_188_cd.dam_clear_price_for_cap_history` | Service type, hour ending, DST flag |
+| RT ancillary-service prices | `np6_795_er.clearing_prices_history` / `np6_796_er.clearing_prices_history` | SCED and settlement intervals separately; capped/uncapped fields where supplied |
+| Actual weather-zone load | `np6_345_cd.act_sys_load_by_wzn_history` | Operating day, hour ending, eight weather zones and system total |
+| Seven-day weather-zone load forecasts | `np3_561_cd._7d_load_fcast_by_wzn_history` | Original publication plus target delivery date/hour |
+| Regional wind actuals and forecasts | `np4_742_cd.wpp_hrly_actual_fcast_geo_history` | Region, forecast horizon, source timestamps |
+| Regional solar actuals and forecasts | `np4_745_cd.spp_hrly_actual_fcast_geo_history` | Region, forecast horizon, source timestamps |
+| Hourly outage capacity | `np3_233_cd.hourly_res_outage_cap_history` | Published totals and regions; older files may lack regions |
+| Binding-constraint shadow prices | `np6_86_cd.shdw_prices_bnd_trns_const_history` | Constraint identity and SCED timestamp |
+| DAM resource awards and offers | `np3_966_er._60_dam_gen_res_data_history` | Resource, delivery interval, original ancillary-service categories |
+| SCED battery disclosures | `np3_965_er._60d_sced_esr_data_history` | Disclosure lag, resource identity, original interval |
+| Public resource ownership | `np3_988_er.resources_history` | Published ownership/reference information and vintage |
+
+For recent row-query data, remove `_history` and append `_iter` to stream every
+page. Archive-only products, including the RT AS workbook readers and ownership
+reference data above, have no corresponding row-query method. The generator does
+not invent endpoints for them. XLS/XLSX history requires the `files` extra.
+
+## Common workflows
+
+**Retail exposure:** start with DAM/RT prices at the relevant settlement point,
+actual load and forecasts, then add public `load_profiles`, `coincident_peaks`,
+and `loss_factors` where applicable. Public system and profile data do not supply
+a retailer's private customer interval loads or contracts. Weather zones and
+settlement load zones are different geographies.
+
+**Battery analysis:** combine settlement prices, ancillary-service prices,
+constraints, outages, and renewable/load forecasts. Use the public
+`dashboards.sced_capacity()`, `dashboards.ancillary_capacity()`, and
+`dashboards.energy_storage()` snapshots for their published operating context.
+Aggregate system data do not establish an individual battery's feasible dispatch.
+The public SCED ESR disclosure is part of Public Reports; it is distinct from
+the separate ESR API, now available through `ESRClient`; see the
+[ESR workflow](usage.md#energy-storage-four-second-data). Its verified latest
+record is from December 2025, so check source freshness before operational use.
+
+For published forecast-error analysis, `load_forecast_performance` supplies
+actual/selected hourly series and separate error summaries for ERCOT and the
+eight weather zones. See the [performance workflow](usage.md#hourly-load-forecast-performance);
+these workbooks do not establish original forecast issue times.
+`monthly_forecast_performance` adds the published monthly horizon errors,
+backcasts and targets through its [monthly workflow](usage.md#monthly-forecast-and-backcast-performance).
+
+**Trading and forecasting:** preserve publication metadata for forecasts,
+resource reports, and delayed disclosures. `history.publications()` keeps each
+original archive `Document` beside its typed rows. Select information available
+by the decision time before evaluating it against later realized outcomes.
+Settlement prices, SCED LMPs, RTD indicative prices, and separate adders are
+separate series; adding an adder to a series that already includes it double-counts it.
+
+## How much history is verified?
+
+The September 2026 checks establish different levels of evidence:
+
+| Dataset | Verified historical extent | Evidence level |
+| --- | --- | --- |
+| DAM settlement prices | May 2, 2014–September 8, 2026; 81,236,426 rows, 1,230 observed points | Every field compared across retained archives and bundles; a point need not exist throughout the range |
+| DAM ancillary-service prices | May 2, 2014–September 8, 2026; 461,736 rows | Every field compared across retained archives and bundles; ECRS begins June 10, 2023 |
+| Actual weather-zone load | April 30, 2014–September 6, 2026; 108,285 rows | Every field compared; December 4, 2025 and three older hour-ending-24 observations are absent |
+| Wind actuals and forecasts | Reported period fields span April 29, 2014–September 15, 2026; 21,676,139 report rows | Every field compared across all enumerated archives and bundles; overlapping vintages and future forecast periods are included |
+| RT settlement prices, SCED constraints, hourly outage capacity | Earliest archive posting observed May 1, 2014 | Listing bounds and sampled layouts; complete intervening rows have not been compared |
+| Solar actuals/forecasts | Earliest archive posting observed February 10, 2016 | Listing bounds and sampled layouts |
+| Weather-zone load forecasts | Earliest archive posting observed January 1, 2019 | Oldest forecast decoded with original publication metadata; bundles cover a shorter period |
+| RT ancillary-service prices | Earliest archive posting observed December 5, 2025 | Listing bounds and sampled workbook layouts |
+
+An additional complete-file check decoded 28,881,274 rows in 221 distinct intermediate
+and annual samples across disclosure, offer-curve, and forecast readers. It checks
+decoding and source row counts, not every retained publication or independent
+numerical values. The [receipt](../tools/inputs/history/intermediate-full-file-evidence.json)
+and [per-file manifest](../tools/inputs/history/intermediate-full-files.csv) record
+its scope and decoder version.
+
+The [complete wind comparison](../tools/inputs/history/wind-backfill-evidence.json)
+covers 108,275 original publications and all five retained layouts. Independent
+source-file accounting and a fresh publication-bounded listing check agree with
+the backfill. Its forecast periods extend beyond the retrieval day; this is not
+a claim of future actual generation or continuous hourly observations.
+
+These are recorded checks, not promises of permanent ERCOT retention. Publication
+boundaries are not delivery-date boundaries. The [source coverage notes](data-coverage.md)
+and [full usage reference](usage.md) link the receipts, layout variants, and gaps.
+
+## Retrieve the widest history
+
+From the repository, export one settlement point using both retained sources:
+
+```sh
+uv run python -m examples.price_history dam --point HB_HOUSTON --output dam-history.jsonl
+uv run python -m examples.price_history rt --point LZ_HOUSTON --output rt-history.jsonl
+```
+
+The export uses unbounded `backfill()`, so it includes bundle-only publications
+and archives older than the bundles. Optional `--date-from` and `--date-to`
+filter **delivery dates after download**; they do not reduce source downloads.
+Unbounded backfills return bundle rows before fetching archive listings;
+they then stream the uncovered archives. Large histories still take time.
+For bounded recent data use the
+[market-day example](../examples/README.md#prices-and-load-for-an-operating-day).
+
+Output keeps original fields, decimal precision, nulls, and DST flags. It is not
+sorted; distinct correction publications remain separate. Do not treat the
+number of returned rows as a count of unique operating intervals. For
+publication-aware exports, use the forecast-vintage example instead.
+
+## Weather and fleet scenarios
+
+[Modeled generation profiles](usage.md#modeled-wind-and-solar-generation-profiles)
+provide typed wind and solar planning series, with verified samples extending
+back to 1980. Use them for resource and fleet scenarios. They describe modeled
+plants under reconstructed weather, rather than the observed historical fleet;
+they must not be treated as historical forecasts in a trading backtest.
+
+For longer-term demand and scarcity scenarios, `peak_demand_forecasts.rows()`
+returns typed summer peak forecasts under historical weather years, with original
+source-file metadata. It keeps gross/net demand, rooftop-PV impact, large-load
+assumptions and TSP/adjusted scenarios separate. See the
+[forecast workflow](usage.md#long-term-peak-demand-forecasts). These are planning
+forecasts, not realized hourly demand. `monthly_load_forecasts.rows()` adds
+monthly peak/energy values with source dates, declared units and publication
+metadata; see the [monthly forecast workflow](usage.md#monthly-peak-demand-and-energy-forecasts)
+for the 2025 source date/value ambiguity. Seasonal and weekly weather-zone
+peaks are available through `seasonal_peak_forecasts` and `weekly_peak_forecasts`.
+Their [workflow](usage.md#seasonal-and-weekly-weather-zone-peaks) keeps historical
+sections, coincident/non-coincident peaks and forecast percentiles distinct.
+`hourly_load_forecasts` adds hourly regional load components from the 2021–2025
+publications, including both 2025 TSP and adjusted scenarios through target year
+2044. The [hourly workflow](usage.md#hourly-long-term-load-forecasts) preserves
+separate gross/net/PV/EV and large-load values, original hours and date discrepancies.
+For regional weather exposure, `hourly_load_scenarios` adds all eight weather zones
+with 45 weather-year predictions per source hour. The
+[scenario workflow](usage.md#hourly-weather-year-load-scenarios) keeps predictions
+and adjustment components separate, with source target dates through 2035.
+
+Anonymous market displays support dated DAM/RT hub/load-zone prices, DAM
+ancillary-service prices, and actual load by forecast or weather zone through
+`client.dashboards`. They preserve source interval labels, including DST markers.
+These public website snapshots supplement the authenticated archive; their
+retention is not a substitute for a complete historical backfill.
+
+## Current limits
+
+All 242 report queries in the verified Public Reports inventory have typed
+methods, and all their report tables have history readers. That does not prove
+that every intermediate historical file format is supported or every public
+website dataset has been decoded. Remaining website coverage includes the
+winter reliability-standard hourly forecast. Further historical layout verification is also
+needed for core market products. Broad legacy document extraction is deferred
+while market-data coverage and usability take priority.
+MIS remains excluded. In particular, ERCOT separately
+lists [annual DAM hub/load-zone prices](https://www.ercot.com/mp/data-products/data-product-details?id=NP4-180-ER),
+[annual RTM hub/load-zone prices](https://www.ercot.com/mp/data-products/data-product-details?id=NP6-785-ER),
+and [annual DAM ancillary-service prices](https://www.ercot.com/mp/data-products/data-product-details?id=NP4-181-ER)
+through ICE/MIS listings. The captured product pages advertise no direct-file
+alternative. Those sources are not queried by this client's Public Reports
+backfills, and their earliest available years have not been established here.
+The 2014 API archive bounds above therefore do not establish the earliest price
+history ERCOT holds. Existing specialized readers are documented in the usage
+reference.
diff --git a/docs/usage.md b/docs/usage.md
new file mode 100644
index 00000000..849a1497
--- /dev/null
+++ b/docs/usage.md
@@ -0,0 +1,1521 @@
+# Usage reference
+
+A small, fully typed ERCOT market-data client for retailers, battery operators,
+and energy traders.
+
+**Development status:** all 242 Public Reports endpoints have typed methods and captured-response tests. The separate ESR API has one generated query and a typed archive reader through `ESRClient`. MIS is not included.
+
+The live inventory check matched all 249 published HTTP operations: 242 generated
+report queries and seven shared operations. All 5,973 query-parameter definitions
+matched the saved inputs, and all four generated query variants expose the
+expected named parameters and types. The live catalog lists the same 242 report
+paths. See `tools/inputs/live-inventory-evidence.json` for the check date and
+scope; endpoint coverage does not establish every historical file layout.
+
+The SDK focuses on operational and market time series: prices and settlements,
+ancillary services, load and generation, forecasts, outages, constraints, offers,
+and awards. Typed archive and monthly-bundle readers support historical analysis.
+Direct public load, retail load-profile and fuel-mix files extend the available time series. Planning
+studies and document-specific summary extraction are outside the release scope.
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ prices = ercot.np4_190_cd.dam_stlmnt_pnt_prices_iter(
+ deliveryDateFrom=date(2026, 1, 1),
+ deliveryDateTo=date(2026, 1, 2),
+ settlementPoint="HB_HOUSTON",
+ )
+ for price in prices:
+ print(price.deliveryDate, price.settlementPointPrice)
+```
+
+Pass `username`, `password`, and `subscription_key` to `Client`, or set
+`ERCOT_USERNAME`, `ERCOT_PASSWORD`, and `ERCOT_SUBSCRIPTION_KEY`.
+Authentication is lazy; the client refreshes tokens and retries transient failures.
+
+Runnable [market-data examples](../examples/README.md) export a day of settlement
+prices, ancillary-service prices and actual load, or historical forecasts with
+original publication metadata:
+
+```sh
+uv run python -m examples.market_day 2026-09-01 --point HB_HOUSTON --output market-data
+uv run python -m examples.forecast_vintages 2019-01-01T00:30 2019-01-01T00:30 --output forecast-vintages.jsonl
+```
+
+Each product exposes generated methods with named, typed filters and Pydantic row
+models. A method returns one `Page[Row]`; its `_iter` variant streams all pages.
+`_async` and `_iter_async` provide asynchronous access. Date and decimal values
+retain their Python types. Nullable source cells are represented by `None`.
+
+```python
+from pathlib import Path
+from tinyercot import Client
+
+with Client() as ercot:
+ products = ercot.products()
+ history = ercot.archives("np4-190-cd")
+ document = history.archives[0]
+ Path("prices.zip").write_bytes(ercot.download("np4-190-cd", [document.docId]))
+
+ bundles = ercot.bundles("np4-190-cd")
+ Path("monthly.zip").write_bytes(
+ ercot.download("np4-190-cd", [bundles.bundles[0].docId], kind="bundle")
+ )
+```
+
+Archive and bundle listings expose typed metadata. Downloads return the original
+ZIP bytes. For decoded data, generated `_history` readers cover 289 tables across
+113 catalog products: all 242 report-query tables, 33 additional CSV tables,
+nine workbook products and five PDF readers. The same readers support individual
+archives and monthly bundles.
+
+The other three captured catalog products returned empty archive and bundle
+listings, rechecked in the release audit. The examples and source evidence below
+describe the verified historical formats and periods; they do not establish
+gap-free coverage of every retained publication.
+
+```python
+from datetime import datetime
+
+with Client() as ercot:
+ history = ercot.np4_190_cd.dam_stlmnt_pnt_prices_history
+ for price in history.rows(
+ posted_from=datetime(2014, 5, 1),
+ posted_to=datetime(2014, 5, 1, 23, 59, 59),
+ where=lambda price: price.settlementPoint == "HB_HOUSTON",
+ ):
+ print(price.deliveryDate, price.settlementPointPrice)
+```
+
+For long backfills, combine monthly bundles with individual archives:
+
+```python
+with Client() as ercot:
+ for price in ercot.np4_190_cd.dam_stlmnt_pnt_prices_history.backfill(
+ posted_from=datetime(2018, 1, 1),
+ posted_to=datetime(2018, 12, 31, 23, 59, 59),
+ where=lambda price: price.settlementPoint == "HB_HOUSTON",
+ batch_size=25,
+ ):
+ print(price.deliveryDate, price.settlementPointPrice)
+```
+
+`backfill()` uses original document IDs inside bundles to avoid downloading the
+same publication again, then fetches uncovered archive IDs. Distinct correction
+IDs and repeated rows within a report remain intact; output is not sorted.
+Unbounded reads start with bundles before requesting archive listings, then
+stream uncovered archive IDs page by page. Publication-bounded reads first
+collect matching archive IDs. Both keep seen IDs in memory for deduplication
+and process bundle members one at a time.
+
+Shared disclosure reports can gain or lose tables over time. `backfill()` skips
+reports where the requested named table is absent but other CSV tables are
+present. It does not infer an introduction date. Empty ZIPs, non-CSV downloads,
+and errors inside selected tables still raise. Explicit `read()` and `download()`
+remain strict when their requested table is missing.
+
+With publication bounds, the archive listing selects the original reports;
+bundle timestamps only help choose candidate months. Reports missed by those
+bundles are still fetched from archives. Omit both bounds to include all listed
+archives **and bundle-only reports**, whose original posting metadata may no
+longer be available. Use `where` to filter their typed row dates. Unknown bundle
+member identities and unreadable selected data raise rather than silently omit
+history; `rows()` and `rows(kind="bundle")` remain available for separate sources.
+
+For forecast backtests, keep the publication metadata alongside the typed rows:
+
+```python
+with Client() as ercot:
+ forecasts = ercot.np3_561_cd._7d_load_fcast_by_wzn_history
+ for publication in forecasts.publications(
+ posted_from=datetime(2019, 1, 1),
+ posted_to=datetime(2019, 1, 1, 6),
+ ):
+ posted_at = publication.document.postDatetime
+ for forecast in publication.rows:
+ print(posted_at, forecast.deliveryDate, forecast.systemTotal)
+```
+
+`publications()` yields `Publication[Row]`: the original typed `Document`, its
+`kind`, and a lazy iterator of typed `rows`. Listing alone does not download the
+payload; consume rows while the client is open. Separate publications keep their
+identities even when their row values match. This also works for workbook/PDF
+history readers and with `kind="bundle"`. A bundle's posting time describes the
+bundle, **not** when its component forecasts were available. Embedded row fields
+remain unchanged: older forecast CSVs omit `postedDatetime`, so that field stays
+`None` while archive publication metadata is available separately.
+
+Publication timestamps are ERCOT local timestamps, and both bounds are inclusive.
+They select files by **publication date**, which can differ from the dates inside
+them. The predicate filters typed rows after download. With no publication bounds,
+`rows()` reads all listed archive documents. Publication bounds are sent to ERCOT to limit listing pages at the source.
+Matching documents are downloaded individually by default. Pass `batch_size=25`
+to `rows()` or `download()` to group requests. Batches are capped by the product
+metadata and the API ceiling of 1,000 files; larger batches use more memory.
+Monthly bundles are still retrieved individually. Large backfills can take considerable time.
+Corrections are preserved as published; rows are not deduplicated.
+
+`history.read(zip_bytes)` reads an existing download, including nested ZIPs.
+`history.download([doc_id])` downloads and decodes selected documents; pass
+`kind="bundle"` for monthly bundle IDs. `history.rows(kind="bundle")` paginates
+and decodes monthly bundles directly, with the same typed `where` predicate.
+Its publication bounds filter bundle timestamps locally; they do not restrict
+the dates of individual rows inside a bundle. For example:
+
+```python
+with Client() as ercot:
+ for row in ercot.np6_345_cd.act_sys_load_by_wzn_history.rows(
+ kind="bundle",
+ posted_from=datetime(2018, 1, 31),
+ posted_to=datetime(2018, 1, 31, 23, 59, 59),
+ ):
+ print(row.operatingDay, row.total)
+```
+
+The downloaded January 2018 load bundle contained 31 daily files and 744 hourly
+rows, covering operating dates December 31 through January 30. Bundle names and
+publication months are not delivery-date bounds. Mixed correction bundles are
+filtered by CSV member name; months without the selected correction subtype yield
+no rows. Unsupported selected tables still raise.
+
+Archive and bundle retention differ. In the recorded checks, DAM prices and
+system-load archives reached May 2014, while bundles began January 2018. RTD
+price-adder archives reached June 2014, while bundles began January 2019. The
+DAM-price, ESR Integration and event-trigger bundle listings lacked July 2026. The listed January 2018 DAM-price bundle returned HTTP 400 through POST,
+but its published GET download link succeeded. The client now tries that link
+when a single-bundle POST returns 400; all 473,256 price rows in its 31 files
+decoded, covering delivery dates January 2 through February 1, 2018.
+The December 2023 ESR Integration bundle decoded 26 daily PDF summaries.
+These point-in-time observations are recorded in
+`tools/inputs/history/bundle-evidence.json`. Neither listing alone proves continuous
+coverage. All 62 sampled January 2018 price/load bundle members carried the same
+original document IDs as their archive listings, and their complete per-report
+payload bytes matched. `backfill()` uses those IDs to combine sources. Filename
+timestamps differ from the listed posting times in 28 of these reports and are
+not used as publication keys. Live January 2018 backfills returned all 473,256
+DAM price rows and 744 load rows, matching the recorded archive row multisets
+with zero individual archive downloads. If both bundle download routes fail, the
+error propagates. Unsupported CSV layouts raise with the member name instead of silently
+dropping data.
+
+The September 2026 live listing audit found these earliest archive posting dates
+for key market products (these are publication boundaries, not proof of continuous
+row coverage):
+
+| Data | Earliest archive posting |
+| --- | --- |
+| DAM/RT settlement prices, DAM AS prices, actual load, wind, SCED constraints, hourly outage capacity | May 1, 2014 |
+| Solar actual/forecast | February 10, 2016 |
+| Weather-zone load forecasts | January 1, 2019 |
+| Unplanned resource outages | December 7, 2022 |
+| RT AS prices by settlement/SCED interval and indicative RT AS prices | December 5, 2025 |
+
+A full retained actual-load backfill (NP6-345-CD) returned **108,285 rows** from
+all 4,512 listed archive publications, combining 102 bundles with two archive
+batches. Every field matched an independent CSV comparison. Operating dates
+span April 30, 2014–September 6, 2026, with December 4, 2025 absent from both the
+files and the report query. Three older dates also lack hour ending 24:00:
+November 4, 2014; August 4, 2015; and March 15, 2016. These source gaps remain
+explicit; rows are not synthesized. See `tools/inputs/history/bundle-evidence.json`
+for the full-source check and adjacent-day query controls.
+
+A full DAM ancillary-price backfill (NP4-188-CD) returned **461,736 rows** from
+all 4,513 retained publications, spanning May 2, 2014–September 8, 2026. Every
+field matched independent CSV parsing. Each service had continuous dates and
+the expected daily count of unique hour/DST pairs within its observed range;
+ECRS first appeared on June 10, 2023. The full-source check is also recorded in
+`tools/inputs/history/bundle-evidence.json`.
+
+A full DAM settlement-price backfill (NP4-190-CD) matched **81,236,426 rows**
+across 1,230 settlement points, spanning May 2, 2014–September 8, 2026. It included
+all 4,513 listed archives and one additional publication found only in a monthly
+bundle. Every field matched independent CSV parsing. No delivery dates were
+missing across the product; each observed point/publication had the expected
+number of unique hour/DST pairs. This does not imply that each point existed
+throughout the range. The full-source receipt and decoder version are recorded
+in `tools/inputs/history/bundle-evidence.json`.
+
+Weather-zone load forecasts had only five listed bundles, starting March 2026,
+despite archives extending to 2019. Archive access therefore matters for complete
+backfills. The oldest retrieved load-forecast publication contained 192 rows and
+no embedded posting timestamps; `publications()` preserves its January 1, 2019
+00:30 archive timestamp separately. Counts, original listing entries and the live
+forecast check are recorded in `tools/inputs/history/market-availability.json`.
+
+Listing metadata includes the server's total and page counts; `iter_documents()` streams all listing pages.
+
+ERCOT's separate annual DAM/RTM hub-and-load-zone price products (NP4-180-ER,
+NP6-785-ER) and annual DAM ancillary-price product (NP4-181-ER) use MIS download
+routes on their current public pages. They are outside this release's **no MIS**
+scope; earlier annual price history is not provided by the daily API readers.
+The inspected routes are recorded in `tools/inputs/public-market-access-evidence.json`.
+
+### Historical zonal generation and load
+
+The older zonal-market MWh files are available with `tinyercot[files]`:
+
+```python
+from datetime import date
+
+with Client() as ercot:
+ for day in ercot.zonal_energy.rows(
+ date_from=date(2004, 1, 1),
+ date_to=date(2004, 1, 1),
+ where=lambda r: r.kind == "load" and r.zone == "H04",
+ ):
+ print(day.totalMWh, day.intervals[0].energyMWh)
+```
+
+`files()`, `download(file)` and `read(data, filename=..., kind=..., where=...)`
+support saved workbooks; bare unnamed files require `kind="load"` or
+`kind="generation"`. `totals()` and `read_totals()` return the published summary
+and detail totals separately, preserving their cached differences and shares.
+
+All ten 2001–2005 originals yield **13,886 zone/day records** and **88 totals**.
+2001 generation starts July 31, load August 1; 2005 generation is missing
+June 22–July 28 in all five zones. Original zone codes remain unchanged and are
+not mapped onto today's market. Numbered/clock interval labels have no inferred
+UTC offset; extended load rows retain all 100 values with unknown clock labels.
+`sourceNumbers` preserves numeric cells whose source headers do not establish
+their meaning, including extra generation numbers and a mislabeled `ORIGIN`
+column. These are kept separate from `energyMWh`. Totals are not reconciled,
+missing dates are not filled, and source timestamps are not publication times.
+
+### Historical four-coincident-peak allocations
+
+Annual 4CP allocations are available without credentials through
+`coincident_peaks`, using the optional `tinyercot[files]` dependencies:
+
+```python
+from tinyercot import Client
+
+with Client() as ercot:
+ for allocation in ercot.coincident_peaks.allocations(
+ year_from=2020,
+ year_to=2020,
+ entity="AEP TEXAS CENTRAL COMPANY (TDSP)",
+ ):
+ print(allocation.averageLoad, allocation.unit, allocation.loadRatioShare)
+ for peak in allocation.peaks:
+ print(peak.month, peak.timestamp, peak.load)
+```
+
+`download()` returns the original 1996–2020 ZIP; `read_allocations(data)` accepts
+saved ZIPs and workbooks with the same inclusive year and exact entity filters.
+The annual reader covers 4,345 rows across all 25 years. Revisions remain separate;
+`kind` distinguishes allocations, comparison tables and revision details. Source
+member, worksheet, section and notes retain their context. DUNS identifiers stay
+strings, including leading zeros. Loads retain their published kW/MW units, and
+`adjustmentUnit` distinguishes factors from percentages. Missing peak clocks
+remain `None`; the 1997 annual summary provides an average without monthly peak
+columns, so its `peaks` list is empty.
+
+`monthly(date_from=..., date_to=..., entity=...)` and `read_monthly(data, ...)`
+return typed monthly peak records, using inclusive **peak dates**. They cover
+7,633 records in 86 submitted/preliminary/settled tables from 1997–2007 within
+the same archive. `loadType` identifies submitted load, coincident-peak load or
+load responsibility; `unit` applies to `load`, and `energyMWh` remains separate.
+Revisions, loss components and report differences are retained. Total rows remain
+present, including three unlabeled source totals with `entity=None`.
+`settlementRun` retains the published date, optional time, stage and channel;
+an invalid source date stays visible in `sourceDate` with `runDate=None`.
+Member, sheet, one-based source row, headings and notes provide provenance.
+
+Daily 4CP source energy is also available:
+
+```python
+from datetime import date
+
+with Client() as ercot:
+ for day in ercot.coincident_peaks.daily(
+ date_from=date(2017, 6, 1),
+ date_to=date(2017, 6, 1),
+ where=lambda r: r.entity == "ERCOT" and r.settlement == "FINAL",
+ ):
+ print(day.operatingDay, day.intervals[0].energyMWh)
+```
+
+`daily_files()` discovers public source workbooks; `download(file)` and
+`read_daily(data, filename=..., date_from=..., date_to=..., where=...)` support
+saved copies. The published 2017 workbook covers June–September, with **32,890
+entity/day records** across initial and final settlement sheets. Both versions,
+source channels and interval labels remain separate. These values are **MWh**;
+no peak MW, allocation share or UTC timestamp is inferred. One entity has 97 of
+the 122 dates in each sheet; missing dates are not filled. Source row, file link
+and units remain attached. The tables include both ERCOT and individual entities,
+so adding every row together would double-count energy.
+
+Recent 4CP publications use MIS routes and remain outside this release's scope. See
+`tools/inputs/public-four-cp-evidence.json` for source comparisons and limitations.
+
+### Historical retail load profiles
+
+`load_profiles` discovers ERCOT's annual backcasted load-profile files, currently
+labelled 1997–2026. Install `tinyercot[files]`; API credentials are unnecessary.
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client(timeout=120) as ercot:
+ for day in ercot.load_profiles.rows(
+ date_from=date(2026, 1, 1),
+ date_to=date(2026, 1, 2),
+ profile="BUSHIDG_COAST",
+ ):
+ print(day.operatingDay, day.profileType, day.weatherZone)
+ for interval in day.intervals:
+ print(interval.interval, interval.energyKWh)
+```
+
+Omit `profile` for all profile types and weather zones. `archives()` discovers
+actual links, `download(archive)` returns the original ZIP, and `read(data)`
+decodes saved ZIPs or workbooks with the same date/profile filters. Each daily
+row retains every numbered interval column, including unused blank cells
+(100 columns in annual backcasts; 96 in the original Hurricane Ike profiles).
+These are modeled settlement profiles using observed weather, not individual
+meter readings. No wall-clock timestamp is inferred from the interval number.
+The 2007 auxiliary and 2008 pre-adjustment profiles remain separate through
+`kind="auxiliary"` and `kind="original"`; original member and sheet names are
+retained. `adjustments(date_from=..., date_to=...)` and `read_adjustments(data)`
+return the Hurricane Ike factors separately, without applying them to kWh.
+`sourceAddTime` preserves optional `ADDTIME` values,
+without treating them as proof of public availability for backtesting.
+
+The complete 2026 file contains 248 profiles and 52,328 profile-days through
+August 30; May is absent from the workbook. These source gaps remain visible.
+Format coverage and original-file comparisons are recorded in
+`tools/inputs/public-load-profiles-evidence.json`.
+
+Profile-assignment counts are available from the same service:
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for count in ercot.load_profiles.counts(
+ date_from=date(2026, 8, 6),
+ where=lambda row: row.weatherZone == "COAST" and row.profileType == "BUSHILF",
+ ):
+ print(count.snapshotDate, count.tdsp, count.meterDataType, count.records)
+```
+
+`read_counts(data, filename=...)` accepts saved ZIPs or workbooks with the same
+filters. These are assignment counts by profile, weather zone, meter type and
+TDSP, separate from energy profiles. The direct archive contains 141 snapshots
+and 97,924 records, with valid filename dates spanning April 2013–August 2026.
+Original and corrected snapshots remain separate. `snapshotDate` is a filename
+label, not proof of public availability. Two malformed date labels remain in
+`sourceDateLabel` with `snapshotDate=None`: unbounded reads include them, while
+date bounds exclude them. Five records retain an unknown weather zone as `None`.
+
+### Historical settlement loss factors
+
+`loss_factors` reads the directly published actual/forecast transmission and
+distribution loss-factor workbooks with `tinyercot[files]`, without credentials:
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for day in ercot.loss_factors.rows(
+ date_from=date(2026, 1, 1),
+ date_to=date(2026, 1, 31),
+ where=lambda r: r.kind == "actual" and r.level == "distribution",
+ ):
+ print(day.operatingDay, day.tdsp, day.lossCode, day.intervals[0].factor)
+```
+
+`archives()` discovers files on the current page and all linked annual indexes;
+`download(archive)` returns the original workbook or ZIP. `read(data,
+filename=..., source_file=archive, ...)` accepts saved files with the same
+inclusive operating-date bounds and typed `where` filter. Overlapping files
+and sheets remain separate.
+
+The 72 inspected downloads contain **301,829 series/day records** and **28,975,512
+numeric factors**, with source dates from July 31, 2001 through July 31, 2026.
+Coverage varies by series: actual distribution factors begin December 7, 2006.
+See the [per-file coverage manifest](../tools/inputs/public-loss-history-sources.csv)
+for actual ranges; year and sheet labels do not guarantee a complete year.
+
+Interval positions preserve every value and blank, including repeated clocks
+on fall-back days. `sourceLabel` holds the legacy clock label or modern `INTV`
+column name. One 2013 row has 100 values under a 96-interval header: all values
+and its trailing timestamp survive, with interval labels set to `None`.
+Factors keep their original scale and are never applied to load implicitly.
+
+`sourceFile` retains the index link and title when supplied. Early distribution
+workbooks do not contain an actual/forecast label: live queries use the index's
+label, while saved reads without that metadata return `kind=None`. Recorder IDs,
+TDSPs and loss codes remain distinct; unlabeled secondary identifiers and markers
+are retained separately. No TDSP is inferred from a recorder ID. Source timestamps
+have no inferred timezone and do not establish public availability. MIS feeds
+remain outside this client's scope.
+
+### Distribution-loss coefficients
+
+Read the published retail distribution-loss parameters with `tinyercot[files]`:
+
+```python
+with Client() as ercot:
+ for coefficient in ercot.distribution_loss_coefficients.rows(
+ where=lambda r: r.year == 2026 and r.tdsp == "Oncor",
+ ):
+ print(coefficient.lossCode, coefficient.f1, coefficient.f2, coefficient.f3)
+```
+
+`files()`, `download(file)` and `read(data, filename=..., where=...)` also support
+saved summaries and original ZIPs. The 28 summaries for **2001–2026** contain
+**466 records**, including both period variants in 2007 and 2024. Older summaries
+use separate `tdspAverageIntervalLoadMWh`, `kFactor` and
+`annualDistributionLossFactor` fields; `formula` identifies the family.
+
+The filename `year`, original title and load-baseline dates remain distinct.
+They do not establish coefficient effective dates or publication timestamps.
+Cached values retain their original scale and rounding. Original formula text
+and source identity accompany every record; example curves are not observations.
+The files extra handles the historical XLS summaries' built-in workbook protection.
+
+### Seasonal loss coefficients and operator load shares
+
+Annual transmission-loss coefficients are available through the same client:
+
+```python
+with Client() as ercot:
+ for coefficient in ercot.transmission_loss_coefficients.rows(
+ where=lambda r: r.year == 2026 and r.area == "ERCOT",
+ ):
+ print(
+ coefficient.season,
+ coefficient.slopePercentPerMW,
+ coefficient.interceptPercent,
+ )
+
+ for share in ercot.load_shed.rows(where=lambda r: r.season == "winter"):
+ print(share.transmissionOperator, share.loadSharePercent, share.effectiveFrom)
+```
+
+Both services expose `files()`, `download(file)` and `read(data, filename=...,
+where=...)` for saved workbooks or ZIPs; parsing uses `tinyercot[files]`.
+Coefficient discovery follows all 26 current/annual indexes and returns **948
+area/season records for 2001–2026**. The published SSC/SIC values produce percent
+loss; the separate on/off-peak load inputs are MW and their loss factors retain
+the original fractional scale. Source correction labels remain distinct.
+`asOf` comes from the workbook heading and is not a publication timestamp.
+
+Missing coefficients remain `None`. Early files omit effective periods; the
+2020 and 2026 winter ranges are reversed in the originals. Their usable date
+bounds remain `None`, with the original text in `sourceEffectivePeriod`.
+`source_file=file` can attach the original coefficient index link to saved reads;
+live reads attach it automatically. Revisions remain separate.
+
+The two current load-shed tables contain **21 operator load percentages each**,
+effective April 1 and September 1, 2026. These are load shares, not shed MW or
+outage probabilities. The reader keeps the original notes and assumes no end
+date: ERCOT says each table remains effective until replaced.
+
+### CRR hours and retail counts/energy
+
+The direct public CRR calendar and provider-of-last-resort (POLR) territory
+reports use the same small interface, with `tinyercot[files]`:
+
+```python
+from tinyercot import Client
+
+with Client() as ercot:
+ for month in ercot.crr_hours.rows(where=lambda r: r.month.year == 2026):
+ print(month.month, month.peakWDHours, month.peakWEHours, month.offPeakHours)
+
+ for usage in ercot.polr.rows(where=lambda r: r.premiseType == "Residential"):
+ print(usage.territory, usage.activeEsiids, usage.energyKWh)
+```
+
+`files()` discovers current links, `download(file)` returns original bytes, and
+`read(data, filename=..., where=...)` queries saved workbooks or ZIPs. Original
+and revised files stay separate. The captured CRR calendar covers 48 delivery
+months in 2026–2029; `month` is the first day of the delivery month. Published
+hour counts retain DST effects and are not recomputed from calendar assumptions.
+
+The POLR report contains 24 territory/customer-class totals. `snapshotDate`
+describes active ESIIDs with usage on March 31, 2026; `energyPeriodStart` and
+`energyPeriodEnd` describe all ESIIDs active during April 2025–March 2026.
+These populations differ, so `energyKWh / activeEsiids` is not automatically
+an annual per-customer usage measure. Dates come from the table headers;
+original cover notes remain in `sourceNotes`. These are the observed downloads,
+not a claim of older coverage or of realized future trading activity.
+
+### Retail transaction history
+
+`retail_transactions` reads daily transaction counts from the public monthly
+archive with `tinyercot[files]`:
+
+```python
+from tinyercot import Client
+
+with Client() as ercot:
+ for month in ercot.retail_transactions.rows(
+ where=lambda r: (
+ r.month.year == 2025
+ and r.sourceSheet == "ERCOT Inbound"
+ and r.transactionCode == "814_01"
+ ),
+ ):
+ for day in month.days:
+ print(day.operatingDay, day.count)
+```
+
+`files()`, `download(file)` and `read(data, filename=..., where=...)` also support
+discovery and saved workbooks/ZIPs. The inspected archive contains 20 months
+(January 2025–August 2026), 9,126 monthly transaction/category records and 277,433
+daily counts. Queries use the dates in the table, not the archive filename.
+
+`transactionCode=None` identifies a sheet's Grand Total row. Codes and raw sheet
+labels remain unchanged, including four sheets with unnamed categories.
+Territory, customer-class and ERCOT-wide views overlap; do not sum across those
+categories. `reportedTotal` and `reportedAveragePerDay` retain the source's
+monthly summaries, including rounded averages. Missing count cells remain
+`None`. No transaction-code business meaning or individual customer activity
+is inferred from these aggregate counts.
+
+### Interim indicative ORDC prices
+
+`indicative_ordc` exposes ERCOT's direct interim ORDC archive without optional
+dependencies. These are indicative results from before ORDC implementation,
+with `indicative=True`; they are separate from realized settlement prices.
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for row in ercot.indicative_ordc.rows(
+ where=lambda r: r.scedTimestamp.date() == date(2013, 11, 3)
+ ):
+ print(row.scedTimestamp, row.repeatedHourFlag, row.rtorpa, row.rtoffpa)
+```
+
+`files()`, `download(file)` and `read(data, filename=..., where=...)` support
+discovery and saved CSVs/ZIPs. All 9,826 records in the direct archive are typed,
+spanning October 17–November 19, 2013. The page description says November 20;
+the dates above come from the actual files. Original reserve/input abbreviations,
+timestamp text, repeat-hour flags and member names are retained. The source's
+`00:xx AM` clock parses as midnight, with no inferred timezone. Every SCED row
+remains separate; readings are not resampled or combined with settled prices.
+
+### Resource outlooks
+
+`resource_outlook.percentiles()` reads the probabilistic forecast tables in
+Monthly Outlook for Resource Adequacy (MORA) workbooks with `tinyercot[files]`:
+
+```python
+from datetime import date
+from decimal import Decimal
+from tinyercot import Client
+
+with Client() as ercot:
+ for row in ercot.resource_outlook.percentiles(
+ where=lambda r: (
+ r.reportMonth == date(2026, 11, 1)
+ and r.metric == "gross_demand"
+ and r.percentile == Decimal("0.5")
+ ),
+ ):
+ print(row.hour, row.value, row.sourceUnit)
+```
+
+`files()` discovers current and archived-year workbook links, `download(file)`
+returns the original file, and `read_percentiles(data, filename=..., where=...)`
+queries saved workbooks or ZIPs. All 27,500 percentile values in 37 linked
+workbooks are supported, covering December 2023–November 2026, with both
+December 2023 versions retained.
+
+These are forecast distributions for the assessment month, not realized hourly
+observations. `percentile` uses 0–1, normalizing explicit strings such as `50%`
+while retaining `sourcePercentile`. `hour=None` identifies daily outage values.
+Weather-related outages remain separate from other outages. Only published hours
+and metrics are returned; early files have fewer hours. `sourceMetric` retains
+changes in demand definitions, and `sourceNotes` retains weather-outage footnotes.
+Units are `MW` where stated and `None` for the 22 earliest daily-outage values
+whose table headings omit units. Report labels and file identities preserve
+revisions, without asserting when they became publicly available. Percentiles
+from different quantities should not be added or subtracted as if they were
+joint scenarios.
+
+`resource_outlook.resources()` also returns typed resource-detail rows, including
+unit capacities, planned projects and capacity summaries:
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for row in ercot.resource_outlook.resources(
+ where=lambda r: r.reportMonth == date(2026, 11, 1) and r.kind == "unit",
+ ):
+ print(row.name, row.category, row.installedCapacityMW, row.reportedCapacityMW)
+```
+
+Use `read_resources(data, filename=..., where=...)` for saved workbooks or ZIPs.
+All 61,949 resource-table rows across the same 37 workbooks are supported.
+`kind="summary"` separates totals, capacity contributions and adjustments from
+unit rows, including summaries that have a source unit code. Avoid adding summary
+rows to their constituent units. Original categories distinguish operational,
+planned, mothballed and unavailable resources; an omitted category remains `None`.
+`inService` retains a year, date, source error such as `#N/A`, or `None`.
+
+Installed and reported capacities remain separate decimals, with their original
+rating labels and explanatory notes. A seasonal rating or planned service date
+does not establish available generation; battery fleet contribution is calculated
+separately by ERCOT. Missing capacities remain `None`, and negative adjustments
+are preserved.
+
+`resource_outlook.capacities()` reads category-level installed and expected
+available capacity. For example, to query ERCOT's expected battery contribution:
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for row in ercot.resource_outlook.capacities(
+ where=lambda r: (
+ r.reportMonth == date(2026, 11, 1)
+ and r.section == "operational"
+ and r.resourcePath[-1] == "Batteries"
+ ),
+ ):
+ for scenario in row.availableCapacity:
+ print(scenario.hourEnding, scenario.timeZone, scenario.valueMW)
+```
+
+`resourcePath` preserves the category hierarchy; parent and child totals overlap.
+Installed capacity appears once on each row, while `availableCapacity` keeps
+every published scenario separately. Older reports can have two hours, or two
+scenarios at the same hour. `sourceScenario` retains that distinction. The source
+clock is a typed `time`, with `timeZone=None` when ERCOT omits CST/CDT.
+
+`resource_outlook.balance()` reads the monthly load/resource balance using 33
+typed metric names, such as `average_weather_load`, `storage_capacity`,
+`planned_thermal_outages` and `normal_condition_reserves`. Each row's `values`
+contains the scenario values in MW. Use typed predicates to select a month or
+metric. `read_capacities(data, ...)` reads saved XLSX files/ZIPs and
+`read_balance(data, ...)` reads saved workbooks/ZIPs. Together these readers cover
+all 4,569 numeric cells in the two tables across the 37 linked workbooks.
+
+These are ERCOT's forecast assumptions and scenario results. Source metric labels
+and explanatory notes preserve changes in their definitions; they are distinct
+from actual capacity, demand or reserve observations. Embedded risk charts and
+image-only probability tables are outside these readers.
+
+### Capacity changes and project history
+
+`capacity_changes` reads the project tables and annual/monthly capacity series
+behind ERCOT's Capacity Changes by Fuel Type charts, using `tinyercot[files]`:
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for project in ercot.capacity_changes.projects(
+ where=lambda p: (
+ p.reportMonth == date(2026, 7, 1) and p.sourceSheet == "Battery Chart"
+ ),
+ ):
+ print(project.identifier, project.capacityMW, project.projectedCOD)
+```
+
+All 169 linked workbooks are supported: 42,628 project records and 16,554
+capacity-series rows, covering every reporting month from August 2018 through
+July 2026. `totals()` exposes installed, synchronized, operational and planned
+capacity measures as separate typed fields. Source periods span 1999–2033 and
+include future projections. Annual points retain an integer year; monthly points
+retain their original full date, including dates under a source `Year` heading.
+
+`files()` discovers current and archived-year links; `download(file)` returns the
+original bytes. `read_projects(data, filename=..., source_file=..., where=...)`
+and `read_totals(...)` query saved workbooks or ZIPs. `source_file` accepts a
+`PublicFile` to retain its URL and title; live queries supply it automatically.
+Saved reads use member filenames for `reportMonth`, leaving it `None` if unknown.
+File names and URLs do not establish point-in-time public availability.
+
+Project identifiers can be INRs or resource codes. Projected CODs, reported years,
+agreement dates and synchronization approvals stay separate. Original status
+strings, missing fields, small-generator groups, comments and corrections remain
+visible. Companion reports and revisions are retained, including different URLs
+with the same filename. Neither file variant nor a projected service date implies
+that a project is commercially operating. Missing capacities remain `None`,
+distinct from zero; `sourceColumns` records which measures were published.
+
+### Historical zonal weather
+
+`historical_weather` reads ERCOT's direct public archive with `tinyercot[files]`:
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for day in ercot.historical_weather.rows(
+ date_from=date(2000, 7, 1),
+ date_to=date(2000, 7, 2),
+ weather_zone="COAST",
+ variable="DRYBULB TEMP",
+ ):
+ for hour in day.hours:
+ print(day.operatingDay, hour.hour, hour.value, day.sourceUnit)
+```
+
+All eight weather zones and four variables (`CLOUDCOVER`, `WINDSPEED`, `DEWPOINT`,
+`DRYBULB TEMP`) are typed. The source combines stations using weights; it contains
+1,837 days per zone/variable from January 1, 1996 through January 10, 2001, despite
+the archive's “1996–2000” filename. Dates are inclusive; omit filters for all data.
+The workbooks do not state measurement units, so `sourceUnit=None` and values
+retain their original scale. Hour numbers preserve the source's 24 columns
+without assuming an ending time, DST convention or UTC offset.
+
+`download()` returns the original ZIP. `read(data, ...)` accepts saved ZIPs and
+workbooks with the same filters; pass the original `filename` for a standalone
+workbook so its weather zone can be identified. Source notes and member/sheet
+names remain attached to every record.
+
+### Direct public hourly load archives
+
+Install `tinyercot[files]` for XLS and XLSX support. These files are downloaded
+from ERCOT's public website without API credentials.
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client(timeout=120) as ercot:
+ for load in ercot.hourly_load.weather_zones(
+ date_from=date(2002, 1, 1), date_to=date(2002, 1, 2)
+ ):
+ print(load.operatingDay, load.hourEnding, load.coast, load.total)
+
+ archives = ercot.hourly_load.archives()
+ archive = next(item for item in archives if item.year == 2002)
+ data = ercot.hourly_load.download(archive)
+ saved_rows = list(ercot.hourly_load.read_weather_zones(data))
+```
+
+`archives()` discovers all linked load files, including older control-area and
+system-only publications. `weather_zones()` decodes the workbook series beginning
+in 2002. It uses inclusive **operating-date** bounds and retains hour ending 24 on
+its original operating day. The source's literal `DST` suffix stays in `dstLabel`;
+it is not interpreted as a UTC offset or the API's repeat-hour flag. Excel serials
+with millisecond rounding noise are read as their displayed whole hour, with the
+unrounded converted clock retained in `sourceHourEnding`. Load values use
+`Decimal`; missing cells remain `None`.
+
+All 24 workbooks for 2002–2025 decoded: 210,384 hourly rows, with every one of the
+1,893,456 load cells compared against its source (including nine absent cells).
+The 2016 workbook has an hour with all nine values missing. The linked 2026 ZIP
+has stale directory metadata but an intact workbook. The reader recovers it using
+the member's local sizes and checksum: all **5,087 hourly rows through July 31,
+2026** and **45,783 load values** matched the source. Checksum failures and
+incorrect local sizes still raise. Downloads retain the original bytes. The
+index has no 2001 file. See `tools/inputs/public-hourly-load-evidence.json` for
+the inventory, source comparison and recovery details.
+
+The annual files and `np6_345_cd.act_sys_load_by_wzn_history` retain different
+published values. Across 720 matching January 2018 hours, all 6,480 compared load
+cells differed, including after rounding the annual values to two decimals. Keep
+the source identified when combining these series; the API data cannot silently
+replace a missing annual workbook. The source comparison is recorded in
+`tools/inputs/public-hourly-load-evidence.json`.
+
+For the older system, control-area and load-serving-entity records, use the typed
+`legacy()` reader. It emits one entity/hour measurement, with the source entity
+and control-area relationship retained:
+
+```python
+with Client(timeout=120) as ercot:
+ for load in ercot.hourly_load.legacy(
+ date_from=date(1995, 1, 1), date_to=date(1995, 1, 2)
+ ):
+ print(load.operatingDay, load.hourEnding, load.entity, load.demand, load.unit)
+
+ archive = next(a for a in ercot.hourly_load.archives() if a.year == 1995)
+ data = ercot.hourly_load.download(archive)
+ saved_rows = ercot.hourly_load.read_legacy(data, filename="erceei95.txt")
+```
+
+All eight linked pre-2002 files decoded: 562,115 entity/hour measurements, each
+compared with its source. EEI files retain their MW values; the 1998 workbook
+explicitly reports kW. The 1996, 1999 and 2000 text files do not state their units,
+so `unit` remains `None` and numeric magnitudes are unchanged. Four published
+`#VALUE!` cells retain `sourceError` and have `demand=None`. Repeated hour labels
+and overlapping publications remain separate. The 1997 raw text and workbook
+versions match for every hour, including the workbook's annual energy and peak.
+
+Legacy date bounds are applied to file contents after considering all older
+files: the file labelled 1996 continues into February 1997, and the ZIP labelled
+1997 contains 1996 records. System totals, individual control areas and
+load-serving entities are not added together or mapped to modern weather zones.
+See
+`tools/inputs/public-legacy-hourly-load-evidence.json` for the source checks and
+EEI format reference.
+
+### Historical generation by fuel
+
+`fuel_mix` reads the public annual settlement workbooks, independently of the
+live `dashboards.fuel_mix()` feed. Install `tinyercot[files]` for XLS/XLSX support.
+
+```python
+with Client(timeout=180) as ercot:
+ for day in ercot.fuel_mix.rows(
+ date_from=date(2007, 1, 1), date_to=date(2007, 1, 1)
+ ):
+ print(day.operatingDay, day.fuel, day.settlementType, day.totalMWh)
+ for interval in day.intervals:
+ print(interval.ending, interval.dst, interval.energyMWh)
+
+ for total in ercot.fuel_mix.summaries(year_from=2026, year_to=2026):
+ print(total.month, total.fuel, total.energy, total.unit)
+```
+
+`archives()` discovers the current index links; `download()` returns the original
+file. `read(data, filename=...)` and `read_summaries(data, filename=...)` decode
+saved XLS/XLSX files or their ZIP archive. Standalone modern summary workbooks
+need the original filename to identify the year. Older years share a roughly
+51 MB ZIP download; bounded queries skip workbooks for other years after download.
+
+Each daily row retains its original fuel name, settlement status, published total
+and ordered interval cells. Midnight ends the operating day. Blank cells remain
+`None`, WSL values can be negative, and DST columns retain their labels and
+positions. Older `DST1`–`DST4` columns and unlabelled columns have no inferred clock
+time. Malformed source values retain `sourceError`. Monthly/annual summaries retain
+their own MWh/GWh units and precision, including source month markers such as
+`Jan*`; they are not recomputed from daily rows. These settlement values are distinct
+from instantaneous dashboard generation in MW. The workbook's chart-support sheets
+are not included in these daily and summary table readers.
+
+The September 2026 source check decoded all 20 linked annual workbooks: 62,071
+daily fuel rows, 5,984,876 interval cells and 2,386 published totals. Every numeric
+value, blank cell and preserved error matched an independent source read. The
+2026 file currently ends July 31. See `tools/inputs/public-fuel-mix-evidence.json`.
+
+### Historical generation schedules by zone
+
+The public `zonal_generation` archive contains 889,140 scheduled MW records from
+July 31, 2001 through April 11, 2007. It is a fixed historical snapshot, with seven
+nested yearly ZIPs. It needs no credentials or optional dependencies.
+
+```python
+with Client() as ercot:
+ for schedule in ercot.zonal_generation.rows(
+ date_from=date(2001, 7, 31), date_to=date(2001, 7, 31)
+ ):
+ print(schedule.periodEnding, schedule.zoneId, schedule.scheduledMW)
+
+ saved_zip = ercot.zonal_generation.download()
+ saved_rows = ercot.zonal_generation.read(saved_zip)
+```
+
+`read()` also accepts a yearly ZIP or raw tab-delimited text. Each row retains the
+local CPT period-ending timestamp without a UTC offset. Historical zone IDs change
+between years and are preserved without assigning modern zone names. Date bounds
+refer to `operatingDay`, the date of the 15-minute interval; midnight belongs to
+the preceding operating day. August 9, 2001 is missing from the published data.
+No intervals are synthesized. These schedules are distinct from actual generation
+in the fuel-mix reports. All source timestamps, zone IDs and MW quantities were
+compared directly; see `tools/inputs/public-zonal-generation-evidence.json`.
+
+## Development
+
+Runtime dependencies are `httpx`, `httpx-retries`, and `pydantic`. The handwritten
+core handles authentication, transport, pagination, and metadata. Product methods
+and row models are generated from saved ERCOT operation and field definitions.
+
+```sh
+uv sync --group dev
+uv run python tools/generate_client.py
+uv run mypy tinyercot tests/typing_client.py --strict --follow-untyped-imports
+uv run pytest
+uv build
+```
+
+Generation fails if an endpoint has no field schema. During discovery only,
+`--allow-incomplete` emits available endpoints and reports the missing count.
+Public dashboards are available through `ercot.dashboards`: fuel mix, grid
+conditions, energy storage, generation outages, DC-tie flows, system prices,
+supply/demand, combined wind/solar, system demand, ancillary services, weather,
+SCED capacity, the ancillary-service capacity monitor, and the current locational
+price map.
+
+```python
+with Client() as ercot:
+ capacity = ercot.dashboards.sced_capacity()
+ for row in capacity.current.data:
+ print(row.timestamp, row.increaseGenResESRs, row.decreaseGenResESRs)
+
+ reserves = ercot.dashboards.ancillary_capacity()
+ print(reserves.data.regulationAwardsGroup.regUpAwd)
+```
+
+SCED capacity includes current and previous day telemetry. The ancillary monitor
+exposes 60 values across 12 named source groups, including battery capacity and
+reserve awards. Both are public and require no credentials. Values are in MW;
+SCED capacity does not account for individual resource ramp-rate or duration limits.
+
+`ercot.dashboards.system_demand()` returns previous, current and next-day load,
+forecasts and high-sustained limits. Before day-ahead publication, ERCOT can omit
+`dayAheadForecast` and `dayAheadHsl`; both are typed `Decimal | None` and return
+`None` while the available series remain usable. Missing values are not zeroes.
+The six day-ahead wind/solar forecast and capacity fields returned by
+`combined_wind_solar()` likewise retain ERCOT's explicit `null` values as `None`
+until publication; observed zero generation remains zero.
+The current/previous-day Load Forecast vs. Actual graphics repeat these series
+rounded to whole MW; the JSON dashboard retains the published decimal precision.
+
+`ercot.dashboards.real_time_conditions()` reads the public system-conditions table,
+including frequency, instantaneous time error, consecutive BAAL exceedances,
+demand, capacity, generation, inertia and all five DC ties. Its `lastUpdated`
+is a naive datetime because the display provides no UTC offset. This method
+returns the current snapshot; it does not provide a historical archive.
+
+`ercot.dashboards.real_time_lmps()` reads the latest public settlement-point table.
+Use `hubs_and_zones=True` for the hubs/load-zones display. Each row keeps `LMP`,
+`lmpChange`, `lmpWithAdder` and `lmpWithAdderChange` separate; changes are the
+published five-minute changes. An unavailable `lmpChange`, displayed by ERCOT
+as `-`, is typed `Decimal | None` and returned as `None`; the row and its other
+prices remain available. Zero and negative changes remain numeric.
+The snapshot includes `RTRDPA` and the display
+update time, which also has no UTC offset. For historical LMPs and adders, use
+the generated report-query and `_history` methods.
+
+`ercot.dashboards.indicative_prices("HB_HOUSTON")` returns recent RTD runs for any
+of the 15 published hubs/load zones. Each run retains its `RTDTimestamp`, the
+display’s `actualLMP` value, and typed `intervals` with `intervalId`, `minutesAhead`
+and `LMP`. The interval prices include reliability deployment adders, exposed by
+`includesReliabilityAdder=True`. The separate `lastSCEDTimestamp` and run times
+remain naive; no absolute interval timestamp is inferred from a minute offset.
+For the longer historical record, use `np6_970_cd.rtd_lmp_node_zone_hub_history`.
+
+Five public market displays also accept an optional `operating_day`. They require
+no credentials and expose typed series names with exact decimal values:
+
+```python
+from datetime import date
+
+with Client() as ercot:
+ prices = ercot.dashboards.real_time_prices(date(2026, 9, 3))
+ for row in prices.data:
+ print(row.operatingDay, row.periodEnding, row.values["HB_HOUSTON"])
+
+ ancillary = ercot.dashboards.day_ahead_ancillary_prices()
+ print(ancillary.data[0].values["ECRS"])
+```
+
+Use `day_ahead_prices()` for hourly hub/load-zone settlement prices,
+`day_ahead_ancillary_prices()` for the five DAM ancillary-service prices,
+and `actual_forecast_zone_load()` or `actual_weather_zone_load()` for hourly
+load by region, including the separately published `TOTAL`. Real-time settlement
+prices include reliability deployment adders. These are separate from SCED LMPs.
+Omitting the date reads the current display, which can show tomorrow's DAM day.
+
+`MarketDisplay` contains the source `operatingDay`, naive `lastUpdated`,
+`periodType` (`"Hour Ending"` or `"Interval Ending"`) and `data`. Each row keeps
+its literal `periodEnding` label, including leading zeroes, `2400` and repeated
+hour markers such as `0100*` or `0200 *`. No UTC offset or repeat-hour flag is
+inferred, and repeated rows remain separate. `values` is a dictionary whose keys
+are typed literals for that display's published hubs, zones or ancillary services.
+
+Dated URLs can retain data beyond the five-day menu: November 2, 2025 real-time
+prices and actual loads were verified, including the fall-back hour. Retention
+is not guaranteed or continuously verified. Some historical DAM URLs return
+HTTP 200 with no market table or the wrong operating day; the client raises
+`ValueError` rather than returning misleading empty data. A recognized empty
+load table at midnight returns an empty list. Unretained URLs retain their HTTP
+error. Use the generated `_history` readers for the broader archive record.
+
+Detailed field mappings, historical layout changes and source limitations are
+recorded in [data coverage](data-coverage.md).
+
+### Conditional MORA risk curves
+
+With `tinyercot[files]`, read the numerical wind/BESS risk curves from MORA:
+
+```python
+with Client() as ercot:
+ for point in ercot.resource_outlook.risk_points(
+ where=lambda r: r.reportMonth.year == 2026 and r.event == "EEA3_load_shed",
+ ):
+ print(point.windGenerationMW, point.probability, point.bessAvailabilityMW)
+```
+
+`read_risk_points(data, filename=..., source_file=..., where=...)` supports saved
+workbooks and ZIPs. There are **72 published points** in the June, October and
+November 2026 workbooks. Probabilities remain fractions from conditional model
+runs with fixed wind and BESS inputs. The original scenario notes accompany each
+point. November's chart says 8 p.m. while its scenario says 7 p.m.; both hours
+remain separate fields. These are simulated risk curves, not observed outcomes.
+Reports with only graphical images return no numeric curve points; the original
+reports remain available through `resource_outlook.download(file)`.
+
+## Modeled wind and solar generation profiles
+
+`generation_profiles` reads the hourly CSV and Excel tables published on ERCOT's
+[resource adequacy archive pages](https://www.ercot.com/gridinfo/resource/2022).
+These are retrospective **planning simulations**, including operational, planned,
+hypothetical and distributed generation. A profile dated 1980 does not mean that
+plant existed in 1980. Use them for weather and fleet scenarios; they are not
+metered generation or forecasts that were available on that historical date.
+
+Select a particular publication before downloading: files can be large and
+multiple vintages overlap. Excel parsing uses `tinyercot[files]`.
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ source = next(
+ file
+ for file in ercot.generation_profiles.files()
+ if file.url.endswith(
+ "ERCOT-OperationalPlanned-SolarPVProfiles-2020-2021-CST-CDT.xlsx"
+ )
+ )
+ data = ercot.generation_profiles.download(source)
+ sites = list(ercot.generation_profiles.sites(data, filename=source.title))
+ for hour in ercot.generation_profiles.read(
+ data,
+ filename=source.title,
+ where=lambda row: row.profileDate == date(2020, 7, 1),
+ ):
+ print(hour.profileDate, hour.timeHHMM, hour.generationMW[sites[0].column])
+```
+
+`GenerationProfileHour` supplies a date, the source's HHMM clock and a typed
+`dict[str, Decimal | None]` of MW values keyed by the original column labels.
+`GenerationProfileSite` exposes embedded site IDs, capacities, county, CDR zone,
+common name, plant status and solar tracking system when supplied. Separate key workbooks are not
+implicitly joined; identifiers and capacities can change between vintages.
+
+CSV clock strings, including leading zeros, are preserved in `sourceTime`, and
+`sourceTimeColumn` preserves `TIME`, `TIME_CST` or the older `HHMM(CST)` label. No UTC offset or hour-ending
+interpretation is inferred. Repeated clocks, missing values, overlapping files
+and dates outside filename labels survive unchanged. Saved CSVs, workbooks and
+ZIPs containing supported tables can be read locally. Unsupported layouts raise;
+some older ZIP formats and workbook vintages remain unverified. See the
+[coverage evidence](data-coverage.md#modeled-generation-profiles).
+
+The separate keys can be discovered and read with the same service:
+
+```python
+with Client() as ercot:
+ source = next(
+ file
+ for file in ercot.generation_profiles.key_files()
+ if file.url.endswith("ERCOT-SolarPVProfiles-1980-2021-Key-public.xlsx")
+ )
+ key = next(
+ ercot.generation_profiles.read_keys(
+ ercot.generation_profiles.download(source), filename=source.title
+ )
+ )
+ for plant in key.sites:
+ if plant.cdrZone == "West" and plant.unitCode:
+ print(plant.unitCode, plant.capacityMW)
+```
+
+`GenerationProfileKey` contains typed site/unit rows, published summary counts,
+source title/date and notes with worksheet locations. Site rows retain source row
+numbers, numeric site IDs, unit codes, location, capacity and available equipment
+metadata. `tilt` preserves the source's `Lat` and `NA` labels as well as numbers.
+`queuedModelFlag` reads the wind key's colour legend; `None` means no such legend
+was supplied. Multiple unit codes for the same site remain separate records.
+
+Use matching vintages and inspect unmatched identifiers before joining. In the
+1980–2021 solar key, `TREBA_UNIT 1` contains a space absent from the profile column
+`TREBA_UNIT1`; 163 of 164 unit codes match exactly. The SDK preserves both source
+spellings. Published summaries are also retained independently: the 1980–2020
+solar key reports 313 utility profiles while its detailed scenario totals sum
+to 331. `sourceDate` is the workbook's own date, not an asserted publication time.
+
+
+Older wind CSVs can contain independently dated tables side by side.
+`sourceBlock` identifies each table (starting at 1) on both hourly records and
+site metadata. The reader emits each block with its own date, clock and sites;
+for example, a 2011 onshore table can share a file with 2013 offshore data.
+Entirely empty trailing blocks produce no records. Records are emitted in source
+row/block order, which need not be chronological across blocks. The original
+`YYYYMMDD`/`HHMM(CST)` headers are supported alongside newer `DATE`/`TIME` layouts.
+
+The older existing/hypothetical wind workbooks are also accepted by `read()` and
+`sites()`. Their blank column headings use the numeric IDs from the source's
+`Site ID`/`SITE_ID` row as string keys, without inventing padded IDs or unit codes.
+`calendarDate` preserves the separate Year/Month/Day cells, while `profileDate`
+and `sourceTime` retain the primary date/clock pair. The original `YYMMHH(CST)`
+and `TIME-CST` clock labels remain available in `sourceTimeColumn`.
+
+Site metadata includes the original AWS name, annual MWh and capacity-factor
+mappings where published, and the hypothetical workbook's `sourceSum`,
+`sourceCount` and `sourceCapacityFactor`. These summaries are read as supplied;
+they are not recalculated from the hourly rows. `sourceSum` preserves the field
+labelled `Sum` without assigning it an inferred unit. Empty worksheets and blank
+formatting rows do not create observations.
+
+
+## Long-term peak-demand forecasts
+
+`peak_demand_forecasts` discovers the directly published summer peak-demand
+scenario workbooks, including files on linked historical forecast pages.
+It uses the optional `files` extra and needs no ERCOT credentials:
+
+```python
+with Client() as ercot:
+ for forecast in ercot.peak_demand_forecasts.rows(
+ where=lambda row: row.forecastYear == 2026 and row.demandBasis == "net"
+ ):
+ print(forecast.sourceFile, forecast.sourceSheet, forecast.p90MW)
+ print(forecast.weatherYearMW[2011])
+```
+
+`files()`, `download(file)` and `read(data, filename=...)` also support explicit
+vintage selection and saved workbooks. `rows()` attaches the original `PublicFile`
+before applying `where`, so predicates can select a source URL as well as a
+forecast year. Distinct publications and scenarios remain separate.
+
+`weatherYearMW` maps historical weather years to forecast peak MW; these keys
+are neither forecast issue dates nor observed demand years. `demandBasis`
+distinguishes gross, net and rooftop-PV impact tables, leaving older unspecified
+bases explicit. `forecastMW`, `p50MW` and `p90MW` remain separate, and absent
+summary columns are `None`. `sourceSummaryLabels` preserves the original labels.
+
+The 2024 workbook retains contracts, officer letters and total large loads in
+separate fields plus the published consumption-reduction note. The 2025 workbook
+keeps TSP-provided and ERCOT-adjusted sheets separate. Unlabelled auxiliary
+numbers in the 2023 workbook remain in `sourceExtraValues`, keyed by one-based
+source column, with no inferred weather year or unit. Source target-year labels
+are preserved even when they differ between tables in one workbook.
+
+This reader covers the peak-demand scenario workbooks. Monthly peak/energy
+forecasts use the reader below. Seasonal and weekly zonal peaks have their own
+readers. Hourly long-term forecasts and forecast-performance workbooks remain
+separate coverage gaps.
+
+
+## Hourly long-term load forecasts
+
+Install `tinyercot[files]` for the public XLSX and XLSB workbooks. Discover and
+read one publication without fetching every forecast vintage:
+
+```python
+from tinyercot import Client
+
+with Client() as ercot:
+ forecasts = ercot.hourly_load_forecasts
+ file = next(f for f in forecasts.files() if f.title == "ERCOT Adjusted Forecast")
+ data = forecasts.download(file)
+ for row in forecasts.read(data, filename=file.url.rsplit("/", 1)[-1]):
+ if row.forecastDate.year == 2030 and row.net is not None:
+ print(row.forecastDate, row.hour, row.net.coast, row.net.total)
+```
+
+Rows have concrete weather-zone fields for `forecast`, `gross`, `baseLoad`,
+`electricVehicles`, `rooftopPV`, `largeFlexibleLoad`, `contractedLoad`,
+`officerLetterLoad`, `contractedFlexibleLoad`, `officerLetterFlexibleLoad` and
+`net`. Each component is optional because publications differ. Missing regional
+values and totals remain `None`; totals are never reconstructed. Original
+column labels and the 2024 flexible-load assumptions are retained in
+`sourceLabels` and `sourceNotes`.
+
+`forecastDate` follows the workbook's year/month/day columns. `sourceDate`
+retains its separate Date column, which sometimes disagrees. `hour` preserves
+the literal source hour, including repeated labels; the reader does not infer
+a timezone, DST flag or hour-ending convention. Numeric values use `Decimal`.
+`unit` is MW where the workbook explicitly labels the entire value block (2023),
+and `None` where no such label is provided. These are planning forecasts with
+overlapping vintages, not actual demand or a deduplicated time series.
+
+To read every discovered vintage, use
+`forecasts.rows(where=lambda r: r.forecastDate.year == 2030)`. That method attaches
+`sourceFile` and sets `scenario` from the TSP-provided or ERCOT-adjusted public
+link title before applying the filter. Reading saved bytes with `read()` leaves
+those link-derived fields unset. Filtering does not reduce downloads. The
+optional Calamine reader loads one worksheet at a time, so large workbooks still
+require memory even though decoded models are yielded one at a time.
+
+## Hourly weather-year load scenarios
+
+`hourly_load_scenarios` reads the separate regional scenario workbooks with
+`tinyercot[files]`. Select a region's file to avoid downloading the entire set:
+
+```python
+from tinyercot import Client
+
+with Client() as ercot:
+ scenarios = ercot.hourly_load_scenarios
+ file = next(f for f in scenarios.files() if f.title == "Coast")
+ for row in scenarios.read(
+ scenarios.download(file), filename=file.url.rsplit("/", 1)[-1]
+ ):
+ if row.forecastDate.year == 2030:
+ print(row.forecastDate, row.hour, row.weatherYearPredictions[2011])
+```
+
+Each `HourlyLoadScenario` contains all published `Pred_YYYY` values as
+`weatherYearPredictions: dict[int, Decimal | None]`, plus separate
+`electricVehicles`, `rooftopPV`, `largeFlexibleLoad`, `contractedLoad` and
+`officerLetterLoad` fields. The reader preserves the predictions as published;
+it does not recombine components or relabel them as net demand. Absent components
+remain `None`, distinct from zero. `sourceLabels` retains their original headers.
+Spreadsheet errors and other nonnumeric text have `None` numeric values but keep
+their original text in `sourceMarkers`, keyed by source column. For example, South's published
+`Pred_2017` value at 2028-03-12 hour 3 is `#REF!`, not an empty observation.
+The captured workbooks do not explicitly label units, so `unit` remains `None`.
+
+`weatherZone` is one of the eight typed weather-zone codes, with the source label
+retained separately. South Central uses its worksheet name because it has no
+`wzone` column; `sourceWeatherZoneColumn` records that absence. Calendar fields
+follow their header names, including North's different column order. The
+separate source Date value remains in `sourceDate`, or `None` in South and West.
+Hours, duplicates and missing hours stay as published, without inferred timezone
+or DST flags. Region files have different row counts; align by the actual source
+calendar fields and retain repeated hours when comparing them.
+
+`scenarios.rows(where=lambda r: r.weatherZone == "COAST")` attaches `sourceFile`
+and filters typed rows after downloading all discovered files. Files are large;
+download bytes are held in memory, while worksheet rows and models are streamed.
+The weather-year labels are scenario inputs, while `forecastDate` is the target
+date. These forecasts are not realized loads from the historical weather years.
+
+## Monthly peak-demand and energy forecasts
+
+`monthly_load_forecasts` reads the public monthly forecast workbooks across
+current and linked historical indexes, using the optional `files` extra:
+
+```python
+with Client() as ercot:
+ for forecast in ercot.monthly_load_forecasts.rows(
+ where=lambda row: row.forecastYear == 2026 and row.forecastMonth == 8
+ ):
+ print(forecast.sourceFile, forecast.sourceTitle)
+ print(forecast.peakDemand, forecast.peakUnit)
+ print(forecast.energy, forecast.energyUnit)
+```
+
+Use `files()`, `download(file)` and `read(data, filename=...)` to select a
+publication explicitly or read a saved workbook. `rows()` attaches `sourceFile`
+before applying its typed predicate. File labels and upload paths do not replace
+source forecast years; all publications and overlapping target months remain.
+
+The numeric fields preserve source values. `peakUnit` and `energyUnit` are
+`"MW"` and `"MWh"` when declared in the column labels; otherwise they are `None`.
+`sourcePeakLabel` and `sourceEnergyLabel` retain the original headings.
+The 2025 publication labels its fields `Monthly Peaks` and `Annual Energy`
+without declaring units; the reader does not reinterpret that energy label or
+assign units from magnitude alone.
+
+The 2025 TSP table's first value pair shares a row with `year`/`month` headings,
+so its `forecastYear` and `forecastMonth` are `None`. Its next value pair retains
+the January 2025 date on that source row. The final December 2044 row has blank
+values and is retained. Values are never shifted to align with a neighboring
+table. `sourceRow`, one-based `sourceColumn` and `sourceTitle` locate each pair.
+The 2024 assumption note about large flexible loads and 4CP months is retained
+in `sourceNotes`. These are published planning forecasts, not actual loads.
+
+
+## Seasonal and weekly weather-zone peaks
+
+`seasonal_peak_forecasts` reads forecast and historical peak tables from the
+public seasonal workbooks. The shared `files()`, `download()`, `read()` and
+`rows(where=...)` methods use the optional `files` extra without credentials:
+
+```python
+with Client() as ercot:
+ for peak in ercot.seasonal_peak_forecasts.rows(
+ where=lambda row: (
+ row.kind == "forecast"
+ and row.year == 2026
+ and row.scenario == "ercot_adjusted"
+ )
+ ):
+ print(peak.season, peak.coincident, peak.peaks.coast, peak.peaks.total)
+ print(peak.sourceTitle, peak.sourceFile)
+```
+
+`kind` distinguishes historical sections from forecasts, including old files
+whose historical table still says `Forecast Year`. `year` and optional `endYear`
+retain winter periods such as `2025-2026`; `sourcePeriod` keeps the source label.
+`demandBasis` distinguishes gross, net, rooftop-PV impact and unspecified bases.
+`coincident` and `scenario` preserve explicitly labelled coincidence and
+TSP/adjusted assumptions. Unspecified attributes remain `None` or `unspecified`.
+A historical table that omits its season does not inherit a forecast's season.
+
+`peaks` has concrete fields for the eight weather zones plus `total`. The total
+is the published value; `sourceTotalLabel` distinguishes `Total NCP`, `Total PV`
+and `ERCOT`. These quantities should be interpreted using the table's basis and
+coincidence. Notes, source sheet/row and the one-based year-column position remain
+available. `unit` is `"MW"` only when declared in the table title, otherwise `None`.
+
+`weekly_peak_forecasts` reads the linked weekly P90 workbooks:
+
+```python
+with Client() as ercot:
+ for peak in ercot.weekly_peak_forecasts.rows(
+ where=lambda row: row.peakDate.year == 2026
+ ):
+ print(peak.beginDate, peak.endDate, peak.peakDate, peak.peakHour)
+ print(peak.peaks.northCentral, peak.peaks.total, peak.sourceFile)
+```
+
+Dates are calendar dates; `peakHour` retains the literal `Peak_Hour` number
+without assigning a time zone, DST flag or hour-ending convention. Weekly table
+headings do not declare units, so `unit` is `None`.
+
+Some sources declare a 90th percentile only in the public download title.
+`rows()` applies that label to forecast rows before `where`, preserving it in
+`sourcePercentileLabel`; historical rows never inherit it. `read()` uses only
+workbook contents, so `percentile` stays `None` when the workbook lacks the label.
+No percentile is inferred from a filename or the magnitude of its values.
+
+## Energy storage four-second data
+
+Use `ESRClient` for the separate ESR service. Set `ERCOT_USERNAME`,
+`ERCOT_PASSWORD`, and `ERCOT_ESR_SUBSCRIPTION_KEY`, or pass `username`, `password`,
+and `subscription_key` directly. The ESR client does not fall back to the Public
+Reports subscription key.
+
+```python
+from datetime import datetime
+from tinyercot import ESRClient
+
+with ESRClient() as esr:
+ for row in esr.rptesr_m._4_sec_esr_charging_mw_iter(
+ AGCExecTimeUTCFrom=datetime.fromisoformat("2025-09-01T15:35:00"),
+ AGCExecTimeUTCTo=datetime.fromisoformat("2025-09-01T15:40:00"),
+ ):
+ print(row.AGCExecTimeUTC, row.systemDemand, row.ESRChargingMW)
+```
+
+All named date, decimal, flag, paging and sorting filters are generated from the
+ESR definition. `_async` and `_iter_async` use the same typed row. `AGCExecTime`
+(CPT), `AGCExecTimeUTC`, and `DSTFlag` remain separate source fields. Neither
+timestamp contains an encoded offset; the reader does not attach a timezone or
+reconstruct repeated hours. Numeric values are `Decimal | None`.
+
+For the widest retained history, use the shared archive workflow:
+
+```python
+with ESRClient() as esr:
+ history = esr.rptesr_m._4_sec_esr_charging_mw_history
+ for row in history.backfill(batch_size=100):
+ print(row.AGCExecTimeUTC, row.ESRChargingMW)
+```
+
+`read(zip_bytes)`, `download(doc_ids)`, `rows(posted_from=..., posted_to=...)`,
+and `publications()` work as with Public Reports. This service also supports
+`products()`, `product("RPTESR-M")`, `archives()`, `bundles()`, and `version()`.
+The shared metadata models expose ESR's `productId` as `emilId` and
+`reportProductId` as `reportEMIL`.
+
+On September 8, 2026, the service listed 54,490 archives and no bundles. Its row
+query reported 4,087,281 records, bounded by May 29 through December 4, 2025 in
+local time. The latest returned record was **not current operational data**.
+Three complete archives (225 rows) matched the API and original source cells;
+this is not a full-retention completeness check. See the
+[ESR evidence](../tools/inputs/esr/evidence.json).
+
+## Hourly load forecast performance
+
+`Client.load_forecast_performance` reads the public mid-term load metric
+workbooks, with ERCOT and all eight weather zones kept separate. The `files`
+extra is required for workbook decoding.
+
+```python
+from tinyercot import Client
+
+with Client() as ercot:
+ for row in ercot.load_forecast_performance.rows(
+ where=lambda r: r.region == "ERCOT" and r.timestamp is not None
+ ):
+ print(row.timestamp, row.actual, row.selected, row.error)
+
+ for summary in ercot.load_forecast_performance.summaries(
+ where=lambda r: r.region == "ERCOT" and r.kind == "frequency"
+ ):
+ print(summary.sourceFile, summary.hour, summary.frequencyUnder)
+```
+
+`read(workbook_bytes, filename=...)` and `read_summaries(workbook_bytes,
+filename=...)` decode saved originals; both accept a typed `where` predicate.
+`files()` discovers the metric workbooks even when ERCOT labels the link
+"Backcast", as it does for January and February 2026. The separate monthly
+Forecast/Backcast workbooks use `monthly_forecast_performance`, described below.
+
+Hourly rows preserve the source `actual`, `selected`, `A3`, `A6`, `E`, `E1`,
+`E2`, `E3`, `M`, and `X` values where published, plus errors, under/over
+frequencies, and MAPE. Model codes retain their source names; the reader does
+not infer their horizons or forecast issuance times. `timestamp` and the older
+layout's separate `errorTimestamp` remain independent. `sourceHour` preserves
+the original numeric Hour cell; `hour` is populated only for whole values 1–24.
+Some December 2023 Hour cells are negative or fractional, so their timestamps
+are not rewritten to agree with that column.
+
+The summary kinds are `average_error`, `frequency`, and `monthly_mape`. Older
+sheets stack average and frequency blocks in the same columns; these become
+separate records. Summary buckets do not acquire dates from adjacent hourly
+rows. Original pivot/helper tables and chart graphics are not returned as
+additional observations. Source values and scales are retained without unit
+conversion, including MAPE.
+
+Missing actuals remain `None`. Spreadsheet error text is retained in
+`sourceMarkers`, with the corresponding numeric field set to `None`.
+Calculation-only rows can have no timestamp, and a time-only or zero value in
+the secondary clock is recorded as a marker instead of becoming a date.
+`sourceFile`, worksheet and row preserve the publication context; summary
+records also include `sourceColumn` and `sourceBucket`. These files support
+forecast-error analysis but do not establish what was available at a historical
+trading decision time.
+
+## Monthly forecast and backcast performance
+
+`monthly_forecast_performance` reads all 15 linked monthly performance
+workbooks using the existing `files` extra. Its typed series distinguish
+Day-Ahead RUC, 6 Hour-Ahead, 3 Hour-Ahead, Goal, Stretch, Backcast and
+Day-Ahead Backcast.
+
+```python
+from datetime import date
+from tinyercot import Client
+
+with Client() as ercot:
+ for row in ercot.monthly_forecast_performance.rows(
+ where=lambda r: r.kind == "forecast" and r.month >= date(2025, 1, 1)
+ ):
+ print(row.sourceFile, row.month, row.series, row.percent)
+```
+
+`files()`, `download(file)`, and `read(workbook_bytes, filename=...)` support
+saved-file workflows; `read` also accepts a typed predicate. The `month` field
+is the first day of the calendar month. `sourceDate` retains the original date
+when the source uses an Excel date, including its otherwise undisplayed day.
+Year/month grids instead supply a month number under an explicit year header.
+
+`value` retains the raw `Decimal`. `percent` converts only explicit Excel
+percentage fractions: a source value of `0.0141` formatted as `0.00%` gives
+`1.41`. Older plain-number Backcast tables retain their values and return
+`percent=None`; the reader does not infer a scale from magnitude. The original
+`sourceNumberFormat` remains available.
+
+`kind` separates `forecast`, `backcast`, and `target`; Goal and Stretch are
+targets rather than measured errors. Blank future months remain records with
+`value=None`. The year/month Backcast grid and rolling Day-Ahead Backcast table
+remain distinct even when their months overlap. Different publication vintages
+also remain separate; retain `sourceFile`, series and cell coordinates when
+comparing them.
+
+ERCOT describes backcasts as model runs using actual weather and calendar
+inputs. They do not establish a forecast that was available in advance. See
+[ERCOT's explanation](https://www.ercot.com/gridinfo/load/forecast/2025) and the
+[verification receipt](../tools/inputs/monthly-performance/evidence.json).
diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 00000000..27fec1be
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,80 @@
+# Market-data workflows
+
+Run these examples from the repository with `ERCOT_USERNAME`, `ERCOT_PASSWORD`,
+and `ERCOT_SUBSCRIPTION_KEY` set locally. They use the generated typed client and
+write JSON Lines, one record per line. The output paths are overwritten on each
+run; choose a separate directory for each operating day or settlement point.
+
+## Prices and load for an operating day
+
+```sh
+uv run python -m examples.market_day 2026-09-01 --point HB_HOUSTON --output market-data/2026-09-01
+```
+
+The example follows every query page and writes:
+
+| File | Data | Useful inputs for |
+| --- | --- | --- |
+| `dam_prices.jsonl` | Hourly DAM settlement prices for the selected point | Retail hedging and day-ahead trading analysis |
+| `rt_prices.jsonl` | 15-minute RT settlement prices for the same point | Real-time exposure and battery revenue analysis |
+| `dam_ancillary_prices.jsonl` | DAM clearing prices for all returned ancillary-service types | Ancillary-service market analysis |
+| `actual_load.jsonl` | Hourly actual load for all eight weather zones and ERCOT | Demand features and retail forecasting |
+
+Use `--point LZ_HOUSTON` for a settlement load zone or another published hub/load-zone
+name. Weather zones and settlement load zones are different geographies. The files
+retain their original frequency, fields, nulls and DST flags. Settlement prices
+are distinct from SCED LMPs. Decimal values are serialized as strings to preserve
+precision; hour-ending labels remain source labels. These inputs can feed an
+analysis, but the example does not calculate trading returns or customer charges.
+
+This example uses row-query endpoints. For older data outside an endpoint's query
+retention, use its typed `_history.backfill()` reader; see the [historical download
+examples](../docs/usage.md). Exporting no rows is not proof that no archive exists.
+
+## Forecasts as they were published
+
+```sh
+uv run python -m examples.forecast_vintages 2019-01-01T00:30 2019-01-01T00:30 --output market-data/forecast-vintages.jsonl
+```
+
+Each line is a typed `ForecastVintage` containing the original archive `document`
+and a typed historical `forecast`. Bounds select inclusive ERCOT-local posting
+times. Every forecast issue is preserved, including repeated target dates or
+identical predicted values. Some older forecast rows have no embedded
+`postedDatetime`; the document's publication time remains available separately.
+
+For an as-issued backtest, select documents whose `postDatetime` is no later than
+the decision time, then select the desired forecast delivery date/hour. A delivery
+date or a monthly bundle's posting time does not establish when a forecast became
+available. Actual load and later forecast issues must not be substituted for a
+forecast available at an earlier decision time.
+
+Live checks of these functions are recorded in
+[`market-workflows-evidence.json`](../tools/inputs/market-workflows-evidence.json).
+They verify retrieval and serialization; they are not a forecast-accuracy backtest.
+
+
+## Retained settlement-price history
+
+```sh
+uv run python -m examples.price_history dam --point HB_HOUSTON --output dam-history.jsonl
+uv run python -m examples.price_history rt --point LZ_HOUSTON --output rt-history.jsonl
+```
+
+Both commands use the concrete typed DAM/RT reader's `backfill()` method. They
+combine monthly bundles and remaining individual archives, including publications
+found only in bundles. The output keeps original fields, decimal strings, nulls,
+and DST flags. Overlapping copies of a publication are retrieved once; distinct
+corrections remain separate, and rows are not sorted.
+
+Optional `--date-from YYYY-MM-DD` and `--date-to YYYY-MM-DD` filter inclusive
+**delivery dates**, after download. They do not supply publication bounds or
+reduce the amount downloaded. These are maximum-history workflows and can take
+considerable time; use `market_day` for bounded recent queries. The output file
+is overwritten, and an interrupted run can leave a partial file.
+
+The price-history exporter is checked with saved original DAM/RT CSV samples and
+mocked archive/bundle listings, including a bundle-only publication and an
+archive-only publication. This verifies its use of the existing backfill reader;
+it is not a new live comparison of every retained RT price row. See the
+[market-data guide](../docs/market-data.md) for verified ranges and remaining gaps.
diff --git a/examples/__init__.py b/examples/__init__.py
new file mode 100644
index 00000000..ce8cc8e6
--- /dev/null
+++ b/examples/__init__.py
@@ -0,0 +1 @@
+"""Runnable examples for the typed ERCOT client."""
diff --git a/examples/forecast_vintages.py b/examples/forecast_vintages.py
new file mode 100644
index 00000000..faf9decd
--- /dev/null
+++ b/examples/forecast_vintages.py
@@ -0,0 +1,50 @@
+"""Export historical forecasts with the original archive publication metadata."""
+
+import argparse
+from datetime import datetime
+from pathlib import Path
+
+from pydantic import BaseModel
+
+from tinyercot import Client, Document, np3_561_cd
+
+
+class ForecastVintage(BaseModel):
+ document: Document
+ forecast: np3_561_cd._7dLoadFcastByWznHistoryRow
+
+
+def export_forecast_vintages(
+ client: Client, posted_from: datetime, posted_to: datetime, path: Path
+) -> int:
+ """Keep separate issues even when their target dates or predicted values match.
+
+ Bounds use ERCOT local publication time. For a backtest, retain only issues
+ available at the decision time; never use the target date as an issue time.
+ """
+ path.parent.mkdir(parents=True, exist_ok=True)
+ count = 0
+ with path.open("w", encoding="utf-8") as output:
+ for publication in client.np3_561_cd._7d_load_fcast_by_wzn_history.publications(
+ posted_from=posted_from, posted_to=posted_to
+ ):
+ for forecast in publication.rows:
+ vintage = ForecastVintage(
+ document=publication.document, forecast=forecast
+ )
+ output.write(vintage.model_dump_json() + "\n")
+ count += 1
+ return count
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("posted_from", type=datetime.fromisoformat)
+ parser.add_argument("posted_to", type=datetime.fromisoformat)
+ parser.add_argument("--output", type=Path, required=True)
+ args = parser.parse_args()
+ with Client() as ercot:
+ count = export_forecast_vintages(
+ ercot, args.posted_from, args.posted_to, args.output
+ )
+ print(f"forecast_vintages: {count} rows")
diff --git a/examples/market_day.py b/examples/market_day.py
new file mode 100644
index 00000000..b0192fb4
--- /dev/null
+++ b/examples/market_day.py
@@ -0,0 +1,72 @@
+"""Export typed market inputs as JSON Lines, keeping source intervals separate."""
+
+import argparse
+from collections.abc import Iterable
+from datetime import date
+from pathlib import Path
+
+from pydantic import BaseModel
+
+from tinyercot import Client
+
+
+def write_rows(path: Path, rows: Iterable[BaseModel]) -> int:
+ """Preserve Decimal strings, nulls, field names and DST flags in each row."""
+ count = 0
+ with path.open("w", encoding="utf-8") as output:
+ for row in rows:
+ output.write(row.model_dump_json() + "\n")
+ count += 1
+ return count
+
+
+def export_market_day(
+ client: Client, day: date, point: str, directory: Path
+) -> dict[str, int]:
+ """Retrieve prices for a hub/load zone and system-wide load and AS inputs.
+
+ The four files retain their native frequency and locations. This example
+ does not join weather zones to settlement load zones or resolve corrections.
+ """
+ directory.mkdir(parents=True, exist_ok=True)
+ return {
+ "dam_prices": write_rows(
+ directory / "dam_prices.jsonl",
+ client.np4_190_cd.dam_stlmnt_pnt_prices_iter(
+ deliveryDateFrom=day, deliveryDateTo=day, settlementPoint=point
+ ),
+ ),
+ "rt_prices": write_rows(
+ directory / "rt_prices.jsonl",
+ client.np6_905_cd.spp_node_zone_hub_iter(
+ deliveryDateFrom=day, deliveryDateTo=day, settlementPoint=point
+ ),
+ ),
+ "dam_ancillary_prices": write_rows(
+ directory / "dam_ancillary_prices.jsonl",
+ client.np4_188_cd.dam_clear_price_for_cap_iter(
+ deliveryDateFrom=day, deliveryDateTo=day
+ ),
+ ),
+ "actual_load": write_rows(
+ directory / "actual_load.jsonl",
+ client.np6_345_cd.act_sys_load_by_wzn_iter(
+ operatingDayFrom=day, operatingDayTo=day
+ ),
+ ),
+ }
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument(
+ "day", type=date.fromisoformat, help="Operating day: YYYY-MM-DD"
+ )
+ parser.add_argument("--point", default="HB_HOUSTON", help="Settlement point name")
+ parser.add_argument("--output", type=Path, required=True, help="Output directory")
+ args = parser.parse_args()
+ with Client() as ercot:
+ for name, count in export_market_day(
+ ercot, args.day, args.point, args.output
+ ).items():
+ print(f"{name}: {count} rows")
diff --git a/examples/price_history.py b/examples/price_history.py
new file mode 100644
index 00000000..81840bf6
--- /dev/null
+++ b/examples/price_history.py
@@ -0,0 +1,71 @@
+"""Export retained DAM or RT settlement-price history as typed JSON Lines."""
+
+import argparse
+from datetime import date
+from pathlib import Path
+from typing import Literal
+
+from examples.market_day import write_rows
+from tinyercot import Client, np4_190_cd, np6_905_cd
+
+
+def export_price_history(
+ client: Client,
+ market: Literal["dam", "rt"],
+ point: str,
+ path: Path,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+) -> int:
+ """Combine bundles and archives, filtering delivery dates after decoding.
+
+ Unbounded publication selection includes bundle-only reports and older
+ individual archives. Distinct corrections remain separate. Output is not
+ sorted, and a date filter does not reduce the source downloads.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not exceed date_to")
+
+ def selected(
+ row: np4_190_cd.DamStlmntPntPricesRow | np6_905_cd.SppNodeZoneHubRow,
+ ) -> bool:
+ return (
+ row.settlementPoint == point
+ and (
+ date_from is None
+ or (row.deliveryDate is not None and row.deliveryDate >= date_from)
+ )
+ and (
+ date_to is None
+ or (row.deliveryDate is not None and row.deliveryDate <= date_to)
+ )
+ )
+
+ history = (
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history
+ if market == "dam"
+ else client.np6_905_cd.spp_node_zone_hub_history
+ )
+ path.parent.mkdir(parents=True, exist_ok=True)
+ return write_rows(path, history.backfill(where=selected, batch_size=25))
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("market", choices=("dam", "rt"))
+ parser.add_argument("--point", default="HB_HOUSTON", help="Settlement point name")
+ parser.add_argument("--output", type=Path, required=True, help="Output JSONL file")
+ parser.add_argument("--date-from", type=date.fromisoformat, help="Delivery date")
+ parser.add_argument("--date-to", type=date.fromisoformat, help="Delivery date")
+ args = parser.parse_args()
+ with Client() as ercot:
+ count = export_price_history(
+ ercot,
+ args.market,
+ args.point,
+ args.output,
+ date_from=args.date_from,
+ date_to=args.date_to,
+ )
+ print(f"{args.market}_prices: {count} rows")
diff --git a/pyproject.toml b/pyproject.toml
index 9423fa17..80ad86f0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -15,6 +15,15 @@ dependencies = [
"pydantic>=2.10.0",
]
+[project.optional-dependencies]
+files = [
+ "openpyxl>=3.1.5",
+ "xlrd>=2.0.2",
+ "msoffcrypto-tool>=6.0.0",
+ "python-calamine>=0.8.2",
+]
+pdf = ["pypdf>=6.12.0"]
+
[project.urls]
Homepage = "https://github.com/kvkenyon/tinyercot"
Repository = "https://github.com/kvkenyon/tinyercot"
@@ -22,11 +31,18 @@ Issues = "https://github.com/kvkenyon/tinyercot/issues"
[dependency-groups]
dev = [
+ "pypdf>=6.12.0",
+ "openpyxl>=3.1.5",
"mypy>=2.3.1",
+ "types-openpyxl>=3.1.5",
"pytest>=9.1.1",
"ruff>=0.16.6",
+ "types-xlrd>=2.0.0.20260518",
+ "xlrd>=2.0.2",
+ "msoffcrypto-tool>=6.0.0",
+ "python-calamine>=0.8.2",
]
[tool.ruff]
-extend-exclude = ["tinyercot/_generated.py"]
+extend-exclude = ["tinyercot/_generated.py", "tinyercot/_generated_esr.py"]
diff --git a/tests/test_backfill.py b/tests/test_backfill.py
new file mode 100644
index 00000000..e2241bed
--- /dev/null
+++ b/tests/test_backfill.py
@@ -0,0 +1,439 @@
+"""Combined-source backfills preserve publications and avoid repeated downloads."""
+
+# ERCOT publication timestamps are local and carry no UTC offset.
+# ruff: noqa: DTZ001
+
+import json
+from datetime import date, datetime
+from io import BytesIO
+from pathlib import Path
+from zipfile import BadZipFile, ZipFile
+
+import httpx
+import pytest
+
+from examples.price_history import export_price_history
+from tinyercot import Client
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs/history"
+
+
+def zipped(members):
+ out = BytesIO()
+ with ZipFile(out, "w") as archive:
+ for name, content in members.items():
+ archive.writestr(name, content)
+ return out.getvalue()
+
+
+def document(doc_id, posted="2018-01-01T12:00:00", name="report"):
+ return {"docId": doc_id, "friendlyName": name, "postDatetime": posted}
+
+
+class Source:
+ """One listing entry per page exercises both source paginators."""
+
+ def __init__(self, archives, bundles, payloads):
+ self.archives = archives
+ self.bundles = bundles
+ self.payloads = payloads
+ self.downloads = []
+ self.listings = []
+
+ def __call__(self, request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ kind = "bundle" if "/bundle/" in request.url.path else "archive"
+ if request.method == "POST":
+ ids = json.loads(request.content)["docIds"]
+ self.downloads.append((kind, ids))
+ return httpx.Response(200, content=self.payloads[kind, tuple(ids)])
+ if "/archive/" not in request.url.path and "/bundle/" not in request.url.path:
+ return httpx.Response(
+ 200,
+ json={
+ "emilId": "NP4-190-CD",
+ "name": "Report",
+ "reportTypeId": 1,
+ "downloadLimit": 2,
+ "status": "Active",
+ },
+ )
+ page = int(request.url.params["page"])
+ self.listings.append((kind, page))
+ docs = self.bundles if kind == "bundle" else self.archives
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": page, "totalPages": max(1, len(docs))},
+ "product": {
+ "emilId": "NP4-190-CD",
+ "name": "Report",
+ "reportTypeId": 1,
+ },
+ "bundles" if kind == "bundle" else "archives": docs[page - 1 : page],
+ },
+ )
+
+
+def run(source, product="np4_190_cd", method="dam_stlmnt_pnt_prices_history", **kwargs):
+ with (
+ httpx.Client(transport=httpx.MockTransport(source)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ return list(getattr(getattr(client, product), method).backfill(**kwargs))
+
+
+def price_report():
+ return zipped({"report.csv": (INPUTS / "np4-190-cd.csv").read_bytes()})
+
+
+def test_overlap_missing_months_and_distinct_corrections_preserve_rows():
+ report = price_report()
+ # Same rows in two distinct publications remain distinct. Overlapping bundle
+ # copies of publication 2 must not add another set of rows.
+ source = Source(
+ [document(i) for i in range(1, 6)],
+ [document(-1), document(-2)],
+ {
+ ("bundle", (-1,)): zipped(
+ {"2.cdr.report.zip": report, "3.cdr.report.zip": report}
+ ),
+ ("bundle", (-2,)): zipped({"2.cdr.report.zip": report}),
+ ("archive", (1, 4)): zipped({"1.zip": report, "4.zip": report}),
+ ("archive", (5,)): report,
+ },
+ )
+ rows = run(source, batch_size=25)
+ assert len(rows) == 15
+ assert rows[:3] == rows[3:6] == rows[6:9] == rows[9:12] == rows[12:]
+ assert source.downloads == [
+ ("bundle", [-1]),
+ ("bundle", [-2]),
+ ("archive", [1, 4]),
+ ("archive", [5]),
+ ]
+ assert source.listings == [("bundle", 1), ("bundle", 2)] + [
+ ("archive", i) for i in range(1, 6)
+ ]
+
+
+@pytest.mark.parametrize("bounded", [False, True])
+def test_bundle_only_reports_and_original_publication_bounds(bounded):
+ source = Source(
+ [document(1), document(2, "2018-02-01T12:00:00")],
+ [document(-1, "2018-01-31T23:59:59")],
+ {
+ ("bundle", (-1,)): zipped(
+ {f"{i}.cdr.20990101.report.zip": price_report() for i in (1, 2, 3)}
+ )
+ },
+ )
+ kwargs = (
+ {
+ "posted_from": datetime(2018, 1, 1),
+ "posted_to": datetime(2018, 1, 1, 23, 59, 59),
+ }
+ if bounded
+ else {}
+ )
+ rows = run(source, **kwargs, where=lambda row: row.settlementPoint == "AMISTAD_ALL")
+ assert len(rows) == (1 if bounded else 3)
+ assert source.downloads == [("bundle", [-1])]
+
+
+def test_bundle_month_optimization_never_loses_selected_archive():
+ source = Source(
+ [document(1)],
+ [document(-1, "2018-02-28T23:59:59")],
+ {("archive", (1,)): price_report()},
+ )
+ assert len(run(source, posted_to=datetime(2018, 1, 31))) == 3
+ assert source.downloads == [("archive", [1])]
+
+
+def test_empty_bounded_archive_listing_does_not_infer_bundle_member_posting_time():
+ source = Source([], [document(-1)], {})
+ assert run(source, posted_from=datetime(2018, 1, 1)) == []
+ assert source.listings == [("archive", 1)] and not source.downloads
+
+
+def test_unbounded_bundle_only_history_with_no_archive_listing():
+ source = Source(
+ [],
+ [document(-1)],
+ {("bundle", (-1,)): zipped({"1.cdr.report.zip": price_report()})},
+ )
+ assert len(run(source)) == 3
+
+
+@pytest.mark.parametrize(
+ "product,method,fixture,extension,count",
+ [
+ ("np4_190_cd", "dam_stlmnt_pnt_prices_history", "np4-190-cd.csv", "csv", 3),
+ ("np1_346_er", "outages_history", "np1-346-er-history-samples.xlsx", "xlsx", 3),
+ ("np4_765_er", "daily_values_history", "np4-765-er-old.pdf", "pdf", 1),
+ ],
+)
+def test_direct_bundle_members_use_inherited_typed_readers(
+ product, method, fixture, extension, count
+):
+ source = Source(
+ [document(1)],
+ [document(-1)],
+ {
+ ("bundle", (-1,)): zipped(
+ {"1.rpt.report." + extension: (INPUTS / fixture).read_bytes()}
+ )
+ },
+ )
+ assert len(run(source, product, method)) == count
+ assert source.downloads == [("bundle", [-1])]
+
+
+def test_mixed_correction_subtypes_and_repeated_rows():
+ csv = (INPUTS / "np4-196-m-spp-current.csv").read_bytes()
+ # Deliberately repeat every data row within a publication; backfill must
+ # only deduplicate document IDs, never row values.
+ repeated = csv + b"\n" + csv.split(b"\n", 1)[1]
+ report = zipped({"pricecorrection_DAM_SPP_2026.csv": repeated})
+ other = zipped({"pricecorrection_DAM_MCPC_2026.csv": csv})
+ source = Source(
+ [
+ document(1, name="pricecorrection_DAM_SPP_first"),
+ document(2, name="pricecorrection_DAM_MCPC_other"),
+ document(3, name="pricecorrection_DAM_SPP_corrected"),
+ ],
+ [document(-1)],
+ {
+ ("bundle", (-1,)): zipped(
+ {"1.cdr.report.zip": report, "2.cdr.report.zip": other}
+ ),
+ ("archive", (3,)): report,
+ },
+ )
+ rows = run(source, "np4_196_m", "dam_price_corrections_spp_history")
+ assert len(rows) == 12
+ assert source.downloads == [("bundle", [-1]), ("archive", [3])]
+
+
+@pytest.mark.parametrize(
+ "name,content,match",
+ [
+ ("report.zip", price_report(), "missing original document ID"),
+ ("1.cdr.report.zip", b"bad zip", "File is not a zip file"),
+ ("1.cdr.report.csv", b"wrong,header\n1,2\n", "unexpected CSV columns"),
+ ],
+)
+def test_unsupported_bundle_identity_or_payload_is_not_silent_success(
+ name, content, match
+):
+ source = Source(
+ [document(1)], [document(-1)], {("bundle", (-1,)): zipped({name: content})}
+ )
+ with pytest.raises(Exception, match=match):
+ run(source)
+
+
+@pytest.mark.parametrize(
+ "kwargs",
+ [
+ {"batch_size": 0},
+ {"posted_from": datetime(2018, 2, 1), "posted_to": datetime(2018, 1, 1)},
+ ],
+)
+def test_invalid_selection_fails_before_network(kwargs):
+ source = Source([], [], {})
+ with pytest.raises(ValueError):
+ run(source, **kwargs)
+ assert not source.listings and not source.downloads
+
+
+def disclosure_reports():
+ old = zipped(
+ {
+ "60d_SCED_SMNE_GEN_RES-01-MAY-14.csv": (
+ INPUTS / "np3-965-er--60_sced_smne_gen_res-history-samples.csv"
+ ).read_bytes()
+ }
+ )
+ current = zipped(
+ {
+ "60d_ESR_Data_in_SCED-06-SEP-26.csv": (
+ INPUTS / "np3-965-er--60d_sced_esr_data-history-current.csv"
+ ).read_bytes()
+ }
+ )
+ return old, current
+
+
+@pytest.mark.parametrize(
+ "bundled,batch_size", [(False, 1), (False, 25), (True, 1), (True, 25)]
+)
+def test_disclosure_backfill_crosses_absent_tables_in_both_sources(bundled, batch_size):
+ old, current = disclosure_reports()
+ if bundled:
+ bundles = [document(-1)]
+ payloads = {
+ ("bundle", (-1,)): zipped(
+ {"1.ext.disclosure.zip": old, "3.ext.disclosure.zip": current}
+ )
+ }
+ remaining = [2, 4]
+ else:
+ bundles, payloads, remaining = [], {}, [1, 2, 3, 4]
+ reports = {1: old, 2: old, 3: current, 4: current}
+ limit = min(batch_size, 2)
+ batches = [remaining[i : i + limit] for i in range(0, len(remaining), limit)]
+ payloads.update(
+ {
+ ("archive", tuple(batch)): zipped({f"{i}.zip": reports[i] for i in batch})
+ for batch in batches
+ }
+ )
+ source = Source([document(i) for i in reports], bundles, payloads)
+ rows = run(
+ source, "np3_965_er", "_60d_sced_esr_data_history", batch_size=batch_size
+ )
+ with Client() as client:
+ expected = list(client.np3_965_er._60d_sced_esr_data_history.read(current))
+ assert rows == expected * 2 and expected
+ assert source.downloads == ([("bundle", [-1])] if bundled else []) + [
+ ("archive", batch) for batch in batches
+ ]
+
+
+@pytest.mark.parametrize("bundled", [False, True])
+def test_named_table_absent_from_all_selected_disclosures_returns_no_rows(bundled):
+ old, _ = disclosure_reports()
+ kind, doc_id = ("bundle", -1) if bundled else ("archive", 1)
+ source = Source(
+ [document(1)],
+ [document(-1)] if bundled else [],
+ {(kind, (doc_id,)): zipped({"1.ext.report.zip": old})},
+ )
+ assert run(source, "np3_965_er", "_60d_sced_esr_data_history") == []
+ assert source.downloads == [(kind, [doc_id])]
+
+
+@pytest.mark.parametrize(
+ "bad",
+ [
+ zipped({}),
+ zipped({"report.xml": b" "}),
+ zipped({"nested.zip": b"corrupt"}),
+ zipped({"60d_ESR_Data_in_SCED-06-SEP-26.csv": b"wrong,columns\n1,2\n"}),
+ ],
+)
+def test_missing_table_handling_does_not_swallow_bad_downloads(bad):
+ source = Source([document(1)], [], {("archive", (1,)): bad})
+ with pytest.raises((ValueError, BadZipFile)):
+ run(source, "np3_965_er", "_60d_sced_esr_data_history")
+
+
+def test_explicit_disclosure_read_and_download_remain_strict():
+ old, _ = disclosure_reports()
+ source = Source([], [], {("archive", (1,)): old})
+ with (
+ httpx.Client(transport=httpx.MockTransport(source)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ history = client.np3_965_er._60d_sced_esr_data_history
+ with pytest.raises(ValueError, match="no CSV files matching"):
+ list(history.read(old))
+ with pytest.raises(ValueError, match="no CSV files matching"):
+ list(history.download([1]))
+
+
+def test_generic_uppercase_csv_reader_does_not_treat_missing_report_as_sparse_table():
+ source = Source(
+ [document(1)], [], {("archive", (1,)): zipped({"other.csv": b"a,b\n1,2\n"})}
+ )
+ with pytest.raises(ValueError, match="no CSV files matching"):
+ run(source, "np7_535_sg", "path_adders_history")
+
+
+@pytest.mark.parametrize(
+ ("market", "product", "delivery_day", "price"),
+ [
+ ("dam", "np4-190-cd", date(2014, 5, 2), "29.92"),
+ ("rt", "np6-905-cd", date(2014, 4, 30), "30.5"),
+ ],
+)
+def test_price_history_export_uses_delivery_dates_and_both_sources(
+ tmp_path, market, product, delivery_day, price
+):
+ report = zipped({"report.csv": (INPUTS / f"{product}.csv").read_bytes()})
+ source = Source(
+ [document(1), document(2)],
+ [document(-1)],
+ {
+ ("bundle", (-1,)): zipped({"2.report.zip": report, "3.report.zip": report}),
+ ("archive", (1,)): report,
+ },
+ )
+
+ def handle(request):
+ if "b2clogin" not in request.url.host:
+ assert product in request.url.path
+ assert "postDatetimeFrom" not in request.url.params
+ assert "postDatetimeTo" not in request.url.params
+ return source(request)
+
+ path = tmp_path / "history" / "prices.jsonl"
+ with (
+ httpx.Client(transport=httpx.MockTransport(handle)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ count = export_price_history(
+ client,
+ market,
+ "AMISTAD_ALL",
+ path,
+ date_from=delivery_day,
+ date_to=delivery_day,
+ )
+ rows = [json.loads(line) for line in path.read_text().splitlines()]
+ assert count == len(rows) == 3
+ assert all(r["deliveryDate"] == delivery_day.isoformat() for r in rows)
+ assert all(r["settlementPoint"] == "AMISTAD_ALL" for r in rows)
+ assert all(r["settlementPointPrice"] == price for r in rows)
+ assert all(r["DSTFlag"] is False for r in rows)
+ assert source.downloads == [("bundle", [-1]), ("archive", [1])]
+ assert (
+ export_price_history(
+ client, market, "AMISTAD_ALL", path, date_from=date(2020, 1, 1)
+ )
+ == 0
+ )
+ assert path.read_text() == ""
+
+
+@pytest.mark.parametrize("bundled", [False, True])
+def test_unbounded_first_rows_do_not_wait_for_later_archive_pages(bundled):
+ report = price_report()
+ source = Source(
+ [document(1), document(1), document(2)],
+ [document(-1)] if bundled else [],
+ {
+ ("bundle", (-1,)): zipped({"1.report.zip": report}),
+ ("archive", (1,)): report,
+ ("archive", (2,)): report,
+ },
+ )
+ with (
+ httpx.Client(transport=httpx.MockTransport(source)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ history = client.np4_190_cd.dam_stlmnt_pnt_prices_history
+ expected = list(history.read(report))
+ rows = history.backfill()
+ assert next(rows) == expected[0]
+ assert source.listings == (
+ [("bundle", 1)] if bundled else [("bundle", 1), ("archive", 1)]
+ )
+ assert list(rows) == expected[1:] + expected
+ assert source.downloads == [
+ ("bundle", [-1]) if bundled else ("archive", [1]),
+ ("archive", [2]),
+ ]
diff --git a/tests/test_capacity_changes.py b/tests/test_capacity_changes.py
new file mode 100644
index 00000000..12969ec3
--- /dev/null
+++ b/tests/test_capacity_changes.py
@@ -0,0 +1,245 @@
+from collections import Counter
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import CapacityProject, CapacityTotals, Client
+
+FIXTURE = (
+ Path(__file__).resolve().parents[1]
+ / "tools/inputs/public-tables/capacity-changes.zip"
+)
+
+
+@pytest.fixture(scope="module")
+def records():
+ with Client() as client:
+ return (
+ list(client.capacity_changes.read_projects(FIXTURE.read_bytes())),
+ list(client.capacity_changes.read_totals(FIXTURE.read_bytes())),
+ )
+
+
+def test_original_project_rows_dates_and_capacities(records):
+ actual = {(r.sourceMember, r.sourceSheet, r.sourceRow): r for r in records[0]}
+ expected_keys = set()
+ with ZipFile(FIXTURE) as archive:
+ for member in archive.namelist():
+ book = openpyxl.load_workbook(
+ BytesIO(archive.read(member)), read_only=True, data_only=True
+ )
+ try:
+ for sheet in book:
+ sheet.reset_dimensions()
+ rows = list(sheet.values)
+ start = next((r.index("INR") for r in rows if "INR" in r), None)
+ if start is None:
+ continue
+ labels = []
+ for n, cells in enumerate(rows, 1):
+ right = cells[start:]
+ if len(right) > 1 and right[1] == "Project Name":
+ labels = [v for v in right if v is not None]
+ elif len(right) > 1 and isinstance(right[1], str):
+ key = (member, sheet.title, n)
+ expected_keys.add(key)
+ row = actual[key]
+ original = dict(zip(labels, right))
+ assert row.identifier == right[0]
+ assert row.name == original["Project Name"]
+ assert row.county == original["County"]
+ assert row.projectedCOD == original["Projected COD"].date()
+ assert row.capacityMW == Decimal(
+ str(original["Capacity (MW)"])
+ )
+ assert row.reportedYear == original["Year"]
+ assert row.financialSecurity == original.get(
+ "Financial Security"
+ )
+ assert row.sourceColumns == labels
+ for field, header in (
+ ("interconnectionAgreementSigned", "IA Signed"),
+ (
+ "approvedForSynchronization",
+ "Approved for Synchronization",
+ ),
+ ):
+ value = original.get(header)
+ expected = (
+ value.date()
+ if isinstance(value, datetime)
+ else value
+ )
+ assert getattr(row, field) == expected
+ finally:
+ book.close()
+ assert set(actual) == expected_keys and len(actual) == len(records[0])
+
+
+def test_absent_project_table_and_original_monthly_periods(records):
+ projects, totals = records
+ early_battery = [
+ r
+ for r in totals
+ if "September_2018" in r.sourceMember and r.sourceSheet == "Battery Chart"
+ ]
+ assert [r.period for r in early_battery] == list(range(2012, 2019))
+ assert not any(
+ "September_2018" in r.sourceMember and r.sourceSheet == "Battery Chart"
+ for r in projects
+ )
+ monthly = next(r for r in totals if "November_2020_monthly" in r.sourceMember)
+ assert monthly.sourcePeriodLabel == "Year"
+ assert monthly.period == date(2020, 11, 20)
+ assert monthly.cumulativeInstalledAndSignedMW == Decimal("26874.980000000003")
+ assert monthly.cumulativeInstalledMW == Decimal("25120.58")
+ assert monthly.cumulativeSynchronizedMW == Decimal("1754.4")
+ assert monthly.cumulativeOperationalMW is None
+ assert "Cumulative MW Synchronized" in monthly.sourceColumns
+ for row in (early_battery[0], monthly):
+ assert CapacityTotals.model_validate_json(row.model_dump_json()) == row
+
+
+def test_agreement_statuses_resource_codes_and_project_comments(records):
+ projects, totals = records
+ statuses = {
+ r.interconnectionAgreementSigned
+ for r in projects
+ if isinstance(r.interconnectionAgreementSigned, str)
+ }
+ assert statuses == {"12/31/1899", "Not Required", "Date Not Available"}
+ dgr = next(r for r in projects if r.identifier == "BRP_PBL2_UNIT1")
+ assert dgr.projectedCOD == date(2020, 12, 31) and dgr.reportedYear == 2022
+ assert dgr.approvedForSynchronization == date(2021, 6, 25)
+ comment = next(r for r in projects if r.identifier == "21INR0538" and r.comments)
+ assert "rescinded on 3/9/2022" in comment.comments
+ assert any(
+ r.dgrComments
+ == "All Capacities have been approved for synchronization to the grid"
+ for r in totals
+ )
+ assert {"DGRs", "Small Generator", "Small Generators"} <= {
+ r.sourceGroup for r in projects
+ }
+ assert CapacityProject.model_validate_json(dgr.model_dump_json()) == dgr
+
+
+def test_corrected_financial_security_keeps_original_missing_values(records):
+ projects = [
+ r
+ for r in records[0]
+ if r.reportMonth == date(2023, 10, 1)
+ and r.sourceSheet == "Battery Chart"
+ and r.sourceGroup
+ ]
+ original = [r for r in projects if "Corrected" not in r.sourceMember]
+ corrected = [r for r in projects if "Corrected" in r.sourceMember]
+ assert len(original) == len(corrected) == 60
+ assert Counter(r.financialSecurity for r in original) == {None: 58, "Yes": 2}
+ assert Counter(r.financialSecurity for r in corrected) == {"Yes": 56, "No": 4}
+ assert all(
+ any("missing values" in note for note in r.sourceNotes) for r in corrected
+ )
+ assert all(not r.sourceNotes for r in original)
+
+
+def test_companion_project_dates_and_blank_capacity_series_stay_distinct(records):
+ projects, totals = records
+ repower = [
+ r
+ for r in projects
+ if r.reportMonth == date(2026, 7, 1) and r.identifier == "20INR0286"
+ ]
+ assert len(repower) == 2
+ assert {r.projectedCOD for r in repower} == {date(2026, 5, 1), date(2026, 12, 19)}
+ blank = [
+ r
+ for r in totals
+ if "April_2025.xlsx" in r.sourceMember
+ and "Small Generator" in r.sourceColumns
+ and r.smallGeneratorsMW is None
+ ]
+ assert {(r.sourceSheet, r.period) for r in blank} == {
+ ("Wind Chart", 2028),
+ ("Solar Chart", 2030),
+ }
+ latest = next(r for r in totals if "July_2026.xlsx" in r.sourceMember)
+ assert latest.cumulativeOperationalMW is not None
+ assert (
+ latest.cumulativeInstalledMW is None and latest.cumulativeSynchronizedMW is None
+ )
+
+
+@pytest.mark.parametrize("method", ["projects", "totals"])
+def test_anonymous_discovery_preserves_same_filename_urls(method):
+ basename = "Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx"
+ urls = [
+ f"https://www.ercot.com/files/docs/2018/12/{day}/{basename}"
+ for day in ("04", "11")
+ ]
+ with ZipFile(FIXTURE) as archive:
+ payloads = {
+ url: archive.read(url.removeprefix("https://www.ercot.com/files/docs/"))
+ for url in urls
+ }
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ if str(request.url) in payloads:
+ return httpx.Response(200, content=payloads[str(request.url)])
+ if request.url.path == "/gridinfo/resource":
+ return httpx.Response(
+ 200, text='2018 '
+ )
+ assert request.url.path == "/gridinfo/resource/2018"
+ return httpx.Response(
+ 200,
+ text="".join(
+ f'Capacity Changes by Fuel Type Charts, November 2018 '
+ for url in urls
+ ),
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ getattr(client.capacity_changes, method)(
+ where=lambda r: r.reportMonth == date(2018, 11, 1)
+ )
+ )
+ assert rows and {r.sourceFile.url for r in rows} == set(urls)
+ assert {r.sourceMember for r in rows} == {basename}
+
+
+def test_discovery_includes_monthly_prefix_and_original_capitalization():
+ links = {
+ "https://www.ercot.com/files/docs/2020/12/09/Capacity_Changes_by_Fuel_Type_Charts_November_2020_monthly.xlsx": "Monthly Capacity Changes by Fuel Type Charts, November 2020",
+ "https://www.ercot.com/files/docs/2023/09/07/capacity-changes-by-fuel-type-charts_august_2023.xlsx": "Capacity Changes By Fuel Type Charts August 2023",
+ "https://www.ercot.com/files/docs/2023/09/07/capacity-changes-by-fuel-type-charts_august_2023_plannedmonthly.xlsx": "Capacity Changes By Fuel Type Charts August 2023 Plannedmonthly",
+ }
+ page = "".join(f'{title} ' for url, title in links.items())
+ with (
+ httpx.Client(
+ transport=httpx.MockTransport(
+ lambda request: httpx.Response(200, text=page)
+ )
+ ) as http,
+ Client(client=http) as client,
+ ):
+ assert {f.url: f.title for f in client.capacity_changes.files()} == links
+
+
+def test_saved_bytes_without_a_filename_do_not_invent_report_month():
+ with ZipFile(FIXTURE) as archive:
+ data = archive.read(archive.namelist()[0])
+ with Client() as client:
+ rows = list(client.capacity_changes.read_projects(data))
+ assert rows and all(r.reportMonth is None and r.sourceFile is None for r in rows)
diff --git a/tests/test_client.py b/tests/test_client.py
index 1d8dd69e..ffbdf2ab 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -151,13 +151,22 @@ async def run():
asyncio.run(run())
-def test_invalid_arguments_are_rejected_by_type_checker(tmp_path):
+@pytest.mark.parametrize(
+ "service,method,parameter",
+ [
+ ("Client", "np4_190_cd.dam_stlmnt_pnt_prices", "deliveryDateFrom"),
+ ("ESRClient", "rptesr_m._4_sec_esr_charging_mw", "AGCExecTimeUTCFrom"),
+ ],
+)
+def test_invalid_arguments_are_rejected_by_type_checker(
+ tmp_path, service, method, parameter
+):
import subprocess
import sys
snippet = tmp_path / "invalid_usage.py"
snippet.write_text(
- "from tinyercot import Client\nc = Client()\nc.np4_190_cd.dam_stlmnt_pnt_prices(deliveryDateFrom=123)\nc.np4_190_cd.dam_stlmnt_pnt_prices(unknown_filter=True)\n"
+ f"from tinyercot import {service}\nc = {service}()\nc.{method}({parameter}=123)\nc.{method}(unknown_filter=True)\n"
)
result = subprocess.run(
[sys.executable, "-m", "mypy", str(snippet), "--follow-untyped-imports"],
@@ -183,6 +192,8 @@ def test_invalid_arguments_are_rejected_by_type_checker(tmp_path):
("combined_wind_solar", "combine-wind-solar"),
("system_demand", "system-wide-demand"),
("ancillary_services", "ancillary-services"),
+ ("sced_capacity", "capacity-available-sced"),
+ ("ancillary_capacity", "ancillary-service-capacity-monitor"),
],
)
def test_dashboard_methods_need_no_credentials(method, source):
@@ -227,3 +238,458 @@ def test_weather_forecast():
forecast = WeatherForecasts.model_validate(body).root
assert len(forecast) == len(body)
assert forecast[0].data["DFW"].high == int(body[0]["data"]["DFW"]["high"])
+
+
+def test_capacity_feeds_preserve_values_and_source_sections():
+ from datetime import datetime
+ from decimal import Decimal
+
+ from tinyercot._dashboards import AncillaryCapacitySnapshot, ScedCapacitySnapshot
+
+ capacity = json.loads(
+ (INPUTS / "dashboards/capacity-available-sced.json").read_text()
+ )
+ result = ScedCapacitySnapshot.model_validate(capacity)
+ for period in ("current", "previous"):
+ rows = getattr(result, period).data
+ for row, source in zip(rows, capacity[period]["data"], strict=True):
+ assert row.timestamp == datetime.fromisoformat(source["timestamp"])
+ assert row.epoch == source["epoch"]
+ assert row.dstFlag == source["dstFlag"]
+ assert row.increaseGenResESRs == Decimal(source["increaseGenResESRs"])
+ assert row.decreaseGenResESRs == Decimal(source["decreaseGenResESRs"])
+
+ body = json.loads(
+ (INPUTS / "dashboards/ancillary-service-capacity-monitor.json").read_text()
+ )
+ # Preserve fractional and negative telemetry instead of integer truncation.
+ body["data"]["systemAvailableCapacityGroup"][1][1] = "-6.125"
+ monitor = AncillaryCapacitySnapshot.model_validate(body)
+ for group, table in body["data"].items():
+ assert getattr(monitor.data, group).model_dump() == {
+ key: Decimal(str(value)) for key, value in table[1:]
+ }
+ assert monitor.lastUpdated == datetime.fromisoformat(body["lastUpdated"])
+ assert monitor.data.systemAvailableCapacityGroup.capClrDecreaseBp == Decimal(
+ "-6.125"
+ )
+ assert monitor == AncillaryCapacitySnapshot.model_validate(monitor.model_dump())
+
+
+@pytest.mark.parametrize(
+ "table",
+ [
+ [["wrong", "header"], ["regUpAwd", 1], ["regDownAwd", 2]],
+ [["key", "value"], ["regUpAwd", 1], ["regUpAwd", 2], ["regDownAwd", 3]],
+ [["key", "value"], ["regUpAwd", 1]],
+ [["key", "value"], ["regUpAwd", 1, 2], ["regDownAwd", 3]],
+ ],
+)
+def test_capacity_tables_reject_lost_or_ambiguous_values(table):
+ from pydantic import ValidationError
+
+ from tinyercot._dashboards import RegulationAwards
+
+ with pytest.raises(ValidationError):
+ RegulationAwards.model_validate(table)
+
+
+def test_public_real_time_conditions():
+ from datetime import datetime
+ from decimal import Decimal
+
+ source = (INPUTS / "dashboards/real-time-system-conditions.html").read_text()
+
+ def handler(request):
+ assert (
+ request.url
+ == "https://www.ercot.com/content/cdr/html/real_time_system_conditions.html"
+ )
+ assert "authorization" not in request.headers
+ return httpx.Response(200, text=source)
+
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ result = Client(client=http).dashboards.real_time_conditions()
+ assert result.lastUpdated == datetime.fromisoformat("2026-09-08T00:42:50")
+ assert result.lastUpdated.tzinfo is None
+ assert result.model_dump(exclude={"lastUpdated"}) == {
+ "currentFrequency": Decimal("59.984"),
+ "instantaneousTimeError": Decimal("-2.123"),
+ "consecutiveBaalExceedances": 0,
+ "actualSystemDemand": Decimal(65912),
+ "averageNetLoad": Decimal(48039),
+ "totalSystemCapacity": Decimal(86005),
+ "totalWindOutput": Decimal(17978),
+ "totalPvgrOutput": Decimal(0),
+ "currentSystemInertia": Decimal(328564),
+ "dcE": Decimal(-443),
+ "dcL": Decimal(70),
+ "dcN": Decimal(-218),
+ "dcR": Decimal(83),
+ "dcS": Decimal(0),
+ }
+
+
+@pytest.mark.parametrize("change", ["markup", "missing", "duplicate"])
+def test_real_time_conditions_use_labels_and_reject_incomplete_readings(change):
+ import re
+ from decimal import Decimal
+
+ source = (INPUTS / "dashboards/real-time-system-conditions.html").read_text()
+ row = re.search(
+ r"
\s*]*>Instantaneous Time Error .*? ", source, re.DOTALL
+ )[0]
+ if change == "missing":
+ source = source.replace(row, "")
+ elif change == "duplicate":
+ source = source.replace(row, row + row)
+ else:
+ # Moving the row and splitting its label across markup must preserve its meaning.
+ source = source.replace(row, "").replace("", row + "")
+ source = source.replace(
+ "Instantaneous Time Error", "Instantaneous Time Error"
+ )
+
+ with httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=source))
+ ) as http:
+ if change == "markup":
+ assert Client(
+ client=http
+ ).dashboards.real_time_conditions().instantaneousTimeError == Decimal(
+ "-2.123"
+ )
+ else:
+ with pytest.raises(ValueError):
+ Client(client=http).dashboards.real_time_conditions()
+
+
+@pytest.mark.parametrize(
+ "hubs_and_zones,source,count,first_point",
+ [(False, "current_np6788", 2, "7RNCHSLR_ALL"), (True, "hb_lz", 15, "HB_BUSAVG")],
+)
+def test_public_lmps_keep_price_components_and_changes(
+ hubs_and_zones, source, count, first_point
+):
+ from datetime import datetime
+ from decimal import Decimal
+
+ body = (INPUTS / "dashboards" / f"{source}.html").read_text()
+
+ def handler(request):
+ assert request.url.path == f"/content/cdr/html/{source}.html"
+ assert "authorization" not in request.headers
+ return httpx.Response(200, text=body)
+
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ result = Client(client=http).dashboards.real_time_lmps(
+ hubs_and_zones=hubs_and_zones
+ )
+ assert result.lastUpdated == datetime.fromisoformat("2026-09-08T00:50:15")
+ assert result.lastUpdated.tzinfo is None
+ assert result.RTRDPA == Decimal("0.71")
+ assert len(result.data) == count
+ row = result.data[0]
+ assert row.settlementPoint == first_point
+ assert row.LMP == Decimal("32.17")
+ assert row.lmpChange == Decimal("0.48")
+ assert row.lmpWithAdder == Decimal("32.88")
+ assert row.lmpWithAdderChange == Decimal("-0.01")
+
+
+@pytest.mark.parametrize(
+ "old,new",
+ [
+ ("5 Min Change to LMP", "Unknown Price"),
+ ("RTRDPA: $0.71", "Unknown: $0.71"),
+ ],
+)
+def test_public_lmps_reject_unknown_price_components(old, new):
+ body = (INPUTS / "dashboards/current_np6788.html").read_text()
+ assert old in body
+ body = body.replace(old, new)
+ with (
+ httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=body))
+ ) as http,
+ pytest.raises(ValueError),
+ ):
+ Client(client=http).dashboards.real_time_lmps()
+
+
+@pytest.mark.parametrize("point", ["HB_BUSAVG", "HB_HOUSTON"])
+def test_indicative_prices_preserve_runs_horizons_and_adder_semantics(point):
+ from datetime import datetime
+ from decimal import Decimal
+
+ name = "rtd_ind_lmp_lz_hb" + ("" if point == "HB_BUSAVG" else "_" + point)
+ body = (INPUTS / "dashboards" / f"{name}.html").read_text()
+
+ def handler(request):
+ assert request.url.path == f"/content/cdr/html/{name}.html"
+ assert "authorization" not in request.headers
+ return httpx.Response(200, text=body)
+
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ result = Client(client=http).dashboards.indicative_prices(point)
+ assert result.settlementPoint == point
+ assert result.includesReliabilityAdder is True
+ assert result.lastSCEDTimestamp == datetime.fromisoformat("2026-09-08T01:05:16")
+ assert result.lastSCEDTimestamp.tzinfo is None
+ assert len(result.data) == 2
+ run = result.data[0]
+ assert run.RTDTimestamp == datetime.fromisoformat("2026-09-08T01:05:03")
+ assert run.actualLMP == Decimal("36.14")
+ assert [interval.intervalId for interval in run.intervals] == list(range(1, 12))
+ assert [interval.minutesAhead for interval in run.intervals] == list(
+ range(5, 60, 5)
+ )
+ assert [interval.LMP for interval in run.intervals] == list(
+ map(
+ Decimal,
+ [
+ "36.14",
+ "34.57",
+ "32.33",
+ "31.92",
+ "31.41",
+ "31.07",
+ "30.69",
+ "30.12",
+ "29.69",
+ "29.47",
+ "29.40",
+ ],
+ )
+ )
+ assert type(result).model_validate_json(result.model_dump_json()) == result
+
+
+@pytest.mark.parametrize("point", ["INVALID", "HB_HOUSTON"])
+def test_indicative_prices_reject_unknown_or_mismatched_points(point):
+ body = (INPUTS / "dashboards/rtd_ind_lmp_lz_hb.html").read_text()
+ with (
+ httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=body))
+ ) as http,
+ pytest.raises(ValueError),
+ ):
+ Client(client=http).dashboards.indicative_prices(point)
+
+
+@pytest.mark.parametrize("change", ["horizon", "missing_price"])
+def test_indicative_prices_reject_ambiguous_or_truncated_horizons(change):
+ body = (INPUTS / "dashboards/rtd_ind_lmp_lz_hb.html").read_text()
+ if change == "horizon":
+ body = body.replace("(Time+55)", "(Unknown)")
+ else:
+ assert '29.40 ' in body
+ body = body.replace('29.40 ', "", 1)
+ with (
+ httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=body))
+ ) as http,
+ pytest.raises(ValueError),
+ ):
+ Client(client=http).dashboards.indicative_prices()
+
+
+def test_single_bundle_400_uses_published_get_download():
+ calls = []
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ calls.append(request)
+ if request.method == "POST":
+ assert json.loads(request.content) == {"docIds": [-593019152]}
+ return httpx.Response(
+ 400, json={"message": "Your request could not be processed."}
+ )
+ assert request.url.path == "/api/public-reports/bundle/np4-190-cd"
+ assert request.url.params["download"] == "-593019152"
+ return httpx.Response(200, content=b"recovered zip bytes")
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ assert (
+ client.download("NP4-190-CD", [-593019152], kind="bundle")
+ == b"recovered zip bytes"
+ )
+ assert [r.method for r in calls] == ["POST", "GET"]
+
+
+@pytest.mark.parametrize(
+ "kind,ids,status",
+ [
+ ("archive", [123], 400),
+ ("bundle", [-123, -456], 400),
+ ("bundle", [-123], 403),
+ ],
+)
+def test_other_download_failures_are_not_reinterpreted(kind, ids, status):
+ calls = []
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ calls.append(request)
+ return httpx.Response(status, json={"message": "failed"})
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ pytest.raises(httpx.HTTPStatusError) as error,
+ ):
+ client.download("NP4-190-CD", ids, kind=kind)
+ assert error.value.response.status_code == status
+ assert len(calls) == 1
+
+
+def test_bundle_get_failure_propagates():
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ return httpx.Response(400 if request.method == "POST" else 404)
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ pytest.raises(httpx.HTTPStatusError) as error,
+ ):
+ client.download("NP4-190-CD", [-123], kind="bundle")
+ assert error.value.response.status_code == 404
+
+
+@pytest.mark.parametrize(
+ "filename", ["system-wide-demand.json", "system-wide-demand-before-day-ahead.json"]
+)
+def test_system_demand_preserves_available_data_before_day_ahead_publication(filename):
+ from datetime import datetime
+ from decimal import Decimal
+
+ raw = (INPUTS / "dashboards" / filename).read_bytes()
+ body = json.loads(raw, parse_float=Decimal)
+ with httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, content=raw))
+ ) as http:
+ snapshot = Client(client=http).dashboards.system_demand()
+ missing_forecasts = 0
+ for name in ("previousDay", "currentDay", "nextDay"):
+ for row, source in zip(
+ getattr(snapshot, name).data, body[name]["data"], strict=True
+ ):
+ assert row.timestamp == datetime.fromisoformat(source["timestamp"])
+ assert row.hourEnding == source["hourEnding"]
+ assert row.epoch == source["epoch"]
+ assert row.dstFlag == source["dstFlag"]
+ for key in (
+ "currentLoadForecast",
+ "dayAheadForecast",
+ "currentDayHsl",
+ "dayAheadHsl",
+ "systemLoad",
+ ):
+ value = source.get(key)
+ assert getattr(row, key) == (
+ Decimal(value) if value is not None else None
+ )
+ missing_forecasts += row.dayAheadForecast is None
+ if filename.endswith("before-day-ahead.json"):
+ assert missing_forecasts == 24
+ assert snapshot.currentDay.data[0].systemLoad == Decimal("66748.26")
+ assert all(row.dayAheadHsl is None for row in snapshot.nextDay.data)
+ assert all(row.currentLoadForecast is not None for row in snapshot.nextDay.data)
+
+
+@pytest.mark.parametrize(
+ "filename", ["combine-wind-solar.json", "combine-wind-solar-before-day-ahead.json"]
+)
+def test_wind_solar_preserves_null_day_ahead_forecasts_and_actual_zeroes(filename):
+ from datetime import datetime
+ from decimal import Decimal
+
+ raw = (INPUTS / "dashboards" / filename).read_bytes()
+ body = json.loads(raw, parse_float=Decimal)
+ with httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, content=raw))
+ ) as http:
+ snapshot = Client(client=http).dashboards.combined_wind_solar()
+ for name in ("currentDay", "nextDay"):
+ actual = getattr(snapshot, name).data
+ assert actual.keys() == body[name]["data"].keys()
+ for key, source in body[name]["data"].items():
+ for field, value in actual[key].model_dump().items():
+ original = source.get(field)
+ if field == "timestamp":
+ assert value == datetime.fromisoformat(original)
+ else:
+ assert value == original
+ if filename.endswith("before-day-ahead.json"):
+ for row in snapshot.nextDay.data.values():
+ assert row.copHslWindDayAhead is None
+ assert row.stwpfDayAhead is None
+ assert row.wgrppDayAhead is None
+ assert row.copHslSolarDayAhead is None
+ assert row.stppfDayAhead is None
+ assert row.pvgrppDayAhead is None
+ assert row.stwpf is not None
+ first = next(iter(snapshot.currentDay.data.values()))
+ assert first.copHslSolarDayAhead == Decimal(0)
+ assert first.stppfDayAhead == Decimal(0)
+
+
+def test_real_time_lmps_preserve_prices_when_a_change_is_unavailable():
+ import re
+ from decimal import Decimal
+ from html import unescape
+ from zipfile import ZipFile
+
+ with ZipFile(INPUTS / "dashboards/current_np6788-missing-change.zip") as archive:
+ body = archive.read("current_np6788.html").decode()
+ with httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=body))
+ ) as http:
+ snapshot = Client(client=http).dashboards.real_time_lmps()
+ rows = [
+ [
+ " ".join(unescape(re.sub(r"<[^>]+>", " ", c)).split())
+ for c in re.findall(r"]*>(.*?) ", tr, re.DOTALL)
+ ]
+ for tr in re.findall(r"]*>(.*?) ", body, re.DOTALL)
+ ][2:]
+ assert len(snapshot.data) == len(rows) == 1123
+ missing = []
+ for typed, raw in zip(snapshot.data, rows, strict=True):
+ assert typed.settlementPoint == raw[0]
+ assert typed.LMP == Decimal(raw[1])
+ assert typed.lmpChange == (None if raw[2] == "-" else Decimal(raw[2]))
+ assert typed.lmpWithAdder == Decimal(raw[3])
+ assert typed.lmpWithAdderChange == Decimal(raw[4])
+ if typed.lmpChange is None:
+ missing.append(typed.settlementPoint)
+ assert missing == ["APPALOSA_ALL", "HB_NORTH", "MIDP_SLR_RN"]
+
+
+@pytest.mark.parametrize("change", ["-1.25", "0.00", "unrecognized"])
+def test_price_change_marker_does_not_hide_real_numbers_or_invalid_data(change):
+ from decimal import Decimal
+
+ from tinyercot._dashboards import RealTimeLmp
+
+ values = {
+ "Settlement Point": "HB_NORTH",
+ "LMP": "-12.50",
+ "5 Min Change to LMP": change,
+ "RTRDPA + LMP": "-12.40",
+ "5 Min Change to RTRDPA + LMP": "0.00",
+ }
+ if change == "unrecognized":
+ with pytest.raises(ValueError):
+ RealTimeLmp.model_validate(values)
+ else:
+ row = RealTimeLmp.model_validate(values)
+ assert row.lmpChange == Decimal(change)
+ assert row.LMP == Decimal("-12.50")
diff --git a/tests/test_coincident_peaks.py b/tests/test_coincident_peaks.py
new file mode 100644
index 00000000..44fba605
--- /dev/null
+++ b/tests/test_coincident_peaks.py
@@ -0,0 +1,317 @@
+from collections import Counter
+from datetime import date, datetime, time
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, CoincidentPeakAllocation, MonthlyCoincidentPeak
+from tinyercot._coincident_peaks import URL
+
+FIXTURE = Path(__file__).resolve().parents[1] / "tools/inputs/four-cp/allocations.zip"
+MONTHLY = FIXTURE.with_name("monthly.zip")
+
+
+@pytest.fixture(scope="module")
+def allocations():
+ with Client() as client:
+ return list(client.coincident_peaks.read_allocations(FIXTURE.read_bytes()))
+
+
+def test_complete_captured_annual_tables(allocations):
+ assert len(allocations) == 4345
+ assert {r.year for r in allocations} == set(range(1996, 2021))
+ assert Counter(r.kind for r in allocations) == {
+ "allocation": 4212,
+ "comparison": 124,
+ "revision_detail": 9,
+ }
+ assert all(
+ [p.month for p in r.peaks] == ([] if r.year == 1997 else [6, 7, 8, 9])
+ for r in allocations
+ )
+ assert all(
+ p.timestamp is None or p.timestamp.year == r.year
+ for r in allocations
+ for p in r.peaks
+ )
+ assert (
+ CoincidentPeakAllocation.model_validate_json(allocations[0].model_dump_json())
+ == allocations[0]
+ )
+
+
+def test_kw_values_and_historical_loss_adjustments(allocations):
+ row = next(r for r in allocations if r.year == 1996 and r.entity == "Brazos")
+ assert row.unit == "kW"
+ assert row.averageLoad == Decimal("1061825.0")
+ assert row.gsuLosses == Decimal("2062.9")
+ assert row.lossAdjustmentFactor == Decimal("0.03519461844061518")
+ assert row.peaks[0].load == Decimal("1107900.0")
+ assert row.peaks[0].timestamp == datetime.fromisoformat("1996-06-19T17:00:00")
+ assert row.peaks[0].timestamp.tzinfo is None
+ assert row.duns is None
+ assert row.adjustmentUnit == "factor"
+
+
+def test_summary_below_monthly_tables_preserves_percent_units(allocations):
+ row = next(r for r in allocations if r.year == 1997)
+ assert row.entity == "Austin Electric Utility" and row.controlArea == "AEUX"
+ assert row.peaks == []
+ assert row.averageLoad == Decimal("1783073.3")
+ assert row.adjustmentUnit == "percent"
+ assert row.lossAdjustmentFactor == Decimal("1.87853")
+ assert (
+ row.sourceSection
+ == "PRELIMINARY 1997 Four Coincident Peak Load Calculation as of 2/16/98"
+ )
+
+
+def test_revisions_are_retained_without_recomputing_shares(allocations):
+ rows = [
+ r
+ for r in allocations
+ if r.year == 2008
+ and r.entity == "CENTERPOINT ENERGY HOUSTON ELECTRIC LLC (TDSP)"
+ ]
+ assert len(rows) == 2 and rows[0].sourceMember != rows[1].sourceMember
+ assert rows[0].loadRatioShare == Decimal("0.25391237655230137")
+ assert rows[1].oldLoadRatioShare == rows[0].loadRatioShare
+ assert rows[1].loadRatioShareDifference == Decimal("0.000007873824533377594")
+ assert rows[1].loadRatioShare == Decimal("0.25392025037683474")
+
+
+def test_revision_sections_keep_year_and_missing_share(allocations):
+ rows = [r for r in allocations if r.kind == "revision_detail"]
+ assert all(r.year == 2019 for r in rows)
+ assert rows[0].sourceSection == "ORIGINALLY FILED NUMBERS"
+ revised = next(
+ r
+ for r in rows
+ if r.sourceSection == "NEW AEP TEXAS CENTRAL LOAD PLUS Sharyland/McAllen"
+ )
+ assert revised.averageLoad == Decimal("5019.420838")
+ assert revised.loadRatioShare is None
+ assert revised.peaks[0].timestamp == datetime.fromisoformat("2019-06-19T17:00:00")
+
+
+def test_modern_mw_and_string_identifiers(allocations):
+ row = next(
+ r
+ for r in allocations
+ if r.year == 2020 and r.entity == "AEP TEXAS CENTRAL COMPANY (TDSP)"
+ )
+ assert row.unit == "MW" and row.entityCode == "5"
+ assert row.duns == "007924772"
+ assert row.averageLoad == Decimal("4981.34814")
+ assert row.peaks[-1].timestamp == datetime.fromisoformat("2020-09-01T14:30:00")
+ assert row.gsuLosses is None
+
+
+def test_missing_peak_clocks_are_not_inferred(allocations):
+ row = next(r for r in allocations if r.year == 2001)
+ assert all(p.timestamp is None for p in row.peaks)
+
+
+def test_missing_first_month_does_not_drop_entity():
+ with ZipFile(FIXTURE) as archive:
+ name = next(n for n in archive.namelist() if n.endswith("Calculation2020.xlsx"))
+ book = openpyxl.load_workbook(BytesIO(archive.read(name)))
+ book.worksheets[0].cell(4, 4).value = None
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with Client() as client:
+ row = next(client.coincident_peaks.read_allocations(data.getvalue()))
+ assert row.entity == "AEP TEXAS CENTRAL COMPANY (TDSP)"
+ assert row.peaks[0].load is None
+ assert row.peaks[1].load == Decimal("5051.084372")
+
+
+def test_anonymous_download_and_query_filters():
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(200, content=FIXTURE.read_bytes())
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.coincident_peaks.allocations(
+ year_from=2020, year_to=2020, entity="AEP TEXAS CENTRAL COMPANY (TDSP)"
+ )
+ )
+ assert len(rows) == 1 and rows[0].year == 2020
+ with pytest.raises(ValueError, match="year_from"):
+ list(client.coincident_peaks.allocations(year_from=2020, year_to=2019))
+ assert requested == [URL]
+
+
+@pytest.fixture(scope="module")
+def monthly():
+ with Client() as client:
+ return list(client.coincident_peaks.read_monthly(MONTHLY.read_bytes()))
+
+
+def test_monthly_tables_keep_every_publication(monthly):
+ assert len(monthly) == 7633
+ assert (
+ len({(r.sourceMember, r.sourceSheet, r.sourceHeading) for r in monthly}) == 86
+ )
+ assert {r.timestamp.year for r in monthly} == set(range(1997, 2008))
+ assert all(r.timestamp.tzinfo is None for r in monthly)
+ assert (
+ MonthlyCoincidentPeak.model_validate_json(monthly[0].model_dump_json())
+ == monthly[0]
+ )
+
+
+def test_submitted_loads_missing_values_and_table_footnotes(monthly):
+ rows = [
+ r
+ for r in monthly
+ if r.timestamp.year == 1997 and r.entity == "Austin Electric Utility"
+ ]
+ june = rows[0]
+ assert june.timestamp == datetime.fromisoformat("1997-06-30T17:00:00")
+ assert june.loadType == "submitted" and june.unit == "kW"
+ assert june.load == Decimal(1640586)
+ assert june.gsuLossesKW == Decimal(2377)
+ assert june.transmissionLossesKW is None
+ assert june.controlAreaTotalKW == Decimal(1642963)
+ assert june.demandReportRelativeDifference == Decimal("-0.000022519780888639415")
+ assert june.sourceRow == 4
+ assert any("metered load" in note for note in june.sourceNotes)
+ assert not any("metered load" in note for note in rows[1].sourceNotes)
+ assert june.settlementRun is None
+
+
+def test_extended_submitted_report_values_and_row_note(monthly):
+ row = next(r for r in monthly if r.timestamp.year == 1998 and r.sourceRowNote)
+ assert row.entity == "Central Power & Light" and row.entityCode == "CPLC"
+ assert row.controlArea == "CSWS"
+ assert row.sisLoadReport == Decimal(5988)
+ assert row.sisDifferenceMW == Decimal("-21.179399999999987")
+ assert (
+ row.sourceRowNote
+ == "Rayburn Country (RCEC) was double counted in the D&E Report"
+ )
+
+
+def test_monthly_loss_adjustments_and_changed_peak_dates(monthly):
+ row = next(
+ r for r in monthly if r.timestamp.year == 2001 and r.entityCode == "ACPL"
+ )
+ assert row.loadType == "coincident_peak" and row.load == Decimal("3180561.6")
+ assert row.lossAdjustmentPercent == Decimal("4.11072")
+ assert row.loadAtDeliveryPointKW == Decimal("3054979.9")
+ assert row.vamoLossPercent == Decimal("4.01376")
+ assert row.loadResponsibilityKW == Decimal("3177599.5")
+ assert {
+ r.timestamp
+ for r in monthly
+ if r.timestamp.year == 2001 and r.timestamp.month == 8
+ } == {
+ datetime.fromisoformat("2001-08-15T16:30:00"),
+ datetime.fromisoformat("2001-08-22T16:45:00"),
+ }
+
+
+def test_monthly_totals_and_unlabeled_source_rows(monthly):
+ unnamed = [r for r in monthly if r.entity is None]
+ assert len(unnamed) == 3
+ assert unnamed[0].sourceRow == 59
+ assert unnamed[0].load == Decimal("49274873.4")
+ row = next(r for r in monthly if r.timestamp.year == 2001 and r.entity == "Total")
+ assert row.vamoLossPercent is None
+ assert row.loadResponsibilityKW == Decimal("50910818.1")
+ row = next(r for r in monthly if r.timestamp.year == 2002 and r.entity == "Total")
+ assert row.entityCode is None and row.duns is None
+ assert row.load == Decimal("51805.597200000026")
+ assert row.energyMWh == Decimal("12951.399300000006")
+
+
+def test_settlement_stage_date_only_and_invalid_source_date(monthly):
+ runs = [r.settlementRun for r in monthly if r.settlementRun]
+ assert {r.kind for r in runs} == {None, "FINAL", "INTERIM", "TRUE-UP"}
+ interim = next(r for r in runs if r.sourceDate == "1/22/04")
+ assert interim.runDate == date(2004, 1, 22)
+ assert interim.runTime is None
+ typo = next(r for r in runs if r.sourceDate == "9/17/032")
+ assert typo.runDate is None and typo.runTime == time(21, 48)
+ unspecified = next(r for r in runs if r.sourceDate == "10/5/03")
+ assert unspecified.channel == 5 and unspecified.kind is None
+
+
+def test_monthly_filters_use_peak_date_despite_misnamed_sheet():
+ with Client() as client:
+ rows = list(
+ client.coincident_peaks.read_monthly(
+ MONTHLY.read_bytes(),
+ date_from=date(2005, 8, 23),
+ date_to=date(2005, 8, 23),
+ entity="CENTERPOINT ENERGY HOUSTON ELECTRIC LLC (TDSP)",
+ )
+ )
+ row = next(r for r in rows if r.sourceMember.endswith("2005-08CP.xls"))
+ assert row.sourceSheet == "July"
+ assert row.timestamp == datetime.fromisoformat("2005-08-23T16:30:00")
+ assert row.load == Decimal("14802.5748") and row.unit == "MW"
+ assert row.energyMWh == Decimal("3700.6437")
+ assert row.sourceNotes == ["PRELIMINARY AUGUST 4CP"]
+ assert row.settlementRun.kind == "FINAL"
+
+
+def test_monthly_download_and_invalid_bounds():
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(200, content=MONTHLY.read_bytes())
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.coincident_peaks.monthly(
+ date_from=date(1997, 6, 30),
+ date_to=date(1997, 6, 30),
+ entity="Austin Electric Utility",
+ )
+ )
+ assert len(rows) == 1
+ with pytest.raises(ValueError, match="date_from"):
+ list(
+ client.coincident_peaks.monthly(
+ date_from=date(2000, 1, 1), date_to=date(1999, 1, 1)
+ )
+ )
+ assert requested == [URL]
+
+
+def test_monthly_unknown_columns_report_source():
+ book = openpyxl.Workbook()
+ book.active.append(["Peak Interval Demand 06/13/2001 17:00"])
+ book.active.append(["New header", "Unrecognized data"])
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with (
+ Client() as client,
+ pytest.raises(
+ ValueError, match="saved.xlsx/Sheet: Missing monthly peak columns"
+ ),
+ ):
+ list(
+ client.coincident_peaks.read_monthly(data.getvalue(), filename="saved.xlsx")
+ )
diff --git a/tests/test_daily_4cp.py b/tests/test_daily_4cp.py
new file mode 100644
index 00000000..f4f7e9cc
--- /dev/null
+++ b/tests/test_daily_4cp.py
@@ -0,0 +1,131 @@
+import json
+from collections import Counter
+from datetime import date, timedelta
+from decimal import Decimal
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, CoincidentPeakDay, PublicFile
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs"
+FIXTURE = INPUTS / "coincident-peaks/daily-2017.xlsx"
+SOURCE = json.loads((INPUTS / "public-daily-4cp-evidence.json").read_text())
+
+
+def test_every_original_interval_and_settlement():
+ original = openpyxl.load_workbook(FIXTURE, read_only=True, data_only=True)
+ counts = Counter()
+ dates = {}
+ first = {}
+ with Client() as client:
+ records = client.coincident_peaks.read_daily(
+ FIXTURE.read_bytes(), filename=FIXTURE.name
+ )
+ try:
+ for sheet in original:
+ rows = sheet.values
+ units = next(rows)
+ headers = next(rows)
+ for line, values in enumerate(rows, 3):
+ record = next(records)
+ assert record.entity == values[0]
+ assert record.operatingDay == values[1].date()
+ assert record.channel == values[2]
+ assert record.settlement == sheet.title
+ assert record.sourceSheet == sheet.title
+ assert record.sourceRow == line
+ assert record.sourceUnitHeader == units[0]
+ assert record.sourceMember == FIXTURE.name
+ assert record.sourceFile is None
+ assert len(record.intervals) == 96
+ for i, (interval, label, value) in enumerate(
+ zip(record.intervals, headers[3:], values[3:], strict=True), 1
+ ):
+ assert interval.interval == i
+ assert interval.sourceLabel == str(label)
+ assert interval.energyMWh == Decimal(str(value))
+ counts["numericMWh"] += 1
+ dates.setdefault((record.settlement, record.entity), set()).add(
+ record.operatingDay
+ )
+ counts[record.settlement] += 1
+ if record.settlement not in first:
+ first[record.settlement] = record
+ assert (
+ CoincidentPeakDay.model_validate_json(
+ record.model_dump_json()
+ )
+ == record
+ )
+ assert next(records, None) is None
+ finally:
+ original.close()
+ assert counts == {"INITIAL": 16445, "FINAL": 16445, "numericMWh": 3157440}
+ assert first["INITIAL"].channel == 1 and first["FINAL"].channel == 2
+ assert first["INITIAL"].intervals[0].energyMWh == Decimal("9578.99825")
+ assert first["FINAL"].intervals[0].energyMWh == Decimal("9582.152845")
+ assert first["FINAL"].intervals[-1].sourceLabel == "24:00"
+ assert len(dates) == 270
+ complete = {date(2017, 6, 1) + timedelta(days=i) for i in range(122)}
+ for (settlement, entity), actual in dates.items():
+ if entity == "FARMERS ELECTRIC CO OP INC PRTN RC (TDSP)":
+ assert len(actual) == 97 and actual < complete
+ else:
+ assert actual == complete
+
+
+def test_actual_index_discovery_and_anonymous_date_filtered_query():
+ with ZipFile(INPUTS / "loss-factors/indexes.zip") as z:
+ pages = {n.removesuffix(".html"): z.read(n) for n in z.namelist()}
+ requested = []
+ data = FIXTURE.read_bytes()
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(
+ 200,
+ content=data
+ if str(request.url) == SOURCE["url"]
+ else pages[request.url.path.rsplit("/", 1)[-1]],
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ files = client.coincident_peaks.daily_files()
+ assert files == [PublicFile(url=SOURCE["url"], title=SOURCE["title"])]
+ requested.clear()
+ records = list(
+ client.coincident_peaks.daily(
+ date_from=date(2017, 6, 1),
+ date_to=date(2017, 6, 1),
+ where=lambda r: r.entity == "ERCOT",
+ )
+ )
+ assert len(requested) == 27
+ assert len(records) == 2
+ assert {r.settlement for r in records} == {"INITIAL", "FINAL"}
+ assert all(r.sourceFile == files[0] for r in records)
+ assert all(r.operatingDay == date(2017, 6, 1) for r in records)
+
+
+def test_inverted_bounds_fail_before_download_or_parse():
+ def handler(request):
+ pytest.fail("Inverted dates must not trigger a download")
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ for query in [
+ client.coincident_peaks.daily,
+ lambda **kw: client.coincident_peaks.read_daily(b"", **kw),
+ ]:
+ with pytest.raises(ValueError, match="date_from must not be after date_to"):
+ list(query(date_from=date(2017, 9, 1), date_to=date(2017, 6, 1)))
diff --git a/tests/test_distribution_coefficients.py b/tests/test_distribution_coefficients.py
new file mode 100644
index 00000000..b58737f0
--- /dev/null
+++ b/tests/test_distribution_coefficients.py
@@ -0,0 +1,161 @@
+import csv
+from collections import Counter
+from datetime import date
+from decimal import Decimal
+from io import BytesIO, StringIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import msoffcrypto
+import openpyxl
+import pytest
+import xlrd
+
+from tinyercot import Client, DistributionLossCoefficient, PublicFile
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs"
+MANIFEST = list(
+ csv.DictReader(
+ StringIO((INPUTS / "public-distribution-coefficients-sources.csv").read_text())
+ )
+)
+FIXTURE = INPUTS / "public-tables/distribution-loss-coefficients.zip"
+
+
+@pytest.fixture(scope="module")
+def coefficients():
+ with Client() as client:
+ return list(client.distribution_loss_coefficients.read(FIXTURE.read_bytes()))
+
+
+def test_all_original_parameters_and_baselines(coefficients):
+ with ZipFile(FIXTURE) as z:
+ for file in MANIFEST:
+ data = z.read(file["member"])
+ if file["defaultProtection"] == "True":
+ office = msoffcrypto.OfficeFile(BytesIO(data))
+ office.load_key(password="VelvetSweatshop")
+ output = BytesIO()
+ office.decrypt(output)
+ data = output.getvalue()
+ if file["member"].endswith(".xls"):
+ with xlrd.open_workbook(file_contents=data) as book:
+ sheet = book.sheet_by_name("TDSP and ERCOT Variables")
+ raw = [sheet.row_values(i) for i in range(sheet.nrows)]
+ else:
+ book = openpyxl.load_workbook(
+ BytesIO(data), read_only=True, data_only=True
+ )
+ raw = list(book["TDSP and ERCOT Variables"].values)
+ book.close()
+ records = [r for r in coefficients if r.sourceMember == file["member"]]
+ assert len(records) == int(file["rows"])
+ header = raw[0].index("DSP =")
+ columns = [
+ i for i in range(header + 1, len(raw[0])) if raw[0][i] not in (None, "")
+ ]
+ assert len(records) == len(columns)
+ baseline = raw[0].index("ERCOT")
+ for r, column in zip(records, columns, strict=True):
+ assert (r.tdsp, r.lossCode) == (raw[0][column], raw[1][column])
+ legacy = raw[2][header] != "F1 ="
+ assert r.formula == ("k_adlf" if legacy else "f1_f2_f3")
+ modern_values = (r.f1, r.f2, r.f3)
+ legacy_values = (
+ r.tdspAverageIntervalLoadMWh,
+ r.kFactor,
+ r.annualDistributionLossFactor,
+ )
+ assert (legacy_values if legacy else modern_values) == tuple(
+ Decimal(str(raw[i][column])) for i in (2, 3, 4)
+ )
+ assert (modern_values if legacy else legacy_values) == (
+ None,
+ None,
+ None,
+ )
+ assert r.ercotAnnualEnergyMWh == Decimal(str(raw[2][baseline + 1]))
+ assert r.ercotIntervalCount == raw[3][baseline + 1]
+ assert r.ercotAverageIntervalLoadMWh == Decimal(
+ str(raw[4][baseline + 1])
+ )
+ assert r.sourceBaselinePeriod == raw[1][baseline]
+ assert r.sourceColumn == column + 1
+ assert r.sourceSheet == "TDSP and ERCOT Variables"
+ assert (
+ DistributionLossCoefficient.model_validate_json(r.model_dump_json())
+ == r
+ )
+ assert len(coefficients) == 466
+ assert Counter(r.formula for r in coefficients) == {"k_adlf": 114, "f1_f2_f3": 352}
+ assert {r.year for r in coefficients} == set(range(2001, 2027))
+
+
+def test_source_year_conflict_baseline_and_period_variants(coefficients):
+ latest = next(r for r in coefficients if r.year == 2026)
+ assert "2025" in latest.sourceWorkbookTitle
+ assert latest.baselineFrom == date(2024, 9, 1)
+ assert latest.baselineThrough == date(2025, 8, 31)
+ assert latest.ercotAverageIntervalLoadMWh == Decimal(13668)
+ assert latest.ercotPeakLoadMW == Decimal(83941)
+ earliest = next(r for r in coefficients if r.year == 2001)
+ assert earliest.baselineFrom == date(2000, 1, 1)
+ assert earliest.baselineThrough == date(2000, 12, 31)
+ assert earliest.ercotPeakLoadMW is None
+ assert any(r.tdsp.endswith(" ") for r in coefficients)
+ assert any(r.f2 is not None and r.f2 < 0 for r in coefficients)
+ assert len({r.sourceMember for r in coefficients if r.year == 2024}) == 2
+ assert {r.formula for r in coefficients if r.year == 2007} == {"k_adlf", "f1_f2_f3"}
+ assert len({r.ercotAnnualEnergyMWh for r in coefficients if r.year == 2007}) == 2
+
+
+def test_original_discovery_and_anonymous_typed_query():
+ index = (INPUTS / "public-tables/distribution-loss-index.html").read_bytes()
+ with ZipFile(FIXTURE) as z:
+ files = {}
+ for f in MANIFEST:
+ bundle = BytesIO()
+ with ZipFile(bundle, "w") as archive:
+ archive.writestr(f["member"], z.read(f["member"]))
+ archive.writestr("provider-methodology.xlsx", b"unrelated attachment")
+ files[f["url"]] = bundle.getvalue()
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(200, content=files.get(str(request.url), index))
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ discovered = client.distribution_loss_coefficients.files()
+ assert {(f.title, f.url) for f in discovered} == {
+ (f["title"], f["url"]) for f in MANIFEST
+ }
+ requested.clear()
+ records = list(
+ client.distribution_loss_coefficients.rows(where=lambda r: r.year == 2024)
+ )
+ assert len(records) == 32
+ assert len(requested) == 29
+ assert len({r.sourceFile.url for r in records}) == 2
+ assert all(isinstance(r.sourceFile, PublicFile) for r in records)
+
+
+def test_saved_summary_filename_and_missing_table():
+ with ZipFile(FIXTURE) as z:
+ member = MANIFEST[0]["member"]
+ data = z.read(member)
+ with Client() as client:
+ unnamed = next(client.distribution_loss_coefficients.read(data))
+ assert unnamed.year is None
+ named = next(client.distribution_loss_coefficients.read(data, filename=member))
+ assert named.year == 2026 and named.sourceMember == member
+ empty = BytesIO()
+ with ZipFile(empty, "w") as z:
+ z.writestr("methodology.txt", "No numerical summary")
+ with pytest.raises(ValueError, match="no distribution-loss summary"):
+ list(client.distribution_loss_coefficients.read(empty.getvalue()))
diff --git a/tests/test_esr.py b/tests/test_esr.py
new file mode 100644
index 00000000..e01927ed
--- /dev/null
+++ b/tests/test_esr.py
@@ -0,0 +1,169 @@
+# ruff: noqa: SIM117, DTZ001, DTZ007
+# ESR source timestamps deliberately have no encoded timezone offset.
+"""Separate ESR credentials and routes, with captured API and archive contracts."""
+
+import asyncio
+import csv
+import json
+from datetime import datetime
+from decimal import Decimal
+from io import BytesIO, StringIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+
+from tinyercot import Client, ESRClient, rptesr_m
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs/esr"
+
+
+def payload(name):
+ return json.loads((INPUTS / f"{name}.json").read_text())
+
+
+def test_service_credentials_are_isolated_and_esr_refreshes(monkeypatch):
+ monkeypatch.setenv("ERCOT_USERNAME", "u")
+ monkeypatch.setenv("ERCOT_PASSWORD", "p")
+ monkeypatch.setenv("ERCOT_SUBSCRIPTION_KEY", "reports-key")
+ monkeypatch.setenv("ERCOT_ESR_SUBSCRIPTION_KEY", "esr-key")
+ tokens = 0
+ denied = False
+ seen = []
+
+ def handler(request):
+ nonlocal tokens, denied
+ if "b2clogin" in request.url.host:
+ tokens += 1
+ return httpx.Response(200, json={"id_token": f"token{tokens}"})
+ service = request.url.path.split("/")[2]
+ assert request.headers["Ocp-Apim-Subscription-Key"] == (
+ "esr-key" if service == "public-data" else "reports-key"
+ )
+ seen.append(service)
+ if service == "public-data" and not denied:
+ denied = True
+ return httpx.Response(401)
+ return httpx.Response(200, json=payload("version"))
+
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ with Client(client=http) as reports, ESRClient(client=http) as esr:
+ assert reports.version().info.version == esr.version().info.version
+ assert seen == ["public-reports", "public-data", "public-data"]
+ assert tokens == 3
+ monkeypatch.delenv("ERCOT_ESR_SUBSCRIPTION_KEY")
+ with ESRClient() as esr:
+ with pytest.raises(ValueError, match="ERCOT_ESR_SUBSCRIPTION_KEY"):
+ esr.version()
+
+
+def test_esr_pagination_filters_and_async_share_contract():
+ calls = []
+ stamp = datetime(2025, 12, 4, 23, 50)
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "token"})
+ assert request.url.path == "/api/public-data/rptesr-m/4_sec_esr_charging_mw"
+ assert request.headers["Ocp-Apim-Subscription-Key"] == "esr"
+ assert request.url.params["AGCExecTimeFrom"] == stamp.isoformat()
+ assert request.url.params["DSTFlag"] == "false"
+ assert request.url.params["ESRChargingMWFrom"] == "0.01"
+ page = int(request.url.params.get("page", 1))
+ calls.append(page)
+ body = payload("sample")
+ body["_meta"].update(totalPages=2, totalRecords=2, currentPage=page, pageSize=1)
+ body["data"] = [body["data"][page - 1]]
+ return httpx.Response(200, json=body)
+
+ args = {
+ "AGCExecTimeFrom": stamp,
+ "DSTFlag": False,
+ "ESRChargingMWFrom": Decimal("0.01"),
+ "size": 1,
+ }
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ with ESRClient("u", "p", "esr", client=http) as esr:
+ rows = list(esr.rptesr_m._4_sec_esr_charging_mw_iter(**args))
+ assert rows[0].ESRChargingMW == Decimal("1684.38782")
+ assert rows[0].AGCExecTimeUTC == datetime(2025, 12, 5, 5, 54, 58)
+ assert rows[0].AGCExecTime == datetime(2025, 12, 4, 23, 54, 58)
+ assert rows[0].DSTFlag is False
+
+ async def run():
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ async with httpx.AsyncClient(
+ transport=httpx.MockTransport(handler)
+ ) as ahttp:
+ async with ESRClient(
+ "u", "p", "esr", client=http, async_client=ahttp
+ ) as esr:
+ page = await esr.rptesr_m._4_sec_esr_charging_mw_async(**args)
+ assert page.data == rows[:1]
+ assert [
+ r
+ async for r in esr.rptesr_m._4_sec_esr_charging_mw_iter_async(
+ **args
+ )
+ ] == rows
+
+ asyncio.run(run())
+ assert calls == [1, 2, 1, 1, 2]
+
+
+def test_esr_metadata_download_and_empty_bundles():
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "token"})
+ assert request.url.path.startswith("/api/public-data/")
+ path = request.url.path.removeprefix("/api/public-data/")
+ if request.method == "POST":
+ assert path == "archive/rptesr-m/download"
+ assert json.loads(request.content) == {"docIds": [156101]}
+ return httpx.Response(200, content=(INPUTS / "recent.zip").read_bytes())
+ fixture = {
+ "": "products",
+ "rptesr-m": "product",
+ "archive/rptesr-m": "archive",
+ "bundle/rptesr-m": "bundle",
+ }[path]
+ return httpx.Response(200, json=payload(fixture))
+
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ with ESRClient("u", "p", "esr", client=http) as esr:
+ assert (
+ esr.products()[0].emilId == esr.product("RPTESR-M").emilId == "RPTESR-M"
+ )
+ assert esr.archives("RPTESR-M", size=1).product.emilId == "RPTESR-M"
+ assert list(esr.iter_documents("RPTESR-M", kind="bundle")) == []
+ assert (
+ len(
+ list(esr.rptesr_m._4_sec_esr_charging_mw_history.download([156101]))
+ )
+ == 75
+ )
+
+
+@pytest.mark.parametrize("name", ["oldest", "middle", "recent"])
+def test_original_esr_archive_cells(name):
+ data = (INPUTS / f"{name}.zip").read_bytes()
+ with ZipFile(BytesIO(data)) as outer:
+ with ZipFile(BytesIO(outer.read(outer.namelist()[0]))) as inner:
+ originals = list(
+ csv.DictReader(StringIO(inner.read(inner.namelist()[0]).decode()))
+ )
+ with ESRClient() as esr:
+ rows = list(esr.rptesr_m._4_sec_esr_charging_mw_history.read(data))
+ assert len(rows) == len(originals) == 75
+ for row, raw in zip(rows, originals, strict=True):
+ assert isinstance(row, rptesr_m._4SecEsrChargingMwRow)
+ assert row.AGCExecTime == datetime.strptime(
+ raw["AGC_EXEC_TIME"], "%m/%d/%Y %H:%M:%S"
+ )
+ assert row.AGCExecTimeUTC == datetime.strptime(
+ raw["AGC_EXEC_TIME_UTC"], "%m/%d/%Y %H:%M:%S"
+ )
+ assert row.DSTFlag == (raw["AGC_EXEC_TIME_DST"] == "Y")
+ assert row.systemDemand == Decimal(raw["SYSTEM_DEMAND"])
+ assert row.ESRChargingMW == Decimal(raw["ESR_CHARGING_MW"])
diff --git a/tests/test_forecast_performance.py b/tests/test_forecast_performance.py
new file mode 100644
index 00000000..46fcf55e
--- /dev/null
+++ b/tests/test_forecast_performance.py
@@ -0,0 +1,208 @@
+# ruff: noqa: SIM117
+"""Regression samples retain original cells, including formula-error tails."""
+
+import json
+from datetime import datetime
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+from openpyxl import load_workbook
+
+from tinyercot import Client
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs"
+ROOT = INPUTS / "forecast-performance"
+SAMPLES = json.loads((ROOT / "samples.json").read_text())
+
+
+def sample_bytes(sample):
+ with ZipFile(ROOT / "samples.zip") as archive:
+ return archive.read(sample["member"])
+
+
+@pytest.mark.parametrize("sample", SAMPLES, ids=lambda s: s["title"])
+def test_original_hourly_and_summary_cells(sample):
+ data = sample_bytes(sample)
+ with Client() as client:
+ hourly = {
+ (r.sourceSheet, r.sourceRow): r
+ for r in client.load_forecast_performance.read(data)
+ }
+ summaries = {
+ (r.sourceSheet, r.sourceRow, r.sourceColumn): r
+ for r in client.load_forecast_performance.read_summaries(data)
+ }
+ book = load_workbook(BytesIO(data), read_only=True, data_only=True)
+ hours_checked = summaries_checked = 0
+ for sheet in book:
+ source = sheet.iter_rows(values_only=True)
+ modern = next(source)[0] == "Date & Time"
+ columns = (
+ {
+ 1: "actual",
+ 2: "selected",
+ 3: "E",
+ 4: "E1",
+ 5: "E2",
+ 6: "E3",
+ 7: "M",
+ 8: "X",
+ 10: "sourceHour",
+ 11: "error",
+ 12: "under",
+ 13: "over",
+ }
+ if modern
+ else {
+ 1: "actual",
+ 2: "selected",
+ 3: "A3",
+ 4: "A6",
+ 5: "E",
+ 6: "E1",
+ 7: "E2",
+ 8: "E3",
+ 9: "M",
+ 12: "sourceHour",
+ 13: "error",
+ 14: "under",
+ 15: "over",
+ 16: "frequencyUnder",
+ 17: "frequencyOver",
+ 18: "mape",
+ }
+ )
+ chart_kind = "average_error"
+ for line, cells in enumerate(source, 2):
+ if any(c not in (None, "") for c in cells[: 14 if modern else 19]):
+ row = hourly[sheet.title, line]
+ for col, field in columns.items():
+ value = cells[col]
+ if isinstance(value, str) and value.startswith("#"):
+ assert getattr(row, field) is None
+ assert row.sourceMarkers[field] == value
+ else:
+ assert getattr(row, field) == (
+ None if value in (None, "") else Decimal(str(value))
+ )
+ if isinstance(cells[0], str):
+ expected = datetime.strptime( # noqa: DTZ007
+ cells[0], "%m/%d/%Y %H:%M" if modern else "%d%b%Y:%H:%M:%S"
+ )
+ assert row.timestamp == expected
+ else:
+ assert row.timestamp is None
+ assert row.hour == (
+ int(row.sourceHour)
+ if row.sourceHour is not None
+ and 1 <= row.sourceHour <= 24
+ and row.sourceHour == int(row.sourceHour)
+ else None
+ )
+ hours_checked += 1
+ col = 15 if modern else 31 if sheet.title == "ERCOT" else 25
+ if not modern and cells[col] in ("Hour", "HE"):
+ chart_kind = "frequency" if cells[col] == "HE" else "average_error"
+ columns2 = [(col, chart_kind)]
+ if modern:
+ columns2.append((19, "frequency"))
+ elif cells[19] not in (None, ""):
+ columns2.append((19, "monthly_mape"))
+ for col, kind in columns2:
+ if cells[col] in (None, "", "Hour", "HE"):
+ continue
+ row = summaries[sheet.title, line, col + 1]
+ assert row.kind == kind
+ if kind == "monthly_mape":
+ assert row.hour is None
+ assert row.sourceBucket == "Monthly"
+ values = [("mape", cells[col])]
+ else:
+ assert row.sourceBucket == str(cells[col])
+ assert row.hour == (
+ int(cells[col])
+ if isinstance(cells[col], (int, float))
+ else None
+ )
+ fields = (
+ ("frequencyUnder", "frequencyOver")
+ if kind == "frequency"
+ else ("under", "over")
+ )
+ values = list(zip(fields, cells[col + 1 : col + 3], strict=True))
+ for field, value in values:
+ if isinstance(value, str) and value.startswith("#"):
+ assert getattr(row, field) is None
+ assert row.sourceMarkers[field] == value
+ else:
+ assert getattr(row, field) == (
+ None if value in (None, "") else Decimal(str(value))
+ )
+ summaries_checked += 1
+ book.close()
+ assert hours_checked == len(hourly) > 0
+ assert summaries_checked == len(summaries) > 0
+
+
+def test_missing_actuals_and_calculation_only_rows_are_distinct():
+ with Client() as client:
+ service = client.load_forecast_performance
+ january = next(s for s in SAMPLES if "January 2026" in s["title"])
+ rows = list(
+ service.read(sample_bytes(january), where=lambda r: r.region == "ERCOT")
+ )
+ assert rows[-1].timestamp == datetime.fromisoformat("2026-02-01T00:00:00")
+ assert rows[-1].actual is None and rows[-1].selected is not None
+ assert rows[-1].hour is None
+ june = next(s for s in SAMPLES if "June 2025" in s["title"])
+ tails = list(
+ service.read(sample_bytes(june), where=lambda r: r.timestamp is None)
+ )
+ assert tails
+ assert any(
+ r.mape is None and r.sourceMarkers.get("mape") == "#DIV/0!" for r in tails
+ )
+ assert any(
+ r.sourceMarkers.get("errorTimestamp") in ("0", "00:00:00") for r in tails
+ )
+ assert all(r.actual is None for r in tails)
+
+
+def test_discovery_includes_mislabeled_metrics_and_attaches_source_file():
+ sources = json.loads((ROOT / "sources.json").read_text())
+ january = next(s for s in SAMPLES if "January 2026" in s["title"])
+ with ZipFile(INPUTS / "peak-forecasts/indexes.zip") as archive:
+ pages = {n: archive.read(n) for n in archive.namelist()}
+
+ def handler(request):
+ if request.url.path.startswith("/files/"):
+ assert str(request.url) == january["url"]
+ return httpx.Response(200, content=sample_bytes(january))
+ year = request.url.path.rsplit("/", 1)[-1]
+ return httpx.Response(
+ 200, content=pages[f"{year}.html" if year.isdigit() else "root.html"]
+ )
+
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ with Client(client=http) as client:
+ service = client.load_forecast_performance
+ files = service.files()
+ assert {f.url for f in files} == {f["url"] for f in sources}
+ service.files = lambda: [next(f for f in files if f.url == january["url"])]
+ rows = list(
+ service.rows(
+ where=lambda r: r.sourceFile is not None and r.region == "ERCOT"
+ )
+ )
+ summaries = list(
+ service.summaries(
+ where=lambda r: r.sourceFile is not None and r.kind == "frequency"
+ )
+ )
+ assert rows and summaries
+ assert rows[0].sourceFile.title == january["title"]
+ assert summaries[0].hour == 1
diff --git a/tests/test_fuel_mix.py b/tests/test_fuel_mix.py
new file mode 100644
index 00000000..1f762575
--- /dev/null
+++ b/tests/test_fuel_mix.py
@@ -0,0 +1,191 @@
+from datetime import date, time
+from decimal import Decimal
+from functools import lru_cache
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+
+from tinyercot import Client
+from tinyercot._fuel_mix import INDEX_URL
+
+FIXTURE = (
+ Path(__file__).resolve().parents[1] / "tools/inputs/history/fuel-mix-originals.zip"
+)
+
+
+@lru_cache
+def sample(year):
+ with ZipFile(FIXTURE) as archive:
+ name = next(n for n in archive.namelist() if str(year) in n)
+ return name, archive.read(name)
+
+
+def rows(client, year):
+ name, data = sample(year)
+ return client.fuel_mix.read(data, filename=name)
+
+
+@pytest.mark.parametrize(
+ "year,count",
+ [
+ (2007, 2190),
+ (2008, 2227),
+ (2010, 2555),
+ (2011, 2931),
+ (2013, 3285),
+ (2016, 3294),
+ (2017, 3285),
+ (2025, 3650),
+ (2026, 2120),
+ ],
+)
+def test_original_daily_counts(year, count):
+ with Client() as client:
+ assert sum(1 for _ in rows(client, year)) == count
+
+
+def test_old_combined_label_and_precise_interval_values():
+ with Client() as client:
+ row = next(
+ r
+ for r in rows(client, 2007)
+ if r.operatingDay == date(2007, 1, 1) and r.fuel == "Coal"
+ )
+ assert row.totalMWh == Decimal("314608.6399")
+ assert row.intervals[0].energyMWh == Decimal("3376.329577")
+ assert row.intervals[0].ending == time(0, 15)
+ assert row.intervals[-1].ending == time(0)
+ assert len(row.intervals) == 96 and row.settlementType is None
+ assert row.sourceMember == "IntGenByFuel2007.xls"
+
+
+def test_monthly_and_annual_totals_keep_original_units_and_labels():
+ with Client() as client:
+ name, data = sample(2007)
+ old = list(client.fuel_mix.read_summaries(data, filename=name))
+ name, data = sample(2026)
+ current = list(client.fuel_mix.read_summaries(data, filename=name))
+ coal = next(r for r in old if r.fuel == "Coal")
+ assert (coal.year, coal.month, coal.energy, coal.unit) == (
+ 2007,
+ None,
+ Decimal("113912250.23"),
+ "MWh",
+ )
+ biomass = [r for r in current if r.fuel == "Biomass"]
+ assert len(biomass) == 13
+ assert biomass[0].sourcePeriod == "Jan*" and biomass[0].energy == Decimal(
+ "55.105695"
+ )
+ assert biomass[7].energy is None and biomass[7].month == 8
+ assert biomass[-1].energy == Decimal("292.478075") and biomass[-1].unit == "GWh"
+
+
+def test_unlabelled_monthly_subtotal_is_not_a_fake_daily_row():
+ name, data = sample(2008)
+ with Client() as client:
+ unlabelled = [
+ r
+ for r in client.fuel_mix.read_summaries(data, filename=name)
+ if r.fuel is None
+ ]
+ assert len(unlabelled) == 1
+ assert (unlabelled[0].year, unlabelled[0].month, unlabelled[0].energy) == (
+ 2008,
+ 4,
+ Decimal("22167854.158047"),
+ )
+
+
+def test_known_malformed_cells_preserve_original_text():
+ with Client() as client:
+ november = next(r for r in rows(client, 2010) if r.sourceSheet == "Nov10")
+ errors = [
+ (r, i) for r in rows(client, 2011) for i in r.intervals if i.sourceError
+ ]
+ invalid = next(i for i in november.intervals if i.sourceError)
+ assert invalid.energyMWh is None and invalid.sourceError == "1/0/1900 0:00"
+ assert invalid.sourceHeader == "DST1" and invalid.ending is None and invalid.dst
+ assert [(r.fuel, i.sourceError, i.energyMWh) for r, i in errors] == [
+ ("Sun", "1.00E", None),
+ ("Sun", "6.00E", None),
+ ]
+
+
+def test_unlabelled_zero_columns_are_retained_with_source_positions():
+ with Client() as client:
+ row = next(r for r in rows(client, 2011) if r.sourceSheet == "Aug11")
+ unknown = [i for i in row.intervals if not i.sourceHeader]
+ assert [i.sourceColumn for i in unknown] == [100, 101, 102, 103]
+ assert all(i.energyMWh == 0 and i.ending is None and not i.dst for i in unknown)
+
+
+def test_dst_blanks_negative_storage_and_settlement_status():
+ with Client() as client:
+ wanted = {
+ (date(2025, 3, 9), "Coal"),
+ (date(2025, 11, 2), "Coal"),
+ (date(2025, 1, 1), "WSL"),
+ }
+ selected = {
+ (r.operatingDay, r.fuel): r
+ for r in rows(client, 2025)
+ if (r.operatingDay, r.fuel) in wanted
+ }
+ july = next(r for r in rows(client, 2026) if r.operatingDay == date(2026, 7, 1))
+ spring = selected[(date(2025, 3, 9), "Coal")]
+ assert len(spring.intervals) == 96
+ assert [i.ending for i in spring.intervals if i.energyMWh is None] == [
+ time(2, 15),
+ time(2, 30),
+ time(2, 45),
+ time(3),
+ ]
+ fall = selected[(date(2025, 11, 2), "Coal")]
+ assert len(fall.intervals) == 100
+ assert [i.sourceHeader for i in fall.intervals[-4:]] == [
+ "01:15 (DST)",
+ "01:30 (DST)",
+ "01:45 (DST)",
+ "02:00 (DST)",
+ ]
+ assert all(i.dst and i.energyMWh is not None for i in fall.intervals[-4:])
+ assert selected[(date(2025, 1, 1), "WSL")].totalMWh < 0
+ assert spring.settlementType == "FINAL" and july.settlementType == "INITIAL"
+
+
+def test_anonymous_index_discovery_and_date_filter():
+ requests = []
+ name, data = sample(2026)
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requests.append(str(request.url))
+ if str(request.url) == INDEX_URL:
+ return httpx.Response(
+ 200,
+ text=f"""
+ Fuel Mix Report: 2007 - 2024
+ Fuel Mix Report: 2026
+ Unrelated workbook
+ """,
+ )
+ assert request.url.path.endswith(name)
+ return httpx.Response(200, content=data)
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ result = list(
+ client.fuel_mix.rows(date_from=date(2026, 7, 1), date_to=date(2026, 7, 1))
+ )
+ assert len(result) == 10 and all(r.operatingDay == date(2026, 7, 1) for r in result)
+ assert len(requests) == 2
+
+
+def test_summary_year_requires_original_filename_for_standalone_modern_file():
+ with Client() as client, pytest.raises(ValueError, match="original filename"):
+ list(client.fuel_mix.read_summaries(sample(2026)[1]))
diff --git a/tests/test_generation_keys.py b/tests/test_generation_keys.py
new file mode 100644
index 00000000..3695dd49
--- /dev/null
+++ b/tests/test_generation_keys.py
@@ -0,0 +1,294 @@
+from collections import Counter
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, GenerationProfileKey
+
+ROOT = Path(__file__).resolve().parents[1] / "tools/inputs/generation-profiles/keys"
+WIND20 = "ERCOT_WindProfiles_1980-2020_Key-public.xlsx"
+WIND21 = "ERCOT-WindProfiles-1980-2021-Key-public.xlsx"
+SOLAR20 = "ERCOT_SolarPVProfiles_1980-2020_Key-public.xlsx"
+SOLAR21 = "ERCOT-SolarPVProfiles-1980-2021-Key-public.xlsx"
+
+# Original worksheet data extents, including both repeated-header solar sections.
+TABLES = [
+ (
+ WIND20,
+ "Op&Planned_Wind-Summary",
+ range(2, 157),
+ ("siteNumber", "commonName", "county", "newFor"),
+ ),
+ (
+ WIND20,
+ "Op&Planned_Wind-Unit_Codes",
+ range(2, 229),
+ ("commonName", "unitCode", "siteNumber", "newFor"),
+ ),
+ (
+ WIND20,
+ "Hypo_Wind-Summary",
+ range(2, 150),
+ (
+ "siteNumber",
+ "capacityMW",
+ "xCoordinate",
+ "yCoordinate",
+ "county",
+ "distanceToOperationalOrQueued",
+ "newFor",
+ "iecClass",
+ ),
+ ),
+ (
+ WIND21,
+ "Op&Planned_Wind-Summary",
+ range(2, 215),
+ (
+ "siteNumber",
+ "commonName",
+ "county",
+ "cdrZone",
+ "newFor",
+ "capacityMW",
+ "plantStatus",
+ ),
+ ),
+ (
+ WIND21,
+ "Op&Planned_Wind-Unit_Codes",
+ range(2, 354),
+ ("commonName", "unitCode", "siteNumber", "newFor"),
+ ),
+ (
+ SOLAR20,
+ "Utility_Operational&Planned",
+ [*range(3, 29), *range(33, 60)],
+ (
+ "unitCode",
+ "latitude",
+ "longitude",
+ "county",
+ "cdrZone",
+ "capacityMW",
+ "trackingSystem",
+ "trackingType",
+ "tilt",
+ "azimuth",
+ "dcAcRatio",
+ "inverters",
+ "modules",
+ "modeledIn",
+ ),
+ ),
+ (
+ SOLAR20,
+ "Utility_Hypothetical",
+ range(2, 141),
+ (
+ "siteNumber",
+ "typeCode",
+ "capacityMW",
+ "latitude",
+ "longitude",
+ "county",
+ "cdrZone",
+ ),
+ ),
+ (
+ SOLAR20,
+ "DGPV_metro",
+ range(2, 14),
+ ("siteNumber", "metroArea", "developmentIntensity", "capacityMW"),
+ ),
+ (
+ SOLAR20,
+ "DGPV_rural",
+ range(2, 218),
+ ("siteNumber", "capacityMW", "county", "cdrZone"),
+ ),
+ (
+ SOLAR21,
+ "Utility_Operational&Planned",
+ [*range(3, 43), *range(47, 171)],
+ ("unitCode", "commonName", "county", "cdrZone", "capacityMW", "newFor"),
+ ),
+ (
+ SOLAR21,
+ "Utility_Hypothetical",
+ range(2, 151),
+ ("siteNumber", "typeCode", "capacityMW", "county", "cdrZone", "newFor"),
+ ),
+]
+
+
+def read(name):
+ with Client() as client:
+ return next(
+ client.generation_profiles.read_keys(
+ (ROOT / name).read_bytes(), filename=name
+ )
+ )
+
+
+@pytest.mark.parametrize("name,sheet,source_rows,fields", TABLES)
+def test_every_original_site_table_cell(name, sheet, source_rows, fields):
+ key = read(name)
+ records = [row for row in key.sites if row.sourceSheet == sheet]
+ assert [row.sourceRow for row in records] == list(source_rows)
+ workbook = openpyxl.load_workbook(ROOT / name, read_only=True, data_only=True)
+ try:
+ source = list(workbook[sheet].values)
+ for row in records:
+ for field, value in zip(fields, source[row.sourceRow - 1], strict=False):
+ expected = (
+ Decimal(str(value)) if isinstance(value, (float, int)) else value
+ )
+ assert getattr(row, field) == expected, (row.sourceRow, field)
+ finally:
+ workbook.close()
+ assert key.sourceMember == name
+ assert GenerationProfileKey.model_validate_json(key.model_dump_json()) == key
+
+
+@pytest.mark.parametrize("name,expected", [(SOLAR20, 22), (SOLAR21, 10)])
+def test_every_original_summary_number_and_label(name, expected):
+ key = read(name)
+ workbook = openpyxl.load_workbook(ROOT / name, read_only=True, data_only=True)
+ try:
+ source = list(workbook["SUMMARY"].values)
+ numeric_rows = {
+ i
+ for i, row in enumerate(source, 1)
+ if any(isinstance(v, (int, float)) for v in row)
+ }
+ assert {r.sourceRow for r in key.summaries} == numeric_rows
+ assert len(key.summaries) == expected
+ for row in key.summaries:
+ cells = source[row.sourceRow - 1]
+ if row.typeCode is not None:
+ assert (
+ row.typeCode,
+ row.label,
+ row.profileCount,
+ row.trackingScenarioCount,
+ row.trackingType,
+ row.totalProfileCount,
+ ) == cells[1:7]
+ elif row.totalProfileCount is not None:
+ assert row.label == cells[1]
+ assert row.totalProfileCount == cells[6]
+ else:
+ assert row.label == cells[2]
+ assert row.profileCount == cells[3]
+ assert row.capacityMW == (
+ Decimal(str(cells[4])) if cells[4] is not None else None
+ )
+ assert key.sourceTitle == source[0][1]
+ assert key.sourceDate == source[1][1].date()
+ finally:
+ workbook.close()
+
+
+def test_source_labels_notes_and_inconsistent_published_total():
+ key = read(SOLAR20)
+ assert key.sourceDate == date(2021, 6, 25)
+ by_unit = {row.unitCode: row for row in key.sites if row.unitCode}
+ assert by_unit["ECLIPSE_UNIT1"].tilt == "Lat"
+ assert by_unit["HELIOS_UNIT1"].tilt == "NA"
+ assert by_unit["ACACIA_UNIT_1"].modeledInLabel == "Modeled in 2020"
+ assert any("OXYSOLAR_SOLAR_1" in note for note in key.sourceNotes.values())
+ assert key.summaries[0].profileCount == 313
+ assert (
+ sum(
+ row.totalProfileCount or 0
+ for row in key.summaries
+ if row.label.strip() == "Total"
+ )
+ == 331
+ )
+ wind = read(WIND20)
+ assert wind.sites[0].newForLabel == "New for 2021"
+ assert next(row for row in wind.sites if row.unitCode).newForLabel == "New for 2020"
+
+
+def test_color_legend_flags_and_multiple_units_per_site():
+ key = read(WIND20)
+ marked = [row for row in key.sites if row.queuedModelFlag]
+ assert {row.siteNumber for row in marked} == {4000, 4001, 4004, 4007}
+ assert Counter(row.sourceSheet for row in marked) == {
+ "Op&Planned_Wind-Summary": 4,
+ "Op&Planned_Wind-Unit_Codes": 12,
+ }
+ # The legend is beside Falvez Astra's row; it must not mark that site's ID.
+ assert (
+ next(row for row in key.sites if row.siteNumber == 2).queuedModelFlag is False
+ )
+ assert all(row.queuedModelFlag is None for row in read(WIND21).sites)
+ high_lonesome = [
+ row.unitCode for row in marked if row.siteNumber == 4007 and row.unitCode
+ ]
+ assert len(high_lonesome) == 7
+
+
+def test_key_discovery_download_and_nested_original_workbooks():
+ url = "https://www.ercot.com/files/docs/2022/12/19/solar-key.xlsx"
+ calls = []
+
+ def serve(request):
+ calls.append(request.url.path)
+ assert "Authorization" not in request.headers
+ if request.url.path == "/gridinfo/resource":
+ return httpx.Response(
+ 200, text='2022 '
+ )
+ if request.url.path.endswith("/2022"):
+ return httpx.Response(
+ 200, text=f'ERCOT Solar PV Profiles 1980-2021 Key '
+ )
+ return httpx.Response(200, content=(ROOT / SOLAR21).read_bytes())
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(serve)) as http,
+ Client(client=http) as client,
+ ):
+ files = client.generation_profiles.key_files()
+ assert len(files) == 1
+ key = next(
+ client.generation_profiles.read_keys(
+ client.generation_profiles.download(files[0])
+ )
+ )
+ assert len(key.sites) == 313
+ assert len(calls) == 3
+ inner = BytesIO()
+ with ZipFile(inner, "w") as archive:
+ archive.writestr(SOLAR21, (ROOT / SOLAR21).read_bytes())
+ archive.writestr(WIND21, (ROOT / WIND21).read_bytes())
+ outer = BytesIO()
+ with ZipFile(outer, "w") as archive:
+ archive.writestr("keys.zip", inner.getvalue())
+ with Client() as client:
+ keys = list(client.generation_profiles.read_keys(outer.getvalue()))
+ assert [key.sourceMember for key in keys] == [SOLAR21, WIND21]
+ assert [len(key.sites) for key in keys] == [313, 565]
+
+
+def test_same_vintage_unit_code_mismatch_is_not_silently_normalized():
+ key = read(SOLAR21)
+ with ZipFile(ROOT.parent / "profiles.zip") as archive:
+ data = archive.read(
+ "ERCOT-OperationalPlanned-SolarPVProfiles-2020-2021-CST-CDT.xlsx"
+ )
+ with Client() as client:
+ columns = {site.column for site in client.generation_profiles.sites(data)}
+ units = {site.unitCode for site in key.sites if site.unitCode}
+ assert len(columns & units) == 163
+ assert columns - units == {"TREBA_UNIT1"}
+ assert units - columns == {"TREBA_UNIT 1"}
diff --git a/tests/test_generation_profiles.py b/tests/test_generation_profiles.py
new file mode 100644
index 00000000..4f86eeb6
--- /dev/null
+++ b/tests/test_generation_profiles.py
@@ -0,0 +1,303 @@
+import csv
+import json
+from datetime import date
+from decimal import Decimal
+from io import BytesIO, StringIO
+from itertools import islice
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, GenerationProfileHour, GenerationProfileSite
+
+FIXTURES = Path(__file__).resolve().parents[1] / "tools/inputs/generation-profiles"
+SOLAR = "ERCOT-OperationalPlanned-SolarPVProfiles-2020-2021-CST-CDT.xlsx"
+WIND = "ERCOT_WindProfiles_Operational-Planned_2020_CST.csv"
+DUAL = "ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2020_CST.csv"
+
+
+def original(name):
+ with ZipFile(FIXTURES / "profiles.zip") as archive:
+ return archive.read(name)
+
+
+def csv_bytes(rows):
+ stream = StringIO(newline="")
+ csv.writer(stream, lineterminator="\n").writerows(rows)
+ return stream.getvalue().encode()
+
+
+def test_every_published_csv_header_sample_and_original_values():
+ samples = json.loads((FIXTURES / "csv-header-samples.json").read_text())
+ assert len(samples) == 25
+ with Client() as client:
+ for sample in samples:
+ data = csv_bytes([sample["header"], *sample["sample"]])
+ rows = list(client.generation_profiles.read(data))
+ header = sample["header"]
+ start = header.index("DATE") + 2
+ assert len(rows) == 2
+ for row, raw in zip(rows, sample["sample"], strict=True):
+ assert row.profileDate == date.fromisoformat(raw[start - 2])
+ assert row.sourceTime == raw[start - 1]
+ assert row.sourceTimeColumn == header[start - 1]
+ assert row.generationMW == {
+ key: Decimal(value)
+ for key, value in zip(header[start:], raw[start:], strict=True)
+ }
+ assert (
+ GenerationProfileHour.model_validate_json(rows[0].model_dump_json())
+ == rows[0]
+ )
+
+
+def test_original_wind_capacity_headers():
+ with Client() as client:
+ sites = list(client.generation_profiles.sites(original(WIND), filename=WIND))
+ row = next(client.generation_profiles.read(original(WIND), filename=WIND))
+ assert len(sites) == 155
+ assert sites[0].column == "SITE_00001:capacity=99.825"
+ assert sites[0].siteId == "SITE_00001"
+ assert sites[0].capacityMW == Decimal("99.825")
+ assert sites[0].commonName is None
+ assert row.generationMW[sites[0].column] == Decimal("24.103")
+ assert row.sourceMember == sites[0].sourceMember == WIND
+ assert (
+ GenerationProfileSite.model_validate_json(sites[0].model_dump_json())
+ == sites[0]
+ )
+
+
+def test_original_workbook_embedded_metadata_and_first_day():
+ data = original(SOLAR)
+ with Client() as client:
+ sites = list(client.generation_profiles.sites(data, filename=SOLAR))
+ rows = list(islice(client.generation_profiles.read(data, filename=SOLAR), 24))
+ assert len(sites) == 164
+ site = sites[0]
+ assert site.column == "ACACIA_UNIT_1" and site.siteId == "SITE_00001"
+ assert site.capacityMW == Decimal(10)
+ assert (site.commonName, site.county, site.cdrZone) == (
+ "ACACIA SOLAR",
+ "Presidio",
+ "West",
+ )
+ assert (site.plantStatus, site.newFor, site.newForLabel) == (
+ "Operational",
+ "N",
+ "New for 2022",
+ )
+ workbook = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ try:
+ source = workbook.active.values
+ metadata = list(islice(source, 8))
+ columns = metadata[-1][2:]
+ for row, cells in zip(rows, islice(source, 24), strict=True):
+ assert row.profileDate == date(2020, 1, 1)
+ assert row.timeHHMM == cells[1]
+ assert row.generationMW == {
+ key: Decimal(str(value))
+ for key, value in zip(columns, cells[2:], strict=True)
+ }
+ assert row.sourceSheet == site.sourceSheet == "Sheet1"
+ finally:
+ workbook.close()
+
+
+def test_full_original_leap_year_and_extra_year_column():
+ with Client() as client:
+ rows = client.generation_profiles.read(original(DUAL))
+ count = 0
+ for row in rows:
+ assert row.sourceYear == row.profileDate.year == 2020
+ assert len(row.generationMW) == 139
+ count += 1
+ assert count == 8784
+ assert row.profileDate == date(2020, 12, 31)
+ assert row.timeHHMM == 2300
+
+
+def test_nested_zip_filter_retains_repeated_clocks_and_missing_values():
+ data = csv_bytes(
+ [
+ ["DATE", "TIME_CST", "plant"],
+ ["20201101", "0100", "0"],
+ ["20201101", "0100", ""],
+ ["20201102", "0100", "2.125"],
+ ]
+ )
+ inner = BytesIO()
+ with ZipFile(inner, "w") as archive:
+ archive.writestr("hourly.csv", data)
+ outer = BytesIO()
+ with ZipFile(outer, "w") as archive:
+ archive.writestr("profiles.zip", inner.getvalue())
+ with Client() as client:
+ rows = list(
+ client.generation_profiles.read(
+ outer.getvalue(),
+ filename="bundle.zip",
+ where=lambda r: r.profileDate == date(2020, 11, 1),
+ )
+ )
+ assert [r.generationMW["plant"] for r in rows] == [Decimal(0), None]
+ assert [r.sourceTime for r in rows] == ["0100", "0100"]
+ assert all(r.sourceMember == "bundle.zip/profiles.zip/hourly.csv" for r in rows)
+
+
+def test_direct_file_discovery_and_download_without_credentials():
+ url = "https://www.ercot.com/files/docs/2021/12/07/profiles.csv"
+ requests = []
+
+ def serve(request):
+ requests.append(str(request.url))
+ assert "Authorization" not in request.headers
+ if request.url.path == "/gridinfo/resource":
+ return httpx.Response(
+ 200, text='2021 '
+ )
+ if request.url.path == "/gridinfo/resource/2021":
+ return httpx.Response(
+ 200,
+ text=f'ERCOT Wind Operational and Planned 2020 ERCOT Wind Profile 1980-2020 Key ',
+ )
+ assert str(request.url) == url
+ return httpx.Response(200, content=original(WIND))
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(serve)) as http,
+ Client(client=http) as client,
+ ):
+ files = client.generation_profiles.files()
+ assert len(files) == 1 and files[0].url == url
+ data = client.generation_profiles.download(files[0])
+ assert next(client.generation_profiles.read(data)).profileDate == date(
+ 2020, 1, 1
+ )
+ assert len(requests) == 3
+
+
+@pytest.mark.parametrize(
+ "data",
+ [
+ b"DATE,TIME,A,A\n20200101,0,1,2\n",
+ b"DATE,TIME,A\n20200101,0,1,2\n",
+ b"unrecognized\n",
+ ],
+)
+def test_unrecognized_or_lossy_layout_raises(data):
+ with Client() as client, pytest.raises(ValueError):
+ list(client.generation_profiles.read(data))
+
+
+def test_older_wind_clock_alias_and_archive_boundaries():
+ data = (FIXTURES / "formats/2015_Wind_Profiles.zip").read_bytes()
+ with Client() as client:
+ row = next(client.generation_profiles.read(data, filename="2015.zip"))
+ sites = list(client.generation_profiles.sites(data, filename="2015.zip"))
+ assert row.profileDate == date(2014, 12, 31)
+ assert row.sourceTimeColumn == "HHMM(CST)"
+ assert row.timeHHMM == 1800
+ assert row.sourceMember == "2015.zip/ERCOT_offshore_2015.CSV"
+ assert sites[0].capacityMW == Decimal("500.0")
+ assert row.generationMW[sites[0].column] == Decimal("452.3")
+
+
+def test_side_by_side_original_tables_keep_their_own_dates():
+ from collections import Counter
+ from itertools import chain
+
+ data = (FIXTURES / "formats/legacy-compound.zip").read_bytes()
+ with Client() as client:
+ sites = list(client.generation_profiles.sites(data))
+ rows = client.generation_profiles.read(data)
+ onshore, offshore = next(rows), next(rows)
+ assert onshore.profileDate == date(2011, 1, 1)
+ assert offshore.profileDate == date(2013, 1, 1)
+ assert onshore.sourceBlock == 1 and offshore.sourceBlock == 2
+ counts = Counter()
+ for row in chain([onshore, offshore], rows):
+ assert row.profileDate.year == {1: 2011, 2: 2013}[row.sourceBlock]
+ assert len(row.generationMW) == {1: 225, 2: 3}[row.sourceBlock]
+ assert "YYYYMMDD" not in row.generationMW
+ assert "HHMM(CST)" not in row.generationMW
+ counts[row.sourceBlock] += 1
+ # Six short trailing rows have an entirely empty offshore block.
+ assert counts == {1: 8760, 2: 8754}
+ assert Counter(site.sourceBlock for site in sites) == {1: 225, 2: 3}
+
+
+def test_hypothetical_solar_tracking_metadata():
+ name = "ERCOT-Hypothetical-DualAxis-SolarPVProfiles-2020-2021-CST-CDT.xlsx"
+ data = (FIXTURES / "formats" / name).read_bytes()
+ with Client() as client:
+ sites = list(client.generation_profiles.sites(data, filename=name))
+ row = next(client.generation_profiles.read(data, filename=name))
+ assert len(sites) == 149
+ assert all(site.tracking == "DUAL" for site in sites)
+ assert all(site.plantStatus == "Hypothetical" for site in sites)
+ assert all(site.capacityMW == 50 for site in sites)
+ assert sites[0].commonName == "NA"
+ assert sites[0].siteId == sites[0].column == "SITE_00004"
+ assert sites[0].county == "Presidio"
+ assert sites[0].sourceBlock == row.sourceBlock == 1
+
+
+@pytest.mark.parametrize("index", [0, 1])
+def test_legacy_workbook_source_row_excerpts(index, monkeypatch):
+ from tinyercot import _generation_profiles
+
+ source = json.loads((FIXTURES / "legacy-workbooks/rows.json").read_text())[index]
+ hypothetical = source["member"].startswith("Hypotherical")
+ start, stop, date_column = (6, 139, 1) if hypothetical else (2, 95, 0)
+ calendar_columns = (3, 4, 5) if hypothetical else (95, 96, 97)
+ metadata = [tuple(row) for row in source["metadata"]]
+ # The XLSX header has only six stored cells despite a 139-column data table.
+ if hypothetical:
+ metadata[-1] = metadata[-1][:6]
+ data_rows = [tuple(row) for _, row in source["sampleRows"]]
+ ids = metadata[2 if hypothetical else 6]
+
+ def tables(data, filename):
+ yield filename, "Sheet1", iter([*metadata, *data_rows, (None,)])
+ for sheet in source["emptySheets"]:
+ yield filename, sheet, iter([(None,)])
+
+ # Feed exact source cell values through the table-reading boundary. Complete
+ # original XLSX parsing and all rows are checked by the recorded source audit.
+ monkeypatch.setattr(_generation_profiles, "_tables", tables)
+ with Client() as client:
+ sites = list(client.generation_profiles.sites(b"", filename=source["member"]))
+ rows = list(client.generation_profiles.read(b"", filename=source["member"]))
+ assert len(sites) == stop - start
+ assert len(rows) == len(data_rows)
+ for parsed, raw in zip(rows, data_rows, strict=True):
+ assert parsed.profileDate == date.fromisoformat(str(raw[date_column]))
+ assert parsed.sourceTime == str(raw[date_column + 1])
+ assert parsed.calendarDate == date(*(raw[i] for i in calendar_columns))
+ assert parsed.sourceYear == (int(raw[0]) if hypothetical else None)
+ assert parsed.generationMW == {
+ str(ids[i]): Decimal(str(raw[i])) if raw[i] is not None else None
+ for i in range(start, stop)
+ }
+ assert parsed.sourceMember == source["member"]
+ for i, site in enumerate(sites, start):
+ assert site.siteId == site.column == str(ids[i])
+ assert site.capacityMW == Decimal(str(metadata[4 if hypothetical else 2][i]))
+ if hypothetical:
+ assert site.county == metadata[0][i]
+ assert site.sourceSum == Decimal(str(metadata[5][i]))
+ assert site.sourceCount == metadata[6][i]
+ assert site.sourceCapacityFactor == Decimal(str(metadata[7][i]))
+ else:
+ assert site.commonName == metadata[0][i]
+ assert site.awsName == metadata[1][i]
+ assert site.annualEnergyMWh == {
+ 2006: Decimal(str(metadata[3][i])),
+ 2011: Decimal(str(metadata[4][i])),
+ }
+ assert site.annualCapacityFactor == {2011: Decimal(str(metadata[5][i]))}
+ assert GenerationProfileSite.model_validate_json(site.model_dump_json()) == site
diff --git a/tests/test_history.py b/tests/test_history.py
new file mode 100644
index 00000000..628011e2
--- /dev/null
+++ b/tests/test_history.py
@@ -0,0 +1,1909 @@
+import csv
+import json
+from datetime import UTC, date, datetime
+from decimal import Decimal
+from io import BytesIO, StringIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+from pydantic import BaseModel
+
+from tinyercot import Archive, Client
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools" / "inputs" / "history"
+
+
+def zipped(name, data):
+ output = BytesIO()
+ with ZipFile(output, "w") as archive:
+ archive.writestr(name, data)
+ return output.getvalue()
+
+
+def test_repeated_dates_keep_field_formats_and_invalid_row_context():
+ class Dates(BaseModel):
+ us: date
+ eu: date
+
+ with Client() as client:
+ reader = Archive(
+ client,
+ "dates",
+ Dates,
+ {"US": "us", "EU": "eu"},
+ {"us": "%m/%d/%Y", "eu": "%d/%m/%Y"},
+ )
+ data = b"US,EU\n01/02/2024,01/02/2024\n01/02/2024,01/02/2024\n"
+ rows = list(reader.read(zipped("report.csv", data)))
+ assert rows == [Dates(us=date(2024, 1, 2), eu=date(2024, 2, 1))] * 2
+ invalid = b"US,EU\n01/02/2024,01/02/2024\nnot-a-date,01/02/2024\n"
+ with pytest.raises(ValueError, match=r"report.csv:3:"):
+ list(reader.read(zipped("report.csv", invalid)))
+
+
+@pytest.mark.parametrize(
+ "product,method,date_field,day,value_field,value",
+ [
+ (
+ "np4-190-cd",
+ "dam_stlmnt_pnt_prices",
+ "deliveryDate",
+ date(2014, 5, 2),
+ "settlementPointPrice",
+ Decimal("29.92"),
+ ),
+ (
+ "np6-905-cd",
+ "spp_node_zone_hub",
+ "deliveryDate",
+ date(2014, 4, 30),
+ "settlementPointPrice",
+ Decimal("30.5"),
+ ),
+ (
+ "np4-188-cd",
+ "dam_clear_price_for_cap",
+ "deliveryDate",
+ date(2014, 5, 2),
+ "MCPC",
+ Decimal("7.25"),
+ ),
+ (
+ "np6-345-cd",
+ "act_sys_load_by_wzn",
+ "operatingDay",
+ date(2014, 4, 30),
+ "total",
+ Decimal("27934.84"),
+ ),
+ ],
+)
+def test_captured_oldest_csv_in_nested_download(
+ product, method, date_field, day, value_field, value
+):
+ data = zipped(
+ "download.zip", zipped("report.csv", (INPUTS / f"{product}.csv").read_bytes())
+ )
+ with Client() as client:
+ history = getattr(
+ getattr(client, product.replace("-", "_")), method + "_history"
+ )
+ rows = list(history.read(data))
+ assert len(rows) == 3
+ assert getattr(rows[0], date_field) == day
+ assert getattr(rows[0], value_field) == value
+ assert isinstance(getattr(rows[0], value_field), Decimal)
+ assert rows[0].DSTFlag is False
+
+
+def test_history_query_paginates_and_filters_publications_and_rows():
+ csv = (INPUTS / "np4-190-cd.csv").read_bytes()
+ calls = []
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ if request.method == "POST":
+ assert request.content == b'{"docIds":[2]}'
+ return httpx.Response(200, content=zipped("report.csv", csv))
+ assert request.url.params["postDatetimeFrom"] == "2014-05-02T00:00:00"
+ assert request.url.params["postDatetimeTo"] == "2014-05-02T23:59:59"
+ page = int(request.url.params["page"])
+ calls.append(page)
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": page, "totalPages": 3},
+ "product": {
+ "emilId": "NP4-190-CD",
+ "name": "DAM",
+ "reportTypeId": 12331,
+ },
+ "archives": [
+ {
+ "docId": page,
+ "friendlyName": "DAM",
+ "postDatetime": f"2014-05-0{4 - page}T12:00:00",
+ }
+ ],
+ },
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ rows = list(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.rows(
+ posted_from=datetime(2014, 5, 2), # noqa: DTZ001 - ERCOT publication time
+ posted_to=datetime(2014, 5, 2, 23, 59, 59), # noqa: DTZ001 - ERCOT publication time
+ where=lambda row: row.settlementPoint == "AMISTAD_ALL",
+ )
+ )
+ assert calls == [1, 2, 3]
+ assert len(rows) == 1
+ assert rows[0].settlementPointPrice == Decimal("29.92")
+
+
+@pytest.mark.parametrize(
+ "content",
+ [
+ b"wrong,header\n1,2\n",
+ (INPUTS / "np4-190-cd.csv").read_bytes().replace(b"29.92", b"invalid"),
+ ],
+)
+def test_bad_archive_reports_file_and_does_not_silently_drop_rows(content):
+ with Client() as client, pytest.raises(ValueError, match="report.csv"):
+ list(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.read(
+ zipped("report.csv", content)
+ )
+ )
+
+
+def test_download_without_csv_is_not_an_empty_success():
+ with Client() as client, pytest.raises(ValueError, match="no CSV"):
+ list(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.read(
+ zipped("report.xml", b" ")
+ )
+ )
+
+
+@pytest.mark.parametrize(
+ "sample",
+ [
+ entry
+ for entry in json.loads((INPUTS / "evidence.json").read_text())
+ if entry["sample"] == "history-current"
+ ],
+ ids=lambda entry: entry["endpoint"],
+)
+def test_recent_archive_format(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")), method + "_history"
+ )
+ rows = list(
+ reader.read(
+ zipped("recent.csv", (INPUTS / f"{product}-recent.csv").read_bytes())
+ )
+ )
+ assert len(rows) == 3
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "disclosure-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_disclosure_tables_and_schema_epochs(sample):
+ method = sample["endpoint"].split("/")[1]
+ data = BytesIO()
+ with ZipFile(data, "w") as archive:
+ archive.writestr("unrelated.csv", b"other,columns\n1,2\n")
+ archive.writestr(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ with Client() as client:
+ reader = getattr(client.np3_966_er, "_" + method + "_history")
+ rows = list(reader.read(zipped("disclosure.zip", data.getvalue())))
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_legacy_rrs_is_preserved_separately_from_new_categories():
+ sample = INPUTS / "60_dam_load_res_data-history-samples.csv"
+ with Client() as client:
+ rows = list(
+ client.np3_966_er._60_dam_load_res_data_history.read(
+ zipped("60d_DAM_Load_Resource_Data-01-MAY-14.csv", sample.read_bytes())
+ )
+ )
+ assert rows[2].RRSAwarded == Decimal("1.5")
+ assert rows[2].RRSPFRAwarded is None
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "additional-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_additional_price_and_load_archives(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")), method + "_history"
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "archive-only-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_archive_only_product_rows(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ namespace = getattr(client, product.replace("-", "_"))
+ assert not hasattr(namespace, method) # No fictitious API endpoint.
+ reader = getattr(namespace, method + "_history")
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_resource_identifiers_preserve_leading_zeroes():
+ with Client() as client:
+ rows = list(
+ client.np3_988_er.resources_history.read(
+ zipped(
+ "resources.csv",
+ (INPUTS / "np3-988-er-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert rows[0].DMEDuns == "0815527087000"
+ assert rows[0].RMR is False
+
+
+def test_meter_load_keeps_decimal_precision_and_unused_intervals():
+ with Client() as client:
+ rows = list(
+ client.np1_300.adjusted_meter_load_history.read(
+ zipped("aml.csv", (INPUTS / "np1-300-history-samples.csv").read_bytes())
+ )
+ )
+ assert rows[0].INT096 == Decimal("65.9150589999")
+ assert rows[0].INT100 is None
+ assert rows[0].startTime == date(2025, 11, 30)
+ assert rows[0].LSTime == date(2026, 5, 26)
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "eia-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_eia_daily_mixed_hour_types(sample):
+ with Client() as client:
+ rows = list(
+ client.eia_930_er.daily_operations_history.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == sample["csv_rows"]
+ for row in rows:
+ for hour in range(1, 26):
+ value = getattr(row, f"HR{hour}")
+ if value is not None:
+ assert isinstance(
+ value, datetime if row.dataType.startswith("UTC") else Decimal
+ )
+ if isinstance(value, datetime):
+ assert value.tzinfo is not None
+ if "samples" in sample["fixture"]:
+ assert rows[0].HR18 == datetime(2015, 2, 9, tzinfo=UTC)
+ assert rows[0].postedDate == date(2015, 2, 8)
+ assert rows[0].dataDate is None
+ assert rows[1].HR1 == Decimal(28241)
+ else:
+ assert rows[0].HR19 == datetime(2026, 9, 7, tzinfo=UTC)
+ assert rows[0].dataDate == date(2026, 9, 6)
+ assert rows[0].postedDate is None
+ assert rows[1].HR1 == Decimal(64271)
+ assert rows[0].HR25 is None
+
+
+@pytest.mark.parametrize("invalid", [b"2026-09-06T24:01:00.000Z", b"not-a-number"])
+def test_eia_invalid_hour_reports_the_csv_member(invalid):
+ source = (INPUTS / "eia-930-er-history-current.csv").read_bytes()
+ content = source.replace(b"2026-09-06T06:00:00.000Z", invalid)
+ with Client() as client, pytest.raises(ValueError, match="eia.csv:2"):
+ list(
+ client.eia_930_er.daily_operations_history.read(zipped("eia.csv", content))
+ )
+
+
+def test_download_batches_respect_product_limit_and_stay_lazy():
+ downloads = []
+ data = (INPUTS / "np4-190-cd.csv").read_bytes()
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ if request.method == "GET":
+ return httpx.Response(
+ 200,
+ json={
+ "emilId": "NP4-190-CD",
+ "name": "DAM",
+ "status": "Active",
+ "reportTypeId": 12331,
+ "downloadLimit": 2,
+ },
+ )
+ ids = json.loads(request.content)["docIds"]
+ downloads.append(ids)
+ body = BytesIO()
+ with ZipFile(body, "w") as archive:
+ for doc_id in ids:
+ archive.writestr(f"{doc_id}.zip", zipped("prices.csv", data))
+ return httpx.Response(200, content=body.getvalue())
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ rows = client.np4_190_cd.dam_stlmnt_pnt_prices_history.download(
+ iter([1, 2, 3, 4, 5]), batch_size=3
+ )
+ assert downloads == []
+ first = next(rows)
+ assert downloads == [[1, 2]]
+ assert len([first, *rows]) == 15
+ assert downloads == [[1, 2], [3, 4], [5]]
+
+
+def test_empty_batch_needs_no_credentials():
+ with Client() as client:
+ assert (
+ list(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.download(
+ [], batch_size=100
+ )
+ )
+ == []
+ )
+
+
+@pytest.mark.parametrize("size", [0, -1])
+def test_invalid_batch_size_fails_before_retrieval(size):
+ with Client() as client, pytest.raises(ValueError, match="batch_size"):
+ list(client.np4_190_cd.dam_stlmnt_pnt_prices_history.rows(batch_size=size))
+
+
+def test_intermediate_disclosure_layout_accepts_known_optional_columns():
+ source = list(
+ csv.DictReader(
+ StringIO((INPUTS / "60_dam_load_res_data-history-samples.csv").read_text())
+ )
+ )
+ output = StringIO()
+ writer = csv.DictWriter(output, fieldnames=[*source[0], "ECRSSD Awarded"])
+ writer.writeheader()
+ writer.writerow({**source[2], "ECRSSD Awarded": "2.5"})
+ with Client() as client:
+ rows = list(
+ client.np3_966_er._60_dam_load_res_data_history.read(
+ zipped(
+ "60d_DAM_Load_Resource_Data-intermediate.csv",
+ output.getvalue().encode(),
+ )
+ )
+ )
+ assert rows[0].RRSAwarded == Decimal("1.5")
+ assert rows[0].ECRSSDAwarded == Decimal("2.5")
+ assert rows[0].RRSPFRAwarded is None
+
+
+def test_missing_shared_column_still_fails():
+ content = (INPUTS / "np4-190-cd.csv").read_bytes()
+ lines = content.decode().splitlines()
+ content = "\n".join(line.split(",", 1)[1] for line in lines).encode()
+ with Client() as client, pytest.raises(ValueError, match="deliveryDate"):
+ list(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.read(
+ zipped("missing.csv", content)
+ )
+ )
+
+
+def test_duplicate_aliases_do_not_overwrite_a_source_cell():
+ content = (INPUTS / "eia-930-er-history-current.csv").read_bytes()
+ content = content.replace(b'"Product_Name"', b'"Product_Name","Survey Name"', 1)
+ with Client() as client, pytest.raises(ValueError, match="duplicate"):
+ list(
+ client.eia_930_er.daily_operations_history.read(
+ zipped("duplicate.csv", content)
+ )
+ )
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "next-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_next_historical_report_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")), method + "_history"
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_whitespace_trailer_is_not_a_data_row():
+ source = (INPUTS / "np4-192-cd-history-samples.csv").read_bytes()
+ with Client() as client:
+ rows = list(
+ client.np4_192_cd.dam_total_energy_purchased_history.read(
+ zipped("energy.csv", source + b" \n")
+ )
+ )
+ assert len(rows) == 3
+
+
+def test_wind_layout_keeps_old_timestamp_and_combined_region():
+ with Client() as client:
+ old = next(
+ client.np4_732_cd.wpp_hrly_avrg_actl_fcast_history.read(
+ zipped(
+ "wind.csv", (INPUTS / "np4-732-cd-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ recent = next(
+ client.np4_732_cd.wpp_hrly_avrg_actl_fcast_history.read(
+ zipped(
+ "wind.csv", (INPUTS / "np4-732-cd-history-current.csv").read_bytes()
+ )
+ )
+ )
+ assert old.hourEndingTimestamp.isoformat() == "2014-04-29T01:00:00"
+ assert old.hourEnding is None
+ assert old.actualWestNorth == Decimal("3262.13")
+ assert old.genLoadZoneWest is None
+ assert recent.hourEnding == 11
+ assert recent.hourEndingTimestamp is None
+ assert recent.postedDatetime is None
+
+
+def test_ambiguous_header_mapping_is_rejected():
+ # Both timestamp and numeric-hour layouts use HOUR_ENDING.
+ # A partial header cannot establish which meaning applies.
+ source = b"HOUR_ENDING,ACTUAL_SYSTEM_WIDE\n"
+ with Client() as client, pytest.raises(ValueError, match="ambiguous"):
+ list(
+ client.np4_732_cd.wpp_hrly_avrg_actl_fcast_history.read(
+ zipped("wind.csv", source)
+ )
+ )
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "renewables-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_renewable_and_demand_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")), method + "_history"
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_legacy_wind_region_and_solar_timestamp_are_preserved():
+ with Client() as client:
+ wind = next(
+ client.np4_733_cd.wpp_actual_5min_avg_values_history.read(
+ zipped(
+ "wind.csv", (INPUTS / "np4-733-cd-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ assert wind.LZWestNorth == Decimal("645.12")
+ assert wind.LZWest is None and wind.LZNorth is None
+ solar = next(
+ client.np4_737_cd.spp_hrly_avrg_actl_fcast_history.read(
+ zipped(
+ "solar.csv",
+ (INPUTS / "np4-737-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert solar.hourEndingTimestamp.isoformat() == "2016-02-08T00:00:00"
+ assert solar.deliveryDate is None and solar.hourEnding is None
+ assert solar.postedDatetime is None
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "operations-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_operation_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")), method + "_history"
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_legacy_lambda_and_ordc_fields_remain_distinct():
+ with Client() as client:
+ price = next(
+ client.np6_322_cd.sced_system_lambda_history.read(
+ zipped(
+ "lambda.csv",
+ (INPUTS / "np6-322-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert price.systemLambda == Decimal("28.8797130584717")
+ assert price.cappedSystemLambda is None
+ assert price.uncappedSystemLambda is None
+ adder = next(
+ client.np6_323_cd.rt_price_adder_sced_history.read(
+ zipped(
+ "adder.csv",
+ (INPUTS / "np6-323-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert adder.RTORPA == Decimal("0.0033")
+ assert adder.RTOFFPA == Decimal("0.0005")
+ assert adder.RTRDPA is None
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "forecasts-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_forecast_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_forecast_publication_time_is_not_inferred_from_delivery():
+ with Client() as client:
+ forecast = next(
+ client.np3_560_cd._7d_load_fcast_by_fzn_history.read(
+ zipped(
+ "forecast.csv",
+ (INPUTS / "np3-560-cd-history-current.csv").read_bytes(),
+ )
+ )
+ )
+ assert forecast.postedDatetime is None
+ assert forecast.hourEnding == "1:00"
+ assert forecast.north == Decimal("22122.619443518067837")
+ interval = next(
+ client.np3_562_cd.ih_load_fcast_by_wzn_history.read(
+ zipped(
+ "interval.csv",
+ (INPUTS / "np3-562-cd-history-current.csv").read_bytes(),
+ )
+ )
+ )
+ assert interval.model == "A6"
+ assert interval.inUseFlag is False
+ assert interval.postedDatetime is None
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "adequacy-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_adequacy_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_legacy_outage_and_ruc_totals_are_not_assigned_to_regions():
+ with Client() as client:
+ outage = next(
+ client.np3_233_cd.hourly_res_outage_cap_history.read(
+ zipped(
+ "outages.csv",
+ (INPUTS / "np3-233-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert outage.totalResourceMW == 18542
+ assert outage.totalIRRMW == 685
+ assert outage.totalResourceMWZoneSouth is None
+ ruc = next(
+ client.np3_764_cd.hrly_ruc_online_sced_offline_cop_history.read(
+ zipped(
+ "ruc.csv", (INPUTS / "np3-764-cd-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ assert ruc.sumSCEDTotal == Decimal(0)
+ assert ruc.sumSCEDSouth is None
+ assert ruc.RUCTimestamp.isoformat() == "2018-10-25T17:03:01"
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "summaries-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_summary_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_legacy_rrs_and_offer_cap_fields_are_preserved():
+ with Client() as client:
+ offers = next(
+ client.np4_179_cd.total_as_service_offers_history.read(
+ zipped(
+ "offers.csv",
+ (INPUTS / "np4-179-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert offers.RRS == Decimal(4378)
+ assert offers.RRSPFR is None
+ cap = next(
+ client.np4_791_cd.da_sw_offer_caps_history.read(
+ zipped(
+ "caps.csv", (INPUTS / "np4-791-cd-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ assert cap.SWCAP == Decimal(5000)
+ assert cap.DASWCAP is None and cap.RTSWCAP is None
+
+
+def test_nonempty_extra_csv_cell_is_not_discarded():
+ source = (INPUTS / "np4-791-cd-history-samples.csv").read_bytes()
+ source = source.replace(b"AS,5000,", b"AS,5000,unexpected")
+ with Client() as client, pytest.raises(ValueError, match="wrong number of cells"):
+ list(
+ client.np4_791_cd.da_sw_offer_caps_history.read(zipped("caps.csv", source))
+ )
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "regional-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_regional_forecast_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_intra_hour_forecasts_keep_model_alternatives():
+ with Client() as client:
+ forecasts = list(
+ client.np4_752_cd.ih_solar_fcast_geo_history.read(
+ zipped(
+ "solar.csv",
+ (INPUTS / "np4-752-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert [row.model for row in forecasts] == ["A", "B", "C"]
+ assert [row.inUseFlag for row in forecasts] == [False, True, False]
+ assert len({(row.region, row.intervalEnding) for row in forecasts}) == 1
+ assert forecasts[1].value == Decimal("4665.2")
+ assert all(row.postedDatetime is None for row in forecasts)
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "deployment-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_deployment_factor_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_deployment_factors_preserve_ruc_time_and_service_types():
+ with Client() as client:
+ factors = list(
+ client.np5_527_cd.druc_as_deploy_factors_history.read(
+ zipped(
+ "factors.csv",
+ (INPUTS / "np5-527-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert [row.ASType for row in factors] == ["ECRS", "NSPIN", "REGDN"]
+ assert [row.ASDeploymentFactors for row in factors] == [
+ Decimal("0.04"),
+ Decimal("0.15"),
+ Decimal("0.25"),
+ ]
+ assert factors[0].RUCTimestamp.isoformat() == "2025-12-05T14:33:01"
+ assert factors[0].deliveryDate == date(2025, 12, 6)
+ assert factors[0].deliveryHour == "01:00"
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "curves-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_demand_curve_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_demand_curve_points_keep_quantities_and_execution_time():
+ with Client() as client:
+ points = list(
+ client.np4_214_cd.druc_as_demand_curves_history.read(
+ zipped(
+ "curves.csv",
+ (INPUTS / "np4-214-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert [row.demandCurvePoint for row in points] == [
+ Decimal(1),
+ Decimal(2),
+ Decimal(3),
+ ]
+ assert [row.quantity for row in points] == [Decimal(0), Decimal(40), Decimal(41)]
+ assert [row.price for row in points] == [
+ Decimal(5050),
+ Decimal(5050),
+ Decimal("3353.06"),
+ ]
+ assert points[0].ASType == "ECRS"
+ assert points[0].RUCTimestamp.isoformat() == "2026-02-27T14:33:01"
+ assert points[0].deliveryDate == date(2026, 2, 28)
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "clearing-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_clearing_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_legacy_mcpc_and_indicative_timestamps_are_preserved():
+ with Client() as client:
+ price = next(
+ client.np6_332_cd.rt_clear_price_cap_sced_history.read(
+ zipped(
+ "prices.csv",
+ (INPUTS / "np6-332-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert price.MCPC == Decimal("0.47")
+ assert price.cappedMCPC is None and price.uncappedMCPC is None
+ indicative = next(
+ client.np6_329_cd.rtd_ind_mcpc_history.read(
+ zipped(
+ "indicative.csv",
+ (INPUTS / "np6-329-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert indicative.RTDTimestamp.isoformat() == "2025-12-05T00:00:03"
+ assert indicative.intervalEnding.isoformat() == "2025-12-05T00:05:00"
+ assert indicative.REGUP == Decimal("2.96")
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "transmission-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_transmission_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_rtd_history_keeps_forecast_time_and_legacy_point_types():
+ with Client() as client:
+ prices = list(
+ client.np6_970_cd.rtd_lmp_node_zone_hub_history.read(
+ zipped(
+ "rtd.csv", (INPUTS / "np6-970-cd-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ assert prices[0].RTDTimestamp.isoformat() == "2014-05-01T00:00:01"
+ assert prices[0].intervalEnding.isoformat() == "2014-05-01T00:05:00"
+ assert prices[0].settlementPoint == "AMISTAD_ALL"
+ assert prices[0].LMP == Decimal("28.71")
+ assert prices[1].settlementPointType == "LCCRN"
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "mappings-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_mapping_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_load_distribution_ids_and_decimal_precision_are_preserved():
+ with Client() as client:
+ rows = list(
+ client.np4_159_cd.load_distribution_factors_history.read(
+ zipped(
+ "ldf.csv", (INPUTS / "np4-159-cd-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ assert rows[0].loadId == "050"
+ assert rows[0].MRIDLoad == "{356A1C81-051D-432E-A1E7-2B63E50840C3}"
+ assert rows[0].MVARDistributionFactor == Decimal("0.603000342845917")
+ assert rows[2].distributionFactor == Decimal("0.820144251")
+ assert rows[0].postedDatetime is None
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "corrections-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_correction_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_correction_rows_select_documents_across_mixed_pages():
+ source = (INPUTS / "np4-196-m-eblmp-current.csv").read_bytes()
+ downloads = []
+ pages = []
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ if request.method == "POST":
+ downloads.extend(json.loads(request.content)["docIds"])
+ return httpx.Response(
+ 200, content=zipped("pricecorrection_DAM_EBLMP_example.csv", source)
+ )
+ page = int(request.url.params["page"])
+ pages.append(page)
+ names = [
+ "pricecorrection_DAM_SPP_other",
+ "pricecorrection_DAM_EBLMP_first",
+ "PRICECORRECTION_DAM_EBLMP_SECOND",
+ ]
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": page, "totalPages": 3},
+ "product": {
+ "emilId": "NP4-196-M",
+ "name": "Corrections",
+ "reportTypeId": 13044,
+ },
+ "archives": [
+ {
+ "docId": page,
+ "friendlyName": names[page - 1],
+ "postDatetime": "2025-12-08T22:41:53",
+ }
+ ],
+ },
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ rows = list(client.np4_196_m.dam_price_corrections_eblmp_history.rows())
+ assert pages == [1, 2, 3]
+ assert downloads == [2, 3]
+ assert len(rows) == 6
+ assert rows[0].electricalBus == "0022"
+ assert rows[0].LMPOriginal == Decimal("45.3")
+ assert rows[0].LMPCorrected == Decimal("45.31")
+ assert rows[0].priceCorrectionTime.isoformat() == "2025-12-09T10:00:00"
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "sog-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_sog_weather_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_sog_history_keeps_long_meter_ids_and_legacy_adders():
+ with Client() as client:
+ prices = list(
+ client.np6_327_cd.lmp_sog_price_adders_history.read(
+ zipped(
+ "sog.csv", (INPUTS / "np6-327-cd-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ assert prices[1].meterName == "1008901022901448240117"
+ assert prices[1].meterLMP == Decimal("17.85")
+ assert prices[1].RTORPA == Decimal(0)
+ assert prices[1].RTORDPA == Decimal(0)
+ assert prices[1].RTRDPA is None
+ assert prices[1].SCEDTimestamp.isoformat() == "2022-02-11T00:05:20"
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "offers-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_aggregated_offer_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_aggregated_offers_keep_legacy_service_codes_and_source_order():
+ with Client() as client:
+ offers = list(
+ client.np4_19_cd.dam_agg_as_offer_curve_history.read(
+ zipped(
+ "offers.csv",
+ (INPUTS / "np4-19-cd-history-samples.csv").read_bytes(),
+ )
+ )
+ )
+ assert all(row.ancillaryType == "OFFNS" for row in offers)
+ assert [row.price for row in offers] == [
+ Decimal(400),
+ Decimal("0.77"),
+ Decimal("0.01"),
+ ]
+ assert [row.quantity for row in offers] == [
+ Decimal(1757),
+ Decimal("533.8"),
+ Decimal(193),
+ ]
+ assert offers[0].deliveryDate == date(2014, 3, 13)
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "highest-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_highest_price_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_highest_price_history_preserves_legacy_fields():
+ with Client() as client:
+ old = next(
+ client.np3_916_ex._3d_highest_price_offer_sced_history.read(
+ zipped(
+ "old.csv", (INPUTS / "np3-916-ex-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ dam = next(
+ client.np3_915_ex._3d_dam_high_as_offers_history.read(
+ zipped(
+ "dam.csv", (INPUTS / "np3-915-ex-history-samples.csv").read_bytes()
+ )
+ )
+ )
+ current = list(
+ client.np3_914_ex._3d_sced_high_as_offers_history.read(
+ zipped(
+ "current.csv",
+ (INPUTS / "np3-914-ex-history-current.csv").read_bytes(),
+ )
+ )
+ )
+ assert old.batchId == "5379175"
+ assert old.LMP == Decimal("238.545806884766")
+ assert old.proxyExtension == "Yes"
+ assert old.penaltyFlag == "No"
+ assert old.qseName is None
+ assert old.dmeName is None
+ assert dam.deliveryDate == date(2014, 3, 9)
+ assert dam.quantity == Decimal(8)
+ assert dam.resourceName == "HENNE_LD1"
+ assert dam.qseName is None
+ assert len(current) == 3
+ assert current[0] == current[1] == current[2]
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "disclosure-curves-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_disclosure_curve_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_disclosure_curve_readers_select_their_own_tables():
+ samples = json.loads((INPUTS / "disclosure-curves-evidence.json").read_text())
+ content = BytesIO()
+ with ZipFile(content, "w") as archive:
+ for sample in samples:
+ if "history-samples" in sample["fixture"]:
+ archive.writestr(
+ sample["file"], (INPUTS / sample["fixture"]).read_bytes()
+ )
+ with Client() as client:
+ system = list(client.np3_907_ex._2d_agg_edc_history.read(content.getvalue()))
+ north = list(
+ client.np3_907_ex._2d_agg_edc_north_history.read(content.getvalue())
+ )
+ supply = list(client.np3_907_ex._2d_agg_esc_history.read(content.getvalue()))
+ regulation = list(
+ client.np3_906_ex._2day_agg_sced_as_offers_regdn_history.read(
+ content.getvalue()
+ )
+ )
+ assert len(system) == len(north) == len(supply) == len(regulation) == 3
+ assert system[0].MW == Decimal("51260.7")
+ assert north[0].MW == Decimal(19048)
+ assert system[1].MW == Decimal("47922.79882")
+ assert supply[0].MW == Decimal(1)
+ assert supply[0].price == Decimal(-250)
+ assert regulation[0].MWOffered == Decimal("318.1")
+ assert regulation[0].REGDNOfferPrice == Decimal(0)
+ assert regulation[0].repeatHourFlag is False
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "summaries2-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_two_day_summary_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_two_day_summary_preserves_legacy_identifiers_and_categories():
+ with Client() as client:
+ bid = next(
+ client.np3_909_er._2d_ptp_obl_bids_history.read(
+ zipped(
+ "48h_PTP_Obligation_Bids-12-MAR-14.csv",
+ (
+ INPUTS / "np3-909-er--2d_ptp_obl_bids-history-samples.csv"
+ ).read_bytes(),
+ )
+ )
+ )
+ generation = next(
+ client.np3_910_er._2d_agg_gen_summary_history.read(
+ zipped(
+ "48h_Agg_Gen_Summary-01-MAY-14.csv",
+ (
+ INPUTS / "np3-910-er--2d_agg_gen_summary-history-samples.csv"
+ ).read_bytes(),
+ )
+ )
+ )
+ current = zipped(
+ "2d_Agg_Gen_Summary-07-SEP-26.csv",
+ (
+ INPUTS / "np3-910-er--2d_agg_gen_summary-history-current.csv"
+ ).read_bytes(),
+ )
+ with pytest.raises(ValueError, match="no CSV files matching"):
+ list(client.np3_910_er._2d_agg_dsr_loads_history.read(current))
+ assert bid.bidId == "14a9934be3fb"
+ assert bid.PTPBidPrice == Decimal("-.01")
+ assert generation.sumBasePointNonWGR == Decimal("25912.74570178")
+ assert generation.sumHASLNonWGR == Decimal("28511.51867675")
+ assert generation.sumBasePointNonIRR is None
+ assert generation.sumBasePointESR is None
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "sced-curves-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_sced_curve_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_sced_curves_keep_non_wind_and_dam_tables_separate():
+ samples = json.loads((INPUTS / "sced-curves-evidence.json").read_text())
+ data = BytesIO()
+ with ZipFile(data, "w") as archive:
+ for sample in samples:
+ archive.writestr(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ with Client() as client:
+ old = list(client.np3_908_er._2d_agg_esc_non_wind_history.read(data.getvalue()))
+ current = list(
+ client.np3_908_er._2d_agg_esc_nonirr_history.read(data.getvalue())
+ )
+ dam = list(client.np3_908_er._2d_agg_dam_min_esc_history.read(data.getvalue()))
+ empty = list(
+ client.np3_908_er._2d_agg_edc_clr_west_history.read(data.getvalue())
+ )
+ assert len(old) == len(current) == len(dam) == 3
+ assert old[0].MW == Decimal("655.49999845")
+ assert current[0].MW == Decimal("1451.40000152")
+ assert old[0].price == Decimal(-250)
+ assert dam[0].deliveryDate == date(2014, 3, 10)
+ assert dam[0].MW == Decimal(609)
+ assert empty == []
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "dam-as-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_dam_as_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_dam_as_readers_keep_legacy_and_current_categories_separate():
+ samples = json.loads((INPUTS / "dam-as-evidence.json").read_text())
+ content = BytesIO()
+ with ZipFile(content, "w") as archive:
+ for sample in samples:
+ archive.writestr(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ with Client() as client:
+ legacy = list(
+ client.np3_911_er._2d_cleared_dam_as_rrsload_history.read(
+ content.getvalue()
+ )
+ )
+ aggregate = list(
+ client.np3_911_er._2d_agg_as_offers_rrspfr_history.read(content.getvalue())
+ )
+ dam = list(
+ client.np3_911_er._2d_agg_dam_as_offers_rrspfr_history.read(
+ content.getvalue()
+ )
+ )
+ assert len(legacy) == len(aggregate) == len(dam) == 3
+ assert legacy[0].totalClearedASRRSLOAD == Decimal("960.9")
+ assert aggregate[0].MWOffered == Decimal("19.2")
+ assert dam[0].MWOffered == Decimal(51)
+ assert legacy[0].deliveryDate == date(2014, 4, 29)
+ assert aggregate[0].deliveryDate == date(2025, 4, 24)
+ assert dam[0].deliveryDate == date(2026, 9, 5)
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "cop-obligations-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_cop_obligation_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_cop_and_obligation_history_preserves_source_meanings():
+ with Client() as client:
+ cop = next(
+ client.np1_301._60_cop_adj_period_snapshot_history.read(
+ zipped("old.csv", (INPUTS / "np1-301-history-samples.csv").read_bytes())
+ )
+ )
+ obligation = next(
+ client.np1_302.as_obligation_history.read(
+ zipped("old.csv", (INPUTS / "np1-302-history-samples.csv").read_bytes())
+ )
+ )
+ current = next(
+ client.np1_302.as_obligation_history.read(
+ zipped("new.csv", (INPUTS / "np1-302-history-current.csv").read_bytes())
+ )
+ )
+ assert cop.hourEnding == "01:00"
+ assert cop.deliveryDate == date(2014, 3, 2)
+ assert cop.RRS == Decimal(0)
+ assert cop.RRSPFR is None
+ assert obligation.RRSObligation == Decimal(1)
+ assert obligation.RRSResponsibility == Decimal(0)
+ assert obligation.RRSOblFinal is None
+ assert current.REGUPOblAdvisory == Decimal(".07869")
+ assert current.REGUPResponsibility is None
+ assert current.deliveryDate == date(2026, 3, 11)
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "event-sasm-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_event_sasm_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_sasm_history_preserves_timestamp_formats_and_offer_blocks():
+ with Client() as client:
+ award = next(
+ client.np3_990_ex._60_sasm_gen_res_as_offer_awards_history.read(
+ zipped(
+ "60d_SASM_Generation_Resource_AS_Offer_Awards-26-JAN-26.csv",
+ (
+ INPUTS
+ / "np3-990-ex--60_sasm_gen_res_as_offer_awards-history-sasm-nonempty.csv"
+ ).read_bytes(),
+ )
+ )
+ )
+ offer = next(
+ client.np3_990_ex._60_sasm_gen_res_as_offers_history.read(
+ zipped(
+ "60d_SASM_Generation_Resource_AS_Offers-26-JAN-26.csv",
+ (
+ INPUTS
+ / "np3-990-ex--60_sasm_gen_res_as_offers-history-sasm-nonempty.csv"
+ ).read_bytes(),
+ )
+ )
+ )
+ assert award.SASMId is not None
+ assert award.SASMId.isoformat() == "2025-11-27T02:45:05"
+ assert offer.SASMId == award.SASMId
+ assert award.RRSPFRAwarded == Decimal("1.2")
+ assert award.RRSAwarded is None
+ assert offer.price1RRSPFR == Decimal(5000)
+ assert offer.price1RRS is None
+ assert offer.quantityMW1 == Decimal(20)
+ assert offer.quantityMW5 == Decimal(60)
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "cop-updates-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_cop_update_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_cop_update_timestamps_and_revisions_are_preserved():
+ old = (INPUTS / "np3-991-ex-history-samples.csv").read_bytes()
+ current = (INPUTS / "np3-991-ex-history-current.csv").read_bytes()
+ with Client() as client:
+ reader = client.np3_991_ex._60_cop_all_updates_history
+ revisions = list(reader.read(zipped("old.csv", old)))
+ latest = next(reader.read(zipped("new.csv", current)))
+ with pytest.raises(ValueError, match="does not match"):
+ list(
+ reader.read(
+ zipped("bad.csv", old.replace(b"12/3/2018 11:41", b"not-a-time"))
+ )
+ )
+ assert len(revisions) == 3
+ assert revisions[0].updateTime is not None
+ assert revisions[0].updateTime.isoformat() == "2018-12-03T11:41:00"
+ assert latest.updateTime is not None
+ assert latest.submitTime is not None
+ assert latest.updateTime.isoformat() == "2026-06-30T09:01:26"
+ assert latest.submitTime.isoformat() == "2026-06-30T08:01:25"
+ assert revisions[0].RRS == Decimal(0)
+ assert revisions[0].RRSPFR is None
+ assert latest.cancelFlag is False
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "sced-disclosure-evidence.json").read_text()),
+ ids=lambda entry: entry["fixture"],
+)
+def test_sced_disclosure_historical_formats(sample):
+ product, method = sample["endpoint"].split("/")
+ with Client() as client:
+ reader = getattr(
+ getattr(client, product.replace("-", "_")),
+ ("_" if method[0].isdigit() else "") + method + "_history",
+ )
+ rows = list(
+ reader.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == min(3, sample["csv_rows"])
+ if rows:
+ assert rows[0].model_dump(mode="json") == sample["first_row"]
+
+
+def test_sced_disclosure_keeps_legacy_services_and_override_values():
+ with Client() as client:
+ legacy = next(
+ client.np3_965_er._60_sced_qse_self_arranged_as_history.read(
+ zipped(
+ "60d_SCED_QSE_Self_Arranged_AS-01-MAY-14.csv",
+ (
+ INPUTS
+ / "np3-965-er--60_sced_qse_self_arranged_as-history-samples.csv"
+ ).read_bytes(),
+ )
+ )
+ )
+ override = next(
+ client.np3_965_er._60_hdl_ldl_man_override_history.read(
+ zipped(
+ "60d_HDL_LDL_ManOverride-07-JUN-24.csv",
+ (
+ INPUTS
+ / "np3-965-er--60_hdl_ldl_man_override-history-hdl-override.csv"
+ ).read_bytes(),
+ )
+ )
+ )
+ capability = next(
+ client.np3_965_er._60d_sced_as_cap_man_override_history.read(
+ zipped(
+ "60d_AS_Capability_ManOverride-14-JUN-26.csv",
+ (
+ INPUTS
+ / "np3-965-er--60d_sced_as_cap_man_override-history-as-override.csv"
+ ).read_bytes(),
+ )
+ )
+ )
+ assert legacy.RRSGN == Decimal(12)
+ assert legacy.RRSNC == Decimal(45)
+ assert legacy.RRSPFR is None
+ assert override.HDLOriginal == Decimal("95.13999938")
+ assert override.HDLManual == Decimal(0)
+ assert override.LDLManual == Decimal(160)
+ assert capability.startTime is not None
+ assert capability.startTime.isoformat() == "2026-04-15T12:03:39"
+ assert capability.ASType == "REGDN"
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "eia-hourly-evidence.json").read_text()),
+ ids=lambda s: s["fixture"],
+)
+def test_eia_hourly_archive_formats(sample):
+ with Client() as client:
+ rows = list(
+ client.eia_930_cd.hourly_operations_history.read(
+ zipped(sample["file"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert [r.model_dump(mode="json") for r in rows] == sample["rows"]
+
+
+def test_eia_hourly_preserves_unreported_hours_and_utc_timestamps():
+ with Client() as client:
+ timestamps, demand = client.eia_930_cd.hourly_operations_history.read(
+ zipped(
+ "same-day.csv",
+ (INPUTS / "eia-930-cd-remaining-archive.csv").read_bytes(),
+ )
+ )
+ assert timestamps.dataDate == date(2026, 9, 7)
+ assert timestamps.dataType == "UTC0"
+ assert timestamps.HR1 == datetime(2026, 9, 7, 6, tzinfo=UTC)
+ assert demand.dataType == "D"
+ assert demand.HR1 == Decimal(63489)
+ assert demand.HR15 is None
+ assert demand.HR25 is None
+
+
+def test_bundle_rows_paginate_filter_and_keep_bundle_downloads_individual():
+ calls = []
+ csv = (INPUTS / "np4-190-cd.csv").read_bytes()
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ assert "/bundle/np4-190-cd" in request.url.path
+ if request.method == "POST":
+ ids = json.loads(request.content)["docIds"]
+ assert len(ids) == 1
+ calls.append(ids[0])
+ return httpx.Response(
+ 200, content=zipped("inner.zip", zipped("report.csv", csv))
+ )
+ assert "postDatetimeFrom" not in request.url.params
+ page = int(request.url.params["page"])
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": page, "totalPages": 3},
+ "product": {
+ "emilId": "NP4-190-CD",
+ "name": "DAM",
+ "reportTypeId": 12331,
+ },
+ "bundles": [
+ {
+ "docId": -page,
+ "friendlyName": f"DAMSPNP4190_2018-0{page}",
+ "postDatetime": f"2018-0{page}-28T23:59:59",
+ }
+ ],
+ },
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ rows = list(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.rows(
+ kind="bundle",
+ batch_size=100,
+ posted_from=datetime(2018, 2, 1), # noqa: DTZ001
+ posted_to=datetime(2018, 3, 31), # noqa: DTZ001
+ where=lambda row: row.settlementPoint == "AMISTAD_ALL",
+ )
+ )
+ assert calls == [-2, -3]
+ assert len(rows) == 2
+ # Selection applies to bundle publication dates; payload dates and duplicates remain.
+ assert rows[0] == rows[1]
+ assert rows[0].deliveryDate == date(2014, 5, 2)
+
+
+@pytest.mark.parametrize("contains_subtype", [False, True])
+def test_correction_bundle_uses_members_instead_of_document_name(contains_subtype):
+ csv = (INPUTS / "np4-196-m-spp-current.csv").read_bytes()
+ filename = (
+ "pricecorrection_DAM_SPP_2026.csv"
+ if contains_subtype
+ else "pricecorrection_DAM_MCPC_2026.csv"
+ )
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ assert "/bundle/np4-196-m" in request.url.path
+ if request.method == "POST":
+ return httpx.Response(
+ 200, content=zipped("nested.zip", zipped(filename, csv))
+ )
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": 1, "totalPages": 1},
+ "product": {
+ "emilId": "NP4-196-M",
+ "name": "DAM corrections",
+ "reportTypeId": 13030,
+ },
+ "bundles": [
+ {
+ "docId": -1,
+ "friendlyName": "DAMPriceCorrections_2026-08",
+ "postDatetime": "2026-08-31T23:59:59",
+ }
+ ],
+ },
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ rows = list(
+ client.np4_196_m.dam_price_corrections_spp_history.rows(kind="bundle")
+ )
+ assert len(rows) == (3 if contains_subtype else 0)
+
+
+def test_bad_correction_bundle_table_still_raises():
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ return httpx.Response(
+ 200, content=zipped("pricecorrection_DAM_SPP_2026.csv", b"unknown\n42\n")
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ pytest.raises(ValueError, match="unexpected CSV columns"),
+ ):
+ list(
+ client.np4_196_m.dam_price_corrections_spp_history.download(
+ [-1], kind="bundle"
+ )
+ )
+
+
+@pytest.mark.parametrize(
+ "sample",
+ json.loads((INPUTS / "middle-evidence.json").read_text()),
+ ids=lambda sample: sample["fixture"],
+)
+def test_intermediate_sced_and_wind_layouts(sample):
+ product, method = sample["endpoint"].split("/")
+ method = ("_" if method[0].isdigit() else "") + method + "_history"
+ with Client() as client:
+ reader = getattr(getattr(client, product.replace("-", "_")), method)
+ rows = list(
+ reader.read(
+ zipped(sample["member"], (INPUTS / sample["fixture"]).read_bytes())
+ )
+ )
+ assert len(rows) == sample["fixtureRows"]
+ assert rows[0].model_dump(mode="json") == sample["firstRow"]
+ if sample["endpoint"] == "np4-732-cd/wpp_hrly_avrg_actl_fcast":
+ assert rows[0].hourEnding == 24
+ assert rows[0].hourEndingTimestamp is None
+ assert rows[0].genSystemWide is None
+ assert rows[0].actualWestNorth is None
+ assert rows[0].actualLoadZoneWest is not None
+ assert rows[0].actualLoadZoneNorth is not None
+ if sample["fixture"].endswith("60_load_res_data_in_sced-2020.csv"):
+ assert rows[0].HASL == Decimal(0)
+ assert rows[0].LASL == Decimal(0)
+ # This published layout contains 35 curve points, all blank in this sample.
+ assert rows[0].SCEDBidCurveMW35 is None
+ assert rows[0].SCEDBidCurvePrice35 is None
+ assert rows[0].ASAwardsNSPIN is None
+ if sample["fixture"].endswith("60_sced_qse_self_arranged_as-2020.csv"):
+ assert rows[0].SCEDTimestamp.isoformat() == "2019-12-02T00:00:22"
+ if sample["fixture"].endswith("60_sced_gen_res_data-2023.csv"):
+ assert rows[0].ASRRSFFR == Decimal(0)
+ assert rows[0].ASECRS == Decimal(0)
+ assert rows[0].ASAwardsECRS is None
+
+
+@pytest.mark.parametrize(
+ "year, timestamp, total, west_north",
+ [
+ (2016, datetime(2016, 1, 30), "6986.24", "4835"), # noqa: DTZ001 - source clock
+ (2017, None, "7172.73", "6421.04"),
+ ],
+)
+def test_wind_preserves_hour_beginning_and_combined_regions(
+ year, timestamp, total, west_north
+):
+ fixture = INPUTS / f"np4-732-cd-wpp_hrly_avrg_actl_fcast-{year}.csv"
+ with Client() as client:
+ rows = list(
+ client.np4_732_cd.wpp_hrly_avrg_actl_fcast_history.read(
+ zipped("wind.csv", fixture.read_bytes())
+ )
+ )
+ assert len(rows) == 3
+ row = rows[0]
+ assert row.hourBeginningTimestamp == timestamp
+ assert row.hourEndingTimestamp is None
+ assert row.deliveryDate == (date(2017, 1, 29) if year == 2017 else None)
+ assert row.hourEnding == (24 if year == 2017 else None)
+ assert row.actualSystemWide == Decimal(total)
+ assert row.actualWestNorth == Decimal(west_north)
+ assert row.actualLoadZoneWest is None
+ assert row.actualLoadZoneNorth is None
+ assert row.genSystemWide is None
+
+
+def test_solar_history_accepts_delivery_date_with_legacy_actual_column():
+ with Client() as client:
+ rows = list(
+ client.np4_737_cd.spp_hrly_avrg_actl_fcast_history.read(
+ zipped(
+ "solar.csv", (INPUTS / "np4-737-cd-history-2017.csv").read_bytes()
+ )
+ )
+ )
+ assert [row.deliveryDate for row in rows] == [
+ date(2017, 1, 29),
+ date(2017, 1, 30),
+ date(2017, 2, 7),
+ ]
+ assert [row.hourEnding for row in rows] == [24, 1, 23]
+ assert [row.genSystemWide for row in rows] == [Decimal(0), Decimal("0.09"), None]
+ assert all(row.hourEndingTimestamp is None for row in rows)
+ assert all(row.HSLSystemWide is None for row in rows)
+
+
+def test_sced_clr_history_recognizes_legacy_aggr_filename():
+ header = (INPUTS / "np3-908-er-clr-history-2015.csv").read_bytes()
+ data = BytesIO()
+ with ZipFile(data, "w") as archive:
+ archive.writestr("48_Hour_Aggr_Energy_Demand_Curves_CLR-31-JAN-15.csv", header)
+ archive.writestr(
+ "48_Hour_Agg_Energy_Demand_Curves_CLR_West-31-JAN-15.csv", b"other\n"
+ )
+ with Client() as client:
+ reader = client.np3_908_er._2d_agg_edc_clr_history
+ assert list(reader.read(data.getvalue())) == []
+ with pytest.raises(ValueError, match="unexpected CSV columns"):
+ list(
+ reader.read(
+ zipped(
+ "48_Hour_Aggr_Energy_Demand_Curves_CLR-31-JAN-15.csv",
+ b"unknown\n",
+ )
+ )
+ )
diff --git a/tests/test_hourly_forecasts.py b/tests/test_hourly_forecasts.py
new file mode 100644
index 00000000..d6e5e80b
--- /dev/null
+++ b/tests/test_hourly_forecasts.py
@@ -0,0 +1,159 @@
+"""Original XLSX/XLSB excerpts preserve every published load component."""
+
+import hashlib
+import json
+from datetime import date, timedelta
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, HourlyLoadForecast
+
+ROOT = Path(__file__).resolve().parents[1] / "tools/inputs/hourly-forecasts"
+SOURCES = json.loads((ROOT / "sources.json").read_text())
+
+
+def original(source):
+ with ZipFile(ROOT / "samples.zip") as archive:
+ return archive.read(source["file"])
+
+
+def cells(source):
+ with ZipFile(ROOT / "samples.zip") as archive:
+ return json.loads(archive.read(source["file"] + ".json"))
+
+
+def number(value):
+ return None if value in (None, "") else Decimal(str(value))
+
+
+@pytest.mark.parametrize("source", SOURCES, ids=lambda s: s["file"])
+def test_every_component_matches_independent_source_cells(source):
+ data = original(source)
+ assert hashlib.sha256(data).hexdigest() == source["fixtureSha256"]
+ grid = cells(source)
+ first = source["firstRow"]
+ offset = 0 if grid[first - 2][0] == "year" else 1
+ with Client() as client:
+ rows = list(client.hourly_load_forecasts.read(data, filename=source["file"]))
+ assert len(rows) == len(grid) - first + 1
+ for line, (actual, raw) in enumerate(
+ zip(rows, grid[first - 1 :], strict=True), first
+ ):
+ assert actual.forecastDate == date(*(int(v) for v in raw[offset : offset + 3]))
+ assert actual.hour == raw[offset + 3]
+ source_date = raw[0] if offset else None
+ if isinstance(source_date, (float, int)):
+ source_date = (
+ date(1899, 12, 30) + timedelta(days=int(source_date))
+ ).isoformat()
+ assert actual.sourceDate == (
+ date.fromisoformat(source_date[:10]) if source_date else None
+ )
+ assert actual.sourceMember == source["file"] and actual.sourceRow == line
+ assert actual.sourceFile is None and actual.scenario is None
+ assert actual.unit == ("MW" if source["title"].startswith("2023") else None)
+ seen = set()
+ for group, start, zones in source["groups"]:
+ component = getattr(actual, group)
+ for i, zone in enumerate(zones, start):
+ assert getattr(component, zone) == number(raw[i])
+ assert actual.sourceLabels[f"{group}.{zone}"] == grid[first - 2][i]
+ seen.add(i)
+ assert seen == set(range(offset + 4, len(raw)))
+ assert (
+ HourlyLoadForecast.model_validate_json(actual.model_dump_json()) == actual
+ )
+
+
+def test_absent_totals_negative_pv_and_flexible_load_components_stay_distinct():
+ with Client() as client:
+ decoded = {
+ s["title"]: next(client.hourly_load_forecasts.read(original(s)))
+ for s in SOURCES
+ }
+ tsp = decoded["TSP Provided Hourly Forecast"]
+ adjusted = decoded["ERCOT Adjusted Forecast"]
+ assert tsp.contractedLoad.total is None and tsp.officerLetterLoad.total is None
+ assert adjusted.contractedLoad.total == adjusted.officerLetterLoad.total == 0
+ assert tsp.largeFlexibleLoad.east is None
+ older = decoded["2022 ERCOT Hourly Forecast"]
+ assert older.rooftopPV.southCentral < 0
+ assert older.gross is not None and older.baseLoad is None
+ assert decoded["2021 ERCOT Hourly Forecast"].forecast is not None
+ row = decoded["2024 ERCOT Hourly Forecast"]
+ assert (
+ row.contractedFlexibleLoad is not None
+ and row.officerLetterFlexibleLoad is not None
+ )
+ assert row.officerLetterLoad.east is None
+ assert row.sourceLabels["largeFlexibleLoad.coast"] == "Coast_LFL_15%"
+ assert row.sourceLabels["net.coast"] == "Coast_Net_15"
+ assert "15%" in row.sourceNotes[0]
+
+
+def test_live_index_shapes_discover_both_excel_formats_and_filter_after_scenario():
+ sources = {s["url"]: s for s in SOURCES}
+ with ZipFile(ROOT.parent / "peak-forecasts/indexes.zip") as archive:
+ indexes = {n: archive.read(n) for n in archive.namelist()}
+ calls = []
+
+ def respond(request):
+ url = str(request.url)
+ calls.append(url)
+ if url in sources:
+ return httpx.Response(200, content=original(sources[url]))
+ name = url.rsplit("/", 1)[-1]
+ return httpx.Response(
+ 200, content=indexes[("root" if name == "forecast" else name) + ".html"]
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(respond)) as http,
+ Client(client=http) as client,
+ ):
+ service = client.hourly_load_forecasts
+ assert {f.url for f in service.files()} == set(sources)
+ rows = list(
+ service.rows(
+ where=lambda r: r.scenario == "ercot_adjusted" and r.hour == 24
+ )
+ )
+ assert len(rows) == 2
+ assert all(r.sourceFile.title == "ERCOT Adjusted Forecast" for r in rows)
+ assert all("ercot.com" in url and "mis" not in url.lower() for url in calls)
+
+
+def test_repeated_hours_and_date_column_disagreement_are_preserved():
+ book = openpyxl.Workbook()
+ sheet = book.active
+ sheet.append(["Date", "Year", "Month", "Day", "Hour", "Coast", "ERCOT"])
+ sheet.append([date(2025, 11, 1), 2025, 11, 2, 2, 10, 100])
+ sheet.append([date(2025, 11, 2), 2025, 11, 2, 2, 20, 200])
+ stream = BytesIO()
+ book.save(stream)
+ with Client() as client:
+ rows = list(client.hourly_load_forecasts.read(stream.getvalue()))
+ assert len(rows) == 2 and rows[0].hour == rows[1].hour == 2
+ assert rows[0].forecastDate == rows[1].forecastDate == date(2025, 11, 2)
+ assert rows[0].sourceDate == date(2025, 11, 1)
+ assert rows[0].forecast.coast == 10 and rows[1].forecast.coast == 20
+
+
+def test_unknown_component_is_not_silently_dropped():
+ book = openpyxl.Workbook()
+ sheet = book.active
+ sheet.append(["year", "month", "day", "hour", "Coast_NewComponent"])
+ sheet.append([2025, 1, 1, 1, 100])
+ stream = BytesIO()
+ book.save(stream)
+ with (
+ Client() as client,
+ pytest.raises(ValueError, match="Unknown hourly forecast column"),
+ ):
+ list(client.hourly_load_forecasts.read(stream.getvalue()))
diff --git a/tests/test_hourly_load.py b/tests/test_hourly_load.py
new file mode 100644
index 00000000..84a71c56
--- /dev/null
+++ b/tests/test_hourly_load.py
@@ -0,0 +1,260 @@
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from struct import pack_into, unpack_from
+from zipfile import ZIP_DEFLATED, ZIP_STORED, BadZipFile, ZipFile
+
+import httpx
+import pytest
+from openpyxl import Workbook
+
+from tinyercot import Client
+from tinyercot._load import INDEX_URL
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs/history"
+COLUMNS = (
+ "coast",
+ "east",
+ "farWest",
+ "north",
+ "northC",
+ "southern",
+ "southC",
+ "west",
+ "total",
+)
+
+
+def sample(year):
+ return (INPUTS / f"hourly-load-{year}.zip").read_bytes()
+
+
+@pytest.fixture(scope="module")
+def rows():
+ with Client() as client:
+ return {
+ year: list(client.hourly_load.read_weather_zones(sample(year)))
+ for year in [2002, 2016, 2022]
+ }
+
+
+def test_legacy_xls_values_and_hour_24(rows):
+ data = rows[2002]
+ assert len(data) == 8760
+ row = data[0]
+ assert (row.operatingDay, row.hourEnding) == (date(2002, 1, 1), 1)
+ assert [getattr(row, name) for name in COLUMNS] == [
+ Decimal(v)
+ for v in (
+ "8331.469266026934",
+ "1111.0965494424045",
+ "1094.045495798935",
+ "995.2983921124664",
+ "10336.304899346236",
+ "2165.0075712469265",
+ "4793.193560266372",
+ "843.747177253755",
+ "29670.162911494022",
+ )
+ ]
+ assert row.sourceMember == "2002_ercot_hourly_load_data.xls"
+ assert row.sourceSheet == "native_Load_2002"
+ assert row.sourceHourEnding == "2002-01-01 01:00:00.003000"
+ assert (data[1].operatingDay, data[1].hourEnding) == (date(2002, 1, 1), 2)
+ assert data[1].sourceHourEnding == "2002-01-01 01:59:59.997000"
+ assert (data[23].operatingDay, data[23].hourEnding) == (date(2002, 1, 1), 24)
+ assert (data[-1].operatingDay, data[-1].hourEnding) == (date(2002, 12, 31), 24)
+
+
+def test_oversized_sheet_dimensions_and_missing_hour_values(rows):
+ data = rows[2016]
+ assert len(data) == 8784
+ assert data[0].total == Decimal("33852.7585869574")
+ assert data[-1].operatingDay == date(2016, 12, 31)
+ (missing,) = [
+ r for r in data if r.operatingDay == date(2016, 11, 6) and r.hourEnding == 24
+ ]
+ assert all(getattr(missing, name) is None for name in COLUMNS)
+ assert all(r.total is not None for r in data if r is not missing)
+
+
+def test_dst_labels_and_mixed_excel_datetime(rows):
+ data = rows[2022]
+ assert len(data) == 8760
+ assert data[0].total == Decimal("38006.938896")
+ repeated = [
+ r for r in data if r.operatingDay == date(2022, 11, 6) and r.hourEnding == 2
+ ]
+ assert [(r.dstLabel, r.total) for r in repeated] == [
+ (None, Decimal("34706.875462")),
+ ("DST", Decimal("34067.955296")),
+ ]
+ assert len([r for r in data if r.operatingDay == date(2022, 11, 6)]) == 25
+ assert len([r for r in data if r.operatingDay == date(2022, 3, 13)]) == 23
+ (mixed,) = [
+ r for r in data if r.operatingDay == date(2022, 12, 1) and r.hourEnding == 1
+ ]
+ assert mixed.sourceHourEnding == "2022-12-01 01:00:00"
+ assert mixed.total == Decimal("42313.98967")
+ assert data[-1].hourEnding == 24
+ assert data[-1].operatingDay == date(2022, 12, 31)
+
+
+def test_anonymous_discovery_and_operating_date_filter():
+ url = "https://www.ercot.com/files/docs/2015/10/22/2002_ercot_hourly_load_data.xls"
+ old = "https://www.ercot.com/files/docs/2004/07/26/erceei95.txt"
+ recent = "https://www.ercot.com/files/docs/2023/02/09/Native_Load_2023.zip"
+ html = f'2002 ERCOT Hourly Load Data 1995 ERCOT Hourly Load Data 2023 ERCOT Hourly Load Data '
+ requests = []
+ with ZipFile(BytesIO(sample(2002))) as z:
+ data = z.read(z.namelist()[0])
+
+ def handle(request):
+ requests.append(str(request.url))
+ assert "authorization" not in request.headers
+ assert "ocp-apim-subscription-key" not in request.headers
+ if str(request.url) == INDEX_URL:
+ return httpx.Response(200, text=html)
+ assert str(request.url) == url
+ return httpx.Response(200, content=data)
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handle)) as http,
+ Client(client=http) as client,
+ ):
+ assert [a.year for a in client.hourly_load.archives()] == [1995, 2002, 2023]
+ data = list(
+ client.hourly_load.weather_zones(
+ date_from=date(2002, 12, 31), date_to=date(2002, 12, 31)
+ )
+ )
+ assert [r.hourEnding for r in data] == list(range(1, 25))
+ assert requests == [INDEX_URL, INDEX_URL, url]
+
+
+def workbook(header, row):
+ book = Workbook()
+ book.active.append(header)
+ book.active.append(row)
+ out = BytesIO()
+ book.save(out)
+ book.close()
+ return out.getvalue()
+
+
+def test_unrecognized_control_area_header_fails():
+ data = workbook(
+ ["MONTH", "DAY", "YEAR", "HOUR ENDING", "AENX"], [1, 1, 1998, 1, 846000]
+ )
+ with (
+ Client() as client,
+ pytest.raises(ValueError, match="unsupported weather-zone header"),
+ ):
+ list(client.hourly_load.read_weather_zones(data))
+
+
+def test_missing_and_invalid_source_cells():
+ header = [
+ "Hour Ending",
+ "COAST",
+ "EAST",
+ "FWEST",
+ "NORTH",
+ "NCENT",
+ "SOUTH",
+ "SCENT",
+ "WEST",
+ "ERCOT",
+ ]
+ with Client() as client:
+ (row,) = client.hourly_load.read_weather_zones(
+ workbook(header, ["01/01/2024 01:00", None, 0, 1, 2, 3, 4, 5, 6, 21])
+ )
+ assert row.coast is None
+ assert row.east == 0
+ with pytest.raises(ValueError, match="nonnumeric load"):
+ list(
+ client.hourly_load.read_weather_zones(
+ workbook(
+ header, ["01/01/2024 01:00", "missing", 0, 1, 2, 3, 4, 5, 6, 21]
+ )
+ )
+ )
+
+
+def test_zip_integrity_errors_propagate():
+ data = BytesIO()
+ with ZipFile(data, "w", compression=ZIP_STORED) as z:
+ z.writestr("data.xlsx", b"original-content")
+ corrupt = data.getvalue().replace(b"original-content", b"modified-content")
+ with Client() as client, pytest.raises(BadZipFile, match="CRC"):
+ list(client.hourly_load.read_weather_zones(corrupt))
+
+
+def stale_directory(compression=ZIP_DEFLATED):
+ content = workbook(
+ [
+ "Hour Ending",
+ "COAST",
+ "EAST",
+ "FWEST",
+ "NORTH",
+ "NCENT",
+ "SOUTH",
+ "SCENT",
+ "WEST",
+ "ERCOT",
+ ],
+ ["01/01/2026 01:00", 1, 2, 3, 4, 5, 6, 7, 8, 36],
+ )
+ output = BytesIO()
+ with ZipFile(output, "w", compression=compression) as archive:
+ archive.writestr("Native_Load_2026.xlsx", content)
+ data = bytearray(output.getvalue())
+ end = data.rfind(b"PK\x05\x06")
+ directory = unpack_from("Indicative Real-Time Reserve ORDC Price Adder ',
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.indicative_ordc.rows(where=lambda r: r.repeatedHourFlag == "Y")
+ )
+ assert len(rows) == 12
+ assert all(r.scedTimestamp.year == 2013 for r in rows)
+ assert requested == ["https://www.ercot.com/mktinfo/rtm", ARCHIVE_URL]
+
+
+def test_saved_csv_and_nested_archives_preserve_overlaps():
+ with ZipFile(FIXTURE) as archive:
+ member = next(n for n in archive.namelist() if n.endswith(".csv"))
+ data = archive.read(member)
+ nested = BytesIO()
+ with ZipFile(nested, "w") as archive:
+ archive.writestr("one.CSV", data)
+ outer = BytesIO()
+ with ZipFile(outer, "w") as archive:
+ archive.writestr("nested.zip", nested.getvalue())
+ archive.writestr("two.csv", data)
+ with Client() as client:
+ saved = list(client.indicative_ordc.read(data, filename="saved.csv"))
+ rows = list(client.indicative_ordc.read(outer.getvalue()))
+ assert saved and all(r.sourceMember == "saved.csv" for r in saved)
+ assert len(rows) == 2 * len(saved)
+ assert {r.sourceMember for r in rows} == {"one.CSV", "two.csv"}
+
+
+def test_unknown_column_does_not_silently_change_price_meaning():
+ with ZipFile(FIXTURE) as archive:
+ member = next(n for n in archive.namelist() if n.endswith(".csv"))
+ data = archive.read(member).replace(b"RTORPA", b"NEW_ADDER")
+ with Client() as client, pytest.raises(ValueError, match="changed.csv"):
+ list(client.indicative_ordc.read(data, filename="changed.csv"))
diff --git a/tests/test_legacy_load.py b/tests/test_legacy_load.py
new file mode 100644
index 00000000..31740682
--- /dev/null
+++ b/tests/test_legacy_load.py
@@ -0,0 +1,217 @@
+from collections import Counter
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from itertools import islice
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+
+from tinyercot import Client
+from tinyercot._load import INDEX_URL
+
+INPUT = (
+ Path(__file__).resolve().parents[1] / "tools/inputs/history/legacy-hourly-load.zip"
+)
+
+
+def sample(name):
+ with ZipFile(INPUT) as archive:
+ return archive.read(name)
+
+
+@pytest.mark.parametrize(
+ "filename,count",
+ [
+ ("erceei95.txt", 8760),
+ ("96load.txt", 9685),
+ ("erceei97.txt", 8760),
+ ("erceei97.xls", 8760),
+ ("97frc714.zip", 96624),
+ ("ferc714.zip", 236520),
+ ("1999ferc714.zip", 96371),
+ ("2000ferc714.zip", 96635),
+ ],
+)
+def test_all_original_file_counts(filename, count):
+ with Client() as client:
+ assert (
+ sum(
+ 1
+ for _ in client.hourly_load.read_legacy(
+ sample(filename), filename=filename
+ )
+ )
+ == count
+ )
+
+
+def test_eei_card_boundaries_and_raw_headers():
+ with Client() as client:
+ rows = list(
+ islice(
+ client.hourly_load.read_legacy(
+ sample("erceei95.txt"), filename="erceei95.txt"
+ ),
+ 24,
+ )
+ )
+ assert [r.hourEnding for r in rows] == list(range(1, 25))
+ assert all(r.operatingDay == date(1995, 1, 1) for r in rows)
+ assert [rows[i].demand for i in [0, 11, 12, 23]] == [19732, 23825, 23677, 24101]
+ assert all(r.unit == "MW" and r.entityType == "system" for r in rows)
+ assert (
+ rows[0].sourceCardHeader == sample("erceei95.txt").decode().splitlines()[0][:20]
+ )
+ assert (
+ rows[12].sourceCardHeader
+ == sample("erceei95.txt").decode().splitlines()[1][:20]
+ )
+
+
+def test_1997_raw_and_xls_are_identical():
+ with Client() as client:
+ raw = [
+ (r.operatingDay, r.hourEnding, r.demand, r.unit)
+ for r in client.hourly_load.read_legacy(
+ sample("erceei97.txt"), filename="erceei97.txt"
+ )
+ ]
+ workbook = [
+ (r.operatingDay, r.hourEnding, r.demand, r.unit)
+ for r in client.hourly_load.read_legacy(sample("erceei97.xls"))
+ ]
+ assert raw == workbook
+ assert max(r[2] for r in raw) == 50365
+ # Independently published workbook summary is 249610.864 GWh.
+ assert sum(r[2] for r in raw) / 1000 == Decimal("249610.864")
+
+
+def test_control_area_identity_from_eei_member():
+ with Client() as client:
+ rows = list(islice(client.hourly_load.read_legacy(sample("97frc714.zip")), 12))
+ assert all(r.operatingDay == date(1996, 1, 1) for r in rows)
+ assert all(r.entity == r.controlArea == "COA" for r in rows)
+ assert all(r.entityType == "control_area" for r in rows)
+ assert rows[0].sourceMember == "COA96LD.EEI"
+ assert [r.demand for r in rows] == [
+ 644,
+ 624,
+ 606,
+ 598,
+ 593,
+ 597,
+ 616,
+ 628,
+ 634,
+ 672,
+ 723,
+ 752,
+ ]
+
+
+def test_lse_and_control_area_mapping_and_kw_units():
+ with Client() as client:
+ rows = list(islice(client.hourly_load.read_legacy(sample("ferc714.zip")), 27))
+ assert all(r.operatingDay == date(1998, 1, 1) and r.hourEnding == 1 for r in rows)
+ assert all(r.unit == "kW" for r in rows)
+ indexed = {r.entity: r for r in rows}
+ assert indexed["BEPC"].controlArea == "TMPP"
+ assert indexed["BEPC"].demand == 658000
+ assert indexed["HUCO & COFV"].controlArea == "TNMP"
+ assert indexed["HUCO & COFV"].demand == 8
+ assert indexed["AENX"].demand == 846000
+ assert indexed["TOTAL"].demand == 24167171
+ assert indexed["TOTAL"].entityType == "system"
+ assert indexed["TOTAL"].controlArea == "ERCOT"
+
+
+def test_source_errors_and_unlabelled_units():
+ with Client() as client:
+ rows = list(client.hourly_load.read_legacy(sample("1999ferc714.zip")))
+ errors = [r for r in rows if r.sourceError]
+ assert {(r.operatingDay, r.hourEnding, r.entity) for r in errors} == {
+ (date(1999, 3, 21), 24, "TMPP"),
+ (date(1999, 3, 21), 24, "ERCOT TOTAL"),
+ (date(1999, 4, 4), 3, "TMPP"),
+ (date(1999, 4, 4), 3, "ERCOT TOTAL"),
+ }
+ assert all(r.demand is None and r.sourceError == "#VALUE!" for r in errors)
+ assert all(r.unit is None for r in rows)
+ assert rows[10].demand == 22055255 # Original magnitude; no inferred MW conversion.
+ assert rows[0].entity == "AENX"
+ assert rows[0].demand == 820000
+
+
+def test_repeated_hour_is_not_deduplicated():
+ with Client() as client:
+ rows = [
+ r
+ for r in client.hourly_load.read_legacy(sample("2000ferc714.zip"))
+ if r.operatingDay == date(2000, 10, 29) and r.entity == "ERCOT TOTAL"
+ ]
+ assert len(rows) == 25
+ assert [r.demand for r in rows if r.hourEnding == 3] == [24286898, 23340354]
+
+
+def test_filter_uses_contained_dates_and_preserves_publication_overlap():
+ names = ["96load.txt", "erceei97.txt", "erceei97.xls", "97frc714.zip"]
+ years = [1996, 1997, 1997, 1997]
+ urls = {"https://www.ercot.com/files/docs/2004/07/26/" + n: n for n in names}
+ html = "".join(
+ f'{year} ERCOT Hourly Load Data '
+ for url, year in zip(urls, years, strict=True)
+ )
+ requests = []
+
+ def handle(request):
+ assert "authorization" not in request.headers
+ assert "ocp-apim-subscription-key" not in request.headers
+ if str(request.url) == INDEX_URL:
+ return httpx.Response(200, text=html)
+ requests.append(urls[str(request.url)])
+ return httpx.Response(200, content=sample(requests[-1]))
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handle)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.hourly_load.legacy(
+ date_from=date(1997, 1, 1), date_to=date(1997, 1, 1)
+ )
+ )
+ assert len(rows) == 72
+ assert Counter(r.sourceMember for r in rows) == {
+ "96load.txt": 24,
+ "erceei97.txt": 24,
+ "erceei97.xls": 24,
+ }
+ assert set(requests) == set(names)
+
+
+def test_eei_filename_required_and_truncated_cards_fail():
+ with Client() as client:
+ with pytest.raises(ValueError, match="original filename"):
+ list(client.hourly_load.read_legacy(sample("erceei95.txt")))
+ with pytest.raises(ValueError, match="unsupported EEI card"):
+ list(
+ client.hourly_load.read_legacy(
+ sample("erceei95.txt")[:79], filename="erceei95.txt"
+ )
+ )
+ with pytest.raises(ValueError, match="Unrecognized EEI entity"):
+ list(
+ client.hourly_load.read_legacy(
+ sample("erceei95.txt"), filename="UNKNOWNLD.EEI"
+ )
+ )
+
+
+def test_unknown_tokens_are_not_treated_as_missing():
+ with ZipFile(BytesIO(sample("1999ferc714.zip"))) as archive:
+ data = archive.read("ERCOT99HRLD.txt").replace(b"#VALUE!", b"UNKNOWN")
+ with Client() as client, pytest.raises(ValueError, match="Invalid source demand"):
+ list(client.hourly_load.read_legacy(data, filename="ERCOT99HRLD.txt"))
diff --git a/tests/test_load_profiles.py b/tests/test_load_profiles.py
new file mode 100644
index 00000000..e3d2fed7
--- /dev/null
+++ b/tests/test_load_profiles.py
@@ -0,0 +1,328 @@
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, LoadProfileCount, LoadProfileDay
+from tinyercot._load_profiles import ADJUSTMENTS_URL, COUNTS_URL, INDEX_URL
+
+FIXTURES = Path(__file__).resolve().parents[1] / "tools/inputs/load-profiles"
+
+
+@pytest.fixture(scope="module")
+def profile_counts():
+ with Client() as client:
+ return list(
+ client.load_profiles.read_counts((FIXTURES / "counts.zip").read_bytes())
+ )
+
+
+def test_profile_counts_use_data_tables_with_all_header_variants(profile_counts):
+ assert len(profile_counts) == 110
+ assert len({r.sourceMember for r in profile_counts}) == 11
+ assert all(
+ r.sourceSheet == "Data" and type(r.records) is int for r in profile_counts
+ )
+ row = next(r for r in profile_counts if r.snapshotDate == date(2013, 4, 9))
+ assert (
+ row.weatherZone,
+ row.meterDataType,
+ row.tdsp,
+ row.profileType,
+ row.records,
+ ) == ("COAST", "IDR", "AEP TEXAS CENTRAL", "BUSHILF", 294)
+ assert LoadProfileCount.model_validate_json(row.model_dump_json()) == row
+
+
+def test_profile_counts_keep_unknown_zones_and_repeated_dimensions(profile_counts):
+ missing = [r for r in profile_counts if r.weatherZone is None]
+ assert len(missing) == 5
+ assert sorted(r.records for r in missing) == [1, 2, 4, 17, 22]
+ assert [r.records for r in missing if r.tdsp == "WHARTON COUNTY EC"] == [17, 2]
+
+
+def test_profile_snapshot_labels_preserve_typos_and_read_valid_suffixes(profile_counts):
+ unknown = [r for r in profile_counts if r.snapshotDate is None]
+ assert len(unknown) == 20
+ assert {r.sourceDateLabel for r in unknown} == {"201500803", "201605614"}
+ corrected = next(r for r in profile_counts if "_corrected" in r.sourceMember)
+ assert corrected.snapshotDate == date(2018, 3, 12)
+ assert (
+ len(
+ {
+ r.sourceMember
+ for r in profile_counts
+ if r.snapshotDate == corrected.snapshotDate
+ }
+ )
+ == 2
+ )
+ spaced = next(r for r in profile_counts if "20220103 " in r.sourceMember)
+ assert spaced.snapshotDate == date(2022, 1, 3)
+
+
+def test_profile_counts_download_with_typed_predicate_and_date_bounds():
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(200, content=(FIXTURES / "counts.zip").read_bytes())
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.load_profiles.counts(
+ date_from=date(2026, 8, 6),
+ date_to=date(2026, 8, 6),
+ where=lambda r: r.weatherZone == "COAST" and r.profileType == "BUSHILF",
+ )
+ )
+ assert len(rows) == 1 and rows[0].records == 943
+ with pytest.raises(ValueError, match="date_from"):
+ list(
+ client.load_profiles.counts(
+ date_from=date(2026, 8, 7), date_to=date(2026, 8, 6)
+ )
+ )
+ assert requested == [COUNTS_URL]
+
+
+def test_profile_count_date_filters_exclude_undated_snapshots():
+ with Client() as client:
+ rows = list(
+ client.load_profiles.read_counts(
+ (FIXTURES / "counts.zip").read_bytes(), date_from=date(1900, 1, 1)
+ )
+ )
+ assert len(rows) == 90 and all(r.snapshotDate is not None for r in rows)
+
+
+def test_saved_count_filename_supplies_snapshot_label():
+ with ZipFile(FIXTURES / "counts.zip") as archive:
+ member = next(n for n in archive.namelist() if "20260806" in n)
+ data = archive.read(member)
+ with Client() as client:
+ row = next(client.load_profiles.read_counts(data, filename=member))
+ anonymous = next(client.load_profiles.read_counts(data))
+ assert row.snapshotDate == date(2026, 8, 6)
+ assert anonymous.snapshotDate is None and anonymous.sourceDateLabel is None
+
+
+@pytest.mark.parametrize("extra", [False, True])
+def test_count_reader_rejects_fractional_counts_or_nonempty_helper_column(extra):
+ book = openpyxl.Workbook()
+ sheet = book.active
+ sheet.title = "Data"
+ sheet.append(
+ [
+ "WEATHERZONE",
+ "METERDATATYPE",
+ "TDSPNAME",
+ "PROFILETYPE",
+ "RECORDS",
+ "TDSPName",
+ ]
+ )
+ sheet.append(
+ [
+ "COAST",
+ "IDR",
+ "AEP TEXAS CENTRAL",
+ "BUSHILF",
+ 294 if extra else 294.5,
+ "new data" if extra else None,
+ ]
+ )
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with (
+ Client() as client,
+ pytest.raises(ValueError, match="row width" if extra else "valid integer"),
+ ):
+ list(client.load_profiles.read_counts(data.getvalue()))
+
+
+@pytest.mark.parametrize(
+ "year,count", [(1997, 7), (2007, 4), (2012, 8), (2013, 13), (2026, 17)]
+)
+def test_captured_workbooks_cover_all_header_layouts(year, count):
+ with Client() as client:
+ rows = list(client.load_profiles.read((FIXTURES / f"{year}.zip").read_bytes()))
+ assert len(rows) == count
+ assert all(isinstance(row, LoadProfileDay) for row in rows)
+ assert all(
+ [i.interval for i in row.intervals] == list(range(1, 101)) for row in rows
+ )
+ assert all(
+ row.profileType.startswith("BUS") and row.weatherZone in {"COAST", "EAST"}
+ for row in rows
+ )
+ assert LoadProfileDay.model_validate_json(rows[0].model_dump_json()) == rows[0]
+
+
+def test_dst_keeps_all_source_columns_and_blanks():
+ with Client() as client:
+ rows = list(client.load_profiles.read((FIXTURES / "2013.zip").read_bytes()))
+ by_date = {row.operatingDay: row for row in rows}
+ spring = by_date[date(2013, 3, 10)]
+ autumn = by_date[date(2013, 11, 3)]
+ assert sum(i.energyKWh is not None for i in spring.intervals) == 92
+ assert all(i.energyKWh is None for i in spring.intervals[92:])
+ assert sum(i.energyKWh is not None for i in autumn.intervals) == 100
+ assert autumn.intervals[-1].energyKWh == Decimal("11.312")
+ assert autumn.sourceAddTime == datetime.fromisoformat("2013-11-06T00:00:00")
+ assert autumn.sourceAddTime.tzinfo is None
+
+
+def test_auxiliary_profiles_remain_separate_and_saved_filename_is_retained():
+ data = (FIXTURES / "2007.zip").read_bytes()
+ with Client() as client:
+ rows = list(client.load_profiles.read(data, profile="BUSHILF_COAST"))
+ assert [(r.kind, r.intervals[0].energyKWh) for r in rows] == [
+ ("backcast", Decimal("23.71")),
+ ("auxiliary", Decimal("11.46")),
+ ]
+ assert rows[0].operatingDay == rows[1].operatingDay == date(2007, 1, 1)
+ with ZipFile(BytesIO(data)) as archive:
+ name = next(n for n in archive.namelist() if "Auxiliary" in n)
+ saved = list(client.load_profiles.read(archive.read(name), filename=name))
+ assert saved[0] == rows[1]
+
+
+def test_xls_dates_and_optional_addtime():
+ with Client() as client:
+ old = next(client.load_profiles.read((FIXTURES / "1997.zip").read_bytes()))
+ rows = list(client.load_profiles.read((FIXTURES / "2012.zip").read_bytes()))
+ assert old.operatingDay == date(1997, 1, 3)
+ assert old.intervals[0].energyKWh == Decimal("25.36")
+ assert old.sourceAddTime is None
+ assert rows[0].sourceAddTime is None
+ q4 = next(r for r in rows if r.sourceSheet == "Q4 2012")
+ assert q4.operatingDay == date(2012, 10, 1)
+ assert q4.sourceAddTime == datetime.fromisoformat("2012-10-02T00:00:00")
+
+
+def test_hurricane_factors_and_original_profiles_keep_distinct_units():
+ data = (FIXTURES / "2008.zip").read_bytes()
+ with Client() as client:
+ rows = list(client.load_profiles.read(data))
+ factors = list(client.load_profiles.read_adjustments(data))
+ assert (
+ list(
+ client.load_profiles.read_adjustments(
+ (FIXTURES / "2013.zip").read_bytes()
+ )
+ )
+ == []
+ )
+ original = [r for r in rows if r.kind == "original"]
+ assert len(original) == 160
+ assert all(len(r.intervals) == 96 for r in original)
+ assert original[0].profile == "BUSHILF_COAST"
+ assert original[0].intervals[0].energyKWh == Decimal("14.98")
+ assert len(factors) == 16 * 96
+ assert factors[0].weatherZone == "COAST"
+ assert factors[0].operatingDay == date(2008, 9, 13)
+ assert factors[0].factor == Decimal("0.3769911504424779")
+ assert factors[-1].operatingDay == date(2008, 9, 28)
+ assert factors[-1].interval == 96
+ assert factors[-1].factor == Decimal("0.928598820058997")
+
+
+def test_adjustment_query_downloads_directly_and_filters_date():
+ requested = []
+
+ def handler(request):
+ requested.append(str(request.url))
+ return httpx.Response(
+ 200,
+ content=(
+ (FIXTURES / "index.html").read_bytes()
+ if str(request.url) == INDEX_URL
+ else (FIXTURES / "2008.zip").read_bytes()
+ ),
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.load_profiles.adjustments(
+ date_from=date(2008, 9, 13), date_to=date(2008, 9, 13)
+ )
+ )
+ assert requested == [ADJUSTMENTS_URL]
+ assert len(rows) == 96 and all(r.operatingDay == date(2008, 9, 13) for r in rows)
+
+
+def test_anonymous_discovery_and_bounded_query():
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(
+ 200,
+ content=(
+ (FIXTURES / "index.html").read_bytes()
+ if str(request.url) == INDEX_URL
+ else (FIXTURES / "2026.zip").read_bytes()
+ ),
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ archives = client.load_profiles.archives()
+ assert [a.year for a in archives] == list(range(1997, 2027))
+ requested.clear()
+ rows = list(
+ client.load_profiles.rows(
+ date_from=date(2026, 3, 8),
+ date_to=date(2026, 3, 8),
+ profile="BUSHIDG_COAST",
+ )
+ )
+ assert requested == [INDEX_URL, archives[-1].url]
+ assert len(rows) == 1 and rows[0].operatingDay == date(2026, 3, 8)
+ assert rows[0].intervals[0].energyKWh == Decimal("12.831")
+
+
+@pytest.mark.parametrize("method", ["rows", "read"])
+def test_reversed_date_bounds(method):
+ with Client() as client, pytest.raises(ValueError, match="date_from"):
+ fn = getattr(client.load_profiles, method)
+ list(
+ fn(
+ *([b""] if method == "read" else []),
+ date_from=date(2026, 2, 1),
+ date_to=date(2026, 1, 1),
+ )
+ )
+
+
+@pytest.mark.parametrize("mutation", ["header", "extra"])
+def test_unrecognized_columns_are_not_silently_dropped(mutation):
+ with ZipFile(FIXTURES / "2026.zip") as archive:
+ book = openpyxl.load_workbook(BytesIO(archive.read(archive.namelist()[0])))
+ sheet = book.worksheets[0]
+ if mutation == "header":
+ sheet.cell(1, 3, "unexpected interval")
+ else:
+ sheet.cell(2, 104, 123)
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with Client() as client, pytest.raises(ValueError, match="columns|width"):
+ list(client.load_profiles.read(data.getvalue()))
diff --git a/tests/test_load_scenarios.py b/tests/test_load_scenarios.py
new file mode 100644
index 00000000..6b2bc334
--- /dev/null
+++ b/tests/test_load_scenarios.py
@@ -0,0 +1,198 @@
+"""Weather-year predictions and independent load adjustments from original files."""
+
+import hashlib
+import json
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, HourlyLoadScenario
+
+ROOT = Path(__file__).resolve().parents[1] / "tools/inputs/load-scenarios"
+SOURCES = json.loads((ROOT / "sources.json").read_text())
+
+
+def original(source):
+ with ZipFile(ROOT / "samples.zip") as archive:
+ return archive.read(source["file"])
+
+
+def cells(source):
+ with ZipFile(ROOT / "samples.zip") as archive:
+ return json.loads(archive.read(source["file"] + ".json"))
+
+
+def number(v):
+ return None if v in (None, "") else Decimal(str(v))
+
+
+@pytest.mark.parametrize("source", SOURCES, ids=lambda s: s["file"])
+def test_all_source_years_components_dates_and_zone_labels(source):
+ data = original(source)
+ assert hashlib.sha256(data).hexdigest() == source["fixtureSha256"]
+ grid = cells(source)
+ offset = source["dateOffset"]
+ with Client() as c:
+ rows = list(c.hourly_load_scenarios.read(data, filename=source["file"]))
+ assert len(rows) == 48
+ for line, (actual, raw) in enumerate(zip(rows, grid[1:], strict=True), 2):
+ assert actual.forecastDate == date(
+ *(int(raw[i]) for i in source["clockColumns"][1:4])
+ )
+ assert actual.hour == raw[source["clockColumns"][4]]
+ assert actual.sourceDate == (
+ date.fromisoformat(raw[source["clockColumns"][0]][:10]) if offset else None
+ )
+ assert actual.weatherYearPredictions == {
+ int(grid[0][i][5:]): number(raw[i]) for i in range(offset + 4, offset + 49)
+ }
+ assert len(actual.weatherYearPredictions) == 45
+ for field, i in source["components"]:
+ assert getattr(actual, field) == number(raw[i])
+ assert actual.sourceLabels[field] == grid[0][i]
+ for year in range(1980, 2025):
+ assert (
+ actual.sourceLabels[f"weatherYearPredictions.{year}"] == f"Pred_{year}"
+ )
+ col = source["zoneColumn"]
+ label = source["sheet"] if col is None else raw[col]
+ assert actual.sourceWeatherZone == label and actual.weatherZone == label.upper()
+ assert actual.sourceWeatherZoneColumn == ("wzone" if col is not None else None)
+ assert actual.unit is None and actual.sourceFile is None
+ assert actual.sourceMarkers == {}
+ assert (actual.sourceMember, actual.sourceSheet, actual.sourceRow) == (
+ source["file"],
+ source["sheet"],
+ line,
+ )
+ assert (
+ HourlyLoadScenario.model_validate_json(actual.model_dump_json()) == actual
+ )
+
+
+def test_missing_flexible_load_is_not_zero_and_scent_column_order_is_preserved():
+ with Client() as c:
+ rows = {
+ s["title"]: next(c.hourly_load_scenarios.read(original(s))) for s in SOURCES
+ }
+ for zone in ["East", "South", "West"]:
+ assert rows[zone].largeFlexibleLoad is None
+ assert rows[zone].contractedLoad == 0
+ assert rows["Coast"].largeFlexibleLoad > 0
+ scent = rows["South Central"]
+ assert scent.sourceWeatherZoneColumn is None and scent.weatherZone == "SCENT"
+ assert scent.electricVehicles == Decimal("34.43155933856281")
+ assert scent.rooftopPV == 0
+ assert rows["South"].sourceDate is None and rows["West"].sourceDate is None
+
+
+def test_discovery_and_typed_filter_use_all_eight_actual_index_links():
+ sources = {s["url"]: s for s in SOURCES}
+ with ZipFile(ROOT.parent / "peak-forecasts/indexes.zip") as archive:
+ indexes = {n: archive.read(n) for n in archive.namelist()}
+ calls = []
+
+ def respond(request):
+ url = str(request.url)
+ calls.append(url)
+ if url in sources:
+ return httpx.Response(200, content=original(sources[url]))
+ name = url.rsplit("/", 1)[-1]
+ return httpx.Response(
+ 200, content=indexes[("root" if name == "forecast" else name) + ".html"]
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(respond)) as http,
+ Client(client=http) as c,
+ ):
+ assert {f.url for f in c.hourly_load_scenarios.files()} == set(sources)
+ rows = list(
+ c.hourly_load_scenarios.rows(
+ where=lambda r: r.weatherZone == "SCENT" and r.hour == 24
+ )
+ )
+ assert len(rows) == 2
+ assert all(r.sourceFile.title == "South Central" for r in rows)
+ assert all("mis" not in url.lower() for url in calls)
+
+
+def workbook(header, rows):
+ book = openpyxl.Workbook()
+ sheet = book.active
+ sheet.title = "Coast"
+ sheet.append(header)
+ for row in rows:
+ sheet.append(row)
+ stream = BytesIO()
+ book.save(stream)
+ return stream.getvalue()
+
+
+def test_prediction_labels_missing_cells_and_repeated_hours_remain_literal():
+ data = workbook(
+ ["year", "month", "day", "hour", "Pred_1980", "Pred_2024", "wzone", "coast_ev"],
+ [
+ [2030, 11, 3, 2, None, 42, "Coast", 0],
+ [2030, 11, 3, 2, 100, 200, "Coast", 1],
+ ],
+ )
+ with Client() as c:
+ rows = list(c.hourly_load_scenarios.read(data))
+ assert len(rows) == 2 and rows[0].hour == rows[1].hour == 2
+ assert rows[0].weatherYearPredictions == {1980: None, 2024: Decimal(42)}
+ assert rows[1].weatherYearPredictions == {1980: Decimal(100), 2024: Decimal(200)}
+ assert rows[0].sourceDate is None
+
+
+def test_foreign_zone_component_does_not_get_assigned_to_the_row_zone():
+ data = workbook(
+ ["year", "month", "day", "hour", "Pred_1980", "wzone", "east_ev"],
+ [[2030, 1, 1, 1, 100, "Coast", 1]],
+ )
+ with Client() as c, pytest.raises(ValueError, match="weather zone disagree"):
+ list(c.hourly_load_scenarios.read(data))
+
+
+def test_original_reference_error_remains_distinct_from_a_blank_prediction():
+ source = next(s for s in SOURCES if s["title"] == "South")
+ with ZipFile(ROOT / "samples.zip") as archive:
+ data = archive.read(source["errorExcerpt"]["file"])
+ expected = json.loads(archive.read("South-error.xlsx.json"))
+ assert hashlib.sha256(data).hexdigest() == source["errorExcerpt"]["sha256"]
+ with Client() as c:
+ rows = list(c.hourly_load_scenarios.read(data, filename="South.xlsx"))
+ assert len(rows) == 12
+ for row, expected_row in zip(rows, expected["records"], strict=True):
+ raw = expected_row["row"]
+ assert row.forecastDate == date(*raw[:3]) and row.hour == raw[3]
+ assert (
+ row.sourceRow == expected_row["sourceRow"]
+ and row.sourceMember == "South.xlsx"
+ )
+ assert row.weatherYearPredictions[2017] is None
+ i = expected["header"].index("Pred_2017")
+ assert row.sourceMarkers == {"Pred_2017": raw[i]}
+ for year in range(1980, 2025):
+ if year != 2017:
+ i = expected["header"].index(f"Pred_{year}")
+ assert row.weatherYearPredictions[year] == number(raw[i])
+ assert HourlyLoadScenario.model_validate_json(row.model_dump_json()) == row
+
+
+def test_text_markers_and_numeric_strings_remain_distinct():
+ data = workbook(
+ ["year", "month", "day", "hour", "Pred_2017", "Pred_2024", "wzone", "coast_ev"],
+ [[2028, 3, 13, 2, ".", "123.45", "Coast", "#N/A"]],
+ )
+ with Client() as c:
+ row = next(c.hourly_load_scenarios.read(data))
+ assert row.weatherYearPredictions == {2017: None, 2024: Decimal("123.45")}
+ assert row.electricVehicles is None
+ assert row.sourceMarkers == {"Pred_2017": ".", "coast_ev": "#N/A"}
diff --git a/tests/test_loss_factors.py b/tests/test_loss_factors.py
new file mode 100644
index 00000000..58e69525
--- /dev/null
+++ b/tests/test_loss_factors.py
@@ -0,0 +1,160 @@
+from collections import Counter
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, LossFactorDay
+from tinyercot._loss_factors import INDEX_URL
+
+FIXTURE = (
+ Path(__file__).resolve().parents[1] / "tools/inputs/loss-factors/historical.xlsx"
+)
+ARCHIVE_URL = "https://www.ercot.com/files/docs/2025/02/14/Historical-Loss-Factors_2026-01-01_thru_2026-07-31_20260805.xlsx"
+
+
+@pytest.fixture(scope="module")
+def loss_days():
+ with Client() as client:
+ return list(
+ client.loss_factors.read(FIXTURE.read_bytes(), filename=FIXTURE.name)
+ )
+
+
+def test_source_series_identifiers_and_typed_roundtrip(loss_days):
+ assert Counter(r.sourceSheet for r in loss_days) == {
+ "ACTUAL_TLF": 4,
+ "FORECASTED_TLF": 4,
+ "ACTUAL_DLF": 68,
+ "FORECASTED_DLF": 68,
+ }
+ assert len({(r.kind, r.level, r.tdsp, r.lossCode) for r in loss_days}) == 36
+ assert all(r.sourceMember == FIXTURE.name for r in loss_days)
+ first = loss_days[0]
+ assert first.kind == "actual" and first.level == "transmission"
+ assert first.recorder == "ACTLOSSFACT"
+ assert first.tdsp is None and first.lossCode is None
+ assert first.sourceStartTime == datetime.fromisoformat("2026-01-01T00:00:00")
+ assert first.sourceLastTime == datetime.fromisoformat("2026-01-02T00:18:01")
+ assert first.intervals[0].factor == Decimal("0.0194541811943054")
+ assert LossFactorDay.model_validate_json(first.model_dump_json()) == first
+
+
+def test_all_original_interval_cells_and_timestamps(loss_days):
+ book = openpyxl.load_workbook(FIXTURE, read_only=True, data_only=True)
+ records = iter(loss_days)
+ try:
+ for sheet in book:
+ # Source dimensions incorrectly declare 1,048,576 rows.
+ assert sheet.max_row == 1048576
+ sheet.reset_dimensions()
+ source = sheet.values
+ columns = {label: n for n, label in enumerate(next(source))}
+ for cells in source:
+ row = next(records)
+ assert row.sourceStartTime == cells[columns["STARTTIME"]]
+ assert row.sourceLastTime == cells[columns["LSTIME"]]
+ assert row.recorder == cells[columns["SAVERECORDER"]]
+ assert row.tdsp == (
+ cells[columns["TDSPNAME"]] if "TDSPNAME" in columns else None
+ )
+ assert row.lossCode == (
+ cells[columns["LOSSCODE"]] if "LOSSCODE" in columns else None
+ )
+ assert len(row.intervals) == 100
+ for n, interval in enumerate(row.intervals, 1):
+ value = cells[columns[f"INTV{n}"]]
+ assert interval.interval == n
+ assert interval.factor == (
+ None if value is None else Decimal(str(value))
+ )
+ assert next(records, None) is None
+ finally:
+ book.close()
+
+
+def test_short_day_and_unused_columns_remain_in_source_order(loss_days):
+ for row in loss_days:
+ present = 92 if row.operatingDay == date(2026, 3, 8) else 96
+ assert sum(v.factor is not None for v in row.intervals) == present
+ assert [v.interval for v in row.intervals] == list(range(1, 101))
+ assert all(v.factor is None for v in row.intervals[96:])
+
+
+def test_query_discovers_actual_href_and_filters_operating_date():
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ if str(request.url) == INDEX_URL:
+ return httpx.Response(
+ 200,
+ text=f'Historical Loss Factors_2026-01-01_thru_2026-07-31_20260706 ',
+ )
+ assert str(request.url) == ARCHIVE_URL
+ return httpx.Response(200, content=FIXTURE.read_bytes())
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.loss_factors.rows(
+ date_from=date(2026, 1, 1),
+ date_to=date(2026, 1, 1),
+ where=lambda r: r.kind == "forecast" and r.level == "transmission",
+ )
+ )
+ assert len(rows) == 1
+ assert rows[0].operatingDay == date(2026, 1, 1)
+ assert rows[0].sourceLastTime == datetime.fromisoformat("2025-12-30T01:15:53")
+ assert rows[0].sourceMember == ARCHIVE_URL.rsplit("/", 1)[-1]
+ assert requested == [INDEX_URL, ARCHIVE_URL]
+
+
+def test_saved_archives_preserve_overlapping_members_and_typed_filter():
+ archive = BytesIO()
+ with ZipFile(archive, "w") as z:
+ z.writestr("first.xlsx", FIXTURE.read_bytes())
+ z.writestr("revised.xlsx", FIXTURE.read_bytes())
+ with Client() as client:
+ rows = list(
+ client.loss_factors.read(
+ archive.getvalue(),
+ date_from=date(2026, 7, 31),
+ where=lambda r: (
+ r.level == "distribution"
+ and r.tdsp == "AEP TEXAS CENTRAL COMPANY"
+ and r.lossCode == "A"
+ ),
+ )
+ )
+ assert len(rows) == 4
+ assert {r.sourceMember for r in rows} == {"first.xlsx", "revised.xlsx"}
+ assert {r.kind for r in rows} == {"actual", "forecast"}
+
+
+def test_reversed_bounds_fail_before_network_access():
+ with Client() as client:
+ for reader in (
+ client.loss_factors.rows,
+ lambda **kw: client.loss_factors.read(b"", **kw),
+ ):
+ with pytest.raises(ValueError, match="date_from"):
+ list(reader(date_from=date(2026, 2, 1), date_to=date(2026, 1, 1)))
+
+
+def test_changed_header_reports_source_instead_of_silent_misalignment():
+ book = openpyxl.load_workbook(FIXTURE)
+ book["ACTUAL_TLF"]["C1"] = "RENAMED_INTERVAL"
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with Client() as client, pytest.raises(ValueError, match="changed.xlsx/ACTUAL_TLF"):
+ list(client.loss_factors.read(data.getvalue(), filename="changed.xlsx"))
diff --git a/tests/test_loss_history.py b/tests/test_loss_history.py
new file mode 100644
index 00000000..33eb2302
--- /dev/null
+++ b/tests/test_loss_history.py
@@ -0,0 +1,201 @@
+import csv
+import json
+import re
+from collections import Counter
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO, StringIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import xlrd
+
+from tinyercot import Client, LoadArchive, LossFactorDay
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs"
+EVIDENCE = json.loads((INPUTS / "public-loss-history-evidence.json").read_text())
+
+
+def fixture_rows(client, archive, f):
+ source = LoadArchive(
+ year=int(re.search(r"\d{4}", f["title"])[0]), title=f["title"], url=f["url"]
+ )
+ return client.loss_factors.read(
+ archive.read(f["member"]), filename=f["member"], source_file=source
+ )
+
+
+def test_all_captured_year_indexes_discover_every_interval_archive():
+ requested = []
+ with ZipFile(INPUTS / "loss-factors/indexes.zip") as z:
+ pages = {n.removesuffix(".html"): z.read(n) for n in z.namelist()}
+ manifest = list(
+ csv.DictReader(
+ StringIO((INPUTS / "public-loss-history-sources.csv").read_text())
+ )
+ )
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(200, content=pages[request.url.path.rsplit("/", 1)[-1]])
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ archives = client.loss_factors.archives()
+ assert len(archives) == len(manifest) == 72
+ assert {(a.title, a.url) for a in archives} == {
+ (f["title"], f["url"]) for f in manifest
+ }
+ assert {a.year for a in archives} == set(range(2001, 2027))
+ assert len(requested) == len(set(requested)) == 26
+
+
+def test_all_original_legacy_values_and_identifiers():
+ with Client() as client, ZipFile(INPUTS / "loss-factors/legacy.zip") as archive:
+ for f in EVIDENCE["fixture"]["workbooks"]:
+ data = archive.read(f["member"])
+ if data.startswith(b"\xd0\xcf"):
+ book = xlrd.open_workbook(file_contents=data)
+ source = [
+ (
+ sheet.name,
+ [
+ tuple(
+ xlrd.xldate_as_datetime(c.value, book.datemode)
+ if c.ctype == xlrd.XL_CELL_DATE
+ else c.value
+ for c in sheet.row(i)
+ )
+ for i in range(1, sheet.nrows)
+ ],
+ )
+ for sheet in book.sheets()
+ ]
+ book.release_resources()
+ else:
+ book = openpyxl.load_workbook(
+ BytesIO(data), read_only=True, data_only=True
+ )
+ source = [(s.title, list(s.values)[1:]) for s in book]
+ book.close()
+ records = fixture_rows(client, archive, f)
+ count = 0
+ for sheet, rows in source:
+ for cells in rows:
+ if cells[2] in (None, ""):
+ # Blank/styled rows and orphan code labels have no observations.
+ assert all(
+ c in (None, "") for i, c in enumerate(cells) if i != 1
+ )
+ continue
+ r = next(records)
+ count += 1
+ last = max(i for i, c in enumerate(cells) if c not in (None, ""))
+ assert r.sourceSheet == sheet and r.sourceMember == f["member"]
+ assert r.sourceStartTime == cells[2]
+ stamp = cells[last]
+ assert r.sourceLastTime == (
+ datetime.strptime(stamp.strip(), "%m/%d/%Y %H:%M:%S") # noqa: DTZ007 -- source has no offset
+ if isinstance(stamp, str)
+ else stamp
+ )
+ assert [v.factor for v in r.intervals] == [
+ None if c in (None, "") else Decimal(str(c))
+ for c in cells[4:last]
+ ]
+ assert [v.interval for v in r.intervals] == list(range(1, last - 3))
+ assert (r.recorder or r.tdsp) == cells[0]
+ assert r.sourceSecondaryIdentifier == (
+ cells[1] if cells[1] not in (None, "") else None
+ )
+ assert r.sourceMarker == (
+ cells[3] if cells[3] not in (None, "") else None
+ )
+ assert next(records, None) is None
+ assert count == f["rows"]
+
+
+def test_repeated_clocks_extra_intervals_and_raw_identifiers():
+ days = []
+ cases = {
+ "2001_historical_actual": date(2001, 10, 28),
+ "tlf_actual_for_2013": date(2013, 11, 3),
+ "dlf_forecasted_for_2014": date(2014, 11, 2),
+ "2004_historical_distribution": date(2004, 10, 31),
+ }
+ with Client() as client, ZipFile(INPUTS / "loss-factors/legacy.zip") as archive:
+ for prefix, day in cases.items():
+ f = next(
+ f
+ for f in EVIDENCE["fixture"]["workbooks"]
+ if f["member"].startswith(prefix)
+ )
+ days.extend(
+ r for r in fixture_rows(client, archive, f) if r.operatingDay == day
+ )
+ fallback = next(
+ r
+ for r in days
+ if r.sourceMember.startswith("2001_historical_actual")
+ and "DST" in r.sourceSheet
+ )
+ assert len(fallback.intervals) == 100
+ assert len({v.sourceLabel for v in fallback.intervals}) == 96
+ extra = next(
+ r
+ for r in days
+ if r.sourceMember.startswith("tlf_actual_for_2013")
+ and len(r.intervals) == 100
+ and r.sourceSheet == "TLF for 2013"
+ )
+ assert extra.operatingDay == date(2013, 11, 3)
+ assert all(v.sourceLabel is None for v in extra.intervals)
+ assert extra.sourceLastTime == datetime.fromisoformat("2013-11-04T01:00:10")
+ missing = [r for r in days if r.recorder and r.recorder.startswith("DISTLOSSFACT_")]
+ assert len(missing) == 19
+ assert all(r.tdsp is None and r.lossCode is None for r in missing)
+ assert missing[0].recorder == "DISTLOSSFACT_1_D"
+ assert missing[0].sourceSecondaryIdentifier == 1
+ assert isinstance(missing[0].sourceSecondaryIdentifier, int)
+ assert missing[0].kind == "forecast"
+ assert any(r.sourceMarker == "C" for r in days)
+ assert LossFactorDay.model_validate_json(missing[0].model_dump_json()) == missing[0]
+
+
+def test_early_distribution_kind_requires_published_label():
+ f = next(
+ f
+ for f in EVIDENCE["fixture"]["workbooks"]
+ if f["member"].startswith("2001_historical_distribution")
+ )
+ with ZipFile(INPUTS / "loss-factors/legacy.zip") as z:
+ data = z.read(f["member"])
+ index = "https://www.ercot.com/mktinfo/data_agg"
+
+ def handler(request):
+ if str(request.url) == index:
+ return httpx.Response(200, text=f'{f["title"]} ')
+ return httpx.Response(200, content=data)
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.loss_factors.rows(
+ date_from=date(2001, 10, 28),
+ date_to=date(2001, 10, 28),
+ where=lambda r: r.kind == "forecast",
+ )
+ )
+ saved = next(client.loss_factors.read(data))
+ assert saved.kind is None and saved.sourceFile is None
+ assert len(rows) == 14
+ assert all(r.kind == "forecast" and len(r.intervals) == 100 for r in rows)
+ assert all(r.sourceFile.title == f["title"] for r in rows)
+ assert Counter(r.level for r in rows) == {"distribution": 14}
diff --git a/tests/test_market_displays.py b/tests/test_market_displays.py
new file mode 100644
index 00000000..50358ed8
--- /dev/null
+++ b/tests/test_market_displays.py
@@ -0,0 +1,162 @@
+"""Compare all published cells, including DST labels, with captured public HTML."""
+
+import re
+from datetime import date, datetime
+from decimal import Decimal
+from html import unescape
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+
+from tinyercot import Client
+
+FIXTURES = Path(__file__).parents[1] / "tools/inputs/market-displays/displays.zip"
+METHODS = {
+ "dam_mcpc": "day_ahead_ancillary_prices",
+ "dam_spp": "day_ahead_prices",
+ "real_time_spp": "real_time_prices",
+ "actual_loads_of_forecast_zones": "actual_forecast_zone_load",
+ "actual_loads_of_weather_zones": "actual_weather_zone_load",
+}
+with ZipFile(FIXTURES) as archive:
+ FILES = archive.namelist()
+
+
+def source(name):
+ with ZipFile(FIXTURES) as archive:
+ return archive.read(name).decode()
+
+
+def original_rows(body):
+ return [
+ [
+ " ".join(unescape(re.sub(r"<[^>]+>", " ", cell)).split())
+ for cell in re.findall(r"]*>(.*?) ", row, re.DOTALL)
+ ]
+ for row in re.findall(r"]*>(.*?) ", body, re.DOTALL)
+ ]
+
+
+@pytest.mark.parametrize("name", FILES)
+def test_every_original_display_cell_and_date(name):
+ body = source(name)
+ prefix, _, suffix = name.removesuffix(".html").partition("_")
+ requested = date.fromisoformat(prefix) if prefix.isdigit() else None
+ table = suffix if requested else name.removesuffix(".html")
+
+ def handler(request):
+ assert request.url.path == f"/content/cdr/html/{name}"
+ assert "authorization" not in request.headers
+ assert "ocp-apim-subscription-key" not in request.headers
+ return httpx.Response(200, text=body)
+
+ with httpx.Client(transport=httpx.MockTransport(handler)) as http:
+ read = getattr(Client(client=http).dashboards, METHODS[table])
+ if name in ("20251102_dam_spp.html", "20251102_dam_mcpc.html"):
+ with pytest.raises(ValueError, match="requested operating day"):
+ read(requested)
+ return
+ result = read(requested)
+ headers, *rows = original_rows(body)
+ assert result.periodType == headers[1]
+ assert len(result.data) == len(rows)
+ for actual, raw in zip(result.data, rows, strict=True):
+ assert actual.operatingDay == datetime.strptime(raw[0], "%m/%d/%Y").date() # noqa: DTZ007
+ assert actual.operatingDay == result.operatingDay
+ assert actual.periodEnding == raw[1]
+ assert actual.values == dict(
+ zip(headers[2:], map(Decimal, raw[2:]), strict=True)
+ )
+ if requested is not None:
+ assert result.operatingDay == requested
+ updated = re.search(r"(?:Last Updated|Last Date and Time):\s*([^<]+)", body)[
+ 1
+ ].strip()
+ assert result.lastUpdated == datetime.strptime(updated, "%b %d, %Y %H:%M") # noqa: DTZ007
+ assert result.lastUpdated.tzinfo is None
+ if requested == date(2025, 11, 2):
+ assert len(rows) == (100 if table == "real_time_spp" else 25)
+ assert any("*" in row.periodEnding for row in result.data)
+ if requested == date(2026, 3, 8):
+ assert len(rows) == (92 if table == "real_time_spp" else 23)
+
+
+@pytest.mark.parametrize(
+ "change", ["heading", "row-date", "missing", "extra", "unknown", "number"]
+)
+def test_wrong_dates_or_changed_columns_never_become_plausible_prices(change):
+ body = source("20260903_dam_spp.html")
+ if change == "heading":
+ body = body.replace('value="09/03/2026"', 'value="09/04/2026"')
+ elif change == "row-date":
+ body = body.replace(">09/03/2026", ">09/04/2026", 1)
+ elif change == "unknown":
+ body = body.replace("HB_HOUSTON", "UNKNOWN_HUB")
+ else:
+ cell = re.search(r" ]*>[^<]* ", body)[0]
+ replacement = {
+ "missing": "",
+ "extra": cell + cell,
+ "number": cell.replace("09/03/2026", "not-a-date"),
+ }[change]
+ body = body.replace(cell, replacement, 1)
+ with (
+ httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=body))
+ ) as http,
+ pytest.raises(ValueError),
+ ):
+ Client(client=http).dashboards.day_ahead_prices(date(2026, 9, 3))
+
+
+def test_reordered_price_columns_follow_labels_and_duplicate_rows_survive():
+ body = source("20260903_dam_spp.html")
+ body = (
+ body.replace("HB_HOUSTON", "temporary")
+ .replace("HB_NORTH", "HB_HOUSTON")
+ .replace("temporary", "HB_NORTH")
+ )
+ row = re.findall(r"]*>.*? ", body, re.DOTALL)[1]
+ body = body.replace(row, row + row, 1)
+ with httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=body))
+ ) as http:
+ result = Client(client=http).dashboards.day_ahead_prices(date(2026, 9, 3))
+ headers, *rows = original_rows(body)
+ assert len(result.data) == 25
+ assert result.data[0] == result.data[1]
+ assert result.data[0].values == dict(
+ zip(headers[2:], map(Decimal, rows[0][2:]), strict=True)
+ )
+
+
+def test_empty_midnight_table_is_distinct_from_unavailable_market():
+ body = source("actual_loads_of_weather_zones.html")
+ rows = re.findall(r"]*>.*? ", body, re.DOTALL)
+ for row in rows[1:]:
+ body = body.replace(row, "")
+ with httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(200, text=body))
+ ) as http:
+ assert Client(client=http).dashboards.actual_weather_zone_load().data == []
+ with (
+ httpx.Client(
+ transport=httpx.MockTransport(
+ lambda _: httpx.Response(200, text=source("20251102_dam_mcpc.html"))
+ )
+ ) as http,
+ pytest.raises(ValueError, match="No published market table"),
+ ):
+ Client(client=http).dashboards.day_ahead_ancillary_prices()
+
+
+def test_unretained_date_keeps_http_error():
+ with (
+ httpx.Client(
+ transport=httpx.MockTransport(lambda _: httpx.Response(404))
+ ) as http,
+ pytest.raises(httpx.HTTPStatusError),
+ ):
+ Client(client=http).dashboards.real_time_prices(date(2010, 12, 1))
diff --git a/tests/test_monthly_forecasts.py b/tests/test_monthly_forecasts.py
new file mode 100644
index 00000000..023e8a5e
--- /dev/null
+++ b/tests/test_monthly_forecasts.py
@@ -0,0 +1,149 @@
+"""Monthly forecasts retain source date/value pairs and explicit units."""
+
+import hashlib
+import json
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+import xlrd
+
+from tinyercot import Client, MonthlyLoadForecast
+
+ROOT = Path(__file__).resolve().parents[1] / "tools/inputs/monthly-forecasts"
+SOURCES = json.loads((ROOT / "sources.json").read_text())
+
+
+def original(source):
+ with ZipFile(ROOT / "workbooks.zip") as archive:
+ return archive.read(source["file"])
+
+
+def source_cells(data):
+ if data.startswith(b"\xd0\xcf"):
+ book = xlrd.open_workbook(file_contents=data)
+ result = {
+ s.name: [s.row_values(i) for i in range(s.nrows)] for s in book.sheets()
+ }
+ book.release_resources()
+ return result
+ book = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ result = {s.title: list(s.values) for s in book}
+ book.close()
+ return result
+
+
+def number(value):
+ return None if value in (None, "") else Decimal(str(value))
+
+
+@pytest.mark.parametrize("source", SOURCES, ids=lambda s: s["file"])
+def test_every_month_value_pair_matches_the_original_workbook(source):
+ data = original(source)
+ assert hashlib.sha256(data).hexdigest() == source["sha256"]
+ grids = source_cells(data)
+ coordinates = sorted(
+ (line, table["column"], table)
+ for table in source["tables"]
+ for line in range(table["firstRow"], table["lastRow"] + 1)
+ )
+ with Client() as client:
+ rows = list(client.monthly_load_forecasts.read(data, filename=source["file"]))
+ assert len(rows) == len(coordinates)
+ for actual, (line, column, table) in zip(rows, coordinates, strict=True):
+ grid = grids[table["sheet"]]
+ values = grid[line - 1][column - 1 : column + 3]
+ header = grid[table["headerRow"] - 1]
+ expected_year = int(values[0]) if isinstance(values[0], (int, float)) else None
+ expected_month = int(values[1]) if isinstance(values[1], (int, float)) else None
+ assert (actual.forecastYear, actual.forecastMonth) == (
+ expected_year,
+ expected_month,
+ )
+ assert actual.peakDemand == number(values[2])
+ assert actual.energy == number(values[3])
+ assert actual.sourceTitle == table["title"]
+ assert actual.sourcePeakLabel == header[column + 1]
+ assert actual.sourceEnergyLabel == header[column + 2]
+ assert actual.peakUnit == ("MW" if header[column + 1] == "Peak (MW)" else None)
+ assert actual.energyUnit == (
+ "MWh" if header[column + 2].startswith("Energy (") else None
+ )
+ assert (
+ actual.sourceMember,
+ actual.sourceSheet,
+ actual.sourceRow,
+ actual.sourceColumn,
+ ) == (source["file"], table["sheet"], line, column)
+ assert actual.sourceFile is None
+ assert (
+ MonthlyLoadForecast.model_validate_json(actual.model_dump_json()) == actual
+ )
+
+
+def test_2025_independent_date_columns_and_missing_units_are_not_repaired():
+ source = next(s for s in SOURCES if "/2025/" in s["url"])
+ with Client() as client:
+ rows = list(client.monthly_load_forecasts.read(original(source)))
+ adjusted = [r for r in rows if r.sourceTitle == "ERCOT Adjusted Forecast"]
+ tsp = [r for r in rows if r.sourceTitle == "TSP Provided Forecast"]
+ assert len(adjusted) == 240 and len(tsp) == 241
+ assert (adjusted[0].forecastYear, adjusted[0].forecastMonth) == (2025, 1)
+ assert tsp[0].forecastYear is None and tsp[0].forecastMonth is None
+ assert tsp[0].peakDemand == Decimal("70716.52")
+ assert tsp[0].energy == Decimal("38585578.513")
+ assert (tsp[1].forecastYear, tsp[1].forecastMonth) == (2025, 1)
+ assert tsp[1].peakDemand == Decimal("69131.27")
+ assert (tsp[-1].forecastYear, tsp[-1].forecastMonth) == (2044, 12)
+ assert tsp[-1].peakDemand is None and tsp[-1].energy is None
+ assert all(r.peakUnit is None and r.energyUnit is None for r in rows)
+ assert all(r.sourceEnergyLabel == "Annual Energy" for r in rows)
+
+
+def test_2024_large_load_assumption_is_retained():
+ source = next(s for s in SOURCES if "/2024/" in s["url"])
+ with Client() as client:
+ row = next(client.monthly_load_forecasts.read(original(source)))
+ assert row.sourceNotes == [
+ source_cells(original(source))["Monthly Peak and Energy"][0][4]
+ ]
+ assert "15% LFL during 4CP months" in row.sourceNotes[0]
+
+
+def test_discovery_and_predicate_can_select_original_forecast_vintage():
+ by_url = {s["url"]: s for s in SOURCES}
+ calls = []
+ with ZipFile(ROOT.parent / "peak-forecasts/indexes.zip") as archive:
+ indexes = {n: archive.read(n) for n in archive.namelist()}
+
+ def respond(request):
+ url = str(request.url)
+ calls.append(url)
+ if url in by_url:
+ return httpx.Response(200, content=original(by_url[url]))
+ name = url.rsplit("/", 1)[-1]
+ return httpx.Response(
+ 200, content=indexes[("root" if name == "forecast" else name) + ".html"]
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(respond)) as http,
+ Client(client=http) as client,
+ ):
+ service = client.monthly_load_forecasts
+ assert {f.url for f in service.files()} == set(by_url)
+ rows = list(
+ service.rows(
+ where=lambda r: (
+ r.sourceFile is not None and "/2025/" in r.sourceFile.url
+ )
+ )
+ )
+ assert len(rows) == 481
+ assert all(r.sourceFile.url in by_url for r in rows)
+ assert len([u for u in calls if u in by_url]) == len(SOURCES)
+ assert all(u.startswith("https://www.ercot.com/") for u in calls)
diff --git a/tests/test_monthly_performance.py b/tests/test_monthly_performance.py
new file mode 100644
index 00000000..a58b0b5c
--- /dev/null
+++ b/tests/test_monthly_performance.py
@@ -0,0 +1,130 @@
+"""Compare all published monthly table cells and their date/format semantics."""
+
+import json
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+from openpyxl import load_workbook
+
+from tinyercot import Client
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs"
+ROOT = INPUTS / "monthly-performance"
+SOURCES = json.loads((ROOT / "sources.json").read_text())
+
+
+def original(source):
+ with ZipFile(ROOT / "workbooks.zip") as archive:
+ return archive.read(source["member"])
+
+
+@pytest.mark.parametrize("source", SOURCES, ids=lambda f: f["title"])
+def test_all_original_monthly_cells(source):
+ data = original(source)
+ with Client() as client:
+ records = list(
+ client.monthly_forecast_performance.read(data, filename=source["member"])
+ )
+ by_cell = {(r.sourceSheet, r.sourceRow, r.sourceColumn): r for r in records}
+ assert len(by_cell) == len(records) == 222
+ book = load_workbook(BytesIO(data), read_only=True, data_only=True)
+ specs = [("Forecast", 4, 1, range(5, 30), range(2, 7))]
+ specs += [
+ ("Backcast", header, month_col, range(header + 1, header + 13), [month_col + 1])
+ for header in (5, 20)
+ for month_col in (2, 5, 8)
+ ]
+ specs += [("Backcast", 5, 11, range(6, 31), [12])]
+ checked = 0
+ for sheet_name, header, month_col, lines, cols in specs:
+ sheet = book[sheet_name]
+ for line in lines:
+ source_month = sheet.cell(line, month_col).value
+ if isinstance(source_month, int):
+ expected_month = date(
+ sheet.cell(header - 1, month_col).value, source_month, 1
+ )
+ expected_date = None
+ else:
+ expected_month = date(source_month.year, source_month.month, 1)
+ expected_date = source_month.date()
+ for col in cols:
+ row = by_cell[sheet_name, line, col]
+ cell = sheet.cell(line, col)
+ assert row.sourceMember == source["member"]
+ assert row.sourceMonthColumn == month_col
+ assert row.month == expected_month and row.sourceDate == expected_date
+ assert row.series == sheet.cell(header, col).value
+ assert row.value == (
+ Decimal(str(cell.value)) if cell.value is not None else None
+ )
+ assert row.sourceNumberFormat == cell.number_format
+ assert row.sourceMarker is None
+ if cell.number_format == "0.00%" and row.value is not None:
+ assert row.percent == row.value * 100
+ else:
+ assert row.percent is None
+ if row.series in ("Goal", "Stretch"):
+ assert row.kind == "target"
+ elif sheet_name == "Backcast":
+ assert row.kind == "backcast"
+ else:
+ assert row.kind == "forecast"
+ checked += 1
+ book.close()
+ assert checked == len(records)
+
+
+def test_scales_dates_and_blank_future_months_remain_distinct():
+ source = next(f for f in SOURCES if "August 2026" in f["title"])
+ with Client() as client:
+ rows = list(client.monthly_forecast_performance.read(original(source)))
+ forecast = next(
+ r for r in rows if r.month == date(2024, 8, 1) and r.series == "Day-Ahead RUC"
+ )
+ assert forecast.sourceDate == date(2024, 8, 24)
+ assert forecast.value == Decimal("0.0141") and forecast.percent == Decimal("1.41")
+ old = next(
+ r for r in rows if r.month == date(2021, 1, 1) and r.series == "Backcast"
+ )
+ assert old.value == Decimal("1.366910678235441")
+ assert old.percent is None and old.sourceDate is None
+ future = next(r for r in rows if r.month == date(2026, 12, 1))
+ assert future.value is None
+ assert all(r.sourceRow != 101 for r in rows)
+
+
+def test_live_index_shape_and_source_metadata():
+ source = SOURCES[0]
+ with ZipFile(INPUTS / "peak-forecasts/indexes.zip") as archive:
+ pages = {n: archive.read(n) for n in archive.namelist()}
+
+ def handler(request):
+ if request.url.path.startswith("/files/"):
+ assert str(request.url) == source["url"]
+ return httpx.Response(200, content=original(source))
+ year = request.url.path.rsplit("/", 1)[-1]
+ return httpx.Response(
+ 200, content=pages[f"{year}.html" if year.isdigit() else "root.html"]
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ reader = client.monthly_forecast_performance
+ files = reader.files()
+ assert {f.url for f in files} == {f["url"] for f in SOURCES}
+ reader.files = lambda: [next(f for f in files if f.url == source["url"])]
+ rows = list(
+ reader.rows(
+ where=lambda r: r.sourceFile is not None and r.kind == "forecast"
+ )
+ )
+ assert len(rows) == 75
+ assert rows[0].sourceFile.title == source["title"]
diff --git a/tests/test_mora.py b/tests/test_mora.py
new file mode 100644
index 00000000..6cfee80a
--- /dev/null
+++ b/tests/test_mora.py
@@ -0,0 +1,230 @@
+from collections import Counter
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, MoraPercentile
+
+FIXTURE = (
+ Path(__file__).resolve().parents[1]
+ / "tools/inputs/public-tables/mora-percentiles.zip"
+)
+
+
+@pytest.fixture(scope="module")
+def percentiles():
+ with Client() as client:
+ return list(client.resource_outlook.read_percentiles(FIXTURE.read_bytes()))
+
+
+def test_all_original_fixture_values_quantiles_and_hour_labels(percentiles):
+ actual = iter(percentiles)
+ with ZipFile(FIXTURE) as archive:
+ for member in archive.namelist():
+ book = openpyxl.load_workbook(
+ BytesIO(archive.read(member)), read_only=True, data_only=True
+ )
+ try:
+ label = next(
+ v
+ for cells in book["Cover"].values
+ for v in cells
+ if isinstance(v, str) and v.startswith("Reporting Month:")
+ )
+ sheet = book["PRRM Percentile Results"]
+ sheet.reset_dimensions()
+ source = list(sheet.values)
+ notes = [
+ v
+ for cells in source
+ for v in cells
+ if isinstance(v, str) and v.startswith("* ")
+ ]
+ heading = None
+ columns = []
+ for cells in source:
+ q = cells[1] if len(cells) > 1 else None
+ if (
+ isinstance(q, (int, float))
+ or isinstance(q, str)
+ and q.endswith("%")
+ ):
+ for col, hour in columns:
+ row = next(actual)
+ value = cells[col] if col < len(cells) else None
+ assert row.value == (
+ None if value is None else Decimal(str(value))
+ )
+ assert row.percentile == Decimal(
+ str(q).removesuffix("%")
+ ) / (100 if isinstance(q, str) else 1)
+ assert row.sourcePercentile == str(q)
+ assert row.hour == (
+ int(hour) if isinstance(hour, (int, float)) else None
+ )
+ assert row.sourcePeriodLabel == str(hour)
+ assert (
+ row.sourceMetric == heading
+ and row.sourceReportLabel == label
+ )
+ assert (
+ row.sourceMember == member
+ and row.sourceSheet == sheet.title
+ )
+ assert row.sourceNotes == notes
+ elif q == "Percentiles":
+ columns = [
+ (i, v)
+ for i, v in enumerate(cells)
+ if i >= 2 and v is not None
+ ]
+ else:
+ title = next((v for v in cells[:2] if isinstance(v, str)), None)
+ if title:
+ heading = title
+ finally:
+ book.close()
+ assert next(actual, None) is None
+ assert (
+ MoraPercentile.model_validate_json(percentiles[0].model_dump_json())
+ == percentiles[0]
+ )
+
+
+def test_earliest_hours_and_missing_metrics_are_not_filled(percentiles):
+ early = [r for r in percentiles if r.sourceMember == "MORA_December2023.xlsx"]
+ assert len(early) == 308
+ assert {r.metric for r in early} == {
+ "solar_generation",
+ "wind_generation",
+ "thermal_outages",
+ }
+ assert {r.hour for r in early if r.metric == "solar_generation"} == set(
+ range(8, 19)
+ )
+ assert {r.hour for r in early if r.metric == "wind_generation"} == set(range(7, 23))
+ outages = [r for r in early if r.metric == "thermal_outages"]
+ assert len(outages) == 11
+ assert all(r.hour is None and r.sourceUnit is None for r in outages)
+ assert all(r.reportMonth == date(2023, 12, 1) for r in early)
+
+
+def test_weather_outage_regimes_and_percent_strings_remain_distinct(percentiles):
+ winter = [
+ r
+ for r in percentiles
+ if r.sourceMember == "MORA_February2026.xlsx" and r.hour is None
+ ]
+ assert Counter(r.metric for r in winter) == {
+ "non_extreme_weather_outages": 11,
+ "extreme_weather_outages": 11,
+ }
+ extreme = next(
+ r
+ for r in winter
+ if r.metric == "extreme_weather_outages" and r.percentile == Decimal("0.5")
+ )
+ assert extreme.sourcePercentile == "50%"
+ assert extreme.value == Decimal("282.8754129683155")
+ assert extreme.sourceNotes and extreme.sourceUnit == "MW"
+
+
+def test_revisions_and_changed_demand_definitions_are_retained(percentiles):
+ early = [r for r in percentiles if r.reportMonth == date(2023, 12, 1)]
+ assert len(early) == 616
+ assert {r.sourceMember for r in early} == {
+ "MORA_December2023.xlsx",
+ "MORA_December2023_v2.xlsx",
+ }
+ revised = {
+ r.sourceReportLabel
+ for r in percentiles
+ if "Revised" in r.sourceReportLabel or "REVISED" in r.sourceReportLabel
+ }
+ assert revised == {
+ "Reporting Month: August 2026, Revised",
+ "Reporting Month: March 2025 REVISED",
+ }
+ assert len({r.sourceMetric for r in percentiles if r.metric == "gross_demand"}) == 2
+
+
+def test_discovery_follows_actual_year_links_and_ignores_pdf_duplicates():
+ current = "https://www.ercot.com/files/docs/2026/09/03/MORA_November2026.xlsx"
+ older = "https://www.ercot.com/files/docs/2023/10/02/MORA_December2023.xlsx"
+ requested = []
+
+ def handler(request):
+ requested.append(str(request.url))
+ assert "authorization" not in request.headers
+ if str(request.url) in (current, older):
+ with ZipFile(FIXTURE) as z:
+ return httpx.Response(
+ 200, content=z.read(str(request.url).rsplit("/", 1)[-1])
+ )
+ if request.url.path == "/gridinfo/resource":
+ return httpx.Response(
+ 200,
+ text=f'2023 Monthly Outlook for Resource Adequacy (MORA) November 2026 Monthly Outlook for Resource Adequacy (MORA) November 2026 ',
+ )
+ assert request.url.path == "/gridinfo/resource/2023"
+ return httpx.Response(
+ 200,
+ text=f'Monthly Outlook for Resource Adequacy (MORA) December 2023 ',
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.resource_outlook.percentiles(
+ where=lambda r: r.reportMonth == date(2023, 12, 1)
+ )
+ )
+ assert len(rows) == 308
+ assert requested == [
+ "https://www.ercot.com/gridinfo/resource",
+ "https://www.ercot.com/gridinfo/resource/2023",
+ older,
+ current,
+ ]
+
+
+def test_saved_file_month_comes_from_cover_with_typed_filter():
+ with ZipFile(FIXTURE) as archive:
+ data = archive.read("MORA_August2026.xlsx")
+ with Client() as client:
+ rows = list(
+ client.resource_outlook.read_percentiles(
+ data,
+ filename="old-2023.xlsx",
+ where=lambda r: (
+ r.metric == "gross_demand" and r.percentile == Decimal("0.5")
+ ),
+ )
+ )
+ assert len(rows) == 24
+ assert all(
+ r.reportMonth == date(2026, 8, 1) and r.sourceMember == "old-2023.xlsx"
+ for r in rows
+ )
+
+
+def test_unknown_metric_cannot_reuse_previous_table_identity():
+ with ZipFile(FIXTURE) as archive:
+ book = openpyxl.load_workbook(BytesIO(archive.read("MORA_November2026.xlsx")))
+ book["PRRM Percentile Results"]["A18"] = "New generation quantity, MW"
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with (
+ Client() as client,
+ pytest.raises(ValueError, match="Unknown percentile metric"),
+ ):
+ list(client.resource_outlook.read_percentiles(data.getvalue()))
diff --git a/tests/test_mora_resources.py b/tests/test_mora_resources.py
new file mode 100644
index 00000000..00de7ac7
--- /dev/null
+++ b/tests/test_mora_resources.py
@@ -0,0 +1,163 @@
+from collections import Counter
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, MoraResource
+
+TABLES = Path(__file__).resolve().parents[1] / "tools/inputs/public-tables"
+
+
+@pytest.fixture(scope="module")
+def resources():
+ with Client() as client:
+ return [
+ row
+ for fixture in ("mora-percentiles.zip", "mora-resources.zip")
+ for row in client.resource_outlook.read_resources(
+ (TABLES / fixture).read_bytes()
+ )
+ ]
+
+
+def test_original_capacity_cells_labels_and_notes(resources):
+ by_source = {(r.sourceMember, r.sourceRow): r for r in resources}
+ assert len(by_source) == len(resources) == 19905
+ for fixture in ("mora-percentiles.zip", "mora-resources.zip"):
+ with ZipFile(TABLES / fixture) as archive:
+ for member in archive.namelist():
+ book = openpyxl.load_workbook(
+ BytesIO(archive.read(member)), read_only=True, data_only=True
+ )
+ try:
+ sheet = book["Resource Details"]
+ sheet.reset_dimensions()
+ source = list(sheet.values)
+ last_row = max(n for m, n in by_source if m == member)
+ notes = [
+ r[1]
+ for r in source[last_row:]
+ if len(r) > 1 and isinstance(r[1], str) and r[1]
+ ]
+ for (m, n), row in by_source.items():
+ if m != member:
+ continue
+ original = tuple(source[n - 1]) + (None,) * 10
+ assert row.name == original[1]
+ for value, cell in (
+ (row.installedCapacityMW, original[8]),
+ (row.reportedCapacityMW, original[9]),
+ ):
+ assert value == (
+ None if cell is None else Decimal(str(cell))
+ )
+ assert row.sourceInstalledCapacityLabel == source[1][8]
+ assert row.sourceCapacityLabel == source[1][9]
+ assert row.sourceInServiceLabel == source[1][7]
+ assert row.sourceNotes == notes
+ finally:
+ book.close()
+
+
+def test_service_years_dates_and_excel_errors_remain_distinct(resources):
+ by_source = {(r.sourceMember, r.sourceRow): r for r in resources}
+ year = by_source["MORA_October2025.xlsx", 3]
+ projected = by_source["MORA_July2025.xlsx", 1393]
+ unknown = by_source["MORA_Apr2024.xlsx", 1035]
+ assert year.inService == 1993 and type(year.inService) is int
+ assert projected.inService == date(2026, 5, 1)
+ assert projected.reportMonth == date(2025, 7, 1)
+ assert projected.category.startswith("Planned Thermal Resources")
+ assert projected.unitCode is None
+ assert unknown.inService == "#N/A"
+ assert unknown.unitCode == "GOLINDA_UNIT1"
+ assert unknown.installedCapacityMW == Decimal("101.1")
+ for row in (year, projected, unknown):
+ assert MoraResource.model_validate_json(row.model_dump_json()) == row
+
+
+def test_totals_and_adjustments_with_codes_are_summaries(resources):
+ by_source = {(r.sourceMember, r.sourceRow): r for r in resources}
+ for number, code in (
+ (404, "THERMAL_OPERATIONAL"),
+ (443, "HYDRO_OPERATIONAL"),
+ (479, "PUN_CAP_ADJUST"),
+ (784, "WIND_OPERATIONAL_C"),
+ ):
+ row = by_source["MORA_December2023.xlsx", number]
+ assert row.kind == "summary" and row.unitCode == code
+ negative = by_source["MORA_Apr2024.xlsx", 483]
+ assert negative.kind == "summary"
+ assert negative.installedCapacityMW is None
+ assert negative.reportedCapacityMW == Decimal(-71)
+ missing = by_source["MORA_March2025.xlsx", 1343]
+ assert missing.kind == "summary"
+ assert missing.installedCapacityMW == 0 and missing.reportedCapacityMW is None
+ # Column L repeats these published J values without its own table heading.
+ unit = by_source["MORA_January2026.xlsx", 1467]
+ total = by_source["MORA_January2026.xlsx", 1483]
+ assert unit.kind == "unit" and unit.reportedCapacityMW == Decimal("24.2")
+ assert total.kind == "summary"
+ assert total.reportedCapacityMW == Decimal("763.9000000000001")
+ # Column O has a helper zero on this section heading, not a resource row.
+ assert ("MORA_March2025.xlsx", 1354) not in by_source
+
+
+def test_missing_category_and_original_revisions_are_preserved(resources):
+ assert Counter(r.sourceMember for r in resources if r.category is None) == {
+ "MORA_October2025.xlsx": 402
+ }
+ early = [r for r in resources if r.reportMonth == date(2023, 12, 1)]
+ assert Counter(r.sourceMember for r in early) == {
+ "MORA_December2023.xlsx": 1432,
+ "MORA_December2023_v2.xlsx": 1432,
+ }
+ assert {r.sourceCapacityLabel for r in early} == {"WINTER\nCAPACITY\n(MW)"}
+
+
+def test_anonymous_resource_query_and_saved_nested_zip():
+ url = "https://www.ercot.com/files/docs/2025/05/02/MORA_July2025.xlsx"
+ with ZipFile(TABLES / "mora-resources.zip") as archive:
+ content = archive.read("MORA_July2025.xlsx")
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ if request.url.path == "/gridinfo/resource":
+ return httpx.Response(
+ 200,
+ text=f'Monthly Outlook for Resource Adequacy (MORA) July 2025 ',
+ )
+ assert str(request.url) == url
+ return httpx.Response(200, content=content)
+
+ outer = BytesIO()
+ with ZipFile(outer, "w") as archive:
+ archive.writestr("saved.zip", (TABLES / "mora-resources.zip").read_bytes())
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ selected = list(
+ client.resource_outlook.resources(
+ where=lambda r: r.interconnectionRequestNumber == "26INR0049"
+ )
+ )
+ saved = list(
+ client.resource_outlook.read_resources(
+ outer.getvalue(),
+ where=lambda r: (
+ r.reportMonth == date(2025, 7, 1)
+ and r.interconnectionRequestNumber == "26INR0049"
+ ),
+ )
+ )
+ assert len(selected) == len(saved) == 1
+ assert selected[0].inService == saved[0].inService == date(2026, 5, 1)
+ assert selected[0].sourceMember == "MORA_July2025.xlsx"
+ assert saved[0].sourceMember == "MORA_July2025.xlsx"
diff --git a/tests/test_mora_risk.py b/tests/test_mora_risk.py
new file mode 100644
index 00000000..3fcb1e76
--- /dev/null
+++ b/tests/test_mora_risk.py
@@ -0,0 +1,122 @@
+import json
+from datetime import date, time
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from xml.etree import ElementTree as ET
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+
+from tinyercot import Client, MoraRiskPoint, PublicFile
+from tinyercot._mora import ResourceOutlook
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs"
+SOURCES = json.loads((INPUTS / "public-mora-risk-evidence.json").read_text())["files"]
+NS = {"c": "http://schemas.openxmlformats.org/drawingml/2006/chart"}
+
+
+def source_bytes(source):
+ with ZipFile(INPUTS / source["fixture"]) as z:
+ return z.read(source["member"])
+
+
+def test_all_original_curve_coordinates_and_conditions():
+ counts = 0
+ with Client() as client:
+ for f in SOURCES[:3]:
+ data = source_bytes(f)
+ records = list(
+ client.resource_outlook.read_risk_points(data, filename=f["member"])
+ )
+ with ZipFile(BytesIO(data)) as z:
+ tree = ET.fromstring(z.read("xl/charts/chart1.xml"))
+ expected = {}
+ for series in tree.findall(".//c:ser", NS):
+ label = series.findtext("./c:tx//c:v", namespaces=NS)
+ x = {
+ int(p.attrib["idx"]): Decimal(p.findtext("./c:v", namespaces=NS))
+ for p in series.findall("./c:cat//c:pt", NS)
+ }
+ y = {
+ int(p.attrib["idx"]): Decimal(p.findtext("./c:v", namespaces=NS))
+ for p in series.findall("./c:val//c:pt", NS)
+ }
+ for i, value in x.items():
+ expected[label, i] = (value, y[i])
+ assert len(records) == len(expected)
+ book = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ try:
+ for r in records:
+ assert (r.windGenerationMW, r.probability) == expected.pop(
+ (r.sourceSeries, r.sourcePointIndex)
+ )
+ assert r.sourceChart == "xl/charts/chart1.xml"
+ assert r.sourceMember == f["member"]
+ assert r.event == (
+ "EEA3_load_shed" if r.sourceSeries.startswith("EEA3") else "EEA"
+ )
+ notes = [
+ v
+ for row in book[r.sourceSheet].values
+ for v in row
+ if isinstance(v, str) and v
+ ]
+ assert r.sourceNotes == notes
+ assert r.simulationRuns == 10000
+ assert r.sourceYAxisTitle == "Probability"
+ assert r.sourceXAxisTitle.startswith("Wind Generation (MW)")
+ assert MoraRiskPoint.model_validate_json(r.model_dump_json()) == r
+ counts += 1
+ first = records[0]
+ if "June" in f["member"]:
+ assert first.reportMonth == date(2026, 6, 1)
+ assert first.bessAvailabilityMW == Decimal(2070)
+ assert first.chartHourEnding == first.scenarioHourEnding == time(21)
+ elif "October" in f["member"]:
+ assert first.reportMonth == date(2026, 10, 1)
+ assert first.bessAvailabilityMW == Decimal(4473)
+ assert first.chartHourEnding == first.scenarioHourEnding == time(20)
+ assert records[-1].probability == 0
+ else:
+ assert first.reportMonth == date(2026, 11, 1)
+ assert first.bessAvailabilityMW == Decimal(4394)
+ assert first.chartHourEnding == time(20)
+ assert first.scenarioHourEnding == time(19)
+ assert not expected
+ finally:
+ book.close()
+ assert counts == 72
+
+
+def test_raster_only_report_has_no_numeric_curve():
+ with Client() as client:
+ assert (
+ list(client.resource_outlook.read_risk_points(source_bytes(SOURCES[3])))
+ == []
+ )
+
+
+def test_anonymous_typed_curve_query_retains_file_identity(monkeypatch):
+ source = SOURCES[2]
+ file = PublicFile(url=source["url"], title=source["title"])
+ monkeypatch.setattr(ResourceOutlook, "files", lambda self: [file])
+
+ def handler(request):
+ assert str(request.url) == file.url
+ assert "authorization" not in request.headers
+ return httpx.Response(200, content=source_bytes(source))
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ records = list(
+ client.resource_outlook.risk_points(
+ where=lambda r: r.event == "EEA3_load_shed"
+ )
+ )
+ assert len(records) == 13
+ assert all(r.sourceFile == file for r in records)
+ assert all(r.chartHourEnding != r.scenarioHourEnding for r in records)
diff --git a/tests/test_mora_summaries.py b/tests/test_mora_summaries.py
new file mode 100644
index 00000000..76734033
--- /dev/null
+++ b/tests/test_mora_summaries.py
@@ -0,0 +1,218 @@
+from datetime import date, time
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from typing import get_args
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, MoraBalance, MoraBalanceMetric, MoraCapacity
+
+TABLES = Path(__file__).resolve().parents[1] / "tools/inputs/public-tables"
+FIXTURES = ("mora-percentiles.zip", "mora-resources.zip", "mora-summaries.zip")
+
+
+@pytest.fixture(scope="module")
+def summaries():
+ with Client() as client:
+ return {
+ method: [
+ row
+ for fixture in FIXTURES
+ for row in getattr(client.resource_outlook, method)(
+ (TABLES / fixture).read_bytes()
+ )
+ ]
+ for method in ("read_capacities", "read_balance")
+ }
+
+
+@pytest.mark.parametrize(
+ ("method", "sheet_name", "label_column", "value_column"),
+ [
+ ("read_capacities", "Capacity by Resource Category", 1, 3),
+ ("read_balance", "Monthly Outlook", 4, 7),
+ ],
+)
+def test_original_cells_scenarios_and_notes(
+ summaries, method, sheet_name, label_column, value_column
+):
+ for fixture in FIXTURES:
+ with ZipFile(TABLES / fixture) as archive:
+ for member in archive.namelist():
+ book = openpyxl.load_workbook(
+ BytesIO(archive.read(member)), read_only=True, data_only=True
+ )
+ try:
+ sheet = book[sheet_name]
+ sheet.reset_dimensions()
+ cells = list(sheet.values)
+ actual = {
+ r.sourceRow: r
+ for r in summaries[method]
+ if r.sourceMember == member
+ }
+ # Each source row with a numeric cell must be accounted for.
+ expected = {
+ n
+ for n, row in enumerate(cells, 1)
+ if any(isinstance(v, (int, float)) for v in row)
+ }
+ assert set(actual) == expected
+ notes = [
+ v
+ for row in cells
+ for v in row
+ if isinstance(v, str) and v.startswith("[")
+ ]
+ header = (
+ cells[1]
+ if method == "read_capacities"
+ else next(r for r in cells if "Loads and Resources (MW)" in r)
+ )
+ columns = [
+ i
+ for i, label in enumerate(header)
+ if i >= value_column and label is not None
+ ]
+ for n, row in actual.items():
+ original = cells[n - 1]
+ assert (
+ row.sourceNotes == notes and row.sourceSheet == sheet_name
+ )
+ if method == "read_capacities":
+ assert row.resourcePath[-1] == original[label_column]
+ assert row.installedCapacityMW == Decimal(str(original[2]))
+ values = row.availableCapacity
+ else:
+ assert row.sourceMetric == original[label_column]
+ values = row.values
+ assert [v.valueMW for v in values] == [
+ None if original[i] is None else Decimal(str(original[i]))
+ for i in columns
+ ]
+ assert [v.sourceScenario for v in values] == [
+ header[i] for i in columns
+ ]
+ finally:
+ book.close()
+
+
+def test_category_hierarchy_and_battery_contribution(summaries):
+ rows = [
+ r
+ for r in summaries["read_capacities"]
+ if r.sourceMember == "MORA_November2026.xlsx"
+ ]
+ battery = next(
+ r
+ for r in rows
+ if r.section == "operational"
+ and r.resourcePath == ["Energy Storage", "Batteries"]
+ )
+ assert battery.installedCapacityMW == Decimal("20965.520000000004")
+ assert battery.availableCapacity[0].valueMW == Decimal("7853.775399999997")
+ assert battery.availableCapacity[0].hourEnding == time(19)
+ assert battery.availableCapacity[0].timeZone == "CST"
+ assert {
+ tuple(r.resourcePath)
+ for r in rows
+ if r.section == "operational" and r.resourcePath[-1] == "Other"
+ } == {
+ ("Renewable, Intermittent [6]", "Wind", "Other"),
+ ("Energy Storage", "Other"),
+ }
+ assert sum(r.section == "total" for r in rows) == 1
+ assert MoraCapacity.model_validate_json(battery.model_dump_json()) == battery
+
+
+def test_older_hours_revisions_and_missing_heading(summaries):
+ early = [
+ r for r in summaries["read_capacities"] if r.reportMonth == date(2023, 12, 1)
+ ]
+ assert len(early) == 84
+ assert {r.sourceMember for r in early} == {
+ "MORA_December2023.xlsx",
+ "MORA_December2023_v2.xlsx",
+ }
+ assert all(
+ [v.hourEnding for v in r.availableCapacity] == [time(8), time(17)]
+ for r in early
+ )
+ assert all(v.timeZone is None for r in early for v in r.availableCapacity)
+ march = next(
+ r for r in summaries["read_capacities"] if r.reportMonth == date(2024, 3, 1)
+ )
+ assert march.sourceAvailableCapacityLabel is None
+ assert [v.hourEnding for v in march.availableCapacity] == [time(18), time(8)]
+ assert "Late March" in march.availableCapacity[0].sourceScenario
+ assert "Early March" in march.availableCapacity[1].sourceScenario
+
+
+def test_same_hour_scenarios_and_metric_definitions_stay_distinct(summaries):
+ rows = summaries["read_balance"]
+ reserve = next(
+ r
+ for r in rows
+ if r.reportMonth == date(2024, 4, 1) and r.metric == "normal_condition_reserves"
+ )
+ assert [v.hourEnding for v in reserve.values] == [time(20), time(20)]
+ assert [v.valueMW for v in reserve.values] == [
+ Decimal("21097.36730431109"),
+ Decimal("4457.62041931109"),
+ ]
+ assert reserve.values[0].sourceScenario != reserve.values[1].sourceScenario
+ assert set(get_args(MoraBalanceMetric)) == {r.metric for r in rows}
+ assert MoraBalance.model_validate_json(reserve.model_dump_json()) == reserve
+
+
+@pytest.mark.parametrize(
+ ("method", "read_method", "count"),
+ [("capacities", "read_capacities", 41), ("balance", "read_balance", 26)],
+)
+def test_query_and_saved_file_predicates(method, read_method, count):
+ url = "https://www.ercot.com/files/docs/2026/09/03/MORA_November2026.xlsx"
+ with ZipFile(TABLES / "mora-percentiles.zip") as archive:
+ data = archive.read("MORA_November2026.xlsx")
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ if str(request.url) == url:
+ return httpx.Response(200, content=data)
+ assert request.url.path == "/gridinfo/resource"
+ return httpx.Response(
+ 200,
+ text=f'Monthly Outlook for Resource Adequacy (MORA) November 2026 ',
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ live = list(
+ getattr(client.resource_outlook, method)(
+ where=lambda r: r.reportMonth == date(2026, 11, 1)
+ )
+ )
+ saved = list(
+ getattr(client.resource_outlook, read_method)(
+ data,
+ filename="MORA_November2026.xlsx",
+ where=lambda r: r.reportMonth == date(2026, 11, 1),
+ )
+ )
+ assert live == saved and len(live) == count
+
+
+def test_unknown_balance_quantity_is_not_discarded():
+ with ZipFile(TABLES / "mora-percentiles.zip") as archive:
+ book = openpyxl.load_workbook(BytesIO(archive.read("MORA_November2026.xlsx")))
+ book["Monthly Outlook"]["E52"] = "A new load definition"
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with Client() as client, pytest.raises(ValueError, match="Unknown balance metric"):
+ list(client.resource_outlook.read_balance(data.getvalue()))
diff --git a/tests/test_pdf.py b/tests/test_pdf.py
new file mode 100644
index 00000000..a208efc6
--- /dev/null
+++ b/tests/test_pdf.py
@@ -0,0 +1,401 @@
+# Report clocks deliberately preserve the published timezone-naive values.
+# ruff: noqa: DTZ001
+"""Published PDF values independently transcribed from rendered report tables."""
+
+from datetime import date, datetime, time
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import pytest
+from pypdf import PdfReader
+
+from tinyercot import Client
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs/history"
+
+
+def zipped(name, data):
+ output = BytesIO()
+ with ZipFile(output, "w") as archive:
+ archive.writestr(name, data)
+ return output.getvalue()
+
+
+def sample(period):
+ return (INPUTS / f"np4-765-er-{period}.pdf").read_bytes()
+
+
+@pytest.mark.parametrize("period", ["old", "current"])
+def test_daily_values(period):
+ with Client() as client:
+ rows = list(
+ client.np4_765_er.daily_values_history.read(
+ zipped("nested.zip", zipped("report.pdf", sample(period)))
+ )
+ )
+ assert len(rows) == 1
+ row = rows[0]
+ # Published order: installed/total discharge, installed/total charge,
+ # peak load, peak discharge/charge/net, maximum discharge/charge,
+ # discharge/charge at maximum penetration.
+ assert [
+ getattr(row, name)
+ for name in (
+ "installedDischargeCapacityMW",
+ "totalDischargeCapacityMW",
+ "installedChargeCapacityMW",
+ "totalChargeCapacityMW",
+ "peakLoadMW",
+ "dischargeAtPeakLoadMW",
+ "chargeAtPeakLoadMW",
+ "netOutputAtPeakLoadMW",
+ "maxDischargeMW",
+ "maxChargeMW",
+ "dischargeAtMaxPenetrationMW",
+ "chargeAtMaxPenetrationMW",
+ )
+ ] == [
+ Decimal(v)
+ for v in (
+ [5038, 7046, 7024, 7024, 49649, 430, 131, 299, 884, 616, 884, 616]
+ if period == "old"
+ else [
+ 22024,
+ 22536,
+ 21866,
+ 22376,
+ 82270,
+ 283,
+ 210,
+ 73,
+ 10838,
+ 10241,
+ 10838,
+ 10241,
+ ]
+ )
+ ]
+ discharge, charge = ("1.80", "1.36") if period == "old" else ("13.98", "16.35")
+ assert (
+ row.penetrationAtMaxDischargePercent
+ == row.maxDischargePenetrationPercent
+ == Decimal(discharge)
+ )
+ assert (
+ row.penetrationAtMaxChargePercent
+ == row.maxChargePenetrationPercent
+ == Decimal(charge)
+ )
+ assert (
+ row.maxDischargeTime
+ == row.maxDischargePenetrationTime
+ == (time(6, 36) if period == "old" else time(19, 54))
+ )
+ assert (
+ row.maxChargeTime
+ == row.maxChargePenetrationTime
+ == (time(11, 45) if period == "old" else time(9, 24))
+ )
+ assert row.peakLoadHourEnding == (8 if period == "old" else 18)
+ assert row.reportDate == (
+ date(2023, 12, 5) if period == "old" else date(2026, 9, 6)
+ )
+ assert (
+ "seasonal max. reasonability limit"
+ if period == "old"
+ else "seasonal net max. sustainable rating"
+ ) in row.sourceNotes
+ assert "Note that generation" in row.sourceNotes
+
+
+def test_record_tables():
+ data = zipped("report.pdf", sample("current"))
+ with Client() as client:
+ power = list(client.np4_765_er.power_records_history.read(data))
+ penetration = list(client.np4_765_er.penetration_records_history.read(data))
+ soc = list(client.np4_765_er.soc_records_history.read(data))
+ assert [
+ (
+ r.category,
+ r.recordMW,
+ r.recordTime,
+ r.penetrationPercent,
+ r.maxSocPercent,
+ r.minSocPercent,
+ )
+ for r in power
+ ] == [
+ (
+ "ESR Discharge Generation",
+ Decimal(13300),
+ datetime(2026, 8, 23, 19, 45, tzinfo=None),
+ Decimal("15.35"),
+ Decimal("79.61"),
+ Decimal("45.49"),
+ ),
+ (
+ "ESR Charge Load",
+ Decimal(11576),
+ datetime(2026, 8, 30, 9, 29, tzinfo=None),
+ Decimal("18.15"),
+ Decimal("54.66"),
+ Decimal("26.59"),
+ ),
+ (
+ "ESR Injection",
+ Decimal(13268),
+ datetime(2026, 8, 23, 19, 45, tzinfo=None),
+ Decimal("15.31"),
+ Decimal("79.61"),
+ Decimal("45.49"),
+ ),
+ ]
+ # The charge record's MW differs between these two published tables.
+ assert [
+ (
+ r.category,
+ r.recordMW,
+ r.recordTime,
+ r.penetrationPercent,
+ r.maxSocPercent,
+ r.minSocPercent,
+ )
+ for r in penetration
+ ] == [
+ (
+ "ESR Discharge Generation",
+ Decimal(10514),
+ datetime(2026, 3, 13, 19, 31, tzinfo=None),
+ Decimal("20.61"),
+ Decimal("75.87"),
+ Decimal("41.76"),
+ ),
+ (
+ "ESR Charge Load",
+ Decimal(11564),
+ datetime(2026, 8, 30, 9, 29, tzinfo=None),
+ Decimal("18.15"),
+ Decimal("54.66"),
+ Decimal("26.59"),
+ ),
+ ]
+ assert [(r.category, r.recordMWh, r.recordTime) for r in soc] == [
+ (
+ "ESR SOC Hourly Increase",
+ Decimal(9946),
+ datetime(2026, 8, 30, 10, 4, tzinfo=None),
+ ),
+ (
+ "ESR SOC Hourly Decrease",
+ Decimal(12934),
+ datetime(2026, 8, 23, 20, 17, tzinfo=None),
+ ),
+ ]
+ assert all(r.reportDate == date(2026, 9, 6) for r in [*power, *penetration, *soc])
+
+
+def test_older_report_has_no_record_section():
+ with Client() as client:
+ for reader in (
+ client.np4_765_er.power_records_history,
+ client.np4_765_er.penetration_records_history,
+ client.np4_765_er.soc_records_history,
+ ):
+ assert list(reader.read(zipped("report.pdf", sample("old")))) == []
+
+
+@pytest.mark.parametrize(
+ "before,after",
+ [
+ ("Current Daily Values:", "Unknown heading:"),
+ ("Total ESR Discharge Capacity**", "Changed Capacity**"),
+ ("22,024", "unavailable"),
+ ("MW", "kW"),
+ ],
+)
+def test_unrecognized_daily_table_raises(before, after):
+ text = " ".join(
+ PdfReader(BytesIO(sample("current"))).pages[0].extract_text().split()
+ )
+ with Client() as client, pytest.raises(ValueError):
+ list(
+ client.np4_765_er.daily_values_history._read_text(
+ text.replace(before, after)
+ )
+ )
+
+
+def test_malformed_records_are_not_treated_as_absent():
+ text = " ".join(
+ PdfReader(BytesIO(sample("current"))).pages[0].extract_text().split()
+ )
+ with Client() as client, pytest.raises(ValueError, match="headings"):
+ list(
+ client.np4_765_er.power_records_history._read_text(
+ text.replace("Record Max MW Time", "Changed heading")
+ )
+ )
+
+
+def test_missing_pdf_raises():
+ with Client() as client, pytest.raises(ValueError, match="no PDF"):
+ list(client.np4_765_er.daily_values_history.read(zipped("unknown.txt", b"")))
+
+
+def test_hourly_chart_percentages_match_printed_labels():
+ with Client() as client:
+ rows = list(
+ client.np4_765_er.hourly_percentages_history.read(
+ zipped("report.pdf", sample("current"))
+ )
+ )
+ assert [r.hourEnding for r in rows] == [f"{h:02d}" for h in range(1, 25)]
+ assert all(r.reportDate == date(2026, 9, 6) for r in rows)
+ # Transcribed from the rendered charts, including their published rounding.
+ assert [r.dischargeCapacityPercent for r in rows] == [
+ Decimal(x)
+ for x in (
+ [
+ "0.6",
+ "0.2",
+ "0.4",
+ "0.7",
+ "2.5",
+ "5.3",
+ "11.4",
+ "5.5",
+ "0.1",
+ "0.1",
+ "0.1",
+ "0.1",
+ "0.6",
+ "0.3",
+ "0.9",
+ "0.5",
+ "0.3",
+ "1.3",
+ "14.0",
+ "42.9",
+ "40.0",
+ "19.1",
+ "4.2",
+ "1.3",
+ ]
+ )
+ ]
+ assert [r.chargeCapacityPercent for r in rows] == [
+ Decimal(x)
+ for x in (
+ [
+ "1.2",
+ "3.0",
+ "4.4",
+ "1.1",
+ "0.8",
+ "0.8",
+ "0.8",
+ "1.6",
+ "18.6",
+ "44.5",
+ "38.9",
+ "25.0",
+ "15.8",
+ "8.1",
+ "3.7",
+ "2.1",
+ "1.9",
+ "1.0",
+ "0.9",
+ "0.2",
+ "0.6",
+ "0.4",
+ "1.3",
+ "2.1",
+ ]
+ )
+ ]
+ assert {
+ r.hourEnding: r.netLoadPercent for r in rows if r.netLoadPercent is not None
+ } == {
+ "05": Decimal("0.7"),
+ "06": Decimal("1.8"),
+ "07": Decimal("4.2"),
+ "08": Decimal("1.6"),
+ "18": Decimal("0.1"),
+ "19": Decimal("3.6"),
+ "20": Decimal("12.0"),
+ "21": Decimal("11.4"),
+ "22": Decimal("5.6"),
+ "23": Decimal("0.9"),
+ }
+ assert sum(r.netLoadPercent is None for r in rows) == 14
+
+
+@pytest.mark.parametrize("period", ["spring", "fall"])
+def test_chart_hour_axis_preserves_published_dst_labels(period):
+ with Client() as client:
+ rows = list(
+ client.np4_765_er.hourly_percentages_history.read(
+ zipped("outer.zip", zipped("report.pdf", sample(period)))
+ )
+ )
+ expected_hours = [f"{h:02d}" for h in range(1, 25) if period != "spring" or h != 3]
+ assert [r.hourEnding for r in rows] == expected_hours
+ assert all(
+ r.reportDate == (date(2025, 3, 9) if period == "spring" else date(2025, 11, 2))
+ for r in rows
+ )
+ if period == "spring":
+ assert rows[2].hourEnding == "04"
+ assert rows[2].dischargeCapacityPercent == Decimal("0.3")
+ assert rows[2].chargeCapacityPercent == Decimal("6.2")
+ else:
+ assert rows[17].hourEnding == "18"
+ assert rows[17].dischargeCapacityPercent == Decimal("30.8")
+ assert rows[17].chargeCapacityPercent == Decimal("0.5")
+
+
+def test_missing_chart_is_not_silent_partial_data(monkeypatch):
+ from pypdf import PageObject
+
+ original = PageObject.extract_xform_text
+
+ def changed_legend(self, *args, **kwargs):
+ return original(self, *args, **kwargs).replace(
+ "Actual ESR Charging Output", "Unknown series"
+ )
+
+ monkeypatch.setattr(PageObject, "extract_xform_text", changed_legend)
+ with Client() as client, pytest.raises(ValueError, match="Expected one chart"):
+ list(
+ client.np4_765_er.hourly_percentages_history.read(
+ zipped("report.pdf", sample("current"))
+ )
+ )
+
+
+def test_duplicate_chart_label_does_not_overwrite_values(monkeypatch):
+ from pypdf import PageObject
+
+ original = PageObject.extract_xform_text
+
+ def duplicated_label(self, *args, **kwargs):
+ callback = kwargs["visitor_text"]
+
+ def visit(text, *position):
+ callback(text, *position)
+ if text.strip() == "0.6%":
+ callback(text, *position)
+
+ kwargs["visitor_text"] = visit
+ return original(self, *args, **kwargs)
+
+ monkeypatch.setattr(PageObject, "extract_xform_text", duplicated_label)
+ with Client() as client, pytest.raises(ValueError, match="Ambiguous chart label"):
+ list(
+ client.np4_765_er.hourly_percentages_history.read(
+ zipped("report.pdf", sample("current"))
+ )
+ )
diff --git a/tests/test_peak_forecasts.py b/tests/test_peak_forecasts.py
new file mode 100644
index 00000000..a05a9ff4
--- /dev/null
+++ b/tests/test_peak_forecasts.py
@@ -0,0 +1,156 @@
+"""Peak-demand forecasts compared with complete original XLS/XLSX sources."""
+
+import hashlib
+import json
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+import xlrd
+
+from tinyercot import Client, PeakDemandForecast
+
+ROOT = Path(__file__).resolve().parents[1] / "tools/inputs/peak-forecasts"
+SOURCES = json.loads((ROOT / "sources.json").read_text())
+SUMMARY_FIELDS = {
+ "Official Forecast 50/50": "p50MW",
+ "P50": "p50MW",
+ "90th Percentile": "p90MW",
+ "P90": "p90MW",
+ "ercot_90th": "p90MW",
+ "Forecast": "forecastMW",
+ "Contracts": "contractsMW",
+ "Officer Letters": "officerLettersMW",
+ "Total Large Loads": "totalLargeLoadsMW",
+}
+
+
+def original(source):
+ with ZipFile(ROOT / "workbooks.zip") as archive:
+ return archive.read(source["file"])
+
+
+def cells(data):
+ if data.startswith(b"\xd0\xcf"):
+ book = xlrd.open_workbook(file_contents=data)
+ result = {
+ s.name: [s.row_values(i) for i in range(s.nrows)] for s in book.sheets()
+ }
+ book.release_resources()
+ return result
+ book = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ result = {s.title: list(s.values) for s in book}
+ book.close()
+ return result
+
+
+def number(value):
+ return None if value in (None, "") else Decimal(str(value))
+
+
+@pytest.mark.parametrize("source", SOURCES, ids=lambda s: s["file"])
+def test_all_forecast_tables_match_original_source_cells(source):
+ data = original(source)
+ assert hashlib.sha256(data).hexdigest() == source["sha256"]
+ grids = cells(data)
+ with Client() as client:
+ actual = list(client.peak_demand_forecasts.read(data, filename=source["file"]))
+ expected_coordinates = [
+ (table, row)
+ for table in source["tables"]
+ for row in range(table["firstRow"], table["lastRow"] + 1)
+ ]
+ assert len(actual) == len(expected_coordinates)
+ for forecast, (table, line) in zip(actual, expected_coordinates, strict=True):
+ grid = grids[table["sheet"]]
+ row, header = grid[line - 1], grid[table["headerRow"] - 1]
+ title = next(v for v in grid[table["titleRow"] - 1] if v not in (None, ""))
+ assert forecast.forecastYear == int(row[0])
+ assert forecast.sourceTitle == title
+ assert (forecast.sourceMember, forecast.sourceSheet, forecast.sourceRow) == (
+ source["file"],
+ table["sheet"],
+ line,
+ )
+ weather, extras, labels = {}, {}, {}
+ for column, value in enumerate(row[1:], 1):
+ heading = header[column] if column < len(header) else None
+ if heading in (None, ""):
+ if value not in (None, ""):
+ extras[column + 1] = number(value)
+ elif str(heading) in SUMMARY_FIELDS:
+ field = SUMMARY_FIELDS[str(heading)]
+ assert getattr(forecast, field) == number(value)
+ labels[field] = str(heading)
+ else:
+ weather[int(float(heading))] = number(value)
+ assert forecast.weatherYearMW == weather
+ assert forecast.sourceExtraValues == extras
+ assert forecast.sourceSummaryLabels == labels
+ for field in set(SUMMARY_FIELDS.values()) - labels.keys():
+ assert getattr(forecast, field) is None
+ assert (
+ PeakDemandForecast.model_validate_json(forecast.model_dump_json())
+ == forecast
+ )
+
+
+def test_gross_net_pv_and_new_large_load_assumptions_remain_distinct():
+ with Client() as client:
+ source = next(s for s in SOURCES if "/2023/" in s["url"])
+ rows = list(client.peak_demand_forecasts.read(original(source)))
+ assert [r.demandBasis for r in rows] == ["gross"] * 10 + ["net"] * 10 + [
+ "rooftop_pv"
+ ] * 10
+ assert rows[0].forecastYear == 2023 and rows[20].forecastYear == 2022
+ assert len(rows[0].sourceExtraValues) == 15
+ assert rows[0].forecastMW is not None and rows[0].p50MW is None
+ assert rows[20].p90MW is None
+ source = next(s for s in SOURCES if "/2024/" in s["url"])
+ row = next(client.peak_demand_forecasts.read(original(source)))
+ assert row.demandBasis == "net"
+ assert row.contractsMW is not None and row.officerLettersMW is not None
+ assert row.totalLargeLoadsMW is not None and row.p90MW is None
+ assert "15%" in row.sourceNotes[0]
+ source = next(s for s in SOURCES if "/2025/04/" in s["url"])
+ rows = list(client.peak_demand_forecasts.read(original(source)))
+ assert rows[0].sourceSheet == "TSP Provided"
+ assert rows[7].sourceSheet == "ERCOT Adjusted"
+ assert rows[0].p90MW != rows[7].p90MW
+
+
+def test_live_index_shapes_discover_all_vintages_and_rows_keep_file_metadata():
+ calls = []
+ by_url = {s["url"]: s for s in SOURCES}
+ with ZipFile(ROOT / "indexes.zip") as archive:
+ indexes = {n: archive.read(n) for n in archive.namelist()}
+
+ def respond(request):
+ url = str(request.url)
+ calls.append(url)
+ if url in by_url:
+ return httpx.Response(200, content=original(by_url[url]))
+ name = url.rsplit("/", 1)[-1]
+ return httpx.Response(
+ 200, content=indexes[("root" if name == "forecast" else name) + ".html"]
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(respond)) as http,
+ Client(client=http) as client,
+ ):
+ service = client.peak_demand_forecasts
+ assert {f.url for f in service.files()} == set(by_url)
+ calls.clear()
+ rows = list(
+ service.rows(
+ where=lambda r: r.forecastYear == 2025 and r.sourceFile is not None
+ )
+ )
+ assert rows and all(r.sourceFile.url in by_url for r in rows)
+ assert len([u for u in calls if u in by_url]) == len(SOURCES)
+ assert all(u.startswith("https://www.ercot.com/") for u in calls)
diff --git a/tests/test_public_tables.py b/tests/test_public_tables.py
new file mode 100644
index 00000000..a00c5ed2
--- /dev/null
+++ b/tests/test_public_tables.py
@@ -0,0 +1,193 @@
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, CrrTimeOfUse, PolrUsage
+
+FIXTURES = Path(__file__).resolve().parents[1] / "tools/inputs/public-tables"
+
+
+def test_all_original_crr_hours_and_dst_months():
+ data = (FIXTURES / "crr-hours.xlsx").read_bytes()
+ with Client() as client:
+ rows = list(client.crr_hours.read(data, filename="calendar.xlsx"))
+ book = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ try:
+ source = list(book.active.values)[2:]
+ assert len(rows) == len(source) == 48
+ for row, cells in zip(rows, source, strict=True):
+ assert row.month == date(
+ int(cells[0]),
+ (
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December",
+ ).index(cells[1])
+ + 1,
+ 1,
+ )
+ assert (
+ row.offPeakHours,
+ row.peakWDHours,
+ row.peakWEHours,
+ row.totalHours,
+ ) == cells[2:]
+ assert row.sourceMember == "calendar.xlsx"
+ assert row.sourceSheet == book.active.title
+ finally:
+ book.close()
+ by_month = {r.month: r for r in rows}
+ assert by_month[date(2026, 3, 1)].totalHours == 743
+ assert by_month[date(2026, 11, 1)].totalHours == 721
+ assert by_month[date(2028, 2, 1)].totalHours == 696
+ assert CrrTimeOfUse.model_validate_json(rows[0].model_dump_json()) == rows[0]
+
+
+def test_all_original_polr_counts_energy_and_distinct_periods():
+ data = (FIXTURES / "polr.xlsx").read_bytes()
+ with Client() as client:
+ rows = list(client.polr.read(data, filename="retail.xlsx"))
+ book = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ try:
+ source = [
+ cells
+ for cells in book["PUCT_Even_Year"].values
+ if isinstance(cells[2], (int, float))
+ ]
+ notes = [
+ c
+ for cells in book["PUCT_Even_Year_Cover_Page"].values
+ for c in cells
+ if c is not None
+ ]
+ assert len(rows) == len(source) == 24
+ for row, cells in zip(rows, source, strict=True):
+ assert row.territory == cells[0] and row.premiseType == cells[1]
+ assert row.activeEsiids == cells[2]
+ assert row.energyKWh == Decimal(str(cells[3]))
+ assert row.snapshotDate == date(2026, 3, 31)
+ assert row.energyPeriodStart == date(2025, 4, 1)
+ assert row.energyPeriodEnd == date(2026, 3, 31)
+ assert row.sourceNotes == notes
+ assert (
+ row.sourceMember == "retail.xlsx"
+ and row.sourceSheet == "PUCT_Even_Year"
+ )
+ finally:
+ book.close()
+ assert len({r.territory for r in rows}) == 6
+ assert len({r.premiseType for r in rows}) == 4
+ assert rows[0].activeEsiids == 824562
+ assert rows[0].energyKWh == Decimal(10627695505)
+ assert PolrUsage.model_validate_json(rows[0].model_dump_json()) == rows[0]
+
+
+@pytest.mark.parametrize(
+ "service,fixture,title,expected",
+ [
+ ("crr_hours", "crr-hours", "CRR Time of Use Hours", 48),
+ ("polr", "polr", "POLR Counts Energy 2026 Report Final", 24),
+ ],
+)
+def test_live_style_discovery_download_and_saved_file_identity(
+ service, fixture, title, expected
+):
+ url = f"https://www.ercot.com/files/docs/2020/01/01/{fixture}-updated.xlsx"
+ requests = []
+
+ def handler(request):
+ requests.append(str(request.url))
+ assert "authorization" not in request.headers
+ if str(request.url) == url:
+ return httpx.Response(
+ 200, content=(FIXTURES / f"{fixture}.xlsx").read_bytes()
+ )
+ return httpx.Response(200, text=f'{title} ')
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ reader = getattr(client, service)
+ rows = list(reader.rows())
+ assert requests == [reader.index_url, url]
+ assert len(rows) == expected
+ assert all(r.sourceMember == f"{fixture}-updated.xlsx" for r in rows)
+
+
+def test_typed_predicates_filter_source_periods():
+ with Client() as client:
+ months = list(
+ client.crr_hours.read(
+ (FIXTURES / "crr-hours.xlsx").read_bytes(),
+ where=lambda r: date(2027, 1, 1) <= r.month <= date(2027, 12, 1),
+ )
+ )
+ usage = list(
+ client.polr.read(
+ (FIXTURES / "polr.xlsx").read_bytes(),
+ where=lambda r: (
+ r.snapshotDate == date(2026, 3, 31)
+ and r.premiseType == "Residential"
+ ),
+ )
+ )
+ assert len(months) == 12
+ assert len(usage) == 6
+
+
+def test_overlapping_archives_keep_separate_members():
+ data = BytesIO()
+ with ZipFile(data, "w") as z:
+ for name in ("original.xlsx", "revised.xlsx"):
+ z.writestr(name, (FIXTURES / "polr.xlsx").read_bytes())
+ with Client() as client:
+ rows = list(client.polr.read(data.getvalue()))
+ assert len(rows) == 48
+ assert {r.sourceMember for r in rows} == {"original.xlsx", "revised.xlsx"}
+
+
+def test_polr_periods_come_from_headers_and_notes_survive_sheet_reordering():
+ book = openpyxl.load_workbook(FIXTURES / "polr.xlsx")
+ sheet = book["PUCT_Even_Year"]
+ for row in sheet:
+ if row[0].value == "POLR Territory":
+ row[2].value = "# Active ESIIDs Total (3/31/2024)"
+ row[3].value = "Annual kWh (4/1/2023 - 3/31/2024)"
+ book.move_sheet(sheet, offset=-1)
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with Client() as client:
+ rows = list(client.polr.read(data.getvalue(), filename="2026.xlsx"))
+ assert all(r.snapshotDate == date(2024, 3, 31) for r in rows)
+ assert all(r.energyPeriodStart == date(2023, 4, 1) for r in rows)
+ assert all(r.energyPeriodEnd == date(2024, 3, 31) for r in rows)
+ assert all(len(r.sourceNotes) == 6 for r in rows)
+
+
+def test_unknown_layout_does_not_silently_return_no_data():
+ data = BytesIO()
+ book = openpyxl.Workbook()
+ book.active.append(["Unrecognized columns"])
+ book.save(data)
+ book.close()
+ with Client() as client:
+ for reader in (client.crr_hours, client.polr):
+ with pytest.raises(ValueError, match="changed.xlsx/Sheet"):
+ list(reader.read(data.getvalue(), filename="changed.xlsx"))
diff --git a/tests/test_publications.py b/tests/test_publications.py
new file mode 100644
index 00000000..34c0725a
--- /dev/null
+++ b/tests/test_publications.py
@@ -0,0 +1,175 @@
+"""Keep archive publication identity with lazily decoded market rows."""
+
+import json
+from datetime import date, datetime
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+
+from tinyercot import Client, Publication
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs/history"
+
+
+def zipped(name, data):
+ out = BytesIO()
+ with ZipFile(out, "w") as z:
+ z.writestr(name, data)
+ return out.getvalue()
+
+
+def test_publications_are_lazy_and_keep_identity_when_consumed_out_of_order():
+ downloads = []
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ if request.method == "POST":
+ downloads.extend(json.loads(request.content)["docIds"])
+ return httpx.Response(
+ 200,
+ content=zipped(
+ "forecast.csv",
+ (INPUTS / "np3-561-cd-history-samples.csv").read_bytes(),
+ ),
+ )
+ assert request.url.params["postDatetimeFrom"] == "2014-05-01T00:00:00"
+ page = int(request.url.params["page"])
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": page, "totalPages": 2},
+ "product": {
+ "emilId": "NP3-561-CD",
+ "name": "Forecast",
+ "reportTypeId": 1,
+ },
+ "archives": [
+ {
+ "docId": page,
+ "friendlyName": "forecast",
+ "postDatetime": f"2014-05-01T0{page}:01:23",
+ }
+ ],
+ },
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ reports = list(
+ client.np3_561_cd._7d_load_fcast_by_wzn_history.publications(
+ posted_from=datetime(2014, 5, 1, tzinfo=None) # noqa: DTZ001
+ )
+ )
+ assert len(reports) == 2 and not downloads
+ assert all(isinstance(p, Publication) and p.kind == "archive" for p in reports)
+ second = list(reports[1].rows)
+ first = list(reports[0].rows)
+ assert downloads == [2, 1]
+ assert reports[0].document.docId == 1 and reports[1].document.docId == 2
+ assert reports[0].document.postDatetime != reports[1].document.postDatetime
+ assert first == second and first # identical rows retain distinct publications
+ assert all(
+ r.postedDatetime is None for r in first
+ ) # no invented embedded timestamp
+
+
+@pytest.mark.parametrize(
+ "product,method,fixture,extension,count",
+ [
+ ("np4_190_cd", "dam_stlmnt_pnt_prices_history", "np4-190-cd.csv", "csv", 3),
+ ("np1_346_er", "outages_history", "np1-346-er-history-samples.xlsx", "xlsx", 3),
+ ("np4_765_er", "daily_values_history", "np4-765-er-old.pdf", "pdf", 1),
+ ],
+)
+def test_bundle_metadata_stays_distinct_and_all_reader_formats_work(
+ product, method, fixture, extension, count
+):
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ assert "/bundle/" in request.url.path
+ if request.method == "POST":
+ assert json.loads(request.content)["docIds"] == [-1]
+ return httpx.Response(
+ 200,
+ content=zipped(
+ "inner.zip",
+ zipped("report." + extension, (INPUTS / fixture).read_bytes()),
+ ),
+ )
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": 1, "totalPages": 1},
+ "product": {"emilId": product, "name": "Report", "reportTypeId": 1},
+ "bundles": [
+ {
+ "docId": -1,
+ "friendlyName": "monthly",
+ "postDatetime": "2026-08-31T23:59:59",
+ }
+ ],
+ },
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ report = next(
+ getattr(getattr(client, product), method).publications(kind="bundle")
+ )
+ rows = list(report.rows)
+ assert report.kind == "bundle" and report.document.postDatetime.date() == date(
+ 2026, 8, 31
+ )
+ assert len(rows) == count
+ if extension == "csv":
+ assert rows[0].deliveryDate == date(2014, 5, 2)
+
+
+def test_correction_publications_filter_before_download():
+ names = [
+ "pricecorrection_DAM_SPP_other",
+ "pricecorrection_DAM_EBLMP_first",
+ "PRICECORRECTION_DAM_EBLMP_SECOND",
+ ]
+
+ def handler(request):
+ if "b2clogin" in request.url.host:
+ return httpx.Response(200, json={"id_token": "test", "expires_in": 3600})
+ assert request.method == "GET" # listing alone must not fetch any payload
+ return httpx.Response(
+ 200,
+ json={
+ "_meta": {"currentPage": 1, "totalPages": 1},
+ "product": {
+ "emilId": "NP4-196-M",
+ "name": "Corrections",
+ "reportTypeId": 1,
+ },
+ "archives": [
+ {
+ "docId": i,
+ "friendlyName": name,
+ "postDatetime": "2025-12-08T22:41:53",
+ }
+ for i, name in enumerate(names)
+ ],
+ },
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client("u", "p", "k", client=http) as client,
+ ):
+ reports = list(
+ client.np4_196_m.dam_price_corrections_eblmp_history.publications()
+ )
+ assert [r.document.docId for r in reports] == [1, 2]
diff --git a/tests/test_retail_transactions.py b/tests/test_retail_transactions.py
new file mode 100644
index 00000000..def08f83
--- /dev/null
+++ b/tests/test_retail_transactions.py
@@ -0,0 +1,170 @@
+from collections import Counter
+from datetime import date
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, RetailTransactionMonth
+
+FIXTURE = (
+ Path(__file__).resolve().parents[1]
+ / "tools/inputs/public-tables/retail-transactions.zip"
+)
+ARCHIVE_URL = "https://www.ercot.com/files/docs/2025/01/02/August-2026-Retail-Monthly-Transaction-Totals.zip"
+
+
+@pytest.fixture(scope="module")
+def retail_rows():
+ with Client() as client:
+ return list(client.retail_transactions.read(FIXTURE.read_bytes()))
+
+
+def test_all_original_fixture_cells_dates_and_source_labels(retail_rows):
+ actual = iter(retail_rows)
+ with ZipFile(FIXTURE) as archive:
+ assert len(archive.namelist()) == 5
+ for member in archive.namelist():
+ book = openpyxl.load_workbook(
+ BytesIO(archive.read(member)), read_only=True, data_only=True
+ )
+ try:
+ for sheet in book:
+ sheet.reset_dimensions()
+ source = sheet.values
+ header = next(source)
+ dates = []
+ for value in header[1:-2]:
+ month, day, year = map(int, value.split("/"))
+ dates.append(date(year, month, day))
+ for cells in source:
+ if all(v in (None, "") for v in cells):
+ continue
+ row = next(actual)
+ assert (
+ row.sourceMember == member
+ and row.sourceSheet == sheet.title
+ )
+ assert row.month == dates[0].replace(day=1)
+ assert row.transactionCode == (
+ None if cells[0] == "Grand Total" else cells[0]
+ )
+ assert len(row.days) == len(dates)
+ for value, day, original in zip(
+ row.days, dates, cells[1:-2], strict=True
+ ):
+ assert value.operatingDay == day and value.count == int(
+ original
+ )
+ assert row.reportedTotal == int(cells[-2])
+ assert row.reportedAveragePerDay == Decimal(cells[-1])
+ finally:
+ book.close()
+ assert next(actual, None) is None
+ assert len({r.transactionCode for r in retail_rows} - {None}) == 30
+ assert (
+ RetailTransactionMonth.model_validate_json(retail_rows[0].model_dump_json())
+ == retail_rows[0]
+ )
+
+
+def test_unnamed_categories_and_totals_remain_distinct(retail_rows):
+ unknown = [r for r in retail_rows if r.sourceSheet.startswith(" ")]
+ assert len(unknown) == 8
+ assert {r.sourceSheet for r in unknown} == {" Inbound", " Outbound"}
+ assert {r.month for r in unknown} == {date(2025, 4, 1), date(2026, 1, 1)}
+ assert sum(r.transactionCode is None for r in unknown) == 4
+ by_source = Counter(
+ (r.sourceMember, r.sourceSheet)
+ for r in retail_rows
+ if r.transactionCode is None
+ )
+ assert len(by_source) == 114 and set(by_source.values()) == {1}
+
+
+def test_source_averages_are_not_recomputed_and_month_lengths_are_retained(retail_rows):
+ rounded = [
+ r
+ for r in retail_rows
+ if r.reportedAveragePerDay * len(r.days) != r.reportedTotal
+ ]
+ assert rounded
+ assert all(
+ r.reportedAveragePerDay == r.reportedAveragePerDay.to_integral_value()
+ for r in retail_rows
+ )
+ assert {len(r.days) for r in retail_rows} == {28, 30, 31}
+ # Categories overlap; each sheet's published total remains its own record.
+ assert {"ERCOT Inbound", "Residential Inbound", "ONCOR to ERCOT"} <= {
+ r.sourceSheet for r in retail_rows
+ }
+
+
+def test_current_archive_discovery_can_query_earlier_months():
+ requested = []
+
+ def handler(request):
+ requested.append(str(request.url))
+ assert "authorization" not in request.headers
+ if str(request.url) == ARCHIVE_URL:
+ return httpx.Response(200, content=FIXTURE.read_bytes())
+ return httpx.Response(
+ 200, text=f'Retail Monthly Transaction Totals '
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.retail_transactions.rows(
+ where=lambda r: (
+ r.month == date(2025, 1, 1)
+ and r.sourceSheet == "ERCOT Inbound"
+ and r.transactionCode is None
+ ),
+ )
+ )
+ assert len(rows) == 1
+ assert [d.operatingDay for d in rows[0].days] == [
+ date(2025, 1, d) for d in range(1, 32)
+ ]
+ assert requested == ["https://www.ercot.com/mktinfo/retail", ARCHIVE_URL]
+
+
+def test_saved_file_filter_preserves_transaction_codes(retail_rows):
+ with ZipFile(FIXTURE) as z:
+ member = next(
+ n for n in z.namelist() if n.endswith("1_2025 Monthly Retail Totals.xlsx")
+ )
+ data = z.read(member)
+ with Client() as client:
+ rows = list(
+ client.retail_transactions.read(
+ data,
+ filename="saved.xlsx",
+ where=lambda r: r.transactionCode == "814_06_MVI",
+ )
+ )
+ expected = [
+ r
+ for r in retail_rows
+ if r.sourceMember == member and r.transactionCode == "814_06_MVI"
+ ]
+ assert rows and len(rows) == len(expected)
+ assert all(r.sourceMember == "saved.xlsx" for r in rows)
+ assert [r.reportedTotal for r in rows] == [r.reportedTotal for r in expected]
+
+
+def test_unknown_summary_header_fails_instead_of_losing_a_column():
+ book = openpyxl.Workbook()
+ book.active.append(["", "1/1/2026", "Grand Total", "Renamed Average"])
+ data = BytesIO()
+ book.save(data)
+ book.close()
+ with Client() as client, pytest.raises(ValueError, match="changed.xlsx/Sheet"):
+ list(client.retail_transactions.read(data.getvalue(), filename="changed.xlsx"))
diff --git a/tests/test_seasonal_tables.py b/tests/test_seasonal_tables.py
new file mode 100644
index 00000000..1f849de8
--- /dev/null
+++ b/tests/test_seasonal_tables.py
@@ -0,0 +1,263 @@
+import csv
+from collections import Counter
+from datetime import date
+from decimal import Decimal
+from io import BytesIO, StringIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+import xlrd
+
+from tinyercot import Client, LoadShedShare, PublicFile, TransmissionLossCoefficient
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs"
+MANIFEST = list(
+ csv.DictReader(
+ StringIO((INPUTS / "public-seasonal-tables-sources.csv").read_text())
+ )
+)
+
+
+@pytest.fixture(scope="module")
+def coefficients():
+ with Client() as client:
+ return list(
+ client.transmission_loss_coefficients.read(
+ (
+ INPUTS / "public-tables/transmission-loss-coefficients.zip"
+ ).read_bytes()
+ )
+ )
+
+
+def test_every_original_coefficient_and_input_cell(coefficients):
+ with ZipFile(INPUTS / "public-tables/transmission-loss-coefficients.zip") as z:
+ for filename in z.namelist():
+ data = z.read(filename)
+ if filename.endswith(".xls"):
+ with xlrd.open_workbook(file_contents=data) as book:
+ sources = {
+ s.name: [s.row_values(i) for i in range(s.nrows)]
+ for s in book.sheets()
+ }
+ else:
+ book = openpyxl.load_workbook(
+ BytesIO(data), read_only=True, data_only=True
+ )
+ sources = {s.title: list(s.values) for s in book}
+ book.close()
+ expected = {}
+ for sheet, rows in sources.items():
+ if len(rows) < 49:
+ continue
+ for row in (43, 45, 47, 49):
+ for column, header in enumerate(rows[41]):
+ if header != "SSC":
+ continue
+ area = rows[40][column].split()[0]
+ basis = next(
+ i
+ for i, name in enumerate(rows[28])
+ if isinstance(name, str) and name.startswith(area + " ")
+ )
+ expected[(sheet, row, area)] = (
+ rows[row - 1][column : column + 2]
+ + rows[row - 13][basis : basis + 4]
+ )
+ actual = [r for r in coefficients if r.sourceMember == filename]
+ assert len(actual) == len(expected)
+ for r in actual:
+ values = expected.pop((r.sourceSheet, r.sourceRow, r.area))
+ assert [
+ r.slopePercentPerMW,
+ r.interceptPercent,
+ r.onPeakLoadMW,
+ r.offPeakLoadMW,
+ r.onPeakLossFactor,
+ r.offPeakLossFactor,
+ ] == [None if v in (None, "") else Decimal(str(v)) for v in values]
+ rows = sources[r.sourceSheet]
+ assert r.sourceInputRow == r.sourceRow - 12
+ assert r.sourceHeading == rows[0][0]
+ assert r.sourceFile is None
+ assert not expected
+ assert len(coefficients) == 948
+ assert {r.year for r in coefficients} == set(range(2001, 2027))
+
+
+def test_original_periods_missing_values_and_shifted_area_columns(coefficients):
+ lookup = {(r.year, r.season, r.area): r for r in coefficients}
+ shifted = lookup[2002, "spring", "COCS"]
+ assert shifted.onPeakLoadMW == Decimal("101.9")
+ assert shifted.offPeakLoadMW == Decimal("86.5")
+ assert shifted.slopePercentPerMW == Decimal("0.0003661768367650714")
+ assert shifted.interceptPercent == Decimal("0.060725796019913715")
+ assert shifted.asOf == date(2002, 2, 21)
+ assert "Version 3" in shifted.sourceHeading
+ assert {r.area for r in coefficients if r.year == 2002} >= {
+ "PUB",
+ "Rayburn",
+ "TEXLA",
+ }
+ blank = lookup[2021, "spring", "LPL"]
+ assert blank.onPeakLoadMW is None and blank.onPeakLossFactor is None
+ assert blank.slopePercentPerMW is None and blank.interceptPercent is None
+ assert blank.effectiveFrom == date(2021, 3, 1)
+ assert all(
+ r.effectiveFrom is None and r.sourceEffectivePeriod is None
+ for r in coefficients
+ if r.year < 2011
+ )
+ for year, label in [
+ (2020, "12/01/2021 - 02/28/2021"),
+ (2026, "12/01/2027 - 02/28/2027"),
+ ]:
+ winter = lookup[year, "winter", "ERCOT"]
+ assert winter.sourceEffectivePeriod == label
+ assert winter.effectiveFrom is None and winter.effectiveThrough is None
+ assert lookup[2011, "summer", "ERCOT"].effectiveThrough == date(2011, 8, 31)
+ assert lookup[2012, "summer", "ERCOT"].effectiveThrough == date(2012, 9, 30)
+ assert lookup[2023, "winter", "ERCOT"].effectiveThrough == date(2024, 2, 29)
+ assert (
+ lookup[2026, "spring", "ERCOT"].sourceArea
+ != lookup[2026, "spring", "ERCOT"].sourceInputArea
+ )
+ assert Counter(r.effectiveFrom is None for r in coefficients) == {
+ True: 367,
+ False: 581,
+ }
+ assert (
+ TransmissionLossCoefficient.model_validate_json(shifted.model_dump_json())
+ == shifted
+ )
+ assert (
+ TransmissionLossCoefficient.model_validate_json(blank.model_dump_json())
+ == blank
+ )
+
+
+def test_actual_annual_index_links_and_typed_coefficient_query():
+ with ZipFile(INPUTS / "loss-factors/indexes.zip") as z:
+ pages = {n.removesuffix(".html"): z.read(n) for n in z.namelist()}
+ with ZipFile(INPUTS / "public-tables/transmission-loss-coefficients.zip") as z:
+ files = {
+ f["url"]: z.read(f["file"]) for f in MANIFEST if f["kind"] == "coefficients"
+ }
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ url = str(request.url)
+ requested.append(url)
+ return httpx.Response(
+ 200,
+ content=files[url]
+ if url in files
+ else pages[request.url.path.rsplit("/", 1)[-1]],
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ discovered = client.transmission_loss_coefficients.files()
+ assert {(f.title, f.url) for f in discovered} == {
+ (f["title"], f["url"]) for f in MANIFEST if f["kind"] == "coefficients"
+ }
+ requested.clear()
+ rows = list(
+ client.transmission_loss_coefficients.rows(
+ where=lambda r: r.year == 2026 and r.area == "ERCOT"
+ )
+ )
+ assert len(rows) == 4
+ assert all(
+ isinstance(r.sourceFile, PublicFile)
+ and r.sourceFile.url.endswith("2026_Transmission_Loss_Factors_Final.xlsx")
+ for r in rows
+ )
+ assert len(requested) == 26 + 26
+
+
+def test_saved_coefficient_revisions_remain_separate():
+ with ZipFile(INPUTS / "public-tables/transmission-loss-coefficients.zip") as z:
+ data = z.read("2026_Transmission_Loss_Factors_Final.xlsx")
+ bundle = BytesIO()
+ with ZipFile(bundle, "w") as z:
+ z.writestr("original.xlsx", data)
+ z.writestr("revision.xlsx", data)
+ with Client() as client:
+ rows = list(
+ client.transmission_loss_coefficients.read(
+ bundle.getvalue(), where=lambda r: r.season == "winter"
+ )
+ )
+ assert len(rows) == 20
+ assert {r.sourceMember for r in rows} == {"original.xlsx", "revision.xlsx"}
+
+
+def test_all_original_operator_shares_and_effective_notes():
+ with ZipFile(INPUTS / "public-tables/load-shed.zip") as z, Client() as client:
+ for filename in z.namelist():
+ data = z.read(filename)
+ actual = list(client.load_shed.read(data, filename=filename))
+ book = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ source = list(book.active.values)
+ expected = source[1:22]
+ notes = [
+ r[0]
+ for r in source
+ if isinstance(r[0], str) and r[0].startswith(("*", "Note:"))
+ ]
+ book.close()
+ assert len(actual) == 21
+ for r, cells in zip(actual, expected, strict=True):
+ assert r.transmissionOperator == cells[0]
+ assert r.loadSharePercent == Decimal(str(cells[1]))
+ assert r.sourceHeader == source[0][1] and r.sourceNotes == notes
+ assert r.sourceMember == filename
+ assert r.effectiveFrom == (
+ date(2026, 4, 1) if r.season == "summer" else date(2026, 9, 1)
+ )
+ assert (
+ LoadShedShare.model_validate_json(actual[0].model_dump_json())
+ == actual[0]
+ )
+
+
+def test_anonymous_load_share_discovery_and_typed_filter():
+ with ZipFile(INPUTS / "public-tables/load-shed.zip") as z:
+ sources = {
+ f["url"]: z.read(f["file"]) for f in MANIFEST if f["kind"] == "loadShares"
+ }
+ html = "".join(
+ f'{f["title"]} '
+ for f in MANIFEST
+ if f["kind"] == "loadShares"
+ )
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ return (
+ httpx.Response(200, content=sources[str(request.url)])
+ if str(request.url) in sources
+ else httpx.Response(200, text=html)
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.load_shed.rows(
+ where=lambda r: (
+ r.season == "winter"
+ and r.transmissionOperator.startswith("CenterPoint")
+ )
+ )
+ )
+ assert len(rows) == 1 and rows[0].loadSharePercent == Decimal("20.08")
+ assert rows[0].effectiveFrom == date(2026, 9, 1)
diff --git a/tests/test_weather.py b/tests/test_weather.py
new file mode 100644
index 00000000..8fb8e9cb
--- /dev/null
+++ b/tests/test_weather.py
@@ -0,0 +1,139 @@
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from typing import get_args
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+
+from tinyercot import Client, WeatherDay, WeatherVariable, WeatherZone
+from tinyercot._weather import URL
+
+FIXTURE = Path(__file__).resolve().parents[1] / "tools/inputs/weather/historical.zip"
+
+
+@pytest.fixture(scope="module")
+def weather():
+ with Client() as client:
+ return list(client.historical_weather.read(FIXTURE.read_bytes()))
+
+
+def test_all_zones_and_variables_have_typed_hourly_values(weather):
+ assert len(weather) == 192
+ assert {r.weatherZone for r in weather} == set(get_args(WeatherZone))
+ assert {r.variable for r in weather} == set(get_args(WeatherVariable))
+ assert all([h.hour for h in r.hours] == list(range(1, 25)) for r in weather)
+ assert WeatherDay.model_validate_json(weather[0].model_dump_json()) == weather[0]
+
+
+def test_source_values_and_unknown_units_are_preserved(weather):
+ rows = {
+ r.variable: r
+ for r in weather
+ if r.weatherZone == "COAST" and r.operatingDay == date(1996, 1, 1)
+ }
+ assert rows["CLOUDCOVER"].hours[0].value == Decimal(10)
+ assert rows["WINDSPEED"].hours[0].value == Decimal("1.5")
+ assert rows["DEWPOINT"].hours[0].value == Decimal("58.2")
+ assert rows["DRYBULB TEMP"].hours[0].value == Decimal("58.7")
+ assert all(r.sourceUnit is None for r in weather)
+ assert all(
+ any("weighting scheme" in note for note in r.sourceNotes) for r in weather
+ )
+
+
+def test_source_dates_extend_beyond_filename_and_keep_leap_and_dst_days(weather):
+ days = {r.operatingDay for r in weather}
+ assert min(days) == date(1996, 1, 1) and max(days) == date(2001, 1, 10)
+ assert {date(1996, 2, 29), date(1996, 4, 7), date(1996, 10, 27)} <= days
+ assert all(len(r.hours) == 24 for r in weather)
+
+
+def test_anonymous_query_uses_actual_dates_and_typed_filters():
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(200, content=FIXTURE.read_bytes())
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.historical_weather.rows(
+ date_from=date(2001, 1, 10),
+ date_to=date(2001, 1, 10),
+ weather_zone="COAST",
+ variable="CLOUDCOVER",
+ )
+ )
+ assert len(rows) == 1 and rows[0].operatingDay == date(2001, 1, 10)
+ assert rows[0].hours[2].value == Decimal("9.4")
+ assert requested == [URL]
+
+
+def test_saved_workbook_uses_original_zone_filename():
+ with ZipFile(FIXTURE) as z:
+ name = "Weather '96-'00 North Central.xls"
+ data = z.read(name)
+ with Client() as client:
+ rows = list(
+ client.historical_weather.read(data, filename=name, variable="DEWPOINT")
+ )
+ assert len(rows) == 6 and all(r.weatherZone == "NCENT" for r in rows)
+ with pytest.raises(ValueError, match="Cannot identify source weather zone"):
+ list(client.historical_weather.read(data))
+
+
+@pytest.mark.parametrize(
+ "filters",
+ [
+ {"date_from": date(2000, 1, 2), "date_to": date(2000, 1, 1)},
+ {"weather_zone": "MISSING"},
+ {"variable": "MISSING"},
+ ],
+)
+def test_invalid_query_filters_fail_before_download(filters):
+ def handler(request):
+ pytest.fail("Invalid query should not download the archive")
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ pytest.raises(ValueError),
+ ):
+ list(client.historical_weather.rows(**filters))
+
+
+@pytest.mark.parametrize("valid_header", [True, False])
+def test_missing_value_and_unknown_header(valid_header):
+ book = openpyxl.Workbook()
+ sheet = book.active
+ sheet.title = "WINDSPEED"
+ sheet.append([None] + [f"Hour {i}" for i in range(1, 25)])
+ sheet.append([datetime.fromisoformat("1996-01-01T00:00:00"), None] + [0] * 23)
+ if not valid_header:
+ sheet.cell(1, 25).value = "New column"
+ buf = BytesIO()
+ book.save(buf)
+ book.close()
+ with Client() as client:
+ if valid_header:
+ row = next(
+ client.historical_weather.read(
+ buf.getvalue(), filename="Weather '96-'00 East.xlsx"
+ )
+ )
+ assert row.hours[0].value is None and row.hours[1].value == Decimal(0)
+ else:
+ with pytest.raises(ValueError, match="Missing hourly weather columns"):
+ list(
+ client.historical_weather.read(
+ buf.getvalue(), filename="Weather '96-'00 East.xlsx"
+ )
+ )
diff --git a/tests/test_workbooks.py b/tests/test_workbooks.py
new file mode 100644
index 00000000..286541d4
--- /dev/null
+++ b/tests/test_workbooks.py
@@ -0,0 +1,293 @@
+# XLSX timestamps are deliberately timezone-naive, as published.
+# ruff: noqa: DTZ001
+import json
+from collections import Counter
+from datetime import date, datetime, time
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import pytest
+from openpyxl import load_workbook
+
+from tinyercot import Client
+
+INPUTS = Path(__file__).resolve().parents[1] / "tools/inputs/history"
+
+
+def zipped(name, data):
+ output = BytesIO()
+ with ZipFile(output, "w") as archive:
+ archive.writestr(name, data)
+ return output.getvalue()
+
+
+@pytest.mark.parametrize("period", ["samples", "current"])
+def test_workbook_schema_generations(period):
+ def read(reader, product):
+ return list(
+ reader.read(
+ zipped(
+ "report.xlsx",
+ (INPUTS / f"{product}-history-{period}.xlsx").read_bytes(),
+ )
+ )
+ )
+
+ with Client() as client:
+ outages = read(client.np1_346_er.outages_history, "np1-346-er")
+ assert len(outages) == 3
+ row = outages[0]
+ if period == "samples":
+ assert row.returnToServiceDate == datetime(
+ 2022, 12, 30, 23, 59, tzinfo=None
+ )
+ assert row.plannedEndDate is None
+ assert row.availableMWMaximum == Decimal(18)
+ else:
+ assert row.returnToServiceDate is None
+ assert row.plannedEndDate == datetime(2026, 9, 15, 23, 59, tzinfo=None)
+ assert row.actualEndDate is None
+ demand = read(client.np3_108.demand_response_history, "np3-108")
+ assert Counter(r.sourceSheet for r in demand) == (
+ {"Report Data": 3}
+ if period == "samples"
+ else {"CLR Report Data": 3, "NCLR Report Data": 3}
+ )
+ assert demand[0].month == (
+ date(2017, 12, 1) if period == "samples" else date(2026, 8, 1)
+ )
+ factors = read(client.np5_520_er.deployment_factors_history, "np5-520-er")
+ assert len(factors) == 3
+ assert factors[0].minimum == (
+ Decimal("0.038") if period == "samples" else Decimal("0.05")
+ )
+
+
+def test_bad_dimensions_and_report_footers():
+ book = load_workbook(INPUTS / "np3-108-history-samples.xlsx")
+ sheet = book["Report Data"]
+ sheet.append(["ERCOT Confidential"])
+ sheet.append(["Jan 4, 2018 - 2 - 8:00:25 AM"])
+ sheet.append([datetime(2018, 1, 4, tzinfo=None), None, 2, None, time(8, 0, 25)])
+ output = BytesIO()
+ book.save(output)
+ # The original December 2017 workbook declares A1 although its table is larger.
+ modified = BytesIO()
+ import re
+
+ with ZipFile(output) as original, ZipFile(modified, "w") as archive:
+ for name in original.namelist():
+ data = original.read(name)
+ if name.startswith("xl/worksheets/"):
+ data = re.sub(rb'= start + len(record.intervals)
+ )
+ }
+ assert {
+ j: v for j, v in mapped.items() if v is not None
+ } == expected
+ stamp_cols = [
+ j
+ for j in range(start + len(record.intervals), len(raw))
+ if sheet.cell_type(i, j) == xlrd.XL_CELL_DATE
+ ]
+ assert record.sourceTimestamp == (
+ xlrd.xldate_as_datetime(raw[stamp_cols[0]], book.datemode)
+ if stamp_cols
+ else None
+ )
+ for h, actual in [
+ ("RECORDER", record.recorder),
+ ("CUTNAME", record.recorder),
+ ("CHANNEL", record.channel),
+ ]:
+ if h in names:
+ assert actual == raw[names.index(h)]
+ counts["days"] += 1
+ if "2005_generation" in file["member"]:
+ gaps.setdefault(record.zone, set()).add(day)
+ if i == 1 or record.sourceNumbers:
+ assert (
+ ZonalEnergyDay.model_validate_json(
+ record.model_dump_json()
+ )
+ == record
+ )
+ assert next(records, None) is None
+ assert counts == {"days": 13886, "intervals": 1361260, "sourceNumbers": 1170}
+ missing = {date(2005, 6, 22) + timedelta(days=i) for i in range(37)}
+ calendar = {date(2005, 1, 1) + timedelta(days=i) for i in range(365)}
+ assert len(gaps) == 5
+ assert all(calendar - days == missing for days in gaps.values())
+
+
+def test_original_cached_totals_shares_and_undated_interval_aggregate():
+ counts = Counter()
+ generation_2001 = []
+ with ZipFile(FIXTURE) as archive, Client() as client:
+ for file in MANIFEST:
+ data = archive.read(file["member"])
+ with xlrd.open_workbook(file_contents=data) as book:
+ for record in client.zonal_energy.read_totals(
+ data, filename=file["member"]
+ ):
+ sheet = book.sheet_by_name(record.sourceSheet)
+ raw = sheet.row_values(record.sourceRow - 1)
+ header = next(
+ sheet.row_values(i)
+ for i in range(sheet.nrows)
+ if any(v != "" for v in sheet.row_values(i))
+ )
+ if record.scope == "summary":
+ assert record.totalMWh == number(raw[1])
+ assert record.share == number(raw[2])
+ assert record.sourceLabel == raw[0]
+ assert record.sourceTotalHeader == header[1]
+ assert record.sourceShareHeader == header[2]
+ counts["summary"] += 1
+ else:
+ start = next(
+ i
+ for i, v in enumerate(header)
+ if isinstance(v, float) or str(v).startswith("Interval ")
+ )
+ if record.sourceSheet == "W03":
+ assert record.totalMWh is None
+ assert record.sourceNumbers[0].value == number(raw[3])
+ assert record.sourceNumbers[0].sourceHeader == "ORIGIN"
+ else:
+ assert record.totalMWh == number(raw[start - 1])
+ if record.intervals:
+ assert record.sourceLabel == "Grand"
+ assert record.totalMWh is None
+ assert [r.energyMWh for r in record.intervals] == [
+ number(v) for v in raw[start:]
+ ]
+ counts["aggregateIntervals"] += len(record.intervals)
+ counts["detail"] += 1
+ assert (
+ ZonalEnergyTotal.model_validate_json(record.model_dump_json())
+ == record
+ )
+ if "2001_generation" in file["member"]:
+ generation_2001.append(record)
+ assert counts == {"summary": 52, "detail": 36, "aggregateIntervals": 96}
+ summary = next(r for r in generation_2001 if r.sourceLabel == "TOTAL ")
+ detail = next(r for r in generation_2001 if r.scope == "detail_total")
+ assert summary.totalMWh == Decimal("115512611.682897")
+ assert detail.totalMWh == Decimal("115512613.08008096")
+ assert summary.totalMWh != detail.totalMWh
+
+
+def test_actual_discovery_anonymous_queries_and_saved_kind():
+ with ZipFile(INPUTS / "loss-factors/indexes.zip") as z:
+ pages = {n.removesuffix(".html"): z.read(n) for n in z.namelist()}
+ with ZipFile(FIXTURE) as z:
+ files = {f["url"]: z.read(f["member"]) for f in MANIFEST}
+ requested = []
+
+ def handler(request):
+ assert "authorization" not in request.headers
+ requested.append(str(request.url))
+ return httpx.Response(
+ 200,
+ content=files[str(request.url)]
+ if str(request.url) in files
+ else pages[request.url.path.rsplit("/", 1)[-1]],
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ assert {(f.url, f.title) for f in client.zonal_energy.files()} == {
+ (f["url"], f["title"]) for f in MANIFEST
+ }
+ requested.clear()
+ rows = list(
+ client.zonal_energy.rows(
+ date_from=date(2001, 7, 31),
+ date_to=date(2001, 7, 31),
+ where=lambda r: r.zone == "N01",
+ )
+ )
+ assert len(rows) == 1 and rows[0].kind == "generation"
+ assert isinstance(rows[0].sourceFile, PublicFile)
+ assert len(requested) == 36
+ data = next(v for url, v in files.items() if "2001_load" in url)
+ named = next(client.zonal_energy.read(data, kind="load"))
+ assert named.operatingDay == date(2001, 8, 1)
+ with pytest.raises(ValueError, match="Supply kind"):
+ next(client.zonal_energy.read(data))
+ assert (
+ len(
+ list(
+ client.zonal_energy.read_totals(
+ data, kind="load", where=lambda r: r.scope == "summary"
+ )
+ )
+ )
+ == 4
+ )
diff --git a/tests/test_zonal_generation.py b/tests/test_zonal_generation.py
new file mode 100644
index 00000000..23351f10
--- /dev/null
+++ b/tests/test_zonal_generation.py
@@ -0,0 +1,93 @@
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from itertools import islice
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import pytest
+
+from tinyercot import Client, ScheduledGeneration
+from tinyercot._zonal_generation import URL
+
+FIXTURE = (
+ Path(__file__).resolve().parents[1]
+ / "tools/inputs/history/scheduled-zonal-generation.zip"
+)
+
+
+def year_zip(year):
+ with ZipFile(FIXTURE) as archive:
+ return archive.read(f"{year}.zip")
+
+
+@pytest.mark.parametrize(
+ "year,count",
+ [
+ (2001, 44064),
+ (2002, 140144),
+ (2003, 140144),
+ (2004, 175660),
+ (2005, 175180),
+ (2006, 175180),
+ (2007, 38768),
+ ],
+)
+def test_original_annual_counts(year, count):
+ with Client() as client:
+ assert sum(1 for _ in client.zonal_generation.read(year_zip(year))) == count
+
+
+def test_outer_zip_and_source_types():
+ with Client() as client:
+ first = list(islice(client.zonal_generation.read(FIXTURE.read_bytes()), 2))
+ assert all(isinstance(r, ScheduledGeneration) for r in first)
+ assert [(r.zoneId, r.scheduledMW) for r in first] == [
+ (240, Decimal(6187)),
+ (242, Decimal(12501)),
+ ]
+ assert first[0].periodEnding == datetime.fromisoformat("2007-01-01T00:15:00")
+ assert first[0].periodEnding.tzinfo is None and first[0].sourceMember == "2007.txt"
+
+
+def test_anonymous_query_includes_midnight_on_the_operating_day():
+ requests = []
+
+ def handler(request):
+ assert str(request.url) == URL
+ assert "authorization" not in request.headers
+ requests.append(request)
+ return httpx.Response(200, content=year_zip(2007))
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(handler)) as http,
+ Client(client=http) as client,
+ ):
+ rows = list(
+ client.zonal_generation.rows(
+ date_from=date(2007, 4, 11), date_to=date(2007, 4, 11)
+ )
+ )
+ assert len(requests) == 1 and len(rows) == 384
+ assert all(r.operatingDay == date(2007, 4, 11) for r in rows)
+ assert rows[-1].periodEnding == datetime.fromisoformat("2007-04-12T00:00:00")
+ assert rows[-1].scheduledMW == 1843
+
+
+def test_missing_source_day_is_not_filled():
+ with Client() as client:
+ dates = {r.operatingDay for r in client.zonal_generation.read(year_zip(2001))}
+ assert date(2001, 8, 8) in dates and date(2001, 8, 10) in dates
+ assert date(2001, 8, 9) not in dates
+
+
+def test_plain_text_retains_repeated_period_and_zone_rows():
+ with ZipFile(BytesIO(year_zip(2001))) as archive:
+ header, first = archive.read("2001.txt").splitlines()[:2]
+ data = b"\n".join([header, first, first])
+ with Client() as client:
+ rows = list(client.zonal_generation.read(data, filename="saved.txt"))
+ assert len(rows) == 2 and rows[0] == rows[1]
+ assert rows[0].zoneId == 24 and rows[0].scheduledMW == 3490
+ assert rows[0].sourceMember == "saved.txt"
diff --git a/tests/test_zonal_peaks.py b/tests/test_zonal_peaks.py
new file mode 100644
index 00000000..1a52681f
--- /dev/null
+++ b/tests/test_zonal_peaks.py
@@ -0,0 +1,201 @@
+"""All seasonal/weekly peak tables checked against original source positions."""
+
+# Source dates have no time zone; only their calendar dates are read.
+# ruff: noqa: DTZ007
+
+import hashlib
+import json
+from datetime import datetime
+from decimal import Decimal
+from io import BytesIO
+from pathlib import Path
+from zipfile import ZipFile
+
+import httpx
+import openpyxl
+import pytest
+import xlrd
+
+from tinyercot import Client, SeasonalPeakForecast, WeeklyPeakForecast
+
+ROOT = Path(__file__).resolve().parents[1] / "tools/inputs/zonal-peaks"
+SOURCES = json.loads((ROOT / "sources.json").read_text())
+ZONE_FIELDS = {
+ "coast": "coast",
+ "east": "east",
+ "fwest": "farWest",
+ "ncent": "northCentral",
+ "north": "north",
+ "scent": "southCentral",
+ "south": "south",
+ "west": "west",
+}
+
+
+def original(source):
+ with ZipFile(ROOT / "workbooks.zip") as archive:
+ return archive.read(source["file"])
+
+
+def grids(data):
+ if data.startswith(b"\xd0\xcf"):
+ book = xlrd.open_workbook(file_contents=data)
+ result = {
+ s.name: [s.row_values(i) for i in range(s.nrows)] for s in book.sheets()
+ }
+ book.release_resources()
+ return result
+ book = openpyxl.load_workbook(BytesIO(data), read_only=True, data_only=True)
+ result = {s.title: list(s.values) for s in book}
+ book.close()
+ return result
+
+
+def number(v):
+ return None if v in (None, "") else Decimal(str(v))
+
+
+def day(v):
+ # The original weekly inputs use Excel dates or DDMonYYYY strings.
+ return (
+ v.date() if isinstance(v, datetime) else datetime.strptime(v, "%d%b%Y").date()
+ )
+
+
+@pytest.mark.parametrize("source", SOURCES, ids=lambda s: s["file"])
+def test_complete_source_tables(source):
+ data = original(source)
+ assert hashlib.sha256(data).hexdigest() == source["sha256"]
+ source_grids = grids(data)
+ with Client() as client:
+ service = (
+ client.weekly_peak_forecasts
+ if source["kind"] == "weekly"
+ else client.seasonal_peak_forecasts
+ )
+ rows = list(service.read(data, filename=source["file"]))
+ coordinates = []
+ for table in source["tables"]:
+ for line in range(table["firstRow"], table["lastRow"] + 1):
+ coordinates.append(
+ (
+ list(source_grids).index(table["sheet"]),
+ line,
+ table.get("column", 1),
+ table,
+ )
+ )
+ coordinates.sort(key=lambda c: c[:3])
+ assert len(rows) == len(coordinates)
+ for actual, (_, line, column, table) in zip(rows, coordinates, strict=True):
+ grid = source_grids[table["sheet"]]
+ raw, header = grid[line - 1], grid[table["headerRow"] - 1]
+ assert (actual.sourceMember, actual.sourceSheet, actual.sourceRow) == (
+ source["file"],
+ table["sheet"],
+ line,
+ )
+ if isinstance(actual, WeeklyPeakForecast):
+ assert (actual.beginDate, actual.endDate, actual.peakDate) == tuple(
+ day(v) for v in raw[:3]
+ )
+ assert actual.peakHour == raw[3]
+ assert actual.kind == "forecast" and actual.percentile is None
+ assert actual.unit is None
+ start = 4
+ else:
+ assert isinstance(actual, SeasonalPeakForecast)
+ period = str(raw[column - 1]).removesuffix(".0")
+ assert actual.sourcePeriod == period
+ assert actual.year == int(period.split("-")[0])
+ assert actual.endYear == (
+ int(period.split("-")[1]) if "-" in period else None
+ )
+ assert actual.kind == table["kind"]
+ assert actual.sourceTitle == table["title"]
+ assert actual.sourceColumn == column
+ assert actual.sourcePercentileLabel == table["percentileLabel"]
+ assert actual.percentile == (90 if table["percentileLabel"] else None)
+ assert actual.unit == ("MW" if "(MW)" in table["title"] else None)
+ start = column
+ for i in range(8):
+ field = ZONE_FIELDS[header[start + i].lower()]
+ assert getattr(actual.peaks, field) == number(raw[start + i])
+ assert actual.peaks.total == number(raw[start + 8])
+ assert actual.sourceTotalLabel == header[start + 8]
+ assert type(actual).model_validate_json(actual.model_dump_json()) == actual
+
+
+def test_historical_headers_and_percentiles_do_not_override_section_kind():
+ source = next(s for s in SOURCES if "06252014" in s["url"])
+ with Client() as client:
+ rows = list(client.seasonal_peak_forecasts.read(original(source)))
+ assert all(r.kind == "forecast" and r.percentile == 90 for r in rows[:16])
+ assert all(r.kind == "historical" and r.percentile is None for r in rows[16:])
+ assert all(r.unit == "MW" and r.coincident is False for r in rows[16:])
+ assert rows[16].year == 2002
+ assert rows[16].sourceTitle == "Summer Non-Coincident Peak Demand (MW)"
+
+
+def test_winter_periods_and_parallel_forecasts_keep_independent_values():
+ source = next(s for s in SOURCES if "Summer-and-Winter" in s["url"])
+ with Client() as client:
+ rows = list(client.seasonal_peak_forecasts.read(original(source)))
+ assert len(rows) == 56
+ assert {r.scenario for r in rows} == {"tsp_provided", "ercot_adjusted"}
+ assert {r.season for r in rows} == {"summer", "winter"}
+ assert {r.coincident for r in rows} == {False, True}
+ assert all(r.demandBasis == "net" for r in rows)
+ assert rows[0].sourceColumn == 1 and rows[1].sourceColumn == 16
+ assert rows[0].peaks.coast != rows[1].peaks.coast
+ winter = [r for r in rows if r.season == "winter"]
+ assert all(r.endYear == r.year + 1 for r in winter)
+ assert winter[0].sourcePeriod == "2025-2026"
+
+
+@pytest.mark.parametrize("kind", ["seasonal", "weekly"])
+def test_discovery_enriches_percentiles_before_filtering_without_changing_history(kind):
+ sources = {s["url"]: s for s in SOURCES if s["kind"] == kind}
+ with ZipFile(ROOT.parent / "peak-forecasts/indexes.zip") as archive:
+ indexes = {n: archive.read(n) for n in archive.namelist()}
+ calls = []
+
+ def respond(request):
+ url = str(request.url)
+ calls.append(url)
+ if url in sources:
+ return httpx.Response(200, content=original(sources[url]))
+ name = url.rsplit("/", 1)[-1]
+ return httpx.Response(
+ 200, content=indexes[("root" if name == "forecast" else name) + ".html"]
+ )
+
+ with (
+ httpx.Client(transport=httpx.MockTransport(respond)) as http,
+ Client(client=http) as client,
+ ):
+ service = (
+ client.weekly_peak_forecasts
+ if kind == "weekly"
+ else client.seasonal_peak_forecasts
+ )
+ assert {f.url for f in service.files()} == set(sources)
+ all_rows = list(service.rows())
+ assert all(r.sourceFile.url in sources for r in all_rows)
+ assert all(r.percentile is None for r in all_rows if r.kind == "historical")
+ selected = list(service.rows(where=lambda r: r.percentile == 90))
+ assert selected and all(r.kind == "forecast" for r in selected)
+ if kind == "weekly":
+ assert len(selected) == 263
+ else:
+ missing_body_label = [
+ r
+ for r in selected
+ if "/2022/" in r.sourceFile.url and "90th_" in r.sourceFile.url
+ ]
+ assert len(missing_body_label) == 30
+ assert all(
+ r.sourcePercentileLabel == r.sourceFile.title
+ for r in missing_body_label
+ )
+ assert all(u.startswith("https://www.ercot.com/") for u in calls)
diff --git a/tests/typing_client.py b/tests/typing_client.py
index 31de86c4..a87cc855 100644
--- a/tests/typing_client.py
+++ b/tests/typing_client.py
@@ -1,9 +1,305 @@
from collections.abc import AsyncIterator, Iterator
-from datetime import date
+from datetime import date, datetime, time
from decimal import Decimal
-from typing import assert_type
+from typing import Literal, assert_type
-from tinyercot import Client, Page, np4_190_cd
+from tinyercot import (
+ Archive,
+ CapacityProject,
+ CapacityTotals,
+ Client,
+ CoincidentPeakAllocation,
+ CoincidentPeakDay,
+ CrrTimeOfUse,
+ DistributionLossCoefficient,
+ Document,
+ EnergyInterval,
+ FuelMixArchive,
+ FuelMixDay,
+ FuelMixTotal,
+ GenerationProfileHour,
+ GenerationProfileKey,
+ GenerationProfileKeySite,
+ GenerationProfileKeySummary,
+ GenerationProfileSite,
+ HourlyLoadForecast,
+ HourlyLoadScenario,
+ IndicativeOrdcPrice,
+ LegacyHourlyLoad,
+ LoadArchive,
+ LoadProfileAdjustment,
+ LoadProfileCount,
+ LoadProfileDay,
+ LoadShedShare,
+ LossFactorDay,
+ MonthlyCoincidentPeak,
+ MonthlyLoadForecast,
+ MoraBalance,
+ MoraBalanceMetric,
+ MoraCapacity,
+ MoraPercentile,
+ MoraResource,
+ MoraRiskPoint,
+ MoraScenarioValue,
+ Page,
+ PeakDemandForecast,
+ PolrUsage,
+ Publication,
+ PublicFile,
+ RetailTransactionMonth,
+ ScheduledGeneration,
+ SeasonalPeakForecast,
+ TransmissionLossCoefficient,
+ WeatherDay,
+ WeatherVariable,
+ WeatherZone,
+ WeatherZoneForecastValues,
+ WeatherZoneLoad,
+ WeatherZonePeakValues,
+ WeeklyPeakForecast,
+ ZonalEnergyDay,
+ ZonalEnergyTotal,
+ ZonalSourceNumber,
+ np3_561_cd,
+ np3_966_er,
+ np3_988_er,
+ np4_190_cd,
+)
+
+with Client() as client:
+ assert_type(
+ client.resource_outlook.risk_points(where=lambda r: r.event == "EEA"),
+ Iterator[MoraRiskPoint],
+ )
+ assert_type(client.resource_outlook.read_risk_points(b""), Iterator[MoraRiskPoint])
+ mora_risk_point = next(client.resource_outlook.risk_points())
+ assert_type(mora_risk_point.probability, Decimal)
+ assert_type(mora_risk_point.bessAvailabilityMW, Decimal | None)
+ assert_type(mora_risk_point.chartHourEnding, time | None)
+ assert_type(mora_risk_point.sourceFile, PublicFile | None)
+
+with Client() as client:
+ assert_type(client.zonal_energy.files(), list[PublicFile])
+ assert_type(
+ client.zonal_energy.rows(where=lambda r: r.kind == "load"),
+ Iterator[ZonalEnergyDay],
+ )
+ assert_type(
+ client.zonal_energy.read(b"", kind="generation"), Iterator[ZonalEnergyDay]
+ )
+ assert_type(
+ client.zonal_energy.totals(where=lambda r: r.year == 2005),
+ Iterator[ZonalEnergyTotal],
+ )
+ assert_type(
+ client.zonal_energy.read_totals(b"", kind="load"), Iterator[ZonalEnergyTotal]
+ )
+ zonal_day = next(client.zonal_energy.rows())
+ assert_type(zonal_day.sourceNumbers, list[ZonalSourceNumber])
+ assert_type(zonal_day.intervals[0].sourceLabel, str | None)
+ assert_type(zonal_day.totalMWh, Decimal | None)
+ assert_type(zonal_day.sourceTimestamp, datetime | None)
+
+with Client() as client:
+ assert_type(client.distribution_loss_coefficients.files(), list[PublicFile])
+ assert_type(
+ client.distribution_loss_coefficients.read(b""),
+ Iterator[DistributionLossCoefficient],
+ )
+ assert_type(
+ client.distribution_loss_coefficients.rows(where=lambda r: r.year == 2026),
+ Iterator[DistributionLossCoefficient],
+ )
+ distribution_coefficient = next(client.distribution_loss_coefficients.rows())
+ assert_type(distribution_coefficient.f1, Decimal | None)
+ assert_type(distribution_coefficient.kFactor, Decimal | None)
+ assert_type(distribution_coefficient.baselineFrom, date | None)
+ assert_type(distribution_coefficient.sourceFile, PublicFile | None)
+
+with Client() as client:
+ assert_type(client.transmission_loss_coefficients.files(), list[PublicFile])
+ assert_type(
+ client.transmission_loss_coefficients.read(b""),
+ Iterator[TransmissionLossCoefficient],
+ )
+ assert_type(
+ client.transmission_loss_coefficients.rows(
+ where=lambda r: r.year == 2026 and r.area == "ERCOT"
+ ),
+ Iterator[TransmissionLossCoefficient],
+ )
+ coefficient = next(client.transmission_loss_coefficients.rows())
+ assert_type(coefficient.slopePercentPerMW, Decimal | None)
+ assert_type(coefficient.onPeakLossFactor, Decimal | None)
+ assert_type(coefficient.effectiveFrom, date | None)
+ assert_type(coefficient.sourceEffectivePeriod, str | None)
+ assert_type(coefficient.sourceFile, PublicFile | None)
+ assert_type(client.load_shed.files(), list[PublicFile])
+ assert_type(client.load_shed.read(b""), Iterator[LoadShedShare])
+ assert_type(
+ client.load_shed.rows(where=lambda r: r.season == "winter"),
+ Iterator[LoadShedShare],
+ )
+ operator_share = next(client.load_shed.rows())
+ assert_type(operator_share.effectiveFrom, date)
+ assert_type(operator_share.loadSharePercent, Decimal | None)
+
+with Client() as client:
+ assert_type(client.capacity_changes.files(), list[PublicFile])
+ assert_type(
+ client.capacity_changes.projects(where=lambda r: r.fuel == "Battery"),
+ Iterator[CapacityProject],
+ )
+ assert_type(client.capacity_changes.read_projects(b""), Iterator[CapacityProject])
+ assert_type(client.capacity_changes.totals(), Iterator[CapacityTotals])
+ assert_type(client.capacity_changes.read_totals(b""), Iterator[CapacityTotals])
+ capacity_project = next(client.capacity_changes.projects())
+ assert_type(capacity_project.projectedCOD, date)
+ assert_type(capacity_project.interconnectionAgreementSigned, date | str | None)
+ assert_type(capacity_project.sourceFile, PublicFile | None)
+ capacity_total = next(client.capacity_changes.totals())
+ assert_type(capacity_total.period, int | date)
+ assert_type(capacity_total.cumulativeOperationalMW, Decimal | None)
+
+with Client() as client:
+ assert_type(client.resource_outlook.files(), list[PublicFile])
+ assert_type(client.resource_outlook.read_percentiles(b""), Iterator[MoraPercentile])
+ assert_type(
+ client.resource_outlook.percentiles(
+ where=lambda r: r.metric == "wind_generation"
+ ),
+ Iterator[MoraPercentile],
+ )
+ mora_percentile = next(client.resource_outlook.percentiles())
+ assert_type(mora_percentile.reportMonth, date)
+ assert_type(mora_percentile.percentile, Decimal)
+ assert_type(mora_percentile.hour, int | None)
+ assert_type(mora_percentile.value, Decimal | None)
+ assert_type(client.resource_outlook.read_resources(b""), Iterator[MoraResource])
+ assert_type(
+ client.resource_outlook.resources(where=lambda r: r.kind == "unit"),
+ Iterator[MoraResource],
+ )
+ mora_resource = next(client.resource_outlook.resources())
+ assert_type(mora_resource.category, str | None)
+ assert_type(mora_resource.inService, int | date | str | None)
+ assert_type(mora_resource.installedCapacityMW, Decimal | None)
+ assert_type(mora_resource.reportedCapacityMW, Decimal | None)
+ assert_type(client.resource_outlook.capacities(), Iterator[MoraCapacity])
+ assert_type(client.resource_outlook.read_capacities(b""), Iterator[MoraCapacity])
+ mora_capacity = next(client.resource_outlook.capacities())
+ assert_type(mora_capacity.resourcePath, list[str])
+ assert_type(mora_capacity.availableCapacity, list[MoraScenarioValue])
+ assert_type(mora_capacity.availableCapacity[0].hourEnding, time)
+ assert_type(mora_capacity.availableCapacity[0].valueMW, Decimal | None)
+ assert_type(client.resource_outlook.balance(), Iterator[MoraBalance])
+ assert_type(client.resource_outlook.read_balance(b""), Iterator[MoraBalance])
+ mora_balance = next(client.resource_outlook.balance())
+ assert_type(mora_balance.metric, MoraBalanceMetric)
+ assert_type(mora_balance.values, list[MoraScenarioValue])
+
+with Client() as client:
+ assert_type(client.indicative_ordc.files(), list[PublicFile])
+ assert_type(client.indicative_ordc.read(b""), Iterator[IndicativeOrdcPrice])
+ assert_type(
+ client.indicative_ordc.rows(where=lambda r: r.repeatedHourFlag == "Y"),
+ Iterator[IndicativeOrdcPrice],
+ )
+ indicative_price = next(client.indicative_ordc.rows())
+ assert_type(indicative_price.scedTimestamp, datetime)
+ assert_type(indicative_price.sourceTimestamp, str)
+ assert_type(indicative_price.rtorpa, Decimal | None)
+
+with Client() as client:
+ assert_type(client.retail_transactions.files(), list[PublicFile])
+ assert_type(client.retail_transactions.read(b""), Iterator[RetailTransactionMonth])
+ assert_type(
+ client.retail_transactions.rows(where=lambda r: r.month.year == 2025),
+ Iterator[RetailTransactionMonth],
+ )
+ retail_month = next(client.retail_transactions.rows())
+ assert_type(retail_month.month, date)
+ assert_type(retail_month.transactionCode, str | None)
+ assert_type(retail_month.days[0].count, int | None)
+ assert_type(retail_month.reportedTotal, int | None)
+ assert_type(retail_month.reportedAveragePerDay, Decimal | None)
+
+with Client() as client:
+ assert_type(client.crr_hours.files(), list[PublicFile])
+ assert_type(client.crr_hours.download(PublicFile(title="", url="")), bytes)
+ assert_type(client.crr_hours.read(b""), Iterator[CrrTimeOfUse])
+ assert_type(
+ client.crr_hours.rows(where=lambda r: r.month.year == 2026),
+ Iterator[CrrTimeOfUse],
+ )
+ crr_month = next(client.crr_hours.rows())
+ assert_type(crr_month.month, date)
+ assert_type(crr_month.peakWDHours, int)
+ assert_type(client.polr.files(), list[PublicFile])
+ assert_type(client.polr.read(b""), Iterator[PolrUsage])
+ assert_type(
+ client.polr.rows(where=lambda r: r.premiseType == "Residential"),
+ Iterator[PolrUsage],
+ )
+ polr_usage = next(client.polr.rows())
+ assert_type(polr_usage.snapshotDate, date)
+ assert_type(polr_usage.energyPeriodStart, date)
+ assert_type(polr_usage.activeEsiids, int)
+ assert_type(polr_usage.energyKWh, Decimal | None)
+
+with Client() as client:
+ assert_type(client.loss_factors.archives(), list[LoadArchive])
+ assert_type(client.loss_factors.read(b""), Iterator[LossFactorDay])
+ assert_type(
+ client.loss_factors.rows(where=lambda r: r.kind == "actual"),
+ Iterator[LossFactorDay],
+ )
+ loss_day = next(client.loss_factors.rows())
+ assert_type(loss_day.operatingDay, date)
+ assert_type(loss_day.sourceStartTime, datetime)
+ assert_type(loss_day.sourceLastTime, datetime)
+ assert_type(loss_day.tdsp, str | None)
+ assert_type(loss_day.intervals[0].factor, Decimal | None)
+ assert_type(loss_day.intervals[0].sourceLabel, str | None)
+ assert_type(loss_day.kind, Literal["actual", "forecast"] | None)
+ assert_type(loss_day.recorder, str | None)
+ assert_type(loss_day.sourceFile, LoadArchive | None)
+ assert_type(loss_day.sourceSecondaryIdentifier, str | int | None)
+ assert_type(loss_day.sourceMarker, str | None)
+ assert_type(
+ client.loss_factors.read(
+ b"", source_file=LoadArchive(year=2001, title="", url="")
+ ),
+ Iterator[LossFactorDay],
+ )
+
+with Client() as client:
+ assert_type(client.historical_weather.download(), bytes)
+ assert_type(
+ client.historical_weather.rows(weather_zone="COAST", variable="DRYBULB TEMP"),
+ Iterator[WeatherDay],
+ )
+ assert_type(client.historical_weather.read(b""), Iterator[WeatherDay])
+ weather_day = next(client.historical_weather.rows())
+ assert_type(weather_day.operatingDay, date)
+ assert_type(weather_day.weatherZone, WeatherZone)
+ assert_type(weather_day.variable, WeatherVariable)
+ assert_type(weather_day.hours[0].value, Decimal | None)
+ assert_type(weather_day.sourceUnit, str | None)
+
+with Client() as client:
+ assert_type(
+ client.zonal_generation.rows(date_from=date(2001, 7, 31)),
+ Iterator[ScheduledGeneration],
+ )
+ assert_type(client.zonal_generation.read(b""), Iterator[ScheduledGeneration])
+ assert_type(client.zonal_generation.download(), bytes)
+
+with Client() as client:
+ assert_type(client.fuel_mix.archives(), list[FuelMixArchive])
+ assert_type(client.fuel_mix.rows(date_from=date(2007, 1, 1)), Iterator[FuelMixDay])
+ assert_type(client.fuel_mix.summaries(year_from=2007), Iterator[FuelMixTotal])
+ assert_type(client.fuel_mix.read(b""), Iterator[FuelMixDay])
with Client() as client:
result = client.np4_190_cd.dam_stlmnt_pnt_prices(deliveryDateFrom=date(2026, 1, 1))
@@ -17,3 +313,645 @@
client.np4_190_cd.dam_stlmnt_pnt_prices_iter_async(),
AsyncIterator[np4_190_cd.DamStlmntPntPricesRow],
)
+
+ assert_type(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history,
+ Archive[np4_190_cd.DamStlmntPntPricesRow],
+ )
+ assert_type(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.rows(
+ where=lambda row: row.settlementPoint == "HB_HOUSTON"
+ ),
+ Iterator[np4_190_cd.DamStlmntPntPricesRow],
+ )
+
+ assert_type(
+ client.np3_966_er._60_dam_load_res_data_history,
+ Archive[np3_966_er._60DamLoadResDataHistoryRow],
+ )
+
+ assert_type(
+ client.np3_988_er.resources_history,
+ Archive[np3_988_er.ResourcesHistoryRow],
+ )
+
+ for row in client.eia_930_er.daily_operations_history.read(b""):
+ assert_type(row.HR1, Decimal | datetime | None)
+
+ for outage in client.np1_346_er.outages_history.rows():
+ assert_type(outage.plannedEndDate, datetime | None)
+ assert_type(outage.availableMWMaximum, Decimal | None)
+ for response in client.np3_108.demand_response_history.rows():
+ assert_type(response.month, date | None)
+ assert_type(response.sourceSheet, str | None)
+
+ for solar in client.np4_737_cd.spp_hrly_avrg_actl_fcast_history.rows():
+ assert_type(solar.hourEndingTimestamp, datetime | None)
+ assert_type(solar.genSystemWide, Decimal | None)
+ for wind in client.np4_733_cd.wpp_actual_5min_avg_values_history.rows():
+ assert_type(wind.LZWestNorth, Decimal | None)
+
+ for price in client.np6_322_cd.sced_system_lambda_history.rows():
+ assert_type(price.systemLambda, Decimal | None)
+ assert_type(price.cappedSystemLambda, Decimal | None)
+ for adder in client.np6_323_cd.rt_price_adder_sced_history.rows():
+ assert_type(adder.RTORPA, Decimal | None)
+ assert_type(adder.RTRDPA, Decimal | None)
+
+ for forecast in client.np3_561_cd._7d_load_fcast_by_wzn_history.rows():
+ assert_type(forecast.hourEnding, str | None)
+ assert_type(forecast.coast, Decimal | None)
+ assert_type(forecast.postedDatetime, datetime | None)
+ for interval in client.np3_562_cd.ih_load_fcast_by_wzn_history.rows():
+ assert_type(interval.intervalEnding, datetime | None)
+ assert_type(interval.inUseFlag, bool | None)
+
+ for capacity in client.np3_233_cd.hourly_res_outage_cap_history.rows():
+ assert_type(capacity.totalResourceMW, int | None)
+ for adequacy in client.np3_763_cd.st_sys_adequacy_history.rows():
+ assert_type(adequacy.hourEnding, str | None)
+ for ruc in client.np3_764_cd.hrly_ruc_online_sced_offline_cop_history.rows():
+ assert_type(ruc.sumSCEDTotal, Decimal | None)
+
+ for offers in client.np4_179_cd.total_as_service_offers_history.rows():
+ assert_type(offers.RRS, Decimal | None)
+ assert_type(offers.RRSPFR, Decimal | None)
+ for cap in client.np4_791_cd.da_sw_offer_caps_history.rows():
+ assert_type(cap.SWCAP, Decimal | None)
+
+ for renewable in client.np4_442_cd.hrly_sys_reg_wind_fcast_model_history.rows():
+ assert_type(renewable.region, str | None)
+ assert_type(renewable.model, str | None)
+ assert_type(renewable.inUseFlag, bool | None)
+ for solar_interval in client.np4_752_cd.ih_solar_fcast_geo_history.rows():
+ assert_type(solar_interval.intervalEnding, datetime | None)
+ assert_type(solar_interval.value, Decimal | None)
+
+ for factor in client.np5_527_cd.druc_as_deploy_factors_history.rows():
+ assert_type(factor.RUCTimestamp, datetime | None)
+ assert_type(factor.deliveryDate, date | None)
+ assert_type(factor.deliveryHour, str | None)
+ assert_type(factor.ASDeploymentFactors, Decimal | None)
+
+ for point in client.np4_214_cd.druc_as_demand_curves_history.rows():
+ assert_type(point.RUCTimestamp, datetime | None)
+ assert_type(point.demandCurvePoint, Decimal | None)
+ assert_type(point.quantity, Decimal | None)
+ assert_type(point.price, Decimal | None)
+
+ for indicative in client.np6_329_cd.rtd_ind_mcpc_history.rows():
+ assert_type(indicative.RTDTimestamp, datetime | None)
+ assert_type(indicative.intervalEnding, datetime | None)
+ assert_type(indicative.intervalRepeatHourFlag, bool | None)
+ for clearing in client.np6_332_cd.rt_clear_price_cap_sced_history.rows():
+ assert_type(clearing.cappedMCPC, Decimal | None)
+ assert_type(clearing.uncappedMCPC, Decimal | None)
+
+ for constraint in client.np5_755_cd.hrly_ruc_act_and_bind_tran_const_history.rows():
+ assert_type(constraint.RUCTimestamp, datetime | None)
+ assert_type(constraint.constraintID, int | None)
+ assert_type(constraint.fromStationkV, Decimal | None)
+ for lmp in client.np6_970_cd.rtd_lmp_node_zone_hub_history.rows():
+ assert_type(lmp.RTDTimestamp, datetime | None)
+ assert_type(lmp.intervalEnding, datetime | None)
+ assert_type(lmp.LMP, Decimal | None)
+
+ for distribution in client.np4_159_cd.load_distribution_factors_history.rows():
+ assert_type(distribution.loadId, str | None)
+ assert_type(distribution.MRIDLoad, str | None)
+ assert_type(distribution.distributionFactor, Decimal | None)
+ for bus in client.np4_231_cd.electrical_bus_map_heur_price_history.rows():
+ assert_type(bus.fromEBName, str | None)
+ assert_type(bus.toEBName, str | None)
+
+ for correction in client.np4_197_m.rtm_price_corrections_soglmp_history.rows():
+ assert_type(correction.RTORDPAOriginal, Decimal | None)
+ assert_type(correction.RTRDPAOriginal, Decimal | None)
+ for bus_correction in client.np4_196_m.dam_price_corrections_eblmp_history.rows():
+ assert_type(bus_correction.electricalBus, str | None)
+ assert_type(bus_correction.LMPCorrected, Decimal | None)
+
+ for sog_price in client.np6_327_cd.lmp_sog_price_adders_history.rows():
+ assert_type(sog_price.meterName, str | None)
+ assert_type(sog_price.RTORPA, Decimal | None)
+ assert_type(sog_price.RTORDPA, Decimal | None)
+ assert_type(sog_price.RTRDPA, Decimal | None)
+ for assumption in client.np4_722_cd.weather_assumptions_history.rows():
+ assert_type(assumption.deliveryDate, date | None)
+ assert_type(assumption.coast, Decimal | None)
+
+ for offer_point in client.np4_19_cd.dam_agg_as_offer_curve_history.rows():
+ assert_type(offer_point.ancillaryType, str | None)
+ assert_type(offer_point.price, Decimal | None)
+ assert_type(offer_point.quantity, Decimal | None)
+
+ for (
+ highest_bid
+ ) in client.np3_257_ex._3d_high_price_bids_sel_disp_sced_history.rows():
+ assert_type(highest_bid.batchId, str | None)
+ assert_type(highest_bid.highestPriceDispatched, Decimal | None)
+ for highest_as in client.np3_914_ex._3d_sced_high_as_offers_history.rows():
+ assert_type(highest_as.resourceName, str | None)
+ assert_type(highest_as.price, Decimal | None)
+ for highest_dam in client.np3_915_ex._3d_dam_high_as_offers_history.rows():
+ assert_type(highest_dam.deliveryDate, date | None)
+ assert_type(highest_dam.qseName, str | None)
+ for highest_sced in client.np3_916_ex._3d_highest_price_offer_sced_history.rows():
+ assert_type(highest_sced.batchId, str | None)
+ assert_type(highest_sced.LMP, Decimal | None)
+
+ for sced_curve in client.np3_906_ex._2day_agg_sced_as_offers_regdn_history.rows():
+ assert_type(sced_curve.SCEDTimestamp, datetime | None)
+ assert_type(sced_curve.MWOffered, Decimal | None)
+ assert_type(sced_curve.REGDNOfferPrice, Decimal | None)
+ for dam_curve in client.np3_907_ex._2d_agg_edc_north_history.rows():
+ assert_type(dam_curve.deliveryDate, date | None)
+ assert_type(dam_curve.MW, Decimal | None)
+ assert_type(dam_curve.price, Decimal | None)
+
+ for ptp_bid in client.np3_909_er._2d_ptp_obl_bids_history.rows():
+ assert_type(ptp_bid.bidId, str | None)
+ assert_type(ptp_bid.PTPBidAwardMW, Decimal | None)
+ for gen_summary in client.np3_910_er._2d_agg_gen_summary_history.rows():
+ assert_type(gen_summary.sumBasePointNonWGR, Decimal | None)
+ assert_type(gen_summary.sumBasePointNonIRR, Decimal | None)
+
+ for legacy_curve in client.np3_908_er._2d_agg_esc_non_wind_history.rows():
+ assert_type(legacy_curve.MW, Decimal | None)
+ assert_type(legacy_curve.price, Decimal | None)
+ for demand_curve in client.np3_908_er._2d_agg_edc_clr_history.rows():
+ assert_type(demand_curve.price, int | None)
+ assert_type(demand_curve.SCEDTimestamp, datetime | None)
+ for old_dam_curve in client.np3_908_er._2d_agg_dam_min_esc_history.rows():
+ assert_type(old_dam_curve.deliveryDate, date | None)
+ assert_type(old_dam_curve.MW, Decimal | None)
+
+ for legacy_rrs in client.np3_911_er._2d_cleared_dam_as_rrsload_history.rows():
+ assert_type(legacy_rrs.totalClearedASRRSLOAD, Decimal | None)
+ for dam_rrs in client.np3_911_er._2d_agg_dam_as_offers_rrspfr_history.rows():
+ assert_type(dam_rrs.RRSPFROfferPrice, Decimal | None)
+ for aggregated_rrs in client.np3_911_er._2d_agg_as_offers_rrspfr_history.rows():
+ assert_type(aggregated_rrs.RRSPFROfferPrice, Decimal | None)
+
+ for cop_snapshot in client.np1_301._60_cop_adj_period_snapshot_history.rows():
+ assert_type(cop_snapshot.hourEnding, str | None)
+ assert_type(cop_snapshot.RRS, Decimal | None)
+ assert_type(cop_snapshot.RRSPFR, Decimal | None)
+ for obligation in client.np1_302.as_obligation_history.rows():
+ assert_type(obligation.REGUPObligation, Decimal | None)
+ assert_type(obligation.REGUPResponsibility, Decimal | None)
+ assert_type(obligation.REGUPOblFinal, Decimal | None)
+
+ for trigger in client.np3_987_ex._7d_trig_mcpc_50xfip_history.rows():
+ assert_type(trigger.FIPx50, Decimal | None)
+ assert_type(trigger.price1RRSPFR, Decimal | None)
+ for sasm_award in client.np3_990_ex._60_sasm_gen_res_as_offer_awards_history.rows():
+ assert_type(sasm_award.SASMId, datetime | None)
+ assert_type(sasm_award.RRSAwarded, Decimal | None)
+ assert_type(sasm_award.RRSPFRAwarded, Decimal | None)
+ for sasm_offer in client.np3_990_ex._60_sasm_load_res_as_offers_history.rows():
+ assert_type(sasm_offer.price1RRS, Decimal | None)
+ assert_type(sasm_offer.price1RRSPFR, Decimal | None)
+
+ for cop_update in client.np3_991_ex._60_cop_all_updates_history.rows():
+ assert_type(cop_update.updateTime, datetime | None)
+ assert_type(cop_update.submitTime, datetime | None)
+ assert_type(cop_update.RRS, Decimal | None)
+ assert_type(cop_update.cancelFlag, bool | None)
+
+ for sced_resource in client.np3_965_er._60_sced_gen_res_data_history.rows():
+ assert_type(sced_resource.resourceName, str | None)
+ assert_type(sced_resource.SCED1CurveMW1, Decimal | None)
+ for self_arranged in client.np3_965_er._60_sced_qse_self_arranged_as_history.rows():
+ assert_type(self_arranged.RRSGN, Decimal | None)
+ assert_type(self_arranged.RRSPFR, Decimal | None)
+ for cap_override in client.np3_965_er._60d_sced_as_cap_man_override_history.rows():
+ assert_type(cap_override.startTime, datetime | None)
+
+ for sced_adder in client.np6_792_er.price_adders_history.rows():
+ assert_type(sced_adder.SCEDTimestamp, datetime | None)
+ assert_type(sced_adder.RTORPA, Decimal | None)
+ assert_type(sced_adder.RTRDPA, Decimal | None)
+ assert_type(sced_adder.RTRUCCST30HSL, Decimal | None)
+ assert_type(sced_adder.RTNCLRNSCAP, Decimal | None)
+ for interval_adder in client.np6_793_er.price_adders_history.rows():
+ assert_type(interval_adder.deliveryDate, date | None)
+ assert_type(interval_adder.RTRSVPOR, Decimal | None)
+
+ for capability_row in client.np6_794_er.capability_history.rows():
+ assert_type(capability_row.CapREGUP_RRS_ECRS_NSPINTotal, Decimal | None)
+ assert_type(capability_row.SCEDTimestamp, datetime | None)
+ for clearing_row in client.np6_795_er.clearing_prices_history.rows():
+ assert_type(clearing_row.MCPC, Decimal | None)
+ assert_type(clearing_row.cappedMCPC, Decimal | None)
+ assert_type(clearing_row.uncappedMCPC, Decimal | None)
+ for interval_clearing in client.np6_796_er.clearing_prices_history.rows():
+ assert_type(interval_clearing.deliveryDate, date | None)
+
+ for fuel_submission in client.np4_494_er.fuel_cost_submissions_history.rows():
+ assert_type(fuel_submission.deliveryHour, int | None)
+ assert_type(fuel_submission.resourceCount, int | None)
+ for path_adder in client.np7_535_sg.path_adders_history.rows():
+ assert_type(path_adder.source, str | None)
+ assert_type(path_adder.startDate, date | None)
+ assert_type(path_adder.ACI99, Decimal | None)
+
+ for eia_hourly in client.eia_930_cd.hourly_operations_history.rows():
+ assert_type(eia_hourly.dataDate, date | None)
+ assert_type(eia_hourly.HR1, Decimal | datetime | None)
+
+ for integration in client.np4_765_er.daily_values_history.rows():
+ assert_type(integration.reportDate, date | None)
+ assert_type(integration.installedDischargeCapacityMW, Decimal | None)
+ assert_type(integration.sourceNotes, str | None)
+ for record_power in client.np4_765_er.power_records_history.rows():
+ assert_type(record_power.recordTime, datetime | None)
+ assert_type(record_power.recordMW, Decimal | None)
+
+ assert_type(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.rows(kind="bundle"),
+ Iterator[np4_190_cd.DamStlmntPntPricesRow],
+ )
+
+ assert_type(
+ client.np4_190_cd.dam_stlmnt_pnt_prices_history.backfill(
+ where=lambda price: price.settlementPoint == "HB_HOUSTON"
+ ),
+ Iterator[np4_190_cd.DamStlmntPntPricesRow],
+ )
+
+ for percentages in client.np4_765_er.hourly_percentages_history.rows(kind="bundle"):
+ assert_type(percentages.reportDate, date | None)
+ assert_type(percentages.hourEnding, str | None)
+ assert_type(percentages.netLoadPercent, Decimal | None)
+
+ for legacy_load in client.np3_965_er._60_load_res_data_in_sced_history.rows():
+ assert_type(legacy_load.SCEDBidCurveMW35, Decimal | None)
+ assert_type(legacy_load.SCEDBidCurvePrice35, Decimal | None)
+ for legacy_wind in client.np4_732_cd.wpp_hrly_avrg_actl_fcast_history.rows():
+ assert_type(legacy_wind.actualLoadZoneWest, Decimal | None)
+ assert_type(legacy_wind.actualLoadZoneNorth, Decimal | None)
+ assert_type(legacy_wind.hourBeginningTimestamp, datetime | None)
+
+
+with Client() as client:
+ assert_type(client.hourly_load.archives(), list[LoadArchive])
+ assert_type(
+ client.hourly_load.weather_zones(date_from=date(2002, 1, 1)),
+ Iterator[WeatherZoneLoad],
+ )
+ assert_type(client.hourly_load.read_weather_zones(b""), Iterator[WeatherZoneLoad])
+
+with Client() as client:
+ assert_type(
+ client.hourly_load.legacy(date_from=date(1995, 1, 1)),
+ Iterator[LegacyHourlyLoad],
+ )
+ assert_type(
+ client.hourly_load.read_legacy(b"", filename="erceei95.txt"),
+ Iterator[LegacyHourlyLoad],
+ )
+
+with Client() as client:
+ forecast_publications = (
+ client.np3_561_cd._7d_load_fcast_by_wzn_history.publications()
+ )
+ assert_type(
+ forecast_publications,
+ Iterator[Publication[np3_561_cd._7dLoadFcastByWznHistoryRow]],
+ )
+ forecast_publication = next(forecast_publications)
+ assert_type(forecast_publication.document, Document)
+ assert_type(
+ forecast_publication.rows, Iterator[np3_561_cd._7dLoadFcastByWznHistoryRow]
+ )
+
+
+with Client() as client:
+ sced_capacity = client.dashboards.sced_capacity()
+ assert_type(sced_capacity.current.data[0].increaseGenResESRs, Decimal)
+ assert_type(sced_capacity.previous.data[0].timestamp, datetime)
+ ancillary_capacity = client.dashboards.ancillary_capacity()
+ assert_type(
+ ancillary_capacity.data.systemAvailableCapacityGroup.esrCapWEoIncreaseBp,
+ Decimal,
+ )
+ assert_type(ancillary_capacity.data.regulationAwardsGroup.regUpAwd, Decimal)
+
+
+with Client() as client:
+ conditions = client.dashboards.real_time_conditions()
+ assert_type(conditions.lastUpdated, datetime)
+ assert_type(conditions.instantaneousTimeError, Decimal)
+ assert_type(conditions.consecutiveBaalExceedances, int)
+ assert_type(conditions.dcS, Decimal)
+
+
+with Client() as client:
+ lmps = client.dashboards.real_time_lmps(hubs_and_zones=True)
+ assert_type(lmps.lastUpdated, datetime)
+ assert_type(lmps.RTRDPA, Decimal)
+ assert_type(lmps.data[0].LMP, Decimal)
+ assert_type(lmps.data[0].lmpChange, Decimal | None)
+ assert_type(lmps.data[0].lmpWithAdderChange, Decimal)
+
+
+with Client() as client:
+ rtd_display = client.dashboards.indicative_prices("HB_HOUSTON")
+ assert_type(rtd_display.lastSCEDTimestamp, datetime)
+ assert_type(rtd_display.data[0].RTDTimestamp, datetime)
+ assert_type(rtd_display.data[0].actualLMP, Decimal)
+ assert_type(rtd_display.data[0].intervals[0].minutesAhead, int)
+ assert_type(rtd_display.data[0].intervals[0].LMP, Decimal)
+
+
+with Client() as client:
+ assert_type(client.load_profiles.archives(), list[LoadArchive])
+ assert_type(
+ client.load_profiles.rows(profile="BUSHIDG_COAST"), Iterator[LoadProfileDay]
+ )
+ assert_type(
+ client.load_profiles.read(b"", date_from=date(2026, 1, 1)),
+ Iterator[LoadProfileDay],
+ )
+ profile_day = next(client.load_profiles.rows())
+ assert_type(profile_day.intervals[0].energyKWh, Decimal | None)
+ assert_type(profile_day.sourceAddTime, datetime | None)
+ assert_type(profile_day.profileType, str)
+ assert_type(profile_day.weatherZone, str)
+ assert_type(client.load_profiles.adjustments(), Iterator[LoadProfileAdjustment])
+ assert_type(
+ client.load_profiles.read_adjustments(b""), Iterator[LoadProfileAdjustment]
+ )
+ assert_type(
+ client.load_profiles.counts(where=lambda row: row.weatherZone == "COAST"),
+ Iterator[LoadProfileCount],
+ )
+ assert_type(client.load_profiles.read_counts(b""), Iterator[LoadProfileCount])
+ profile_count = next(client.load_profiles.counts())
+ assert_type(profile_count.snapshotDate, date | None)
+ assert_type(profile_count.weatherZone, str | None)
+ assert_type(profile_count.records, int)
+
+
+with Client() as client:
+ assert_type(
+ client.coincident_peaks.allocations(year_from=1996),
+ Iterator[CoincidentPeakAllocation],
+ )
+ assert_type(
+ client.coincident_peaks.read_allocations(b""),
+ Iterator[CoincidentPeakAllocation],
+ )
+ assert_type(client.coincident_peaks.daily_files(), list[PublicFile])
+ assert_type(
+ client.coincident_peaks.download(
+ PublicFile(url="https://www.ercot.com/data.xlsx", title="Source")
+ ),
+ bytes,
+ )
+ assert_type(
+ client.coincident_peaks.daily(where=lambda r: r.entity == "ERCOT"),
+ Iterator[CoincidentPeakDay],
+ )
+ assert_type(client.coincident_peaks.read_daily(b""), Iterator[CoincidentPeakDay])
+ cp_day = next(client.coincident_peaks.daily())
+ assert_type(cp_day.operatingDay, date)
+ assert_type(cp_day.intervals, list[EnergyInterval])
+ assert_type(cp_day.intervals[0].energyMWh, Decimal | None)
+ assert_type(cp_day.sourceFile, PublicFile | None)
+ cp_allocation = next(client.coincident_peaks.allocations())
+ assert_type(cp_allocation.averageLoad, Decimal | None)
+ assert_type(cp_allocation.peaks[0].timestamp, datetime | None)
+ assert_type(cp_allocation.duns, str | None)
+ assert_type(client.coincident_peaks.monthly(), Iterator[MonthlyCoincidentPeak])
+ assert_type(
+ client.coincident_peaks.read_monthly(b""), Iterator[MonthlyCoincidentPeak]
+ )
+ cp_monthly = next(client.coincident_peaks.monthly())
+ assert_type(cp_monthly.entity, str | None)
+ assert_type(cp_monthly.timestamp, datetime)
+ assert_type(cp_monthly.load, Decimal | None)
+ assert_type(cp_monthly.energyMWh, Decimal | None)
+ if cp_monthly.settlementRun:
+ assert_type(cp_monthly.settlementRun.runDate, date | None)
+ assert_type(cp_monthly.settlementRun.runTime, time | None)
+
+with Client() as client:
+ assert_type(client.generation_profiles.read(b""), Iterator[GenerationProfileHour])
+ assert_type(client.generation_profiles.sites(b""), Iterator[GenerationProfileSite])
+ generation_profile_hour = next(client.generation_profiles.read(b""))
+ assert_type(generation_profile_hour.generationMW, dict[str, Decimal | None])
+ assert_type(generation_profile_hour.profileDate, date)
+
+with Client() as client:
+ assert_type(
+ client.generation_profiles.read_keys(b""), Iterator[GenerationProfileKey]
+ )
+ generation_key = next(client.generation_profiles.read_keys(b""))
+ assert_type(generation_key.sites, list[GenerationProfileKeySite])
+ assert_type(generation_key.summaries, list[GenerationProfileKeySummary])
+ assert_type(generation_key.sites[0].capacityMW, Decimal | None)
+ assert_type(generation_key.sites[0].tilt, Decimal | Literal["Lat", "NA"] | None)
+ assert_type(generation_key.sites[0].queuedModelFlag, bool | None)
+
+with Client() as client:
+ generation_block = next(client.generation_profiles.read(b""))
+ assert_type(generation_block.sourceBlock, int)
+ generation_site = next(client.generation_profiles.sites(b""))
+ assert_type(generation_site.sourceBlock, int)
+ assert_type(generation_site.tracking, str | None)
+
+with Client() as client:
+ legacy_profile_hour = next(client.generation_profiles.read(b""))
+ assert_type(legacy_profile_hour.calendarDate, date | None)
+ legacy_profile_site = next(client.generation_profiles.sites(b""))
+ assert_type(legacy_profile_site.annualEnergyMWh, dict[int, Decimal | None])
+ assert_type(legacy_profile_site.annualCapacityFactor, dict[int, Decimal | None])
+ assert_type(legacy_profile_site.sourceCount, int | None)
+ assert_type(legacy_profile_site.sourceSum, Decimal | None)
+
+
+def peak_forecast_typing(client: Client) -> None:
+ assert_type(client.peak_demand_forecasts.files(), list[PublicFile])
+ assert_type(client.peak_demand_forecasts.read(b""), Iterator[PeakDemandForecast])
+ rows = client.peak_demand_forecasts.rows(where=lambda r: r.forecastYear >= 2025)
+ assert_type(rows, Iterator[PeakDemandForecast])
+ row = next(rows)
+ assert_type(row.weatherYearMW, dict[int, Decimal | None])
+ assert_type(row.p90MW, Decimal | None)
+ assert_type(row.sourceFile, PublicFile | None)
+
+
+def monthly_forecast_typing(client: Client) -> None:
+ assert_type(client.monthly_load_forecasts.files(), list[PublicFile])
+ assert_type(client.monthly_load_forecasts.read(b""), Iterator[MonthlyLoadForecast])
+ rows = client.monthly_load_forecasts.rows(where=lambda r: r.forecastYear == 2026)
+ assert_type(rows, Iterator[MonthlyLoadForecast])
+ row = next(rows)
+ assert_type(row.forecastMonth, int | None)
+ assert_type(row.energy, Decimal | None)
+ assert_type(row.energyUnit, Literal["MWh"] | None)
+ assert_type(row.sourceFile, PublicFile | None)
+
+
+def zonal_peak_typing(client: Client) -> None:
+ assert_type(client.seasonal_peak_forecasts.files(), list[PublicFile])
+ assert_type(
+ client.seasonal_peak_forecasts.read(b""), Iterator[SeasonalPeakForecast]
+ )
+ assert_type(client.weekly_peak_forecasts.rows(), Iterator[WeeklyPeakForecast])
+ row = next(
+ client.seasonal_peak_forecasts.rows(where=lambda r: r.kind == "historical")
+ )
+ assert_type(row.peaks, WeatherZonePeakValues)
+ assert_type(row.peaks.northCentral, Decimal | None)
+ assert_type(row.endYear, int | None)
+ assert_type(row.percentile, int | None)
+ weekly = next(client.weekly_peak_forecasts.rows())
+ assert_type(weekly.peakDate, date)
+ assert_type(weekly.peakHour, int)
+
+
+def hourly_forecast_typing(client: Client) -> None:
+ assert_type(client.hourly_load_forecasts.files(), list[PublicFile])
+ assert_type(client.hourly_load_forecasts.read(b""), Iterator[HourlyLoadForecast])
+ rows = client.hourly_load_forecasts.rows(
+ where=lambda r: r.forecastDate.year == 2026
+ )
+ assert_type(rows, Iterator[HourlyLoadForecast])
+ row = next(rows)
+ assert_type(row.forecastDate, date)
+ assert_type(row.hour, int)
+ assert_type(row.net, WeatherZoneForecastValues | None)
+ if row.net is not None:
+ assert_type(row.net.coast, Decimal | None)
+ assert_type(row.net.total, Decimal | None)
+ assert_type(row.unit, Literal["MW"] | None)
+ assert_type(row.scenario, Literal["tsp_provided", "ercot_adjusted"] | None)
+
+
+def hourly_load_scenario_typing(client: Client) -> None:
+ assert_type(client.hourly_load_scenarios.files(), list[PublicFile])
+ assert_type(client.hourly_load_scenarios.read(b""), Iterator[HourlyLoadScenario])
+ rows = client.hourly_load_scenarios.rows(where=lambda r: r.weatherZone == "COAST")
+ assert_type(rows, Iterator[HourlyLoadScenario])
+ row = next(rows)
+ assert_type(row.forecastDate, date)
+ assert_type(row.weatherZone, WeatherZone)
+ assert_type(row.weatherYearPredictions, dict[int, Decimal | None])
+ assert_type(row.sourceMarkers, dict[str, str])
+ assert_type(row.electricVehicles, Decimal | None)
+ assert_type(row.largeFlexibleLoad, Decimal | None)
+ assert_type(row.sourceFile, PublicFile | None)
+
+
+# ESR uses a separate subscription while retaining the generated typed surface.
+from tinyercot import ESRClient, rptesr_m
+
+with ESRClient() as esr:
+ assert_type(
+ esr.rptesr_m._4_sec_esr_charging_mw(
+ AGCExecTimeUTCFrom=datetime.fromisoformat("2025-09-01T00:00:00")
+ ),
+ Page[rptesr_m._4SecEsrChargingMwRow],
+ )
+ assert_type(
+ esr.rptesr_m._4_sec_esr_charging_mw_iter(),
+ Iterator[rptesr_m._4SecEsrChargingMwRow],
+ )
+ assert_type(
+ esr.rptesr_m._4_sec_esr_charging_mw_iter_async(),
+ AsyncIterator[rptesr_m._4SecEsrChargingMwRow],
+ )
+ assert_type(
+ esr.rptesr_m._4_sec_esr_charging_mw_history,
+ Archive[rptesr_m._4SecEsrChargingMwRow],
+ )
+ esr_row = next(esr.rptesr_m._4_sec_esr_charging_mw_iter())
+ assert_type(esr_row.ESRChargingMW, Decimal | None)
+ assert_type(esr_row.AGCExecTimeUTC, datetime | None)
+
+from tinyercot import LoadForecastErrorSummary, LoadForecastPerformanceHour
+
+with Client() as client:
+ assert_type(
+ client.load_forecast_performance.rows(), Iterator[LoadForecastPerformanceHour]
+ )
+ assert_type(
+ client.load_forecast_performance.read(b""),
+ Iterator[LoadForecastPerformanceHour],
+ )
+ assert_type(
+ client.load_forecast_performance.summaries(), Iterator[LoadForecastErrorSummary]
+ )
+ assert_type(
+ client.load_forecast_performance.read_summaries(b""),
+ Iterator[LoadForecastErrorSummary],
+ )
+ performance = next(client.load_forecast_performance.rows())
+ assert_type(performance.timestamp, datetime | None)
+ assert_type(performance.selected, Decimal | None)
+ assert_type(performance.X, Decimal | None)
+ assert_type(performance.sourceMarkers, dict[str, str])
+ summary = next(client.load_forecast_performance.summaries())
+ assert_type(summary.hour, int | None)
+ assert_type(summary.frequencyUnder, int | None)
+
+from tinyercot import MonthlyLoadForecastPerformance
+
+with Client() as client:
+ assert_type(
+ client.monthly_forecast_performance.rows(),
+ Iterator[MonthlyLoadForecastPerformance],
+ )
+ assert_type(
+ client.monthly_forecast_performance.read(b""),
+ Iterator[MonthlyLoadForecastPerformance],
+ )
+ monthly_error = next(client.monthly_forecast_performance.rows())
+ assert_type(monthly_error.month, date)
+ assert_type(monthly_error.sourceDate, date | None)
+ assert_type(monthly_error.value, Decimal | None)
+ assert_type(monthly_error.percent, Decimal | None)
+ assert_type(monthly_error.kind, Literal["forecast", "backcast", "target"])
+
+
+with Client() as client:
+ public_prices = client.dashboards.day_ahead_prices(date(2026, 9, 3))
+ assert_type(public_prices.operatingDay, date)
+ assert_type(public_prices.lastUpdated, datetime)
+ assert_type(public_prices.data[0].periodEnding, str)
+ assert_type(public_prices.data[0].values["HB_HOUSTON"], Decimal)
+ assert_type(
+ client.dashboards.real_time_prices().data[0].values["LZ_NORTH"], Decimal
+ )
+ assert_type(
+ client.dashboards.day_ahead_ancillary_prices().data[0].values["ECRS"], Decimal
+ )
+ assert_type(
+ client.dashboards.actual_forecast_zone_load().data[0].values["HOUSTON"], Decimal
+ )
+ assert_type(
+ client.dashboards.actual_weather_zone_load().data[0].values["COAST"], Decimal
+ )
+
+
+with Client() as client:
+ demand = client.dashboards.system_demand().nextDay.data[0]
+ assert_type(demand.dayAheadForecast, Decimal | None)
+ assert_type(demand.dayAheadHsl, Decimal | None)
+ assert_type(demand.currentLoadForecast, Decimal)
+
+
+with Client() as client:
+ wind_solar = next(
+ iter(client.dashboards.combined_wind_solar().nextDay.data.values())
+ )
+ assert_type(wind_solar.copHslWindDayAhead, Decimal | None)
+ assert_type(wind_solar.stwpfDayAhead, Decimal | None)
+ assert_type(wind_solar.wgrppDayAhead, Decimal | None)
+ assert_type(wind_solar.copHslSolarDayAhead, Decimal | None)
+ assert_type(wind_solar.stppfDayAhead, Decimal | None)
+ assert_type(wind_solar.pvgrppDayAhead, Decimal | None)
+ assert_type(wind_solar.stwpf, Decimal)
diff --git a/tinyercot/__init__.py b/tinyercot/__init__.py
index 50b9a899..34e0df1d 100644
--- a/tinyercot/__init__.py
+++ b/tinyercot/__init__.py
@@ -1,7 +1,84 @@
"""Tiny, fully typed access to ERCOT public data."""
+from ._capacity import CapacityProject as CapacityProject
+from ._capacity import CapacityTotals as CapacityTotals
from ._client import Document as Document
from ._client import History as History
from ._client import Page as Page
from ._client import Product as Product
+from ._coincident_peaks import CoincidentPeak as CoincidentPeak
+from ._coincident_peaks import CoincidentPeakAllocation as CoincidentPeakAllocation
+from ._coincident_peaks import CoincidentPeakDay as CoincidentPeakDay
+from ._coincident_peaks import MonthlyCoincidentPeak as MonthlyCoincidentPeak
+from ._coincident_peaks import PeakSettlementRun as PeakSettlementRun
+from ._distribution_losses import (
+ DistributionLossCoefficient as DistributionLossCoefficient,
+)
+from ._energy import EnergyInterval as EnergyInterval
+from ._forecast_performance import LoadForecastErrorSummary as LoadForecastErrorSummary
+from ._forecast_performance import (
+ LoadForecastPerformanceHour as LoadForecastPerformanceHour,
+)
+from ._fuel_mix import FuelMixArchive as FuelMixArchive
+from ._fuel_mix import FuelMixDay as FuelMixDay
+from ._fuel_mix import FuelMixInterval as FuelMixInterval
+from ._fuel_mix import FuelMixTotal as FuelMixTotal
from ._generated import *
+from ._generated_esr import *
+from ._generation_keys import GenerationProfileKey as GenerationProfileKey
+from ._generation_keys import GenerationProfileKeySite as GenerationProfileKeySite
+from ._generation_keys import GenerationProfileKeySummary as GenerationProfileKeySummary
+from ._generation_profiles import GenerationProfileHour as GenerationProfileHour
+from ._generation_profiles import GenerationProfileSite as GenerationProfileSite
+from ._history import Archive as Archive
+from ._history import Publication as Publication
+from ._hourly_forecasts import HourlyLoadForecast as HourlyLoadForecast
+from ._hourly_forecasts import WeatherZoneForecastValues as WeatherZoneForecastValues
+from ._legacy_load import LegacyHourlyLoad as LegacyHourlyLoad
+from ._load import LoadArchive as LoadArchive
+from ._load import WeatherZoneLoad as WeatherZoneLoad
+from ._load_forecasts import MonthlyLoadForecast as MonthlyLoadForecast
+from ._load_profiles import LoadProfileAdjustment as LoadProfileAdjustment
+from ._load_profiles import LoadProfileCount as LoadProfileCount
+from ._load_profiles import LoadProfileDay as LoadProfileDay
+from ._load_profiles import LoadProfileInterval as LoadProfileInterval
+from ._load_scenarios import HourlyLoadScenario as HourlyLoadScenario
+from ._loss_coefficients import (
+ TransmissionLossCoefficient as TransmissionLossCoefficient,
+)
+from ._loss_factors import LossFactorDay as LossFactorDay
+from ._loss_factors import LossFactorInterval as LossFactorInterval
+from ._monthly_performance import ForecastPerformanceSeries as ForecastPerformanceSeries
+from ._monthly_performance import (
+ MonthlyLoadForecastPerformance as MonthlyLoadForecastPerformance,
+)
+from ._mora import MoraBalance as MoraBalance
+from ._mora import MoraBalanceMetric as MoraBalanceMetric
+from ._mora import MoraCapacity as MoraCapacity
+from ._mora import MoraMetric as MoraMetric
+from ._mora import MoraPercentile as MoraPercentile
+from ._mora import MoraResource as MoraResource
+from ._mora import MoraScenarioValue as MoraScenarioValue
+from ._mora_risk import MoraRiskPoint as MoraRiskPoint
+from ._ordc import IndicativeOrdcPrice as IndicativeOrdcPrice
+from ._pdf import PdfArchive as PdfArchive
+from ._pdf import PdfChartArchive as PdfChartArchive
+from ._peak_forecasts import PeakDemandForecast as PeakDemandForecast
+from ._public_tables import CrrTimeOfUse as CrrTimeOfUse
+from ._public_tables import LoadShedShare as LoadShedShare
+from ._public_tables import PolrUsage as PolrUsage
+from ._public_tables import PublicFile as PublicFile
+from ._retail import RetailTransactionDay as RetailTransactionDay
+from ._retail import RetailTransactionMonth as RetailTransactionMonth
+from ._weather import WeatherDay as WeatherDay
+from ._weather import WeatherHour as WeatherHour
+from ._weather import WeatherVariable as WeatherVariable
+from ._weather import WeatherZone as WeatherZone
+from ._xlsx import WorkbookArchive as WorkbookArchive
+from ._zonal_energy import ZonalEnergyDay as ZonalEnergyDay
+from ._zonal_energy import ZonalEnergyTotal as ZonalEnergyTotal
+from ._zonal_energy import ZonalSourceNumber as ZonalSourceNumber
+from ._zonal_generation import ScheduledGeneration as ScheduledGeneration
+from ._zonal_peaks import SeasonalPeakForecast as SeasonalPeakForecast
+from ._zonal_peaks import WeatherZonePeakValues as WeatherZonePeakValues
+from ._zonal_peaks import WeeklyPeakForecast as WeeklyPeakForecast
diff --git a/tinyercot/_capacity.py b/tinyercot/_capacity.py
new file mode 100644
index 00000000..48a1b362
--- /dev/null
+++ b/tinyercot/_capacity.py
@@ -0,0 +1,291 @@
+"""Project and capacity histories from ERCOT's public resource workbooks."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date
+from decimal import Decimal
+from time import strptime
+from typing import Literal
+from urllib.parse import unquote
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._public_tables import PublicFile, _ResourceFiles
+
+_PROJECT_FIELDS = {
+ "Project Name": "name",
+ "County": "county",
+ "Projected COD": "projectedCOD",
+ "IA Signed": "interconnectionAgreementSigned",
+ "Approved for Synchronization": "approvedForSynchronization",
+ "Fuel": "fuel",
+ "Technology": "technology",
+ "Capacity (MW)": "capacityMW",
+ "Year": "reportedYear",
+ "Financial Security": "financialSecurity",
+ "Comments": "comments",
+}
+_TOTAL_FIELDS = {
+ "cumulative installed, no fs, and fs posted": "cumulativeInstalledAndSignedMW",
+ "cumulative operational, no fs, and fs posted": "cumulativeOperationalAndSignedMW",
+ "cumulative total mw": "cumulativeTotalMW",
+ "cumulative mw installed": "cumulativeInstalledMW",
+ "cumulative mw synchronized": "cumulativeSynchronizedMW",
+ "operational": "operationalMW",
+ "cumulative mw operational": "cumulativeOperationalMW",
+ "ia signed-financial security posted": "financialSecurityPostedMW",
+ "ia signed-no financial security": "noFinancialSecurityMW",
+ "other planned": "otherPlannedMW",
+ "dgr": "distributedGenerationMW",
+ "small generator": "smallGeneratorsMW",
+ "dgr comments": "dgrComments",
+}
+_GROUPS = {"Small Generators", "Small Generator", "DGRs"}
+
+
+class _CapacityRow(BaseModel):
+ model_config = ConfigDict(extra="forbid")
+ reportMonth: date | None
+ sourceFile: PublicFile | None
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+ sourceColumns: list[str]
+ sourceNotes: list[str]
+
+
+class CapacityProject(_CapacityRow):
+ """A reported project, retaining its projected dates and original identifier.
+
+ Identifiers can be INRs or resource codes. A projected COD, agreement or
+ synchronization approval does not establish commercial operation.
+ """
+
+ identifier: str
+ sourceGroup: str | None
+ name: str
+ county: str
+ projectedCOD: date
+ interconnectionAgreementSigned: date | str | None
+ approvedForSynchronization: date | None = None
+ fuel: str | None
+ technology: str
+ capacityMW: Decimal
+ reportedYear: int
+ financialSecurity: Literal["Yes", "No"] | None
+ comments: str | None = None
+
+
+class CapacityTotals(_CapacityRow):
+ """A published year or monthly point, with source measures kept separate.
+
+ period retains the source year or full date, including a mid-month day.
+ Missing columns and blank cells remain None; sourceColumns distinguishes them.
+ """
+
+ period: int | date
+ sourcePeriodLabel: Literal["Year", "Month/Year"]
+ cumulativeInstalledAndSignedMW: Decimal | None = None
+ cumulativeOperationalAndSignedMW: Decimal | None = None
+ cumulativeTotalMW: Decimal | None = None
+ cumulativeInstalledMW: Decimal | None = None
+ cumulativeSynchronizedMW: Decimal | None = None
+ operationalMW: Decimal | None = None
+ cumulativeOperationalMW: Decimal | None = None
+ financialSecurityPostedMW: Decimal | None = None
+ noFinancialSecurityMW: Decimal | None = None
+ otherPlannedMW: Decimal | None = None
+ distributedGenerationMW: Decimal | None = None
+ smallGeneratorsMW: Decimal | None = None
+ dgrComments: str | None = None
+
+
+class CapacityChanges(_ResourceFiles):
+ title_pattern = r"(?i)(?:Monthly )?Capacity Changes by Fuel Type Charts.*"
+
+ def projects(
+ self, *, where: Callable[[CapacityProject], bool] | None = None
+ ) -> Iterator[CapacityProject]:
+ """Query all project vintages, retaining companion files and corrections."""
+ for file in self.files():
+ yield from self.read_projects(
+ self.download(file), source_file=file, where=where
+ )
+
+ def read_projects(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ source_file: PublicFile | None = None,
+ where: Callable[[CapacityProject], bool] | None = None,
+ ) -> Iterator[CapacityProject]:
+ """Read saved workbooks/ZIPs; source_file preserves the original URL/vintage."""
+ for member, month, notes, sheet, rows in _tables(data, filename, source_file):
+ header = next((r.index("INR") for r in rows if "INR" in r), None)
+ if header is None:
+ continue
+ labels: list[str] = []
+ group: str | None = None
+ for number, cells in enumerate(rows, 1):
+ right = cells[header:]
+ if len(right) > 1 and right[1] == "Project Name":
+ labels = [str(v) for v in right if v is not None]
+ if labels[0] in _GROUPS:
+ group = labels[0]
+ unknown = set(labels[1:]) - _PROJECT_FIELDS.keys()
+ if unknown:
+ raise ValueError(
+ f"{member}/{sheet}: Unknown project columns {unknown}"
+ )
+ continue
+ if not labels or not right or right[0] is None:
+ continue
+ if not any(v not in (None, "") for v in right[1:]):
+ if right[0] in _GROUPS:
+ group = str(right[0])
+ continue
+ fields = {
+ _PROJECT_FIELDS[label]: right[i] if i < len(right) else None
+ for i, label in enumerate(labels)
+ if i
+ }
+ fields["capacityMW"] = _number(fields["capacityMW"])
+ row = CapacityProject.model_validate(
+ dict(
+ fields,
+ identifier=right[0],
+ sourceGroup=group,
+ reportMonth=month,
+ sourceFile=source_file,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=number,
+ sourceColumns=labels,
+ sourceNotes=notes,
+ )
+ )
+ if where is None or where(row):
+ yield row
+
+ def totals(
+ self, *, where: Callable[[CapacityTotals], bool] | None = None
+ ) -> Iterator[CapacityTotals]:
+ """Query annual/monthly capacity series without combining their definitions."""
+ for file in self.files():
+ yield from self.read_totals(
+ self.download(file), source_file=file, where=where
+ )
+
+ def read_totals(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ source_file: PublicFile | None = None,
+ where: Callable[[CapacityTotals], bool] | None = None,
+ ) -> Iterator[CapacityTotals]:
+ """Read saved annual/monthly source points, including original period dates."""
+ for member, month, notes, sheet, rows in _tables(data, filename, source_file):
+ columns: list[tuple[int, str, str]] = []
+ project_start = next((r.index("INR") for r in rows if "INR" in r), None)
+ period_label = ""
+ for number, cells in enumerate(rows, 1):
+ if cells and cells[0] in ("Year", "Month/Year"):
+ period_label = str(cells[0])
+ columns = []
+ for i, value in enumerate(cells[1:project_start], 1):
+ if value is None:
+ continue
+ label = str(value)
+ key = label.strip().lower()
+ if key not in _TOTAL_FIELDS:
+ raise ValueError(
+ f"{member}/{sheet}: Unknown capacity column {label!r}"
+ )
+ columns.append((i, label, _TOTAL_FIELDS[key]))
+ continue
+ if not columns or not cells or cells[0] is None:
+ continue
+ fields = {
+ field: (cells[i] if i < len(cells) else None)
+ if field == "dgrComments"
+ else _number(cells[i] if i < len(cells) else None)
+ for i, _, field in columns
+ }
+ row = CapacityTotals.model_validate(
+ dict(
+ fields,
+ period=cells[0],
+ sourcePeriodLabel=period_label,
+ reportMonth=month,
+ sourceFile=source_file,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=number,
+ sourceColumns=[period_label]
+ + [label for _, label, _ in columns],
+ sourceNotes=notes,
+ )
+ )
+ if where is None or where(row):
+ yield row
+
+
+def _tables(
+ data: bytes,
+ filename: str,
+ source_file: PublicFile | None,
+) -> Iterator[tuple[str, date | None, list[str], str, list[tuple[object, ...]]]]:
+ found = False
+ for member, content in _workbooks(data):
+ if member in {"workbook.xls", "workbook.xlsx"}:
+ member = (
+ unquote(source_file.url.rsplit("/", 1)[-1]) if source_file else filename
+ )
+ month_label = unquote(member)
+ month = re.search(
+ r"(January|February|March|April|May|June|July|August|September|October|November|December)[ _-]+(\d{4})",
+ month_label,
+ re.IGNORECASE,
+ )
+ report_month = (
+ date(*strptime(f"{month[1]} {month[2]}", "%B %Y")[:3]) if month else None
+ )
+ sheets = [
+ (s, list(r))
+ for s, r in _sheets(content, date_columns=(), preserve_types=True)
+ ]
+ corrections = [
+ value
+ for sheet, rows in sheets
+ if sheet == "Correction Info"
+ for cells in rows
+ for value in cells
+ if isinstance(value, str) and value != "Correction Description:"
+ ]
+ for sheet, rows in sheets:
+ if sheet == "Correction Info":
+ continue
+ header = next((r.index("INR") for r in rows if "INR" in r), None)
+ if header is None and not any(
+ r and r[0] in ("Year", "Month/Year") for r in rows
+ ):
+ continue
+ notes = corrections + [
+ str(cells[header])
+ for cells in rows
+ if header is not None
+ and len(cells) > header
+ and isinstance(cells[header], str)
+ and cells[header] not in _GROUPS
+ and not any(v not in (None, "") for v in cells[header + 1 :])
+ ]
+ found = True
+ yield member, report_month, notes, sheet, rows
+ if not found:
+ raise ValueError("Download contains no capacity-change tables")
diff --git a/tinyercot/_client.py b/tinyercot/_client.py
index e4d386e9..dfbaa0be 100644
--- a/tinyercot/_client.py
+++ b/tinyercot/_client.py
@@ -9,13 +9,36 @@
from collections.abc import AsyncIterator, Iterator, Sequence
from datetime import date, datetime
from decimal import Decimal
-from typing import Any, Generic, Literal, Self, TypeVar
+from typing import Any, ClassVar, Generic, Literal, Self, TypeVar
import httpx
from httpx_retries import Retry, RetryTransport
-from pydantic import BaseModel, ConfigDict, Field
+from pydantic import AliasChoices, BaseModel, ConfigDict, Field
+from ._capacity import CapacityChanges
+from ._coincident_peaks import CoincidentPeaks
from ._dashboards import Dashboards
+from ._distribution_losses import DistributionLossCoefficients
+from ._forecast_performance import LoadForecastPerformance
+from ._fuel_mix import FuelMix
+from ._generation_profiles import GenerationProfiles
+from ._hourly_forecasts import HourlyLoadForecasts
+from ._load import HourlyLoad
+from ._load_forecasts import MonthlyLoadForecasts
+from ._load_profiles import LoadProfiles
+from ._load_scenarios import HourlyLoadScenarios
+from ._loss_coefficients import TransmissionLossCoefficients
+from ._loss_factors import LossFactors
+from ._monthly_performance import MonthlyForecastPerformance
+from ._mora import ResourceOutlook
+from ._ordc import IndicativeOrdcHistory
+from ._peak_forecasts import PeakDemandForecasts
+from ._public_tables import CrrHours, LoadShed, PolrHistory
+from ._retail import RetailTransactions
+from ._weather import HistoricalWeather
+from ._zonal_energy import ZonalEnergy
+from ._zonal_generation import ZonalGeneration
+from ._zonal_peaks import SeasonalPeakForecasts, WeeklyPeakForecasts
T = TypeVar("T", bound=BaseModel)
Parameter = str | int | float | bool | Decimal | date | datetime | None
@@ -43,7 +66,7 @@ class Artifact(BaseModel):
class Product(BaseModel):
- emilId: str
+ emilId: str = Field(validation_alias=AliasChoices("emilId", "productId"))
name: str
description: str | None = None
status: str
@@ -94,7 +117,9 @@ class Report(BaseModel):
reportName: str
reportDisplayName: str
reportId: str | int
- reportEMIL: str
+ reportEMIL: str = Field(
+ validation_alias=AliasChoices("reportEMIL", "reportProductId")
+ )
downloadLimit: int | None = None
@@ -129,7 +154,7 @@ class Document(BaseModel):
class ProductSummary(BaseModel):
- emilId: str
+ emilId: str = Field(validation_alias=AliasChoices("emilId", "productId"))
name: str
reportTypeId: int
@@ -182,6 +207,9 @@ class Version(BaseModel):
class Transport:
+ _base_url: ClassVar[str] = BASE_URL
+ _subscription_key_env: ClassVar[str] = "ERCOT_SUBSCRIPTION_KEY"
+
def __init__(
self,
username: str | None = None,
@@ -194,7 +222,7 @@ def __init__(
) -> None:
self._username = username or os.getenv("ERCOT_USERNAME")
self._password = password or os.getenv("ERCOT_PASSWORD")
- self._key = subscription_key or os.getenv("ERCOT_SUBSCRIPTION_KEY")
+ self._key = subscription_key or os.getenv(self._subscription_key_env)
retry = Retry(
total=5, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504]
)
@@ -235,7 +263,8 @@ def _headers(self) -> dict[str, str]:
with self._lock:
if not (self._username and self._password and self._key):
raise ValueError(
- "ERCOT username, password, and subscription key are required"
+ "ERCOT username, password, and subscription key are required "
+ f"(subscription_key or {self._subscription_key_env})"
)
if time.monotonic() >= self._expires:
response = self._http.post(
@@ -271,7 +300,7 @@ def _request(
for attempt in range(2):
response = self._http.request(
method,
- BASE_URL + "/" + path.lstrip("/"),
+ self._base_url + "/" + path.lstrip("/"),
headers=self._headers(),
params=_params(params or {}),
json={"docIds": list(doc_ids)} if doc_ids is not None else None,
@@ -304,7 +333,7 @@ async def _apage(
for attempt in range(2):
headers = await asyncio.to_thread(self._headers)
response = await self._async_http.get(
- BASE_URL + "/" + path.lstrip("/"),
+ self._base_url + "/" + path.lstrip("/"),
headers=headers,
params=_params(params),
)
@@ -326,6 +355,110 @@ async def _aiter(
return
page += 1
+ @property
+ def zonal_generation(self) -> ZonalGeneration:
+ return ZonalGeneration(self._http)
+
+ @property
+ def fuel_mix(self) -> FuelMix:
+ return FuelMix(self._http)
+
+ @property
+ def coincident_peaks(self) -> CoincidentPeaks:
+ return CoincidentPeaks(self._http)
+
+ @property
+ def seasonal_peak_forecasts(self) -> SeasonalPeakForecasts:
+ return SeasonalPeakForecasts(self._http)
+
+ @property
+ def weekly_peak_forecasts(self) -> WeeklyPeakForecasts:
+ return WeeklyPeakForecasts(self._http)
+
+ @property
+ def monthly_forecast_performance(self) -> MonthlyForecastPerformance:
+ return MonthlyForecastPerformance(self._http)
+
+ @property
+ def load_forecast_performance(self) -> LoadForecastPerformance:
+ return LoadForecastPerformance(self._http)
+
+ @property
+ def hourly_load_scenarios(self) -> HourlyLoadScenarios:
+ return HourlyLoadScenarios(self._http)
+
+ @property
+ def hourly_load_forecasts(self) -> HourlyLoadForecasts:
+ return HourlyLoadForecasts(self._http)
+
+ @property
+ def monthly_load_forecasts(self) -> MonthlyLoadForecasts:
+ return MonthlyLoadForecasts(self._http)
+
+ @property
+ def peak_demand_forecasts(self) -> PeakDemandForecasts:
+ return PeakDemandForecasts(self._http)
+
+ @property
+ def generation_profiles(self) -> GenerationProfiles:
+ return GenerationProfiles(self._http)
+
+ @property
+ def load_profiles(self) -> LoadProfiles:
+ return LoadProfiles(self._http)
+
+ @property
+ def historical_weather(self) -> HistoricalWeather:
+ return HistoricalWeather(self._http)
+
+ @property
+ def loss_factors(self) -> LossFactors:
+ return LossFactors(self._http)
+
+ @property
+ def zonal_energy(self) -> ZonalEnergy:
+ return ZonalEnergy(self._http)
+
+ @property
+ def transmission_loss_coefficients(self) -> TransmissionLossCoefficients:
+ return TransmissionLossCoefficients(self._http)
+
+ @property
+ def distribution_loss_coefficients(self) -> DistributionLossCoefficients:
+ return DistributionLossCoefficients(self._http)
+
+ @property
+ def load_shed(self) -> LoadShed:
+ return LoadShed(self._http)
+
+ @property
+ def crr_hours(self) -> CrrHours:
+ return CrrHours(self._http)
+
+ @property
+ def polr(self) -> PolrHistory:
+ return PolrHistory(self._http)
+
+ @property
+ def retail_transactions(self) -> RetailTransactions:
+ return RetailTransactions(self._http)
+
+ @property
+ def indicative_ordc(self) -> IndicativeOrdcHistory:
+ return IndicativeOrdcHistory(self._http)
+
+ @property
+ def resource_outlook(self) -> ResourceOutlook:
+ return ResourceOutlook(self._http)
+
+ @property
+ def capacity_changes(self) -> CapacityChanges:
+ return CapacityChanges(self._http)
+
+ @property
+ def hourly_load(self) -> HourlyLoad:
+ return HourlyLoad(self._http)
+
@property
def dashboards(self) -> Dashboards:
return Dashboards(self._http)
@@ -342,10 +475,25 @@ def products(self) -> list[Product]:
def product(self, emil_id: str) -> Product:
return Product.model_validate(self._request("GET", emil_id.lower()).json())
- def archives(self, emil_id: str, *, page: int = 1, size: int = 1000) -> History:
+ def archives(
+ self,
+ emil_id: str,
+ *,
+ page: int = 1,
+ size: int = 1000,
+ posted_from: datetime | None = None,
+ posted_to: datetime | None = None,
+ ) -> History:
return History.model_validate(
self._request(
- "GET", f"archive/{emil_id.lower()}", params={"page": page, "size": size}
+ "GET",
+ f"archive/{emil_id.lower()}",
+ params={
+ "page": page,
+ "size": size,
+ "postDatetimeFrom": posted_from,
+ "postDatetimeTo": posted_to,
+ },
).json()
)
@@ -362,16 +510,29 @@ def iter_documents(
*,
kind: Literal["archive", "bundle"] = "archive",
size: int = 1000,
+ posted_from: datetime | None = None,
+ posted_to: datetime | None = None,
) -> Iterator[Document]:
"""Iterate every page of an archive or bundle listing."""
page = 1
while True:
history = (
- self.archives(emil_id, page=page, size=size)
+ self.archives(
+ emil_id,
+ page=page,
+ size=size,
+ posted_from=posted_from,
+ posted_to=posted_to,
+ )
if kind == "archive"
else self.bundles(emil_id, page=page, size=size)
)
- yield from history.archives if kind == "archive" else history.bundles
+ for document in history.archives if kind == "archive" else history.bundles:
+ if posted_from is not None and document.postDatetime < posted_from:
+ continue
+ if posted_to is not None and document.postDatetime > posted_to:
+ continue
+ yield document
if page >= history.meta.totalPages:
return
page += 1
@@ -384,6 +545,18 @@ def download(
kind: Literal["archive", "bundle"] = "archive",
) -> bytes:
"""Download selected archive documents or bundles as a ZIP file."""
- return self._request(
- "POST", f"{kind}/{emil_id.lower()}/download", doc_ids=doc_ids
- ).content
+ try:
+ return self._request(
+ "POST", f"{kind}/{emil_id.lower()}/download", doc_ids=doc_ids
+ ).content
+ except httpx.HTTPStatusError as error:
+ if (
+ kind != "bundle"
+ or len(doc_ids) != 1
+ or error.response.status_code != 400
+ ):
+ raise
+ # Some listed bundles reject POST but work through their published GET link.
+ return self._request(
+ "GET", f"bundle/{emil_id.lower()}", params={"download": doc_ids[0]}
+ ).content
diff --git a/tinyercot/_coincident_peaks.py b/tinyercot/_coincident_peaks.py
new file mode 100644
index 00000000..2caebb91
--- /dev/null
+++ b/tinyercot/_coincident_peaks.py
@@ -0,0 +1,735 @@
+"""Four-coincident-peak loads and allocations from the public historical archive."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date, datetime, time
+from decimal import Decimal
+from typing import Literal
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+from ._energy import EnergyInterval
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._public_tables import PublicFile, _year_files
+
+URL = "https://www.ercot.com/files/docs/2022/01/13/1996-2020_FourCoincidentPeakCalculations.zip"
+_MONTHS = ("June", "July", "August", "September")
+
+
+class CoincidentPeak(BaseModel):
+ """A monthly source load and its published peak clock, when present.
+
+ Clocks have no inferred UTC offset. The parent allocation supplies the unit.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ month: int
+ load: Decimal | None
+ timestamp: datetime | None
+ sourceHeader: str
+
+
+class CoincidentPeakAllocation(BaseModel):
+ """One annual allocation, retaining source revisions, units and identities.
+
+ Ratios and adjustment factors retain their original scale. Original headers
+ preserve whether ERCOT labels them as a share, factor, or percent.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ year: int
+ kind: Literal["allocation", "comparison", "revision_detail"]
+ entity: str
+ entityCode: str | None
+ duns: str | None
+ controlArea: str | None
+ unit: Literal["kW", "MW"]
+ peaks: list[CoincidentPeak]
+ averageLoad: Decimal | None
+ loadRatioShare: Decimal | None
+ adjustmentUnit: Literal["factor", "percent"] | None
+ gsuLosses: Decimal | None = None
+ netGeneration: Decimal | None = None
+ lossAdjustmentFactor: Decimal | None = None
+ loadAtDeliveryPoint: Decimal | None = None
+ vamoLossAllocation: Decimal | None = None
+ loadResponsibility: Decimal | None = None
+ oldLoadRatioShare: Decimal | None = None
+ loadRatioShareDifference: Decimal | None = None
+ sourceMember: str
+ sourceSheet: str
+ sourceSection: str | None
+ sourceHeaders: list[str]
+ sourceNotes: list[str]
+
+
+class PeakSettlementRun(BaseModel):
+ """Published settlement-run metadata; an invalid source date remains visible."""
+
+ model_config = ConfigDict(extra="forbid")
+ runDate: date | None
+ runTime: time | None
+ sourceDate: str
+ channel: int | None
+ kind: Literal["FINAL", "INTERIM", "TRUE-UP"] | None
+
+
+class MonthlyCoincidentPeak(BaseModel):
+ """One monthly peak-load record, retaining submitted and settled quantities.
+
+ loadType identifies what load measures; unit applies only to that value.
+ Relative differences retain the original dimensionless cell values. The SIS
+ report column has no explicit unit in these sources and is not rescaled.
+ Total rows are retained; an unlabeled source total has entity=None.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ timestamp: datetime
+ entity: str | None
+ entityCode: str | None
+ duns: str | None
+ controlArea: str | None
+ loadType: Literal["submitted", "coincident_peak", "load_responsibility"]
+ load: Decimal | None
+ unit: Literal["kW", "MW"]
+ energyMWh: Decimal | None = None
+ gsuLossesKW: Decimal | None = None
+ transmissionLossesKW: Decimal | None = None
+ controlAreaTotalKW: Decimal | None = None
+ demandReportMW: Decimal | None = None
+ demandReportDifferenceMW: Decimal | None = None
+ demandReportRelativeDifference: Decimal | None = None
+ sisLoadReport: Decimal | None = None
+ sisDifferenceMW: Decimal | None = None
+ sisRelativeDifference: Decimal | None = None
+ lossAdjustmentPercent: Decimal | None = None
+ loadAtDeliveryPointKW: Decimal | None = None
+ vamoLossPercent: Decimal | None = None
+ loadResponsibilityKW: Decimal | None = None
+ settlementRun: PeakSettlementRun | None
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+ sourceHeading: str
+ sourceHeaders: list[str]
+ sourceNotes: list[str]
+ sourceRowNote: str | None
+
+
+class CoincidentPeakDay(BaseModel):
+ """Daily 4CP source energy, preserving each published settlement version.
+
+ Includes ERCOT and individual entities without summing them. Source channel
+ and stage are retained separately; neither proves public availability time.
+ Energy stays in MWh and is not converted into peak MW or allocation shares.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ entity: str
+ settlement: Literal["INITIAL", "FINAL"]
+ channel: int
+ intervals: list[EnergyInterval]
+ sourceUnitHeader: str
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+ sourceFile: PublicFile | None = None
+
+
+class CoincidentPeaks:
+ """Public historical 4CP files, independently of MIS and API credentials."""
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def download(self, file: PublicFile | None = None) -> bytes:
+ """Download a daily source file, or the original 1996–2020 archive."""
+ response = self._http.get(file.url if file else URL, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+ def daily_files(self) -> list[PublicFile]:
+ """Discover daily 4CP source workbooks in all public aggregation indexes."""
+ return _year_files(
+ self._http,
+ "https://www.ercot.com/mktinfo/data_agg",
+ r"\d{4} Four Coincident Peak \(4CP\) Source Data",
+ )
+
+ def daily(
+ self,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[CoincidentPeakDay], bool] | None = None,
+ ) -> Iterator[CoincidentPeakDay]:
+ """Read daily source energy with inclusive dates and a typed predicate."""
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for file in self.daily_files():
+ yield from self.read_daily(
+ self.download(file),
+ filename=file.url.rsplit("/", 1)[-1],
+ source_file=file,
+ date_from=date_from,
+ date_to=date_to,
+ where=where,
+ )
+
+ def read_daily(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ source_file: PublicFile | None = None,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[CoincidentPeakDay], bool] | None = None,
+ ) -> Iterator[CoincidentPeakDay]:
+ """Read saved daily workbooks/ZIPs without combining settlement versions."""
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=(), preserve_types=True):
+ units = next(rows, ())
+ if not units or units[0] != "ENERGY UNITS = MWH":
+ continue
+ header = next(rows, ())
+ if sheet not in {"INITIAL", "FINAL"} or header[:3] != (
+ "ENTITY_NAME",
+ "OP_DATE",
+ "SAVECHANNEL",
+ ):
+ raise ValueError(f"{member}/{sheet}: Unknown daily 4CP table")
+ found = True
+ for line, cells in enumerate(rows, 3):
+ if all(v in (None, "") for v in cells):
+ continue
+ stamp = cells[1]
+ if not isinstance(stamp, datetime) or stamp.time() != time():
+ raise ValueError(f"{member}/{sheet}:{line}: Invalid OP_DATE")
+ day = stamp.date()
+ if (date_from and day < date_from) or (date_to and day > date_to):
+ continue
+ record = CoincidentPeakDay.model_validate(
+ {
+ "operatingDay": day,
+ "entity": cells[0],
+ "settlement": sheet,
+ "channel": cells[2],
+ "intervals": [
+ EnergyInterval(
+ interval=i,
+ energyMWh=_number(value),
+ sourceLabel=str(label),
+ )
+ for i, (label, value) in enumerate(
+ zip(header[3:], cells[3:], strict=True), 1
+ )
+ ],
+ "sourceUnitHeader": units[0],
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceRow": line,
+ "sourceFile": source_file,
+ }
+ )
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no daily 4CP source tables")
+
+ def allocations(
+ self,
+ *,
+ year_from: int | None = None,
+ year_to: int | None = None,
+ entity: str | None = None,
+ ) -> Iterator[CoincidentPeakAllocation]:
+ """Stream annual allocation tables, preserving all published revisions.
+
+ Year bounds are inclusive; entity matches the exact source name. Monthly
+ preliminary reports and supporting calculation sheets are separate data.
+ """
+ if year_from is not None and year_to is not None and year_from > year_to:
+ raise ValueError("year_from must not be after year_to")
+ yield from self.read_allocations(
+ self.download(),
+ year_from=year_from,
+ year_to=year_to,
+ entity=entity,
+ )
+
+ def read_allocations(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ year_from: int | None = None,
+ year_to: int | None = None,
+ entity: str | None = None,
+ ) -> Iterator[CoincidentPeakAllocation]:
+ """Read annual allocations from saved ZIP/XLS/XLSX with tinyercot[files]."""
+ if year_from is not None and year_to is not None and year_from > year_to:
+ raise ValueError("year_from must not be after year_to")
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=()):
+ notes: list[str] = []
+ header: tuple[str, ...] | None = None
+ year = 0
+ start = 0
+ for cells in rows:
+ labels = tuple(_text(c) or "" for c in cells)
+ candidate = _header(labels)
+ if candidate is not None:
+ header, start = labels, candidate
+ match = re.search(
+ r"(?:19|20)\d{2}",
+ sheet
+ + " "
+ + " ".join(header)
+ + " "
+ + " ".join(notes)
+ + " "
+ + member.rsplit("/", 1)[-1],
+ )
+ if match is None:
+ raise ValueError(
+ f"{member}/{sheet}: Missing allocation year"
+ )
+ year = int(match[0])
+ found = True
+ continue
+ if not any(c not in (None, "") for c in cells):
+ continue
+ summary = start == -1
+ entity_index = 0 if start in (-1, 11) else 1
+ name = (
+ _text(cells[entity_index])
+ if len(cells) > entity_index
+ else None
+ )
+ loads = cells[2:3] if summary else cells[start : start + 5]
+ if (
+ header is None
+ or not name
+ or len(cells) <= (7 if summary else start + 4)
+ or not any(
+ isinstance(value, (int, float, Decimal)) for value in loads
+ )
+ ):
+ if any(
+ isinstance(c, str) and c.strip() for c in cells
+ ) and not any(
+ isinstance(c, (int, float, Decimal)) for c in cells
+ ):
+ notes.append(
+ " | ".join(str(c) for c in cells if c not in (None, ""))
+ )
+ continue
+ if (
+ (year_from is not None and year < year_from)
+ or (year_to is not None and year > year_to)
+ or (entity is not None and name != entity)
+ ):
+ continue
+ legacy = start == 11
+ adjusted = (
+ not legacy
+ and len(header) > 11
+ and "Loss Adjustment" in header[7]
+ )
+ unit: Literal["kW", "MW"] = (
+ "kW" if legacy or any("kW" in h for h in header) else "MW"
+ )
+ share = (
+ 7 if summary else 8 if legacy else 11 if adjusted else start + 5
+ )
+ values: dict[str, object] = {
+ "year": year,
+ "kind": "comparison"
+ if sheet == "Comparison"
+ else "revision_detail"
+ if sheet == "Revision_Details"
+ else "allocation",
+ "entity": name,
+ "entityCode": None if legacy or summary else _text(cells[0]),
+ "duns": _text(cells[2]) if start == 3 else None,
+ "controlArea": _text(cells[1])
+ if summary
+ else _text(cells[12])
+ if adjusted and header[12] == "CA Acronym"
+ else None,
+ "unit": unit,
+ "adjustmentUnit": "factor"
+ if legacy
+ else "percent"
+ if adjusted or summary
+ else None,
+ "peaks": []
+ if summary
+ else [
+ CoincidentPeak(
+ month=i + 6,
+ load=_number(cells[start + i]),
+ timestamp=_clock(header[start + i]),
+ sourceHeader=header[start + i],
+ )
+ for i in range(4)
+ ],
+ "averageLoad": _number(
+ cells[2]
+ if summary
+ else cells[1]
+ if legacy
+ else cells[start + 4]
+ ),
+ "loadRatioShare": _number(cells[share])
+ if len(cells) > share
+ else None,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceSection": notes[-1] if notes else None,
+ "sourceHeaders": list(header),
+ "sourceNotes": list(notes),
+ }
+ if legacy:
+ for field, column in zip(
+ (
+ "gsuLosses",
+ "netGeneration",
+ "lossAdjustmentFactor",
+ "loadAtDeliveryPoint",
+ "vamoLossAllocation",
+ "loadResponsibility",
+ ),
+ range(2, 8),
+ strict=True,
+ ):
+ values[field] = _number(cells[column])
+ elif adjusted or summary:
+ for field, column in zip(
+ (
+ "lossAdjustmentFactor",
+ "loadAtDeliveryPoint",
+ "vamoLossAllocation",
+ "loadResponsibility",
+ ),
+ range(3, 7) if summary else range(7, 11),
+ strict=True,
+ ):
+ values[field] = _number(cells[column])
+ for label, field in (
+ ("Old Load Ratio Share", "oldLoadRatioShare"),
+ ("DIFFERENCES", "loadRatioShareDifference"),
+ ):
+ if label in header:
+ values[field] = _number(cells[header.index(label)])
+ yield CoincidentPeakAllocation.model_validate(values)
+ if not found:
+ raise ValueError("Download contains no annual 4CP allocation tables")
+
+ def monthly(
+ self,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ entity: str | None = None,
+ ) -> Iterator[MonthlyCoincidentPeak]:
+ """Stream monthly peak tables with inclusive peak dates and exact entity.
+
+ Revisions and repeated publications remain separate. Source worksheet
+ names are not used to infer the peak month or the settlement-run date.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ yield from self.read_monthly(
+ self.download(), date_from=date_from, date_to=date_to, entity=entity
+ )
+
+ def read_monthly(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ date_from: date | None = None,
+ date_to: date | None = None,
+ entity: str | None = None,
+ ) -> Iterator[MonthlyCoincidentPeak]:
+ """Decode saved monthly peak-load reports with tinyercot[files].
+
+ Blank cells and the source's dash placeholders become None, not zero.
+ Annual allocations use read_allocations().
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=()):
+ heading: str | None = None
+ header: tuple[str, ...] | None = None
+ columns: dict[str, int] = {}
+ notes: list[str] = []
+ pending: list[str] = []
+ batch: list[dict[str, object]] = []
+ for row_number, cells in enumerate(rows, 1):
+ labels = tuple(_text(c) or "" for c in cells)
+ new_heading = next(
+ (
+ c
+ for c in labels
+ if re.match(
+ r"(?:Integrated Peak Hour Demand|Peak Interval Demand|Peak Demand on)\b",
+ c,
+ re.IGNORECASE,
+ )
+ ),
+ None,
+ )
+ if new_heading:
+ if heading is not None and header is None:
+ raise ValueError(
+ f"{member}/{sheet}: Missing monthly peak columns"
+ )
+ yield from _monthly_rows(batch, notes)
+ batch = []
+ heading, header = new_heading, None
+ notes, pending = pending, []
+ continue
+ if _header(labels) is not None:
+ yield from _monthly_rows(batch, notes)
+ batch = []
+ heading, header = None, None
+ continue
+ mapping = _monthly_columns(labels) if heading else None
+ if mapping and heading is not None:
+ header, columns = labels, mapping
+ stamp = _peak_clock(heading)
+ run = _settlement_run(heading)
+ load_type = (
+ "submitted"
+ if "gsuLossesKW" in columns
+ else "coincident_peak"
+ if "lossAdjustmentPercent" in columns
+ else "load_responsibility"
+ )
+ unit = "MW" if "energyMWh" in columns else "kW"
+ found = True
+ continue
+ if header is None:
+ if any(labels) and not any(
+ isinstance(c, (int, float)) for c in cells
+ ):
+ (notes if heading else pending).append(
+ " | ".join(c for c in labels if c)
+ )
+ continue
+ names = (
+ 0 if columns["load"] == 2 and load_type == "submitted" else 1
+ )
+ name = _text(cells[names]) if len(cells) > names else None
+ if unit == "MW" and cells and cells[0] == "Total":
+ name = "Total"
+ numbers = [cells[i] for i in columns.values() if i < len(cells)]
+ unnamed_total = (
+ name is None
+ and columns["load"] < len(cells)
+ and isinstance(cells[columns["load"]], (int, float, Decimal))
+ )
+ if (not name and not unnamed_total) or not any(
+ isinstance(v, (int, float, Decimal)) or v == "-"
+ for v in numbers
+ ):
+ if any(labels) and not any(
+ isinstance(c, (int, float)) for c in cells
+ ):
+ note = " | ".join(c for c in labels if c)
+ (notes if note.startswith("*Note") else pending).append(
+ note
+ )
+ continue
+ if len(cells) <= max(columns.values()):
+ raise ValueError(
+ f"{member}/{sheet}: Truncated monthly peak row"
+ )
+ if (
+ (date_from and stamp.date() < date_from)
+ or (date_to and stamp.date() > date_to)
+ or (entity is not None and name != entity)
+ ):
+ continue
+ payload: dict[str, object] = {
+ key: None
+ if cells[i] == "-" or (name == "Total" and cells[i] == "Total")
+ else _number(cells[i])
+ for key, i in columns.items()
+ }
+ payload.update(
+ timestamp=stamp,
+ entity=name,
+ entityCode=_text(cells[0])
+ if names == 1 and cells[0] != "Total"
+ else None,
+ duns=_text(cells[2]) if unit == "MW" else None,
+ controlArea=_text(cells[names + 1])
+ if load_type == "submitted"
+ else None,
+ loadType=load_type,
+ unit=unit,
+ settlementRun=run,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=row_number,
+ sourceHeading=heading,
+ sourceHeaders=list(header),
+ sourceRowNote=_text(cells[10])
+ if "sisLoadReport" in columns
+ else None,
+ )
+ batch.append(payload)
+ if heading is not None and header is None:
+ raise ValueError(f"{member}/{sheet}: Missing monthly peak columns")
+ yield from _monthly_rows(batch, notes)
+ if not found:
+ raise ValueError("Download contains no monthly peak-load tables")
+
+
+def _monthly_rows(
+ rows: list[dict[str, object]], notes: list[str]
+) -> Iterator[MonthlyCoincidentPeak]:
+ for row in rows:
+ yield MonthlyCoincidentPeak.model_validate({**row, "sourceNotes": notes})
+
+
+def _text(value: object) -> str | None:
+ if value in (None, ""):
+ return None
+ if isinstance(value, float) and value.is_integer():
+ return str(int(value))
+ return " ".join(str(value).split())
+
+
+def _header(cells: tuple[str, ...]) -> int | None:
+ if cells[:3] == ("Load Entity", "Control Area", "Average 4CP Load kW"):
+ return -1
+ for start in (2, 3, 11):
+ if (
+ len(cells) > start + 4
+ and all(
+ cells[start + i].startswith(month) for i, month in enumerate(_MONTHS)
+ )
+ and (
+ "Average 4CP Load" in cells[start + 4]
+ or cells[start + 4] == "4CP Average"
+ )
+ ):
+ return start
+ return None
+
+
+def _clock(header: str) -> datetime | None:
+ match = re.search(r"(\d{1,2}/\d{1,2}/\d{4})\s+(\d{1,2}:\d{2})", header)
+ if match:
+ return datetime.strptime(" ".join(match.groups()), "%m/%d/%Y %H:%M") # noqa: DTZ007 -- source has no offset
+ match = re.fullmatch(r"(\w+ \d{1,2}, \d{4}) @(\d{4})", header)
+ if match:
+ return datetime.strptime(" ".join(match.groups()), "%B %d, %Y %H%M") # noqa: DTZ007 -- source has no offset
+ return None
+
+
+def _monthly_columns(header: tuple[str, ...]) -> dict[str, int] | None:
+ submitted = "Submitted Load kW (does not include GSU losses)"
+ if submitted in header:
+ start = header.index(submitted)
+ if start not in (2, 3):
+ raise ValueError("Unsupported submitted-load columns")
+ fields = (
+ "load",
+ "gsuLossesKW",
+ "transmissionLossesKW",
+ "controlAreaTotalKW",
+ "demandReportMW",
+ "demandReportDifferenceMW",
+ "demandReportRelativeDifference",
+ )
+ mapping = dict(zip(fields, range(start, start + 7), strict=True))
+ if start == 3:
+ mapping.update(
+ sisLoadReport=11, sisDifferenceMW=12, sisRelativeDifference=13
+ )
+ return mapping
+ if (
+ len(header) > 4
+ and header[0].upper() == "TDSP CODE"
+ and re.fullmatch(r"\d{4} Load Responsibility MW", header[3])
+ and header[4].endswith("Load Responsibility MWh")
+ ):
+ return {"load": 3, "energyMWh": 4}
+ if len(header) > 2 and header[0] in {"Load Entity Acronym", "LSE Acronym"}:
+ if re.fullmatch(r"\d{4} Load Responsibility kW", header[2]):
+ return {"load": 2}
+ if any(header[2].startswith(m) for m in _MONTHS) and header[2].endswith(
+ "Load at ERCOT Coincident Peak kW"
+ ):
+ return {
+ "load": 2,
+ "lossAdjustmentPercent": 3,
+ "loadAtDeliveryPointKW": 4,
+ "vamoLossPercent": 5,
+ "loadResponsibilityKW": 6,
+ }
+ return None
+
+
+def _report_date(value: str) -> date | None:
+ if not re.fullmatch(r"\d{1,2}/\d{1,2}/(?:\d{2}|\d{4})", value):
+ return None
+ try:
+ return datetime.strptime( # noqa: DTZ007 -- source date only
+ value, "%m/%d/%Y" if len(value.rsplit("/", 1)[-1]) == 4 else "%m/%d/%y"
+ ).date()
+ except ValueError:
+ return None
+
+
+def _peak_clock(heading: str) -> datetime:
+ match = re.search(
+ r"(\d{1,2}/\d{1,2}/\d{2,4})(?: at interval ending)? (\d{1,2}):(\d{2})",
+ heading,
+ re.IGNORECASE,
+ )
+ day = _report_date(match[1]) if match else None
+ if match is None or day is None:
+ raise ValueError(f"Unsupported monthly peak clock: {heading}")
+ return datetime.combine(day, time(int(match[2]), int(match[3])))
+
+
+def _settlement_run(heading: str) -> PeakSettlementRun | None:
+ match = re.search(
+ r"based on (.*?) settlement run on (\S+)(?: at (\d{1,2}):(\d{2}))?",
+ heading,
+ re.IGNORECASE,
+ )
+ if match is None:
+ return None
+ channel = re.search(r"Channel (\d+)", match[1], re.IGNORECASE)
+ kind = re.search(r"FINAL|INTERIM|TRUE-UP", match[1], re.IGNORECASE)
+ return PeakSettlementRun.model_validate(
+ {
+ "runDate": _report_date(match[2]),
+ "runTime": time(int(match[3]), int(match[4])) if match[3] else None,
+ "sourceDate": match[2],
+ "channel": int(channel[1]) if channel else None,
+ "kind": kind[0].upper() if kind else None,
+ }
+ )
diff --git a/tinyercot/_dashboards.py b/tinyercot/_dashboards.py
index fe2d6506..75ff1932 100644
--- a/tinyercot/_dashboards.py
+++ b/tinyercot/_dashboards.py
@@ -1,11 +1,20 @@
"""Typed public dashboard payloads; source labels and sections are preserved."""
+import re
from datetime import date, datetime
from decimal import Decimal
-from typing import Literal, TypeVar
+from html.parser import HTMLParser
+from typing import Generic, Literal, TypeVar, get_args
import httpx
-from pydantic import BaseModel, ConfigDict, Field, RootModel
+from pydantic import (
+ BaseModel,
+ ConfigDict,
+ Field,
+ RootModel,
+ field_validator,
+ model_validator,
+)
T = TypeVar("T", bound=BaseModel)
@@ -14,6 +23,182 @@ class DashboardModel(BaseModel):
model_config = ConfigDict(extra="forbid")
+class RealTimeConditions(DashboardModel):
+ """Public display readings; lastUpdated has no source UTC offset."""
+
+ lastUpdated: datetime
+ currentFrequency: Decimal = Field(alias="Current Frequency")
+ instantaneousTimeError: Decimal = Field(alias="Instantaneous Time Error")
+ consecutiveBaalExceedances: int = Field(
+ alias="Consecutive BAAL Clock-Minute Exceedances (min)"
+ )
+ actualSystemDemand: Decimal = Field(alias="Actual System Demand")
+ averageNetLoad: Decimal = Field(alias="Average Net Load")
+ totalSystemCapacity: Decimal = Field(
+ alias="Total System Capacity (not including Ancillary Services)"
+ )
+ totalWindOutput: Decimal = Field(alias="Total Wind Output")
+ totalPvgrOutput: Decimal = Field(alias="Total PVGR Output")
+ currentSystemInertia: Decimal = Field(alias="Current System Inertia")
+ dcE: Decimal = Field(alias="DC_E (East)")
+ dcL: Decimal = Field(alias="DC_L (Laredo VFT)")
+ dcN: Decimal = Field(alias="DC_N (North)")
+ dcR: Decimal = Field(alias="DC_R (Railroad)")
+ dcS: Decimal = Field(alias="DC_S (Eagle Pass)")
+
+
+class RealTimeLmp(DashboardModel):
+ settlementPoint: str = Field(alias="Settlement Point")
+ LMP: Decimal = Field(alias="LMP")
+ lmpChange: Decimal | None = Field(alias="5 Min Change to LMP")
+ lmpWithAdder: Decimal = Field(alias="RTRDPA + LMP")
+ lmpWithAdderChange: Decimal = Field(alias="5 Min Change to RTRDPA + LMP")
+
+ @field_validator("lmpChange", mode="before")
+ @classmethod
+ def _unavailable_change(cls, value: object) -> object:
+ return None if value == "-" else value
+
+
+class RealTimeLmpSnapshot(DashboardModel):
+ """Published price components and five-minute changes; timestamp has no offset."""
+
+ lastUpdated: datetime
+ RTRDPA: Decimal
+ data: list[RealTimeLmp]
+
+
+HubOrLoadZone = Literal[
+ "HB_BUSAVG",
+ "HB_HOUSTON",
+ "HB_HUBAVG",
+ "HB_NORTH",
+ "HB_PAN",
+ "HB_SOUTH",
+ "HB_WEST",
+ "LZ_AEN",
+ "LZ_CPS",
+ "LZ_HOUSTON",
+ "LZ_LCRA",
+ "LZ_NORTH",
+ "LZ_RAYBN",
+ "LZ_SOUTH",
+ "LZ_WEST",
+]
+
+
+class RtdInterval(DashboardModel):
+ intervalId: int
+ minutesAhead: int
+ LMP: Decimal
+
+
+class RtdRun(DashboardModel):
+ RTDTimestamp: datetime
+ actualLMP: Decimal
+ intervals: list[RtdInterval]
+
+
+class RtdSnapshot(DashboardModel):
+ """Public RTD display; indicative interval prices include reliability adders."""
+
+ settlementPoint: HubOrLoadZone
+ lastSCEDTimestamp: datetime
+ includesReliabilityAdder: Literal[True] = True
+ data: list[RtdRun]
+
+
+DisplaySeries = TypeVar("DisplaySeries", bound=str)
+AncillaryPriceSeries = Literal["NON-SPIN", "REG-DOWN", "REG-UP", "RRS", "ECRS"]
+ForecastLoadSeries = Literal["NORTH", "SOUTH", "WEST", "HOUSTON", "TOTAL"]
+WeatherLoadSeries = Literal[
+ "COAST",
+ "EAST",
+ "FAR_WEST",
+ "NORTH",
+ "NORTH_C",
+ "SOUTHERN",
+ "SOUTH_C",
+ "WEST",
+ "TOTAL",
+]
+
+
+class MarketDisplayRow(DashboardModel, Generic[DisplaySeries]):
+ """One source period; literal ending labels retain repeated-hour markers."""
+
+ operatingDay: date
+ periodEnding: str
+ values: dict[DisplaySeries, Decimal]
+
+
+class MarketDisplay(DashboardModel, Generic[DisplaySeries]):
+ """Published table, without inferred time zone or repeated-hour flags."""
+
+ operatingDay: date
+ lastUpdated: datetime
+ periodType: Literal["Hour Ending", "Interval Ending"]
+ data: list[MarketDisplayRow[DisplaySeries]]
+
+
+class _DisplayTable(HTMLParser):
+ def __init__(self) -> None:
+ super().__init__()
+ self.operating_day: date | None = None
+ self.values: dict[str, str | datetime] = {}
+ self.cells: list[str] = []
+ self.rows: list[list[str]] = []
+ self.tag: str | None = None
+ self.text = ""
+
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
+ if tag == "input" and dict(attrs).get("id") == "currentDate":
+ self.operating_day = datetime.strptime( # noqa: DTZ007
+ dict(attrs).get("value") or "", "%m/%d/%Y"
+ ).date()
+ if tag == "tr":
+ self.cells = []
+ if tag == "br" and self.tag:
+ self.text += " "
+ classes = (dict(attrs).get("class") or "").split()
+ if (
+ tag in ("td", "th")
+ or (tag == "div" and "schedTime" in classes)
+ or (tag == "option" and "selected" in dict(attrs))
+ ):
+ self.tag, self.text = tag, ""
+
+ def handle_data(self, data: str) -> None:
+ if self.tag:
+ self.text += data
+
+ def handle_endtag(self, tag: str) -> None:
+ if tag == self.tag:
+ text = " ".join(self.text.split())
+ if tag in ("td", "th"):
+ self.cells.append(text)
+ elif tag == "option":
+ self.values["settlementPoint"] = text
+ else:
+ label, timestamp = text.split(": ", 1)
+ key = {
+ "Last Updated": "lastUpdated",
+ "Last Date and Time": "lastUpdated",
+ "Last SCED Date and Time": "lastSCEDTimestamp",
+ }[label]
+ # The public display supplies no UTC offset, including at DST folds.
+ self.values[key] = datetime.strptime( # noqa: DTZ007
+ timestamp,
+ "%b %d, %Y %H:%M:%S"
+ if timestamp.count(":") == 2
+ else "%b %d, %Y %H:%M",
+ )
+ self.tag = None
+ if tag == "tr" and self.cells:
+ self.rows.append(self.cells)
+ self.cells = []
+
+
class FuelMixValues(DashboardModel):
coal_and_lignite: Decimal = Field(alias="Coal and Lignite")
hydro: Decimal = Field(alias="Hydro")
@@ -207,15 +392,15 @@ class WindSolarRow(DashboardModel):
copHslWind: Decimal
stwpf: Decimal
wgrpp: Decimal
- copHslWindDayAhead: Decimal
- stwpfDayAhead: Decimal
- wgrppDayAhead: Decimal
+ copHslWindDayAhead: Decimal | None
+ stwpfDayAhead: Decimal | None
+ wgrppDayAhead: Decimal | None
copHslSolar: Decimal
stppf: Decimal
pvgrpp: Decimal
- copHslSolarDayAhead: Decimal
- stppfDayAhead: Decimal
- pvgrppDayAhead: Decimal
+ copHslSolarDayAhead: Decimal | None
+ stppfDayAhead: Decimal | None
+ pvgrppDayAhead: Decimal | None
timestamp: datetime
epoch: int
@@ -235,9 +420,9 @@ class DemandRow(DashboardModel):
hourEnding: int
dstFlag: str
currentLoadForecast: Decimal
- dayAheadForecast: Decimal
+ dayAheadForecast: Decimal | None = None
currentDayHsl: Decimal | None = None
- dayAheadHsl: Decimal
+ dayAheadHsl: Decimal | None = None
systemLoad: Decimal | None = None
timestamp: datetime
epoch: int
@@ -288,6 +473,165 @@ class AncillarySnapshot(DashboardModel):
lastEcrs: int
+class ScedCapacityRow(DashboardModel):
+ timestamp: datetime
+ epoch: int
+ dstFlag: str
+ increaseGenResESRs: Decimal
+ decreaseGenResESRs: Decimal
+
+
+class ScedCapacityDay(DashboardModel):
+ timestamp: datetime
+ data: list[ScedCapacityRow]
+
+
+class ScedCapacitySnapshot(DashboardModel):
+ lastUpdated: datetime
+ current: ScedCapacityDay
+ previous: ScedCapacityDay
+
+
+class _CapacityGroup(DashboardModel):
+ @model_validator(mode="before")
+ @classmethod
+ def _key_value_table(cls, value: object) -> object:
+ if not isinstance(value, list):
+ return value
+ if not value or value[0] != ["key", "value"]:
+ raise ValueError("Expected a capacity table with key/value headers")
+ fields: dict[str, object] = {}
+ for row in value[1:]:
+ if not isinstance(row, (list, tuple)) or len(row) != 2:
+ raise ValueError("Expected a capacity key/value pair")
+ key, amount = row
+ if not isinstance(key, str) or key in fields:
+ raise ValueError("Capacity keys must be distinct strings")
+ fields[key] = amount
+ return fields
+
+
+class ResponsiveReserveCapability(_CapacityGroup):
+ rrcCapPfrGenEsr: Decimal
+ rrcCapLrWoClr: Decimal
+ rrcCapLr: Decimal
+ rrcCapFfr: Decimal
+ rrcCapFfrEsr: Decimal
+
+
+class ResponsiveReserveAwards(_CapacityGroup):
+ rrAwdGen: Decimal
+ rrAwdNonClr: Decimal
+ rrAwdClr: Decimal
+ rrAwdFfr: Decimal
+
+
+class ContingencyReserveCapability(_CapacityGroup):
+ ecrsCapGen: Decimal
+ ecrsCapNclr: Decimal
+ ecrsCapClr: Decimal
+ ecrsCapQs: Decimal
+ ecrsCapEsr: Decimal
+ ecrsCapDeployedGenLr: Decimal
+
+
+class ContingencyReserveAwards(_CapacityGroup):
+ ecrsAwdGen: Decimal
+ ecrsAwdNonClr: Decimal
+ ecrsAwdClr: Decimal
+ ecrsAwdQs: Decimal
+ ecrsAwdEsr: Decimal
+
+
+class NonSpinReserveCapability(_CapacityGroup):
+ nsrCapOnGenWoEo: Decimal
+ nsrCapOffResWOs: Decimal
+ nsrCapUndeployedLr: Decimal
+ nsrCapOffGen: Decimal
+ nsrCapEsr: Decimal
+
+
+class NonSpinReserveAwards(_CapacityGroup):
+ nsrAwdGenWEo: Decimal
+ nsrAwdGenWOs: Decimal
+ nsrAwdLr: Decimal
+ nsrAwdOffGen: Decimal
+ nsrAwdQs: Decimal
+ nsrAwdAs: Decimal
+
+
+class RegulationCapacity(_CapacityGroup):
+ regUpCap: Decimal
+ regDownCap: Decimal
+ regUpUndeployed: Decimal
+ regDownUndeployed: Decimal
+ regUpDeployed: Decimal
+ regDownDeployed: Decimal
+
+
+class RegulationAwards(_CapacityGroup):
+ regUpAwd: Decimal
+ regDownAwd: Decimal
+
+
+class SystemAvailableCapacity(_CapacityGroup):
+ capClrDecreaseBp: Decimal
+ capClrIncreaseBp: Decimal
+ capWEoIncreaseBp: Decimal
+ capWEoDecreaseBp: Decimal
+ capWoEoIncreaseBp: Decimal
+ capWoEoDecreaseBp: Decimal
+ esrCapWEoIncreaseBp: Decimal
+ esrCapWEoDecreaseBp: Decimal
+ esrCapWoEoIncreaseBp: Decimal
+ esrCapWoEoDecreaseBp: Decimal
+ capIncreaseGenBp: Decimal
+ capDecreaseGenBp: Decimal
+ sumCapResRegUpRrs: Decimal
+ sumCapResRegUpRrsEcrs: Decimal
+ sumCapResRegUpRrsEcrsNsr: Decimal
+
+
+class PhysicalResponsiveCapability(_CapacityGroup):
+ prc: Decimal
+
+
+class OperatingReserveDemandCurveCapacity(_CapacityGroup):
+ rtReserveOnline: Decimal
+ rtReserveOnOffline: Decimal
+
+
+class EmergencyOutageCapacity(_CapacityGroup):
+ telemHslEmr: Decimal
+ telemHslOut: Decimal
+ telemHslOutl: Decimal
+
+
+class AncillaryCapacityData(DashboardModel):
+ responsiveReserveCapabilityGroup: ResponsiveReserveCapability
+ responsiveReserveAwardsGroup: ResponsiveReserveAwards
+ ercotContingencyReserveCapabilityGroup: ContingencyReserveCapability
+ ercotContingencyReserveAwardsGroup: ContingencyReserveAwards
+ nonSpinReserveCapabilityGroup: NonSpinReserveCapability
+ nonSpinReserveAwardsGroup: NonSpinReserveAwards
+ regulationCapacityGroup: RegulationCapacity
+ regulationAwardsGroup: RegulationAwards
+ systemAvailableCapacityGroup: SystemAvailableCapacity
+ ercotWidePhysicalResponsiveCapabilityGroup: PhysicalResponsiveCapability
+ realTimeOperatingReserveDemandCurveCapacityGroup: (
+ OperatingReserveDemandCurveCapacity
+ )
+ emrOutAndOutLCapacityGroup: EmergencyOutageCapacity
+
+
+class AncillaryCapacitySnapshot(DashboardModel):
+ lastUpdated: datetime
+ epoch: int
+ interval: str
+ dstFlag: str
+ data: AncillaryCapacityData
+
+
class CityWeather(DashboardModel):
name: str
y: int
@@ -325,6 +669,197 @@ def fuel_mix(self) -> FuelMixSnapshot:
def grid_conditions(self) -> GridConditionsSnapshot:
return self._get("daily-prc", GridConditionsSnapshot)
+ def _html(self, name: str) -> _DisplayTable:
+ response = self._http.get(f"https://www.ercot.com/content/cdr/html/{name}.html")
+ response.raise_for_status()
+ parser = _DisplayTable()
+ parser.feed(response.text)
+ parser.close()
+ return parser
+
+ def real_time_conditions(self) -> RealTimeConditions:
+ """Read the public system-conditions table, including time error and BAAL."""
+ parser = self._html("real_time_system_conditions")
+ for cells in parser.rows:
+ if len(cells) == 1: # Section heading.
+ continue
+ if len(cells) != 2 or cells[0] in parser.values:
+ raise ValueError("Expected distinct system-condition label/value rows")
+ parser.values[cells[0]] = cells[1]
+ return RealTimeConditions.model_validate(parser.values)
+
+ def real_time_lmps(self, *, hubs_and_zones: bool = False) -> RealTimeLmpSnapshot:
+ """Latest published LMPs, separate reliability adder and five-minute changes."""
+ parser = self._html("hb_lz" if hubs_and_zones else "current_np6788")
+ if len(parser.rows) < 2:
+ raise ValueError("No real-time LMP table in the public display")
+ adder, headers, *rows = parser.rows
+ if (
+ len(adder) != 2
+ or adder[0] != "Price Adders"
+ or not adder[1].startswith("RTRDPA: $")
+ ):
+ raise ValueError("Unrecognized real-time price-adder heading")
+ expected = {field.alias for field in RealTimeLmp.model_fields.values()}
+ if len(headers) != len(expected) or set(headers) != expected:
+ raise ValueError("Unrecognized real-time LMP columns")
+ return RealTimeLmpSnapshot.model_validate(
+ {
+ **parser.values,
+ "RTRDPA": Decimal(adder[1].removeprefix("RTRDPA: $")),
+ "data": [
+ RealTimeLmp.model_validate(dict(zip(headers, row, strict=True)))
+ for row in rows
+ ],
+ }
+ )
+
+ def indicative_prices(
+ self, settlement_point: HubOrLoadZone = "HB_BUSAVG"
+ ) -> RtdSnapshot:
+ """Recent RTD runs and published horizons, including reliability adders."""
+ if settlement_point not in get_args(HubOrLoadZone):
+ raise ValueError("Expected a published hub or load zone")
+ suffix = "" if settlement_point == "HB_BUSAVG" else f"_{settlement_point}"
+ parser = self._html(f"rtd_ind_lmp_lz_hb{suffix}")
+ if parser.values.get("settlementPoint") != settlement_point:
+ raise ValueError(
+ "The RTD display does not match the requested settlement point"
+ )
+ if (
+ not parser.rows
+ or len(parser.rows[0]) < 3
+ or parser.rows[0][:2] != ["RTD Date and Time", "Actual LMP"]
+ ):
+ raise ValueError("No recognized RTD price table in the public display")
+ horizons = []
+ for header in parser.rows[0][2:]:
+ match = re.fullmatch(r"RTD Int (\d+) \(Time\+(\d+)\)", header)
+ if match is None:
+ raise ValueError(f"Unrecognized RTD horizon: {header}")
+ horizons.append((int(match[1]), int(match[2])))
+ runs = []
+ for row in parser.rows[1:]:
+ runs.append(
+ RtdRun(
+ # The source supplies neither an offset nor a repeated-hour flag.
+ RTDTimestamp=datetime.strptime(row[0], "%m/%d/%Y %H:%M:%S"), # noqa: DTZ007
+ actualLMP=Decimal(row[1]),
+ intervals=[
+ RtdInterval(
+ intervalId=index, minutesAhead=minutes, LMP=Decimal(price)
+ )
+ for (index, minutes), price in zip(
+ horizons, row[2:], strict=True
+ )
+ ],
+ )
+ )
+ return RtdSnapshot.model_validate({**parser.values, "data": runs})
+
+ def _market_display(
+ self,
+ name: str,
+ operating_day: date | None,
+ model: type[MarketDisplay[DisplaySeries]],
+ series: tuple[str, ...],
+ period: Literal["Hour Ending", "Interval Ending"],
+ ) -> MarketDisplay[DisplaySeries]:
+ prefix = f"{operating_day:%Y%m%d}_" if operating_day is not None else ""
+ parser = self._html(prefix + name)
+ if operating_day is not None and parser.operating_day != operating_day:
+ raise ValueError("The display does not match the requested operating day")
+ if not parser.rows:
+ raise ValueError("No published market table in the public display")
+ headers, *rows = parser.rows
+ if (
+ headers[:2] != ["Oper Day", period]
+ or len(headers[2:]) != len(series)
+ or set(headers[2:]) != set(series)
+ ):
+ raise ValueError("Unrecognized market display columns")
+ data = []
+ for cells in rows:
+ values = dict(zip(headers, cells, strict=True))
+ day = datetime.strptime(values.pop("Oper Day"), "%m/%d/%Y").date() # noqa: DTZ007
+ if day != parser.operating_day:
+ raise ValueError("Row operating day differs from the display heading")
+ data.append(
+ {
+ "operatingDay": day,
+ "periodEnding": values.pop(period),
+ "values": values,
+ }
+ )
+ return model.model_validate(
+ {
+ "operatingDay": parser.operating_day,
+ "lastUpdated": parser.values.get("lastUpdated"),
+ "periodType": period,
+ "data": data,
+ }
+ )
+
+ def day_ahead_prices(
+ self, operating_day: date | None = None
+ ) -> MarketDisplay[HubOrLoadZone]:
+ """Hourly hub/load-zone settlement prices from the anonymous DAM display."""
+ return self._market_display(
+ "dam_spp",
+ operating_day,
+ MarketDisplay[HubOrLoadZone],
+ get_args(HubOrLoadZone),
+ "Hour Ending",
+ )
+
+ def real_time_prices(
+ self, operating_day: date | None = None
+ ) -> MarketDisplay[HubOrLoadZone]:
+ """Settlement interval prices, including reliability deployment price adders."""
+ return self._market_display(
+ "real_time_spp",
+ operating_day,
+ MarketDisplay[HubOrLoadZone],
+ get_args(HubOrLoadZone),
+ "Interval Ending",
+ )
+
+ def day_ahead_ancillary_prices(
+ self, operating_day: date | None = None
+ ) -> MarketDisplay[AncillaryPriceSeries]:
+ """Hourly DAM clearing prices for the five published ancillary services."""
+ return self._market_display(
+ "dam_mcpc",
+ operating_day,
+ MarketDisplay[AncillaryPriceSeries],
+ get_args(AncillaryPriceSeries),
+ "Hour Ending",
+ )
+
+ def actual_forecast_zone_load(
+ self, operating_day: date | None = None
+ ) -> MarketDisplay[ForecastLoadSeries]:
+ """Hourly actual load by forecast zone and the separately published total."""
+ return self._market_display(
+ "actual_loads_of_forecast_zones",
+ operating_day,
+ MarketDisplay[ForecastLoadSeries],
+ get_args(ForecastLoadSeries),
+ "Hour Ending",
+ )
+
+ def actual_weather_zone_load(
+ self, operating_day: date | None = None
+ ) -> MarketDisplay[WeatherLoadSeries]:
+ """Hourly actual load by weather zone and the separately published total."""
+ return self._market_display(
+ "actual_loads_of_weather_zones",
+ operating_day,
+ MarketDisplay[WeatherLoadSeries],
+ get_args(WeatherLoadSeries),
+ "Hour Ending",
+ )
+
def energy_storage(self) -> EsrSnapshot:
return self._get("energy-storage-resources", EsrSnapshot)
@@ -349,6 +884,16 @@ def system_demand(self) -> DemandSnapshot:
def ancillary_services(self) -> AncillarySnapshot:
return self._get("ancillary-services", AncillarySnapshot)
+ def sced_capacity(self) -> ScedCapacitySnapshot:
+ """Current and previous day capacity to increase/decrease SCED base points, MW."""
+ return self._get("capacity-available-sced", ScedCapacitySnapshot)
+
+ def ancillary_capacity(self) -> AncillaryCapacitySnapshot:
+ """Current reserve capability, awards and available capacity by source group, MW."""
+ return self._get(
+ "ancillary-service-capacity-monitor", AncillaryCapacitySnapshot
+ )
+
def weather_forecast(self) -> list[WeatherForecast]:
return self._get("weather-forecast", WeatherForecasts).root
diff --git a/tinyercot/_distribution_losses.py b/tinyercot/_distribution_losses.py
new file mode 100644
index 00000000..d2573ede
--- /dev/null
+++ b/tinyercot/_distribution_losses.py
@@ -0,0 +1,172 @@
+"""Typed parameters from ERCOT's annual distribution-loss summaries."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date
+from decimal import Decimal
+from time import strptime
+from typing import Literal
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._public_tables import PublicFile, _PublicFiles
+
+
+class DistributionLossCoefficient(BaseModel):
+ """One DSP/code's published formula parameters and ERCOT load baseline.
+
+ year is a filename label, not an effective-date or publication guarantee.
+ Baseline dates describe the load inputs, not the coefficient's effective
+ period. Source titles and formula text remain attached, including conflicts.
+ Parameters and cached baseline values are never recalculated or applied.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ year: int | None
+ tdsp: str
+ lossCode: str
+ formula: Literal["k_adlf", "f1_f2_f3"]
+ f1: Decimal | None = None
+ f2: Decimal | None = None
+ f3: Decimal | None = None
+ tdspAverageIntervalLoadMWh: Decimal | None = None
+ kFactor: Decimal | None = None
+ annualDistributionLossFactor: Decimal | None = None
+ ercotAnnualEnergyMWh: Decimal | None
+ ercotIntervalCount: int | None
+ ercotAverageIntervalLoadMWh: Decimal | None
+ ercotPeakLoadMW: Decimal | None
+ baselineFrom: date | None
+ baselineThrough: date | None
+ sourceBaselinePeriod: str
+ sourceWorkbookTitle: str | None
+ sourceFormula: str
+ sourceMember: str
+ sourceSheet: str
+ sourceColumn: int
+ sourceFile: PublicFile | None = None
+
+
+class DistributionLossCoefficients(_PublicFiles):
+ """Read summary workbooks in the public methodology bundles with [files]."""
+
+ index_url = "https://www.ercot.com/mktinfo/metering/dlfmethodology"
+ title_pattern = r"\d{4}.*TDSP Distribution Los[st] Factors.*Methodology.*"
+
+ def rows(
+ self, *, where: Callable[[DistributionLossCoefficient], bool] | None = None
+ ) -> Iterator[DistributionLossCoefficient]:
+ for file in self.files():
+ yield from self.read(self.download(file), source_file=file, where=where)
+
+ def read(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ source_file: PublicFile | None = None,
+ where: Callable[[DistributionLossCoefficient], bool] | None = None,
+ ) -> Iterator[DistributionLossCoefficient]:
+ """Read individual summaries or original ZIPs; preserve period variants."""
+ found = False
+ for member, content in _workbooks(data):
+ if member in {"workbook.xls", "workbook.xlsx"}:
+ member = filename
+ elif not re.search(
+ r"(?:^|/)ERCOT.*DLF.*Summary[^/]*\.xlsx?$", member, re.IGNORECASE
+ ):
+ continue
+ tables = {
+ name: list(rows)
+ for name, rows in _sheets(content, date_columns=(), preserve_types=True)
+ }
+ for sheet, rows in tables.items():
+ if sheet != "TDSP and ERCOT Variables":
+ continue
+ found = True
+ start = tables.get("Start", [])
+ for record in _parameters(rows, start, member, sheet, source_file):
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no distribution-loss summary tables")
+
+
+def _baseline_period(label: str) -> tuple[date | None, date | None]:
+ if match := re.fullmatch(r"Year (\d{4})", label.strip()):
+ return date(int(match[1]), 1, 1), date(int(match[1]), 12, 31)
+ try:
+ left, right = label.replace("Sept ", "September ").split(" to ")
+ start = date(*strptime(left.strip(), "%B %d, %Y")[:3])
+ end = date(*strptime(right.strip(), "%B %d, %Y")[:3])
+ if start <= end:
+ return start, end
+ except ValueError:
+ pass
+ return None, None
+
+
+def _parameters(
+ rows: list[tuple[object, ...]],
+ start: list[tuple[object, ...]],
+ member: str,
+ sheet: str,
+ source_file: PublicFile | None,
+) -> Iterator[DistributionLossCoefficient]:
+ column = rows[0].index("DSP =")
+ if rows[1][column] != "DLF Code =":
+ raise ValueError(f"{member}/{sheet}: Missing DLF codes")
+ labels = tuple(str(row[column]).strip() for row in rows[2:5])
+ fields: tuple[str, str, str]
+ family: Literal["k_adlf", "f1_f2_f3"]
+ if labels == ("F1 =", "F2 =", "F3 ="):
+ fields, family = ("f1", "f2", "f3"), "f1_f2_f3"
+ elif labels[0] in {"TDSP AAL (MWH) =", "DSP AAL (MWh) ="} and labels[1:] == (
+ "K factor =",
+ "ADLF =",
+ ):
+ fields, family = (
+ ("tdspAverageIntervalLoadMWh", "kFactor", "annualDistributionLossFactor"),
+ "k_adlf",
+ )
+ else:
+ raise ValueError(f"{member}/{sheet}: Unknown distribution-loss formula columns")
+ base = rows[0].index("ERCOT")
+ period = str(rows[1][base])
+ first, last = _baseline_period(period)
+ baseline = {str(row[base]).strip().upper(): row[base + 1] for row in rows[:6]}
+ notes = [cell for row in start for cell in row if isinstance(cell, str)]
+ title = next(
+ (t for t in notes if t.startswith("ERCOT Distribution Loss Factor")), None
+ )
+ formula = next(t for t in notes if t.startswith("SILF"))
+ year = re.search(r"\d{4}", member.rsplit("/", 1)[-1])
+ for i in range(column + 1, len(rows[0])):
+ if rows[0][i] in (None, ""):
+ continue
+ yield DistributionLossCoefficient.model_validate(
+ {
+ "year": int(year[0]) if year else None,
+ "tdsp": rows[0][i],
+ "lossCode": rows[1][i],
+ "formula": family,
+ **{field: _number(rows[j][i]) for j, field in enumerate(fields, 2)},
+ "ercotAnnualEnergyMWh": _number(baseline["ANNUAL MWH"]),
+ "ercotIntervalCount": baseline["INTERVAL COUNT"],
+ "ercotAverageIntervalLoadMWh": _number(baseline["ERCOT AAL"]),
+ "ercotPeakLoadMW": _number(baseline.get("ERCOT PEAK MW")),
+ "baselineFrom": first,
+ "baselineThrough": last,
+ "sourceBaselinePeriod": period,
+ "sourceWorkbookTitle": title,
+ "sourceFormula": formula,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceColumn": i + 1,
+ "sourceFile": source_file,
+ }
+ )
diff --git a/tinyercot/_energy.py b/tinyercot/_energy.py
new file mode 100644
index 00000000..6844be53
--- /dev/null
+++ b/tinyercot/_energy.py
@@ -0,0 +1,19 @@
+"""Source interval energy quantities shared by public workbook readers."""
+
+from decimal import Decimal
+
+from pydantic import BaseModel, ConfigDict
+
+
+class EnergyInterval(BaseModel):
+ """One original interval column in MWh, with its position and source label.
+
+ Labels can be clock endings (including 24:00) or numbered intervals. Neither
+ establishes a UTC timestamp. Missing source values remain None. A missing label means the source row
+ extends beyond its interval headers; no clock is inferred.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ interval: int
+ energyMWh: Decimal | None
+ sourceLabel: str | None
diff --git a/tinyercot/_forecast_performance.py b/tinyercot/_forecast_performance.py
new file mode 100644
index 00000000..7b1b491a
--- /dev/null
+++ b/tinyercot/_forecast_performance.py
@@ -0,0 +1,306 @@
+"""Published hourly load forecasts, actuals and separate error summaries."""
+
+from __future__ import annotations
+
+from collections.abc import Callable, Iterator
+from datetime import datetime, time
+from decimal import Decimal
+from typing import Literal
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._load_forecasts import _ForecastRow, _ForecastTable
+from ._public_tables import PublicFile
+from ._weather import WeatherZone
+
+_REGIONS: dict[str, WeatherZone | Literal["ERCOT"]] = {
+ "coast": "COAST",
+ "east": "EAST",
+ "farwest": "FWEST",
+ "north": "NORTH",
+ "ncent": "NCENT",
+ "northcentral": "NCENT",
+ "scent": "SCENT",
+ "southcentral": "SCENT",
+ "south": "SOUTH",
+ "west": "WEST",
+ "ercot": "ERCOT",
+}
+_OLD = (
+ "HE",
+ "Actual",
+ "Selected ",
+ "A3",
+ "A6",
+ "E",
+ "E1",
+ "E2",
+ "E3",
+ "M",
+ None,
+ "HE",
+ "Hour",
+ "Hourly Error",
+ "Under",
+ "Over",
+ "Freq Under",
+ "Freq Over",
+ "MAPE",
+)
+_NEW = (
+ "Date & Time",
+ "Actual",
+ "Selected",
+ "E",
+ "E1",
+ "E2",
+ "E3",
+ "M",
+ "X",
+ None,
+ "Hour",
+ "Error",
+ "Under",
+ "Over",
+)
+_FIELDS = {
+ "Actual": "actual",
+ "Selected": "selected",
+ "Hour": "sourceHour",
+ "Hourly Error": "error",
+ "Error": "error",
+ "Under": "under",
+ "Over": "over",
+ "Freq Under": "frequencyUnder",
+ "Freq Over": "frequencyOver",
+ "MAPE": "mape",
+}
+
+
+class _PerformanceRow(_ForecastRow):
+ region: WeatherZone | Literal["ERCOT"]
+ sourceMarkers: dict[str, str]
+
+
+class LoadForecastPerformanceHour(_PerformanceRow):
+ """Source model codes and published errors, without inferred issue times."""
+
+ timestamp: datetime | None
+ sourceHour: Decimal | None
+ errorTimestamp: datetime | None
+ hour: int | None
+ actual: Decimal | None
+ selected: Decimal | None
+ A3: Decimal | None = None
+ A6: Decimal | None = None
+ E: Decimal | None
+ E1: Decimal | None
+ E2: Decimal | None
+ E3: Decimal | None
+ M: Decimal | None
+ X: Decimal | None = None
+ error: Decimal | None
+ under: Decimal | None
+ over: Decimal | None
+ frequencyUnder: int | None = None
+ frequencyOver: int | None = None
+ mape: Decimal | None = None
+
+
+class LoadForecastErrorSummary(_PerformanceRow):
+ """A published summary block; its bucket is not the adjacent hourly date."""
+
+ kind: Literal["average_error", "frequency", "monthly_mape"]
+ hour: int | None
+ sourceBucket: str
+ under: Decimal | None = None
+ over: Decimal | None = None
+ frequencyUnder: int | None = None
+ frequencyOver: int | None = None
+ mape: Decimal | None = None
+ sourceColumn: int
+
+
+def _value(value: object, field: str, markers: dict[str, str]) -> Decimal | None:
+ try:
+ return _number(value)
+ except ValueError:
+ if not isinstance(value, str):
+ raise
+ markers[field] = value
+ return None
+
+
+def _clock(value: object, field: str, markers: dict[str, str]) -> datetime | None:
+ if value in (None, ""):
+ return None
+ if isinstance(value, datetime):
+ return value
+ if isinstance(value, time):
+ markers[field] = value.isoformat()
+ return None
+ if value == 0:
+ markers[field] = "0"
+ return None
+ for fmt in ("%d%b%Y:%H:%M:%S", "%m/%d/%Y %H:%M"):
+ try:
+ return datetime.strptime(str(value), fmt) # noqa: DTZ007
+ except ValueError:
+ pass
+ raise ValueError(f"Invalid forecast metric timestamp: {value!r}")
+
+
+class LoadForecastPerformance(_ForecastTable[LoadForecastPerformanceHour]):
+ title_pattern = r".*(?:Metrics|Metrtics|Backcast).*"
+ extensions = (".xlsx",)
+
+ def files(self) -> list[PublicFile]:
+ # Jan/Feb 2026 hourly metric files have misleading Backcast link titles.
+ return [
+ f for f in super().files() if "metrics" in f.url.rsplit("/", 1)[-1].lower()
+ ]
+
+ def _tables(
+ self, data: bytes, filename: str
+ ) -> Iterator[tuple[str, str, bool, Iterator[tuple[object, ...]]]]:
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=()):
+ header = next(rows, ())
+ modern = header[: len(_NEW)] == _NEW
+ if not modern and header[: len(_OLD)] != _OLD:
+ raise ValueError(
+ f"{member}/{sheet}: unknown forecast metric columns"
+ )
+ if sheet.lower().replace(" ", "") not in _REGIONS:
+ raise ValueError(
+ f"{member}/{sheet}: unknown forecast metric region"
+ )
+ yield (
+ member,
+ sheet,
+ modern,
+ (tuple(row) + (None,) * max(0, 34 - len(row)) for row in rows),
+ )
+
+ def _read(
+ self, data: bytes, filename: str
+ ) -> Iterator[LoadForecastPerformanceHour]:
+ found = False
+ for member, sheet, modern, rows in self._tables(data, filename):
+ header = _NEW if modern else _OLD
+ for line, values in enumerate(rows, 2):
+ if not any(v not in (None, "") for v in values[: len(header)]):
+ continue
+ markers: dict[str, str] = {}
+ numbers = {
+ _FIELDS.get(label.strip(), label.strip()): _value(
+ values[i], _FIELDS.get(label.strip(), label.strip()), markers
+ )
+ for i, label in enumerate(header)
+ if label and label not in ("HE", "Date & Time")
+ }
+ source_hour = numbers["sourceHour"]
+ hour = (
+ int(source_hour)
+ if source_hour is not None
+ and 1 <= source_hour <= 24
+ and source_hour == int(source_hour)
+ else None
+ )
+ clock = _clock(values[0], "timestamp", markers)
+ error_clock = (
+ None if modern else _clock(values[11], "errorTimestamp", markers)
+ )
+ found = True
+ yield LoadForecastPerformanceHour.model_validate(
+ {
+ **numbers,
+ "timestamp": clock,
+ "hour": hour,
+ "errorTimestamp": error_clock,
+ "region": _REGIONS[sheet.lower().replace(" ", "")],
+ "sourceMarkers": markers,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceRow": line,
+ }
+ )
+ if not found:
+ raise ValueError("No hourly forecast performance rows found")
+
+ def summaries(
+ self, *, where: Callable[[LoadForecastErrorSummary], bool] | None = None
+ ) -> Iterator[LoadForecastErrorSummary]:
+ for file in self.files():
+ for row in self.read_summaries(
+ self.download(file), filename=file.url.rsplit("/", 1)[-1]
+ ):
+ row.sourceFile = file
+ if where is None or where(row):
+ yield row
+
+ def read_summaries(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ where: Callable[[LoadForecastErrorSummary], bool] | None = None,
+ ) -> Iterator[LoadForecastErrorSummary]:
+ found = False
+ for member, sheet, modern, rows in self._tables(data, filename):
+ region = _REGIONS[sheet.lower().replace(" ", "")]
+ average = 15 if modern else 31 if region == "ERCOT" else 25
+ chart_kind = "average_error"
+ for line, values in enumerate(rows, 2):
+ if not modern and values[average] in ("Hour", "HE"):
+ chart_kind = (
+ "frequency" if values[average] == "HE" else "average_error"
+ )
+ blocks = [(chart_kind, average)]
+ if modern:
+ blocks.append(("frequency", 19))
+ elif len(values) > 19 and values[19] not in (None, ""):
+ blocks.append(("monthly_mape", 19))
+ for kind, column in blocks:
+ value = values[column] if column < len(values) else None
+ if value in (None, "", "Hour", "HE"):
+ continue
+ markers: dict[str, str] = {}
+ if kind == "monthly_mape":
+ numbers = {"mape": _value(value, "mape", markers)}
+ bucket = "Monthly"
+ else:
+ fields = (
+ ("frequencyUnder", "frequencyOver")
+ if kind == "frequency"
+ else ("under", "over")
+ )
+ numbers = {
+ field: _value(values[column + i], field, markers)
+ for i, field in enumerate(fields, 1)
+ }
+ bucket = str(value)
+ row = LoadForecastErrorSummary.model_validate(
+ {
+ **numbers,
+ "kind": kind,
+ "sourceBucket": bucket,
+ "hour": int(value)
+ if kind != "monthly_mape"
+ and isinstance(value, (int, float))
+ and value == int(value)
+ else None,
+ "region": region,
+ "sourceMarkers": markers,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceRow": line,
+ "sourceColumn": column + 1,
+ }
+ )
+ found = True
+ if where is None or where(row):
+ yield row
+ if not found:
+ raise ValueError("No forecast performance summaries found")
diff --git a/tinyercot/_fuel_mix.py b/tinyercot/_fuel_mix.py
new file mode 100644
index 00000000..971cb5e9
--- /dev/null
+++ b/tinyercot/_fuel_mix.py
@@ -0,0 +1,412 @@
+"""Public settlement fuel-mix workbooks, including the pre-API annual archive."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from datetime import date, datetime, time, timedelta
+from decimal import Decimal
+from html.parser import HTMLParser
+from time import strptime
+from typing import Literal
+from urllib.parse import urljoin, urlsplit
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+
+INDEX_URL = "https://www.ercot.com/gridinfo/generation"
+_MONTHS = (
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec",
+)
+
+
+class FuelMixArchive(BaseModel):
+ """A linked file; year bounds describe its index label."""
+
+ yearFrom: int
+ yearTo: int
+ title: str
+ url: str
+
+
+class FuelMixInterval(BaseModel):
+ """One published column; midnight ends the operating day.
+
+ DST-labelled columns remain in their original position, including blank
+ cells on ordinary days. No UTC offset or chronological ordering is inferred.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ ending: time | None
+ dst: bool
+ sourceHeader: str
+ sourceColumn: int
+ energyMWh: Decimal | None
+ sourceError: Literal["1/0/1900 0:00", "1.00E", "6.00E"] | None = None
+
+
+class FuelMixDay(BaseModel):
+ """A source row for one fuel/day, with its total and ordered interval cells."""
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ fuel: str
+ settlementType: Literal["INITIAL", "FINAL"] | None
+ totalMWh: Decimal | None
+ intervals: list[FuelMixInterval]
+ sourceMember: str
+ sourceSheet: str
+
+
+class FuelMixTotal(BaseModel):
+ """A printed monthly or annual total; month=None denotes the annual/YTD column."""
+
+ model_config = ConfigDict(extra="forbid")
+ year: int
+ month: int | None
+ fuel: str | None
+ energy: Decimal | None
+ unit: Literal["MWh", "GWh"]
+ sourcePeriod: str
+ sourceMember: str
+ sourceSheet: str
+
+
+class _Links(HTMLParser):
+ def __init__(self) -> None:
+ super().__init__()
+ self.href: str | None = None
+ self.title = ""
+ self.files: dict[str, FuelMixArchive] = {}
+
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
+ if tag == "a":
+ self.href = dict(attrs).get("href")
+ self.title = ""
+
+ def handle_data(self, data: str) -> None:
+ if self.href is not None:
+ self.title += data
+
+ def handle_endtag(self, tag: str) -> None:
+ if tag != "a" or self.href is None:
+ return
+ title = " ".join(self.title.split())
+ match = re.fullmatch(r"Fuel Mix Report: (\d{4})(?: - (\d{4}))?", title)
+ url = urljoin(INDEX_URL, self.href)
+ parts = urlsplit(url)
+ if (
+ match
+ and parts.scheme == "https"
+ and parts.netloc == "www.ercot.com"
+ and parts.path.startswith("/files/docs/")
+ ):
+ self.files[url] = FuelMixArchive(
+ yearFrom=int(match[1]),
+ yearTo=int(match[2] or match[1]),
+ title=title,
+ url=url,
+ )
+ self.href = None
+
+
+class FuelMix:
+ """Anonymous historical generation by fuel, retaining original fuel labels."""
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def archives(self) -> list[FuelMixArchive]:
+ response = self._http.get(INDEX_URL, follow_redirects=True)
+ response.raise_for_status()
+ links = _Links()
+ links.feed(response.text)
+ if not links.files:
+ raise ValueError("No fuel-mix files found in ERCOT's public index")
+ return sorted(links.files.values(), key=lambda item: (item.yearFrom, item.url))
+
+ def download(self, archive: FuelMixArchive) -> bytes:
+ response = self._http.get(archive.url, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+ def rows(
+ self, *, date_from: date | None = None, date_to: date | None = None
+ ) -> Iterator[FuelMixDay]:
+ """Stream daily fuel rows, filtered by inclusive operating dates.
+
+ Older years share a ZIP download. Original fuel codes and all source
+ columns are retained; missing interval cells are not converted to zero.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for archive in self.archives():
+ if (date_from and archive.yearTo < date_from.year) or (
+ date_to and archive.yearFrom > date_to.year
+ ):
+ continue
+ for name, content in _selected_workbooks(
+ self.download(archive),
+ archive.url.rsplit("/", 1)[-1],
+ date_from.year if date_from else None,
+ date_to.year if date_to else None,
+ ):
+ for row in self.read(content, filename=name):
+ if (date_from is None or row.operatingDay >= date_from) and (
+ date_to is None or row.operatingDay <= date_to
+ ):
+ yield row
+
+ def read(self, data: bytes, *, filename: str = "workbook") -> Iterator[FuelMixDay]:
+ """Read XLS, XLSX or their ZIP archive, using tinyercot[files]."""
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content):
+ if not re.fullmatch(
+ r"(?:" + "|".join(_MONTHS) + r")(?:\d{2}|\d{4})?", sheet
+ ):
+ continue
+ found = True
+ try:
+ yield from _daily(rows, member, sheet)
+ except (ValueError, TypeError) as error:
+ raise ValueError(f"{member}/{sheet}: {error}") from error
+ if not found:
+ raise ValueError("No monthly fuel-mix worksheets found")
+
+ def summaries(
+ self, *, year_from: int | None = None, year_to: int | None = None
+ ) -> Iterator[FuelMixTotal]:
+ """Read printed monthly and annual/YTD totals, with inclusive year bounds."""
+ if year_from is not None and year_to is not None and year_from > year_to:
+ raise ValueError("year_from must not be after year_to")
+ for archive in self.archives():
+ if (year_from is not None and archive.yearTo < year_from) or (
+ year_to is not None and archive.yearFrom > year_to
+ ):
+ continue
+ for name, content in _selected_workbooks(
+ self.download(archive),
+ archive.url.rsplit("/", 1)[-1],
+ year_from,
+ year_to,
+ ):
+ for row in self.read_summaries(content, filename=name):
+ if (year_from is None or row.year >= year_from) and (
+ year_to is None or row.year <= year_to
+ ):
+ yield row
+
+ def read_summaries(
+ self, data: bytes, *, filename: str = "workbook"
+ ) -> Iterator[FuelMixTotal]:
+ """Read published totals; standalone modern XLSX needs its original filename."""
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content):
+ monthly = sheet[:3] in _MONTHS
+ if not monthly and not re.fullmatch(
+ r"Summary|\d{4}(?: Summary)?", sheet
+ ):
+ continue
+ found = True
+ year = re.search(r"(?:19|20)\d{2}", sheet + " " + member)
+ if year is None:
+ raise ValueError(
+ "Supply the original filename to identify the summary year"
+ )
+ if monthly:
+ total, _ = _columns(next(rows, ()))
+ for row in rows:
+ if _unlabelled_total(row, total):
+ yield FuelMixTotal(
+ year=int(year[0]),
+ month=_MONTHS.index(sheet[:3]) + 1,
+ fuel=None,
+ energy=_number(row[total]),
+ unit="MWh",
+ sourcePeriod=sheet,
+ sourceMember=member,
+ sourceSheet=sheet,
+ )
+ else:
+ yield from _totals(rows, int(year[0]), member, sheet)
+ if not found:
+ raise ValueError("No fuel-mix summary worksheet found")
+
+
+def _selected_workbooks(
+ data: bytes, filename: str, year_from: int | None, year_to: int | None
+) -> Iterator[tuple[str, bytes]]:
+ for member, content in _workbooks(data):
+ name = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ match = re.fullmatch(
+ r"IntGenByFuel(\d{4})\.xlsx?", name.rsplit("/", 1)[-1], re.IGNORECASE
+ )
+ if match and (
+ (year_from is not None and int(match[1]) < year_from)
+ or (year_to is not None and int(match[1]) > year_to)
+ ):
+ continue
+ yield name, content
+
+
+def _clock(value: object) -> tuple[time | None, bool, str]:
+ if re.fullmatch(r"DST\d+", str(value), re.IGNORECASE):
+ return None, True, str(value)
+ if isinstance(value, datetime):
+ return value.time(), False, str(value)
+ if isinstance(value, timedelta):
+ ending, dst, _ = _clock(value.total_seconds() / 86400)
+ return ending, dst, str(value)
+ if isinstance(value, (int, float)):
+ minutes = round(value * 1440)
+ if not 0 <= minutes <= 1440 or abs(value * 1440 - minutes) > 0.001:
+ raise ValueError(f"Unsupported interval header: {value!r}")
+ value = time(minutes // 60 % 24, minutes % 60)
+ if isinstance(value, time):
+ return value, False, value.strftime("%H:%M")
+ match = re.fullmatch(r"(\d{1,2}):(\d{2})(?: \(?(DST)\)?)?", str(value).strip())
+ if match:
+ return time(int(match[1]), int(match[2])), bool(match[3]), str(value)
+ raise ValueError(f"Unsupported interval header: {value!r}")
+
+
+def _columns(header: tuple[object, ...]) -> tuple[int, int | None]:
+ names = [str(v).strip() if v is not None else "" for v in header]
+ if names[:4] in (
+ ["Date", "Fuel", "Settlement Type", "Total"],
+ ["Date", "Fuel Type", "Settlement Type", "Total"],
+ ):
+ total, settlement = 3, 2
+ elif names[:3] == ["Date", "Fuel", "Total"]:
+ total, settlement = 2, None
+ elif names[0] in {"Date - Fuel", "Date-Fuel", "DateFuel"} and names[1] in {
+ "Daily MWH",
+ "Total",
+ }:
+ total, settlement = 1, None
+ else:
+ raise ValueError(f"Unsupported fuel-mix header: {names[:4]}")
+ return total, settlement
+
+
+def _unlabelled_total(row: tuple[object, ...], total: int) -> bool:
+ return (
+ len(row) > total
+ and row[total] not in (None, "")
+ and all(value in (None, "") for i, value in enumerate(row) if i != total)
+ )
+
+
+def _daily(
+ rows: Iterator[tuple[object, ...]], member: str, sheet: str
+) -> Iterator[FuelMixDay]:
+ header = next(rows, ())
+ total, settlement = _columns(header)
+ columns = {
+ i: _clock(v) for i, v in enumerate(header) if i > total and v not in (None, "")
+ }
+ for row in rows:
+ if all(v in (None, "") for v in row) or _unlabelled_total(row, total):
+ continue
+ if total == 1:
+ match = re.fullmatch(r"(\d{2}/\d{2}/\d{2})\s*[-_]\s*(.+)", str(row[0]))
+ if not match:
+ raise ValueError(f"Unsupported date/fuel label: {row[0]!r}")
+ day, fuel = date(*strptime(match[1], "%m/%d/%y")[:3]), match[2]
+ else:
+ if not isinstance(row[0], (date, datetime)):
+ raise ValueError(f"Unsupported operating date: {row[0]!r}")
+ day = row[0].date() if isinstance(row[0], datetime) else row[0]
+ fuel = str(row[1])
+ intervals = []
+ indices = set(columns) | {
+ i for i in range(total + 1, len(row)) if row[i] not in (None, "")
+ }
+ for i in sorted(indices):
+ ending, dst, label = columns.get(i, (None, False, ""))
+ value = row[i] if i < len(row) else None
+ error = value if value in {"1/0/1900 0:00", "1.00E", "6.00E"} else None
+ intervals.append(
+ FuelMixInterval.model_validate(
+ {
+ "ending": ending,
+ "dst": dst,
+ "sourceHeader": label,
+ "sourceColumn": i + 1,
+ "energyMWh": None if error else _number(value),
+ "sourceError": error,
+ }
+ )
+ )
+ yield FuelMixDay.model_validate(
+ {
+ "operatingDay": day,
+ "fuel": fuel,
+ "settlementType": row[settlement] if settlement is not None else None,
+ "totalMWh": _number(row[total]),
+ "intervals": intervals,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ }
+ )
+
+
+def _totals(
+ rows: Iterator[tuple[object, ...]], year: int, member: str, sheet: str
+) -> Iterator[FuelMixTotal]:
+ header = next(
+ (r for r in rows if r and r[0] in {"Fuel Totals", "Energy, GWh"}), None
+ )
+ if header is None:
+ raise ValueError(f"{member}/{sheet}: Missing fuel-mix summary header")
+ unit = "GWh" if header[0] == "Energy, GWh" else "MWh"
+ columns: list[tuple[int, int | None, str]] = []
+ for i, value in enumerate(header[1:], 1):
+ if value in (None, ""):
+ continue
+ label = str(value)
+ if label.rstrip("*") in _MONTHS:
+ month = _MONTHS.index(label.rstrip("*")) + 1
+ elif label == "Total" or re.fullmatch(r"(?:\d{4} )?MWH", label):
+ month = None
+ else:
+ raise ValueError(f"Unsupported fuel-mix period: {label}")
+ columns.append((i, month, label))
+ for row in rows:
+ if (
+ not row
+ or row[0] in (None, "")
+ or not any(i < len(row) and row[i] not in (None, "") for i, _, _ in columns)
+ ):
+ continue
+ for i, month, label in columns:
+ yield FuelMixTotal.model_validate(
+ {
+ "year": year,
+ "month": month,
+ "fuel": str(row[0]),
+ "energy": _number(row[i] if i < len(row) else None),
+ "unit": unit,
+ "sourcePeriod": label,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ }
+ )
diff --git a/tinyercot/_generated.py b/tinyercot/_generated.py
index 53e8a643..fedb66dc 100644
--- a/tinyercot/_generated.py
+++ b/tinyercot/_generated.py
@@ -5,8 +5,125 @@
from decimal import Decimal
from typing import ClassVar
from ._client import Transport, Page, Row
+from ._history import Archive, EiaHour
+from ._xlsx import WorkbookArchive
+from ._pdf import PdfArchive, PdfChartArchive
+
+__all__ = ['Client', 'copg_316', 'eia_930_cd', 'eia_930_er', 'gen_55_cd', 'np1_300', 'np1_301', 'np1_302', 'np1_346_er', 'np3_108', 'np3_161_cd', 'np3_162_cd', 'np3_233_cd', 'np3_257_ex', 'np3_560_cd', 'np3_561_cd', 'np3_562_cd', 'np3_565_cd', 'np3_566_cd', 'np3_763_cd', 'np3_764_cd', 'np3_765_cd', 'np3_906_ex', 'np3_907_ex', 'np3_908_er', 'np3_909_er', 'np3_910_er', 'np3_911_er', 'np3_914_ex', 'np3_915_ex', 'np3_916_ex', 'np3_965_er', 'np3_966_er', 'np3_987_ex', 'np3_988_er', 'np3_990_ex', 'np3_991_ex', 'np4_158_sg', 'np4_159_cd', 'np4_179_cd', 'np4_183_cd', 'np4_188_cd', 'np4_19_cd', 'np4_190_cd', 'np4_191_cd', 'np4_192_cd', 'np4_193_cd', 'np4_194_cd', 'np4_196_m', 'np4_197_m', 'np4_200_cd', 'np4_212_cd', 'np4_213_cd', 'np4_214_cd', 'np4_215_cd', 'np4_231_cd', 'np4_33_cd', 'np4_412_cd', 'np4_442_cd', 'np4_443_cd', 'np4_494_er', 'np4_523_cd', 'np4_532_cd', 'np4_722_cd', 'np4_732_cd', 'np4_733_cd', 'np4_737_cd', 'np4_738_cd', 'np4_742_cd', 'np4_743_cd', 'np4_745_cd', 'np4_746_cd', 'np4_751_cd', 'np4_752_cd', 'np4_765_er', 'np4_790_cd', 'np4_791_cd', 'np5_108_cd', 'np5_520_er', 'np5_525_cd', 'np5_526_cd', 'np5_527_cd', 'np5_528_cd', 'np5_754_cd', 'np5_755_cd', 'np6_235_cd', 'np6_322_cd', 'np6_323_cd', 'np6_324_cd', 'np6_325_cd', 'np6_326_cd', 'np6_327_cd', 'np6_328_cd', 'np6_329_cd', 'np6_331_cd', 'np6_332_cd', 'np6_344_cd', 'np6_345_cd', 'np6_346_cd', 'np6_625_cd', 'np6_626_cd', 'np6_787_cd', 'np6_788_cd', 'np6_792_er', 'np6_793_er', 'np6_794_er', 'np6_795_er', 'np6_796_er', 'np6_86_cd', 'np6_905_cd', 'np6_915_cd', 'np6_970_cd', 'np7_464_cd', 'np7_535_sg']
+class copg_316:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class LoadEstimationCountsHistoryRow(Row):
+ type: str | None
+ region: str | None
+ TDSP: str | None
+ operatingDay: date | None
+ channel: str | None
+ actualCount: int | None
+ historicalEstimatedCount: int | None
+ defaultProfileCount: int | None
+ totalCount: int | None
+ percentActualCount: Decimal | None
+ percentHistoricalEstimatedCount: Decimal | None
+ percentDefaultProfileCount: Decimal | None
+
+ @property
+ def load_estimation_counts_history(self) -> Archive[copg_316.LoadEstimationCountsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'copg-316', copg_316.LoadEstimationCountsHistoryRow, {'TYPE': 'type', 'Region': 'region', 'TDSP': 'TDSP', 'Operating Day': 'operatingDay', 'Channel': 'channel', 'Actual Count': 'actualCount', 'Historical Estimated Count': 'historicalEstimatedCount', 'Default Profile Count': 'defaultProfileCount', 'Total Count': 'totalCount', 'Percent Actual Count': 'percentActualCount', 'Percent Hist Estimated Count': 'percentHistoricalEstimatedCount', 'Percent Default Profile Count': 'percentDefaultProfileCount'}, {'operatingDay': '%d-%b-%y'}, member='*.csv', datetimes={}, variants=())
+
+class eia_930_cd:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class HourlyOperationsHistoryRow(Row):
+ productName: str | None
+ postingType: str | None
+ balancingAuthorityCode: str | None
+ dataType: str | None
+ dataCode: str | None
+ dataDate: date | None
+ UTCOffset: int | None
+ HR1: EiaHour | None
+ HR2: EiaHour | None
+ HR3: EiaHour | None
+ HR4: EiaHour | None
+ HR5: EiaHour | None
+ HR6: EiaHour | None
+ HR7: EiaHour | None
+ HR8: EiaHour | None
+ HR9: EiaHour | None
+ HR10: EiaHour | None
+ HR11: EiaHour | None
+ HR12: EiaHour | None
+ HR13: EiaHour | None
+ HR14: EiaHour | None
+ HR15: EiaHour | None
+ HR16: EiaHour | None
+ HR17: EiaHour | None
+ HR18: EiaHour | None
+ HR19: EiaHour | None
+ HR20: EiaHour | None
+ HR21: EiaHour | None
+ HR22: EiaHour | None
+ HR23: EiaHour | None
+ HR24: EiaHour | None
+ HR25: EiaHour | None
+
+ @property
+ def hourly_operations_history(self) -> Archive[eia_930_cd.HourlyOperationsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'eia-930-cd', eia_930_cd.HourlyOperationsHistoryRow, {'Product_Name': 'productName', 'Posting_Type': 'postingType', 'Balancing_Authority_Code': 'balancingAuthorityCode', 'Data_Type': 'dataType', 'Data_Code': 'dataCode', 'Data_Date': 'dataDate', 'UTC Offset': 'UTCOffset', 'HR1': 'HR1', 'HR2': 'HR2', 'HR3': 'HR3', 'HR4': 'HR4', 'HR5': 'HR5', 'HR6': 'HR6', 'HR7': 'HR7', 'HR8': 'HR8', 'HR9': 'HR9', 'HR10': 'HR10', 'HR11': 'HR11', 'HR12': 'HR12', 'HR13': 'HR13', 'HR14': 'HR14', 'HR15': 'HR15', 'HR16': 'HR16', 'HR17': 'HR17', 'HR18': 'HR18', 'HR19': 'HR19', 'HR20': 'HR20', 'HR21': 'HR21', 'HR22': 'HR22', 'HR23': 'HR23', 'HR24': 'HR24', 'HR25': 'HR25'}, {'dataDate': '%j%Y'}, member='*.csv', datetimes=None, variants=())
+
+class eia_930_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class DailyOperationsHistoryRow(Row):
+ productName: str | None
+ postingType: str | None
+ balancingAuthorityCode: str | None
+ interconnectedBalancingAuthorityCode: str | None = None
+ dataType: str | None
+ dataCode: str | None = None
+ dataDate: date | None = None
+ postedDate: date | None = None
+ UTCOffset: int | None
+ HR1: EiaHour | None
+ HR2: EiaHour | None
+ HR3: EiaHour | None
+ HR4: EiaHour | None
+ HR5: EiaHour | None
+ HR6: EiaHour | None
+ HR7: EiaHour | None
+ HR8: EiaHour | None
+ HR9: EiaHour | None
+ HR10: EiaHour | None
+ HR11: EiaHour | None
+ HR12: EiaHour | None
+ HR13: EiaHour | None
+ HR14: EiaHour | None
+ HR15: EiaHour | None
+ HR16: EiaHour | None
+ HR17: EiaHour | None
+ HR18: EiaHour | None
+ HR19: EiaHour | None
+ HR20: EiaHour | None
+ HR21: EiaHour | None
+ HR22: EiaHour | None
+ HR23: EiaHour | None
+ HR24: EiaHour | None
+ HR25: EiaHour | None
+
+ @property
+ def daily_operations_history(self) -> Archive[eia_930_er.DailyOperationsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'eia-930-er', eia_930_er.DailyOperationsHistoryRow, {'Product_Name': 'productName', 'Posting_Type': 'postingType', 'Balancing_Authority_Code': 'balancingAuthorityCode', 'Data_Type': 'dataType', 'Data_Code': 'dataCode', 'Data_Date': 'dataDate', 'UTC Offset': 'UTCOffset', 'HR1': 'HR1', 'HR2': 'HR2', 'HR3': 'HR3', 'HR4': 'HR4', 'HR5': 'HR5', 'HR6': 'HR6', 'HR7': 'HR7', 'HR8': 'HR8', 'HR9': 'HR9', 'HR10': 'HR10', 'HR11': 'HR11', 'HR12': 'HR12', 'HR13': 'HR13', 'HR14': 'HR14', 'HR15': 'HR15', 'HR16': 'HR16', 'HR17': 'HR17', 'HR18': 'HR18', 'HR19': 'HR19', 'HR20': 'HR20', 'HR21': 'HR21', 'HR22': 'HR22', 'HR23': 'HR23', 'HR24': 'HR24', 'HR25': 'HR25'}, {'dataDate': '%j%Y', 'postedDate': '%j%Y'}, member='*.csv', datetimes=None, variants=({'Survey Name': 'productName', 'Posting Type': 'postingType', 'Balancing Authority Code': 'balancingAuthorityCode', 'Interconnected Balancing Authority Code': 'interconnectedBalancingAuthorityCode', 'Type': 'dataType', 'Posted Date': 'postedDate', 'UTCOffset': 'UTCOffset', 'HR1': 'HR1', 'HR2': 'HR2', 'HR3': 'HR3', 'HR4': 'HR4', 'HR5': 'HR5', 'HR6': 'HR6', 'HR7': 'HR7', 'HR8': 'HR8', 'HR9': 'HR9', 'HR10': 'HR10', 'HR11': 'HR11', 'HR12': 'HR12', 'HR13': 'HR13', 'HR14': 'HR14', 'HR15': 'HR15', 'HR16': 'HR16', 'HR17': 'HR17', 'HR18': 'HR18', 'HR19': 'HR19', 'HR20': 'HR20', 'HR21': 'HR21', 'HR22': 'HR22', 'HR23': 'HR23', 'HR24': 'HR24', 'HR25': 'HR25'},))
-__all__ = ['Client', 'gen_55_cd', 'np1_301', 'np1_302', 'np3_161_cd', 'np3_162_cd', 'np3_233_cd', 'np3_257_ex', 'np3_560_cd', 'np3_561_cd', 'np3_562_cd', 'np3_565_cd', 'np3_566_cd', 'np3_763_cd', 'np3_764_cd', 'np3_765_cd', 'np3_906_ex', 'np3_907_ex', 'np3_908_er', 'np3_909_er', 'np3_910_er', 'np3_911_er', 'np3_914_ex', 'np3_915_ex', 'np3_916_ex', 'np3_965_er', 'np3_966_er', 'np3_987_ex', 'np3_990_ex', 'np3_991_ex', 'np4_158_sg', 'np4_159_cd', 'np4_179_cd', 'np4_183_cd', 'np4_188_cd', 'np4_19_cd', 'np4_190_cd', 'np4_191_cd', 'np4_192_cd', 'np4_193_cd', 'np4_194_cd', 'np4_196_m', 'np4_197_m', 'np4_200_cd', 'np4_212_cd', 'np4_213_cd', 'np4_214_cd', 'np4_215_cd', 'np4_231_cd', 'np4_33_cd', 'np4_412_cd', 'np4_442_cd', 'np4_443_cd', 'np4_523_cd', 'np4_532_cd', 'np4_722_cd', 'np4_732_cd', 'np4_733_cd', 'np4_737_cd', 'np4_738_cd', 'np4_742_cd', 'np4_743_cd', 'np4_745_cd', 'np4_746_cd', 'np4_751_cd', 'np4_752_cd', 'np4_790_cd', 'np4_791_cd', 'np5_108_cd', 'np5_525_cd', 'np5_526_cd', 'np5_527_cd', 'np5_528_cd', 'np5_754_cd', 'np5_755_cd', 'np6_235_cd', 'np6_322_cd', 'np6_323_cd', 'np6_324_cd', 'np6_325_cd', 'np6_326_cd', 'np6_327_cd', 'np6_328_cd', 'np6_329_cd', 'np6_331_cd', 'np6_332_cd', 'np6_344_cd', 'np6_345_cd', 'np6_346_cd', 'np6_625_cd', 'np6_626_cd', 'np6_787_cd', 'np6_788_cd', 'np6_86_cd', 'np6_905_cd', 'np6_915_cd', 'np6_970_cd', 'np7_464_cd']
class gen_55_cd:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -21,6 +138,11 @@ class HrlyRtLoadFcastActualRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def hrly_rt_load_fcast_actual_history(self) -> Archive[gen_55_cd.HrlyRtLoadFcastActualRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'gen-55-cd', gen_55_cd.HrlyRtLoadFcastActualRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'CurrentDayForecast': 'currentDayFcast', 'DayAheadForecast': 'dayAheadFcast', 'ActualLoad': 'actualLoad', 'DayAheadHSL': 'dayAheadHSL', 'CurrentDayHSL': 'currentDayHSL', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def hrly_rt_load_fcast_actual(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, currentDayFcastFrom: Decimal | None = None, currentDayFcastTo: Decimal | None = None, dayAheadFcastFrom: Decimal | None = None, dayAheadFcastTo: Decimal | None = None, actualLoadFrom: Decimal | None = None, actualLoadTo: Decimal | None = None, dayAheadHSLFrom: Decimal | None = None, dayAheadHSLTo: Decimal | None = None, currentDayHSLFrom: Decimal | None = None, currentDayHSLTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[gen_55_cd.HrlyRtLoadFcastActualRow]:
'Hourly Real-Time Load vs. Actual Report'
return self._client._page('/gen-55-cd/hrly_rt_load_fcast_actual', gen_55_cd.HrlyRtLoadFcastActualRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'currentDayFcastFrom': currentDayFcastFrom, 'currentDayFcastTo': currentDayFcastTo, 'dayAheadFcastFrom': dayAheadFcastFrom, 'dayAheadFcastTo': dayAheadFcastTo, 'actualLoadFrom': actualLoadFrom, 'actualLoadTo': actualLoadTo, 'dayAheadHSLFrom': dayAheadHSLFrom, 'dayAheadHSLTo': dayAheadHSLTo, 'currentDayHSLFrom': currentDayHSLFrom, 'currentDayHSLTo': currentDayHSLTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -37,6 +159,122 @@ def hrly_rt_load_fcast_actual_iter_async(self, *, deliveryDateFrom: date | None
'Hourly Real-Time Load vs. Actual Report'
return self._client._aiter('/gen-55-cd/hrly_rt_load_fcast_actual', gen_55_cd.HrlyRtLoadFcastActualRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'currentDayFcastFrom': currentDayFcastFrom, 'currentDayFcastTo': currentDayFcastTo, 'dayAheadFcastFrom': dayAheadFcastFrom, 'dayAheadFcastTo': dayAheadFcastTo, 'actualLoadFrom': actualLoadFrom, 'actualLoadTo': actualLoadTo, 'dayAheadHSLFrom': dayAheadHSLFrom, 'dayAheadHSLTo': dayAheadHSLTo, 'currentDayHSLFrom': currentDayHSLFrom, 'currentDayHSLTo': currentDayHSLTo, 'DSTFlag': DSTFlag, 'size': size, 'sort': sort, 'dir': dir})
+class np1_300:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class AdjustedMeterLoadHistoryRow(Row):
+ saveRecorder: str | None
+ saveChannel: str | None
+ startTime: date | None
+ INT001: Decimal | None
+ INT002: Decimal | None
+ INT003: Decimal | None
+ INT004: Decimal | None
+ INT005: Decimal | None
+ INT006: Decimal | None
+ INT007: Decimal | None
+ INT008: Decimal | None
+ INT009: Decimal | None
+ INT010: Decimal | None
+ INT011: Decimal | None
+ INT012: Decimal | None
+ INT013: Decimal | None
+ INT014: Decimal | None
+ INT015: Decimal | None
+ INT016: Decimal | None
+ INT017: Decimal | None
+ INT018: Decimal | None
+ INT019: Decimal | None
+ INT020: Decimal | None
+ INT021: Decimal | None
+ INT022: Decimal | None
+ INT023: Decimal | None
+ INT024: Decimal | None
+ INT025: Decimal | None
+ INT026: Decimal | None
+ INT027: Decimal | None
+ INT028: Decimal | None
+ INT029: Decimal | None
+ INT030: Decimal | None
+ INT031: Decimal | None
+ INT032: Decimal | None
+ INT033: Decimal | None
+ INT034: Decimal | None
+ INT035: Decimal | None
+ INT036: Decimal | None
+ INT037: Decimal | None
+ INT038: Decimal | None
+ INT039: Decimal | None
+ INT040: Decimal | None
+ INT041: Decimal | None
+ INT042: Decimal | None
+ INT043: Decimal | None
+ INT044: Decimal | None
+ INT045: Decimal | None
+ INT046: Decimal | None
+ INT047: Decimal | None
+ INT048: Decimal | None
+ INT049: Decimal | None
+ INT050: Decimal | None
+ INT051: Decimal | None
+ INT052: Decimal | None
+ INT053: Decimal | None
+ INT054: Decimal | None
+ INT055: Decimal | None
+ INT056: Decimal | None
+ INT057: Decimal | None
+ INT058: Decimal | None
+ INT059: Decimal | None
+ INT060: Decimal | None
+ INT061: Decimal | None
+ INT062: Decimal | None
+ INT063: Decimal | None
+ INT064: Decimal | None
+ INT065: Decimal | None
+ INT066: Decimal | None
+ INT067: Decimal | None
+ INT068: Decimal | None
+ INT069: Decimal | None
+ INT070: Decimal | None
+ INT071: Decimal | None
+ INT072: Decimal | None
+ INT073: Decimal | None
+ INT074: Decimal | None
+ INT075: Decimal | None
+ INT076: Decimal | None
+ INT077: Decimal | None
+ INT078: Decimal | None
+ INT079: Decimal | None
+ INT080: Decimal | None
+ INT081: Decimal | None
+ INT082: Decimal | None
+ INT083: Decimal | None
+ INT084: Decimal | None
+ INT085: Decimal | None
+ INT086: Decimal | None
+ INT087: Decimal | None
+ INT088: Decimal | None
+ INT089: Decimal | None
+ INT090: Decimal | None
+ INT091: Decimal | None
+ INT092: Decimal | None
+ INT093: Decimal | None
+ INT094: Decimal | None
+ INT095: Decimal | None
+ INT096: Decimal | None
+ INT097: Decimal | None
+ INT098: Decimal | None
+ INT099: Decimal | None
+ INT100: Decimal | None
+ LSTime: date | None
+
+ @property
+ def adjusted_meter_load_history(self) -> Archive[np1_300.AdjustedMeterLoadHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np1-300', np1_300.AdjustedMeterLoadHistoryRow, {'SAVERECORDER': 'saveRecorder', 'SAVECHANNEL': 'saveChannel', 'STARTTIME': 'startTime', 'INT001': 'INT001', 'INT002': 'INT002', 'INT003': 'INT003', 'INT004': 'INT004', 'INT005': 'INT005', 'INT006': 'INT006', 'INT007': 'INT007', 'INT008': 'INT008', 'INT009': 'INT009', 'INT010': 'INT010', 'INT011': 'INT011', 'INT012': 'INT012', 'INT013': 'INT013', 'INT014': 'INT014', 'INT015': 'INT015', 'INT016': 'INT016', 'INT017': 'INT017', 'INT018': 'INT018', 'INT019': 'INT019', 'INT020': 'INT020', 'INT021': 'INT021', 'INT022': 'INT022', 'INT023': 'INT023', 'INT024': 'INT024', 'INT025': 'INT025', 'INT026': 'INT026', 'INT027': 'INT027', 'INT028': 'INT028', 'INT029': 'INT029', 'INT030': 'INT030', 'INT031': 'INT031', 'INT032': 'INT032', 'INT033': 'INT033', 'INT034': 'INT034', 'INT035': 'INT035', 'INT036': 'INT036', 'INT037': 'INT037', 'INT038': 'INT038', 'INT039': 'INT039', 'INT040': 'INT040', 'INT041': 'INT041', 'INT042': 'INT042', 'INT043': 'INT043', 'INT044': 'INT044', 'INT045': 'INT045', 'INT046': 'INT046', 'INT047': 'INT047', 'INT048': 'INT048', 'INT049': 'INT049', 'INT050': 'INT050', 'INT051': 'INT051', 'INT052': 'INT052', 'INT053': 'INT053', 'INT054': 'INT054', 'INT055': 'INT055', 'INT056': 'INT056', 'INT057': 'INT057', 'INT058': 'INT058', 'INT059': 'INT059', 'INT060': 'INT060', 'INT061': 'INT061', 'INT062': 'INT062', 'INT063': 'INT063', 'INT064': 'INT064', 'INT065': 'INT065', 'INT066': 'INT066', 'INT067': 'INT067', 'INT068': 'INT068', 'INT069': 'INT069', 'INT070': 'INT070', 'INT071': 'INT071', 'INT072': 'INT072', 'INT073': 'INT073', 'INT074': 'INT074', 'INT075': 'INT075', 'INT076': 'INT076', 'INT077': 'INT077', 'INT078': 'INT078', 'INT079': 'INT079', 'INT080': 'INT080', 'INT081': 'INT081', 'INT082': 'INT082', 'INT083': 'INT083', 'INT084': 'INT084', 'INT085': 'INT085', 'INT086': 'INT086', 'INT087': 'INT087', 'INT088': 'INT088', 'INT089': 'INT089', 'INT090': 'INT090', 'INT091': 'INT091', 'INT092': 'INT092', 'INT093': 'INT093', 'INT094': 'INT094', 'INT095': 'INT095', 'INT096': 'INT096', 'INT097': 'INT097', 'INT098': 'INT098', 'INT099': 'INT099', 'INT100': 'INT100', 'LSTIME': 'LSTime'}, {'startTime': '%d-%b-%y', 'LSTime': '%d-%b-%y'}, member='*.csv', datetimes={}, variants=())
+
class np1_301:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -62,6 +300,33 @@ class _60CopAdjPeriodSnapshotRow(Row):
resourceName: str | None
status: str | None
+ class _60CopAdjPeriodSnapshotHistoryRow(Row):
+ deliveryDate: date | None
+ qseName: str | None
+ resourceName: str | None
+ hourEnding: str | None
+ status: str | None
+ highSustainedLimit: Decimal | None
+ lowSustainedLimit: Decimal | None
+ highEmergencyLimit: Decimal | None
+ lowEmergencyLimit: Decimal | None
+ REGUP: Decimal | None
+ REGDN: Decimal | None
+ RRSPFR: Decimal | None = None
+ RRSFFR: Decimal | None = None
+ RRSUFR: Decimal | None = None
+ NSPIN: Decimal | None
+ ECRS: Decimal | None = None
+ minSOC: Decimal | None = None
+ maxSOC: Decimal | None = None
+ hourBeginningPlannedSOC: Decimal | None = None
+ RRS: Decimal | None = None
+
+ @property
+ def _60_cop_adj_period_snapshot_history(self) -> Archive[np1_301._60CopAdjPeriodSnapshotHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np1-301', np1_301._60CopAdjPeriodSnapshotHistoryRow, {'Delivery Date': 'deliveryDate', 'QSE Name': 'qseName', 'Resource Name': 'resourceName', 'Hour Ending': 'hourEnding', 'Status': 'status', 'High Sustained Limit': 'highSustainedLimit', 'Low Sustained Limit': 'lowSustainedLimit', 'High Emergency Limit': 'highEmergencyLimit', 'Low Emergency Limit': 'lowEmergencyLimit', 'Reg Up': 'REGUP', 'Reg Down': 'REGDN', 'RRSPFR': 'RRSPFR', 'RRSFFR': 'RRSFFR', 'RRSUFR': 'RRSUFR', 'NSPIN': 'NSPIN', 'ECRS': 'ECRS', 'Minimum SOC': 'minSOC', 'Maximum SOC': 'maxSOC', 'Hour Beginning Planned SOC': 'hourBeginningPlannedSOC'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'QSE Name': 'qseName', 'Resource Name': 'resourceName', 'Hour Ending': 'hourEnding', 'Status': 'status', 'High Sustained Limit': 'highSustainedLimit', 'Low Sustained Limit': 'lowSustainedLimit', 'High Emergency Limit': 'highEmergencyLimit', 'Low Emergency Limit': 'lowEmergencyLimit', 'Reg Up': 'REGUP', 'Reg Down': 'REGDN', 'RRS': 'RRS', 'NSPIN': 'NSPIN'},))
+
def _60_cop_adj_period_snapshot(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, qseName: str | None = None, resourceName: str | None = None, hourEnding: str | None = None, status: str | None = None, highSustainedLimitFrom: Decimal | None = None, highSustainedLimitTo: Decimal | None = None, lowSustainedLimitFrom: Decimal | None = None, lowSustainedLimitTo: Decimal | None = None, highEmergencyLimitFrom: Decimal | None = None, highEmergencyLimitTo: Decimal | None = None, lowEmergencyLimitFrom: Decimal | None = None, lowEmergencyLimitTo: Decimal | None = None, REGUPFrom: Decimal | None = None, REGUPTo: Decimal | None = None, REGDNFrom: Decimal | None = None, REGDNTo: Decimal | None = None, RRSPFRFrom: Decimal | None = None, RRSPFRTo: Decimal | None = None, RRSFFRFrom: Decimal | None = None, RRSFFRTo: Decimal | None = None, RRSUFRFrom: Decimal | None = None, RRSUFRTo: Decimal | None = None, NSPINFrom: Decimal | None = None, NSPINTo: Decimal | None = None, ECRSFrom: Decimal | None = None, ECRSTo: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, hourBeginningPlannedSOCFrom: Decimal | None = None, hourBeginningPlannedSOCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np1_301._60CopAdjPeriodSnapshotRow]:
'60-Day COP Adjustment Period Snapshot'
return self._client._page('/np1-301/60_cop_adj_period_snapshot', np1_301._60CopAdjPeriodSnapshotRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'qseName': qseName, 'resourceName': resourceName, 'hourEnding': hourEnding, 'status': status, 'highSustainedLimitFrom': highSustainedLimitFrom, 'highSustainedLimitTo': highSustainedLimitTo, 'lowSustainedLimitFrom': lowSustainedLimitFrom, 'lowSustainedLimitTo': lowSustainedLimitTo, 'highEmergencyLimitFrom': highEmergencyLimitFrom, 'highEmergencyLimitTo': highEmergencyLimitTo, 'lowEmergencyLimitFrom': lowEmergencyLimitFrom, 'lowEmergencyLimitTo': lowEmergencyLimitTo, 'REGUPFrom': REGUPFrom, 'REGUPTo': REGUPTo, 'REGDNFrom': REGDNFrom, 'REGDNTo': REGDNTo, 'RRSPFRFrom': RRSPFRFrom, 'RRSPFRTo': RRSPFRTo, 'RRSFFRFrom': RRSFFRFrom, 'RRSFFRTo': RRSFFRTo, 'RRSUFRFrom': RRSUFRFrom, 'RRSUFRTo': RRSUFRTo, 'NSPINFrom': NSPINFrom, 'NSPINTo': NSPINTo, 'ECRSFrom': ECRSFrom, 'ECRSTo': ECRSTo, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'hourBeginningPlannedSOCFrom': hourBeginningPlannedSOCFrom, 'hourBeginningPlannedSOCTo': hourBeginningPlannedSOCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -97,6 +362,34 @@ class AsObligationRow(Row):
hourEnding: str | None
qseName: str | None
+ class AsObligationHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: str | None
+ qseName: str | None
+ REGUPOblAdvisory: Decimal | None = None
+ REGDNOblAdvisory: Decimal | None = None
+ RRSOblAdvisory: Decimal | None = None
+ NSPINOblAdvisory: Decimal | None = None
+ ECRSOblAdvisory: Decimal | None = None
+ REGUPOblFinal: Decimal | None = None
+ REGDNOblFinal: Decimal | None = None
+ RRSOblFinal: Decimal | None = None
+ NSPINOblFinal: Decimal | None = None
+ ECRSOblFinal: Decimal | None = None
+ REGUPObligation: Decimal | None = None
+ REGUPResponsibility: Decimal | None = None
+ REGDNObligation: Decimal | None = None
+ REGDNResponsibility: Decimal | None = None
+ RRSObligation: Decimal | None = None
+ RRSResponsibility: Decimal | None = None
+ NSPINObligation: Decimal | None = None
+ NSPINResponsibility: Decimal | None = None
+
+ @property
+ def as_obligation_history(self) -> Archive[np1_302.AsObligationHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np1-302', np1_302.AsObligationHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'Reg Up Obligation Advisory': 'REGUPOblAdvisory', 'Reg Down Obligation Advisory': 'REGDNOblAdvisory', 'RRS Obligation Advisory': 'RRSOblAdvisory', 'NSPIN Obligation Advisory': 'NSPINOblAdvisory', 'ECRS Obligation Advisory': 'ECRSOblAdvisory', 'Reg Up Obligation Final': 'REGUPOblFinal', 'Reg Down Obligation Final': 'REGDNOblFinal', 'RRS Obligation Final': 'RRSOblFinal', 'NSPIN Obligation Final': 'NSPINOblFinal', 'ECRS Obligation Final': 'ECRSOblFinal'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'Reg Up Obligation': 'REGUPObligation', 'Reg Down Obligation': 'REGDNObligation', 'RRS Obligation': 'RRSObligation', 'NSPIN Obligation': 'NSPINObligation', 'Reg Up Responsibility': 'REGUPResponsibility', 'Reg Down Responsibility': 'REGDNResponsibility', 'RRS Responsibility': 'RRSResponsibility', 'NSPIN Responsibility': 'NSPINResponsibility'},))
+
def as_obligation(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, qseName: str | None = None, REGUPOblAdvisoryFrom: Decimal | None = None, REGUPOblAdvisoryTo: Decimal | None = None, REGDNOblAdvisoryFrom: Decimal | None = None, REGDNOblAdvisoryTo: Decimal | None = None, RRSOblAdvisoryFrom: Decimal | None = None, RRSOblAdvisoryTo: Decimal | None = None, NSPINOblAdvisoryFrom: Decimal | None = None, NSPINOblAdvisoryTo: Decimal | None = None, ECRSOblAdvisoryFrom: Decimal | None = None, ECRSOblAdvisoryTo: Decimal | None = None, REGUPOblFinalFrom: Decimal | None = None, REGUPOblFinalTo: Decimal | None = None, REGDNOblFinalFrom: Decimal | None = None, REGDNOblFinalTo: Decimal | None = None, RRSOblFinalFrom: Decimal | None = None, RRSOblFinalTo: Decimal | None = None, NSPINOblFinalFrom: Decimal | None = None, NSPINOblFinalTo: Decimal | None = None, ECRSOblFinalFrom: Decimal | None = None, ECRSOblFinalTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np1_302.AsObligationRow]:
'Ancillary Service Obligations Report'
return self._client._page('/np1-302/as_obligation', np1_302.AsObligationRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'qseName': qseName, 'REGUPOblAdvisoryFrom': REGUPOblAdvisoryFrom, 'REGUPOblAdvisoryTo': REGUPOblAdvisoryTo, 'REGDNOblAdvisoryFrom': REGDNOblAdvisoryFrom, 'REGDNOblAdvisoryTo': REGDNOblAdvisoryTo, 'RRSOblAdvisoryFrom': RRSOblAdvisoryFrom, 'RRSOblAdvisoryTo': RRSOblAdvisoryTo, 'NSPINOblAdvisoryFrom': NSPINOblAdvisoryFrom, 'NSPINOblAdvisoryTo': NSPINOblAdvisoryTo, 'ECRSOblAdvisoryFrom': ECRSOblAdvisoryFrom, 'ECRSOblAdvisoryTo': ECRSOblAdvisoryTo, 'REGUPOblFinalFrom': REGUPOblFinalFrom, 'REGUPOblFinalTo': REGUPOblFinalTo, 'REGDNOblFinalFrom': REGDNOblFinalFrom, 'REGDNOblFinalTo': REGDNOblFinalTo, 'RRSOblFinalFrom': RRSOblFinalFrom, 'RRSOblFinalTo': RRSOblFinalTo, 'NSPINOblFinalFrom': NSPINOblFinalFrom, 'NSPINOblFinalTo': NSPINOblFinalTo, 'ECRSOblFinalFrom': ECRSOblFinalFrom, 'ECRSOblFinalTo': ECRSOblFinalTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -113,6 +406,51 @@ def as_obligation_iter_async(self, *, deliveryDateFrom: date | None = None, deli
'Ancillary Service Obligations Report'
return self._client._aiter('/np1-302/as_obligation', np1_302.AsObligationRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'qseName': qseName, 'REGUPOblAdvisoryFrom': REGUPOblAdvisoryFrom, 'REGUPOblAdvisoryTo': REGUPOblAdvisoryTo, 'REGDNOblAdvisoryFrom': REGDNOblAdvisoryFrom, 'REGDNOblAdvisoryTo': REGDNOblAdvisoryTo, 'RRSOblAdvisoryFrom': RRSOblAdvisoryFrom, 'RRSOblAdvisoryTo': RRSOblAdvisoryTo, 'NSPINOblAdvisoryFrom': NSPINOblAdvisoryFrom, 'NSPINOblAdvisoryTo': NSPINOblAdvisoryTo, 'ECRSOblAdvisoryFrom': ECRSOblAdvisoryFrom, 'ECRSOblAdvisoryTo': ECRSOblAdvisoryTo, 'REGUPOblFinalFrom': REGUPOblFinalFrom, 'REGUPOblFinalTo': REGUPOblFinalTo, 'REGDNOblFinalFrom': REGDNOblFinalFrom, 'REGDNOblFinalTo': REGDNOblFinalTo, 'RRSOblFinalFrom': RRSOblFinalFrom, 'RRSOblFinalTo': RRSOblFinalTo, 'NSPINOblFinalFrom': NSPINOblFinalFrom, 'NSPINOblFinalTo': NSPINOblFinalTo, 'ECRSOblFinalFrom': ECRSOblFinalFrom, 'ECRSOblFinalTo': ECRSOblFinalTo, 'size': size, 'sort': sort, 'dir': dir})
+class np1_346_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class OutagesHistoryRow(Row):
+ sourceSheet: str | None = None
+ resourceName: str | None
+ resourceUnitCode: str | None
+ fuelType: str | None
+ outageType: str | None
+ availableMWMaximum: Decimal | None
+ availableMWDuringOutage: Decimal | None
+ effectiveMWReduction: Decimal | None
+ actualOutageStart: datetime | None
+ returnToServiceDate: datetime | None = None
+ plannedEndDate: datetime | None = None
+ actualEndDate: datetime | None = None
+ natureOfWork: str | None
+
+ @property
+ def outages_history(self) -> WorkbookArchive[np1_346_er.OutagesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np1-346-er', np1_346_er.OutagesHistoryRow, {'Resource Name': 'resourceName', 'Resource Unit Code': 'resourceUnitCode', 'Fuel Type': 'fuelType', 'Outage Type': 'outageType', 'Available MW Maximum': 'availableMWMaximum', 'Available MW During Outage': 'availableMWDuringOutage', 'Effective MW Reduction Due to Outage': 'effectiveMWReduction', 'Actual Outage Start': 'actualOutageStart', 'Return to Service Date': 'returnToServiceDate', 'Nature Of Work': 'natureOfWork'}, {}, sheets=('Unplanned Resource Outages',), variants=({'Resource Name': 'resourceName', 'Resource Unit Code': 'resourceUnitCode', 'Fuel Type': 'fuelType', 'Outage Type': 'outageType', 'Available MW Maximum': 'availableMWMaximum', 'Available MW During Outage': 'availableMWDuringOutage', 'Effective MW Reduction Due to Outage': 'effectiveMWReduction', 'Actual Outage Start': 'actualOutageStart', 'Planned End Date': 'plannedEndDate', 'Actual End Date': 'actualEndDate', 'Nature Of Work': 'natureOfWork'},))
+
+class np3_108:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class DemandResponseHistoryRow(Row):
+ sourceSheet: str | None = None
+ month: date | None
+ hour: int | None
+ ASType: str | None
+ houston: Decimal | None
+ north: Decimal | None
+ south: Decimal | None
+ west: Decimal | None
+
+ @property
+ def demand_response_history(self) -> WorkbookArchive[np3_108.DemandResponseHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np3-108', np3_108.DemandResponseHistoryRow, {'Month': 'month', 'Hour': 'hour', 'ASType': 'ASType', 'Houston': 'houston', 'North': 'north', 'South': 'south', 'West': 'west'}, {'month': '%b-%y'}, sheets=('Report Data', 'CLR Report Data', 'NCLR Report Data'), variants=())
+
class np3_161_cd:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -130,6 +468,24 @@ class _7dPlusAvailResPocMarginRow(Row):
operatingDate: date | None
postedDatetime: datetime | None
+ class _7dPlusAvailResPocMarginHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ operatingDate: date | None
+ nonIRRNonPUN: Decimal | None
+ ESR: Decimal | None
+ aggApprvdNonIRRNonPUN: Decimal | None
+ aggRcvdNonIRRNonPUN: Decimal | None
+ IRR: Decimal | None
+ aggApprvdIRR: Decimal | None
+ aggRcvdIRR: Decimal | None
+ aggApprvdESR: Decimal | None
+ aggRcvdESR: Decimal | None
+
+ @property
+ def _7d_plus_avail_res_poc_margin_history(self) -> Archive[np3_161_cd._7dPlusAvailResPocMarginHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-161-cd', np3_161_cd._7dPlusAvailResPocMarginHistoryRow, {'OperatingDate': 'operatingDate', 'ResourcePOLnonIRRnonPUN': 'nonIRRNonPUN', 'ResourcePOLESR': 'ESR', 'AggApprovedResourcePOLnonIRRnonPUN': 'aggApprvdNonIRRNonPUN', 'AggReceivedResourcePOLnonIRRnonPUN': 'aggRcvdNonIRRNonPUN', 'ResourcePOLIRR': 'IRR', 'AggApprovedResourcePOLIRR': 'aggApprvdIRR', 'AggReceivedResourcePOLIRR': 'aggRcvdIRR', 'AggApprovedResourcePOLESR': 'aggApprvdESR', 'AggReceivedResourcePOLESR': 'aggRcvdESR'}, {'operatingDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=())
+
def _7d_plus_avail_res_poc_margin(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, operatingDateFrom: date | None = None, operatingDateTo: date | None = None, nonIRRNonPUNFrom: Decimal | None = None, nonIRRNonPUNTo: Decimal | None = None, ESRFrom: Decimal | None = None, ESRTo: Decimal | None = None, aggApprvdNonIRRNonPUNFrom: Decimal | None = None, aggApprvdNonIRRNonPUNTo: Decimal | None = None, aggRcvdNonIRRNonPUNFrom: Decimal | None = None, aggRcvdNonIRRNonPUNTo: Decimal | None = None, IRRFrom: Decimal | None = None, IRRTo: Decimal | None = None, aggApprvdIRRFrom: Decimal | None = None, aggApprvdIRRTo: Decimal | None = None, aggRcvdIRRFrom: Decimal | None = None, aggRcvdIRRTo: Decimal | None = None, aggApprvdESRFrom: Decimal | None = None, aggApprvdESRTo: Decimal | None = None, aggRcvdESRFrom: Decimal | None = None, aggRcvdESRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_161_cd._7dPlusAvailResPocMarginRow]:
'Available Resource Planned Outage Capacity Margin_7 Day Plus'
return self._client._page('/np3-161-cd/7d_plus_avail_res_poc_margin', np3_161_cd._7dPlusAvailResPocMarginRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'operatingDateFrom': operatingDateFrom, 'operatingDateTo': operatingDateTo, 'nonIRRNonPUNFrom': nonIRRNonPUNFrom, 'nonIRRNonPUNTo': nonIRRNonPUNTo, 'ESRFrom': ESRFrom, 'ESRTo': ESRTo, 'aggApprvdNonIRRNonPUNFrom': aggApprvdNonIRRNonPUNFrom, 'aggApprvdNonIRRNonPUNTo': aggApprvdNonIRRNonPUNTo, 'aggRcvdNonIRRNonPUNFrom': aggRcvdNonIRRNonPUNFrom, 'aggRcvdNonIRRNonPUNTo': aggRcvdNonIRRNonPUNTo, 'IRRFrom': IRRFrom, 'IRRTo': IRRTo, 'aggApprvdIRRFrom': aggApprvdIRRFrom, 'aggApprvdIRRTo': aggApprvdIRRTo, 'aggRcvdIRRFrom': aggRcvdIRRFrom, 'aggRcvdIRRTo': aggRcvdIRRTo, 'aggApprvdESRFrom': aggApprvdESRFrom, 'aggApprvdESRTo': aggApprvdESRTo, 'aggRcvdESRFrom': aggRcvdESRFrom, 'aggRcvdESRTo': aggRcvdESRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -165,6 +521,26 @@ class _7dAvailResPocMarginRow(Row):
postedDatetime: datetime | None
repeatedHourFlag: bool | None
+ class _7dAvailResPocMarginHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ operatingDate: date | None
+ hourEnding: int | None
+ nonIrrNonPun: Decimal | None
+ aggApprvdNonIRRNonPUN: Decimal | None
+ aggRcvdNonIRRNonPUN: Decimal | None
+ IRR: Decimal | None
+ aggApprvdIRR: Decimal | None
+ aggRcvdIRR: Decimal | None
+ ESR: Decimal | None
+ aggApprvdESR: Decimal | None
+ aggRcvdESR: Decimal | None
+ repeatedHourFlag: bool | None
+
+ @property
+ def _7d_avail_res_poc_margin_history(self) -> Archive[np3_162_cd._7dAvailResPocMarginHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-162-cd', np3_162_cd._7dAvailResPocMarginHistoryRow, {'OperatingDate': 'operatingDate', 'HourEnding': 'hourEnding', 'ResourcePOLnonIRRnonPUN': 'nonIrrNonPun', 'AggApprovedResourcePOLnonIRRnonPUN': 'aggApprvdNonIRRNonPUN', 'AggReceivedResourcePOLnonIRRnonPUN': 'aggRcvdNonIRRNonPUN', 'ResourcePOLIRR': 'IRR', 'AggApprovedResourcePOLIRR': 'aggApprvdIRR', 'AggReceivedResourcePOLIRR': 'aggRcvdIRR', 'ResourcePOLESR': 'ESR', 'AggApprovedResourcePOLESR': 'aggApprvdESR', 'AggReceivedResourcePOLESR': 'aggRcvdESR', 'RepeatedHourFlag': 'repeatedHourFlag'}, {'operatingDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=())
+
def _7d_avail_res_poc_margin(self, *, aggRcvdESRFrom: Decimal | None = None, aggRcvdESRTo: Decimal | None = None, repeatedHourFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, operatingDateFrom: date | None = None, operatingDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, nonIrrNonPunFrom: Decimal | None = None, nonIrrNonPunTo: Decimal | None = None, aggApprvdNonIRRNonPUNFrom: Decimal | None = None, aggApprvdNonIRRNonPUNTo: Decimal | None = None, aggRcvdNonIRRNonPUNFrom: Decimal | None = None, aggRcvdNonIRRNonPUNTo: Decimal | None = None, IRRFrom: Decimal | None = None, IRRTo: Decimal | None = None, aggApprvdIRRFrom: Decimal | None = None, aggApprvdIRRTo: Decimal | None = None, aggRcvdIRRFrom: Decimal | None = None, aggRcvdIRRTo: Decimal | None = None, ESRFrom: Decimal | None = None, ESRTo: Decimal | None = None, aggApprvdESRFrom: Decimal | None = None, aggApprvdESRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_162_cd._7dAvailResPocMarginRow]:
'Available Resource Planned Outage Capacity Margin_7 Day'
return self._client._page('/np3-162-cd/7d_avail_res_poc_margin', np3_162_cd._7dAvailResPocMarginRow, {'aggRcvdESRFrom': aggRcvdESRFrom, 'aggRcvdESRTo': aggRcvdESRTo, 'repeatedHourFlag': repeatedHourFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'operatingDateFrom': operatingDateFrom, 'operatingDateTo': operatingDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'nonIrrNonPunFrom': nonIrrNonPunFrom, 'nonIrrNonPunTo': nonIrrNonPunTo, 'aggApprvdNonIRRNonPUNFrom': aggApprvdNonIRRNonPUNFrom, 'aggApprvdNonIRRNonPUNTo': aggApprvdNonIRRNonPUNTo, 'aggRcvdNonIRRNonPUNFrom': aggRcvdNonIRRNonPUNFrom, 'aggRcvdNonIRRNonPUNTo': aggRcvdNonIRRNonPUNTo, 'IRRFrom': IRRFrom, 'IRRTo': IRRTo, 'aggApprvdIRRFrom': aggApprvdIRRFrom, 'aggApprvdIRRTo': aggApprvdIRRTo, 'aggRcvdIRRFrom': aggRcvdIRRFrom, 'aggRcvdIRRTo': aggRcvdIRRTo, 'ESRFrom': ESRFrom, 'ESRTo': ESRTo, 'aggApprvdESRFrom': aggApprvdESRFrom, 'aggApprvdESRTo': aggApprvdESRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -202,6 +578,30 @@ class HourlyResOutageCapRow(Row):
totalResourceMWZoneSouth: int | None
totalResourceMWZoneWest: int | None
+ class HourlyResOutageCapHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ operatingDate: date | None
+ hourEnding: int | None
+ totalResourceMWZoneSouth: int | None = None
+ totalResourceMWZoneNorth: int | None = None
+ totalResourceMWZoneWest: int | None = None
+ totalResourceMWZoneHouston: int | None = None
+ totalIRRMWZoneSouth: int | None = None
+ totalIRRMWZoneNorth: int | None = None
+ totalIRRMWZoneWest: int | None = None
+ totalIRRMWZoneHouston: int | None = None
+ totalNewEquipResourceMWZoneSouth: int | None = None
+ totalNewEquipResourceMWZoneNorth: int | None = None
+ totalNewEquipResourceMWZoneWest: int | None = None
+ totalNewEquipResourceMWZoneHouston: int | None = None
+ totalResourceMW: int | None = None
+ totalIRRMW: int | None = None
+
+ @property
+ def hourly_res_outage_cap_history(self) -> Archive[np3_233_cd.HourlyResOutageCapHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-233-cd', np3_233_cd.HourlyResOutageCapHistoryRow, {'Date': 'operatingDate', 'HourEnding': 'hourEnding', 'TotalResourceMWZoneSouth': 'totalResourceMWZoneSouth', 'TotalResourceMWZoneNorth': 'totalResourceMWZoneNorth', 'TotalResourceMWZoneWest': 'totalResourceMWZoneWest', 'TotalResourceMWZoneHouston': 'totalResourceMWZoneHouston', 'TotalIRRMWZoneSouth': 'totalIRRMWZoneSouth', 'TotalIRRMWZoneNorth': 'totalIRRMWZoneNorth', 'TotalIRRMWZoneWest': 'totalIRRMWZoneWest', 'TotalIRRMWZoneHouston': 'totalIRRMWZoneHouston', 'TotalNewEquipResourceMWZoneSouth': 'totalNewEquipResourceMWZoneSouth', 'TotalNewEquipResourceMWZoneNorth': 'totalNewEquipResourceMWZoneNorth', 'TotalNewEquipResourceMWZoneWest': 'totalNewEquipResourceMWZoneWest', 'TotalNewEquipResourceMWZoneHouston': 'totalNewEquipResourceMWZoneHouston'}, {'operatingDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=({'Date': 'operatingDate', 'HourEnding': 'hourEnding', 'TotalResourceMW': 'totalResourceMW', 'TotalIRRMW': 'totalIRRMW'},))
+
def hourly_res_outage_cap(self, *, operatingDateFrom: date | None = None, operatingDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalResourceMWZoneSouthFrom: int | None = None, totalResourceMWZoneSouthTo: int | None = None, totalResourceMWZoneNorthFrom: int | None = None, totalResourceMWZoneNorthTo: int | None = None, totalResourceMWZoneWestFrom: int | None = None, totalResourceMWZoneWestTo: int | None = None, totalResourceMWZoneHoustonFrom: int | None = None, totalResourceMWZoneHoustonTo: int | None = None, totalIRRMWZoneSouthFrom: int | None = None, totalIRRMWZoneSouthTo: int | None = None, totalIRRMWZoneNorthFrom: int | None = None, totalIRRMWZoneNorthTo: int | None = None, totalIRRMWZoneWestFrom: int | None = None, totalIRRMWZoneWestTo: int | None = None, totalIRRMWZoneHoustonFrom: int | None = None, totalIRRMWZoneHoustonTo: int | None = None, totalNewEquipResourceMWZoneSouthFrom: int | None = None, totalNewEquipResourceMWZoneSouthTo: int | None = None, totalNewEquipResourceMWZoneNorthFrom: int | None = None, totalNewEquipResourceMWZoneNorthTo: int | None = None, totalNewEquipResourceMWZoneWestFrom: int | None = None, totalNewEquipResourceMWZoneWestTo: int | None = None, totalNewEquipResourceMWZoneHoustonFrom: int | None = None, totalNewEquipResourceMWZoneHoustonTo: int | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_233_cd.HourlyResOutageCapRow]:
'Hourly Resource Outage Capacity'
return self._client._page('/np3-233-cd/hourly_res_outage_cap', np3_233_cd.HourlyResOutageCapRow, {'operatingDateFrom': operatingDateFrom, 'operatingDateTo': operatingDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalResourceMWZoneSouthFrom': totalResourceMWZoneSouthFrom, 'totalResourceMWZoneSouthTo': totalResourceMWZoneSouthTo, 'totalResourceMWZoneNorthFrom': totalResourceMWZoneNorthFrom, 'totalResourceMWZoneNorthTo': totalResourceMWZoneNorthTo, 'totalResourceMWZoneWestFrom': totalResourceMWZoneWestFrom, 'totalResourceMWZoneWestTo': totalResourceMWZoneWestTo, 'totalResourceMWZoneHoustonFrom': totalResourceMWZoneHoustonFrom, 'totalResourceMWZoneHoustonTo': totalResourceMWZoneHoustonTo, 'totalIRRMWZoneSouthFrom': totalIRRMWZoneSouthFrom, 'totalIRRMWZoneSouthTo': totalIRRMWZoneSouthTo, 'totalIRRMWZoneNorthFrom': totalIRRMWZoneNorthFrom, 'totalIRRMWZoneNorthTo': totalIRRMWZoneNorthTo, 'totalIRRMWZoneWestFrom': totalIRRMWZoneWestFrom, 'totalIRRMWZoneWestTo': totalIRRMWZoneWestTo, 'totalIRRMWZoneHoustonFrom': totalIRRMWZoneHoustonFrom, 'totalIRRMWZoneHoustonTo': totalIRRMWZoneHoustonTo, 'totalNewEquipResourceMWZoneSouthFrom': totalNewEquipResourceMWZoneSouthFrom, 'totalNewEquipResourceMWZoneSouthTo': totalNewEquipResourceMWZoneSouthTo, 'totalNewEquipResourceMWZoneNorthFrom': totalNewEquipResourceMWZoneNorthFrom, 'totalNewEquipResourceMWZoneNorthTo': totalNewEquipResourceMWZoneNorthTo, 'totalNewEquipResourceMWZoneWestFrom': totalNewEquipResourceMWZoneWestFrom, 'totalNewEquipResourceMWZoneWestTo': totalNewEquipResourceMWZoneWestTo, 'totalNewEquipResourceMWZoneHoustonFrom': totalNewEquipResourceMWZoneHoustonFrom, 'totalNewEquipResourceMWZoneHoustonTo': totalNewEquipResourceMWZoneHoustonTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -231,6 +631,21 @@ class _3dHighPriceBidsSelDispScedRow(Row):
qseName: str | None
repeatedHourFlag: bool | None
+ class _3dHighPriceBidsSelDispScedHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatedHourFlag: bool | None
+ qseName: str | None
+ dmeName: str | None = None
+ loadResource: str | None
+ highestPriceDispatched: Decimal | None
+ proxyExtension: str | None
+ batchId: str | None = None
+
+ @property
+ def _3d_high_price_bids_sel_disp_sced_history(self) -> Archive[np3_257_ex._3dHighPriceBidsSelDispScedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-257-ex', np3_257_ex._3dHighPriceBidsSelDispScedHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatedHourFlag', 'QSE': 'qseName', 'DME': 'dmeName', 'Load Resource': 'loadResource', 'Highest Price Dispatched by SCED': 'highestPriceDispatched', 'Proxy Extension': 'proxyExtension'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Batch ID': 'batchId', 'Repeated Hour Flag': 'repeatedHourFlag', 'QSE': 'qseName', 'Load Resource': 'loadResource', 'Highest Price Dispatched by SCED': 'highestPriceDispatched', 'Proxy Extension': 'proxyExtension'},))
+
def _3d_high_price_bids_sel_disp_sced(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatedHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, loadResource: str | None = None, highestPriceDispatchedFrom: Decimal | None = None, highestPriceDispatchedTo: Decimal | None = None, proxyExtension: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_257_ex._3dHighPriceBidsSelDispScedRow]:
'3-Day Highest Price Bids Selected or Dispatched in SCED'
return self._client._page('/np3-257-ex/3d_high_price_bids_sel_disp_sced', np3_257_ex._3dHighPriceBidsSelDispScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatedHourFlag': repeatedHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'loadResource': loadResource, 'highestPriceDispatchedFrom': highestPriceDispatchedFrom, 'highestPriceDispatchedTo': highestPriceDispatchedTo, 'proxyExtension': proxyExtension, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -262,6 +677,22 @@ class _7dLoadFcastByFznRow(Row):
systemTotal: Decimal | None
west: Decimal | None
+ class _7dLoadFcastByFznHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ north: Decimal | None
+ south: Decimal | None
+ west: Decimal | None
+ houston: Decimal | None
+ systemTotal: Decimal | None
+ DSTFlag: bool | None
+
+ @property
+ def _7d_load_fcast_by_fzn_history(self) -> Archive[np3_560_cd._7dLoadFcastByFznHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-560-cd', np3_560_cd._7dLoadFcastByFznHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'North': 'north', 'South': 'south', 'West': 'west', 'Houston': 'houston', 'SystemTotal': 'systemTotal', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=({'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'North': 'north', 'South': 'south', 'West': 'west', 'Houston': 'houston', 'SystemTotal': 'systemTotal', 'DSTFlag ': 'DSTFlag'},))
+
def _7d_load_fcast_by_fzn(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, southFrom: Decimal | None = None, southTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, houstonFrom: Decimal | None = None, houstonTo: Decimal | None = None, systemTotalFrom: Decimal | None = None, systemTotalTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_560_cd._7dLoadFcastByFznRow]:
'Seven-Day Load Forecast by Forecast Zone'
return self._client._page('/np3-560-cd/7d_load_fcast_by_fzn', np3_560_cd._7dLoadFcastByFznRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'northFrom': northFrom, 'northTo': northTo, 'southFrom': southFrom, 'southTo': southTo, 'westFrom': westFrom, 'westTo': westTo, 'houstonFrom': houstonFrom, 'houstonTo': houstonTo, 'systemTotalFrom': systemTotalFrom, 'systemTotalTo': systemTotalTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -297,6 +728,26 @@ class _7dLoadFcastByWznRow(Row):
systemTotal: Decimal | None
west: Decimal | None
+ class _7dLoadFcastByWznHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ coast: Decimal | None
+ east: Decimal | None
+ farWest: Decimal | None
+ north: Decimal | None
+ northCentral: Decimal | None
+ southCentral: Decimal | None
+ southern: Decimal | None
+ west: Decimal | None
+ systemTotal: Decimal | None
+ DSTFlag: bool | None
+
+ @property
+ def _7d_load_fcast_by_wzn_history(self) -> Archive[np3_561_cd._7dLoadFcastByWznHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-561-cd', np3_561_cd._7dLoadFcastByWznHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Coast': 'coast', 'East': 'east', 'FarWest': 'farWest', 'North': 'north', 'NorthCentral': 'northCentral', 'SouthCentral': 'southCentral', 'Southern': 'southern', 'West': 'west', 'SystemTotal': 'systemTotal', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=())
+
def _7d_load_fcast_by_wzn(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, coastFrom: Decimal | None = None, coastTo: Decimal | None = None, eastFrom: Decimal | None = None, eastTo: Decimal | None = None, farWestFrom: Decimal | None = None, farWestTo: Decimal | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, northCentralFrom: Decimal | None = None, northCentralTo: Decimal | None = None, southCentralFrom: Decimal | None = None, southCentralTo: Decimal | None = None, southernFrom: Decimal | None = None, southernTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, systemTotalFrom: Decimal | None = None, systemTotalTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_561_cd._7dLoadFcastByWznRow]:
'Seven-Day Load Forecast by Weather Zone'
return self._client._page('/np3-561-cd/7d_load_fcast_by_wzn', np3_561_cd._7dLoadFcastByWznRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'coastFrom': coastFrom, 'coastTo': coastTo, 'eastFrom': eastFrom, 'eastTo': eastTo, 'farWestFrom': farWestFrom, 'farWestTo': farWestTo, 'northFrom': northFrom, 'northTo': northTo, 'northCentralFrom': northCentralFrom, 'northCentralTo': northCentralTo, 'southCentralFrom': southCentralFrom, 'southCentralTo': southCentralTo, 'southernFrom': southernFrom, 'southernTo': southernTo, 'westFrom': westFrom, 'westTo': westTo, 'systemTotalFrom': systemTotalFrom, 'systemTotalTo': systemTotalTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -333,6 +784,27 @@ class IhLoadFcastByWznRow(Row):
systemTotal: Decimal | None
west: Decimal | None
+ class IhLoadFcastByWznHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ intervalEnding: datetime | None
+ coast: Decimal | None
+ east: Decimal | None
+ farWest: Decimal | None
+ north: Decimal | None
+ northCentral: Decimal | None
+ southCentral: Decimal | None
+ southern: Decimal | None
+ west: Decimal | None
+ systemTotal: Decimal | None
+ model: str | None
+ inUseFlag: bool | None
+ DSTFlag: bool | None
+
+ @property
+ def ih_load_fcast_by_wzn_history(self) -> Archive[np3_562_cd.IhLoadFcastByWznHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-562-cd', np3_562_cd.IhLoadFcastByWznHistoryRow, {'IntervalEnding': 'intervalEnding', 'Coast': 'coast', 'East': 'east', 'FarWest': 'farWest', 'North': 'north', 'NorthCentral': 'northCentral', 'SouthCentral': 'southCentral', 'Southern': 'southern', 'West': 'west', 'SystemTotal': 'systemTotal', 'Model': 'model', 'InUseFlag': 'inUseFlag', 'DSTFlag': 'DSTFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=())
+
def ih_load_fcast_by_wzn(self, *, farWestFrom: Decimal | None = None, farWestTo: Decimal | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, northCentralFrom: Decimal | None = None, northCentralTo: Decimal | None = None, southCentralFrom: Decimal | None = None, southCentralTo: Decimal | None = None, southernFrom: Decimal | None = None, southernTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, systemTotalFrom: Decimal | None = None, systemTotalTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, coastFrom: Decimal | None = None, coastTo: Decimal | None = None, eastFrom: Decimal | None = None, eastTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_562_cd.IhLoadFcastByWznRow]:
'Intra-Hour Load Forecast by Weather Zone'
return self._client._page('/np3-562-cd/ih_load_fcast_by_wzn', np3_562_cd.IhLoadFcastByWznRow, {'farWestFrom': farWestFrom, 'farWestTo': farWestTo, 'northFrom': northFrom, 'northTo': northTo, 'northCentralFrom': northCentralFrom, 'northCentralTo': northCentralTo, 'southCentralFrom': southCentralFrom, 'southCentralTo': southCentralTo, 'southernFrom': southernFrom, 'southernTo': southernTo, 'westFrom': westFrom, 'westTo': westTo, 'systemTotalFrom': systemTotalFrom, 'systemTotalTo': systemTotalTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'coastFrom': coastFrom, 'coastTo': coastTo, 'eastFrom': eastFrom, 'eastTo': eastTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -370,6 +842,28 @@ class LfByModelWeatherZoneRow(Row):
systemTotal: Decimal | None
west: Decimal | None
+ class LfByModelWeatherZoneHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ coast: Decimal | None
+ east: Decimal | None
+ farWest: Decimal | None
+ north: Decimal | None
+ northCentral: Decimal | None
+ southCentral: Decimal | None
+ southern: Decimal | None
+ west: Decimal | None
+ systemTotal: Decimal | None
+ model: str | None
+ inUseFlag: bool | None
+ DSTFlag: bool | None
+
+ @property
+ def lf_by_model_weather_zone_history(self) -> Archive[np3_565_cd.LfByModelWeatherZoneHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-565-cd', np3_565_cd.LfByModelWeatherZoneHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Coast': 'coast', 'East': 'east', 'FarWest': 'farWest', 'North': 'north', 'NorthCentral': 'northCentral', 'SouthCentral': 'southCentral', 'Southern': 'southern', 'West': 'west', 'SystemTotal': 'systemTotal', 'Model': 'model', 'InUseFlag': 'inUseFlag', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=())
+
def lf_by_model_weather_zone(self, *, DSTFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, coastFrom: Decimal | None = None, coastTo: Decimal | None = None, eastFrom: Decimal | None = None, eastTo: Decimal | None = None, farWestFrom: Decimal | None = None, farWestTo: Decimal | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, northCentralFrom: Decimal | None = None, northCentralTo: Decimal | None = None, southCentralFrom: Decimal | None = None, southCentralTo: Decimal | None = None, southernFrom: Decimal | None = None, southernTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, systemTotalFrom: Decimal | None = None, systemTotalTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_565_cd.LfByModelWeatherZoneRow]:
'Seven-Day Load Forecast by Model and Weather Zone'
return self._client._page('/np3-565-cd/lf_by_model_weather_zone', np3_565_cd.LfByModelWeatherZoneRow, {'DSTFlag': DSTFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'coastFrom': coastFrom, 'coastTo': coastTo, 'eastFrom': eastFrom, 'eastTo': eastTo, 'farWestFrom': farWestFrom, 'farWestTo': farWestTo, 'northFrom': northFrom, 'northTo': northTo, 'northCentralFrom': northCentralFrom, 'northCentralTo': northCentralTo, 'southCentralFrom': southCentralFrom, 'southCentralTo': southCentralTo, 'southernFrom': southernFrom, 'southernTo': southernTo, 'westFrom': westFrom, 'westTo': westTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'systemTotalFrom': systemTotalFrom, 'systemTotalTo': systemTotalTo, 'model': model, 'inUseFlag': inUseFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -398,6 +892,19 @@ class LfByModelStudyAreaRow(Row):
postedDatetime: datetime | None
valley: Decimal | None
+ class LfByModelStudyAreaHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ valley: Decimal | None
+ model: str | None
+ DSTFlag: bool | None
+
+ @property
+ def lf_by_model_study_area_history(self) -> Archive[np3_566_cd.LfByModelStudyAreaHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-566-cd', np3_566_cd.LfByModelStudyAreaHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Valley': 'valley', 'Model': 'model', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=())
+
def lf_by_model_study_area(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, valleyFrom: Decimal | None = None, valleyTo: Decimal | None = None, model: str | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_566_cd.LfByModelStudyAreaRow]:
'Seven-Day Load Forecast by Model and Study Area'
return self._client._page('/np3-566-cd/lf_by_model_study_area', np3_566_cd.LfByModelStudyAreaRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'valleyFrom': valleyFrom, 'valleyTo': valleyTo, 'model': model, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -449,6 +956,42 @@ class StSysAdequacyRow(Row):
postedDatetime: datetime | None
repeatHourFlag: bool | None
+ class StSysAdequacyHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ capGenResSouth: Decimal | None = None
+ capGenResNorth: Decimal | None = None
+ capGenResWest: Decimal | None = None
+ capGenResHouston: Decimal | None = None
+ capLoadResSouth: Decimal | None = None
+ capLoadResNorth: Decimal | None = None
+ capLoadResWest: Decimal | None = None
+ capLoadResHouston: Decimal | None = None
+ offAvailMWSouth: Decimal | None = None
+ offAvailMWNorth: Decimal | None = None
+ offAvailMWWest: Decimal | None = None
+ offAvailMWHouston: Decimal | None = None
+ availCapGen: Decimal | None = None
+ availCapRes: Decimal | None = None
+ capGenRes: Decimal | None
+ capLoadRes: Decimal | None
+ offAvailMW: Decimal | None = None
+ capREGUP: Decimal | None = None
+ capREGDN: Decimal | None = None
+ capRRS: Decimal | None = None
+ capECRS: Decimal | None = None
+ capNSPIN: Decimal | None = None
+ capREGUPRRS: Decimal | None = None
+ capREGUPRRSECRS: Decimal | None = None
+ capREGUPRRSECRSNSPIN: Decimal | None = None
+ repeatHourFlag: bool | None
+
+ @property
+ def st_sys_adequacy_history(self) -> Archive[np3_763_cd.StSysAdequacyHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-763-cd', np3_763_cd.StSysAdequacyHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'CapGenResSouth': 'capGenResSouth', 'CapGenResNorth': 'capGenResNorth', 'CapGenResWest': 'capGenResWest', 'CapGenResHouston': 'capGenResHouston', 'CapLoadResSouth': 'capLoadResSouth', 'CapLoadResNorth': 'capLoadResNorth', 'CapLoadResWest': 'capLoadResWest', 'CapLoadResHouston': 'capLoadResHouston', 'OfflineAvailableMWSouth': 'offAvailMWSouth', 'OfflineAvailableMWNorth': 'offAvailMWNorth', 'OfflineAvailableMWWest': 'offAvailMWWest', 'OfflineAvailableMWHouston': 'offAvailMWHouston', 'AvailCapGen': 'availCapGen', 'AvailCapReserve': 'availCapRes', 'CapGenResTotal': 'capGenRes', 'CapLoadResTotal': 'capLoadRes', 'OfflineAvailableMWTotal': 'offAvailMW', 'CapREGUPTotal': 'capREGUP', 'CapREGDNTotal': 'capREGDN', 'CapRRSTotal': 'capRRS', 'CapECRSTotal': 'capECRS', 'CapNSPINTotal': 'capNSPIN', 'CapREGUP_RRSTotal': 'capREGUPRRS', 'CapREGUP_RRS_ECRSTotal': 'capREGUPRRSECRS', 'CapREGUP_RRS_ECRS_NSPINTotal': 'capREGUPRRSECRSNSPIN', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=({'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'TotalCapGenRes': 'capGenRes', 'TotalCapLoadRes': 'capLoadRes', 'DSTFlag': 'repeatHourFlag'},))
+
def st_sys_adequacy(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: Decimal | None = None, hourEndingTo: Decimal | None = None, capGenResSouthFrom: Decimal | None = None, capGenResSouthTo: Decimal | None = None, capGenResNorthFrom: Decimal | None = None, capGenResNorthTo: Decimal | None = None, capGenResWestFrom: Decimal | None = None, capGenResWestTo: Decimal | None = None, capGenResHoustonFrom: Decimal | None = None, capGenResHoustonTo: Decimal | None = None, capLoadResSouthFrom: Decimal | None = None, capLoadResSouthTo: Decimal | None = None, capLoadResNorthFrom: Decimal | None = None, capLoadResNorthTo: Decimal | None = None, capLoadResWestFrom: Decimal | None = None, capLoadResWestTo: Decimal | None = None, capLoadResHoustonFrom: Decimal | None = None, capLoadResHoustonTo: Decimal | None = None, offAvailMWSouthFrom: Decimal | None = None, offAvailMWSouthTo: Decimal | None = None, offAvailMWNorthFrom: Decimal | None = None, offAvailMWNorthTo: Decimal | None = None, offAvailMWWestFrom: Decimal | None = None, offAvailMWWestTo: Decimal | None = None, offAvailMWHoustonFrom: Decimal | None = None, offAvailMWHoustonTo: Decimal | None = None, availCapGenFrom: Decimal | None = None, availCapGenTo: Decimal | None = None, availCapResFrom: Decimal | None = None, availCapResTo: Decimal | None = None, capGenResFrom: Decimal | None = None, capGenResTo: Decimal | None = None, capLoadResFrom: Decimal | None = None, capLoadResTo: Decimal | None = None, offAvailMWFrom: Decimal | None = None, offAvailMWTo: Decimal | None = None, capREGUPFrom: Decimal | None = None, capREGUPTo: Decimal | None = None, capREGDNFrom: Decimal | None = None, capREGDNTo: Decimal | None = None, capRRSFrom: Decimal | None = None, capRRSTo: Decimal | None = None, capECRSFrom: Decimal | None = None, capECRSTo: Decimal | None = None, capNSPINFrom: Decimal | None = None, capNSPINTo: Decimal | None = None, capREGUPRRSFrom: Decimal | None = None, capREGUPRRSTo: Decimal | None = None, capREGUPRRSECRSFrom: Decimal | None = None, capREGUPRRSECRSTo: Decimal | None = None, capREGUPRRSECRSNSPINFrom: Decimal | None = None, capREGUPRRSECRSNSPINTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_763_cd.StSysAdequacyRow]:
'Short-Term System Adequacy'
return self._client._page('/np3-763-cd/st_sys_adequacy', np3_763_cd.StSysAdequacyRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'capGenResSouthFrom': capGenResSouthFrom, 'capGenResSouthTo': capGenResSouthTo, 'capGenResNorthFrom': capGenResNorthFrom, 'capGenResNorthTo': capGenResNorthTo, 'capGenResWestFrom': capGenResWestFrom, 'capGenResWestTo': capGenResWestTo, 'capGenResHoustonFrom': capGenResHoustonFrom, 'capGenResHoustonTo': capGenResHoustonTo, 'capLoadResSouthFrom': capLoadResSouthFrom, 'capLoadResSouthTo': capLoadResSouthTo, 'capLoadResNorthFrom': capLoadResNorthFrom, 'capLoadResNorthTo': capLoadResNorthTo, 'capLoadResWestFrom': capLoadResWestFrom, 'capLoadResWestTo': capLoadResWestTo, 'capLoadResHoustonFrom': capLoadResHoustonFrom, 'capLoadResHoustonTo': capLoadResHoustonTo, 'offAvailMWSouthFrom': offAvailMWSouthFrom, 'offAvailMWSouthTo': offAvailMWSouthTo, 'offAvailMWNorthFrom': offAvailMWNorthFrom, 'offAvailMWNorthTo': offAvailMWNorthTo, 'offAvailMWWestFrom': offAvailMWWestFrom, 'offAvailMWWestTo': offAvailMWWestTo, 'offAvailMWHoustonFrom': offAvailMWHoustonFrom, 'offAvailMWHoustonTo': offAvailMWHoustonTo, 'availCapGenFrom': availCapGenFrom, 'availCapGenTo': availCapGenTo, 'availCapResFrom': availCapResFrom, 'availCapResTo': availCapResTo, 'capGenResFrom': capGenResFrom, 'capGenResTo': capGenResTo, 'capLoadResFrom': capLoadResFrom, 'capLoadResTo': capLoadResTo, 'offAvailMWFrom': offAvailMWFrom, 'offAvailMWTo': offAvailMWTo, 'capREGUPFrom': capREGUPFrom, 'capREGUPTo': capREGUPTo, 'capREGDNFrom': capREGDNFrom, 'capREGDNTo': capREGDNTo, 'capRRSFrom': capRRSFrom, 'capRRSTo': capRRSTo, 'capECRSFrom': capECRSFrom, 'capECRSTo': capECRSTo, 'capNSPINFrom': capNSPINFrom, 'capNSPINTo': capNSPINTo, 'capREGUPRRSFrom': capREGUPRRSFrom, 'capREGUPRRSTo': capREGUPRRSTo, 'capREGUPRRSECRSFrom': capREGUPRRSECRSFrom, 'capREGUPRRSECRSTo': capREGUPRRSECRSTo, 'capREGUPRRSECRSNSPINFrom': capREGUPRRSECRSNSPINFrom, 'capREGUPRRSECRSNSPINTo': capREGUPRRSECRSNSPINTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -480,6 +1023,23 @@ class HrlyRucOnlineScedOfflineCopRow(Row):
sumSCEDSouth: Decimal | None
sumSCEDWest: Decimal | None
+ class HrlyRucOnlineScedOfflineCopHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: str | None
+ RUCTimestamp: datetime | None
+ SCEDTimestamp: datetime | None
+ sumSCEDSouth: Decimal | None = None
+ sumSCEDNorth: Decimal | None = None
+ sumSCEDWest: Decimal | None = None
+ sumSCEDHouston: Decimal | None = None
+ DSTFlag: bool | None
+ sumSCEDTotal: Decimal | None = None
+
+ @property
+ def hrly_ruc_online_sced_offline_cop_history(self) -> Archive[np3_764_cd.HrlyRucOnlineScedOfflineCopHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-764-cd', np3_764_cd.HrlyRucOnlineScedOfflineCopHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'RUCTimestamp': 'RUCTimestamp', 'SCEDTimestamp': 'SCEDTimestamp', 'SumSCEDHSLsOnlineSCEDOfflineCOPSouth': 'sumSCEDSouth', 'SumSCEDHSLsOnlineSCEDOfflineCOPNorth': 'sumSCEDNorth', 'SumSCEDHSLsOnlineSCEDOfflineCOPWest': 'sumSCEDWest', 'SumSCEDHSLsOnlineSCEDOfflineCOPHouston': 'sumSCEDHouston', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'RUCTimestamp': '%m/%d/%Y %H:%M:%S', 'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'RUCTimestamp': 'RUCTimestamp', 'SCEDTimestamp': 'SCEDTimestamp', 'SumSCEDHSLsOnlineSCEDOfflineCOP': 'sumSCEDTotal', 'DSTFlag': 'DSTFlag'},))
+
def hrly_ruc_online_sced_offline_cop(self, *, sumSCEDWestFrom: Decimal | None = None, sumSCEDWestTo: Decimal | None = None, sumSCEDHoustonFrom: Decimal | None = None, sumSCEDHoustonTo: Decimal | None = None, DSTFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, sumSCEDSouthFrom: Decimal | None = None, sumSCEDSouthTo: Decimal | None = None, sumSCEDNorthFrom: Decimal | None = None, sumSCEDNorthTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_764_cd.HrlyRucOnlineScedOfflineCopRow]:
'Hourly RUC Online in SCED Offline in COP Report'
return self._client._page('/np3-764-cd/hrly_ruc_online_sced_offline_cop', np3_764_cd.HrlyRucOnlineScedOfflineCopRow, {'sumSCEDWestFrom': sumSCEDWestFrom, 'sumSCEDWestTo': sumSCEDWestTo, 'sumSCEDHoustonFrom': sumSCEDHoustonFrom, 'sumSCEDHoustonTo': sumSCEDHoustonTo, 'DSTFlag': DSTFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'sumSCEDSouthFrom': sumSCEDSouthFrom, 'sumSCEDSouthTo': sumSCEDSouthTo, 'sumSCEDNorthFrom': sumSCEDNorthFrom, 'sumSCEDNorthTo': sumSCEDNorthTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -509,6 +1069,20 @@ class ApprovedDctieSchedulesRow(Row):
postedDatetime: datetime | None
repeatHourFlag: bool | None
+ class ApprovedDctieSchedulesHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ DCTie: str | None
+ GMTIntervalEnding: datetime | None
+ intervalEnding: datetime | None
+ repeatHourFlag: bool | None
+ MW: Decimal | None
+ importExport: str | None
+
+ @property
+ def approved_dctie_schedules_history(self) -> Archive[np3_765_cd.ApprovedDctieSchedulesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-765-cd', np3_765_cd.ApprovedDctieSchedulesHistoryRow, {'DC_Tie': 'DCTie', 'GMT_Interval_Ending': 'GMTIntervalEnding', 'Interval_Ending': 'intervalEnding', 'Repeated_Hour': 'repeatHourFlag', 'MW': 'MW', 'Import_Export': 'importExport'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'GMTIntervalEnding': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=())
+
def approved_dctie_schedules(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, DCTie: str | None = None, GMTIntervalEndingFrom: datetime | None = None, GMTIntervalEndingTo: datetime | None = None, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, repeatHourFlag: bool | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, importExport: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_765_cd.ApprovedDctieSchedulesRow]:
'Approved DC Tie Schedules'
return self._client._page('/np3-765-cd/approved_dctie_schedules', np3_765_cd.ApprovedDctieSchedulesRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'DCTie': DCTie, 'GMTIntervalEndingFrom': GMTIntervalEndingFrom, 'GMTIntervalEndingTo': GMTIntervalEndingTo, 'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'repeatHourFlag': repeatHourFlag, 'MWFrom': MWFrom, 'MWTo': MWTo, 'importExport': importExport, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -535,6 +1109,11 @@ class _2dayAggScedAsOffersEcrsmRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_ecrsm_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersEcrsmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersEcrsmRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'ECRSM Offer Price': 'ECRSMOfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_ECRSM-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_ecrsm(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, ECRSMOfferPriceFrom: Decimal | None = None, ECRSMOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersEcrsmRow]:
'2-Day Aggregate SCED Ancillary Offer Curves ECRSM'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_ecrsm', np3_906_ex._2dayAggScedAsOffersEcrsmRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'ECRSMOfferPriceFrom': ECRSMOfferPriceFrom, 'ECRSMOfferPriceTo': ECRSMOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -556,6 +1135,11 @@ class _2dayAggScedAsOffersEcrssRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_ecrss_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersEcrssRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersEcrssRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'ECRSS Offer Price': 'ECRSSOfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_ECRSS-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_ecrss(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, ECRSSOfferPriceFrom: Decimal | None = None, ECRSSOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersEcrssRow]:
'2-Day Aggregate SCED Ancillary Offer Curves ECRSS'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_ecrss', np3_906_ex._2dayAggScedAsOffersEcrssRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'ECRSSOfferPriceFrom': ECRSSOfferPriceFrom, 'ECRSSOfferPriceTo': ECRSSOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -577,6 +1161,11 @@ class _2dayAggScedAsOffersNspinRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_nspin_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersNspinRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersNspinRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'NSPIN Offer Price': 'NSPINOfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_NSPIN-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_nspin(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, NSPINOfferPriceFrom: Decimal | None = None, NSPINOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersNspinRow]:
'2-Day Aggregate SCED Ancillary Offer Curves NSPIN'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_nspin', np3_906_ex._2dayAggScedAsOffersNspinRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'NSPINOfferPriceFrom': NSPINOfferPriceFrom, 'NSPINOfferPriceTo': NSPINOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -598,6 +1187,11 @@ class _2dayAggScedAsOffersNspnmRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_nspnm_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersNspnmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersNspnmRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'NSPNM Offer Price': 'NSPNMOfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_NSPNM-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_nspnm(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, NSPNMOfferPriceFrom: Decimal | None = None, NSPNMOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersNspnmRow]:
'2-Day Aggregate SCED Ancillary Offer Curves NSPNM'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_nspnm', np3_906_ex._2dayAggScedAsOffersNspnmRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'NSPNMOfferPriceFrom': NSPNMOfferPriceFrom, 'NSPNMOfferPriceTo': NSPNMOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -619,6 +1213,11 @@ class _2dayAggScedAsOffersRegdnRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_regdn_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersRegdnRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersRegdnRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'REGDN Offer Price': 'REGDNOfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_REGDN-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_regdn(self, *, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, REGDNOfferPriceFrom: Decimal | None = None, REGDNOfferPriceTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersRegdnRow]:
'2-Day Aggregate SCED Ancillary Offer Curves REGDN'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_regdn', np3_906_ex._2dayAggScedAsOffersRegdnRow, {'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'REGDNOfferPriceFrom': REGDNOfferPriceFrom, 'REGDNOfferPriceTo': REGDNOfferPriceTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -640,6 +1239,11 @@ class _2dayAggScedAsOffersRegupRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_regup_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersRegupRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersRegupRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'REGUP Offer Price': 'REGUPOfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_REGUP-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_regup(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, REGUPOfferPriceFrom: Decimal | None = None, REGUPOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersRegupRow]:
'2-Day Aggregate SCED Ancillary Offer Curves REGUP'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_regup', np3_906_ex._2dayAggScedAsOffersRegupRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'REGUPOfferPriceFrom': REGUPOfferPriceFrom, 'REGUPOfferPriceTo': REGUPOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -661,6 +1265,11 @@ class _2dayAggScedAsOffersRrsffrRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_rrsffr_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersRrsffrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersRrsffrRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'RRSFFR Offer Price': 'RRSFFROfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_RRSFFR-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_rrsffr(self, *, RRSFFROfferPriceFrom: Decimal | None = None, RRSFFROfferPriceTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersRrsffrRow]:
'2-Day Aggregate SCED Ancillary Offer Curves RRSFFR'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_rrsffr', np3_906_ex._2dayAggScedAsOffersRrsffrRow, {'RRSFFROfferPriceFrom': RRSFFROfferPriceFrom, 'RRSFFROfferPriceTo': RRSFFROfferPriceTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -682,6 +1291,11 @@ class _2dayAggScedAsOffersRrspfrRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_rrspfr_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersRrspfrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersRrspfrRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'RRSPFR Offer Price': 'RRSPFROfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_RRSPFR-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_rrspfr(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, RRSPFROfferPriceFrom: Decimal | None = None, RRSPFROfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersRrspfrRow]:
'2-Day Aggregate SCED Ancillary Offer Curves RRSPFR'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_rrspfr', np3_906_ex._2dayAggScedAsOffersRrspfrRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'RRSPFROfferPriceFrom': RRSPFROfferPriceFrom, 'RRSPFROfferPriceTo': RRSPFROfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -703,6 +1317,11 @@ class _2dayAggScedAsOffersRrsufrRow(Row):
SCEDTimestamp: datetime | None
repeatHourFlag: bool | None
+ @property
+ def _2day_agg_sced_as_offers_rrsufr_history(self) -> Archive[np3_906_ex._2dayAggScedAsOffersRrsufrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-906-ex', np3_906_ex._2dayAggScedAsOffersRrsufrRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'MW Offered': 'MWOffered', 'RRSUFR Offer Price': 'RRSUFROfferPrice'}, {}, member='2day_Agg_SCED_AS_Offers_RRSUFR-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2day_agg_sced_as_offers_rrsufr(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, RRSUFROfferPriceFrom: Decimal | None = None, RRSUFROfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_906_ex._2dayAggScedAsOffersRrsufrRow]:
'2-Day Aggregate SCED Ancillary Offer Curves RRSUFR'
return self._client._page('/np3-906-ex/2day_agg_sced_as_offers_rrsufr', np3_906_ex._2dayAggScedAsOffersRrsufrRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'RRSUFROfferPriceFrom': RRSUFROfferPriceFrom, 'RRSUFROfferPriceTo': RRSUFROfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -729,6 +1348,11 @@ class _2dAggEdcRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_edc_history(self) -> Archive[np3_907_ex._2dAggEdcRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEdcRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Demand_Curves-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_edc(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEdcRow]:
'2-Day Aggregate Energy Demand Curves'
return self._client._page('/np3-907-ex/2d_agg_edc', np3_907_ex._2dAggEdcRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -750,6 +1374,11 @@ class _2dAggEdcHoustonRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_edc_houston_history(self) -> Archive[np3_907_ex._2dAggEdcHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEdcHoustonRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Demand_Curves_Houston-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_edc_houston(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEdcHoustonRow]:
'2-Day Aggregate Energy Demand Curves Houston'
return self._client._page('/np3-907-ex/2d_agg_edc_houston', np3_907_ex._2dAggEdcHoustonRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -771,6 +1400,11 @@ class _2dAggEdcNorthRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_edc_north_history(self) -> Archive[np3_907_ex._2dAggEdcNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEdcNorthRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Demand_Curves_North-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_edc_north(self, *, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEdcNorthRow]:
'2-Day Aggregate Energy Demand Curves North'
return self._client._page('/np3-907-ex/2d_agg_edc_north', np3_907_ex._2dAggEdcNorthRow, {'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -792,6 +1426,11 @@ class _2dAggEdcSouthRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_edc_south_history(self) -> Archive[np3_907_ex._2dAggEdcSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEdcSouthRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Demand_Curves_South-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_edc_south(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEdcSouthRow]:
'2-Day Aggregate Energy Demand Curves South'
return self._client._page('/np3-907-ex/2d_agg_edc_south', np3_907_ex._2dAggEdcSouthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -813,6 +1452,11 @@ class _2dAggEdcWestRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_edc_west_history(self) -> Archive[np3_907_ex._2dAggEdcWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEdcWestRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Demand_Curves_West-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_edc_west(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEdcWestRow]:
'2-Day Aggregate Energy Demand Curves West'
return self._client._page('/np3-907-ex/2d_agg_edc_west', np3_907_ex._2dAggEdcWestRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -834,6 +1478,11 @@ class _2dAggEscRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_esc_history(self) -> Archive[np3_907_ex._2dAggEscRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEscRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Supply_Curves-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_esc(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEscRow]:
'2-Day Aggregate Energy Supply Curves'
return self._client._page('/np3-907-ex/2d_agg_esc', np3_907_ex._2dAggEscRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -855,6 +1504,11 @@ class _2dAggEscHoustonRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_esc_houston_history(self) -> Archive[np3_907_ex._2dAggEscHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEscHoustonRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Supply_Curves_Houston-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_esc_houston(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEscHoustonRow]:
'2-Day Aggregate Energy Supply Curves Houston'
return self._client._page('/np3-907-ex/2d_agg_esc_houston', np3_907_ex._2dAggEscHoustonRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -876,6 +1530,11 @@ class _2dAggEscNorthRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_esc_north_history(self) -> Archive[np3_907_ex._2dAggEscNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEscNorthRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Supply_Curves_North-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_esc_north(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEscNorthRow]:
'2-Day Aggregate Energy Supply Curves North'
return self._client._page('/np3-907-ex/2d_agg_esc_north', np3_907_ex._2dAggEscNorthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -897,6 +1556,11 @@ class _2dAggEscSouthRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_esc_south_history(self) -> Archive[np3_907_ex._2dAggEscSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEscSouthRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Supply_Curves_South-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_esc_south(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEscSouthRow]:
'2-Day Aggregate Energy Supply Curves South'
return self._client._page('/np3-907-ex/2d_agg_esc_south', np3_907_ex._2dAggEscSouthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -918,6 +1582,11 @@ class _2dAggEscWestRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_esc_west_history(self) -> Archive[np3_907_ex._2dAggEscWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggEscWestRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Energy_Supply_Curves_West-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_esc_west(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggEscWestRow]:
'2-Day Aggregate Energy Supply Curves West'
return self._client._page('/np3-907-ex/2d_agg_esc_west', np3_907_ex._2dAggEscWestRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -939,6 +1608,11 @@ class _2dAggMinEscRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_min_esc_history(self) -> Archive[np3_907_ex._2dAggMinEscRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggMinEscRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Min_Energy_Supply_Curves-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_min_esc(self, *, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggMinEscRow]:
'2-Day Aggregate Minimum Energy Supply Curves'
return self._client._page('/np3-907-ex/2d_agg_min_esc', np3_907_ex._2dAggMinEscRow, {'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -960,6 +1634,11 @@ class _2dAggMinEscHoustonRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_min_esc_houston_history(self) -> Archive[np3_907_ex._2dAggMinEscHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggMinEscHoustonRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Min_Energy_Supply_Curves_Houston-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_min_esc_houston(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggMinEscHoustonRow]:
'2-Day Aggregate Minimum Energy Supply Curves Houston'
return self._client._page('/np3-907-ex/2d_agg_min_esc_houston', np3_907_ex._2dAggMinEscHoustonRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -981,6 +1660,11 @@ class _2dAggMinEscNorthRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_min_esc_north_history(self) -> Archive[np3_907_ex._2dAggMinEscNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggMinEscNorthRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Min_Energy_Supply_Curves_North-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_min_esc_north(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggMinEscNorthRow]:
'2-Day Aggregate Minimum Energy Supply Curves North'
return self._client._page('/np3-907-ex/2d_agg_min_esc_north', np3_907_ex._2dAggMinEscNorthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1002,6 +1686,11 @@ class _2dAggMinEscSouthRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_min_esc_south_history(self) -> Archive[np3_907_ex._2dAggMinEscSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggMinEscSouthRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Min_Energy_Supply_Curves_South-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_min_esc_south(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggMinEscSouthRow]:
'2-Day Aggregate Minimum Energy Supply Curves South'
return self._client._page('/np3-907-ex/2d_agg_min_esc_south', np3_907_ex._2dAggMinEscSouthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1023,6 +1712,11 @@ class _2dAggMinEscWestRow(Row):
hourEnding: int | None
price: Decimal | None
+ @property
+ def _2d_agg_min_esc_west_history(self) -> Archive[np3_907_ex._2dAggMinEscWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-907-ex', np3_907_ex._2dAggMinEscWestRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='2d_Agg_Min_Energy_Supply_Curves_West-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_min_esc_west(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_907_ex._2dAggMinEscWestRow]:
'2-Day Aggregate Minimum Energy Supply Curves West'
return self._client._page('/np3-907-ex/2d_agg_min_esc_west', np3_907_ex._2dAggMinEscWestRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1049,6 +1743,11 @@ class _2dAggEscEsrRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_esr_history(self) -> Archive[np3_908_er._2dAggEscEsrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscEsrRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_ESR-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_esr(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscEsrRow]:
'2-Day Aggregate Supply Curve for ESR Resources'
return self._client._page('/np3-908-er/2d_agg_esc_esr', np3_908_er._2dAggEscEsrRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1070,6 +1769,11 @@ class _2dAggEscEsrHoustonRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_esr_houston_history(self) -> Archive[np3_908_er._2dAggEscEsrHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscEsrHoustonRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_ESR_Houston-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_esr_houston(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscEsrHoustonRow]:
'2-Day Aggregate Supply Curve for ESR Resources Houston'
return self._client._page('/np3-908-er/2d_agg_esc_esr_houston', np3_908_er._2dAggEscEsrHoustonRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1091,6 +1795,11 @@ class _2dAggEscEsrNorthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_esr_north_history(self) -> Archive[np3_908_er._2dAggEscEsrNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscEsrNorthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_ESR_North-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_esr_north(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscEsrNorthRow]:
'2-Day Aggregate Supply Curve for ESR Resources North'
return self._client._page('/np3-908-er/2d_agg_esc_esr_north', np3_908_er._2dAggEscEsrNorthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1112,6 +1821,11 @@ class _2dAggEscEsrSouthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_esr_south_history(self) -> Archive[np3_908_er._2dAggEscEsrSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscEsrSouthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_ESR_South-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_esr_south(self, *, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscEsrSouthRow]:
'2-Day Aggregate Supply Curve for ESR Resources South'
return self._client._page('/np3-908-er/2d_agg_esc_esr_south', np3_908_er._2dAggEscEsrSouthRow, {'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1134,6 +1848,11 @@ class _2dAggEscEsrWestRow(Row):
price: int | None
MW: Decimal | None
+ @property
+ def _2d_agg_esc_esr_west_history(self) -> Archive[np3_908_er._2dAggEscEsrWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscEsrWestRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_ESR_West-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_esr_west(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = 'SCEDTimestamp', dir: str | None = None) -> Page[np3_908_er._2dAggEscEsrWestRow]:
'2-Day Aggregate Supply Curve for ESR Resources West'
return self._client._page('/np3-908-er/2d_agg_esc_esr_west', np3_908_er._2dAggEscEsrWestRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1155,6 +1874,11 @@ class _2dAggEscNonirrHoustonRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_nonirr_houston_history(self) -> Archive[np3_908_er._2dAggEscNonirrHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonirrHoustonRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_IRR_Houston-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_nonirr_houston(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscNonirrHoustonRow]:
'2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources Houston'
return self._client._page('/np3-908-er/2d_agg_esc_nonirr_houston', np3_908_er._2dAggEscNonirrHoustonRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1176,6 +1900,11 @@ class _2dAggEscNonirrNorthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_nonirr_north_history(self) -> Archive[np3_908_er._2dAggEscNonirrNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonirrNorthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_IRR_North-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_nonirr_north(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscNonirrNorthRow]:
'2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources North'
return self._client._page('/np3-908-er/2d_agg_esc_nonirr_north', np3_908_er._2dAggEscNonirrNorthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1197,6 +1926,11 @@ class _2dAggEscNonirrSouthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_nonirr_south_history(self) -> Archive[np3_908_er._2dAggEscNonirrSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonirrSouthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_IRR_South-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_nonirr_south(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscNonirrSouthRow]:
'2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources South'
return self._client._page('/np3-908-er/2d_agg_esc_nonirr_south', np3_908_er._2dAggEscNonirrSouthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1218,6 +1952,11 @@ class _2dAggEscNonirrWestRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_nonirr_west_history(self) -> Archive[np3_908_er._2dAggEscNonirrWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonirrWestRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_IRR_West-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_nonirr_west(self, *, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscNonirrWestRow]:
'2-Day Aggregate Supply Curve for Non-Intermittent Renewable Resources West'
return self._client._page('/np3-908-er/2d_agg_esc_nonirr_west', np3_908_er._2dAggEscNonirrWestRow, {'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1239,6 +1978,11 @@ class _2dAggEscPvgrRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_pvgr_history(self) -> Archive[np3_908_er._2dAggEscPvgrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscPvgrRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_PVGR-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_pvgr(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscPvgrRow]:
'2-Day Aggregate Supply Curve for Photovoltaic Resources'
return self._client._page('/np3-908-er/2d_agg_esc_pvgr', np3_908_er._2dAggEscPvgrRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1260,6 +2004,11 @@ class _2dAggEscPvgrHoustonRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_pvgr_houston_history(self) -> Archive[np3_908_er._2dAggEscPvgrHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscPvgrHoustonRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_PVGR_Houston-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_pvgr_houston(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscPvgrHoustonRow]:
'2-Day Aggregate Supply Curve for Photovoltaic Resources Houston'
return self._client._page('/np3-908-er/2d_agg_esc_pvgr_houston', np3_908_er._2dAggEscPvgrHoustonRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1281,6 +2030,11 @@ class _2dAggEscPvgrNorthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_pvgr_north_history(self) -> Archive[np3_908_er._2dAggEscPvgrNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscPvgrNorthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_PVGR_North-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_pvgr_north(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscPvgrNorthRow]:
'2-Day Aggregate Supply Curve for Photovoltaic Resources North'
return self._client._page('/np3-908-er/2d_agg_esc_pvgr_north', np3_908_er._2dAggEscPvgrNorthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1302,6 +2056,11 @@ class _2dAggEscPvgrSouthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_pvgr_south_history(self) -> Archive[np3_908_er._2dAggEscPvgrSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscPvgrSouthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_PVGR_South-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_pvgr_south(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscPvgrSouthRow]:
'2-Day Aggregate Supply Curve for Photovoltaic Resources South'
return self._client._page('/np3-908-er/2d_agg_esc_pvgr_south', np3_908_er._2dAggEscPvgrSouthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1323,6 +2082,11 @@ class _2dAggEscPvgrWestRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_pvgr_west_history(self) -> Archive[np3_908_er._2dAggEscPvgrWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscPvgrWestRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_PVGR_West-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_pvgr_west(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscPvgrWestRow]:
'2-Day Aggregate Supply Curve for Photovoltaic Resources West'
return self._client._page('/np3-908-er/2d_agg_esc_pvgr_west', np3_908_er._2dAggEscPvgrWestRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1344,6 +2108,11 @@ class _2dAggEscWindRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_wind_history(self) -> Archive[np3_908_er._2dAggEscWindRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscWindRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Wind-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_wind(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscWindRow]:
'2-Day Aggregate Supply Curve for Wind Resources'
return self._client._page('/np3-908-er/2d_agg_esc_wind', np3_908_er._2dAggEscWindRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1365,6 +2134,11 @@ class _2dAggEscWindHoustonRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_wind_houston_history(self) -> Archive[np3_908_er._2dAggEscWindHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscWindHoustonRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Wind_Houston-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_wind_houston(self, *, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscWindHoustonRow]:
'2-Day Aggregate Supply Curve for Wind Resources Houston'
return self._client._page('/np3-908-er/2d_agg_esc_wind_houston', np3_908_er._2dAggEscWindHoustonRow, {'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1386,6 +2160,11 @@ class _2dAggEscWindNorthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_wind_north_history(self) -> Archive[np3_908_er._2dAggEscWindNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscWindNorthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Wind_North-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_wind_north(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscWindNorthRow]:
'2-Day Aggregate Supply Curve for Wind Resources North'
return self._client._page('/np3-908-er/2d_agg_esc_wind_north', np3_908_er._2dAggEscWindNorthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1407,6 +2186,11 @@ class _2dAggEscWindSouthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_wind_south_history(self) -> Archive[np3_908_er._2dAggEscWindSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscWindSouthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Wind_South-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_wind_south(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscWindSouthRow]:
'2-Day Aggregate Supply Curve for Wind Resources South'
return self._client._page('/np3-908-er/2d_agg_esc_wind_south', np3_908_er._2dAggEscWindSouthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1428,6 +2212,11 @@ class _2dAggEscWindWestRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_wind_west_history(self) -> Archive[np3_908_er._2dAggEscWindWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscWindWestRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Wind_West-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_wind_west(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscWindWestRow]:
'2-Day Aggregate Supply Curve for Wind Resources West'
return self._client._page('/np3-908-er/2d_agg_esc_wind_west', np3_908_er._2dAggEscWindWestRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1449,6 +2238,11 @@ class _2dAggEscNonirrRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_esc_nonirr_history(self) -> Archive[np3_908_er._2dAggEscNonirrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonirrRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_IRR-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_esc_nonirr(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEscNonirrRow]:
'2-Day Aggregate Supply Curves for Non-Intermittent Renewable Resources'
return self._client._page('/np3-908-er/2d_agg_esc_nonirr', np3_908_er._2dAggEscNonirrRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1470,6 +2264,11 @@ class _2dAggEdcClrRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_edc_clr_history(self) -> Archive[np3_908_er._2dAggEdcClrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEdcClrRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'PRICE': 'price', 'MW': 'MW'}, {}, member='*_Energy_Demand_Curves_CLR-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_edc_clr(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEdcClrRow]:
'2-Day Aggregated Energy Demand Curves CLR'
return self._client._page('/np3-908-er/2d_agg_edc_clr', np3_908_er._2dAggEdcClrRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1491,6 +2290,11 @@ class _2dAggEdcClrHoustonRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_edc_clr_houston_history(self) -> Archive[np3_908_er._2dAggEdcClrHoustonRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEdcClrHoustonRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'PRICE': 'price', 'MW': 'MW'}, {}, member='*_Agg_Energy_Demand_Curves_CLR_Houston-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_edc_clr_houston(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEdcClrHoustonRow]:
'2-Day Aggregated Energy Demand Curves CLR Houston'
return self._client._page('/np3-908-er/2d_agg_edc_clr_houston', np3_908_er._2dAggEdcClrHoustonRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1512,6 +2316,11 @@ class _2dAggEdcClrNorthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_edc_clr_north_history(self) -> Archive[np3_908_er._2dAggEdcClrNorthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEdcClrNorthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'PRICE': 'price', 'MW': 'MW'}, {}, member='*_Agg_Energy_Demand_Curves_CLR_North-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_edc_clr_north(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEdcClrNorthRow]:
'2-Day Aggregated Energy Demand Curves CLR North'
return self._client._page('/np3-908-er/2d_agg_edc_clr_north', np3_908_er._2dAggEdcClrNorthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1533,6 +2342,11 @@ class _2dAggEdcClrSouthRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_edc_clr_south_history(self) -> Archive[np3_908_er._2dAggEdcClrSouthRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEdcClrSouthRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'PRICE': 'price', 'MW': 'MW'}, {}, member='*_Agg_Energy_Demand_Curves_CLR_South-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_edc_clr_south(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEdcClrSouthRow]:
'2-Day Aggregated Energy Demand Curves CLR South'
return self._client._page('/np3-908-er/2d_agg_edc_clr_south', np3_908_er._2dAggEdcClrSouthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1554,6 +2368,11 @@ class _2dAggEdcClrWestRow(Row):
price: int | None
repeatHourFlag: bool | None
+ @property
+ def _2d_agg_edc_clr_west_history(self) -> Archive[np3_908_er._2dAggEdcClrWestRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEdcClrWestRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'PRICE': 'price', 'MW': 'MW'}, {}, member='*_Agg_Energy_Demand_Curves_CLR_West-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_edc_clr_west(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, priceFrom: int | None = None, priceTo: int | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_908_er._2dAggEdcClrWestRow]:
'2-Day Aggregated Energy Demand Curves CLR West'
return self._client._page('/np3-908-er/2d_agg_edc_clr_west', np3_908_er._2dAggEdcClrWestRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1570,6 +2389,226 @@ def _2d_agg_edc_clr_west_iter_async(self, *, SCEDTimestampFrom: datetime | None
'2-Day Aggregated Energy Demand Curves CLR West'
return self._client._aiter('/np3-908-er/2d_agg_edc_clr_west', np3_908_er._2dAggEdcClrWestRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'priceFrom': priceFrom, 'priceTo': priceTo, 'MWFrom': MWFrom, 'MWTo': MWTo, 'size': size, 'sort': sort, 'dir': dir})
+ class _2dAggDamMinEscWestHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_min_esc_west_history(self) -> Archive[np3_908_er._2dAggDamMinEscWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamMinEscWestHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW Offered': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Min_Energy_Supply_Curves_West-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamMinEscSouthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_min_esc_south_history(self) -> Archive[np3_908_er._2dAggDamMinEscSouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamMinEscSouthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW Offered': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Min_Energy_Supply_Curves_South-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamMinEscNorthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_min_esc_north_history(self) -> Archive[np3_908_er._2dAggDamMinEscNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamMinEscNorthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW Offered': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Min_Energy_Supply_Curves_North-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamMinEscHoustonHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_min_esc_houston_history(self) -> Archive[np3_908_er._2dAggDamMinEscHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamMinEscHoustonHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW Offered': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Min_Energy_Supply_Curves_Houston-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamMinEscHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_min_esc_history(self) -> Archive[np3_908_er._2dAggDamMinEscHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamMinEscHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW Offered': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Min_Energy_Supply_Curves-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggEscNonWindHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_esc_non_wind_history(self) -> Archive[np3_908_er._2dAggEscNonWindHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonWindHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_Wind-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ class _2dAggDamEscHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_esc_history(self) -> Archive[np3_908_er._2dAggDamEscHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEscHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Supply_Curves-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggEscNonWindWestHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_esc_non_wind_west_history(self) -> Archive[np3_908_er._2dAggEscNonWindWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonWindWestHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_Wind_West-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ class _2dAggEscNonWindSouthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_esc_non_wind_south_history(self) -> Archive[np3_908_er._2dAggEscNonWindSouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonWindSouthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_Wind_South-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ class _2dAggEscNonWindNorthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_esc_non_wind_north_history(self) -> Archive[np3_908_er._2dAggEscNonWindNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonWindNorthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_Wind_North-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ class _2dAggEscNonWindHoustonHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_esc_non_wind_houston_history(self) -> Archive[np3_908_er._2dAggEscNonWindHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggEscNonWindHoustonHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Price': 'price', 'MW': 'MW'}, {}, member='*_Agg_Supply_Curves_Non_Wind_Houston-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ class _2dAggDamEscWestHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_esc_west_history(self) -> Archive[np3_908_er._2dAggDamEscWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEscWestHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Supply_Curves_West-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEscSouthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_esc_south_history(self) -> Archive[np3_908_er._2dAggDamEscSouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEscSouthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Supply_Curves_South-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEscNorthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_esc_north_history(self) -> Archive[np3_908_er._2dAggDamEscNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEscNorthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Supply_Curves_North-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEscHoustonHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_esc_houston_history(self) -> Archive[np3_908_er._2dAggDamEscHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEscHoustonHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Supply_Curves_Houston-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEdcWestHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_edc_west_history(self) -> Archive[np3_908_er._2dAggDamEdcWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEdcWestHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Demand_Curves_West-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEdcSouthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_edc_south_history(self) -> Archive[np3_908_er._2dAggDamEdcSouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEdcSouthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Demand_Curves_South-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEdcNorthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_edc_north_history(self) -> Archive[np3_908_er._2dAggDamEdcNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEdcNorthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Demand_Curves_North-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEdcHoustonHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_edc_houston_history(self) -> Archive[np3_908_er._2dAggDamEdcHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEdcHoustonHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Demand_Curves_Houston-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggDamEdcHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ price: Decimal | None
+ MW: Decimal | None
+
+ @property
+ def _2d_agg_dam_edc_history(self) -> Archive[np3_908_er._2dAggDamEdcHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-908-er', np3_908_er._2dAggDamEdcHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Price': 'price', 'MW': 'MW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_Energy_Demand_Curves-[0-9]*.csv', datetimes={}, variants=())
+
class np3_909_er:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -1582,6 +2621,20 @@ class _2dPtpOblBidsRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _2dPtpOblBidsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ PTPBidPrice: Decimal | None
+ PTPBidAwardMW: Decimal | None
+ bidId: str | None = None
+
+ @property
+ def _2d_ptp_obl_bids_history(self) -> Archive[np3_909_er._2dPtpOblBidsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dPtpOblBidsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source Location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink Location for PtP Bid': 'settlementPointSink', 'PtP Bid Price': 'PTPBidPrice', 'PtP Bid MW': 'PTPBidAwardMW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_PTP_Obligation_Bids[ -]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink location for PtP Bid': 'settlementPointSink', 'PtP Bid MW': 'PTPBidAwardMW', 'PtP Bid Price': 'PTPBidPrice', 'Bid ID': 'bidId'},))
+
def _2d_ptp_obl_bids(self, *, PTPBidAwardMWFrom: Decimal | None = None, PTPBidAwardMWTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, PTPBidPriceFrom: Decimal | None = None, PTPBidPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dPtpOblBidsRow]:
'2-Day Point-to-Point Obligation Bids'
return self._client._page('/np3-909-er/2d_ptp_obl_bids', np3_909_er._2dPtpOblBidsRow, {'PTPBidAwardMWFrom': PTPBidAwardMWFrom, 'PTPBidAwardMWTo': PTPBidAwardMWTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'PTPBidPriceFrom': PTPBidPriceFrom, 'PTPBidPriceTo': PTPBidPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1605,6 +2658,20 @@ class _2dPtpOblBidsHoustonRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _2dPtpOblBidsHoustonHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ PTPBidPrice: Decimal | None
+ PTPBidAwardMW: Decimal | None
+ bidId: str | None = None
+
+ @property
+ def _2d_ptp_obl_bids_houston_history(self) -> Archive[np3_909_er._2dPtpOblBidsHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dPtpOblBidsHoustonHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source Location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink Location for PtP Bid': 'settlementPointSink', 'PtP Bid Price': 'PTPBidPrice', 'PtP Bid MW': 'PTPBidAwardMW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_PTP_Obligation_Bids_Houston[ -]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink location for PtP Bid': 'settlementPointSink', 'PtP Bid MW': 'PTPBidAwardMW', 'PtP Bid Price': 'PTPBidPrice', 'Bid ID': 'bidId'},))
+
def _2d_ptp_obl_bids_houston(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, PTPBidPriceFrom: Decimal | None = None, PTPBidPriceTo: Decimal | None = None, PTPBidAwardMWFrom: Decimal | None = None, PTPBidAwardMWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dPtpOblBidsHoustonRow]:
'2-Day Point-to-Point Obligation Bids Houston'
return self._client._page('/np3-909-er/2d_ptp_obl_bids_houston', np3_909_er._2dPtpOblBidsHoustonRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'PTPBidPriceFrom': PTPBidPriceFrom, 'PTPBidPriceTo': PTPBidPriceTo, 'PTPBidAwardMWFrom': PTPBidAwardMWFrom, 'PTPBidAwardMWTo': PTPBidAwardMWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1628,6 +2695,20 @@ class _2dPtpOblBidsNorthRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _2dPtpOblBidsNorthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ PTPBidPrice: Decimal | None
+ PTPBidAwardMW: Decimal | None
+ bidId: str | None = None
+
+ @property
+ def _2d_ptp_obl_bids_north_history(self) -> Archive[np3_909_er._2dPtpOblBidsNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dPtpOblBidsNorthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source Location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink Location for PtP Bid': 'settlementPointSink', 'PtP Bid Price': 'PTPBidPrice', 'PtP Bid MW': 'PTPBidAwardMW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_PTP_Obligation_Bids_North[ -]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink location for PtP Bid': 'settlementPointSink', 'PtP Bid MW': 'PTPBidAwardMW', 'PtP Bid Price': 'PTPBidPrice', 'Bid ID': 'bidId'},))
+
def _2d_ptp_obl_bids_north(self, *, PTPBidAwardMWFrom: Decimal | None = None, PTPBidAwardMWTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, PTPBidPriceFrom: Decimal | None = None, PTPBidPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dPtpOblBidsNorthRow]:
'2-Day Point-to-Point Obligation Bids North'
return self._client._page('/np3-909-er/2d_ptp_obl_bids_north', np3_909_er._2dPtpOblBidsNorthRow, {'PTPBidAwardMWFrom': PTPBidAwardMWFrom, 'PTPBidAwardMWTo': PTPBidAwardMWTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'PTPBidPriceFrom': PTPBidPriceFrom, 'PTPBidPriceTo': PTPBidPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1651,6 +2732,20 @@ class _2dPtpOblBidsSouthRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _2dPtpOblBidsSouthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ PTPBidPrice: Decimal | None
+ PTPBidAwardMW: Decimal | None
+ bidId: str | None = None
+
+ @property
+ def _2d_ptp_obl_bids_south_history(self) -> Archive[np3_909_er._2dPtpOblBidsSouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dPtpOblBidsSouthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source Location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink Location for PtP Bid': 'settlementPointSink', 'PtP Bid Price': 'PTPBidPrice', 'PtP Bid MW': 'PTPBidAwardMW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_PTP_Obligation_Bids_South[ -]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink location for PtP Bid': 'settlementPointSink', 'PtP Bid MW': 'PTPBidAwardMW', 'PtP Bid Price': 'PTPBidPrice', 'Bid ID': 'bidId'},))
+
def _2d_ptp_obl_bids_south(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, PTPBidPriceFrom: Decimal | None = None, PTPBidPriceTo: Decimal | None = None, PTPBidAwardMWFrom: Decimal | None = None, PTPBidAwardMWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dPtpOblBidsSouthRow]:
'2-Day Point-to-Point Obligation Bids South'
return self._client._page('/np3-909-er/2d_ptp_obl_bids_south', np3_909_er._2dPtpOblBidsSouthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'PTPBidPriceFrom': PTPBidPriceFrom, 'PTPBidPriceTo': PTPBidPriceTo, 'PTPBidAwardMWFrom': PTPBidAwardMWFrom, 'PTPBidAwardMWTo': PTPBidAwardMWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1674,6 +2769,20 @@ class _2dPtpOblBidsWestRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _2dPtpOblBidsWestHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ PTPBidPrice: Decimal | None
+ PTPBidAwardMW: Decimal | None
+ bidId: str | None = None
+
+ @property
+ def _2d_ptp_obl_bids_west_history(self) -> Archive[np3_909_er._2dPtpOblBidsWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dPtpOblBidsWestHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source Location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink Location for PtP Bid': 'settlementPointSink', 'PtP Bid Price': 'PTPBidPrice', 'PtP Bid MW': 'PTPBidAwardMW'}, {'deliveryDate': '%m/%d/%Y'}, member='*_PTP_Obligation_Bids_West[ -]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point Source location for PtP Bid': 'settlementPointSource', 'Settlement Point Sink location for PtP Bid': 'settlementPointSink', 'PtP Bid MW': 'PTPBidAwardMW', 'PtP Bid Price': 'PTPBidPrice', 'Bid ID': 'bidId'},))
+
def _2d_ptp_obl_bids_west(self, *, PTPBidAwardMWFrom: Decimal | None = None, PTPBidAwardMWTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, PTPBidPriceFrom: Decimal | None = None, PTPBidPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dPtpOblBidsWestRow]:
'2-Day Point-to-Point Obligation Bids West'
return self._client._page('/np3-909-er/2d_ptp_obl_bids_west', np3_909_er._2dPtpOblBidsWestRow, {'PTPBidAwardMWFrom': PTPBidAwardMWFrom, 'PTPBidAwardMWTo': PTPBidAwardMWTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'PTPBidPriceFrom': PTPBidPriceFrom, 'PTPBidPriceTo': PTPBidPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1698,6 +2807,20 @@ class _2dTotalClearedEnergyBidsOffersRow(Row):
sumESRBidsCleared: Decimal | None
sumESROffersCleared: Decimal | None
+ class _2dTotalClearedEnergyBidsOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ sumDamENOnlyBidsCleared: Decimal | None
+ sum3POCleared: Decimal | None
+ sumDamENOnlyOffersCleared: Decimal | None
+ sumESRBidsCleared: Decimal | None = None
+ sumESROffersCleared: Decimal | None = None
+
+ @property
+ def _2d_total_cleared_energy_bids_offers_history(self) -> Archive[np3_909_er._2dTotalClearedEnergyBidsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dTotalClearedEnergyBidsOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum DAM EN Only Bids cleared': 'sumDamENOnlyBidsCleared', 'Sum 3PO cleared': 'sum3POCleared', 'Sum DAM EN Only Offers cleared': 'sumDamENOnlyOffersCleared', 'Sum ESR Bids cleared': 'sumESRBidsCleared', 'Sum ESR Offers cleared': 'sumESROffersCleared'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Tot_*Offers-[0-9]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum Cleared DAM Bids': 'sumDamENOnlyBidsCleared', 'Sum Cleared 3PO': 'sum3POCleared', 'Sum Cleared Energy Only Offers': 'sumDamENOnlyOffersCleared'},))
+
def _2d_total_cleared_energy_bids_offers(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dTotalClearedEnergyBidsOffersRow]:
'2-Day Total Cleared Energy Bids and Energy-Only Offers'
return self._client._page('/np3-909-er/2d_total_cleared_energy_bids_offers', np3_909_er._2dTotalClearedEnergyBidsOffersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'sumDamENOnlyBidsClearedFrom': sumDamENOnlyBidsClearedFrom, 'sumDamENOnlyBidsClearedTo': sumDamENOnlyBidsClearedTo, 'sum3POClearedFrom': sum3POClearedFrom, 'sum3POClearedTo': sum3POClearedTo, 'sumDamENOnlyOffersClearedFrom': sumDamENOnlyOffersClearedFrom, 'sumDamENOnlyOffersClearedTo': sumDamENOnlyOffersClearedTo, 'sumESRBidsClearedFrom': sumESRBidsClearedFrom, 'sumESRBidsClearedTo': sumESRBidsClearedTo, 'sumESROffersClearedFrom': sumESROffersClearedFrom, 'sumESROffersClearedTo': sumESROffersClearedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1722,6 +2845,20 @@ class _2dTotalClearedEnergyBidsOffersHoustonRow(Row):
sumESRBidsCleared: Decimal | None
sumESROffersCleared: Decimal | None
+ class _2dTotalClearedEnergyBidsOffersHoustonHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ sumDamENOnlyBidsCleared: Decimal | None
+ sum3POCleared: Decimal | None
+ sumDamENOnlyOffersCleared: Decimal | None
+ sumESRBidsCleared: Decimal | None = None
+ sumESROffersCleared: Decimal | None = None
+
+ @property
+ def _2d_total_cleared_energy_bids_offers_houston_history(self) -> Archive[np3_909_er._2dTotalClearedEnergyBidsOffersHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dTotalClearedEnergyBidsOffersHoustonHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum DAM EN Only Bids cleared': 'sumDamENOnlyBidsCleared', 'Sum 3PO cleared': 'sum3POCleared', 'Sum DAM EN Only Offers cleared': 'sumDamENOnlyOffersCleared', 'Sum ESR Bids cleared': 'sumESRBidsCleared', 'Sum ESR Offers cleared': 'sumESROffersCleared'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Tot_*Offers_Houston-[0-9]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum Cleared DAM Bids': 'sumDamENOnlyBidsCleared', 'Sum Cleared 3PO': 'sum3POCleared', 'Sum Cleared Energy Only Offers': 'sumDamENOnlyOffersCleared'},))
+
def _2d_total_cleared_energy_bids_offers_houston(self, *, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dTotalClearedEnergyBidsOffersHoustonRow]:
'2-Day Total Cleared Energy Bids and Energy-Only Offers Houston'
return self._client._page('/np3-909-er/2d_total_cleared_energy_bids_offers_houston', np3_909_er._2dTotalClearedEnergyBidsOffersHoustonRow, {'sum3POClearedFrom': sum3POClearedFrom, 'sum3POClearedTo': sum3POClearedTo, 'sumDamENOnlyOffersClearedFrom': sumDamENOnlyOffersClearedFrom, 'sumDamENOnlyOffersClearedTo': sumDamENOnlyOffersClearedTo, 'sumESRBidsClearedFrom': sumESRBidsClearedFrom, 'sumESRBidsClearedTo': sumESRBidsClearedTo, 'sumESROffersClearedFrom': sumESROffersClearedFrom, 'sumESROffersClearedTo': sumESROffersClearedTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'sumDamENOnlyBidsClearedFrom': sumDamENOnlyBidsClearedFrom, 'sumDamENOnlyBidsClearedTo': sumDamENOnlyBidsClearedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1746,11 +2883,25 @@ class _2dTotalClearedEnergyBidsOffersNorthRow(Row):
sumESRBidsCleared: Decimal | None
sumESROffersCleared: Decimal | None
- def _2d_total_cleared_energy_bids_offers_north(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dTotalClearedEnergyBidsOffersNorthRow]:
- '2-Day Total Cleared Energy Bids and Energy-Only Offers North'
- return self._client._page('/np3-909-er/2d_total_cleared_energy_bids_offers_north', np3_909_er._2dTotalClearedEnergyBidsOffersNorthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'sumDamENOnlyBidsClearedFrom': sumDamENOnlyBidsClearedFrom, 'sumDamENOnlyBidsClearedTo': sumDamENOnlyBidsClearedTo, 'sum3POClearedFrom': sum3POClearedFrom, 'sum3POClearedTo': sum3POClearedTo, 'sumDamENOnlyOffersClearedFrom': sumDamENOnlyOffersClearedFrom, 'sumDamENOnlyOffersClearedTo': sumDamENOnlyOffersClearedTo, 'sumESRBidsClearedFrom': sumESRBidsClearedFrom, 'sumESRBidsClearedTo': sumESRBidsClearedTo, 'sumESROffersClearedFrom': sumESROffersClearedFrom, 'sumESROffersClearedTo': sumESROffersClearedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
-
- def _2d_total_cleared_energy_bids_offers_north_iter(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_909_er._2dTotalClearedEnergyBidsOffersNorthRow]:
+ class _2dTotalClearedEnergyBidsOffersNorthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ sumDamENOnlyBidsCleared: Decimal | None
+ sum3POCleared: Decimal | None
+ sumDamENOnlyOffersCleared: Decimal | None
+ sumESRBidsCleared: Decimal | None = None
+ sumESROffersCleared: Decimal | None = None
+
+ @property
+ def _2d_total_cleared_energy_bids_offers_north_history(self) -> Archive[np3_909_er._2dTotalClearedEnergyBidsOffersNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dTotalClearedEnergyBidsOffersNorthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum DAM EN Only Bids cleared': 'sumDamENOnlyBidsCleared', 'Sum 3PO cleared': 'sum3POCleared', 'Sum DAM EN Only Offers cleared': 'sumDamENOnlyOffersCleared', 'Sum ESR Bids cleared': 'sumESRBidsCleared', 'Sum ESR Offers cleared': 'sumESROffersCleared'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Tot_*Offers_North-[0-9]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum Cleared DAM Bids': 'sumDamENOnlyBidsCleared', 'Sum Cleared 3PO': 'sum3POCleared', 'Sum Cleared Energy Only Offers': 'sumDamENOnlyOffersCleared'},))
+
+ def _2d_total_cleared_energy_bids_offers_north(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dTotalClearedEnergyBidsOffersNorthRow]:
+ '2-Day Total Cleared Energy Bids and Energy-Only Offers North'
+ return self._client._page('/np3-909-er/2d_total_cleared_energy_bids_offers_north', np3_909_er._2dTotalClearedEnergyBidsOffersNorthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'sumDamENOnlyBidsClearedFrom': sumDamENOnlyBidsClearedFrom, 'sumDamENOnlyBidsClearedTo': sumDamENOnlyBidsClearedTo, 'sum3POClearedFrom': sum3POClearedFrom, 'sum3POClearedTo': sum3POClearedTo, 'sumDamENOnlyOffersClearedFrom': sumDamENOnlyOffersClearedFrom, 'sumDamENOnlyOffersClearedTo': sumDamENOnlyOffersClearedTo, 'sumESRBidsClearedFrom': sumESRBidsClearedFrom, 'sumESRBidsClearedTo': sumESRBidsClearedTo, 'sumESROffersClearedFrom': sumESROffersClearedFrom, 'sumESROffersClearedTo': sumESROffersClearedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _2d_total_cleared_energy_bids_offers_north_iter(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_909_er._2dTotalClearedEnergyBidsOffersNorthRow]:
'2-Day Total Cleared Energy Bids and Energy-Only Offers North'
return self._client._iter('/np3-909-er/2d_total_cleared_energy_bids_offers_north', np3_909_er._2dTotalClearedEnergyBidsOffersNorthRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'sumDamENOnlyBidsClearedFrom': sumDamENOnlyBidsClearedFrom, 'sumDamENOnlyBidsClearedTo': sumDamENOnlyBidsClearedTo, 'sum3POClearedFrom': sum3POClearedFrom, 'sum3POClearedTo': sum3POClearedTo, 'sumDamENOnlyOffersClearedFrom': sumDamENOnlyOffersClearedFrom, 'sumDamENOnlyOffersClearedTo': sumDamENOnlyOffersClearedTo, 'sumESRBidsClearedFrom': sumESRBidsClearedFrom, 'sumESRBidsClearedTo': sumESRBidsClearedTo, 'sumESROffersClearedFrom': sumESROffersClearedFrom, 'sumESROffersClearedTo': sumESROffersClearedTo, 'size': size, 'sort': sort, 'dir': dir})
@@ -1770,6 +2921,20 @@ class _2dTotalClearedEnergyBidsOffersSouthRow(Row):
sumESRBidsCleared: Decimal | None
sumESROffersCleared: Decimal | None
+ class _2dTotalClearedEnergyBidsOffersSouthHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ sumDamENOnlyBidsCleared: Decimal | None
+ sum3POCleared: Decimal | None
+ sumDamENOnlyOffersCleared: Decimal | None
+ sumESRBidsCleared: Decimal | None = None
+ sumESROffersCleared: Decimal | None = None
+
+ @property
+ def _2d_total_cleared_energy_bids_offers_south_history(self) -> Archive[np3_909_er._2dTotalClearedEnergyBidsOffersSouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dTotalClearedEnergyBidsOffersSouthHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum DAM EN Only Bids cleared': 'sumDamENOnlyBidsCleared', 'Sum 3PO cleared': 'sum3POCleared', 'Sum DAM EN Only Offers cleared': 'sumDamENOnlyOffersCleared', 'Sum ESR Bids cleared': 'sumESRBidsCleared', 'Sum ESR Offers cleared': 'sumESROffersCleared'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Tot_*Offers_South-[0-9]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum Cleared DAM Bids': 'sumDamENOnlyBidsCleared', 'Sum Cleared 3PO': 'sum3POCleared', 'Sum Cleared Energy Only Offers': 'sumDamENOnlyOffersCleared'},))
+
def _2d_total_cleared_energy_bids_offers_south(self, *, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dTotalClearedEnergyBidsOffersSouthRow]:
'2-Day Total Cleared Energy Bids and Energy-Only Offers South'
return self._client._page('/np3-909-er/2d_total_cleared_energy_bids_offers_south', np3_909_er._2dTotalClearedEnergyBidsOffersSouthRow, {'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'sumDamENOnlyBidsClearedFrom': sumDamENOnlyBidsClearedFrom, 'sumDamENOnlyBidsClearedTo': sumDamENOnlyBidsClearedTo, 'sum3POClearedFrom': sum3POClearedFrom, 'sum3POClearedTo': sum3POClearedTo, 'sumDamENOnlyOffersClearedFrom': sumDamENOnlyOffersClearedFrom, 'sumDamENOnlyOffersClearedTo': sumDamENOnlyOffersClearedTo, 'sumESRBidsClearedFrom': sumESRBidsClearedFrom, 'sumESRBidsClearedTo': sumESRBidsClearedTo, 'sumESROffersClearedFrom': sumESROffersClearedFrom, 'sumESROffersClearedTo': sumESROffersClearedTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1794,6 +2959,20 @@ class _2dTotalClearedEnergyBidsOffersWestRow(Row):
sumESRBidsCleared: Decimal | None
sumESROffersCleared: Decimal | None
+ class _2dTotalClearedEnergyBidsOffersWestHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ sumDamENOnlyBidsCleared: Decimal | None
+ sum3POCleared: Decimal | None
+ sumDamENOnlyOffersCleared: Decimal | None
+ sumESRBidsCleared: Decimal | None = None
+ sumESROffersCleared: Decimal | None = None
+
+ @property
+ def _2d_total_cleared_energy_bids_offers_west_history(self) -> Archive[np3_909_er._2dTotalClearedEnergyBidsOffersWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-909-er', np3_909_er._2dTotalClearedEnergyBidsOffersWestHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum DAM EN Only Bids cleared': 'sumDamENOnlyBidsCleared', 'Sum 3PO cleared': 'sum3POCleared', 'Sum DAM EN Only Offers cleared': 'sumDamENOnlyOffersCleared', 'Sum ESR Bids cleared': 'sumESRBidsCleared', 'Sum ESR Offers cleared': 'sumESROffersCleared'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Tot_*Offers_West-[0-9]*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Sum Cleared DAM Bids': 'sumDamENOnlyBidsCleared', 'Sum Cleared 3PO': 'sum3POCleared', 'Sum Cleared Energy Only Offers': 'sumDamENOnlyOffersCleared'},))
+
def _2d_total_cleared_energy_bids_offers_west(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, sumDamENOnlyBidsClearedFrom: Decimal | None = None, sumDamENOnlyBidsClearedTo: Decimal | None = None, sum3POClearedFrom: Decimal | None = None, sum3POClearedTo: Decimal | None = None, sumDamENOnlyOffersClearedFrom: Decimal | None = None, sumDamENOnlyOffersClearedTo: Decimal | None = None, sumESRBidsClearedFrom: Decimal | None = None, sumESRBidsClearedTo: Decimal | None = None, sumESROffersClearedFrom: Decimal | None = None, sumESROffersClearedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_909_er._2dTotalClearedEnergyBidsOffersWestRow]:
'2-Day Total Cleared Energy Bids and Energy-Only Offers West'
return self._client._page('/np3-909-er/2d_total_cleared_energy_bids_offers_west', np3_909_er._2dTotalClearedEnergyBidsOffersWestRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'sumDamENOnlyBidsClearedFrom': sumDamENOnlyBidsClearedFrom, 'sumDamENOnlyBidsClearedTo': sumDamENOnlyBidsClearedTo, 'sum3POClearedFrom': sum3POClearedFrom, 'sum3POClearedTo': sum3POClearedTo, 'sumDamENOnlyOffersClearedFrom': sumDamENOnlyOffersClearedFrom, 'sumDamENOnlyOffersClearedTo': sumDamENOnlyOffersClearedTo, 'sumESRBidsClearedFrom': sumESRBidsClearedFrom, 'sumESRBidsClearedTo': sumESRBidsClearedTo, 'sumESROffersClearedFrom': sumESROffersClearedFrom, 'sumESROffersClearedTo': sumESROffersClearedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1820,6 +2999,17 @@ class _2dAggDsrLoadsRow(Row):
sumTelemDSRGen: Decimal | None
sumTelemDSRLoad: Decimal | None
+ class _2dAggDsrLoadsHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumTelemDSRLoad: Decimal | None
+ sumTelemDSRGen: Decimal | None
+
+ @property
+ def _2d_agg_dsr_loads_history(self) -> Archive[np3_910_er._2dAggDsrLoadsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggDsrLoadsHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM TELEM DSR LOAD': 'sumTelemDSRLoad', 'SUM TELEM DSR GEN': 'sumTelemDSRGen'}, {}, member='*_Agg_DSR_Loads[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_dsr_loads(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumTelemDSRLoadFrom: Decimal | None = None, sumTelemDSRLoadTo: Decimal | None = None, sumTelemDSRGenFrom: Decimal | None = None, sumTelemDSRGenTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggDsrLoadsRow]:
'2-Day Aggregated DSR Loads'
return self._client._page('/np3-910-er/2d_agg_dsr_loads', np3_910_er._2dAggDsrLoadsRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumTelemDSRLoadFrom': sumTelemDSRLoadFrom, 'sumTelemDSRLoadTo': sumTelemDSRLoadTo, 'sumTelemDSRGenFrom': sumTelemDSRGenFrom, 'sumTelemDSRGenTo': sumTelemDSRGenTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1855,6 +3045,34 @@ class _2dAggGenSummaryRow(Row):
sumLASLREMRES: Decimal | None
sumLASLWGR: Decimal | None
+ class _2dAggGenSummaryHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumBasePointNonIRR: Decimal | None = None
+ sumBasePointWGR: Decimal | None
+ sumBasePointPVGR: Decimal | None = None
+ sumBasePointREMRES: Decimal | None
+ sumGenTelemMW: Decimal | None
+ sumBasePointESR: Decimal | None = None
+ sumBasePointESRCharge: Decimal | None = None
+ sumBasePointESRDischarge: Decimal | None = None
+ sumHASLNonIRR: Decimal | None = None
+ sumLASLNonIRR: Decimal | None = None
+ sumHASLWGR: Decimal | None = None
+ sumLASLWGR: Decimal | None = None
+ sumHASLPVGR: Decimal | None = None
+ sumLASLPVGR: Decimal | None = None
+ sumHASLREMRES: Decimal | None = None
+ sumLASLREMRES: Decimal | None = None
+ sumBasePointNonWGR: Decimal | None = None
+ sumHASLNonWGR: Decimal | None = None
+ sumLASLNonWGR: Decimal | None = None
+
+ @property
+ def _2d_agg_gen_summary_history(self) -> Archive[np3_910_er._2dAggGenSummaryHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggGenSummaryHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON IRR': 'sumBasePointNonIRR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM BASE POINT PVGR': 'sumBasePointPVGR', 'SUM BASE POINT Remaining Res': 'sumBasePointREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW', 'SUM BASE POINT ESR': 'sumBasePointESR', 'SUM BASE POINT ESR CHARGING': 'sumBasePointESRCharge', 'SUM BASE POINT ESR DISCHARGING': 'sumBasePointESRDischarge'}, {}, member='*_Agg_Gen_Summary[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON-WGR': 'sumBasePointNonWGR', 'SUM HASL NON-WGR': 'sumHASLNonWGR', 'SUM LASL NON-WGR': 'sumLASLNonWGR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM HASL WGR': 'sumHASLWGR', 'SUM LASL WGR': 'sumLASLWGR', 'SUM BASE POINT REMAINING RESOURCES': 'sumBasePointREMRES', 'SUM HASL REMAINING RESOURCES': 'sumHASLREMRES', 'SUM LASL REMAINING RESOURCES': 'sumLASLREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW'},))
+
def _2d_agg_gen_summary(self, *, sumBasePointREMRESFrom: Decimal | None = None, sumBasePointREMRESTo: Decimal | None = None, sumGenTelemMWFrom: Decimal | None = None, sumGenTelemMWTo: Decimal | None = None, sumBasePointESRFrom: Decimal | None = None, sumBasePointESRTo: Decimal | None = None, sumBasePointESRChargeFrom: Decimal | None = None, sumBasePointESRChargeTo: Decimal | None = None, sumBasePointESRDischargeFrom: Decimal | None = None, sumBasePointESRDischargeTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumBasePointNonIRRFrom: Decimal | None = None, sumBasePointNonIRRTo: Decimal | None = None, sumBasePointWGRFrom: Decimal | None = None, sumBasePointWGRTo: Decimal | None = None, sumBasePointPVGRFrom: Decimal | None = None, sumBasePointPVGRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggGenSummaryRow]:
'2-Day Aggregated Generation Summary'
return self._client._page('/np3-910-er/2d_agg_gen_summary', np3_910_er._2dAggGenSummaryRow, {'sumBasePointREMRESFrom': sumBasePointREMRESFrom, 'sumBasePointREMRESTo': sumBasePointREMRESTo, 'sumGenTelemMWFrom': sumGenTelemMWFrom, 'sumGenTelemMWTo': sumGenTelemMWTo, 'sumBasePointESRFrom': sumBasePointESRFrom, 'sumBasePointESRTo': sumBasePointESRTo, 'sumBasePointESRChargeFrom': sumBasePointESRChargeFrom, 'sumBasePointESRChargeTo': sumBasePointESRChargeTo, 'sumBasePointESRDischargeFrom': sumBasePointESRDischargeFrom, 'sumBasePointESRDischargeTo': sumBasePointESRDischargeTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumBasePointNonIRRFrom': sumBasePointNonIRRFrom, 'sumBasePointNonIRRTo': sumBasePointNonIRRTo, 'sumBasePointWGRFrom': sumBasePointWGRFrom, 'sumBasePointWGRTo': sumBasePointWGRTo, 'sumBasePointPVGRFrom': sumBasePointPVGRFrom, 'sumBasePointPVGRTo': sumBasePointPVGRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1889,6 +3107,34 @@ class _2dAggGenSummaryHoustonRow(Row):
sumLaslRemRes: Decimal | None
sumLaslWGR: Decimal | None
+ class _2dAggGenSummaryHoustonHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumBasePointNonIRR: Decimal | None = None
+ sumBasePointWGR: Decimal | None
+ sumBasePointPVGR: Decimal | None = None
+ sumBasePointREMRES: Decimal | None
+ sumGenTelemMW: Decimal | None
+ sumBasePointESR: Decimal | None = None
+ sumBasePointESRCharge: Decimal | None = None
+ sumBasePointESRDischarge: Decimal | None = None
+ sumBasePointNonWGR: Decimal | None = None
+ sumHaslNonWGR: Decimal | None = None
+ sumLaslNonWGR: Decimal | None = None
+ sumHaslWGR: Decimal | None = None
+ sumLaslWGR: Decimal | None = None
+ sumHaslRemRes: Decimal | None = None
+ sumLaslRemRes: Decimal | None = None
+ sumHASLNonWGR: Decimal | None = None
+ sumLASLNonWGR: Decimal | None = None
+ sumHASLREMRES: Decimal | None = None
+ sumLASLREMRES: Decimal | None = None
+
+ @property
+ def _2d_agg_gen_summary_houston_history(self) -> Archive[np3_910_er._2dAggGenSummaryHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggGenSummaryHoustonHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON IRR': 'sumBasePointNonIRR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM BASE POINT PVGR': 'sumBasePointPVGR', 'SUM BASE POINT Remaining Res': 'sumBasePointREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW', 'SUM BASE POINT ESR': 'sumBasePointESR', 'SUM BASE POINT ESR CHARGING': 'sumBasePointESRCharge', 'SUM BASE POINT ESR DISCHARGING': 'sumBasePointESRDischarge'}, {}, member='*_Agg_Gen_Summary_Houston[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON-WGR': 'sumBasePointNonWGR', 'SUM HASL NON-WGR': 'sumHASLNonWGR', 'SUM LASL NON-WGR': 'sumLASLNonWGR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM HASL WGR': 'sumHaslWGR', 'SUM LASL WGR': 'sumLaslWGR', 'SUM BASE POINT REMAINING RESOURCES': 'sumBasePointREMRES', 'SUM HASL REMAINING RESOURCES': 'sumHASLREMRES', 'SUM LASL REMAINING RESOURCES': 'sumLASLREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW'},))
+
def _2d_agg_gen_summary_houston(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumBasePointNonIRRFrom: Decimal | None = None, sumBasePointNonIRRTo: Decimal | None = None, sumBasePointWGRFrom: Decimal | None = None, sumBasePointWGRTo: Decimal | None = None, sumBasePointPVGRFrom: Decimal | None = None, sumBasePointPVGRTo: Decimal | None = None, sumBasePointREMRESFrom: Decimal | None = None, sumBasePointREMRESTo: Decimal | None = None, sumGenTelemMWFrom: Decimal | None = None, sumGenTelemMWTo: Decimal | None = None, sumBasePointESRFrom: Decimal | None = None, sumBasePointESRTo: Decimal | None = None, sumBasePointESRChargeFrom: Decimal | None = None, sumBasePointESRChargeTo: Decimal | None = None, sumBasePointESRDischargeFrom: Decimal | None = None, sumBasePointESRDischargeTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggGenSummaryHoustonRow]:
'2-Day Aggregated Generation Summary Houston'
return self._client._page('/np3-910-er/2d_agg_gen_summary_houston', np3_910_er._2dAggGenSummaryHoustonRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumBasePointNonIRRFrom': sumBasePointNonIRRFrom, 'sumBasePointNonIRRTo': sumBasePointNonIRRTo, 'sumBasePointWGRFrom': sumBasePointWGRFrom, 'sumBasePointWGRTo': sumBasePointWGRTo, 'sumBasePointPVGRFrom': sumBasePointPVGRFrom, 'sumBasePointPVGRTo': sumBasePointPVGRTo, 'sumBasePointREMRESFrom': sumBasePointREMRESFrom, 'sumBasePointREMRESTo': sumBasePointREMRESTo, 'sumGenTelemMWFrom': sumGenTelemMWFrom, 'sumGenTelemMWTo': sumGenTelemMWTo, 'sumBasePointESRFrom': sumBasePointESRFrom, 'sumBasePointESRTo': sumBasePointESRTo, 'sumBasePointESRChargeFrom': sumBasePointESRChargeFrom, 'sumBasePointESRChargeTo': sumBasePointESRChargeTo, 'sumBasePointESRDischargeFrom': sumBasePointESRDischargeFrom, 'sumBasePointESRDischargeTo': sumBasePointESRDischargeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1923,6 +3169,34 @@ class _2dAggGenSummaryNorthRow(Row):
sumLaslRemRes: Decimal | None
sumLaslWGR: Decimal | None
+ class _2dAggGenSummaryNorthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumBasePointNonIRR: Decimal | None = None
+ sumBasePointWGR: Decimal | None
+ sumBasePointPVGR: Decimal | None = None
+ sumBasePointREMRES: Decimal | None
+ sumGenTelemMW: Decimal | None
+ sumBasePointESR: Decimal | None = None
+ sumBasePointESRCharge: Decimal | None = None
+ sumBasePointESRDischarge: Decimal | None = None
+ sumBasePointNonWGR: Decimal | None = None
+ sumHaslNonWGR: Decimal | None = None
+ sumLaslNonWGR: Decimal | None = None
+ sumHaslWGR: Decimal | None = None
+ sumLaslWGR: Decimal | None = None
+ sumHaslRemRes: Decimal | None = None
+ sumLaslRemRes: Decimal | None = None
+ sumHASLNonWGR: Decimal | None = None
+ sumLASLNonWGR: Decimal | None = None
+ sumHASLREMRES: Decimal | None = None
+ sumLASLREMRES: Decimal | None = None
+
+ @property
+ def _2d_agg_gen_summary_north_history(self) -> Archive[np3_910_er._2dAggGenSummaryNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggGenSummaryNorthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON IRR': 'sumBasePointNonIRR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM BASE POINT PVGR': 'sumBasePointPVGR', 'SUM BASE POINT Remaining Res': 'sumBasePointREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW', 'SUM BASE POINT ESR': 'sumBasePointESR', 'SUM BASE POINT ESR CHARGING': 'sumBasePointESRCharge', 'SUM BASE POINT ESR DISCHARGING': 'sumBasePointESRDischarge'}, {}, member='*_Agg_Gen_Summary_North[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON-WGR': 'sumBasePointNonWGR', 'SUM HASL NON-WGR': 'sumHASLNonWGR', 'SUM LASL NON-WGR': 'sumLASLNonWGR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM HASL WGR': 'sumHaslWGR', 'SUM LASL WGR': 'sumLaslWGR', 'SUM BASE POINT REMAINING RESOURCES': 'sumBasePointREMRES', 'SUM HASL REMAINING RESOURCES': 'sumHASLREMRES', 'SUM LASL REMAINING RESOURCES': 'sumLASLREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW'},))
+
def _2d_agg_gen_summary_north(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumBasePointNonIRRFrom: Decimal | None = None, sumBasePointNonIRRTo: Decimal | None = None, sumBasePointWGRFrom: Decimal | None = None, sumBasePointWGRTo: Decimal | None = None, sumBasePointPVGRFrom: Decimal | None = None, sumBasePointPVGRTo: Decimal | None = None, sumBasePointREMRESFrom: Decimal | None = None, sumBasePointREMRESTo: Decimal | None = None, sumGenTelemMWFrom: Decimal | None = None, sumGenTelemMWTo: Decimal | None = None, sumBasePointESRFrom: Decimal | None = None, sumBasePointESRTo: Decimal | None = None, sumBasePointESRChargeFrom: Decimal | None = None, sumBasePointESRChargeTo: Decimal | None = None, sumBasePointESRDischargeFrom: Decimal | None = None, sumBasePointESRDischargeTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggGenSummaryNorthRow]:
'2-Day Aggregated Generation Summary North'
return self._client._page('/np3-910-er/2d_agg_gen_summary_north', np3_910_er._2dAggGenSummaryNorthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumBasePointNonIRRFrom': sumBasePointNonIRRFrom, 'sumBasePointNonIRRTo': sumBasePointNonIRRTo, 'sumBasePointWGRFrom': sumBasePointWGRFrom, 'sumBasePointWGRTo': sumBasePointWGRTo, 'sumBasePointPVGRFrom': sumBasePointPVGRFrom, 'sumBasePointPVGRTo': sumBasePointPVGRTo, 'sumBasePointREMRESFrom': sumBasePointREMRESFrom, 'sumBasePointREMRESTo': sumBasePointREMRESTo, 'sumGenTelemMWFrom': sumGenTelemMWFrom, 'sumGenTelemMWTo': sumGenTelemMWTo, 'sumBasePointESRFrom': sumBasePointESRFrom, 'sumBasePointESRTo': sumBasePointESRTo, 'sumBasePointESRChargeFrom': sumBasePointESRChargeFrom, 'sumBasePointESRChargeTo': sumBasePointESRChargeTo, 'sumBasePointESRDischargeFrom': sumBasePointESRDischargeFrom, 'sumBasePointESRDischargeTo': sumBasePointESRDischargeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1957,6 +3231,34 @@ class _2dAggGenSummarySouthRow(Row):
sumLaslRemRes: Decimal | None
sumLaslWGR: Decimal | None
+ class _2dAggGenSummarySouthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumBasePointNonIRR: Decimal | None = None
+ sumBasePointWGR: Decimal | None
+ sumBasePointPVGR: Decimal | None = None
+ sumBasePointREMRES: Decimal | None
+ sumGenTelemMW: Decimal | None
+ sumBasePointESR: Decimal | None = None
+ sumBasePointESRCharge: Decimal | None = None
+ sumBasePointESRDischarge: Decimal | None = None
+ sumBasePointNonWGR: Decimal | None = None
+ sumHaslNonWGR: Decimal | None = None
+ sumLaslNonWGR: Decimal | None = None
+ sumHaslWGR: Decimal | None = None
+ sumLaslWGR: Decimal | None = None
+ sumHaslRemRes: Decimal | None = None
+ sumLaslRemRes: Decimal | None = None
+ sumHASLNonWGR: Decimal | None = None
+ sumLASLNonWGR: Decimal | None = None
+ sumHASLREMRES: Decimal | None = None
+ sumLASLREMRES: Decimal | None = None
+
+ @property
+ def _2d_agg_gen_summary_south_history(self) -> Archive[np3_910_er._2dAggGenSummarySouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggGenSummarySouthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON IRR': 'sumBasePointNonIRR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM BASE POINT PVGR': 'sumBasePointPVGR', 'SUM BASE POINT Remaining Res': 'sumBasePointREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW', 'SUM BASE POINT ESR': 'sumBasePointESR', 'SUM BASE POINT ESR CHARGING': 'sumBasePointESRCharge', 'SUM BASE POINT ESR DISCHARGING': 'sumBasePointESRDischarge'}, {}, member='*_Agg_Gen_Summary_South[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON-WGR': 'sumBasePointNonWGR', 'SUM HASL NON-WGR': 'sumHASLNonWGR', 'SUM LASL NON-WGR': 'sumLASLNonWGR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM HASL WGR': 'sumHaslWGR', 'SUM LASL WGR': 'sumLaslWGR', 'SUM BASE POINT REMAINING RESOURCES': 'sumBasePointREMRES', 'SUM HASL REMAINING RESOURCES': 'sumHASLREMRES', 'SUM LASL REMAINING RESOURCES': 'sumLASLREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW'},))
+
def _2d_agg_gen_summary_south(self, *, repeatHourFlag: bool | None = None, sumBasePointNonIRRFrom: Decimal | None = None, sumBasePointNonIRRTo: Decimal | None = None, sumBasePointWGRFrom: Decimal | None = None, sumBasePointWGRTo: Decimal | None = None, sumBasePointPVGRFrom: Decimal | None = None, sumBasePointPVGRTo: Decimal | None = None, sumBasePointREMRESFrom: Decimal | None = None, sumBasePointREMRESTo: Decimal | None = None, sumGenTelemMWFrom: Decimal | None = None, sumGenTelemMWTo: Decimal | None = None, sumBasePointESRFrom: Decimal | None = None, sumBasePointESRTo: Decimal | None = None, sumBasePointESRChargeFrom: Decimal | None = None, sumBasePointESRChargeTo: Decimal | None = None, sumBasePointESRDischargeFrom: Decimal | None = None, sumBasePointESRDischargeTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggGenSummarySouthRow]:
'2-Day Aggregated Generation Summary South'
return self._client._page('/np3-910-er/2d_agg_gen_summary_south', np3_910_er._2dAggGenSummarySouthRow, {'repeatHourFlag': repeatHourFlag, 'sumBasePointNonIRRFrom': sumBasePointNonIRRFrom, 'sumBasePointNonIRRTo': sumBasePointNonIRRTo, 'sumBasePointWGRFrom': sumBasePointWGRFrom, 'sumBasePointWGRTo': sumBasePointWGRTo, 'sumBasePointPVGRFrom': sumBasePointPVGRFrom, 'sumBasePointPVGRTo': sumBasePointPVGRTo, 'sumBasePointREMRESFrom': sumBasePointREMRESFrom, 'sumBasePointREMRESTo': sumBasePointREMRESTo, 'sumGenTelemMWFrom': sumGenTelemMWFrom, 'sumGenTelemMWTo': sumGenTelemMWTo, 'sumBasePointESRFrom': sumBasePointESRFrom, 'sumBasePointESRTo': sumBasePointESRTo, 'sumBasePointESRChargeFrom': sumBasePointESRChargeFrom, 'sumBasePointESRChargeTo': sumBasePointESRChargeTo, 'sumBasePointESRDischargeFrom': sumBasePointESRDischargeFrom, 'sumBasePointESRDischargeTo': sumBasePointESRDischargeTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -1991,6 +3293,34 @@ class _2dAggGenSummaryWestRow(Row):
sumLaslRemRes: Decimal | None
sumLaslWGR: Decimal | None
+ class _2dAggGenSummaryWestHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumBasePointNonIRR: Decimal | None = None
+ sumBasePointWGR: Decimal | None
+ sumBasePointPVGR: Decimal | None = None
+ sumBasePointREMRES: Decimal | None
+ sumGenTelemMW: Decimal | None
+ sumBasePointESR: Decimal | None = None
+ sumBasePointESRCharge: Decimal | None = None
+ sumBasePointESRDischarge: Decimal | None = None
+ sumBasePointNonWGR: Decimal | None = None
+ sumHaslNonWGR: Decimal | None = None
+ sumLaslNonWGR: Decimal | None = None
+ sumHaslWGR: Decimal | None = None
+ sumLaslWGR: Decimal | None = None
+ sumHaslRemRes: Decimal | None = None
+ sumLaslRemRes: Decimal | None = None
+ sumHASLNonWGR: Decimal | None = None
+ sumLASLNonWGR: Decimal | None = None
+ sumHASLREMRES: Decimal | None = None
+ sumLASLREMRES: Decimal | None = None
+
+ @property
+ def _2d_agg_gen_summary_west_history(self) -> Archive[np3_910_er._2dAggGenSummaryWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggGenSummaryWestHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON IRR': 'sumBasePointNonIRR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM BASE POINT PVGR': 'sumBasePointPVGR', 'SUM BASE POINT Remaining Res': 'sumBasePointREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW', 'SUM BASE POINT ESR': 'sumBasePointESR', 'SUM BASE POINT ESR CHARGING': 'sumBasePointESRCharge', 'SUM BASE POINT ESR DISCHARGING': 'sumBasePointESRDischarge'}, {}, member='*_Agg_Gen_Summary_West[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM BASE POINT NON-WGR': 'sumBasePointNonWGR', 'SUM HASL NON-WGR': 'sumHASLNonWGR', 'SUM LASL NON-WGR': 'sumLASLNonWGR', 'SUM BASE POINT WGR': 'sumBasePointWGR', 'SUM HASL WGR': 'sumHaslWGR', 'SUM LASL WGR': 'sumLaslWGR', 'SUM BASE POINT REMAINING RESOURCES': 'sumBasePointREMRES', 'SUM HASL REMAINING RESOURCES': 'sumHASLREMRES', 'SUM LASL REMAINING RESOURCES': 'sumLASLREMRES', 'SUM GEN TELEM MW': 'sumGenTelemMW'},))
+
def _2d_agg_gen_summary_west(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumBasePointNonIRRFrom: Decimal | None = None, sumBasePointNonIRRTo: Decimal | None = None, sumBasePointWGRFrom: Decimal | None = None, sumBasePointWGRTo: Decimal | None = None, sumBasePointPVGRFrom: Decimal | None = None, sumBasePointPVGRTo: Decimal | None = None, sumBasePointREMRESFrom: Decimal | None = None, sumBasePointREMRESTo: Decimal | None = None, sumGenTelemMWFrom: Decimal | None = None, sumGenTelemMWTo: Decimal | None = None, sumBasePointESRFrom: Decimal | None = None, sumBasePointESRTo: Decimal | None = None, sumBasePointESRChargeFrom: Decimal | None = None, sumBasePointESRChargeTo: Decimal | None = None, sumBasePointESRDischargeFrom: Decimal | None = None, sumBasePointESRDischargeTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggGenSummaryWestRow]:
'2-Day Aggregated Generation Summary West'
return self._client._page('/np3-910-er/2d_agg_gen_summary_west', np3_910_er._2dAggGenSummaryWestRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumBasePointNonIRRFrom': sumBasePointNonIRRFrom, 'sumBasePointNonIRRTo': sumBasePointNonIRRTo, 'sumBasePointWGRFrom': sumBasePointWGRFrom, 'sumBasePointWGRTo': sumBasePointWGRTo, 'sumBasePointPVGRFrom': sumBasePointPVGRFrom, 'sumBasePointPVGRTo': sumBasePointPVGRTo, 'sumBasePointREMRESFrom': sumBasePointREMRESFrom, 'sumBasePointREMRESTo': sumBasePointREMRESTo, 'sumGenTelemMWFrom': sumGenTelemMWFrom, 'sumGenTelemMWTo': sumGenTelemMWTo, 'sumBasePointESRFrom': sumBasePointESRFrom, 'sumBasePointESRTo': sumBasePointESRTo, 'sumBasePointESRChargeFrom': sumBasePointESRChargeFrom, 'sumBasePointESRChargeTo': sumBasePointESRChargeTo, 'sumBasePointESRDischargeFrom': sumBasePointESRDischargeFrom, 'sumBasePointESRDischargeTo': sumBasePointESRDischargeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2013,6 +3343,18 @@ class _2dAggLoadSummaryRow(Row):
sumTelemDCtieMW: Decimal | None
sumTelemGenMW: Decimal | None
+ class _2dAggLoadSummaryHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumTelemGenMW: Decimal | None
+ sumTelemDCtieMW: Decimal | None
+ aggLoadSummary: Decimal | None
+
+ @property
+ def _2d_agg_load_summary_history(self) -> Archive[np3_910_er._2dAggLoadSummaryHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggLoadSummaryHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM TELEM GEN MW': 'sumTelemGenMW', 'SUM TELEM DCTIE MW': 'sumTelemDCtieMW', 'AGG LOAD SUMMARY': 'aggLoadSummary'}, {}, member='*_Agg_Load_Summary[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_load_summary(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumTelemGenMWFrom: Decimal | None = None, sumTelemGenMWTo: Decimal | None = None, sumTelemDCtieMWFrom: Decimal | None = None, sumTelemDCtieMWTo: Decimal | None = None, aggLoadSummaryFrom: Decimal | None = None, aggLoadSummaryTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggLoadSummaryRow]:
'2-Day Aggregated Load Summary'
return self._client._page('/np3-910-er/2d_agg_load_summary', np3_910_er._2dAggLoadSummaryRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumTelemGenMWFrom': sumTelemGenMWFrom, 'sumTelemGenMWTo': sumTelemGenMWTo, 'sumTelemDCtieMWFrom': sumTelemDCtieMWFrom, 'sumTelemDCtieMWTo': sumTelemDCtieMWTo, 'aggLoadSummaryFrom': aggLoadSummaryFrom, 'aggLoadSummaryTo': aggLoadSummaryTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2035,6 +3377,18 @@ class _2dAggLoadSummaryHoustonRow(Row):
sumTelemDCtieMW: Decimal | None
sumTelemGenMW: Decimal | None
+ class _2dAggLoadSummaryHoustonHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumTelemGenMW: Decimal | None
+ sumTelemDCtieMW: Decimal | None
+ aggLoadSummary: Decimal | None
+
+ @property
+ def _2d_agg_load_summary_houston_history(self) -> Archive[np3_910_er._2dAggLoadSummaryHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggLoadSummaryHoustonHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM TELEM GEN MW': 'sumTelemGenMW', 'SUM TELEM DCTIE MW': 'sumTelemDCtieMW', 'AGG LOAD SUMMARY': 'aggLoadSummary'}, {}, member='*_Agg_Load_Summary_Houston[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_load_summary_houston(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumTelemGenMWFrom: Decimal | None = None, sumTelemGenMWTo: Decimal | None = None, sumTelemDCtieMWFrom: Decimal | None = None, sumTelemDCtieMWTo: Decimal | None = None, aggLoadSummaryFrom: Decimal | None = None, aggLoadSummaryTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggLoadSummaryHoustonRow]:
'2-Day Aggregated Load Summary Houston'
return self._client._page('/np3-910-er/2d_agg_load_summary_houston', np3_910_er._2dAggLoadSummaryHoustonRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumTelemGenMWFrom': sumTelemGenMWFrom, 'sumTelemGenMWTo': sumTelemGenMWTo, 'sumTelemDCtieMWFrom': sumTelemDCtieMWFrom, 'sumTelemDCtieMWTo': sumTelemDCtieMWTo, 'aggLoadSummaryFrom': aggLoadSummaryFrom, 'aggLoadSummaryTo': aggLoadSummaryTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2057,6 +3411,18 @@ class _2dAggLoadSummaryNorthRow(Row):
sumTelemDCtieMW: Decimal | None
sumTelemGenMW: Decimal | None
+ class _2dAggLoadSummaryNorthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumTelemGenMW: Decimal | None
+ sumTelemDCtieMW: Decimal | None
+ aggLoadSummary: Decimal | None
+
+ @property
+ def _2d_agg_load_summary_north_history(self) -> Archive[np3_910_er._2dAggLoadSummaryNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggLoadSummaryNorthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM TELEM GEN MW': 'sumTelemGenMW', 'SUM TELEM DCTIE MW': 'sumTelemDCtieMW', 'AGG LOAD SUMMARY': 'aggLoadSummary'}, {}, member='*_Agg_Load_Summary_North[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_load_summary_north(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumTelemGenMWFrom: Decimal | None = None, sumTelemGenMWTo: Decimal | None = None, sumTelemDCtieMWFrom: Decimal | None = None, sumTelemDCtieMWTo: Decimal | None = None, aggLoadSummaryFrom: Decimal | None = None, aggLoadSummaryTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggLoadSummaryNorthRow]:
'2-Day Aggregated Load Summary North'
return self._client._page('/np3-910-er/2d_agg_load_summary_north', np3_910_er._2dAggLoadSummaryNorthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumTelemGenMWFrom': sumTelemGenMWFrom, 'sumTelemGenMWTo': sumTelemGenMWTo, 'sumTelemDCtieMWFrom': sumTelemDCtieMWFrom, 'sumTelemDCtieMWTo': sumTelemDCtieMWTo, 'aggLoadSummaryFrom': aggLoadSummaryFrom, 'aggLoadSummaryTo': aggLoadSummaryTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2079,6 +3445,18 @@ class _2dAggLoadSummarySouthRow(Row):
sumTelemDCtieMW: Decimal | None
sumTelemGenMW: Decimal | None
+ class _2dAggLoadSummarySouthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumTelemGenMW: Decimal | None
+ sumTelemDCtieMW: Decimal | None
+ aggLoadSummary: Decimal | None
+
+ @property
+ def _2d_agg_load_summary_south_history(self) -> Archive[np3_910_er._2dAggLoadSummarySouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggLoadSummarySouthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM TELEM GEN MW': 'sumTelemGenMW', 'SUM TELEM DCTIE MW': 'sumTelemDCtieMW', 'AGG LOAD SUMMARY': 'aggLoadSummary'}, {}, member='*_Agg_Load_Summary_South[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_load_summary_south(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumTelemGenMWFrom: Decimal | None = None, sumTelemGenMWTo: Decimal | None = None, sumTelemDCtieMWFrom: Decimal | None = None, sumTelemDCtieMWTo: Decimal | None = None, aggLoadSummaryFrom: Decimal | None = None, aggLoadSummaryTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggLoadSummarySouthRow]:
'2-Day Aggregated Load Summary South'
return self._client._page('/np3-910-er/2d_agg_load_summary_south', np3_910_er._2dAggLoadSummarySouthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumTelemGenMWFrom': sumTelemGenMWFrom, 'sumTelemGenMWTo': sumTelemGenMWTo, 'sumTelemDCtieMWFrom': sumTelemDCtieMWFrom, 'sumTelemDCtieMWTo': sumTelemDCtieMWTo, 'aggLoadSummaryFrom': aggLoadSummaryFrom, 'aggLoadSummaryTo': aggLoadSummaryTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2101,6 +3479,18 @@ class _2dAggLoadSummaryWestRow(Row):
sumTelemDCtieMW: Decimal | None
sumTelemGenMW: Decimal | None
+ class _2dAggLoadSummaryWestHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumTelemGenMW: Decimal | None
+ sumTelemDCtieMW: Decimal | None
+ aggLoadSummary: Decimal | None
+
+ @property
+ def _2d_agg_load_summary_west_history(self) -> Archive[np3_910_er._2dAggLoadSummaryWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggLoadSummaryWestHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM TELEM GEN MW': 'sumTelemGenMW', 'SUM TELEM DCTIE MW': 'sumTelemDCtieMW', 'AGG LOAD SUMMARY': 'aggLoadSummary'}, {}, member='*_Agg_Load_Summary_West[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_load_summary_west(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumTelemGenMWFrom: Decimal | None = None, sumTelemGenMWTo: Decimal | None = None, sumTelemDCtieMWFrom: Decimal | None = None, sumTelemDCtieMWTo: Decimal | None = None, aggLoadSummaryFrom: Decimal | None = None, aggLoadSummaryTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggLoadSummaryWestRow]:
'2-Day Aggregated Load Summary West'
return self._client._page('/np3-910-er/2d_agg_load_summary_west', np3_910_er._2dAggLoadSummaryWestRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumTelemGenMWFrom': sumTelemGenMWFrom, 'sumTelemGenMWTo': sumTelemGenMWTo, 'sumTelemDCtieMWFrom': sumTelemDCtieMWFrom, 'sumTelemDCtieMWTo': sumTelemDCtieMWTo, 'aggLoadSummaryFrom': aggLoadSummaryFrom, 'aggLoadSummaryTo': aggLoadSummaryTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2123,6 +3513,18 @@ class _2dAggOutSchedRow(Row):
sumLSLOutputSched: Decimal | None
sumOutputSched: Decimal | None
+ class _2dAggOutSchedHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumLSLOutputSched: Decimal | None
+ sumHSLOutputSched: Decimal | None
+ sumOutputSched: Decimal | None
+
+ @property
+ def _2d_agg_out_sched_history(self) -> Archive[np3_910_er._2dAggOutSchedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggOutSchedHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM LSL OUTPUT SCHEDULE': 'sumLSLOutputSched', 'SUM HSL OUTPUT SCHEDULE': 'sumHSLOutputSched', 'SUM OUTPUTSCHEDULE': 'sumOutputSched'}, {}, member='*_Agg_Output_Sched[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_out_sched(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumLSLOutputSchedFrom: Decimal | None = None, sumLSLOutputSchedTo: Decimal | None = None, sumHSLOutputSchedFrom: Decimal | None = None, sumHSLOutputSchedTo: Decimal | None = None, sumOutputSchedFrom: Decimal | None = None, sumOutputSchedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggOutSchedRow]:
'2-Day Aggregated Output Schedule'
return self._client._page('/np3-910-er/2d_agg_out_sched', np3_910_er._2dAggOutSchedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumLSLOutputSchedFrom': sumLSLOutputSchedFrom, 'sumLSLOutputSchedTo': sumLSLOutputSchedTo, 'sumHSLOutputSchedFrom': sumHSLOutputSchedFrom, 'sumHSLOutputSchedTo': sumHSLOutputSchedTo, 'sumOutputSchedFrom': sumOutputSchedFrom, 'sumOutputSchedTo': sumOutputSchedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2145,6 +3547,18 @@ class _2dAggOutSchedHoustonRow(Row):
sumLSLOutputSched: Decimal | None
sumOutputSched: Decimal | None
+ class _2dAggOutSchedHoustonHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumLSLOutputSched: Decimal | None
+ sumHSLOutputSched: Decimal | None
+ sumOutputSched: Decimal | None
+
+ @property
+ def _2d_agg_out_sched_houston_history(self) -> Archive[np3_910_er._2dAggOutSchedHoustonHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggOutSchedHoustonHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM LSL OUTPUT SCHEDULE': 'sumLSLOutputSched', 'SUM HSL OUTPUT SCHEDULE': 'sumHSLOutputSched', 'SUM OUTPUTSCHEDULE': 'sumOutputSched'}, {}, member='*_Agg_Output_Sched_Houston[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_out_sched_houston(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumLSLOutputSchedFrom: Decimal | None = None, sumLSLOutputSchedTo: Decimal | None = None, sumHSLOutputSchedFrom: Decimal | None = None, sumHSLOutputSchedTo: Decimal | None = None, sumOutputSchedFrom: Decimal | None = None, sumOutputSchedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggOutSchedHoustonRow]:
'2-Day Aggregated Output Schedule Houston'
return self._client._page('/np3-910-er/2d_agg_out_sched_houston', np3_910_er._2dAggOutSchedHoustonRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumLSLOutputSchedFrom': sumLSLOutputSchedFrom, 'sumLSLOutputSchedTo': sumLSLOutputSchedTo, 'sumHSLOutputSchedFrom': sumHSLOutputSchedFrom, 'sumHSLOutputSchedTo': sumHSLOutputSchedTo, 'sumOutputSchedFrom': sumOutputSchedFrom, 'sumOutputSchedTo': sumOutputSchedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2167,6 +3581,18 @@ class _2dAggOutSchedNorthRow(Row):
sumLSLOutputSched: Decimal | None
sumOutputSched: Decimal | None
+ class _2dAggOutSchedNorthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumLSLOutputSched: Decimal | None
+ sumHSLOutputSched: Decimal | None
+ sumOutputSched: Decimal | None
+
+ @property
+ def _2d_agg_out_sched_north_history(self) -> Archive[np3_910_er._2dAggOutSchedNorthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggOutSchedNorthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM LSL OUTPUT SCHEDULE': 'sumLSLOutputSched', 'SUM HSL OUTPUT SCHEDULE': 'sumHSLOutputSched', 'SUM OUTPUTSCHEDULE': 'sumOutputSched'}, {}, member='*_Agg_Output_Sched_North[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_out_sched_north(self, *, sumHSLOutputSchedFrom: Decimal | None = None, sumHSLOutputSchedTo: Decimal | None = None, sumOutputSchedFrom: Decimal | None = None, sumOutputSchedTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumLSLOutputSchedFrom: Decimal | None = None, sumLSLOutputSchedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggOutSchedNorthRow]:
'2-Day Aggregated Output Schedule North'
return self._client._page('/np3-910-er/2d_agg_out_sched_north', np3_910_er._2dAggOutSchedNorthRow, {'sumHSLOutputSchedFrom': sumHSLOutputSchedFrom, 'sumHSLOutputSchedTo': sumHSLOutputSchedTo, 'sumOutputSchedFrom': sumOutputSchedFrom, 'sumOutputSchedTo': sumOutputSchedTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumLSLOutputSchedFrom': sumLSLOutputSchedFrom, 'sumLSLOutputSchedTo': sumLSLOutputSchedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2189,6 +3615,18 @@ class _2dAggOutSchedSouthRow(Row):
sumLSLOutputSched: Decimal | None
sumOutputSched: Decimal | None
+ class _2dAggOutSchedSouthHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumLSLOutputSched: Decimal | None
+ sumHSLOutputSched: Decimal | None
+ sumOutputSched: Decimal | None
+
+ @property
+ def _2d_agg_out_sched_south_history(self) -> Archive[np3_910_er._2dAggOutSchedSouthHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggOutSchedSouthHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM LSL OUTPUT SCHEDULE': 'sumLSLOutputSched', 'SUM HSL OUTPUT SCHEDULE': 'sumHSLOutputSched', 'SUM OUTPUTSCHEDULE': 'sumOutputSched'}, {}, member='*_Agg_Output_Sched_South[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_out_sched_south(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, sumLSLOutputSchedFrom: Decimal | None = None, sumLSLOutputSchedTo: Decimal | None = None, sumHSLOutputSchedFrom: Decimal | None = None, sumHSLOutputSchedTo: Decimal | None = None, sumOutputSchedFrom: Decimal | None = None, sumOutputSchedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggOutSchedSouthRow]:
'2-Day Aggregated Output Schedule South'
return self._client._page('/np3-910-er/2d_agg_out_sched_south', np3_910_er._2dAggOutSchedSouthRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'sumLSLOutputSchedFrom': sumLSLOutputSchedFrom, 'sumLSLOutputSchedTo': sumLSLOutputSchedTo, 'sumHSLOutputSchedFrom': sumHSLOutputSchedFrom, 'sumHSLOutputSchedTo': sumHSLOutputSchedTo, 'sumOutputSchedFrom': sumOutputSchedFrom, 'sumOutputSchedTo': sumOutputSchedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2211,6 +3649,18 @@ class _2dAggOutSchedWestRow(Row):
sumLSLOutputSched: Decimal | None
sumOutputSched: Decimal | None
+ class _2dAggOutSchedWestHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ sumLSLOutputSched: Decimal | None
+ sumHSLOutputSched: Decimal | None
+ sumOutputSched: Decimal | None
+
+ @property
+ def _2d_agg_out_sched_west_history(self) -> Archive[np3_910_er._2dAggOutSchedWestHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-910-er', np3_910_er._2dAggOutSchedWestHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'SUM LSL OUTPUT SCHEDULE': 'sumLSLOutputSched', 'SUM HSL OUTPUT SCHEDULE': 'sumHSLOutputSched', 'SUM OUTPUTSCHEDULE': 'sumOutputSched'}, {}, member='*_Agg_Output_Sched_West[ -]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _2d_agg_out_sched_west(self, *, repeatHourFlag: bool | None = None, sumLSLOutputSchedFrom: Decimal | None = None, sumLSLOutputSchedTo: Decimal | None = None, sumHSLOutputSchedFrom: Decimal | None = None, sumHSLOutputSchedTo: Decimal | None = None, sumOutputSchedFrom: Decimal | None = None, sumOutputSchedTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_910_er._2dAggOutSchedWestRow]:
'2-Day Aggregated Output Schedule West'
return self._client._page('/np3-910-er/2d_agg_out_sched_west', np3_910_er._2dAggOutSchedWestRow, {'repeatHourFlag': repeatHourFlag, 'sumLSLOutputSchedFrom': sumLSLOutputSchedFrom, 'sumLSLOutputSchedTo': sumLSLOutputSchedTo, 'sumHSLOutputSchedFrom': sumHSLOutputSchedFrom, 'sumHSLOutputSchedTo': sumHSLOutputSchedTo, 'sumOutputSchedFrom': sumOutputSchedFrom, 'sumOutputSchedTo': sumOutputSchedTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2237,6 +3687,11 @@ class _2dAggAsOffersEcrsmRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_ecrsm_history(self) -> Archive[np3_911_er._2dAggAsOffersEcrsmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersEcrsmRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'ECRSM Offer Price': 'ECRSMOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_ECRSM-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_ecrsm(self, *, ECRSMOfferPriceFrom: Decimal | None = None, ECRSMOfferPriceTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersEcrsmRow]:
'2-Day Aggregated Ancillary Service Offers ECRSM'
return self._client._page('/np3-911-er/2d_agg_as_offers_ecrsm', np3_911_er._2dAggAsOffersEcrsmRow, {'ECRSMOfferPriceFrom': ECRSMOfferPriceFrom, 'ECRSMOfferPriceTo': ECRSMOfferPriceTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2258,6 +3713,11 @@ class _2dAggAsOffersEcrssRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_ecrss_history(self) -> Archive[np3_911_er._2dAggAsOffersEcrssRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersEcrssRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'ECRSS Offer Price': 'ECRSSOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_ECRSS-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_ecrss(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, ECRSSOfferPriceFrom: Decimal | None = None, ECRSSOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersEcrssRow]:
'2-Day Aggregated Ancillary Service Offers ECRSS'
return self._client._page('/np3-911-er/2d_agg_as_offers_ecrss', np3_911_er._2dAggAsOffersEcrssRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'ECRSSOfferPriceFrom': ECRSSOfferPriceFrom, 'ECRSSOfferPriceTo': ECRSSOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2279,6 +3739,11 @@ class _2dAggAsOffersOffnsRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_offns_history(self) -> Archive[np3_911_er._2dAggAsOffersOffnsRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersOffnsRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'OFFNS Offer Price': 'OFFNSOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_OFFNS-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_offns(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, OFFNSOfferPriceFrom: Decimal | None = None, OFFNSOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersOffnsRow]:
'2-Day Aggregated Ancillary Service Offers OFFNS'
return self._client._page('/np3-911-er/2d_agg_as_offers_offns', np3_911_er._2dAggAsOffersOffnsRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'OFFNSOfferPriceFrom': OFFNSOfferPriceFrom, 'OFFNSOfferPriceTo': OFFNSOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2300,6 +3765,11 @@ class _2dAggAsOffersOnnsRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_onns_history(self) -> Archive[np3_911_er._2dAggAsOffersOnnsRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersOnnsRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'ONNS Offer Price': 'ONNSOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_ONNS-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_onns(self, *, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, ONNSOfferPriceFrom: Decimal | None = None, ONNSOfferPriceTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersOnnsRow]:
'2-Day Aggregated Ancillary Service Offers ONNS'
return self._client._page('/np3-911-er/2d_agg_as_offers_onns', np3_911_er._2dAggAsOffersOnnsRow, {'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'ONNSOfferPriceFrom': ONNSOfferPriceFrom, 'ONNSOfferPriceTo': ONNSOfferPriceTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2321,6 +3791,11 @@ class _2dAggAsOffersRegdnRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_regdn_history(self) -> Archive[np3_911_er._2dAggAsOffersRegdnRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRegdnRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'REGDN Offer Price': 'REGDNOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_REGDN-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_regdn(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, REGDNOfferPriceFrom: Decimal | None = None, REGDNOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersRegdnRow]:
'2-Day Aggregated Ancillary Service Offers REGDN'
return self._client._page('/np3-911-er/2d_agg_as_offers_regdn', np3_911_er._2dAggAsOffersRegdnRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'REGDNOfferPriceFrom': REGDNOfferPriceFrom, 'REGDNOfferPriceTo': REGDNOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2342,6 +3817,11 @@ class _2dAggAsOffersRegupRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_regup_history(self) -> Archive[np3_911_er._2dAggAsOffersRegupRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRegupRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'REGUP Offer Price': 'REGUPOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_REGUP-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_regup(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, REGUPOfferPriceFrom: Decimal | None = None, REGUPOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersRegupRow]:
'2-Day Aggregated Ancillary Service Offers REGUP'
return self._client._page('/np3-911-er/2d_agg_as_offers_regup', np3_911_er._2dAggAsOffersRegupRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'REGUPOfferPriceFrom': REGUPOfferPriceFrom, 'REGUPOfferPriceTo': REGUPOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2363,6 +3843,11 @@ class _2dAggAsOffersRrsffrRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_rrsffr_history(self) -> Archive[np3_911_er._2dAggAsOffersRrsffrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRrsffrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSFFR Offer Price': 'RRSFFROfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_RRSFFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_rrsffr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, RRSFFROfferPriceFrom: Decimal | None = None, RRSFFROfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersRrsffrRow]:
'2-Day Aggregated Ancillary Service Offers RRSFFR'
return self._client._page('/np3-911-er/2d_agg_as_offers_rrsffr', np3_911_er._2dAggAsOffersRrsffrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'RRSFFROfferPriceFrom': RRSFFROfferPriceFrom, 'RRSFFROfferPriceTo': RRSFFROfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2384,6 +3869,11 @@ class _2dAggAsOffersRrspfrRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_rrspfr_history(self) -> Archive[np3_911_er._2dAggAsOffersRrspfrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRrspfrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSPFR Offer Price': 'RRSPFROfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_RRSPFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_rrspfr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, RRSPFROfferPriceFrom: Decimal | None = None, RRSPFROfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersRrspfrRow]:
'2-Day Aggregated Ancillary Service Offers RRSPFR'
return self._client._page('/np3-911-er/2d_agg_as_offers_rrspfr', np3_911_er._2dAggAsOffersRrspfrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'RRSPFROfferPriceFrom': RRSPFROfferPriceFrom, 'RRSPFROfferPriceTo': RRSPFROfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2405,6 +3895,11 @@ class _2dAggAsOffersRrsufrRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_as_offers_rrsufr_history(self) -> Archive[np3_911_er._2dAggAsOffersRrsufrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRrsufrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSUFR Offer Price': 'RRSUFROfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_RRSUFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_as_offers_rrsufr(self, *, RRSUFROfferPriceFrom: Decimal | None = None, RRSUFROfferPriceTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggAsOffersRrsufrRow]:
'2-Day Aggregated Ancillary Service Offers RRSUFR'
return self._client._page('/np3-911-er/2d_agg_as_offers_rrsufr', np3_911_er._2dAggAsOffersRrsufrRow, {'RRSUFROfferPriceFrom': RRSUFROfferPriceFrom, 'RRSUFROfferPriceTo': RRSUFROfferPriceTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2426,6 +3921,11 @@ class _2dAggDamAsOffersEcrsmRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_ecrsm_history(self) -> Archive[np3_911_er._2dAggDamAsOffersEcrsmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersEcrsmRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'ECRSM Offer Price': 'ECRSMOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_ECRSM-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_ecrsm(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, ECRSMOfferPriceFrom: Decimal | None = None, ECRSMOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersEcrsmRow]:
'2-Day Aggregated DAM Ancillary Service Offers ECRSM'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_ecrsm', np3_911_er._2dAggDamAsOffersEcrsmRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'ECRSMOfferPriceFrom': ECRSMOfferPriceFrom, 'ECRSMOfferPriceTo': ECRSMOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2447,6 +3947,11 @@ class _2dAggDamAsOffersEcrssRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_ecrss_history(self) -> Archive[np3_911_er._2dAggDamAsOffersEcrssRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersEcrssRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'ECRSS Offer Price': 'ECRSSOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_ECRSS-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_ecrss(self, *, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, ECRSSOfferPriceFrom: Decimal | None = None, ECRSSOfferPriceTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersEcrssRow]:
'2-Day Aggregated DAM Ancillary Service Offers ECRSS'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_ecrss', np3_911_er._2dAggDamAsOffersEcrssRow, {'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'ECRSSOfferPriceFrom': ECRSSOfferPriceFrom, 'ECRSSOfferPriceTo': ECRSSOfferPriceTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2468,6 +3973,11 @@ class _2dAggDamAsOffersNspinRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_nspin_history(self) -> Archive[np3_911_er._2dAggDamAsOffersNspinRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersNspinRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'NSPIN Offer Price': 'NSPINOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_NSPIN-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_nspin(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, NSPINOfferPriceFrom: Decimal | None = None, NSPINOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersNspinRow]:
'2-Day Aggregated DAM Ancillary Service Offers NSPIN'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_nspin', np3_911_er._2dAggDamAsOffersNspinRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'NSPINOfferPriceFrom': NSPINOfferPriceFrom, 'NSPINOfferPriceTo': NSPINOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2489,6 +3999,11 @@ class _2dAggDamAsOffersNspnmRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_nspnm_history(self) -> Archive[np3_911_er._2dAggDamAsOffersNspnmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersNspnmRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'NSPNM Offer Price': 'NSPNMOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_NSPNM-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_nspnm(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, NSPNMOfferPriceFrom: Decimal | None = None, NSPNMOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersNspnmRow]:
'2-Day Aggregated DAM Ancillary Service Offers NSPNM'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_nspnm', np3_911_er._2dAggDamAsOffersNspnmRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'NSPNMOfferPriceFrom': NSPNMOfferPriceFrom, 'NSPNMOfferPriceTo': NSPNMOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2510,6 +4025,11 @@ class _2dAggDamAsOffersRegdnRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_regdn_history(self) -> Archive[np3_911_er._2dAggDamAsOffersRegdnRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersRegdnRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'REGDN Offer Price': 'REGDNOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_REGDN-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_regdn(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, REGDNOfferPriceFrom: Decimal | None = None, REGDNOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersRegdnRow]:
'2-Day Aggregated DAM Ancillary Service Offers REGDN'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_regdn', np3_911_er._2dAggDamAsOffersRegdnRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'REGDNOfferPriceFrom': REGDNOfferPriceFrom, 'REGDNOfferPriceTo': REGDNOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2531,6 +4051,11 @@ class _2dAggDamAsOffersRegupRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_regup_history(self) -> Archive[np3_911_er._2dAggDamAsOffersRegupRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersRegupRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'REGUP Offer Price': 'REGUPOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_REGUP-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_regup(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, REGUPOfferPriceFrom: Decimal | None = None, REGUPOfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersRegupRow]:
'2-Day Aggregated DAM Ancillary Service Offers REGUP'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_regup', np3_911_er._2dAggDamAsOffersRegupRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'REGUPOfferPriceFrom': REGUPOfferPriceFrom, 'REGUPOfferPriceTo': REGUPOfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2552,6 +4077,11 @@ class _2dAggDamAsOffersRrsffrRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_rrsffr_history(self) -> Archive[np3_911_er._2dAggDamAsOffersRrsffrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersRrsffrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSFFR Offer Price': 'RRSFFROfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_RRSFFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_rrsffr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, RRSFFROfferPriceFrom: Decimal | None = None, RRSFFROfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersRrsffrRow]:
'2-Day Aggregated DAM Ancillary Service Offers RRSFFR'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_rrsffr', np3_911_er._2dAggDamAsOffersRrsffrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'RRSFFROfferPriceFrom': RRSFFROfferPriceFrom, 'RRSFFROfferPriceTo': RRSFFROfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2573,6 +4103,11 @@ class _2dAggDamAsOffersRrspfrRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_rrspfr_history(self) -> Archive[np3_911_er._2dAggDamAsOffersRrspfrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersRrspfrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSPFR Offer Price': 'RRSPFROfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_RRSPFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_rrspfr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, RRSPFROfferPriceFrom: Decimal | None = None, RRSPFROfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersRrspfrRow]:
'2-Day Aggregated DAM Ancillary Service Offers RRSPFR'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_rrspfr', np3_911_er._2dAggDamAsOffersRrspfrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'RRSPFROfferPriceFrom': RRSPFROfferPriceFrom, 'RRSPFROfferPriceTo': RRSPFROfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2594,6 +4129,11 @@ class _2dAggDamAsOffersRrsufrRow(Row):
deliveryDate: date | None
hourEnding: int | None
+ @property
+ def _2d_agg_dam_as_offers_rrsufr_history(self) -> Archive[np3_911_er._2dAggDamAsOffersRrsufrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggDamAsOffersRrsufrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSUFR Offer Price': 'RRSUFROfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_DAM_AS_Offers_RRSUFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_agg_dam_as_offers_rrsufr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, MWOfferedFrom: Decimal | None = None, MWOfferedTo: Decimal | None = None, RRSUFROfferPriceFrom: Decimal | None = None, RRSUFROfferPriceTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dAggDamAsOffersRrsufrRow]:
'2-Day Aggregated DAM Ancillary Service Offers RRSUFR'
return self._client._page('/np3-911-er/2d_agg_dam_as_offers_rrsufr', np3_911_er._2dAggDamAsOffersRrsufrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'MWOfferedFrom': MWOfferedFrom, 'MWOfferedTo': MWOfferedTo, 'RRSUFROfferPriceFrom': RRSUFROfferPriceFrom, 'RRSUFROfferPriceTo': RRSUFROfferPriceTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2614,6 +4154,11 @@ class _2dClearedDamAsEcrsmRow(Row):
hourEnding: int | None
totalClearedASECRSM: Decimal | None
+ @property
+ def _2d_cleared_dam_as_ecrsm_history(self) -> Archive[np3_911_er._2dClearedDamAsEcrsmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsEcrsmRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - ECRSM': 'totalClearedASECRSM'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_ECRSM-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_ecrsm(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASECRSMFrom: Decimal | None = None, totalClearedASECRSMTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsEcrsmRow]:
'2-Day Cleared DAM Ancillary Service ECRSM'
return self._client._page('/np3-911-er/2d_cleared_dam_as_ecrsm', np3_911_er._2dClearedDamAsEcrsmRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASECRSMFrom': totalClearedASECRSMFrom, 'totalClearedASECRSMTo': totalClearedASECRSMTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2634,6 +4179,11 @@ class _2dClearedDamAsEcrssRow(Row):
hourEnding: int | None
totalClearedASECRSS: Decimal | None
+ @property
+ def _2d_cleared_dam_as_ecrss_history(self) -> Archive[np3_911_er._2dClearedDamAsEcrssRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsEcrssRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - ECRSS': 'totalClearedASECRSS'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_ECRSS-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_ecrss(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASECRSSFrom: Decimal | None = None, totalClearedASECRSSTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsEcrssRow]:
'2-Day Cleared DAM Ancillary Service ECRSS'
return self._client._page('/np3-911-er/2d_cleared_dam_as_ecrss', np3_911_er._2dClearedDamAsEcrssRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASECRSSFrom': totalClearedASECRSSFrom, 'totalClearedASECRSSTo': totalClearedASECRSSTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2654,6 +4204,11 @@ class _2dClearedDamAsNspinRow(Row):
hourEnding: int | None
totalClearedASNSPIN: Decimal | None
+ @property
+ def _2d_cleared_dam_as_nspin_history(self) -> Archive[np3_911_er._2dClearedDamAsNspinRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsNspinRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - NonSpin': 'totalClearedASNSPIN'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_NSPIN-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_nspin(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASNSPINFrom: Decimal | None = None, totalClearedASNSPINTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsNspinRow]:
'2-Day Cleared DAM Ancillary Service NSPIN'
return self._client._page('/np3-911-er/2d_cleared_dam_as_nspin', np3_911_er._2dClearedDamAsNspinRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASNSPINFrom': totalClearedASNSPINFrom, 'totalClearedASNSPINTo': totalClearedASNSPINTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2674,6 +4229,11 @@ class _2dClearedDamAsNspnmRow(Row):
hourEnding: int | None
totalClearedASNSPNM: Decimal | None
+ @property
+ def _2d_cleared_dam_as_nspnm_history(self) -> Archive[np3_911_er._2dClearedDamAsNspnmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsNspnmRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - NSPNM': 'totalClearedASNSPNM'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_NSPNM-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_nspnm(self, *, totalClearedASNSPNMFrom: Decimal | None = None, totalClearedASNSPNMTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsNspnmRow]:
'2-Day Cleared DAM Ancillary Service NSPNM'
return self._client._page('/np3-911-er/2d_cleared_dam_as_nspnm', np3_911_er._2dClearedDamAsNspnmRow, {'totalClearedASNSPNMFrom': totalClearedASNSPNMFrom, 'totalClearedASNSPNMTo': totalClearedASNSPNMTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2694,6 +4254,11 @@ class _2dClearedDamAsRegdnRow(Row):
hourEnding: int | None
totalClearedASREGDN: Decimal | None
+ @property
+ def _2d_cleared_dam_as_regdn_history(self) -> Archive[np3_911_er._2dClearedDamAsRegdnRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsRegdnRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - RegDown': 'totalClearedASREGDN'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_REGDN-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_regdn(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASREGDNFrom: Decimal | None = None, totalClearedASREGDNTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsRegdnRow]:
'2-Day Cleared DAM Ancillary Service REGDN'
return self._client._page('/np3-911-er/2d_cleared_dam_as_regdn', np3_911_er._2dClearedDamAsRegdnRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASREGDNFrom': totalClearedASREGDNFrom, 'totalClearedASREGDNTo': totalClearedASREGDNTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2714,6 +4279,11 @@ class _2dClearedDamAsRegupRow(Row):
hourEnding: int | None
totalClearedASREGUP: Decimal | None
+ @property
+ def _2d_cleared_dam_as_regup_history(self) -> Archive[np3_911_er._2dClearedDamAsRegupRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsRegupRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - RegUp': 'totalClearedASREGUP'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_REGUP-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_regup(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASREGUPFrom: Decimal | None = None, totalClearedASREGUPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsRegupRow]:
'2-Day Cleared DAM Ancillary Service REGUP'
return self._client._page('/np3-911-er/2d_cleared_dam_as_regup', np3_911_er._2dClearedDamAsRegupRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASREGUPFrom': totalClearedASREGUPFrom, 'totalClearedASREGUPTo': totalClearedASREGUPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2734,6 +4304,11 @@ class _2dClearedDamAsRrsffrRow(Row):
hourEnding: int | None
totalClearedASRRSFFR: Decimal | None
+ @property
+ def _2d_cleared_dam_as_rrsffr_history(self) -> Archive[np3_911_er._2dClearedDamAsRrsffrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsRrsffrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - RRSFFR': 'totalClearedASRRSFFR'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_RRSFFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_rrsffr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASRRSFFRFrom: Decimal | None = None, totalClearedASRRSFFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsRrsffrRow]:
'2-Day Cleared DAM Ancillary Service RRSFFR'
return self._client._page('/np3-911-er/2d_cleared_dam_as_rrsffr', np3_911_er._2dClearedDamAsRrsffrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASRRSFFRFrom': totalClearedASRRSFFRFrom, 'totalClearedASRRSFFRTo': totalClearedASRRSFFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2754,6 +4329,11 @@ class _2dClearedDamAsRrspfrRow(Row):
hourEnding: int | None
totalClearedASRRSPFR: Decimal | None
+ @property
+ def _2d_cleared_dam_as_rrspfr_history(self) -> Archive[np3_911_er._2dClearedDamAsRrspfrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsRrspfrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - RRSPFR': 'totalClearedASRRSPFR'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_RRSPFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_rrspfr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASRRSPFRFrom: Decimal | None = None, totalClearedASRRSPFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsRrspfrRow]:
'2-Day Cleared DAM Ancillary Service RRSPFR'
return self._client._page('/np3-911-er/2d_cleared_dam_as_rrspfr', np3_911_er._2dClearedDamAsRrspfrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASRRSPFRFrom': totalClearedASRRSPFRFrom, 'totalClearedASRRSPFRTo': totalClearedASRRSPFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2774,6 +4354,11 @@ class _2dClearedDamAsRrsufrRow(Row):
hourEnding: int | None
totalClearedASRRSUFR: Decimal | None
+ @property
+ def _2d_cleared_dam_as_rrsufr_history(self) -> Archive[np3_911_er._2dClearedDamAsRrsufrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsRrsufrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - RRSUFR': 'totalClearedASRRSUFR'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_RRSUFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_cleared_dam_as_rrsufr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalClearedASRRSUFRFrom: Decimal | None = None, totalClearedASRRSUFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dClearedDamAsRrsufrRow]:
'2-Day Cleared DAM Ancillary Service RRSUFR'
return self._client._page('/np3-911-er/2d_cleared_dam_as_rrsufr', np3_911_er._2dClearedDamAsRrsufrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalClearedASRRSUFRFrom': totalClearedASRRSUFRFrom, 'totalClearedASRRSUFRTo': totalClearedASRRSUFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2794,6 +4379,11 @@ class _2dSelfArrangedAsEcrsmRow(Row):
hourEnding: int | None
totalSelfArrangedASECRSM: Decimal | None
+ @property
+ def _2d_self_arranged_as_ecrsm_history(self) -> Archive[np3_911_er._2dSelfArrangedAsEcrsmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsEcrsmRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - ECRSM': 'totalSelfArrangedASECRSM'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_ECRSM-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_ecrsm(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASECRSMFrom: Decimal | None = None, totalSelfArrangedASECRSMTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsEcrsmRow]:
'2-Day Self Arranged Ancillary Service ECRSM'
return self._client._page('/np3-911-er/2d_self_arranged_as_ecrsm', np3_911_er._2dSelfArrangedAsEcrsmRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASECRSMFrom': totalSelfArrangedASECRSMFrom, 'totalSelfArrangedASECRSMTo': totalSelfArrangedASECRSMTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2814,6 +4404,11 @@ class _2dSelfArrangedAsEcrssRow(Row):
hourEnding: int | None
totalSelfArrangedASECRSS: Decimal | None
+ @property
+ def _2d_self_arranged_as_ecrss_history(self) -> Archive[np3_911_er._2dSelfArrangedAsEcrssRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsEcrssRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - ECRSS': 'totalSelfArrangedASECRSS'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_ECRSS-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_ecrss(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASECRSSFrom: Decimal | None = None, totalSelfArrangedASECRSSTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsEcrssRow]:
'2-Day Self Arranged Ancillary Service ECRSS'
return self._client._page('/np3-911-er/2d_self_arranged_as_ecrss', np3_911_er._2dSelfArrangedAsEcrssRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASECRSSFrom': totalSelfArrangedASECRSSFrom, 'totalSelfArrangedASECRSSTo': totalSelfArrangedASECRSSTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2834,6 +4429,11 @@ class _2dSelfArrangedAsNspinRow(Row):
hourEnding: int | None
totalSelfArrangedASNSPIN: Decimal | None
+ @property
+ def _2d_self_arranged_as_nspin_history(self) -> Archive[np3_911_er._2dSelfArrangedAsNspinRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsNspinRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - NonSpin': 'totalSelfArrangedASNSPIN'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_NSPIN-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_nspin(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASNSPINFrom: Decimal | None = None, totalSelfArrangedASNSPINTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsNspinRow]:
'2-Day Self Arranged Ancillary Service NSPIN'
return self._client._page('/np3-911-er/2d_self_arranged_as_nspin', np3_911_er._2dSelfArrangedAsNspinRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASNSPINFrom': totalSelfArrangedASNSPINFrom, 'totalSelfArrangedASNSPINTo': totalSelfArrangedASNSPINTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2854,6 +4454,11 @@ class _2dSelfArrangedAsNspnmRow(Row):
hourEnding: int | None
totalSelfArrangedASNSPNM: Decimal | None
+ @property
+ def _2d_self_arranged_as_nspnm_history(self) -> Archive[np3_911_er._2dSelfArrangedAsNspnmRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsNspnmRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - NSPNM': 'totalSelfArrangedASNSPNM'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_NSPNM-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_nspnm(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASNSPNMFrom: Decimal | None = None, totalSelfArrangedASNSPNMTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsNspnmRow]:
'2-Day Self Arranged Ancillary Service NSPNM'
return self._client._page('/np3-911-er/2d_self_arranged_as_nspnm', np3_911_er._2dSelfArrangedAsNspnmRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASNSPNMFrom': totalSelfArrangedASNSPNMFrom, 'totalSelfArrangedASNSPNMTo': totalSelfArrangedASNSPNMTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2874,6 +4479,11 @@ class _2dSelfArrangedAsRegdnRow(Row):
hourEnding: int | None
totalSelfArrangedASREGDN: Decimal | None
+ @property
+ def _2d_self_arranged_as_regdn_history(self) -> Archive[np3_911_er._2dSelfArrangedAsRegdnRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsRegdnRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - RegDown': 'totalSelfArrangedASREGDN'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_REGDN-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_regdn(self, *, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASREGDNFrom: Decimal | None = None, totalSelfArrangedASREGDNTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsRegdnRow]:
'2-Day Self Arranged Ancillary Service REGDN'
return self._client._page('/np3-911-er/2d_self_arranged_as_regdn', np3_911_er._2dSelfArrangedAsRegdnRow, {'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASREGDNFrom': totalSelfArrangedASREGDNFrom, 'totalSelfArrangedASREGDNTo': totalSelfArrangedASREGDNTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2894,6 +4504,11 @@ class _2dSelfArrangedAsRegupRow(Row):
hourEnding: int | None
totalSelfArrangedASREGUP: Decimal | None
+ @property
+ def _2d_self_arranged_as_regup_history(self) -> Archive[np3_911_er._2dSelfArrangedAsRegupRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsRegupRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - RegUp': 'totalSelfArrangedASREGUP'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_REGUP-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_regup(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASREGUPFrom: Decimal | None = None, totalSelfArrangedASREGUPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsRegupRow]:
'2-Day Self Arranged Ancillary Service REGUP'
return self._client._page('/np3-911-er/2d_self_arranged_as_regup', np3_911_er._2dSelfArrangedAsRegupRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASREGUPFrom': totalSelfArrangedASREGUPFrom, 'totalSelfArrangedASREGUPTo': totalSelfArrangedASREGUPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2914,6 +4529,11 @@ class _2dSelfArrangedAsRrsffrRow(Row):
hourEnding: int | None
totalSelfArrangedASRRSFFR: Decimal | None
+ @property
+ def _2d_self_arranged_as_rrsffr_history(self) -> Archive[np3_911_er._2dSelfArrangedAsRrsffrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsRrsffrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - RRSFFR': 'totalSelfArrangedASRRSFFR'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_RRSFFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_rrsffr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASRRSFFRFrom: Decimal | None = None, totalSelfArrangedASRRSFFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsRrsffrRow]:
'2-Day Self Arranged Ancillary Service RRSFFR'
return self._client._page('/np3-911-er/2d_self_arranged_as_rrsffr', np3_911_er._2dSelfArrangedAsRrsffrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASRRSFFRFrom': totalSelfArrangedASRRSFFRFrom, 'totalSelfArrangedASRRSFFRTo': totalSelfArrangedASRRSFFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2934,6 +4554,11 @@ class _2dSelfArrangedAsRrspfrRow(Row):
hourEnding: int | None
totalSelfArrangedASRRSPFR: Decimal | None
+ @property
+ def _2d_self_arranged_as_rrspfr_history(self) -> Archive[np3_911_er._2dSelfArrangedAsRrspfrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsRrspfrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - RRSPFR': 'totalSelfArrangedASRRSPFR'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_RRSPFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_rrspfr(self, *, totalSelfArrangedASRRSPFRFrom: Decimal | None = None, totalSelfArrangedASRRSPFRTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsRrspfrRow]:
'2-Day Self Arranged Ancillary Service RRSPFR'
return self._client._page('/np3-911-er/2d_self_arranged_as_rrspfr', np3_911_er._2dSelfArrangedAsRrspfrRow, {'totalSelfArrangedASRRSPFRFrom': totalSelfArrangedASRRSPFRFrom, 'totalSelfArrangedASRRSPFRTo': totalSelfArrangedASRRSPFRTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2954,6 +4579,11 @@ class _2dSelfArrangedAsRrsufrRow(Row):
hourEnding: int | None
totalSelfArrangedASRRSUFR: Decimal | None
+ @property
+ def _2d_self_arranged_as_rrsufr_history(self) -> Archive[np3_911_er._2dSelfArrangedAsRrsufrRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsRrsufrRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - RRSUFR': 'totalSelfArrangedASRRSUFR'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_RRSUFR-[0-9]*.csv', datetimes={}, variants=())
+
def _2d_self_arranged_as_rrsufr(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, totalSelfArrangedASRRSUFRFrom: Decimal | None = None, totalSelfArrangedASRRSUFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_911_er._2dSelfArrangedAsRrsufrRow]:
'2-Day Self Arranged Ancillary Service RRSUFR'
return self._client._page('/np3-911-er/2d_self_arranged_as_rrsufr', np3_911_er._2dSelfArrangedAsRrsufrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASRRSUFRFrom': totalSelfArrangedASRRSUFRFrom, 'totalSelfArrangedASRRSUFRTo': totalSelfArrangedASRRSUFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -2970,30 +4600,108 @@ def _2d_self_arranged_as_rrsufr_iter_async(self, *, deliveryDateFrom: date | Non
'2-Day Self Arranged Ancillary Service RRSUFR'
return self._client._aiter('/np3-911-er/2d_self_arranged_as_rrsufr', np3_911_er._2dSelfArrangedAsRrsufrRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'totalSelfArrangedASRRSUFRFrom': totalSelfArrangedASRRSUFRFrom, 'totalSelfArrangedASRRSUFRTo': totalSelfArrangedASRRSUFRTo, 'size': size, 'sort': sort, 'dir': dir})
-class np3_914_ex:
- def __init__(self, client: Transport) -> None:
- self._client = client
+ class _2dClearedDamAsRrsloadHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ totalClearedASRRSLOAD: Decimal | None
- class _3dScedHighAsOffersRow(Row):
- ASType: str | None
- SCEDTimestamp: datetime | None
- dmeName: str | None
- price: Decimal | None
- qseName: str | None
- quantity: Decimal | None
- resourceName: str | None
+ @property
+ def _2d_cleared_dam_as_rrsload_history(self) -> Archive[np3_911_er._2dClearedDamAsRrsloadHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsRrsloadHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - RRS Load': 'totalClearedASRRSLOAD'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_RRSLOAD-[0-9]*.csv', datetimes={}, variants=())
- def _3d_sced_high_as_offers(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_914_ex._3dScedHighAsOffersRow]:
- '3-Day SCED Highest Price AS Offer Selected'
- return self._client._page('/np3-914-ex/3d_sced_high_as_offers', np3_914_ex._3dScedHighAsOffersRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'ASType': ASType, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+ class _2dClearedDamAsRrsgenHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ totalClearedASRRSGEN: Decimal | None
- def _3d_sced_high_as_offers_iter(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_914_ex._3dScedHighAsOffersRow]:
- '3-Day SCED Highest Price AS Offer Selected'
- return self._client._iter('/np3-914-ex/3d_sced_high_as_offers', np3_914_ex._3dScedHighAsOffersRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'ASType': ASType, 'size': size, 'sort': sort, 'dir': dir})
+ @property
+ def _2d_cleared_dam_as_rrsgen_history(self) -> Archive[np3_911_er._2dClearedDamAsRrsgenHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dClearedDamAsRrsgenHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Cleared AS - RRS Gen': 'totalClearedASRRSGEN'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Cleared_DAM_AS_RRSGEN-[0-9]*.csv', datetimes={}, variants=())
- async def _3d_sced_high_as_offers_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_914_ex._3dScedHighAsOffersRow]:
- '3-Day SCED Highest Price AS Offer Selected'
- return await self._client._apage('/np3-914-ex/3d_sced_high_as_offers', np3_914_ex._3dScedHighAsOffersRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'ASType': ASType, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+ class _2dSelfArrangedAsRrsloadHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ totalSelfArrangedASRRSLOAD: Decimal | None
+
+ @property
+ def _2d_self_arranged_as_rrsload_history(self) -> Archive[np3_911_er._2dSelfArrangedAsRrsloadHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsRrsloadHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - RRS Load': 'totalSelfArrangedASRRSLOAD'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_RRSLOAD-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dSelfArrangedAsRrsgenHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ totalSelfArrangedASRRSGEN: Decimal | None
+
+ @property
+ def _2d_self_arranged_as_rrsgen_history(self) -> Archive[np3_911_er._2dSelfArrangedAsRrsgenHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dSelfArrangedAsRrsgenHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Total Self-Arranged AS - RRS Gen': 'totalSelfArrangedASRRSGEN'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Self_Arranged_AS_RRSGEN-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggAsOffersRrsncHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ MWOffered: Decimal | None
+ RRSNCOfferPrice: Decimal | None
+
+ @property
+ def _2d_agg_as_offers_rrsnc_history(self) -> Archive[np3_911_er._2dAggAsOffersRrsncHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRrsncHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSNC Offer Price': 'RRSNCOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_RRSNC-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggAsOffersRrsldHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ MWOffered: Decimal | None
+ RRSLDOfferPrice: Decimal | None
+
+ @property
+ def _2d_agg_as_offers_rrsld_history(self) -> Archive[np3_911_er._2dAggAsOffersRrsldHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRrsldHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSLD Offer Price': 'RRSLDOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_RRSLD-[0-9]*.csv', datetimes={}, variants=())
+
+ class _2dAggAsOffersRrsgnHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ MWOffered: Decimal | None
+ RRSGNOfferPrice: Decimal | None
+
+ @property
+ def _2d_agg_as_offers_rrsgn_history(self) -> Archive[np3_911_er._2dAggAsOffersRrsgnHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-911-er', np3_911_er._2dAggAsOffersRrsgnHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'MW Offered': 'MWOffered', 'RRSGN Offer Price': 'RRSGNOfferPrice'}, {'deliveryDate': '%m/%d/%Y'}, member='*_Agg_AS_Offers_RRSGN-[0-9]*.csv', datetimes={}, variants=())
+
+class np3_914_ex:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+ class _3dScedHighAsOffersRow(Row):
+ ASType: str | None
+ SCEDTimestamp: datetime | None
+ dmeName: str | None
+ price: Decimal | None
+ qseName: str | None
+ quantity: Decimal | None
+ resourceName: str | None
+
+ @property
+ def _3d_sced_high_as_offers_history(self) -> Archive[np3_914_ex._3dScedHighAsOffersRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-914-ex', np3_914_ex._3dScedHighAsOffersRow, {'SCED Timestamp': 'SCEDTimestamp', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name with Highest - Priced AS Offer Selected in SCED': 'resourceName', 'AS Type': 'ASType', 'Offered Quantity': 'quantity', 'Offered Price': 'price'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ def _3d_sced_high_as_offers(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_914_ex._3dScedHighAsOffersRow]:
+ '3-Day SCED Highest Price AS Offer Selected'
+ return self._client._page('/np3-914-ex/3d_sced_high_as_offers', np3_914_ex._3dScedHighAsOffersRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'ASType': ASType, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _3d_sced_high_as_offers_iter(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_914_ex._3dScedHighAsOffersRow]:
+ '3-Day SCED Highest Price AS Offer Selected'
+ return self._client._iter('/np3-914-ex/3d_sced_high_as_offers', np3_914_ex._3dScedHighAsOffersRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'ASType': ASType, 'size': size, 'sort': sort, 'dir': dir})
+
+ async def _3d_sced_high_as_offers_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_914_ex._3dScedHighAsOffersRow]:
+ '3-Day SCED Highest Price AS Offer Selected'
+ return await self._client._apage('/np3-914-ex/3d_sced_high_as_offers', np3_914_ex._3dScedHighAsOffersRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'ASType': ASType, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
def _3d_sced_high_as_offers_iter_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np3_914_ex._3dScedHighAsOffersRow]:
'3-Day SCED Highest Price AS Offer Selected'
@@ -3014,6 +4722,22 @@ class _3dDamHighAsOffersRow(Row):
quantity: Decimal | None
resourceName: str | None
+ class _3dDamHighAsOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None = None
+ dmeName: str | None = None
+ resourceName: str | None
+ ASType: str | None
+ blockIndicator: str | None
+ quantity: Decimal | None
+ price: Decimal | None
+
+ @property
+ def _3d_dam_high_as_offers_history(self) -> Archive[np3_915_ex._3dDamHighAsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-915-ex', np3_915_ex._3dDamHighAsOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name with Highest-Priced AS Offer Selected in DAM': 'resourceName', 'AS Type': 'ASType', 'Block Indicator': 'blockIndicator', 'Offered Quantity': 'quantity', 'Offered Price': 'price'}, {'deliveryDate': '%d-%b-%y'}, member='*.csv', datetimes={}, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Resource Name with Highest-Priced Offer Selected in DAM': 'resourceName', 'AS Type': 'ASType', 'Block Indicator': 'blockIndicator', 'Offered Quantity': 'quantity', 'Offered Price': 'price'},))
+
def _3d_dam_high_as_offers(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, ASType: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_915_ex._3dDamHighAsOffersRow]:
'3-Day DAM Highest Price AS Offer Selected'
return self._client._page('/np3-915-ex/3d_dam_high_as_offers', np3_915_ex._3dDamHighAsOffersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'ASType': ASType, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3044,6 +4768,22 @@ class _3dHighestPriceOfferScedRow(Row):
repeatedHourFlag: bool | None
resourceName: str | None
+ class _3dHighestPriceOfferScedHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatedHourFlag: bool | None
+ LMP: Decimal | None
+ qseName: str | None = None
+ dmeName: str | None = None
+ resourceName: str | None
+ proxyExtension: str | None
+ penaltyFlag: str | None
+ batchId: str | None = None
+
+ @property
+ def _3d_highest_price_offer_sced_history(self) -> Archive[np3_916_ex._3dHighestPriceOfferScedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-916-ex', np3_916_ex._3dHighestPriceOfferScedHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatedHourFlag', 'LMP': 'LMP', 'QSE': 'qseName', 'DME': 'dmeName', 'Generation Resource': 'resourceName', 'Proxy Extension': 'proxyExtension', 'Power Balance Penalty Flag': 'penaltyFlag'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatedHourFlag', 'Batch ID': 'batchId', 'LMP': 'LMP', 'Generation Resource': 'resourceName', 'Proxy Extension': 'proxyExtension', 'Power Balance Penalty Flag': 'penaltyFlag'},))
+
def _3d_highest_price_offer_sced(self, *, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, proxyExtension: str | None = None, penaltyFlag: str | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatedHourFlag: bool | None = None, LMPFrom: Decimal | None = None, LMPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_916_ex._3dHighestPriceOfferScedRow]:
'3-Day Highest Price Offered in SCED'
return self._client._page('/np3-916-ex/3d_highest_price_offer_sced', np3_916_ex._3dHighestPriceOfferScedRow, {'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'proxyExtension': proxyExtension, 'penaltyFlag': penaltyFlag, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatedHourFlag': repeatedHourFlag, 'LMPFrom': LMPFrom, 'LMPTo': LMPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3118,6 +4858,65 @@ class _60dScedResourceAsOffersRow(Row):
repeatHourFlag: bool | None
resourceName: str | None
+ class _60dScedResourceAsOffersHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ resourceName: str | None
+ price1REGUP: Decimal | None
+ price1REGDN: Decimal | None
+ price1RRSPFR: Decimal | None
+ price1RRSUFR: Decimal | None
+ price1RRSFFR: Decimal | None
+ price1NSPIN: Decimal | None
+ price1ECRS: Decimal | None
+ quantityMW1: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDN: Decimal | None
+ price2RRSPFR: Decimal | None
+ price2RRSUFR: Decimal | None
+ price2RRSFFR: Decimal | None
+ price2NSPIN: Decimal | None
+ price2ECRS: Decimal | None
+ quantityMW2: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDN: Decimal | None
+ price3RRSPFR: Decimal | None
+ price3RRSUFR: Decimal | None
+ price3RRSFFR: Decimal | None
+ price3NSPIN: Decimal | None
+ price3ECRS: Decimal | None
+ quantityMW3: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDN: Decimal | None
+ price4RRSPFR: Decimal | None
+ price4RRSUFR: Decimal | None
+ price4RRSFFR: Decimal | None
+ price4NSPIN: Decimal | None
+ price4ECRS: Decimal | None
+ quantityMW4: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDN: Decimal | None
+ price5RRSPFR: Decimal | None
+ price5RRSUFR: Decimal | None
+ price5RRSFFR: Decimal | None
+ price5NSPIN: Decimal | None
+ price5ECRS: Decimal | None
+ quantityMW5: Decimal | None
+ price6REGUP: Decimal | None
+ price6REGDN: Decimal | None
+ price6RRSPFR: Decimal | None
+ price6RRSUFR: Decimal | None
+ price6RRSFFR: Decimal | None
+ price6NSPIN: Decimal | None
+ price6ECRS: Decimal | None
+ quantityMW6: Decimal | None
+ offerType: str | None
+
+ @property
+ def _60d_sced_resource_as_offers_history(self) -> Archive[np3_965_er._60dScedResourceAsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60dScedResourceAsOffersHistoryRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Resource Name': 'resourceName', 'PRICE1_REGUP': 'price1REGUP', 'PRICE1_REGDN': 'price1REGDN', 'PRICE1_RRSPFR': 'price1RRSPFR', 'PRICE1_RRSUFR': 'price1RRSUFR', 'PRICE1_RRSFFR': 'price1RRSFFR', 'PRICE1_NSPIN': 'price1NSPIN', 'PRICE1_ECRS': 'price1ECRS', 'QUANTITY_MW1': 'quantityMW1', 'PRICE2_REGUP': 'price2REGUP', 'PRICE2_REGDN': 'price2REGDN', 'PRICE2_RRSPFR': 'price2RRSPFR', 'PRICE2_RRSUFR': 'price2RRSUFR', 'PRICE2_RRSFFR': 'price2RRSFFR', 'PRICE2_NSPIN': 'price2NSPIN', 'PRICE2_ECRS': 'price2ECRS', 'QUANTITY_MW2': 'quantityMW2', 'PRICE3_REGUP': 'price3REGUP', 'PRICE3_REGDN': 'price3REGDN', 'PRICE3_RRSPFR': 'price3RRSPFR', 'PRICE3_RRSUFR': 'price3RRSUFR', 'PRICE3_RRSFFR': 'price3RRSFFR', 'PRICE3_NSPIN': 'price3NSPIN', 'PRICE3_ECRS': 'price3ECRS', 'QUANTITY_MW3': 'quantityMW3', 'PRICE4_REGUP': 'price4REGUP', 'PRICE4_REGDN': 'price4REGDN', 'PRICE4_RRSPFR': 'price4RRSPFR', 'PRICE4_RRSUFR': 'price4RRSUFR', 'PRICE4_RRSFFR': 'price4RRSFFR', 'PRICE4_NSPIN': 'price4NSPIN', 'PRICE4_ECRS': 'price4ECRS', 'QUANTITY_MW4': 'quantityMW4', 'PRICE5_REGUP': 'price5REGUP', 'PRICE5_REGDN': 'price5REGDN', 'PRICE5_RRSPFR': 'price5RRSPFR', 'PRICE5_RRSUFR': 'price5RRSUFR', 'PRICE5_RRSFFR': 'price5RRSFFR', 'PRICE5_NSPIN': 'price5NSPIN', 'PRICE5_ECRS': 'price5ECRS', 'QUANTITY_MW5': 'quantityMW5', 'PRICE6_REGUP': 'price6REGUP', 'PRICE6_REGDN': 'price6REGDN', 'PRICE6_RRSPFR': 'price6RRSPFR', 'PRICE6_RRSUFR': 'price6RRSUFR', 'PRICE6_RRSFFR': 'price6RRSFFR', 'PRICE6_NSPIN': 'price6NSPIN', 'PRICE6_ECRS': 'price6ECRS', 'QUANTITY_MW6': 'quantityMW6', 'Offer Type': 'offerType'}, {}, member='60d_SCED_Resource_AS_OFFERS-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _60d_sced_resource_as_offers(self, *, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4NSPINFrom: Decimal | None = None, price4NSPINTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDNFrom: Decimal | None = None, price5REGDNTo: Decimal | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5NSPINFrom: Decimal | None = None, price5NSPINTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, price6REGUPFrom: Decimal | None = None, price6REGUPTo: Decimal | None = None, price6REGDNFrom: Decimal | None = None, price6REGDNTo: Decimal | None = None, price6RRSPFRFrom: Decimal | None = None, price6RRSPFRTo: Decimal | None = None, price6RRSUFRFrom: Decimal | None = None, price6RRSUFRTo: Decimal | None = None, price6RRSFFRFrom: Decimal | None = None, price6RRSFFRTo: Decimal | None = None, price6NSPINFrom: Decimal | None = None, price6NSPINTo: Decimal | None = None, price6ECRSFrom: Decimal | None = None, price6ECRSTo: Decimal | None = None, quantityMW6From: Decimal | None = None, quantityMW6To: Decimal | None = None, offerType: str | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, resourceName: str | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDNFrom: Decimal | None = None, price1REGDNTo: Decimal | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price1NSPINFrom: Decimal | None = None, price1NSPINTo: Decimal | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDNFrom: Decimal | None = None, price2REGDNTo: Decimal | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2NSPINFrom: Decimal | None = None, price2NSPINTo: Decimal | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDNFrom: Decimal | None = None, price3REGDNTo: Decimal | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3NSPINFrom: Decimal | None = None, price3NSPINTo: Decimal | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDNFrom: Decimal | None = None, price4REGDNTo: Decimal | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60dScedResourceAsOffersRow]:
'60 Day SCED Resource AS Offers'
return self._client._page('/np3-965-er/60d_sced_resource_as_offers', np3_965_er._60dScedResourceAsOffersRow, {'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4NSPINFrom': price4NSPINFrom, 'price4NSPINTo': price4NSPINTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDNFrom': price5REGDNFrom, 'price5REGDNTo': price5REGDNTo, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5NSPINFrom': price5NSPINFrom, 'price5NSPINTo': price5NSPINTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'price6REGUPFrom': price6REGUPFrom, 'price6REGUPTo': price6REGUPTo, 'price6REGDNFrom': price6REGDNFrom, 'price6REGDNTo': price6REGDNTo, 'price6RRSPFRFrom': price6RRSPFRFrom, 'price6RRSPFRTo': price6RRSPFRTo, 'price6RRSUFRFrom': price6RRSUFRFrom, 'price6RRSUFRTo': price6RRSUFRTo, 'price6RRSFFRFrom': price6RRSFFRFrom, 'price6RRSFFRTo': price6RRSFFRTo, 'price6NSPINFrom': price6NSPINFrom, 'price6NSPINTo': price6NSPINTo, 'price6ECRSFrom': price6ECRSFrom, 'price6ECRSTo': price6ECRSTo, 'quantityMW6From': quantityMW6From, 'quantityMW6To': quantityMW6To, 'offerType': offerType, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'resourceName': resourceName, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDNFrom': price1REGDNFrom, 'price1REGDNTo': price1REGDNTo, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1NSPINFrom': price1NSPINFrom, 'price1NSPINTo': price1NSPINTo, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDNFrom': price2REGDNFrom, 'price2REGDNTo': price2REGDNTo, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2NSPINFrom': price2NSPINFrom, 'price2NSPINTo': price2NSPINTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDNFrom': price3REGDNFrom, 'price3REGDNTo': price3REGDNTo, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3NSPINFrom': price3NSPINFrom, 'price3NSPINTo': price3NSPINTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDNFrom': price4REGDNFrom, 'price4REGDNTo': price4REGDNTo, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3145,6 +4944,23 @@ class _60dScedAsCapManOverrideRow(Row):
resourceName: str | None
startTime: datetime | None
+ class _60dScedAsCapManOverrideHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ startTime: datetime | None
+ endTime: datetime | None
+ participantName: str | None
+ resourceName: str | None
+ ASType: str | None
+ ASCapLimit: Decimal | None
+ deratedQty: Decimal | None
+ reasonCode: str | None
+
+ @property
+ def _60d_sced_as_cap_man_override_history(self) -> Archive[np3_965_er._60dScedAsCapManOverrideHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60dScedAsCapManOverrideHistoryRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Start Timestamp': 'startTime', 'End Timestamp': 'endTime', 'Participant Name': 'participantName', 'Resource Name': 'resourceName', 'AS Type': 'ASType', 'AS Capability Limit': 'ASCapLimit', 'Derated Qty': 'deratedQty', 'Reason Code': 'reasonCode'}, {}, member='60d_AS_Capability_ManOverride-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S', 'startTime': '%m/%d/%Y %H:%M:%S', 'endTime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _60d_sced_as_cap_man_override(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, startTimeFrom: datetime | None = None, startTimeTo: datetime | None = None, endTimeFrom: datetime | None = None, endTimeTo: datetime | None = None, participantName: str | None = None, resourceName: str | None = None, ASType: str | None = None, ASCapLimitFrom: Decimal | None = None, ASCapLimitTo: Decimal | None = None, deratedQtyFrom: Decimal | None = None, deratedQtyTo: Decimal | None = None, reasonCode: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60dScedAsCapManOverrideRow]:
'60-Day AS Capability Manual Override'
return self._client._page('/np3-965-er/60d_sced_as_cap_man_override', np3_965_er._60dScedAsCapManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'startTimeFrom': startTimeFrom, 'startTimeTo': startTimeTo, 'endTimeFrom': endTimeFrom, 'endTimeTo': endTimeTo, 'participantName': participantName, 'resourceName': resourceName, 'ASType': ASType, 'ASCapLimitFrom': ASCapLimitFrom, 'ASCapLimitTo': ASCapLimitTo, 'deratedQtyFrom': deratedQtyFrom, 'deratedQtyTo': deratedQtyTo, 'reasonCode': reasonCode, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3360,126 +5176,465 @@ class _60dScedEsrDataRow(Row):
telemeteredNetOutput: Decimal | None
telemeteredResourceStatus: str | None
- def _60d_sced_esr_data(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60dScedEsrDataRow]:
- '60-Day ESR Data in SCED'
- return self._client._page('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
-
- def _60d_sced_esr_data_iter(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_965_er._60dScedEsrDataRow]:
- '60-Day ESR Data in SCED'
- return self._client._iter('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'size': size, 'sort': sort, 'dir': dir})
-
- async def _60d_sced_esr_data_async(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60dScedEsrDataRow]:
- '60-Day ESR Data in SCED'
- return await self._client._apage('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
-
- def _60d_sced_esr_data_iter_async(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np3_965_er._60dScedEsrDataRow]:
- '60-Day ESR Data in SCED'
- return self._client._aiter('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'size': size, 'sort': sort, 'dir': dir})
- class _60HdlLdlManOverrideRow(Row):
- HDLFinal: Decimal | None
- HDLManual: Decimal | None
- HDLOriginal: Decimal | None
- LDLFinal: Decimal | None
- LDLManual: Decimal | None
- LDLOriginal: Decimal | None
+ class _60dScedEsrDataHistoryRow(Row):
SCEDTimestamp: datetime | None
- participantName: str | None
- reasonCode: str | None
repeatHourFlag: bool | None
- resourceName: str | None
-
- def _60_hdl_ldl_man_override(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60HdlLdlManOverrideRow]:
- '60-Day HDL and LDL Manual Override Summary'
- return self._client._page('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
-
- def _60_hdl_ldl_man_override_iter(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_965_er._60HdlLdlManOverrideRow]:
- '60-Day HDL and LDL Manual Override Summary'
- return self._client._iter('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'size': size, 'sort': sort, 'dir': dir})
-
- async def _60_hdl_ldl_man_override_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60HdlLdlManOverrideRow]:
- '60-Day HDL and LDL Manual Override Summary'
- return await self._client._apage('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
-
- def _60_hdl_ldl_man_override_iter_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np3_965_er._60HdlLdlManOverrideRow]:
- '60-Day HDL and LDL Manual Override Summary'
- return self._client._aiter('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'size': size, 'sort': sort, 'dir': dir})
- class _60LoadResDataInScedRow(Row):
- ASAwardsECRS: Decimal | None
- ASAwardsNSPIN: Decimal | None
- ASAwardsREGDN: Decimal | None
- ASAwardsREGUP: Decimal | None
- ASAwardsRRSFFR: Decimal | None
- ASAwardsRRSPFR: Decimal | None
- ASAwardsRRSUFR: Decimal | None
- ASCapECRS: Decimal | None
- ASCapNSPIN: Decimal | None
- ASCapREGDN: Decimal | None
- ASCapREGUP: Decimal | None
- ASCapRRSFFR: Decimal | None
- ASCapRRSPFR: Decimal | None
- ASCapRRSUFR: Decimal | None
- ASRespForECRS: Decimal | None
- ASRespForNSPIN: Decimal | None
- ASRespForREGDN: Decimal | None
- ASRespForREGUP: Decimal | None
- ASRespForRRS: Decimal | None
- ASRespForRRSFFR: Decimal | None
- HASL: Decimal | None
- HDL: Decimal | None
- LASL: Decimal | None
- LDL: Decimal | None
- SCEDBidCurveMW1: Decimal | None
- SCEDBidCurveMW10: Decimal | None
- SCEDBidCurveMW2: Decimal | None
- SCEDBidCurveMW3: Decimal | None
- SCEDBidCurveMW4: Decimal | None
- SCEDBidCurveMW5: Decimal | None
- SCEDBidCurveMW6: Decimal | None
- SCEDBidCurveMW7: Decimal | None
- SCEDBidCurveMW8: Decimal | None
- SCEDBidCurveMW9: Decimal | None
- SCEDBidCurvePrice1: Decimal | None
- SCEDBidCurvePrice10: Decimal | None
- SCEDBidCurvePrice2: Decimal | None
- SCEDBidCurvePrice3: Decimal | None
- SCEDBidCurvePrice4: Decimal | None
- SCEDBidCurvePrice5: Decimal | None
- SCEDBidCurvePrice6: Decimal | None
- SCEDBidCurvePrice7: Decimal | None
- SCEDBidCurvePrice8: Decimal | None
- SCEDBidCurvePrice9: Decimal | None
- SCEDTimestamp: datetime | None
- basePoint: Decimal | None
- dmeName: str | None
- lowPowerConsumption: Decimal | None
- maxPowerConsumption: Decimal | None
qseName: str | None
- rampRateDown: Decimal | None
- rampRateUp: Decimal | None
- realPowerConsumption: Decimal | None
- repeatHourFlag: bool | None
+ dmeName: str | None
resourceName: str | None
- selfECRS: Decimal | None
- selfRRSFFR: Decimal | None
- selfRRSUFR: Decimal | None
- telResStatus: str | None
-
- def _60_load_res_data_in_sced(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60LoadResDataInScedRow]:
- '60-Day Load Resource Data in SCED'
- return self._client._page('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
-
- def _60_load_res_data_in_sced_iter(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_965_er._60LoadResDataInScedRow]:
- '60-Day Load Resource Data in SCED'
- return self._client._iter('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'size': size, 'sort': sort, 'dir': dir})
-
- async def _60_load_res_data_in_sced_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60LoadResDataInScedRow]:
- '60-Day Load Resource Data in SCED'
- return await self._client._apage('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
-
- def _60_load_res_data_in_sced_iter_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np3_965_er._60LoadResDataInScedRow]:
- '60-Day Load Resource Data in SCED'
- return self._client._aiter('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'size': size, 'sort': sort, 'dir': dir})
- class _60ScedQseSelfArrangedAsRow(Row):
+ resourceType: str | None
+ SCED1CurveMW1: Decimal | None
+ SCED1CurvePrice1: Decimal | None
+ SCED1CurveMW2: Decimal | None
+ SCED1CurvePrice2: Decimal | None
+ SCED1CurveMW3: Decimal | None
+ SCED1CurvePrice3: Decimal | None
+ SCED1CurveMW4: Decimal | None
+ SCED1CurvePrice4: Decimal | None
+ SCED1CurveMW5: Decimal | None
+ SCED1CurvePrice5: Decimal | None
+ SCED1CurveMW6: Decimal | None
+ SCED1CurvePrice6: Decimal | None
+ SCED1CurveMW7: Decimal | None
+ SCED1CurvePrice7: Decimal | None
+ SCED1CurveMW8: Decimal | None
+ SCED1CurvePrice8: Decimal | None
+ SCED1CurveMW9: Decimal | None
+ SCED1CurvePrice9: Decimal | None
+ SCED1CurveMW10: Decimal | None
+ SCED1CurvePrice10: Decimal | None
+ SCED1CurveMW11: Decimal | None
+ SCED1CurvePrice11: Decimal | None
+ SCED1CurveMW12: Decimal | None
+ SCED1CurvePrice12: Decimal | None
+ SCED1CurveMW13: Decimal | None
+ SCED1CurvePrice13: Decimal | None
+ SCED1CurveMW14: Decimal | None
+ SCED1CurvePrice14: Decimal | None
+ SCED1CurveMW15: Decimal | None
+ SCED1CurvePrice15: Decimal | None
+ SCED1CurveMW16: Decimal | None
+ SCED1CurvePrice16: Decimal | None
+ SCED1CurveMW17: Decimal | None
+ SCED1CurvePrice17: Decimal | None
+ SCED1CurveMW18: Decimal | None
+ SCED1CurvePrice18: Decimal | None
+ SCED1CurveMW19: Decimal | None
+ SCED1CurvePrice19: Decimal | None
+ SCED1CurveMW20: Decimal | None
+ SCED1CurvePrice20: Decimal | None
+ SCED1CurveMW21: Decimal | None
+ SCED1CurvePrice21: Decimal | None
+ SCED1CurveMW22: Decimal | None
+ SCED1CurvePrice22: Decimal | None
+ SCED1CurveMW23: Decimal | None
+ SCED1CurvePrice23: Decimal | None
+ SCED1CurveMW24: Decimal | None
+ SCED1CurvePrice24: Decimal | None
+ SCED1CurveMW25: Decimal | None
+ SCED1CurvePrice25: Decimal | None
+ SCED1CurveMW26: Decimal | None
+ SCED1CurvePrice26: Decimal | None
+ SCED1CurveMW27: Decimal | None
+ SCED1CurvePrice27: Decimal | None
+ SCED1CurveMW28: Decimal | None
+ SCED1CurvePrice28: Decimal | None
+ SCED1CurveMW29: Decimal | None
+ SCED1CurvePrice29: Decimal | None
+ SCED1CurveMW30: Decimal | None
+ SCED1CurvePrice30: Decimal | None
+ SCED1CurveMW31: Decimal | None
+ SCED1CurvePrice31: Decimal | None
+ SCED1CurveMW32: Decimal | None
+ SCED1CurvePrice32: Decimal | None
+ SCED1CurveMW33: Decimal | None
+ SCED1CurvePrice33: Decimal | None
+ SCED1CurveMW34: Decimal | None
+ SCED1CurvePrice34: Decimal | None
+ SCED1CurveMW35: Decimal | None
+ SCED1CurvePrice35: Decimal | None
+ SCED2CurveMW1: Decimal | None
+ SCED2CurvePrice1: Decimal | None
+ SCED2CurveMW2: Decimal | None
+ SCED2CurvePrice2: Decimal | None
+ SCED2CurveMW3: Decimal | None
+ SCED2CurvePrice3: Decimal | None
+ SCED2CurveMW4: Decimal | None
+ SCED2CurvePrice4: Decimal | None
+ SCED2CurveMW5: Decimal | None
+ SCED2CurvePrice5: Decimal | None
+ SCED2CurveMW6: Decimal | None
+ SCED2CurvePrice6: Decimal | None
+ SCED2CurveMW7: Decimal | None
+ SCED2CurvePrice7: Decimal | None
+ SCED2CurveMW8: Decimal | None
+ SCED2CurvePrice8: Decimal | None
+ SCED2CurveMW9: Decimal | None
+ SCED2CurvePrice9: Decimal | None
+ SCED2CurveMW10: Decimal | None
+ SCED2CurvePrice10: Decimal | None
+ SCED2CurveMW11: Decimal | None
+ SCED2CurvePrice11: Decimal | None
+ SCED2CurveMW12: Decimal | None
+ SCED2CurvePrice12: Decimal | None
+ SCED2CurveMW13: Decimal | None
+ SCED2CurvePrice13: Decimal | None
+ SCED2CurveMW14: Decimal | None
+ SCED2CurvePrice14: Decimal | None
+ SCED2CurveMW15: Decimal | None
+ SCED2CurvePrice15: Decimal | None
+ SCED2CurveMW16: Decimal | None
+ SCED2CurvePrice16: Decimal | None
+ SCED2CurveMW17: Decimal | None
+ SCED2CurvePrice17: Decimal | None
+ SCED2CurveMW18: Decimal | None
+ SCED2CurvePrice18: Decimal | None
+ SCED2CurveMW19: Decimal | None
+ SCED2CurvePrice19: Decimal | None
+ SCED2CurveMW20: Decimal | None
+ SCED2CurvePrice20: Decimal | None
+ SCED2CurveMW21: Decimal | None
+ SCED2CurvePrice21: Decimal | None
+ SCED2CurveMW22: Decimal | None
+ SCED2CurvePrice22: Decimal | None
+ SCED2CurveMW23: Decimal | None
+ SCED2CurvePrice23: Decimal | None
+ SCED2CurveMW24: Decimal | None
+ SCED2CurvePrice24: Decimal | None
+ SCED2CurveMW25: Decimal | None
+ SCED2CurvePrice25: Decimal | None
+ SCED2CurveMW26: Decimal | None
+ SCED2CurvePrice26: Decimal | None
+ SCED2CurveMW27: Decimal | None
+ SCED2CurvePrice27: Decimal | None
+ SCED2CurveMW28: Decimal | None
+ SCED2CurvePrice28: Decimal | None
+ SCED2CurveMW29: Decimal | None
+ SCED2CurvePrice29: Decimal | None
+ SCED2CurveMW30: Decimal | None
+ SCED2CurvePrice30: Decimal | None
+ SCED2CurveMW31: Decimal | None
+ SCED2CurvePrice31: Decimal | None
+ SCED2CurveMW32: Decimal | None
+ SCED2CurvePrice32: Decimal | None
+ SCED2CurveMW33: Decimal | None
+ SCED2CurvePrice33: Decimal | None
+ SCED2CurveMW34: Decimal | None
+ SCED2CurvePrice34: Decimal | None
+ SCED2CurveMW35: Decimal | None
+ SCED2CurvePrice35: Decimal | None
+ outputSchedule: Decimal | None
+ HSL: Decimal | None
+ HDL: Decimal | None
+ LSL: Decimal | None
+ LDL: Decimal | None
+ telemeteredResourceStatus: str | None
+ basePoint: Decimal | None
+ telemeteredNetOutput: Decimal | None
+ rampRateUp: Decimal | None
+ rampRateDown: Decimal | None
+ ASCapREGUP: Decimal | None
+ ASCapREGDN: Decimal | None
+ ASCapECRS: Decimal | None
+ ASCapNSPIN: Decimal | None
+ ASCapRRSPFR: Decimal | None
+ ASCapRRSFFR: Decimal | None
+ SOC: Decimal | None
+ minSOC: Decimal | None
+ maxSOC: Decimal | None
+ ASAwardsNSPIN: Decimal | None
+ ASAwardsRRSFFR: Decimal | None
+ ASAwardsRRSPFR: Decimal | None
+ ASAwardsRRSUFR: Decimal | None
+ ASAwardsECRS: Decimal | None
+ ASAwardsREGUP: Decimal | None
+ ASAwardsREGDN: Decimal | None
+ bidType: str | None
+ startUpColdOffer: Decimal | None
+ startUpHotOffer: Decimal | None
+ startUpInterOffer: Decimal | None
+ minGenCost: Decimal | None
+ submittedTPOMW1: Decimal | None
+ submittedTPOPrice1: Decimal | None
+ submittedTPOMW2: Decimal | None
+ submittedTPOPrice2: Decimal | None
+ submittedTPOMW3: Decimal | None
+ submittedTPOPrice3: Decimal | None
+ submittedTPOMW4: Decimal | None
+ submittedTPOPrice4: Decimal | None
+ submittedTPOMW5: Decimal | None
+ submittedTPOPrice5: Decimal | None
+ submittedTPOMW6: Decimal | None
+ submittedTPOPrice6: Decimal | None
+ submittedTPOMW7: Decimal | None
+ submittedTPOPrice7: Decimal | None
+ submittedTPOMW8: Decimal | None
+ submittedTPOPrice8: Decimal | None
+ submittedTPOMW9: Decimal | None
+ submittedTPOPrice9: Decimal | None
+ submittedTPOMW10: Decimal | None
+ submittedTPOPrice10: Decimal | None
+ proxyExtension: str | None
+
+ @property
+ def _60d_sced_esr_data_history(self) -> Archive[np3_965_er._60dScedEsrDataHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60dScedEsrDataHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'SCED1 Curve-MW1': 'SCED1CurveMW1', 'SCED1 Curve-Price1': 'SCED1CurvePrice1', 'SCED1 Curve-MW2': 'SCED1CurveMW2', 'SCED1 Curve-Price2': 'SCED1CurvePrice2', 'SCED1 Curve-MW3': 'SCED1CurveMW3', 'SCED1 Curve-Price3': 'SCED1CurvePrice3', 'SCED1 Curve-MW4': 'SCED1CurveMW4', 'SCED1 Curve-Price4': 'SCED1CurvePrice4', 'SCED1 Curve-MW5': 'SCED1CurveMW5', 'SCED1 Curve-Price5': 'SCED1CurvePrice5', 'SCED1 Curve-MW6': 'SCED1CurveMW6', 'SCED1 Curve-Price6': 'SCED1CurvePrice6', 'SCED1 Curve-MW7': 'SCED1CurveMW7', 'SCED1 Curve-Price7': 'SCED1CurvePrice7', 'SCED1 Curve-MW8': 'SCED1CurveMW8', 'SCED1 Curve-Price8': 'SCED1CurvePrice8', 'SCED1 Curve-MW9': 'SCED1CurveMW9', 'SCED1 Curve-Price9': 'SCED1CurvePrice9', 'SCED1 Curve-MW10': 'SCED1CurveMW10', 'SCED1 Curve-Price10': 'SCED1CurvePrice10', 'SCED1 Curve-MW11': 'SCED1CurveMW11', 'SCED1 Curve-Price11': 'SCED1CurvePrice11', 'SCED1 Curve-MW12': 'SCED1CurveMW12', 'SCED1 Curve-Price12': 'SCED1CurvePrice12', 'SCED1 Curve-MW13': 'SCED1CurveMW13', 'SCED1 Curve-Price13': 'SCED1CurvePrice13', 'SCED1 Curve-MW14': 'SCED1CurveMW14', 'SCED1 Curve-Price14': 'SCED1CurvePrice14', 'SCED1 Curve-MW15': 'SCED1CurveMW15', 'SCED1 Curve-Price15': 'SCED1CurvePrice15', 'SCED1 Curve-MW16': 'SCED1CurveMW16', 'SCED1 Curve-Price16': 'SCED1CurvePrice16', 'SCED1 Curve-MW17': 'SCED1CurveMW17', 'SCED1 Curve-Price17': 'SCED1CurvePrice17', 'SCED1 Curve-MW18': 'SCED1CurveMW18', 'SCED1 Curve-Price18': 'SCED1CurvePrice18', 'SCED1 Curve-MW19': 'SCED1CurveMW19', 'SCED1 Curve-Price19': 'SCED1CurvePrice19', 'SCED1 Curve-MW20': 'SCED1CurveMW20', 'SCED1 Curve-Price20': 'SCED1CurvePrice20', 'SCED1 Curve-MW21': 'SCED1CurveMW21', 'SCED1 Curve-Price21': 'SCED1CurvePrice21', 'SCED1 Curve-MW22': 'SCED1CurveMW22', 'SCED1 Curve-Price22': 'SCED1CurvePrice22', 'SCED1 Curve-MW23': 'SCED1CurveMW23', 'SCED1 Curve-Price23': 'SCED1CurvePrice23', 'SCED1 Curve-MW24': 'SCED1CurveMW24', 'SCED1 Curve-Price24': 'SCED1CurvePrice24', 'SCED1 Curve-MW25': 'SCED1CurveMW25', 'SCED1 Curve-Price25': 'SCED1CurvePrice25', 'SCED1 Curve-MW26': 'SCED1CurveMW26', 'SCED1 Curve-Price26': 'SCED1CurvePrice26', 'SCED1 Curve-MW27': 'SCED1CurveMW27', 'SCED1 Curve-Price27': 'SCED1CurvePrice27', 'SCED1 Curve-MW28': 'SCED1CurveMW28', 'SCED1 Curve-Price28': 'SCED1CurvePrice28', 'SCED1 Curve-MW29': 'SCED1CurveMW29', 'SCED1 Curve-Price29': 'SCED1CurvePrice29', 'SCED1 Curve-MW30': 'SCED1CurveMW30', 'SCED1 Curve-Price30': 'SCED1CurvePrice30', 'SCED1 Curve-MW31': 'SCED1CurveMW31', 'SCED1 Curve-Price31': 'SCED1CurvePrice31', 'SCED1 Curve-MW32': 'SCED1CurveMW32', 'SCED1 Curve-Price32': 'SCED1CurvePrice32', 'SCED1 Curve-MW33': 'SCED1CurveMW33', 'SCED1 Curve-Price33': 'SCED1CurvePrice33', 'SCED1 Curve-MW34': 'SCED1CurveMW34', 'SCED1 Curve-Price34': 'SCED1CurvePrice34', 'SCED1 Curve-MW35': 'SCED1CurveMW35', 'SCED1 Curve-Price35': 'SCED1CurvePrice35', 'SCED2 Curve-MW1': 'SCED2CurveMW1', 'SCED2 Curve-Price1': 'SCED2CurvePrice1', 'SCED2 Curve-MW2': 'SCED2CurveMW2', 'SCED2 Curve-Price2': 'SCED2CurvePrice2', 'SCED2 Curve-MW3': 'SCED2CurveMW3', 'SCED2 Curve-Price3': 'SCED2CurvePrice3', 'SCED2 Curve-MW4': 'SCED2CurveMW4', 'SCED2 Curve-Price4': 'SCED2CurvePrice4', 'SCED2 Curve-MW5': 'SCED2CurveMW5', 'SCED2 Curve-Price5': 'SCED2CurvePrice5', 'SCED2 Curve-MW6': 'SCED2CurveMW6', 'SCED2 Curve-Price6': 'SCED2CurvePrice6', 'SCED2 Curve-MW7': 'SCED2CurveMW7', 'SCED2 Curve-Price7': 'SCED2CurvePrice7', 'SCED2 Curve-MW8': 'SCED2CurveMW8', 'SCED2 Curve-Price8': 'SCED2CurvePrice8', 'SCED2 Curve-MW9': 'SCED2CurveMW9', 'SCED2 Curve-Price9': 'SCED2CurvePrice9', 'SCED2 Curve-MW10': 'SCED2CurveMW10', 'SCED2 Curve-Price10': 'SCED2CurvePrice10', 'SCED2 Curve-MW11': 'SCED2CurveMW11', 'SCED2 Curve-Price11': 'SCED2CurvePrice11', 'SCED2 Curve-MW12': 'SCED2CurveMW12', 'SCED2 Curve-Price12': 'SCED2CurvePrice12', 'SCED2 Curve-MW13': 'SCED2CurveMW13', 'SCED2 Curve-Price13': 'SCED2CurvePrice13', 'SCED2 Curve-MW14': 'SCED2CurveMW14', 'SCED2 Curve-Price14': 'SCED2CurvePrice14', 'SCED2 Curve-MW15': 'SCED2CurveMW15', 'SCED2 Curve-Price15': 'SCED2CurvePrice15', 'SCED2 Curve-MW16': 'SCED2CurveMW16', 'SCED2 Curve-Price16': 'SCED2CurvePrice16', 'SCED2 Curve-MW17': 'SCED2CurveMW17', 'SCED2 Curve-Price17': 'SCED2CurvePrice17', 'SCED2 Curve-MW18': 'SCED2CurveMW18', 'SCED2 Curve-Price18': 'SCED2CurvePrice18', 'SCED2 Curve-MW19': 'SCED2CurveMW19', 'SCED2 Curve-Price19': 'SCED2CurvePrice19', 'SCED2 Curve-MW20': 'SCED2CurveMW20', 'SCED2 Curve-Price20': 'SCED2CurvePrice20', 'SCED2 Curve-MW21': 'SCED2CurveMW21', 'SCED2 Curve-Price21': 'SCED2CurvePrice21', 'SCED2 Curve-MW22': 'SCED2CurveMW22', 'SCED2 Curve-Price22': 'SCED2CurvePrice22', 'SCED2 Curve-MW23': 'SCED2CurveMW23', 'SCED2 Curve-Price23': 'SCED2CurvePrice23', 'SCED2 Curve-MW24': 'SCED2CurveMW24', 'SCED2 Curve-Price24': 'SCED2CurvePrice24', 'SCED2 Curve-MW25': 'SCED2CurveMW25', 'SCED2 Curve-Price25': 'SCED2CurvePrice25', 'SCED2 Curve-MW26': 'SCED2CurveMW26', 'SCED2 Curve-Price26': 'SCED2CurvePrice26', 'SCED2 Curve-MW27': 'SCED2CurveMW27', 'SCED2 Curve-Price27': 'SCED2CurvePrice27', 'SCED2 Curve-MW28': 'SCED2CurveMW28', 'SCED2 Curve-Price28': 'SCED2CurvePrice28', 'SCED2 Curve-MW29': 'SCED2CurveMW29', 'SCED2 Curve-Price29': 'SCED2CurvePrice29', 'SCED2 Curve-MW30': 'SCED2CurveMW30', 'SCED2 Curve-Price30': 'SCED2CurvePrice30', 'SCED2 Curve-MW31': 'SCED2CurveMW31', 'SCED2 Curve-Price31': 'SCED2CurvePrice31', 'SCED2 Curve-MW32': 'SCED2CurveMW32', 'SCED2 Curve-Price32': 'SCED2CurvePrice32', 'SCED2 Curve-MW33': 'SCED2CurveMW33', 'SCED2 Curve-Price33': 'SCED2CurvePrice33', 'SCED2 Curve-MW34': 'SCED2CurveMW34', 'SCED2 Curve-Price34': 'SCED2CurvePrice34', 'SCED2 Curve-MW35': 'SCED2CurveMW35', 'SCED2 Curve-Price35': 'SCED2CurvePrice35', 'Output Schedule': 'outputSchedule', 'HSL': 'HSL', 'HDL': 'HDL', 'LSL': 'LSL', 'LDL': 'LDL', 'Telemetered Resource Status': 'telemeteredResourceStatus', 'Base Point': 'basePoint', 'Telemetered Net Output': 'telemeteredNetOutput', 'Ramp Rate Up': 'rampRateUp', 'Ramp Rate Down': 'rampRateDown', 'AS Capability REGUP': 'ASCapREGUP', 'AS Capability REGDN': 'ASCapREGDN', 'AS Capability ECRS': 'ASCapECRS', 'AS Capability NSPIN': 'ASCapNSPIN', 'AS Capability RRSPFR': 'ASCapRRSPFR', 'AS Capability RRSFFR': 'ASCapRRSFFR', 'State of Charge': 'SOC', 'Minimum SOC': 'minSOC', 'Maximum SOC': 'maxSOC', 'AS Awards NSPIN': 'ASAwardsNSPIN', 'AS Awards RRSFFR': 'ASAwardsRRSFFR', 'AS Awards RRSPFR': 'ASAwardsRRSPFR', 'AS Awards RRSUFR': 'ASAwardsRRSUFR', 'AS Awards ECRS': 'ASAwardsECRS', 'AS Awards REGUP': 'ASAwardsREGUP', 'AS Awards REGDN': 'ASAwardsREGDN', 'Bid_Type': 'bidType', 'Start Up Cold Offer': 'startUpColdOffer', 'Start Up Hot Offer': 'startUpHotOffer', 'Start Up Inter Offer': 'startUpInterOffer', 'Min Gen Cost': 'minGenCost', 'Submitted TPO-MW1': 'submittedTPOMW1', 'Submitted TPO-Price1': 'submittedTPOPrice1', 'Submitted TPO-MW2': 'submittedTPOMW2', 'Submitted TPO-Price2': 'submittedTPOPrice2', 'Submitted TPO-MW3': 'submittedTPOMW3', 'Submitted TPO-Price3': 'submittedTPOPrice3', 'Submitted TPO-MW4': 'submittedTPOMW4', 'Submitted TPO-Price4': 'submittedTPOPrice4', 'Submitted TPO-MW5': 'submittedTPOMW5', 'Submitted TPO-Price5': 'submittedTPOPrice5', 'Submitted TPO-MW6': 'submittedTPOMW6', 'Submitted TPO-Price6': 'submittedTPOPrice6', 'Submitted TPO-MW7': 'submittedTPOMW7', 'Submitted TPO-Price7': 'submittedTPOPrice7', 'Submitted TPO-MW8': 'submittedTPOMW8', 'Submitted TPO-Price8': 'submittedTPOPrice8', 'Submitted TPO-MW9': 'submittedTPOMW9', 'Submitted TPO-Price9': 'submittedTPOPrice9', 'Submitted TPO-MW10': 'submittedTPOMW10', 'Submitted TPO-Price10': 'submittedTPOPrice10', 'Proxy Extension': 'proxyExtension'}, {}, member='60d_ESR_Data_in_SCED-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ def _60d_sced_esr_data(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60dScedEsrDataRow]:
+ '60-Day ESR Data in SCED'
+ return self._client._page('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _60d_sced_esr_data_iter(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_965_er._60dScedEsrDataRow]:
+ '60-Day ESR Data in SCED'
+ return self._client._iter('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'size': size, 'sort': sort, 'dir': dir})
+
+ async def _60d_sced_esr_data_async(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60dScedEsrDataRow]:
+ '60-Day ESR Data in SCED'
+ return await self._client._apage('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _60d_sced_esr_data_iter_async(self, *, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, SOCFrom: Decimal | None = None, SOCTo: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np3_965_er._60dScedEsrDataRow]:
+ '60-Day ESR Data in SCED'
+ return self._client._aiter('/np3-965-er/60d_sced_esr_data', np3_965_er._60dScedEsrDataRow, {'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'outputScheduleFrom': outputScheduleFrom, 'outputScheduleTo': outputScheduleTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'telemeteredResourceStatus': telemeteredResourceStatus, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'telemeteredNetOutputFrom': telemeteredNetOutputFrom, 'telemeteredNetOutputTo': telemeteredNetOutputTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'bidType': bidType, 'startUpColdOfferFrom': startUpColdOfferFrom, 'startUpColdOfferTo': startUpColdOfferTo, 'startUpHotOfferFrom': startUpHotOfferFrom, 'startUpHotOfferTo': startUpHotOfferTo, 'startUpInterOfferFrom': startUpInterOfferFrom, 'startUpInterOfferTo': startUpInterOfferTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'SOCFrom': SOCFrom, 'SOCTo': SOCTo, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'SCED1CurveMW1From': SCED1CurveMW1From, 'SCED1CurveMW1To': SCED1CurveMW1To, 'SCED1CurvePrice1From': SCED1CurvePrice1From, 'SCED1CurvePrice1To': SCED1CurvePrice1To, 'SCED1CurveMW2From': SCED1CurveMW2From, 'SCED1CurveMW2To': SCED1CurveMW2To, 'SCED1CurvePrice2From': SCED1CurvePrice2From, 'SCED1CurvePrice2To': SCED1CurvePrice2To, 'SCED1CurveMW3From': SCED1CurveMW3From, 'SCED1CurveMW3To': SCED1CurveMW3To, 'SCED1CurvePrice3From': SCED1CurvePrice3From, 'SCED1CurvePrice3To': SCED1CurvePrice3To, 'SCED1CurveMW4From': SCED1CurveMW4From, 'SCED1CurveMW4To': SCED1CurveMW4To, 'SCED1CurvePrice4From': SCED1CurvePrice4From, 'SCED1CurvePrice4To': SCED1CurvePrice4To, 'SCED1CurveMW5From': SCED1CurveMW5From, 'SCED1CurveMW5To': SCED1CurveMW5To, 'SCED1CurvePrice5From': SCED1CurvePrice5From, 'SCED1CurvePrice5To': SCED1CurvePrice5To, 'SCED1CurveMW6From': SCED1CurveMW6From, 'SCED1CurveMW6To': SCED1CurveMW6To, 'SCED1CurvePrice6From': SCED1CurvePrice6From, 'SCED1CurvePrice6To': SCED1CurvePrice6To, 'SCED1CurveMW7From': SCED1CurveMW7From, 'SCED1CurveMW7To': SCED1CurveMW7To, 'SCED1CurvePrice7From': SCED1CurvePrice7From, 'SCED1CurvePrice7To': SCED1CurvePrice7To, 'SCED1CurveMW8From': SCED1CurveMW8From, 'SCED1CurveMW8To': SCED1CurveMW8To, 'SCED1CurvePrice8From': SCED1CurvePrice8From, 'SCED1CurvePrice8To': SCED1CurvePrice8To, 'SCED1CurveMW9From': SCED1CurveMW9From, 'SCED1CurveMW9To': SCED1CurveMW9To, 'SCED1CurvePrice9From': SCED1CurvePrice9From, 'SCED1CurvePrice9To': SCED1CurvePrice9To, 'SCED1CurveMW10From': SCED1CurveMW10From, 'SCED1CurveMW10To': SCED1CurveMW10To, 'SCED1CurvePrice10From': SCED1CurvePrice10From, 'SCED1CurvePrice10To': SCED1CurvePrice10To, 'SCED1CurveMW11From': SCED1CurveMW11From, 'SCED1CurveMW11To': SCED1CurveMW11To, 'SCED1CurvePrice11From': SCED1CurvePrice11From, 'SCED1CurvePrice11To': SCED1CurvePrice11To, 'SCED1CurveMW12From': SCED1CurveMW12From, 'SCED1CurveMW12To': SCED1CurveMW12To, 'SCED1CurvePrice12From': SCED1CurvePrice12From, 'SCED1CurvePrice12To': SCED1CurvePrice12To, 'SCED1CurveMW13From': SCED1CurveMW13From, 'SCED1CurveMW13To': SCED1CurveMW13To, 'SCED1CurvePrice13From': SCED1CurvePrice13From, 'SCED1CurvePrice13To': SCED1CurvePrice13To, 'SCED1CurveMW14From': SCED1CurveMW14From, 'SCED1CurveMW14To': SCED1CurveMW14To, 'SCED1CurvePrice14From': SCED1CurvePrice14From, 'SCED1CurvePrice14To': SCED1CurvePrice14To, 'SCED1CurveMW15From': SCED1CurveMW15From, 'SCED1CurveMW15To': SCED1CurveMW15To, 'SCED1CurvePrice15From': SCED1CurvePrice15From, 'SCED1CurvePrice15To': SCED1CurvePrice15To, 'SCED1CurveMW16From': SCED1CurveMW16From, 'SCED1CurveMW16To': SCED1CurveMW16To, 'SCED1CurvePrice16From': SCED1CurvePrice16From, 'SCED1CurvePrice16To': SCED1CurvePrice16To, 'SCED1CurveMW17From': SCED1CurveMW17From, 'SCED1CurveMW17To': SCED1CurveMW17To, 'SCED1CurvePrice17From': SCED1CurvePrice17From, 'SCED1CurvePrice17To': SCED1CurvePrice17To, 'SCED1CurveMW18From': SCED1CurveMW18From, 'SCED1CurveMW18To': SCED1CurveMW18To, 'SCED1CurvePrice18From': SCED1CurvePrice18From, 'SCED1CurvePrice18To': SCED1CurvePrice18To, 'SCED1CurveMW19From': SCED1CurveMW19From, 'SCED1CurveMW19To': SCED1CurveMW19To, 'SCED1CurvePrice19From': SCED1CurvePrice19From, 'SCED1CurvePrice19To': SCED1CurvePrice19To, 'SCED1CurveMW20From': SCED1CurveMW20From, 'SCED1CurveMW20To': SCED1CurveMW20To, 'SCED1CurvePrice20From': SCED1CurvePrice20From, 'SCED1CurvePrice20To': SCED1CurvePrice20To, 'SCED1CurveMW21From': SCED1CurveMW21From, 'SCED1CurveMW21To': SCED1CurveMW21To, 'SCED1CurvePrice21From': SCED1CurvePrice21From, 'SCED1CurvePrice21To': SCED1CurvePrice21To, 'SCED1CurveMW22From': SCED1CurveMW22From, 'SCED1CurveMW22To': SCED1CurveMW22To, 'SCED1CurvePrice22From': SCED1CurvePrice22From, 'SCED1CurvePrice22To': SCED1CurvePrice22To, 'SCED1CurveMW23From': SCED1CurveMW23From, 'SCED1CurveMW23To': SCED1CurveMW23To, 'SCED1CurvePrice23From': SCED1CurvePrice23From, 'SCED1CurvePrice23To': SCED1CurvePrice23To, 'SCED1CurveMW24From': SCED1CurveMW24From, 'SCED1CurveMW24To': SCED1CurveMW24To, 'SCED1CurvePrice24From': SCED1CurvePrice24From, 'SCED1CurvePrice24To': SCED1CurvePrice24To, 'SCED1CurveMW25From': SCED1CurveMW25From, 'SCED1CurveMW25To': SCED1CurveMW25To, 'SCED1CurvePrice25From': SCED1CurvePrice25From, 'SCED1CurvePrice25To': SCED1CurvePrice25To, 'SCED1CurveMW26From': SCED1CurveMW26From, 'SCED1CurveMW26To': SCED1CurveMW26To, 'SCED1CurvePrice26From': SCED1CurvePrice26From, 'SCED1CurvePrice26To': SCED1CurvePrice26To, 'SCED1CurveMW27From': SCED1CurveMW27From, 'SCED1CurveMW27To': SCED1CurveMW27To, 'SCED1CurvePrice27From': SCED1CurvePrice27From, 'SCED1CurvePrice27To': SCED1CurvePrice27To, 'SCED1CurveMW28From': SCED1CurveMW28From, 'SCED1CurveMW28To': SCED1CurveMW28To, 'SCED1CurvePrice28From': SCED1CurvePrice28From, 'SCED1CurvePrice28To': SCED1CurvePrice28To, 'SCED1CurveMW29From': SCED1CurveMW29From, 'SCED1CurveMW29To': SCED1CurveMW29To, 'SCED1CurvePrice29From': SCED1CurvePrice29From, 'SCED1CurvePrice29To': SCED1CurvePrice29To, 'SCED1CurveMW30From': SCED1CurveMW30From, 'SCED1CurveMW30To': SCED1CurveMW30To, 'SCED1CurvePrice30From': SCED1CurvePrice30From, 'SCED1CurvePrice30To': SCED1CurvePrice30To, 'SCED1CurveMW31From': SCED1CurveMW31From, 'SCED1CurveMW31To': SCED1CurveMW31To, 'SCED1CurvePrice31From': SCED1CurvePrice31From, 'SCED1CurvePrice31To': SCED1CurvePrice31To, 'SCED1CurveMW32From': SCED1CurveMW32From, 'SCED1CurveMW32To': SCED1CurveMW32To, 'SCED1CurvePrice32From': SCED1CurvePrice32From, 'SCED1CurvePrice32To': SCED1CurvePrice32To, 'SCED1CurveMW33From': SCED1CurveMW33From, 'SCED1CurveMW33To': SCED1CurveMW33To, 'SCED1CurvePrice33From': SCED1CurvePrice33From, 'SCED1CurvePrice33To': SCED1CurvePrice33To, 'SCED1CurveMW34From': SCED1CurveMW34From, 'SCED1CurveMW34To': SCED1CurveMW34To, 'SCED1CurvePrice34From': SCED1CurvePrice34From, 'SCED1CurvePrice34To': SCED1CurvePrice34To, 'SCED1CurveMW35From': SCED1CurveMW35From, 'SCED1CurveMW35To': SCED1CurveMW35To, 'SCED1CurvePrice35From': SCED1CurvePrice35From, 'SCED1CurvePrice35To': SCED1CurvePrice35To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'size': size, 'sort': sort, 'dir': dir})
+ class _60HdlLdlManOverrideRow(Row):
+ HDLFinal: Decimal | None
+ HDLManual: Decimal | None
+ HDLOriginal: Decimal | None
+ LDLFinal: Decimal | None
+ LDLManual: Decimal | None
+ LDLOriginal: Decimal | None
+ SCEDTimestamp: datetime | None
+ participantName: str | None
+ reasonCode: str | None
+ repeatHourFlag: bool | None
+ resourceName: str | None
+
+ class _60HdlLdlManOverrideHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ participantName: str | None
+ resourceName: str | None
+ HDLOriginal: Decimal | None
+ HDLManual: Decimal | None
+ HDLFinal: Decimal | None
+ LDLOriginal: Decimal | None
+ LDLManual: Decimal | None
+ LDLFinal: Decimal | None
+ reasonCode: str | None
+
+ @property
+ def _60_hdl_ldl_man_override_history(self) -> Archive[np3_965_er._60HdlLdlManOverrideHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60HdlLdlManOverrideHistoryRow, {'SCED Timestamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Participant Name': 'participantName', 'Resource Name': 'resourceName', 'HDL Original': 'HDLOriginal', 'HDL Manual': 'HDLManual', 'HDL Final': 'HDLFinal', 'LDL Original': 'LDLOriginal', 'LDL Manual': 'LDLManual', 'LDL Final': 'LDLFinal', 'Reason Code': 'reasonCode'}, {}, member='60d_HDL_LDL_ManOverride-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ def _60_hdl_ldl_man_override(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60HdlLdlManOverrideRow]:
+ '60-Day HDL and LDL Manual Override Summary'
+ return self._client._page('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _60_hdl_ldl_man_override_iter(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_965_er._60HdlLdlManOverrideRow]:
+ '60-Day HDL and LDL Manual Override Summary'
+ return self._client._iter('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'size': size, 'sort': sort, 'dir': dir})
+
+ async def _60_hdl_ldl_man_override_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60HdlLdlManOverrideRow]:
+ '60-Day HDL and LDL Manual Override Summary'
+ return await self._client._apage('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _60_hdl_ldl_man_override_iter_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, participantName: str | None = None, resourceName: str | None = None, HDLOriginalFrom: Decimal | None = None, HDLOriginalTo: Decimal | None = None, HDLManualFrom: Decimal | None = None, HDLManualTo: Decimal | None = None, HDLFinalFrom: Decimal | None = None, HDLFinalTo: Decimal | None = None, LDLOriginalFrom: Decimal | None = None, LDLOriginalTo: Decimal | None = None, LDLManualFrom: Decimal | None = None, LDLManualTo: Decimal | None = None, LDLFinalFrom: Decimal | None = None, LDLFinalTo: Decimal | None = None, reasonCode: str | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np3_965_er._60HdlLdlManOverrideRow]:
+ '60-Day HDL and LDL Manual Override Summary'
+ return self._client._aiter('/np3-965-er/60_hdl_ldl_man_override', np3_965_er._60HdlLdlManOverrideRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'participantName': participantName, 'resourceName': resourceName, 'HDLOriginalFrom': HDLOriginalFrom, 'HDLOriginalTo': HDLOriginalTo, 'HDLManualFrom': HDLManualFrom, 'HDLManualTo': HDLManualTo, 'HDLFinalFrom': HDLFinalFrom, 'HDLFinalTo': HDLFinalTo, 'LDLOriginalFrom': LDLOriginalFrom, 'LDLOriginalTo': LDLOriginalTo, 'LDLManualFrom': LDLManualFrom, 'LDLManualTo': LDLManualTo, 'LDLFinalFrom': LDLFinalFrom, 'LDLFinalTo': LDLFinalTo, 'reasonCode': reasonCode, 'size': size, 'sort': sort, 'dir': dir})
+ class _60LoadResDataInScedRow(Row):
+ ASAwardsECRS: Decimal | None
+ ASAwardsNSPIN: Decimal | None
+ ASAwardsREGDN: Decimal | None
+ ASAwardsREGUP: Decimal | None
+ ASAwardsRRSFFR: Decimal | None
+ ASAwardsRRSPFR: Decimal | None
+ ASAwardsRRSUFR: Decimal | None
+ ASCapECRS: Decimal | None
+ ASCapNSPIN: Decimal | None
+ ASCapREGDN: Decimal | None
+ ASCapREGUP: Decimal | None
+ ASCapRRSFFR: Decimal | None
+ ASCapRRSPFR: Decimal | None
+ ASCapRRSUFR: Decimal | None
+ ASRespForECRS: Decimal | None
+ ASRespForNSPIN: Decimal | None
+ ASRespForREGDN: Decimal | None
+ ASRespForREGUP: Decimal | None
+ ASRespForRRS: Decimal | None
+ ASRespForRRSFFR: Decimal | None
+ HASL: Decimal | None
+ HDL: Decimal | None
+ LASL: Decimal | None
+ LDL: Decimal | None
+ SCEDBidCurveMW1: Decimal | None
+ SCEDBidCurveMW10: Decimal | None
+ SCEDBidCurveMW2: Decimal | None
+ SCEDBidCurveMW3: Decimal | None
+ SCEDBidCurveMW4: Decimal | None
+ SCEDBidCurveMW5: Decimal | None
+ SCEDBidCurveMW6: Decimal | None
+ SCEDBidCurveMW7: Decimal | None
+ SCEDBidCurveMW8: Decimal | None
+ SCEDBidCurveMW9: Decimal | None
+ SCEDBidCurvePrice1: Decimal | None
+ SCEDBidCurvePrice10: Decimal | None
+ SCEDBidCurvePrice2: Decimal | None
+ SCEDBidCurvePrice3: Decimal | None
+ SCEDBidCurvePrice4: Decimal | None
+ SCEDBidCurvePrice5: Decimal | None
+ SCEDBidCurvePrice6: Decimal | None
+ SCEDBidCurvePrice7: Decimal | None
+ SCEDBidCurvePrice8: Decimal | None
+ SCEDBidCurvePrice9: Decimal | None
+ SCEDTimestamp: datetime | None
+ basePoint: Decimal | None
+ dmeName: str | None
+ lowPowerConsumption: Decimal | None
+ maxPowerConsumption: Decimal | None
+ qseName: str | None
+ rampRateDown: Decimal | None
+ rampRateUp: Decimal | None
+ realPowerConsumption: Decimal | None
+ repeatHourFlag: bool | None
+ resourceName: str | None
+ selfECRS: Decimal | None
+ selfRRSFFR: Decimal | None
+ selfRRSUFR: Decimal | None
+ telResStatus: str | None
+
+ class _60LoadResDataInScedHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ qseName: str | None = None
+ dmeName: str | None = None
+ resourceName: str | None
+ telResStatus: str | None
+ maxPowerConsumption: Decimal | None
+ lowPowerConsumption: Decimal | None
+ realPowerConsumption: Decimal | None
+ ASAwardsNSPIN: Decimal | None = None
+ ASAwardsRRSFFR: Decimal | None = None
+ ASAwardsRRSPFR: Decimal | None = None
+ ASAwardsRRSUFR: Decimal | None = None
+ ASAwardsECRS: Decimal | None = None
+ ASAwardsREGUP: Decimal | None = None
+ ASAwardsREGDN: Decimal | None = None
+ SCEDBidCurveMW1: Decimal | None = None
+ SCEDBidCurvePrice1: Decimal | None = None
+ SCEDBidCurveMW2: Decimal | None = None
+ SCEDBidCurvePrice2: Decimal | None = None
+ SCEDBidCurveMW3: Decimal | None = None
+ SCEDBidCurvePrice3: Decimal | None = None
+ SCEDBidCurveMW4: Decimal | None = None
+ SCEDBidCurvePrice4: Decimal | None = None
+ SCEDBidCurveMW5: Decimal | None = None
+ SCEDBidCurvePrice5: Decimal | None = None
+ SCEDBidCurveMW6: Decimal | None = None
+ SCEDBidCurvePrice6: Decimal | None = None
+ SCEDBidCurveMW7: Decimal | None = None
+ SCEDBidCurvePrice7: Decimal | None = None
+ SCEDBidCurveMW8: Decimal | None = None
+ SCEDBidCurvePrice8: Decimal | None = None
+ SCEDBidCurveMW9: Decimal | None = None
+ SCEDBidCurvePrice9: Decimal | None = None
+ SCEDBidCurveMW10: Decimal | None = None
+ SCEDBidCurvePrice10: Decimal | None = None
+ selfRRSFFR: Decimal | None = None
+ selfRRSUFR: Decimal | None = None
+ selfECRS: Decimal | None = None
+ rampRateUp: Decimal | None = None
+ rampRateDown: Decimal | None = None
+ ASCapNSPIN: Decimal | None = None
+ ASCapECRS: Decimal | None = None
+ ASCapREGUP: Decimal | None = None
+ ASCapREGDN: Decimal | None = None
+ ASCapRRSPFR: Decimal | None = None
+ ASCapRRSFFR: Decimal | None = None
+ ASCapRRSUFR: Decimal | None = None
+ HDL: Decimal | None = None
+ LDL: Decimal | None = None
+ basePoint: Decimal | None = None
+ ASRespForRRS: Decimal | None = None
+ ASRespForRRSFFR: Decimal | None = None
+ ASRespForNSPIN: Decimal | None = None
+ ASRespForREGUP: Decimal | None = None
+ ASRespForREGDN: Decimal | None = None
+ HASL: Decimal | None = None
+ LASL: Decimal | None = None
+ ASRespForECRS: Decimal | None = None
+ SCEDBidCurveMW11: Decimal | None = None
+ SCEDBidCurvePrice11: Decimal | None = None
+ SCEDBidCurveMW12: Decimal | None = None
+ SCEDBidCurvePrice12: Decimal | None = None
+ SCEDBidCurveMW13: Decimal | None = None
+ SCEDBidCurvePrice13: Decimal | None = None
+ SCEDBidCurveMW14: Decimal | None = None
+ SCEDBidCurvePrice14: Decimal | None = None
+ SCEDBidCurveMW15: Decimal | None = None
+ SCEDBidCurvePrice15: Decimal | None = None
+ SCEDBidCurveMW16: Decimal | None = None
+ SCEDBidCurvePrice16: Decimal | None = None
+ SCEDBidCurveMW17: Decimal | None = None
+ SCEDBidCurvePrice17: Decimal | None = None
+ SCEDBidCurveMW18: Decimal | None = None
+ SCEDBidCurvePrice18: Decimal | None = None
+ SCEDBidCurveMW19: Decimal | None = None
+ SCEDBidCurvePrice19: Decimal | None = None
+ SCEDBidCurveMW20: Decimal | None = None
+ SCEDBidCurvePrice20: Decimal | None = None
+ SCEDBidCurveMW21: Decimal | None = None
+ SCEDBidCurvePrice21: Decimal | None = None
+ SCEDBidCurveMW22: Decimal | None = None
+ SCEDBidCurvePrice22: Decimal | None = None
+ SCEDBidCurveMW23: Decimal | None = None
+ SCEDBidCurvePrice23: Decimal | None = None
+ SCEDBidCurveMW24: Decimal | None = None
+ SCEDBidCurvePrice24: Decimal | None = None
+ SCEDBidCurveMW25: Decimal | None = None
+ SCEDBidCurvePrice25: Decimal | None = None
+ SCEDBidCurveMW26: Decimal | None = None
+ SCEDBidCurvePrice26: Decimal | None = None
+ SCEDBidCurveMW27: Decimal | None = None
+ SCEDBidCurvePrice27: Decimal | None = None
+ SCEDBidCurveMW28: Decimal | None = None
+ SCEDBidCurvePrice28: Decimal | None = None
+ SCEDBidCurveMW29: Decimal | None = None
+ SCEDBidCurvePrice29: Decimal | None = None
+ SCEDBidCurveMW30: Decimal | None = None
+ SCEDBidCurvePrice30: Decimal | None = None
+ SCEDBidCurveMW31: Decimal | None = None
+ SCEDBidCurvePrice31: Decimal | None = None
+ SCEDBidCurveMW32: Decimal | None = None
+ SCEDBidCurvePrice32: Decimal | None = None
+ SCEDBidCurveMW33: Decimal | None = None
+ SCEDBidCurvePrice33: Decimal | None = None
+ SCEDBidCurveMW34: Decimal | None = None
+ SCEDBidCurvePrice34: Decimal | None = None
+ SCEDBidCurveMW35: Decimal | None = None
+ SCEDBidCurvePrice35: Decimal | None = None
+
+ @property
+ def _60_load_res_data_in_sced_history(self) -> Archive[np3_965_er._60LoadResDataInScedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60LoadResDataInScedHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Telemetered Resource Status': 'telResStatus', 'Max Power Consumption': 'maxPowerConsumption', 'Low Power Consumption': 'lowPowerConsumption', 'Real Power Consumption': 'realPowerConsumption', 'AS Awards NSPIN': 'ASAwardsNSPIN', 'AS Awards RRSFFR': 'ASAwardsRRSFFR', 'AS Awards RRSPFR': 'ASAwardsRRSPFR', 'AS Awards RRSUFR': 'ASAwardsRRSUFR', 'AS Awards ECRS': 'ASAwardsECRS', 'AS Awards REGUP': 'ASAwardsREGUP', 'AS Awards REGDN': 'ASAwardsREGDN', 'SCED Bid to Buy Curve-MW1': 'SCEDBidCurveMW1', 'SCED Bid to Buy Curve-Price1': 'SCEDBidCurvePrice1', 'SCED Bid to Buy Curve-MW2': 'SCEDBidCurveMW2', 'SCED Bid to Buy Curve-Price2': 'SCEDBidCurvePrice2', 'SCED Bid to Buy Curve-MW3': 'SCEDBidCurveMW3', 'SCED Bid to Buy Curve-Price3': 'SCEDBidCurvePrice3', 'SCED Bid to Buy Curve-MW4': 'SCEDBidCurveMW4', 'SCED Bid to Buy Curve-Price4': 'SCEDBidCurvePrice4', 'SCED Bid to Buy Curve-MW5': 'SCEDBidCurveMW5', 'SCED Bid to Buy Curve-Price5': 'SCEDBidCurvePrice5', 'SCED Bid to Buy Curve-MW6': 'SCEDBidCurveMW6', 'SCED Bid to Buy Curve-Price6': 'SCEDBidCurvePrice6', 'SCED Bid to Buy Curve-MW7': 'SCEDBidCurveMW7', 'SCED Bid to Buy Curve-Price7': 'SCEDBidCurvePrice7', 'SCED Bid to Buy Curve-MW8': 'SCEDBidCurveMW8', 'SCED Bid to Buy Curve-Price8': 'SCEDBidCurvePrice8', 'SCED Bid to Buy Curve-MW9': 'SCEDBidCurveMW9', 'SCED Bid to Buy Curve-Price9': 'SCEDBidCurvePrice9', 'SCED Bid to Buy Curve-MW10': 'SCEDBidCurveMW10', 'SCED Bid to Buy Curve-Price10': 'SCEDBidCurvePrice10', 'Self Provided RRSFFR': 'selfRRSFFR', 'Self Provided RRSUFR': 'selfRRSUFR', 'Self Provided ECRS': 'selfECRS', 'Ramp Rate Up': 'rampRateUp', 'Ramp Rate Down': 'rampRateDown', 'AS Capability NSPIN': 'ASCapNSPIN', 'AS Capability ECRS': 'ASCapECRS', 'AS Capability REGUP': 'ASCapREGUP', 'AS Capability REGDN': 'ASCapREGDN', 'AS Capability RRSPFR': 'ASCapRRSPFR', 'AS Capability RRSFFR': 'ASCapRRSFFR', 'AS Capability RRSUFR': 'ASCapRRSUFR', 'HDL': 'HDL', 'LDL': 'LDL', 'Base Point': 'basePoint'}, {}, member='60d_Load?Resource_Data_in_SCED-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Resource Name': 'resourceName', 'Telemetered Resource Status': 'telResStatus', 'Max Power Consumption': 'maxPowerConsumption', 'Low Power Consumption': 'lowPowerConsumption', 'Real Power Consumption': 'realPowerConsumption', 'AS Responsibility for RRS': 'ASRespForRRS', 'AS Responsibility for NonSpin': 'ASRespForNSPIN', 'AS Responsibility for RegUp': 'ASRespForREGUP', 'AS Responsibility for RegDown': 'ASRespForREGDN'}, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Resource Name': 'resourceName', 'Telemetered Resource Status': 'telResStatus', 'Max Power Consumption': 'maxPowerConsumption', 'Low Power Consumption': 'lowPowerConsumption', 'Real Power Consumption': 'realPowerConsumption', 'AS Responsibility for RRS': 'ASRespForRRS', 'AS Responsibility for NonSpin': 'ASRespForNSPIN', 'AS Responsibility for RegUp': 'ASRespForREGUP', 'AS Responsibility for RegDown': 'ASRespForREGDN', 'SCED Bid to Buy Curve-MW1': 'SCEDBidCurveMW1', 'SCED Bid to Buy Curve-Price1': 'SCEDBidCurvePrice1', 'SCED Bid to Buy Curve-MW2': 'SCEDBidCurveMW2', 'SCED Bid to Buy Curve-Price2': 'SCEDBidCurvePrice2', 'SCED Bid to Buy Curve-MW3': 'SCEDBidCurveMW3', 'SCED Bid to Buy Curve-Price3': 'SCEDBidCurvePrice3', 'SCED Bid to Buy Curve-MW4': 'SCEDBidCurveMW4', 'SCED Bid to Buy Curve-Price4': 'SCEDBidCurvePrice4', 'SCED Bid to Buy Curve-MW5': 'SCEDBidCurveMW5', 'SCED Bid to Buy Curve-Price5': 'SCEDBidCurvePrice5', 'SCED Bid to Buy Curve-MW6': 'SCEDBidCurveMW6', 'SCED Bid to Buy Curve-Price6': 'SCEDBidCurvePrice6', 'SCED Bid to Buy Curve-MW7': 'SCEDBidCurveMW7', 'SCED Bid to Buy Curve-Price7': 'SCEDBidCurvePrice7', 'SCED Bid to Buy Curve-MW8': 'SCEDBidCurveMW8', 'SCED Bid to Buy Curve-Price8': 'SCEDBidCurvePrice8', 'SCED Bid to Buy Curve-MW9': 'SCEDBidCurveMW9', 'SCED Bid to Buy Curve-Price9': 'SCEDBidCurvePrice9', 'SCED Bid to Buy Curve-MW10': 'SCEDBidCurveMW10', 'SCED Bid to Buy Curve-Price10': 'SCEDBidCurvePrice10', 'SCED Bid to Buy Curve-MW11': 'SCEDBidCurveMW11', 'SCED Bid to Buy Curve-Price11': 'SCEDBidCurvePrice11', 'SCED Bid to Buy Curve-MW12': 'SCEDBidCurveMW12', 'SCED Bid to Buy Curve-Price12': 'SCEDBidCurvePrice12', 'SCED Bid to Buy Curve-MW13': 'SCEDBidCurveMW13', 'SCED Bid to Buy Curve-Price13': 'SCEDBidCurvePrice13', 'SCED Bid to Buy Curve-MW14': 'SCEDBidCurveMW14', 'SCED Bid to Buy Curve-Price14': 'SCEDBidCurvePrice14', 'SCED Bid to Buy Curve-MW15': 'SCEDBidCurveMW15', 'SCED Bid to Buy Curve-Price15': 'SCEDBidCurvePrice15', 'SCED Bid to Buy Curve-MW16': 'SCEDBidCurveMW16', 'SCED Bid to Buy Curve-Price16': 'SCEDBidCurvePrice16', 'SCED Bid to Buy Curve-MW17': 'SCEDBidCurveMW17', 'SCED Bid to Buy Curve-Price17': 'SCEDBidCurvePrice17', 'SCED Bid to Buy Curve-MW18': 'SCEDBidCurveMW18', 'SCED Bid to Buy Curve-Price18': 'SCEDBidCurvePrice18', 'SCED Bid to Buy Curve-MW19': 'SCEDBidCurveMW19', 'SCED Bid to Buy Curve-Price19': 'SCEDBidCurvePrice19', 'SCED Bid to Buy Curve-MW20': 'SCEDBidCurveMW20', 'SCED Bid to Buy Curve-Price20': 'SCEDBidCurvePrice20', 'SCED Bid to Buy Curve-MW21': 'SCEDBidCurveMW21', 'SCED Bid to Buy Curve-Price21': 'SCEDBidCurvePrice21', 'SCED Bid to Buy Curve-MW22': 'SCEDBidCurveMW22', 'SCED Bid to Buy Curve-Price22': 'SCEDBidCurvePrice22', 'SCED Bid to Buy Curve-MW23': 'SCEDBidCurveMW23', 'SCED Bid to Buy Curve-Price23': 'SCEDBidCurvePrice23', 'SCED Bid to Buy Curve-MW24': 'SCEDBidCurveMW24', 'SCED Bid to Buy Curve-Price24': 'SCEDBidCurvePrice24', 'SCED Bid to Buy Curve-MW25': 'SCEDBidCurveMW25', 'SCED Bid to Buy Curve-Price25': 'SCEDBidCurvePrice25', 'SCED Bid to Buy Curve-MW26': 'SCEDBidCurveMW26', 'SCED Bid to Buy Curve-Price26': 'SCEDBidCurvePrice26', 'SCED Bid to Buy Curve-MW27': 'SCEDBidCurveMW27', 'SCED Bid to Buy Curve-Price27': 'SCEDBidCurvePrice27', 'SCED Bid to Buy Curve-MW28': 'SCEDBidCurveMW28', 'SCED Bid to Buy Curve-Price28': 'SCEDBidCurvePrice28', 'SCED Bid to Buy Curve-MW29': 'SCEDBidCurveMW29', 'SCED Bid to Buy Curve-Price29': 'SCEDBidCurvePrice29', 'SCED Bid to Buy Curve-MW30': 'SCEDBidCurveMW30', 'SCED Bid to Buy Curve-Price30': 'SCEDBidCurvePrice30', 'SCED Bid to Buy Curve-MW31': 'SCEDBidCurveMW31', 'SCED Bid to Buy Curve-Price31': 'SCEDBidCurvePrice31', 'SCED Bid to Buy Curve-MW32': 'SCEDBidCurveMW32', 'SCED Bid to Buy Curve-Price32': 'SCEDBidCurvePrice32', 'SCED Bid to Buy Curve-MW33': 'SCEDBidCurveMW33', 'SCED Bid to Buy Curve-Price33': 'SCEDBidCurvePrice33', 'SCED Bid to Buy Curve-MW34': 'SCEDBidCurveMW34', 'SCED Bid to Buy Curve-Price34': 'SCEDBidCurvePrice34', 'SCED Bid to Buy Curve-MW35': 'SCEDBidCurveMW35', 'SCED Bid to Buy Curve-Price35': 'SCEDBidCurvePrice35', 'HASL': 'HASL', 'HDL': 'HDL', 'LASL': 'LASL', 'LDL': 'LDL', 'Base Point': 'basePoint'}, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Telemetered Resource Status': 'telResStatus', 'Max Power Consumption': 'maxPowerConsumption', 'Low Power Consumption': 'lowPowerConsumption', 'Real Power Consumption': 'realPowerConsumption', 'AS Responsibility for RRS': 'ASRespForRRS', 'AS Responsibility for RRSFFR': 'ASRespForRRSFFR', 'AS Responsibility for NonSpin': 'ASRespForNSPIN', 'AS Responsibility for RegUp': 'ASRespForREGUP', 'AS Responsibility for RegDown': 'ASRespForREGDN', 'AS Responsibility for ECRS': 'ASRespForECRS', 'SCED Bid to Buy Curve-MW1': 'SCEDBidCurveMW1', 'SCED Bid to Buy Curve-Price1': 'SCEDBidCurvePrice1', 'SCED Bid to Buy Curve-MW2': 'SCEDBidCurveMW2', 'SCED Bid to Buy Curve-Price2': 'SCEDBidCurvePrice2', 'SCED Bid to Buy Curve-MW3': 'SCEDBidCurveMW3', 'SCED Bid to Buy Curve-Price3': 'SCEDBidCurvePrice3', 'SCED Bid to Buy Curve-MW4': 'SCEDBidCurveMW4', 'SCED Bid to Buy Curve-Price4': 'SCEDBidCurvePrice4', 'SCED Bid to Buy Curve-MW5': 'SCEDBidCurveMW5', 'SCED Bid to Buy Curve-Price5': 'SCEDBidCurvePrice5', 'SCED Bid to Buy Curve-MW6': 'SCEDBidCurveMW6', 'SCED Bid to Buy Curve-Price6': 'SCEDBidCurvePrice6', 'SCED Bid to Buy Curve-MW7': 'SCEDBidCurveMW7', 'SCED Bid to Buy Curve-Price7': 'SCEDBidCurvePrice7', 'SCED Bid to Buy Curve-MW8': 'SCEDBidCurveMW8', 'SCED Bid to Buy Curve-Price8': 'SCEDBidCurvePrice8', 'SCED Bid to Buy Curve-MW9': 'SCEDBidCurveMW9', 'SCED Bid to Buy Curve-Price9': 'SCEDBidCurvePrice9', 'SCED Bid to Buy Curve-MW10': 'SCEDBidCurveMW10', 'SCED Bid to Buy Curve-Price10': 'SCEDBidCurvePrice10', 'HASL': 'HASL', 'HDL': 'HDL', 'LASL': 'LASL', 'LDL': 'LDL', 'Base Point': 'basePoint'}))
+
+ def _60_load_res_data_in_sced(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60LoadResDataInScedRow]:
+ '60-Day Load Resource Data in SCED'
+ return self._client._page('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _60_load_res_data_in_sced_iter(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[np3_965_er._60LoadResDataInScedRow]:
+ '60-Day Load Resource Data in SCED'
+ return self._client._iter('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'size': size, 'sort': sort, 'dir': dir})
+
+ async def _60_load_res_data_in_sced_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60LoadResDataInScedRow]:
+ '60-Day Load Resource Data in SCED'
+ return await self._client._apage('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _60_load_res_data_in_sced_iter_async(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, telResStatus: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, realPowerConsumptionFrom: Decimal | None = None, realPowerConsumptionTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, SCEDBidCurveMW1From: Decimal | None = None, SCEDBidCurveMW1To: Decimal | None = None, SCEDBidCurvePrice1From: Decimal | None = None, SCEDBidCurvePrice1To: Decimal | None = None, SCEDBidCurveMW2From: Decimal | None = None, SCEDBidCurveMW2To: Decimal | None = None, SCEDBidCurvePrice2From: Decimal | None = None, SCEDBidCurvePrice2To: Decimal | None = None, SCEDBidCurveMW3From: Decimal | None = None, SCEDBidCurveMW3To: Decimal | None = None, SCEDBidCurvePrice3From: Decimal | None = None, SCEDBidCurvePrice3To: Decimal | None = None, SCEDBidCurveMW4From: Decimal | None = None, SCEDBidCurveMW4To: Decimal | None = None, SCEDBidCurvePrice4From: Decimal | None = None, SCEDBidCurvePrice4To: Decimal | None = None, SCEDBidCurveMW5From: Decimal | None = None, SCEDBidCurveMW5To: Decimal | None = None, SCEDBidCurvePrice5From: Decimal | None = None, SCEDBidCurvePrice5To: Decimal | None = None, SCEDBidCurveMW6From: Decimal | None = None, SCEDBidCurveMW6To: Decimal | None = None, SCEDBidCurvePrice6From: Decimal | None = None, SCEDBidCurvePrice6To: Decimal | None = None, SCEDBidCurveMW7From: Decimal | None = None, SCEDBidCurveMW7To: Decimal | None = None, SCEDBidCurvePrice7From: Decimal | None = None, SCEDBidCurvePrice7To: Decimal | None = None, SCEDBidCurveMW8From: Decimal | None = None, SCEDBidCurveMW8To: Decimal | None = None, SCEDBidCurvePrice8From: Decimal | None = None, SCEDBidCurvePrice8To: Decimal | None = None, SCEDBidCurveMW9From: Decimal | None = None, SCEDBidCurveMW9To: Decimal | None = None, SCEDBidCurvePrice9From: Decimal | None = None, SCEDBidCurvePrice9To: Decimal | None = None, SCEDBidCurveMW10From: Decimal | None = None, SCEDBidCurveMW10To: Decimal | None = None, SCEDBidCurvePrice10From: Decimal | None = None, SCEDBidCurvePrice10To: Decimal | None = None, selfRRSFFRFrom: Decimal | None = None, selfRRSFFRTo: Decimal | None = None, selfRRSUFRFrom: Decimal | None = None, selfRRSUFRTo: Decimal | None = None, selfECRSFrom: Decimal | None = None, selfECRSTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, ASCapRRSUFRFrom: Decimal | None = None, ASCapRRSUFRTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np3_965_er._60LoadResDataInScedRow]:
+ '60-Day Load Resource Data in SCED'
+ return self._client._aiter('/np3-965-er/60_load_res_data_in_sced', np3_965_er._60LoadResDataInScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'telResStatus': telResStatus, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'realPowerConsumptionFrom': realPowerConsumptionFrom, 'realPowerConsumptionTo': realPowerConsumptionTo, 'ASAwardsNSPINFrom': ASAwardsNSPINFrom, 'ASAwardsNSPINTo': ASAwardsNSPINTo, 'ASAwardsRRSFFRFrom': ASAwardsRRSFFRFrom, 'ASAwardsRRSFFRTo': ASAwardsRRSFFRTo, 'ASAwardsRRSPFRFrom': ASAwardsRRSPFRFrom, 'ASAwardsRRSPFRTo': ASAwardsRRSPFRTo, 'ASAwardsRRSUFRFrom': ASAwardsRRSUFRFrom, 'ASAwardsRRSUFRTo': ASAwardsRRSUFRTo, 'ASAwardsECRSFrom': ASAwardsECRSFrom, 'ASAwardsECRSTo': ASAwardsECRSTo, 'ASAwardsREGUPFrom': ASAwardsREGUPFrom, 'ASAwardsREGUPTo': ASAwardsREGUPTo, 'ASAwardsREGDNFrom': ASAwardsREGDNFrom, 'ASAwardsREGDNTo': ASAwardsREGDNTo, 'SCEDBidCurveMW1From': SCEDBidCurveMW1From, 'SCEDBidCurveMW1To': SCEDBidCurveMW1To, 'SCEDBidCurvePrice1From': SCEDBidCurvePrice1From, 'SCEDBidCurvePrice1To': SCEDBidCurvePrice1To, 'SCEDBidCurveMW2From': SCEDBidCurveMW2From, 'SCEDBidCurveMW2To': SCEDBidCurveMW2To, 'SCEDBidCurvePrice2From': SCEDBidCurvePrice2From, 'SCEDBidCurvePrice2To': SCEDBidCurvePrice2To, 'SCEDBidCurveMW3From': SCEDBidCurveMW3From, 'SCEDBidCurveMW3To': SCEDBidCurveMW3To, 'SCEDBidCurvePrice3From': SCEDBidCurvePrice3From, 'SCEDBidCurvePrice3To': SCEDBidCurvePrice3To, 'SCEDBidCurveMW4From': SCEDBidCurveMW4From, 'SCEDBidCurveMW4To': SCEDBidCurveMW4To, 'SCEDBidCurvePrice4From': SCEDBidCurvePrice4From, 'SCEDBidCurvePrice4To': SCEDBidCurvePrice4To, 'SCEDBidCurveMW5From': SCEDBidCurveMW5From, 'SCEDBidCurveMW5To': SCEDBidCurveMW5To, 'SCEDBidCurvePrice5From': SCEDBidCurvePrice5From, 'SCEDBidCurvePrice5To': SCEDBidCurvePrice5To, 'SCEDBidCurveMW6From': SCEDBidCurveMW6From, 'SCEDBidCurveMW6To': SCEDBidCurveMW6To, 'SCEDBidCurvePrice6From': SCEDBidCurvePrice6From, 'SCEDBidCurvePrice6To': SCEDBidCurvePrice6To, 'SCEDBidCurveMW7From': SCEDBidCurveMW7From, 'SCEDBidCurveMW7To': SCEDBidCurveMW7To, 'SCEDBidCurvePrice7From': SCEDBidCurvePrice7From, 'SCEDBidCurvePrice7To': SCEDBidCurvePrice7To, 'SCEDBidCurveMW8From': SCEDBidCurveMW8From, 'SCEDBidCurveMW8To': SCEDBidCurveMW8To, 'SCEDBidCurvePrice8From': SCEDBidCurvePrice8From, 'SCEDBidCurvePrice8To': SCEDBidCurvePrice8To, 'SCEDBidCurveMW9From': SCEDBidCurveMW9From, 'SCEDBidCurveMW9To': SCEDBidCurveMW9To, 'SCEDBidCurvePrice9From': SCEDBidCurvePrice9From, 'SCEDBidCurvePrice9To': SCEDBidCurvePrice9To, 'SCEDBidCurveMW10From': SCEDBidCurveMW10From, 'SCEDBidCurveMW10To': SCEDBidCurveMW10To, 'SCEDBidCurvePrice10From': SCEDBidCurvePrice10From, 'SCEDBidCurvePrice10To': SCEDBidCurvePrice10To, 'selfRRSFFRFrom': selfRRSFFRFrom, 'selfRRSFFRTo': selfRRSFFRTo, 'selfRRSUFRFrom': selfRRSUFRFrom, 'selfRRSUFRTo': selfRRSUFRTo, 'selfECRSFrom': selfECRSFrom, 'selfECRSTo': selfECRSTo, 'rampRateUpFrom': rampRateUpFrom, 'rampRateUpTo': rampRateUpTo, 'rampRateDownFrom': rampRateDownFrom, 'rampRateDownTo': rampRateDownTo, 'ASCapNSPINFrom': ASCapNSPINFrom, 'ASCapNSPINTo': ASCapNSPINTo, 'ASCapECRSFrom': ASCapECRSFrom, 'ASCapECRSTo': ASCapECRSTo, 'ASCapREGUPFrom': ASCapREGUPFrom, 'ASCapREGUPTo': ASCapREGUPTo, 'ASCapREGDNFrom': ASCapREGDNFrom, 'ASCapREGDNTo': ASCapREGDNTo, 'HDLFrom': HDLFrom, 'HDLTo': HDLTo, 'LDLFrom': LDLFrom, 'LDLTo': LDLTo, 'basePointFrom': basePointFrom, 'basePointTo': basePointTo, 'ASCapRRSPFRFrom': ASCapRRSPFRFrom, 'ASCapRRSPFRTo': ASCapRRSPFRTo, 'ASCapRRSFFRFrom': ASCapRRSFFRFrom, 'ASCapRRSFFRTo': ASCapRRSFFRTo, 'ASCapRRSUFRFrom': ASCapRRSUFRFrom, 'ASCapRRSUFRTo': ASCapRRSUFRTo, 'size': size, 'sort': sort, 'dir': dir})
+ class _60ScedQseSelfArrangedAsRow(Row):
ECRSM: Decimal | None
ECRSS: Decimal | None
NSPIN: Decimal | None
@@ -3493,6 +5648,28 @@ class _60ScedQseSelfArrangedAsRow(Row):
qseName: str | None
repeatHourFlag: bool | None
+ class _60ScedQseSelfArrangedAsHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ qseName: str | None
+ REGUP: Decimal | None
+ REGDN: Decimal | None
+ NSPIN: Decimal | None
+ NSPNM: Decimal | None = None
+ RRSPFR: Decimal | None = None
+ RRSFFR: Decimal | None = None
+ RRSUFR: Decimal | None = None
+ ECRSS: Decimal | None = None
+ ECRSM: Decimal | None = None
+ RRSGN: Decimal | None = None
+ RRSLD: Decimal | None = None
+ RRSNC: Decimal | None = None
+
+ @property
+ def _60_sced_qse_self_arranged_as_history(self) -> Archive[np3_965_er._60ScedQseSelfArrangedAsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60ScedQseSelfArrangedAsHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'REGUP': 'REGUP', 'REGDN': 'REGDN', 'NSPIN': 'NSPIN', 'NSPNM': 'NSPNM', 'RRSPFR': 'RRSPFR', 'RRSFFR': 'RRSFFR', 'RRSUFR': 'RRSUFR', 'ECRSS': 'ECRSS', 'ECRSM': 'ECRSM'}, {}, member='60d_SCED_QSE_Self_Arranged_AS-[0-9]*.csv', datetimes={'SCEDTimestamp': ['%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H :%M :%S']}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'REGUP': 'REGUP', 'REGDN': 'REGDN', 'NSPIN': 'NSPIN', 'RRSGN': 'RRSGN', 'RRSLD': 'RRSLD', 'RRSNC': 'RRSNC'}, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'REGUP': 'REGUP', 'REGDN': 'REGDN', 'NSPIN': 'NSPIN', 'NSPNM': 'NSPNM', 'RRSPFR': 'RRSPFR', 'RRSFFR': 'RRSFFR', 'RRSUFR': 'RRSUFR', 'ECRSS': 'ECRSS', 'ECRSM ': 'ECRSM'}))
+
def _60_sced_qse_self_arranged_as(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, REGUPFrom: Decimal | None = None, REGUPTo: Decimal | None = None, REGDNFrom: Decimal | None = None, REGDNTo: Decimal | None = None, NSPINFrom: Decimal | None = None, NSPINTo: Decimal | None = None, NSPNMFrom: Decimal | None = None, NSPNMTo: Decimal | None = None, RRSPFRFrom: Decimal | None = None, RRSPFRTo: Decimal | None = None, RRSFFRFrom: Decimal | None = None, RRSFFRTo: Decimal | None = None, RRSUFRFrom: Decimal | None = None, RRSUFRTo: Decimal | None = None, ECRSSFrom: Decimal | None = None, ECRSSTo: Decimal | None = None, ECRSMFrom: Decimal | None = None, ECRSMTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60ScedQseSelfArrangedAsRow]:
'60-Day QSE-specific Self-Arranged AS in SCED'
return self._client._page('/np3-965-er/60_sced_qse_self_arranged_as', np3_965_er._60ScedQseSelfArrangedAsRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'qseName': qseName, 'REGUPFrom': REGUPFrom, 'REGUPTo': REGUPTo, 'REGDNFrom': REGDNFrom, 'REGDNTo': REGDNTo, 'NSPINFrom': NSPINFrom, 'NSPINTo': NSPINTo, 'NSPNMFrom': NSPNMFrom, 'NSPNMTo': NSPNMTo, 'RRSPFRFrom': RRSPFRFrom, 'RRSPFRTo': RRSPFRTo, 'RRSFFRFrom': RRSFFRFrom, 'RRSFFRTo': RRSFFRTo, 'RRSUFRFrom': RRSUFRFrom, 'RRSUFRTo': RRSUFRTo, 'ECRSSFrom': ECRSSFrom, 'ECRSSTo': ECRSSTo, 'ECRSMFrom': ECRSMFrom, 'ECRSMTo': ECRSMTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3515,6 +5692,18 @@ class _60dScedAsOfferUpdatesRow(Row):
opPeriodUpd: Decimal | None
resourceName: str | None
+ class _60dScedAsOfferUpdatesHistoryRow(Row):
+ deliveryDate: date | None
+ deliveryHour: int | None
+ resourceName: str | None
+ ASType: str | None
+ opPeriodUpd: Decimal | None
+
+ @property
+ def _60d_sced_as_offer_updates_history(self) -> Archive[np3_965_er._60dScedAsOfferUpdatesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60dScedAsOfferUpdatesHistoryRow, {'Delivery Date': 'deliveryDate', 'Delivery Hour': 'deliveryHour', 'Resource Name': 'resourceName', 'AS Type': 'ASType', 'Count of Updates During Operating Period': 'opPeriodUpd'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_SCED_AS_Offer_Updates_in_OpPeriod-[0-9]*.csv', datetimes={}, variants=())
+
def _60d_sced_as_offer_updates(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, resourceName: str | None = None, ASType: str | None = None, opPeriodUpdFrom: Decimal | None = None, opPeriodUpdTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60dScedAsOfferUpdatesRow]:
'60-Day SCED AS Offer Updates in Operating Period'
return self._client._page('/np3-965-er/60d_sced_as_offer_updates', np3_965_er._60dScedAsOfferUpdatesRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'resourceName': resourceName, 'ASType': ASType, 'opPeriodUpdFrom': opPeriodUpdFrom, 'opPeriodUpdTo': opPeriodUpdTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3536,6 +5725,17 @@ class _60ScedDsrLoadDataRow(Row):
repeatHourFlag: bool | None
totalTelemeteredDSRLoads: Decimal | None
+ class _60ScedDsrLoadDataHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ qseName: str | None
+ totalTelemeteredDSRLoads: Decimal | None
+
+ @property
+ def _60_sced_dsr_load_data_history(self) -> Archive[np3_965_er._60ScedDsrLoadDataHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60ScedDsrLoadDataHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE Name': 'qseName', 'Total Telemetered DSR Loads': 'totalTelemeteredDSRLoads'}, {}, member='60d_SCED_DSR_Load_Data-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _60_sced_dsr_load_data(self, *, qseName: str | None = None, totalTelemeteredDSRLoadsFrom: Decimal | None = None, totalTelemeteredDSRLoadsTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60ScedDsrLoadDataRow]:
'60-Day SCED DSR Load Data'
return self._client._page('/np3-965-er/60_sced_dsr_load_data', np3_965_er._60ScedDsrLoadDataRow, {'qseName': qseName, 'totalTelemeteredDSRLoadsFrom': totalTelemeteredDSRLoadsFrom, 'totalTelemeteredDSRLoadsTo': totalTelemeteredDSRLoadsTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3558,6 +5758,18 @@ class _60ScedEocUpdatesInOphourRow(Row):
reason: str | None
resourceName: str | None
+ class _60ScedEocUpdatesInOphourHistoryRow(Row):
+ deliveryDate: date | None
+ deliveryHour: int | None
+ resourceName: str | None
+ reason: str | None
+ opHourUpdates: Decimal | None
+
+ @property
+ def _60_sced_eoc_updates_in_ophour_history(self) -> Archive[np3_965_er._60ScedEocUpdatesInOphourHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60ScedEocUpdatesInOphourHistoryRow, {'Delivery Date': 'deliveryDate', 'Delivery Hour': 'deliveryHour', 'Resource Name': 'resourceName', 'Reason': 'reason', 'Count of Updates During Operating Hour': 'opHourUpdates'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_SCED_EOC_Updates_in_OpHour-[0-9]*.csv', datetimes={}, variants=())
+
def _60_sced_eoc_updates_in_ophour(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, resourceName: str | None = None, opHourUpdatesFrom: Decimal | None = None, opHourUpdatesTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60ScedEocUpdatesInOphourRow]:
'60-Day SCED Energy Offer Curve Updates in Operating Hour'
return self._client._page('/np3-965-er/60_sced_eoc_updates_in_ophour', np3_965_er._60ScedEocUpdatesInOphourRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'resourceName': resourceName, 'opHourUpdatesFrom': opHourUpdatesFrom, 'opHourUpdatesTo': opHourUpdatesTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3611,172 +5823,382 @@ class _60ScedGenResDataRow(Row):
SCED1CurveMW18: Decimal | None
SCED1CurveMW19: Decimal | None
SCED1CurveMW2: Decimal | None
- SCED1CurveMW20: Decimal | None
- SCED1CurveMW21: Decimal | None
- SCED1CurveMW22: Decimal | None
- SCED1CurveMW23: Decimal | None
- SCED1CurveMW24: Decimal | None
- SCED1CurveMW25: Decimal | None
- SCED1CurveMW26: Decimal | None
- SCED1CurveMW27: Decimal | None
- SCED1CurveMW28: Decimal | None
- SCED1CurveMW29: Decimal | None
+ SCED1CurveMW20: Decimal | None
+ SCED1CurveMW21: Decimal | None
+ SCED1CurveMW22: Decimal | None
+ SCED1CurveMW23: Decimal | None
+ SCED1CurveMW24: Decimal | None
+ SCED1CurveMW25: Decimal | None
+ SCED1CurveMW26: Decimal | None
+ SCED1CurveMW27: Decimal | None
+ SCED1CurveMW28: Decimal | None
+ SCED1CurveMW29: Decimal | None
+ SCED1CurveMW3: Decimal | None
+ SCED1CurveMW30: Decimal | None
+ SCED1CurveMW31: Decimal | None
+ SCED1CurveMW32: Decimal | None
+ SCED1CurveMW33: Decimal | None
+ SCED1CurveMW34: Decimal | None
+ SCED1CurveMW35: Decimal | None
+ SCED1CurveMW4: Decimal | None
+ SCED1CurveMW5: Decimal | None
+ SCED1CurveMW6: Decimal | None
+ SCED1CurveMW7: Decimal | None
+ SCED1CurveMW8: Decimal | None
+ SCED1CurveMW9: Decimal | None
+ SCED1CurvePrice1: Decimal | None
+ SCED1CurvePrice10: Decimal | None
+ SCED1CurvePrice11: Decimal | None
+ SCED1CurvePrice12: Decimal | None
+ SCED1CurvePrice13: Decimal | None
+ SCED1CurvePrice14: Decimal | None
+ SCED1CurvePrice15: Decimal | None
+ SCED1CurvePrice16: Decimal | None
+ SCED1CurvePrice17: Decimal | None
+ SCED1CurvePrice18: Decimal | None
+ SCED1CurvePrice19: Decimal | None
+ SCED1CurvePrice2: Decimal | None
+ SCED1CurvePrice20: Decimal | None
+ SCED1CurvePrice21: Decimal | None
+ SCED1CurvePrice22: Decimal | None
+ SCED1CurvePrice23: Decimal | None
+ SCED1CurvePrice24: Decimal | None
+ SCED1CurvePrice25: Decimal | None
+ SCED1CurvePrice26: Decimal | None
+ SCED1CurvePrice27: Decimal | None
+ SCED1CurvePrice28: Decimal | None
+ SCED1CurvePrice29: Decimal | None
+ SCED1CurvePrice3: Decimal | None
+ SCED1CurvePrice30: Decimal | None
+ SCED1CurvePrice31: Decimal | None
+ SCED1CurvePrice32: Decimal | None
+ SCED1CurvePrice33: Decimal | None
+ SCED1CurvePrice34: Decimal | None
+ SCED1CurvePrice35: Decimal | None
+ SCED1CurvePrice4: Decimal | None
+ SCED1CurvePrice5: Decimal | None
+ SCED1CurvePrice6: Decimal | None
+ SCED1CurvePrice7: Decimal | None
+ SCED1CurvePrice8: Decimal | None
+ SCED1CurvePrice9: Decimal | None
+ SCED2CurveMW1: Decimal | None
+ SCED2CurveMW10: Decimal | None
+ SCED2CurveMW11: Decimal | None
+ SCED2CurveMW12: Decimal | None
+ SCED2CurveMW13: Decimal | None
+ SCED2CurveMW14: Decimal | None
+ SCED2CurveMW15: Decimal | None
+ SCED2CurveMW16: Decimal | None
+ SCED2CurveMW17: Decimal | None
+ SCED2CurveMW18: Decimal | None
+ SCED2CurveMW19: Decimal | None
+ SCED2CurveMW2: Decimal | None
+ SCED2CurveMW20: Decimal | None
+ SCED2CurveMW21: Decimal | None
+ SCED2CurveMW22: Decimal | None
+ SCED2CurveMW23: Decimal | None
+ SCED2CurveMW24: Decimal | None
+ SCED2CurveMW25: Decimal | None
+ SCED2CurveMW26: Decimal | None
+ SCED2CurveMW27: Decimal | None
+ SCED2CurveMW28: Decimal | None
+ SCED2CurveMW29: Decimal | None
+ SCED2CurveMW3: Decimal | None
+ SCED2CurveMW30: Decimal | None
+ SCED2CurveMW31: Decimal | None
+ SCED2CurveMW32: Decimal | None
+ SCED2CurveMW33: Decimal | None
+ SCED2CurveMW34: Decimal | None
+ SCED2CurveMW35: Decimal | None
+ SCED2CurveMW4: Decimal | None
+ SCED2CurveMW5: Decimal | None
+ SCED2CurveMW6: Decimal | None
+ SCED2CurveMW7: Decimal | None
+ SCED2CurveMW8: Decimal | None
+ SCED2CurveMW9: Decimal | None
+ SCED2CurvePrice1: Decimal | None
+ SCED2CurvePrice10: Decimal | None
+ SCED2CurvePrice11: Decimal | None
+ SCED2CurvePrice12: Decimal | None
+ SCED2CurvePrice13: Decimal | None
+ SCED2CurvePrice14: Decimal | None
+ SCED2CurvePrice15: Decimal | None
+ SCED2CurvePrice16: Decimal | None
+ SCED2CurvePrice17: Decimal | None
+ SCED2CurvePrice18: Decimal | None
+ SCED2CurvePrice19: Decimal | None
+ SCED2CurvePrice2: Decimal | None
+ SCED2CurvePrice20: Decimal | None
+ SCED2CurvePrice21: Decimal | None
+ SCED2CurvePrice22: Decimal | None
+ SCED2CurvePrice23: Decimal | None
+ SCED2CurvePrice24: Decimal | None
+ SCED2CurvePrice25: Decimal | None
+ SCED2CurvePrice26: Decimal | None
+ SCED2CurvePrice27: Decimal | None
+ SCED2CurvePrice28: Decimal | None
+ SCED2CurvePrice29: Decimal | None
+ SCED2CurvePrice3: Decimal | None
+ SCED2CurvePrice30: Decimal | None
+ SCED2CurvePrice31: Decimal | None
+ SCED2CurvePrice32: Decimal | None
+ SCED2CurvePrice33: Decimal | None
+ SCED2CurvePrice34: Decimal | None
+ SCED2CurvePrice35: Decimal | None
+ SCED2CurvePrice4: Decimal | None
+ SCED2CurvePrice5: Decimal | None
+ SCED2CurvePrice6: Decimal | None
+ SCED2CurvePrice7: Decimal | None
+ SCED2CurvePrice8: Decimal | None
+ SCED2CurvePrice9: Decimal | None
+ SCEDTimestamp: datetime | None
+ basePoint: Decimal | None
+ bidType: str | None
+ dmeName: str | None
+ minGenCost: Decimal | None
+ outputSchedule: Decimal | None
+ proxyExtension: str | None
+ qseName: str | None
+ rampRateDown: Decimal | None
+ rampRateUp: Decimal | None
+ repeatHourFlag: bool | None
+ resourceName: str | None
+ resourceType: str | None
+ startUpColdOffer: Decimal | None
+ startUpHotOffer: Decimal | None
+ startUpInterOffer: Decimal | None
+ submittedTPOMW1: Decimal | None
+ submittedTPOMW10: Decimal | None
+ submittedTPOMW2: Decimal | None
+ submittedTPOMW3: Decimal | None
+ submittedTPOMW4: Decimal | None
+ submittedTPOMW5: Decimal | None
+ submittedTPOMW6: Decimal | None
+ submittedTPOMW7: Decimal | None
+ submittedTPOMW8: Decimal | None
+ submittedTPOMW9: Decimal | None
+ submittedTPOPrice1: Decimal | None
+ submittedTPOPrice10: Decimal | None
+ submittedTPOPrice2: Decimal | None
+ submittedTPOPrice3: Decimal | None
+ submittedTPOPrice4: Decimal | None
+ submittedTPOPrice5: Decimal | None
+ submittedTPOPrice6: Decimal | None
+ submittedTPOPrice7: Decimal | None
+ submittedTPOPrice8: Decimal | None
+ submittedTPOPrice9: Decimal | None
+ telemeteredNetOutput: Decimal | None
+ telemeteredResourceStatus: str | None
+
+ class _60ScedGenResDataHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ qseName: str | None = None
+ dmeName: str | None = None
+ resourceName: str | None
+ resourceType: str | None
+ SCED1CurveMW1: Decimal | None
+ SCED1CurvePrice1: Decimal | None
+ SCED1CurveMW2: Decimal | None
+ SCED1CurvePrice2: Decimal | None
SCED1CurveMW3: Decimal | None
- SCED1CurveMW30: Decimal | None
- SCED1CurveMW31: Decimal | None
- SCED1CurveMW32: Decimal | None
- SCED1CurveMW33: Decimal | None
- SCED1CurveMW34: Decimal | None
- SCED1CurveMW35: Decimal | None
+ SCED1CurvePrice3: Decimal | None
SCED1CurveMW4: Decimal | None
+ SCED1CurvePrice4: Decimal | None
SCED1CurveMW5: Decimal | None
+ SCED1CurvePrice5: Decimal | None
SCED1CurveMW6: Decimal | None
+ SCED1CurvePrice6: Decimal | None
SCED1CurveMW7: Decimal | None
+ SCED1CurvePrice7: Decimal | None
SCED1CurveMW8: Decimal | None
+ SCED1CurvePrice8: Decimal | None
SCED1CurveMW9: Decimal | None
- SCED1CurvePrice1: Decimal | None
+ SCED1CurvePrice9: Decimal | None
+ SCED1CurveMW10: Decimal | None
SCED1CurvePrice10: Decimal | None
+ SCED1CurveMW11: Decimal | None
SCED1CurvePrice11: Decimal | None
+ SCED1CurveMW12: Decimal | None
SCED1CurvePrice12: Decimal | None
+ SCED1CurveMW13: Decimal | None
SCED1CurvePrice13: Decimal | None
+ SCED1CurveMW14: Decimal | None
SCED1CurvePrice14: Decimal | None
+ SCED1CurveMW15: Decimal | None
SCED1CurvePrice15: Decimal | None
+ SCED1CurveMW16: Decimal | None
SCED1CurvePrice16: Decimal | None
+ SCED1CurveMW17: Decimal | None
SCED1CurvePrice17: Decimal | None
+ SCED1CurveMW18: Decimal | None
SCED1CurvePrice18: Decimal | None
+ SCED1CurveMW19: Decimal | None
SCED1CurvePrice19: Decimal | None
- SCED1CurvePrice2: Decimal | None
+ SCED1CurveMW20: Decimal | None
SCED1CurvePrice20: Decimal | None
+ SCED1CurveMW21: Decimal | None
SCED1CurvePrice21: Decimal | None
+ SCED1CurveMW22: Decimal | None
SCED1CurvePrice22: Decimal | None
+ SCED1CurveMW23: Decimal | None
SCED1CurvePrice23: Decimal | None
+ SCED1CurveMW24: Decimal | None
SCED1CurvePrice24: Decimal | None
+ SCED1CurveMW25: Decimal | None
SCED1CurvePrice25: Decimal | None
+ SCED1CurveMW26: Decimal | None
SCED1CurvePrice26: Decimal | None
+ SCED1CurveMW27: Decimal | None
SCED1CurvePrice27: Decimal | None
+ SCED1CurveMW28: Decimal | None
SCED1CurvePrice28: Decimal | None
+ SCED1CurveMW29: Decimal | None
SCED1CurvePrice29: Decimal | None
- SCED1CurvePrice3: Decimal | None
+ SCED1CurveMW30: Decimal | None
SCED1CurvePrice30: Decimal | None
+ SCED1CurveMW31: Decimal | None
SCED1CurvePrice31: Decimal | None
+ SCED1CurveMW32: Decimal | None
SCED1CurvePrice32: Decimal | None
+ SCED1CurveMW33: Decimal | None
SCED1CurvePrice33: Decimal | None
+ SCED1CurveMW34: Decimal | None
SCED1CurvePrice34: Decimal | None
+ SCED1CurveMW35: Decimal | None
SCED1CurvePrice35: Decimal | None
- SCED1CurvePrice4: Decimal | None
- SCED1CurvePrice5: Decimal | None
- SCED1CurvePrice6: Decimal | None
- SCED1CurvePrice7: Decimal | None
- SCED1CurvePrice8: Decimal | None
- SCED1CurvePrice9: Decimal | None
SCED2CurveMW1: Decimal | None
- SCED2CurveMW10: Decimal | None
- SCED2CurveMW11: Decimal | None
- SCED2CurveMW12: Decimal | None
- SCED2CurveMW13: Decimal | None
- SCED2CurveMW14: Decimal | None
- SCED2CurveMW15: Decimal | None
- SCED2CurveMW16: Decimal | None
- SCED2CurveMW17: Decimal | None
- SCED2CurveMW18: Decimal | None
- SCED2CurveMW19: Decimal | None
+ SCED2CurvePrice1: Decimal | None
SCED2CurveMW2: Decimal | None
- SCED2CurveMW20: Decimal | None
- SCED2CurveMW21: Decimal | None
- SCED2CurveMW22: Decimal | None
- SCED2CurveMW23: Decimal | None
- SCED2CurveMW24: Decimal | None
- SCED2CurveMW25: Decimal | None
- SCED2CurveMW26: Decimal | None
- SCED2CurveMW27: Decimal | None
- SCED2CurveMW28: Decimal | None
- SCED2CurveMW29: Decimal | None
+ SCED2CurvePrice2: Decimal | None
SCED2CurveMW3: Decimal | None
- SCED2CurveMW30: Decimal | None
- SCED2CurveMW31: Decimal | None
- SCED2CurveMW32: Decimal | None
- SCED2CurveMW33: Decimal | None
- SCED2CurveMW34: Decimal | None
- SCED2CurveMW35: Decimal | None
+ SCED2CurvePrice3: Decimal | None
SCED2CurveMW4: Decimal | None
+ SCED2CurvePrice4: Decimal | None
SCED2CurveMW5: Decimal | None
+ SCED2CurvePrice5: Decimal | None
SCED2CurveMW6: Decimal | None
+ SCED2CurvePrice6: Decimal | None
SCED2CurveMW7: Decimal | None
+ SCED2CurvePrice7: Decimal | None
SCED2CurveMW8: Decimal | None
+ SCED2CurvePrice8: Decimal | None
SCED2CurveMW9: Decimal | None
- SCED2CurvePrice1: Decimal | None
+ SCED2CurvePrice9: Decimal | None
+ SCED2CurveMW10: Decimal | None
SCED2CurvePrice10: Decimal | None
+ SCED2CurveMW11: Decimal | None
SCED2CurvePrice11: Decimal | None
+ SCED2CurveMW12: Decimal | None
SCED2CurvePrice12: Decimal | None
+ SCED2CurveMW13: Decimal | None
SCED2CurvePrice13: Decimal | None
+ SCED2CurveMW14: Decimal | None
SCED2CurvePrice14: Decimal | None
+ SCED2CurveMW15: Decimal | None
SCED2CurvePrice15: Decimal | None
+ SCED2CurveMW16: Decimal | None
SCED2CurvePrice16: Decimal | None
+ SCED2CurveMW17: Decimal | None
SCED2CurvePrice17: Decimal | None
+ SCED2CurveMW18: Decimal | None
SCED2CurvePrice18: Decimal | None
+ SCED2CurveMW19: Decimal | None
SCED2CurvePrice19: Decimal | None
- SCED2CurvePrice2: Decimal | None
+ SCED2CurveMW20: Decimal | None
SCED2CurvePrice20: Decimal | None
+ SCED2CurveMW21: Decimal | None
SCED2CurvePrice21: Decimal | None
+ SCED2CurveMW22: Decimal | None
SCED2CurvePrice22: Decimal | None
+ SCED2CurveMW23: Decimal | None
SCED2CurvePrice23: Decimal | None
+ SCED2CurveMW24: Decimal | None
SCED2CurvePrice24: Decimal | None
+ SCED2CurveMW25: Decimal | None
SCED2CurvePrice25: Decimal | None
+ SCED2CurveMW26: Decimal | None
SCED2CurvePrice26: Decimal | None
+ SCED2CurveMW27: Decimal | None
SCED2CurvePrice27: Decimal | None
+ SCED2CurveMW28: Decimal | None
SCED2CurvePrice28: Decimal | None
+ SCED2CurveMW29: Decimal | None
SCED2CurvePrice29: Decimal | None
- SCED2CurvePrice3: Decimal | None
+ SCED2CurveMW30: Decimal | None
SCED2CurvePrice30: Decimal | None
+ SCED2CurveMW31: Decimal | None
SCED2CurvePrice31: Decimal | None
+ SCED2CurveMW32: Decimal | None
SCED2CurvePrice32: Decimal | None
+ SCED2CurveMW33: Decimal | None
SCED2CurvePrice33: Decimal | None
+ SCED2CurveMW34: Decimal | None
SCED2CurvePrice34: Decimal | None
+ SCED2CurveMW35: Decimal | None
SCED2CurvePrice35: Decimal | None
- SCED2CurvePrice4: Decimal | None
- SCED2CurvePrice5: Decimal | None
- SCED2CurvePrice6: Decimal | None
- SCED2CurvePrice7: Decimal | None
- SCED2CurvePrice8: Decimal | None
- SCED2CurvePrice9: Decimal | None
- SCEDTimestamp: datetime | None
+ outputSchedule: Decimal | None
+ HSL: Decimal | None
+ HDL: Decimal | None
+ LSL: Decimal | None
+ LDL: Decimal | None
+ telemeteredResourceStatus: str | None
basePoint: Decimal | None
+ telemeteredNetOutput: Decimal | None
+ rampRateUp: Decimal | None = None
+ rampRateDown: Decimal | None = None
+ ASCapREGUP: Decimal | None = None
+ ASCapREGDN: Decimal | None = None
+ ASCapECRS: Decimal | None = None
+ ASCapNSPIN: Decimal | None = None
+ ASCapRRSPFR: Decimal | None = None
+ ASCapRRSFFR: Decimal | None = None
+ ASAwardsNSPIN: Decimal | None = None
+ ASAwardsRRSFFR: Decimal | None = None
+ ASAwardsRRSPFR: Decimal | None = None
+ ASAwardsRRSUFR: Decimal | None = None
+ ASAwardsECRS: Decimal | None = None
+ ASAwardsREGUP: Decimal | None = None
+ ASAwardsREGDN: Decimal | None = None
bidType: str | None
- dmeName: str | None
- minGenCost: Decimal | None
- outputSchedule: Decimal | None
- proxyExtension: str | None
- qseName: str | None
- rampRateDown: Decimal | None
- rampRateUp: Decimal | None
- repeatHourFlag: bool | None
- resourceName: str | None
- resourceType: str | None
startUpColdOffer: Decimal | None
startUpHotOffer: Decimal | None
startUpInterOffer: Decimal | None
+ minGenCost: Decimal | None
submittedTPOMW1: Decimal | None
- submittedTPOMW10: Decimal | None
- submittedTPOMW2: Decimal | None
- submittedTPOMW3: Decimal | None
- submittedTPOMW4: Decimal | None
- submittedTPOMW5: Decimal | None
- submittedTPOMW6: Decimal | None
- submittedTPOMW7: Decimal | None
- submittedTPOMW8: Decimal | None
- submittedTPOMW9: Decimal | None
submittedTPOPrice1: Decimal | None
- submittedTPOPrice10: Decimal | None
+ submittedTPOMW2: Decimal | None
submittedTPOPrice2: Decimal | None
+ submittedTPOMW3: Decimal | None
submittedTPOPrice3: Decimal | None
+ submittedTPOMW4: Decimal | None
submittedTPOPrice4: Decimal | None
+ submittedTPOMW5: Decimal | None
submittedTPOPrice5: Decimal | None
+ submittedTPOMW6: Decimal | None
submittedTPOPrice6: Decimal | None
+ submittedTPOMW7: Decimal | None
submittedTPOPrice7: Decimal | None
+ submittedTPOMW8: Decimal | None
submittedTPOPrice8: Decimal | None
+ submittedTPOMW9: Decimal | None
submittedTPOPrice9: Decimal | None
- telemeteredNetOutput: Decimal | None
- telemeteredResourceStatus: str | None
+ submittedTPOMW10: Decimal | None
+ submittedTPOPrice10: Decimal | None
+ proxyExtension: str | None
+ HASL: Decimal | None = None
+ LASL: Decimal | None = None
+ ASREGUP: Decimal | None = None
+ ASREGDN: Decimal | None = None
+ ASRRS: Decimal | None = None
+ ASRRSFFR: Decimal | None = None
+ ASNSRS: Decimal | None = None
+ ASECRS: Decimal | None = None
+
+ @property
+ def _60_sced_gen_res_data_history(self) -> Archive[np3_965_er._60ScedGenResDataHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60ScedGenResDataHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'SCED1 Curve-MW1': 'SCED1CurveMW1', 'SCED1 Curve-Price1': 'SCED1CurvePrice1', 'SCED1 Curve-MW2': 'SCED1CurveMW2', 'SCED1 Curve-Price2': 'SCED1CurvePrice2', 'SCED1 Curve-MW3': 'SCED1CurveMW3', 'SCED1 Curve-Price3': 'SCED1CurvePrice3', 'SCED1 Curve-MW4': 'SCED1CurveMW4', 'SCED1 Curve-Price4': 'SCED1CurvePrice4', 'SCED1 Curve-MW5': 'SCED1CurveMW5', 'SCED1 Curve-Price5': 'SCED1CurvePrice5', 'SCED1 Curve-MW6': 'SCED1CurveMW6', 'SCED1 Curve-Price6': 'SCED1CurvePrice6', 'SCED1 Curve-MW7': 'SCED1CurveMW7', 'SCED1 Curve-Price7': 'SCED1CurvePrice7', 'SCED1 Curve-MW8': 'SCED1CurveMW8', 'SCED1 Curve-Price8': 'SCED1CurvePrice8', 'SCED1 Curve-MW9': 'SCED1CurveMW9', 'SCED1 Curve-Price9': 'SCED1CurvePrice9', 'SCED1 Curve-MW10': 'SCED1CurveMW10', 'SCED1 Curve-Price10': 'SCED1CurvePrice10', 'SCED1 Curve-MW11': 'SCED1CurveMW11', 'SCED1 Curve-Price11': 'SCED1CurvePrice11', 'SCED1 Curve-MW12': 'SCED1CurveMW12', 'SCED1 Curve-Price12': 'SCED1CurvePrice12', 'SCED1 Curve-MW13': 'SCED1CurveMW13', 'SCED1 Curve-Price13': 'SCED1CurvePrice13', 'SCED1 Curve-MW14': 'SCED1CurveMW14', 'SCED1 Curve-Price14': 'SCED1CurvePrice14', 'SCED1 Curve-MW15': 'SCED1CurveMW15', 'SCED1 Curve-Price15': 'SCED1CurvePrice15', 'SCED1 Curve-MW16': 'SCED1CurveMW16', 'SCED1 Curve-Price16': 'SCED1CurvePrice16', 'SCED1 Curve-MW17': 'SCED1CurveMW17', 'SCED1 Curve-Price17': 'SCED1CurvePrice17', 'SCED1 Curve-MW18': 'SCED1CurveMW18', 'SCED1 Curve-Price18': 'SCED1CurvePrice18', 'SCED1 Curve-MW19': 'SCED1CurveMW19', 'SCED1 Curve-Price19': 'SCED1CurvePrice19', 'SCED1 Curve-MW20': 'SCED1CurveMW20', 'SCED1 Curve-Price20': 'SCED1CurvePrice20', 'SCED1 Curve-MW21': 'SCED1CurveMW21', 'SCED1 Curve-Price21': 'SCED1CurvePrice21', 'SCED1 Curve-MW22': 'SCED1CurveMW22', 'SCED1 Curve-Price22': 'SCED1CurvePrice22', 'SCED1 Curve-MW23': 'SCED1CurveMW23', 'SCED1 Curve-Price23': 'SCED1CurvePrice23', 'SCED1 Curve-MW24': 'SCED1CurveMW24', 'SCED1 Curve-Price24': 'SCED1CurvePrice24', 'SCED1 Curve-MW25': 'SCED1CurveMW25', 'SCED1 Curve-Price25': 'SCED1CurvePrice25', 'SCED1 Curve-MW26': 'SCED1CurveMW26', 'SCED1 Curve-Price26': 'SCED1CurvePrice26', 'SCED1 Curve-MW27': 'SCED1CurveMW27', 'SCED1 Curve-Price27': 'SCED1CurvePrice27', 'SCED1 Curve-MW28': 'SCED1CurveMW28', 'SCED1 Curve-Price28': 'SCED1CurvePrice28', 'SCED1 Curve-MW29': 'SCED1CurveMW29', 'SCED1 Curve-Price29': 'SCED1CurvePrice29', 'SCED1 Curve-MW30': 'SCED1CurveMW30', 'SCED1 Curve-Price30': 'SCED1CurvePrice30', 'SCED1 Curve-MW31': 'SCED1CurveMW31', 'SCED1 Curve-Price31': 'SCED1CurvePrice31', 'SCED1 Curve-MW32': 'SCED1CurveMW32', 'SCED1 Curve-Price32': 'SCED1CurvePrice32', 'SCED1 Curve-MW33': 'SCED1CurveMW33', 'SCED1 Curve-Price33': 'SCED1CurvePrice33', 'SCED1 Curve-MW34': 'SCED1CurveMW34', 'SCED1 Curve-Price34': 'SCED1CurvePrice34', 'SCED1 Curve-MW35': 'SCED1CurveMW35', 'SCED1 Curve-Price35': 'SCED1CurvePrice35', 'SCED2 Curve-MW1': 'SCED2CurveMW1', 'SCED2 Curve-Price1': 'SCED2CurvePrice1', 'SCED2 Curve-MW2': 'SCED2CurveMW2', 'SCED2 Curve-Price2': 'SCED2CurvePrice2', 'SCED2 Curve-MW3': 'SCED2CurveMW3', 'SCED2 Curve-Price3': 'SCED2CurvePrice3', 'SCED2 Curve-MW4': 'SCED2CurveMW4', 'SCED2 Curve-Price4': 'SCED2CurvePrice4', 'SCED2 Curve-MW5': 'SCED2CurveMW5', 'SCED2 Curve-Price5': 'SCED2CurvePrice5', 'SCED2 Curve-MW6': 'SCED2CurveMW6', 'SCED2 Curve-Price6': 'SCED2CurvePrice6', 'SCED2 Curve-MW7': 'SCED2CurveMW7', 'SCED2 Curve-Price7': 'SCED2CurvePrice7', 'SCED2 Curve-MW8': 'SCED2CurveMW8', 'SCED2 Curve-Price8': 'SCED2CurvePrice8', 'SCED2 Curve-MW9': 'SCED2CurveMW9', 'SCED2 Curve-Price9': 'SCED2CurvePrice9', 'SCED2 Curve-MW10': 'SCED2CurveMW10', 'SCED2 Curve-Price10': 'SCED2CurvePrice10', 'SCED2 Curve-MW11': 'SCED2CurveMW11', 'SCED2 Curve-Price11': 'SCED2CurvePrice11', 'SCED2 Curve-MW12': 'SCED2CurveMW12', 'SCED2 Curve-Price12': 'SCED2CurvePrice12', 'SCED2 Curve-MW13': 'SCED2CurveMW13', 'SCED2 Curve-Price13': 'SCED2CurvePrice13', 'SCED2 Curve-MW14': 'SCED2CurveMW14', 'SCED2 Curve-Price14': 'SCED2CurvePrice14', 'SCED2 Curve-MW15': 'SCED2CurveMW15', 'SCED2 Curve-Price15': 'SCED2CurvePrice15', 'SCED2 Curve-MW16': 'SCED2CurveMW16', 'SCED2 Curve-Price16': 'SCED2CurvePrice16', 'SCED2 Curve-MW17': 'SCED2CurveMW17', 'SCED2 Curve-Price17': 'SCED2CurvePrice17', 'SCED2 Curve-MW18': 'SCED2CurveMW18', 'SCED2 Curve-Price18': 'SCED2CurvePrice18', 'SCED2 Curve-MW19': 'SCED2CurveMW19', 'SCED2 Curve-Price19': 'SCED2CurvePrice19', 'SCED2 Curve-MW20': 'SCED2CurveMW20', 'SCED2 Curve-Price20': 'SCED2CurvePrice20', 'SCED2 Curve-MW21': 'SCED2CurveMW21', 'SCED2 Curve-Price21': 'SCED2CurvePrice21', 'SCED2 Curve-MW22': 'SCED2CurveMW22', 'SCED2 Curve-Price22': 'SCED2CurvePrice22', 'SCED2 Curve-MW23': 'SCED2CurveMW23', 'SCED2 Curve-Price23': 'SCED2CurvePrice23', 'SCED2 Curve-MW24': 'SCED2CurveMW24', 'SCED2 Curve-Price24': 'SCED2CurvePrice24', 'SCED2 Curve-MW25': 'SCED2CurveMW25', 'SCED2 Curve-Price25': 'SCED2CurvePrice25', 'SCED2 Curve-MW26': 'SCED2CurveMW26', 'SCED2 Curve-Price26': 'SCED2CurvePrice26', 'SCED2 Curve-MW27': 'SCED2CurveMW27', 'SCED2 Curve-Price27': 'SCED2CurvePrice27', 'SCED2 Curve-MW28': 'SCED2CurveMW28', 'SCED2 Curve-Price28': 'SCED2CurvePrice28', 'SCED2 Curve-MW29': 'SCED2CurveMW29', 'SCED2 Curve-Price29': 'SCED2CurvePrice29', 'SCED2 Curve-MW30': 'SCED2CurveMW30', 'SCED2 Curve-Price30': 'SCED2CurvePrice30', 'SCED2 Curve-MW31': 'SCED2CurveMW31', 'SCED2 Curve-Price31': 'SCED2CurvePrice31', 'SCED2 Curve-MW32': 'SCED2CurveMW32', 'SCED2 Curve-Price32': 'SCED2CurvePrice32', 'SCED2 Curve-MW33': 'SCED2CurveMW33', 'SCED2 Curve-Price33': 'SCED2CurvePrice33', 'SCED2 Curve-MW34': 'SCED2CurveMW34', 'SCED2 Curve-Price34': 'SCED2CurvePrice34', 'SCED2 Curve-MW35': 'SCED2CurveMW35', 'SCED2 Curve-Price35': 'SCED2CurvePrice35', 'Output Schedule': 'outputSchedule', 'HSL': 'HSL', 'HDL': 'HDL', 'LSL': 'LSL', 'LDL': 'LDL', 'Telemetered Resource Status': 'telemeteredResourceStatus', 'Base Point': 'basePoint', 'Telemetered Net Output': 'telemeteredNetOutput', 'Ramp Rate Up': 'rampRateUp', 'Ramp Rate Down': 'rampRateDown', 'AS Capability REGUP': 'ASCapREGUP', 'AS Capability REGDN': 'ASCapREGDN', 'AS Capability ECRS': 'ASCapECRS', 'AS Capability NSPIN': 'ASCapNSPIN', 'AS Capability RRSPFR': 'ASCapRRSPFR', 'AS Capability RRSFFR': 'ASCapRRSFFR', 'AS Awards NSPIN': 'ASAwardsNSPIN', 'AS Awards RRSFFR': 'ASAwardsRRSFFR', 'AS Awards RRSPFR': 'ASAwardsRRSPFR', 'AS Awards RRSUFR': 'ASAwardsRRSUFR', 'AS Awards ECRS': 'ASAwardsECRS', 'AS Awards REGUP': 'ASAwardsREGUP', 'AS Awards REGDN': 'ASAwardsREGDN', 'Bid_Type': 'bidType', 'Start Up Cold Offer': 'startUpColdOffer', 'Start Up Hot Offer': 'startUpHotOffer', 'Start Up Inter Offer': 'startUpInterOffer', 'Min Gen Cost': 'minGenCost', 'Submitted TPO-MW1': 'submittedTPOMW1', 'Submitted TPO-Price1': 'submittedTPOPrice1', 'Submitted TPO-MW2': 'submittedTPOMW2', 'Submitted TPO-Price2': 'submittedTPOPrice2', 'Submitted TPO-MW3': 'submittedTPOMW3', 'Submitted TPO-Price3': 'submittedTPOPrice3', 'Submitted TPO-MW4': 'submittedTPOMW4', 'Submitted TPO-Price4': 'submittedTPOPrice4', 'Submitted TPO-MW5': 'submittedTPOMW5', 'Submitted TPO-Price5': 'submittedTPOPrice5', 'Submitted TPO-MW6': 'submittedTPOMW6', 'Submitted TPO-Price6': 'submittedTPOPrice6', 'Submitted TPO-MW7': 'submittedTPOMW7', 'Submitted TPO-Price7': 'submittedTPOPrice7', 'Submitted TPO-MW8': 'submittedTPOMW8', 'Submitted TPO-Price8': 'submittedTPOPrice8', 'Submitted TPO-MW9': 'submittedTPOMW9', 'Submitted TPO-Price9': 'submittedTPOPrice9', 'Submitted TPO-MW10': 'submittedTPOMW10', 'Submitted TPO-Price10': 'submittedTPOPrice10', 'Proxy Extension': 'proxyExtension'}, {}, member='60d_SCED_Gen_Resource_Data-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'SCED1 Curve-MW1': 'SCED1CurveMW1', 'SCED1 Curve-Price1': 'SCED1CurvePrice1', 'SCED1 Curve-MW2': 'SCED1CurveMW2', 'SCED1 Curve-Price2': 'SCED1CurvePrice2', 'SCED1 Curve-MW3': 'SCED1CurveMW3', 'SCED1 Curve-Price3': 'SCED1CurvePrice3', 'SCED1 Curve-MW4': 'SCED1CurveMW4', 'SCED1 Curve-Price4': 'SCED1CurvePrice4', 'SCED1 Curve-MW5': 'SCED1CurveMW5', 'SCED1 Curve-Price5': 'SCED1CurvePrice5', 'SCED1 Curve-MW6': 'SCED1CurveMW6', 'SCED1 Curve-Price6': 'SCED1CurvePrice6', 'SCED1 Curve-MW7': 'SCED1CurveMW7', 'SCED1 Curve-Price7': 'SCED1CurvePrice7', 'SCED1 Curve-MW8': 'SCED1CurveMW8', 'SCED1 Curve-Price8': 'SCED1CurvePrice8', 'SCED1 Curve-MW9': 'SCED1CurveMW9', 'SCED1 Curve-Price9': 'SCED1CurvePrice9', 'SCED1 Curve-MW10': 'SCED1CurveMW10', 'SCED1 Curve-Price10': 'SCED1CurvePrice10', 'SCED1 Curve-MW11': 'SCED1CurveMW11', 'SCED1 Curve-Price11': 'SCED1CurvePrice11', 'SCED1 Curve-MW12': 'SCED1CurveMW12', 'SCED1 Curve-Price12': 'SCED1CurvePrice12', 'SCED1 Curve-MW13': 'SCED1CurveMW13', 'SCED1 Curve-Price13': 'SCED1CurvePrice13', 'SCED1 Curve-MW14': 'SCED1CurveMW14', 'SCED1 Curve-Price14': 'SCED1CurvePrice14', 'SCED1 Curve-MW15': 'SCED1CurveMW15', 'SCED1 Curve-Price15': 'SCED1CurvePrice15', 'SCED1 Curve-MW16': 'SCED1CurveMW16', 'SCED1 Curve-Price16': 'SCED1CurvePrice16', 'SCED1 Curve-MW17': 'SCED1CurveMW17', 'SCED1 Curve-Price17': 'SCED1CurvePrice17', 'SCED1 Curve-MW18': 'SCED1CurveMW18', 'SCED1 Curve-Price18': 'SCED1CurvePrice18', 'SCED1 Curve-MW19': 'SCED1CurveMW19', 'SCED1 Curve-Price19': 'SCED1CurvePrice19', 'SCED1 Curve-MW20': 'SCED1CurveMW20', 'SCED1 Curve-Price20': 'SCED1CurvePrice20', 'SCED1 Curve-MW21': 'SCED1CurveMW21', 'SCED1 Curve-Price21': 'SCED1CurvePrice21', 'SCED1 Curve-MW22': 'SCED1CurveMW22', 'SCED1 Curve-Price22': 'SCED1CurvePrice22', 'SCED1 Curve-MW23': 'SCED1CurveMW23', 'SCED1 Curve-Price23': 'SCED1CurvePrice23', 'SCED1 Curve-MW24': 'SCED1CurveMW24', 'SCED1 Curve-Price24': 'SCED1CurvePrice24', 'SCED1 Curve-MW25': 'SCED1CurveMW25', 'SCED1 Curve-Price25': 'SCED1CurvePrice25', 'SCED1 Curve-MW26': 'SCED1CurveMW26', 'SCED1 Curve-Price26': 'SCED1CurvePrice26', 'SCED1 Curve-MW27': 'SCED1CurveMW27', 'SCED1 Curve-Price27': 'SCED1CurvePrice27', 'SCED1 Curve-MW28': 'SCED1CurveMW28', 'SCED1 Curve-Price28': 'SCED1CurvePrice28', 'SCED1 Curve-MW29': 'SCED1CurveMW29', 'SCED1 Curve-Price29': 'SCED1CurvePrice29', 'SCED1 Curve-MW30': 'SCED1CurveMW30', 'SCED1 Curve-Price30': 'SCED1CurvePrice30', 'SCED1 Curve-MW31': 'SCED1CurveMW31', 'SCED1 Curve-Price31': 'SCED1CurvePrice31', 'SCED1 Curve-MW32': 'SCED1CurveMW32', 'SCED1 Curve-Price32': 'SCED1CurvePrice32', 'SCED1 Curve-MW33': 'SCED1CurveMW33', 'SCED1 Curve-Price33': 'SCED1CurvePrice33', 'SCED1 Curve-MW34': 'SCED1CurveMW34', 'SCED1 Curve-Price34': 'SCED1CurvePrice34', 'SCED1 Curve-MW35': 'SCED1CurveMW35', 'SCED1 Curve-Price35': 'SCED1CurvePrice35', 'SCED2 Curve-MW1': 'SCED2CurveMW1', 'SCED2 Curve-Price1': 'SCED2CurvePrice1', 'SCED2 Curve-MW2': 'SCED2CurveMW2', 'SCED2 Curve-Price2': 'SCED2CurvePrice2', 'SCED2 Curve-MW3': 'SCED2CurveMW3', 'SCED2 Curve-Price3': 'SCED2CurvePrice3', 'SCED2 Curve-MW4': 'SCED2CurveMW4', 'SCED2 Curve-Price4': 'SCED2CurvePrice4', 'SCED2 Curve-MW5': 'SCED2CurveMW5', 'SCED2 Curve-Price5': 'SCED2CurvePrice5', 'SCED2 Curve-MW6': 'SCED2CurveMW6', 'SCED2 Curve-Price6': 'SCED2CurvePrice6', 'SCED2 Curve-MW7': 'SCED2CurveMW7', 'SCED2 Curve-Price7': 'SCED2CurvePrice7', 'SCED2 Curve-MW8': 'SCED2CurveMW8', 'SCED2 Curve-Price8': 'SCED2CurvePrice8', 'SCED2 Curve-MW9': 'SCED2CurveMW9', 'SCED2 Curve-Price9': 'SCED2CurvePrice9', 'SCED2 Curve-MW10': 'SCED2CurveMW10', 'SCED2 Curve-Price10': 'SCED2CurvePrice10', 'SCED2 Curve-MW11': 'SCED2CurveMW11', 'SCED2 Curve-Price11': 'SCED2CurvePrice11', 'SCED2 Curve-MW12': 'SCED2CurveMW12', 'SCED2 Curve-Price12': 'SCED2CurvePrice12', 'SCED2 Curve-MW13': 'SCED2CurveMW13', 'SCED2 Curve-Price13': 'SCED2CurvePrice13', 'SCED2 Curve-MW14': 'SCED2CurveMW14', 'SCED2 Curve-Price14': 'SCED2CurvePrice14', 'SCED2 Curve-MW15': 'SCED2CurveMW15', 'SCED2 Curve-Price15': 'SCED2CurvePrice15', 'SCED2 Curve-MW16': 'SCED2CurveMW16', 'SCED2 Curve-Price16': 'SCED2CurvePrice16', 'SCED2 Curve-MW17': 'SCED2CurveMW17', 'SCED2 Curve-Price17': 'SCED2CurvePrice17', 'SCED2 Curve-MW18': 'SCED2CurveMW18', 'SCED2 Curve-Price18': 'SCED2CurvePrice18', 'SCED2 Curve-MW19': 'SCED2CurveMW19', 'SCED2 Curve-Price19': 'SCED2CurvePrice19', 'SCED2 Curve-MW20': 'SCED2CurveMW20', 'SCED2 Curve-Price20': 'SCED2CurvePrice20', 'SCED2 Curve-MW21': 'SCED2CurveMW21', 'SCED2 Curve-Price21': 'SCED2CurvePrice21', 'SCED2 Curve-MW22': 'SCED2CurveMW22', 'SCED2 Curve-Price22': 'SCED2CurvePrice22', 'SCED2 Curve-MW23': 'SCED2CurveMW23', 'SCED2 Curve-Price23': 'SCED2CurvePrice23', 'SCED2 Curve-MW24': 'SCED2CurveMW24', 'SCED2 Curve-Price24': 'SCED2CurvePrice24', 'SCED2 Curve-MW25': 'SCED2CurveMW25', 'SCED2 Curve-Price25': 'SCED2CurvePrice25', 'SCED2 Curve-MW26': 'SCED2CurveMW26', 'SCED2 Curve-Price26': 'SCED2CurvePrice26', 'SCED2 Curve-MW27': 'SCED2CurveMW27', 'SCED2 Curve-Price27': 'SCED2CurvePrice27', 'SCED2 Curve-MW28': 'SCED2CurveMW28', 'SCED2 Curve-Price28': 'SCED2CurvePrice28', 'SCED2 Curve-MW29': 'SCED2CurveMW29', 'SCED2 Curve-Price29': 'SCED2CurvePrice29', 'SCED2 Curve-MW30': 'SCED2CurveMW30', 'SCED2 Curve-Price30': 'SCED2CurvePrice30', 'SCED2 Curve-MW31': 'SCED2CurveMW31', 'SCED2 Curve-Price31': 'SCED2CurvePrice31', 'SCED2 Curve-MW32': 'SCED2CurveMW32', 'SCED2 Curve-Price32': 'SCED2CurvePrice32', 'SCED2 Curve-MW33': 'SCED2CurveMW33', 'SCED2 Curve-Price33': 'SCED2CurvePrice33', 'SCED2 Curve-MW34': 'SCED2CurveMW34', 'SCED2 Curve-Price34': 'SCED2CurvePrice34', 'SCED2 Curve-MW35': 'SCED2CurveMW35', 'SCED2 Curve-Price35': 'SCED2CurvePrice35', 'Output Schedule': 'outputSchedule', 'HSL': 'HSL', 'HASL': 'HASL', 'HDL': 'HDL', 'LSL': 'LSL', 'LASL': 'LASL', 'LDL': 'LDL', 'Telemetered Resource Status': 'telemeteredResourceStatus', 'Base Point': 'basePoint', 'Telemetered Net Output ': 'telemeteredNetOutput', 'Ancillary Service REGUP': 'ASREGUP', 'Ancillary Service REGDN': 'ASREGDN', 'Ancillary Service RRS': 'ASRRS', 'Ancillary Service NSRS': 'ASNSRS', 'Bid_Type': 'bidType', 'Start Up Cold Offer': 'startUpColdOffer', 'Start Up Hot Offer': 'startUpHotOffer', 'Start Up Inter Offer': 'startUpInterOffer', 'Min Gen Cost': 'minGenCost', 'Submitted TPO-MW1': 'submittedTPOMW1', 'Submitted TPO-Price1': 'submittedTPOPrice1', 'Submitted TPO-MW2': 'submittedTPOMW2', 'Submitted TPO-Price2': 'submittedTPOPrice2', 'Submitted TPO-MW3': 'submittedTPOMW3', 'Submitted TPO-Price3': 'submittedTPOPrice3', 'Submitted TPO-MW4': 'submittedTPOMW4', 'Submitted TPO-Price4': 'submittedTPOPrice4', 'Submitted TPO-MW5': 'submittedTPOMW5', 'Submitted TPO-Price5': 'submittedTPOPrice5', 'Submitted TPO-MW6': 'submittedTPOMW6', 'Submitted TPO-Price6': 'submittedTPOPrice6', 'Submitted TPO-MW7': 'submittedTPOMW7', 'Submitted TPO-Price7': 'submittedTPOPrice7', 'Submitted TPO-MW8': 'submittedTPOMW8', 'Submitted TPO-Price8': 'submittedTPOPrice8', 'Submitted TPO-MW9': 'submittedTPOMW9', 'Submitted TPO-Price9': 'submittedTPOPrice9', 'Submitted TPO-MW10': 'submittedTPOMW10', 'Submitted TPO-Price10': 'submittedTPOPrice10', 'Proxy Extension': 'proxyExtension'}, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'SCED1 Curve-MW1': 'SCED1CurveMW1', 'SCED1 Curve-Price1': 'SCED1CurvePrice1', 'SCED1 Curve-MW2': 'SCED1CurveMW2', 'SCED1 Curve-Price2': 'SCED1CurvePrice2', 'SCED1 Curve-MW3': 'SCED1CurveMW3', 'SCED1 Curve-Price3': 'SCED1CurvePrice3', 'SCED1 Curve-MW4': 'SCED1CurveMW4', 'SCED1 Curve-Price4': 'SCED1CurvePrice4', 'SCED1 Curve-MW5': 'SCED1CurveMW5', 'SCED1 Curve-Price5': 'SCED1CurvePrice5', 'SCED1 Curve-MW6': 'SCED1CurveMW6', 'SCED1 Curve-Price6': 'SCED1CurvePrice6', 'SCED1 Curve-MW7': 'SCED1CurveMW7', 'SCED1 Curve-Price7': 'SCED1CurvePrice7', 'SCED1 Curve-MW8': 'SCED1CurveMW8', 'SCED1 Curve-Price8': 'SCED1CurvePrice8', 'SCED1 Curve-MW9': 'SCED1CurveMW9', 'SCED1 Curve-Price9': 'SCED1CurvePrice9', 'SCED1 Curve-MW10': 'SCED1CurveMW10', 'SCED1 Curve-Price10': 'SCED1CurvePrice10', 'SCED1 Curve-MW11': 'SCED1CurveMW11', 'SCED1 Curve-Price11': 'SCED1CurvePrice11', 'SCED1 Curve-MW12': 'SCED1CurveMW12', 'SCED1 Curve-Price12': 'SCED1CurvePrice12', 'SCED1 Curve-MW13': 'SCED1CurveMW13', 'SCED1 Curve-Price13': 'SCED1CurvePrice13', 'SCED1 Curve-MW14': 'SCED1CurveMW14', 'SCED1 Curve-Price14': 'SCED1CurvePrice14', 'SCED1 Curve-MW15': 'SCED1CurveMW15', 'SCED1 Curve-Price15': 'SCED1CurvePrice15', 'SCED1 Curve-MW16': 'SCED1CurveMW16', 'SCED1 Curve-Price16': 'SCED1CurvePrice16', 'SCED1 Curve-MW17': 'SCED1CurveMW17', 'SCED1 Curve-Price17': 'SCED1CurvePrice17', 'SCED1 Curve-MW18': 'SCED1CurveMW18', 'SCED1 Curve-Price18': 'SCED1CurvePrice18', 'SCED1 Curve-MW19': 'SCED1CurveMW19', 'SCED1 Curve-Price19': 'SCED1CurvePrice19', 'SCED1 Curve-MW20': 'SCED1CurveMW20', 'SCED1 Curve-Price20': 'SCED1CurvePrice20', 'SCED1 Curve-MW21': 'SCED1CurveMW21', 'SCED1 Curve-Price21': 'SCED1CurvePrice21', 'SCED1 Curve-MW22': 'SCED1CurveMW22', 'SCED1 Curve-Price22': 'SCED1CurvePrice22', 'SCED1 Curve-MW23': 'SCED1CurveMW23', 'SCED1 Curve-Price23': 'SCED1CurvePrice23', 'SCED1 Curve-MW24': 'SCED1CurveMW24', 'SCED1 Curve-Price24': 'SCED1CurvePrice24', 'SCED1 Curve-MW25': 'SCED1CurveMW25', 'SCED1 Curve-Price25': 'SCED1CurvePrice25', 'SCED1 Curve-MW26': 'SCED1CurveMW26', 'SCED1 Curve-Price26': 'SCED1CurvePrice26', 'SCED1 Curve-MW27': 'SCED1CurveMW27', 'SCED1 Curve-Price27': 'SCED1CurvePrice27', 'SCED1 Curve-MW28': 'SCED1CurveMW28', 'SCED1 Curve-Price28': 'SCED1CurvePrice28', 'SCED1 Curve-MW29': 'SCED1CurveMW29', 'SCED1 Curve-Price29': 'SCED1CurvePrice29', 'SCED1 Curve-MW30': 'SCED1CurveMW30', 'SCED1 Curve-Price30': 'SCED1CurvePrice30', 'SCED1 Curve-MW31': 'SCED1CurveMW31', 'SCED1 Curve-Price31': 'SCED1CurvePrice31', 'SCED1 Curve-MW32': 'SCED1CurveMW32', 'SCED1 Curve-Price32': 'SCED1CurvePrice32', 'SCED1 Curve-MW33': 'SCED1CurveMW33', 'SCED1 Curve-Price33': 'SCED1CurvePrice33', 'SCED1 Curve-MW34': 'SCED1CurveMW34', 'SCED1 Curve-Price34': 'SCED1CurvePrice34', 'SCED1 Curve-MW35': 'SCED1CurveMW35', 'SCED1 Curve-Price35': 'SCED1CurvePrice35', 'SCED2 Curve-MW1': 'SCED2CurveMW1', 'SCED2 Curve-Price1': 'SCED2CurvePrice1', 'SCED2 Curve-MW2': 'SCED2CurveMW2', 'SCED2 Curve-Price2': 'SCED2CurvePrice2', 'SCED2 Curve-MW3': 'SCED2CurveMW3', 'SCED2 Curve-Price3': 'SCED2CurvePrice3', 'SCED2 Curve-MW4': 'SCED2CurveMW4', 'SCED2 Curve-Price4': 'SCED2CurvePrice4', 'SCED2 Curve-MW5': 'SCED2CurveMW5', 'SCED2 Curve-Price5': 'SCED2CurvePrice5', 'SCED2 Curve-MW6': 'SCED2CurveMW6', 'SCED2 Curve-Price6': 'SCED2CurvePrice6', 'SCED2 Curve-MW7': 'SCED2CurveMW7', 'SCED2 Curve-Price7': 'SCED2CurvePrice7', 'SCED2 Curve-MW8': 'SCED2CurveMW8', 'SCED2 Curve-Price8': 'SCED2CurvePrice8', 'SCED2 Curve-MW9': 'SCED2CurveMW9', 'SCED2 Curve-Price9': 'SCED2CurvePrice9', 'SCED2 Curve-MW10': 'SCED2CurveMW10', 'SCED2 Curve-Price10': 'SCED2CurvePrice10', 'SCED2 Curve-MW11': 'SCED2CurveMW11', 'SCED2 Curve-Price11': 'SCED2CurvePrice11', 'SCED2 Curve-MW12': 'SCED2CurveMW12', 'SCED2 Curve-Price12': 'SCED2CurvePrice12', 'SCED2 Curve-MW13': 'SCED2CurveMW13', 'SCED2 Curve-Price13': 'SCED2CurvePrice13', 'SCED2 Curve-MW14': 'SCED2CurveMW14', 'SCED2 Curve-Price14': 'SCED2CurvePrice14', 'SCED2 Curve-MW15': 'SCED2CurveMW15', 'SCED2 Curve-Price15': 'SCED2CurvePrice15', 'SCED2 Curve-MW16': 'SCED2CurveMW16', 'SCED2 Curve-Price16': 'SCED2CurvePrice16', 'SCED2 Curve-MW17': 'SCED2CurveMW17', 'SCED2 Curve-Price17': 'SCED2CurvePrice17', 'SCED2 Curve-MW18': 'SCED2CurveMW18', 'SCED2 Curve-Price18': 'SCED2CurvePrice18', 'SCED2 Curve-MW19': 'SCED2CurveMW19', 'SCED2 Curve-Price19': 'SCED2CurvePrice19', 'SCED2 Curve-MW20': 'SCED2CurveMW20', 'SCED2 Curve-Price20': 'SCED2CurvePrice20', 'SCED2 Curve-MW21': 'SCED2CurveMW21', 'SCED2 Curve-Price21': 'SCED2CurvePrice21', 'SCED2 Curve-MW22': 'SCED2CurveMW22', 'SCED2 Curve-Price22': 'SCED2CurvePrice22', 'SCED2 Curve-MW23': 'SCED2CurveMW23', 'SCED2 Curve-Price23': 'SCED2CurvePrice23', 'SCED2 Curve-MW24': 'SCED2CurveMW24', 'SCED2 Curve-Price24': 'SCED2CurvePrice24', 'SCED2 Curve-MW25': 'SCED2CurveMW25', 'SCED2 Curve-Price25': 'SCED2CurvePrice25', 'SCED2 Curve-MW26': 'SCED2CurveMW26', 'SCED2 Curve-Price26': 'SCED2CurvePrice26', 'SCED2 Curve-MW27': 'SCED2CurveMW27', 'SCED2 Curve-Price27': 'SCED2CurvePrice27', 'SCED2 Curve-MW28': 'SCED2CurveMW28', 'SCED2 Curve-Price28': 'SCED2CurvePrice28', 'SCED2 Curve-MW29': 'SCED2CurveMW29', 'SCED2 Curve-Price29': 'SCED2CurvePrice29', 'SCED2 Curve-MW30': 'SCED2CurveMW30', 'SCED2 Curve-Price30': 'SCED2CurvePrice30', 'SCED2 Curve-MW31': 'SCED2CurveMW31', 'SCED2 Curve-Price31': 'SCED2CurvePrice31', 'SCED2 Curve-MW32': 'SCED2CurveMW32', 'SCED2 Curve-Price32': 'SCED2CurvePrice32', 'SCED2 Curve-MW33': 'SCED2CurveMW33', 'SCED2 Curve-Price33': 'SCED2CurvePrice33', 'SCED2 Curve-MW34': 'SCED2CurveMW34', 'SCED2 Curve-Price34': 'SCED2CurvePrice34', 'SCED2 Curve-MW35': 'SCED2CurveMW35', 'SCED2 Curve-Price35': 'SCED2CurvePrice35', 'Output Schedule': 'outputSchedule', 'HSL': 'HSL', 'HASL': 'HASL', 'HDL': 'HDL', 'LSL': 'LSL', 'LASL': 'LASL', 'LDL': 'LDL', 'Telemetered Resource Status': 'telemeteredResourceStatus', 'Base Point': 'basePoint', 'Telemetered Net Output ': 'telemeteredNetOutput', 'Ancillary Service REGUP': 'ASREGUP', 'Ancillary Service REGDN': 'ASREGDN', 'Ancillary Service RRS': 'ASRRS', 'Ancillary Service RRSFFR': 'ASRRSFFR', 'Ancillary Service NSRS': 'ASNSRS', 'Ancillary Service ECRS': 'ASECRS', 'Bid_Type': 'bidType', 'Start Up Cold Offer': 'startUpColdOffer', 'Start Up Hot Offer': 'startUpHotOffer', 'Start Up Inter Offer': 'startUpInterOffer', 'Min Gen Cost': 'minGenCost', 'Submitted TPO-MW1': 'submittedTPOMW1', 'Submitted TPO-Price1': 'submittedTPOPrice1', 'Submitted TPO-MW2': 'submittedTPOMW2', 'Submitted TPO-Price2': 'submittedTPOPrice2', 'Submitted TPO-MW3': 'submittedTPOMW3', 'Submitted TPO-Price3': 'submittedTPOPrice3', 'Submitted TPO-MW4': 'submittedTPOMW4', 'Submitted TPO-Price4': 'submittedTPOPrice4', 'Submitted TPO-MW5': 'submittedTPOMW5', 'Submitted TPO-Price5': 'submittedTPOPrice5', 'Submitted TPO-MW6': 'submittedTPOMW6', 'Submitted TPO-Price6': 'submittedTPOPrice6', 'Submitted TPO-MW7': 'submittedTPOMW7', 'Submitted TPO-Price7': 'submittedTPOPrice7', 'Submitted TPO-MW8': 'submittedTPOMW8', 'Submitted TPO-Price8': 'submittedTPOPrice8', 'Submitted TPO-MW9': 'submittedTPOMW9', 'Submitted TPO-Price9': 'submittedTPOPrice9', 'Submitted TPO-MW10': 'submittedTPOMW10', 'Submitted TPO-Price10': 'submittedTPOPrice10', 'Proxy Extension': 'proxyExtension'}))
def _60_sced_gen_res_data(self, *, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, outputScheduleFrom: Decimal | None = None, outputScheduleTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, HDLFrom: Decimal | None = None, HDLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, LDLFrom: Decimal | None = None, LDLTo: Decimal | None = None, telemeteredResourceStatus: str | None = None, basePointFrom: Decimal | None = None, basePointTo: Decimal | None = None, telemeteredNetOutputFrom: Decimal | None = None, telemeteredNetOutputTo: Decimal | None = None, rampRateUpFrom: Decimal | None = None, rampRateUpTo: Decimal | None = None, rampRateDownFrom: Decimal | None = None, rampRateDownTo: Decimal | None = None, ASCapREGUPFrom: Decimal | None = None, ASCapREGUPTo: Decimal | None = None, ASCapREGDNFrom: Decimal | None = None, ASCapREGDNTo: Decimal | None = None, ASCapECRSFrom: Decimal | None = None, ASCapECRSTo: Decimal | None = None, ASCapNSPINFrom: Decimal | None = None, ASCapNSPINTo: Decimal | None = None, ASAwardsNSPINFrom: Decimal | None = None, ASAwardsNSPINTo: Decimal | None = None, ASAwardsRRSFFRFrom: Decimal | None = None, ASAwardsRRSFFRTo: Decimal | None = None, ASAwardsRRSPFRFrom: Decimal | None = None, ASAwardsRRSPFRTo: Decimal | None = None, ASAwardsRRSUFRFrom: Decimal | None = None, ASAwardsRRSUFRTo: Decimal | None = None, ASAwardsECRSFrom: Decimal | None = None, ASAwardsECRSTo: Decimal | None = None, ASAwardsREGUPFrom: Decimal | None = None, ASAwardsREGUPTo: Decimal | None = None, ASAwardsREGDNFrom: Decimal | None = None, ASAwardsREGDNTo: Decimal | None = None, bidType: str | None = None, startUpColdOfferFrom: Decimal | None = None, startUpColdOfferTo: Decimal | None = None, startUpHotOfferFrom: Decimal | None = None, startUpHotOfferTo: Decimal | None = None, startUpInterOfferFrom: Decimal | None = None, startUpInterOfferTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, ASCapRRSPFRFrom: Decimal | None = None, ASCapRRSPFRTo: Decimal | None = None, ASCapRRSFFRFrom: Decimal | None = None, ASCapRRSFFRTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, SCED1CurveMW1From: Decimal | None = None, SCED1CurveMW1To: Decimal | None = None, SCED1CurvePrice1From: Decimal | None = None, SCED1CurvePrice1To: Decimal | None = None, SCED1CurveMW2From: Decimal | None = None, SCED1CurveMW2To: Decimal | None = None, SCED1CurvePrice2From: Decimal | None = None, SCED1CurvePrice2To: Decimal | None = None, SCED1CurveMW3From: Decimal | None = None, SCED1CurveMW3To: Decimal | None = None, SCED1CurvePrice3From: Decimal | None = None, SCED1CurvePrice3To: Decimal | None = None, SCED1CurveMW4From: Decimal | None = None, SCED1CurveMW4To: Decimal | None = None, SCED1CurvePrice4From: Decimal | None = None, SCED1CurvePrice4To: Decimal | None = None, SCED1CurveMW5From: Decimal | None = None, SCED1CurveMW5To: Decimal | None = None, SCED1CurvePrice5From: Decimal | None = None, SCED1CurvePrice5To: Decimal | None = None, SCED1CurveMW6From: Decimal | None = None, SCED1CurveMW6To: Decimal | None = None, SCED1CurvePrice6From: Decimal | None = None, SCED1CurvePrice6To: Decimal | None = None, SCED1CurveMW7From: Decimal | None = None, SCED1CurveMW7To: Decimal | None = None, SCED1CurvePrice7From: Decimal | None = None, SCED1CurvePrice7To: Decimal | None = None, SCED1CurveMW8From: Decimal | None = None, SCED1CurveMW8To: Decimal | None = None, SCED1CurvePrice8From: Decimal | None = None, SCED1CurvePrice8To: Decimal | None = None, SCED1CurveMW9From: Decimal | None = None, SCED1CurveMW9To: Decimal | None = None, SCED1CurvePrice9From: Decimal | None = None, SCED1CurvePrice9To: Decimal | None = None, SCED1CurveMW10From: Decimal | None = None, SCED1CurveMW10To: Decimal | None = None, SCED1CurvePrice10From: Decimal | None = None, SCED1CurvePrice10To: Decimal | None = None, SCED1CurveMW11From: Decimal | None = None, SCED1CurveMW11To: Decimal | None = None, SCED1CurvePrice11From: Decimal | None = None, SCED1CurvePrice11To: Decimal | None = None, SCED1CurveMW12From: Decimal | None = None, SCED1CurveMW12To: Decimal | None = None, SCED1CurvePrice12From: Decimal | None = None, SCED1CurvePrice12To: Decimal | None = None, SCED1CurveMW13From: Decimal | None = None, SCED1CurveMW13To: Decimal | None = None, SCED1CurvePrice13From: Decimal | None = None, SCED1CurvePrice13To: Decimal | None = None, SCED1CurveMW14From: Decimal | None = None, SCED1CurveMW14To: Decimal | None = None, SCED1CurvePrice14From: Decimal | None = None, SCED1CurvePrice14To: Decimal | None = None, SCED1CurveMW15From: Decimal | None = None, SCED1CurveMW15To: Decimal | None = None, SCED1CurvePrice15From: Decimal | None = None, SCED1CurvePrice15To: Decimal | None = None, SCED1CurveMW16From: Decimal | None = None, SCED1CurveMW16To: Decimal | None = None, SCED1CurvePrice16From: Decimal | None = None, SCED1CurvePrice16To: Decimal | None = None, SCED1CurveMW17From: Decimal | None = None, SCED1CurveMW17To: Decimal | None = None, SCED1CurvePrice17From: Decimal | None = None, SCED1CurvePrice17To: Decimal | None = None, SCED1CurveMW18From: Decimal | None = None, SCED1CurveMW18To: Decimal | None = None, SCED1CurvePrice18From: Decimal | None = None, SCED1CurvePrice18To: Decimal | None = None, SCED1CurveMW19From: Decimal | None = None, SCED1CurveMW19To: Decimal | None = None, SCED1CurvePrice19From: Decimal | None = None, SCED1CurvePrice19To: Decimal | None = None, SCED1CurveMW20From: Decimal | None = None, SCED1CurveMW20To: Decimal | None = None, SCED1CurvePrice20From: Decimal | None = None, SCED1CurvePrice20To: Decimal | None = None, SCED1CurveMW21From: Decimal | None = None, SCED1CurveMW21To: Decimal | None = None, SCED1CurvePrice21From: Decimal | None = None, SCED1CurvePrice21To: Decimal | None = None, SCED1CurveMW22From: Decimal | None = None, SCED1CurveMW22To: Decimal | None = None, SCED1CurvePrice22From: Decimal | None = None, SCED1CurvePrice22To: Decimal | None = None, SCED1CurveMW23From: Decimal | None = None, SCED1CurveMW23To: Decimal | None = None, SCED1CurvePrice23From: Decimal | None = None, SCED1CurvePrice23To: Decimal | None = None, SCED1CurveMW24From: Decimal | None = None, SCED1CurveMW24To: Decimal | None = None, SCED1CurvePrice24From: Decimal | None = None, SCED1CurvePrice24To: Decimal | None = None, SCED1CurveMW25From: Decimal | None = None, SCED1CurveMW25To: Decimal | None = None, SCED1CurvePrice25From: Decimal | None = None, SCED1CurvePrice25To: Decimal | None = None, SCED1CurveMW26From: Decimal | None = None, SCED1CurveMW26To: Decimal | None = None, SCED1CurvePrice26From: Decimal | None = None, SCED1CurvePrice26To: Decimal | None = None, SCED1CurveMW27From: Decimal | None = None, SCED1CurveMW27To: Decimal | None = None, SCED1CurvePrice27From: Decimal | None = None, SCED1CurvePrice27To: Decimal | None = None, SCED1CurveMW28From: Decimal | None = None, SCED1CurveMW28To: Decimal | None = None, SCED1CurvePrice28From: Decimal | None = None, SCED1CurvePrice28To: Decimal | None = None, SCED1CurveMW29From: Decimal | None = None, SCED1CurveMW29To: Decimal | None = None, SCED1CurvePrice29From: Decimal | None = None, SCED1CurvePrice29To: Decimal | None = None, SCED1CurveMW30From: Decimal | None = None, SCED1CurveMW30To: Decimal | None = None, SCED1CurvePrice30From: Decimal | None = None, SCED1CurvePrice30To: Decimal | None = None, SCED1CurveMW31From: Decimal | None = None, SCED1CurveMW31To: Decimal | None = None, SCED1CurvePrice31From: Decimal | None = None, SCED1CurvePrice31To: Decimal | None = None, SCED1CurveMW32From: Decimal | None = None, SCED1CurveMW32To: Decimal | None = None, SCED1CurvePrice32From: Decimal | None = None, SCED1CurvePrice32To: Decimal | None = None, SCED1CurveMW33From: Decimal | None = None, SCED1CurveMW33To: Decimal | None = None, SCED1CurvePrice33From: Decimal | None = None, SCED1CurvePrice33To: Decimal | None = None, SCED1CurveMW34From: Decimal | None = None, SCED1CurveMW34To: Decimal | None = None, SCED1CurvePrice34From: Decimal | None = None, SCED1CurvePrice34To: Decimal | None = None, SCED1CurveMW35From: Decimal | None = None, SCED1CurveMW35To: Decimal | None = None, SCED1CurvePrice35From: Decimal | None = None, SCED1CurvePrice35To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60ScedGenResDataRow]:
'60-Day SCED Gen Resource Data'
@@ -3799,6 +6221,17 @@ class _60ScedSmneGenResRow(Row):
intervalValue: Decimal | None
resourceCode: str | None
+ class _60ScedSmneGenResHistoryRow(Row):
+ intervalTime: datetime | None
+ intervalNumber: int | None
+ resourceCode: str | None
+ intervalValue: Decimal | None
+
+ @property
+ def _60_sced_smne_gen_res_history(self) -> Archive[np3_965_er._60ScedSmneGenResHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-965-er', np3_965_er._60ScedSmneGenResHistoryRow, {'Interval Time': 'intervalTime', 'Interval Number': 'intervalNumber', 'Resource Code': 'resourceCode', 'Interval Value': 'intervalValue'}, {}, member='60d_SCED_SMNE_GEN_RES-[0-9]*.csv', datetimes={'intervalTime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _60_sced_smne_gen_res(self, *, intervalValueFrom: Decimal | None = None, intervalValueTo: Decimal | None = None, intervalTimeFrom: datetime | None = None, intervalTimeTo: datetime | None = None, intervalNumberFrom: int | None = None, intervalNumberTo: int | None = None, resourceCode: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_965_er._60ScedSmneGenResRow]:
'60-Day SCED Settlement Metered Net Energy for Generation Resources'
return self._client._page('/np3-965-er/60_sced_smne_gen_res', np3_965_er._60ScedSmneGenResRow, {'intervalValueFrom': intervalValueFrom, 'intervalValueTo': intervalValueTo, 'intervalTimeFrom': intervalTimeFrom, 'intervalTimeTo': intervalTimeTo, 'intervalNumberFrom': intervalNumberFrom, 'intervalNumberTo': intervalNumberTo, 'resourceCode': resourceCode, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3833,6 +6266,25 @@ class _60dDamAsOnlyAwardsRow(Row):
quantity5Award: Decimal | None
totalAward: Decimal | None
+ class _60dDamAsOnlyAwardsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ ASType: str | None
+ offerId: str | None
+ quantity1Award: Decimal | None
+ quantity2Award: Decimal | None
+ quantity3Award: Decimal | None
+ quantity4Award: Decimal | None
+ quantity5Award: Decimal | None
+ totalAward: Decimal | None
+ MCPC: Decimal | None
+
+ @property
+ def _60d_dam_as_only_awards_history(self) -> Archive[np3_966_er._60dDamAsOnlyAwardsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60dDamAsOnlyAwardsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'AS Type': 'ASType', 'Offer ID': 'offerId', 'Quantity1 Award': 'quantity1Award', 'Quantity2 Award': 'quantity2Award', 'Quantity3 Award': 'quantity3Award', 'Quantity4 Award': 'quantity4Award', 'Quantity5 Award': 'quantity5Award', 'Total Award': 'totalAward', 'MCPC': 'MCPC'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_AS_Only_Awards-*.csv', datetimes=None, variants=())
+
def _60d_dam_as_only_awards(self, *, quantity3AwardFrom: Decimal | None = None, quantity3AwardTo: Decimal | None = None, quantity4AwardFrom: Decimal | None = None, quantity4AwardTo: Decimal | None = None, quantity5AwardFrom: Decimal | None = None, quantity5AwardTo: Decimal | None = None, totalAwardFrom: Decimal | None = None, totalAwardTo: Decimal | None = None, MCPCFrom: Decimal | None = None, MCPCTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, ASType: str | None = None, offerId: str | None = None, quantity1AwardFrom: Decimal | None = None, quantity1AwardTo: Decimal | None = None, quantity2AwardFrom: Decimal | None = None, quantity2AwardTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60dDamAsOnlyAwardsRow]:
'60-Day DAM AS Only Awards'
return self._client._page('/np3-966-er/60d_dam_as_only_awards', np3_966_er._60dDamAsOnlyAwardsRow, {'quantity3AwardFrom': quantity3AwardFrom, 'quantity3AwardTo': quantity3AwardTo, 'quantity4AwardFrom': quantity4AwardFrom, 'quantity4AwardTo': quantity4AwardTo, 'quantity5AwardFrom': quantity5AwardFrom, 'quantity5AwardTo': quantity5AwardTo, 'totalAwardFrom': totalAwardFrom, 'totalAwardTo': totalAwardTo, 'MCPCFrom': MCPCFrom, 'MCPCTo': MCPCTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'ASType': ASType, 'offerId': offerId, 'quantity1AwardFrom': quantity1AwardFrom, 'quantity1AwardTo': quantity1AwardTo, 'quantity2AwardFrom': quantity2AwardFrom, 'quantity2AwardTo': quantity2AwardTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3865,6 +6317,28 @@ class _60dDamAsOnlyOffersRow(Row):
offerId: str | None
qseName: str | None
+ class _60dDamAsOnlyOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ offerId: str | None
+ ASType: str | None
+ ASOnlyOfferMW1: Decimal | None
+ ASOnlyOfferPrice1: Decimal | None
+ ASOnlyOfferMW2: Decimal | None
+ ASOnlyOfferPrice2: Decimal | None
+ ASOnlyOfferMW3: Decimal | None
+ ASOnlyOfferPrice3: Decimal | None
+ ASOnlyOfferMW4: Decimal | None
+ ASOnlyOfferPrice4: Decimal | None
+ ASOnlyOfferMW5: Decimal | None
+ ASOnlyOfferPrice5: Decimal | None
+
+ @property
+ def _60d_dam_as_only_offers_history(self) -> Archive[np3_966_er._60dDamAsOnlyOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60dDamAsOnlyOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'Offer ID': 'offerId', 'AS Type': 'ASType', 'AS Only Offer MW1': 'ASOnlyOfferMW1', 'AS Only Offer Price1': 'ASOnlyOfferPrice1', 'AS Only Offer MW2': 'ASOnlyOfferMW2', 'AS Only Offer Price2': 'ASOnlyOfferPrice2', 'AS Only Offer MW3': 'ASOnlyOfferMW3', 'AS Only Offer Price3': 'ASOnlyOfferPrice3', 'AS Only Offer MW4': 'ASOnlyOfferMW4', 'AS Only Offer Price4': 'ASOnlyOfferPrice4', 'AS Only Offer MW5': 'ASOnlyOfferMW5', 'AS Only Offer Price5': 'ASOnlyOfferPrice5'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_AS_Only_Offers-*.csv', datetimes=None, variants=())
+
def _60d_dam_as_only_offers(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, offerId: str | None = None, ASType: str | None = None, ASOnlyOfferMW1From: Decimal | None = None, ASOnlyOfferMW1To: Decimal | None = None, ASOnlyOfferPrice1From: Decimal | None = None, ASOnlyOfferPrice1To: Decimal | None = None, ASOnlyOfferMW2From: Decimal | None = None, ASOnlyOfferMW2To: Decimal | None = None, ASOnlyOfferPrice2From: Decimal | None = None, ASOnlyOfferPrice2To: Decimal | None = None, ASOnlyOfferMW3From: Decimal | None = None, ASOnlyOfferMW3To: Decimal | None = None, ASOnlyOfferPrice3From: Decimal | None = None, ASOnlyOfferPrice3To: Decimal | None = None, ASOnlyOfferMW4From: Decimal | None = None, ASOnlyOfferMW4To: Decimal | None = None, ASOnlyOfferPrice4From: Decimal | None = None, ASOnlyOfferPrice4To: Decimal | None = None, ASOnlyOfferMW5From: Decimal | None = None, ASOnlyOfferMW5To: Decimal | None = None, ASOnlyOfferPrice5From: Decimal | None = None, ASOnlyOfferPrice5To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60dDamAsOnlyOffersRow]:
'60-Day DAM AS Only Offers'
return self._client._page('/np3-966-er/60d_dam_as_only_offers', np3_966_er._60dDamAsOnlyOffersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'offerId': offerId, 'ASType': ASType, 'ASOnlyOfferMW1From': ASOnlyOfferMW1From, 'ASOnlyOfferMW1To': ASOnlyOfferMW1To, 'ASOnlyOfferPrice1From': ASOnlyOfferPrice1From, 'ASOnlyOfferPrice1To': ASOnlyOfferPrice1To, 'ASOnlyOfferMW2From': ASOnlyOfferMW2From, 'ASOnlyOfferMW2To': ASOnlyOfferMW2To, 'ASOnlyOfferPrice2From': ASOnlyOfferPrice2From, 'ASOnlyOfferPrice2To': ASOnlyOfferPrice2To, 'ASOnlyOfferMW3From': ASOnlyOfferMW3From, 'ASOnlyOfferMW3To': ASOnlyOfferMW3To, 'ASOnlyOfferPrice3From': ASOnlyOfferPrice3From, 'ASOnlyOfferPrice3To': ASOnlyOfferPrice3To, 'ASOnlyOfferMW4From': ASOnlyOfferMW4From, 'ASOnlyOfferMW4To': ASOnlyOfferMW4To, 'ASOnlyOfferPrice4From': ASOnlyOfferPrice4From, 'ASOnlyOfferPrice4To': ASOnlyOfferPrice4To, 'ASOnlyOfferMW5From': ASOnlyOfferMW5From, 'ASOnlyOfferMW5To': ASOnlyOfferMW5To, 'ASOnlyOfferPrice5From': ASOnlyOfferPrice5From, 'ASOnlyOfferPrice5To': ASOnlyOfferPrice5To, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3889,6 +6363,20 @@ class _60DamEnergyBidAwardsRow(Row):
settlementPointName: str | None
settlementPointPrice: Decimal | None
+ class _60DamEnergyBidAwardsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointName: str | None
+ qseName: str | None
+ energyOnlyBidAwardInMW: Decimal | None
+ settlementPointPrice: Decimal | None
+ bidId: str | None
+
+ @property
+ def _60_dam_energy_bid_awards_history(self) -> Archive[np3_966_er._60DamEnergyBidAwardsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamEnergyBidAwardsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point': 'settlementPointName', 'QSE Name': 'qseName', 'Energy Only Bid Award in MW': 'energyOnlyBidAwardInMW', 'Settlement Point Price': 'settlementPointPrice', 'Bid ID': 'bidId'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_EnergyBidAwards-*.csv', datetimes=None, variants=())
+
def _60_dam_energy_bid_awards(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointName: str | None = None, qseName: str | None = None, energyOnlyBidAwardInMWFrom: Decimal | None = None, energyOnlyBidAwardInMWTo: Decimal | None = None, settlementPointPriceFrom: Decimal | None = None, settlementPointPriceTo: Decimal | None = None, bidId: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamEnergyBidAwardsRow]:
'60-Day DAM Energy Bid Awards'
return self._client._page('/np3-966-er/60_dam_energy_bid_awards', np3_966_er._60DamEnergyBidAwardsRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointName': settlementPointName, 'qseName': qseName, 'energyOnlyBidAwardInMWFrom': energyOnlyBidAwardInMWFrom, 'energyOnlyBidAwardInMWTo': energyOnlyBidAwardInMWTo, 'settlementPointPriceFrom': settlementPointPriceFrom, 'settlementPointPriceTo': settlementPointPriceTo, 'bidId': bidId, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -3930,8 +6418,42 @@ class _60DamEnergyBidsRow(Row):
energyOnlyBidPrice9: Decimal | None
hourEnding: int | None
multiHourBlock: bool | None
- qseName: str | None
- settlementPointName: str | None
+ qseName: str | None
+ settlementPointName: str | None
+
+ class _60DamEnergyBidsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointName: str | None
+ qseName: str | None
+ energyOnlyBidMW1: Decimal | None
+ energyOnlyBidPrice1: Decimal | None
+ energyOnlyBidMW2: Decimal | None
+ energyOnlyBidPrice2: Decimal | None
+ energyOnlyBidMW3: Decimal | None
+ energyOnlyBidPrice3: Decimal | None
+ energyOnlyBidMW4: Decimal | None
+ energyOnlyBidPrice4: Decimal | None
+ energyOnlyBidMW5: Decimal | None
+ energyOnlyBidPrice5: Decimal | None
+ energyOnlyBidMW6: Decimal | None
+ energyOnlyBidPrice6: Decimal | None
+ energyOnlyBidMW7: Decimal | None
+ energyOnlyBidPrice7: Decimal | None
+ energyOnlyBidMW8: Decimal | None
+ energyOnlyBidPrice8: Decimal | None
+ energyOnlyBidMW9: Decimal | None
+ energyOnlyBidPrice9: Decimal | None
+ energyOnlyBidMW10: Decimal | None
+ energyOnlyBidPrice10: Decimal | None
+ bidId: str | None
+ multiHourBlock: bool | None
+ blockCurve: str | None
+
+ @property
+ def _60_dam_energy_bids_history(self) -> Archive[np3_966_er._60DamEnergyBidsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamEnergyBidsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point': 'settlementPointName', 'QSE Name': 'qseName', 'Energy Only Bid MW1': 'energyOnlyBidMW1', 'Energy Only Bid Price1': 'energyOnlyBidPrice1', 'Energy Only Bid MW2': 'energyOnlyBidMW2', 'Energy Only Bid Price2': 'energyOnlyBidPrice2', 'Energy Only Bid MW3': 'energyOnlyBidMW3', 'Energy Only Bid Price3': 'energyOnlyBidPrice3', 'Energy Only Bid MW4': 'energyOnlyBidMW4', 'Energy Only Bid Price4': 'energyOnlyBidPrice4', 'Energy Only Bid MW5': 'energyOnlyBidMW5', 'Energy Only Bid Price5': 'energyOnlyBidPrice5', 'Energy Only Bid MW6': 'energyOnlyBidMW6', 'Energy Only Bid Price6': 'energyOnlyBidPrice6', 'Energy Only Bid MW7': 'energyOnlyBidMW7', 'Energy Only Bid Price7': 'energyOnlyBidPrice7', 'Energy Only Bid MW8': 'energyOnlyBidMW8', 'Energy Only Bid Price8': 'energyOnlyBidPrice8', 'Energy Only Bid MW9': 'energyOnlyBidMW9', 'Energy Only Bid Price9': 'energyOnlyBidPrice9', 'Energy Only Bid MW10': 'energyOnlyBidMW10', 'Energy Only Bid Price10': 'energyOnlyBidPrice10', 'Energy Only Bid ID': 'bidId', 'Multi-Hour Block Indicator': 'multiHourBlock', 'Block/Curve indicator': 'blockCurve'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_EnergyBids-*.csv', datetimes=None, variants=())
def _60_dam_energy_bids(self, *, energyOnlyBidMW1From: Decimal | None = None, energyOnlyBidMW1To: Decimal | None = None, energyOnlyBidPrice1From: Decimal | None = None, energyOnlyBidPrice1To: Decimal | None = None, energyOnlyBidMW2From: Decimal | None = None, energyOnlyBidMW2To: Decimal | None = None, energyOnlyBidPrice2From: Decimal | None = None, energyOnlyBidPrice2To: Decimal | None = None, energyOnlyBidMW3From: Decimal | None = None, energyOnlyBidMW3To: Decimal | None = None, energyOnlyBidPrice3From: Decimal | None = None, energyOnlyBidPrice3To: Decimal | None = None, energyOnlyBidMW4From: Decimal | None = None, energyOnlyBidMW4To: Decimal | None = None, energyOnlyBidPrice4From: Decimal | None = None, energyOnlyBidPrice4To: Decimal | None = None, energyOnlyBidMW5From: Decimal | None = None, energyOnlyBidMW5To: Decimal | None = None, energyOnlyBidPrice5From: Decimal | None = None, energyOnlyBidPrice5To: Decimal | None = None, energyOnlyBidMW6From: Decimal | None = None, energyOnlyBidMW6To: Decimal | None = None, energyOnlyBidPrice6From: Decimal | None = None, energyOnlyBidPrice6To: Decimal | None = None, energyOnlyBidMW7From: Decimal | None = None, energyOnlyBidMW7To: Decimal | None = None, energyOnlyBidPrice7From: Decimal | None = None, energyOnlyBidPrice7To: Decimal | None = None, energyOnlyBidMW8From: Decimal | None = None, energyOnlyBidMW8To: Decimal | None = None, energyOnlyBidPrice8From: Decimal | None = None, energyOnlyBidPrice8To: Decimal | None = None, energyOnlyBidMW9From: Decimal | None = None, energyOnlyBidMW9To: Decimal | None = None, energyOnlyBidPrice9From: Decimal | None = None, energyOnlyBidPrice9To: Decimal | None = None, energyOnlyBidMW10From: Decimal | None = None, energyOnlyBidMW10To: Decimal | None = None, energyOnlyBidPrice10From: Decimal | None = None, energyOnlyBidPrice10To: Decimal | None = None, bidIdFrom: Decimal | None = None, bidIdTo: Decimal | None = None, multiHourBlock: bool | None = None, blockCurve: str | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointName: str | None = None, qseName: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamEnergyBidsRow]:
'60-Day DAM Energy Bids'
@@ -3957,6 +6479,20 @@ class _60DamEnergyOnlyOfferAwardsRow(Row):
settlementPointName: str | None
settlementPointPrice: Decimal | None
+ class _60DamEnergyOnlyOfferAwardsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointName: str | None
+ qseName: str | None
+ energyOnlyOfferAwardInMW: Decimal | None
+ settlementPointPrice: Decimal | None
+ offerId: str | None
+
+ @property
+ def _60_dam_energy_only_offer_awards_history(self) -> Archive[np3_966_er._60DamEnergyOnlyOfferAwardsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamEnergyOnlyOfferAwardsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point': 'settlementPointName', 'QSE Name': 'qseName', 'Energy Only Offer Award in MW': 'energyOnlyOfferAwardInMW', 'Settlement Point Price': 'settlementPointPrice', 'Offer ID': 'offerId'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_EnergyOnlyOfferAwards-*.csv', datetimes=None, variants=())
+
def _60_dam_energy_only_offer_awards(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointName: str | None = None, qseName: str | None = None, energyOnlyOfferAwardInMWFrom: Decimal | None = None, energyOnlyOfferAwardInMWTo: Decimal | None = None, settlementPointPriceFrom: Decimal | None = None, settlementPointPriceTo: Decimal | None = None, offerId: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamEnergyOnlyOfferAwardsRow]:
'60-Day DAM Energy Offer Only Awards'
return self._client._page('/np3-966-er/60_dam_energy_only_offer_awards', np3_966_er._60DamEnergyOnlyOfferAwardsRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointName': settlementPointName, 'qseName': qseName, 'energyOnlyOfferAwardInMWFrom': energyOnlyOfferAwardInMWFrom, 'energyOnlyOfferAwardInMWTo': energyOnlyOfferAwardInMWTo, 'settlementPointPriceFrom': settlementPointPriceFrom, 'settlementPointPriceTo': settlementPointPriceTo, 'offerId': offerId, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4001,6 +6537,40 @@ class _60DamEnergyOnlyOffersRow(Row):
qseName: str | None
settlementPointName: str | None
+ class _60DamEnergyOnlyOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ settlementPointName: str | None
+ qseName: str | None
+ energyOnlyOfferMW1: Decimal | None
+ energyOnlyOfferPrice1: Decimal | None
+ energyOnlyOfferMW2: Decimal | None
+ energyOnlyOfferPrice2: Decimal | None
+ energyOnlyOfferMW3: Decimal | None
+ energyOnlyOfferPrice3: Decimal | None
+ energyOnlyOfferMW4: Decimal | None
+ energyOnlyOfferPrice4: Decimal | None
+ energyOnlyOfferMW5: Decimal | None
+ energyOnlyOfferPrice5: Decimal | None
+ energyOnlyOfferMW6: Decimal | None
+ energyOnlyOfferPrice6: Decimal | None
+ energyOnlyOfferMW7: Decimal | None
+ energyOnlyOfferPrice7: Decimal | None
+ energyOnlyOfferMW8: Decimal | None
+ energyOnlyOfferPrice8: Decimal | None
+ energyOnlyOfferMW9: Decimal | None
+ energyOnlyOfferPrice9: Decimal | None
+ energyOnlyOfferMW10: Decimal | None
+ energyOnlyOfferPrice10: Decimal | None
+ offerId: str | None
+ multiHourBlock: bool | None
+ blockCurve: str | None
+
+ @property
+ def _60_dam_energy_only_offers_history(self) -> Archive[np3_966_er._60DamEnergyOnlyOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamEnergyOnlyOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Settlement Point': 'settlementPointName', 'QSE Name': 'qseName', 'Energy Only Offer MW1': 'energyOnlyOfferMW1', 'Energy Only Offer Price1': 'energyOnlyOfferPrice1', 'Energy Only Offer MW2': 'energyOnlyOfferMW2', 'Energy Only Offer Price2': 'energyOnlyOfferPrice2', 'Energy Only Offer MW3': 'energyOnlyOfferMW3', 'Energy Only Offer Price3': 'energyOnlyOfferPrice3', 'Energy Only Offer MW4': 'energyOnlyOfferMW4', 'Energy Only Offer Price4': 'energyOnlyOfferPrice4', 'Energy Only Offer MW5': 'energyOnlyOfferMW5', 'Energy Only Offer Price5': 'energyOnlyOfferPrice5', 'Energy Only Offer MW6': 'energyOnlyOfferMW6', 'Energy Only Offer Price6': 'energyOnlyOfferPrice6', 'Energy Only Offer MW7': 'energyOnlyOfferMW7', 'Energy Only Offer Price7': 'energyOnlyOfferPrice7', 'Energy Only Offer MW8': 'energyOnlyOfferMW8', 'Energy Only Offer Price8': 'energyOnlyOfferPrice8', 'Energy Only Offer MW9': 'energyOnlyOfferMW9', 'Energy Only Offer Price9': 'energyOnlyOfferPrice9', 'Energy Only Offer MW10': 'energyOnlyOfferMW10', 'Energy Only Offer Price10': 'energyOnlyOfferPrice10', 'Energy Only Offer ID': 'offerId', 'Multi-Hour Block Indicator': 'multiHourBlock', 'Block/Curve indicator': 'blockCurve'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_EnergyOnlyOffers-*.csv', datetimes=None, variants=())
+
def _60_dam_energy_only_offers(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, settlementPointName: str | None = None, qseName: str | None = None, energyOnlyOfferMW1From: Decimal | None = None, energyOnlyOfferMW1To: Decimal | None = None, energyOnlyOfferPrice1From: Decimal | None = None, energyOnlyOfferPrice1To: Decimal | None = None, energyOnlyOfferMW2From: Decimal | None = None, energyOnlyOfferMW2To: Decimal | None = None, energyOnlyOfferPrice2From: Decimal | None = None, energyOnlyOfferPrice2To: Decimal | None = None, energyOnlyOfferMW3From: Decimal | None = None, energyOnlyOfferMW3To: Decimal | None = None, energyOnlyOfferPrice3From: Decimal | None = None, energyOnlyOfferPrice3To: Decimal | None = None, energyOnlyOfferMW4From: Decimal | None = None, energyOnlyOfferMW4To: Decimal | None = None, energyOnlyOfferPrice4From: Decimal | None = None, energyOnlyOfferPrice4To: Decimal | None = None, energyOnlyOfferMW5From: Decimal | None = None, energyOnlyOfferMW5To: Decimal | None = None, energyOnlyOfferPrice5From: Decimal | None = None, energyOnlyOfferPrice5To: Decimal | None = None, energyOnlyOfferMW6From: Decimal | None = None, energyOnlyOfferMW6To: Decimal | None = None, energyOnlyOfferPrice6From: Decimal | None = None, energyOnlyOfferPrice6To: Decimal | None = None, energyOnlyOfferMW7From: Decimal | None = None, energyOnlyOfferMW7To: Decimal | None = None, energyOnlyOfferPrice7From: Decimal | None = None, energyOnlyOfferPrice7To: Decimal | None = None, energyOnlyOfferMW8From: Decimal | None = None, energyOnlyOfferMW8To: Decimal | None = None, energyOnlyOfferPrice8From: Decimal | None = None, energyOnlyOfferPrice8To: Decimal | None = None, energyOnlyOfferMW9From: Decimal | None = None, energyOnlyOfferMW9To: Decimal | None = None, energyOnlyOfferPrice9From: Decimal | None = None, energyOnlyOfferPrice9To: Decimal | None = None, energyOnlyOfferMW10From: Decimal | None = None, energyOnlyOfferMW10To: Decimal | None = None, energyOnlyOfferPrice10From: Decimal | None = None, energyOnlyOfferPrice10To: Decimal | None = None, offerIdFrom: Decimal | None = None, offerIdTo: Decimal | None = None, multiHourBlock: bool | None = None, blockCurve: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamEnergyOnlyOffersRow]:
'60-Day DAM Energy Only Offers'
return self._client._page('/np3-966-er/60_dam_energy_only_offers', np3_966_er._60DamEnergyOnlyOffersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'settlementPointName': settlementPointName, 'qseName': qseName, 'energyOnlyOfferMW1From': energyOnlyOfferMW1From, 'energyOnlyOfferMW1To': energyOnlyOfferMW1To, 'energyOnlyOfferPrice1From': energyOnlyOfferPrice1From, 'energyOnlyOfferPrice1To': energyOnlyOfferPrice1To, 'energyOnlyOfferMW2From': energyOnlyOfferMW2From, 'energyOnlyOfferMW2To': energyOnlyOfferMW2To, 'energyOnlyOfferPrice2From': energyOnlyOfferPrice2From, 'energyOnlyOfferPrice2To': energyOnlyOfferPrice2To, 'energyOnlyOfferMW3From': energyOnlyOfferMW3From, 'energyOnlyOfferMW3To': energyOnlyOfferMW3To, 'energyOnlyOfferPrice3From': energyOnlyOfferPrice3From, 'energyOnlyOfferPrice3To': energyOnlyOfferPrice3To, 'energyOnlyOfferMW4From': energyOnlyOfferMW4From, 'energyOnlyOfferMW4To': energyOnlyOfferMW4To, 'energyOnlyOfferPrice4From': energyOnlyOfferPrice4From, 'energyOnlyOfferPrice4To': energyOnlyOfferPrice4To, 'energyOnlyOfferMW5From': energyOnlyOfferMW5From, 'energyOnlyOfferMW5To': energyOnlyOfferMW5To, 'energyOnlyOfferPrice5From': energyOnlyOfferPrice5From, 'energyOnlyOfferPrice5To': energyOnlyOfferPrice5To, 'energyOnlyOfferMW6From': energyOnlyOfferMW6From, 'energyOnlyOfferMW6To': energyOnlyOfferMW6To, 'energyOnlyOfferPrice6From': energyOnlyOfferPrice6From, 'energyOnlyOfferPrice6To': energyOnlyOfferPrice6To, 'energyOnlyOfferMW7From': energyOnlyOfferMW7From, 'energyOnlyOfferMW7To': energyOnlyOfferMW7To, 'energyOnlyOfferPrice7From': energyOnlyOfferPrice7From, 'energyOnlyOfferPrice7To': energyOnlyOfferPrice7To, 'energyOnlyOfferMW8From': energyOnlyOfferMW8From, 'energyOnlyOfferMW8To': energyOnlyOfferMW8To, 'energyOnlyOfferPrice8From': energyOnlyOfferPrice8From, 'energyOnlyOfferPrice8To': energyOnlyOfferPrice8To, 'energyOnlyOfferMW9From': energyOnlyOfferMW9From, 'energyOnlyOfferMW9To': energyOnlyOfferMW9To, 'energyOnlyOfferPrice9From': energyOnlyOfferPrice9From, 'energyOnlyOfferPrice9To': energyOnlyOfferPrice9To, 'energyOnlyOfferMW10From': energyOnlyOfferMW10From, 'energyOnlyOfferMW10To': energyOnlyOfferMW10To, 'energyOnlyOfferPrice10From': energyOnlyOfferPrice10From, 'energyOnlyOfferPrice10To': energyOnlyOfferPrice10To, 'offerIdFrom': offerIdFrom, 'offerIdTo': offerIdTo, 'multiHourBlock': multiHourBlock, 'blockCurve': blockCurve, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4079,6 +6649,74 @@ class _60dDamEsrAsOffersRow(Row):
quantityMW5: Decimal | None
resourceName: str | None
+ class _60dDamEsrAsOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ dmeName: str | None
+ resourceName: str | None
+ multiHourBlock: bool | None
+ blockIndicator1: str | None
+ price1RRSPFR: Decimal | None
+ price1RRSFFR: Decimal | None
+ price1RRSUFR: Decimal | None
+ price1ECRS: Decimal | None
+ price1OFFEC: Decimal | None
+ price1OnlineNSPIN: Decimal | None
+ price1REGUP: Decimal | None
+ price1REGDN: Decimal | None
+ price1OfflineNSPIN: Decimal | None
+ quantityMW1: Decimal | None
+ blockIndicator2: str | None
+ price2RRSPFR: Decimal | None
+ price2RRSFFR: Decimal | None
+ price2RRSUFR: Decimal | None
+ price2ECRS: Decimal | None
+ price2OFFEC: Decimal | None
+ price2OnlineNSPIN: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDN: Decimal | None
+ price2OfflineNSPIN: Decimal | None
+ quantityMW2: Decimal | None
+ blockIndicator3: str | None
+ price3RRSPFR: Decimal | None
+ price3RRSFFR: Decimal | None
+ price3RRSUFR: Decimal | None
+ price3ECRS: Decimal | None
+ price3OFFEC: Decimal | None
+ price3OnlineNSPIN: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDN: Decimal | None
+ price3OfflineNSPIN: Decimal | None
+ quantityMW3: Decimal | None
+ blockIndicator4: str | None
+ price4RRSPFR: Decimal | None
+ price4RRSFFR: Decimal | None
+ price4RRSUFR: Decimal | None
+ price4ECRS: Decimal | None
+ price4OFFEC: Decimal | None
+ price4OnlineNSPIN: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDN: Decimal | None
+ price4OfflineNSPIN: Decimal | None
+ quantityMW4: Decimal | None
+ blockIndicator5: str | None
+ price5RRSPFR: Decimal | None
+ price5RRSFFR: Decimal | None
+ price5RRSUFR: Decimal | None
+ price5ECRS: Decimal | None
+ price5OFFEC: Decimal | None
+ price5OnlineNSPIN: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDN: Decimal | None
+ price5OfflineNSPIN: Decimal | None
+ quantityMW5: Decimal | None
+
+ @property
+ def _60d_dam_esr_as_offers_history(self) -> Archive[np3_966_er._60dDamEsrAsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60dDamEsrAsOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Multi-Hour Block Flag': 'multiHourBlock', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRSPFR': 'price1RRSPFR', 'PRICE1 RRSFFR': 'price1RRSFFR', 'PRICE1 RRSUFR': 'price1RRSUFR', 'PRICE1 ECRS': 'price1ECRS', 'PRICE1 OFFEC': 'price1OFFEC', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRSPFR': 'price2RRSPFR', 'PRICE2 RRSFFR': 'price2RRSFFR', 'PRICE2 RRSUFR': 'price2RRSUFR', 'PRICE2 ECRS': 'price2ECRS', 'PRICE2 OFFEC': 'price2OFFEC', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRSPFR': 'price3RRSPFR', 'PRICE3 RRSFFR': 'price3RRSFFR', 'PRICE3 RRSUFR': 'price3RRSUFR', 'PRICE3 ECRS': 'price3ECRS', 'PRICE3 OFFEC': 'price3OFFEC', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRSPFR': 'price4RRSPFR', 'PRICE4 RRSFFR': 'price4RRSFFR', 'PRICE4 RRSUFR': 'price4RRSUFR', 'PRICE4 ECRS': 'price4ECRS', 'PRICE4 OFFEC': 'price4OFFEC', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRSPFR': 'price5RRSPFR', 'PRICE5 RRSFFR': 'price5RRSFFR', 'PRICE5 RRSUFR': 'price5RRSUFR', 'PRICE5 ECRS': 'price5ECRS', 'PRICE5 OFFEC': 'price5OFFEC', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNSPIN', 'QUANTITY MW5': 'quantityMW5'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_ESR_ASOffers-*.csv', datetimes=None, variants=())
+
def _60d_dam_esr_as_offers(self, *, blockIndicator3: str | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, price3OFFECFrom: Decimal | None = None, price3OFFECTo: Decimal | None = None, price3OnlineNSPINFrom: Decimal | None = None, price3OnlineNSPINTo: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDNFrom: Decimal | None = None, price3REGDNTo: Decimal | None = None, price3OfflineNSPINFrom: Decimal | None = None, price3OfflineNSPINTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, blockIndicator4: str | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, price4OFFECFrom: Decimal | None = None, price4OFFECTo: Decimal | None = None, price4OnlineNSPINFrom: Decimal | None = None, price4OnlineNSPINTo: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDNFrom: Decimal | None = None, price4REGDNTo: Decimal | None = None, price4OfflineNSPINFrom: Decimal | None = None, price4OfflineNSPINTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, blockIndicator5: str | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, price5OFFECFrom: Decimal | None = None, price5OFFECTo: Decimal | None = None, price5OnlineNSPINFrom: Decimal | None = None, price5OnlineNSPINTo: Decimal | None = None, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDNFrom: Decimal | None = None, price5REGDNTo: Decimal | None = None, price5OfflineNSPINFrom: Decimal | None = None, price5OfflineNSPINTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, multiHourBlock: bool | None = None, blockIndicator1: str | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, price1OFFECFrom: Decimal | None = None, price1OFFECTo: Decimal | None = None, price1OnlineNSPINFrom: Decimal | None = None, price1OnlineNSPINTo: Decimal | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDNFrom: Decimal | None = None, price1REGDNTo: Decimal | None = None, price1OfflineNSPINFrom: Decimal | None = None, price1OfflineNSPINTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, blockIndicator2: str | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, price2OFFECFrom: Decimal | None = None, price2OFFECTo: Decimal | None = None, price2OnlineNSPINFrom: Decimal | None = None, price2OnlineNSPINTo: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDNFrom: Decimal | None = None, price2REGDNTo: Decimal | None = None, price2OfflineNSPINFrom: Decimal | None = None, price2OfflineNSPINTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60dDamEsrAsOffersRow]:
'60-Day DAM ESR AS Offers'
return self._client._page('/np3-966-er/60d_dam_esr_as_offers', np3_966_er._60dDamEsrAsOffersRow, {'blockIndicator3': blockIndicator3, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'price3OFFECFrom': price3OFFECFrom, 'price3OFFECTo': price3OFFECTo, 'price3OnlineNSPINFrom': price3OnlineNSPINFrom, 'price3OnlineNSPINTo': price3OnlineNSPINTo, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDNFrom': price3REGDNFrom, 'price3REGDNTo': price3REGDNTo, 'price3OfflineNSPINFrom': price3OfflineNSPINFrom, 'price3OfflineNSPINTo': price3OfflineNSPINTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'blockIndicator4': blockIndicator4, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'price4OFFECFrom': price4OFFECFrom, 'price4OFFECTo': price4OFFECTo, 'price4OnlineNSPINFrom': price4OnlineNSPINFrom, 'price4OnlineNSPINTo': price4OnlineNSPINTo, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDNFrom': price4REGDNFrom, 'price4REGDNTo': price4REGDNTo, 'price4OfflineNSPINFrom': price4OfflineNSPINFrom, 'price4OfflineNSPINTo': price4OfflineNSPINTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'blockIndicator5': blockIndicator5, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'price5OFFECFrom': price5OFFECFrom, 'price5OFFECTo': price5OFFECTo, 'price5OnlineNSPINFrom': price5OnlineNSPINFrom, 'price5OnlineNSPINTo': price5OnlineNSPINTo, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDNFrom': price5REGDNFrom, 'price5REGDNTo': price5REGDNTo, 'price5OfflineNSPINFrom': price5OfflineNSPINFrom, 'price5OfflineNSPINTo': price5OfflineNSPINTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'multiHourBlock': multiHourBlock, 'blockIndicator1': blockIndicator1, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'price1OFFECFrom': price1OFFECFrom, 'price1OFFECTo': price1OFFECTo, 'price1OnlineNSPINFrom': price1OnlineNSPINFrom, 'price1OnlineNSPINTo': price1OnlineNSPINTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDNFrom': price1REGDNFrom, 'price1REGDNTo': price1REGDNTo, 'price1OfflineNSPINFrom': price1OfflineNSPINFrom, 'price1OfflineNSPINTo': price1OfflineNSPINTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'blockIndicator2': blockIndicator2, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'price2OFFECFrom': price2OFFECFrom, 'price2OFFECTo': price2OFFECTo, 'price2OnlineNSPINFrom': price2OnlineNSPINFrom, 'price2OnlineNSPINTo': price2OnlineNSPINTo, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDNFrom': price2REGDNFrom, 'price2REGDNTo': price2REGDNTo, 'price2OfflineNSPINFrom': price2OfflineNSPINFrom, 'price2OfflineNSPINTo': price2OfflineNSPINTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4144,6 +6782,61 @@ class _60dDamEsrDataRow(Row):
startUpHot: Decimal | None
startUpInter: Decimal | None
+ class _60dDamEsrDataHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ dmeName: str | None
+ resourceName: str | None
+ resourceType: str | None
+ qseSubmittedCurveMW1: Decimal | None
+ qseSubmittedCurvePrice1: Decimal | None
+ qseSubmittedCurveMW2: Decimal | None
+ qseSubmittedCurvePrice2: Decimal | None
+ qseSubmittedCurveMW3: Decimal | None
+ qseSubmittedCurvePrice3: Decimal | None
+ qseSubmittedCurveMW4: Decimal | None
+ qseSubmittedCurvePrice4: Decimal | None
+ qseSubmittedCurveMW5: Decimal | None
+ qseSubmittedCurvePrice5: Decimal | None
+ qseSubmittedCurveMW6: Decimal | None
+ qseSubmittedCurvePrice6: Decimal | None
+ qseSubmittedCurveMW7: Decimal | None
+ qseSubmittedCurvePrice7: Decimal | None
+ qseSubmittedCurveMW8: Decimal | None
+ qseSubmittedCurvePrice8: Decimal | None
+ qseSubmittedCurveMW9: Decimal | None
+ qseSubmittedCurvePrice9: Decimal | None
+ qseSubmittedCurveMW10: Decimal | None
+ qseSubmittedCurvePrice10: Decimal | None
+ startUpHot: Decimal | None
+ startUpInter: Decimal | None
+ startUpCold: Decimal | None
+ minGenCost: Decimal | None
+ HSL: Decimal | None
+ LSL: Decimal | None
+ resourceStatus: str | None
+ awardedQuantity: Decimal | None
+ settlementPointName: str | None
+ energySettlementPointPrice: Decimal | None
+ REGUPAwarded: Decimal | None
+ REGUPMCPC: Decimal | None
+ REGDNAwarded: Decimal | None
+ REGDNMCPC: Decimal | None
+ RRSPFRAwarded: Decimal | None
+ RRSFFRAwarded: Decimal | None
+ RRSUFRAwarded: Decimal | None
+ RRSMCPC: Decimal | None
+ ECRSSDAwarded: Decimal | None
+ ECRSMCPC: Decimal | None
+ NSPINAwarded: Decimal | None
+ NSPINMCPC: Decimal | None
+
+ @property
+ def _60d_dam_esr_data_history(self) -> Archive[np3_966_er._60dDamEsrDataHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60dDamEsrDataHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'QSE submitted Curve-MW1': 'qseSubmittedCurveMW1', 'QSE submitted Curve-Price1': 'qseSubmittedCurvePrice1', 'QSE submitted Curve-MW2': 'qseSubmittedCurveMW2', 'QSE submitted Curve-Price2': 'qseSubmittedCurvePrice2', 'QSE submitted Curve-MW3': 'qseSubmittedCurveMW3', 'QSE submitted Curve-Price3': 'qseSubmittedCurvePrice3', 'QSE submitted Curve-MW4': 'qseSubmittedCurveMW4', 'QSE submitted Curve-Price4': 'qseSubmittedCurvePrice4', 'QSE submitted Curve-MW5': 'qseSubmittedCurveMW5', 'QSE submitted Curve-Price5': 'qseSubmittedCurvePrice5', 'QSE submitted Curve-MW6': 'qseSubmittedCurveMW6', 'QSE submitted Curve-Price6': 'qseSubmittedCurvePrice6', 'QSE submitted Curve-MW7': 'qseSubmittedCurveMW7', 'QSE submitted Curve-Price7': 'qseSubmittedCurvePrice7', 'QSE submitted Curve-MW8': 'qseSubmittedCurveMW8', 'QSE submitted Curve-Price8': 'qseSubmittedCurvePrice8', 'QSE submitted Curve-MW9': 'qseSubmittedCurveMW9', 'QSE submitted Curve-Price9': 'qseSubmittedCurvePrice9', 'QSE submitted Curve-MW10': 'qseSubmittedCurveMW10', 'QSE submitted Curve-Price10': 'qseSubmittedCurvePrice10', 'Start Up Hot': 'startUpHot', 'Start Up Inter': 'startUpInter', 'Start Up Cold': 'startUpCold', 'Min Gen Cost': 'minGenCost', 'HSL': 'HSL', 'LSL': 'LSL', 'Resource Status': 'resourceStatus', 'Awarded Quantity': 'awardedQuantity', 'Settlement Point Name': 'settlementPointName', 'Energy Settlement Point Price': 'energySettlementPointPrice', 'RegUp Awarded': 'REGUPAwarded', 'RegUp MCPC': 'REGUPMCPC', 'RegDown Awarded': 'REGDNAwarded', 'RegDown MCPC': 'REGDNMCPC', 'RRSPFR Awarded': 'RRSPFRAwarded', 'RRSFFR Awarded': 'RRSFFRAwarded', 'RRSUFR Awarded': 'RRSUFRAwarded', 'RRS MCPC': 'RRSMCPC', 'ECRSSD Awarded': 'ECRSSDAwarded', 'ECRS MCPC': 'ECRSMCPC', 'NonSpin Awarded': 'NSPINAwarded', 'NonSpin MCPC': 'NSPINMCPC'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_ESR_Data-*.csv', datetimes=None, variants=())
+
def _60d_dam_esr_data(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, qseSubmittedCurveMW1From: Decimal | None = None, qseSubmittedCurveMW1To: Decimal | None = None, qseSubmittedCurvePrice1From: Decimal | None = None, qseSubmittedCurvePrice1To: Decimal | None = None, qseSubmittedCurveMW2From: Decimal | None = None, qseSubmittedCurveMW2To: Decimal | None = None, qseSubmittedCurvePrice2From: Decimal | None = None, qseSubmittedCurvePrice2To: Decimal | None = None, qseSubmittedCurveMW3From: Decimal | None = None, qseSubmittedCurveMW3To: Decimal | None = None, qseSubmittedCurvePrice3From: Decimal | None = None, qseSubmittedCurvePrice3To: Decimal | None = None, qseSubmittedCurveMW4From: Decimal | None = None, qseSubmittedCurveMW4To: Decimal | None = None, qseSubmittedCurvePrice4From: Decimal | None = None, qseSubmittedCurvePrice4To: Decimal | None = None, qseSubmittedCurveMW5From: Decimal | None = None, qseSubmittedCurveMW5To: Decimal | None = None, qseSubmittedCurvePrice5From: Decimal | None = None, qseSubmittedCurvePrice5To: Decimal | None = None, qseSubmittedCurveMW6From: Decimal | None = None, qseSubmittedCurveMW6To: Decimal | None = None, qseSubmittedCurvePrice6From: Decimal | None = None, qseSubmittedCurvePrice6To: Decimal | None = None, qseSubmittedCurveMW7From: Decimal | None = None, qseSubmittedCurveMW7To: Decimal | None = None, qseSubmittedCurvePrice7From: Decimal | None = None, qseSubmittedCurvePrice7To: Decimal | None = None, qseSubmittedCurveMW8From: Decimal | None = None, qseSubmittedCurveMW8To: Decimal | None = None, qseSubmittedCurvePrice8From: Decimal | None = None, qseSubmittedCurvePrice8To: Decimal | None = None, qseSubmittedCurveMW9From: Decimal | None = None, qseSubmittedCurveMW9To: Decimal | None = None, qseSubmittedCurvePrice9From: Decimal | None = None, qseSubmittedCurvePrice9To: Decimal | None = None, qseSubmittedCurveMW10From: Decimal | None = None, qseSubmittedCurveMW10To: Decimal | None = None, qseSubmittedCurvePrice10From: Decimal | None = None, qseSubmittedCurvePrice10To: Decimal | None = None, startUpHotFrom: Decimal | None = None, startUpHotTo: Decimal | None = None, startUpInterFrom: Decimal | None = None, startUpInterTo: Decimal | None = None, startUpColdFrom: Decimal | None = None, startUpColdTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, resourceStatus: str | None = None, awardedQuantityFrom: Decimal | None = None, awardedQuantityTo: Decimal | None = None, settlementPointName: str | None = None, energySettlementPointPriceFrom: Decimal | None = None, energySettlementPointPriceTo: Decimal | None = None, REGUPAwardedFrom: Decimal | None = None, REGUPAwardedTo: Decimal | None = None, REGUPMCPCFrom: Decimal | None = None, REGUPMCPCTo: Decimal | None = None, REGDNAwardedFrom: Decimal | None = None, REGDNAwardedTo: Decimal | None = None, REGDNMCPCFrom: Decimal | None = None, REGDNMCPCTo: Decimal | None = None, RRSPFRAwardedFrom: Decimal | None = None, RRSPFRAwardedTo: Decimal | None = None, RRSFFRAwardedFrom: Decimal | None = None, RRSFFRAwardedTo: Decimal | None = None, RRSUFRAwardedFrom: Decimal | None = None, RRSUFRAwardedTo: Decimal | None = None, RRSMCPCFrom: Decimal | None = None, RRSMCPCTo: Decimal | None = None, ECRSSDAwardedFrom: Decimal | None = None, ECRSSDAwardedTo: Decimal | None = None, ECRSMCPCFrom: Decimal | None = None, ECRSMCPCTo: Decimal | None = None, NSPINAwardedFrom: Decimal | None = None, NSPINAwardedTo: Decimal | None = None, NSPINMCPCFrom: Decimal | None = None, NSPINMCPCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60dDamEsrDataRow]:
'60-Day DAM ESR Data'
return self._client._page('/np3-966-er/60d_dam_esr_data', np3_966_er._60dDamEsrDataRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'qseSubmittedCurveMW1From': qseSubmittedCurveMW1From, 'qseSubmittedCurveMW1To': qseSubmittedCurveMW1To, 'qseSubmittedCurvePrice1From': qseSubmittedCurvePrice1From, 'qseSubmittedCurvePrice1To': qseSubmittedCurvePrice1To, 'qseSubmittedCurveMW2From': qseSubmittedCurveMW2From, 'qseSubmittedCurveMW2To': qseSubmittedCurveMW2To, 'qseSubmittedCurvePrice2From': qseSubmittedCurvePrice2From, 'qseSubmittedCurvePrice2To': qseSubmittedCurvePrice2To, 'qseSubmittedCurveMW3From': qseSubmittedCurveMW3From, 'qseSubmittedCurveMW3To': qseSubmittedCurveMW3To, 'qseSubmittedCurvePrice3From': qseSubmittedCurvePrice3From, 'qseSubmittedCurvePrice3To': qseSubmittedCurvePrice3To, 'qseSubmittedCurveMW4From': qseSubmittedCurveMW4From, 'qseSubmittedCurveMW4To': qseSubmittedCurveMW4To, 'qseSubmittedCurvePrice4From': qseSubmittedCurvePrice4From, 'qseSubmittedCurvePrice4To': qseSubmittedCurvePrice4To, 'qseSubmittedCurveMW5From': qseSubmittedCurveMW5From, 'qseSubmittedCurveMW5To': qseSubmittedCurveMW5To, 'qseSubmittedCurvePrice5From': qseSubmittedCurvePrice5From, 'qseSubmittedCurvePrice5To': qseSubmittedCurvePrice5To, 'qseSubmittedCurveMW6From': qseSubmittedCurveMW6From, 'qseSubmittedCurveMW6To': qseSubmittedCurveMW6To, 'qseSubmittedCurvePrice6From': qseSubmittedCurvePrice6From, 'qseSubmittedCurvePrice6To': qseSubmittedCurvePrice6To, 'qseSubmittedCurveMW7From': qseSubmittedCurveMW7From, 'qseSubmittedCurveMW7To': qseSubmittedCurveMW7To, 'qseSubmittedCurvePrice7From': qseSubmittedCurvePrice7From, 'qseSubmittedCurvePrice7To': qseSubmittedCurvePrice7To, 'qseSubmittedCurveMW8From': qseSubmittedCurveMW8From, 'qseSubmittedCurveMW8To': qseSubmittedCurveMW8To, 'qseSubmittedCurvePrice8From': qseSubmittedCurvePrice8From, 'qseSubmittedCurvePrice8To': qseSubmittedCurvePrice8To, 'qseSubmittedCurveMW9From': qseSubmittedCurveMW9From, 'qseSubmittedCurveMW9To': qseSubmittedCurveMW9To, 'qseSubmittedCurvePrice9From': qseSubmittedCurvePrice9From, 'qseSubmittedCurvePrice9To': qseSubmittedCurvePrice9To, 'qseSubmittedCurveMW10From': qseSubmittedCurveMW10From, 'qseSubmittedCurveMW10To': qseSubmittedCurveMW10To, 'qseSubmittedCurvePrice10From': qseSubmittedCurvePrice10From, 'qseSubmittedCurvePrice10To': qseSubmittedCurvePrice10To, 'startUpHotFrom': startUpHotFrom, 'startUpHotTo': startUpHotTo, 'startUpInterFrom': startUpInterFrom, 'startUpInterTo': startUpInterTo, 'startUpColdFrom': startUpColdFrom, 'startUpColdTo': startUpColdTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'resourceStatus': resourceStatus, 'awardedQuantityFrom': awardedQuantityFrom, 'awardedQuantityTo': awardedQuantityTo, 'settlementPointName': settlementPointName, 'energySettlementPointPriceFrom': energySettlementPointPriceFrom, 'energySettlementPointPriceTo': energySettlementPointPriceTo, 'REGUPAwardedFrom': REGUPAwardedFrom, 'REGUPAwardedTo': REGUPAwardedTo, 'REGUPMCPCFrom': REGUPMCPCFrom, 'REGUPMCPCTo': REGUPMCPCTo, 'REGDNAwardedFrom': REGDNAwardedFrom, 'REGDNAwardedTo': REGDNAwardedTo, 'REGDNMCPCFrom': REGDNMCPCFrom, 'REGDNMCPCTo': REGDNMCPCTo, 'RRSPFRAwardedFrom': RRSPFRAwardedFrom, 'RRSPFRAwardedTo': RRSPFRAwardedTo, 'RRSFFRAwardedFrom': RRSFFRAwardedFrom, 'RRSFFRAwardedTo': RRSFFRAwardedTo, 'RRSUFRAwardedFrom': RRSUFRAwardedFrom, 'RRSUFRAwardedTo': RRSUFRAwardedTo, 'RRSMCPCFrom': RRSMCPCFrom, 'RRSMCPCTo': RRSMCPCTo, 'ECRSSDAwardedFrom': ECRSSDAwardedFrom, 'ECRSSDAwardedTo': ECRSSDAwardedTo, 'ECRSMCPCFrom': ECRSMCPCFrom, 'ECRSMCPCTo': ECRSMCPCTo, 'NSPINAwardedFrom': NSPINAwardedFrom, 'NSPINAwardedTo': NSPINAwardedTo, 'NSPINMCPCFrom': NSPINMCPCFrom, 'NSPINMCPCTo': NSPINMCPCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4209,6 +6902,62 @@ class _60DamGenResDataRow(Row):
startUpHot: Decimal | None
startUpInter: Decimal | None
+ class _60DamGenResDataHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None = None
+ dmeName: str | None = None
+ resourceName: str | None
+ resourceType: str | None
+ qseSubmittedCurveMW1: Decimal | None
+ qseSubmittedCurvePrice1: Decimal | None
+ qseSubmittedCurveMW2: Decimal | None
+ qseSubmittedCurvePrice2: Decimal | None
+ qseSubmittedCurveMW3: Decimal | None
+ qseSubmittedCurvePrice3: Decimal | None
+ qseSubmittedCurveMW4: Decimal | None
+ qseSubmittedCurvePrice4: Decimal | None
+ qseSubmittedCurveMW5: Decimal | None
+ qseSubmittedCurvePrice5: Decimal | None
+ qseSubmittedCurveMW6: Decimal | None
+ qseSubmittedCurvePrice6: Decimal | None
+ qseSubmittedCurveMW7: Decimal | None
+ qseSubmittedCurvePrice7: Decimal | None
+ qseSubmittedCurveMW8: Decimal | None
+ qseSubmittedCurvePrice8: Decimal | None
+ qseSubmittedCurveMW9: Decimal | None
+ qseSubmittedCurvePrice9: Decimal | None
+ qseSubmittedCurveMW10: Decimal | None
+ qseSubmittedCurvePrice10: Decimal | None
+ startUpHot: Decimal | None
+ startUpInter: Decimal | None
+ startUpCold: Decimal | None
+ minGenCost: Decimal | None
+ HSL: Decimal | None
+ LSL: Decimal | None
+ resourceStatus: str | None
+ awardedQuantity: Decimal | None
+ settlementPointName: str | None
+ energySettlementPointPrice: Decimal | None
+ REGUPAwarded: Decimal | None
+ REGUPMCPC: Decimal | None
+ REGDNAwarded: Decimal | None
+ REGDNMCPC: Decimal | None
+ RRSPFRAwarded: Decimal | None = None
+ RRSFFRAwarded: Decimal | None = None
+ RRSUFRAwarded: Decimal | None = None
+ RRSMCPC: Decimal | None
+ ECRSSDAwarded: Decimal | None = None
+ ECRSMCPC: Decimal | None = None
+ NSPINAwarded: Decimal | None
+ NSPINMCPC: Decimal | None
+ RRSAwarded: Decimal | None = None
+
+ @property
+ def _60_dam_gen_res_data_history(self) -> Archive[np3_966_er._60DamGenResDataHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamGenResDataHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'QSE submitted Curve-MW1': 'qseSubmittedCurveMW1', 'QSE submitted Curve-Price1': 'qseSubmittedCurvePrice1', 'QSE submitted Curve-MW2': 'qseSubmittedCurveMW2', 'QSE submitted Curve-Price2': 'qseSubmittedCurvePrice2', 'QSE submitted Curve-MW3': 'qseSubmittedCurveMW3', 'QSE submitted Curve-Price3': 'qseSubmittedCurvePrice3', 'QSE submitted Curve-MW4': 'qseSubmittedCurveMW4', 'QSE submitted Curve-Price4': 'qseSubmittedCurvePrice4', 'QSE submitted Curve-MW5': 'qseSubmittedCurveMW5', 'QSE submitted Curve-Price5': 'qseSubmittedCurvePrice5', 'QSE submitted Curve-MW6': 'qseSubmittedCurveMW6', 'QSE submitted Curve-Price6': 'qseSubmittedCurvePrice6', 'QSE submitted Curve-MW7': 'qseSubmittedCurveMW7', 'QSE submitted Curve-Price7': 'qseSubmittedCurvePrice7', 'QSE submitted Curve-MW8': 'qseSubmittedCurveMW8', 'QSE submitted Curve-Price8': 'qseSubmittedCurvePrice8', 'QSE submitted Curve-MW9': 'qseSubmittedCurveMW9', 'QSE submitted Curve-Price9': 'qseSubmittedCurvePrice9', 'QSE submitted Curve-MW10': 'qseSubmittedCurveMW10', 'QSE submitted Curve-Price10': 'qseSubmittedCurvePrice10', 'Start Up Hot': 'startUpHot', 'Start Up Inter': 'startUpInter', 'Start Up Cold': 'startUpCold', 'Min Gen Cost': 'minGenCost', 'HSL': 'HSL', 'LSL': 'LSL', 'Resource Status': 'resourceStatus', 'Awarded Quantity': 'awardedQuantity', 'Settlement Point Name': 'settlementPointName', 'Energy Settlement Point Price': 'energySettlementPointPrice', 'RegUp Awarded': 'REGUPAwarded', 'RegUp MCPC': 'REGUPMCPC', 'RegDown Awarded': 'REGDNAwarded', 'RegDown MCPC': 'REGDNMCPC', 'RRSPFR Awarded': 'RRSPFRAwarded', 'RRSFFR Awarded': 'RRSFFRAwarded', 'RRSUFR Awarded': 'RRSUFRAwarded', 'RRS MCPC': 'RRSMCPC', 'ECRSSD Awarded': 'ECRSSDAwarded', 'ECRS MCPC': 'ECRSMCPC', 'NonSpin Awarded': 'NSPINAwarded', 'NonSpin MCPC': 'NSPINMCPC'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_Gen_Resource_Data-*.csv', datetimes=None, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'QSE submitted Curve-MW1': 'qseSubmittedCurveMW1', 'QSE submitted Curve-Price1': 'qseSubmittedCurvePrice1', 'QSE submitted Curve-MW2': 'qseSubmittedCurveMW2', 'QSE submitted Curve-Price2': 'qseSubmittedCurvePrice2', 'QSE submitted Curve-MW3': 'qseSubmittedCurveMW3', 'QSE submitted Curve-Price3': 'qseSubmittedCurvePrice3', 'QSE submitted Curve-MW4': 'qseSubmittedCurveMW4', 'QSE submitted Curve-Price4': 'qseSubmittedCurvePrice4', 'QSE submitted Curve-MW5': 'qseSubmittedCurveMW5', 'QSE submitted Curve-Price5': 'qseSubmittedCurvePrice5', 'QSE submitted Curve-MW6': 'qseSubmittedCurveMW6', 'QSE submitted Curve-Price6': 'qseSubmittedCurvePrice6', 'QSE submitted Curve-MW7': 'qseSubmittedCurveMW7', 'QSE submitted Curve-Price7': 'qseSubmittedCurvePrice7', 'QSE submitted Curve-MW8': 'qseSubmittedCurveMW8', 'QSE submitted Curve-Price8': 'qseSubmittedCurvePrice8', 'QSE submitted Curve-MW9': 'qseSubmittedCurveMW9', 'QSE submitted Curve-Price9': 'qseSubmittedCurvePrice9', 'QSE submitted Curve-MW10': 'qseSubmittedCurveMW10', 'QSE submitted Curve-Price10': 'qseSubmittedCurvePrice10', 'Start Up Hot': 'startUpHot', 'Start Up Inter': 'startUpInter', 'Start Up Cold': 'startUpCold', 'Min Gen Cost': 'minGenCost', 'HSL': 'HSL', 'LSL': 'LSL', 'Resource Status': 'resourceStatus', 'Awarded Quantity': 'awardedQuantity', 'Settlement Point Name': 'settlementPointName', 'Energy Settlement Point Price': 'energySettlementPointPrice', 'RegUp Awarded': 'REGUPAwarded', 'RegUp MCPC': 'REGUPMCPC', 'RegDown Awarded': 'REGDNAwarded', 'RegDown MCPC': 'REGDNMCPC', 'RRS Awarded': 'RRSAwarded', 'RRS MCPC': 'RRSMCPC', 'NonSpin Awarded': 'NSPINAwarded', 'NonSpin MCPC': 'NSPINMCPC'},))
+
def _60_dam_gen_res_data(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, resourceType: str | None = None, qseSubmittedCurveMW1From: Decimal | None = None, qseSubmittedCurveMW1To: Decimal | None = None, qseSubmittedCurvePrice1From: Decimal | None = None, qseSubmittedCurvePrice1To: Decimal | None = None, qseSubmittedCurveMW2From: Decimal | None = None, qseSubmittedCurveMW2To: Decimal | None = None, qseSubmittedCurvePrice2From: Decimal | None = None, qseSubmittedCurvePrice2To: Decimal | None = None, qseSubmittedCurveMW3From: Decimal | None = None, qseSubmittedCurveMW3To: Decimal | None = None, qseSubmittedCurvePrice3From: Decimal | None = None, qseSubmittedCurvePrice3To: Decimal | None = None, qseSubmittedCurveMW4From: Decimal | None = None, qseSubmittedCurveMW4To: Decimal | None = None, qseSubmittedCurvePrice4From: Decimal | None = None, qseSubmittedCurvePrice4To: Decimal | None = None, qseSubmittedCurveMW5From: Decimal | None = None, qseSubmittedCurveMW5To: Decimal | None = None, qseSubmittedCurvePrice5From: Decimal | None = None, qseSubmittedCurvePrice5To: Decimal | None = None, qseSubmittedCurveMW6From: Decimal | None = None, qseSubmittedCurveMW6To: Decimal | None = None, qseSubmittedCurvePrice6From: Decimal | None = None, qseSubmittedCurvePrice6To: Decimal | None = None, qseSubmittedCurveMW7From: Decimal | None = None, qseSubmittedCurveMW7To: Decimal | None = None, qseSubmittedCurvePrice7From: Decimal | None = None, qseSubmittedCurvePrice7To: Decimal | None = None, ECRSSDAwardedFrom: Decimal | None = None, ECRSSDAwardedTo: Decimal | None = None, qseSubmittedCurveMW8From: Decimal | None = None, qseSubmittedCurveMW8To: Decimal | None = None, ECRSMCPCFrom: Decimal | None = None, ECRSMCPCTo: Decimal | None = None, qseSubmittedCurvePrice8From: Decimal | None = None, qseSubmittedCurvePrice8To: Decimal | None = None, qseSubmittedCurveMW9From: Decimal | None = None, qseSubmittedCurveMW9To: Decimal | None = None, qseSubmittedCurvePrice9From: Decimal | None = None, qseSubmittedCurvePrice9To: Decimal | None = None, qseSubmittedCurveMW10From: Decimal | None = None, qseSubmittedCurveMW10To: Decimal | None = None, qseSubmittedCurvePrice10From: Decimal | None = None, qseSubmittedCurvePrice10To: Decimal | None = None, startUpHotFrom: Decimal | None = None, startUpHotTo: Decimal | None = None, startUpInterFrom: Decimal | None = None, startUpInterTo: Decimal | None = None, startUpColdFrom: Decimal | None = None, startUpColdTo: Decimal | None = None, minGenCostFrom: Decimal | None = None, minGenCostTo: Decimal | None = None, HSLFrom: Decimal | None = None, HSLTo: Decimal | None = None, LSLFrom: Decimal | None = None, LSLTo: Decimal | None = None, resourceStatus: str | None = None, awardedQuantityFrom: Decimal | None = None, awardedQuantityTo: Decimal | None = None, settlementPointName: str | None = None, energySettlementPointPriceFrom: Decimal | None = None, energySettlementPointPriceTo: Decimal | None = None, REGUPAwardedFrom: Decimal | None = None, REGUPAwardedTo: Decimal | None = None, REGUPMCPCFrom: Decimal | None = None, REGUPMCPCTo: Decimal | None = None, REGDNAwardedFrom: Decimal | None = None, REGDNAwardedTo: Decimal | None = None, REGDNMCPCFrom: Decimal | None = None, REGDNMCPCTo: Decimal | None = None, RRSPFRAwardedFrom: Decimal | None = None, RRSPFRAwardedTo: Decimal | None = None, RRSFFRAwardedFrom: Decimal | None = None, RRSFFRAwardedTo: Decimal | None = None, RRSUFRAwardedFrom: Decimal | None = None, RRSUFRAwardedTo: Decimal | None = None, RRSMCPCFrom: Decimal | None = None, RRSMCPCTo: Decimal | None = None, NSPINAwardedFrom: Decimal | None = None, NSPINAwardedTo: Decimal | None = None, NSPINMCPCFrom: Decimal | None = None, NSPINMCPCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamGenResDataRow]:
'60-Day DAM Generation Resource Data'
return self._client._page('/np3-966-er/60_dam_gen_res_data', np3_966_er._60DamGenResDataRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'resourceType': resourceType, 'qseSubmittedCurveMW1From': qseSubmittedCurveMW1From, 'qseSubmittedCurveMW1To': qseSubmittedCurveMW1To, 'qseSubmittedCurvePrice1From': qseSubmittedCurvePrice1From, 'qseSubmittedCurvePrice1To': qseSubmittedCurvePrice1To, 'qseSubmittedCurveMW2From': qseSubmittedCurveMW2From, 'qseSubmittedCurveMW2To': qseSubmittedCurveMW2To, 'qseSubmittedCurvePrice2From': qseSubmittedCurvePrice2From, 'qseSubmittedCurvePrice2To': qseSubmittedCurvePrice2To, 'qseSubmittedCurveMW3From': qseSubmittedCurveMW3From, 'qseSubmittedCurveMW3To': qseSubmittedCurveMW3To, 'qseSubmittedCurvePrice3From': qseSubmittedCurvePrice3From, 'qseSubmittedCurvePrice3To': qseSubmittedCurvePrice3To, 'qseSubmittedCurveMW4From': qseSubmittedCurveMW4From, 'qseSubmittedCurveMW4To': qseSubmittedCurveMW4To, 'qseSubmittedCurvePrice4From': qseSubmittedCurvePrice4From, 'qseSubmittedCurvePrice4To': qseSubmittedCurvePrice4To, 'qseSubmittedCurveMW5From': qseSubmittedCurveMW5From, 'qseSubmittedCurveMW5To': qseSubmittedCurveMW5To, 'qseSubmittedCurvePrice5From': qseSubmittedCurvePrice5From, 'qseSubmittedCurvePrice5To': qseSubmittedCurvePrice5To, 'qseSubmittedCurveMW6From': qseSubmittedCurveMW6From, 'qseSubmittedCurveMW6To': qseSubmittedCurveMW6To, 'qseSubmittedCurvePrice6From': qseSubmittedCurvePrice6From, 'qseSubmittedCurvePrice6To': qseSubmittedCurvePrice6To, 'qseSubmittedCurveMW7From': qseSubmittedCurveMW7From, 'qseSubmittedCurveMW7To': qseSubmittedCurveMW7To, 'qseSubmittedCurvePrice7From': qseSubmittedCurvePrice7From, 'qseSubmittedCurvePrice7To': qseSubmittedCurvePrice7To, 'ECRSSDAwardedFrom': ECRSSDAwardedFrom, 'ECRSSDAwardedTo': ECRSSDAwardedTo, 'qseSubmittedCurveMW8From': qseSubmittedCurveMW8From, 'qseSubmittedCurveMW8To': qseSubmittedCurveMW8To, 'ECRSMCPCFrom': ECRSMCPCFrom, 'ECRSMCPCTo': ECRSMCPCTo, 'qseSubmittedCurvePrice8From': qseSubmittedCurvePrice8From, 'qseSubmittedCurvePrice8To': qseSubmittedCurvePrice8To, 'qseSubmittedCurveMW9From': qseSubmittedCurveMW9From, 'qseSubmittedCurveMW9To': qseSubmittedCurveMW9To, 'qseSubmittedCurvePrice9From': qseSubmittedCurvePrice9From, 'qseSubmittedCurvePrice9To': qseSubmittedCurvePrice9To, 'qseSubmittedCurveMW10From': qseSubmittedCurveMW10From, 'qseSubmittedCurveMW10To': qseSubmittedCurveMW10To, 'qseSubmittedCurvePrice10From': qseSubmittedCurvePrice10From, 'qseSubmittedCurvePrice10To': qseSubmittedCurvePrice10To, 'startUpHotFrom': startUpHotFrom, 'startUpHotTo': startUpHotTo, 'startUpInterFrom': startUpInterFrom, 'startUpInterTo': startUpInterTo, 'startUpColdFrom': startUpColdFrom, 'startUpColdTo': startUpColdTo, 'minGenCostFrom': minGenCostFrom, 'minGenCostTo': minGenCostTo, 'HSLFrom': HSLFrom, 'HSLTo': HSLTo, 'LSLFrom': LSLFrom, 'LSLTo': LSLTo, 'resourceStatus': resourceStatus, 'awardedQuantityFrom': awardedQuantityFrom, 'awardedQuantityTo': awardedQuantityTo, 'settlementPointName': settlementPointName, 'energySettlementPointPriceFrom': energySettlementPointPriceFrom, 'energySettlementPointPriceTo': energySettlementPointPriceTo, 'REGUPAwardedFrom': REGUPAwardedFrom, 'REGUPAwardedTo': REGUPAwardedTo, 'REGUPMCPCFrom': REGUPMCPCFrom, 'REGUPMCPCTo': REGUPMCPCTo, 'REGDNAwardedFrom': REGDNAwardedFrom, 'REGDNAwardedTo': REGDNAwardedTo, 'REGDNMCPCFrom': REGDNMCPCFrom, 'REGDNMCPCTo': REGDNMCPCTo, 'RRSPFRAwardedFrom': RRSPFRAwardedFrom, 'RRSPFRAwardedTo': RRSPFRAwardedTo, 'RRSFFRAwardedFrom': RRSFFRAwardedFrom, 'RRSFFRAwardedTo': RRSFFRAwardedTo, 'RRSUFRAwardedFrom': RRSUFRAwardedFrom, 'RRSUFRAwardedTo': RRSUFRAwardedTo, 'RRSMCPCFrom': RRSMCPCFrom, 'RRSMCPCTo': RRSMCPCTo, 'NSPINAwardedFrom': NSPINAwardedFrom, 'NSPINAwardedTo': NSPINAwardedTo, 'NSPINMCPCFrom': NSPINMCPCFrom, 'NSPINMCPCTo': NSPINMCPCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4287,6 +7036,79 @@ class _60DamGenResAsOffersRow(Row):
quantityMW5: Decimal | None
resourceName: str | None
+ class _60DamGenResAsOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None = None
+ dmeName: str | None = None
+ resourceName: str | None
+ multiHourBlock: bool | None
+ blockIndicator1: str | None
+ price1RRSPFR: Decimal | None = None
+ price1RRSFFR: Decimal | None = None
+ price1RRSUFR: Decimal | None = None
+ price1ECRS: Decimal | None = None
+ price1OFFEC: Decimal | None = None
+ price1OnlineNSPIN: Decimal | None
+ price1REGUP: Decimal | None
+ price1REGDN: Decimal | None
+ price1OfflineNSPIN: Decimal | None
+ quantityMW1: Decimal | None
+ blockIndicator2: str | None
+ price2RRSPFR: Decimal | None = None
+ price2RRSFFR: Decimal | None = None
+ price2RRSUFR: Decimal | None = None
+ price2ECRS: Decimal | None = None
+ price2OFFEC: Decimal | None = None
+ price2OnlineNSPIN: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDN: Decimal | None
+ price2OfflineNSPIN: Decimal | None
+ quantityMW2: Decimal | None
+ blockIndicator3: str | None
+ price3RRSPFR: Decimal | None = None
+ price3RRSFFR: Decimal | None = None
+ price3RRSUFR: Decimal | None = None
+ price3ECRS: Decimal | None = None
+ price3OFFEC: Decimal | None = None
+ price3OnlineNSPIN: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDN: Decimal | None
+ price3OfflineNSPIN: Decimal | None
+ quantityMW3: Decimal | None
+ blockIndicator4: str | None
+ price4RRSPFR: Decimal | None = None
+ price4RRSFFR: Decimal | None = None
+ price4RRSUFR: Decimal | None = None
+ price4ECRS: Decimal | None = None
+ price4OFFEC: Decimal | None = None
+ price4OnlineNSPIN: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDN: Decimal | None
+ price4OfflineNSPIN: Decimal | None
+ quantityMW4: Decimal | None
+ blockIndicator5: str | None
+ price5RRSPFR: Decimal | None = None
+ price5RRSFFR: Decimal | None = None
+ price5RRSUFR: Decimal | None = None
+ price5ECRS: Decimal | None = None
+ price5OFFEC: Decimal | None = None
+ price5OnlineNSPIN: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDN: Decimal | None
+ price5OfflineNSPIN: Decimal | None
+ quantityMW5: Decimal | None
+ price1RRS: Decimal | None = None
+ price2RRS: Decimal | None = None
+ price3RRS: Decimal | None = None
+ price4RRS: Decimal | None = None
+ price5RRS: Decimal | None = None
+
+ @property
+ def _60_dam_gen_res_as_offers_history(self) -> Archive[np3_966_er._60DamGenResAsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamGenResAsOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'DME': 'dmeName', 'Generation Resource Name': 'resourceName', 'Multi-Hour Block Flag': 'multiHourBlock', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRSPFR': 'price1RRSPFR', 'PRICE1 RRSFFR': 'price1RRSFFR', 'PRICE1 RRSUFR': 'price1RRSUFR', 'PRICE1 ECRS': 'price1ECRS', 'PRICE1 OFFEC': 'price1OFFEC', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRSPFR': 'price2RRSPFR', 'PRICE2 RRSFFR': 'price2RRSFFR', 'PRICE2 RRSUFR': 'price2RRSUFR', 'PRICE2 ECRS': 'price2ECRS', 'PRICE2 OFFEC': 'price2OFFEC', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRSPFR': 'price3RRSPFR', 'PRICE3 RRSFFR': 'price3RRSFFR', 'PRICE3 RRSUFR': 'price3RRSUFR', 'PRICE3 ECRS': 'price3ECRS', 'PRICE3 OFFEC': 'price3OFFEC', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRSPFR': 'price4RRSPFR', 'PRICE4 RRSFFR': 'price4RRSFFR', 'PRICE4 RRSUFR': 'price4RRSUFR', 'PRICE4 ECRS': 'price4ECRS', 'PRICE4 OFFEC': 'price4OFFEC', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRSPFR': 'price5RRSPFR', 'PRICE5 RRSFFR': 'price5RRSFFR', 'PRICE5 RRSUFR': 'price5RRSUFR', 'PRICE5 ECRS': 'price5ECRS', 'PRICE5 OFFEC': 'price5OFFEC', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNSPIN', 'QUANTITY MW5': 'quantityMW5'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_Generation_Resource_ASOffers-*.csv', datetimes=None, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Generation Resource Name': 'resourceName', 'Multi-Hour Block Flag': 'multiHourBlock', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRS': 'price1RRS', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRS': 'price2RRS', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRS': 'price3RRS', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRS': 'price4RRS', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRS': 'price5RRS', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNSPIN', 'QUANTITY MW5': 'quantityMW5'},))
+
def _60_dam_gen_res_as_offers(self, *, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2OnlineNSPINFrom: Decimal | None = None, price2OnlineNSPINTo: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDNFrom: Decimal | None = None, price2REGDNTo: Decimal | None = None, price2OfflineNSPINFrom: Decimal | None = None, price2OfflineNSPINTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, blockIndicator3: str | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3OnlineNSPINFrom: Decimal | None = None, price3OnlineNSPINTo: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDNFrom: Decimal | None = None, price3REGDNTo: Decimal | None = None, price3OfflineNSPINFrom: Decimal | None = None, price3OfflineNSPINTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, blockIndicator4: str | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, price4OnlineNSPINFrom: Decimal | None = None, price4OnlineNSPINTo: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDNFrom: Decimal | None = None, price4REGDNTo: Decimal | None = None, price4OfflineNSPINFrom: Decimal | None = None, price4OfflineNSPINTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, blockIndicator5: str | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5OnlineNSPINFrom: Decimal | None = None, price5OnlineNSPINTo: Decimal | None = None, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDNFrom: Decimal | None = None, price5REGDNTo: Decimal | None = None, price5OfflineNSPINFrom: Decimal | None = None, price5OfflineNSPINTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, price1OFFECFrom: Decimal | None = None, price1OFFECTo: Decimal | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, price2OFFECFrom: Decimal | None = None, price2OFFECTo: Decimal | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, price3OFFECFrom: Decimal | None = None, price3OFFECTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, price4OFFECFrom: Decimal | None = None, price4OFFECTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, price5OFFECFrom: Decimal | None = None, price5OFFECTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, multiHourBlock: bool | None = None, blockIndicator1: str | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price1OnlineNSPINFrom: Decimal | None = None, price1OnlineNSPINTo: Decimal | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDNFrom: Decimal | None = None, price1REGDNTo: Decimal | None = None, price1OfflineNSPINFrom: Decimal | None = None, price1OfflineNSPINTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, blockIndicator2: str | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamGenResAsOffersRow]:
'60-Day DAM Generation Resources AS Offers'
return self._client._page('/np3-966-er/60_dam_gen_res_as_offers', np3_966_er._60DamGenResAsOffersRow, {'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2OnlineNSPINFrom': price2OnlineNSPINFrom, 'price2OnlineNSPINTo': price2OnlineNSPINTo, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDNFrom': price2REGDNFrom, 'price2REGDNTo': price2REGDNTo, 'price2OfflineNSPINFrom': price2OfflineNSPINFrom, 'price2OfflineNSPINTo': price2OfflineNSPINTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'blockIndicator3': blockIndicator3, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3OnlineNSPINFrom': price3OnlineNSPINFrom, 'price3OnlineNSPINTo': price3OnlineNSPINTo, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDNFrom': price3REGDNFrom, 'price3REGDNTo': price3REGDNTo, 'price3OfflineNSPINFrom': price3OfflineNSPINFrom, 'price3OfflineNSPINTo': price3OfflineNSPINTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'blockIndicator4': blockIndicator4, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4OnlineNSPINFrom': price4OnlineNSPINFrom, 'price4OnlineNSPINTo': price4OnlineNSPINTo, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDNFrom': price4REGDNFrom, 'price4REGDNTo': price4REGDNTo, 'price4OfflineNSPINFrom': price4OfflineNSPINFrom, 'price4OfflineNSPINTo': price4OfflineNSPINTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'blockIndicator5': blockIndicator5, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5OnlineNSPINFrom': price5OnlineNSPINFrom, 'price5OnlineNSPINTo': price5OnlineNSPINTo, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDNFrom': price5REGDNFrom, 'price5REGDNTo': price5REGDNTo, 'price5OfflineNSPINFrom': price5OfflineNSPINFrom, 'price5OfflineNSPINTo': price5OfflineNSPINTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'price1OFFECFrom': price1OFFECFrom, 'price1OFFECTo': price1OFFECTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'price2OFFECFrom': price2OFFECFrom, 'price2OFFECTo': price2OFFECTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'price3OFFECFrom': price3OFFECFrom, 'price3OFFECTo': price3OFFECTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'price4OFFECFrom': price4OFFECFrom, 'price4OFFECTo': price4OFFECTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'price5OFFECFrom': price5OFFECFrom, 'price5OFFECTo': price5OFFECTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'multiHourBlock': multiHourBlock, 'blockIndicator1': blockIndicator1, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1OnlineNSPINFrom': price1OnlineNSPINFrom, 'price1OnlineNSPINTo': price1OnlineNSPINTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDNFrom': price1REGDNFrom, 'price1REGDNTo': price1REGDNTo, 'price1OfflineNSPINFrom': price1OfflineNSPINFrom, 'price1OfflineNSPINTo': price1OfflineNSPINTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'blockIndicator2': blockIndicator2, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4322,6 +7144,32 @@ class _60DamLoadResDataRow(Row):
lowPowerConsumption: Decimal | None
maxPowerConsumption: Decimal | None
+ class _60DamLoadResDataHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ loadResourceName: str | None
+ maxPowerConsumption: Decimal | None
+ lowPowerConsumption: Decimal | None
+ REGUPAwarded: Decimal | None
+ REGUPMCPC: Decimal | None
+ REGDNAwarded: Decimal | None
+ REGDNMCPC: Decimal | None
+ RRSPFRAwarded: Decimal | None = None
+ RRSFFRAwarded: Decimal | None = None
+ RRSUFRAwarded: Decimal | None = None
+ RRSMCPC: Decimal | None
+ ECRSSDAwarded: Decimal | None = None
+ ECRSMDAwarded: Decimal | None = None
+ ECRSMCPC: Decimal | None = None
+ NSPINAwarded: Decimal | None
+ NSPINMCPC: Decimal | None
+ RRSAwarded: Decimal | None = None
+
+ @property
+ def _60_dam_load_res_data_history(self) -> Archive[np3_966_er._60DamLoadResDataHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamLoadResDataHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Load Resource Name': 'loadResourceName', 'Max Power Consumption for Load Resource': 'maxPowerConsumption', 'Low Power Consumption for Load Resource': 'lowPowerConsumption', 'RegUp Awarded': 'REGUPAwarded', 'RegUp MCPC': 'REGUPMCPC', 'RegDown Awarded': 'REGDNAwarded', 'RegDown MCPC': 'REGDNMCPC', 'RRSPFR Awarded': 'RRSPFRAwarded', 'RRSFFR Awarded': 'RRSFFRAwarded', 'RRSUFR Awarded': 'RRSUFRAwarded', 'RRS MCPC': 'RRSMCPC', 'ECRSSD Awarded': 'ECRSSDAwarded', 'ECRSMD Awarded': 'ECRSMDAwarded', 'ECRS MCPC': 'ECRSMCPC', 'NonSpin Awarded': 'NSPINAwarded', 'NonSpin MCPC': 'NSPINMCPC'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_Load_Resource_Data-*.csv', datetimes=None, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Load Resource Name': 'loadResourceName', 'Max Power Consumption for Load Resource': 'maxPowerConsumption', 'Low Power Consumption for Load Resource': 'lowPowerConsumption', 'RegUp Awarded': 'REGUPAwarded', 'RegUp MCPC': 'REGUPMCPC', 'RegDown Awarded': 'REGDNAwarded', 'RegDown MCPC': 'REGDNMCPC', 'RRS Awarded': 'RRSAwarded', 'RRS MCPC': 'RRSMCPC', 'NonSpin Awarded': 'NSPINAwarded', 'NonSpin MCPC': 'NSPINMCPC'},))
+
def _60_dam_load_res_data(self, *, REGUPMCPCFrom: Decimal | None = None, REGUPMCPCTo: Decimal | None = None, ECRSMCPCFrom: Decimal | None = None, ECRSMCPCTo: Decimal | None = None, REGDNAwardedFrom: Decimal | None = None, REGDNAwardedTo: Decimal | None = None, REGDNMCPCFrom: Decimal | None = None, REGDNMCPCTo: Decimal | None = None, RRSPFRAwardedFrom: Decimal | None = None, RRSPFRAwardedTo: Decimal | None = None, RRSFFRAwardedFrom: Decimal | None = None, RRSFFRAwardedTo: Decimal | None = None, RRSUFRAwardedFrom: Decimal | None = None, RRSUFRAwardedTo: Decimal | None = None, RRSMCPCFrom: Decimal | None = None, RRSMCPCTo: Decimal | None = None, NSPINAwardedFrom: Decimal | None = None, NSPINAwardedTo: Decimal | None = None, NSPINMCPCFrom: Decimal | None = None, NSPINMCPCTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, loadResourceName: str | None = None, maxPowerConsumptionFrom: Decimal | None = None, maxPowerConsumptionTo: Decimal | None = None, lowPowerConsumptionFrom: Decimal | None = None, lowPowerConsumptionTo: Decimal | None = None, ECRSSDAwardedFrom: Decimal | None = None, ECRSSDAwardedTo: Decimal | None = None, REGUPAwardedFrom: Decimal | None = None, REGUPAwardedTo: Decimal | None = None, ECRSMDAwardedFrom: Decimal | None = None, ECRSMDAwardedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamLoadResDataRow]:
'60-Day DAM Load Resource Data'
return self._client._page('/np3-966-er/60_dam_load_res_data', np3_966_er._60DamLoadResDataRow, {'REGUPMCPCFrom': REGUPMCPCFrom, 'REGUPMCPCTo': REGUPMCPCTo, 'ECRSMCPCFrom': ECRSMCPCFrom, 'ECRSMCPCTo': ECRSMCPCTo, 'REGDNAwardedFrom': REGDNAwardedFrom, 'REGDNAwardedTo': REGDNAwardedTo, 'REGDNMCPCFrom': REGDNMCPCFrom, 'REGDNMCPCTo': REGDNMCPCTo, 'RRSPFRAwardedFrom': RRSPFRAwardedFrom, 'RRSPFRAwardedTo': RRSPFRAwardedTo, 'RRSFFRAwardedFrom': RRSFFRAwardedFrom, 'RRSFFRAwardedTo': RRSFFRAwardedTo, 'RRSUFRAwardedFrom': RRSUFRAwardedFrom, 'RRSUFRAwardedTo': RRSUFRAwardedTo, 'RRSMCPCFrom': RRSMCPCFrom, 'RRSMCPCTo': RRSMCPCTo, 'NSPINAwardedFrom': NSPINAwardedFrom, 'NSPINAwardedTo': NSPINAwardedTo, 'NSPINMCPCFrom': NSPINMCPCFrom, 'NSPINMCPCTo': NSPINMCPCTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'loadResourceName': loadResourceName, 'maxPowerConsumptionFrom': maxPowerConsumptionFrom, 'maxPowerConsumptionTo': maxPowerConsumptionTo, 'lowPowerConsumptionFrom': lowPowerConsumptionFrom, 'lowPowerConsumptionTo': lowPowerConsumptionTo, 'ECRSSDAwardedFrom': ECRSSDAwardedFrom, 'ECRSSDAwardedTo': ECRSSDAwardedTo, 'REGUPAwardedFrom': REGUPAwardedFrom, 'REGUPAwardedTo': REGUPAwardedTo, 'ECRSMDAwardedFrom': ECRSMDAwardedFrom, 'ECRSMDAwardedTo': ECRSMDAwardedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4401,6 +7249,80 @@ class _60DamLoadResAsOffersRow(Row):
quantityMW4: Decimal | None
quantityMW5: Decimal | None
+ class _60DamLoadResAsOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None = None
+ dmeName: str | None = None
+ loadResourceName: str | None
+ multiHourBlock: bool | None
+ blockIndicator1: str | None
+ price1RRSPFR: Decimal | None = None
+ price1RRSFFR: Decimal | None = None
+ price1RRSUFR: Decimal | None = None
+ price1ECRS: Decimal | None = None
+ price1OFFEC: Decimal | None = None
+ price1OnlineNSPIN: Decimal | None
+ price1REGUP: Decimal | None
+ price1REGDN: Decimal | None
+ price1OfflineNSPIN: Decimal | None
+ quantityMW1: Decimal | None
+ blockIndicator2: str | None
+ price2RRSPFR: Decimal | None = None
+ price2RRSFFR: Decimal | None = None
+ price2RRSUFR: Decimal | None = None
+ price2ECRS: Decimal | None = None
+ price2OFFEC: Decimal | None = None
+ price2OnlineNSPIN: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDN: Decimal | None
+ price2OfflineNSPIN: Decimal | None
+ quantityMW2: Decimal | None
+ blockIndicator3: str | None
+ price3RRSPFR: Decimal | None = None
+ price3RRSFFR: Decimal | None = None
+ price3RRSUFR: Decimal | None = None
+ price3ECRS: Decimal | None = None
+ price3OFFEC: Decimal | None = None
+ price3OnlineNSPIN: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDN: Decimal | None
+ price3OfflineNSPIN: Decimal | None
+ quantityMW3: Decimal | None
+ blockIndicator4: str | None
+ price4RRSPFR: Decimal | None = None
+ price4RRSFFR: Decimal | None = None
+ price4RRSUFR: Decimal | None = None
+ price4ECRS: Decimal | None = None
+ price4OFFEC: Decimal | None = None
+ price4OnlineNSPIN: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDN: Decimal | None
+ price4OfflineNSPIN: Decimal | None
+ quantityMW4: Decimal | None
+ blockIndicator5: str | None
+ price5RRSPFR: Decimal | None = None
+ price5RRSFFR: Decimal | None = None
+ price5RRSUFR: Decimal | None = None
+ price5ECRS: Decimal | None = None
+ price5OFFEC: Decimal | None = None
+ price5OnlineNSPIN: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDN: Decimal | None
+ price5OfflineNSPIN: Decimal | None
+ quantityMW5: Decimal | None
+ NCLRFlag: bool | None
+ price1RRS: Decimal | None = None
+ price2RRS: Decimal | None = None
+ price3RRS: Decimal | None = None
+ price4RRS: Decimal | None = None
+ price5RRS: Decimal | None = None
+
+ @property
+ def _60_dam_load_res_as_offers_history(self) -> Archive[np3_966_er._60DamLoadResAsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamLoadResAsOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'DME': 'dmeName', 'Load Resource Name': 'loadResourceName', 'Multi-Hour Block Flag': 'multiHourBlock', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRSPFR': 'price1RRSPFR', 'PRICE1 RRSFFR': 'price1RRSFFR', 'PRICE1 RRSUFR': 'price1RRSUFR', 'PRICE1 ECRS': 'price1ECRS', 'PRICE1 OFFEC': 'price1OFFEC', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRSPFR': 'price2RRSPFR', 'PRICE2 RRSFFR': 'price2RRSFFR', 'PRICE2 RRSUFR': 'price2RRSUFR', 'PRICE2 ECRS': 'price2ECRS', 'PRICE2 OFFEC': 'price2OFFEC', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRSPFR': 'price3RRSPFR', 'PRICE3 RRSFFR': 'price3RRSFFR', 'PRICE3 RRSUFR': 'price3RRSUFR', 'PRICE3 ECRS': 'price3ECRS', 'PRICE3 OFFEC': 'price3OFFEC', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRSPFR': 'price4RRSPFR', 'PRICE4 RRSFFR': 'price4RRSFFR', 'PRICE4 RRSUFR': 'price4RRSUFR', 'PRICE4 ECRS': 'price4ECRS', 'PRICE4 OFFEC': 'price4OFFEC', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRSPFR': 'price5RRSPFR', 'PRICE5 RRSFFR': 'price5RRSFFR', 'PRICE5 RRSUFR': 'price5RRSUFR', 'PRICE5 ECRS': 'price5ECRS', 'PRICE5 OFFEC': 'price5OFFEC', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNSPIN', 'QUANTITY MW5': 'quantityMW5', 'NCLR Flag': 'NCLRFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_Load_Resource_ASOffers-*.csv', datetimes=None, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Load Resource Name': 'loadResourceName', 'Multi-Hour Block Flag': 'multiHourBlock', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRS': 'price1RRS', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRS': 'price2RRS', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRS': 'price3RRS', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRS': 'price4RRS', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRS': 'price5RRS', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNSPIN', 'QUANTITY MW5': 'quantityMW5', 'NCLR Flag': 'NCLRFlag'},))
+
def _60_dam_load_res_as_offers(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, loadResourceName: str | None = None, multiHourBlock: bool | None = None, blockIndicator1: str | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price1OnlineNSPINFrom: Decimal | None = None, price1OnlineNSPINTo: Decimal | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDNFrom: Decimal | None = None, price1REGDNTo: Decimal | None = None, price1OfflineNSPINFrom: Decimal | None = None, price1OfflineNSPINTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, blockIndicator2: str | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2OnlineNSPINFrom: Decimal | None = None, price2OnlineNSPINTo: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDNFrom: Decimal | None = None, price2REGDNTo: Decimal | None = None, price2OfflineNSPINFrom: Decimal | None = None, price2OfflineNSPINTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, blockIndicator3: str | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3OnlineNSPINFrom: Decimal | None = None, price3OnlineNSPINTo: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDNFrom: Decimal | None = None, price3REGDNTo: Decimal | None = None, price3OfflineNSPINFrom: Decimal | None = None, price3OfflineNSPINTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, blockIndicator4: str | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, price4OnlineNSPINFrom: Decimal | None = None, price4OnlineNSPINTo: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDNFrom: Decimal | None = None, price4REGDNTo: Decimal | None = None, price4OfflineNSPINFrom: Decimal | None = None, price4OfflineNSPINTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, blockIndicator5: str | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5OnlineNSPINFrom: Decimal | None = None, price5OnlineNSPINTo: Decimal | None = None, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDNFrom: Decimal | None = None, price5REGDNTo: Decimal | None = None, price5OfflineNSPINFrom: Decimal | None = None, price5OfflineNSPINTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, NCLRFlag: bool | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, price1OFFECFrom: Decimal | None = None, price1OFFECTo: Decimal | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, price2OFFECFrom: Decimal | None = None, price2OFFECTo: Decimal | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, price3OFFECFrom: Decimal | None = None, price3OFFECTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, price4OFFECFrom: Decimal | None = None, price4OFFECTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, price5OFFECFrom: Decimal | None = None, price5OFFECTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamLoadResAsOffersRow]:
'60-Day DAM Load Resources AS Offers'
return self._client._page('/np3-966-er/60_dam_load_res_as_offers', np3_966_er._60DamLoadResAsOffersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'loadResourceName': loadResourceName, 'multiHourBlock': multiHourBlock, 'blockIndicator1': blockIndicator1, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1OnlineNSPINFrom': price1OnlineNSPINFrom, 'price1OnlineNSPINTo': price1OnlineNSPINTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDNFrom': price1REGDNFrom, 'price1REGDNTo': price1REGDNTo, 'price1OfflineNSPINFrom': price1OfflineNSPINFrom, 'price1OfflineNSPINTo': price1OfflineNSPINTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'blockIndicator2': blockIndicator2, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2OnlineNSPINFrom': price2OnlineNSPINFrom, 'price2OnlineNSPINTo': price2OnlineNSPINTo, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDNFrom': price2REGDNFrom, 'price2REGDNTo': price2REGDNTo, 'price2OfflineNSPINFrom': price2OfflineNSPINFrom, 'price2OfflineNSPINTo': price2OfflineNSPINTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'blockIndicator3': blockIndicator3, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3OnlineNSPINFrom': price3OnlineNSPINFrom, 'price3OnlineNSPINTo': price3OnlineNSPINTo, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDNFrom': price3REGDNFrom, 'price3REGDNTo': price3REGDNTo, 'price3OfflineNSPINFrom': price3OfflineNSPINFrom, 'price3OfflineNSPINTo': price3OfflineNSPINTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'blockIndicator4': blockIndicator4, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4OnlineNSPINFrom': price4OnlineNSPINFrom, 'price4OnlineNSPINTo': price4OnlineNSPINTo, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDNFrom': price4REGDNFrom, 'price4REGDNTo': price4REGDNTo, 'price4OfflineNSPINFrom': price4OfflineNSPINFrom, 'price4OfflineNSPINTo': price4OfflineNSPINTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'blockIndicator5': blockIndicator5, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5OnlineNSPINFrom': price5OnlineNSPINFrom, 'price5OnlineNSPINTo': price5OnlineNSPINTo, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDNFrom': price5REGDNFrom, 'price5REGDNTo': price5REGDNTo, 'price5OfflineNSPINFrom': price5OfflineNSPINFrom, 'price5OfflineNSPINTo': price5OfflineNSPINTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'NCLRFlag': NCLRFlag, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'price1OFFECFrom': price1OFFECFrom, 'price1OFFECTo': price1OFFECTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'price2OFFECFrom': price2OFFECFrom, 'price2OFFECTo': price2OFFECTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'price3OFFECFrom': price3OFFECFrom, 'price3OFFECTo': price3OFFECTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'price4OFFECFrom': price4OFFECFrom, 'price4OFFECTo': price4OFFECTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'price5OFFECFrom': price5OFFECFrom, 'price5OFFECTo': price5OFFECTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4426,6 +7348,21 @@ class _60DamPtpOblBidAwardsRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _60DamPtpOblBidAwardsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ PTPBidAwardMW: Decimal | None
+ PTPBidPrice: Decimal | None
+ bidId: str | None
+
+ @property
+ def _60_dam_ptp_obl_bid_awards_history(self) -> Archive[np3_966_er._60DamPtpOblBidAwardsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamPtpOblBidAwardsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'Settlement Point Source': 'settlementPointSource', 'Settlement Point Sink': 'settlementPointSink', 'PtP Bid Award - MW': 'PTPBidAwardMW', 'PtP Bid - Price': 'PTPBidPrice', 'Bid ID': 'bidId'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_PTPObligationBidAwards-*.csv', datetimes=None, variants=())
+
def _60_dam_ptp_obl_bid_awards(self, *, settlementPointSource: str | None = None, settlementPointSink: str | None = None, PTPBidAwardMWFrom: Decimal | None = None, PTPBidAwardMWTo: Decimal | None = None, PTPBidPriceFrom: Decimal | None = None, PTPBidPriceTo: Decimal | None = None, bidId: str | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamPtpOblBidAwardsRow]:
'60-Day DAM PTP Obligation Bid Awards'
return self._client._page('/np3-966-er/60_dam_ptp_obl_bid_awards', np3_966_er._60DamPtpOblBidAwardsRow, {'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'PTPBidAwardMWFrom': PTPBidAwardMWFrom, 'PTPBidAwardMWTo': PTPBidAwardMWTo, 'PTPBidPriceFrom': PTPBidPriceFrom, 'PTPBidPriceTo': PTPBidPriceTo, 'bidId': bidId, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4452,6 +7389,22 @@ class _60DamPtpOblBidsRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _60DamPtpOblBidsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ PTPBidMW: Decimal | None
+ PTPBidPrice: Decimal | None
+ bidId: str | None
+ multiHourBlock: bool | None
+
+ @property
+ def _60_dam_ptp_obl_bids_history(self) -> Archive[np3_966_er._60DamPtpOblBidsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamPtpOblBidsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'Settlement Point Source': 'settlementPointSource', 'Settlement Point Sink': 'settlementPointSink', 'PtP Bid - MW': 'PTPBidMW', 'PtP Bid - Price': 'PTPBidPrice', 'Bid ID': 'bidId', 'Multi-Hour Block Indicator': 'multiHourBlock'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_PTPObligationBids-*.csv', datetimes=None, variants=())
+
def _60_dam_ptp_obl_bids(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, PTPBidMWFrom: Decimal | None = None, PTPBidMWTo: Decimal | None = None, PTPBidPriceFrom: Decimal | None = None, PTPBidPriceTo: Decimal | None = None, bidId: str | None = None, multiHourBlock: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamPtpOblBidsRow]:
'60-Day DAM PTP Obligation Bids'
return self._client._page('/np3-966-er/60_dam_ptp_obl_bids', np3_966_er._60DamPtpOblBidsRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'PTPBidMWFrom': PTPBidMWFrom, 'PTPBidMWTo': PTPBidMWTo, 'PTPBidPriceFrom': PTPBidPriceFrom, 'PTPBidPriceTo': PTPBidPriceTo, 'bidId': bidId, 'multiHourBlock': multiHourBlock, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4479,6 +7432,23 @@ class _60DamPtpOblOptRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _60DamPtpOblOptHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ MW: Decimal | None
+ price: Decimal | None
+ offerId: str | None
+ multiHourBlock: bool | None
+ CRRId: str | None
+
+ @property
+ def _60_dam_ptp_obl_opt_history(self) -> Archive[np3_966_er._60DamPtpOblOptHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamPtpOblOptHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'Settlement Point Source': 'settlementPointSource', 'Settlement Point Sink': 'settlementPointSink', 'MW': 'MW', 'Price': 'price', 'Offer ID': 'offerId', 'Multi-Hour Block Indicator': 'multiHourBlock', 'CRR ID': 'CRRId'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_PTP_Obligation_Option-*.csv', datetimes=None, variants=())
+
def _60_dam_ptp_obl_opt(self, *, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, offerId: str | None = None, multiHourBlock: bool | None = None, CRRId: str | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamPtpOblOptRow]:
'60-Day DAM PTP Obligation Option'
return self._client._page('/np3-966-er/60_dam_ptp_obl_opt', np3_966_er._60DamPtpOblOptRow, {'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'offerId': offerId, 'multiHourBlock': multiHourBlock, 'CRRId': CRRId, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4505,6 +7475,22 @@ class _60DamPtpOblOptAwardsRow(Row):
settlementPointSink: str | None
settlementPointSource: str | None
+ class _60DamPtpOblOptAwardsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ settlementPointSource: str | None
+ settlementPointSink: str | None
+ MW: Decimal | None
+ price: Decimal | None
+ offerId: str | None
+ CRRId: str | None
+
+ @property
+ def _60_dam_ptp_obl_opt_awards_history(self) -> Archive[np3_966_er._60DamPtpOblOptAwardsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamPtpOblOptAwardsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE Name': 'qseName', 'Settlement Point Source': 'settlementPointSource', 'Settlement Point Sink': 'settlementPointSink', 'MW': 'MW', 'Price': 'price', 'Offer ID': 'offerId', 'CRR ID': 'CRRId'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_PTP_Obligation_OptionAwards-*.csv', datetimes=None, variants=())
+
def _60_dam_ptp_obl_opt_awards(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, settlementPointSource: str | None = None, settlementPointSink: str | None = None, MWFrom: Decimal | None = None, MWTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, offerId: str | None = None, CRRId: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamPtpOblOptAwardsRow]:
'60-Day DAM PTP Obligation Option Awards'
return self._client._page('/np3-966-er/60_dam_ptp_obl_opt_awards', np3_966_er._60DamPtpOblOptAwardsRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'settlementPointSource': settlementPointSource, 'settlementPointSink': settlementPointSink, 'MWFrom': MWFrom, 'MWTo': MWTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'offerId': offerId, 'CRRId': CRRId, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4534,6 +7520,28 @@ class _60DamQseSelfAsRow(Row):
totalSelfArrangedASRRSPFR: Decimal | None
totalSelfArrangedASRRSUFR: Decimal | None
+ class _60DamQseSelfAsHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ totalSelfArrangedASREGUP: Decimal | None
+ totalSelfArrangedASREGDN: Decimal | None
+ totalSelfArrangedASNSPIN: Decimal | None
+ totalSelfArrangedASNSPNM: Decimal | None = None
+ totalSelfArrangedASRRSPFR: Decimal | None = None
+ totalSelfArrangedASRRSFFR: Decimal | None = None
+ totalSelfArrangedASRRSUFR: Decimal | None = None
+ totalSelfArrangedASECRSSD: Decimal | None = None
+ totalSelfArrangedASECRSMD: Decimal | None = None
+ totalSelfArrangedASRRSGen: Decimal | None = None
+ totalSelfArrangedASRRSCLR: Decimal | None = None
+ totalSelfArrangedASRRSNCLR: Decimal | None = None
+
+ @property
+ def _60_dam_qse_self_as_history(self) -> Archive[np3_966_er._60DamQseSelfAsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-966-er', np3_966_er._60DamQseSelfAsHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'Total Self-Arranged AS RegUp': 'totalSelfArrangedASREGUP', 'Total Self-Arranged AS RegDown': 'totalSelfArrangedASREGDN', 'Total Self-Arranged AS NonSpin': 'totalSelfArrangedASNSPIN', 'Total Self-Arranged AS NSPNM': 'totalSelfArrangedASNSPNM', 'Total Self-Arranged AS RRSPFR': 'totalSelfArrangedASRRSPFR', 'Total Self-Arranged AS RRSFFR': 'totalSelfArrangedASRRSFFR', 'Total Self-Arranged AS RRSUFR': 'totalSelfArrangedASRRSUFR', 'Total Self-Arranged AS ECRSSD': 'totalSelfArrangedASECRSSD', 'Total Self-Arranged AS ECRSMD': 'totalSelfArrangedASECRSMD'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_DAM_QSE_Self_Arranged_AS-*.csv', datetimes=None, variants=({'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'Total Self-Arranged AS RegUp': 'totalSelfArrangedASREGUP', 'Total Self-Arranged AS RegDown': 'totalSelfArrangedASREGDN', 'Total Self-Arranged AS NonSpin': 'totalSelfArrangedASNSPIN', 'Total Self-Arranged AS RRS for Gen': 'totalSelfArrangedASRRSGen', 'Total Self-Arranged AS RRS for CLR': 'totalSelfArrangedASRRSCLR', 'Total Self-Arranged AS RRS for NCLR': 'totalSelfArrangedASRRSNCLR'},))
+
def _60_dam_qse_self_as(self, *, totalSelfArrangedASRRSUFRFrom: Decimal | None = None, totalSelfArrangedASRRSUFRTo: Decimal | None = None, totalSelfArrangedASECRSSDFrom: Decimal | None = None, totalSelfArrangedASECRSSDTo: Decimal | None = None, totalSelfArrangedASECRSMDFrom: Decimal | None = None, totalSelfArrangedASECRSMDTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, totalSelfArrangedASREGUPFrom: Decimal | None = None, totalSelfArrangedASREGUPTo: Decimal | None = None, totalSelfArrangedASREGDNFrom: Decimal | None = None, totalSelfArrangedASREGDNTo: Decimal | None = None, totalSelfArrangedASNSPINFrom: Decimal | None = None, totalSelfArrangedASNSPINTo: Decimal | None = None, totalSelfArrangedASNSPNMFrom: Decimal | None = None, totalSelfArrangedASNSPNMTo: Decimal | None = None, totalSelfArrangedASRRSPFRFrom: Decimal | None = None, totalSelfArrangedASRRSPFRTo: Decimal | None = None, totalSelfArrangedASRRSFFRFrom: Decimal | None = None, totalSelfArrangedASRRSFFRTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_966_er._60DamQseSelfAsRow]:
'60-Day DAM QSE Self Arranged AS'
return self._client._page('/np3-966-er/60_dam_qse_self_as', np3_966_er._60DamQseSelfAsRow, {'totalSelfArrangedASRRSUFRFrom': totalSelfArrangedASRRSUFRFrom, 'totalSelfArrangedASRRSUFRTo': totalSelfArrangedASRRSUFRTo, 'totalSelfArrangedASECRSSDFrom': totalSelfArrangedASECRSSDFrom, 'totalSelfArrangedASECRSSDTo': totalSelfArrangedASECRSSDTo, 'totalSelfArrangedASECRSMDFrom': totalSelfArrangedASECRSMDFrom, 'totalSelfArrangedASECRSMDTo': totalSelfArrangedASECRSMDTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'totalSelfArrangedASREGUPFrom': totalSelfArrangedASREGUPFrom, 'totalSelfArrangedASREGUPTo': totalSelfArrangedASREGUPTo, 'totalSelfArrangedASREGDNFrom': totalSelfArrangedASREGDNFrom, 'totalSelfArrangedASREGDNTo': totalSelfArrangedASREGDNTo, 'totalSelfArrangedASNSPINFrom': totalSelfArrangedASNSPINFrom, 'totalSelfArrangedASNSPINTo': totalSelfArrangedASNSPINTo, 'totalSelfArrangedASNSPNMFrom': totalSelfArrangedASNSPNMFrom, 'totalSelfArrangedASNSPNMTo': totalSelfArrangedASNSPNMTo, 'totalSelfArrangedASRRSPFRFrom': totalSelfArrangedASRRSPFRFrom, 'totalSelfArrangedASRRSPFRTo': totalSelfArrangedASRRSPFRTo, 'totalSelfArrangedASRRSFFRFrom': totalSelfArrangedASRRSFFRFrom, 'totalSelfArrangedASRRSFFRTo': totalSelfArrangedASRRSFFRTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4619,6 +7627,76 @@ class _7dTrigMcpc50xfipRow(Row):
quantityMW5: Decimal | None
resourceName: str | None
+ class _7dTrigMcpc50xfipHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: int | None
+ qseName: str | None
+ dmeName: str | None
+ resourceName: str | None
+ FIPx50: Decimal | None
+ MCPC: Decimal | None
+ multiHourBlockFlag: bool | None
+ blockIndicator1: str | None
+ price1RRSPFR: Decimal | None
+ price1RRSFFR: Decimal | None
+ price1RRSUFR: Decimal | None
+ price1ECRS: Decimal | None
+ price1OFFEC: Decimal | None
+ price1OnlineNONSPIN: Decimal | None
+ price1REGUP: Decimal | None
+ price1REGDOWN: Decimal | None
+ price1OfflineNONSPIN: Decimal | None
+ quantityMW1: Decimal | None
+ blockIndicator2: str | None
+ price2RRSPFR: Decimal | None
+ price2RRSFFR: Decimal | None
+ price2RRSUFR: Decimal | None
+ price2ECRS: Decimal | None
+ price2OFFEC: Decimal | None
+ price2OnlineNONSPIN: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDOWN: Decimal | None
+ price2OfflineNONSPIN: Decimal | None
+ quantityMW2: Decimal | None
+ blockIndicator3: str | None
+ price3RRSPFR: Decimal | None
+ price3RRSFFR: Decimal | None
+ price3RRSUFR: Decimal | None
+ price3ECRS: Decimal | None
+ price3OFFEC: Decimal | None
+ price3OnlineNONSPIN: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDOWN: Decimal | None
+ price3OfflineNONSPIN: Decimal | None
+ quantityMW3: Decimal | None
+ blockIndicator4: str | None
+ price4RRSPFR: Decimal | None
+ price4RRSFFR: Decimal | None
+ price4RRSUFR: Decimal | None
+ price4ECRS: Decimal | None
+ price4OFFEC: Decimal | None
+ price4OnlineNONSPIN: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDOWN: Decimal | None
+ price4OfflineNONSPIN: Decimal | None
+ quantityMW4: Decimal | None
+ blockIndicator5: str | None
+ price5RRSPFR: Decimal | None
+ price5RRSFFR: Decimal | None
+ price5RRSUFR: Decimal | None
+ price5ECRS: Decimal | None
+ price5OFFEC: Decimal | None
+ price5OnlineNONSPIN: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDOWN: Decimal | None
+ price5OfflineNONSPIN: Decimal | None
+ quantityMW5: Decimal | None
+
+ @property
+ def _7d_trig_mcpc_50xfip_history(self) -> Archive[np3_987_ex._7dTrigMcpc50xfipHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-987-ex', np3_987_ex._7dTrigMcpc50xfipHistoryRow, {'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'QSE': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', '50xFIP': 'FIPx50', 'MCPC': 'MCPC', 'Multi-Hour Block Flag': 'multiHourBlockFlag', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRSPFR': 'price1RRSPFR', 'PRICE1 RRSFFR': 'price1RRSFFR', 'PRICE1 RRSUFR': 'price1RRSUFR', 'PRICE1 ECRS': 'price1ECRS', 'PRICE1 OFFEC': 'price1OFFEC', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNONSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDOWN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNONSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRSPFR': 'price2RRSPFR', 'PRICE2 RRSFFR': 'price2RRSFFR', 'PRICE2 RRSUFR': 'price2RRSUFR', 'PRICE2 ECRS': 'price2ECRS', 'PRICE2 OFFEC': 'price2OFFEC', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNONSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDOWN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNONSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRSPFR': 'price3RRSPFR', 'PRICE3 RRSFFR': 'price3RRSFFR', 'PRICE3 RRSUFR': 'price3RRSUFR', 'PRICE3 ECRS': 'price3ECRS', 'PRICE3 OFFEC': 'price3OFFEC', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNONSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDOWN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNONSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRSPFR': 'price4RRSPFR', 'PRICE4 RRSFFR': 'price4RRSFFR', 'PRICE4 RRSUFR': 'price4RRSUFR', 'PRICE4 ECRS': 'price4ECRS', 'PRICE4 OFFEC': 'price4OFFEC', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNONSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDOWN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNONSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRSPFR': 'price5RRSPFR', 'PRICE5 RRSFFR': 'price5RRSFFR', 'PRICE5 RRSUFR': 'price5RRSUFR', 'PRICE5 ECRS': 'price5ECRS', 'PRICE5 OFFEC': 'price5OFFEC', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNONSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDOWN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNONSPIN', 'QUANTITY MW5': 'quantityMW5'}, {'deliveryDate': '%m/%d/%Y'}, member='7day_Event_Trigger_DAM_MCPC_Exceeds_50XFIP-[0-9]*.csv', datetimes={}, variants=())
+
def _7d_trig_mcpc_50xfip(self, *, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDOWNFrom: Decimal | None = None, price5REGDOWNTo: Decimal | None = None, price5OfflineNONSPINFrom: Decimal | None = None, price5OfflineNONSPINTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, FIPx50From: Decimal | None = None, FIPx50To: Decimal | None = None, MCPCFrom: Decimal | None = None, MCPCTo: Decimal | None = None, multiHourBlockFlag: bool | None = None, blockIndicator1: str | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, price1OFFECFrom: Decimal | None = None, price1OFFECTo: Decimal | None = None, price1OnlineNONSPINFrom: Decimal | None = None, price1OnlineNONSPINTo: Decimal | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDOWNFrom: Decimal | None = None, price1REGDOWNTo: Decimal | None = None, price1OfflineNONSPINFrom: Decimal | None = None, price1OfflineNONSPINTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, blockIndicator2: str | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, price2OFFECFrom: Decimal | None = None, price2OFFECTo: Decimal | None = None, price2OnlineNONSPINFrom: Decimal | None = None, price2OnlineNONSPINTo: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDOWNFrom: Decimal | None = None, price2REGDOWNTo: Decimal | None = None, price2OfflineNONSPINFrom: Decimal | None = None, price2OfflineNONSPINTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, blockIndicator3: str | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, price3OFFECFrom: Decimal | None = None, price3OFFECTo: Decimal | None = None, price3OnlineNONSPINFrom: Decimal | None = None, price3OnlineNONSPINTo: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDOWNFrom: Decimal | None = None, price3REGDOWNTo: Decimal | None = None, price3OfflineNONSPINFrom: Decimal | None = None, price3OfflineNONSPINTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, blockIndicator4: str | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, price4OFFECFrom: Decimal | None = None, price4OFFECTo: Decimal | None = None, price4OnlineNONSPINFrom: Decimal | None = None, price4OnlineNONSPINTo: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDOWNFrom: Decimal | None = None, price4REGDOWNTo: Decimal | None = None, price4OfflineNONSPINFrom: Decimal | None = None, price4OfflineNONSPINTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, blockIndicator5: str | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, price5OFFECFrom: Decimal | None = None, price5OFFECTo: Decimal | None = None, price5OnlineNONSPINFrom: Decimal | None = None, price5OnlineNONSPINTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_987_ex._7dTrigMcpc50xfipRow]:
'7-Day Event Trigger Posting When DAM MCPC Exceeds 50xFIP'
return self._client._page('/np3-987-ex/7d_trig_mcpc_50xfip', np3_987_ex._7dTrigMcpc50xfipRow, {'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDOWNFrom': price5REGDOWNFrom, 'price5REGDOWNTo': price5REGDOWNTo, 'price5OfflineNONSPINFrom': price5OfflineNONSPINFrom, 'price5OfflineNONSPINTo': price5OfflineNONSPINTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'FIPx50From': FIPx50From, 'FIPx50To': FIPx50To, 'MCPCFrom': MCPCFrom, 'MCPCTo': MCPCTo, 'multiHourBlockFlag': multiHourBlockFlag, 'blockIndicator1': blockIndicator1, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'price1OFFECFrom': price1OFFECFrom, 'price1OFFECTo': price1OFFECTo, 'price1OnlineNONSPINFrom': price1OnlineNONSPINFrom, 'price1OnlineNONSPINTo': price1OnlineNONSPINTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDOWNFrom': price1REGDOWNFrom, 'price1REGDOWNTo': price1REGDOWNTo, 'price1OfflineNONSPINFrom': price1OfflineNONSPINFrom, 'price1OfflineNONSPINTo': price1OfflineNONSPINTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'blockIndicator2': blockIndicator2, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'price2OFFECFrom': price2OFFECFrom, 'price2OFFECTo': price2OFFECTo, 'price2OnlineNONSPINFrom': price2OnlineNONSPINFrom, 'price2OnlineNONSPINTo': price2OnlineNONSPINTo, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDOWNFrom': price2REGDOWNFrom, 'price2REGDOWNTo': price2REGDOWNTo, 'price2OfflineNONSPINFrom': price2OfflineNONSPINFrom, 'price2OfflineNONSPINTo': price2OfflineNONSPINTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'blockIndicator3': blockIndicator3, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'price3OFFECFrom': price3OFFECFrom, 'price3OFFECTo': price3OFFECTo, 'price3OnlineNONSPINFrom': price3OnlineNONSPINFrom, 'price3OnlineNONSPINTo': price3OnlineNONSPINTo, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDOWNFrom': price3REGDOWNFrom, 'price3REGDOWNTo': price3REGDOWNTo, 'price3OfflineNONSPINFrom': price3OfflineNONSPINFrom, 'price3OfflineNONSPINTo': price3OfflineNONSPINTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'blockIndicator4': blockIndicator4, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'price4OFFECFrom': price4OFFECFrom, 'price4OFFECTo': price4OFFECTo, 'price4OnlineNONSPINFrom': price4OnlineNONSPINFrom, 'price4OnlineNONSPINTo': price4OnlineNONSPINTo, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDOWNFrom': price4REGDOWNFrom, 'price4REGDOWNTo': price4REGDOWNTo, 'price4OfflineNONSPINFrom': price4OfflineNONSPINFrom, 'price4OfflineNONSPINTo': price4OfflineNONSPINTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'blockIndicator5': blockIndicator5, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'price5OFFECFrom': price5OFFECFrom, 'price5OFFECTo': price5OFFECTo, 'price5OnlineNONSPINFrom': price5OnlineNONSPINFrom, 'price5OnlineNONSPINTo': price5OnlineNONSPINTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4733,6 +7811,110 @@ class _7dTrigLmp50xfipRow(Row):
submittedTPOPrice8: Decimal | None
submittedTPOPrice9: Decimal | None
+ class _7dTrigLmp50xfipHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ resourceName: str | None
+ LMP: Decimal | None
+ FIPx50: Decimal | None
+ SCED2CurveMW1: Decimal | None
+ SCED2CurvePrice1: Decimal | None
+ SCED2CurveMW2: Decimal | None
+ SCED2CurvePrice2: Decimal | None
+ SCED2CurveMW3: Decimal | None
+ SCED2CurvePrice3: Decimal | None
+ SCED2CurveMW4: Decimal | None
+ SCED2CurvePrice4: Decimal | None
+ SCED2CurveMW5: Decimal | None
+ SCED2CurvePrice5: Decimal | None
+ SCED2CurveMW6: Decimal | None
+ SCED2CurvePrice6: Decimal | None
+ SCED2CurveMW7: Decimal | None
+ SCED2CurvePrice7: Decimal | None
+ SCED2CurveMW8: Decimal | None
+ SCED2CurvePrice8: Decimal | None
+ SCED2CurveMW9: Decimal | None
+ SCED2CurvePrice9: Decimal | None
+ SCED2CurveMW10: Decimal | None
+ SCED2CurvePrice10: Decimal | None
+ SCED2CurveMW11: Decimal | None
+ SCED2CurvePrice11: Decimal | None
+ SCED2CurveMW12: Decimal | None
+ SCED2CurvePrice12: Decimal | None
+ SCED2CurveMW13: Decimal | None
+ SCED2CurvePrice13: Decimal | None
+ SCED2CurveMW14: Decimal | None
+ SCED2CurvePrice14: Decimal | None
+ SCED2CurveMW15: Decimal | None
+ SCED2CurvePrice15: Decimal | None
+ SCED2CurveMW16: Decimal | None
+ SCED2CurvePrice16: Decimal | None
+ SCED2CurveMW17: Decimal | None
+ SCED2CurvePrice17: Decimal | None
+ SCED2CurveMW18: Decimal | None
+ SCED2CurvePrice18: Decimal | None
+ SCED2CurveMW19: Decimal | None
+ SCED2CurvePrice19: Decimal | None
+ SCED2CurveMW20: Decimal | None
+ SCED2CurvePrice20: Decimal | None
+ SCED2CurveMW21: Decimal | None
+ SCED2CurvePrice21: Decimal | None
+ SCED2CurveMW22: Decimal | None
+ SCED2CurvePrice22: Decimal | None
+ SCED2CurveMW23: Decimal | None
+ SCED2CurvePrice23: Decimal | None
+ SCED2CurveMW24: Decimal | None
+ SCED2CurvePrice24: Decimal | None
+ SCED2CurveMW25: Decimal | None
+ SCED2CurvePrice25: Decimal | None
+ SCED2CurveMW26: Decimal | None
+ SCED2CurvePrice26: Decimal | None
+ SCED2CurveMW27: Decimal | None
+ SCED2CurvePrice27: Decimal | None
+ SCED2CurveMW28: Decimal | None
+ SCED2CurvePrice28: Decimal | None
+ SCED2CurveMW29: Decimal | None
+ SCED2CurvePrice29: Decimal | None
+ SCED2CurveMW30: Decimal | None
+ SCED2CurvePrice30: Decimal | None
+ SCED2CurveMW31: Decimal | None
+ SCED2CurvePrice31: Decimal | None
+ SCED2CurveMW32: Decimal | None
+ SCED2CurvePrice32: Decimal | None
+ SCED2CurveMW33: Decimal | None
+ SCED2CurvePrice33: Decimal | None
+ SCED2CurveMW34: Decimal | None
+ SCED2CurvePrice34: Decimal | None
+ SCED2CurveMW35: Decimal | None
+ SCED2CurvePrice35: Decimal | None
+ bidType: str | None
+ submittedTPOMW1: Decimal | None
+ submittedTPOPrice1: Decimal | None
+ submittedTPOMW2: Decimal | None
+ submittedTPOPrice2: Decimal | None
+ submittedTPOMW3: Decimal | None
+ submittedTPOPrice3: Decimal | None
+ submittedTPOMW4: Decimal | None
+ submittedTPOPrice4: Decimal | None
+ submittedTPOMW5: Decimal | None
+ submittedTPOPrice5: Decimal | None
+ submittedTPOMW6: Decimal | None
+ submittedTPOPrice6: Decimal | None
+ submittedTPOMW7: Decimal | None
+ submittedTPOPrice7: Decimal | None
+ submittedTPOMW8: Decimal | None
+ submittedTPOPrice8: Decimal | None
+ submittedTPOMW9: Decimal | None
+ submittedTPOPrice9: Decimal | None
+ submittedTPOMW10: Decimal | None
+ submittedTPOPrice10: Decimal | None
+ proxyExtension: str | None
+
+ @property
+ def _7d_trig_lmp_50xfip_history(self) -> Archive[np3_987_ex._7dTrigLmp50xfipHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-987-ex', np3_987_ex._7dTrigLmp50xfipHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Resource Name': 'resourceName', 'LMP': 'LMP', '50xFIP': 'FIPx50', 'SCED2 Curve-MW1': 'SCED2CurveMW1', 'SCED2 Curve-Price1': 'SCED2CurvePrice1', 'SCED2 Curve-MW2': 'SCED2CurveMW2', 'SCED2 Curve-Price2': 'SCED2CurvePrice2', 'SCED2 Curve-MW3': 'SCED2CurveMW3', 'SCED2 Curve-Price3': 'SCED2CurvePrice3', 'SCED2 Curve-MW4': 'SCED2CurveMW4', 'SCED2 Curve-Price4': 'SCED2CurvePrice4', 'SCED2 Curve-MW5': 'SCED2CurveMW5', 'SCED2 Curve-Price5': 'SCED2CurvePrice5', 'SCED2 Curve-MW6': 'SCED2CurveMW6', 'SCED2 Curve-Price6': 'SCED2CurvePrice6', 'SCED2 Curve-MW7': 'SCED2CurveMW7', 'SCED2 Curve-Price7': 'SCED2CurvePrice7', 'SCED2 Curve-MW8': 'SCED2CurveMW8', 'SCED2 Curve-Price8': 'SCED2CurvePrice8', 'SCED2 Curve-MW9': 'SCED2CurveMW9', 'SCED2 Curve-Price9': 'SCED2CurvePrice9', 'SCED2 Curve-MW10': 'SCED2CurveMW10', 'SCED2 Curve-Price10': 'SCED2CurvePrice10', 'SCED2 Curve-MW11': 'SCED2CurveMW11', 'SCED2 Curve-Price11': 'SCED2CurvePrice11', 'SCED2 Curve-MW12': 'SCED2CurveMW12', 'SCED2 Curve-Price12': 'SCED2CurvePrice12', 'SCED2 Curve-MW13': 'SCED2CurveMW13', 'SCED2 Curve-Price13': 'SCED2CurvePrice13', 'SCED2 Curve-MW14': 'SCED2CurveMW14', 'SCED2 Curve-Price14': 'SCED2CurvePrice14', 'SCED2 Curve-MW15': 'SCED2CurveMW15', 'SCED2 Curve-Price15': 'SCED2CurvePrice15', 'SCED2 Curve-MW16': 'SCED2CurveMW16', 'SCED2 Curve-Price16': 'SCED2CurvePrice16', 'SCED2 Curve-MW17': 'SCED2CurveMW17', 'SCED2 Curve-Price17': 'SCED2CurvePrice17', 'SCED2 Curve-MW18': 'SCED2CurveMW18', 'SCED2 Curve-Price18': 'SCED2CurvePrice18', 'SCED2 Curve-MW19': 'SCED2CurveMW19', 'SCED2 Curve-Price19': 'SCED2CurvePrice19', 'SCED2 Curve-MW20': 'SCED2CurveMW20', 'SCED2 Curve-Price20': 'SCED2CurvePrice20', 'SCED2 Curve-MW21': 'SCED2CurveMW21', 'SCED2 Curve-Price21': 'SCED2CurvePrice21', 'SCED2 Curve-MW22': 'SCED2CurveMW22', 'SCED2 Curve-Price22': 'SCED2CurvePrice22', 'SCED2 Curve-MW23': 'SCED2CurveMW23', 'SCED2 Curve-Price23': 'SCED2CurvePrice23', 'SCED2 Curve-MW24': 'SCED2CurveMW24', 'SCED2 Curve-Price24': 'SCED2CurvePrice24', 'SCED2 Curve-MW25': 'SCED2CurveMW25', 'SCED2 Curve-Price25': 'SCED2CurvePrice25', 'SCED2 Curve-MW26': 'SCED2CurveMW26', 'SCED2 Curve-Price26': 'SCED2CurvePrice26', 'SCED2 Curve-MW27': 'SCED2CurveMW27', 'SCED2 Curve-Price27': 'SCED2CurvePrice27', 'SCED2 Curve-MW28': 'SCED2CurveMW28', 'SCED2 Curve-Price28': 'SCED2CurvePrice28', 'SCED2 Curve-MW29': 'SCED2CurveMW29', 'SCED2 Curve-Price29': 'SCED2CurvePrice29', 'SCED2 Curve-MW30': 'SCED2CurveMW30', 'SCED2 Curve-Price30': 'SCED2CurvePrice30', 'SCED2 Curve-MW31': 'SCED2CurveMW31', 'SCED2 Curve-Price31': 'SCED2CurvePrice31', 'SCED2 Curve-MW32': 'SCED2CurveMW32', 'SCED2 Curve-Price32': 'SCED2CurvePrice32', 'SCED2 Curve-MW33': 'SCED2CurveMW33', 'SCED2 Curve-Price33': 'SCED2CurvePrice33', 'SCED2 Curve-MW34': 'SCED2CurveMW34', 'SCED2 Curve-Price34': 'SCED2CurvePrice34', 'SCED2 Curve-MW35': 'SCED2CurveMW35', 'SCED2 Curve-Price35': 'SCED2CurvePrice35', 'Bid Type': 'bidType', 'Submitted TPO-MW1': 'submittedTPOMW1', 'Submitted TPO-Price1': 'submittedTPOPrice1', 'Submitted TPO-MW2': 'submittedTPOMW2', 'Submitted TPO-Price2': 'submittedTPOPrice2', 'Submitted TPO-MW3': 'submittedTPOMW3', 'Submitted TPO-Price3': 'submittedTPOPrice3', 'Submitted TPO-MW4': 'submittedTPOMW4', 'Submitted TPO-Price4': 'submittedTPOPrice4', 'Submitted TPO-MW5': 'submittedTPOMW5', 'Submitted TPO-Price5': 'submittedTPOPrice5', 'Submitted TPO-MW6': 'submittedTPOMW6', 'Submitted TPO-Price6': 'submittedTPOPrice6', 'Submitted TPO-MW7': 'submittedTPOMW7', 'Submitted TPO-Price7': 'submittedTPOPrice7', 'Submitted TPO-MW8': 'submittedTPOMW8', 'Submitted TPO-Price8': 'submittedTPOPrice8', 'Submitted TPO-MW9': 'submittedTPOMW9', 'Submitted TPO-Price9': 'submittedTPOPrice9', 'Submitted TPO-MW10': 'submittedTPOMW10', 'Submitted TPO-Price10': 'submittedTPOPrice10', 'Proxy Extension': 'proxyExtension'}, {}, member='7day_Event_Trigger_LMP_Exceeds_50XFIP-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _7d_trig_lmp_50xfip(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, resourceName: str | None = None, LMPFrom: Decimal | None = None, LMPTo: Decimal | None = None, FIPx50From: Decimal | None = None, FIPx50To: Decimal | None = None, SCED2CurveMW1From: Decimal | None = None, SCED2CurveMW1To: Decimal | None = None, SCED2CurvePrice1From: Decimal | None = None, SCED2CurvePrice1To: Decimal | None = None, SCED2CurveMW2From: Decimal | None = None, SCED2CurveMW2To: Decimal | None = None, SCED2CurvePrice2From: Decimal | None = None, SCED2CurvePrice2To: Decimal | None = None, SCED2CurveMW3From: Decimal | None = None, SCED2CurveMW3To: Decimal | None = None, SCED2CurvePrice3From: Decimal | None = None, SCED2CurvePrice3To: Decimal | None = None, SCED2CurveMW4From: Decimal | None = None, SCED2CurveMW4To: Decimal | None = None, SCED2CurvePrice4From: Decimal | None = None, SCED2CurvePrice4To: Decimal | None = None, SCED2CurveMW5From: Decimal | None = None, SCED2CurveMW5To: Decimal | None = None, SCED2CurvePrice5From: Decimal | None = None, SCED2CurvePrice5To: Decimal | None = None, SCED2CurveMW6From: Decimal | None = None, SCED2CurveMW6To: Decimal | None = None, SCED2CurvePrice6From: Decimal | None = None, SCED2CurvePrice6To: Decimal | None = None, SCED2CurveMW7From: Decimal | None = None, SCED2CurveMW7To: Decimal | None = None, SCED2CurvePrice7From: Decimal | None = None, SCED2CurvePrice7To: Decimal | None = None, SCED2CurveMW8From: Decimal | None = None, SCED2CurveMW8To: Decimal | None = None, SCED2CurvePrice8From: Decimal | None = None, SCED2CurvePrice8To: Decimal | None = None, SCED2CurveMW9From: Decimal | None = None, SCED2CurveMW9To: Decimal | None = None, SCED2CurvePrice9From: Decimal | None = None, SCED2CurvePrice9To: Decimal | None = None, SCED2CurveMW10From: Decimal | None = None, SCED2CurveMW10To: Decimal | None = None, SCED2CurvePrice10From: Decimal | None = None, SCED2CurvePrice10To: Decimal | None = None, SCED2CurveMW11From: Decimal | None = None, SCED2CurveMW11To: Decimal | None = None, SCED2CurvePrice11From: Decimal | None = None, SCED2CurvePrice11To: Decimal | None = None, SCED2CurveMW12From: Decimal | None = None, SCED2CurveMW12To: Decimal | None = None, SCED2CurvePrice12From: Decimal | None = None, SCED2CurvePrice12To: Decimal | None = None, SCED2CurveMW13From: Decimal | None = None, SCED2CurveMW13To: Decimal | None = None, SCED2CurvePrice13From: Decimal | None = None, SCED2CurvePrice13To: Decimal | None = None, SCED2CurveMW14From: Decimal | None = None, SCED2CurveMW14To: Decimal | None = None, SCED2CurvePrice14From: Decimal | None = None, SCED2CurvePrice14To: Decimal | None = None, SCED2CurveMW15From: Decimal | None = None, SCED2CurveMW15To: Decimal | None = None, SCED2CurvePrice15From: Decimal | None = None, SCED2CurvePrice15To: Decimal | None = None, SCED2CurveMW16From: Decimal | None = None, SCED2CurveMW16To: Decimal | None = None, SCED2CurvePrice16From: Decimal | None = None, SCED2CurvePrice16To: Decimal | None = None, SCED2CurveMW17From: Decimal | None = None, SCED2CurveMW17To: Decimal | None = None, SCED2CurvePrice17From: Decimal | None = None, SCED2CurvePrice17To: Decimal | None = None, SCED2CurveMW18From: Decimal | None = None, SCED2CurveMW18To: Decimal | None = None, SCED2CurvePrice18From: Decimal | None = None, SCED2CurvePrice18To: Decimal | None = None, SCED2CurveMW19From: Decimal | None = None, SCED2CurveMW19To: Decimal | None = None, SCED2CurvePrice19From: Decimal | None = None, SCED2CurvePrice19To: Decimal | None = None, SCED2CurveMW20From: Decimal | None = None, SCED2CurveMW20To: Decimal | None = None, SCED2CurvePrice20From: Decimal | None = None, SCED2CurvePrice20To: Decimal | None = None, SCED2CurveMW21From: Decimal | None = None, SCED2CurveMW21To: Decimal | None = None, SCED2CurvePrice21From: Decimal | None = None, SCED2CurvePrice21To: Decimal | None = None, SCED2CurveMW22From: Decimal | None = None, SCED2CurveMW22To: Decimal | None = None, SCED2CurvePrice22From: Decimal | None = None, SCED2CurvePrice22To: Decimal | None = None, SCED2CurveMW23From: Decimal | None = None, SCED2CurveMW23To: Decimal | None = None, SCED2CurvePrice23From: Decimal | None = None, SCED2CurvePrice23To: Decimal | None = None, SCED2CurveMW24From: Decimal | None = None, SCED2CurveMW24To: Decimal | None = None, SCED2CurvePrice24From: Decimal | None = None, SCED2CurvePrice24To: Decimal | None = None, SCED2CurveMW25From: Decimal | None = None, SCED2CurveMW25To: Decimal | None = None, SCED2CurvePrice25From: Decimal | None = None, SCED2CurvePrice25To: Decimal | None = None, SCED2CurveMW26From: Decimal | None = None, SCED2CurveMW26To: Decimal | None = None, SCED2CurvePrice26From: Decimal | None = None, SCED2CurvePrice26To: Decimal | None = None, SCED2CurveMW27From: Decimal | None = None, SCED2CurveMW27To: Decimal | None = None, SCED2CurvePrice27From: Decimal | None = None, SCED2CurvePrice27To: Decimal | None = None, SCED2CurveMW28From: Decimal | None = None, SCED2CurveMW28To: Decimal | None = None, SCED2CurvePrice28From: Decimal | None = None, SCED2CurvePrice28To: Decimal | None = None, SCED2CurveMW29From: Decimal | None = None, SCED2CurveMW29To: Decimal | None = None, SCED2CurvePrice29From: Decimal | None = None, SCED2CurvePrice29To: Decimal | None = None, SCED2CurveMW30From: Decimal | None = None, SCED2CurveMW30To: Decimal | None = None, SCED2CurvePrice30From: Decimal | None = None, SCED2CurvePrice30To: Decimal | None = None, SCED2CurveMW31From: Decimal | None = None, SCED2CurveMW31To: Decimal | None = None, SCED2CurvePrice31From: Decimal | None = None, SCED2CurvePrice31To: Decimal | None = None, SCED2CurveMW32From: Decimal | None = None, SCED2CurveMW32To: Decimal | None = None, SCED2CurvePrice32From: Decimal | None = None, SCED2CurvePrice32To: Decimal | None = None, SCED2CurveMW33From: Decimal | None = None, SCED2CurveMW33To: Decimal | None = None, SCED2CurvePrice33From: Decimal | None = None, SCED2CurvePrice33To: Decimal | None = None, SCED2CurveMW34From: Decimal | None = None, SCED2CurveMW34To: Decimal | None = None, SCED2CurvePrice34From: Decimal | None = None, SCED2CurvePrice34To: Decimal | None = None, SCED2CurveMW35From: Decimal | None = None, SCED2CurveMW35To: Decimal | None = None, SCED2CurvePrice35From: Decimal | None = None, SCED2CurvePrice35To: Decimal | None = None, bidType: str | None = None, submittedTPOMW1From: Decimal | None = None, submittedTPOMW1To: Decimal | None = None, submittedTPOPrice1From: Decimal | None = None, submittedTPOPrice1To: Decimal | None = None, submittedTPOMW2From: Decimal | None = None, submittedTPOMW2To: Decimal | None = None, submittedTPOPrice2From: Decimal | None = None, submittedTPOPrice2To: Decimal | None = None, submittedTPOMW3From: Decimal | None = None, submittedTPOMW3To: Decimal | None = None, submittedTPOPrice3From: Decimal | None = None, submittedTPOPrice3To: Decimal | None = None, submittedTPOMW4From: Decimal | None = None, submittedTPOMW4To: Decimal | None = None, submittedTPOPrice4From: Decimal | None = None, submittedTPOPrice4To: Decimal | None = None, submittedTPOMW5From: Decimal | None = None, submittedTPOMW5To: Decimal | None = None, submittedTPOPrice5From: Decimal | None = None, submittedTPOPrice5To: Decimal | None = None, submittedTPOMW6From: Decimal | None = None, submittedTPOMW6To: Decimal | None = None, submittedTPOPrice6From: Decimal | None = None, submittedTPOPrice6To: Decimal | None = None, submittedTPOMW7From: Decimal | None = None, submittedTPOMW7To: Decimal | None = None, submittedTPOPrice7From: Decimal | None = None, submittedTPOPrice7To: Decimal | None = None, submittedTPOMW8From: Decimal | None = None, submittedTPOMW8To: Decimal | None = None, submittedTPOPrice8From: Decimal | None = None, submittedTPOPrice8To: Decimal | None = None, submittedTPOMW9From: Decimal | None = None, submittedTPOMW9To: Decimal | None = None, submittedTPOPrice9From: Decimal | None = None, submittedTPOPrice9To: Decimal | None = None, submittedTPOMW10From: Decimal | None = None, submittedTPOMW10To: Decimal | None = None, submittedTPOPrice10From: Decimal | None = None, submittedTPOPrice10To: Decimal | None = None, proxyExtension: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_987_ex._7dTrigLmp50xfipRow]:
'7-Day Event Trigger Posting when LMP exceeds 50xFIP'
return self._client._page('/np3-987-ex/7d_trig_lmp_50xfip', np3_987_ex._7dTrigLmp50xfipRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'resourceName': resourceName, 'LMPFrom': LMPFrom, 'LMPTo': LMPTo, 'FIPx50From': FIPx50From, 'FIPx50To': FIPx50To, 'SCED2CurveMW1From': SCED2CurveMW1From, 'SCED2CurveMW1To': SCED2CurveMW1To, 'SCED2CurvePrice1From': SCED2CurvePrice1From, 'SCED2CurvePrice1To': SCED2CurvePrice1To, 'SCED2CurveMW2From': SCED2CurveMW2From, 'SCED2CurveMW2To': SCED2CurveMW2To, 'SCED2CurvePrice2From': SCED2CurvePrice2From, 'SCED2CurvePrice2To': SCED2CurvePrice2To, 'SCED2CurveMW3From': SCED2CurveMW3From, 'SCED2CurveMW3To': SCED2CurveMW3To, 'SCED2CurvePrice3From': SCED2CurvePrice3From, 'SCED2CurvePrice3To': SCED2CurvePrice3To, 'SCED2CurveMW4From': SCED2CurveMW4From, 'SCED2CurveMW4To': SCED2CurveMW4To, 'SCED2CurvePrice4From': SCED2CurvePrice4From, 'SCED2CurvePrice4To': SCED2CurvePrice4To, 'SCED2CurveMW5From': SCED2CurveMW5From, 'SCED2CurveMW5To': SCED2CurveMW5To, 'SCED2CurvePrice5From': SCED2CurvePrice5From, 'SCED2CurvePrice5To': SCED2CurvePrice5To, 'SCED2CurveMW6From': SCED2CurveMW6From, 'SCED2CurveMW6To': SCED2CurveMW6To, 'SCED2CurvePrice6From': SCED2CurvePrice6From, 'SCED2CurvePrice6To': SCED2CurvePrice6To, 'SCED2CurveMW7From': SCED2CurveMW7From, 'SCED2CurveMW7To': SCED2CurveMW7To, 'SCED2CurvePrice7From': SCED2CurvePrice7From, 'SCED2CurvePrice7To': SCED2CurvePrice7To, 'SCED2CurveMW8From': SCED2CurveMW8From, 'SCED2CurveMW8To': SCED2CurveMW8To, 'SCED2CurvePrice8From': SCED2CurvePrice8From, 'SCED2CurvePrice8To': SCED2CurvePrice8To, 'SCED2CurveMW9From': SCED2CurveMW9From, 'SCED2CurveMW9To': SCED2CurveMW9To, 'SCED2CurvePrice9From': SCED2CurvePrice9From, 'SCED2CurvePrice9To': SCED2CurvePrice9To, 'SCED2CurveMW10From': SCED2CurveMW10From, 'SCED2CurveMW10To': SCED2CurveMW10To, 'SCED2CurvePrice10From': SCED2CurvePrice10From, 'SCED2CurvePrice10To': SCED2CurvePrice10To, 'SCED2CurveMW11From': SCED2CurveMW11From, 'SCED2CurveMW11To': SCED2CurveMW11To, 'SCED2CurvePrice11From': SCED2CurvePrice11From, 'SCED2CurvePrice11To': SCED2CurvePrice11To, 'SCED2CurveMW12From': SCED2CurveMW12From, 'SCED2CurveMW12To': SCED2CurveMW12To, 'SCED2CurvePrice12From': SCED2CurvePrice12From, 'SCED2CurvePrice12To': SCED2CurvePrice12To, 'SCED2CurveMW13From': SCED2CurveMW13From, 'SCED2CurveMW13To': SCED2CurveMW13To, 'SCED2CurvePrice13From': SCED2CurvePrice13From, 'SCED2CurvePrice13To': SCED2CurvePrice13To, 'SCED2CurveMW14From': SCED2CurveMW14From, 'SCED2CurveMW14To': SCED2CurveMW14To, 'SCED2CurvePrice14From': SCED2CurvePrice14From, 'SCED2CurvePrice14To': SCED2CurvePrice14To, 'SCED2CurveMW15From': SCED2CurveMW15From, 'SCED2CurveMW15To': SCED2CurveMW15To, 'SCED2CurvePrice15From': SCED2CurvePrice15From, 'SCED2CurvePrice15To': SCED2CurvePrice15To, 'SCED2CurveMW16From': SCED2CurveMW16From, 'SCED2CurveMW16To': SCED2CurveMW16To, 'SCED2CurvePrice16From': SCED2CurvePrice16From, 'SCED2CurvePrice16To': SCED2CurvePrice16To, 'SCED2CurveMW17From': SCED2CurveMW17From, 'SCED2CurveMW17To': SCED2CurveMW17To, 'SCED2CurvePrice17From': SCED2CurvePrice17From, 'SCED2CurvePrice17To': SCED2CurvePrice17To, 'SCED2CurveMW18From': SCED2CurveMW18From, 'SCED2CurveMW18To': SCED2CurveMW18To, 'SCED2CurvePrice18From': SCED2CurvePrice18From, 'SCED2CurvePrice18To': SCED2CurvePrice18To, 'SCED2CurveMW19From': SCED2CurveMW19From, 'SCED2CurveMW19To': SCED2CurveMW19To, 'SCED2CurvePrice19From': SCED2CurvePrice19From, 'SCED2CurvePrice19To': SCED2CurvePrice19To, 'SCED2CurveMW20From': SCED2CurveMW20From, 'SCED2CurveMW20To': SCED2CurveMW20To, 'SCED2CurvePrice20From': SCED2CurvePrice20From, 'SCED2CurvePrice20To': SCED2CurvePrice20To, 'SCED2CurveMW21From': SCED2CurveMW21From, 'SCED2CurveMW21To': SCED2CurveMW21To, 'SCED2CurvePrice21From': SCED2CurvePrice21From, 'SCED2CurvePrice21To': SCED2CurvePrice21To, 'SCED2CurveMW22From': SCED2CurveMW22From, 'SCED2CurveMW22To': SCED2CurveMW22To, 'SCED2CurvePrice22From': SCED2CurvePrice22From, 'SCED2CurvePrice22To': SCED2CurvePrice22To, 'SCED2CurveMW23From': SCED2CurveMW23From, 'SCED2CurveMW23To': SCED2CurveMW23To, 'SCED2CurvePrice23From': SCED2CurvePrice23From, 'SCED2CurvePrice23To': SCED2CurvePrice23To, 'SCED2CurveMW24From': SCED2CurveMW24From, 'SCED2CurveMW24To': SCED2CurveMW24To, 'SCED2CurvePrice24From': SCED2CurvePrice24From, 'SCED2CurvePrice24To': SCED2CurvePrice24To, 'SCED2CurveMW25From': SCED2CurveMW25From, 'SCED2CurveMW25To': SCED2CurveMW25To, 'SCED2CurvePrice25From': SCED2CurvePrice25From, 'SCED2CurvePrice25To': SCED2CurvePrice25To, 'SCED2CurveMW26From': SCED2CurveMW26From, 'SCED2CurveMW26To': SCED2CurveMW26To, 'SCED2CurvePrice26From': SCED2CurvePrice26From, 'SCED2CurvePrice26To': SCED2CurvePrice26To, 'SCED2CurveMW27From': SCED2CurveMW27From, 'SCED2CurveMW27To': SCED2CurveMW27To, 'SCED2CurvePrice27From': SCED2CurvePrice27From, 'SCED2CurvePrice27To': SCED2CurvePrice27To, 'SCED2CurveMW28From': SCED2CurveMW28From, 'SCED2CurveMW28To': SCED2CurveMW28To, 'SCED2CurvePrice28From': SCED2CurvePrice28From, 'SCED2CurvePrice28To': SCED2CurvePrice28To, 'SCED2CurveMW29From': SCED2CurveMW29From, 'SCED2CurveMW29To': SCED2CurveMW29To, 'SCED2CurvePrice29From': SCED2CurvePrice29From, 'SCED2CurvePrice29To': SCED2CurvePrice29To, 'SCED2CurveMW30From': SCED2CurveMW30From, 'SCED2CurveMW30To': SCED2CurveMW30To, 'SCED2CurvePrice30From': SCED2CurvePrice30From, 'SCED2CurvePrice30To': SCED2CurvePrice30To, 'SCED2CurveMW31From': SCED2CurveMW31From, 'SCED2CurveMW31To': SCED2CurveMW31To, 'SCED2CurvePrice31From': SCED2CurvePrice31From, 'SCED2CurvePrice31To': SCED2CurvePrice31To, 'SCED2CurveMW32From': SCED2CurveMW32From, 'SCED2CurveMW32To': SCED2CurveMW32To, 'SCED2CurvePrice32From': SCED2CurvePrice32From, 'SCED2CurvePrice32To': SCED2CurvePrice32To, 'SCED2CurveMW33From': SCED2CurveMW33From, 'SCED2CurveMW33To': SCED2CurveMW33To, 'SCED2CurvePrice33From': SCED2CurvePrice33From, 'SCED2CurvePrice33To': SCED2CurvePrice33To, 'SCED2CurveMW34From': SCED2CurveMW34From, 'SCED2CurveMW34To': SCED2CurveMW34To, 'SCED2CurvePrice34From': SCED2CurvePrice34From, 'SCED2CurvePrice34To': SCED2CurvePrice34To, 'SCED2CurveMW35From': SCED2CurveMW35From, 'SCED2CurveMW35To': SCED2CurveMW35To, 'SCED2CurvePrice35From': SCED2CurvePrice35From, 'SCED2CurvePrice35To': SCED2CurvePrice35To, 'bidType': bidType, 'submittedTPOMW1From': submittedTPOMW1From, 'submittedTPOMW1To': submittedTPOMW1To, 'submittedTPOPrice1From': submittedTPOPrice1From, 'submittedTPOPrice1To': submittedTPOPrice1To, 'submittedTPOMW2From': submittedTPOMW2From, 'submittedTPOMW2To': submittedTPOMW2To, 'submittedTPOPrice2From': submittedTPOPrice2From, 'submittedTPOPrice2To': submittedTPOPrice2To, 'submittedTPOMW3From': submittedTPOMW3From, 'submittedTPOMW3To': submittedTPOMW3To, 'submittedTPOPrice3From': submittedTPOPrice3From, 'submittedTPOPrice3To': submittedTPOPrice3To, 'submittedTPOMW4From': submittedTPOMW4From, 'submittedTPOMW4To': submittedTPOMW4To, 'submittedTPOPrice4From': submittedTPOPrice4From, 'submittedTPOPrice4To': submittedTPOPrice4To, 'submittedTPOMW5From': submittedTPOMW5From, 'submittedTPOMW5To': submittedTPOMW5To, 'submittedTPOPrice5From': submittedTPOPrice5From, 'submittedTPOPrice5To': submittedTPOPrice5To, 'submittedTPOMW6From': submittedTPOMW6From, 'submittedTPOMW6To': submittedTPOMW6To, 'submittedTPOPrice6From': submittedTPOPrice6From, 'submittedTPOPrice6To': submittedTPOPrice6To, 'submittedTPOMW7From': submittedTPOMW7From, 'submittedTPOMW7To': submittedTPOMW7To, 'submittedTPOPrice7From': submittedTPOPrice7From, 'submittedTPOPrice7To': submittedTPOPrice7To, 'submittedTPOMW8From': submittedTPOMW8From, 'submittedTPOMW8To': submittedTPOMW8To, 'submittedTPOPrice8From': submittedTPOPrice8From, 'submittedTPOPrice8To': submittedTPOPrice8To, 'submittedTPOMW9From': submittedTPOMW9From, 'submittedTPOMW9To': submittedTPOMW9To, 'submittedTPOPrice9From': submittedTPOPrice9From, 'submittedTPOPrice9To': submittedTPOPrice9To, 'submittedTPOMW10From': submittedTPOMW10From, 'submittedTPOMW10To': submittedTPOMW10To, 'submittedTPOPrice10From': submittedTPOPrice10From, 'submittedTPOPrice10To': submittedTPOPrice10To, 'proxyExtension': proxyExtension, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4795,6 +7977,58 @@ class _7dTrigRtmMcpc50xfipRow(Row):
repeatHourFlag: bool | None
resourceName: str | None
+ class _7dTrigRtmMcpc50xfipHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ resourceName: str | None
+ FIPx50: Decimal | None
+ RTMCPC: Decimal | None
+ price1REGUP: Decimal | None
+ price1REGDOWN: Decimal | None
+ price1RRSPFR: Decimal | None
+ price1RRSUFR: Decimal | None
+ price1RRSFFR: Decimal | None
+ price1NONSPIN: Decimal | None
+ price1ECRS: Decimal | None
+ quantityMW1: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDOWN: Decimal | None
+ price2RRSPFR: Decimal | None
+ price2RRSUFR: Decimal | None
+ price2RRSFFR: Decimal | None
+ price2NONSPIN: Decimal | None
+ price2ECRS: Decimal | None
+ quantityMW2: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDOWN: Decimal | None
+ price3RRSPFR: Decimal | None
+ price3RRSUFR: Decimal | None
+ price3RRSFFR: Decimal | None
+ price3NONSPIN: Decimal | None
+ price3ECRS: Decimal | None
+ quantityMW3: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDOWN: Decimal | None
+ price4RRSPFR: Decimal | None
+ price4RRSUFR: Decimal | None
+ price4RRSFFR: Decimal | None
+ price4NONSPIN: Decimal | None
+ price4ECRS: Decimal | None
+ quantityMW4: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDOWN: Decimal | None
+ price5RRSPFR: Decimal | None
+ price5RRSUFR: Decimal | None
+ price5RRSFFR: Decimal | None
+ price5NONSPIN: Decimal | None
+ price5ECRS: Decimal | None
+ quantityMW5: Decimal | None
+
+ @property
+ def _7d_trig_rtm_mcpc_50xfip_history(self) -> Archive[np3_987_ex._7dTrigRtmMcpc50xfipHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-987-ex', np3_987_ex._7dTrigRtmMcpc50xfipHistoryRow, {'SCED Time Stamp': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'Resource Name': 'resourceName', '50xFIP': 'FIPx50', 'RTMCPC': 'RTMCPC', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDOWN', 'PRICE1 RRSPFR': 'price1RRSPFR', 'PRICE1 RRSUFR': 'price1RRSUFR', 'PRICE1 RRSFFR': 'price1RRSFFR', 'PRICE1 NONSPIN': 'price1NONSPIN', 'PRICE1 ECRS': 'price1ECRS', 'QUANTITY MW1': 'quantityMW1', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDOWN', 'PRICE2 RRSPFR': 'price2RRSPFR', 'PRICE2 RRSUFR': 'price2RRSUFR', 'PRICE2 RRSFFR': 'price2RRSFFR', 'PRICE2 NONSPIN': 'price2NONSPIN', 'PRICE2 ECRS': 'price2ECRS', 'QUANTITY MW2': 'quantityMW2', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDOWN', 'PRICE3 RRSPFR': 'price3RRSPFR', 'PRICE3 RRSUFR': 'price3RRSUFR', 'PRICE3 RRSFFR': 'price3RRSFFR', 'PRICE3 NONSPIN': 'price3NONSPIN', 'PRICE3 ECRS': 'price3ECRS', 'QUANTITY MW3': 'quantityMW3', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDOWN', 'PRICE4 RRSPFR': 'price4RRSPFR', 'PRICE4 RRSUFR': 'price4RRSUFR', 'PRICE4 RRSFFR': 'price4RRSFFR', 'PRICE4 NONSPIN': 'price4NONSPIN', 'PRICE4 ECRS': 'price4ECRS', 'QUANTITY MW4': 'quantityMW4', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDOWN', 'PRICE5 RRSPFR': 'price5RRSPFR', 'PRICE5 RRSUFR': 'price5RRSUFR', 'PRICE5 RRSFFR': 'price5RRSFFR', 'PRICE5 NONSPIN': 'price5NONSPIN', 'PRICE5 ECRS': 'price5ECRS', 'QUANTITY MW5': 'quantityMW5'}, {}, member='7day_Event_Trigger_RTM_MCPC_Exceeds_50XFIP-[0-9]*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def _7d_trig_rtm_mcpc_50xfip(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, resourceName: str | None = None, FIPx50From: Decimal | None = None, FIPx50To: Decimal | None = None, RTMCPCFrom: Decimal | None = None, RTMCPCTo: Decimal | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDOWNFrom: Decimal | None = None, price1REGDOWNTo: Decimal | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price1NONSPINFrom: Decimal | None = None, price1NONSPINTo: Decimal | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDOWNFrom: Decimal | None = None, price2REGDOWNTo: Decimal | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2NONSPINFrom: Decimal | None = None, price2NONSPINTo: Decimal | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDOWNFrom: Decimal | None = None, price3REGDOWNTo: Decimal | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3NONSPINFrom: Decimal | None = None, price3NONSPINTo: Decimal | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDOWNFrom: Decimal | None = None, price4REGDOWNTo: Decimal | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4NONSPINFrom: Decimal | None = None, price4NONSPINTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDOWNFrom: Decimal | None = None, price5REGDOWNTo: Decimal | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5NONSPINFrom: Decimal | None = None, price5NONSPINTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_987_ex._7dTrigRtmMcpc50xfipRow]:
'7-Day Event Trigger Posting when RTM MCPC exceeds 50xFIP'
return self._client._page('/np3-987-ex/7d_trig_rtm_mcpc_50xfip', np3_987_ex._7dTrigRtmMcpc50xfipRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'resourceName': resourceName, 'FIPx50From': FIPx50From, 'FIPx50To': FIPx50To, 'RTMCPCFrom': RTMCPCFrom, 'RTMCPCTo': RTMCPCTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDOWNFrom': price1REGDOWNFrom, 'price1REGDOWNTo': price1REGDOWNTo, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1NONSPINFrom': price1NONSPINFrom, 'price1NONSPINTo': price1NONSPINTo, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDOWNFrom': price2REGDOWNFrom, 'price2REGDOWNTo': price2REGDOWNTo, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2NONSPINFrom': price2NONSPINFrom, 'price2NONSPINTo': price2NONSPINTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDOWNFrom': price3REGDOWNFrom, 'price3REGDOWNTo': price3REGDOWNTo, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3NONSPINFrom': price3NONSPINFrom, 'price3NONSPINTo': price3NONSPINTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDOWNFrom': price4REGDOWNFrom, 'price4REGDOWNTo': price4REGDOWNTo, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4NONSPINFrom': price4NONSPINFrom, 'price4NONSPINTo': price4NONSPINTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDOWNFrom': price5REGDOWNFrom, 'price5REGDOWNTo': price5REGDOWNTo, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5NONSPINFrom': price5NONSPINFrom, 'price5NONSPINTo': price5NONSPINTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4811,6 +8045,25 @@ def _7d_trig_rtm_mcpc_50xfip_iter_async(self, *, SCEDTimestampFrom: datetime | N
'7-Day Event Trigger Posting when RTM MCPC exceeds 50xFIP'
return self._client._aiter('/np3-987-ex/7d_trig_rtm_mcpc_50xfip', np3_987_ex._7dTrigRtmMcpc50xfipRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'resourceName': resourceName, 'FIPx50From': FIPx50From, 'FIPx50To': FIPx50To, 'RTMCPCFrom': RTMCPCFrom, 'RTMCPCTo': RTMCPCTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDOWNFrom': price1REGDOWNFrom, 'price1REGDOWNTo': price1REGDOWNTo, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1NONSPINFrom': price1NONSPINFrom, 'price1NONSPINTo': price1NONSPINTo, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDOWNFrom': price2REGDOWNFrom, 'price2REGDOWNTo': price2REGDOWNTo, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2NONSPINFrom': price2NONSPINFrom, 'price2NONSPINTo': price2NONSPINTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDOWNFrom': price3REGDOWNFrom, 'price3REGDOWNTo': price3REGDOWNTo, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3NONSPINFrom': price3NONSPINFrom, 'price3NONSPINTo': price3NONSPINTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDOWNFrom': price4REGDOWNFrom, 'price4REGDOWNTo': price4REGDOWNTo, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4NONSPINFrom': price4NONSPINFrom, 'price4NONSPINTo': price4NONSPINTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDOWNFrom': price5REGDOWNFrom, 'price5REGDOWNTo': price5REGDOWNTo, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5NONSPINFrom': price5NONSPINFrom, 'price5NONSPINTo': price5NONSPINTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'size': size, 'sort': sort, 'dir': dir})
+class np3_988_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class ResourcesHistoryRow(Row):
+ ownerRE: str | None
+ resourceName: str | None
+ resourceType: str | None
+ splitGenResource: str | None
+ DME: str | None
+ DMEDuns: str | None
+ RMR: bool | None
+
+ @property
+ def resources_history(self) -> Archive[np3_988_er.ResourcesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-988-er', np3_988_er.ResourcesHistoryRow, {'OWNER RE': 'ownerRE', 'RESOURCE NAME': 'resourceName', 'TYPE': 'resourceType', 'SPLIT GEN RESOURCE': 'splitGenResource', 'DME': 'DME', 'DME DUNS': 'DMEDuns', 'RMR': 'RMR'}, {}, member='*.csv', datetimes={}, variants=())
+
class np3_990_ex:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -4835,6 +8088,32 @@ class _60SasmGenResAsOfferAwardsRow(Row):
resourceName: str | None
resourceType: str | None
+ class _60SasmGenResAsOfferAwardsHistoryRow(Row):
+ SASMId: datetime | None
+ deliveryDate: date | None
+ hourEnding: int | None
+ resourceName: str | None
+ resourceType: str | None
+ REGUPAawarded: Decimal | None
+ REGUPMCPC: Decimal | None
+ REGDNAwarded: Decimal | None
+ REGDNMCPC: Decimal | None
+ RRSPFRAwarded: Decimal | None = None
+ RRSFFRAwarded: Decimal | None = None
+ RRSUFRAwarded: Decimal | None = None
+ RRSMCPC: Decimal | None
+ ECRSSAwarded: Decimal | None = None
+ OFFECAwarded: Decimal | None = None
+ ECRSMCPC: Decimal | None = None
+ NSPINAwarded: Decimal | None
+ NSPINMCPC: Decimal | None
+ RRSAwarded: Decimal | None = None
+
+ @property
+ def _60_sasm_gen_res_as_offer_awards_history(self) -> Archive[np3_990_ex._60SasmGenResAsOfferAwardsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-990-ex', np3_990_ex._60SasmGenResAsOfferAwardsHistoryRow, {'SASM ID': 'SASMId', 'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'REGUP Awarded': 'REGUPAawarded', 'REGUP MCPC': 'REGUPMCPC', 'REGDN Awarded': 'REGDNAwarded', 'REGDN MCPC': 'REGDNMCPC', 'RRSPFR Awarded': 'RRSPFRAwarded', 'RRSFFR Awarded': 'RRSFFRAwarded', 'RRSUFR Awarded': 'RRSUFRAwarded', 'RRS MCPC': 'RRSMCPC', 'ECRSS Awarded': 'ECRSSAwarded', 'OFFEC Awarded': 'OFFECAwarded', 'ECRS MCPC': 'ECRSMCPC', 'NSPIN Awarded': 'NSPINAwarded', 'NSPIN MCPC': 'NSPINMCPC'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_SASM_Generation_Resource_AS_Offer_Awards-[0-9]*.csv', datetimes={'SASMId': '%m/%d/%Y %I:%M:%S %p'}, variants=({'SASM ID': 'SASMId', 'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'REGUP Awarded': 'REGUPAawarded', 'REGUP MCPC': 'REGUPMCPC', 'REGDN Awarded': 'REGDNAwarded', 'REGDN MCPC': 'REGDNMCPC', 'RRS Awarded': 'RRSAwarded', 'RRS MCPC': 'RRSMCPC', 'NSPIN Awarded': 'NSPINAwarded', 'NSPIN MCPC': 'NSPINMCPC'},))
+
def _60_sasm_gen_res_as_offer_awards(self, *, SASMIdFrom: datetime | None = None, SASMIdTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, resourceName: str | None = None, resourceType: str | None = None, REGUPAawardedFrom: Decimal | None = None, REGUPAawardedTo: Decimal | None = None, REGUPMCPCFrom: Decimal | None = None, REGUPMCPCTo: Decimal | None = None, REGDNAwardedFrom: Decimal | None = None, REGDNAwardedTo: Decimal | None = None, REGDNMCPCFrom: Decimal | None = None, REGDNMCPCTo: Decimal | None = None, RRSPFRAwardedFrom: Decimal | None = None, RRSPFRAwardedTo: Decimal | None = None, RRSFFRAwardedFrom: Decimal | None = None, RRSFFRAwardedTo: Decimal | None = None, ECRSSAwardedFrom: Decimal | None = None, ECRSSAwardedTo: Decimal | None = None, RRSUFRAwardedFrom: Decimal | None = None, RRSUFRAwardedTo: Decimal | None = None, OFFECAwardedFrom: Decimal | None = None, OFFECAwardedTo: Decimal | None = None, RRSMCPCFrom: Decimal | None = None, RRSMCPCTo: Decimal | None = None, ECRSMCPCFrom: Decimal | None = None, ECRSMCPCTo: Decimal | None = None, NSPINAwardedFrom: Decimal | None = None, NSPINAwardedTo: Decimal | None = None, NSPINMCPCFrom: Decimal | None = None, NSPINMCPCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_990_ex._60SasmGenResAsOfferAwardsRow]:
'60-Day SASM Generation Resource AS Offer Awards'
return self._client._page('/np3-990-ex/60_sasm_gen_res_as_offer_awards', np3_990_ex._60SasmGenResAsOfferAwardsRow, {'SASMIdFrom': SASMIdFrom, 'SASMIdTo': SASMIdTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'resourceName': resourceName, 'resourceType': resourceType, 'REGUPAawardedFrom': REGUPAawardedFrom, 'REGUPAawardedTo': REGUPAawardedTo, 'REGUPMCPCFrom': REGUPMCPCFrom, 'REGUPMCPCTo': REGUPMCPCTo, 'REGDNAwardedFrom': REGDNAwardedFrom, 'REGDNAwardedTo': REGDNAwardedTo, 'REGDNMCPCFrom': REGDNMCPCFrom, 'REGDNMCPCTo': REGDNMCPCTo, 'RRSPFRAwardedFrom': RRSPFRAwardedFrom, 'RRSPFRAwardedTo': RRSPFRAwardedTo, 'RRSFFRAwardedFrom': RRSFFRAwardedFrom, 'RRSFFRAwardedTo': RRSFFRAwardedTo, 'ECRSSAwardedFrom': ECRSSAwardedFrom, 'ECRSSAwardedTo': ECRSSAwardedTo, 'RRSUFRAwardedFrom': RRSUFRAwardedFrom, 'RRSUFRAwardedTo': RRSUFRAwardedTo, 'OFFECAwardedFrom': OFFECAwardedFrom, 'OFFECAwardedTo': OFFECAwardedTo, 'RRSMCPCFrom': RRSMCPCFrom, 'RRSMCPCTo': RRSMCPCTo, 'ECRSMCPCFrom': ECRSMCPCFrom, 'ECRSMCPCTo': ECRSMCPCTo, 'NSPINAwardedFrom': NSPINAwardedFrom, 'NSPINAwardedTo': NSPINAwardedTo, 'NSPINMCPCFrom': NSPINMCPCFrom, 'NSPINMCPCTo': NSPINMCPCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4914,6 +8193,80 @@ class _60SasmGenResAsOffersRow(Row):
quantityMW5: Decimal | None
resourceName: str | None
+ class _60SasmGenResAsOffersHistoryRow(Row):
+ deliveryDate: date | None
+ SASMId: datetime | None
+ hourEnding: int | None
+ qseName: str | None
+ dmeName: str | None = None
+ resourceName: str | None
+ multiHourBlockFlag: bool | None
+ blockIndicator1: str | None
+ price1RRSPFR: Decimal | None = None
+ price1RRSFFR: Decimal | None = None
+ price1RRSUFR: Decimal | None = None
+ price1ECRS: Decimal | None = None
+ price1OFFEC: Decimal | None = None
+ price1OnlineNONSPIN: Decimal | None
+ price1REGUP: Decimal | None
+ price1REGDOWN: Decimal | None
+ price1OfflineNONSPIN: Decimal | None
+ quantityMW1: Decimal | None
+ blockIndicator2: str | None
+ price2RRSPFR: Decimal | None = None
+ price2RRSFFR: Decimal | None = None
+ price2RRSUFR: Decimal | None = None
+ price2ECRS: Decimal | None = None
+ price2OFFEC: Decimal | None = None
+ price2OnlineNONSPIN: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDOWN: Decimal | None
+ price2OfflineNONSPIN: Decimal | None
+ quantityMW2: Decimal | None
+ blockIndicator3: str | None
+ price3RRSPFR: Decimal | None = None
+ price3RRSFFR: Decimal | None = None
+ price3RRSUFR: Decimal | None = None
+ price3ECRS: Decimal | None = None
+ price3OFFEC: Decimal | None = None
+ price3OnlineNONSPIN: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDOWN: Decimal | None
+ price3OfflineNONSPIN: Decimal | None
+ quantityMW3: Decimal | None
+ blockIndicator4: str | None
+ price4RRSPFR: Decimal | None = None
+ price4RRSFFR: Decimal | None = None
+ price4RRSUFR: Decimal | None = None
+ price4ECRS: Decimal | None = None
+ price4OFFEC: Decimal | None = None
+ price4OnlineNONSPIN: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDOWN: Decimal | None
+ price4OfflineNONSPIN: Decimal | None
+ quantityMW4: Decimal | None
+ blockIndicator5: str | None
+ price5RRSPFR: Decimal | None = None
+ price5RRSFFR: Decimal | None = None
+ price5RRSUFR: Decimal | None = None
+ price5ECRS: Decimal | None = None
+ price5OFFEC: Decimal | None = None
+ price5OnlineNONSPIN: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDOWN: Decimal | None
+ price5OfflineNONSPIN: Decimal | None
+ quantityMW5: Decimal | None
+ price1RRS: Decimal | None = None
+ price2RRS: Decimal | None = None
+ price3RRS: Decimal | None = None
+ price4RRS: Decimal | None = None
+ price5RRS: Decimal | None = None
+
+ @property
+ def _60_sasm_gen_res_as_offers_history(self) -> Archive[np3_990_ex._60SasmGenResAsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-990-ex', np3_990_ex._60SasmGenResAsOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'SASM ID': 'SASMId', 'Hour Ending': 'hourEnding', 'QSE NAME': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Multi-Hour Block Flag': 'multiHourBlockFlag', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRSPFR': 'price1RRSPFR', 'PRICE1 RRSFFR': 'price1RRSFFR', 'PRICE1 RRSUFR': 'price1RRSUFR', 'PRICE1 ECRS': 'price1ECRS', 'PRICE1 OFFEC': 'price1OFFEC', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNONSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDOWN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNONSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRSPFR': 'price2RRSPFR', 'PRICE2 RRSFFR': 'price2RRSFFR', 'PRICE2 RRSUFR': 'price2RRSUFR', 'PRICE2 ECRS': 'price2ECRS', 'PRICE2 OFFEC': 'price2OFFEC', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNONSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDOWN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNONSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRSPFR': 'price3RRSPFR', 'PRICE3 RRSFFR': 'price3RRSFFR', 'PRICE3 RRSUFR': 'price3RRSUFR', 'PRICE3 ECRS': 'price3ECRS', 'PRICE3 OFFEC': 'price3OFFEC', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNONSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDOWN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNONSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRSPFR': 'price4RRSPFR', 'PRICE4 RRSFFR': 'price4RRSFFR', 'PRICE4 RRSUFR': 'price4RRSUFR', 'PRICE4 ECRS': 'price4ECRS', 'PRICE4 OFFEC': 'price4OFFEC', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNONSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDOWN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNONSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRSPFR': 'price5RRSPFR', 'PRICE5 RRSFFR': 'price5RRSFFR', 'PRICE5 RRSUFR': 'price5RRSUFR', 'PRICE5 ECRS': 'price5ECRS', 'PRICE5 OFFEC': 'price5OFFEC', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNONSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDOWN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNONSPIN', 'QUANTITY MW5': 'quantityMW5'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_SASM_Generation_Resource_AS_Offers-[0-9]*.csv', datetimes={'SASMId': '%m/%d/%Y %H:%M:%S'}, variants=({'Delivery Date': 'deliveryDate', 'SASM ID': 'SASMId', 'Hour Ending': 'hourEnding', 'QSE NAME': 'qseName', 'Resource Name': 'resourceName', 'Multi-Hour Block Flag': 'multiHourBlockFlag', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRS': 'price1RRS', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNONSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDOWN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNONSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRS': 'price2RRS', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNONSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDOWN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNONSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRS': 'price3RRS', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNONSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDOWN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNONSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRS': 'price4RRS', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNONSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDOWN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNONSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRS': 'price5RRS', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNONSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDOWN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNONSPIN', 'QUANTITY MW5': 'quantityMW5'},))
+
def _60_sasm_gen_res_as_offers(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, SASMIdFrom: datetime | None = None, SASMIdTo: datetime | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, qseName: str | None = None, dmeName: str | None = None, resourceName: str | None = None, multiHourBlockFlag: bool | None = None, blockIndicator1: str | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price1OnlineNONSPINFrom: Decimal | None = None, price1OnlineNONSPINTo: Decimal | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDOWNFrom: Decimal | None = None, price1REGDOWNTo: Decimal | None = None, price1OfflineNONSPINFrom: Decimal | None = None, price1OfflineNONSPINTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, blockIndicator2: str | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2OnlineNONSPINFrom: Decimal | None = None, price2OnlineNONSPINTo: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDOWNFrom: Decimal | None = None, price2REGDOWNTo: Decimal | None = None, price2OfflineNONSPINFrom: Decimal | None = None, price2OfflineNONSPINTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, blockIndicator3: str | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3OnlineNONSPINFrom: Decimal | None = None, price3OnlineNONSPINTo: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDOWNFrom: Decimal | None = None, price3REGDOWNTo: Decimal | None = None, price3OfflineNONSPINFrom: Decimal | None = None, price3OfflineNONSPINTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, blockIndicator4: str | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, price4OnlineNONSPINFrom: Decimal | None = None, price4OnlineNONSPINTo: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDOWNFrom: Decimal | None = None, price4REGDOWNTo: Decimal | None = None, price4OfflineNONSPINFrom: Decimal | None = None, price4OfflineNONSPINTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, blockIndicator5: str | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5OnlineNONSPINFrom: Decimal | None = None, price5OnlineNONSPINTo: Decimal | None = None, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDOWNFrom: Decimal | None = None, price5REGDOWNTo: Decimal | None = None, price5OfflineNONSPINFrom: Decimal | None = None, price5OfflineNONSPINTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, price1OFFECFrom: Decimal | None = None, price1OFFECTo: Decimal | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, price2OFFECFrom: Decimal | None = None, price2OFFECTo: Decimal | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, price3OFFECFrom: Decimal | None = None, price3OFFECTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, price4OFFECFrom: Decimal | None = None, price4OFFECTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, price5OFFECFrom: Decimal | None = None, price5OFFECTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_990_ex._60SasmGenResAsOffersRow]:
'60-Day SASM Generation Resource AS Offers'
return self._client._page('/np3-990-ex/60_sasm_gen_res_as_offers', np3_990_ex._60SasmGenResAsOffersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'SASMIdFrom': SASMIdFrom, 'SASMIdTo': SASMIdTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'qseName': qseName, 'dmeName': dmeName, 'resourceName': resourceName, 'multiHourBlockFlag': multiHourBlockFlag, 'blockIndicator1': blockIndicator1, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price1OnlineNONSPINFrom': price1OnlineNONSPINFrom, 'price1OnlineNONSPINTo': price1OnlineNONSPINTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDOWNFrom': price1REGDOWNFrom, 'price1REGDOWNTo': price1REGDOWNTo, 'price1OfflineNONSPINFrom': price1OfflineNONSPINFrom, 'price1OfflineNONSPINTo': price1OfflineNONSPINTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'blockIndicator2': blockIndicator2, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2OnlineNONSPINFrom': price2OnlineNONSPINFrom, 'price2OnlineNONSPINTo': price2OnlineNONSPINTo, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDOWNFrom': price2REGDOWNFrom, 'price2REGDOWNTo': price2REGDOWNTo, 'price2OfflineNONSPINFrom': price2OfflineNONSPINFrom, 'price2OfflineNONSPINTo': price2OfflineNONSPINTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'blockIndicator3': blockIndicator3, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3OnlineNONSPINFrom': price3OnlineNONSPINFrom, 'price3OnlineNONSPINTo': price3OnlineNONSPINTo, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDOWNFrom': price3REGDOWNFrom, 'price3REGDOWNTo': price3REGDOWNTo, 'price3OfflineNONSPINFrom': price3OfflineNONSPINFrom, 'price3OfflineNONSPINTo': price3OfflineNONSPINTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'blockIndicator4': blockIndicator4, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4OnlineNONSPINFrom': price4OnlineNONSPINFrom, 'price4OnlineNONSPINTo': price4OnlineNONSPINTo, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDOWNFrom': price4REGDOWNFrom, 'price4REGDOWNTo': price4REGDOWNTo, 'price4OfflineNONSPINFrom': price4OfflineNONSPINFrom, 'price4OfflineNONSPINTo': price4OfflineNONSPINTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'blockIndicator5': blockIndicator5, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5OnlineNONSPINFrom': price5OnlineNONSPINFrom, 'price5OnlineNONSPINTo': price5OnlineNONSPINTo, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDOWNFrom': price5REGDOWNFrom, 'price5REGDOWNTo': price5REGDOWNTo, 'price5OfflineNONSPINFrom': price5OfflineNONSPINFrom, 'price5OfflineNONSPINTo': price5OfflineNONSPINTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'price1OFFECFrom': price1OFFECFrom, 'price1OFFECTo': price1OFFECTo, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'price2OFFECFrom': price2OFFECFrom, 'price2OFFECTo': price2OFFECTo, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'price3OFFECFrom': price3OFFECFrom, 'price3OFFECTo': price3OFFECTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'price4OFFECFrom': price4OFFECFrom, 'price4OFFECTo': price4OFFECTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'price5OFFECFrom': price5OFFECFrom, 'price5OFFECTo': price5OFFECTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -4949,6 +8302,32 @@ class _60SasmLoadResAsOfferAwardsRow(Row):
resourceName: str | None
resourceType: str | None
+ class _60SasmLoadResAsOfferAwardsHistoryRow(Row):
+ SASMId: datetime | None
+ deliveryDate: date | None
+ hourEnding: int | None
+ resourceName: str | None
+ resourceType: str | None
+ REGUPAawarded: Decimal | None
+ REGUPMCPC: Decimal | None
+ REGDNAwarded: Decimal | None
+ REGDNMCPC: Decimal | None
+ RRSPFRAwarded: Decimal | None = None
+ RRSFFRAwarded: Decimal | None = None
+ RRSUFRAwarded: Decimal | None = None
+ RRSMCPC: Decimal | None
+ ECRSMAwarded: Decimal | None = None
+ ECRSSAwarded: Decimal | None = None
+ ECRSMCPC: Decimal | None = None
+ NSPINAwarded: Decimal | None
+ NSPINMCPC: Decimal | None
+ RRSAwarded: Decimal | None = None
+
+ @property
+ def _60_sasm_load_res_as_offer_awards_history(self) -> Archive[np3_990_ex._60SasmLoadResAsOfferAwardsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-990-ex', np3_990_ex._60SasmLoadResAsOfferAwardsHistoryRow, {'SASM ID': 'SASMId', 'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'REGUP Awarded': 'REGUPAawarded', 'REGUP MCPC': 'REGUPMCPC', 'REGDN Awarded': 'REGDNAwarded', 'REGDN MCPC': 'REGDNMCPC', 'RRSPFR Awarded': 'RRSPFRAwarded', 'RRSFFR Awarded': 'RRSFFRAwarded', 'RRSUFR Awarded': 'RRSUFRAwarded', 'RRS MCPC': 'RRSMCPC', 'ECRSM Awarded': 'ECRSMAwarded', 'ECRSS Awarded': 'ECRSSAwarded', 'ECRS MCPC': 'ECRSMCPC', 'NSPIN Awarded': 'NSPINAwarded', 'NSPIN MCPC': 'NSPINMCPC'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_SASM_Load_Resource_AS_Offer_Awards-[0-9]*.csv', datetimes={'SASMId': '%m/%d/%Y %I:%M:%S %p'}, variants=({'SASM ID': 'SASMId', 'Delivery Date': 'deliveryDate', 'Hour Ending': 'hourEnding', 'Resource Name': 'resourceName', 'Resource Type': 'resourceType', 'REGUP Awarded': 'REGUPAawarded', 'REGUP MCPC': 'REGUPMCPC', 'REGDN Awarded': 'REGDNAwarded', 'REGDN MCPC': 'REGDNMCPC', 'RRS Awarded': 'RRSAwarded', 'RRS MCPC': 'RRSMCPC', 'NSPIN Awarded': 'NSPINAwarded', 'NSPIN MCPC': 'NSPINMCPC'},))
+
def _60_sasm_load_res_as_offer_awards(self, *, SASMIdFrom: datetime | None = None, SASMIdTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, resourceName: str | None = None, resourceType: str | None = None, REGUPAawardedFrom: Decimal | None = None, REGUPAawardedTo: Decimal | None = None, REGUPMCPCFrom: Decimal | None = None, REGUPMCPCTo: Decimal | None = None, REGDNAwardedFrom: Decimal | None = None, REGDNAwardedTo: Decimal | None = None, REGDNMCPCFrom: Decimal | None = None, REGDNMCPCTo: Decimal | None = None, RRSPFRAwardedFrom: Decimal | None = None, RRSPFRAwardedTo: Decimal | None = None, RRSFFRAwardedFrom: Decimal | None = None, RRSFFRAwardedTo: Decimal | None = None, RRSUFRAwardedFrom: Decimal | None = None, RRSUFRAwardedTo: Decimal | None = None, RRSMCPCFrom: Decimal | None = None, RRSMCPCTo: Decimal | None = None, NSPINAwardedFrom: Decimal | None = None, NSPINAwardedTo: Decimal | None = None, NSPINMCPCFrom: Decimal | None = None, NSPINMCPCTo: Decimal | None = None, ECRSMAwardedFrom: Decimal | None = None, ECRSMAwardedTo: Decimal | None = None, ECRSSAwardedFrom: Decimal | None = None, ECRSSAwardedTo: Decimal | None = None, ECRSMCPCFrom: Decimal | None = None, ECRSMCPCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_990_ex._60SasmLoadResAsOfferAwardsRow]:
'60-Day SASM Load Resource AS Offer Awards'
return self._client._page('/np3-990-ex/60_sasm_load_res_as_offer_awards', np3_990_ex._60SasmLoadResAsOfferAwardsRow, {'SASMIdFrom': SASMIdFrom, 'SASMIdTo': SASMIdTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'resourceName': resourceName, 'resourceType': resourceType, 'REGUPAawardedFrom': REGUPAawardedFrom, 'REGUPAawardedTo': REGUPAawardedTo, 'REGUPMCPCFrom': REGUPMCPCFrom, 'REGUPMCPCTo': REGUPMCPCTo, 'REGDNAwardedFrom': REGDNAwardedFrom, 'REGDNAwardedTo': REGDNAwardedTo, 'REGDNMCPCFrom': REGDNMCPCFrom, 'REGDNMCPCTo': REGDNMCPCTo, 'RRSPFRAwardedFrom': RRSPFRAwardedFrom, 'RRSPFRAwardedTo': RRSPFRAwardedTo, 'RRSFFRAwardedFrom': RRSFFRAwardedFrom, 'RRSFFRAwardedTo': RRSFFRAwardedTo, 'RRSUFRAwardedFrom': RRSUFRAwardedFrom, 'RRSUFRAwardedTo': RRSUFRAwardedTo, 'RRSMCPCFrom': RRSMCPCFrom, 'RRSMCPCTo': RRSMCPCTo, 'NSPINAwardedFrom': NSPINAwardedFrom, 'NSPINAwardedTo': NSPINAwardedTo, 'NSPINMCPCFrom': NSPINMCPCFrom, 'NSPINMCPCTo': NSPINMCPCTo, 'ECRSMAwardedFrom': ECRSMAwardedFrom, 'ECRSMAwardedTo': ECRSMAwardedTo, 'ECRSSAwardedFrom': ECRSSAwardedFrom, 'ECRSSAwardedTo': ECRSSAwardedTo, 'ECRSMCPCFrom': ECRSMCPCFrom, 'ECRSMCPCTo': ECRSMCPCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5028,6 +8407,80 @@ class _60SasmLoadResAsOffersRow(Row):
quantityMW5: Decimal | None
resourceName: str | None
+ class _60SasmLoadResAsOffersHistoryRow(Row):
+ deliveryDate: date | None
+ SASMId: datetime | None
+ hourEnding: int | None
+ qseName: str | None
+ dmeName: str | None = None
+ resourceName: str | None
+ multiHourBlockFlag: bool | None
+ blockIndicator1: str | None
+ price1RRSPFR: Decimal | None = None
+ price1RRSFFR: Decimal | None = None
+ price1RRSUFR: Decimal | None = None
+ price1ECRS: Decimal | None = None
+ price1OFFEC: Decimal | None = None
+ price1OnlineNONSPIN: Decimal | None
+ price1REGUP: Decimal | None
+ price1REGDOWN: Decimal | None
+ price1OfflineNONSPIN: Decimal | None
+ quantityMW1: Decimal | None
+ blockIndicator2: str | None
+ price2RRSPFR: Decimal | None = None
+ price2RRSFFR: Decimal | None = None
+ price2RRSUFR: Decimal | None = None
+ price2ECRS: Decimal | None = None
+ price2OFFEC: Decimal | None = None
+ price2OnlineNONSPIN: Decimal | None
+ price2REGUP: Decimal | None
+ price2REGDOWN: Decimal | None
+ price2OfflineNONSPIN: Decimal | None
+ quantityMW2: Decimal | None
+ blockIndicator3: str | None
+ price3RRSPFR: Decimal | None = None
+ price3RRSFFR: Decimal | None = None
+ price3RRSUFR: Decimal | None = None
+ price3ECRS: Decimal | None = None
+ price3OFFEC: Decimal | None = None
+ price3OnlineNONSPIN: Decimal | None
+ price3REGUP: Decimal | None
+ price3REGDOWN: Decimal | None
+ price3OfflineNONSPIN: Decimal | None
+ quantityMW3: Decimal | None
+ blockIndicator4: str | None
+ price4RRSPFR: Decimal | None = None
+ price4RRSFFR: Decimal | None = None
+ price4RRSUFR: Decimal | None = None
+ price4ECRS: Decimal | None = None
+ price4OFFEC: Decimal | None = None
+ price4OnlineNONSPIN: Decimal | None
+ price4REGUP: Decimal | None
+ price4REGDOWN: Decimal | None
+ price4OfflineNONSPIN: Decimal | None
+ quantityMW4: Decimal | None
+ blockIndicator5: str | None
+ price5RRSPFR: Decimal | None = None
+ price5RRSFFR: Decimal | None = None
+ price5RRSUFR: Decimal | None = None
+ price5ECRS: Decimal | None = None
+ price5OFFEC: Decimal | None = None
+ price5OnlineNONSPIN: Decimal | None
+ price5REGUP: Decimal | None
+ price5REGDOWN: Decimal | None
+ price5OfflineNONSPIN: Decimal | None
+ quantityMW5: Decimal | None
+ price1RRS: Decimal | None = None
+ price2RRS: Decimal | None = None
+ price3RRS: Decimal | None = None
+ price4RRS: Decimal | None = None
+ price5RRS: Decimal | None = None
+
+ @property
+ def _60_sasm_load_res_as_offers_history(self) -> Archive[np3_990_ex._60SasmLoadResAsOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-990-ex', np3_990_ex._60SasmLoadResAsOffersHistoryRow, {'Delivery Date': 'deliveryDate', 'SASM ID': 'SASMId', 'Hour Ending': 'hourEnding', 'QSE NAME': 'qseName', 'DME': 'dmeName', 'Resource Name': 'resourceName', 'Multi-Hour Block Flag': 'multiHourBlockFlag', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRSPFR': 'price1RRSPFR', 'PRICE1 RRSFFR': 'price1RRSFFR', 'PRICE1 RRSUFR': 'price1RRSUFR', 'PRICE1 ECRS': 'price1ECRS', 'PRICE1 OFFEC': 'price1OFFEC', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNONSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDOWN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNONSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRSPFR': 'price2RRSPFR', 'PRICE2 RRSFFR': 'price2RRSFFR', 'PRICE2 RRSUFR': 'price2RRSUFR', 'PRICE2 ECRS': 'price2ECRS', 'PRICE2 OFFEC': 'price2OFFEC', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNONSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDOWN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNONSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRSPFR': 'price3RRSPFR', 'PRICE3 RRSFFR': 'price3RRSFFR', 'PRICE3 RRSUFR': 'price3RRSUFR', 'PRICE3 ECRS': 'price3ECRS', 'PRICE3 OFFEC': 'price3OFFEC', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNONSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDOWN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNONSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRSPFR': 'price4RRSPFR', 'PRICE4 RRSFFR': 'price4RRSFFR', 'PRICE4 RRSUFR': 'price4RRSUFR', 'PRICE4 ECRS': 'price4ECRS', 'PRICE4 OFFEC': 'price4OFFEC', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNONSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDOWN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNONSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRSPFR': 'price5RRSPFR', 'PRICE5 RRSFFR': 'price5RRSFFR', 'PRICE5 RRSUFR': 'price5RRSUFR', 'PRICE5 ECRS': 'price5ECRS', 'PRICE5 OFFEC': 'price5OFFEC', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNONSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDOWN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNONSPIN', 'QUANTITY MW5': 'quantityMW5'}, {'deliveryDate': '%m/%d/%Y'}, member='60d_SASM_Load_Resource_AS_Offers-[0-9]*.csv', datetimes={'SASMId': '%m/%d/%Y %H:%M:%S'}, variants=({'Delivery Date': 'deliveryDate', 'SASM ID': 'SASMId', 'Hour Ending': 'hourEnding', 'QSE NAME': 'qseName', 'Resource Name': 'resourceName', 'Multi-Hour Block Flag': 'multiHourBlockFlag', 'BLOCK INDICATOR1': 'blockIndicator1', 'PRICE1 RRS': 'price1RRS', 'PRICE1 ONLINE NONSPIN': 'price1OnlineNONSPIN', 'PRICE1 REGUP': 'price1REGUP', 'PRICE1 REGDOWN': 'price1REGDOWN', 'PRICE1 OFFLINE NONSPIN': 'price1OfflineNONSPIN', 'QUANTITY MW1': 'quantityMW1', 'BLOCK INDICATOR2': 'blockIndicator2', 'PRICE2 RRS': 'price2RRS', 'PRICE2 ONLINE NONSPIN': 'price2OnlineNONSPIN', 'PRICE2 REGUP': 'price2REGUP', 'PRICE2 REGDOWN': 'price2REGDOWN', 'PRICE2 OFFLINE NONSPIN': 'price2OfflineNONSPIN', 'QUANTITY MW2': 'quantityMW2', 'BLOCK INDICATOR3': 'blockIndicator3', 'PRICE3 RRS': 'price3RRS', 'PRICE3 ONLINE NONSPIN': 'price3OnlineNONSPIN', 'PRICE3 REGUP': 'price3REGUP', 'PRICE3 REGDOWN': 'price3REGDOWN', 'PRICE3 OFFLINE NONSPIN': 'price3OfflineNONSPIN', 'QUANTITY MW3': 'quantityMW3', 'BLOCK INDICATOR4': 'blockIndicator4', 'PRICE4 RRS': 'price4RRS', 'PRICE4 ONLINE NONSPIN': 'price4OnlineNONSPIN', 'PRICE4 REGUP': 'price4REGUP', 'PRICE4 REGDOWN': 'price4REGDOWN', 'PRICE4 OFFLINE NONSPIN': 'price4OfflineNONSPIN', 'QUANTITY MW4': 'quantityMW4', 'BLOCK INDICATOR5': 'blockIndicator5', 'PRICE5 RRS': 'price5RRS', 'PRICE5 ONLINE NONSPIN': 'price5OnlineNONSPIN', 'PRICE5 REGUP': 'price5REGUP', 'PRICE5 REGDOWN': 'price5REGDOWN', 'PRICE5 OFFLINE NONSPIN': 'price5OfflineNONSPIN', 'QUANTITY MW5': 'quantityMW5'},))
+
def _60_sasm_load_res_as_offers(self, *, resourceName: str | None = None, price2OFFECFrom: Decimal | None = None, price2OFFECTo: Decimal | None = None, multiHourBlockFlag: bool | None = None, price3ECRSFrom: Decimal | None = None, price3ECRSTo: Decimal | None = None, blockIndicator1: str | None = None, price3OFFECFrom: Decimal | None = None, price3OFFECTo: Decimal | None = None, price1RRSPFRFrom: Decimal | None = None, price1RRSPFRTo: Decimal | None = None, price4ECRSFrom: Decimal | None = None, price4ECRSTo: Decimal | None = None, price1RRSFFRFrom: Decimal | None = None, price1RRSFFRTo: Decimal | None = None, price4OFFECFrom: Decimal | None = None, price4OFFECTo: Decimal | None = None, price1RRSUFRFrom: Decimal | None = None, price1RRSUFRTo: Decimal | None = None, price5ECRSFrom: Decimal | None = None, price5ECRSTo: Decimal | None = None, price1OnlineNONSPINFrom: Decimal | None = None, price1OnlineNONSPINTo: Decimal | None = None, price5OFFECFrom: Decimal | None = None, price5OFFECTo: Decimal | None = None, price1REGUPFrom: Decimal | None = None, price1REGUPTo: Decimal | None = None, price1REGDOWNFrom: Decimal | None = None, price1REGDOWNTo: Decimal | None = None, price1OfflineNONSPINFrom: Decimal | None = None, price1OfflineNONSPINTo: Decimal | None = None, quantityMW1From: Decimal | None = None, quantityMW1To: Decimal | None = None, blockIndicator2: str | None = None, price2RRSPFRFrom: Decimal | None = None, price2RRSPFRTo: Decimal | None = None, price2RRSFFRFrom: Decimal | None = None, price2RRSFFRTo: Decimal | None = None, price2RRSUFRFrom: Decimal | None = None, price2RRSUFRTo: Decimal | None = None, price2OnlineNONSPINFrom: Decimal | None = None, price2OnlineNONSPINTo: Decimal | None = None, price2REGUPFrom: Decimal | None = None, price2REGUPTo: Decimal | None = None, price2REGDOWNFrom: Decimal | None = None, price2REGDOWNTo: Decimal | None = None, price2OfflineNONSPINFrom: Decimal | None = None, price2OfflineNONSPINTo: Decimal | None = None, quantityMW2From: Decimal | None = None, quantityMW2To: Decimal | None = None, blockIndicator3: str | None = None, price3RRSPFRFrom: Decimal | None = None, price3RRSPFRTo: Decimal | None = None, price3RRSFFRFrom: Decimal | None = None, price3RRSFFRTo: Decimal | None = None, price3RRSUFRFrom: Decimal | None = None, price3RRSUFRTo: Decimal | None = None, price3OnlineNONSPINFrom: Decimal | None = None, price3OnlineNONSPINTo: Decimal | None = None, price3REGUPFrom: Decimal | None = None, price3REGUPTo: Decimal | None = None, price3REGDOWNFrom: Decimal | None = None, price3REGDOWNTo: Decimal | None = None, price3OfflineNONSPINFrom: Decimal | None = None, price3OfflineNONSPINTo: Decimal | None = None, quantityMW3From: Decimal | None = None, quantityMW3To: Decimal | None = None, blockIndicator4: str | None = None, price4RRSPFRFrom: Decimal | None = None, price4RRSPFRTo: Decimal | None = None, price4RRSFFRFrom: Decimal | None = None, price4RRSFFRTo: Decimal | None = None, price4RRSUFRFrom: Decimal | None = None, price4RRSUFRTo: Decimal | None = None, price4OnlineNONSPINFrom: Decimal | None = None, price4OnlineNONSPINTo: Decimal | None = None, price4REGUPFrom: Decimal | None = None, price4REGUPTo: Decimal | None = None, price4REGDOWNFrom: Decimal | None = None, price4REGDOWNTo: Decimal | None = None, price4OfflineNONSPINFrom: Decimal | None = None, price4OfflineNONSPINTo: Decimal | None = None, quantityMW4From: Decimal | None = None, quantityMW4To: Decimal | None = None, blockIndicator5: str | None = None, price5RRSPFRFrom: Decimal | None = None, price5RRSPFRTo: Decimal | None = None, price5RRSFFRFrom: Decimal | None = None, price5RRSFFRTo: Decimal | None = None, price5RRSUFRFrom: Decimal | None = None, price5RRSUFRTo: Decimal | None = None, price5OnlineNONSPINFrom: Decimal | None = None, price5OnlineNONSPINTo: Decimal | None = None, price5REGUPFrom: Decimal | None = None, price5REGUPTo: Decimal | None = None, price5REGDOWNFrom: Decimal | None = None, price5REGDOWNTo: Decimal | None = None, price5OfflineNONSPINFrom: Decimal | None = None, price5OfflineNONSPINTo: Decimal | None = None, quantityMW5From: Decimal | None = None, quantityMW5To: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, SASMIdFrom: datetime | None = None, SASMIdTo: datetime | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, price1ECRSFrom: Decimal | None = None, price1ECRSTo: Decimal | None = None, qseName: str | None = None, price1OFFECFrom: Decimal | None = None, price1OFFECTo: Decimal | None = None, dmeName: str | None = None, price2ECRSFrom: Decimal | None = None, price2ECRSTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_990_ex._60SasmLoadResAsOffersRow]:
'60-Day SASM Load Resource AS Offers'
return self._client._page('/np3-990-ex/60_sasm_load_res_as_offers', np3_990_ex._60SasmLoadResAsOffersRow, {'resourceName': resourceName, 'price2OFFECFrom': price2OFFECFrom, 'price2OFFECTo': price2OFFECTo, 'multiHourBlockFlag': multiHourBlockFlag, 'price3ECRSFrom': price3ECRSFrom, 'price3ECRSTo': price3ECRSTo, 'blockIndicator1': blockIndicator1, 'price3OFFECFrom': price3OFFECFrom, 'price3OFFECTo': price3OFFECTo, 'price1RRSPFRFrom': price1RRSPFRFrom, 'price1RRSPFRTo': price1RRSPFRTo, 'price4ECRSFrom': price4ECRSFrom, 'price4ECRSTo': price4ECRSTo, 'price1RRSFFRFrom': price1RRSFFRFrom, 'price1RRSFFRTo': price1RRSFFRTo, 'price4OFFECFrom': price4OFFECFrom, 'price4OFFECTo': price4OFFECTo, 'price1RRSUFRFrom': price1RRSUFRFrom, 'price1RRSUFRTo': price1RRSUFRTo, 'price5ECRSFrom': price5ECRSFrom, 'price5ECRSTo': price5ECRSTo, 'price1OnlineNONSPINFrom': price1OnlineNONSPINFrom, 'price1OnlineNONSPINTo': price1OnlineNONSPINTo, 'price5OFFECFrom': price5OFFECFrom, 'price5OFFECTo': price5OFFECTo, 'price1REGUPFrom': price1REGUPFrom, 'price1REGUPTo': price1REGUPTo, 'price1REGDOWNFrom': price1REGDOWNFrom, 'price1REGDOWNTo': price1REGDOWNTo, 'price1OfflineNONSPINFrom': price1OfflineNONSPINFrom, 'price1OfflineNONSPINTo': price1OfflineNONSPINTo, 'quantityMW1From': quantityMW1From, 'quantityMW1To': quantityMW1To, 'blockIndicator2': blockIndicator2, 'price2RRSPFRFrom': price2RRSPFRFrom, 'price2RRSPFRTo': price2RRSPFRTo, 'price2RRSFFRFrom': price2RRSFFRFrom, 'price2RRSFFRTo': price2RRSFFRTo, 'price2RRSUFRFrom': price2RRSUFRFrom, 'price2RRSUFRTo': price2RRSUFRTo, 'price2OnlineNONSPINFrom': price2OnlineNONSPINFrom, 'price2OnlineNONSPINTo': price2OnlineNONSPINTo, 'price2REGUPFrom': price2REGUPFrom, 'price2REGUPTo': price2REGUPTo, 'price2REGDOWNFrom': price2REGDOWNFrom, 'price2REGDOWNTo': price2REGDOWNTo, 'price2OfflineNONSPINFrom': price2OfflineNONSPINFrom, 'price2OfflineNONSPINTo': price2OfflineNONSPINTo, 'quantityMW2From': quantityMW2From, 'quantityMW2To': quantityMW2To, 'blockIndicator3': blockIndicator3, 'price3RRSPFRFrom': price3RRSPFRFrom, 'price3RRSPFRTo': price3RRSPFRTo, 'price3RRSFFRFrom': price3RRSFFRFrom, 'price3RRSFFRTo': price3RRSFFRTo, 'price3RRSUFRFrom': price3RRSUFRFrom, 'price3RRSUFRTo': price3RRSUFRTo, 'price3OnlineNONSPINFrom': price3OnlineNONSPINFrom, 'price3OnlineNONSPINTo': price3OnlineNONSPINTo, 'price3REGUPFrom': price3REGUPFrom, 'price3REGUPTo': price3REGUPTo, 'price3REGDOWNFrom': price3REGDOWNFrom, 'price3REGDOWNTo': price3REGDOWNTo, 'price3OfflineNONSPINFrom': price3OfflineNONSPINFrom, 'price3OfflineNONSPINTo': price3OfflineNONSPINTo, 'quantityMW3From': quantityMW3From, 'quantityMW3To': quantityMW3To, 'blockIndicator4': blockIndicator4, 'price4RRSPFRFrom': price4RRSPFRFrom, 'price4RRSPFRTo': price4RRSPFRTo, 'price4RRSFFRFrom': price4RRSFFRFrom, 'price4RRSFFRTo': price4RRSFFRTo, 'price4RRSUFRFrom': price4RRSUFRFrom, 'price4RRSUFRTo': price4RRSUFRTo, 'price4OnlineNONSPINFrom': price4OnlineNONSPINFrom, 'price4OnlineNONSPINTo': price4OnlineNONSPINTo, 'price4REGUPFrom': price4REGUPFrom, 'price4REGUPTo': price4REGUPTo, 'price4REGDOWNFrom': price4REGDOWNFrom, 'price4REGDOWNTo': price4REGDOWNTo, 'price4OfflineNONSPINFrom': price4OfflineNONSPINFrom, 'price4OfflineNONSPINTo': price4OfflineNONSPINTo, 'quantityMW4From': quantityMW4From, 'quantityMW4To': quantityMW4To, 'blockIndicator5': blockIndicator5, 'price5RRSPFRFrom': price5RRSPFRFrom, 'price5RRSPFRTo': price5RRSPFRTo, 'price5RRSFFRFrom': price5RRSFFRFrom, 'price5RRSFFRTo': price5RRSFFRTo, 'price5RRSUFRFrom': price5RRSUFRFrom, 'price5RRSUFRTo': price5RRSUFRTo, 'price5OnlineNONSPINFrom': price5OnlineNONSPINFrom, 'price5OnlineNONSPINTo': price5OnlineNONSPINTo, 'price5REGUPFrom': price5REGUPFrom, 'price5REGUPTo': price5REGUPTo, 'price5REGDOWNFrom': price5REGDOWNFrom, 'price5REGDOWNTo': price5REGDOWNTo, 'price5OfflineNONSPINFrom': price5OfflineNONSPINFrom, 'price5OfflineNONSPINTo': price5OfflineNONSPINTo, 'quantityMW5From': quantityMW5From, 'quantityMW5To': quantityMW5To, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'SASMIdFrom': SASMIdFrom, 'SASMIdTo': SASMIdTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'price1ECRSFrom': price1ECRSFrom, 'price1ECRSTo': price1ECRSTo, 'qseName': qseName, 'price1OFFECFrom': price1OFFECFrom, 'price1OFFECTo': price1OFFECTo, 'dmeName': dmeName, 'price2ECRSFrom': price2ECRSFrom, 'price2ECRSTo': price2ECRSTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5072,6 +8525,36 @@ class _60CopAllUpdatesRow(Row):
submitTime: datetime | None
updateTime: datetime | None
+ class _60CopAllUpdatesHistoryRow(Row):
+ deliveryDate: date | None
+ qseName: str | None
+ resourceName: str | None
+ hourEnding: str | None
+ status: str | None
+ highSustainedLimit: Decimal | None
+ lowSustainedLimit: Decimal | None
+ highEmergencyLimit: Decimal | None
+ lowEmergencyLimit: Decimal | None
+ REGUP: Decimal | None
+ REGDN: Decimal | None
+ RRSPFR: Decimal | None = None
+ RRSFFR: Decimal | None = None
+ RRSUFR: Decimal | None = None
+ NSPIN: Decimal | None
+ ECRS: Decimal | None = None
+ minSOC: Decimal | None = None
+ maxSOC: Decimal | None = None
+ hourBeginningPlannedSOC: Decimal | None = None
+ cancelFlag: bool | None
+ updateTime: datetime | None
+ submitTime: datetime | None
+ RRS: Decimal | None = None
+
+ @property
+ def _60_cop_all_updates_history(self) -> Archive[np3_991_ex._60CopAllUpdatesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np3-991-ex', np3_991_ex._60CopAllUpdatesHistoryRow, {'Delivery Date': 'deliveryDate', 'QSE Name': 'qseName', 'Resource Name': 'resourceName', 'Hour Ending': 'hourEnding', 'Status': 'status', 'High Sustained Limit': 'highSustainedLimit', 'Low Sustained Limit': 'lowSustainedLimit', 'High Emergency Limit': 'highEmergencyLimit', 'Low Emergency Limit': 'lowEmergencyLimit', 'Reg Up': 'REGUP', 'Reg Down': 'REGDN', 'RRSPFR': 'RRSPFR', 'RRSFFR': 'RRSFFR', 'RRSUFR': 'RRSUFR', 'NSPIN': 'NSPIN', 'ECRS': 'ECRS', 'Minimum SOC': 'minSOC', 'Maximum SOC': 'maxSOC', 'Hour Beginning Planned SOC': 'hourBeginningPlannedSOC', 'Cancel Flag': 'cancelFlag', 'Update Time': 'updateTime', 'Submit Time': 'submitTime'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'updateTime': ['%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M'], 'submitTime': ['%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M']}, variants=({'Delivery Date': 'deliveryDate', 'QSE Name': 'qseName', 'Resource Name': 'resourceName', 'Hour Ending': 'hourEnding', 'Status': 'status', 'High Sustained Limit': 'highSustainedLimit', 'Low Sustained Limit': 'lowSustainedLimit', 'High Emergency Limit': 'highEmergencyLimit', 'Low Emergency Limit': 'lowEmergencyLimit', 'Reg Up': 'REGUP', 'Reg Down': 'REGDN', 'RRS': 'RRS', 'NSPIN': 'NSPIN', 'Cancel Flag': 'cancelFlag', 'Update Time': 'updateTime', 'Submit Time': 'submitTime'},))
+
def _60_cop_all_updates(self, *, cancelFlag: bool | None = None, updateTimeFrom: datetime | None = None, updateTimeTo: datetime | None = None, submitTimeFrom: datetime | None = None, submitTimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, qseName: str | None = None, resourceName: str | None = None, hourEnding: str | None = None, status: str | None = None, highSustainedLimitFrom: Decimal | None = None, highSustainedLimitTo: Decimal | None = None, lowSustainedLimitFrom: Decimal | None = None, lowSustainedLimitTo: Decimal | None = None, highEmergencyLimitFrom: Decimal | None = None, highEmergencyLimitTo: Decimal | None = None, lowEmergencyLimitFrom: Decimal | None = None, lowEmergencyLimitTo: Decimal | None = None, REGUPFrom: Decimal | None = None, REGUPTo: Decimal | None = None, REGDNFrom: Decimal | None = None, REGDNTo: Decimal | None = None, RRSPFRFrom: Decimal | None = None, RRSPFRTo: Decimal | None = None, ECRSFrom: Decimal | None = None, ECRSTo: Decimal | None = None, RRSFFRFrom: Decimal | None = None, RRSFFRTo: Decimal | None = None, minSOCFrom: Decimal | None = None, minSOCTo: Decimal | None = None, RRSUFRFrom: Decimal | None = None, RRSUFRTo: Decimal | None = None, maxSOCFrom: Decimal | None = None, maxSOCTo: Decimal | None = None, NSPINFrom: Decimal | None = None, NSPINTo: Decimal | None = None, hourBeginningPlannedSOCFrom: Decimal | None = None, hourBeginningPlannedSOCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np3_991_ex._60CopAllUpdatesRow]:
'60-Day COP All Updates'
return self._client._page('/np3-991-ex/60_cop_all_updates', np3_991_ex._60CopAllUpdatesRow, {'cancelFlag': cancelFlag, 'updateTimeFrom': updateTimeFrom, 'updateTimeTo': updateTimeTo, 'submitTimeFrom': submitTimeFrom, 'submitTimeTo': submitTimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'qseName': qseName, 'resourceName': resourceName, 'hourEnding': hourEnding, 'status': status, 'highSustainedLimitFrom': highSustainedLimitFrom, 'highSustainedLimitTo': highSustainedLimitTo, 'lowSustainedLimitFrom': lowSustainedLimitFrom, 'lowSustainedLimitTo': lowSustainedLimitTo, 'highEmergencyLimitFrom': highEmergencyLimitFrom, 'highEmergencyLimitTo': highEmergencyLimitTo, 'lowEmergencyLimitFrom': lowEmergencyLimitFrom, 'lowEmergencyLimitTo': lowEmergencyLimitTo, 'REGUPFrom': REGUPFrom, 'REGUPTo': REGUPTo, 'REGDNFrom': REGDNFrom, 'REGDNTo': REGDNTo, 'RRSPFRFrom': RRSPFRFrom, 'RRSPFRTo': RRSPFRTo, 'ECRSFrom': ECRSFrom, 'ECRSTo': ECRSTo, 'RRSFFRFrom': RRSFFRFrom, 'RRSFFRTo': RRSFFRTo, 'minSOCFrom': minSOCFrom, 'minSOCTo': minSOCTo, 'RRSUFRFrom': RRSUFRFrom, 'RRSUFRTo': RRSUFRTo, 'maxSOCFrom': maxSOCFrom, 'maxSOCTo': maxSOCTo, 'NSPINFrom': NSPINFrom, 'NSPINTo': NSPINTo, 'hourBeginningPlannedSOCFrom': hourBeginningPlannedSOCFrom, 'hourBeginningPlannedSOCTo': hourBeginningPlannedSOCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5101,6 +8584,20 @@ class DamEsspsRow(Row):
settlementPoint: str | None
updateTime: datetime | None
+ class DamEsspsHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ settlementPoint: str | None
+ groupIndex: int | None
+ updateTime: datetime | None
+ repeatHourFlag: bool | None
+
+ @property
+ def dam_essps_history(self) -> Archive[np4_158_sg.DamEsspsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-158-sg', np4_158_sg.DamEsspsHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'SettlementPoint': 'settlementPoint', 'GroupIndex': 'groupIndex', 'UpdateTime': 'updateTime', 'DSTFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S', 'updateTime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def dam_essps(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, settlementPoint: str | None = None, groupIndexFrom: int | None = None, groupIndexTo: int | None = None, updateTimeFrom: datetime | None = None, updateTimeTo: datetime | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_158_sg.DamEsspsRow]:
'DAM Electrically Similar Settlement Points'
return self._client._page('/np4-158-sg/dam_essps', np4_158_sg.DamEsspsRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'settlementPoint': settlementPoint, 'groupIndexFrom': groupIndexFrom, 'groupIndexTo': groupIndexTo, 'updateTimeFrom': updateTimeFrom, 'updateTimeTo': updateTimeTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5132,6 +8629,22 @@ class LoadDistributionFactorsRow(Row):
postedDatetime: datetime | None
substation: str | None
+ class LoadDistributionFactorsHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ LDFDate: date | None
+ LDFHour: str | None
+ substation: str | None
+ distributionFactor: Decimal | None
+ loadId: str | None
+ MVARDistributionFactor: Decimal | None
+ MRIDLoad: str | None
+ DSTFlag: bool | None
+
+ @property
+ def load_distribution_factors_history(self) -> Archive[np4_159_cd.LoadDistributionFactorsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-159-cd', np4_159_cd.LoadDistributionFactorsHistoryRow, {'LdfDate': 'LDFDate', 'LdfHour': 'LDFHour', 'SubStation': 'substation', 'DistributionFactor': 'distributionFactor', 'LoadID': 'loadId', 'MVARDistributionFactor': 'MVARDistributionFactor', 'MRIDLoad': 'MRIDLoad', 'DSTFlag': 'DSTFlag'}, {'LDFDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=({'LdfDate': 'LDFDate', 'LdfHour': 'LDFHour', 'SubStation': 'substation', 'LoadDistributionFactor': 'distributionFactor', 'LoadID': 'loadId', 'MVARDistributionFactor': 'MVARDistributionFactor', 'MRIDLoad': 'MRIDLoad', 'DSTFlag': 'DSTFlag'},))
+
def load_distribution_factors(self, *, LDFDateFrom: date | None = None, LDFDateTo: date | None = None, LDFHour: str | None = None, substation: str | None = None, distributionFactorFrom: Decimal | None = None, distributionFactorTo: Decimal | None = None, loadId: str | None = None, MVARDistributionFactorFrom: Decimal | None = None, MVARDistributionFactorTo: Decimal | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, MRIDLoad: str | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_159_cd.LoadDistributionFactorsRow]:
'Load Distribution Factors'
return self._client._page('/np4-159-cd/load_distribution_factors', np4_159_cd.LoadDistributionFactorsRow, {'LDFDateFrom': LDFDateFrom, 'LDFDateTo': LDFDateTo, 'LDFHour': LDFHour, 'substation': substation, 'distributionFactorFrom': distributionFactorFrom, 'distributionFactorTo': distributionFactorTo, 'loadId': loadId, 'MVARDistributionFactorFrom': MVARDistributionFactorFrom, 'MVARDistributionFactorTo': MVARDistributionFactorTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'MRIDLoad': MRIDLoad, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5165,6 +8678,25 @@ class TotalAsServiceOffersRow(Row):
deliveryDate: date | None
hourEnding: str | None
+ class TotalAsServiceOffersHistoryRow(Row):
+ deliveryDate: date | None
+ hourEnding: str | None
+ REGDN: Decimal | None
+ REGUP: Decimal | None
+ RRSPFR: Decimal | None = None
+ RRSFFR: Decimal | None = None
+ RRSUFR: Decimal | None = None
+ ECRSSD: Decimal | None = None
+ ECRSMD: Decimal | None = None
+ NSPIN: Decimal | None
+ DSTFlag: bool | None
+ RRS: Decimal | None = None
+
+ @property
+ def total_as_service_offers_history(self) -> Archive[np4_179_cd.TotalAsServiceOffersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-179-cd', np4_179_cd.TotalAsServiceOffersHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'REGDN': 'REGDN', 'REGUP': 'REGUP', 'RRSPFR': 'RRSPFR', 'RRSFFR': 'RRSFFR', 'RRSUFR': 'RRSUFR', 'ECRSSD': 'ECRSSD', 'ECRSMD': 'ECRSMD', 'NSPIN': 'NSPIN', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=({'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'REGDN': 'REGDN', 'REGUP': 'REGUP', 'RRS': 'RRS', 'NSPIN': 'NSPIN', 'DSTFlag': 'DSTFlag'},))
+
def total_as_service_offers(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, REGDNFrom: Decimal | None = None, REGDNTo: Decimal | None = None, REGUPFrom: Decimal | None = None, REGUPTo: Decimal | None = None, RRSPFRFrom: Decimal | None = None, RRSPFRTo: Decimal | None = None, RRSFFRFrom: Decimal | None = None, RRSFFRTo: Decimal | None = None, RRSUFRFrom: Decimal | None = None, RRSUFRTo: Decimal | None = None, ECRSSDFrom: Decimal | None = None, ECRSSDTo: Decimal | None = None, ECRSMDFrom: Decimal | None = None, ECRSMDTo: Decimal | None = None, NSPINFrom: Decimal | None = None, NSPINTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_179_cd.TotalAsServiceOffersRow]:
'Total Ancillary Service Offers'
return self._client._page('/np4-179-cd/total_as_service_offers', np4_179_cd.TotalAsServiceOffersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'REGDNFrom': REGDNFrom, 'REGDNTo': REGDNTo, 'REGUPFrom': REGUPFrom, 'REGUPTo': REGUPTo, 'RRSPFRFrom': RRSPFRFrom, 'RRSPFRTo': RRSPFRTo, 'RRSFFRFrom': RRSFFRFrom, 'RRSFFRTo': RRSFFRTo, 'RRSUFRFrom': RRSUFRFrom, 'RRSUFRTo': RRSUFRTo, 'ECRSSDFrom': ECRSSDFrom, 'ECRSSDTo': ECRSSDTo, 'ECRSMDFrom': ECRSMDFrom, 'ECRSMDTo': ECRSMDTo, 'NSPINFrom': NSPINFrom, 'NSPINTo': NSPINTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5192,6 +8724,11 @@ class DamHourlyLmpRow(Row):
deliveryDate: date | None
hourEnding: str | None
+ @property
+ def dam_hourly_lmp_history(self) -> Archive[np4_183_cd.DamHourlyLmpRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-183-cd', np4_183_cd.DamHourlyLmpRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'BusName': 'busName', 'LMP': 'LMP', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes=None, variants=())
+
def dam_hourly_lmp(self, *, DSTFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, busName: str | None = None, LMPFrom: Decimal | None = None, LMPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_183_cd.DamHourlyLmpRow]:
'DAM Hourly LMPs'
return self._client._page('/np4-183-cd/dam_hourly_lmp', np4_183_cd.DamHourlyLmpRow, {'DSTFlag': DSTFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'busName': busName, 'LMPFrom': LMPFrom, 'LMPTo': LMPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5219,6 +8756,11 @@ class DamClearPriceForCapRow(Row):
deliveryDate: date | None
hourEnding: str | None
+ @property
+ def dam_clear_price_for_cap_history(self) -> Archive[np4_188_cd.DamClearPriceForCapRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-188-cd', np4_188_cd.DamClearPriceForCapRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'AncillaryType': 'ancillaryType', 'MCPC': 'MCPC', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes=None, variants=())
+
def dam_clear_price_for_cap(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, ancillaryType: str | None = None, MCPCFrom: Decimal | None = None, MCPCTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_188_cd.DamClearPriceForCapRow]:
'DAM Clearing Prices for Capacity'
return self._client._page('/np4-188-cd/dam_clear_price_for_cap', np4_188_cd.DamClearPriceForCapRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'ancillaryType': ancillaryType, 'MCPCFrom': MCPCFrom, 'MCPCTo': MCPCTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5247,6 +8789,11 @@ class DamAggAsOfferCurveRow(Row):
price: Decimal | None
quantity: Decimal | None
+ @property
+ def dam_agg_as_offer_curve_history(self) -> Archive[np4_19_cd.DamAggAsOfferCurveRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-19-cd', np4_19_cd.DamAggAsOfferCurveRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'AncillaryType': 'ancillaryType', 'Price': 'price', 'Quantity': 'quantity', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def dam_agg_as_offer_curve(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, ancillaryType: str | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, quantityFrom: Decimal | None = None, quantityTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_19_cd.DamAggAsOfferCurveRow]:
'DAM Aggregated Ancillary Service Offer Curve'
return self._client._page('/np4-19-cd/dam_agg_as_offer_curve', np4_19_cd.DamAggAsOfferCurveRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'ancillaryType': ancillaryType, 'priceFrom': priceFrom, 'priceTo': priceTo, 'quantityFrom': quantityFrom, 'quantityTo': quantityTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5274,6 +8821,11 @@ class DamStlmntPntPricesRow(Row):
settlementPoint: str | None
settlementPointPrice: Decimal | None
+ @property
+ def dam_stlmnt_pnt_prices_history(self) -> Archive[np4_190_cd.DamStlmntPntPricesRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-190-cd', np4_190_cd.DamStlmntPntPricesRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'SettlementPoint': 'settlementPoint', 'SettlementPointPrice': 'settlementPointPrice', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes=None, variants=())
+
def dam_stlmnt_pnt_prices(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, settlementPoint: str | None = None, settlementPointPriceFrom: Decimal | None = None, settlementPointPriceTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_190_cd.DamStlmntPntPricesRow]:
'DAM Settlement Point Prices'
return self._client._page('/np4-190-cd/dam_stlmnt_pnt_prices', np4_190_cd.DamStlmntPntPricesRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'settlementPoint': settlementPoint, 'settlementPointPriceFrom': settlementPointPriceFrom, 'settlementPointPriceTo': settlementPointPriceTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5311,6 +8863,11 @@ class DamShadowPricesRow(Row):
toStationkV: Decimal | None
violationAmount: int | None
+ @property
+ def dam_shadow_prices_history(self) -> Archive[np4_191_cd.DamShadowPricesRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-191-cd', np4_191_cd.DamShadowPricesRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'ConstraintID': 'constraintId', 'ConstraintName': 'constraintName', 'ContingencyName': 'contingencyName', 'ConstraintLimit': 'constraintLimit', 'ConstraintValue': 'constraintValue', 'ViolationAmount': 'violationAmount', 'ShadowPrice': 'shadowPrice', 'FromStation': 'fromStation', 'ToStation': 'toStation', 'FromStationkV': 'fromStationkV', 'ToStationkV': 'toStationkV', 'DeliveryTime': 'deliveryTime', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'deliveryTime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def dam_shadow_prices(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, constraintIdFrom: int | None = None, constraintIdTo: int | None = None, constraintName: str | None = None, contingencyName: str | None = None, constraintLimitFrom: int | None = None, constraintLimitTo: int | None = None, constraintValueFrom: int | None = None, constraintValueTo: int | None = None, violationAmountFrom: int | None = None, violationAmountTo: int | None = None, shadowPriceFrom: Decimal | None = None, shadowPriceTo: Decimal | None = None, fromStation: str | None = None, toStation: str | None = None, fromStationkVFrom: Decimal | None = None, fromStationkVTo: Decimal | None = None, toStationkVFrom: Decimal | None = None, toStationkVTo: Decimal | None = None, deliveryTimeFrom: datetime | None = None, deliveryTimeTo: datetime | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_191_cd.DamShadowPricesRow]:
'DAM Shadow Prices'
return self._client._page('/np4-191-cd/dam_shadow_prices', np4_191_cd.DamShadowPricesRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'constraintIdFrom': constraintIdFrom, 'constraintIdTo': constraintIdTo, 'constraintName': constraintName, 'contingencyName': contingencyName, 'constraintLimitFrom': constraintLimitFrom, 'constraintLimitTo': constraintLimitTo, 'constraintValueFrom': constraintValueFrom, 'constraintValueTo': constraintValueTo, 'violationAmountFrom': violationAmountFrom, 'violationAmountTo': violationAmountTo, 'shadowPriceFrom': shadowPriceFrom, 'shadowPriceTo': shadowPriceTo, 'fromStation': fromStation, 'toStation': toStation, 'fromStationkVFrom': fromStationkVFrom, 'fromStationkVTo': fromStationkVTo, 'toStationkVFrom': toStationkVFrom, 'toStationkVTo': toStationkVTo, 'deliveryTimeFrom': deliveryTimeFrom, 'deliveryTimeTo': deliveryTimeTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5338,6 +8895,11 @@ class DamTotalEnergyPurchasedRow(Row):
settlementPoint: str | None
totalDamEnergyBought: Decimal | None
+ @property
+ def dam_total_energy_purchased_history(self) -> Archive[np4_192_cd.DamTotalEnergyPurchasedRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-192-cd', np4_192_cd.DamTotalEnergyPurchasedRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Settlement_Point': 'settlementPoint', 'Total_DAM_Energy_Bought': 'totalDamEnergyBought', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=({'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Settlement_Point': 'settlementPoint', 'Total_DAM_Energy_Bought': 'totalDamEnergyBought', 'DSTFlag': 'repeatHourFlag'},))
+
def dam_total_energy_purchased(self, *, hourEnding: str | None = None, settlementPoint: str | None = None, totalDamEnergyBoughtFrom: Decimal | None = None, totalDamEnergyBoughtTo: Decimal | None = None, repeatHourFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_192_cd.DamTotalEnergyPurchasedRow]:
'DAM Total Energy Purchased'
return self._client._page('/np4-192-cd/dam_total_energy_purchased', np4_192_cd.DamTotalEnergyPurchasedRow, {'hourEnding': hourEnding, 'settlementPoint': settlementPoint, 'totalDamEnergyBoughtFrom': totalDamEnergyBoughtFrom, 'totalDamEnergyBoughtTo': totalDamEnergyBoughtTo, 'repeatHourFlag': repeatHourFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5365,6 +8927,11 @@ class TotalDamEnergySoldRow(Row):
settlementPoint: str | None
totalDAMEnergySold: Decimal | None
+ @property
+ def total_dam_energy_sold_history(self) -> Archive[np4_193_cd.TotalDamEnergySoldRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-193-cd', np4_193_cd.TotalDamEnergySoldRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Settlement_Point': 'settlementPoint', 'TotalDAMEnergySold': 'totalDAMEnergySold', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=({'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Settlement_Point': 'settlementPoint', 'TotalDAMEnergySold': 'totalDAMEnergySold', 'DSTFlag': 'repeatHourFlag'},))
+
def total_dam_energy_sold(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, settlementPoint: str | None = None, totalDAMEnergySoldFrom: Decimal | None = None, totalDAMEnergySoldTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_193_cd.TotalDamEnergySoldRow]:
'DAM Total Energy Sold'
return self._client._page('/np4-193-cd/total_dam_energy_sold', np4_193_cd.TotalDamEnergySoldRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'settlementPoint': settlementPoint, 'totalDAMEnergySoldFrom': totalDAMEnergySoldFrom, 'totalDAMEnergySoldTo': totalDAMEnergySoldTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5393,6 +8960,11 @@ class DamPtpObligationSpResultsRow(Row):
totalPtpOblAwardedSink: Decimal | None
totalPtpOblAwardedSource: Decimal | None
+ @property
+ def dam_ptp_obligation_sp_results_history(self) -> Archive[np4_194_cd.DamPtpObligationSpResultsRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-194-cd', np4_194_cd.DamPtpObligationSpResultsRow, {'DELIVERYDATE': 'deliveryDate', 'HOURENDING': 'hourEnding', 'STL_PNT': 'stlPnt', 'TOTAL_PTP_OBL_AWARDED_SOURCE': 'totalPtpOblAwardedSource', 'TOTAL_PTP_OBL_AWARDED_SINK': 'totalPtpOblAwardedSink', 'DSTFlag': 'repeatedHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def dam_ptp_obligation_sp_results(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, stlPnt: str | None = None, totalPtpOblAwardedSourceFrom: Decimal | None = None, totalPtpOblAwardedSourceTo: Decimal | None = None, totalPtpOblAwardedSinkFrom: Decimal | None = None, totalPtpOblAwardedSinkTo: Decimal | None = None, repeatedHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_194_cd.DamPtpObligationSpResultsRow]:
'DAM PTP Obligation Results by Settlement Point'
return self._client._page('/np4-194-cd/dam_ptp_obligation_sp_results', np4_194_cd.DamPtpObligationSpResultsRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'stlPnt': stlPnt, 'totalPtpOblAwardedSourceFrom': totalPtpOblAwardedSourceFrom, 'totalPtpOblAwardedSourceTo': totalPtpOblAwardedSourceTo, 'totalPtpOblAwardedSinkFrom': totalPtpOblAwardedSinkFrom, 'totalPtpOblAwardedSinkTo': totalPtpOblAwardedSinkTo, 'repeatedHourFlag': repeatedHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5422,6 +8994,11 @@ class DamPriceCorrectionsEblmpRow(Row):
electricalBus: str | None
priceCorrectionTime: datetime | None
+ @property
+ def dam_price_corrections_eblmp_history(self) -> Archive[np4_196_m.DamPriceCorrectionsEblmpRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-196-m', np4_196_m.DamPriceCorrectionsEblmpRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'ElectricBusName': 'electricalBus', 'LMPOriginal': 'LMPOriginal', 'LMPCorrected': 'LMPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*pricecorrection_DAM_EBLMP_*.csv', datetimes={'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_DAM_EBLMP_*')
+
def dam_price_corrections_eblmp(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, electricalBus: str | None = None, LMPOriginalFrom: Decimal | None = None, LMPOriginalTo: Decimal | None = None, LMPCorrectedFrom: Decimal | None = None, LMPCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_196_m.DamPriceCorrectionsEblmpRow]:
'DAM Price Corrections for EBLMP'
return self._client._page('/np4-196-m/dam_price_corrections_eblmp', np4_196_m.DamPriceCorrectionsEblmpRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'electricalBus': electricalBus, 'LMPOriginalFrom': LMPOriginalFrom, 'LMPOriginalTo': LMPOriginalTo, 'LMPCorrectedFrom': LMPCorrectedFrom, 'LMPCorrectedTo': LMPCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5446,6 +9023,11 @@ class DamPriceCorrectionsMcpcRow(Row):
deliveryHour: int | None
priceCorrectionTime: datetime | None
+ @property
+ def dam_price_corrections_mcpc_history(self) -> Archive[np4_196_m.DamPriceCorrectionsMcpcRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-196-m', np4_196_m.DamPriceCorrectionsMcpcRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'ASType': 'ASType', 'MCPCOriginal': 'MCPCOriginal', 'MCPCCorrected': 'MCPCCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*pricecorrection_DAM_MCPC_*.csv', datetimes={'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_DAM_MCPC_*')
+
def dam_price_corrections_mcpc(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, ASType: str | None = None, MCPCOriginalFrom: Decimal | None = None, MCPCOriginalTo: Decimal | None = None, MCPCCorrectedFrom: Decimal | None = None, MCPCCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_196_m.DamPriceCorrectionsMcpcRow]:
'DAM Price Corrections for MCPC'
return self._client._page('/np4-196-m/dam_price_corrections_mcpc', np4_196_m.DamPriceCorrectionsMcpcRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'ASType': ASType, 'MCPCOriginalFrom': MCPCOriginalFrom, 'MCPCOriginalTo': MCPCOriginalTo, 'MCPCCorrectedFrom': MCPCCorrectedFrom, 'MCPCCorrectedTo': MCPCCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5470,6 +9052,11 @@ class DamPriceCorrectionsSppRow(Row):
priceCorrectionTime: datetime | None
settlementPoint: str | None
+ @property
+ def dam_price_corrections_spp_history(self) -> Archive[np4_196_m.DamPriceCorrectionsSppRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-196-m', np4_196_m.DamPriceCorrectionsSppRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'SettlementPoint': 'settlementPoint', 'SPPOriginal': 'SPPOriginal', 'SPPCorrected': 'SPPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*pricecorrection_DAM_SPP_*.csv', datetimes={'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_DAM_SPP_*')
+
def dam_price_corrections_spp(self, *, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, DSTFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, settlementPoint: str | None = None, SPPOriginalFrom: Decimal | None = None, SPPOriginalTo: Decimal | None = None, SPPCorrectedFrom: Decimal | None = None, SPPCorrectedTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_196_m.DamPriceCorrectionsSppRow]:
'DAM Price Corrections for SPP'
return self._client._page('/np4-196-m/dam_price_corrections_spp', np4_196_m.DamPriceCorrectionsSppRow, {'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'DSTFlag': DSTFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'settlementPoint': settlementPoint, 'SPPOriginalFrom': SPPOriginalFrom, 'SPPOriginalTo': SPPOriginalTo, 'SPPCorrectedFrom': SPPCorrectedFrom, 'SPPCorrectedTo': SPPCorrectedTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5500,6 +9087,23 @@ class RtmPriceCorrectionsEblmpRow(Row):
uncappedLMPCorrected: Decimal | None
uncappedLMPOriginal: Decimal | None
+ class RtmPriceCorrectionsEblmpHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ electricalBus: str | None
+ cappedLMPOriginal: Decimal | None = None
+ uncappedLMPOriginal: Decimal | None = None
+ cappedLMPCorrected: Decimal | None = None
+ uncappedLMPCorrected: Decimal | None = None
+ priceCorrectionTime: datetime | None
+ repeatedHourFlag: bool | None
+ LMPOriginal: Decimal | None = None
+ LMPCorrected: Decimal | None = None
+
+ @property
+ def rtm_price_corrections_eblmp_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsEblmpHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsEblmpHistoryRow, {'SCEDTimestamp': 'SCEDTimestamp', 'ElectricalBus': 'electricalBus', 'CappedLMPOriginal': 'cappedLMPOriginal', 'UncappedLMPOriginal': 'uncappedLMPOriginal', 'CappedLMPCorrected': 'cappedLMPCorrected', 'UncappedLMPCorrected': 'uncappedLMPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'RepeatedHourFlag': 'repeatedHourFlag'}, {}, member='*pricecorrection_RTM_EBLMP_*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S', 'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=({'SCEDTimestamp': 'SCEDTimestamp', 'ElectricBusName': 'electricalBus', 'LMPOriginal': 'LMPOriginal', 'LMPCorrected': 'LMPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'repeatedHourFlag'},), document='*pricecorrection_RTM_EBLMP_*')
+
def rtm_price_corrections_eblmp(self, *, cappedLMPOriginalFrom: Decimal | None = None, cappedLMPOriginalTo: Decimal | None = None, uncappedLMPOriginalFrom: Decimal | None = None, uncappedLMPOriginalTo: Decimal | None = None, cappedLMPCorrectedFrom: Decimal | None = None, cappedLMPCorrectedTo: Decimal | None = None, uncappedLMPCorrectedFrom: Decimal | None = None, uncappedLMPCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, repeatedHourFlag: bool | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, electricalBus: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsEblmpRow]:
'RTM Price Corrections for EB LMP'
return self._client._page('/np4-197-m/rtm_price_corrections_eblmp', np4_197_m.RtmPriceCorrectionsEblmpRow, {'cappedLMPOriginalFrom': cappedLMPOriginalFrom, 'cappedLMPOriginalTo': cappedLMPOriginalTo, 'uncappedLMPOriginalFrom': uncappedLMPOriginalFrom, 'uncappedLMPOriginalTo': uncappedLMPOriginalTo, 'cappedLMPCorrectedFrom': cappedLMPCorrectedFrom, 'cappedLMPCorrectedTo': cappedLMPCorrectedTo, 'uncappedLMPCorrectedFrom': uncappedLMPCorrectedFrom, 'uncappedLMPCorrectedTo': uncappedLMPCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'repeatedHourFlag': repeatedHourFlag, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'electricalBus': electricalBus, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5525,6 +9129,11 @@ class RtmPriceCorrectionsMcpcSppRow(Row):
priceCorrectionTime: datetime | None
repeatHourFlag: bool | None
+ @property
+ def rtm_price_corrections_mcpc_spp_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsMcpcSppRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsMcpcSppRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'ASType': 'ASType', 'MCPCOriginal': 'MCPCOriginal', 'MCPCCorrected': 'MCPCCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*pricecorrection_RTM_MCPC_SPP_*.csv', datetimes={'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_RTM_MCPC_SPP_*')
+
def rtm_price_corrections_mcpc_spp(self, *, ASType: str | None = None, MCPCOriginalFrom: Decimal | None = None, MCPCOriginalTo: Decimal | None = None, MCPCCorrectedFrom: Decimal | None = None, MCPCCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, repeatHourFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntervalFrom: int | None = None, deliveryIntervalTo: int | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsMcpcSppRow]:
'RTM Price Corrections for MCPC by 15-Min Settlement Interval'
return self._client._page('/np4-197-m/rtm_price_corrections_mcpc_spp', np4_197_m.RtmPriceCorrectionsMcpcSppRow, {'ASType': ASType, 'MCPCOriginalFrom': MCPCOriginalFrom, 'MCPCOriginalTo': MCPCOriginalTo, 'MCPCCorrectedFrom': MCPCCorrectedFrom, 'MCPCCorrectedTo': MCPCCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'repeatHourFlag': repeatHourFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntervalFrom': deliveryIntervalFrom, 'deliveryIntervalTo': deliveryIntervalTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5550,6 +9159,23 @@ class RtmPriceCorrectionsMcpcScedRow(Row):
uncappedMCPCCorrected: Decimal | None
uncappedMCPCOriginal: Decimal | None
+ class RtmPriceCorrectionsMcpcScedHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ ASType: str | None
+ cappedMCPCOriginal: Decimal | None = None
+ uncappedMCPCOriginal: Decimal | None = None
+ cappedMCPCCorrected: Decimal | None = None
+ uncappedMCPCCorrected: Decimal | None = None
+ priceCorrectionTime: datetime | None
+ repeatedHourFlag: bool | None
+ MCPCOriginal: Decimal | None = None
+ MCPCCorrected: Decimal | None = None
+
+ @property
+ def rtm_price_corrections_mcpc_sced_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsMcpcScedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsMcpcScedHistoryRow, {'SCEDTimestamp': 'SCEDTimestamp', 'ASType': 'ASType', 'CappedMCPCOriginal': 'cappedMCPCOriginal', 'UncappedMCPCOriginal': 'uncappedMCPCOriginal', 'CappedMCPCCorrected': 'cappedMCPCCorrected', 'UncappedMCPCCorrected': 'uncappedMCPCCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'RepeatedHourFlag': 'repeatedHourFlag'}, {}, member='*pricecorrection_RTM_MCPC_SCED_*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S', 'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=({'SCEDTimestamp': 'SCEDTimestamp', 'ASType': 'ASType', 'MCPCOriginal': 'MCPCOriginal', 'MCPCCorrected': 'MCPCCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'RepeatedHourFlag': 'repeatedHourFlag'},), document='*pricecorrection_RTM_MCPC_SCED_*')
+
def rtm_price_corrections_mcpc_sced(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, ASType: str | None = None, cappedMCPCOriginalFrom: Decimal | None = None, cappedMCPCOriginalTo: Decimal | None = None, uncappedMCPCOriginalFrom: Decimal | None = None, uncappedMCPCOriginalTo: Decimal | None = None, cappedMCPCCorrectedFrom: Decimal | None = None, cappedMCPCCorrectedTo: Decimal | None = None, uncappedMCPCCorrectedFrom: Decimal | None = None, uncappedMCPCCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, repeatedHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsMcpcScedRow]:
'RTM Price Corrections for MCPCs by SCED Interval'
return self._client._page('/np4-197-m/rtm_price_corrections_mcpc_sced', np4_197_m.RtmPriceCorrectionsMcpcScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'ASType': ASType, 'cappedMCPCOriginalFrom': cappedMCPCOriginalFrom, 'cappedMCPCOriginalTo': cappedMCPCOriginalTo, 'uncappedMCPCOriginalFrom': uncappedMCPCOriginalFrom, 'uncappedMCPCOriginalTo': uncappedMCPCOriginalTo, 'cappedMCPCCorrectedFrom': cappedMCPCCorrectedFrom, 'cappedMCPCCorrectedTo': cappedMCPCCorrectedTo, 'uncappedMCPCCorrectedFrom': uncappedMCPCCorrectedFrom, 'uncappedMCPCCorrectedTo': uncappedMCPCCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'repeatedHourFlag': repeatedHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5579,6 +9205,11 @@ class RtmPriceCorrectionsShadowRow(Row):
valueCorrected: Decimal | None
valueOriginal: Decimal | None
+ @property
+ def rtm_price_corrections_shadow_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsShadowRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsShadowRow, {'SCEDTimestamp': 'SCEDTimestamp', 'ConstrID': 'constraintId', 'ConstrName': 'constraintName', 'ContingencyName': 'contingencyName', 'ShadowPriceOrig': 'shadowPriceOriginal', 'ShadowPriceCorrected': 'shadowPriceCorrected', 'LimitOrig': 'limitOriginal', 'LimitCorrected': 'limitCorrected', 'ValueOriginal': 'valueOriginal', 'ValueCorrected': 'valueCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'DSTFlag'}, {}, member='*pricecorrection_RTM_ShadowPrice_*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S', 'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_RTM_ShadowPrice_*')
+
def rtm_price_corrections_shadow(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, constraintIdFrom: int | None = None, constraintIdTo: int | None = None, constraintName: str | None = None, contingencyName: str | None = None, shadowPriceOriginalFrom: Decimal | None = None, shadowPriceOriginalTo: Decimal | None = None, shadowPriceCorrectedFrom: Decimal | None = None, shadowPriceCorrectedTo: Decimal | None = None, limitOriginalFrom: Decimal | None = None, limitOriginalTo: Decimal | None = None, limitCorrectedFrom: Decimal | None = None, limitCorrectedTo: Decimal | None = None, valueOriginalFrom: Decimal | None = None, valueOriginalTo: Decimal | None = None, valueCorrectedFrom: Decimal | None = None, valueCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsShadowRow]:
'RTM Price Corrections for Shadow Prices'
return self._client._page('/np4-197-m/rtm_price_corrections_shadow', np4_197_m.RtmPriceCorrectionsShadowRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'constraintIdFrom': constraintIdFrom, 'constraintIdTo': constraintIdTo, 'constraintName': constraintName, 'contingencyName': contingencyName, 'shadowPriceOriginalFrom': shadowPriceOriginalFrom, 'shadowPriceOriginalTo': shadowPriceOriginalTo, 'shadowPriceCorrectedFrom': shadowPriceCorrectedFrom, 'shadowPriceCorrectedTo': shadowPriceCorrectedTo, 'limitOriginalFrom': limitOriginalFrom, 'limitOriginalTo': limitOriginalTo, 'limitCorrectedFrom': limitCorrectedFrom, 'limitCorrectedTo': limitCorrectedTo, 'valueOriginalFrom': valueOriginalFrom, 'valueOriginalTo': valueOriginalTo, 'valueCorrectedFrom': valueCorrectedFrom, 'valueCorrectedTo': valueCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5610,6 +9241,29 @@ class RtmPriceCorrectionsSoglmpRow(Row):
resourceName: str | None
resourceType: str | None
+ class RtmPriceCorrectionsSoglmpHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ resourceType: str | None
+ resourceName: str | None
+ meterName: str | None
+ meterLMPOriginal: Decimal | None
+ meterLMPCorrected: Decimal | None
+ RTRDPAOriginal: Decimal | None = None
+ RTRDPACorrected: Decimal | None = None
+ finalLMPOriginal: Decimal | None
+ finalLMPCorrected: Decimal | None
+ priceCorrectionTime: datetime | None
+ repeatHourFlag: bool | None
+ RTORPAOriginal: Decimal | None = None
+ RTORPACorrected: Decimal | None = None
+ RTORDPAOriginal: Decimal | None = None
+ RTORDPACorrected: Decimal | None = None
+
+ @property
+ def rtm_price_corrections_soglmp_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsSoglmpHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsSoglmpHistoryRow, {'ScedTimestamp': 'SCEDTimestamp', 'ResourceType': 'resourceType', 'ResourceName': 'resourceName', 'MeterName': 'meterName', 'MeterLMPOriginal': 'meterLMPOriginal', 'MeterLMPCorrected': 'meterLMPCorrected', 'RTRDPAOriginal': 'RTRDPAOriginal', 'RTRDPACorrected': 'RTRDPACorrected', 'FinalLMPOriginal': 'finalLMPOriginal', 'FinalLMPCorrected': 'finalLMPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'RepeatedHourFlag': 'repeatHourFlag'}, {}, member='*pricecorrection_RTM_SOGLMP_*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S', 'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=({'ScedTimestamp': 'SCEDTimestamp', 'ResourceType': 'resourceType', 'ResourceName': 'resourceName', 'MeterName': 'meterName', 'MeterLMPOriginal': 'meterLMPOriginal', 'MeterLMPCorrected': 'meterLMPCorrected', 'RTORPAOriginal': 'RTORPAOriginal', 'RTORPACorrected': 'RTORPACorrected', 'RTORDPAOriginal': 'RTORDPAOriginal', 'RTORDPACorrected': 'RTORDPACorrected', 'FinalLMPOriginal': 'finalLMPOriginal', 'FinalLMPCorrected': 'finalLMPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'repeatHourFlag'},), document='*pricecorrection_RTM_SOGLMP_*')
+
def rtm_price_corrections_soglmp(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, resourceType: str | None = None, resourceName: str | None = None, meterName: str | None = None, meterLMPOriginalFrom: Decimal | None = None, meterLMPOriginalTo: Decimal | None = None, meterLMPCorrectedFrom: Decimal | None = None, meterLMPCorrectedTo: Decimal | None = None, RTRDPAOriginalFrom: Decimal | None = None, RTRDPAOriginalTo: Decimal | None = None, RTRDPACorrectedFrom: Decimal | None = None, RTRDPACorrectedTo: Decimal | None = None, finalLMPOriginalFrom: Decimal | None = None, finalLMPOriginalTo: Decimal | None = None, finalLMPCorrectedFrom: Decimal | None = None, finalLMPCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsSoglmpRow]:
'RTM Price Corrections for SOG LMP'
return self._client._page('/np4-197-m/rtm_price_corrections_soglmp', np4_197_m.RtmPriceCorrectionsSoglmpRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'resourceType': resourceType, 'resourceName': resourceName, 'meterName': meterName, 'meterLMPOriginalFrom': meterLMPOriginalFrom, 'meterLMPOriginalTo': meterLMPOriginalTo, 'meterLMPCorrectedFrom': meterLMPCorrectedFrom, 'meterLMPCorrectedTo': meterLMPCorrectedTo, 'RTRDPAOriginalFrom': RTRDPAOriginalFrom, 'RTRDPAOriginalTo': RTRDPAOriginalTo, 'RTRDPACorrectedFrom': RTRDPACorrectedFrom, 'RTRDPACorrectedTo': RTRDPACorrectedTo, 'finalLMPOriginalFrom': finalLMPOriginalFrom, 'finalLMPOriginalTo': finalLMPOriginalTo, 'finalLMPCorrectedFrom': finalLMPCorrectedFrom, 'finalLMPCorrectedTo': finalLMPCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5637,6 +9291,11 @@ class RtmPriceCorrectionsSogpriceRow(Row):
resourceName: str | None
resourceType: str | None
+ @property
+ def rtm_price_corrections_sogprice_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsSogpriceRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsSogpriceRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'ResourceType': 'resourceType', 'ResourceName': 'resourceName', 'MeterName': 'meterName', 'PriceOriginal': 'priceOriginal', 'PriceCorrected': 'priceCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*pricecorrection_RTM_SOGPRICE_*.csv', datetimes={'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_RTM_SOGPRICE_*')
+
def rtm_price_corrections_sogprice(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntervalFrom: int | None = None, deliveryIntervalTo: int | None = None, resourceType: str | None = None, resourceName: str | None = None, meterName: str | None = None, priceOriginalFrom: Decimal | None = None, priceOriginalTo: Decimal | None = None, priceCorrectedFrom: Decimal | None = None, priceCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsSogpriceRow]:
'RTM Price Corrections for SOG Price'
return self._client._page('/np4-197-m/rtm_price_corrections_sogprice', np4_197_m.RtmPriceCorrectionsSogpriceRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntervalFrom': deliveryIntervalFrom, 'deliveryIntervalTo': deliveryIntervalTo, 'resourceType': resourceType, 'resourceName': resourceName, 'meterName': meterName, 'priceOriginalFrom': priceOriginalFrom, 'priceOriginalTo': priceOriginalTo, 'priceCorrectedFrom': priceCorrectedFrom, 'priceCorrectedTo': priceCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5663,6 +9322,11 @@ class RtmPriceCorrectionsSppRow(Row):
settlementPointName: str | None
settlementPointType: str | None
+ @property
+ def rtm_price_corrections_spp_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsSppRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsSppRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'SettlementPointName': 'settlementPointName', 'SettlementPointType': 'settlementPointType', 'SPPOriginal': 'SPPOriginal', 'SPPCorrected': 'SPPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*pricecorrection_RTM_SPP_*.csv', datetimes={'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_RTM_SPP_*')
+
def rtm_price_corrections_spp(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntervalFrom: int | None = None, deliveryIntervalTo: int | None = None, settlementPointName: str | None = None, settlementPointType: str | None = None, SPPOriginalFrom: Decimal | None = None, SPPOriginalTo: Decimal | None = None, SPPCorrectedFrom: Decimal | None = None, SPPCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsSppRow]:
'RTM Price Corrections for SPP'
return self._client._page('/np4-197-m/rtm_price_corrections_spp', np4_197_m.RtmPriceCorrectionsSppRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntervalFrom': deliveryIntervalFrom, 'deliveryIntervalTo': deliveryIntervalTo, 'settlementPointName': settlementPointName, 'settlementPointType': settlementPointType, 'SPPOriginalFrom': SPPOriginalFrom, 'SPPOriginalTo': SPPOriginalTo, 'SPPCorrectedFrom': SPPCorrectedFrom, 'SPPCorrectedTo': SPPCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5686,6 +9350,11 @@ class RtmPriceCorrectionsSplmpRow(Row):
priceCorrectionTime: datetime | None
settlementPointName: str | None
+ @property
+ def rtm_price_corrections_splmp_history(self) -> Archive[np4_197_m.RtmPriceCorrectionsSplmpRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-197-m', np4_197_m.RtmPriceCorrectionsSplmpRow, {'SCEDTimestamp': 'SCEDTimestamp', 'SettlementPoint': 'settlementPointName', 'LMPOriginal': 'LMPOriginal', 'LMPCorrected': 'LMPCorrected', 'PriceCorrectionTime': 'priceCorrectionTime', 'DSTFlag': 'DSTFlag'}, {}, member='*pricecorrection_RTM_SPLMP_*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S', 'priceCorrectionTime': '%m/%d/%Y %H:%M:%S'}, variants=(), document='*pricecorrection_RTM_SPLMP_*')
+
def rtm_price_corrections_splmp(self, *, settlementPointName: str | None = None, LMPOriginalFrom: Decimal | None = None, LMPOriginalTo: Decimal | None = None, LMPCorrectedFrom: Decimal | None = None, LMPCorrectedTo: Decimal | None = None, priceCorrectionTimeFrom: datetime | None = None, priceCorrectionTimeTo: datetime | None = None, DSTFlag: bool | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_197_m.RtmPriceCorrectionsSplmpRow]:
'RTM Price Corrections SP LMP'
return self._client._page('/np4-197-m/rtm_price_corrections_splmp', np4_197_m.RtmPriceCorrectionsSplmpRow, {'settlementPointName': settlementPointName, 'LMPOriginalFrom': LMPOriginalFrom, 'LMPOriginalTo': LMPOriginalTo, 'LMPCorrectedFrom': LMPCorrectedFrom, 'LMPCorrectedTo': LMPCorrectedTo, 'priceCorrectionTimeFrom': priceCorrectionTimeFrom, 'priceCorrectionTimeTo': priceCorrectionTimeTo, 'DSTFlag': DSTFlag, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5712,6 +9381,11 @@ class DamDeEnergizedSpbcRow(Row):
repeatedHourFlag: bool | None
settlementPoint: str | None
+ @property
+ def dam_de_energized_spbc_history(self) -> Archive[np4_200_cd.DamDeEnergizedSpbcRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-200-cd', np4_200_cd.DamDeEnergizedSpbcRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'SettlementPoint': 'settlementPoint', 'DSTFlag': 'repeatedHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def dam_de_energized_spbc(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, settlementPoint: str | None = None, repeatedHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_200_cd.DamDeEnergizedSpbcRow]:
'DAM De-Energized Settlement Points in Base Case'
return self._client._page('/np4-200-cd/dam_de_energized_spbc', np4_200_cd.DamDeEnergizedSpbcRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'settlementPoint': settlementPoint, 'repeatedHourFlag': repeatedHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5742,6 +9416,21 @@ class DamScedAsDemandCurvesRow(Row):
quantity: Decimal | None
repeatHourFlag: bool | None
+ class DamScedAsDemandCurvesHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ ASType: str | None
+ demandCurvePoint: Decimal | None
+ quantity: Decimal | None
+ price: Decimal | None
+ repeatHourFlag: bool | None
+
+ @property
+ def dam_sced_as_demand_curves_history(self) -> Archive[np4_212_cd.DamScedAsDemandCurvesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-212-cd', np4_212_cd.DamScedAsDemandCurvesHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'ASType': 'ASType', 'DemandCurvePoint': 'demandCurvePoint', 'Quantity': 'quantity', 'Price': 'price', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def dam_sced_as_demand_curves(self, *, quantityFrom: Decimal | None = None, quantityTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, repeatHourFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, ASType: str | None = None, demandCurvePointFrom: Decimal | None = None, demandCurvePointTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_212_cd.DamScedAsDemandCurvesRow]:
'DAM and SCED Ancillary Service Demand Curves'
return self._client._page('/np4-212-cd/dam_sced_as_demand_curves', np4_212_cd.DamScedAsDemandCurvesRow, {'quantityFrom': quantityFrom, 'quantityTo': quantityTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'repeatHourFlag': repeatHourFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'ASType': ASType, 'demandCurvePointFrom': demandCurvePointFrom, 'demandCurvePointTo': demandCurvePointTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5772,6 +9461,11 @@ class HrucAsDemandCurvesRow(Row):
quantity: Decimal | None
repeatHourFlag: bool | None
+ @property
+ def hruc_as_demand_curves_history(self) -> Archive[np4_213_cd.HrucAsDemandCurvesRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-213-cd', np4_213_cd.HrucAsDemandCurvesRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'RUCTimeStamp': 'RUCTimestamp', 'ASType': 'ASType', 'DemandCurvePoint': 'demandCurvePoint', 'Quantity': 'quantity', 'Price': 'price', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def hruc_as_demand_curves(self, *, quantityFrom: Decimal | None = None, quantityTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, repeatHourFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, ASType: str | None = None, demandCurvePointFrom: Decimal | None = None, demandCurvePointTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_213_cd.HrucAsDemandCurvesRow]:
'Hourly RUC Ancillary Service Demand Curves'
return self._client._page('/np4-213-cd/hruc_as_demand_curves', np4_213_cd.HrucAsDemandCurvesRow, {'quantityFrom': quantityFrom, 'quantityTo': quantityTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'repeatHourFlag': repeatHourFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'ASType': ASType, 'demandCurvePointFrom': demandCurvePointFrom, 'demandCurvePointTo': demandCurvePointTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5802,6 +9496,11 @@ class DrucAsDemandCurvesRow(Row):
quantity: Decimal | None
repeatHourFlag: bool | None
+ @property
+ def druc_as_demand_curves_history(self) -> Archive[np4_214_cd.DrucAsDemandCurvesRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-214-cd', np4_214_cd.DrucAsDemandCurvesRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'RUCTimeStamp': 'RUCTimestamp', 'ASType': 'ASType', 'DemandCurvePoint': 'demandCurvePoint', 'Quantity': 'quantity', 'Price': 'price', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def druc_as_demand_curves(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, ASType: str | None = None, demandCurvePointFrom: Decimal | None = None, demandCurvePointTo: Decimal | None = None, quantityFrom: Decimal | None = None, quantityTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_214_cd.DrucAsDemandCurvesRow]:
'Daily RUC Ancillary Service Demand Curves'
return self._client._page('/np4-214-cd/druc_as_demand_curves', np4_214_cd.DrucAsDemandCurvesRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'ASType': ASType, 'demandCurvePointFrom': demandCurvePointFrom, 'demandCurvePointTo': demandCurvePointTo, 'quantityFrom': quantityFrom, 'quantityTo': quantityTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5833,6 +9532,22 @@ class WrucAsDemandCurvesRow(Row):
quantity: Decimal | None
repeatHourFlag: bool | None
+ class WrucAsDemandCurvesHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ RUCTimestamp: datetime | None
+ ASType: str | None
+ demandCurvePoint: Decimal | None
+ quantity: Decimal | None
+ price: Decimal | None
+ repeatHourFlag: bool | None
+
+ @property
+ def wruc_as_demand_curves_history(self) -> Archive[np4_215_cd.WrucAsDemandCurvesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-215-cd', np4_215_cd.WrucAsDemandCurvesHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'RUCTimeStamp': 'RUCTimestamp', 'ASType': 'ASType', 'DemandCurvePoint': 'demandCurvePoint', 'Quantity': 'quantity', 'Price': 'price', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S', 'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def wruc_as_demand_curves(self, *, quantityFrom: Decimal | None = None, quantityTo: Decimal | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, repeatHourFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, ASType: str | None = None, demandCurvePointFrom: Decimal | None = None, demandCurvePointTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_215_cd.WrucAsDemandCurvesRow]:
'Weekly RUC Ancillary Service Demand Curves'
return self._client._page('/np4-215-cd/wruc_as_demand_curves', np4_215_cd.WrucAsDemandCurvesRow, {'quantityFrom': quantityFrom, 'quantityTo': quantityTo, 'priceFrom': priceFrom, 'priceTo': priceTo, 'repeatHourFlag': repeatHourFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'ASType': ASType, 'demandCurvePointFrom': demandCurvePointFrom, 'demandCurvePointTo': demandCurvePointTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5861,6 +9576,19 @@ class ElectricalBusMapHeurPriceRow(Row):
toEBName: str | None
type: str | None
+ class ElectricalBusMapHeurPriceHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ marketType: str | None
+ fromEBName: str | None
+ toEBName: str | None
+ type: str | None
+ priority: Decimal | None
+
+ @property
+ def electrical_bus_map_heur_price_history(self) -> Archive[np4_231_cd.ElectricalBusMapHeurPriceHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-231-cd', np4_231_cd.ElectricalBusMapHeurPriceHistoryRow, {'MarketType': 'marketType', 'FromEBName': 'fromEBName', 'ToEBName': 'toEBName', 'Type': 'type', 'Priority': 'priority'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def electrical_bus_map_heur_price(self, *, toEBName: str | None = None, type: str | None = None, priorityFrom: Decimal | None = None, priorityTo: Decimal | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, marketType: str | None = None, fromEBName: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_231_cd.ElectricalBusMapHeurPriceRow]:
'Electrical Bus Mapping for Heuristic Pricing'
return self._client._page('/np4-231-cd/electrical_bus_map_heur_price', np4_231_cd.ElectricalBusMapHeurPriceRow, {'toEBName': toEBName, 'type': type, 'priorityFrom': priorityFrom, 'priorityTo': priorityTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'marketType': marketType, 'fromEBName': fromEBName, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5889,6 +9617,19 @@ class DamAsPlanRow(Row):
postedDatetime: datetime | None
quantity: int | None
+ class DamAsPlanHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ ancillaryType: str | None
+ quantity: int | None
+ DSTFlag: bool | None
+
+ @property
+ def dam_as_plan_history(self) -> Archive[np4_33_cd.DamAsPlanHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-33-cd', np4_33_cd.DamAsPlanHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'AncillaryType': 'ancillaryType', 'Quantity': 'quantity', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def dam_as_plan(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, ancillaryType: str | None = None, quantityFrom: int | None = None, quantityTo: int | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_33_cd.DamAsPlanRow]:
'DAM Ancillary Service Plan'
return self._client._page('/np4-33-cd/dam_as_plan', np4_33_cd.DamAsPlanRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'ancillaryType': ancillaryType, 'quantityFrom': quantityFrom, 'quantityTo': quantityTo, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5920,6 +9661,11 @@ class EppCumulativeHoursRow(Row):
hoursHCAPDAM: Decimal | None
repeatHourFlag: bool | None
+ @property
+ def epp_cumulative_hours_history(self) -> Archive[np4_412_cd.EppCumulativeHoursRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-412-cd', np4_412_cd.EppCumulativeHoursRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'AvgRTSystemLambda': 'RTSystemLambda', 'AvgRTRDPA': 'RTRDPA', 'SumRTSysLambdaRTRDPA': 'RTSystemLambdaRTDPA', 'HCAPforDAM': 'HCAPDAM', 'CumHrsHCAPDAM24Hrs': 'hoursHCAPDAM', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def epp_cumulative_hours(self, *, HCAPDAMFrom: Decimal | None = None, HCAPDAMTo: Decimal | None = None, hoursHCAPDAMFrom: Decimal | None = None, hoursHCAPDAMTo: Decimal | None = None, repeatHourFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntervalFrom: int | None = None, deliveryIntervalTo: int | None = None, RTSystemLambdaFrom: Decimal | None = None, RTSystemLambdaTo: Decimal | None = None, RTRDPAFrom: Decimal | None = None, RTRDPATo: Decimal | None = None, RTSystemLambdaRTDPAFrom: Decimal | None = None, RTSystemLambdaRTDPATo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_412_cd.EppCumulativeHoursRow]:
'Emergency Pricing Program Cumulative Hours Tracking'
return self._client._page('/np4-412-cd/epp_cumulative_hours', np4_412_cd.EppCumulativeHoursRow, {'HCAPDAMFrom': HCAPDAMFrom, 'HCAPDAMTo': HCAPDAMTo, 'hoursHCAPDAMFrom': hoursHCAPDAMFrom, 'hoursHCAPDAMTo': hoursHCAPDAMTo, 'repeatHourFlag': repeatHourFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntervalFrom': deliveryIntervalFrom, 'deliveryIntervalTo': deliveryIntervalTo, 'RTSystemLambdaFrom': RTSystemLambdaFrom, 'RTSystemLambdaTo': RTSystemLambdaTo, 'RTRDPAFrom': RTRDPAFrom, 'RTRDPATo': RTRDPATo, 'RTSystemLambdaRTDPAFrom': RTSystemLambdaRTDPAFrom, 'RTSystemLambdaRTDPATo': RTSystemLambdaRTDPATo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5950,6 +9696,21 @@ class HrlySysRegWindFcastModelRow(Row):
region: str | None
value: Decimal | None
+ class HrlySysRegWindFcastModelHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: int | None
+ region: str | None
+ value: Decimal | None
+ model: str | None
+ inUseFlag: bool | None
+ DSTFlag: bool | None
+
+ @property
+ def hrly_sys_reg_wind_fcast_model_history(self) -> Archive[np4_442_cd.HrlySysRegWindFcastModelHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-442-cd', np4_442_cd.HrlySysRegWindFcastModelHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Region': 'region', 'Value': 'value', 'Model': 'model', 'InUseFlag': 'inUseFlag', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=())
+
def hrly_sys_reg_wind_fcast_model(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, region: str | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_442_cd.HrlySysRegWindFcastModelRow]:
'Hourly System-wide and Regional Wind Forecasts by Model'
return self._client._page('/np4-442-cd/hrly_sys_reg_wind_fcast_model', np4_442_cd.HrlySysRegWindFcastModelRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'region': region, 'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5980,6 +9741,21 @@ class HrlySysRegSolarFcastModelRow(Row):
region: str | None
value: Decimal | None
+ class HrlySysRegSolarFcastModelHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: int | None
+ region: str | None
+ value: Decimal | None
+ model: str | None
+ inUseFlag: bool | None
+ DSTFlag: bool | None
+
+ @property
+ def hrly_sys_reg_solar_fcast_model_history(self) -> Archive[np4_443_cd.HrlySysRegSolarFcastModelHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-443-cd', np4_443_cd.HrlySysRegSolarFcastModelHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Region': 'region', 'Value': 'value', 'Model': 'model', 'InUseFlag': 'inUseFlag', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=())
+
def hrly_sys_reg_solar_fcast_model(self, *, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, region: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_443_cd.HrlySysRegSolarFcastModelRow]:
'Hourly System-Wide and Regional Solar Forecasts by Model'
return self._client._page('/np4-443-cd/hrly_sys_reg_solar_fcast_model', np4_443_cd.HrlySysRegSolarFcastModelRow, {'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'region': region, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -5996,6 +9772,22 @@ def hrly_sys_reg_solar_fcast_model_iter_async(self, *, valueFrom: Decimal | None
'Hourly System-Wide and Regional Solar Forecasts by Model'
return self._client._aiter('/np4-443-cd/hrly_sys_reg_solar_fcast_model', np4_443_cd.HrlySysRegSolarFcastModelRow, {'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'region': region, 'size': size, 'sort': sort, 'dir': dir})
+class np4_494_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class FuelCostSubmissionsHistoryRow(Row):
+ sourceSheet: str | None = None
+ deliveryDate: date | None
+ deliveryHour: int | None
+ resourceCount: int | None
+
+ @property
+ def fuel_cost_submissions_history(self) -> WorkbookArchive[np4_494_er.FuelCostSubmissionsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np4-494-er', np4_494_er.FuelCostSubmissionsHistoryRow, {'Delivery Date': 'deliveryDate', 'Delivery Hour': 'deliveryHour', 'Number of resources with submitted EFC': 'resourceCount'}, {}, sheets=('Exceptional Fuel Cost Data',), variants=())
+
class np4_523_cd:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -6006,6 +9798,11 @@ class DamSystemLambdaRow(Row):
hourEnding: str | None
systemLambda: Decimal | None
+ @property
+ def dam_system_lambda_history(self) -> Archive[np4_523_cd.DamSystemLambdaRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-523-cd', np4_523_cd.DamSystemLambdaRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'SystemLambda': 'systemLambda', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def dam_system_lambda(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, systemLambdaFrom: Decimal | None = None, systemLambdaTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_523_cd.DamSystemLambdaRow]:
'DAM System Lambda'
return self._client._page('/np4-523-cd/dam_system_lambda', np4_523_cd.DamSystemLambdaRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'systemLambdaFrom': systemLambdaFrom, 'systemLambdaTo': systemLambdaTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6033,6 +9830,11 @@ class DamAsSoldRow(Row):
quantity: Decimal | None
repeatHourFlag: bool | None
+ @property
+ def dam_as_sold_history(self) -> Archive[np4_532_cd.DamAsSoldRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-532-cd', np4_532_cd.DamAsSoldRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'ASType': 'ASType', 'Quantity': 'quantity', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def dam_as_sold(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, ASType: str | None = None, quantityFrom: Decimal | None = None, quantityTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_532_cd.DamAsSoldRow]:
'DAM Total Ancillary Services Sold'
return self._client._page('/np4-532-cd/dam_as_sold', np4_532_cd.DamAsSoldRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'ASType': ASType, 'quantityFrom': quantityFrom, 'quantityTo': quantityTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6066,6 +9868,11 @@ class WeatherAssumptionsRow(Row):
southern: Decimal | None
west: Decimal | None
+ @property
+ def weather_assumptions_history(self) -> Archive[np4_722_cd.WeatherAssumptionsRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-722-cd', np4_722_cd.WeatherAssumptionsRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Coast': 'coast', 'East': 'east', 'FarWest': 'farWest', 'North': 'north', 'NorthCentral': 'northCentral', 'SouthCentral': 'southCentral', 'Southern': 'southern', 'West': 'west', 'DSTFlag': 'repeatedHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def weather_assumptions(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, coastFrom: Decimal | None = None, coastTo: Decimal | None = None, eastFrom: Decimal | None = None, eastTo: Decimal | None = None, farWestFrom: Decimal | None = None, farWestTo: Decimal | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, northCentralFrom: Decimal | None = None, northCentralTo: Decimal | None = None, southCentralFrom: Decimal | None = None, southCentralTo: Decimal | None = None, southernFrom: Decimal | None = None, southernTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, repeatedHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_722_cd.WeatherAssumptionsRow]:
'Weather Assumptions'
return self._client._page('/np4-722-cd/weather_assumptions', np4_722_cd.WeatherAssumptionsRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'coastFrom': coastFrom, 'coastTo': coastTo, 'eastFrom': eastFrom, 'eastTo': eastTo, 'farWestFrom': farWestFrom, 'farWestTo': farWestTo, 'northFrom': northFrom, 'northTo': northTo, 'northCentralFrom': northCentralFrom, 'northCentralTo': northCentralTo, 'southCentralFrom': southCentralFrom, 'southCentralTo': southCentralTo, 'southernFrom': southernFrom, 'southernTo': southernTo, 'westFrom': westFrom, 'westTo': westTo, 'repeatedHourFlag': repeatedHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6109,6 +9916,48 @@ class WppHrlyAvrgActlFcastRow(Row):
hourEnding: int | None
postedDatetime: datetime | None
+ class WppHrlyAvrgActlFcastHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None = None
+ hourEnding: int | None = None
+ genSystemWide: Decimal | None = None
+ COPHSLSystemWide: Decimal | None
+ STWPFSystemWide: Decimal | None
+ WGRPPSystemWide: Decimal | None
+ genLoadZoneSouthHouston: Decimal | None = None
+ COPHSLLoadZoneSouthHouston: Decimal | None = None
+ STWPFLoadZoneSouthHouston: Decimal | None = None
+ WGRPPLoadZoneSouthHouston: Decimal | None = None
+ genLoadZoneWest: Decimal | None = None
+ COPHSLLoadZoneWest: Decimal | None = None
+ STWPFLoadZoneWest: Decimal | None = None
+ WGRPPLoadZoneWest: Decimal | None = None
+ genLoadZoneNorth: Decimal | None = None
+ COPHSLLoadZoneNorth: Decimal | None = None
+ STWPFLoadZoneNorth: Decimal | None = None
+ WGRPPLoadZoneNorth: Decimal | None = None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+ hourEndingTimestamp: datetime | None = None
+ actualSystemWide: Decimal | None = None
+ actualSouthHouston: Decimal | None = None
+ COPHSLSouthHouston: Decimal | None = None
+ STWPFSouthHouston: Decimal | None = None
+ WGRPPSouthHouston: Decimal | None = None
+ actualWestNorth: Decimal | None = None
+ COPHSLWestNorth: Decimal | None = None
+ STWPFWestNorth: Decimal | None = None
+ WGRPPWestNorth: Decimal | None = None
+ actualLoadZoneSouthHouston: Decimal | None = None
+ actualLoadZoneWest: Decimal | None = None
+ actualLoadZoneNorth: Decimal | None = None
+ hourBeginningTimestamp: datetime | None = None
+
+ @property
+ def wpp_hrly_avrg_actl_fcast_history(self) -> Archive[np4_732_cd.WppHrlyAvrgActlFcastHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-732-cd', np4_732_cd.WppHrlyAvrgActlFcastHistoryRow, {'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STWPF_SYSTEM_WIDE': 'STWPFSystemWide', 'WGRPP_SYSTEM_WIDE': 'WGRPPSystemWide', 'GEN_LZ_SOUTH_HOUSTON': 'genLoadZoneSouthHouston', 'COP_HSL_LZ_SOUTH_HOUSTON': 'COPHSLLoadZoneSouthHouston', 'STWPF_LZ_SOUTH_HOUSTON': 'STWPFLoadZoneSouthHouston', 'WGRPP_LZ_SOUTH_HOUSTON': 'WGRPPLoadZoneSouthHouston', 'GEN_LZ_WEST': 'genLoadZoneWest', 'COP_HSL_LZ_WEST': 'COPHSLLoadZoneWest', 'STWPF_LZ_WEST': 'STWPFLoadZoneWest', 'WGRPP_LZ_WEST': 'WGRPPLoadZoneWest', 'GEN_LZ_NORTH': 'genLoadZoneNorth', 'COP_HSL_LZ_NORTH': 'COPHSLLoadZoneNorth', 'STWPF_LZ_NORTH': 'STWPFLoadZoneNorth', 'WGRPP_LZ_NORTH': 'WGRPPLoadZoneNorth', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S', 'hourEndingTimestamp': '%m/%d/%Y %H:%M', 'hourBeginningTimestamp': '%m/%d/%Y %H:%M'}, variants=({'HOUR_ENDING': 'hourEndingTimestamp', 'ACTUAL_SYSTEM_WIDE': 'actualSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STWPF_SYSTEM_WIDE': 'STWPFSystemWide', 'WGRPP_SYSTEM_WIDE': 'WGRPPSystemWide', 'ACTUAL_SOUTH_HOUSTON': 'actualSouthHouston', 'COP_HSL_SOUTH_HOUSTON': 'COPHSLSouthHouston', 'STWPF_SOUTH_HOUSTON': 'STWPFSouthHouston', 'WGRPP_SOUTH_HOUSTON': 'WGRPPSouthHouston', 'ACTUAL_WEST_NORTH': 'actualWestNorth', 'COP_HSL_WEST_NORTH': 'COPHSLWestNorth', 'STWPF_WEST_NORTH': 'STWPFWestNorth', 'WGRPP_WEST_NORTH': 'WGRPPWestNorth', 'DSTFlag': 'DSTFlag'}, {'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'ACTUAL_SYSTEM_WIDE': 'actualSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STWPF_SYSTEM_WIDE': 'STWPFSystemWide', 'WGRPP_SYSTEM_WIDE': 'WGRPPSystemWide', 'ACTUAL_LZ_SOUTH_HOUSTON': 'actualLoadZoneSouthHouston', 'COP_HSL_LZ_SOUTH_HOUSTON': 'COPHSLLoadZoneSouthHouston', 'STWPF_LZ_SOUTH_HOUSTON': 'STWPFLoadZoneSouthHouston', 'WGRPP_LZ_SOUTH_HOUSTON': 'WGRPPLoadZoneSouthHouston', 'ACTUAL_LZ_WEST': 'actualLoadZoneWest', 'COP_HSL_LZ_WEST': 'COPHSLLoadZoneWest', 'STWPF_LZ_WEST': 'STWPFLoadZoneWest', 'WGRPP_LZ_WEST': 'WGRPPLoadZoneWest', 'ACTUAL_LZ_NORTH': 'actualLoadZoneNorth', 'COP_HSL_LZ_NORTH': 'COPHSLLoadZoneNorth', 'STWPF_LZ_NORTH': 'STWPFLoadZoneNorth', 'WGRPP_LZ_NORTH': 'WGRPPLoadZoneNorth', 'DSTFlag': 'DSTFlag'}, {'HOUR_BEGINNING': 'hourBeginningTimestamp', 'ACTUAL_SYSTEM_WIDE': 'actualSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STWPF_SYSTEM_WIDE': 'STWPFSystemWide', 'WGRPP_SYSTEM_WIDE': 'WGRPPSystemWide', 'ACTUAL_SOUTH_HOUSTON': 'actualSouthHouston', 'COP_HSL_SOUTH_HOUSTON': 'COPHSLSouthHouston', 'STWPF_SOUTH_HOUSTON': 'STWPFSouthHouston', 'WGRPP_SOUTH_HOUSTON': 'WGRPPSouthHouston', 'ACTUAL_WEST_NORTH': 'actualWestNorth', 'COP_HSL_WEST_NORTH': 'COPHSLWestNorth', 'STWPF_WEST_NORTH': 'STWPFWestNorth', 'WGRPP_WEST_NORTH': 'WGRPPWestNorth', 'DSTFlag': 'DSTFlag'}, {'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'ACTUAL_SYSTEM_WIDE': 'actualSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STWPF_SYSTEM_WIDE': 'STWPFSystemWide', 'WGRPP_SYSTEM_WIDE': 'WGRPPSystemWide', 'ACTUAL_SOUTH_HOUSTON': 'actualSouthHouston', 'COP_HSL_SOUTH_HOUSTON': 'COPHSLSouthHouston', 'STWPF_SOUTH_HOUSTON': 'STWPFSouthHouston', 'WGRPP_SOUTH_HOUSTON': 'WGRPPSouthHouston', 'ACTUAL_WEST_NORTH': 'actualWestNorth', 'COP_HSL_WEST_NORTH': 'COPHSLWestNorth', 'STWPF_WEST_NORTH': 'STWPFWestNorth', 'WGRPP_WEST_NORTH': 'WGRPPWestNorth', 'DSTFlag': 'DSTFlag'}))
+
def wpp_hrly_avrg_actl_fcast(self, *, WGRPPLoadZoneNorthFrom: Decimal | None = None, WGRPPLoadZoneNorthTo: Decimal | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, COPHSLSystemWideFrom: Decimal | None = None, COPHSLSystemWideTo: Decimal | None = None, STWPFSystemWideFrom: Decimal | None = None, STWPFSystemWideTo: Decimal | None = None, WGRPPSystemWideFrom: Decimal | None = None, WGRPPSystemWideTo: Decimal | None = None, genLoadZoneSouthHoustonFrom: Decimal | None = None, genLoadZoneSouthHoustonTo: Decimal | None = None, COPHSLLoadZoneSouthHoustonFrom: Decimal | None = None, COPHSLLoadZoneSouthHoustonTo: Decimal | None = None, STWPFLoadZoneSouthHoustonFrom: Decimal | None = None, STWPFLoadZoneSouthHoustonTo: Decimal | None = None, WGRPPLoadZoneSouthHoustonFrom: Decimal | None = None, WGRPPLoadZoneSouthHoustonTo: Decimal | None = None, genLoadZoneWestFrom: Decimal | None = None, genLoadZoneWestTo: Decimal | None = None, COPHSLLoadZoneWestFrom: Decimal | None = None, COPHSLLoadZoneWestTo: Decimal | None = None, STWPFLoadZoneWestFrom: Decimal | None = None, STWPFLoadZoneWestTo: Decimal | None = None, WGRPPLoadZoneWestFrom: Decimal | None = None, WGRPPLoadZoneWestTo: Decimal | None = None, genLoadZoneNorthFrom: Decimal | None = None, genLoadZoneNorthTo: Decimal | None = None, COPHSLLoadZoneNorthFrom: Decimal | None = None, COPHSLLoadZoneNorthTo: Decimal | None = None, STWPFLoadZoneNorthFrom: Decimal | None = None, STWPFLoadZoneNorthTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_732_cd.WppHrlyAvrgActlFcastRow]:
'Wind Power Production - Hourly Averaged Actual and Forecasted Values'
return self._client._page('/np4-732-cd/wpp_hrly_avrg_actl_fcast', np4_732_cd.WppHrlyAvrgActlFcastRow, {'WGRPPLoadZoneNorthFrom': WGRPPLoadZoneNorthFrom, 'WGRPPLoadZoneNorthTo': WGRPPLoadZoneNorthTo, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'COPHSLSystemWideFrom': COPHSLSystemWideFrom, 'COPHSLSystemWideTo': COPHSLSystemWideTo, 'STWPFSystemWideFrom': STWPFSystemWideFrom, 'STWPFSystemWideTo': STWPFSystemWideTo, 'WGRPPSystemWideFrom': WGRPPSystemWideFrom, 'WGRPPSystemWideTo': WGRPPSystemWideTo, 'genLoadZoneSouthHoustonFrom': genLoadZoneSouthHoustonFrom, 'genLoadZoneSouthHoustonTo': genLoadZoneSouthHoustonTo, 'COPHSLLoadZoneSouthHoustonFrom': COPHSLLoadZoneSouthHoustonFrom, 'COPHSLLoadZoneSouthHoustonTo': COPHSLLoadZoneSouthHoustonTo, 'STWPFLoadZoneSouthHoustonFrom': STWPFLoadZoneSouthHoustonFrom, 'STWPFLoadZoneSouthHoustonTo': STWPFLoadZoneSouthHoustonTo, 'WGRPPLoadZoneSouthHoustonFrom': WGRPPLoadZoneSouthHoustonFrom, 'WGRPPLoadZoneSouthHoustonTo': WGRPPLoadZoneSouthHoustonTo, 'genLoadZoneWestFrom': genLoadZoneWestFrom, 'genLoadZoneWestTo': genLoadZoneWestTo, 'COPHSLLoadZoneWestFrom': COPHSLLoadZoneWestFrom, 'COPHSLLoadZoneWestTo': COPHSLLoadZoneWestTo, 'STWPFLoadZoneWestFrom': STWPFLoadZoneWestFrom, 'STWPFLoadZoneWestTo': STWPFLoadZoneWestTo, 'WGRPPLoadZoneWestFrom': WGRPPLoadZoneWestFrom, 'WGRPPLoadZoneWestTo': WGRPPLoadZoneWestTo, 'genLoadZoneNorthFrom': genLoadZoneNorthFrom, 'genLoadZoneNorthTo': genLoadZoneNorthTo, 'COPHSLLoadZoneNorthFrom': COPHSLLoadZoneNorthFrom, 'COPHSLLoadZoneNorthTo': COPHSLLoadZoneNorthTo, 'STWPFLoadZoneNorthFrom': STWPFLoadZoneNorthFrom, 'STWPFLoadZoneNorthTo': STWPFLoadZoneNorthTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6139,6 +9988,22 @@ class WppActual5minAvgValuesRow(Row):
intervalEnding: datetime | None
postedDatetime: datetime | None
+ class WppActual5minAvgValuesHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ intervalEnding: datetime | None
+ genSystemWide: Decimal | None
+ LZSouthHouston: Decimal | None
+ LZWest: Decimal | None = None
+ LZNorth: Decimal | None = None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+ LZWestNorth: Decimal | None = None
+
+ @property
+ def wpp_actual_5min_avg_values_history(self) -> Archive[np4_733_cd.WppActual5minAvgValuesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-733-cd', np4_733_cd.WppActual5minAvgValuesHistoryRow, {'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'LZ_SOUTH_HOUSTON': 'LZSouthHouston', 'LZ_WEST': 'LZWest', 'LZ_NORTH': 'LZNorth', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=({'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE': 'genSystemWide', 'SOUTH_HOUSTON': 'LZSouthHouston', 'WEST_NORTH': 'LZWestNorth', 'DSTFlag': 'DSTFlag'},))
+
def wpp_actual_5min_avg_values(self, *, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, LZSouthHoustonFrom: Decimal | None = None, LZSouthHoustonTo: Decimal | None = None, LZWestFrom: Decimal | None = None, LZWestTo: Decimal | None = None, LZNorthFrom: Decimal | None = None, LZNorthTo: Decimal | None = None, DSTFlag: bool | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_733_cd.WppActual5minAvgValuesRow]:
'Wind Power Production - Actual 5-Minute Averaged Values'
return self._client._page('/np4-733-cd/wpp_actual_5min_avg_values', np4_733_cd.WppActual5minAvgValuesRow, {'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'LZSouthHoustonFrom': LZSouthHoustonFrom, 'LZSouthHoustonTo': LZSouthHoustonTo, 'LZWestFrom': LZWestFrom, 'LZWestTo': LZWestTo, 'LZNorthFrom': LZNorthFrom, 'LZNorthTo': LZNorthTo, 'DSTFlag': DSTFlag, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6170,6 +10035,23 @@ class SppHrlyAvrgActlFcastRow(Row):
hourEnding: int | None
postedDatetime: datetime | None
+ class SppHrlyAvrgActlFcastHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None = None
+ hourEnding: int | None = None
+ genSystemWide: Decimal | None
+ COPHSLSystemWide: Decimal | None
+ STPPFSystemWide: Decimal | None
+ PVGRPPSystemWide: Decimal | None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+ hourEndingTimestamp: datetime | None = None
+
+ @property
+ def spp_hrly_avrg_actl_fcast_history(self) -> Archive[np4_737_cd.SppHrlyAvrgActlFcastHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-737-cd', np4_737_cd.SppHrlyAvrgActlFcastHistoryRow, {'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STPPF_SYSTEM_WIDE': 'STPPFSystemWide', 'PVGRPP_SYSTEM_WIDE': 'PVGRPPSystemWide', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'hourEndingTimestamp': '%m/%d/%Y %H:%M'}, variants=({'HOUR_ENDING': 'hourEndingTimestamp', 'ACTUAL_SYSTEM_WIDE': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STPPF_SYSTEM_WIDE': 'STPPFSystemWide', 'PVGRPP_SYSTEM_WIDE': 'PVGRPPSystemWide', 'DSTFlag': 'DSTFlag'}, {'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'ACTUAL_SYSTEM_WIDE': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STPPF_SYSTEM_WIDE': 'STPPFSystemWide', 'PVGRPP_SYSTEM_WIDE': 'PVGRPPSystemWide', 'DSTFlag': 'DSTFlag'}))
+
def spp_hrly_avrg_actl_fcast(self, *, STPPFSystemWideFrom: Decimal | None = None, STPPFSystemWideTo: Decimal | None = None, PVGRPPSystemWideFrom: Decimal | None = None, PVGRPPSystemWideTo: Decimal | None = None, DSTFlag: bool | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, COPHSLSystemWideFrom: Decimal | None = None, COPHSLSystemWideTo: Decimal | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_737_cd.SppHrlyAvrgActlFcastRow]:
'Solar Power Production - Hourly Averaged Actual and Forecasted Values'
return self._client._page('/np4-737-cd/spp_hrly_avrg_actl_fcast', np4_737_cd.SppHrlyAvrgActlFcastRow, {'STPPFSystemWideFrom': STPPFSystemWideFrom, 'STPPFSystemWideTo': STPPFSystemWideTo, 'PVGRPPSystemWideFrom': PVGRPPSystemWideFrom, 'PVGRPPSystemWideTo': PVGRPPSystemWideTo, 'DSTFlag': DSTFlag, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'COPHSLSystemWideFrom': COPHSLSystemWideFrom, 'COPHSLSystemWideTo': COPHSLSystemWideTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6197,6 +10079,18 @@ class SppActual5minAvgValuesRow(Row):
intervalEnding: datetime | None
postedDatetime: datetime | None
+ class SppActual5minAvgValuesHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ intervalEnding: datetime | None
+ genSystemWide: Decimal | None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+
+ @property
+ def spp_actual_5min_avg_values_history(self) -> Archive[np4_738_cd.SppActual5minAvgValuesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-738-cd', np4_738_cd.SppActual5minAvgValuesHistoryRow, {'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=({'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE': 'genSystemWide', 'DSTFlag': 'DSTFlag'},))
+
def spp_actual_5min_avg_values(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, DSTFlag: bool | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_738_cd.SppActual5minAvgValuesRow]:
'Solar Power Production - Actual 5-Minute Averaged Values'
return self._client._page('/np4-738-cd/spp_actual_5min_avg_values', np4_738_cd.SppActual5minAvgValuesRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'DSTFlag': DSTFlag, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6248,6 +10142,42 @@ class WppHrlyActualFcastGeoRow(Row):
hourEnding: int | None
postedDatetime: datetime | None
+ class WppHrlyActualFcastGeoHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: int | None
+ genSystemWide: Decimal | None
+ COPHSLSystemWide: Decimal | None
+ STWPFSystemWide: Decimal | None
+ WGRPPSystemWide: Decimal | None
+ genPanhandle: Decimal | None
+ COPHSLPanhandle: Decimal | None
+ STWPFPanhandle: Decimal | None
+ WGRPPPanhandle: Decimal | None
+ genCoastal: Decimal | None
+ COPHSLCoastal: Decimal | None
+ STWPFCoastal: Decimal | None
+ WGRPPCoastal: Decimal | None
+ genSouth: Decimal | None
+ COPHSLSouth: Decimal | None
+ STWPFSouth: Decimal | None
+ WGRPPSouth: Decimal | None
+ genWest: Decimal | None
+ COPHSLWest: Decimal | None
+ STWPFWest: Decimal | None
+ WGRPPWest: Decimal | None
+ genNorth: Decimal | None
+ COPHSLNorth: Decimal | None
+ STWPFNorth: Decimal | None
+ WGRPPNorth: Decimal | None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+
+ @property
+ def wpp_hrly_actual_fcast_geo_history(self) -> Archive[np4_742_cd.WppHrlyActualFcastGeoHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-742-cd', np4_742_cd.WppHrlyActualFcastGeoHistoryRow, {'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STWPF_SYSTEM_WIDE': 'STWPFSystemWide', 'WGRPP_SYSTEM_WIDE': 'WGRPPSystemWide', 'GEN_PANHANDLE': 'genPanhandle', 'COP_HSL_PANHANDLE': 'COPHSLPanhandle', 'STWPF_PANHANDLE': 'STWPFPanhandle', 'WGRPP_PANHANDLE': 'WGRPPPanhandle', 'GEN_COASTAL': 'genCoastal', 'COP_HSL_COASTAL': 'COPHSLCoastal', 'STWPF_COASTAL': 'STWPFCoastal', 'WGRPP_COASTAL': 'WGRPPCoastal', 'GEN_SOUTH': 'genSouth', 'COP_HSL_SOUTH': 'COPHSLSouth', 'STWPF_SOUTH': 'STWPFSouth', 'WGRPP_SOUTH': 'WGRPPSouth', 'GEN_WEST': 'genWest', 'COP_HSL_WEST': 'COPHSLWest', 'STWPF_WEST': 'STWPFWest', 'WGRPP_WEST': 'WGRPPWest', 'GEN_NORTH': 'genNorth', 'COP_HSL_NORTH': 'COPHSLNorth', 'STWPF_NORTH': 'STWPFNorth', 'WGRPP_NORTH': 'WGRPPNorth', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=({'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'ACTUAL_SYSTEM_WIDE': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STWPF_SYSTEM_WIDE': 'STWPFSystemWide', 'WGRPP_SYSTEM_WIDE': 'WGRPPSystemWide', 'ACTUAL_PANHANDLE': 'genPanhandle', 'COP_HSL_PANHANDLE': 'COPHSLPanhandle', 'STWPF_PANHANDLE': 'STWPFPanhandle', 'WGRPP_PANHANDLE': 'WGRPPPanhandle', 'ACTUAL_COASTAL': 'genCoastal', 'COP_HSL_COASTAL': 'COPHSLCoastal', 'STWPF_COASTAL': 'STWPFCoastal', 'WGRPP_COASTAL': 'WGRPPCoastal', 'ACTUAL_SOUTH': 'genSouth', 'COP_HSL_SOUTH': 'COPHSLSouth', 'STWPF_SOUTH': 'STWPFSouth', 'WGRPP_SOUTH': 'WGRPPSouth', 'ACTUAL_WEST': 'genWest', 'COP_HSL_WEST': 'COPHSLWest', 'STWPF_WEST': 'STWPFWest', 'WGRPP_WEST': 'WGRPPWest', 'ACTUAL_NORTH': 'genNorth', 'COP_HSL_NORTH': 'COPHSLNorth', 'STWPF_NORTH': 'STWPFNorth', 'WGRPP_NORTH': 'WGRPPNorth', 'DSTFlag': 'DSTFlag'},))
+
def wpp_hrly_actual_fcast_geo(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, COPHSLSystemWideFrom: Decimal | None = None, COPHSLSystemWideTo: Decimal | None = None, STWPFSystemWideFrom: Decimal | None = None, STWPFSystemWideTo: Decimal | None = None, WGRPPSystemWideFrom: Decimal | None = None, WGRPPSystemWideTo: Decimal | None = None, genPanhandleFrom: Decimal | None = None, genPanhandleTo: Decimal | None = None, COPHSLPanhandleFrom: Decimal | None = None, COPHSLPanhandleTo: Decimal | None = None, STWPFPanhandleFrom: Decimal | None = None, STWPFPanhandleTo: Decimal | None = None, WGRPPPanhandleFrom: Decimal | None = None, WGRPPPanhandleTo: Decimal | None = None, genCoastalFrom: Decimal | None = None, genCoastalTo: Decimal | None = None, COPHSLCoastalFrom: Decimal | None = None, COPHSLCoastalTo: Decimal | None = None, STWPFCoastalFrom: Decimal | None = None, STWPFCoastalTo: Decimal | None = None, WGRPPCoastalFrom: Decimal | None = None, WGRPPCoastalTo: Decimal | None = None, genSouthFrom: Decimal | None = None, genSouthTo: Decimal | None = None, COPHSLSouthFrom: Decimal | None = None, COPHSLSouthTo: Decimal | None = None, STWPFSouthFrom: Decimal | None = None, STWPFSouthTo: Decimal | None = None, WGRPPSouthFrom: Decimal | None = None, WGRPPSouthTo: Decimal | None = None, genWestFrom: Decimal | None = None, genWestTo: Decimal | None = None, COPHSLWestFrom: Decimal | None = None, COPHSLWestTo: Decimal | None = None, STWPFWestFrom: Decimal | None = None, STWPFWestTo: Decimal | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, WGRPPWestFrom: Decimal | None = None, WGRPPWestTo: Decimal | None = None, genNorthFrom: Decimal | None = None, genNorthTo: Decimal | None = None, COPHSLNorthFrom: Decimal | None = None, COPHSLNorthTo: Decimal | None = None, STWPFNorthFrom: Decimal | None = None, STWPFNorthTo: Decimal | None = None, WGRPPNorthFrom: Decimal | None = None, WGRPPNorthTo: Decimal | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_742_cd.WppHrlyActualFcastGeoRow]:
'Wind Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region'
return self._client._page('/np4-742-cd/wpp_hrly_actual_fcast_geo', np4_742_cd.WppHrlyActualFcastGeoRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'COPHSLSystemWideFrom': COPHSLSystemWideFrom, 'COPHSLSystemWideTo': COPHSLSystemWideTo, 'STWPFSystemWideFrom': STWPFSystemWideFrom, 'STWPFSystemWideTo': STWPFSystemWideTo, 'WGRPPSystemWideFrom': WGRPPSystemWideFrom, 'WGRPPSystemWideTo': WGRPPSystemWideTo, 'genPanhandleFrom': genPanhandleFrom, 'genPanhandleTo': genPanhandleTo, 'COPHSLPanhandleFrom': COPHSLPanhandleFrom, 'COPHSLPanhandleTo': COPHSLPanhandleTo, 'STWPFPanhandleFrom': STWPFPanhandleFrom, 'STWPFPanhandleTo': STWPFPanhandleTo, 'WGRPPPanhandleFrom': WGRPPPanhandleFrom, 'WGRPPPanhandleTo': WGRPPPanhandleTo, 'genCoastalFrom': genCoastalFrom, 'genCoastalTo': genCoastalTo, 'COPHSLCoastalFrom': COPHSLCoastalFrom, 'COPHSLCoastalTo': COPHSLCoastalTo, 'STWPFCoastalFrom': STWPFCoastalFrom, 'STWPFCoastalTo': STWPFCoastalTo, 'WGRPPCoastalFrom': WGRPPCoastalFrom, 'WGRPPCoastalTo': WGRPPCoastalTo, 'genSouthFrom': genSouthFrom, 'genSouthTo': genSouthTo, 'COPHSLSouthFrom': COPHSLSouthFrom, 'COPHSLSouthTo': COPHSLSouthTo, 'STWPFSouthFrom': STWPFSouthFrom, 'STWPFSouthTo': STWPFSouthTo, 'WGRPPSouthFrom': WGRPPSouthFrom, 'WGRPPSouthTo': WGRPPSouthTo, 'genWestFrom': genWestFrom, 'genWestTo': genWestTo, 'COPHSLWestFrom': COPHSLWestFrom, 'COPHSLWestTo': COPHSLWestTo, 'STWPFWestFrom': STWPFWestFrom, 'STWPFWestTo': STWPFWestTo, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'WGRPPWestFrom': WGRPPWestFrom, 'WGRPPWestTo': WGRPPWestTo, 'genNorthFrom': genNorthFrom, 'genNorthTo': genNorthTo, 'COPHSLNorthFrom': COPHSLNorthFrom, 'COPHSLNorthTo': COPHSLNorthTo, 'STWPFNorthFrom': STWPFNorthFrom, 'STWPFNorthTo': STWPFNorthTo, 'WGRPPNorthFrom': WGRPPNorthFrom, 'WGRPPNorthTo': WGRPPNorthTo, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6280,6 +10210,23 @@ class WppActual5minAvgValuesGeoRow(Row):
south: Decimal | None
west: Decimal | None
+ class WppActual5minAvgValuesGeoHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ intervalEnding: datetime | None
+ genSystemWide: Decimal | None
+ panhandle: Decimal | None
+ coastal: Decimal | None
+ south: Decimal | None
+ west: Decimal | None
+ north: Decimal | None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+
+ @property
+ def wpp_actual_5min_avg_values_geo_history(self) -> Archive[np4_743_cd.WppActual5minAvgValuesGeoHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-743-cd', np4_743_cd.WppActual5minAvgValuesGeoHistoryRow, {'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'PANHANDLE': 'panhandle', 'COASTAL': 'coastal', 'SOUTH': 'south', 'WEST': 'west', 'NORTH': 'north', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=({'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE': 'genSystemWide', 'PANHANDLE': 'panhandle', 'COASTAL': 'coastal', 'SOUTH': 'south', 'WEST': 'west', 'NORTH': 'north', 'DSTFlag': 'DSTFlag'},))
+
def wpp_actual_5min_avg_values_geo(self, *, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, panhandleFrom: Decimal | None = None, panhandleTo: Decimal | None = None, coastalFrom: Decimal | None = None, coastalTo: Decimal | None = None, southFrom: Decimal | None = None, southTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_743_cd.WppActual5minAvgValuesGeoRow]:
'Wind Power Production - Actual 5-Minute Averaged Values by Geographical Region'
return self._client._page('/np4-743-cd/wpp_actual_5min_avg_values_geo', np4_743_cd.WppActual5minAvgValuesGeoRow, {'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'panhandleFrom': panhandleFrom, 'panhandleTo': panhandleTo, 'coastalFrom': coastalFrom, 'coastalTo': coastalTo, 'southFrom': southFrom, 'southTo': southTo, 'westFrom': westFrom, 'westTo': westTo, 'northFrom': northFrom, 'northTo': northTo, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6335,6 +10282,46 @@ class SppHrlyActualFcastGeoRow(Row):
hourEnding: int | None
postedDatetime: datetime | None
+ class SppHrlyActualFcastGeoHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: int | None
+ genSystemWide: Decimal | None
+ COPHSLSystemWide: Decimal | None
+ STPPFSystemWide: Decimal | None
+ PVGRPPSystemWide: Decimal | None
+ genCenterWest: Decimal | None
+ COPHSLCenterWest: Decimal | None
+ STPPFCenterWest: Decimal | None
+ PVGRPPCenterWest: Decimal | None
+ genNorthWest: Decimal | None
+ COPHSLNorthWest: Decimal | None
+ STPPFNorthWest: Decimal | None
+ PVGRPPNorthWest: Decimal | None
+ genFarWest: Decimal | None
+ COPHSLFarWest: Decimal | None
+ STPPFFarWest: Decimal | None
+ PVGRPPFarWest: Decimal | None
+ genFarEast: Decimal | None
+ COPHSLFarEast: Decimal | None
+ STPPFFarEast: Decimal | None
+ PVGRPPFarEast: Decimal | None
+ genSouthEast: Decimal | None
+ COPHSLSouthEast: Decimal | None
+ STPPFSouthEast: Decimal | None
+ PVGRPPSouthEast: Decimal | None
+ genCenterEast: Decimal | None
+ COPHSLCenterEast: Decimal | None
+ STPPFCenterEast: Decimal | None
+ PVGRPPCenterEast: Decimal | None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+
+ @property
+ def spp_hrly_actual_fcast_geo_history(self) -> Archive[np4_745_cd.SppHrlyActualFcastGeoHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-745-cd', np4_745_cd.SppHrlyActualFcastGeoHistoryRow, {'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STPPF_SYSTEM_WIDE': 'STPPFSystemWide', 'PVGRPP_SYSTEM_WIDE': 'PVGRPPSystemWide', 'GEN_CenterWest': 'genCenterWest', 'COP_HSL_CenterWest': 'COPHSLCenterWest', 'STPPF_CenterWest': 'STPPFCenterWest', 'PVGRPP_CenterWest': 'PVGRPPCenterWest', 'GEN_NorthWest': 'genNorthWest', 'COP_HSL_NorthWest': 'COPHSLNorthWest', 'STPPF_NorthWest': 'STPPFNorthWest', 'PVGRPP_NorthWest': 'PVGRPPNorthWest', 'GEN_FarWest': 'genFarWest', 'COP_HSL_FarWest': 'COPHSLFarWest', 'STPPF_FarWest': 'STPPFFarWest', 'PVGRPP_FarWest': 'PVGRPPFarWest', 'GEN_FarEast': 'genFarEast', 'COP_HSL_FarEast': 'COPHSLFarEast', 'STPPF_FarEast': 'STPPFFarEast', 'PVGRPP_FarEast': 'PVGRPPFarEast', 'GEN_SouthEast': 'genSouthEast', 'COP_HSL_SouthEast': 'COPHSLSouthEast', 'STPPF_SouthEast': 'STPPFSouthEast', 'PVGRPP_SouthEast': 'PVGRPPSouthEast', 'GEN_CenterEast': 'genCenterEast', 'COP_HSL_CenterEast': 'COPHSLCenterEast', 'STPPF_CenterEast': 'STPPFCenterEast', 'PVGRPP_CenterEast': 'PVGRPPCenterEast', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M'}, variants=({'DELIVERY_DATE': 'deliveryDate', 'HOUR_ENDING': 'hourEnding', 'GEN_SYSTEM_WIDE': 'genSystemWide', 'COP_HSL_SYSTEM_WIDE': 'COPHSLSystemWide', 'STPPF_SYSTEM_WIDE': 'STPPFSystemWide', 'PVGRPP_SYSTEM_WIDE': 'PVGRPPSystemWide', 'GEN_CenterWest': 'genCenterWest', 'COP_HSL_CenterWest': 'COPHSLCenterWest', 'STPPF_CenterWest': 'STPPFCenterWest', 'PVGRPP_CenterWest': 'PVGRPPCenterWest', 'GEN_NorthWest': 'genNorthWest', 'COP_HSL_NorthWest': 'COPHSLNorthWest', 'STPPF_NorthWest': 'STPPFNorthWest', 'PVGRPP_NorthWest': 'PVGRPPNorthWest', 'GEN_FarWest': 'genFarWest', 'COP_HSL_FarWest': 'COPHSLFarWest', 'STPPF_FarWest': 'STPPFFarWest', 'PVGRPP_FarWest': 'PVGRPPFarWest', 'GEN_FarEast': 'genFarEast', 'COP_HSL_FarEast': 'COPHSLFarEast', 'STPPF_FarEast': 'STPPFFarEast', 'PVGRPP_FarEast': 'PVGRPPFarEast', 'GEN_SouthEast': 'genSouthEast', 'COP_HSL_SouthEast': 'COPHSLSouthEast', 'STPPF_SouthEast': 'STPPFSouthEast', 'PVGRPP_SouthEast': 'PVGRPPSouthEast', 'GEN_CenterEast': 'genCenterEast', 'COP_HSL_CenterEast': 'COPHSLCenterEast', 'STPPF_CenterEast': 'STPPFCenterEast', 'PVGRPP_CenterEast': 'PVGRPPCenterEast', 'DSTFlag': 'DSTFlag'},))
+
def spp_hrly_actual_fcast_geo(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, hourEndingFrom: int | None = None, hourEndingTo: int | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, COPHSLSystemWideFrom: Decimal | None = None, COPHSLSystemWideTo: Decimal | None = None, STPPFSystemWideFrom: Decimal | None = None, STPPFSystemWideTo: Decimal | None = None, PVGRPPSystemWideFrom: Decimal | None = None, PVGRPPSystemWideTo: Decimal | None = None, genCenterWestFrom: Decimal | None = None, genCenterWestTo: Decimal | None = None, COPHSLCenterWestFrom: Decimal | None = None, COPHSLCenterWestTo: Decimal | None = None, STPPFCenterWestFrom: Decimal | None = None, STPPFCenterWestTo: Decimal | None = None, PVGRPPCenterWestFrom: Decimal | None = None, PVGRPPCenterWestTo: Decimal | None = None, genNorthWestFrom: Decimal | None = None, genNorthWestTo: Decimal | None = None, COPHSLNorthWestFrom: Decimal | None = None, COPHSLNorthWestTo: Decimal | None = None, STPPFNorthWestFrom: Decimal | None = None, STPPFNorthWestTo: Decimal | None = None, PVGRPPNorthWestFrom: Decimal | None = None, PVGRPPNorthWestTo: Decimal | None = None, genFarWestFrom: Decimal | None = None, genFarWestTo: Decimal | None = None, COPHSLFarWestFrom: Decimal | None = None, COPHSLFarWestTo: Decimal | None = None, STPPFFarWestFrom: Decimal | None = None, STPPFFarWestTo: Decimal | None = None, PVGRPPFarWestFrom: Decimal | None = None, PVGRPPFarWestTo: Decimal | None = None, genFarEastFrom: Decimal | None = None, genFarEastTo: Decimal | None = None, COPHSLFarEastFrom: Decimal | None = None, COPHSLFarEastTo: Decimal | None = None, STPPFFarEastFrom: Decimal | None = None, STPPFFarEastTo: Decimal | None = None, PVGRPPFarEastFrom: Decimal | None = None, PVGRPPFarEastTo: Decimal | None = None, genSouthEastFrom: Decimal | None = None, genSouthEastTo: Decimal | None = None, COPHSLSouthEastFrom: Decimal | None = None, COPHSLSouthEastTo: Decimal | None = None, STPPFSouthEastFrom: Decimal | None = None, STPPFSouthEastTo: Decimal | None = None, PVGRPPSouthEastFrom: Decimal | None = None, PVGRPPSouthEastTo: Decimal | None = None, genCenterEastFrom: Decimal | None = None, genCenterEastTo: Decimal | None = None, COPHSLCenterEastFrom: Decimal | None = None, COPHSLCenterEastTo: Decimal | None = None, STPPFCenterEastFrom: Decimal | None = None, STPPFCenterEastTo: Decimal | None = None, PVGRPPCenterEastFrom: Decimal | None = None, PVGRPPCenterEastTo: Decimal | None = None, DSTFlag: bool | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_745_cd.SppHrlyActualFcastGeoRow]:
'Solar Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region'
return self._client._page('/np4-745-cd/spp_hrly_actual_fcast_geo', np4_745_cd.SppHrlyActualFcastGeoRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'hourEndingFrom': hourEndingFrom, 'hourEndingTo': hourEndingTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'COPHSLSystemWideFrom': COPHSLSystemWideFrom, 'COPHSLSystemWideTo': COPHSLSystemWideTo, 'STPPFSystemWideFrom': STPPFSystemWideFrom, 'STPPFSystemWideTo': STPPFSystemWideTo, 'PVGRPPSystemWideFrom': PVGRPPSystemWideFrom, 'PVGRPPSystemWideTo': PVGRPPSystemWideTo, 'genCenterWestFrom': genCenterWestFrom, 'genCenterWestTo': genCenterWestTo, 'COPHSLCenterWestFrom': COPHSLCenterWestFrom, 'COPHSLCenterWestTo': COPHSLCenterWestTo, 'STPPFCenterWestFrom': STPPFCenterWestFrom, 'STPPFCenterWestTo': STPPFCenterWestTo, 'PVGRPPCenterWestFrom': PVGRPPCenterWestFrom, 'PVGRPPCenterWestTo': PVGRPPCenterWestTo, 'genNorthWestFrom': genNorthWestFrom, 'genNorthWestTo': genNorthWestTo, 'COPHSLNorthWestFrom': COPHSLNorthWestFrom, 'COPHSLNorthWestTo': COPHSLNorthWestTo, 'STPPFNorthWestFrom': STPPFNorthWestFrom, 'STPPFNorthWestTo': STPPFNorthWestTo, 'PVGRPPNorthWestFrom': PVGRPPNorthWestFrom, 'PVGRPPNorthWestTo': PVGRPPNorthWestTo, 'genFarWestFrom': genFarWestFrom, 'genFarWestTo': genFarWestTo, 'COPHSLFarWestFrom': COPHSLFarWestFrom, 'COPHSLFarWestTo': COPHSLFarWestTo, 'STPPFFarWestFrom': STPPFFarWestFrom, 'STPPFFarWestTo': STPPFFarWestTo, 'PVGRPPFarWestFrom': PVGRPPFarWestFrom, 'PVGRPPFarWestTo': PVGRPPFarWestTo, 'genFarEastFrom': genFarEastFrom, 'genFarEastTo': genFarEastTo, 'COPHSLFarEastFrom': COPHSLFarEastFrom, 'COPHSLFarEastTo': COPHSLFarEastTo, 'STPPFFarEastFrom': STPPFFarEastFrom, 'STPPFFarEastTo': STPPFFarEastTo, 'PVGRPPFarEastFrom': PVGRPPFarEastFrom, 'PVGRPPFarEastTo': PVGRPPFarEastTo, 'genSouthEastFrom': genSouthEastFrom, 'genSouthEastTo': genSouthEastTo, 'COPHSLSouthEastFrom': COPHSLSouthEastFrom, 'COPHSLSouthEastTo': COPHSLSouthEastTo, 'STPPFSouthEastFrom': STPPFSouthEastFrom, 'STPPFSouthEastTo': STPPFSouthEastTo, 'PVGRPPSouthEastFrom': PVGRPPSouthEastFrom, 'PVGRPPSouthEastTo': PVGRPPSouthEastTo, 'genCenterEastFrom': genCenterEastFrom, 'genCenterEastTo': genCenterEastTo, 'COPHSLCenterEastFrom': COPHSLCenterEastFrom, 'COPHSLCenterEastTo': COPHSLCenterEastTo, 'STPPFCenterEastFrom': STPPFCenterEastFrom, 'STPPFCenterEastTo': STPPFCenterEastTo, 'PVGRPPCenterEastFrom': PVGRPPCenterEastFrom, 'PVGRPPCenterEastTo': PVGRPPCenterEastTo, 'DSTFlag': DSTFlag, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6368,6 +10355,24 @@ class SppActual5minAvgValuesGeoRow(Row):
intervalEnding: datetime | None
postedDatetime: datetime | None
+ class SppActual5minAvgValuesGeoHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ intervalEnding: datetime | None
+ genSystemWide: Decimal | None
+ genCenterWest: Decimal | None
+ genNorthWest: Decimal | None
+ genFarWest: Decimal | None
+ genFarEast: Decimal | None
+ genSouthEast: Decimal | None
+ genCenterEast: Decimal | None
+ HSLSystemWide: Decimal | None = None
+ DSTFlag: bool | None
+
+ @property
+ def spp_actual_5min_avg_values_geo_history(self) -> Archive[np4_746_cd.SppActual5minAvgValuesGeoHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-746-cd', np4_746_cd.SppActual5minAvgValuesGeoHistoryRow, {'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'CenterWest_GEN': 'genCenterWest', 'NorthWest_GEN': 'genNorthWest', 'FarWest_GEN': 'genFarWest', 'FarEast_GEN': 'genFarEast', 'SouthEast_GEN': 'genSouthEast', 'CenterEast_GEN': 'genCenterEast', 'SYSTEM_WIDE_HSL': 'HSLSystemWide', 'DSTFlag': 'DSTFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %I:%M:%S %p'}, variants=({'INTERVAL_ENDING': 'intervalEnding', 'SYSTEM_WIDE_GEN': 'genSystemWide', 'CenterWest_GEN': 'genCenterWest', 'NorthWest_GEN': 'genNorthWest', 'FarWest_GEN': 'genFarWest', 'FarEast_GEN': 'genFarEast', 'SouthEast_GEN': 'genSouthEast', 'CenterEast_GEN': 'genCenterEast', 'DSTFlag': 'DSTFlag'},))
+
def spp_actual_5min_avg_values_geo(self, *, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, genSystemWideFrom: Decimal | None = None, genSystemWideTo: Decimal | None = None, genCenterWestFrom: Decimal | None = None, genCenterWestTo: Decimal | None = None, genNorthWestFrom: Decimal | None = None, genNorthWestTo: Decimal | None = None, genFarWestFrom: Decimal | None = None, genFarWestTo: Decimal | None = None, genFarEastFrom: Decimal | None = None, genFarEastTo: Decimal | None = None, genSouthEastFrom: Decimal | None = None, genSouthEastTo: Decimal | None = None, genCenterEastFrom: Decimal | None = None, genCenterEastTo: Decimal | None = None, DSTFlag: bool | None = None, HSLSystemWideFrom: Decimal | None = None, HSLSystemWideTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_746_cd.SppActual5minAvgValuesGeoRow]:
'Solar Power Production - Actual 5-Minute Averaged Values by Geographical Region'
return self._client._page('/np4-746-cd/spp_actual_5min_avg_values_geo', np4_746_cd.SppActual5minAvgValuesGeoRow, {'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'genSystemWideFrom': genSystemWideFrom, 'genSystemWideTo': genSystemWideTo, 'genCenterWestFrom': genCenterWestFrom, 'genCenterWestTo': genCenterWestTo, 'genNorthWestFrom': genNorthWestFrom, 'genNorthWestTo': genNorthWestTo, 'genFarWestFrom': genFarWestFrom, 'genFarWestTo': genFarWestTo, 'genFarEastFrom': genFarEastFrom, 'genFarEastTo': genFarEastTo, 'genSouthEastFrom': genSouthEastFrom, 'genSouthEastTo': genSouthEastTo, 'genCenterEastFrom': genCenterEastFrom, 'genCenterEastTo': genCenterEastTo, 'DSTFlag': DSTFlag, 'HSLSystemWideFrom': HSLSystemWideFrom, 'HSLSystemWideTo': HSLSystemWideTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6397,6 +10402,20 @@ class IhWindFcastGeoRow(Row):
region: str | None
value: Decimal | None
+ class IhWindFcastGeoHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ intervalEnding: datetime | None
+ region: str | None
+ value: Decimal | None
+ model: str | None
+ inUseFlag: bool | None
+ DSTFlag: bool | None
+
+ @property
+ def ih_wind_fcast_geo_history(self) -> Archive[np4_751_cd.IhWindFcastGeoHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-751-cd', np4_751_cd.IhWindFcastGeoHistoryRow, {'IntervalEnding': 'intervalEnding', 'Region': 'region', 'Value': 'value', 'Model': 'model', 'InUseFlag': 'inUseFlag', 'DSTFlag': 'DSTFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=())
+
def ih_wind_fcast_geo(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, region: str | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_751_cd.IhWindFcastGeoRow]:
'Intra-Hour Wind Power Forecast By Geographical Region'
return self._client._page('/np4-751-cd/ih_wind_fcast_geo', np4_751_cd.IhWindFcastGeoRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'region': region, 'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6426,6 +10445,20 @@ class IhSolarFcastGeoRow(Row):
region: str | None
value: Decimal | None
+ class IhSolarFcastGeoHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ intervalEnding: datetime | None
+ region: str | None
+ value: Decimal | None
+ model: str | None
+ inUseFlag: bool | None
+ DSTFlag: bool | None
+
+ @property
+ def ih_solar_fcast_geo_history(self) -> Archive[np4_752_cd.IhSolarFcastGeoHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-752-cd', np4_752_cd.IhSolarFcastGeoHistoryRow, {'IntervalEnding': 'intervalEnding', 'Region': 'region', 'Value': 'value', 'Model': 'model', 'InUseFlag': 'inUseFlag', 'DSTFlag': 'DSTFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=())
+
def ih_solar_fcast_geo(self, *, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, region: str | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_752_cd.IhSolarFcastGeoRow]:
'Intra-Hour Solar Power Forecast by Geographical Region'
return self._client._page('/np4-752-cd/ih_solar_fcast_geo', np4_752_cd.IhSolarFcastGeoRow, {'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'region': region, 'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6438,9 +10471,95 @@ async def ih_solar_fcast_geo_async(self, *, intervalEndingFrom: datetime | None
'Intra-Hour Solar Power Forecast by Geographical Region'
return await self._client._apage('/np4-752-cd/ih_solar_fcast_geo', np4_752_cd.IhSolarFcastGeoRow, {'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'region': region, 'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
- def ih_solar_fcast_geo_iter_async(self, *, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, region: str | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np4_752_cd.IhSolarFcastGeoRow]:
- 'Intra-Hour Solar Power Forecast by Geographical Region'
- return self._client._aiter('/np4-752-cd/ih_solar_fcast_geo', np4_752_cd.IhSolarFcastGeoRow, {'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'region': region, 'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'size': size, 'sort': sort, 'dir': dir})
+ def ih_solar_fcast_geo_iter_async(self, *, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, region: str | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, model: str | None = None, inUseFlag: bool | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[np4_752_cd.IhSolarFcastGeoRow]:
+ 'Intra-Hour Solar Power Forecast by Geographical Region'
+ return self._client._aiter('/np4-752-cd/ih_solar_fcast_geo', np4_752_cd.IhSolarFcastGeoRow, {'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'region': region, 'valueFrom': valueFrom, 'valueTo': valueTo, 'model': model, 'inUseFlag': inUseFlag, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'size': size, 'sort': sort, 'dir': dir})
+
+class np4_765_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class DailyValuesHistoryRow(Row):
+ reportDate: date | None
+ installedDischargeCapacityMW: Decimal | None
+ totalDischargeCapacityMW: Decimal | None
+ installedChargeCapacityMW: Decimal | None
+ totalChargeCapacityMW: Decimal | None
+ peakLoadMW: Decimal | None
+ peakLoadHourEnding: int | None
+ dischargeAtPeakLoadMW: Decimal | None
+ chargeAtPeakLoadMW: Decimal | None
+ netOutputAtPeakLoadMW: Decimal | None
+ maxDischargeMW: Decimal | None
+ maxDischargeTime: time | None
+ penetrationAtMaxDischargePercent: Decimal | None
+ maxChargeMW: Decimal | None
+ maxChargeTime: time | None
+ penetrationAtMaxChargePercent: Decimal | None
+ maxDischargePenetrationPercent: Decimal | None
+ maxDischargePenetrationTime: time | None
+ dischargeAtMaxPenetrationMW: Decimal | None
+ maxChargePenetrationPercent: Decimal | None
+ maxChargePenetrationTime: time | None
+ chargeAtMaxPenetrationMW: Decimal | None
+ sourceNotes: str | None
+
+ @property
+ def daily_values_history(self) -> PdfArchive[np4_765_er.DailyValuesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return PdfArchive(self._client, 'np4-765-er', np4_765_er.DailyValuesHistoryRow, {'reportDate': 'reportDate', 'installedDischargeCapacityMW': 'installedDischargeCapacityMW', 'totalDischargeCapacityMW': 'totalDischargeCapacityMW', 'installedChargeCapacityMW': 'installedChargeCapacityMW', 'totalChargeCapacityMW': 'totalChargeCapacityMW', 'peakLoadMW': 'peakLoadMW', 'peakLoadHourEnding': 'peakLoadHourEnding', 'dischargeAtPeakLoadMW': 'dischargeAtPeakLoadMW', 'chargeAtPeakLoadMW': 'chargeAtPeakLoadMW', 'netOutputAtPeakLoadMW': 'netOutputAtPeakLoadMW', 'maxDischargeMW': 'maxDischargeMW', 'maxDischargeTime': 'maxDischargeTime', 'penetrationAtMaxDischargePercent': 'penetrationAtMaxDischargePercent', 'maxChargeMW': 'maxChargeMW', 'maxChargeTime': 'maxChargeTime', 'penetrationAtMaxChargePercent': 'penetrationAtMaxChargePercent', 'maxDischargePenetrationPercent': 'maxDischargePenetrationPercent', 'maxDischargePenetrationTime': 'maxDischargePenetrationTime', 'dischargeAtMaxPenetrationMW': 'dischargeAtMaxPenetrationMW', 'maxChargePenetrationPercent': 'maxChargePenetrationPercent', 'maxChargePenetrationTime': 'maxChargePenetrationTime', 'chargeAtMaxPenetrationMW': 'chargeAtMaxPenetrationMW', 'sourceNotes': 'sourceNotes'}, {}, start='Current\\s*Daily\\s*Values:', end='All\\s*Time\\s*Record\\s*Values:|\\*\\s*Sum', pattern='Installed\\s*ESR\\s*Discharge\\s*Capacity\\*\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Total\\s*ESR\\s*Discharge\\s*Capacity\\*\\*\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Installed\\s*ESR\\s*Charge\\s*Capacity\\+\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Total\\s*ESR\\s*Charge\\s*Capacity\\+\\+\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Peak\\s*Load\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Peak\\s*Load\\s*Hour\\s*\\(HE\\)\\s*(?P\\d+)\\s*\\s*ESR\\s*Discharge\\s*at\\s*Peak\\s*Load\\s*Hour\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*ESR\\s*Charge\\s*at\\s*Peak\\s*Load\\s*Hour\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*ESR\\s*Net\\s*Charge/Discharge\\s*at\\s*Peak\\s*Load\\s*Hour\\^\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Discharge\\s*Generation\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Discharge\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*Penetration\\s*at\\s*Max\\s*ESR\\s*Discharge\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Charge\\s*Load\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Charge\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*Penetration\\s*at\\s*Max\\s*ESR\\s*Charge\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Discharge\\s*Penetration\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Discharge\\s*Penetration\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*ESR\\s*Discharge\\s*Generation\\s*at\\s*Max\\s*ESR\\s*Discharge\\s*Penetration\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Charge\\s*Penetration\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Charge\\s*Penetration\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*ESR\\s*Charge\\s*Load\\s*at\\s*Max\\s*ESR\\s*Charge\\s*Penetration\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW', records=False, notes=True, numbers=('installedDischargeCapacityMW', 'totalDischargeCapacityMW', 'installedChargeCapacityMW', 'totalChargeCapacityMW', 'peakLoadMW', 'peakLoadHourEnding', 'dischargeAtPeakLoadMW', 'chargeAtPeakLoadMW', 'netOutputAtPeakLoadMW', 'maxDischargeMW', 'penetrationAtMaxDischargePercent', 'maxChargeMW', 'penetrationAtMaxChargePercent', 'maxDischargePenetrationPercent', 'dischargeAtMaxPenetrationMW', 'maxChargePenetrationPercent', 'chargeAtMaxPenetrationMW'), datetimes={})
+
+ class PowerRecordsHistoryRow(Row):
+ reportDate: date | None
+ category: str | None
+ recordMW: Decimal | None
+ recordTime: datetime | None
+ penetrationPercent: Decimal | None
+ maxSocPercent: Decimal | None
+ minSocPercent: Decimal | None
+
+ @property
+ def power_records_history(self) -> PdfArchive[np4_765_er.PowerRecordsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return PdfArchive(self._client, 'np4-765-er', np4_765_er.PowerRecordsHistoryRow, {'reportDate': 'reportDate', 'category': 'category', 'recordMW': 'recordMW', 'recordTime': 'recordTime', 'penetrationPercent': 'penetrationPercent', 'maxSocPercent': 'maxSocPercent', 'minSocPercent': 'minSocPercent'}, {}, start='Record\\s*Max\\s*MW\\s*Record\\s*Max\\s*MW\\s*Time\\s*Penetration\\s*at\\s*Record\\s*Max\\s*MW\\s*Max\\s*SOC\\s*in\\s*Record\\s*Hour\\s*Min\\s*SOC\\s*in\\s*Record\\s*Hour', end='Record\\s*Penetration\\s*Record\\s*Penetration\\s*Time\\s*MW\\s*at\\s*Record\\s*Penetration\\s*Time\\s*Max\\s*SOC\\s*in\\s*Record\\s*Hour\\s*Min\\s*SOC\\s*in\\s*Record\\s*Hour', pattern='(?PESR Discharge Generation|ESR Charge Load|ESR Injection)\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*(?P\\d{2}/\\d{2}/\\d{4}\\s+\\d{2}:\\d{2})\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%', records=True, notes=False, numbers=('recordMW', 'penetrationPercent', 'maxSocPercent', 'minSocPercent'), datetimes={'recordTime': '%m/%d/%Y %H:%M'})
+
+ class PenetrationRecordsHistoryRow(Row):
+ reportDate: date | None
+ category: str | None
+ penetrationPercent: Decimal | None
+ recordTime: datetime | None
+ recordMW: Decimal | None
+ maxSocPercent: Decimal | None
+ minSocPercent: Decimal | None
+
+ @property
+ def penetration_records_history(self) -> PdfArchive[np4_765_er.PenetrationRecordsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return PdfArchive(self._client, 'np4-765-er', np4_765_er.PenetrationRecordsHistoryRow, {'reportDate': 'reportDate', 'category': 'category', 'penetrationPercent': 'penetrationPercent', 'recordTime': 'recordTime', 'recordMW': 'recordMW', 'maxSocPercent': 'maxSocPercent', 'minSocPercent': 'minSocPercent'}, {}, start='Record\\s*Penetration\\s*Record\\s*Penetration\\s*Time\\s*MW\\s*at\\s*Record\\s*Penetration\\s*Time\\s*Max\\s*SOC\\s*in\\s*Record\\s*Hour\\s*Min\\s*SOC\\s*in\\s*Record\\s*Hour', end='Record\\s*SOC\\s*Delta\\s*Record\\s*SOC\\s*Delta\\s*Time', pattern='(?PESR Discharge Generation|ESR Charge Load)\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P\\d{2}/\\d{2}/\\d{4}\\s+\\d{2}:\\d{2})\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%', records=True, notes=False, numbers=('penetrationPercent', 'recordMW', 'maxSocPercent', 'minSocPercent'), datetimes={'recordTime': '%m/%d/%Y %H:%M'})
+
+ class SocRecordsHistoryRow(Row):
+ reportDate: date | None
+ category: str | None
+ recordMWh: Decimal | None
+ recordTime: datetime | None
+
+ @property
+ def soc_records_history(self) -> PdfArchive[np4_765_er.SocRecordsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return PdfArchive(self._client, 'np4-765-er', np4_765_er.SocRecordsHistoryRow, {'reportDate': 'reportDate', 'category': 'category', 'recordMWh': 'recordMWh', 'recordTime': 'recordTime'}, {}, start='Record\\s*SOC\\s*Delta\\s*Record\\s*SOC\\s*Delta\\s*Time', end='\\*\\s*Sum', pattern='(?PESR SOC Hourly Increase|ESR SOC Hourly Decrease)\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MWh\\s*(?P\\d{2}/\\d{2}/\\d{4}\\s+\\d{2}:\\d{2})', records=True, notes=False, numbers=('recordMWh',), datetimes={'recordTime': '%m/%d/%Y %H:%M'})
+
+ class HourlyPercentagesHistoryRow(Row):
+ reportDate: date | None
+ hourEnding: str | None
+ dischargeCapacityPercent: Decimal | None
+ chargeCapacityPercent: Decimal | None
+ netLoadPercent: Decimal | None
+
+ @property
+ def hourly_percentages_history(self) -> PdfChartArchive[np4_765_er.HourlyPercentagesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return PdfChartArchive(self._client, 'np4-765-er', np4_765_er.HourlyPercentagesHistoryRow, {'reportDate': 'reportDate', 'hourEnding': 'hourEnding', 'dischargeCapacityPercent': 'dischargeCapacityPercent', 'chargeCapacityPercent': 'chargeCapacityPercent', 'netLoadPercent': 'netLoadPercent'}, {}, charts={'dischargeCapacityPercent': (3, 'Actual ESR Discharging Output'), 'chargeCapacityPercent': (3, 'Actual ESR Charging Output'), 'netLoadPercent': (4, 'Actual ESR Net Output')})
class np4_790_cd:
def __init__(self, client: Transport) -> None:
@@ -6450,6 +10569,11 @@ class PeakerNetMarginRow(Row):
asOfDate: datetime | None
peakerNetMargin: Decimal | None
+ @property
+ def peaker_net_margin_history(self) -> Archive[np4_790_cd.PeakerNetMarginRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-790-cd', np4_790_cd.PeakerNetMarginRow, {'AsOfDate': 'asOfDate', 'PeakerNetMargin': 'peakerNetMargin'}, {}, member='*.csv', datetimes={'asOfDate': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def peaker_net_margin(self, *, asOfDateFrom: datetime | None = None, asOfDateTo: datetime | None = None, peakerNetMarginFrom: Decimal | None = None, peakerNetMarginTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_790_cd.PeakerNetMarginRow]:
'Peaker Net Margin'
return self._client._page('/np4-790-cd/peaker_net_margin', np4_790_cd.PeakerNetMarginRow, {'asOfDateFrom': asOfDateFrom, 'asOfDateTo': asOfDateTo, 'peakerNetMarginFrom': peakerNetMarginFrom, 'peakerNetMarginTo': peakerNetMarginTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6476,6 +10600,18 @@ class DaSwOfferCapsRow(Row):
SWCAPType: str | None
postedDatetime: datetime | None
+ class DaSwOfferCapsHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ SWCAPType: str | None
+ DASWCAP: Decimal | None = None
+ RTSWCAP: Decimal | None = None
+ SWCAP: Decimal | None = None
+
+ @property
+ def da_sw_offer_caps_history(self) -> Archive[np4_791_cd.DaSwOfferCapsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np4-791-cd', np4_791_cd.DaSwOfferCapsHistoryRow, {'SWCAPType': 'SWCAPType', 'DASWCAP': 'DASWCAP', 'RTSWCAP': 'RTSWCAP'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=({'SWCAPType': 'SWCAPType', 'SWCAP': 'SWCAP'},))
+
def da_sw_offer_caps(self, *, SWCAPType: str | None = None, DASWCAPFrom: Decimal | None = None, DASWCAPTo: Decimal | None = None, RTSWCAPFrom: Decimal | None = None, RTSWCAPTo: Decimal | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np4_791_cd.DaSwOfferCapsRow]:
'Day-Ahead and Real-Time System Wide-Offer Caps'
return self._client._page('/np4-791-cd/da_sw_offer_caps', np4_791_cd.DaSwOfferCapsRow, {'SWCAPType': SWCAPType, 'DASWCAPFrom': DASWCAPFrom, 'DASWCAPTo': DASWCAPTo, 'RTSWCAPFrom': RTSWCAPFrom, 'RTSWCAPTo': RTSWCAPTo, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6503,6 +10639,18 @@ class HrlyRmrServicesDeployedRow(Row):
repeatHourFlag: bool | None
resourceName: str | None
+ class HrlyRmrServicesDeployedHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ hourEnding: str | None
+ resourceName: str | None
+ mwhDeployment: Decimal | None
+ repeatHourFlag: bool | None
+
+ @property
+ def hrly_rmr_services_deployed_history(self) -> Archive[np5_108_cd.HrlyRmrServicesDeployedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np5-108-cd', np5_108_cd.HrlyRmrServicesDeployedHistoryRow, {'HourEnding': 'hourEnding', 'ResourceName': 'resourceName', 'MWHDeployment': 'mwhDeployment', 'DSTFlag': 'repeatHourFlag'}, {}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def hrly_rmr_services_deployed(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, hourEnding: str | None = None, resourceName: str | None = None, mwhDeploymentFrom: Decimal | None = None, mwhDeploymentTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np5_108_cd.HrlyRmrServicesDeployedRow]:
'Hourly RMR Services Deployed'
return self._client._page('/np5-108-cd/hrly_rmr_services_deployed', np5_108_cd.HrlyRmrServicesDeployedRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'hourEnding': hourEnding, 'resourceName': resourceName, 'mwhDeploymentFrom': mwhDeploymentFrom, 'mwhDeploymentTo': mwhDeploymentTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6519,6 +10667,25 @@ def hrly_rmr_services_deployed_iter_async(self, *, postedDatetimeFrom: datetime
'Hourly RMR Services Deployed'
return self._client._aiter('/np5-108-cd/hrly_rmr_services_deployed', np5_108_cd.HrlyRmrServicesDeployedRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'hourEnding': hourEnding, 'resourceName': resourceName, 'mwhDeploymentFrom': mwhDeploymentFrom, 'mwhDeploymentTo': mwhDeploymentTo, 'repeatHourFlag': repeatHourFlag, 'size': size, 'sort': sort, 'dir': dir})
+class np5_520_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class DeploymentFactorsHistoryRow(Row):
+ sourceSheet: str | None = None
+ deliveryMonth: date | None
+ hourEnding: int | None
+ ASType: str | None
+ average: Decimal | None
+ minimum: Decimal | None
+ maximum: Decimal | None
+
+ @property
+ def deployment_factors_history(self) -> WorkbookArchive[np5_520_er.DeploymentFactorsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np5-520-er', np5_520_er.DeploymentFactorsHistoryRow, {'Delivery Month': 'deliveryMonth', 'Hour Ending': 'hourEnding', 'AS Type': 'ASType', 'Avg AS Deployment Factors': 'average', 'Min AS Deployment Factors': 'minimum', 'Max AS Deployment Factors': 'maximum'}, {'deliveryMonth': '%Y-%m'}, sheets=('Monthly ASDF',), variants=())
+
class np5_525_cd:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -6532,6 +10699,20 @@ class WrucAsDeployFactorsRow(Row):
postedDatetime: datetime | None
repeatHourFlag: bool | None
+ class WrucAsDeployFactorsHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ RUCTimestamp: datetime | None
+ deliveryDate: date | None
+ deliveryHour: str | None
+ ASType: str | None
+ ASDeploymentFactors: Decimal | None
+ repeatHourFlag: bool | None
+
+ @property
+ def wruc_as_deploy_factors_history(self) -> Archive[np5_525_cd.WrucAsDeployFactorsHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np5-525-cd', np5_525_cd.WrucAsDeployFactorsHistoryRow, {'RUCTimestamp': 'RUCTimestamp', 'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'ASType': 'ASType', 'ASDeploymentFactors': 'ASDeploymentFactors', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S', 'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def wruc_as_deploy_factors(self, *, ASType: str | None = None, ASDeploymentFactorsFrom: Decimal | None = None, ASDeploymentFactorsTo: Decimal | None = None, repeatHourFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHour: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np5_525_cd.WrucAsDeployFactorsRow]:
'WRUC Ancillary Service Deployment Factors'
return self._client._page('/np5-525-cd/wruc_as_deploy_factors', np5_525_cd.WrucAsDeployFactorsRow, {'ASType': ASType, 'ASDeploymentFactorsFrom': ASDeploymentFactorsFrom, 'ASDeploymentFactorsTo': ASDeploymentFactorsTo, 'repeatHourFlag': repeatHourFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHour': deliveryHour, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6560,6 +10741,19 @@ class ProjAsDeployFactorRow(Row):
postedDatetime: datetime | None
repeatHourFlag: bool | None
+ class ProjAsDeployFactorHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ ASType: str | None
+ ASDeploymentFactors: Decimal | None
+ repeatHourFlag: bool | None
+
+ @property
+ def proj_as_deploy_factor_history(self) -> Archive[np5_526_cd.ProjAsDeployFactorHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np5-526-cd', np5_526_cd.ProjAsDeployFactorHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'ASType': 'ASType', 'ASDeploymentFactors': 'ASDeploymentFactors', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def proj_as_deploy_factor(self, *, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, ASType: str | None = None, ASDeploymentFactorsFrom: Decimal | None = None, ASDeploymentFactorsTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np5_526_cd.ProjAsDeployFactorRow]:
'Projected Ancillary Service Deployments Factors'
return self._client._page('/np5-526-cd/proj_as_deploy_factor', np5_526_cd.ProjAsDeployFactorRow, {'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'ASType': ASType, 'ASDeploymentFactorsFrom': ASDeploymentFactorsFrom, 'ASDeploymentFactorsTo': ASDeploymentFactorsTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6588,6 +10782,11 @@ class DrucAsDeployFactorsRow(Row):
deliveryHour: str | None
repeatHourFlag: bool | None
+ @property
+ def druc_as_deploy_factors_history(self) -> Archive[np5_527_cd.DrucAsDeployFactorsRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np5-527-cd', np5_527_cd.DrucAsDeployFactorsRow, {'RUCTimestamp': 'RUCTimestamp', 'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'ASType': 'ASType', 'ASDeploymentFactors': 'ASDeploymentFactors', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def druc_as_deploy_factors(self, *, ASType: str | None = None, ASDeploymentFactorsFrom: Decimal | None = None, ASDeploymentFactorsTo: Decimal | None = None, repeatHourFlag: bool | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHour: str | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np5_527_cd.DrucAsDeployFactorsRow]:
'DRUC Ancillary Service Deployment Factors'
return self._client._page('/np5-527-cd/druc_as_deploy_factors', np5_527_cd.DrucAsDeployFactorsRow, {'ASType': ASType, 'ASDeploymentFactorsFrom': ASDeploymentFactorsFrom, 'ASDeploymentFactorsTo': ASDeploymentFactorsTo, 'repeatHourFlag': repeatHourFlag, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHour': deliveryHour, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6616,6 +10815,11 @@ class HrucAsDeployFactorsRow(Row):
deliveryHour: str | None
repeatHourFlag: bool | None
+ @property
+ def hruc_as_deploy_factors_history(self) -> Archive[np5_528_cd.HrucAsDeployFactorsRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np5-528-cd', np5_528_cd.HrucAsDeployFactorsRow, {'RUCTimestamp': 'RUCTimestamp', 'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'ASType': 'ASType', 'ASDeploymentFactors': 'ASDeploymentFactors', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def hruc_as_deploy_factors(self, *, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHour: str | None = None, ASType: str | None = None, ASDeploymentFactorsFrom: Decimal | None = None, ASDeploymentFactorsTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np5_528_cd.HrucAsDeployFactorsRow]:
'HRUC Ancillary Service Deployment Factors'
return self._client._page('/np5-528-cd/hruc_as_deploy_factors', np5_528_cd.HrucAsDeployFactorsRow, {'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHour': deliveryHour, 'ASType': ASType, 'ASDeploymentFactorsFrom': ASDeploymentFactorsFrom, 'ASDeploymentFactorsTo': ASDeploymentFactorsTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6652,6 +10856,11 @@ class DailyRucActAndBindTranConstRow(Row):
value: Decimal | None
violationAmount: Decimal | None
+ @property
+ def daily_ruc_act_and_bind_tran_const_history(self) -> Archive[np5_754_cd.DailyRucActAndBindTranConstRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np5-754-cd', np5_754_cd.DailyRucActAndBindTranConstRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'RUCTimeStamp': 'RUCTimestamp', 'ConstraintID': 'constraintID', 'ConstraintName': 'constraintName', 'ContingencyName': 'contingencyName', 'Limit': 'limit', 'Value': 'value', 'ViolationAmount': 'violationAmount', 'FromStation': 'fromStation', 'ToStation': 'toStation', 'FromStationkV': 'fromStationkV', 'ToStationkV': 'toStationkV', 'DSTFlag': 'repeatedHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def daily_ruc_act_and_bind_tran_const(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, constraintIDFrom: int | None = None, constraintIDTo: int | None = None, constraintName: str | None = None, contingencyName: str | None = None, limitFrom: Decimal | None = None, limitTo: Decimal | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, violationAmountFrom: Decimal | None = None, violationAmountTo: Decimal | None = None, fromStation: str | None = None, toStation: str | None = None, fromStationkVFrom: Decimal | None = None, fromStationkVTo: Decimal | None = None, toStationkVFrom: Decimal | None = None, toStationkVTo: Decimal | None = None, repeatedHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np5_754_cd.DailyRucActAndBindTranConstRow]:
'Daily RUC Active and Binding Transmission Constraints'
return self._client._page('/np5-754-cd/daily_ruc_act_and_bind_tran_const', np5_754_cd.DailyRucActAndBindTranConstRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'constraintIDFrom': constraintIDFrom, 'constraintIDTo': constraintIDTo, 'constraintName': constraintName, 'contingencyName': contingencyName, 'limitFrom': limitFrom, 'limitTo': limitTo, 'valueFrom': valueFrom, 'valueTo': valueTo, 'violationAmountFrom': violationAmountFrom, 'violationAmountTo': violationAmountTo, 'fromStation': fromStation, 'toStation': toStation, 'fromStationkVFrom': fromStationkVFrom, 'fromStationkVTo': fromStationkVTo, 'toStationkVFrom': toStationkVFrom, 'toStationkVTo': toStationkVTo, 'repeatedHourFlag': repeatedHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6689,6 +10898,28 @@ class HrlyRucActAndBindTranConstRow(Row):
value: Decimal | None
violationAmount: Decimal | None
+ class HrlyRucActAndBindTranConstHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ RUCTimestamp: datetime | None
+ constraintID: int | None
+ constraintName: str | None
+ contingencyName: str | None
+ limit: Decimal | None
+ value: Decimal | None
+ violationAmount: Decimal | None
+ fromStation: str | None
+ toStation: str | None
+ fromStationkV: Decimal | None
+ toStationkV: Decimal | None
+ DSTFlag: bool | None
+
+ @property
+ def hrly_ruc_act_and_bind_tran_const_history(self) -> Archive[np5_755_cd.HrlyRucActAndBindTranConstHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np5-755-cd', np5_755_cd.HrlyRucActAndBindTranConstHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'RUCTimeStamp': 'RUCTimestamp', 'ConstraintID': 'constraintID', 'ConstraintName': 'constraintName', 'ContingencyName': 'contingencyName', 'Limit': 'limit', 'Value': 'value', 'ViolationAmount': 'violationAmount', 'FromStation': 'fromStation', 'ToStation': 'toStation', 'FromStationkV': 'fromStationkV', 'ToStationkV': 'toStationkV', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S', 'RUCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def hrly_ruc_act_and_bind_tran_const(self, *, fromStation: str | None = None, toStation: str | None = None, fromStationkVFrom: Decimal | None = None, fromStationkVTo: Decimal | None = None, toStationkVFrom: Decimal | None = None, toStationkVTo: Decimal | None = None, DSTFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, RUCTimestampFrom: datetime | None = None, RUCTimestampTo: datetime | None = None, constraintIDFrom: int | None = None, constraintIDTo: int | None = None, constraintName: str | None = None, contingencyName: str | None = None, limitFrom: Decimal | None = None, limitTo: Decimal | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, violationAmountFrom: Decimal | None = None, violationAmountTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np5_755_cd.HrlyRucActAndBindTranConstRow]:
'Hourly RUC Active and Binding Transmission Constraints'
return self._client._page('/np5-755-cd/hrly_ruc_act_and_bind_tran_const', np5_755_cd.HrlyRucActAndBindTranConstRow, {'fromStation': fromStation, 'toStation': toStation, 'fromStationkVFrom': fromStationkVFrom, 'fromStationkVTo': fromStationkVTo, 'toStationkVFrom': toStationkVFrom, 'toStationkVTo': toStationkVTo, 'DSTFlag': DSTFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'RUCTimestampFrom': RUCTimestampFrom, 'RUCTimestampTo': RUCTimestampTo, 'constraintIDFrom': constraintIDFrom, 'constraintIDTo': constraintIDTo, 'constraintName': constraintName, 'contingencyName': contingencyName, 'limitFrom': limitFrom, 'limitTo': limitTo, 'valueFrom': valueFrom, 'valueTo': valueTo, 'violationAmountFrom': violationAmountFrom, 'violationAmountTo': violationAmountTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6715,6 +10946,11 @@ class SystemWideDemandRow(Row):
demand: Decimal | None
timeEnding: str | None
+ @property
+ def system_wide_demand_history(self) -> Archive[np6_235_cd.SystemWideDemandRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-235-cd', np6_235_cd.SystemWideDemandRow, {'DeliveryDate': 'deliveryDate', 'TimeEnding': 'timeEnding', 'Demand': 'demand', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def system_wide_demand(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, timeEnding: str | None = None, demandFrom: Decimal | None = None, demandTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_235_cd.SystemWideDemandRow]:
'System-Wide Demand'
return self._client._page('/np6-235-cd/system_wide_demand', np6_235_cd.SystemWideDemandRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'timeEnding': timeEnding, 'demandFrom': demandFrom, 'demandTo': demandTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6741,6 +10977,18 @@ class ScedSystemLambdaRow(Row):
repeatedHourFlag: bool | None
uncappedSystemLambda: Decimal | None
+ class ScedSystemLambdaHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatedHourFlag: bool | None
+ cappedSystemLambda: Decimal | None = None
+ uncappedSystemLambda: Decimal | None = None
+ systemLambda: Decimal | None = None
+
+ @property
+ def sced_system_lambda_history(self) -> Archive[np6_322_cd.ScedSystemLambdaHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-322-cd', np6_322_cd.ScedSystemLambdaHistoryRow, {'SCEDTimeStamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatedHourFlag', 'CappedSystemLambda': 'cappedSystemLambda', 'UncappedSystemLambda': 'uncappedSystemLambda'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatedHourFlag', 'SystemLambda': 'systemLambda'},))
+
def sced_system_lambda(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatedHourFlag: bool | None = None, cappedSystemLambdaFrom: Decimal | None = None, cappedSystemLambdaTo: Decimal | None = None, uncappedSystemLambdaFrom: Decimal | None = None, uncappedSystemLambdaTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_322_cd.ScedSystemLambdaRow]:
'SCED System Lambda'
return self._client._page('/np6-322-cd/sced_system_lambda', np6_322_cd.ScedSystemLambdaRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatedHourFlag': repeatedHourFlag, 'cappedSystemLambdaFrom': cappedSystemLambdaFrom, 'cappedSystemLambdaTo': cappedSystemLambdaTo, 'uncappedSystemLambdaFrom': uncappedSystemLambdaFrom, 'uncappedSystemLambdaTo': uncappedSystemLambdaTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6783,6 +11031,51 @@ class RtPriceAdderScedRow(Row):
repeatHourFlag: bool | None
systemLambda: Decimal | None
+ class RtPriceAdderScedHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ systemLambda: Decimal | None
+ RTRDPA: Decimal | None = None
+ RTRDPARUS: Decimal | None = None
+ RTRDPARDS: Decimal | None = None
+ RTRDPARRS: Decimal | None = None
+ RTRDPAECRS: Decimal | None = None
+ RTRDPANSS: Decimal | None = None
+ RTRRUC: Decimal | None = None
+ RTRRMR: Decimal | None = None
+ RTDNCLR: Decimal | None = None
+ RTDERS: Decimal | None = None
+ RTDCTIEIMPORT: Decimal | None = None
+ RTDCTIEEXPORT: Decimal | None = None
+ RTBLTIMPORT: Decimal | None = None
+ RTBLTEXPORT: Decimal | None = None
+ RTOLLSL: Decimal | None = None
+ RTOLHSL: Decimal | None
+ RTDLL: Decimal | None = None
+ BatchID: int | None = None
+ PRC: Decimal | None = None
+ RTORPA: Decimal | None = None
+ RTOFFPA: Decimal | None = None
+ RTOLCAP: Decimal | None = None
+ RTOFFCAP: Decimal | None = None
+ RTBP: Decimal | None = None
+ RTCLRCAP: Decimal | None = None
+ RTCLRREG: Decimal | None = None
+ RTCLRBP: Decimal | None = None
+ RTCLRLSL: Decimal | None = None
+ RTCLRNS: Decimal | None = None
+ RTNCLRRRS: Decimal | None = None
+ RTOLNSRS: Decimal | None = None
+ RTCST30HSL: Decimal | None = None
+ RTOFFNSHSL: Decimal | None = None
+ RTOFF10: Decimal | None = None
+ RTOFF30: Decimal | None = None
+
+ @property
+ def rt_price_adder_sced_history(self) -> Archive[np6_323_cd.RtPriceAdderScedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-323-cd', np6_323_cd.RtPriceAdderScedHistoryRow, {'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'SystemLambda': 'systemLambda', 'RTRDPA': 'RTRDPA', 'RTRDPARUS': 'RTRDPARUS', 'RTRDPARDS': 'RTRDPARDS', 'RTRDPARRS': 'RTRDPARRS', 'RTRDPAECRS': 'RTRDPAECRS', 'RTRDPANSS': 'RTRDPANSS', 'RTRRUC': 'RTRRUC', 'RTRRMR': 'RTRRMR', 'RTDNCLR': 'RTDNCLR', 'RTDERS': 'RTDERS', 'RTDCTIEIMPORT': 'RTDCTIEIMPORT', 'RTDCTIEEXPORT': 'RTDCTIEEXPORT', 'RTBLTIMPORT': 'RTBLTIMPORT', 'RTBLTEXPORT': 'RTBLTEXPORT', 'RTOLLSL': 'RTOLLSL', 'RTOLHSL': 'RTOLHSL', 'RTDLL': 'RTDLL'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'BatchID': 'BatchID', 'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'SystemLambda': 'systemLambda', 'PRC': 'PRC', 'RTORPA': 'RTORPA', 'RTOFFPA': 'RTOFFPA', 'RTOLCAP': 'RTOLCAP', 'RTOFFCAP': 'RTOFFCAP', 'RTOLHSL': 'RTOLHSL', 'RTBP': 'RTBP', 'RTCLRCAP': 'RTCLRCAP', 'RTCLRREG': 'RTCLRREG', 'RTCLRBP': 'RTCLRBP', 'RTCLRLSL': 'RTCLRLSL', 'RTCLRNS': 'RTCLRNS', 'RTNCLRRRS': 'RTNCLRRRS', 'RTOLNSRS': 'RTOLNSRS', 'RTCST30HSL': 'RTCST30HSL', 'RTOFFNSHSL': 'RTOFFNSHSL', 'RTOFF10': 'RTOFF10', 'RTOFF30': 'RTOFF30'},))
+
def rt_price_adder_sced(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, systemLambdaFrom: Decimal | None = None, systemLambdaTo: Decimal | None = None, RTRDPAFrom: Decimal | None = None, RTRDPATo: Decimal | None = None, RTRDPARUSFrom: Decimal | None = None, RTRDPARUSTo: Decimal | None = None, RTRDPARDSFrom: Decimal | None = None, RTRDPARDSTo: Decimal | None = None, RTRDPARRSFrom: Decimal | None = None, RTRDPARRSTo: Decimal | None = None, RTRDPAECRSFrom: Decimal | None = None, RTRDPAECRSTo: Decimal | None = None, RTRDPANSSFrom: Decimal | None = None, RTRDPANSSTo: Decimal | None = None, RTRRUCFrom: Decimal | None = None, RTRRUCTo: Decimal | None = None, RTRRMRFrom: Decimal | None = None, RTRRMRTo: Decimal | None = None, RTDNCLRFrom: Decimal | None = None, RTDNCLRTo: Decimal | None = None, RTDERSFrom: Decimal | None = None, RTDERSTo: Decimal | None = None, RTDCTIEIMPORTFrom: Decimal | None = None, RTDCTIEIMPORTTo: Decimal | None = None, RTDCTIEEXPORTFrom: Decimal | None = None, RTDCTIEEXPORTTo: Decimal | None = None, RTBLTIMPORTFrom: Decimal | None = None, RTBLTIMPORTTo: Decimal | None = None, RTBLTEXPORTFrom: Decimal | None = None, RTBLTEXPORTTo: Decimal | None = None, RTOLLSLFrom: Decimal | None = None, RTOLLSLTo: Decimal | None = None, RTOLHSLFrom: Decimal | None = None, RTOLHSLTo: Decimal | None = None, RTDLLFrom: Decimal | None = None, RTDLLTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_323_cd.RtPriceAdderScedRow]:
'Real-Time Price Adders by SCED Interval'
return self._client._page('/np6-323-cd/rt_price_adder_sced', np6_323_cd.RtPriceAdderScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'systemLambdaFrom': systemLambdaFrom, 'systemLambdaTo': systemLambdaTo, 'RTRDPAFrom': RTRDPAFrom, 'RTRDPATo': RTRDPATo, 'RTRDPARUSFrom': RTRDPARUSFrom, 'RTRDPARUSTo': RTRDPARUSTo, 'RTRDPARDSFrom': RTRDPARDSFrom, 'RTRDPARDSTo': RTRDPARDSTo, 'RTRDPARRSFrom': RTRDPARRSFrom, 'RTRDPARRSTo': RTRDPARRSTo, 'RTRDPAECRSFrom': RTRDPAECRSFrom, 'RTRDPAECRSTo': RTRDPAECRSTo, 'RTRDPANSSFrom': RTRDPANSSFrom, 'RTRDPANSSTo': RTRDPANSSTo, 'RTRRUCFrom': RTRRUCFrom, 'RTRRUCTo': RTRRUCTo, 'RTRRMRFrom': RTRRMRFrom, 'RTRRMRTo': RTRRMRTo, 'RTDNCLRFrom': RTDNCLRFrom, 'RTDNCLRTo': RTDNCLRTo, 'RTDERSFrom': RTDERSFrom, 'RTDERSTo': RTDERSTo, 'RTDCTIEIMPORTFrom': RTDCTIEIMPORTFrom, 'RTDCTIEIMPORTTo': RTDCTIEIMPORTTo, 'RTDCTIEEXPORTFrom': RTDCTIEEXPORTFrom, 'RTDCTIEEXPORTTo': RTDCTIEEXPORTTo, 'RTBLTIMPORTFrom': RTBLTIMPORTFrom, 'RTBLTIMPORTTo': RTBLTIMPORTTo, 'RTBLTEXPORTFrom': RTBLTEXPORTFrom, 'RTBLTEXPORTTo': RTBLTEXPORTTo, 'RTOLLSLFrom': RTOLLSLFrom, 'RTOLLSLTo': RTOLLSLTo, 'RTOLHSLFrom': RTOLHSLFrom, 'RTOLHSLTo': RTOLHSLTo, 'RTDLLFrom': RTDLLFrom, 'RTDLLTo': RTDLLTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6815,6 +11108,25 @@ class Rt15minPriceAddersRow(Row):
deliveryInterval: int | None
repeatHourFlag: bool | None
+ class Rt15minPriceAddersHistoryRow(Row):
+ deliveryDate: date | None
+ deliveryHour: int | None
+ deliveryInterval: int | None
+ RTRDPA: Decimal | None = None
+ RTRDPRU: Decimal | None = None
+ RTRDPRD: Decimal | None = None
+ RTRDPRRS: Decimal | None = None
+ RTRDPECRS: Decimal | None = None
+ RTRDPNS: Decimal | None = None
+ repeatHourFlag: bool | None
+ RTRSVPOR: Decimal | None = None
+ RTRSVPOFF: Decimal | None = None
+
+ @property
+ def rt_15min_price_adders_history(self) -> Archive[np6_324_cd.Rt15minPriceAddersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-324-cd', np6_324_cd.Rt15minPriceAddersHistoryRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'RTRDPA': 'RTRDPA', 'RTRDPRU': 'RTRDPRU', 'RTRDPRD': 'RTRDPRD', 'RTRDPRRS': 'RTRDPRRS', 'RTRDPECRS': 'RTRDPECRS', 'RTRDPNS': 'RTRDPNS', 'RepeatedHourFlag': 'repeatHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=({'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'RTRSVPOR': 'RTRSVPOR', 'RTRSVPOFF': 'RTRSVPOFF', 'DSTFlag': 'repeatHourFlag'},))
+
def rt_15min_price_adders(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntervalFrom: int | None = None, deliveryIntervalTo: int | None = None, RTRDPAFrom: Decimal | None = None, RTRDPATo: Decimal | None = None, RTRDPRUFrom: Decimal | None = None, RTRDPRUTo: Decimal | None = None, RTRDPRDFrom: Decimal | None = None, RTRDPRDTo: Decimal | None = None, RTRDPRRSFrom: Decimal | None = None, RTRDPRRSTo: Decimal | None = None, RTRDPECRSFrom: Decimal | None = None, RTRDPECRSTo: Decimal | None = None, RTRDPNSFrom: Decimal | None = None, RTRDPNSTo: Decimal | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_324_cd.Rt15minPriceAddersRow]:
'Real-Time Price Adders for 15-Minute Settlement Interval'
return self._client._page('/np6-324-cd/rt_15min_price_adders', np6_324_cd.Rt15minPriceAddersRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntervalFrom': deliveryIntervalFrom, 'deliveryIntervalTo': deliveryIntervalTo, 'RTRDPAFrom': RTRDPAFrom, 'RTRDPATo': RTRDPATo, 'RTRDPRUFrom': RTRDPRUFrom, 'RTRDPRUTo': RTRDPRUTo, 'RTRDPRDFrom': RTRDPRDFrom, 'RTRDPRDTo': RTRDPRDTo, 'RTRDPRRSFrom': RTRDPRRSFrom, 'RTRDPRRSTo': RTRDPRRSTo, 'RTRDPECRSFrom': RTRDPECRSFrom, 'RTRDPECRSTo': RTRDPECRSTo, 'RTRDPNSFrom': RTRDPNSFrom, 'RTRDPNSTo': RTRDPNSTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6860,6 +11172,41 @@ class RtdPriceAddersRow(Row):
repeatHourFlag: bool | None
systemLambda: Decimal | None
+ class RtdPriceAddersHistoryRow(Row):
+ RTDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ intervalID: int | None
+ intervalEnding: datetime | None
+ IERepeatHourFlag: bool | None
+ systemLambda: Decimal | None
+ RTRDPA: Decimal | None = None
+ RTRDPARUS: Decimal | None = None
+ RTRDPARDS: Decimal | None = None
+ RTRDPARRS: Decimal | None = None
+ RTRDPAECRS: Decimal | None = None
+ RTRDPANSS: Decimal | None = None
+ RTRRUC: Decimal | None = None
+ RTRRMR: Decimal | None = None
+ RTDNCLR: Decimal | None = None
+ RTDERS: Decimal | None = None
+ RTDCTIEImport: Decimal | None = None
+ RTDCTIEExport: Decimal | None = None
+ RTBLTImport: Decimal | None = None
+ RTBLTExport: Decimal | None = None
+ RTOLLSL: Decimal | None = None
+ RTOLHSL: Decimal | None = None
+ RTDLL: Decimal | None = None
+ BatchID: int | None = None
+ RTORPA: Decimal | None = None
+ RTOFFPA: Decimal | None = None
+ RTOLCAP: Decimal | None = None
+ RTOFFCAP: Decimal | None = None
+
+ @property
+ def rtd_price_adders_history(self) -> Archive[np6_325_cd.RtdPriceAddersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-325-cd', np6_325_cd.RtdPriceAddersHistoryRow, {'RTDTimestamp': 'RTDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'IntervalID': 'intervalID', 'IntervalEnding': 'intervalEnding', 'IERepeatedHourFlag': 'IERepeatHourFlag', 'SystemLambda': 'systemLambda', 'RTRDPA': 'RTRDPA', 'RTRDPARUS': 'RTRDPARUS', 'RTRDPARDS': 'RTRDPARDS', 'RTRDPARRS': 'RTRDPARRS', 'RTRDPAECRS': 'RTRDPAECRS', 'RTRDPANSS': 'RTRDPANSS', 'RTRRUC': 'RTRRUC', 'RTRRMR': 'RTRRMR', 'RTDNCLR': 'RTDNCLR', 'RTDERS': 'RTDERS', 'RTDCTIEIMPORT': 'RTDCTIEImport', 'RTDCTIEEXPORT': 'RTDCTIEExport', 'RTBLTIMPORT': 'RTBLTImport', 'RTBLTEXPORT': 'RTBLTExport', 'RTOLLSL': 'RTOLLSL', 'RTOLHSL': 'RTOLHSL', 'RTDLL': 'RTDLL'}, {}, member='*.csv', datetimes={'RTDTimestamp': '%m/%d/%Y %H:%M:%S', 'intervalEnding': '%m/%d/%Y %H:%M:%S'}, variants=({'BatchID': 'BatchID', 'RTDTimestamp': 'RTDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'IntervalID': 'intervalID', 'IntervalEnding': 'intervalEnding', 'IERepeatedHourFlag': 'IERepeatHourFlag', 'SystemLambda': 'systemLambda', 'RTORPA': 'RTORPA', 'RTOFFPA': 'RTOFFPA', 'RTOLCAP': 'RTOLCAP', 'RTOFFCAP': 'RTOFFCAP'},))
+
def rtd_price_adders(self, *, RTDTimestampFrom: datetime | None = None, RTDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, intervalIDFrom: int | None = None, intervalIDTo: int | None = None, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, IERepeatHourFlag: bool | None = None, systemLambdaFrom: Decimal | None = None, systemLambdaTo: Decimal | None = None, RTRDPAFrom: Decimal | None = None, RTRDPATo: Decimal | None = None, RTRDPARUSFrom: Decimal | None = None, RTRDPARUSTo: Decimal | None = None, RTRDPARDSFrom: Decimal | None = None, RTRDPARDSTo: Decimal | None = None, RTRDPARRSFrom: Decimal | None = None, RTRDPARRSTo: Decimal | None = None, RTRDPAECRSFrom: Decimal | None = None, RTRDPAECRSTo: Decimal | None = None, RTRDPANSSFrom: Decimal | None = None, RTRDPANSSTo: Decimal | None = None, RTRRUCFrom: Decimal | None = None, RTRRUCTo: Decimal | None = None, RTRRMRFrom: Decimal | None = None, RTRRMRTo: Decimal | None = None, RTDNCLRFrom: Decimal | None = None, RTDNCLRTo: Decimal | None = None, RTDERSFrom: Decimal | None = None, RTDERSTo: Decimal | None = None, RTDCTIEImportFrom: Decimal | None = None, RTDCTIEImportTo: Decimal | None = None, RTDCTIEExportFrom: Decimal | None = None, RTDCTIEExportTo: Decimal | None = None, RTBLTImportFrom: Decimal | None = None, RTBLTImportTo: Decimal | None = None, RTBLTExportFrom: Decimal | None = None, RTBLTExportTo: Decimal | None = None, RTOLLSLFrom: Decimal | None = None, RTOLLSLTo: Decimal | None = None, RTOLHSLFrom: Decimal | None = None, RTOLHSLTo: Decimal | None = None, RTDLLFrom: Decimal | None = None, RTDLLTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_325_cd.RtdPriceAddersRow]:
'RTD Indicative Price Adders'
return self._client._page('/np6-325-cd/rtd_price_adders', np6_325_cd.RtdPriceAddersRow, {'RTDTimestampFrom': RTDTimestampFrom, 'RTDTimestampTo': RTDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'intervalIDFrom': intervalIDFrom, 'intervalIDTo': intervalIDTo, 'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'IERepeatHourFlag': IERepeatHourFlag, 'systemLambdaFrom': systemLambdaFrom, 'systemLambdaTo': systemLambdaTo, 'RTRDPAFrom': RTRDPAFrom, 'RTRDPATo': RTRDPATo, 'RTRDPARUSFrom': RTRDPARUSFrom, 'RTRDPARUSTo': RTRDPARUSTo, 'RTRDPARDSFrom': RTRDPARDSFrom, 'RTRDPARDSTo': RTRDPARDSTo, 'RTRDPARRSFrom': RTRDPARRSFrom, 'RTRDPARRSTo': RTRDPARRSTo, 'RTRDPAECRSFrom': RTRDPAECRSFrom, 'RTRDPAECRSTo': RTRDPAECRSTo, 'RTRDPANSSFrom': RTRDPANSSFrom, 'RTRDPANSSTo': RTRDPANSSTo, 'RTRRUCFrom': RTRRUCFrom, 'RTRRUCTo': RTRRUCTo, 'RTRRMRFrom': RTRRMRFrom, 'RTRRMRTo': RTRRMRTo, 'RTDNCLRFrom': RTDNCLRFrom, 'RTDNCLRTo': RTDNCLRTo, 'RTDERSFrom': RTDERSFrom, 'RTDERSTo': RTDERSTo, 'RTDCTIEImportFrom': RTDCTIEImportFrom, 'RTDCTIEImportTo': RTDCTIEImportTo, 'RTDCTIEExportFrom': RTDCTIEExportFrom, 'RTDCTIEExportTo': RTDCTIEExportTo, 'RTBLTImportFrom': RTBLTImportFrom, 'RTBLTImportTo': RTBLTImportTo, 'RTBLTExportFrom': RTBLTExportFrom, 'RTBLTExportTo': RTBLTExportTo, 'RTOLLSLFrom': RTOLLSLFrom, 'RTOLLSLTo': RTOLLSLTo, 'RTOLHSLFrom': RTOLHSLFrom, 'RTOLHSLTo': RTOLHSLTo, 'RTDLLFrom': RTDLLFrom, 'RTDLLTo': RTDLLTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6890,6 +11237,11 @@ class RtPriceSogRow(Row):
resourceName: str | None
resourceType: str | None
+ @property
+ def rt_price_sog_history(self) -> Archive[np6_326_cd.RtPriceSogRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-326-cd', np6_326_cd.RtPriceSogRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'ResourceType': 'resourceType', 'ResourceName': 'resourceName', 'MeterName': 'meterName', 'MeterPrice': 'meterPrice', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def rt_price_sog(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntervalFrom: int | None = None, deliveryIntervalTo: int | None = None, resourceType: str | None = None, resourceName: str | None = None, meterName: str | None = None, meterPriceFrom: Decimal | None = None, meterPriceTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_326_cd.RtPriceSogRow]:
'Real-Time Price for SOG'
return self._client._page('/np6-326-cd/rt_price_sog', np6_326_cd.RtPriceSogRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntervalFrom': deliveryIntervalFrom, 'deliveryIntervalTo': deliveryIntervalTo, 'resourceType': resourceType, 'resourceName': resourceName, 'meterName': meterName, 'meterPriceFrom': meterPriceFrom, 'meterPriceTo': meterPriceTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6922,6 +11274,25 @@ class LmpSogPriceAddersRow(Row):
stationName: str | None
voltageLevel: Decimal | None
+ class LmpSogPriceAddersHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ resourceType: str | None
+ resourceName: str | None
+ stationName: str | None
+ voltageLevel: Decimal | None
+ meterName: str | None
+ meterLMP: Decimal | None
+ RTRDPA: Decimal | None = None
+ finalLMP: Decimal | None
+ RTORPA: Decimal | None = None
+ RTORDPA: Decimal | None = None
+
+ @property
+ def lmp_sog_price_adders_history(self) -> Archive[np6_327_cd.LmpSogPriceAddersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-327-cd', np6_327_cd.LmpSogPriceAddersHistoryRow, {'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'ResourceType': 'resourceType', 'ResourceName': 'resourceName', 'StationName': 'stationName', 'VoltageLevel': 'voltageLevel', 'MeterName': 'meterName', 'MeterLMP': 'meterLMP', 'RTRDPA': 'RTRDPA', 'FinalLMP': 'finalLMP'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'ResourceType': 'resourceType', 'ResourceName': 'resourceName', 'StationName': 'stationName', 'VoltageLevel': 'voltageLevel', 'MeterName': 'meterName', 'MeterLMP': 'meterLMP', 'RTORPA': 'RTORPA', 'RTORDPA': 'RTORDPA', 'FinalLMP': 'finalLMP'},))
+
def lmp_sog_price_adders(self, *, resourceType: str | None = None, resourceName: str | None = None, stationName: str | None = None, voltageLevelFrom: Decimal | None = None, voltageLevelTo: Decimal | None = None, meterName: str | None = None, meterLMPFrom: Decimal | None = None, meterLMPTo: Decimal | None = None, RTRDPAFrom: Decimal | None = None, RTRDPATo: Decimal | None = None, finalLMPFrom: Decimal | None = None, finalLMPTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_327_cd.LmpSogPriceAddersRow]:
'LMP By SOG Including Price Adders'
return self._client._page('/np6-327-cd/lmp_sog_price_adders', np6_327_cd.LmpSogPriceAddersRow, {'resourceType': resourceType, 'resourceName': resourceName, 'stationName': stationName, 'voltageLevelFrom': voltageLevelFrom, 'voltageLevelTo': voltageLevelTo, 'meterName': meterName, 'meterLMPFrom': meterLMPFrom, 'meterLMPTo': meterLMPTo, 'RTRDPAFrom': RTRDPAFrom, 'RTRDPATo': RTRDPATo, 'finalLMPFrom': finalLMPFrom, 'finalLMPTo': finalLMPTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6954,6 +11325,11 @@ class TotAsResCapRow(Row):
capRRS: Decimal | None
repeatHourFlag: bool | None
+ @property
+ def tot_as_res_cap_history(self) -> Archive[np6_328_cd.TotAsResCapRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-328-cd', np6_328_cd.TotAsResCapRow, {'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'CapREGUPTotal': 'capREGUP', 'CapREGDNTotal': 'capREGDN', 'CapRRSTotal': 'capRRS', 'CapECRSTotal': 'capECRS', 'CapNSPINTotal': 'capNSPIN', 'CapREGUP_RRSTotal': 'capREGUPRRS', 'CapREGUP_RRS_ECRSTotal': 'capREGUPRRSECRS', 'CapREGUP_RRS_ECRS_NSPINTotal': 'capREGUPRRSECRSNSPIN'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def tot_as_res_cap(self, *, capREGDNFrom: Decimal | None = None, capREGDNTo: Decimal | None = None, capRRSFrom: Decimal | None = None, capRRSTo: Decimal | None = None, capECRSFrom: Decimal | None = None, capECRSTo: Decimal | None = None, capNSPINFrom: Decimal | None = None, capNSPINTo: Decimal | None = None, capREGUPRRSFrom: Decimal | None = None, capREGUPRRSTo: Decimal | None = None, capREGUPRRSECRSFrom: Decimal | None = None, capREGUPRRSECRSTo: Decimal | None = None, capREGUPRRSECRSNSPINFrom: Decimal | None = None, capREGUPRRSECRSNSPINTo: Decimal | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, capREGUPFrom: Decimal | None = None, capREGUPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_328_cd.TotAsResCapRow]:
'Total Capability of Resources Available to Provide Ancillary Service'
return self._client._page('/np6-328-cd/tot_as_res_cap', np6_328_cd.TotAsResCapRow, {'capREGDNFrom': capREGDNFrom, 'capREGDNTo': capREGDNTo, 'capRRSFrom': capRRSFrom, 'capRRSTo': capRRSTo, 'capECRSFrom': capECRSFrom, 'capECRSTo': capECRSTo, 'capNSPINFrom': capNSPINFrom, 'capNSPINTo': capNSPINTo, 'capREGUPRRSFrom': capREGUPRRSFrom, 'capREGUPRRSTo': capREGUPRRSTo, 'capREGUPRRSECRSFrom': capREGUPRRSECRSFrom, 'capREGUPRRSECRSTo': capREGUPRRSECRSTo, 'capREGUPRRSECRSNSPINFrom': capREGUPRRSECRSNSPINFrom, 'capREGUPRRSECRSNSPINTo': capREGUPRRSECRSNSPINTo, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'capREGUPFrom': capREGUPFrom, 'capREGUPTo': capREGUPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -6986,6 +11362,11 @@ class RtdIndMcpcRow(Row):
intervalRepeatHourFlag: bool | None
repeatHourFlag: bool | None
+ @property
+ def rtd_ind_mcpc_history(self) -> Archive[np6_329_cd.RtdIndMcpcRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-329-cd', np6_329_cd.RtdIndMcpcRow, {'RTDTimestamp': 'RTDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'IntervalID': 'intervalId', 'IntervalEnding': 'intervalEnding', 'IntervalEndingRepeatedHourFlag': 'intervalRepeatHourFlag', 'REGUP': 'REGUP', 'REGDN': 'REGDN', 'RRS': 'RRS', 'ECRS': 'ECRS', 'NSPIN': 'NSPIN'}, {}, member='*.csv', datetimes={'RTDTimestamp': '%m/%d/%Y %H:%M:%S', 'intervalEnding': '%m/%d/%Y %H:%M'}, variants=())
+
def rtd_ind_mcpc(self, *, RRSFrom: Decimal | None = None, RRSTo: Decimal | None = None, ECRSFrom: Decimal | None = None, ECRSTo: Decimal | None = None, NSPINFrom: Decimal | None = None, NSPINTo: Decimal | None = None, RTDTimestampFrom: datetime | None = None, RTDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, intervalIdFrom: int | None = None, intervalIdTo: int | None = None, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, intervalRepeatHourFlag: bool | None = None, REGUPFrom: Decimal | None = None, REGUPTo: Decimal | None = None, REGDNFrom: Decimal | None = None, REGDNTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_329_cd.RtdIndMcpcRow]:
'RTD Indicative Real-Time MCPC'
return self._client._page('/np6-329-cd/rtd_ind_mcpc', np6_329_cd.RtdIndMcpcRow, {'RRSFrom': RRSFrom, 'RRSTo': RRSTo, 'ECRSFrom': ECRSFrom, 'ECRSTo': ECRSTo, 'NSPINFrom': NSPINFrom, 'NSPINTo': NSPINTo, 'RTDTimestampFrom': RTDTimestampFrom, 'RTDTimestampTo': RTDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'intervalIdFrom': intervalIdFrom, 'intervalIdTo': intervalIdTo, 'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'intervalRepeatHourFlag': intervalRepeatHourFlag, 'REGUPFrom': REGUPFrom, 'REGUPTo': REGUPTo, 'REGDNFrom': REGDNFrom, 'REGDNTo': REGDNTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7014,6 +11395,11 @@ class RtClearPriceCapRow(Row):
deliveryInt: int | None
repeatHourFlag: bool | None
+ @property
+ def rt_clear_price_cap_history(self) -> Archive[np6_331_cd.RtClearPriceCapRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-331-cd', np6_331_cd.RtClearPriceCapRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInt', 'RepeatedHourFlag': 'repeatHourFlag', 'ASType': 'ASType', 'MCPC': 'MCPC'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={}, variants=())
+
def rt_clear_price_cap(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntFrom: int | None = None, deliveryIntTo: int | None = None, repeatHourFlag: bool | None = None, ASType: str | None = None, MCPCFrom: Decimal | None = None, MCPCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_331_cd.RtClearPriceCapRow]:
'Real-Time Clearing Prices for Capacity for 15-Minute Settlement Interval'
return self._client._page('/np6-331-cd/rt_clear_price_cap', np6_331_cd.RtClearPriceCapRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntFrom': deliveryIntFrom, 'deliveryIntTo': deliveryIntTo, 'repeatHourFlag': repeatHourFlag, 'ASType': ASType, 'MCPCFrom': MCPCFrom, 'MCPCTo': MCPCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7041,6 +11427,19 @@ class RtClearPriceCapScedRow(Row):
repeatedHourFlag: bool | None
uncappedMCPC: Decimal | None
+ class RtClearPriceCapScedHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatedHourFlag: bool | None
+ ASType: str | None
+ cappedMCPC: Decimal | None = None
+ uncappedMCPC: Decimal | None = None
+ MCPC: Decimal | None = None
+
+ @property
+ def rt_clear_price_cap_sced_history(self) -> Archive[np6_332_cd.RtClearPriceCapScedHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-332-cd', np6_332_cd.RtClearPriceCapScedHistoryRow, {'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatedHourFlag', 'ASType': 'ASType', 'CappedMCPC': 'cappedMCPC', 'UncappedMCPC': 'uncappedMCPC'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatedHourFlag', 'ASType': 'ASType', 'MCPC': 'MCPC'},))
+
def rt_clear_price_cap_sced(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatedHourFlag: bool | None = None, ASType: str | None = None, cappedMCPCFrom: Decimal | None = None, cappedMCPCTo: Decimal | None = None, uncappedMCPCFrom: Decimal | None = None, uncappedMCPCTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_332_cd.RtClearPriceCapScedRow]:
'Real-Time Clearing Prices for Capacity by SCED Interval'
return self._client._page('/np6-332-cd/rt_clear_price_cap_sced', np6_332_cd.RtClearPriceCapScedRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatedHourFlag': repeatedHourFlag, 'ASType': ASType, 'cappedMCPCFrom': cappedMCPCFrom, 'cappedMCPCTo': cappedMCPCTo, 'uncappedMCPCFrom': uncappedMCPCFrom, 'uncappedMCPCTo': uncappedMCPCTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7067,6 +11466,11 @@ class ActSysLoadByStudyAreaRow(Row):
repeatedHourFlag: bool | None
valley: Decimal | None
+ @property
+ def act_sys_load_by_study_area_history(self) -> Archive[np6_344_cd.ActSysLoadByStudyAreaRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-344-cd', np6_344_cd.ActSysLoadByStudyAreaRow, {'OperatingDay': 'operatingDay', 'HourEnding': 'hourEnding', 'Valley': 'valley', 'DSTFlag': 'repeatedHourFlag'}, {'operatingDay': '%m/%d/%Y'}, member='*.csv', datetimes=None, variants=())
+
def act_sys_load_by_study_area(self, *, hourEnding: str | None = None, valleyFrom: Decimal | None = None, valleyTo: Decimal | None = None, repeatedHourFlag: bool | None = None, operatingDayFrom: date | None = None, operatingDayTo: date | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_344_cd.ActSysLoadByStudyAreaRow]:
'Actual System Load by Study Area'
return self._client._page('/np6-344-cd/act_sys_load_by_study_area', np6_344_cd.ActSysLoadByStudyAreaRow, {'hourEnding': hourEnding, 'valleyFrom': valleyFrom, 'valleyTo': valleyTo, 'repeatedHourFlag': repeatedHourFlag, 'operatingDayFrom': operatingDayFrom, 'operatingDayTo': operatingDayTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7101,6 +11505,11 @@ class ActSysLoadByWznRow(Row):
total: Decimal | None
west: Decimal | None
+ @property
+ def act_sys_load_by_wzn_history(self) -> Archive[np6_345_cd.ActSysLoadByWznRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-345-cd', np6_345_cd.ActSysLoadByWznRow, {'OperDay': 'operatingDay', 'HourEnding': 'hourEnding', 'COAST': 'coast', 'EAST': 'east', 'FAR_WEST': 'farWest', 'NORTH': 'north', 'NORTH_C': 'northC', 'SOUTHERN': 'southern', 'SOUTH_C': 'southC', 'WEST': 'west', 'TOTAL': 'total', 'DSTFlag': 'DSTFlag'}, {'operatingDay': '%m/%d/%Y'}, member='*.csv', datetimes=None, variants=())
+
def act_sys_load_by_wzn(self, *, operatingDayFrom: date | None = None, operatingDayTo: date | None = None, hourEnding: str | None = None, coastFrom: Decimal | None = None, coastTo: Decimal | None = None, eastFrom: Decimal | None = None, eastTo: Decimal | None = None, farWestFrom: Decimal | None = None, farWestTo: Decimal | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, northCFrom: Decimal | None = None, northCTo: Decimal | None = None, southernFrom: Decimal | None = None, southernTo: Decimal | None = None, southCFrom: Decimal | None = None, southCTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, totalFrom: Decimal | None = None, totalTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_345_cd.ActSysLoadByWznRow]:
'Actual System Load by Weather Zone'
return self._client._page('/np6-345-cd/act_sys_load_by_wzn', np6_345_cd.ActSysLoadByWznRow, {'operatingDayFrom': operatingDayFrom, 'operatingDayTo': operatingDayTo, 'hourEnding': hourEnding, 'coastFrom': coastFrom, 'coastTo': coastTo, 'eastFrom': eastFrom, 'eastTo': eastTo, 'farWestFrom': farWestFrom, 'farWestTo': farWestTo, 'northFrom': northFrom, 'northTo': northTo, 'northCFrom': northCFrom, 'northCTo': northCTo, 'southernFrom': southernFrom, 'southernTo': southernTo, 'southCFrom': southCFrom, 'southCTo': southCTo, 'westFrom': westFrom, 'westTo': westTo, 'totalFrom': totalFrom, 'totalTo': totalTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7131,6 +11540,11 @@ class ActSysLoadByFznRow(Row):
total: Decimal | None
west: Decimal | None
+ @property
+ def act_sys_load_by_fzn_history(self) -> Archive[np6_346_cd.ActSysLoadByFznRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-346-cd', np6_346_cd.ActSysLoadByFznRow, {'OperDay': 'operatingDay', 'HourEnding': 'hourEnding', 'NORTH': 'north', 'SOUTH': 'south', 'WEST': 'west', 'HOUSTON': 'houston', 'TOTAL': 'total', 'DSTFlag': 'DSTFlag'}, {'operatingDay': '%m/%d/%Y'}, member='*.csv', datetimes=None, variants=())
+
def act_sys_load_by_fzn(self, *, operatingDayFrom: date | None = None, operatingDayTo: date | None = None, hourEnding: str | None = None, northFrom: Decimal | None = None, northTo: Decimal | None = None, southFrom: Decimal | None = None, southTo: Decimal | None = None, westFrom: Decimal | None = None, westTo: Decimal | None = None, houstonFrom: Decimal | None = None, houstonTo: Decimal | None = None, totalFrom: Decimal | None = None, totalTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_346_cd.ActSysLoadByFznRow]:
'Actual System Load by Forecast Zone'
return self._client._page('/np6-346-cd/act_sys_load_by_fzn', np6_346_cd.ActSysLoadByFznRow, {'operatingDayFrom': operatingDayFrom, 'operatingDayTo': operatingDayTo, 'hourEnding': hourEnding, 'northFrom': northFrom, 'northTo': northTo, 'southFrom': southFrom, 'southTo': southTo, 'westFrom': westFrom, 'westTo': westTo, 'houstonFrom': houstonFrom, 'houstonTo': houstonTo, 'totalFrom': totalFrom, 'totalTo': totalTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7159,6 +11573,11 @@ class SeLdRptErcotGenRow(Row):
seMVAR: Decimal | None
seMW: Decimal | None
+ @property
+ def se_ld_rpt_ercot_gen_history(self) -> Archive[np6_625_cd.SeLdRptErcotGenRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-625-cd', np6_625_cd.SeLdRptErcotGenRow, {'SE_EXE_TIME': 'seExeTime', 'SE_EXE_TIME_DST': 'seExeTimeDST', 'SE_MW': 'seMW', 'SE_MVAR': 'seMVAR', 'SCADA_MW': 'scadaMW', 'SCADA_MVAR': 'scadaMVAR'}, {}, member='*.csv', datetimes={'seExeTime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def se_ld_rpt_ercot_gen(self, *, scadaMWFrom: Decimal | None = None, scadaMWTo: Decimal | None = None, seExeTimeFrom: datetime | None = None, seExeTimeTo: datetime | None = None, seExeTimeDST: str | None = None, seMWFrom: Decimal | None = None, seMWTo: Decimal | None = None, seMVARFrom: Decimal | None = None, seMVARTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_625_cd.SeLdRptErcotGenRow]:
'State Estimator Load Report - Total ERCOT Generation'
return self._client._page('/np6-625-cd/se_ld_rpt_ercot_gen', np6_625_cd.SeLdRptErcotGenRow, {'scadaMWFrom': scadaMWFrom, 'scadaMWTo': scadaMWTo, 'seExeTimeFrom': seExeTimeFrom, 'seExeTimeTo': seExeTimeTo, 'seExeTimeDST': seExeTimeDST, 'seMWFrom': seMWFrom, 'seMWTo': seMWTo, 'seMVARFrom': seMVARFrom, 'seMVARTo': seMVARTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7186,6 +11605,11 @@ class SeLoadDctiesFlowsRow(Row):
TEIDTIE: Decimal | None
TIELineId: str | None
+ @property
+ def se_load_dcties_flows_history(self) -> Archive[np6_626_cd.SeLoadDctiesFlowsRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-626-cd', np6_626_cd.SeLoadDctiesFlowsRow, {'TAGCLAST_TIME': 'TAGCTimestamp', 'TAGCLAST_TIME_DST': 'TAGCTimeDST', 'TIE_LINE_ID': 'TIELineId', 'MW_TIE': 'MWTIE', 'TEID_TIE': 'TEIDTIE'}, {}, member='*.csv', datetimes={'TAGCTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def se_load_dcties_flows(self, *, TAGCTimestampFrom: datetime | None = None, TAGCTimestampTo: datetime | None = None, TAGCTimeDST: str | None = None, TIELineId: str | None = None, MWTIEFrom: Decimal | None = None, MWTIETo: Decimal | None = None, TEIDTIEFrom: Decimal | None = None, TEIDTIETo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_626_cd.SeLoadDctiesFlowsRow]:
'State Estimator Load Report - DC Ties Flows'
return self._client._page('/np6-626-cd/se_load_dcties_flows', np6_626_cd.SeLoadDctiesFlowsRow, {'TAGCTimestampFrom': TAGCTimestampFrom, 'TAGCTimestampTo': TAGCTimestampTo, 'TAGCTimeDST': TAGCTimeDST, 'TIELineId': TIELineId, 'MWTIEFrom': MWTIEFrom, 'MWTIETo': MWTIETo, 'TEIDTIEFrom': TEIDTIEFrom, 'TEIDTIETo': TEIDTIETo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7213,6 +11637,19 @@ class LmpElectricalBusRow(Row):
repeatedHourFlag: bool | None
uncappedLMP: Decimal | None
+ class LmpElectricalBusHistoryRow(Row):
+ SCEDTimestamp: datetime | None
+ repeatedHourFlag: bool | None
+ electricalBus: str | None
+ cappedLMP: Decimal | None = None
+ uncappedLMP: Decimal | None = None
+ LMP: Decimal | None = None
+
+ @property
+ def lmp_electrical_bus_history(self) -> Archive[np6_787_cd.LmpElectricalBusHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-787-cd', np6_787_cd.LmpElectricalBusHistoryRow, {'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatedHourFlag', 'ElectricalBus': 'electricalBus', 'CappedLMP': 'cappedLMP', 'UncappedLMP': 'uncappedLMP'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=({'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatedHourFlag', 'ElectricalBus': 'electricalBus', 'LMP': 'LMP'},))
+
def lmp_electrical_bus(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatedHourFlag: bool | None = None, electricalBus: str | None = None, cappedLMPFrom: Decimal | None = None, cappedLMPTo: Decimal | None = None, uncappedLMPFrom: Decimal | None = None, uncappedLMPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_787_cd.LmpElectricalBusRow]:
'LMP by Electrical Bus'
return self._client._page('/np6-787-cd/lmp_electrical_bus', np6_787_cd.LmpElectricalBusRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatedHourFlag': repeatedHourFlag, 'electricalBus': electricalBus, 'cappedLMPFrom': cappedLMPFrom, 'cappedLMPTo': cappedLMPTo, 'uncappedLMPFrom': uncappedLMPFrom, 'uncappedLMPTo': uncappedLMPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7239,6 +11676,11 @@ class LmpNodeZoneHubRow(Row):
repeatHourFlag: bool | None
settlementPoint: str | None
+ @property
+ def lmp_node_zone_hub_history(self) -> Archive[np6_788_cd.LmpNodeZoneHubRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-788-cd', np6_788_cd.LmpNodeZoneHubRow, {'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'SettlementPoint': 'settlementPoint', 'LMP': 'LMP'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def lmp_node_zone_hub(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, settlementPoint: str | None = None, LMPFrom: Decimal | None = None, LMPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_788_cd.LmpNodeZoneHubRow]:
'LMPs by Resource Nodes, Load Zones and Trading Hubs'
return self._client._page('/np6-788-cd/lmp_node_zone_hub', np6_788_cd.LmpNodeZoneHubRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'settlementPoint': settlementPoint, 'LMPFrom': LMPFrom, 'LMPTo': LMPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7255,6 +11697,149 @@ def lmp_node_zone_hub_iter_async(self, *, SCEDTimestampFrom: datetime | None = N
'LMPs by Resource Nodes, Load Zones and Trading Hubs'
return self._client._aiter('/np6-788-cd/lmp_node_zone_hub', np6_788_cd.LmpNodeZoneHubRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'settlementPoint': settlementPoint, 'LMPFrom': LMPFrom, 'LMPTo': LMPTo, 'size': size, 'sort': sort, 'dir': dir})
+class np6_792_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class PriceAddersHistoryRow(Row):
+ sourceSheet: str | None = None
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ systemLambda: Decimal | None
+ RTRDPA: Decimal | None = None
+ RTRDPARUS: Decimal | None = None
+ RTRDPARDS: Decimal | None = None
+ RTRDPARRS: Decimal | None = None
+ RTRDPAECRS: Decimal | None = None
+ RTRDPANSS: Decimal | None = None
+ RTRRUC: Decimal | None
+ RTRRMR: Decimal | None
+ RTDNCLR: Decimal | None
+ RTDERS: Decimal | None
+ RTDCTIEIMPORT: Decimal | None = None
+ RTDCTIEEXPORT: Decimal | None = None
+ RTBLTIMPORT: Decimal | None = None
+ RTBLTEXPORT: Decimal | None = None
+ RTOLLSL: Decimal | None = None
+ RTOLHSL: Decimal | None
+ RTDLL: Decimal | None = None
+ batchId: int | None = None
+ PRC: Decimal | None = None
+ RTOLCAP: Decimal | None = None
+ RTOFFCAP: Decimal | None = None
+ RTORPA: Decimal | None = None
+ RTOFFPA: Decimal | None = None
+ RTBP: Decimal | None = None
+ RTOLNSRS: Decimal | None = None
+ RTCLRCAP: Decimal | None = None
+ RTCLRBP: Decimal | None = None
+ RTCLRLSL: Decimal | None = None
+ RTCLRNS: Decimal | None = None
+ RTCLRREG: Decimal | None = None
+ RTNCLRRRS: Decimal | None = None
+ RTCST30HSL: Decimal | None = None
+ RTOFFNSHSL: Decimal | None = None
+ RTOFF10: Decimal | None = None
+ RTOFF30: Decimal | None = None
+ RTORDPA: Decimal | None = None
+ RTOLLASL: Decimal | None = None
+ RTOLHASL: Decimal | None = None
+ RTRUCCST30HSL: Decimal | None = None
+ RTNCLRNSCAP: Decimal | None = None
+
+ @property
+ def price_adders_history(self) -> WorkbookArchive[np6_792_er.PriceAddersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np6-792-er', np6_792_er.PriceAddersHistoryRow, {' SCED Timestamp ': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'System Lamda': 'systemLambda', 'RTRDPA': 'RTRDPA', 'RTRDPARUS': 'RTRDPARUS', 'RTRDPARDS': 'RTRDPARDS', 'RTRDPARRS': 'RTRDPARRS', 'RTRDPAECRS': 'RTRDPAECRS', 'RTRDPANSS': 'RTRDPANSS', 'RTRRUC': 'RTRRUC', 'RTRRMR': 'RTRRMR', 'RTDNCLR': 'RTDNCLR', 'RTDERS': 'RTDERS', 'RTDCTIEIMPORT': 'RTDCTIEIMPORT', 'RTDCTIEEXPORT': 'RTDCTIEEXPORT', 'RTBLTIMPORT': 'RTBLTIMPORT', 'RTBLTEXPORT': 'RTBLTEXPORT', 'RTOLLSL': 'RTOLLSL', 'RTOLHSL': 'RTOLHSL', 'RTDLL': 'RTDLL'}, {}, sheets=('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), variants=({'Batch ID': 'batchId', ' SCED Timestamp ': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'System Lamda': 'systemLambda', 'PRC': 'PRC', 'RTOLCAP': 'RTOLCAP', 'RTOFFCAP': 'RTOFFCAP', 'RTORPA': 'RTORPA', 'RTOFFPA': 'RTOFFPA', 'RTOLHSL': 'RTOLHSL', 'RTBP': 'RTBP', 'RTOLNSRS': 'RTOLNSRS', 'RTCLRCAP': 'RTCLRCAP', 'RTCLRBP': 'RTCLRBP', 'RTCLRLSL': 'RTCLRLSL', 'RTCLRNS': 'RTCLRNS', 'RTCLRREG': 'RTCLRREG', 'RTNCLRRRS': 'RTNCLRRRS', 'RTCST30HSL': 'RTCST30HSL', 'RTOFFNSHSL': 'RTOFFNSHSL', 'RTOFF10': 'RTOFF10', 'RTOFF30': 'RTOFF30', 'RTORDPA': 'RTORDPA', 'RTRRUC': 'RTRRUC', 'RTRRMR': 'RTRRMR', 'RTDNCLR': 'RTDNCLR', 'RTDERS': 'RTDERS', 'RTOLLASL': 'RTOLLASL', 'RTOLHASL': 'RTOLHASL'}, {'Batch ID': 'batchId', ' SCED Timestamp ': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'System Lamda': 'systemLambda', 'PRC': 'PRC', 'RTOLCAP': 'RTOLCAP', 'RTOFFCAP': 'RTOFFCAP', 'RTORPA': 'RTORPA', 'RTOFFPA': 'RTOFFPA', 'RTOLHSL': 'RTOLHSL', 'RTBP': 'RTBP', 'RTOLNSRS': 'RTOLNSRS', 'RTCLRCAP': 'RTCLRCAP', 'RTCLRBP': 'RTCLRBP', 'RTCLRLSL': 'RTCLRLSL', 'RTCLRNS': 'RTCLRNS', 'RTCLRREG': 'RTCLRREG', 'RTNCLRRRS': 'RTNCLRRRS', 'RTCST30HSL': 'RTCST30HSL', 'RTOFFNSHSL': 'RTOFFNSHSL', 'RTRUCCST30HSL': 'RTRUCCST30HSL', 'RTORDPA': 'RTORDPA', 'RTRRUC': 'RTRRUC', 'RTRRMR': 'RTRRMR', 'RTDNCLR': 'RTDNCLR', 'RTDERS': 'RTDERS', 'RTDCTIEIMPORT': 'RTDCTIEIMPORT', 'RTDCTIEEXPORT': 'RTDCTIEEXPORT', 'RTBLTIMPORT': 'RTBLTIMPORT', 'RTBLTEXPORT': 'RTBLTEXPORT', 'RTOLLASL': 'RTOLLASL', 'RTOLHASL': 'RTOLHASL'}, {'Batch ID': 'batchId', ' SCED Timestamp ': 'SCEDTimestamp', 'Repeated Hour Flag': 'repeatHourFlag', 'System Lamda': 'systemLambda', 'PRC': 'PRC', 'RTOLCAP': 'RTOLCAP', 'RTOFFCAP': 'RTOFFCAP', 'RTORPA': 'RTORPA', 'RTOFFPA': 'RTOFFPA', 'RTOLHSL': 'RTOLHSL', 'RTBP': 'RTBP', 'RTOLNSRS': 'RTOLNSRS', 'RTCLRCAP': 'RTCLRCAP', 'RTCLRBP': 'RTCLRBP', 'RTCLRLSL': 'RTCLRLSL', 'RTCLRNS': 'RTCLRNS', 'RTCLRREG': 'RTCLRREG', 'RTNCLRRRS': 'RTNCLRRRS', 'RTCST30HSL': 'RTCST30HSL', 'RTOFFNSHSL': 'RTOFFNSHSL', 'RTRUCCST30HSL': 'RTRUCCST30HSL', 'RTORDPA': 'RTORDPA', 'RTRRUC': 'RTRRUC', 'RTRRMR': 'RTRRMR', 'RTDNCLR': 'RTDNCLR', 'RTDERS': 'RTDERS', 'RTDCTIEIMPORT': 'RTDCTIEIMPORT', 'RTDCTIEEXPORT': 'RTDCTIEEXPORT', 'RTBLTIMPORT': 'RTBLTIMPORT', 'RTBLTEXPORT': 'RTBLTEXPORT', 'RTOLLASL': 'RTOLLASL', 'RTOLHASL': 'RTOLHASL', 'RTNCLRNSCAP': 'RTNCLRNSCAP'}))
+
+class np6_793_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class PriceAddersHistoryRow(Row):
+ sourceSheet: str | None = None
+ deliveryDate: date | None
+ deliveryHour: int | None
+ deliveryInterval: int | None
+ repeatHourFlag: bool | None
+ RTRDPA: Decimal | None = None
+ RTRDPRU: Decimal | None = None
+ RTRDPRD: Decimal | None = None
+ RTRDPRRS: Decimal | None = None
+ RTRDPECRS: Decimal | None = None
+ RTRDPNS: Decimal | None = None
+ RTRSVPOR: Decimal | None = None
+ RTRSVPOFF: Decimal | None = None
+ RTRDP: Decimal | None = None
+
+ @property
+ def price_adders_history(self) -> WorkbookArchive[np6_793_er.PriceAddersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np6-793-er', np6_793_er.PriceAddersHistoryRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'RepeatedHourFlag': 'repeatHourFlag', 'RTRDPA': 'RTRDPA', 'RTRDPRU': 'RTRDPRU', 'RTRDPRD': 'RTRDPRD', 'RTRDPRRS': 'RTRDPRRS', 'RTRDPECRS': 'RTRDPECRS', 'RTRDPNS': 'RTRDPNS'}, {}, sheets=('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), variants=({'DeliveryDate': 'deliveryDate', 'DeliveryHour ': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'RepeatedHourFlag': 'repeatHourFlag', 'RTRSVPOR': 'RTRSVPOR', 'RTRSVPOFF': 'RTRSVPOFF', 'RTRDP': 'RTRDP'}, {'DeliveryDate': 'deliveryDate', ' DeliveryHour ': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'RepeatedHourFlag': 'repeatHourFlag', 'RTRSVPOR': 'RTRSVPOR', 'RTRSVPOFF': 'RTRSVPOFF', 'RTRDP': 'RTRDP'}, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'RepeatedHourFlag': 'repeatHourFlag', 'RTRSVPOR': 'RTRSVPOR', 'RTRSVPOFF': 'RTRSVPOFF', 'RTRDP': 'RTRDP'}, {'DeliveryDate': 'deliveryDate', 'DeliveryHour ': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'RepeatedHourFlag': 'repeatHourFlag', 'RTRSVPOR': 'RTRSVPOR', 'RTRSVPOFF': 'RTRSVPOFF', 'RTRDP': 'RTRDP'}))
+
+class np6_794_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class CapabilityHistoryRow(Row):
+ sourceSheet: str | None = None
+ SCEDTimestamp: datetime | None
+ repeatHourFlag: bool | None
+ CapREGUPTotal: Decimal | None
+ CapREGDNTotal: Decimal | None
+ CapRRSTotal: Decimal | None
+ CapECRSTotal: Decimal | None
+ CapNSPINTotal: Decimal | None
+ CapREGUP_RRSTotal: Decimal | None
+ CapREGUP_RRS_ECRSTotal: Decimal | None
+ CapREGUP_RRS_ECRS_NSPINTotal: Decimal | None
+
+ @property
+ def capability_history(self) -> WorkbookArchive[np6_794_er.CapabilityHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np6-794-er', np6_794_er.CapabilityHistoryRow, {'SCEDTimestamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'CapREGUPTotal': 'CapREGUPTotal', 'CapREGDNTotal': 'CapREGDNTotal', 'CapRRSTotal': 'CapRRSTotal', 'CapECRSTotal': 'CapECRSTotal', 'CapNSPINTotal': 'CapNSPINTotal', 'CapREGUP_RRSTotal': 'CapREGUP_RRSTotal', 'CapREGUP_RRS_ECRSTotal': 'CapREGUP_RRS_ECRSTotal', 'CapREGUP_RRS_ECRS_NSPINTotal': 'CapREGUP_RRS_ECRS_NSPINTotal'}, {}, sheets=('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), variants=())
+
+class np6_795_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class ClearingPricesHistoryRow(Row):
+ sourceSheet: str | None = None
+ SCEDTimestamp: datetime | None
+ ASType: str | None
+ cappedMCPC: Decimal | None = None
+ uncappedMCPC: Decimal | None = None
+ repeatHourFlag: bool | None
+ MCPC: Decimal | None = None
+
+ @property
+ def clearing_prices_history(self) -> WorkbookArchive[np6_795_er.ClearingPricesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np6-795-er', np6_795_er.ClearingPricesHistoryRow, {'SCED Timestamp': 'SCEDTimestamp', 'AS Type': 'ASType', 'CAPPED_MCPC': 'cappedMCPC', 'UNCAPPED_MCPC': 'uncappedMCPC', 'Repeated Hour Flag': 'repeatHourFlag'}, {}, sheets=('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), variants=({'SCED Timestamp': 'SCEDTimestamp', 'AS Type': 'ASType', 'MCPC': 'MCPC', 'Repeated Hour Flag': 'repeatHourFlag'},))
+
+class np6_796_er:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class ClearingPricesHistoryRow(Row):
+ sourceSheet: str | None = None
+ deliveryDate: date | None
+ deliveryHour: int | None
+ deliveryInterval: int | None
+ ASType: str | None
+ MCPC: Decimal | None
+ repeatHourFlag: bool | None
+
+ @property
+ def clearing_prices_history(self) -> WorkbookArchive[np6_796_er.ClearingPricesHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return WorkbookArchive(self._client, 'np6-796-er', np6_796_er.ClearingPricesHistoryRow, {'Delivery Date': 'deliveryDate', 'Delivery Hour': 'deliveryHour', 'Delivery Interval': 'deliveryInterval', 'AS Type': 'ASType', 'MCPC': 'MCPC', 'Repeated Hour Flag': 'repeatHourFlag'}, {}, sheets=('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), variants=())
+
class np6_86_cd:
def __init__(self, client: Transport) -> None:
self._client = client
@@ -7276,6 +11861,11 @@ class ShdwPricesBndTrnsConstRow(Row):
value: Decimal | None
violatedMW: Decimal | None
+ @property
+ def shdw_prices_bnd_trns_const_history(self) -> Archive[np6_86_cd.ShdwPricesBndTrnsConstRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-86-cd', np6_86_cd.ShdwPricesBndTrnsConstRow, {'SCEDTimeStamp': 'SCEDTimestamp', 'RepeatedHourFlag': 'repeatedHourFlag', 'ConstraintID': 'constraintID', 'ConstraintName': 'constraintName', 'ContingencyName': 'contingencyName', 'ShadowPrice': 'shadowPrice', 'MaxShadowPrice': 'maxShadowPrice', 'Limit': 'limit', 'Value': 'value', 'ViolatedMW': 'violatedMW', 'FromStation': 'fromStation', 'ToStation': 'toStation', 'FromStationkV': 'fromStationkV', 'ToStationkV': 'toStationkV', 'CCTStatus': 'CCTStatus'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def shdw_prices_bnd_trns_const(self, *, fromStation: str | None = None, toStation: str | None = None, fromStationkVFrom: Decimal | None = None, fromStationkVTo: Decimal | None = None, toStationkVFrom: Decimal | None = None, toStationkVTo: Decimal | None = None, CCTStatus: str | None = None, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatedHourFlag: bool | None = None, constraintIDFrom: int | None = None, constraintIDTo: int | None = None, constraintName: str | None = None, contingencyName: str | None = None, shadowPriceFrom: Decimal | None = None, shadowPriceTo: Decimal | None = None, maxShadowPriceFrom: Decimal | None = None, maxShadowPriceTo: Decimal | None = None, limitFrom: Decimal | None = None, limitTo: Decimal | None = None, valueFrom: Decimal | None = None, valueTo: Decimal | None = None, violatedMWFrom: Decimal | None = None, violatedMWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_86_cd.ShdwPricesBndTrnsConstRow]:
'SCED Shadow Prices and Binding Transmission Constraints'
return self._client._page('/np6-86-cd/shdw_prices_bnd_trns_const', np6_86_cd.ShdwPricesBndTrnsConstRow, {'fromStation': fromStation, 'toStation': toStation, 'fromStationkVFrom': fromStationkVFrom, 'fromStationkVTo': fromStationkVTo, 'toStationkVFrom': toStationkVFrom, 'toStationkVTo': toStationkVTo, 'CCTStatus': CCTStatus, 'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatedHourFlag': repeatedHourFlag, 'constraintIDFrom': constraintIDFrom, 'constraintIDTo': constraintIDTo, 'constraintName': constraintName, 'contingencyName': contingencyName, 'shadowPriceFrom': shadowPriceFrom, 'shadowPriceTo': shadowPriceTo, 'maxShadowPriceFrom': maxShadowPriceFrom, 'maxShadowPriceTo': maxShadowPriceTo, 'limitFrom': limitFrom, 'limitTo': limitTo, 'valueFrom': valueFrom, 'valueTo': valueTo, 'violatedMWFrom': violatedMWFrom, 'violatedMWTo': violatedMWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7305,6 +11895,11 @@ class SppNodeZoneHubRow(Row):
settlementPointPrice: Decimal | None
settlementPointType: str | None
+ @property
+ def spp_node_zone_hub_history(self) -> Archive[np6_905_cd.SppNodeZoneHubRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-905-cd', np6_905_cd.SppNodeZoneHubRow, {'DeliveryDate': 'deliveryDate', 'DeliveryHour': 'deliveryHour', 'DeliveryInterval': 'deliveryInterval', 'SettlementPointName': 'settlementPoint', 'SettlementPointType': 'settlementPointType', 'SettlementPointPrice': 'settlementPointPrice', 'DSTFlag': 'DSTFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes=None, variants=())
+
def spp_node_zone_hub(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, deliveryHourFrom: int | None = None, deliveryHourTo: int | None = None, deliveryIntervalFrom: int | None = None, deliveryIntervalTo: int | None = None, settlementPoint: str | None = None, settlementPointType: str | None = None, settlementPointPriceFrom: Decimal | None = None, settlementPointPriceTo: Decimal | None = None, DSTFlag: bool | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_905_cd.SppNodeZoneHubRow]:
'Settlement Point Prices at Resource Nodes, Hubs and Load Zones'
return self._client._page('/np6-905-cd/spp_node_zone_hub', np6_905_cd.SppNodeZoneHubRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'deliveryHourFrom': deliveryHourFrom, 'deliveryHourTo': deliveryHourTo, 'deliveryIntervalFrom': deliveryIntervalFrom, 'deliveryIntervalTo': deliveryIntervalTo, 'settlementPoint': settlementPoint, 'settlementPointType': settlementPointType, 'settlementPointPriceFrom': settlementPointPriceFrom, 'settlementPointPriceTo': settlementPointPriceTo, 'DSTFlag': DSTFlag, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7332,6 +11927,11 @@ class SumHdlLdlRow(Row):
sumHDL: Decimal | None
sumLDL: Decimal | None
+ @property
+ def sum_hdl_ldl_history(self) -> Archive[np6_915_cd.SumHdlLdlRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-915-cd', np6_915_cd.SumHdlLdlRow, {'SCED_TimeStamp': 'SCEDTimestamp', 'Repeated_Hour_Flag': 'repeatHourFlag', 'GTBD': 'GTBD', 'SUM_HDL': 'sumHDL', 'SUM_LDL': 'sumLDL'}, {}, member='*.csv', datetimes={'SCEDTimestamp': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def sum_hdl_ldl(self, *, SCEDTimestampFrom: datetime | None = None, SCEDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, GTBDFrom: Decimal | None = None, GTBDTo: Decimal | None = None, sumHDLFrom: Decimal | None = None, sumHDLTo: Decimal | None = None, sumLDLFrom: Decimal | None = None, sumLDLTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_915_cd.SumHdlLdlRow]:
'Summary Report of HDL and LDL'
return self._client._page('/np6-915-cd/sum_hdl_ldl', np6_915_cd.SumHdlLdlRow, {'SCEDTimestampFrom': SCEDTimestampFrom, 'SCEDTimestampTo': SCEDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'GTBDFrom': GTBDFrom, 'GTBDTo': GTBDTo, 'sumHDLFrom': sumHDLFrom, 'sumHDLTo': sumHDLTo, 'sumLDLFrom': sumLDLFrom, 'sumLDLTo': sumLDLTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7362,6 +11962,11 @@ class RtdLmpNodeZoneHubRow(Row):
settlementPoint: str | None
settlementPointType: str | None
+ @property
+ def rtd_lmp_node_zone_hub_history(self) -> Archive[np6_970_cd.RtdLmpNodeZoneHubRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np6-970-cd', np6_970_cd.RtdLmpNodeZoneHubRow, {'RTDTimestamp': 'RTDTimestamp', 'RepeatedHourFlag': 'repeatHourFlag', 'IntervalId': 'intervalId', 'IntervalEnding': 'intervalEnding', 'IntervalRepeatedHourFlag': 'intervalRepeatHourFlag', 'SettlementPoint': 'settlementPoint', 'SettlementPointType': 'settlementPointType', 'LMP': 'LMP'}, {}, member='*.csv', datetimes={'RTDTimestamp': '%m/%d/%Y %H:%M:%S', 'intervalEnding': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def rtd_lmp_node_zone_hub(self, *, RTDTimestampFrom: datetime | None = None, RTDTimestampTo: datetime | None = None, repeatHourFlag: bool | None = None, intervalIdFrom: int | None = None, intervalIdTo: int | None = None, intervalEndingFrom: datetime | None = None, intervalEndingTo: datetime | None = None, intervalRepeatHourFlag: bool | None = None, settlementPoint: str | None = None, settlementPointType: str | None = None, LMPFrom: Decimal | None = None, LMPTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np6_970_cd.RtdLmpNodeZoneHubRow]:
'RTD Indicative LMPs by Resource Nodes, Load Zones and Hubs'
return self._client._page('/np6-970-cd/rtd_lmp_node_zone_hub', np6_970_cd.RtdLmpNodeZoneHubRow, {'RTDTimestampFrom': RTDTimestampFrom, 'RTDTimestampTo': RTDTimestampTo, 'repeatHourFlag': repeatHourFlag, 'intervalIdFrom': intervalIdFrom, 'intervalIdTo': intervalIdTo, 'intervalEndingFrom': intervalEndingFrom, 'intervalEndingTo': intervalEndingTo, 'intervalRepeatHourFlag': intervalRepeatHourFlag, 'settlementPoint': settlementPoint, 'settlementPointType': settlementPointType, 'LMPFrom': LMPFrom, 'LMPTo': LMPTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7391,6 +11996,20 @@ class DamPtpOptionPriceReportRow(Row):
sink: str | None
source: str | None
+ class DamPtpOptionPriceReportHistoryRow(Row):
+ postedDatetime: datetime | None = None
+ deliveryDate: date | None
+ hourEnding: str | None
+ price: Decimal | None
+ source: str | None
+ sink: str | None
+ repeatedHourFlag: bool | None
+
+ @property
+ def dam_ptp_option_price_report_history(self) -> Archive[np7_464_cd.DamPtpOptionPriceReportHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np7-464-cd', np7_464_cd.DamPtpOptionPriceReportHistoryRow, {'DeliveryDate': 'deliveryDate', 'HourEnding': 'hourEnding', 'Price': 'price', 'Source': 'source', 'Sink': 'sink', 'DSTFlag': 'repeatedHourFlag'}, {'deliveryDate': '%m/%d/%Y'}, member='*.csv', datetimes={'postedDatetime': '%m/%d/%Y %H:%M:%S'}, variants=())
+
def dam_ptp_option_price_report(self, *, deliveryDateFrom: date | None = None, deliveryDateTo: date | None = None, hourEnding: str | None = None, priceFrom: Decimal | None = None, priceTo: Decimal | None = None, source: str | None = None, sink: str | None = None, repeatedHourFlag: bool | None = None, postedDatetimeFrom: datetime | None = None, postedDatetimeTo: datetime | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[np7_464_cd.DamPtpOptionPriceReportRow]:
'Day Ahead Point-to-Point Option Price Report'
return self._client._page('/np7-464-cd/dam_ptp_option_price_report', np7_464_cd.DamPtpOptionPriceReportRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'priceFrom': priceFrom, 'priceTo': priceTo, 'source': source, 'sink': sink, 'repeatedHourFlag': repeatedHourFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
@@ -7407,13 +12026,48 @@ def dam_ptp_option_price_report_iter_async(self, *, deliveryDateFrom: date | Non
'Day Ahead Point-to-Point Option Price Report'
return self._client._aiter('/np7-464-cd/dam_ptp_option_price_report', np7_464_cd.DamPtpOptionPriceReportRow, {'deliveryDateFrom': deliveryDateFrom, 'deliveryDateTo': deliveryDateTo, 'hourEnding': hourEnding, 'priceFrom': priceFrom, 'priceTo': priceTo, 'source': source, 'sink': sink, 'repeatedHourFlag': repeatedHourFlag, 'postedDatetimeFrom': postedDatetimeFrom, 'postedDatetimeTo': postedDatetimeTo, 'size': size, 'sort': sort, 'dir': dir})
+class np7_535_sg:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+
+ class PathAddersHistoryRow(Row):
+ targetDate: date | None
+ source: str | None
+ sink: str | None
+ timeOfUse: str | None
+ startDate: date | None
+ ACI99: Decimal | None
+ ACP: Decimal | None
+
+ @property
+ def path_adders_history(self) -> Archive[np7_535_sg.PathAddersHistoryRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'np7-535-sg', np7_535_sg.PathAddersHistoryRow, {'TargetDate': 'targetDate', 'Source': 'source', 'Sink': 'sink', 'TimeOfUse': 'timeOfUse', 'StartDate': 'startDate', 'ACI99': 'ACI99', 'ACP': 'ACP'}, {'targetDate': '%m/%d/%Y', 'startDate': '%m/%d/%Y'}, member='*.CSV', datetimes=None, variants=())
+
class Client(Transport):
"""ERCOT public data, with generated typed product methods."""
+ @property
+ def copg_316(self) -> copg_316:
+ return copg_316(self)
+
+ @property
+ def eia_930_cd(self) -> eia_930_cd:
+ return eia_930_cd(self)
+
+ @property
+ def eia_930_er(self) -> eia_930_er:
+ return eia_930_er(self)
+
@property
def gen_55_cd(self) -> gen_55_cd:
return gen_55_cd(self)
+ @property
+ def np1_300(self) -> np1_300:
+ return np1_300(self)
+
@property
def np1_301(self) -> np1_301:
return np1_301(self)
@@ -7422,6 +12076,14 @@ def np1_301(self) -> np1_301:
def np1_302(self) -> np1_302:
return np1_302(self)
+ @property
+ def np1_346_er(self) -> np1_346_er:
+ return np1_346_er(self)
+
+ @property
+ def np3_108(self) -> np3_108:
+ return np3_108(self)
+
@property
def np3_161_cd(self) -> np3_161_cd:
return np3_161_cd(self)
@@ -7518,6 +12180,10 @@ def np3_966_er(self) -> np3_966_er:
def np3_987_ex(self) -> np3_987_ex:
return np3_987_ex(self)
+ @property
+ def np3_988_er(self) -> np3_988_er:
+ return np3_988_er(self)
+
@property
def np3_990_ex(self) -> np3_990_ex:
return np3_990_ex(self)
@@ -7618,6 +12284,10 @@ def np4_442_cd(self) -> np4_442_cd:
def np4_443_cd(self) -> np4_443_cd:
return np4_443_cd(self)
+ @property
+ def np4_494_er(self) -> np4_494_er:
+ return np4_494_er(self)
+
@property
def np4_523_cd(self) -> np4_523_cd:
return np4_523_cd(self)
@@ -7670,6 +12340,10 @@ def np4_751_cd(self) -> np4_751_cd:
def np4_752_cd(self) -> np4_752_cd:
return np4_752_cd(self)
+ @property
+ def np4_765_er(self) -> np4_765_er:
+ return np4_765_er(self)
+
@property
def np4_790_cd(self) -> np4_790_cd:
return np4_790_cd(self)
@@ -7682,6 +12356,10 @@ def np4_791_cd(self) -> np4_791_cd:
def np5_108_cd(self) -> np5_108_cd:
return np5_108_cd(self)
+ @property
+ def np5_520_er(self) -> np5_520_er:
+ return np5_520_er(self)
+
@property
def np5_525_cd(self) -> np5_525_cd:
return np5_525_cd(self)
@@ -7778,6 +12456,26 @@ def np6_787_cd(self) -> np6_787_cd:
def np6_788_cd(self) -> np6_788_cd:
return np6_788_cd(self)
+ @property
+ def np6_792_er(self) -> np6_792_er:
+ return np6_792_er(self)
+
+ @property
+ def np6_793_er(self) -> np6_793_er:
+ return np6_793_er(self)
+
+ @property
+ def np6_794_er(self) -> np6_794_er:
+ return np6_794_er(self)
+
+ @property
+ def np6_795_er(self) -> np6_795_er:
+ return np6_795_er(self)
+
+ @property
+ def np6_796_er(self) -> np6_796_er:
+ return np6_796_er(self)
+
@property
def np6_86_cd(self) -> np6_86_cd:
return np6_86_cd(self)
@@ -7797,3 +12495,7 @@ def np6_970_cd(self) -> np6_970_cd:
@property
def np7_464_cd(self) -> np7_464_cd:
return np7_464_cd(self)
+
+ @property
+ def np7_535_sg(self) -> np7_535_sg:
+ return np7_535_sg(self)
diff --git a/tinyercot/_generated_esr.py b/tinyercot/_generated_esr.py
new file mode 100644
index 00000000..4245674f
--- /dev/null
+++ b/tinyercot/_generated_esr.py
@@ -0,0 +1,52 @@
+# Generated by tools/generate_client.py; do not edit.
+from __future__ import annotations
+from collections.abc import AsyncIterator, Iterator
+from datetime import date, datetime, time
+from decimal import Decimal
+from typing import ClassVar
+from ._client import Transport, Page, Row
+from ._history import Archive, EiaHour
+from ._xlsx import WorkbookArchive
+from ._pdf import PdfArchive, PdfChartArchive
+
+__all__ = ['ESRClient', 'rptesr_m']
+class rptesr_m:
+ def __init__(self, client: Transport) -> None:
+ self._client = client
+
+ class _4SecEsrChargingMwRow(Row):
+ AGCExecTime: datetime | None
+ DSTFlag: bool | None
+ AGCExecTimeUTC: datetime | None
+ systemDemand: Decimal | None
+ ESRChargingMW: Decimal | None
+
+ @property
+ def _4_sec_esr_charging_mw_history(self) -> Archive[rptesr_m._4SecEsrChargingMwRow]:
+ """Historical report rows, including files predating the API."""
+ return Archive(self._client, 'rptesr-m', rptesr_m._4SecEsrChargingMwRow, {'AGC_EXEC_TIME': 'AGCExecTime', 'AGC_EXEC_TIME_DST': 'DSTFlag', 'AGC_EXEC_TIME_UTC': 'AGCExecTimeUTC', 'SYSTEM_DEMAND': 'systemDemand', 'ESR_CHARGING_MW': 'ESRChargingMW'}, {}, member='*.csv', datetimes={'AGCExecTime': '%m/%d/%Y %H:%M:%S', 'AGCExecTimeUTC': '%m/%d/%Y %H:%M:%S'}, variants=())
+
+ def _4_sec_esr_charging_mw(self, *, AGCExecTimeFrom: datetime | None = None, AGCExecTimeTo: datetime | None = None, DSTFlag: bool | None = None, AGCExecTimeUTCFrom: datetime | None = None, AGCExecTimeUTCTo: datetime | None = None, systemDemandFrom: Decimal | None = None, systemDemandTo: Decimal | None = None, ESRChargingMWFrom: Decimal | None = None, ESRChargingMWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[rptesr_m._4SecEsrChargingMwRow]:
+ 'Energy Storage Resource Four Second Data'
+ return self._client._page('/rptesr-m/4_sec_esr_charging_mw', rptesr_m._4SecEsrChargingMwRow, {'AGCExecTimeFrom': AGCExecTimeFrom, 'AGCExecTimeTo': AGCExecTimeTo, 'DSTFlag': DSTFlag, 'AGCExecTimeUTCFrom': AGCExecTimeUTCFrom, 'AGCExecTimeUTCTo': AGCExecTimeUTCTo, 'systemDemandFrom': systemDemandFrom, 'systemDemandTo': systemDemandTo, 'ESRChargingMWFrom': ESRChargingMWFrom, 'ESRChargingMWTo': ESRChargingMWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _4_sec_esr_charging_mw_iter(self, *, AGCExecTimeFrom: datetime | None = None, AGCExecTimeTo: datetime | None = None, DSTFlag: bool | None = None, AGCExecTimeUTCFrom: datetime | None = None, AGCExecTimeUTCTo: datetime | None = None, systemDemandFrom: Decimal | None = None, systemDemandTo: Decimal | None = None, ESRChargingMWFrom: Decimal | None = None, ESRChargingMWTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Iterator[rptesr_m._4SecEsrChargingMwRow]:
+ 'Energy Storage Resource Four Second Data'
+ return self._client._iter('/rptesr-m/4_sec_esr_charging_mw', rptesr_m._4SecEsrChargingMwRow, {'AGCExecTimeFrom': AGCExecTimeFrom, 'AGCExecTimeTo': AGCExecTimeTo, 'DSTFlag': DSTFlag, 'AGCExecTimeUTCFrom': AGCExecTimeUTCFrom, 'AGCExecTimeUTCTo': AGCExecTimeUTCTo, 'systemDemandFrom': systemDemandFrom, 'systemDemandTo': systemDemandTo, 'ESRChargingMWFrom': ESRChargingMWFrom, 'ESRChargingMWTo': ESRChargingMWTo, 'size': size, 'sort': sort, 'dir': dir})
+
+ async def _4_sec_esr_charging_mw_async(self, *, AGCExecTimeFrom: datetime | None = None, AGCExecTimeTo: datetime | None = None, DSTFlag: bool | None = None, AGCExecTimeUTCFrom: datetime | None = None, AGCExecTimeUTCTo: datetime | None = None, systemDemandFrom: Decimal | None = None, systemDemandTo: Decimal | None = None, ESRChargingMWFrom: Decimal | None = None, ESRChargingMWTo: Decimal | None = None, page: int | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> Page[rptesr_m._4SecEsrChargingMwRow]:
+ 'Energy Storage Resource Four Second Data'
+ return await self._client._apage('/rptesr-m/4_sec_esr_charging_mw', rptesr_m._4SecEsrChargingMwRow, {'AGCExecTimeFrom': AGCExecTimeFrom, 'AGCExecTimeTo': AGCExecTimeTo, 'DSTFlag': DSTFlag, 'AGCExecTimeUTCFrom': AGCExecTimeUTCFrom, 'AGCExecTimeUTCTo': AGCExecTimeUTCTo, 'systemDemandFrom': systemDemandFrom, 'systemDemandTo': systemDemandTo, 'ESRChargingMWFrom': ESRChargingMWFrom, 'ESRChargingMWTo': ESRChargingMWTo, 'page': page, 'size': size, 'sort': sort, 'dir': dir})
+
+ def _4_sec_esr_charging_mw_iter_async(self, *, AGCExecTimeFrom: datetime | None = None, AGCExecTimeTo: datetime | None = None, DSTFlag: bool | None = None, AGCExecTimeUTCFrom: datetime | None = None, AGCExecTimeUTCTo: datetime | None = None, systemDemandFrom: Decimal | None = None, systemDemandTo: Decimal | None = None, ESRChargingMWFrom: Decimal | None = None, ESRChargingMWTo: Decimal | None = None, size: int | None = None, sort: str | None = None, dir: str | None = None) -> AsyncIterator[rptesr_m._4SecEsrChargingMwRow]:
+ 'Energy Storage Resource Four Second Data'
+ return self._client._aiter('/rptesr-m/4_sec_esr_charging_mw', rptesr_m._4SecEsrChargingMwRow, {'AGCExecTimeFrom': AGCExecTimeFrom, 'AGCExecTimeTo': AGCExecTimeTo, 'DSTFlag': DSTFlag, 'AGCExecTimeUTCFrom': AGCExecTimeUTCFrom, 'AGCExecTimeUTCTo': AGCExecTimeUTCTo, 'systemDemandFrom': systemDemandFrom, 'systemDemandTo': systemDemandTo, 'ESRChargingMWFrom': ESRChargingMWFrom, 'ESRChargingMWTo': ESRChargingMWTo, 'size': size, 'sort': sort, 'dir': dir})
+
+class ESRClient(Transport):
+ """ERCOT public data, with generated typed product methods."""
+ _base_url = "https://api.ercot.com/api/public-data"
+ _subscription_key_env = "ERCOT_ESR_SUBSCRIPTION_KEY"
+
+ @property
+ def rptesr_m(self) -> rptesr_m:
+ return rptesr_m(self)
diff --git a/tinyercot/_generation_keys.py b/tinyercot/_generation_keys.py
new file mode 100644
index 00000000..cd1a8c44
--- /dev/null
+++ b/tinyercot/_generation_keys.py
@@ -0,0 +1,265 @@
+"""Site metadata and published summaries accompanying planning profiles."""
+
+from __future__ import annotations
+
+from collections.abc import Iterator
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from typing import Literal
+
+from pydantic import BaseModel, ConfigDict, Field
+
+from ._load import _sheets, _workbooks
+
+
+class GenerationProfileKeySite(BaseModel):
+ """One original site or unit-code row; identifiers are not inferred or joined."""
+
+ model_config = ConfigDict(extra="forbid")
+ siteNumber: int | None = None
+ queuedModelFlag: bool | None = None
+ unitCode: str | None = None
+ commonName: str | None = None
+ county: str | None = None
+ cdrZone: str | None = None
+ capacityMW: Decimal | None = None
+ capacityLabel: str | None = None
+ plantStatus: str | None = None
+ plantStatusLabel: str | None = None
+ latitude: Decimal | None = None
+ longitude: Decimal | None = None
+ xCoordinate: Decimal | None = None
+ yCoordinate: Decimal | None = None
+ typeCode: int | None = None
+ iecClass: int | None = None
+ distanceToOperationalOrQueued: str | None = None
+ metroArea: str | None = None
+ developmentIntensity: str | None = None
+ trackingSystem: str | None = None
+ trackingType: str | None = None
+ tilt: Decimal | Literal["Lat", "NA"] | None = None
+ azimuth: Decimal | None = None
+ dcAcRatio: Decimal | None = None
+ inverters: str | None = None
+ modules: str | None = None
+ newFor: str | None = None
+ newForLabel: str | None = None
+ modeledIn: str | None = None
+ modeledInLabel: str | None = None
+ sourceSheet: str
+ sourceRow: int
+
+
+class GenerationProfileKeySummary(BaseModel):
+ """A published count/capacity row, including totals without recomputation."""
+
+ model_config = ConfigDict(extra="forbid")
+ section: str
+ label: str
+ typeCode: int | None = None
+ profileCount: int | None = None
+ trackingScenarioCount: int | None = None
+ trackingType: str | None = None
+ totalProfileCount: int | None = None
+ capacityMW: Decimal | None = None
+ sourceRow: int
+
+
+class GenerationProfileKey(BaseModel):
+ """A key workbook; rows and note locations remain tied to this publication.
+
+ Numeric site numbers are kept as supplied. Matching them to profile column
+ names requires the same publication and site family. Queued-model flags use the matching
+ worksheet legend; None means no such legend was supplied. Note text and
+ original worksheet row numbers are retained.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ sourceMember: str
+ sourceTitle: str | None = None
+ sourceDate: date | None = None
+ sites: list[GenerationProfileKeySite] = Field(default_factory=list)
+ summaries: list[GenerationProfileKeySummary] = Field(default_factory=list)
+ sourceNotes: dict[str, str] = Field(default_factory=dict)
+
+
+_FIELDS = {
+ "UL ID": "siteNumber",
+ "SITE ID": "siteNumber",
+ "Unit Code": "unitCode",
+ "RARF UNIT_CODE": "unitCode",
+ "Common Name": "commonName",
+ "Common Name of Project": "commonName",
+ "County": "county",
+ "COUNTY": "county",
+ "CDR Zone": "cdrZone",
+ "CDR_Zone": "cdrZone",
+ "Capacity_MW": "capacityMW",
+ "MWAC": "capacityMW",
+ "Latitude": "latitude",
+ "Longitude": "longitude",
+ "XCoord": "xCoordinate",
+ "YCoord": "yCoordinate",
+ "Type": "typeCode",
+ "IEC Class*": "iecClass",
+ "Distance to Op/Q'ed": "distanceToOperationalOrQueued",
+ "Metro Area": "metroArea",
+ "Development Intensity": "developmentIntensity",
+ "Tracking System": "trackingSystem",
+ "Tracking Type": "trackingType",
+ "Tilt": "tilt",
+ "Azimuth": "azimuth",
+ "DC:AC Ratio": "dcAcRatio",
+ "Inverter(s)": "inverters",
+ "Module(s)": "modules",
+}
+_PREFIXES = {
+ "New for ": "newFor",
+ "Modeled in ": "modeledIn",
+ "Modeled Capacity MW ": "capacityMW",
+ "Development Status ": "plantStatus",
+}
+
+
+def _field(value: object) -> str | None:
+ label = str(value).strip()
+ return _FIELDS.get(label) or next(
+ (field for prefix, field in _PREFIXES.items() if label.startswith(prefix)), None
+ )
+
+
+def _notes(
+ key: GenerationProfileKey, sheet: str, row: int, cells: tuple[object, ...]
+) -> None:
+ for column, value in enumerate(cells, 1):
+ if value is not None:
+ key.sourceNotes[f"{sheet}!R{row}C{column}"] = str(value)
+
+
+def _summary(key: GenerationProfileKey, rows: Iterator[tuple[object, ...]]) -> None:
+ section = "SUMMARY"
+ for number, cells in enumerate(rows, 1):
+ row = (*cells, *(None for _ in range(max(0, 7 - len(cells)))))
+ if number == 1:
+ key.sourceTitle = str(row[1]) if row[1] is not None else None
+ if number == 2 and isinstance(row[1], datetime):
+ key.sourceDate = row[1].date()
+ if "# of Profiles" in row:
+ section = str(row[2])
+ elif any(isinstance(cell, (int, float)) for cell in row):
+ values: dict[str, object] = {"section": section, "sourceRow": number}
+ if isinstance(row[1], (int, float)):
+ values.update(
+ typeCode=row[1],
+ label=row[2],
+ profileCount=row[3],
+ trackingScenarioCount=row[4],
+ trackingType=row[5],
+ totalProfileCount=row[6],
+ )
+ elif row[1] is not None and str(row[1]).strip() == "Total":
+ values.update(label=row[1], totalProfileCount=row[6])
+ else:
+ values.update(label=row[2], profileCount=row[3], capacityMW=row[4])
+ key.summaries.append(GenerationProfileKeySummary.model_validate(values))
+ else:
+ _notes(key, "SUMMARY", number, cells)
+
+
+def _queued_flags(data: bytes, key: GenerationProfileKey) -> None:
+ from openpyxl import load_workbook
+
+ book = load_workbook(BytesIO(data), read_only=True, data_only=True)
+ try:
+ for sheet in book:
+ cells = list(sheet.rows)
+ legend = next(
+ (
+ cell
+ for row in cells
+ for cell in row
+ if cell.value
+ == "Modeled as a Queued Plant (< 1 yr of observed generation)."
+ ),
+ None,
+ )
+ if legend is None:
+ continue
+ column = next(i for i, cell in enumerate(cells[0]) if cell.value == "UL ID")
+ for site in key.sites:
+ if site.sourceSheet == sheet.title:
+ fill = cells[site.sourceRow - 1][column].fill
+ site.queuedModelFlag = (
+ fill.patternType == legend.fill.patternType
+ and fill.fgColor == legend.fill.fgColor
+ )
+ finally:
+ book.close()
+
+
+def read_keys(data: bytes, filename: str) -> Iterator[GenerationProfileKey]:
+ found = False
+ for member, content in _workbooks(data):
+ key = GenerationProfileKey(
+ sourceMember=filename if member == "workbook.xlsx" else member
+ )
+ for sheet, rows in _sheets(content, date_columns=()):
+ if sheet == "SUMMARY":
+ _summary(key, rows)
+ continue
+ columns: dict[int, str] = {}
+ labels: dict[str, str] = {}
+ for number, row in enumerate(rows, 1):
+ if any(value in ("UL ID", "SITE ID", "Unit Code") for value in row):
+ columns = {
+ i: field
+ for i, cell in enumerate(row)
+ if (field := _field(cell)) is not None
+ }
+ labels = {
+ field.removesuffix("MW") + "Label": str(row[i]).strip()
+ for i, field in columns.items()
+ if field in {"capacityMW", "plantStatus", "newFor", "modeledIn"}
+ }
+ _notes(
+ key,
+ sheet,
+ number,
+ tuple(
+ None if i in columns else value
+ for i, value in enumerate(row)
+ ),
+ )
+ continue
+ values = {
+ field: row[i]
+ for i, field in columns.items()
+ if i < len(row) and row[i] not in (None, "")
+ }
+ if len(values) > 1 and ("siteNumber" in values or "unitCode" in values):
+ key.sites.append(
+ GenerationProfileKeySite.model_validate(
+ dict(values, **labels, sourceSheet=sheet, sourceRow=number)
+ )
+ )
+ _notes(
+ key,
+ sheet,
+ number,
+ tuple(
+ None if i in columns else value
+ for i, value in enumerate(row)
+ ),
+ )
+ else:
+ _notes(key, sheet, number, row)
+ if not key.sites:
+ raise ValueError(
+ f"{key.sourceMember}: no supported profile key site tables"
+ )
+ _queued_flags(content, key)
+ found = True
+ yield key
+ if not found:
+ raise ValueError(f"{filename}: no profile key workbook found")
diff --git a/tinyercot/_generation_profiles.py b/tinyercot/_generation_profiles.py
new file mode 100644
index 00000000..802fce0c
--- /dev/null
+++ b/tinyercot/_generation_profiles.py
@@ -0,0 +1,318 @@
+"""Hourly modeled wind and solar generation published for planning studies."""
+
+from __future__ import annotations
+
+import csv
+from collections.abc import Iterator
+from dataclasses import dataclass
+from datetime import date
+from decimal import Decimal
+from io import BytesIO, TextIOWrapper
+from itertools import islice
+from zipfile import ZipFile
+
+from pydantic import BaseModel, ConfigDict, Field
+
+from ._generation_keys import GenerationProfileKey, read_keys
+from ._legacy_load import _number
+from ._load import _sheets
+from ._public_tables import PublicFile, _PublicTable, _year_files
+
+
+class GenerationProfileSite(BaseModel):
+ """A profile column and its published metadata, without inferred site joins."""
+
+ model_config = ConfigDict(extra="forbid")
+ column: str
+ siteId: str
+ capacityMW: Decimal | None = None
+ commonName: str | None = None
+ county: str | None = None
+ cdrZone: str | None = None
+ newFor: str | None = None
+ newForLabel: str | None = None
+ plantStatus: str | None = None
+ tracking: str | None = None
+ awsName: str | None = None
+ annualEnergyMWh: dict[int, Decimal | None] = Field(default_factory=dict)
+ annualCapacityFactor: dict[int, Decimal | None] = Field(default_factory=dict)
+ sourceSum: Decimal | None = None
+ sourceCount: int | None = None
+ sourceCapacityFactor: Decimal | None = None
+ sourceMember: str
+ sourceSheet: str
+ sourceBlock: int = 1
+
+
+class GenerationProfileHour(BaseModel):
+ """Modeled MW by source column, not metered generation or a historical fleet.
+
+ The source's DATE and HHMM clock are retained without assigning a timezone
+ or guessing whether the hour begins or ends then. Repeated clocks survive.
+ Site identifiers vary by publication; use sites() on the same file for its
+ metadata. These retrospective profiles are not point-in-time forecasts.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ profileDate: date
+ timeHHMM: int
+ sourceTime: str
+ sourceTimeColumn: str
+ sourceYear: int | None = None
+ calendarDate: date | None = None
+ generationMW: dict[str, Decimal | None]
+ sourceMember: str
+ sourceSheet: str
+ sourceBlock: int = 1
+
+
+def _tables(
+ data: bytes, filename: str
+) -> Iterator[tuple[str, str, Iterator[tuple[object, ...]]]]:
+ if data.startswith(b"PK"):
+ with ZipFile(BytesIO(data)) as archive:
+ if "[Content_Types].xml" in archive.namelist():
+ for sheet, rows in _sheets(data, date_columns=()):
+ yield filename, sheet, rows
+ else:
+ for name in archive.namelist():
+ if name.lower().endswith((".csv", ".xlsx", ".zip")):
+ yield from _tables(archive.read(name), f"{filename}/{name}")
+ else:
+ with TextIOWrapper(BytesIO(data), encoding="utf-8-sig", newline="") as stream:
+ yield filename, "", (tuple(row) for row in csv.reader(stream))
+
+
+@dataclass
+class _Block:
+ start: int
+ stop: int
+ clock: str
+ sites: list[GenerationProfileSite]
+ dateColumn: int | None = None
+ calendarColumns: tuple[int, int, int] | None = None
+ rowWidth: int | None = None
+
+
+def _legacy_header(
+ metadata: list[tuple[object, ...]], row: tuple[object, ...], member: str, sheet: str
+) -> _Block:
+ hypothetical = row[1] == "DATE-CST"
+ label_column, start, date_column = (5, 6, 1) if hypothetical else (0, 2, 0)
+ labels = {
+ str(cells[label_column]): cells
+ for cells in metadata
+ if len(cells) > label_column and cells[label_column] is not None
+ }
+ ids = labels["SITE_ID" if hypothetical else "Site ID"]
+ stop = max(i for i in range(start, len(ids)) if ids[i] is not None) + 1
+ sites = []
+ for i in range(start, stop):
+ site = GenerationProfileSite(
+ column=str(ids[i]),
+ siteId=str(ids[i]),
+ sourceMember=member,
+ sourceSheet=sheet,
+ )
+ for label, cells in labels.items():
+ value = cells[i] if i < len(cells) else None
+ if label in ("MW", "MW per ERCOT"):
+ site.capacityMW = _number(value)
+ elif label == "Generator":
+ site.commonName = str(value) if value is not None else None
+ elif label == "Site Name per AWS":
+ site.awsName = str(value) if value is not None else None
+ elif label == "COUNTY":
+ site.county = str(value) if value is not None else None
+ elif label == "Sum":
+ site.sourceSum = _number(value)
+ elif label == "Count":
+ site.sourceCount = int(str(value)) if value is not None else None
+ elif label == "CF":
+ site.sourceCapacityFactor = _number(value)
+ elif label[:4].isdigit() and label.endswith(" MWh"):
+ site.annualEnergyMWh[int(label[:4])] = _number(value)
+ elif label[:4].isdigit() and label.endswith(" CF"):
+ site.annualCapacityFactor[int(label[:4])] = _number(value)
+ sites.append(site)
+ if len({site.column for site in sites}) != len(sites):
+ raise ValueError(f"{member}: duplicate legacy site IDs")
+ calendar = (3, 4, 5) if hypothetical else (stop, stop + 1, stop + 2)
+ return _Block(
+ start,
+ stop,
+ str(row[date_column + 1]),
+ sites,
+ date_column,
+ calendar,
+ max(len(row), stop, calendar[-1] + 1),
+ )
+
+
+def _headers(
+ rows: Iterator[tuple[object, ...]], member: str, sheet: str
+) -> list[_Block]:
+ metadata: list[tuple[object, ...]] = []
+ for row in islice(rows, 32):
+ if row[:2] == ("YYYYMMDD", "YYMMHH(CST)") or row[:6] == (
+ "year",
+ "DATE-CST",
+ "TIME-CST",
+ "Year",
+ "Month",
+ "Day",
+ ):
+ return [_legacy_header(metadata, row, member, sheet)]
+ starts = [
+ i + 2
+ for i, label in enumerate(row[:-1])
+ if label in ("DATE", "YYYYMMDD")
+ and row[i + 1] in ("TIME", "TIME_CST", "HHMM(CST)")
+ ]
+ if starts:
+ if starts[0] not in (2, 3):
+ raise ValueError(f"{member}: unexpected profile date/time columns")
+ blocks = []
+ stops = [start - 2 for start in starts[1:]] + [len(row)]
+ for block_number, (start, stop) in enumerate(
+ zip(starts, stops, strict=True), 1
+ ):
+ columns = [str(cell) for cell in row[start:stop]]
+ if not columns or len(set(columns)) != len(columns):
+ raise ValueError(f"{member}: missing or duplicate profile columns")
+ sites = []
+ for i, column in enumerate(columns, start):
+ site_id, _, capacity = column.partition(":capacity=")
+ site = GenerationProfileSite(
+ column=column,
+ siteId=site_id,
+ capacityMW=_number(capacity) if capacity else None,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceBlock=block_number,
+ )
+ for cells in metadata:
+ value = cells[i] if i < len(cells) else None
+ label = str(cells[1] or "").strip() if len(cells) > 1 else ""
+ text = str(value) if value is not None else None
+ if not label and text:
+ site.siteId = text
+ elif label == "MWAC":
+ site.capacityMW = _number(value)
+ elif label == "Common Name":
+ site.commonName = text
+ elif label == "County":
+ site.county = text
+ elif label == "CDR Zone":
+ site.cdrZone = text
+ elif label.startswith("New for "):
+ site.newFor, site.newForLabel = text, label
+ elif label == "Plant Status":
+ site.plantStatus = text
+ elif label == "Tracking":
+ site.tracking = text
+ sites.append(site)
+ blocks.append(_Block(start, stop, str(row[start - 1]), sites))
+ return blocks
+ metadata.append(row)
+ if not any(value not in (None, "") for row in metadata for value in row):
+ return []
+ raise ValueError(f"{member} {sheet}: no supported date/time profile table")
+
+
+class GenerationProfiles(_PublicTable[GenerationProfileHour]):
+ """Public planning profiles; CSV needs no extra dependencies, XLSX uses [files].
+
+ Select a publication with files()/download()/read() to avoid downloading
+ multiple large, overlapping vintages. Earlier ZIP layouts are not all verified.
+ """
+
+ index_url = "https://www.ercot.com/gridinfo/resource"
+ title_pattern = r"(?i).*(?:wind.*(?:profiles|shapes|operational)|solar.*(?:profiles|data sets)|photovoltaic.*data sets).*"
+
+ def files(self) -> list[PublicFile]:
+ """Discover direct profile datasets across linked resource archive indexes."""
+ return [
+ file
+ for file in _year_files(self._http, self.index_url, self.title_pattern)
+ if file.url.lower().endswith((".csv", ".xlsx", ".zip"))
+ and "key" not in file.title.lower()
+ ]
+
+ def key_files(self) -> list[PublicFile]:
+ """Discover the separately published wind/solar site-key workbooks."""
+ return [
+ file
+ for file in _year_files(
+ self._http, self.index_url, r"(?i).*profiles?.*key.*"
+ )
+ if file.url.lower().endswith(".xlsx")
+ ]
+
+ def read_keys(
+ self, data: bytes, *, filename: str = "profile-key.xlsx"
+ ) -> Iterator[GenerationProfileKey]:
+ """Read saved site keys and their published summaries without joining vintages."""
+ yield from read_keys(data, filename)
+
+ def sites(
+ self, data: bytes, *, filename: str = "profiles"
+ ) -> Iterator[GenerationProfileSite]:
+ """Read embedded column metadata; separate key workbooks are not joined."""
+ for member, sheet, rows in _tables(data, filename):
+ for block in _headers(rows, member, sheet):
+ yield from block.sites
+
+ def _read(self, data: bytes, filename: str) -> Iterator[GenerationProfileHour]:
+ found = False
+ for member, sheet, rows in _tables(data, filename):
+ blocks = _headers(rows, member, sheet)
+ if not blocks:
+ continue
+ found = True
+ for row in rows:
+ if not row or all(value in (None, "") for value in row):
+ continue
+ if len(row) > (blocks[-1].rowWidth or blocks[-1].stop):
+ raise ValueError(f"{member}: profile row width differs from header")
+ for number, block in enumerate(blocks, 1):
+ start, stop = block.start, block.stop
+ date_column = (
+ block.dateColumn if block.dateColumn is not None else start - 2
+ )
+ if all(
+ value in (None, "")
+ for value in (
+ *row[date_column : date_column + 2],
+ *row[start:stop],
+ )
+ ):
+ continue
+ if len(row) < stop:
+ raise ValueError(f"{member}: profile block has missing columns")
+ clock = str(row[date_column + 1])
+ calendar = None
+ if block.calendarColumns is not None:
+ year, month, day = (
+ int(str(row[i])) for i in block.calendarColumns
+ )
+ calendar = date(year, month, day)
+ yield GenerationProfileHour(
+ profileDate=date.fromisoformat(str(row[date_column])),
+ timeHHMM=int(clock),
+ sourceTime=clock,
+ sourceTimeColumn=block.clock,
+ sourceYear=int(str(row[0])) if date_column == 1 else None,
+ calendarDate=calendar,
+ generationMW={
+ site.column: _number(value)
+ for site, value in zip(
+ block.sites, row[start:stop], strict=True
+ )
+ },
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceBlock=number,
+ )
+ if not found:
+ raise ValueError(f"{filename}: no profile CSV or workbook found")
diff --git a/tinyercot/_history.py b/tinyercot/_history.py
new file mode 100644
index 00000000..464a44c1
--- /dev/null
+++ b/tinyercot/_history.py
@@ -0,0 +1,409 @@
+"""Typed rows from ERCOT's historical CSV files and nested ZIP downloads."""
+
+from __future__ import annotations
+
+import csv
+import re
+from collections.abc import Callable, Iterable, Iterator
+from dataclasses import dataclass
+from datetime import date, datetime, timedelta
+from decimal import Decimal
+from fnmatch import fnmatchcase
+from functools import lru_cache
+from io import BytesIO, TextIOWrapper
+from itertools import chain, islice
+from time import strptime
+from typing import TYPE_CHECKING, Annotated, Generic, Literal, TypeVar
+from zipfile import ZipFile
+
+from pydantic import BaseModel, BeforeValidator
+
+if TYPE_CHECKING:
+ from ._client import Document, Transport
+
+T = TypeVar("T", bound=BaseModel)
+
+
+class _MissingTable(ValueError):
+ """A valid ZIP contains no member matching the requested CSV table."""
+
+
+def _archive_files(data: bytes, pattern: str) -> Iterator[tuple[str, bytes]]:
+ with ZipFile(BytesIO(data)) as archive:
+ for member in archive.infolist():
+ if member.is_dir():
+ continue
+ if fnmatchcase(member.filename.rsplit("/", 1)[-1], pattern):
+ yield member.filename, archive.read(member)
+ elif member.filename.lower().endswith(".zip"):
+ yield from _archive_files(archive.read(member), pattern)
+
+
+def _csv_files(data: bytes, pattern: str = "*.csv") -> Iterator[tuple[str, bytes]]:
+ yield from _archive_files(data, pattern)
+
+
+def _eia_hour(value: object) -> object:
+ if not isinstance(value, str):
+ return value
+ if "T" not in value:
+ return value
+ midnight = re.fullmatch(
+ r"(\d{4}-\d{2}-\d{2})T24:00:00(?:\.0+)?(Z|[+-]\d{2}:\d{2})?", value
+ )
+ if midnight:
+ return datetime.fromisoformat(
+ midnight[1] + "T00:00:00" + (midnight[2] or "")
+ ) + timedelta(days=1)
+ return datetime.fromisoformat(value)
+
+
+EiaHour = Annotated[Decimal | datetime, BeforeValidator(_eia_hour)]
+
+
+@dataclass(frozen=True)
+class Publication(Generic[T]):
+ """One listing entry and its lazily decoded rows.
+
+ For archives, document.postDatetime is the report's listed publication time.
+ For bundles it is the bundle's posting time, not the original availability of
+ its individual reports. Consume rows while the Client remains open.
+ """
+
+ document: Document
+ kind: Literal["archive", "bundle"]
+ rows: Iterator[T]
+
+
+class Archive(Generic[T]):
+ """Historical files decoded into a generated row model.
+
+ Publication bounds select documents, not delivery dates. A typed predicate
+ can further select rows. Files are processed one document at a time.
+ """
+
+ def __init__(
+ self,
+ client: Transport,
+ product: str,
+ row: type[T],
+ columns: dict[str, str],
+ dates: dict[str, str],
+ *,
+ member: str = "*.csv",
+ document: str | None = None,
+ datetimes: dict[str, str | list[str]] | None = None,
+ variants: tuple[dict[str, str], ...] = (),
+ ) -> None:
+ self._client = client
+ self._product = product
+ self._row = row
+ self._layouts = (columns, *variants)
+ self._columns = dict(columns)
+ self._ambiguous: set[str] = set()
+ for variant in variants:
+ self._ambiguous.update(
+ key
+ for key, value in variant.items()
+ if key in self._columns and self._columns[key] != value
+ )
+ self._columns.update(variant)
+ self._member = member
+ self._document = document
+ self._dates = dates
+ self._datetimes = datetimes or {}
+
+ def read(self, data: bytes) -> Iterator[T]:
+ """Read CSV members in a downloaded ZIP, including nested ZIPs.
+
+ A mismatched schema raises instead of silently dropping historical data.
+ """
+
+ @lru_cache(maxsize=128)
+ def parse_date(value: str, format: str) -> date:
+ return date(*strptime(value, format)[:3])
+
+ found = False
+ for filename, content in _csv_files(data, self._member):
+ found = True
+ reader = csv.DictReader(
+ TextIOWrapper(BytesIO(content), encoding="utf-8-sig", newline="")
+ )
+ fields = reader.fieldnames or []
+ columns = next(
+ (layout for layout in self._layouts if set(fields) == set(layout)), None
+ )
+ if columns is None:
+ if self._ambiguous.intersection(fields):
+ raise ValueError(f"{filename}: ambiguous historical layout")
+ columns = self._columns
+ if not set(fields) <= columns.keys():
+ raise ValueError(f"{filename}: unexpected CSV columns {fields!r}")
+ if len({columns[field] for field in fields}) != len(fields):
+ raise ValueError(f"{filename}: duplicate columns for a row field")
+ for line, values in enumerate(reader, 2):
+ # DictReader treats a whitespace-only line as one empty cell.
+ if (
+ fields
+ and not (values[fields[0]] or "").strip()
+ and all(values[field] is None for field in fields[1:])
+ ):
+ continue
+ # Older offer-cap reports append an empty cell beyond the header.
+ if None in values and all(not cell.strip() for cell in values[None]):
+ del values[None]
+ try:
+ converted: dict[str, object] = {}
+ for source in fields:
+ target = columns[source]
+ value = values[source]
+ if value is None or None in values:
+ raise ValueError("CSV row has the wrong number of cells")
+ value = value.strip()
+ converted[target] = (
+ parse_date(value, self._dates[target])
+ if value and target in self._dates
+ else value or None
+ )
+ for target, format in self._datetimes.items():
+ value = converted.get(target)
+ if isinstance(value, str):
+ # Preserve the local timestamp and separate repeated-hour flag.
+ formats = [format] if isinstance(format, str) else format
+ for candidate in formats:
+ try:
+ converted[target] = datetime.strptime( # noqa: DTZ007
+ value, candidate
+ )
+ break
+ except ValueError:
+ continue
+ else:
+ raise ValueError(
+ f"{value!r} does not match {formats!r}"
+ )
+ yield self._row.model_validate(converted)
+ except ValueError as error:
+ raise ValueError(f"{filename}:{line}: {error}") from error
+ if not found:
+ raise _MissingTable(
+ f"Download contains no CSV files matching {self._member!r}"
+ )
+
+ def download(
+ self,
+ doc_ids: Iterable[int],
+ *,
+ kind: Literal["archive", "bundle"] = "archive",
+ batch_size: int = 1,
+ ) -> Iterator[T]:
+ """Download selected documents or bundles and yield typed rows.
+
+ Archive batches respect the product's advertised limit. The default of
+ one file limits memory use; bundles are always requested individually.
+ """
+ for data in self._downloads(doc_ids, kind=kind, batch_size=batch_size):
+ # A mixed correction bundle may contain no publication of this subtype.
+ if (
+ kind == "bundle"
+ and self._document is not None
+ and next(_archive_files(data, self._member), None) is None
+ ):
+ continue
+ yield from self.read(data)
+
+ def _downloads(
+ self,
+ doc_ids: Iterable[int],
+ *,
+ kind: Literal["archive", "bundle"],
+ batch_size: int,
+ ) -> Iterator[bytes]:
+ if batch_size < 1:
+ raise ValueError("batch_size must be positive")
+ ids = iter(doc_ids)
+ first = next(ids, None)
+ if first is None:
+ return
+ limit = 1
+ if kind == "archive" and batch_size > 1:
+ limit = min(
+ batch_size, self._client.product(self._product).downloadLimit or 1, 1000
+ )
+ limit = max(1, limit)
+ selected = chain((first,), ids)
+ while batch := list(islice(selected, limit)):
+ yield self._client.download(self._product, batch, kind=kind)
+
+ def _read_backfill(self, data: bytes) -> Iterator[T]:
+ try:
+ yield from self.read(data)
+ except _MissingTable:
+ # Shared disclosures can predate a named table. A CSV archive with
+ # no matching member contributes no rows; an empty/non-CSV download
+ # or a missing generic CSV report is still an error.
+ if (
+ self._member.lower() == "*.csv"
+ or next(_csv_files(data, "*.[cC][sS][vV]"), None) is None
+ ):
+ raise
+
+ def backfill(
+ self,
+ *,
+ posted_from: datetime | None = None,
+ posted_to: datetime | None = None,
+ where: Callable[[T], bool] | None = None,
+ batch_size: int = 1,
+ ) -> Iterator[T]:
+ """Read bundles first, then archive reports not covered by those bundles.
+
+ Original document IDs identify publications across sources; distinct
+ corrections and repeated rows within a publication are retained. Rows
+ are streamed without imposing chronological order. Unbounded reads begin
+ with bundles before requesting archive listings.
+
+ With bounds, archive posting metadata selects the original documents.
+ Without bounds, bundle-only documents are included too. Bundle posting
+ dates and member filenames never supply an original publication time.
+ Named tables absent from shared CSV reports contribute no rows. Selected
+ tables with invalid data, corrupt ZIPs and empty ZIPs still raise.
+ """
+ if batch_size < 1:
+ raise ValueError("batch_size must be positive")
+ documents = (
+ publication.document.docId
+ for publication in self.publications(
+ posted_from=posted_from, posted_to=posted_to
+ )
+ )
+ bounded = posted_from is not None or posted_to is not None
+ # Only bounded selection needs archive metadata before reading bundles.
+ remaining = dict.fromkeys(documents) if bounded else {}
+ if bounded and not remaining:
+ return
+ seen: set[int] = set()
+ for bundle in self._client.iter_documents(self._product, kind="bundle"):
+ # Month selection only saves downloads. Any selected archive ID
+ # outside these bundles is still fetched individually below.
+ month = (bundle.postDatetime.year, bundle.postDatetime.month)
+ if posted_from is not None and month < (
+ posted_from.year,
+ posted_from.month,
+ ):
+ continue
+ if posted_to is not None and month > (posted_to.year, posted_to.month):
+ continue
+ data = self._client.download(self._product, [bundle.docId], kind="bundle")
+ with ZipFile(BytesIO(data)) as archive:
+ for member in archive.infolist():
+ if member.is_dir():
+ continue
+ name = member.filename.rsplit("/", 1)[-1]
+ match = re.match(r"([1-9]\d*)\.", name)
+ if match is None:
+ raise ValueError(
+ f"{member.filename}: missing original document ID; "
+ "use rows() or rows(kind='bundle') to read sources separately"
+ )
+ doc_id = int(match[1])
+ if doc_id in seen or (bounded and doc_id not in remaining):
+ continue
+ # Keep the original filename for CSV/XLSX/PDF readers,
+ # whether the member is a report or another ZIP.
+ payload = BytesIO()
+ with ZipFile(payload, "w") as report:
+ report.writestr(member.filename, archive.read(member))
+ content = payload.getvalue()
+ for row in self._read_backfill(content):
+ if where is None or where(row):
+ yield row
+ seen.add(doc_id)
+ remaining.pop(doc_id, None)
+ if bounded and not remaining:
+ return
+
+ def uncovered() -> Iterator[int]:
+ for doc_id in remaining if bounded else documents:
+ if doc_id not in seen:
+ seen.add(doc_id)
+ yield doc_id
+
+ for data in self._downloads(uncovered(), kind="archive", batch_size=batch_size):
+ for row in self._read_backfill(data):
+ if where is None or where(row):
+ yield row
+
+ def publications(
+ self,
+ *,
+ kind: Literal["archive", "bundle"] = "archive",
+ posted_from: datetime | None = None,
+ posted_to: datetime | None = None,
+ ) -> Iterator[Publication[T]]:
+ """Keep listing metadata with each report's rows for as-issued analysis.
+
+ Listing pages are fetched as needed. A document is downloaded only when
+ its rows are consumed, allowing metadata-only selection before download.
+ Each report is downloaded individually to preserve its source identity.
+ Corrections and repeated rows are retained; no forecast issue time is
+ inferred from a delivery date, filename or bundle timestamp.
+ """
+ if (
+ posted_from is not None
+ and posted_to is not None
+ and posted_from > posted_to
+ ):
+ raise ValueError("posted_from must not be after posted_to")
+ for document in self._client.iter_documents(
+ self._product, kind=kind, posted_from=posted_from, posted_to=posted_to
+ ):
+ if (
+ kind == "archive"
+ and self._document is not None
+ and not fnmatchcase(
+ document.friendlyName.lower(), self._document.lower()
+ )
+ ):
+ continue
+ yield Publication(
+ document, kind, self.download([document.docId], kind=kind)
+ )
+
+ def rows(
+ self,
+ *,
+ kind: Literal["archive", "bundle"] = "archive",
+ posted_from: datetime | None = None,
+ posted_to: datetime | None = None,
+ where: Callable[[T], bool] | None = None,
+ batch_size: int = 1,
+ ) -> Iterator[T]:
+ """Read matching archive documents or monthly bundles, without a cutoff.
+
+ Bounds are inclusive ERCOT publication timestamps. No ordering or
+ deduplication of rows is imposed; corrected publications are preserved.
+ Bundle timestamps identify the bundle publication, not each contained row.
+ """
+ if (
+ posted_from is not None
+ and posted_to is not None
+ and posted_from > posted_to
+ ):
+ raise ValueError("posted_from must not be after posted_to")
+ documents = self._client.iter_documents(
+ self._product, kind=kind, posted_from=posted_from, posted_to=posted_to
+ )
+ for row in self.download(
+ (
+ document.docId
+ for document in documents
+ if kind == "bundle"
+ or self._document is None
+ or fnmatchcase(document.friendlyName.lower(), self._document.lower())
+ ),
+ kind=kind,
+ batch_size=batch_size,
+ ):
+ if where is None or where(row):
+ yield row
diff --git a/tinyercot/_hourly_forecasts.py b/tinyercot/_hourly_forecasts.py
new file mode 100644
index 00000000..0bc95de5
--- /dev/null
+++ b/tinyercot/_hourly_forecasts.py
@@ -0,0 +1,218 @@
+"""Hourly long-term load forecasts, preserving published components and hours."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator, Sequence
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from typing import Literal
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _workbooks
+from ._load_forecasts import _ForecastRow, _ForecastTable
+
+_ZONES = {
+ "coast": "coast",
+ "east": "east",
+ "fwest": "farWest",
+ "ncent": "northCentral",
+ "north": "north",
+ "scent": "southCentral",
+ "south": "south",
+ "west": "west",
+ "ercot": "total",
+ "total": "total",
+}
+_COMPONENTS = {
+ "": "forecast",
+ "gross": "gross",
+ "base": "baseLoad",
+ "baseeconomic": "baseLoad",
+ "ev": "electricVehicles",
+ "pv": "rooftopPV",
+ "pvpred": "rooftopPV",
+ "lflforecast": "largeFlexibleLoad",
+ "lfl15%": "largeFlexibleLoad",
+ "contracts": "contractedLoad",
+ "officerletters": "officerLetterLoad",
+ "contractedlfl": "contractedFlexibleLoad",
+ "officerletterslfl": "officerLetterFlexibleLoad",
+ "net": "net",
+ "net15": "net",
+}
+
+
+class WeatherZoneForecastValues(BaseModel):
+ """Published regional values; absent zones and totals stay None."""
+
+ model_config = ConfigDict(extra="forbid")
+ coast: Decimal | None = None
+ east: Decimal | None = None
+ farWest: Decimal | None = None
+ northCentral: Decimal | None = None
+ north: Decimal | None = None
+ southCentral: Decimal | None = None
+ south: Decimal | None = None
+ west: Decimal | None = None
+ total: Decimal | None = None
+
+
+class HourlyLoadForecast(_ForecastRow):
+ """A source hour, without timezone, DST or hour-ending inference."""
+
+ forecastDate: date
+ hour: int
+ sourceDate: date | None
+ unit: Literal["MW"] | None
+ scenario: Literal["tsp_provided", "ercot_adjusted"] | None = None
+ forecast: WeatherZoneForecastValues | None = None
+ gross: WeatherZoneForecastValues | None = None
+ baseLoad: WeatherZoneForecastValues | None = None
+ electricVehicles: WeatherZoneForecastValues | None = None
+ rooftopPV: WeatherZoneForecastValues | None = None
+ largeFlexibleLoad: WeatherZoneForecastValues | None = None
+ contractedLoad: WeatherZoneForecastValues | None = None
+ officerLetterLoad: WeatherZoneForecastValues | None = None
+ contractedFlexibleLoad: WeatherZoneForecastValues | None = None
+ officerLetterFlexibleLoad: WeatherZoneForecastValues | None = None
+ net: WeatherZoneForecastValues | None = None
+ sourceLabels: dict[str, str]
+ sourceNotes: list[str]
+
+
+def _column(label: str) -> tuple[str, str]:
+ key = re.sub(r"[_\s]", "", label.lower())
+ for zone, field in _ZONES.items():
+ if key.startswith(zone):
+ component = key[len(zone) :]
+ elif key.endswith(zone):
+ component = key[: -len(zone)]
+ else:
+ continue
+ if component in _COMPONENTS:
+ return _COMPONENTS[component], field
+ raise ValueError(f"Unknown hourly forecast column: {label!r}")
+
+
+def _forecast_clock(
+ values: Sequence[object], offset: int
+) -> tuple[date, int, date | None]:
+ source_date = values[0] if offset else None
+ if isinstance(source_date, datetime):
+ source_date = source_date.date()
+ elif isinstance(source_date, str):
+ source_date = date.fromisoformat(source_date)
+ if source_date is not None and not isinstance(source_date, date):
+ raise ValueError(f"Unsupported source date: {source_date!r}")
+ day = date(*(int(str(v).removesuffix(".0")) for v in values[offset : offset + 3]))
+ hour = int(str(values[offset + 3]).removesuffix(".0"))
+ return day, hour, source_date
+
+
+class HourlyLoadForecasts(_ForecastTable[HourlyLoadForecast]):
+ title_pattern = r"\d{4} ERCOT Hourly Forecast|TSP Provided Hourly Forecast|ERCOT Adjusted Forecast"
+ extensions = (".xlsx", ".xlsb")
+
+ def rows(
+ self, *, where: Callable[[HourlyLoadForecast], bool] | None = None
+ ) -> Iterator[HourlyLoadForecast]:
+ for row in super().rows():
+ if row.sourceFile:
+ if row.sourceFile.title == "TSP Provided Hourly Forecast":
+ row.scenario = "tsp_provided"
+ elif row.sourceFile.title == "ERCOT Adjusted Forecast":
+ row.scenario = "ercot_adjusted"
+ if where is None or where(row):
+ yield row
+
+ def _read(self, data: bytes, filename: str) -> Iterator[HourlyLoadForecast]:
+ try:
+ from python_calamine import CalamineWorkbook
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read hourly forecast workbooks"
+ ) from error
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ with CalamineWorkbook.from_filelike(BytesIO(content)) as book:
+ notes = [
+ str(value)
+ for name in book.sheet_names
+ if name == "Description"
+ for cells in book.get_sheet_by_name(name).iter_rows()
+ for value in cells
+ if value != ""
+ ]
+ for name in book.sheet_names:
+ if name == "Description":
+ continue
+ sheet = book.get_sheet_by_name(name)
+ cells = enumerate(sheet.iter_rows(), 1)
+ preamble: list[tuple[int, list[object]]] = []
+ for line, raw in cells:
+ row = list[object](raw)
+ offset = 1 if row and str(row[0]).lower() == "date" else 0
+ if [str(v).lower() for v in row[offset : offset + 4]] == [
+ "year",
+ "month",
+ "day",
+ "hour",
+ ]:
+ break
+ preamble.append((line, row))
+ else:
+ continue
+ start = offset + 4
+ columns = [_column(str(label)) for label in row[start:]]
+ labels = {
+ f"{component}.{zone}": str(label)
+ for (component, zone), label in zip(
+ columns, row[start:], strict=True
+ )
+ }
+ if len(labels) != len(columns):
+ raise ValueError(f"{member}/{name}: duplicate forecast columns")
+ # The 2023 workbook explicitly merges MW over every value column.
+ unit: Literal["MW"] | None = None
+ for unit_line, unit_values in preamble:
+ if (
+ len(unit_values) > start
+ and unit_values[start] == "MW"
+ and ((unit_line - 1, start), (unit_line - 1, len(row) - 1))
+ in (sheet.merged_cell_ranges or [])
+ ):
+ unit = "MW"
+ for line, values in cells:
+ if not any(v != "" for v in values):
+ continue
+ components: dict[str, dict[str, Decimal | None]] = {}
+ for (component, zone), value in zip(
+ columns, values[start:], strict=True
+ ):
+ components.setdefault(component, {})[zone] = _number(value)
+ day, hour, source_date = _forecast_clock(values, offset)
+ found = True
+ yield HourlyLoadForecast.model_validate(
+ dict(
+ forecastDate=day,
+ hour=hour,
+ sourceDate=source_date,
+ unit=unit,
+ sourceLabels=labels,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet=name,
+ sourceRow=line,
+ **{
+ key: WeatherZoneForecastValues(**value)
+ for key, value in components.items()
+ },
+ )
+ )
+ if not found:
+ raise ValueError("No hourly load forecast tables found")
diff --git a/tinyercot/_legacy_load.py b/tinyercot/_legacy_load.py
new file mode 100644
index 00000000..7271ebb7
--- /dev/null
+++ b/tinyercot/_legacy_load.py
@@ -0,0 +1,285 @@
+"""Pre-2002 hourly loads; source entities and units are never conflated."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from datetime import date
+from decimal import Decimal, InvalidOperation
+from typing import Literal
+
+from pydantic import BaseModel, ConfigDict
+
+
+class LegacyHourlyLoad(BaseModel):
+ """One entity/hour measurement, retaining source units and provenance.
+
+ A missing unit means the source text does not state one. EEI MWh/hour is
+ represented as MW. No demand values are rescaled. Card headers are retained
+ verbatim because ERCOT contributors populated their metadata differently.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ hourEnding: int
+ entity: str
+ entityType: Literal["system", "control_area", "load_serving_entity"]
+ controlArea: str | None = None
+ demand: Decimal | None
+ unit: Literal["MW", "kW"] | None
+ sourceMember: str
+ sourceError: Literal["#VALUE!"] | None = None
+ sourceSheet: str | None = None
+ sourceCardHeader: str | None = None
+
+
+def read_legacy(
+ data: bytes, *, filename: str = "download"
+) -> Iterator[LegacyHourlyLoad]:
+ """Read a legacy load ZIP, XLS or named text file; skip companion forecasts."""
+ from ._history import _archive_files
+
+ members = (
+ _archive_files(data, "*")
+ if data.startswith(b"PK")
+ else iter([(filename, data)])
+ )
+ found = False
+ for name, content in members:
+ base = name.rsplit("/", 1)[-1]
+ if base.upper() in {
+ "ERCOTWINDEM.TXT",
+ "ERCOTERYPROJ.TXT",
+ "ERCOTSUMDEM.TXT",
+ } or re.fullmatch(r"[A-Z]+FORE\.96", base.upper()):
+ continue
+ try:
+ if content.startswith(b"\xd0\xcf\x11\xe0"):
+ yield from _xls(content, name)
+ elif base.lower() in {
+ "erceei95.txt",
+ "erceei97.txt",
+ } or base.upper().endswith("LD.EEI"):
+ yield from _eei(content.decode("ascii"), name)
+ elif content.startswith(b"ERCOT Hourly Load Data for 1996"):
+ yield from _system_1996(content.decode("ascii"), name)
+ elif re.match(rb"ERCOT (?:1999|2000) Hourly Load", content):
+ yield from _control_text(content.decode("ascii"), name)
+ else:
+ raise ValueError(
+ "Unsupported legacy hourly load file; pass the original filename for EEI text"
+ )
+ found = True
+ except (ValueError, TypeError) as error:
+ raise ValueError(f"{name}: {error}") from error
+ if not found:
+ raise ValueError("Download contains no legacy hourly load data")
+
+
+def _number(value: object) -> Decimal | None:
+ if value is None or value == "":
+ return None
+ try:
+ return Decimal(str(value).replace(",", ""))
+ except InvalidOperation as error:
+ raise ValueError(f"Invalid source demand: {value!r}") from error
+
+
+def _eei(text: str, filename: str) -> Iterator[LegacyHourlyLoad]:
+ base = filename.rsplit("/", 1)[-1]
+ area = re.fullmatch(r"([A-Z]+)\d{2}LD\.EEI", base.upper())
+ if area is None and base.lower() not in {"erceei95.txt", "erceei97.txt"}:
+ raise ValueError("Unrecognized EEI entity filename")
+ entity = area[1] if area else "ERCOT"
+ for line, card in enumerate(text.splitlines(), 1):
+ if not card.strip():
+ continue
+ if len(card) < 80 or card[80:].strip() or card[6] not in "12":
+ raise ValueError(f"line {line}: unsupported EEI card")
+ day = date(1900 + int(card[4:6]), int(card[:2]), int(card[2:4]))
+ first_hour = 1 if card[6] == "1" else 13
+ for position in range(12):
+ yield LegacyHourlyLoad(
+ operatingDay=day,
+ hourEnding=first_hour + position,
+ entity=entity,
+ entityType="control_area" if area else "system",
+ controlArea=entity if area else None,
+ demand=_number(card[20 + position * 5 : 25 + position * 5].strip()),
+ unit="MW",
+ sourceMember=filename,
+ sourceCardHeader=card[:20],
+ )
+
+
+def _system_1996(text: str, filename: str) -> Iterator[LegacyHourlyLoad]:
+ started = False
+ for line, value in enumerate(text.splitlines(), 1):
+ if not value.strip():
+ continue
+ match = re.fullmatch(r"\s*(\d+)\s+(\d+)\s+(\d{2})\s+(\d+)\s+([\d,]+)\s*", value)
+ if match:
+ started = True
+ yield LegacyHourlyLoad(
+ operatingDay=date(1900 + int(match[3]), int(match[1]), int(match[2])),
+ hourEnding=int(match[4]),
+ entity="ERCOT",
+ entityType="system",
+ demand=_number(match[5]),
+ unit=None,
+ sourceMember=filename,
+ )
+ elif started:
+ raise ValueError(f"line {line}: unsupported system-load row")
+ if not started:
+ raise ValueError("Missing system-load table")
+
+
+_CONTROL_1999 = (
+ "AENX",
+ "CPST",
+ "CSWS",
+ "LCRA",
+ "PUBX",
+ "REIT",
+ "STEC",
+ "TMPP",
+ "TNMP",
+ "TUET",
+)
+_CONTROL_2000 = (
+ "AENX",
+ "AEPX",
+ "CPST",
+ "LCRA",
+ "BPUB",
+ "REIT",
+ "STEC",
+ "TMPP",
+ "TNMP",
+ "TUET",
+)
+
+
+def _control_text(text: str, filename: str) -> Iterator[LegacyHourlyLoad]:
+ old = text.startswith("ERCOT 1999")
+ codes = _CONTROL_1999 if old else _CONTROL_2000
+ expected = (
+ [*codes, "ERCOT", "TOTAL", "M", "D", "Year", "HR"]
+ if old
+ else ["M", "D", "HR", *codes, "ERCOT", "TUET", "ERCOT", "TOTAL"]
+ )
+ started = False
+ for line, value in enumerate(text.splitlines(), 1):
+ parts = value.split()
+ if parts == expected:
+ started = True
+ continue
+ if not started or not parts:
+ continue
+ if len(parts) != (15 if old else 14):
+ raise ValueError(f"line {line}: unexpected control-area columns")
+ if old:
+ month, day, year, hour = map(int, parts[-4:])
+ amounts = parts[:11]
+ else:
+ month, day, hour = map(int, parts[:3])
+ year = 2000
+ amounts = parts[3:]
+ for entity, amount in zip((*codes, "ERCOT TOTAL"), amounts, strict=True):
+ system = entity == "ERCOT TOTAL"
+ yield LegacyHourlyLoad(
+ operatingDay=date(year, month, day),
+ hourEnding=hour,
+ entity=entity,
+ entityType="system" if system else "control_area",
+ controlArea=None if system else entity,
+ demand=None if amount == "#VALUE!" else _number(amount),
+ sourceError="#VALUE!" if amount == "#VALUE!" else None,
+ unit=None,
+ sourceMember=filename,
+ )
+ if not started:
+ raise ValueError("Missing supported control-area header")
+
+
+def _xls(data: bytes, filename: str) -> Iterator[LegacyHourlyLoad]:
+ try:
+ import xlrd
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read XLS load archives"
+ ) from error
+ found = False
+ with xlrd.open_workbook(file_contents=data) as book:
+ for sheet in book.sheets():
+ title = sheet.cell_value(0, 0) if sheet.nrows and sheet.ncols else ""
+ if title == "ERCOT - Composite Load":
+ if (
+ sheet.ncols != 25
+ or sheet.cell_value(3, 0) != "Date"
+ or sheet.cell_value(0, 14) != "mw"
+ ):
+ raise ValueError("Unsupported composite-load columns or units")
+ hours = [
+ round(float(sheet.cell_value(3, j)) * 24) or 24
+ for j in range(1, 25)
+ ]
+ if hours != list(range(1, 25)):
+ raise ValueError("Unsupported composite hour labels")
+ found = True
+ for i in range(4, sheet.nrows):
+ operating_day = xlrd.xldate_as_datetime(
+ float(sheet.cell_value(i, 0)), book.datemode
+ ).date()
+ for j, hour in enumerate(hours, 1):
+ yield LegacyHourlyLoad(
+ operatingDay=operating_day,
+ hourEnding=hour,
+ entity="ERCOT",
+ entityType="system",
+ demand=_number(sheet.cell_value(i, j)),
+ unit="MW",
+ sourceMember=filename,
+ sourceSheet=sheet.name,
+ )
+ elif title == "ERCOT FERC 714 1998 Hourly Demand Data":
+ if list(sheet.row_values(5))[:4] != [
+ "MONTH",
+ "DAY",
+ "YEAR",
+ "HOUR ENDING",
+ ] or any(
+ sheet.cell_value(5, j) != "HOURLY DEMAND kW"
+ for j in range(4, sheet.ncols)
+ ):
+ raise ValueError("Unsupported LSE-load columns or units")
+ found = True
+ for i in range(6, sheet.nrows):
+ month, day, year, hour = (
+ int(sheet.cell_value(i, j)) for j in range(4)
+ )
+ for j in range(4, sheet.ncols):
+ entity = str(sheet.cell_value(3, j))
+ control = str(sheet.cell_value(4, j))
+ yield LegacyHourlyLoad(
+ operatingDay=date(year, month, day),
+ hourEnding=hour,
+ entity=entity,
+ entityType="system"
+ if entity == "TOTAL"
+ else "load_serving_entity",
+ controlArea=control,
+ demand=_number(sheet.cell_value(i, j)),
+ unit="kW",
+ sourceMember=filename,
+ sourceSheet=sheet.name,
+ )
+ elif sheet.name not in {
+ "ANNUAL ENERGY PROJECTION MWH",
+ "SUMMER PEAK DEAMND MW",
+ "WINTER PEAK DEMAND MW",
+ }:
+ raise ValueError(f"Unsupported legacy worksheet: {sheet.name}")
+ if not found:
+ raise ValueError("Workbook contains no legacy hourly loads")
diff --git a/tinyercot/_load.py b/tinyercot/_load.py
new file mode 100644
index 00000000..bf4b856c
--- /dev/null
+++ b/tinyercot/_load.py
@@ -0,0 +1,397 @@
+"""Public hourly load files, independent of the Public Reports API."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from copy import copy
+from datetime import date, datetime, timedelta
+from decimal import Decimal
+from html.parser import HTMLParser
+from io import BytesIO
+from struct import unpack
+from time import strptime
+from typing import Literal
+from urllib.parse import urljoin, urlsplit
+from zipfile import BadZipFile, ZipFile, ZipInfo
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import LegacyHourlyLoad, read_legacy
+
+INDEX_URL = "https://www.ercot.com/gridinfo/load/load_hist"
+_COLUMNS = (
+ "coast",
+ "east",
+ "farWest",
+ "north",
+ "northC",
+ "southern",
+ "southC",
+ "west",
+ "total",
+)
+_HEADERS = (
+ (
+ "Hour_End",
+ "COAST",
+ "EAST",
+ "FAR_WEST",
+ "NORTH",
+ "NORTH_C",
+ "SOUTHERN",
+ "SOUTH_C",
+ "WEST",
+ "ERCOT",
+ ),
+ (
+ "Hour Ending",
+ "COAST",
+ "EAST",
+ "FWEST",
+ "NORTH",
+ "NCENT",
+ "SOUTH",
+ "SCENT",
+ "WEST",
+ "ERCOT",
+ ),
+ (
+ "HourEnding",
+ "COAST",
+ "EAST",
+ "FWEST",
+ "NORTH",
+ "NCENT",
+ "SOUTH",
+ "SCENT",
+ "WEST",
+ "ERCOT",
+ ),
+)
+
+
+class LoadArchive(BaseModel):
+ """An actual index link; year is the published label, not a coverage guarantee."""
+
+ year: int
+ title: str
+ url: str
+
+
+class WeatherZoneLoad(BaseModel):
+ """One published hour, keeping weather zones and the ERCOT total distinct.
+
+ Hour ending is 1–24 on operatingDay. The source's literal DST suffix is kept
+ without interpreting it as a UTC offset or the API's repeat-hour flag.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ hourEnding: int
+ dstLabel: Literal["DST"] | None = None
+ sourceHourEnding: str
+ sourceMember: str
+ sourceSheet: str
+ coast: Decimal | None
+ east: Decimal | None
+ farWest: Decimal | None
+ north: Decimal | None
+ northC: Decimal | None
+ southern: Decimal | None
+ southC: Decimal | None
+ west: Decimal | None
+ total: Decimal | None
+
+
+class _Links(HTMLParser):
+ def __init__(
+ self,
+ *,
+ index_url: str = INDEX_URL,
+ title_pattern: str = r"(\d{4}) ERCOT Hourly Load Data(?: \(Raw\))?",
+ ) -> None:
+ super().__init__()
+ self.index_url = index_url
+ self.title_pattern = title_pattern
+ self.href: str | None = None
+ self.title = ""
+ self.archives: dict[str, LoadArchive] = {}
+
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
+ if tag == "a":
+ self.href = dict(attrs).get("href")
+ self.title = ""
+
+ def handle_data(self, data: str) -> None:
+ if self.href is not None:
+ self.title += data
+
+ def handle_endtag(self, tag: str) -> None:
+ if tag != "a" or self.href is None:
+ return
+ title = " ".join(self.title.split())
+ match = re.fullmatch(self.title_pattern, title)
+ url = urljoin(self.index_url, self.href)
+ parts = urlsplit(url)
+ if (
+ match
+ and parts.scheme == "https"
+ and parts.netloc == "www.ercot.com"
+ and parts.path.startswith("/files/docs/")
+ ):
+ self.archives[url] = LoadArchive(year=int(match[1]), title=title, url=url)
+ self.href = None
+
+
+class HourlyLoad:
+ """Public hourly loads across system, control-area and weather-zone formats."""
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def archives(self) -> list[LoadArchive]:
+ response = self._http.get(INDEX_URL, follow_redirects=True)
+ response.raise_for_status()
+ links = _Links()
+ links.feed(response.text)
+ if not links.archives:
+ raise ValueError("No hourly load archives found in ERCOT's public index")
+ return sorted(links.archives.values(), key=lambda item: (item.year, item.url))
+
+ def download(self, archive: LoadArchive) -> bytes:
+ response = self._http.get(archive.url, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+ def legacy(
+ self, *, date_from: date | None = None, date_to: date | None = None
+ ) -> Iterator[LegacyHourlyLoad]:
+ """Read pre-2002 system, control-area and LSE hourly files.
+
+ Date bounds apply to file contents. All older files are considered because
+ index year labels disagree with their contents. Overlaps remain visible.
+ Companion forecast tables are not included in this hourly reader.
+ """
+ if date_from is not None and date_to is not None and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for archive in self.archives():
+ if archive.year >= 2002:
+ continue
+ for row in self.read_legacy(
+ self.download(archive),
+ filename=urlsplit(archive.url).path.rsplit("/", 1)[-1],
+ ):
+ if (date_from is None or row.operatingDay >= date_from) and (
+ date_to is None or row.operatingDay <= date_to
+ ):
+ yield row
+
+ def read_legacy(
+ self, data: bytes, *, filename: str = "download"
+ ) -> Iterator[LegacyHourlyLoad]:
+ """Read saved legacy files; EEI text needs its original filename."""
+ yield from read_legacy(data, filename=filename)
+
+ def weather_zones(
+ self, *, date_from: date | None = None, date_to: date | None = None
+ ) -> Iterator[WeatherZoneLoad]:
+ """Read weather-zone archives with inclusive operating-date bounds.
+
+ Older control-area/system-only sources use different formats and are not
+ included. Source errors propagate; missing years are never synthesized.
+ """
+ if date_from is not None and date_to is not None and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for archive in self.archives():
+ if (
+ archive.year < 2002
+ or (date_from and archive.year < date_from.year)
+ or (date_to and archive.year > date_to.year)
+ ):
+ continue
+ yield from (
+ row
+ for row in self.read_weather_zones(self.download(archive))
+ if (date_from is None or row.operatingDay >= date_from)
+ and (date_to is None or row.operatingDay <= date_to)
+ )
+
+ def read_weather_zones(self, data: bytes) -> Iterator[WeatherZoneLoad]:
+ """Read an XLS/XLSX workbook or ZIP with the optional ``files`` extra."""
+ found = False
+ for filename, content in _workbooks(data):
+ for sheet, lines in _sheets(content):
+ header = next(lines, ())
+ while header and header[-1] in (None, ""):
+ header = header[:-1]
+ if header not in _HEADERS:
+ raise ValueError(
+ f"{filename}/{sheet}: unsupported weather-zone header"
+ )
+ found = True
+ for line, cells in enumerate(lines, 2):
+ while cells and cells[-1] in (None, ""):
+ cells = cells[:-1]
+ if not cells:
+ continue
+ try:
+ if len(cells) > 10:
+ raise ValueError(
+ "Expected hour ending and nine load columns"
+ )
+ cells += (None,) * (10 - len(cells))
+ day, hour, dst = _clock(cells[0])
+ values: dict[str, object] = {
+ "operatingDay": day,
+ "hourEnding": hour,
+ "dstLabel": dst,
+ "sourceHourEnding": str(cells[0]),
+ "sourceMember": filename,
+ "sourceSheet": sheet,
+ }
+ for name, value in zip(_COLUMNS, cells[1:], strict=True):
+ if value is None or value == "":
+ values[name] = None
+ continue
+ if not isinstance(
+ value, (int, float, Decimal)
+ ) or isinstance(value, bool):
+ raise TypeError(f"Missing or nonnumeric load in {name}")
+ values[name] = Decimal(str(value))
+ yield WeatherZoneLoad.model_validate(values)
+ except (ValueError, TypeError) as error:
+ raise ValueError(
+ f"{filename}/{sheet}:{line}: {error}"
+ ) from error
+ if not found:
+ raise ValueError("Download contains no weather-zone workbooks")
+
+
+def _workbooks(data: bytes) -> Iterator[tuple[str, bytes]]:
+ if data.startswith(b"\xd0\xcf\x11\xe0"):
+ yield "workbook.xls", data
+ return
+ with ZipFile(BytesIO(data)) as archive:
+ if "[Content_Types].xml" in archive.namelist():
+ yield "workbook.xlsx", data
+ return
+ for member in archive.infolist():
+ name = member.filename
+ if name.lower().endswith((".xls", ".xlsx")):
+ yield name, _workbook_member(archive, member, data)
+ elif name.lower().endswith(".zip"):
+ yield from _workbooks(_workbook_member(archive, member, data))
+
+
+def _workbook_member(archive: ZipFile, member: ZipInfo, data: bytes) -> bytes:
+ try:
+ return archive.read(member)
+ except BadZipFile:
+ # ERCOT's 2026 annual ZIP has stale directory sizes/CRC, but a complete
+ # local header and intact workbook. Retry using that header; ZipFile
+ # still verifies the filename, member boundaries and local CRC.
+ header = data[member.header_offset : member.header_offset + 30]
+ if len(header) != 30 or header[:4] != b"PK\x03\x04":
+ raise
+ _, _, flags, method, _, _, crc, compressed, size, _, _ = unpack(
+ "<4s5H3I2H", header
+ )
+ if (
+ flags != member.flag_bits
+ or flags & 9 # Encrypted entries or sizes supplied by a descriptor.
+ or method != member.compress_type
+ or max(compressed, size) == 0xFFFFFFFF # ZIP64 needs extra fields.
+ or (crc, compressed, size)
+ == (member.CRC, member.compress_size, member.file_size)
+ ):
+ raise
+ local = copy(member)
+ local.CRC, local.compress_size, local.file_size = crc, compressed, size
+ content = archive.read(local)
+ if len(content) != size:
+ raise BadZipFile(f"{member.filename}: local uncompressed size mismatch")
+ return content
+
+
+def _sheets(
+ data: bytes, *, date_columns: tuple[int, ...] = (0,), preserve_types: bool = False
+) -> Iterator[tuple[str, Iterator[tuple[object, ...]]]]:
+ if data.startswith(b"\xd0\xcf\x11\xe0"):
+ try:
+ import xlrd
+ from xlrd.biffh import XLRDError
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read XLS archives"
+ ) from error
+ try:
+ book = xlrd.open_workbook(file_contents=data)
+ except XLRDError as error:
+ if str(error) != "Workbook is encrypted":
+ raise
+ from ._office import _unprotect_excel
+
+ book = xlrd.open_workbook(file_contents=_unprotect_excel(data))
+ with book:
+ for sheet in book.sheets():
+
+ def rows(
+ sheet: xlrd.sheet.Sheet = sheet,
+ ) -> Iterator[tuple[object, ...]]:
+ for i in range(sheet.nrows):
+ values: list[object] = list(sheet.row_values(i))
+ if preserve_types:
+ for j, cell in enumerate(sheet.row(i)):
+ if cell.ctype == xlrd.XL_CELL_DATE:
+ values[j] = xlrd.xldate_as_datetime(
+ float(cell.value), book.datemode
+ )
+ elif cell.ctype == xlrd.XL_CELL_ERROR:
+ values[j] = xlrd.error_text_from_code[
+ int(cell.value)
+ ]
+ elif cell.ctype == xlrd.XL_CELL_BOOLEAN:
+ values[j] = bool(cell.value)
+ for column in date_columns:
+ value = values[column] if len(values) > column else None
+ if i and isinstance(value, float):
+ values[column] = xlrd.xldate_as_datetime(
+ value, book.datemode
+ )
+ yield tuple(values)
+
+ yield sheet.name, rows()
+ else:
+ try:
+ from openpyxl import load_workbook
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read XLSX archives"
+ ) from error
+ book_xlsx = load_workbook(BytesIO(data), read_only=True, data_only=True)
+ try:
+ for sheet_xlsx in book_xlsx:
+ sheet_xlsx.reset_dimensions()
+ yield sheet_xlsx.title, sheet_xlsx.values
+ finally:
+ book_xlsx.close()
+
+
+def _clock(value: object) -> tuple[date, int, Literal["DST"] | None]:
+ if isinstance(value, datetime):
+ # Old Excel serials have millisecond noise despite displaying whole hours.
+ stamp = (value + timedelta(milliseconds=500)).replace(microsecond=0)
+ if stamp.minute or stamp.second:
+ raise ValueError("Expected a whole hour-ending value")
+ return (stamp - timedelta(hours=1)).date(), stamp.hour or 24, None
+ if isinstance(value, str):
+ match = re.fullmatch(r"(\d{2}/\d{2}/\d{4}) (\d{2}):00( DST)?", value)
+ if match and 1 <= int(match[2]) <= 24:
+ return (
+ date(*strptime(match[1], "%m/%d/%Y")[:3]),
+ int(match[2]),
+ "DST" if match[3] else None,
+ )
+ raise ValueError(f"Unsupported hour ending: {value!r}")
diff --git a/tinyercot/_load_forecasts.py b/tinyercot/_load_forecasts.py
new file mode 100644
index 00000000..b4c6e47c
--- /dev/null
+++ b/tinyercot/_load_forecasts.py
@@ -0,0 +1,146 @@
+"""Monthly public load forecasts and shared forecast-file discovery."""
+
+from __future__ import annotations
+
+from collections.abc import Callable, Iterator
+from decimal import Decimal
+from typing import Literal, TypeVar
+from urllib.parse import urlsplit
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._public_tables import PublicFile, _PublicTable, _year_files
+
+
+class _ForecastRow(BaseModel):
+ model_config = ConfigDict(extra="forbid")
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+ sourceFile: PublicFile | None = None
+
+
+T = TypeVar("T", bound=_ForecastRow)
+
+
+class _ForecastTable(_PublicTable[T]):
+ index_url = "https://www.ercot.com/gridinfo/load/forecast"
+ extensions: tuple[str, ...] = (".xls", ".xlsx")
+
+ def files(self) -> list[PublicFile]:
+ return [
+ f
+ for f in _year_files(self._http, self.index_url, self.title_pattern)
+ if urlsplit(f.url).path.lower().endswith(self.extensions)
+ ]
+
+ def rows(self, *, where: Callable[[T], bool] | None = None) -> Iterator[T]:
+ for file in self.files():
+ for row in self.read(
+ self.download(file), filename=file.url.rsplit("/", 1)[-1]
+ ):
+ row.sourceFile = file
+ if where is None or where(row):
+ yield row
+
+
+class MonthlyLoadForecast(_ForecastRow):
+ """A source month/value pair; unlabelled dates and units remain unknown."""
+
+ forecastYear: int | None
+ forecastMonth: int | None
+ peakDemand: Decimal | None
+ energy: Decimal | None
+ peakUnit: Literal["MW"] | None
+ energyUnit: Literal["MWh"] | None
+ sourcePeakLabel: str
+ sourceEnergyLabel: str
+ sourceTitle: str | None
+ sourceColumn: int
+ sourceNotes: list[str]
+
+
+def _period(value: object) -> int | None:
+ if value in (None, "", "year", "month", "Year", "Month"):
+ return None
+ return int(str(value).removesuffix(".0"))
+
+
+class MonthlyLoadForecasts(_ForecastTable[MonthlyLoadForecast]):
+ title_pattern = (
+ r"(?:\d{4} )?ERCOT Monthly Peak Demand and Energy Forecast(?: \d{4})?"
+ )
+
+ def _read(self, data: bytes, filename: str) -> Iterator[MonthlyLoadForecast]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, iterator in _sheets(content, date_columns=()):
+ rows = list(iterator)
+ notes = [
+ v
+ for row in rows
+ for v in row
+ if isinstance(v, str) and v.startswith("This forecast ")
+ ]
+ # Two 2025 tables share rows, with independently labelled dates.
+ blocks: list[tuple[int, str, str, str | None]] = []
+ for line, row in enumerate(rows, 1):
+ headers = [
+ i
+ for i, value in enumerate(row)
+ if value in ("Peak (MW)", "Monthly Peaks")
+ ]
+ if headers:
+ blocks = []
+ for peak in headers:
+ energy = str(row[peak + 1])
+ if energy not in (
+ "Energy (Mwh)",
+ "Energy (MWh)",
+ "Annual Energy",
+ ):
+ raise ValueError(
+ f"{member}/{sheet}: unknown energy header {energy!r}"
+ )
+ title = next(
+ (
+ v
+ for earlier in reversed(rows[: line - 1])
+ for v in earlier[peak - 2 : peak + 2]
+ if isinstance(v, str) and "Forecast" in v
+ ),
+ None,
+ )
+ blocks.append((peak - 2, str(row[peak]), energy, title))
+ continue
+ for start, peak_label, energy_label, title in blocks:
+ values = list(row[start : start + 4])
+ values.extend([None] * (4 - len(values)))
+ if all(v in (None, "") for v in values):
+ continue
+ year, month, peak_value, energy_value = values
+
+ found = True
+ yield MonthlyLoadForecast(
+ forecastYear=_period(year),
+ forecastMonth=_period(month),
+ peakDemand=_number(peak_value),
+ energy=_number(energy_value),
+ peakUnit="MW" if peak_label == "Peak (MW)" else None,
+ energyUnit="MWh"
+ if energy_label.startswith("Energy (")
+ else None,
+ sourcePeakLabel=peak_label,
+ sourceEnergyLabel=energy_label,
+ sourceTitle=title,
+ sourceColumn=start + 1,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=line,
+ )
+ if not found:
+ raise ValueError("No monthly load forecast tables found")
diff --git a/tinyercot/_load_profiles.py b/tinyercot/_load_profiles.py
new file mode 100644
index 00000000..07a78de0
--- /dev/null
+++ b/tinyercot/_load_profiles.py
@@ -0,0 +1,397 @@
+"""Public annual backcasted load profiles used in retail settlement."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date, datetime
+from decimal import Decimal
+from typing import Literal
+from urllib.parse import unquote, urlsplit
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import LoadArchive, _Links, _sheets, _workbooks
+
+INDEX_URL = "https://www.ercot.com/mktinfo/loadprofile/alp"
+ADJUSTMENTS_URL = "https://www.ercot.com/files/docs/2008/10/03/hurricane_ike_adj_factors_for_coast_wzone.xls"
+COUNTS_URL = "https://www.ercot.com/files/docs/2021/10/21/Profile_Type_Counts.zip"
+_COUNT_HEADER = ("WEATHERZONE", "METERDATATYPE", "TDSPNAME", "PROFILETYPE", "RECORDS")
+_FACTOR_HEADER = ("Date",) + tuple(f"INT{i}" for i in range(1, 97))
+_ORIGINAL_HEADER = ("DATE", "PType_WZ") + tuple(f"INT{i}" for i in range(1, 97))
+
+
+class LoadProfileInterval(BaseModel):
+ """A numbered 15-minute source cell; blank cells remain None.
+
+ All published columns remain in source order, including unused DST columns.
+ Interval numbers are not wall-clock times or UTC offsets.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ interval: int
+ energyKWh: Decimal | None
+
+
+class LoadProfileDay(BaseModel):
+ """A modeled profile/day, not individual metered consumption.
+
+ sourceAddTime retains ADDTIME where published, with no inferred timezone
+ or assertion that it establishes when the data became publicly available.
+ Auxiliary workbooks retain their separate identity during model transitions.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ profile: str
+ kind: Literal["backcast", "auxiliary", "original"]
+ intervals: list[LoadProfileInterval]
+ sourceAddTime: datetime | None
+ sourceMember: str
+ sourceSheet: str
+
+ @property
+ def profileType(self) -> str:
+ return self.profile.rsplit("_", 1)[0]
+
+ @property
+ def weatherZone(self) -> str:
+ return self.profile.rsplit("_", 1)[1]
+
+
+class LoadProfileAdjustment(BaseModel):
+ """One published Hurricane Ike factor for the COAST weather zone.
+
+ Factors remain separate from kWh profiles; they are never applied implicitly.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ interval: int
+ factor: Decimal | None
+ weatherZone: Literal["COAST"] = "COAST"
+ sourceMember: str
+ sourceSheet: str
+
+
+class LoadProfileCount(BaseModel):
+ """An assignment count from a published profile-count snapshot.
+
+ snapshotDate comes from the filename, not a public-availability timestamp.
+ Malformed/missing labels remain visible with snapshotDate=None.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ snapshotDate: date | None
+ sourceDateLabel: str | None
+ weatherZone: str | None
+ meterDataType: str
+ tdsp: str
+ profileType: str
+ records: int
+ sourceMember: str
+ sourceSheet: str
+
+
+class LoadProfiles:
+ """Anonymous annual XLS/XLSX histories; decoding uses tinyercot[files]."""
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def archives(self) -> list[LoadArchive]:
+ response = self._http.get(INDEX_URL, follow_redirects=True)
+ response.raise_for_status()
+ links = _Links(
+ index_url=INDEX_URL, title_pattern=r"(\d{4}) Actual Load Profiles"
+ )
+ links.feed(response.text)
+ if not links.archives:
+ raise ValueError("No load-profile archives found in ERCOT's public index")
+ return sorted(links.archives.values(), key=lambda item: (item.year, item.url))
+
+ def download(self, archive: LoadArchive) -> bytes:
+ response = self._http.get(archive.url, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+ def rows(
+ self,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ profile: str | None = None,
+ ) -> Iterator[LoadProfileDay]:
+ """Stream daily profiles with inclusive dates and an exact profile filter.
+
+ Download only indexed years intersecting the bounds. Preserve source gaps
+ and overlapping backcast/auxiliary rows, without filling or deduplicating.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for archive in self.archives():
+ if (date_from and archive.year < date_from.year) or (
+ date_to and archive.year > date_to.year
+ ):
+ continue
+ yield from self.read(
+ self.download(archive),
+ filename=unquote(urlsplit(archive.url).path.rsplit("/", 1)[-1]),
+ date_from=date_from,
+ date_to=date_to,
+ profile=profile,
+ )
+
+ def read(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ date_from: date | None = None,
+ date_to: date | None = None,
+ profile: str | None = None,
+ ) -> Iterator[LoadProfileDay]:
+ """Read a saved ZIP or workbook; retain the filename for auxiliary XLS.
+
+ Filters have the same meaning as rows(). Each result retains all interval
+ cells, including blanks, plus the original workbook and worksheet names.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=(0, 1, 102)):
+ # Historical workbooks put explanatory notes before the table.
+ header = next(
+ (
+ r
+ for r in rows
+ if len(r) > 2
+ and (
+ r[1] in {"Date", "ERC_TRADE_DATE"}
+ or r[:2] in {("DATE", "PType_WZ"), ("Date", "INT1")}
+ )
+ ),
+ None,
+ )
+ if header is None:
+ raise ValueError(f"{member}/{sheet}: Missing load-profile header")
+ header = tuple(header)
+ while header and header[-1] in (None, ""):
+ header = header[:-1]
+ if header == _FACTOR_HEADER:
+ continue # Available separately through read_adjustments().
+ original = header == _ORIGINAL_HEADER
+ if not original and (
+ header[:2]
+ not in {
+ ("PType_WZ", "Date"),
+ ("Profile Type and Weather Zone", "ERC_TRADE_DATE"),
+ ("Profile Type & Weather Zone", "ERC_TRADE_DATE"),
+ }
+ or header[2:102]
+ not in {
+ tuple(f"int_kWh{i}" for i in range(1, 101)),
+ tuple(f"INT{i:03}" for i in range(1, 101)),
+ }
+ or header[102:] not in {(), ("ADDTIME",)}
+ ):
+ raise ValueError(
+ f"{member}/{sheet}: Unsupported load-profile columns"
+ )
+ found = True
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ interval_end = 98 if original else 102
+ if len(cells) < interval_end or any(
+ c not in (None, "") for c in cells[len(header) :]
+ ):
+ raise ValueError(
+ f"{member}/{sheet}: Unexpected load-profile row width"
+ )
+ name, stamp = cells[1::-1] if original else cells[:2]
+ if (
+ not isinstance(name, str)
+ or "_" not in name
+ or not isinstance(stamp, datetime)
+ ):
+ raise ValueError(
+ f"{member}/{sheet}: Invalid profile or trade date"
+ )
+ day = stamp.date()
+ if (
+ (profile is not None and name != profile)
+ or (date_from and day < date_from)
+ or (date_to and day > date_to)
+ ):
+ continue
+ added = (
+ cells[102] if len(header) == 103 and len(cells) > 102 else None
+ )
+ if added == "":
+ added = None
+ if added is not None and not isinstance(added, datetime):
+ raise ValueError(f"{member}/{sheet}: Invalid ADDTIME value")
+ yield LoadProfileDay(
+ operatingDay=day,
+ profile=name,
+ kind="original"
+ if original
+ else "auxiliary"
+ if "auxiliary" in member.lower()
+ else "backcast",
+ intervals=[
+ LoadProfileInterval(interval=i, energyKWh=_number(value))
+ for i, value in enumerate(cells[2:interval_end], 1)
+ ],
+ sourceAddTime=added,
+ sourceMember=member,
+ sourceSheet=sheet,
+ )
+ if not found:
+ raise ValueError("Download contains no load-profile workbooks")
+
+ def adjustments(
+ self, *, date_from: date | None = None, date_to: date | None = None
+ ) -> Iterator[LoadProfileAdjustment]:
+ """Read Hurricane Ike factors directly, with inclusive operating dates."""
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ response = self._http.get(ADJUSTMENTS_URL, follow_redirects=True)
+ response.raise_for_status()
+ for row in self.read_adjustments(
+ response.content, filename=ADJUSTMENTS_URL.rsplit("/", 1)[-1]
+ ):
+ if (date_from is None or row.operatingDay >= date_from) and (
+ date_to is None or row.operatingDay <= date_to
+ ):
+ yield row
+
+ def read_adjustments(
+ self, data: bytes, *, filename: str = "workbook"
+ ) -> Iterator[LoadProfileAdjustment]:
+ """Read the companion factor table; other worksheets contribute no rows."""
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content):
+ if sheet != "Adjustment Factors":
+ continue
+ if next(rows, ()) != _FACTOR_HEADER:
+ raise ValueError(
+ f"{member}/{sheet}: Unsupported adjustment columns"
+ )
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ if len(cells) != 97 or not isinstance(cells[0], datetime):
+ raise ValueError(f"{member}/{sheet}: Invalid adjustment row")
+ for i, value in enumerate(cells[1:], 1):
+ yield LoadProfileAdjustment(
+ operatingDay=cells[0].date(),
+ interval=i,
+ factor=_number(value),
+ sourceMember=member,
+ sourceSheet=sheet,
+ )
+
+ def counts(
+ self,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[LoadProfileCount], bool] | None = None,
+ ) -> Iterator[LoadProfileCount]:
+ """Stream profile-assignment snapshots with inclusive filename dates.
+
+ Undated snapshots are included when unbounded, excluded with date bounds.
+ Use where for typed weather-zone, TDSP, meter-type or profile filters.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ response = self._http.get(COUNTS_URL, follow_redirects=True)
+ response.raise_for_status()
+ yield from self.read_counts(
+ response.content, date_from=date_from, date_to=date_to, where=where
+ )
+
+ def read_counts(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[LoadProfileCount], bool] | None = None,
+ ) -> Iterator[LoadProfileCount]:
+ """Read saved count ZIPs/workbooks; filename retains the snapshot label.
+
+ Decode the underlying Data table. The workbook's filtered pivot view
+ adds no independent assignments. Empty legacy helper columns are ignored.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ match = re.fullmatch(
+ r"Profile Type Counts (\d+)(?:_corrected)?\s*\.xlsx",
+ member.rsplit("/", 1)[-1],
+ )
+ label = match[1] if match else None
+ day = None
+ if label and len(label) == 8:
+ try:
+ day = date(int(label[:4]), int(label[4:6]), int(label[6:]))
+ except ValueError:
+ pass
+ for sheet, rows in _sheets(content, date_columns=()):
+ if sheet != "Data":
+ continue
+ header = next(rows, ())
+ if header[:5] != _COUNT_HEADER or any(
+ c not in (None, "", "TDSPnmae", "TDSPName") for c in header[5:]
+ ):
+ raise ValueError(
+ f"{member}/{sheet}: Unsupported profile-count columns"
+ )
+ found = True
+ if (date_from and (day is None or day < date_from)) or (
+ date_to and (day is None or day > date_to)
+ ):
+ continue
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ if len(cells) < 5 or any(c not in (None, "") for c in cells[5:]):
+ raise ValueError(
+ f"{member}/{sheet}: Unexpected profile-count row width"
+ )
+ record = LoadProfileCount.model_validate(
+ dict(
+ zip(
+ (
+ "weatherZone",
+ "meterDataType",
+ "tdsp",
+ "profileType",
+ "records",
+ ),
+ cells[:5],
+ strict=True,
+ )
+ )
+ | {
+ "snapshotDate": day,
+ "sourceDateLabel": label,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ }
+ )
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no profile-count Data table")
diff --git a/tinyercot/_load_scenarios.py b/tinyercot/_load_scenarios.py
new file mode 100644
index 00000000..8efea549
--- /dev/null
+++ b/tinyercot/_load_scenarios.py
@@ -0,0 +1,151 @@
+"""Regional hourly load predictions under published historical weather years."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from datetime import date
+from decimal import Decimal
+from typing import Literal
+
+from ._hourly_forecasts import _ZONES, _column, _forecast_clock
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._load_forecasts import _ForecastRow, _ForecastTable
+from ._weather import WeatherZone
+
+
+class HourlyLoadScenario(_ForecastRow):
+ """One forecast hour with separate weather-year predictions and adjustments."""
+
+ forecastDate: date
+ hour: int
+ sourceDate: date | None
+ weatherZone: WeatherZone
+ sourceWeatherZone: str
+ sourceWeatherZoneColumn: str | None
+ weatherYearPredictions: dict[int, Decimal | None]
+ electricVehicles: Decimal | None = None
+ rooftopPV: Decimal | None = None
+ largeFlexibleLoad: Decimal | None = None
+ contractedLoad: Decimal | None = None
+ officerLetterLoad: Decimal | None = None
+ unit: Literal["MW"] | None = None
+ sourceLabels: dict[str, str]
+ sourceMarkers: dict[str, str]
+
+
+def _scenario_value(
+ value: object, label: str, markers: dict[str, str]
+) -> Decimal | None:
+ try:
+ return _number(value)
+ except ValueError:
+ if not isinstance(value, str):
+ raise
+ markers[label] = value
+ return None
+
+
+class HourlyLoadScenarios(_ForecastTable[HourlyLoadScenario]):
+ title_pattern = r"Coast|East|Far West|North Central|North|South Central|South|West"
+ extensions = (".xlsx",)
+
+ def _read(self, data: bytes, filename: str) -> Iterator[HourlyLoadScenario]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for name, source in _sheets(content, date_columns=()):
+ rows = enumerate(source, 1)
+ _, raw_header = next(rows)
+ header_values = list(raw_header)
+ while header_values and header_values[-1] in (None, ""):
+ header_values.pop()
+ header = [str(v) for v in header_values]
+ clock_columns = {
+ label.lower(): i
+ for i, label in enumerate(header)
+ if label.lower() in {"year", "month", "day", "hour", "date"}
+ }
+ if not {"year", "month", "day", "hour"} <= clock_columns.keys():
+ raise ValueError(f"{member}/{name}: missing forecast clock columns")
+ predictions = {
+ i: int(match[1])
+ for i, label in enumerate(header)
+ if (match := re.fullmatch(r"Pred_(\d{4})", label))
+ }
+ if not predictions or len(set(predictions.values())) != len(
+ predictions
+ ):
+ raise ValueError(
+ f"{member}/{name}: missing or duplicate weather-year columns"
+ )
+ zone_column = header.index("wzone") if "wzone" in header else None
+ components = [
+ (i, *_column(label))
+ for i, label in enumerate(header)
+ if i not in clock_columns.values()
+ and i not in predictions
+ and i != zone_column
+ ]
+ labels = {
+ f"weatherYearPredictions.{year}": header[i]
+ for i, year in predictions.items()
+ }
+ labels.update({field: header[i] for i, field, _ in components})
+ if len(labels) != len(predictions) + len(components):
+ raise ValueError(f"{member}/{name}: duplicate load components")
+ for line, values in rows:
+ if not any(v not in (None, "") for v in values):
+ continue
+ if any(v not in (None, "") for v in values[len(header) :]):
+ raise ValueError(f"{member}/{name}: unlabelled forecast values")
+ markers: dict[str, str] = {}
+
+ source_zone = (
+ str(values[zone_column]) if zone_column is not None else name
+ )
+ zone = _ZONES[source_zone.lower()]
+ if any(
+ component_zone != zone for _, _, component_zone in components
+ ):
+ raise ValueError(
+ f"{member}/{name}: load component and source weather zone disagree"
+ )
+ calendar = [
+ values[clock_columns[label]]
+ for label in ("year", "month", "day", "hour")
+ ]
+ if "date" in clock_columns:
+ calendar.insert(0, values[clock_columns["date"]])
+ day, hour, source_date = _forecast_clock(
+ calendar, int("date" in clock_columns)
+ )
+ found = True
+ yield HourlyLoadScenario.model_validate(
+ dict(
+ forecastDate=day,
+ hour=hour,
+ sourceDate=source_date,
+ weatherZone=source_zone.upper(),
+ sourceWeatherZone=source_zone,
+ sourceWeatherZoneColumn=header[zone_column]
+ if zone_column is not None
+ else None,
+ weatherYearPredictions={
+ year: _scenario_value(values[i], header[i], markers)
+ for i, year in predictions.items()
+ },
+ sourceLabels=labels,
+ sourceMarkers=markers,
+ sourceMember=member,
+ sourceSheet=name,
+ sourceRow=line,
+ **{
+ field: _scenario_value(values[i], header[i], markers)
+ for i, field, _ in components
+ },
+ )
+ )
+ if not found:
+ raise ValueError("No hourly weather-year load scenarios found")
diff --git a/tinyercot/_loss_coefficients.py b/tinyercot/_loss_coefficients.py
new file mode 100644
index 00000000..caccc71e
--- /dev/null
+++ b/tinyercot/_loss_coefficients.py
@@ -0,0 +1,199 @@
+"""Published seasonal transmission-loss coefficients and their input basis."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date
+from decimal import Decimal
+from time import strptime
+from typing import Literal
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._public_tables import PublicFile, _PublicFiles, _year_files
+
+_Season = Literal["spring", "summer", "fall", "winter"]
+_SEASONS: dict[str, _Season] = {
+ "SPRING": "spring",
+ "SUMMER": "summer",
+ "FALL": "fall",
+ "WINTER": "winter",
+}
+
+
+class TransmissionLossCoefficient(BaseModel):
+ """An area/season's published SSC/SIC, retaining the separate input basis.
+
+ SSC and SIC produce percent loss, while SONLF/SOFFLF inputs are fractions.
+ No coefficients are recalculated. Input and final ERCOT correction labels
+ can differ. Missing or reversed effective periods have None date bounds.
+ asOf is the workbook's label, not proof of publication time.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ year: int
+ asOf: date
+ season: _Season
+ area: str
+ slopePercentPerMW: Decimal | None
+ interceptPercent: Decimal | None
+ onPeakLoadMW: Decimal | None
+ offPeakLoadMW: Decimal | None
+ onPeakLossFactor: Decimal | None
+ offPeakLossFactor: Decimal | None
+ effectiveFrom: date | None
+ effectiveThrough: date | None
+ sourceEffectivePeriod: str | None
+ sourceHeading: str
+ sourceArea: str
+ sourceInputArea: str
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+ sourceInputRow: int
+ sourceFile: PublicFile | None = None
+
+
+class TransmissionLossCoefficients(_PublicFiles):
+ """Discover and read annual public coefficient workbooks with tinyercot[files]."""
+
+ index_url = "https://www.ercot.com/mktinfo/data_agg"
+ title_pattern = r"\d{4} TDSP Transmission Loss Factors [-–] Methodology"
+
+ def files(self) -> list[PublicFile]:
+ return _year_files(self._http, self.index_url, self.title_pattern)
+
+ def rows(
+ self, *, where: Callable[[TransmissionLossCoefficient], bool] | None = None
+ ) -> Iterator[TransmissionLossCoefficient]:
+ for file in self.files():
+ yield from self.read(
+ self.download(file),
+ filename=file.url.rsplit("/", 1)[-1],
+ source_file=file,
+ where=where,
+ )
+
+ def read(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ source_file: PublicFile | None = None,
+ where: Callable[[TransmissionLossCoefficient], bool] | None = None,
+ ) -> Iterator[TransmissionLossCoefficient]:
+ """Read original workbooks or ZIPs, preserving all years and revisions."""
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, source in _sheets(content, date_columns=()):
+ rows = list(source)
+ headers = [i for i, row in enumerate(rows) if "SSC" in row]
+ if not headers:
+ continue
+ found = True
+ for record in _coefficients(
+ rows, headers[0], member, sheet, source_file
+ ):
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError(
+ "Download contains no seasonal transmission-loss coefficients"
+ )
+
+
+def _date(label: str) -> date:
+ fmt = "%m/%d/%y" if len(label.rsplit("/", 1)[-1]) == 2 else "%m/%d/%Y"
+ return date(*strptime(label, fmt)[:3])
+
+
+def _period(label: str | None) -> tuple[date | None, date | None]:
+ if label is not None:
+ try:
+ left, right = label.split(" - ")
+ start, end = _date(left), _date(right)
+ if start <= end:
+ return start, end
+ except ValueError:
+ pass
+ return None, None
+
+
+def _coefficients(
+ rows: list[tuple[object, ...]],
+ header: int,
+ member: str,
+ sheet: str,
+ source_file: PublicFile | None,
+) -> Iterator[TransmissionLossCoefficient]:
+ heading = str(rows[0][0])
+ match = re.match(r"TRANSMISSION LOSS FACTORS for (\d{4}) as of ([\d/]+)", heading)
+ if match is None:
+ raise ValueError(f"{member}/{sheet}: Missing coefficient year/as-of heading")
+ basis = next(i for i, row in enumerate(rows) if "SONL" in row)
+ input_columns = {
+ str(rows[basis - 1][i]).split()[0]: i
+ for i, value in enumerate(rows[basis])
+ if value == "SONL"
+ }
+ input_rows = {
+ str(row[0]): (i, row)
+ for i, row in enumerate(rows[basis + 1 : header], basis + 1)
+ if row and row[0] in _SEASONS
+ }
+ periods = {
+ str(row[1]): str(row[0])
+ for row in rows[header + 1 :]
+ if len(row) > 1 and row[1] in _SEASONS
+ }
+ for i, row in enumerate(rows[header + 1 :], header + 1):
+ if not row or row[0] not in _SEASONS:
+ continue
+ season = str(row[0])
+ input_row, values = input_rows[season]
+ period = periods.get(season)
+ start, end = _period(period)
+ for column, label in enumerate(rows[header]):
+ if label != "SSC":
+ continue
+ if rows[header][column + 1] != "SIC":
+ raise ValueError(f"{member}/{sheet}: Missing SIC beside SSC")
+ area_label = str(rows[header - 1][column])
+ area = area_label.split()[0]
+ source_column = input_columns[area]
+ if rows[basis][source_column : source_column + 4] != (
+ "SONL",
+ "SOFFL",
+ "SONLF",
+ "SOFFLF",
+ ):
+ raise ValueError(
+ f"{member}/{sheet}: Unexpected coefficient input columns"
+ )
+ yield TransmissionLossCoefficient(
+ year=int(match[1]),
+ asOf=_date(match[2]),
+ season=_SEASONS[season],
+ area=area,
+ slopePercentPerMW=_number(row[column]),
+ interceptPercent=_number(row[column + 1]),
+ onPeakLoadMW=_number(values[source_column]),
+ offPeakLoadMW=_number(values[source_column + 1]),
+ onPeakLossFactor=_number(values[source_column + 2]),
+ offPeakLossFactor=_number(values[source_column + 3]),
+ effectiveFrom=start,
+ effectiveThrough=end,
+ sourceEffectivePeriod=period,
+ sourceHeading=heading,
+ sourceArea=area_label,
+ sourceInputArea=str(rows[basis - 1][source_column]),
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=i + 1,
+ sourceInputRow=input_row + 1,
+ sourceFile=source_file,
+ )
diff --git a/tinyercot/_loss_factors.py b/tinyercot/_loss_factors.py
new file mode 100644
index 00000000..a861c55c
--- /dev/null
+++ b/tinyercot/_loss_factors.py
@@ -0,0 +1,307 @@
+"""Direct public histories of actual and forecast settlement loss factors."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date, datetime, time, timedelta
+from decimal import Decimal
+from typing import Literal
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import LoadArchive, _sheets, _workbooks
+from ._public_tables import _year_files
+
+INDEX_URL = "https://www.ercot.com/mktinfo/data_agg"
+_SERIES: dict[
+ str, tuple[Literal["actual", "forecast"], Literal["transmission", "distribution"]]
+] = {
+ "ACTUAL_TLF": ("actual", "transmission"),
+ "FORECASTED_TLF": ("forecast", "transmission"),
+ "ACTUAL_DLF": ("actual", "distribution"),
+ "FORECASTED_DLF": ("forecast", "distribution"),
+}
+_HEADER = (
+ ("SAVERECORDER", "STARTTIME")
+ + tuple(f"INTV{i}" for i in range(1, 101))
+ + ("LSTIME",)
+)
+
+
+class LossFactorInterval(BaseModel):
+ """A source interval column, retaining its position and unscaled factor.
+
+ Blank cells remain None; interval numbers do not establish UTC times.
+ sourceLabel is an INTV name or legacy clock (including 24:00 and repeats).
+ It is None when a source row does not match its sheet's interval headings.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ interval: int
+ factor: Decimal | None
+ sourceLabel: str | None = None
+
+
+class LossFactorDay(BaseModel):
+ """One source series/day; factors are never implicitly applied to load.
+
+ STARTTIME and LSTIME are retained without inferred timezones. LSTIME is
+ not proof of when the record became publicly available. Legacy TIMESTAMP
+ values are preserved too. Unknown kind/recorder/TDSP/loss code remain None.
+ sourceSecondaryIdentifier and sourceMarker retain the legacy second and
+ fourth columns, including unlabeled values without invented meanings.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ kind: Literal["actual", "forecast"] | None
+ level: Literal["transmission", "distribution"]
+ tdsp: str | None
+ lossCode: str | None
+ recorder: str | None
+ sourceStartTime: datetime
+ sourceLastTime: datetime
+ intervals: list[LossFactorInterval]
+ sourceMember: str
+ sourceSheet: str
+ sourceFile: LoadArchive | None = None
+ sourceSecondaryIdentifier: str | int | None = None
+ sourceMarker: str | None = None
+
+ @property
+ def operatingDay(self) -> date:
+ return self.sourceStartTime.date()
+
+
+class LossFactors:
+ """Discover and query direct public workbooks using tinyercot[files]."""
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def archives(self) -> list[LoadArchive]:
+ """Discover current files and all linked annual aggregation indexes."""
+ pattern = (
+ r"(?i)(?:Historical[ _-]+Loss[ _-]+Factors[ _-]+\d{4}.*"
+ r"|\d{4} TDSP (?:Transmission|Distribution) Loss Factors [-–] "
+ r"(?:Actual|Forecasted)|[DT]LF (?:actual|forecasted) for \d{4})"
+ )
+
+ archives = []
+ for file in _year_files(self._http, INDEX_URL, pattern):
+ year = re.search(r"\d{4}", file.title)
+ if year is not None:
+ archives.append(LoadArchive(year=int(year[0]), **file.model_dump()))
+ if not archives:
+ raise ValueError("No historical loss factors found in ERCOT's public index")
+ return sorted(archives, key=lambda a: (a.year, a.url))
+
+ def download(self, archive: LoadArchive) -> bytes:
+ response = self._http.get(archive.url, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+ def rows(
+ self,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[LossFactorDay], bool] | None = None,
+ ) -> Iterator[LossFactorDay]:
+ """Read every linked history with inclusive operating-date bounds.
+
+ Archive labels do not limit coverage. Overlapping files stay distinct.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for archive in self.archives():
+ yield from self.read(
+ self.download(archive),
+ filename=archive.url.rsplit("/", 1)[-1],
+ source_file=archive,
+ date_from=date_from,
+ date_to=date_to,
+ where=where,
+ )
+
+ def read(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ source_file: LoadArchive | None = None,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[LossFactorDay], bool] | None = None,
+ ) -> Iterator[LossFactorDay]:
+ """Decode saved workbooks or ZIPs, retaining every source interval.
+
+ source_file preserves index metadata, including the forecast label absent
+ from early distribution workbooks. Without it, an unknown kind is None.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=(), preserve_types=True):
+ header_cells = next(rows, ())
+ if "START TIME" in header_cells:
+ found = True
+ for record in _legacy_days(
+ rows, header_cells, member, sheet, source_file
+ ):
+ day = record.operatingDay
+ if (date_from and day < date_from) or (
+ date_to and day > date_to
+ ):
+ continue
+ if where is None or where(record):
+ yield record
+ continue
+ if sheet not in _SERIES:
+ raise ValueError(f"{member}/{sheet}: Unknown loss-factor sheet")
+ kind, level = _SERIES[sheet]
+ offset = 2 if level == "distribution" else 0
+ header = (("TDSPNAME", "LOSSCODE") if offset else ()) + _HEADER
+ if header_cells != header:
+ raise ValueError(f"{member}/{sheet}: Unexpected loss-factor header")
+ found = True
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ if len(cells) != len(header):
+ raise ValueError(f"{member}/{sheet}: Unexpected row width")
+ stamp = cells[offset + 1]
+ if not isinstance(stamp, datetime):
+ raise TypeError(f"{member}/{sheet}: Invalid STARTTIME")
+ day = stamp.date()
+ if (date_from and day < date_from) or (date_to and day > date_to):
+ continue
+ record = LossFactorDay.model_validate(
+ {
+ "kind": kind,
+ "level": level,
+ "tdsp": cells[0] if offset else None,
+ "lossCode": cells[1] if offset else None,
+ "recorder": cells[offset],
+ "sourceStartTime": stamp,
+ "sourceLastTime": cells[-1],
+ "intervals": [
+ {
+ "interval": i,
+ "factor": _number(v),
+ "sourceLabel": f"INTV{i}",
+ }
+ for i, v in enumerate(cells[offset + 2 : -1], 1)
+ ],
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceFile": source_file,
+ }
+ )
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no loss-factor tables")
+
+
+def _kind(label: str) -> Literal["actual", "forecast"] | None:
+ match = re.search(r"(?i)(? datetime:
+ if isinstance(value, datetime):
+ return value
+ if isinstance(value, str):
+ return datetime.strptime(value.strip(), "%m/%d/%Y %H:%M:%S") # noqa: DTZ007 -- source has no offset
+ raise ValueError(f"Invalid loss-factor timestamp: {value!r}")
+
+
+def _interval_label(value: object) -> str:
+ if isinstance(value, (datetime, time)):
+ minutes = value.hour * 60 + value.minute
+ return f"{minutes // 60:02}:{minutes % 60:02}" if minutes else "24:00"
+ if isinstance(value, timedelta):
+ minutes = round(value.total_seconds() / 60)
+ elif isinstance(value, (int, float)):
+ minutes = round(value * 1440)
+ else:
+ raise TypeError(f"Invalid loss-factor interval header: {value!r}")
+ return f"{minutes // 60:02}:{minutes % 60:02}"
+
+
+def _legacy_days(
+ rows: Iterator[tuple[object, ...]],
+ header: tuple[object, ...],
+ member: str,
+ sheet: str,
+ source_file: LoadArchive | None,
+) -> Iterator[LossFactorDay]:
+ if (
+ header[0] not in {"CUTNAME", "TDSP"}
+ or header[2] != "START TIME"
+ or "TIMESTAMP" not in header
+ ):
+ raise ValueError(f"{member}/{sheet}: Unexpected legacy loss-factor header")
+ end = header.index("TIMESTAMP")
+ labels = [_interval_label(value) for value in header[4:end]]
+ file_kind = _kind(member) or (_kind(source_file.title) if source_file else None)
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ # The 2003 DST sheet has trailing loss-code labels without dates or data.
+ if all(c in (None, "") for i, c in enumerate(cells) if i != 1):
+ continue
+ stamp = _timestamp(cells[2])
+ stop = end
+ # The 2013 TLF sheet includes a 100-interval fall-back row beneath a
+ # 96-interval header. Its timestamp occupies the final, unlabeled column.
+ if (
+ end == 100
+ and len(cells) == 105
+ and isinstance(cells[end], (int, float))
+ and isinstance(cells[104], (datetime, str))
+ and cells[104] != ""
+ ):
+ stop = 104
+ if any(c not in (None, "") for c in cells[stop + 1 :]):
+ raise ValueError(f"{member}/{sheet}: Unexpected values after timestamp")
+ primary = cells[0]
+ if not isinstance(primary, str):
+ raise TypeError(f"{member}/{sheet}: Invalid loss-factor identifier")
+ transmission = primary.startswith("TLF ")
+ recorder = transmission or primary.startswith("DISTLOSSFACT_")
+ yield LossFactorDay.model_validate(
+ {
+ "kind": _kind(primary) if transmission else file_kind,
+ "level": "transmission" if transmission else "distribution",
+ "tdsp": None if recorder else primary,
+ "lossCode": cells[1]
+ if not recorder and cells[1] not in (None, "")
+ else None,
+ "recorder": primary if recorder else None,
+ "sourceStartTime": stamp,
+ "sourceLastTime": _timestamp(cells[stop]),
+ "intervals": [
+ {
+ "interval": i,
+ "factor": _number(value),
+ "sourceLabel": labels[i - 1] if stop == end else None,
+ }
+ for i, value in enumerate(cells[4:stop], 1)
+ ],
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceFile": source_file,
+ "sourceSecondaryIdentifier": cells[1]
+ if cells[1] not in (None, "")
+ else None,
+ "sourceMarker": cells[3] if cells[3] not in (None, "") else None,
+ }
+ )
diff --git a/tinyercot/_monthly_performance.py b/tinyercot/_monthly_performance.py
new file mode 100644
index 00000000..9ac131e3
--- /dev/null
+++ b/tinyercot/_monthly_performance.py
@@ -0,0 +1,168 @@
+"""Monthly forecast errors and backcasts with original date and scale metadata."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from typing import Literal, get_args
+
+from ._legacy_load import _number
+from ._load import _workbooks
+from ._load_forecasts import _ForecastRow, _ForecastTable
+from ._public_tables import PublicFile
+
+ForecastPerformanceSeries = Literal[
+ "Day-Ahead RUC",
+ "6 Hour-Ahead",
+ "3 Hour-Ahead",
+ "Goal",
+ "Stretch",
+ "Backcast",
+ "Day-Ahead Backcast",
+]
+
+
+class MonthlyLoadForecastPerformance(_ForecastRow):
+ """One month/series, keeping raw values and unlabelled scales distinct."""
+
+ month: date
+ kind: Literal["forecast", "backcast", "target"]
+ series: ForecastPerformanceSeries
+ value: Decimal | None
+ sourceDate: date | None
+ sourceNumberFormat: str
+ sourceMarker: str | None
+ sourceColumn: int
+ sourceMonthColumn: int
+ sourceNotes: list[str]
+
+ @property
+ def percent(self) -> Decimal | None:
+ """Convert explicit Excel percentage fractions; unlabelled scales stay unknown."""
+ if self.value is not None and re.fullmatch(
+ r"0(?:\.0+)?%", self.sourceNumberFormat
+ ):
+ return self.value * 100
+ return None
+
+
+class MonthlyForecastPerformance(_ForecastTable[MonthlyLoadForecastPerformance]):
+ title_pattern = r".*Backcast.*"
+ extensions = (".xlsx",)
+
+ def files(self) -> list[PublicFile]:
+ # Jan/Feb 2026 Backcast links instead contain hourly Metrics workbooks.
+ return [
+ f for f in super().files() if "backcast" in f.url.rsplit("/", 1)[-1].lower()
+ ]
+
+ def _read(
+ self, data: bytes, filename: str
+ ) -> Iterator[MonthlyLoadForecastPerformance]:
+ try:
+ from openpyxl import load_workbook
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read monthly forecast performance"
+ ) from error
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member == "workbook.xlsx" else member
+ book = load_workbook(BytesIO(content), read_only=True, data_only=True)
+ try:
+ for sheet in book:
+ rows = list(sheet.iter_rows())
+ notes = [
+ str(c.value)
+ for row in rows[:3]
+ for c in row
+ if isinstance(c.value, str)
+ and c.value not in ("Data Source", "`")
+ ]
+ for header_row, header in enumerate(rows):
+ for column, cell in enumerate(header):
+ if cell.value != "Month":
+ continue
+ columns = []
+ for value_column in range(column + 1, len(header)):
+ label = header[value_column].value
+ if label in (None, ""):
+ break
+ if label not in get_args(ForecastPerformanceSeries):
+ raise ValueError(
+ f"{member}/{sheet.title}: unknown monthly series {label!r}"
+ )
+ columns.append((value_column, str(label)))
+ if not columns:
+ raise ValueError(
+ f"{member}/{sheet.title}: monthly table has no series"
+ )
+ year = (
+ rows[header_row - 1][column].value
+ if header_row
+ else None
+ )
+ for line in range(header_row + 1, len(rows)):
+ raw_month = rows[line][column].value
+ if raw_month in (None, ""):
+ break
+ source_date = (
+ raw_month.date()
+ if isinstance(raw_month, datetime)
+ else raw_month
+ if isinstance(raw_month, date)
+ else None
+ )
+ if source_date is not None:
+ month = source_date.replace(day=1)
+ elif (
+ isinstance(raw_month, int)
+ and 1 <= raw_month <= 12
+ and isinstance(year, int)
+ ):
+ month = date(year, raw_month, 1)
+ else:
+ raise ValueError(
+ f"{member}/{sheet.title}:{line + 1}: invalid month or year"
+ )
+ for value_column, label in columns:
+ value_cell = rows[line][value_column]
+ marker = (
+ str(value_cell.value)
+ if value_cell.data_type == "e"
+ else None
+ )
+ kind = (
+ "target"
+ if label in ("Goal", "Stretch")
+ else "backcast"
+ if "Backcast" in label
+ else "forecast"
+ )
+ found = True
+ yield MonthlyLoadForecastPerformance.model_validate(
+ {
+ "month": month,
+ "kind": kind,
+ "series": label,
+ "value": None
+ if marker
+ else _number(value_cell.value),
+ "sourceDate": source_date,
+ "sourceNumberFormat": value_cell.number_format,
+ "sourceMarker": marker,
+ "sourceColumn": value_column + 1,
+ "sourceMonthColumn": column + 1,
+ "sourceNotes": notes,
+ "sourceMember": member,
+ "sourceSheet": sheet.title,
+ "sourceRow": line + 1,
+ }
+ )
+ finally:
+ book.close()
+ if not found:
+ raise ValueError("No monthly forecast performance tables found")
diff --git a/tinyercot/_mora.py b/tinyercot/_mora.py
new file mode 100644
index 00000000..00115660
--- /dev/null
+++ b/tinyercot/_mora.py
@@ -0,0 +1,686 @@
+"""Typed numeric tables from monthly resource-adequacy outlook workbooks."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date, time
+from decimal import Decimal
+from io import BytesIO
+from time import strptime
+from typing import TYPE_CHECKING, Literal, cast
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._mora_risk import MoraRiskPoint, _risk_points
+from ._public_tables import PublicFile, _ResourceFiles
+
+if TYPE_CHECKING:
+ from openpyxl.worksheet._read_only import ReadOnlyWorksheet
+
+MoraMetric = Literal[
+ "gross_demand",
+ "solar_generation",
+ "wind_generation",
+ "thermal_outages",
+ "non_extreme_weather_outages",
+ "extreme_weather_outages",
+]
+_METRICS: dict[str, MoraMetric] = {
+ "Gross Demand by Hour, MW": "gross_demand",
+ "Solar Generation by Hour, MW": "solar_generation",
+ "Wind Generation by Hour, MW": "wind_generation",
+ "Thermal Unplanned Outages": "thermal_outages",
+ "Unplanned Thermal Outages-Daily, MW": "thermal_outages",
+ "Unplanned Thermal Outages Not Due to Extreme Weather - Daily, MW": "non_extreme_weather_outages",
+ "Unplanned Thermal Outages Due to Extreme Weather - Daily, MW": "extreme_weather_outages",
+}
+
+
+class MoraPercentile(BaseModel):
+ """One published forecast percentile, separate from realized observations.
+
+ percentile is a fraction in 0–1. hour is the source's numbered hour, or None
+ for daily outages; it is not a UTC clock or a dated hourly observation.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ reportMonth: date
+ metric: MoraMetric
+ percentile: Decimal
+ hour: int | None
+ value: Decimal | None
+ sourceUnit: Literal["MW"] | None
+ sourceMetric: str
+ sourceReportLabel: str
+ sourcePercentile: str
+ sourcePeriodLabel: str
+ sourceNotes: list[str]
+ sourceMember: str
+ sourceSheet: str
+
+
+class MoraResource(BaseModel):
+ """One unit or summary capacity row in an assessment-month outlook.
+
+ inService retains a year, date or source status such as #N/A. Category and
+ capacity labels describe the source's status and rating basis; neither
+ installed capacity nor the reported rating implies available generation.
+ Summary rows include totals, contributions and adjustments; source unit
+ codes also appear on summaries. An omitted category remains None.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ reportMonth: date
+ kind: Literal["unit", "summary"]
+ category: str | None
+ name: str
+ interconnectionRequestNumber: str | None
+ unitCode: str | None
+ county: str | None
+ fuel: str | None
+ zone: str | None
+ inService: int | date | str | None
+ installedCapacityMW: Decimal | None
+ reportedCapacityMW: Decimal | None
+ sourceInstalledCapacityLabel: str
+ sourceCapacityLabel: str
+ sourceInServiceLabel: str
+ sourceReportLabel: str
+ sourceNotes: list[str]
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+
+
+class MoraScenarioValue(BaseModel):
+ """A forecast MW value at a source scenario's hour, without an assumed date."""
+
+ model_config = ConfigDict(extra="forbid")
+ sourceScenario: str
+ hourEnding: time
+ timeZone: Literal["CST", "CDT"] | None
+ valueMW: Decimal | None
+
+
+class _MoraTableRow(BaseModel):
+ model_config = ConfigDict(extra="forbid")
+ reportMonth: date
+ sourceReportLabel: str
+ sourceNotes: list[str]
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+
+
+class MoraCapacity(_MoraTableRow):
+ """Category ratings with their source hierarchy and separate scenario values.
+
+ resourcePath includes each parent label. Parent and child ratings overlap;
+ installedCapacityMW is reported once, independent of scenario count.
+ """
+
+ section: Literal["operational", "planned", "total"]
+ sourceSectionLabel: str
+ resourcePath: list[str]
+ installedCapacityMW: Decimal | None
+ availableCapacity: list[MoraScenarioValue]
+ sourceInstalledCapacityLabel: str
+ sourceAvailableCapacityLabel: str | None
+
+
+MoraBalanceMetric = Literal[
+ "average_weather_load",
+ "large_load_adjustment",
+ "large_flexible_load_adjustment",
+ "total_load",
+ "dispatchable_capacity",
+ "thermal_capacity",
+ "thermal_capacity_excluding_emergency_agreements",
+ "storage_capacity",
+ "hydro_capacity",
+ "thermal_outages",
+ "planned_thermal_outages",
+ "unplanned_thermal_outages",
+ "available_dispatchable_capacity",
+ "wind_capacity",
+ "solar_capacity",
+ "available_non_dispatchable_capacity",
+ "dc_tie_net_imports",
+ "available_resources",
+ "emergency_response_service",
+ "distribution_voltage_reduction",
+ "large_load_curtailment",
+ "large_flexible_load_curtailment",
+ "crypto_demand_response",
+ "emergency_resources_before_eea",
+ "responsive_reserve_load_resources",
+ "non_spin_load_resources",
+ "ecrs_load_resources",
+ "tdsp_load_management",
+ "rmr_and_other_agreement_capacity",
+ "emergency_resources_during_eea",
+ "total_emergency_resources",
+ "normal_condition_reserves",
+ "emergency_condition_reserves",
+]
+_BALANCE_METRICS: dict[str, MoraBalanceMetric] = {
+ "Load Based on Average Weather": "average_weather_load",
+ "Large Load Adjustment": "large_load_adjustment",
+ "Large Flexible Load Adjustment": "large_flexible_load_adjustment",
+ "Total Load": "total_load",
+ "Dispatchable": "dispatchable_capacity",
+ "Thermal": "thermal_capacity",
+ "Thermal, excluding RMR and other Emergency Generation Agreements": "thermal_capacity_excluding_emergency_agreements",
+ "Energy Storage": "storage_capacity",
+ "Hydro": "hydro_capacity",
+ "Expected Thermal Outages": "thermal_outages",
+ "Planned": "planned_thermal_outages",
+ "Unplanned": "unplanned_thermal_outages",
+ "Total Available Dispatchable": "available_dispatchable_capacity",
+ "Wind": "wind_capacity",
+ "Solar": "solar_capacity",
+ "Total Available Non-Dispatchable": "available_non_dispatchable_capacity",
+ "Non-Synchronous Ties, Net Imports": "dc_tie_net_imports",
+ "Total Available Resources (Normal Conditions)": "available_resources",
+ "Emergency Response Service": "emergency_response_service",
+ "Distribution Voltage Reduction": "distribution_voltage_reduction",
+ "Large Load Curtailment": "large_load_curtailment",
+ "Large Flexible Load Curtailment": "large_flexible_load_curtailment",
+ "Anticipated Crypto Demand Response": "crypto_demand_response",
+ "Available prior to an Energy Emergency Alert": "emergency_resources_before_eea",
+ "Total Available prior to an Energy Emergency Alert": "emergency_resources_before_eea",
+ "LRs providing Responsive Reserves": "responsive_reserve_load_resources",
+ "LRs providing Non-spin": "non_spin_load_resources",
+ "LRs providing ECRS": "ecrs_load_resources",
+ "TDSP Load Management Programs": "tdsp_load_management",
+ "RMR and Other Resource Agreement Capacity Units": "rmr_and_other_agreement_capacity",
+ "Available during an Energy Emergency Alert": "emergency_resources_during_eea",
+ "Total Available during an Energy Emergency Alert": "emergency_resources_during_eea",
+ "Total Emergency Resources": "total_emergency_resources",
+ "Capacity Available for Operating Reserves, Normal Conditions": "normal_condition_reserves",
+ "Capacity Available for Operating Reserves, Emergency Conditions": "emergency_condition_reserves",
+}
+
+
+class MoraBalance(_MoraTableRow):
+ """A published load/resource balance quantity, including scenario assumptions."""
+
+ metric: MoraBalanceMetric
+ sourceMetric: str
+ values: list[MoraScenarioValue]
+
+
+class ResourceOutlook(_ResourceFiles):
+ """Discover MORA workbooks, including links in the historical year indexes."""
+
+ title_pattern = r"Monthly Outlook for Resource Adequacy \(MORA\) .+"
+
+ def risk_points(
+ self, *, where: Callable[[MoraRiskPoint], bool] | None = None
+ ) -> Iterator[MoraRiskPoint]:
+ """Query numerical conditional-risk curves; raster-only reports yield none."""
+ for file in self.files():
+ yield from self.read_risk_points(
+ self.download(file),
+ filename=file.url.rsplit("/", 1)[-1],
+ source_file=file,
+ where=where,
+ )
+
+ def read_risk_points(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ source_file: PublicFile | None = None,
+ where: Callable[[MoraRiskPoint], bool] | None = None,
+ ) -> Iterator[MoraRiskPoint]:
+ """Read original chart coordinates and their scenario context from MORA.
+
+ Reports with no numerical chart cache yield no points. Original files
+ remain downloadable; pixel graphics are not converted to estimated data.
+ """
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ month, label = _report_month(content)
+ for record in _risk_points(content, member, month, label, source_file):
+ if where is None or where(record):
+ yield record
+
+ def percentiles(
+ self, *, where: Callable[[MoraPercentile], bool] | None = None
+ ) -> Iterator[MoraPercentile]:
+ """Query all published percentile tables, retaining report revisions."""
+ for file in self.files():
+ yield from self.read_percentiles(
+ self.download(file), filename=file.url.rsplit("/", 1)[-1], where=where
+ )
+
+ def resources(
+ self, *, where: Callable[[MoraResource], bool] | None = None
+ ) -> Iterator[MoraResource]:
+ """Query resource-detail tables, preserving categories and revisions."""
+ for file in self.files():
+ yield from self.read_resources(
+ self.download(file), filename=file.url.rsplit("/", 1)[-1], where=where
+ )
+
+ def read_resources(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ where: Callable[[MoraResource], bool] | None = None,
+ ) -> Iterator[MoraResource]:
+ """Read the named B–J resource columns from saved workbooks or ZIPs."""
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ month, report_label = _report_month(content)
+ for sheet, source in _sheets(content, date_columns=(), preserve_types=True):
+ if sheet != "Resource Details":
+ continue
+ rows = list(source)
+ header_index = next(
+ (
+ i
+ for i, r in enumerate(rows)
+ if len(r) > 1 and r[1] == "UNIT NAME"
+ ),
+ None,
+ )
+ if header_index is None:
+ raise ValueError(f"{member}/{sheet}: Missing resource header")
+ header = rows[header_index]
+ labels = tuple(" ".join(str(v).split()) for v in header[1:10])
+ if (
+ len(labels) != 9
+ or labels[:1] != ("UNIT NAME",)
+ or labels[1] not in ("INR", "INTERCONNECTION REQUEST NUMBER (INR)")
+ or labels[2:6] != ("UNIT CODE", "COUNTY", "FUEL", "ZONE")
+ or labels[6] not in ("IN SERVICE", "IN SERVICE YEAR")
+ or labels[7]
+ not in ("INSTALLED CAPACITY (MW)", "INSTALLED CAPACITY RATING (MW)")
+ ):
+ raise ValueError(f"{member}/{sheet}: Unexpected resource columns")
+ found = True
+ table = [
+ (i + 1, tuple(r[:10]) + (None,) * max(0, 10 - len(r)))
+ for i, r in enumerate(rows)
+ if i > header_index
+ ]
+ last_data = max(
+ (i for i, r in table if any(v not in (None, "") for v in r[2:10])),
+ default=0,
+ )
+ notes = [
+ r[1]
+ for i, r in table
+ if i > last_data and isinstance(r[1], str) and r[1]
+ ]
+ category: str | None = None
+ for number, cells in table:
+ if not any(v not in (None, "") for v in cells[2:10]):
+ if isinstance(cells[1], str) and cells[1]:
+ category = cells[1]
+ continue
+ record = MoraResource.model_validate(
+ {
+ "reportMonth": month,
+ "kind": "unit"
+ if any(cells[i] not in (None, "") for i in (2, 4, 6, 7))
+ else "summary",
+ "category": category,
+ "name": cells[1],
+ "interconnectionRequestNumber": cells[2] or None,
+ "unitCode": cells[3] or None,
+ "county": cells[4] or None,
+ "fuel": cells[5] or None,
+ "zone": cells[6] or None,
+ "inService": cells[7] if cells[7] != "" else None,
+ "installedCapacityMW": _number(cells[8]),
+ "reportedCapacityMW": _number(cells[9]),
+ "sourceInstalledCapacityLabel": header[8],
+ "sourceCapacityLabel": header[9],
+ "sourceInServiceLabel": header[7],
+ "sourceReportLabel": report_label,
+ "sourceNotes": notes,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceRow": number,
+ }
+ )
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no MORA resource tables")
+
+ def capacities(
+ self, *, where: Callable[[MoraCapacity], bool] | None = None
+ ) -> Iterator[MoraCapacity]:
+ """Query category ratings and expected capacity for every published scenario."""
+ for file in self.files():
+ yield from self.read_capacities(
+ self.download(file), filename=file.url.rsplit("/", 1)[-1], where=where
+ )
+
+ def read_capacities(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ where: Callable[[MoraCapacity], bool] | None = None,
+ ) -> Iterator[MoraCapacity]:
+ """Read saved MORA XLSX files or ZIPs, retaining indentation-based hierarchy."""
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member == "workbook.xlsx" else member
+ month, report_label = _report_month(content)
+ source = _capacity_rows(content)
+ notes = [
+ str(cells[1])
+ for cells, _ in source
+ if len(cells) > 1 and str(cells[1]).startswith("[")
+ ]
+ header = next(
+ (
+ i
+ for i, (cells, _) in enumerate(source)
+ if len(cells) > 2 and cells[2] == "Installed Capacity Rating [2]"
+ ),
+ None,
+ )
+ if header is None or header == 0:
+ raise ValueError(f"{member}: Missing MORA capacity header")
+ columns = [
+ (i, value)
+ for i, value in enumerate(source[header - 1][0])
+ if i >= 3 and isinstance(value, str) and value
+ ]
+ if not columns:
+ raise ValueError(f"{member}: Missing MORA capacity scenarios")
+ labels = source[header][0]
+ section: Literal["operational", "planned", "total"] = "operational"
+ section_label = str(labels[1])
+ path: list[tuple[float, str]] = []
+ for number, (cells, indent) in enumerate(source[header + 1 :], header + 2):
+ label = cells[1] if len(cells) > 1 else None
+ if not isinstance(label, str) or not label:
+ continue
+ if label == "NOTES:":
+ break
+ if label.startswith("Planned Resources"):
+ section, section_label = "planned", label
+ path.clear()
+ continue
+ if label.startswith("Total Resources"):
+ section, section_label = "total", label
+ path.clear()
+ while path and path[-1][0] >= indent:
+ path.pop()
+ path.append((indent, label))
+ row = MoraCapacity(
+ reportMonth=month,
+ section=section,
+ sourceSectionLabel=section_label,
+ resourcePath=[name for _, name in path],
+ installedCapacityMW=_number(cells[2] if len(cells) > 2 else None),
+ availableCapacity=[
+ _scenario_value(title, cells[i] if i < len(cells) else None)
+ for i, title in columns
+ ],
+ sourceInstalledCapacityLabel=str(labels[2]),
+ sourceAvailableCapacityLabel=str(labels[3])
+ if len(labels) > 3 and labels[3] is not None
+ else None,
+ sourceReportLabel=report_label,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet="Capacity by Resource Category",
+ sourceRow=number,
+ )
+ found = True
+ if where is None or where(row):
+ yield row
+ if not found:
+ raise ValueError("Download contains no MORA capacity tables")
+
+ def balance(
+ self, *, where: Callable[[MoraBalance], bool] | None = None
+ ) -> Iterator[MoraBalance]:
+ """Query the monthly load/resource balance for every published scenario."""
+ for file in self.files():
+ yield from self.read_balance(
+ self.download(file), filename=file.url.rsplit("/", 1)[-1], where=where
+ )
+
+ def read_balance(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ where: Callable[[MoraBalance], bool] | None = None,
+ ) -> Iterator[MoraBalance]:
+ """Read saved load/resource balance tables, with source metric labels."""
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ month, report_label = _report_month(content)
+ for sheet, source in _sheets(content, date_columns=()):
+ if sheet != "Monthly Outlook":
+ continue
+ rows = list(source)
+ notes = [
+ value
+ for cells in rows
+ for value in cells
+ if isinstance(value, str) and re.match(r"\[\d+\]", value)
+ ]
+ columns: list[tuple[int, str]] = []
+ for number, cells in enumerate(rows, 1):
+ label = cells[4] if len(cells) > 4 else None
+ if label == "Loads and Resources (MW)":
+ columns = [
+ (i, value)
+ for i, value in enumerate(cells)
+ if i >= 7 and isinstance(value, str) and value
+ ]
+ continue
+ if not columns or not any(
+ i < len(cells) and cells[i] not in (None, "")
+ for i, _ in columns
+ ):
+ continue
+ metric_label = re.sub(r"\s*\[\d+\]$", "", str(label).strip())
+ if metric_label not in _BALANCE_METRICS:
+ raise ValueError(
+ f"{member}/{sheet}: Unknown balance metric {label!r}"
+ )
+ row = MoraBalance(
+ reportMonth=month,
+ metric=_BALANCE_METRICS[metric_label],
+ sourceMetric=str(label),
+ values=[
+ _scenario_value(title, cells[i] if i < len(cells) else None)
+ for i, title in columns
+ ],
+ sourceReportLabel=report_label,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=number,
+ )
+ found = True
+ if where is None or where(row):
+ yield row
+ if not found:
+ raise ValueError("Download contains no MORA balance tables")
+
+ def read_percentiles(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ where: Callable[[MoraPercentile], bool] | None = None,
+ ) -> Iterator[MoraPercentile]:
+ """Read saved workbooks/ZIPs without inventing omitted hours or metrics."""
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ month, report_label = _report_month(content)
+ for sheet, source in _sheets(content, date_columns=()):
+ if sheet != "PRRM Percentile Results":
+ continue
+ found = True
+ rows = list(source)
+ notes = [
+ v
+ for cells in rows
+ for v in cells
+ if isinstance(v, str) and v.startswith("* ")
+ ]
+ metric: MoraMetric | None = None
+ label = ""
+ columns: list[tuple[int, int | None, str]] = []
+ for cells in rows:
+ if all(v in (None, "") for v in cells):
+ continue
+ title = next(
+ (
+ v
+ for v in cells[:2]
+ if isinstance(v, str)
+ and v != "Percentiles"
+ and not re.fullmatch(r"\d+(?:\.\d+)?%", v)
+ ),
+ None,
+ )
+ if title is not None:
+ label = title
+ metric = next(
+ (v for k, v in _METRICS.items() if title.startswith(k)),
+ None,
+ )
+ columns = []
+ continue
+ if len(cells) > 1 and cells[1] == "Percentiles":
+ if metric is None:
+ raise ValueError(
+ f"{member}/{sheet}: Unknown percentile metric"
+ )
+ columns = []
+ for i, v in enumerate(cells[2:], 2):
+ if v in (None, ""):
+ continue
+ if (
+ isinstance(v, (int, float))
+ and v == int(v)
+ and 1 <= v <= 24
+ ):
+ columns.append((i, int(v), str(v)))
+ elif metric.endswith("outages") and v in (
+ "Daily",
+ "Unplanned Thermal Outages",
+ "Thermal Unplanned Outages, Daily",
+ "Weather-related Thermal Outages, Winter",
+ ):
+ columns.append((i, None, str(v)))
+ else:
+ raise ValueError(
+ f"{member}/{sheet}: Unknown hour column"
+ )
+ continue
+ if len(cells) < 2 or cells[1] in (None, ""):
+ continue
+ value = cells[1]
+ if isinstance(value, str) and not value.endswith("%"):
+ continue
+ percentile = (
+ Decimal(value[:-1]) / 100
+ if isinstance(value, str)
+ else _number(value)
+ )
+ if metric is None or not columns or percentile is None:
+ raise ValueError(f"{member}/{sheet}: Missing percentile header")
+ for column, hour, period_label in columns:
+ record = MoraPercentile(
+ reportMonth=month,
+ metric=metric,
+ percentile=percentile,
+ hour=hour,
+ value=_number(
+ cells[column] if column < len(cells) else None
+ ),
+ sourceUnit="MW" if ", MW" in label else None,
+ sourceMetric=label,
+ sourceReportLabel=report_label,
+ sourcePercentile=str(value),
+ sourcePeriodLabel=period_label,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet=sheet,
+ )
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no MORA percentile tables")
+
+
+def _capacity_rows(data: bytes) -> list[tuple[tuple[object, ...], float]]:
+ # Indentation distinguishes e.g. Wind/Other from Storage/Other. Reading
+ # values alone would lose the source's category hierarchy.
+ try:
+ from openpyxl import load_workbook
+ except ImportError as error:
+ raise ImportError("Install tinyercot[files] to read MORA capacities") from error
+ book = load_workbook(BytesIO(data), read_only=True, data_only=True)
+ try:
+ sheet = cast("ReadOnlyWorksheet", book["Capacity by Resource Category"])
+ sheet.reset_dimensions()
+ return [
+ (
+ tuple(cell.value for cell in cells),
+ float(cells[1].alignment.indent or 0)
+ if len(cells) > 1 and cells[1].alignment
+ else 0,
+ )
+ for cells in sheet.rows
+ ]
+ finally:
+ book.close()
+
+
+def _scenario_value(label: str, value: object) -> MoraScenarioValue:
+ clock = re.search(r"\b(\d{1,2})(?::(\d{2}))?\s*([ap])\.m\.", label)
+ if clock is None:
+ raise ValueError(f"MORA scenario is missing its hour: {label!r}")
+ zone: Literal["CST", "CDT"] | None = (
+ "CST" if "CST" in label else "CDT" if "CDT" in label else None
+ )
+ return MoraScenarioValue(
+ sourceScenario=label,
+ hourEnding=time(
+ int(clock[1]) % 12 + (12 if clock[3] == "p" else 0), int(clock[2] or 0)
+ ),
+ timeZone=zone,
+ valueMW=_number(value),
+ )
+
+
+def _report_month(data: bytes) -> tuple[date, str]:
+ for sheet, rows in _sheets(data, date_columns=()):
+ if sheet == "Cover":
+ for cells in rows:
+ for value in cells:
+ if isinstance(value, str) and value.startswith("Reporting Month:"):
+ match = re.fullmatch(
+ r"Reporting Month:\s*([A-Za-z]+ \d{4})(?:,? Revised)?",
+ value,
+ re.IGNORECASE,
+ )
+ if match:
+ return date(*strptime(match[1], "%B %Y")[:3]), value
+ raise ValueError("MORA workbook is missing its reporting month")
diff --git a/tinyercot/_mora_risk.py b/tinyercot/_mora_risk.py
new file mode 100644
index 00000000..4d02f13c
--- /dev/null
+++ b/tinyercot/_mora_risk.py
@@ -0,0 +1,168 @@
+"""Numerical chart caches for MORA's conditional wind/BESS risk profiles."""
+
+import re
+from collections.abc import Iterator
+from datetime import date, time
+from decimal import Decimal
+from io import BytesIO
+from posixpath import dirname, join, normpath
+from typing import Literal
+from xml.etree import ElementTree as ET
+from zipfile import ZipFile
+
+from pydantic import BaseModel, ConfigDict
+
+from ._load import _sheets
+from ._public_tables import PublicFile
+
+_NS = {
+ "s": "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
+ "c": "http://schemas.openxmlformats.org/drawingml/2006/chart",
+ "a": "http://schemas.openxmlformats.org/drawingml/2006/main",
+ "r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
+}
+
+
+class MoraRiskPoint(BaseModel):
+ """A published conditional simulation point, not an observed outcome.
+
+ Probability remains a fraction. Wind and BESS availability are fixed inputs
+ to the simulation. Chart and scenario hours remain separate when they
+ disagree, with no inferred time zone or availability timestamp.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ reportMonth: date
+ event: Literal["EEA", "EEA3_load_shed"]
+ windGenerationMW: Decimal
+ probability: Decimal
+ bessAvailabilityMW: Decimal | None
+ simulationRuns: int | None
+ chartHourEnding: time | None
+ scenarioHourEnding: time | None
+ sourceReportLabel: str
+ sourceSeries: str
+ sourceXAxisTitle: str
+ sourceYAxisTitle: str
+ sourceNotes: list[str]
+ sourceMember: str
+ sourceSheet: str
+ sourceChart: str
+ sourcePointIndex: int
+ sourceFile: PublicFile | None = None
+
+
+def _relationships(book: ZipFile, part: str) -> dict[str, tuple[str, str]]:
+ path = join(dirname(part), "_rels", part.rsplit("/", 1)[-1] + ".rels")
+ if path not in book.namelist():
+ return {}
+ return {
+ r.attrib["Id"]: (
+ normpath(join(dirname(part), r.attrib["Target"])).lstrip("/"),
+ r.attrib["Type"].rsplit("/", 1)[-1],
+ )
+ for r in ET.fromstring(book.read(path))
+ if r.attrib.get("TargetMode") != "External"
+ }
+
+
+def _charts(book: ZipFile) -> Iterator[tuple[str, str]]:
+ workbook = ET.fromstring(book.read("xl/workbook.xml"))
+ sheets = _relationships(book, "xl/workbook.xml")
+ for sheet in workbook.findall("./s:sheets/s:sheet", _NS):
+ part, _ = sheets[sheet.attrib[f"{{{_NS['r']}}}id"]]
+ tree = ET.fromstring(book.read(part))
+ links = _relationships(book, part)
+ for drawing in tree.findall("./s:drawing", _NS):
+ target, _ = links[drawing.attrib[f"{{{_NS['r']}}}id"]]
+ chart_links = _relationships(book, target)
+ for chart in ET.fromstring(book.read(target)).findall(".//c:chart", _NS):
+ chart_part, _ = chart_links[chart.attrib[f"{{{_NS['r']}}}id"]]
+ yield sheet.attrib["name"], chart_part
+
+
+def _hour(label: str) -> time | None:
+ match = re.search(
+ r"Hour Ending\s*(?:\(HE\)\s*)?(\d{1,2})(?::(\d{2}))?\s*([ap])\.m\.", label
+ )
+ if not match:
+ return None
+ return time(int(match[1]) % 12 + (12 if match[3] == "p" else 0), int(match[2] or 0))
+
+
+def _risk_points(
+ data: bytes, member: str, month: date, report_label: str, source: PublicFile | None
+) -> Iterator[MoraRiskPoint]:
+ with ZipFile(BytesIO(data)) as book:
+ charts = list(_charts(book))
+ if not charts:
+ return
+ sheet_names = {s for s, _ in charts}
+ notes = {
+ name: [v for row in rows for v in row if isinstance(v, str) and v]
+ for name, rows in _sheets(data, date_columns=())
+ if name in sheet_names
+ }
+ for sheet, chart in charts:
+ tree = ET.fromstring(book.read(chart))
+ titles = [
+ "".join(n.itertext()) for n in tree.findall(".//c:title//a:t", _NS)
+ ]
+ x_title = next(
+ (t for t in titles if t.startswith("Wind Generation (MW)")), None
+ )
+ if x_title is None or "Probability" not in titles:
+ raise ValueError(f"{member}/{chart}: Unknown MORA risk chart axes")
+ context = "\n".join(notes[sheet])
+ bess = re.search(r"BESS availability is also fixed at ([\d,]+) MW", context)
+ runs = re.search(r"All ([\d,]+) model runs", context)
+ for series in tree.findall(".//c:ser", _NS):
+ label = "\n".join(
+ n.text or "" for n in series.findall("./c:tx//c:v", _NS)
+ )
+ event: Literal["EEA", "EEA3_load_shed"]
+ if label.startswith("EEA3 Load Shed Probability"):
+ event = "EEA3_load_shed"
+ elif label.startswith("EEA Probability"):
+ event = "EEA"
+ else:
+ raise ValueError(f"{member}/{chart}: Unknown risk series {label!r}")
+ coordinates = {
+ role: {
+ int(p.attrib["idx"]): Decimal(
+ p.findtext("./c:v", namespaces=_NS) or ""
+ )
+ for p in series.findall(f"./c:{role}//c:pt", _NS)
+ }
+ for role in ("cat", "val")
+ }
+ if (
+ not coordinates["cat"]
+ or coordinates["cat"].keys() != coordinates["val"].keys()
+ ):
+ raise ValueError(
+ f"{member}/{chart}: Unpaired risk chart coordinates"
+ )
+ for index, wind in coordinates["cat"].items():
+ yield MoraRiskPoint(
+ reportMonth=month,
+ event=event,
+ windGenerationMW=wind,
+ probability=coordinates["val"][index],
+ bessAvailabilityMW=Decimal(bess[1].replace(",", ""))
+ if bess
+ else None,
+ simulationRuns=int(runs[1].replace(",", "")) if runs else None,
+ chartHourEnding=_hour(x_title),
+ scenarioHourEnding=_hour(context),
+ sourceReportLabel=report_label,
+ sourceSeries=label,
+ sourceXAxisTitle=x_title,
+ sourceYAxisTitle="Probability",
+ sourceNotes=notes[sheet],
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceChart=chart,
+ sourcePointIndex=index,
+ sourceFile=source,
+ )
diff --git a/tinyercot/_office.py b/tinyercot/_office.py
new file mode 100644
index 00000000..14c73e05
--- /dev/null
+++ b/tinyercot/_office.py
@@ -0,0 +1,27 @@
+"""Read Excel's default workbook protection on public historical files."""
+
+from collections.abc import Callable
+from io import BytesIO
+from typing import Protocol, cast
+
+
+class _OfficeFile(Protocol):
+ def load_key(self, *, password: str) -> None: ...
+ def decrypt(self, outfile: BytesIO) -> None: ...
+
+
+def _unprotect_excel(data: bytes) -> bytes:
+ try:
+ import msoffcrypto
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read protected historical Excel files"
+ ) from error
+ # Excel/LibreOffice use this public, built-in key for workbook protection.
+ # A different password fails normally; no credentials are requested or tried.
+ factory = cast(Callable[[BytesIO], _OfficeFile], msoffcrypto.OfficeFile)
+ office = factory(BytesIO(data))
+ office.load_key(password="VelvetSweatshop")
+ output = BytesIO()
+ office.decrypt(output)
+ return output.getvalue()
diff --git a/tinyercot/_ordc.py b/tinyercot/_ordc.py
new file mode 100644
index 00000000..49ea8430
--- /dev/null
+++ b/tinyercot/_ordc.py
@@ -0,0 +1,89 @@
+"""The direct historical archive of interim indicative ORDC results."""
+
+from __future__ import annotations
+
+import csv
+from collections.abc import Iterator
+from datetime import datetime
+from decimal import Decimal
+from io import StringIO
+from typing import Literal
+
+from pydantic import BaseModel, ConfigDict
+
+from ._history import _csv_files
+from ._legacy_load import _number
+from ._public_tables import _PublicTable
+
+_HEADER = (
+ "SCED_TIMESTAMP",
+ "REPEATED_HOUR_FLAG",
+ "SYSTEM_LAMBDA",
+ "RTOLCAP",
+ "RTOFFCAP",
+ "RTORPA",
+ "RTOFFPA",
+)
+
+
+class IndicativeOrdcPrice(BaseModel):
+ """One interim indicative result, not a realized settlement price.
+
+ Reserve/input names retain the source abbreviations. The parsed timestamp
+ has no inferred timezone; its original text and repeat-hour flag remain.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ indicative: Literal[True] = True
+ scedTimestamp: datetime
+ sourceTimestamp: str
+ repeatedHourFlag: Literal["N", "Y"]
+ systemLambda: Decimal | None
+ rtolcap: Decimal | None
+ rtoffcap: Decimal | None
+ rtorpa: Decimal | None
+ rtoffpa: Decimal | None
+ sourceMember: str
+
+
+class IndicativeOrdcHistory(_PublicTable[IndicativeOrdcPrice]):
+ """Anonymous interim ORDC history; CSV decoding needs no optional packages."""
+
+ index_url = "https://www.ercot.com/mktinfo/rtm"
+ title_pattern = r"Indicative Real-Time Reserve ORDC Price Adder"
+
+ def _read(self, data: bytes, filename: str) -> Iterator[IndicativeOrdcPrice]:
+ files = (
+ _csv_files(data, "*.[cC][sS][vV]")
+ if data.startswith(b"PK")
+ else iter([(filename, data)])
+ )
+ found = False
+ for member, content in files:
+ rows = csv.reader(StringIO(content.decode("utf-8-sig")))
+ if tuple(next(rows, ())) != _HEADER:
+ raise ValueError(f"{member}: Unexpected indicative ORDC header")
+ found = True
+ for cells in rows:
+ if not cells:
+ continue
+ if len(cells) != len(_HEADER):
+ raise ValueError(f"{member}: Unexpected indicative ORDC row width")
+ # The source writes midnight as 00:xx AM in a 12-hour clock.
+ stamp = cells[0].replace(" 00:", " 12:")
+ parsed = datetime.strptime(stamp, "%m/%d/%Y %I:%M:%S %p") # noqa: DTZ007
+ yield IndicativeOrdcPrice.model_validate(
+ {
+ "scedTimestamp": parsed,
+ "sourceTimestamp": cells[0],
+ "repeatedHourFlag": cells[1],
+ "systemLambda": _number(cells[2]),
+ "rtolcap": _number(cells[3]),
+ "rtoffcap": _number(cells[4]),
+ "rtorpa": _number(cells[5]),
+ "rtoffpa": _number(cells[6]),
+ "sourceMember": member,
+ }
+ )
+ if not found:
+ raise ValueError("Download contains no indicative ORDC tables")
diff --git a/tinyercot/_pdf.py b/tinyercot/_pdf.py
new file mode 100644
index 00000000..64e1273f
--- /dev/null
+++ b/tinyercot/_pdf.py
@@ -0,0 +1,222 @@
+"""Optional extraction of explicitly mapped tables from public report PDFs."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from datetime import date, datetime
+from decimal import Decimal
+from io import BytesIO
+from itertools import pairwise
+from time import strptime
+from typing import TYPE_CHECKING, TypeVar, cast
+
+from pydantic import BaseModel
+
+from ._client import Transport
+from ._history import Archive, _archive_files
+
+if TYPE_CHECKING:
+ from pypdf import PageObject
+ from pypdf.generic import DictionaryObject
+
+T = TypeVar("T", bound=BaseModel)
+
+
+class PdfArchive(Archive[T]):
+ """Typed ESR Integration Report tables; requires the ``pdf`` extra.
+
+ Reads the published summary page, without estimating values from charts.
+ Publication filtering and archive/bundle downloads work as for CSV readers.
+ """
+
+ def __init__(
+ self,
+ client: Transport,
+ product: str,
+ row: type[T],
+ columns: dict[str, str],
+ dates: dict[str, str],
+ *,
+ start: str,
+ end: str,
+ pattern: str,
+ numbers: tuple[str, ...],
+ datetimes: dict[str, str],
+ records: bool = False,
+ notes: bool = False,
+ ) -> None:
+ super().__init__(client, product, row, columns, dates)
+ self._start = start
+ self._end = end
+ self._pattern = re.compile(pattern)
+ self._numbers = numbers
+ self._pdf_datetimes = datetimes
+ self._records = records
+ self._notes = notes
+
+ def read(self, data: bytes) -> Iterator[T]:
+ try:
+ from pypdf import PdfReader
+ except ImportError as error:
+ raise ImportError("Install tinyercot[pdf] to read PDF archives") from error
+ found = False
+ for filename, content in _archive_files(data, "*.pdf"):
+ found = True
+ book = PdfReader(BytesIO(content))
+ text = " ".join(book.pages[0].extract_text().split()) if book.pages else ""
+ try:
+ yield from self._read_text(text)
+ except ValueError as error:
+ raise ValueError(f"{filename}: {error}") from error
+ if not found:
+ raise ValueError("Download contains no PDF reports")
+
+ def _read_text(self, text: str) -> Iterator[T]:
+ header = re.search(r"ESR Integration Report\s*:\s*(\d{2}/\d{2}/\d{4})", text)
+ if header is None or "Current Daily Values:" not in text:
+ raise ValueError("Unsupported ESR Integration Report header")
+ report_date = date(*strptime(header[1], "%m/%d/%Y")[:3])
+ notes_at = text.find("* Sum")
+ if notes_at < 0:
+ raise ValueError("Missing report definitions")
+ # The 2023 report has no all-time record section at all.
+ if self._records and "All Time Record Values:" not in text:
+ if "Record" in text[:notes_at]:
+ raise ValueError("Unsupported PDF record section")
+ return
+ start = re.search(self._start, text)
+ end = re.search(self._end, text[start.end() :]) if start else None
+ if start is None or end is None:
+ raise ValueError("Unsupported PDF table headings")
+ section = text[start.end() : start.end() + end.start()].strip()
+ position = 0
+ while position < len(section):
+ match = self._pattern.match(section, position)
+ if match is None:
+ raise ValueError(
+ f"Unsupported PDF table values: {section[position:][:80]}"
+ )
+ values: dict[str, object] = dict(match.groupdict())
+ values["reportDate"] = report_date
+ if self._notes:
+ values["sourceNotes"] = text[notes_at:]
+ for field in self._numbers:
+ values[field] = str(values[field]).replace(",", "")
+ for field, fmt in self._pdf_datetimes.items():
+ # Preserve ERCOT's clock without inventing a timezone.
+ values[field] = datetime.strptime(str(values[field]), fmt) # noqa: DTZ007
+ yield self._row.model_validate(values)
+ position = match.end()
+ while position < len(section) and section[position].isspace():
+ position += 1
+ if not section:
+ raise ValueError("Empty PDF table")
+
+
+class PdfChartArchive(Archive[T]):
+ """Printed hourly percentages in ESR report charts, without digitizing bars."""
+
+ def __init__(
+ self,
+ client: Transport,
+ product: str,
+ row: type[T],
+ columns: dict[str, str],
+ dates: dict[str, str],
+ *,
+ charts: dict[str, tuple[int, str]],
+ ) -> None:
+ super().__init__(client, product, row, columns, dates)
+ self._charts = charts
+
+ def read(self, data: bytes) -> Iterator[T]:
+ try:
+ from pypdf import PdfReader
+ except ImportError as error:
+ raise ImportError("Install tinyercot[pdf] to read PDF archives") from error
+ found = False
+ for filename, content in _archive_files(data, "*.pdf"):
+ found = True
+ book = PdfReader(BytesIO(content))
+ try:
+ header = re.search(
+ r"ESR Integration Report\s*:\s*(\d{2}/\d{2}/\d{4})",
+ book.pages[0].extract_text() if book.pages else "",
+ )
+ if header is None:
+ raise ValueError("Unsupported ESR Integration Report header")
+ report_date = date(*strptime(header[1], "%m/%d/%Y")[:3])
+ rows: list[dict[str, object]] = []
+ for field, (page_number, legend) in self._charts.items():
+ if page_number > len(book.pages):
+ raise ValueError(f"Missing chart page {page_number}")
+ values = _chart_percentages(book.pages[page_number - 1], legend)
+ hours = [hour for hour, _ in values]
+ if not rows:
+ rows = [
+ {"reportDate": report_date, "hourEnding": h} for h in hours
+ ]
+ elif hours != [r["hourEnding"] for r in rows]:
+ raise ValueError("Chart hour labels disagree")
+ for row, (_, value) in zip(rows, values, strict=True):
+ row[field] = value
+ for row in rows:
+ yield self._row.model_validate(row)
+ except ValueError as error:
+ raise ValueError(f"{filename}: {error}") from error
+ if not found:
+ raise ValueError("Download contains no PDF reports")
+
+
+def _chart_percentages(
+ page: PageObject, legend: str
+) -> list[tuple[str, Decimal | None]]:
+ charts: list[list[tuple[str, float]]] = []
+ resources = cast("DictionaryObject", page["/Resources"])
+ for reference in resources.get("/XObject", {}).values():
+ form = reference.get_object()
+ if form.get("/Subtype") != "/Form":
+ continue
+ chunks: list[tuple[str, float]] = []
+
+ def visit(
+ text: str,
+ cm: list[float],
+ tm: list[float],
+ font: object,
+ size: float,
+ *,
+ output: list[tuple[str, float]] = chunks,
+ ) -> None:
+ # Use each form's local coordinates, including text/user transforms.
+ output.append((text.strip(), tm[4] * cm[0] + tm[5] * cm[2] + cm[4]))
+
+ text = page.extract_xform_text(form, visitor_text=visit)
+ if legend in [line.strip() for line in text.splitlines()]:
+ charts.append(chunks)
+ if len(charts) != 1:
+ raise ValueError(f"Expected one chart for {legend!r}")
+ chunks = charts[0]
+ hours = sorted(
+ ((text, x) for text, x in chunks if re.fullmatch(r"\d{2}", text)),
+ key=lambda h: h[1],
+ )
+ if len(hours) < 2:
+ raise ValueError(f"Missing hour axis for {legend!r}")
+ spacing = min(b[1] - a[1] for a, b in pairwise(hours))
+ if spacing <= 0:
+ raise ValueError("Ambiguous chart hour positions")
+ values: list[Decimal | None] = [None] * len(hours)
+ for text, x in chunks:
+ if not re.fullmatch(r"-?\d+(?:\.\d+)?%", text):
+ continue
+ # The percentage-axis ticks sit to the left of the hour axis.
+ if x < hours[0][1] - spacing / 2:
+ continue
+ distances = [abs(x - hour_x) for _, hour_x in hours]
+ index = distances.index(min(distances))
+ if distances[index] >= spacing / 2 or values[index] is not None:
+ raise ValueError(f"Ambiguous chart label {text!r}")
+ values[index] = Decimal(text.removesuffix("%"))
+ return [(hour, value) for (hour, _), value in zip(hours, values, strict=True)]
diff --git a/tinyercot/_peak_forecasts.py b/tinyercot/_peak_forecasts.py
new file mode 100644
index 00000000..d5b96ad7
--- /dev/null
+++ b/tinyercot/_peak_forecasts.py
@@ -0,0 +1,130 @@
+"""Public summer peak-demand forecasts under historical weather scenarios."""
+
+from __future__ import annotations
+
+from collections.abc import Iterator
+from decimal import Decimal
+from typing import Literal
+
+from pydantic import Field
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._load_forecasts import _ForecastRow, _ForecastTable
+
+_SUMMARIES = {
+ "Official Forecast 50/50": "p50MW",
+ "P50": "p50MW",
+ "90th Percentile": "p90MW",
+ "P90": "p90MW",
+ "ercot_90th": "p90MW",
+ "Forecast": "forecastMW",
+ "Contracts": "contractsMW",
+ "Officer Letters": "officerLettersMW",
+ "Total Large Loads": "totalLargeLoadsMW",
+}
+
+
+class PeakDemandForecast(_ForecastRow):
+ """One source forecast year/table; weather years are scenarios, not vintages."""
+
+ forecastYear: int
+ demandBasis: Literal["gross", "net", "rooftop_pv", "unspecified"]
+ weatherYearMW: dict[int, Decimal | None]
+ forecastMW: Decimal | None = None
+ p50MW: Decimal | None = None
+ p90MW: Decimal | None = None
+ contractsMW: Decimal | None = None
+ officerLettersMW: Decimal | None = None
+ totalLargeLoadsMW: Decimal | None = None
+ sourceSummaryLabels: dict[str, str]
+ # Unlabelled auxiliary numeric cells have no inferred weather year or unit.
+ sourceExtraValues: dict[int, Decimal | None] = Field(default_factory=dict)
+ sourceTitle: str
+ sourceNotes: list[str]
+
+
+class PeakDemandForecasts(_ForecastTable[PeakDemandForecast]):
+ title_pattern = "ERCOT Peak Demand Scenarios"
+
+ def _read(self, data: bytes, filename: str) -> Iterator[PeakDemandForecast]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, iterator in _sheets(content, date_columns=()):
+ if sheet == "Compatibility Report":
+ continue
+ rows = list(iterator)
+ notes = [
+ v
+ for row in rows
+ for v in row
+ if isinstance(v, str) and v.startswith("This includes ")
+ ]
+ title = ""
+ header: tuple[object, ...] = ()
+ for line, cells in enumerate(rows, 1):
+ for value in cells:
+ if (
+ isinstance(value, str)
+ and "Peak Demand (MW) based on" in value
+ ):
+ title, header = value, ()
+ if cells and cells[0] in ("Forecast Year", "year"):
+ header = cells
+ if not title:
+ raise ValueError(
+ f"{member}/{sheet}: missing peak-demand title"
+ )
+ continue
+ if not cells or not isinstance(cells[0], (int, float)):
+ continue
+ if not header:
+ raise ValueError(
+ f"{member}/{sheet}:{line}: missing forecast header"
+ )
+ basis: Literal["gross", "net", "rooftop_pv", "unspecified"] = (
+ "unspecified"
+ )
+ if title.startswith("Gross "):
+ basis = "gross"
+ elif title.startswith("Net "):
+ basis = "net"
+ elif title.startswith("Rooftop PV "):
+ basis = "rooftop_pv"
+ weather: dict[int, Decimal | None] = {}
+ summaries: dict[str, Decimal | None] = {}
+ labels: dict[str, str] = {}
+ extras: dict[int, Decimal | None] = {}
+ for column, value in enumerate(cells[1:], 1):
+ label = header[column] if column < len(header) else None
+ if label in (None, ""):
+ if value not in (None, ""):
+ extras[column + 1] = _number(value)
+ elif str(label).removesuffix(".0").isdigit():
+ weather[int(str(label).removesuffix(".0"))] = _number(value)
+ elif str(label) in _SUMMARIES:
+ field = _SUMMARIES[str(label)]
+ summaries[field] = _number(value)
+ labels[field] = str(label)
+ else:
+ raise ValueError(
+ f"{member}/{sheet}: unknown forecast column {label!r}"
+ )
+ found = True
+ yield PeakDemandForecast(
+ forecastYear=int(cells[0]),
+ demandBasis=basis,
+ weatherYearMW=weather,
+ sourceSummaryLabels=labels,
+ sourceExtraValues=extras,
+ sourceTitle=title,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=line,
+ sourceFile=None,
+ **summaries,
+ )
+ if not found:
+ raise ValueError("No peak-demand forecast tables found")
diff --git a/tinyercot/_public_tables.py b/tinyercot/_public_tables.py
new file mode 100644
index 00000000..749dee31
--- /dev/null
+++ b/tinyercot/_public_tables.py
@@ -0,0 +1,386 @@
+"""Typed tables published as direct downloads on ERCOT's public website."""
+
+from __future__ import annotations
+
+import re
+from abc import ABC, abstractmethod
+from collections.abc import Callable, Iterator
+from datetime import date
+from decimal import Decimal
+from html.parser import HTMLParser
+from time import strptime
+from typing import Generic, Literal, TypeVar
+from urllib.parse import urljoin, urlsplit
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+
+T = TypeVar("T", bound=BaseModel)
+
+
+class PublicFile(BaseModel):
+ """An actual public download link, with no inferred coverage dates."""
+
+ title: str
+ url: str
+
+
+class _FileLinks(HTMLParser):
+ def __init__(self, index_url: str, title_pattern: str) -> None:
+ super().__init__()
+ self.index_url = index_url
+ self.title_pattern = title_pattern
+ self.href: str | None = None
+ self.title = ""
+ self.files: dict[str, PublicFile] = {}
+
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
+ if tag == "a":
+ self.href = dict(attrs).get("href")
+ self.title = ""
+
+ def handle_data(self, data: str) -> None:
+ if self.href is not None:
+ self.title += data
+
+ def handle_endtag(self, tag: str) -> None:
+ if tag != "a" or self.href is None:
+ return
+ title = " ".join(self.title.split())
+ url = urljoin(self.index_url, self.href)
+ parts = urlsplit(url)
+ if (
+ re.fullmatch(self.title_pattern, title)
+ and parts.scheme == "https"
+ and parts.netloc == "www.ercot.com"
+ and parts.path.startswith("/files/docs/")
+ ):
+ self.files[url] = PublicFile(title=title, url=url)
+ self.href = None
+
+
+class _PublicFiles:
+ index_url: str
+ title_pattern: str
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def files(self) -> list[PublicFile]:
+ """Discover current download links; labels do not establish coverage."""
+ response = self._http.get(self.index_url, follow_redirects=True)
+ response.raise_for_status()
+ links = _FileLinks(self.index_url, self.title_pattern)
+ links.feed(response.text)
+ if not links.files:
+ raise ValueError(f"No matching public files found at {self.index_url}")
+ return list(links.files.values())
+
+ def download(self, file: PublicFile) -> bytes:
+ response = self._http.get(file.url, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+
+class _YearLinks(_FileLinks):
+ def __init__(self, index_url: str, title_pattern: str) -> None:
+ super().__init__(index_url, title_pattern)
+ self.years: set[str] = set()
+
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
+ super().handle_starttag(tag, attrs)
+ if tag == "a" and self.href:
+ url = urljoin(self.index_url, self.href)
+ parts = urlsplit(url)
+ if (
+ parts.scheme == "https"
+ and parts.netloc == "www.ercot.com"
+ and re.fullmatch(
+ rf"{re.escape(urlsplit(self.index_url).path)}/\d{{4}}", parts.path
+ )
+ ):
+ self.years.add(url)
+
+
+def _year_files(
+ client: httpx.Client, index_url: str, title_pattern: str
+) -> list[PublicFile]:
+ """Collect actual download links from an index and its linked annual pages."""
+
+ def links(url: str) -> _YearLinks:
+ response = client.get(url, follow_redirects=True)
+ response.raise_for_status()
+ parser = _YearLinks(url, title_pattern)
+ parser.feed(response.text)
+ return parser
+
+ current = links(index_url)
+ files = dict(current.files)
+ for url in sorted(current.years):
+ files.update(links(url).files)
+ if not files:
+ raise ValueError(f"No matching public files found at {index_url}")
+ return sorted(files.values(), key=lambda f: f.url)
+
+
+class _ResourceFiles(_PublicFiles):
+ index_url = "https://www.ercot.com/gridinfo/resource"
+
+ def files(self) -> list[PublicFile]:
+ """Discover resource workbooks in current and linked historical indexes."""
+ workbooks = [
+ f
+ for f in _year_files(self._http, self.index_url, self.title_pattern)
+ if urlsplit(f.url).path.lower().endswith((".xlsx", ".xls"))
+ ]
+ if not workbooks:
+ raise ValueError(
+ "No matching resource workbooks found in ERCOT's public indexes"
+ )
+ return workbooks
+
+
+class _PublicTable(_PublicFiles, ABC, Generic[T]):
+ def rows(self, *, where: Callable[[T], bool] | None = None) -> Iterator[T]:
+ """Read every linked file with an optional typed predicate."""
+ for file in self.files():
+ yield from self.read(
+ self.download(file), filename=file.url.rsplit("/", 1)[-1], where=where
+ )
+
+ def read(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ where: Callable[[T], bool] | None = None,
+ ) -> Iterator[T]:
+ """Read saved source files or ZIPs, keeping overlapping files distinct."""
+ for record in self._read(data, filename):
+ if where is None or where(record):
+ yield record
+
+ @abstractmethod
+ def _read(self, data: bytes, filename: str) -> Iterator[T]: ...
+
+
+class CrrTimeOfUse(BaseModel):
+ """One delivery month and the source's CRR time-of-use hour counts."""
+
+ model_config = ConfigDict(extra="forbid")
+ month: date
+ offPeakHours: int
+ peakWDHours: int
+ peakWEHours: int
+ totalHours: int
+ sourceMember: str
+ sourceSheet: str
+
+
+class CrrHours(_PublicTable[CrrTimeOfUse]):
+ """Monthly CRR trading-hour calendars; parsing uses tinyercot[files]."""
+
+ index_url = "https://www.ercot.com/mktinfo/crr"
+ title_pattern = r"CRR Time of Use Hours"
+
+ def _read(self, data: bytes, filename: str) -> Iterator[CrrTimeOfUse]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=()):
+ for cells in rows:
+ if cells == (
+ "Year",
+ "Month",
+ "OffPeak",
+ "PeakWD",
+ "PeakWE",
+ "Total",
+ ):
+ break
+ else:
+ raise ValueError(f"{member}/{sheet}: Missing CRR hour header")
+ found = True
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ if len(cells) != 6:
+ raise ValueError(f"{member}/{sheet}: Unexpected CRR row width")
+ year = str(cells[0]).removesuffix(".0")
+ month = date(*strptime(f"{year} {cells[1]}", "%Y %B")[:3])
+ yield CrrTimeOfUse.model_validate(
+ {
+ "month": month,
+ "offPeakHours": cells[2],
+ "peakWDHours": cells[3],
+ "peakWEHours": cells[4],
+ "totalHours": cells[5],
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ }
+ )
+ if not found:
+ raise ValueError("Download contains no CRR hour tables")
+
+
+class PolrUsage(BaseModel):
+ """Retail territory/class totals with separate count and energy periods.
+
+ Counts describe active ESIIDs with usage on snapshotDate. Energy describes
+ all ESIIDs active during the inclusive energy period, not just that snapshot.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ territory: str
+ premiseType: Literal[
+ "Residential",
+ "Small Non-Residential",
+ "Medium Non-Residential",
+ "Large Non-Residential",
+ ]
+ snapshotDate: date
+ energyPeriodStart: date
+ energyPeriodEnd: date
+ activeEsiids: int
+ energyKWh: Decimal | None
+ sourceMember: str
+ sourceSheet: str
+ sourceNotes: list[str]
+
+
+class PolrHistory(_PublicTable[PolrUsage]):
+ """Public provider-of-last-resort counts and energy, using tinyercot[files]."""
+
+ index_url = "https://www.ercot.com/mktinfo/retail"
+ title_pattern = r"POLR Counts Energy \d{4} Report(?: Final)?"
+
+ def _read(self, data: bytes, filename: str) -> Iterator[PolrUsage]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ # Cover notes may precede or follow the table in a saved workbook.
+ tables = [
+ (sheet, list(rows)) for sheet, rows in _sheets(content, date_columns=())
+ ]
+ notes = [
+ c
+ for sheet, rows in tables
+ if sheet == "PUCT_Even_Year_Cover_Page"
+ for cells in rows
+ for c in cells
+ if isinstance(c, str) and c
+ ]
+ for sheet, table in tables:
+ if sheet == "PUCT_Even_Year_Cover_Page":
+ continue
+ rows = iter(table)
+ for cells in rows:
+ if cells[:2] == ("POLR Territory", "Premise Type"):
+ break
+ else:
+ raise ValueError(f"{member}/{sheet}: Missing POLR header")
+ count = re.fullmatch(r"# Active ESIIDs Total \((.+)\)", str(cells[2]))
+ energy = re.fullmatch(r"Annual kWh \((.+) - (.+)\)", str(cells[3]))
+ if not count or not energy:
+ raise ValueError(
+ f"{member}/{sheet}: Missing POLR reporting periods"
+ )
+ snapshot = date(*strptime(count[1], "%m/%d/%Y")[:3])
+ start = date(*strptime(energy[1], "%m/%d/%Y")[:3])
+ end = date(*strptime(energy[2], "%m/%d/%Y")[:3])
+ found = True
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ if len(cells) != 4:
+ raise ValueError(f"{member}/{sheet}: Unexpected POLR row width")
+ yield PolrUsage.model_validate(
+ {
+ "territory": cells[0],
+ "premiseType": cells[1],
+ "snapshotDate": snapshot,
+ "energyPeriodStart": start,
+ "energyPeriodEnd": end,
+ "activeEsiids": cells[2],
+ "energyKWh": _number(cells[3]),
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceNotes": notes,
+ }
+ )
+ if not found:
+ raise ValueError("Download contains no POLR tables")
+
+
+class LoadShedShare(BaseModel):
+ """An operator's published load share, not shed MW or outage probability.
+
+ The effective start comes from the workbook note; no end date is assumed.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ season: Literal["summer", "winter"]
+ transmissionOperator: str
+ loadSharePercent: Decimal | None
+ effectiveFrom: date
+ sourceHeader: str
+ sourceNotes: list[str]
+ sourceMember: str
+ sourceSheet: str
+
+
+class LoadShed(_PublicTable[LoadShedShare]):
+ """Published seasonal operator load shares, read with tinyercot[files]."""
+
+ index_url = "https://www.ercot.com/gridinfo/load"
+ title_pattern = r"(?:Summer|Winter) Load Shed Table"
+
+ def _read(self, data: bytes, filename: str) -> Iterator[LoadShedShare]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, source in _sheets(content, date_columns=()):
+ rows = list(source)
+ header = str(rows[0][1]) if rows else ""
+ match = re.fullmatch(
+ r"(Summer|Winter) Total Transmission Operator Load \(% MW\)", header
+ )
+ if not match or rows[0][0] != "Transmission Operator":
+ raise ValueError(
+ f"{member}/{sheet}: Missing load-shed share header"
+ )
+ notes = [
+ str(row[0])
+ for row in rows
+ if row and str(row[0]).startswith(("*", "Note:"))
+ ]
+ effective = re.search(
+ r"goes into effect on (\d{2}/\d{2}/\d{4})", "\n".join(notes)
+ )
+ if effective is None:
+ raise ValueError(
+ f"{member}/{sheet}: Missing load-shed effective date"
+ )
+ found = True
+ for row in rows[1:]:
+ if (
+ not row
+ or row[0] in (None, "")
+ or str(row[0]).startswith(("*", "Note:"))
+ ):
+ continue
+ yield LoadShedShare(
+ season="summer" if match[1] == "Summer" else "winter",
+ transmissionOperator=str(row[0]),
+ loadSharePercent=_number(row[1]),
+ effectiveFrom=date(*strptime(effective[1], "%m/%d/%Y")[:3]),
+ sourceHeader=header,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet=sheet,
+ )
+ if not found:
+ raise ValueError("Download contains no operator load-share tables")
diff --git a/tinyercot/_retail.py b/tinyercot/_retail.py
new file mode 100644
index 00000000..e81676ed
--- /dev/null
+++ b/tinyercot/_retail.py
@@ -0,0 +1,92 @@
+"""Public retail transaction counts, retaining source categories and totals."""
+
+from __future__ import annotations
+
+from collections.abc import Iterator
+from datetime import date
+from decimal import Decimal
+from time import strptime
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._public_tables import _PublicTable
+
+
+class RetailTransactionDay(BaseModel):
+ """One daily count from a published transaction/category row."""
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ count: int | None
+
+
+class RetailTransactionMonth(BaseModel):
+ """One transaction code or category total for a source month.
+
+ transactionCode=None identifies the source's Grand Total row. Categories
+ overlap: sourceSheet retains the original grouping, including unnamed ones.
+ Reported totals and averages are retained rather than recalculated.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ month: date
+ transactionCode: str | None
+ days: list[RetailTransactionDay]
+ reportedTotal: int | None
+ reportedAveragePerDay: Decimal | None
+ sourceMember: str
+ sourceSheet: str
+
+
+class RetailTransactions(_PublicTable[RetailTransactionMonth]):
+ """Discover retail transaction histories; decoding uses tinyercot[files]."""
+
+ index_url = "https://www.ercot.com/mktinfo/retail"
+ title_pattern = r"Retail Monthly Transaction Totals"
+
+ def _read(self, data: bytes, filename: str) -> Iterator[RetailTransactionMonth]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=()):
+ header = next(rows, ())
+ if (
+ len(header) < 4
+ or header[0] not in (None, "")
+ or header[-2:] != ("Grand Total", "Average/day")
+ ):
+ raise ValueError(
+ f"{member}/{sheet}: Unexpected retail count header"
+ )
+ dates = [date(*strptime(str(v), "%m/%d/%Y")[:3]) for v in header[1:-2]]
+ month = dates[0].replace(day=1)
+ if any(d.replace(day=1) != month for d in dates):
+ raise ValueError(f"{member}/{sheet}: Mixed months in retail table")
+ found = True
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ if len(cells) != len(header) or not isinstance(cells[0], str):
+ raise ValueError(
+ f"{member}/{sheet}: Unexpected retail count row"
+ )
+ yield RetailTransactionMonth.model_validate(
+ {
+ "month": month,
+ "transactionCode": None
+ if cells[0] == "Grand Total"
+ else cells[0],
+ "days": [
+ {"operatingDay": day, "count": _number(value)}
+ for day, value in zip(dates, cells[1:-2], strict=True)
+ ],
+ "reportedTotal": _number(cells[-2]),
+ "reportedAveragePerDay": _number(cells[-1]),
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ }
+ )
+ if not found:
+ raise ValueError("Download contains no retail transaction tables")
diff --git a/tinyercot/_weather.py b/tinyercot/_weather.py
new file mode 100644
index 00000000..4d50cbca
--- /dev/null
+++ b/tinyercot/_weather.py
@@ -0,0 +1,172 @@
+"""Historical weighted weather-zone observations from ERCOT's public files."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from datetime import date, datetime
+from decimal import Decimal
+from typing import Literal, get_args
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+
+URL = "https://www.ercot.com/files/docs/2002/12/11/weather1996_2000.zip"
+WeatherZone = Literal[
+ "COAST", "EAST", "FWEST", "NCENT", "NORTH", "SCENT", "SOUTH", "WEST"
+]
+WeatherVariable = Literal["CLOUDCOVER", "WINDSPEED", "DEWPOINT", "DRYBULB TEMP"]
+_ZONES: dict[str, WeatherZone] = {
+ "Coast": "COAST",
+ "East": "EAST",
+ "FarWest": "FWEST",
+ "North Central": "NCENT",
+ "North": "NORTH",
+ "South Central": "SCENT",
+ "South": "SOUTH",
+ "West": "WEST",
+}
+_HOURS = tuple(f"Hour {i}" for i in range(1, 25))
+
+
+class WeatherHour(BaseModel):
+ """A source hour column, with no inferred ending time, DST flag or UTC offset."""
+
+ model_config = ConfigDict(extra="forbid")
+ hour: int
+ value: Decimal | None
+
+
+class WeatherDay(BaseModel):
+ """One variable/day from weighted station observations within a weather zone.
+
+ Values retain their original scale. These workbooks do not label measurement
+ units, so sourceUnit remains None; no unit or clock conversion is performed.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ operatingDay: date
+ weatherZone: WeatherZone
+ variable: WeatherVariable
+ hours: list[WeatherHour]
+ sourceUnit: str | None = None
+ sourceMember: str
+ sourceSheet: str
+ sourceNotes: list[str]
+
+
+class HistoricalWeather:
+ """Anonymous hourly history; workbook decoding uses tinyercot[files]."""
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def download(self) -> bytes:
+ """Return ERCOT's original weather ZIP, including all eight zones."""
+ response = self._http.get(URL, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+ def rows(
+ self,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ weather_zone: WeatherZone | None = None,
+ variable: WeatherVariable | None = None,
+ ) -> Iterator[WeatherDay]:
+ """Stream variable/day records with inclusive dates and exact filters."""
+ _check_filters(date_from, date_to, weather_zone, variable)
+ yield from self.read(
+ self.download(),
+ date_from=date_from,
+ date_to=date_to,
+ weather_zone=weather_zone,
+ variable=variable,
+ )
+
+ def read(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ date_from: date | None = None,
+ date_to: date | None = None,
+ weather_zone: WeatherZone | None = None,
+ variable: WeatherVariable | None = None,
+ ) -> Iterator[WeatherDay]:
+ """Read a saved ZIP or workbook; retain the original filename for its zone.
+
+ Use actual worksheet dates, including dates beyond the archive's label.
+ Preserve all 24 numbered hour columns, with blank cells remaining None.
+ """
+ _check_filters(date_from, date_to, weather_zone, variable)
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ match = re.fullmatch(
+ r"Weather '96-'00 (.+)\.xlsx?", member.rsplit("/", 1)[-1]
+ )
+ if match is None or match[1] not in _ZONES:
+ raise ValueError(f"{member}: Cannot identify source weather zone")
+ zone = _ZONES[match[1]]
+ if weather_zone is not None and zone != weather_zone:
+ continue
+ for sheet, rows in _sheets(content):
+ if sheet not in get_args(WeatherVariable):
+ raise ValueError(f"{member}/{sheet}: Unknown weather variable")
+ if variable is not None and sheet != variable:
+ continue
+ notes: list[str] = []
+ for cells in rows:
+ if cells[1:] == _HOURS:
+ break
+ notes.extend(c for c in cells if isinstance(c, str) and c)
+ else:
+ raise ValueError(
+ f"{member}/{sheet}: Missing hourly weather columns"
+ )
+ found = True
+ for cells in rows:
+ if all(c in (None, "") for c in cells):
+ continue
+ if len(cells) != 25 or not isinstance(cells[0], datetime):
+ raise ValueError(
+ f"{member}/{sheet}: Invalid hourly weather row"
+ )
+ day = cells[0].date()
+ if (date_from and day < date_from) or (date_to and day > date_to):
+ continue
+ yield WeatherDay.model_validate(
+ {
+ "operatingDay": day,
+ "weatherZone": zone,
+ "variable": sheet,
+ "hours": [
+ WeatherHour(hour=i, value=_number(v))
+ for i, v in enumerate(cells[1:], 1)
+ ],
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceNotes": notes,
+ }
+ )
+ if not found and weather_zone is None and variable is None:
+ raise ValueError("Download contains no historical weather tables")
+
+
+def _check_filters(
+ date_from: date | None,
+ date_to: date | None,
+ weather_zone: WeatherZone | None,
+ variable: WeatherVariable | None,
+) -> None:
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ if weather_zone is not None and weather_zone not in _ZONES.values():
+ raise ValueError("Unknown weather_zone")
+ if variable is not None and variable not in get_args(WeatherVariable):
+ raise ValueError("Unknown weather variable")
diff --git a/tinyercot/_xlsx.py b/tinyercot/_xlsx.py
new file mode 100644
index 00000000..0ccfbf44
--- /dev/null
+++ b/tinyercot/_xlsx.py
@@ -0,0 +1,119 @@
+"""Optional spreadsheet support for generated historical row models."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterator
+from datetime import date, datetime, time
+from decimal import Decimal
+from io import BytesIO
+from time import strptime
+from typing import TypeVar
+
+from pydantic import BaseModel
+
+from ._client import Transport
+from ._history import Archive, _archive_files
+
+T = TypeVar("T", bound=BaseModel)
+
+
+class WorkbookArchive(Archive[T]):
+ """Typed report worksheets from ERCOT XLSX downloads (requires ``files`` extra)."""
+
+ def __init__(
+ self,
+ client: Transport,
+ product: str,
+ row: type[T],
+ columns: dict[str, str],
+ dates: dict[str, str],
+ *,
+ sheets: tuple[str, ...],
+ variants: tuple[dict[str, str], ...] = (),
+ ) -> None:
+ super().__init__(client, product, row, columns, dates, variants=variants)
+ self._sheets = sheets
+
+ def read(self, data: bytes) -> Iterator[T]:
+ try:
+ from openpyxl import load_workbook
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read XLSX archives"
+ ) from error
+ found = False
+ for filename, content in _archive_files(data, "*.xlsx"):
+ book = load_workbook(BytesIO(content), read_only=True, data_only=True)
+ try:
+ for sheet in book:
+ if sheet.title not in self._sheets:
+ continue
+ found = True
+ sheet.reset_dimensions() # Some ERCOT files incorrectly declare A1:A1.
+ header: tuple[str, ...] | None = None
+ for line, cells in enumerate(sheet.iter_rows(values_only=True), 1):
+ values = list(cells)
+ while values and values[-1] is None:
+ values.pop()
+ if not values:
+ continue
+ if header is None:
+ if (
+ all(
+ isinstance(v, str) and v in self._columns
+ for v in values
+ )
+ and len(values) > 1
+ ):
+ header = tuple(v for v in values if isinstance(v, str))
+ continue
+ # Report-builder footers: a date, page number and clock;
+ # older reports use a single formatted text line instead.
+ nonempty = [v for v in values if v is not None]
+ if (
+ isinstance(values[0], datetime)
+ and any(isinstance(v, time) for v in nonempty)
+ and all(
+ isinstance(v, (datetime, time, int)) for v in nonempty
+ )
+ ):
+ continue
+ if (
+ len(values) == 1
+ and isinstance(values[0], str)
+ and (
+ values[0].strip() == "ERCOT Confidential"
+ or re.search(r" - \d+ - ", values[0])
+ )
+ ):
+ continue
+ try:
+ if len(values) > len(header):
+ raise ValueError("Unexpected worksheet columns")
+ values += [None] * (len(header) - len(values))
+ converted: dict[str, object] = {"sourceSheet": sheet.title}
+ for column, value in zip(header, values, strict=True):
+ target = self._columns[column]
+ if isinstance(value, str):
+ value = value.strip() or None
+ if value is not None and target in self._dates:
+ value = date(
+ *strptime(str(value), self._dates[target])[:3]
+ )
+ elif isinstance(value, float):
+ value = Decimal(str(value))
+ converted[target] = value
+ yield self._row.model_validate(converted)
+ except ValueError as error:
+ raise ValueError(
+ f"{filename}/{sheet.title}:{line}: {error}"
+ ) from error
+ if header is None:
+ raise ValueError(
+ f"{filename}/{sheet.title}: no supported header"
+ )
+ finally:
+ book.close()
+ if not found:
+ raise ValueError("Download contains no supported worksheets")
diff --git a/tinyercot/_zonal_energy.py b/tinyercot/_zonal_energy.py
new file mode 100644
index 00000000..bb592951
--- /dev/null
+++ b/tinyercot/_zonal_energy.py
@@ -0,0 +1,430 @@
+"""Original zonal-market generation and load energy, before the nodal market."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date, datetime
+from decimal import Decimal
+from time import strptime
+from typing import Literal
+
+from pydantic import BaseModel, ConfigDict
+
+from ._energy import EnergyInterval
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._loss_factors import _interval_label
+from ._public_tables import PublicFile, _PublicFiles, _year_files
+
+_Kind = Literal["generation", "load"]
+
+
+class ZonalSourceNumber(BaseModel):
+ """A numeric source cell whose header does not establish its meaning/unit."""
+
+ model_config = ConfigDict(extra="forbid")
+ column: int
+ value: Decimal
+ sourceHeader: str | None
+
+
+class ZonalEnergyDay(BaseModel):
+ """One original zone/day; zone codes retain their historical definitions.
+
+ Values, blanks and reported totals are never reconciled. Extra source
+ numbers are not assumed to be interval energy. Unknown clock labels on
+ extended load rows remain None. Source timestamps are not publication times.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ kind: _Kind
+ operatingDay: date
+ zone: str
+ totalMWh: Decimal | None
+ intervals: list[EnergyInterval]
+ recorder: str | None
+ channel: int | None
+ origin: str | None
+ sourceTimestamp: datetime | None
+ sourceNumbers: list[ZonalSourceNumber]
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+ sourceFile: PublicFile | None = None
+
+
+class ZonalEnergyTotal(BaseModel):
+ """A published summary or detail subtotal, separate from daily observations.
+
+ share is the original fractional value, even under a percent-formatted
+ header. Cached totals are not recomputed. The original label, header and
+ notes retain unlabeled grand totals and source inconsistencies.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ kind: _Kind
+ year: int | None
+ scope: Literal["summary", "detail_total"]
+ zone: str | None
+ totalMWh: Decimal | None
+ share: Decimal | None
+ intervals: list[EnergyInterval]
+ sourceNumbers: list[ZonalSourceNumber]
+ sourceLabel: str | None
+ sourceTotalHeader: str
+ sourceShareHeader: str | None
+ sourceNotes: list[str]
+ sourceMember: str
+ sourceSheet: str
+ sourceRow: int
+ sourceFile: PublicFile | None = None
+
+
+class ZonalEnergy(_PublicFiles):
+ """Discover original generation/load MWh files with optional [files] parsing."""
+
+ index_url = "https://www.ercot.com/mktinfo/data_agg"
+ title_pattern = r"\d{4} (?:Generation|Load) MWh by CM ?Zone"
+
+ def files(self) -> list[PublicFile]:
+ return _year_files(self._http, self.index_url, self.title_pattern)
+
+ def rows(
+ self,
+ *,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[ZonalEnergyDay], bool] | None = None,
+ ) -> Iterator[ZonalEnergyDay]:
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for file in self.files():
+ yield from self.read(
+ self.download(file),
+ filename=file.url.rsplit("/", 1)[-1],
+ source_file=file,
+ date_from=date_from,
+ date_to=date_to,
+ where=where,
+ )
+
+ def read(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ kind: _Kind | None = None,
+ source_file: PublicFile | None = None,
+ date_from: date | None = None,
+ date_to: date | None = None,
+ where: Callable[[ZonalEnergyDay], bool] | None = None,
+ ) -> Iterator[ZonalEnergyDay]:
+ """Read daily tables; bare unnamed files require an explicit kind.
+
+ Duplicated generation 'raw data' sheets remain in the download. The
+ published daily tables retain all their original intervals and totals.
+ """
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ found = False
+ for member, sheet, rows in _tables(data, filename):
+ header = _header(rows[0])
+ if not _date_column(header):
+ continue
+ found = True
+ family = _kind(kind, member, source_file)
+ for record in _days(rows, header, family, member, sheet, source_file):
+ day = record.operatingDay
+ if (date_from and day < date_from) or (date_to and day > date_to):
+ continue
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no zonal energy daily tables")
+
+ def totals(
+ self, *, where: Callable[[ZonalEnergyTotal], bool] | None = None
+ ) -> Iterator[ZonalEnergyTotal]:
+ for file in self.files():
+ yield from self.read_totals(
+ self.download(file),
+ filename=file.url.rsplit("/", 1)[-1],
+ source_file=file,
+ where=where,
+ )
+
+ def read_totals(
+ self,
+ data: bytes,
+ *,
+ filename: str = "workbook",
+ kind: _Kind | None = None,
+ source_file: PublicFile | None = None,
+ where: Callable[[ZonalEnergyTotal], bool] | None = None,
+ ) -> Iterator[ZonalEnergyTotal]:
+ """Read cached summary and detail totals, preserving their differences."""
+ found = False
+ for member, sheet, rows in _tables(data, filename):
+ family = _kind(kind, member, source_file)
+ for record in _totals(rows, family, member, sheet, source_file):
+ found = True
+ if where is None or where(record):
+ yield record
+ if not found:
+ raise ValueError("Download contains no zonal energy totals")
+
+
+def _tables(
+ data: bytes, filename: str
+) -> Iterator[tuple[str, str, list[tuple[object, ...]]]]:
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, values in _zonal_sheets(content):
+ if sheet.lower() == "raw data":
+ continue
+ rows = list(values)
+ if rows:
+ yield member, sheet, rows
+
+
+def _zonal_sheets(data: bytes) -> Iterator[tuple[str, Iterator[tuple[object, ...]]]]:
+ if not data.startswith(b"\xd0\xcf\x11\xe0"):
+ yield from _sheets(data, date_columns=(), preserve_types=True)
+ return
+ try:
+ import xlrd
+ except ImportError as error:
+ raise ImportError(
+ "Install tinyercot[files] to read zonal energy workbooks"
+ ) from error
+ with xlrd.open_workbook(file_contents=data) as book:
+ for sheet in book.sheets():
+ rows: list[list[object]] = [
+ list(sheet.row_values(i)) for i in range(sheet.nrows)
+ ]
+ if not rows:
+ continue
+ for j, cell in enumerate(sheet.row(0)):
+ if cell.ctype == xlrd.XL_CELL_DATE:
+ rows[0][j] = xlrd.xldate_as_datetime(
+ float(cell.value), book.datemode
+ )
+ header = _header(tuple(rows[0]))
+ date_name = _date_column(header)
+ if date_name:
+ day = header.index(date_name)
+ _, end = _layout(header)
+ for i, row in enumerate(rows[1:], 1):
+ # Some source energy cells are accidentally date-formatted.
+ # Decode dates only in the operating-date and trailing metadata.
+ for j in [day, *range(end, len(row))]:
+ if sheet.cell_type(i, j) == xlrd.XL_CELL_DATE:
+ row[j] = xlrd.xldate_as_datetime(
+ float(sheet.cell_value(i, j)), book.datemode
+ )
+ yield sheet.name, iter(tuple(row) for row in rows)
+
+
+def _kind(kind: _Kind | None, member: str, source: PublicFile | None) -> _Kind:
+ if kind is not None:
+ return kind
+ label = (member + " " + (source.title if source else "")).lower()
+ if "generation" in label:
+ return "generation"
+ if "load" in label:
+ return "load"
+ raise ValueError("Supply kind='generation' or 'load' for an unnamed zonal workbook")
+
+
+def _header(row: tuple[object, ...]) -> list[str]:
+ return [str(v).strip().upper() for v in row]
+
+
+def _date_column(header: list[str]) -> str | None:
+ return next((h for h in header if h in {"DATE", "TRADE DATE", "START TIME"}), None)
+
+
+def _day(value: object) -> date | None:
+ if value in (None, ""):
+ return None
+ if isinstance(value, datetime):
+ return value.date()
+ return date(*strptime(str(value), "%m/%d/%y")[:3])
+
+
+def _zone(value: object) -> str | None:
+ match = re.match(r"^([A-Z]\d{2})(?:\s|$)", str(value))
+ return match[1] if match else None
+
+
+def _layout(header: list[str]) -> tuple[int, int]:
+ start = next(
+ i for i, h in enumerate(header) if h.startswith(("INTERVAL ", "1899-", "1900-"))
+ )
+ end = header.index("TIMESTAMP") if "TIMESTAMP" in header else len(header)
+ return start, end
+
+
+def _intervals(
+ row: tuple[object, ...],
+ header: tuple[object, ...],
+ start: int,
+ end: int,
+ *,
+ unlabeled: bool = False,
+) -> list[EnergyInterval]:
+ return [
+ EnergyInterval(
+ interval=i,
+ energyMWh=_number(row[j]),
+ sourceLabel=None
+ if unlabeled
+ else str(header[j])
+ if isinstance(header[j], str)
+ else _interval_label(header[j]),
+ )
+ for i, j in enumerate(range(start, end), 1)
+ ]
+
+
+def _source_number(
+ column: int, value: object, header: tuple[object, ...]
+) -> ZonalSourceNumber:
+ return ZonalSourceNumber.model_validate(
+ {
+ "column": column + 1,
+ "value": _number(value),
+ "sourceHeader": str(header[column])
+ if header[column] not in (None, "")
+ else None,
+ }
+ )
+
+
+def _days(
+ rows: list[tuple[object, ...]],
+ header: list[str],
+ kind: _Kind,
+ member: str,
+ sheet: str,
+ source: PublicFile | None,
+) -> Iterator[ZonalEnergyDay]:
+ date_column = header.index(_date_column(header) or "")
+ start, end = _layout(header)
+ zone_column = next(
+ (i for i, h in enumerate(header) if h.replace(" ", "") in {"ZONE", "CMZONE"}),
+ None,
+ )
+ for line, row in enumerate(rows[1:], 2):
+ day = _day(row[date_column])
+ if day is None:
+ continue
+
+ def cell(name: str, values: tuple[object, ...] = row) -> object:
+ return values[header.index(name)] if name in header else None
+
+ numeric_tail = [
+ j for j in range(end, len(row)) if isinstance(row[j], (int, float, Decimal))
+ ]
+ extended = (
+ kind == "load"
+ and len(numeric_tail) == 4
+ and numeric_tail == list(range(end, end + 4))
+ )
+ numbers = (
+ []
+ if extended
+ else [_source_number(j, row[j], rows[0]) for j in numeric_tail]
+ )
+ origin = cell("ORIGIN")
+ if isinstance(origin, (int, float, Decimal)):
+ numbers.insert(0, _source_number(header.index("ORIGIN"), origin, rows[0]))
+ total = next(
+ (row[i] for i, h in enumerate(header) if h in {"TOTAL", "TOTAL MWH"}), None
+ )
+ yield ZonalEnergyDay.model_validate(
+ {
+ "kind": kind,
+ "operatingDay": day,
+ "zone": row[zone_column] if zone_column is not None else sheet,
+ "totalMWh": _number(total),
+ "intervals": _intervals(
+ row,
+ rows[0],
+ start,
+ end + 4 if extended else end,
+ unlabeled=extended,
+ ),
+ "recorder": cell("RECORDER") or cell("CUTNAME"),
+ "channel": cell("CHANNEL"),
+ "origin": origin if isinstance(origin, str) and origin else None,
+ "sourceTimestamp": next(
+ (v for v in row[end:] if isinstance(v, datetime)), None
+ ),
+ "sourceNumbers": numbers,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceRow": line,
+ "sourceFile": source,
+ }
+ )
+
+
+def _totals(
+ rows: list[tuple[object, ...]],
+ kind: _Kind,
+ member: str,
+ sheet: str,
+ source: PublicFile | None,
+) -> Iterator[ZonalEnergyTotal]:
+ first = next(
+ (i for i, row in enumerate(rows) if any(v not in (None, "") for v in row)), None
+ )
+ if first is None:
+ return
+ raw_header = rows[first]
+ header = _header(raw_header)
+ date_name = _date_column(header)
+ summary = date_name is None and len(header) == 3 and "%" in header[2]
+ if not summary and date_name is None:
+ return
+ notes = [
+ str(row[0])
+ for row in rows[first + 1 :]
+ if isinstance(row[0], str) and row[0] and all(v in (None, "") for v in row[1:])
+ ]
+ start, end = (0, 0) if summary else _layout(header)
+ year = re.search(r"\d{4}", member.rsplit("/", 1)[-1])
+ for line, row in enumerate(rows[first + 1 :], first + 2):
+ if not any(isinstance(v, (int, float, Decimal)) for v in row):
+ continue
+ if date_name and _day(row[header.index(date_name)]) is not None:
+ continue
+ column = 1 if summary else start - 1
+ label = next((v for v in row[:column] if isinstance(v, str) and v), None)
+ known_total = summary or header[column] in {"TOTAL", "TOTAL MWH"}
+ yield ZonalEnergyTotal.model_validate(
+ {
+ "kind": kind,
+ "year": int(year[0]) if year else None,
+ "scope": "summary" if summary else "detail_total",
+ "zone": _zone(label) or _zone(sheet),
+ "totalMWh": _number(row[column]) if known_total else None,
+ "share": _number(row[2]) if summary else None,
+ "intervals": _intervals(row, raw_header, start, end)
+ if not summary and any(v not in (None, "") for v in row[start:end])
+ else [],
+ "sourceNumbers": [_source_number(column, row[column], raw_header)]
+ if not known_total and row[column] not in (None, "")
+ else [],
+ "sourceLabel": label,
+ "sourceTotalHeader": str(raw_header[column]),
+ "sourceShareHeader": str(raw_header[2]) if summary else None,
+ "sourceNotes": notes,
+ "sourceMember": member,
+ "sourceSheet": sheet,
+ "sourceRow": line,
+ "sourceFile": source,
+ }
+ )
diff --git a/tinyercot/_zonal_generation.py b/tinyercot/_zonal_generation.py
new file mode 100644
index 00000000..d8806c73
--- /dev/null
+++ b/tinyercot/_zonal_generation.py
@@ -0,0 +1,98 @@
+"""The direct public archive of historical generation scheduled by zone."""
+
+from __future__ import annotations
+
+import csv
+from collections.abc import Iterator
+from datetime import date, datetime, timedelta
+from decimal import Decimal
+from io import StringIO
+
+import httpx
+from pydantic import BaseModel, ConfigDict
+
+URL = "https://www.ercot.com/files/docs/2007/04/23/historical_generation_scheduled_by_zone.zip"
+
+
+class ScheduledGeneration(BaseModel):
+ """A scheduled MW quantity at the source's local CPT period ending.
+
+ Historical zone IDs change between years. The source supplies no zone names
+ or UTC offsets; neither is inferred. These are schedules, not actual output.
+ """
+
+ model_config = ConfigDict(extra="forbid")
+ periodEnding: datetime
+ zoneId: int
+ scheduledMW: Decimal
+ sourceMember: str
+
+ @property
+ def operatingDay(self) -> date:
+ """The date of the 15-minute interval, including period endings at midnight."""
+ return (self.periodEnding - timedelta(minutes=15)).date()
+
+
+class ZonalGeneration:
+ """Anonymous access to the published 2001–2007 snapshot and its yearly ZIPs."""
+
+ def __init__(self, client: httpx.Client) -> None:
+ self._http = client
+
+ def download(self) -> bytes:
+ """Download the original archive, containing seven nested yearly ZIPs."""
+ response = self._http.get(URL, follow_redirects=True)
+ response.raise_for_status()
+ return response.content
+
+ def rows(
+ self, *, date_from: date | None = None, date_to: date | None = None
+ ) -> Iterator[ScheduledGeneration]:
+ """Read schedules with inclusive operating-date bounds; retain source gaps."""
+ if date_from and date_to and date_from > date_to:
+ raise ValueError("date_from must not be after date_to")
+ for row in self.read(self.download()):
+ if (date_from is None or row.operatingDay >= date_from) and (
+ date_to is None or row.operatingDay <= date_to
+ ):
+ yield row
+
+ def read(
+ self, data: bytes, *, filename: str = "download"
+ ) -> Iterator[ScheduledGeneration]:
+ """Read the outer ZIP, a yearly ZIP, or a saved tab-delimited report."""
+ from ._history import _archive_files
+
+ files = (
+ _archive_files(data, "*.txt")
+ if data.startswith(b"PK")
+ else iter([(filename, data)])
+ )
+ found = False
+ for member, content in files:
+ found = True
+ rows = csv.reader(StringIO(content.decode("ascii")), delimiter="\t")
+ if next(rows, None) != ["CPT_PERIODENDING", "ZONEID", "MW"]:
+ raise ValueError(f"{member}: Unsupported scheduled-generation header")
+ for number, cells in enumerate(rows, 2):
+ if not cells:
+ continue
+ if len(cells) != 3:
+ raise ValueError(
+ f"{member}:{number}: Expected three source columns"
+ )
+ try:
+ yield ScheduledGeneration.model_validate(
+ dict(
+ zip(
+ ("periodEnding", "zoneId", "scheduledMW"),
+ cells,
+ strict=True,
+ )
+ )
+ | {"sourceMember": member}
+ )
+ except ValueError as error:
+ raise ValueError(f"{member}:{number}: {error}") from error
+ if not found:
+ raise ValueError("Archive contains no scheduled-generation reports")
diff --git a/tinyercot/_zonal_peaks.py b/tinyercot/_zonal_peaks.py
new file mode 100644
index 00000000..68bba833
--- /dev/null
+++ b/tinyercot/_zonal_peaks.py
@@ -0,0 +1,259 @@
+"""Public seasonal and weekly peak-demand tables by weather zone."""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Callable, Iterator
+from datetime import date, datetime
+from decimal import Decimal
+from time import strptime
+from typing import Literal, TypeVar
+
+from pydantic import BaseModel, ConfigDict
+
+from ._legacy_load import _number
+from ._load import _sheets, _workbooks
+from ._load_forecasts import _ForecastRow, _ForecastTable
+
+_ZONES = {
+ "coast": "coast",
+ "east": "east",
+ "fwest": "farWest",
+ "ncent": "northCentral",
+ "north": "north",
+ "scent": "southCentral",
+ "south": "south",
+ "west": "west",
+}
+
+
+class WeatherZonePeakValues(BaseModel):
+ model_config = ConfigDict(extra="forbid")
+ coast: Decimal | None
+ east: Decimal | None
+ farWest: Decimal | None
+ northCentral: Decimal | None
+ north: Decimal | None
+ southCentral: Decimal | None
+ south: Decimal | None
+ west: Decimal | None
+ total: Decimal | None
+
+
+def _peaks(
+ cells: tuple[object, ...], labels: tuple[object, ...]
+) -> WeatherZonePeakValues:
+ values = {
+ _ZONES[str(label).lower()]: _number(v)
+ for label, v in zip(labels[:8], cells[:8], strict=True)
+ }
+ return WeatherZonePeakValues(**values, total=_number(cells[8]))
+
+
+class _ZonalPeakRow(_ForecastRow):
+ kind: Literal["forecast", "historical"]
+ peaks: WeatherZonePeakValues
+ unit: Literal["MW"] | None
+ percentile: int | None
+ sourcePercentileLabel: str | None
+ sourceTotalLabel: str
+
+
+T = TypeVar("T", bound=_ZonalPeakRow)
+
+
+class _ZonalPeakTable(_ForecastTable[T]):
+ def rows(self, *, where: Callable[[T], bool] | None = None) -> Iterator[T]:
+ for row in super().rows():
+ if (
+ row.kind == "forecast"
+ and row.percentile is None
+ and row.sourceFile
+ and re.search(r"\b(?:90th|P90)\b", row.sourceFile.title, re.IGNORECASE)
+ ):
+ row.percentile = 90
+ row.sourcePercentileLabel = row.sourceFile.title
+ if where is None or where(row):
+ yield row
+
+
+class SeasonalPeakForecast(_ZonalPeakRow):
+ """A forecast or historical section; winter periods retain both years."""
+
+ year: int
+ endYear: int | None
+ season: Literal["summer", "winter"] | None
+ demandBasis: Literal["gross", "net", "rooftop_pv", "unspecified"]
+ coincident: bool | None
+ scenario: Literal["tsp_provided", "ercot_adjusted"] | None
+ sourcePeriod: str
+ sourceTitle: str
+ sourceColumn: int
+ sourceNotes: list[str]
+
+
+class SeasonalPeakForecasts(_ZonalPeakTable[SeasonalPeakForecast]):
+ title_pattern = (
+ r"Weather Zone Non-Coincident Peak Forecast\.?|"
+ r"90th [Pp]ercentile Summer (?:Non-Coincident Peak by Weather Zone|NCP by weather zone)|"
+ r"Summer and Winter Peaks|Winter Peak Loads"
+ )
+
+ def _read(self, data: bytes, filename: str) -> Iterator[SeasonalPeakForecast]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, iterator in _sheets(content, date_columns=()):
+ rows = list(iterator)
+ notes = [
+ v
+ for row in rows
+ for v in row
+ if isinstance(v, str) and v.startswith("This includes ")
+ ]
+ titles: dict[int, str] = {}
+ blocks: list[tuple[int, tuple[object, ...]]] = []
+ historical = False
+ percentile_label: str | None = None
+ for line, cells in enumerate(rows, 1):
+ if cells and str(cells[0]).startswith("This includes "):
+ continue
+ if cells and cells[0] == "Historical":
+ historical, percentile_label, blocks = True, None, []
+ continue
+ if cells and str(cells[0]).lower() == "90th percentile":
+ percentile_label = str(cells[0])
+ continue
+ new_titles = {
+ i: v
+ for i, v in enumerate(cells)
+ if isinstance(v, str)
+ and "peak" in v.lower()
+ and ("forecast" in v.lower() or "(MW)" in v)
+ }
+ if new_titles:
+ titles, blocks = new_titles, []
+ if any("Forecast" in title for title in titles.values()):
+ historical = False
+ continue
+ starts = [
+ i - 1
+ for i in range(1, max(1, len(cells) - 8))
+ if {str(v).lower() for v in cells[i : i + 8]} == set(_ZONES)
+ ]
+ if starts:
+ blocks = [(i, cells[i + 1 : i + 10]) for i in starts]
+ continue
+ for start, labels in blocks:
+ values = cells[start : start + 10]
+ if not any(v not in (None, "") for v in values):
+ continue
+ period = str(values[0]).removesuffix(".0")
+ match = re.fullmatch(r"(\d{4})(?:-(\d{4}))?", period)
+ if match is None or len(values) < 10:
+ raise ValueError(
+ f"{member}/{sheet}:{line}: invalid peak period or values"
+ )
+ title = titles[start]
+ lower = title.lower()
+ basis: Literal["gross", "net", "rooftop_pv", "unspecified"] = (
+ "unspecified"
+ )
+ if "rooftop pv" in lower:
+ basis = "rooftop_pv"
+ elif "gross" in lower:
+ basis = "gross"
+ elif "net" in lower:
+ basis = "net"
+ season: Literal["summer", "winter"] | None = None
+ if "summer" in lower:
+ season = "summer"
+ elif "winter" in lower:
+ season = "winter"
+ scenario: Literal["tsp_provided", "ercot_adjusted"] | None = (
+ None
+ )
+ if "TSP Provided" in title:
+ scenario = "tsp_provided"
+ elif "ERCOT Adjusted" in title:
+ scenario = "ercot_adjusted"
+ probability_label = (
+ title if "90th" in lower else percentile_label
+ )
+ found = True
+ yield SeasonalPeakForecast(
+ year=int(match[1]),
+ endYear=int(match[2]) if match[2] else None,
+ kind="historical" if historical else "forecast",
+ season=season,
+ demandBasis=basis,
+ scenario=scenario,
+ coincident=False
+ if re.search(r"non[ -]coincident", lower)
+ else True
+ if "coincident" in lower
+ else None,
+ peaks=_peaks(values[1:], labels),
+ unit="MW" if "(MW)" in title else None,
+ percentile=90 if probability_label else None,
+ sourcePercentileLabel=probability_label,
+ sourceTotalLabel=str(labels[8]),
+ sourcePeriod=period,
+ sourceTitle=title,
+ sourceColumn=start + 1,
+ sourceNotes=notes,
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=line,
+ )
+ if not found:
+ raise ValueError("No seasonal peak-demand tables found")
+
+
+class WeeklyPeakForecast(_ZonalPeakRow):
+ beginDate: date
+ endDate: date
+ peakDate: date
+ peakHour: int
+
+
+def _day(value: object) -> date:
+ if isinstance(value, datetime):
+ return value.date()
+ return date(*strptime(str(value), "%d%b%Y")[:3])
+
+
+class WeeklyPeakForecasts(_ZonalPeakTable[WeeklyPeakForecast]):
+ title_pattern = r"\d{4} Weekly P90 Peaks"
+
+ def _read(self, data: bytes, filename: str) -> Iterator[WeeklyPeakForecast]:
+ found = False
+ for member, content in _workbooks(data):
+ member = filename if member in {"workbook.xls", "workbook.xlsx"} else member
+ for sheet, rows in _sheets(content, date_columns=()):
+ header = next(rows, ())
+ if header[:4] != ("Begin_Date", "End_Date", "Peak_Date", "Peak_Hour"):
+ raise ValueError(
+ f"{member}/{sheet}: unsupported weekly peak header"
+ )
+ for line, cells in enumerate(rows, 2):
+ if not any(v not in (None, "") for v in cells):
+ continue
+ found = True
+ yield WeeklyPeakForecast(
+ kind="forecast",
+ beginDate=_day(cells[0]),
+ endDate=_day(cells[1]),
+ peakDate=_day(cells[2]),
+ peakHour=int(str(cells[3]).removesuffix(".0")),
+ peaks=_peaks(cells[4:], header[4:]),
+ unit=None,
+ percentile=None,
+ sourcePercentileLabel=None,
+ sourceTotalLabel=str(header[12]),
+ sourceMember=member,
+ sourceSheet=sheet,
+ sourceRow=line,
+ )
+ if not found:
+ raise ValueError("No weekly peak-demand tables found")
diff --git a/tools/generate_client.py b/tools/generate_client.py
index b9e36608..75ec59dc 100644
--- a/tools/generate_client.py
+++ b/tools/generate_client.py
@@ -28,12 +28,19 @@ def name(value: str) -> str:
return "_" + value if value[0].isdigit() or keyword.iskeyword(value) else value
-def generate(*, allow_incomplete: bool = False) -> None:
- operations = json.loads((INPUTS / "operations.json").read_text())
- schemas = json.loads((ROOT / "api_response_fields.json").read_text())
+def generate(*, allow_incomplete: bool = False, esr: bool = False) -> None:
+ inputs = INPUTS / "esr" if esr else INPUTS
+ client_name = "ESRClient" if esr else "Client"
+ output_name = "_generated_esr.py" if esr else "_generated.py"
+ operations = json.loads((inputs / "operations.json").read_text())
+ schema_path = (
+ inputs / "response-fields.json" if esr else ROOT / "api_response_fields.json"
+ )
+ schemas = json.loads(schema_path.read_text())
overrides = json.loads((INPUTS / "type-overrides.json").read_text())
row_fields = json.loads((INPUTS / "row-fields.json").read_text())
defaults = json.loads((INPUTS / "query-defaults.json").read_text())
+ history = json.loads((inputs / "history-formats.json").read_text())
groups = {}
missing = []
for op in operations:
@@ -47,6 +54,12 @@ def generate(*, allow_incomplete: bool = False) -> None:
schemas[path] = {name: schemas[path][name] for name in row_fields[path]}
product, method = path.split("/")
groups.setdefault(product, []).append((method, op, schemas[path]))
+ for path, contract in history.items():
+ if contract.get("archive_only"):
+ product, method = path.split("/")
+ groups.setdefault(product, []).append(
+ (method, {"urlTemplate": "/" + path, "historyOnly": True}, {})
+ )
if missing and not allow_incomplete:
raise ValueError("Missing response schemas for: " + ", ".join(missing))
if missing:
@@ -59,9 +72,12 @@ def generate(*, allow_incomplete: bool = False) -> None:
"from decimal import Decimal",
"from typing import ClassVar",
"from ._client import Transport, Page, Row",
+ "from ._history import Archive, EiaHour",
+ "from ._xlsx import WorkbookArchive",
+ "from ._pdf import PdfArchive, PdfChartArchive",
"",
]
- lines.append(f"__all__ = {['Client', *[name(p) for p in sorted(groups)]]!r}")
+ lines.append(f"__all__ = {[client_name, *[name(p) for p in sorted(groups)]]!r}")
for product, endpoints in sorted(groups.items()):
cls = name(product)
lines += [
@@ -75,22 +91,73 @@ def generate(*, allow_incomplete: bool = False) -> None:
row = name(
"".join(s.capitalize() for s in method.strip("_").split("_")) + "Row"
)
- lines += [f" class {row}(Row):"]
path = op["urlTemplate"].lstrip("/")
- if path in row_fields:
- lines.append(
- f" __source_fields__: ClassVar[tuple[str, ...]] = {tuple(row_fields[path])!r}"
+ if not op.get("historyOnly"):
+ lines += [f" class {row}(Row):"]
+ if path in row_fields:
+ lines.append(
+ f" __source_fields__: ClassVar[tuple[str, ...]] = {tuple(row_fields[path])!r}"
+ )
+ for field, kind in fields.items():
+ if not field.isidentifier() or keyword.iskeyword(field):
+ raise ValueError(f"Unsupported field name: {product}/{field}")
+ # Nullable responses are represented explicitly; absent required fields still fail.
+ field_type = (
+ overrides.get(op["urlTemplate"].lstrip("/"), {})
+ .get(field, {})
+ .get("type", FIELDS[kind])
+ )
+ lines += [f" {field}: {field_type} | None"]
+ if path in history:
+ contract = history[path]
+ archive_row = row
+ reader = "WorkbookArchive" if "sheets" in contract else "Archive"
+ if "pdf" in contract:
+ reader = "PdfArchive"
+ if "charts" in contract:
+ reader = "PdfChartArchive"
+ if "fields" in contract:
+ archive_row = row.removesuffix("Row") + "HistoryRow"
+ lines += ["", f" class {archive_row}(Row):"]
+ layouts = [contract["columns"], *contract.get("variants", [])]
+ for field, field_type in contract["fields"].items():
+ default = (
+ " = None"
+ if any(field not in layout.values() for layout in layouts)
+ else ""
+ )
+ lines.append(f" {field}: {field_type} | None{default}")
+ options = (
+ f"sheets={tuple(contract['sheets'])!r}, variants={tuple(contract.get('variants', []))!r}"
+ if "sheets" in contract
+ else f"member={contract.get('member', '*.csv')!r}, datetimes={contract.get('datetimes')!r}, variants={tuple(contract.get('variants', []))!r}"
)
- for field, kind in fields.items():
- if not field.isidentifier() or keyword.iskeyword(field):
- raise ValueError(f"Unsupported field name: {product}/{field}")
- # Nullable responses are represented explicitly; absent required fields still fail.
- field_type = (
- overrides.get(op["urlTemplate"].lstrip("/"), {})
- .get(field, {})
- .get("type", FIELDS[kind])
- )
- lines += [f" {field}: {field_type} | None"]
+ if "document" in contract:
+ options += f", document={contract['document']!r}"
+ if "pdf" in contract:
+ options = ", ".join(
+ f"{key}={value!r}" for key, value in contract["pdf"].items()
+ )
+ numbers = tuple(
+ field
+ for field, kind in contract["fields"].items()
+ if kind in {"Decimal", "int"}
+ )
+ options += f", numbers={numbers!r}, datetimes={contract.get('datetimes', {})!r}"
+ if "charts" in contract:
+ charts = {
+ field: tuple(spec) for field, spec in contract["charts"].items()
+ }
+ options = f"charts={charts!r}"
+ lines += [
+ "",
+ " @property",
+ f" def {method}_history(self) -> {reader}[{cls}.{archive_row}]:",
+ ' """Historical report rows, including files predating the API."""',
+ f" return {reader}(self._client, {product!r}, {cls}.{archive_row}, {contract['columns']!r}, {contract['dates']!r}, {options})",
+ ]
+ if op.get("historyOnly"):
+ continue
params = (op.get("request") or {}).get("queryParameters", [])
for mode, prefix, result, helper in [
("", "def", f"Page[{cls}.{row}]", "_page"),
@@ -119,9 +186,14 @@ def generate(*, allow_incomplete: bool = False) -> None:
]
lines.append("")
lines += [
- "class Client(Transport):",
+ f"class {client_name}(Transport):",
' """ERCOT public data, with generated typed product methods."""',
]
+ if esr:
+ lines += [
+ ' _base_url = "https://api.ercot.com/api/public-data"',
+ ' _subscription_key_env = "ERCOT_ESR_SUBSCRIPTION_KEY"',
+ ]
for product in sorted(groups):
cls = name(product)
lines += [
@@ -130,9 +202,9 @@ def generate(*, allow_incomplete: bool = False) -> None:
f" def {cls}(self) -> {cls}:",
f" return {cls}(self)",
]
- (ROOT / "tinyercot" / "_generated.py").write_text("\n".join(lines) + "\n")
+ (ROOT / "tinyercot" / output_name).write_text("\n".join(lines) + "\n")
print(
- f"Generated {sum(map(len, groups.values()))} endpoints in {len(groups)} products"
+ f"Generated {sum(not op.get('historyOnly', False) for entries in groups.values() for _, op, _ in entries)} API endpoints in {len(groups)} product namespaces"
)
@@ -143,4 +215,6 @@ def generate(*, allow_incomplete: bool = False) -> None:
action="store_true",
help="Generate available contracts during discovery; never a completeness claim",
)
- generate(allow_incomplete=parser.parse_args().allow_incomplete)
+ args = parser.parse_args()
+ generate(allow_incomplete=args.allow_incomplete)
+ generate(allow_incomplete=args.allow_incomplete, esr=True)
diff --git a/tools/inputs/README.md b/tools/inputs/README.md
index ca21ceb8..1dc4549c 100644
--- a/tools/inputs/README.md
+++ b/tools/inputs/README.md
@@ -5,8 +5,18 @@ client offline, without ERCOT credentials or a separately initialized submodule.
- `operations.json` and the root `api_response_fields.json` describe the API used
by the generator. Overrides and field mappings record deliberate corrections.
+- `esr/` contains the separate ESR operation/response contracts, archive mapping,
+ original nested ZIPs, API captures and the live verification receipt. It feeds
+ the same generator and ESR routing/history regression tests.
+- `forecast-performance/` contains six metric-workbook regression samples and
+ source/verification manifests for all 48 complete-file comparisons. Original
+ error cells and source row coordinates are retained.
+- `monthly-performance/` keeps all 15 original monthly forecast/backcast
+ workbooks, their source hashes and complete-table comparison results.
- `samples/` contains captured report responses, exercised against every generated
endpoint's typed row model and mocked HTTP retrieval.
+- `market-displays/` keeps complete anonymous dated price/load HTML responses,
+ including DST transitions and unavailable-market responses, with source hashes.
- `dashboards/` and catalog/archive/bundle samples exercise public dashboard and
metadata models, pagination and download requests.
- On the history branch, `history-formats.json` supplies generated reader mappings;
@@ -21,4 +31,5 @@ Captured responses and generated Python are marked in `.gitattributes` so GitHub
collapses their diffs by default. Hand-maintained mappings, overrides and evidence
remain visible. Preserve original source bytes for binary fixtures; add examples
when a new layout or behavior needs a regression test, rather than refreshing
-snapshots on every live check. Do not store credentials or private responses here.
+snapshots on every live check. Keep fixtures for supported market and operational
+readers alongside their tests. Do not store credentials or private responses here.
diff --git a/tools/inputs/coincident-peaks/daily-2017.xlsx b/tools/inputs/coincident-peaks/daily-2017.xlsx
new file mode 100644
index 00000000..d53b08b1
Binary files /dev/null and b/tools/inputs/coincident-peaks/daily-2017.xlsx differ
diff --git a/tools/inputs/dashboards/ancillary-service-capacity-monitor.json b/tools/inputs/dashboards/ancillary-service-capacity-monitor.json
new file mode 100644
index 00000000..17612bc8
--- /dev/null
+++ b/tools/inputs/dashboards/ancillary-service-capacity-monitor.json
@@ -0,0 +1,320 @@
+{
+ "lastUpdated": "2026-09-08 00:31:14-0500",
+ "epoch": "1788845474",
+ "interval": "00:31:14",
+ "dstFlag": "N",
+ "data": {
+ "responsiveReserveCapabilityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "rrcCapPfrGenEsr",
+ 1376
+ ],
+ [
+ "rrcCapLrWoClr",
+ 1048
+ ],
+ [
+ "rrcCapLr",
+ 0
+ ],
+ [
+ "rrcCapFfr",
+ 0
+ ],
+ [
+ "rrcCapFfrEsr",
+ 0
+ ]
+ ],
+ "responsiveReserveAwardsGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "rrAwdGen",
+ 1377
+ ],
+ [
+ "rrAwdNonClr",
+ 1049
+ ],
+ [
+ "rrAwdClr",
+ 0
+ ],
+ [
+ "rrAwdFfr",
+ 0
+ ]
+ ],
+ "ercotContingencyReserveCapabilityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "ecrsCapGen",
+ 275
+ ],
+ [
+ "ecrsCapNclr",
+ 251
+ ],
+ [
+ "ecrsCapClr",
+ 54
+ ],
+ [
+ "ecrsCapQs",
+ 221
+ ],
+ [
+ "ecrsCapEsr",
+ 348
+ ],
+ [
+ "ecrsCapDeployedGenLr",
+ 0
+ ]
+ ],
+ "ercotContingencyReserveAwardsGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "ecrsAwdGen",
+ 276
+ ],
+ [
+ "ecrsAwdNonClr",
+ 251
+ ],
+ [
+ "ecrsAwdClr",
+ 54
+ ],
+ [
+ "ecrsAwdQs",
+ 221
+ ],
+ [
+ "ecrsAwdEsr",
+ 348
+ ]
+ ],
+ "nonSpinReserveCapabilityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "nsrCapOnGenWoEo",
+ 1970
+ ],
+ [
+ "nsrCapOffResWOs",
+ 0
+ ],
+ [
+ "nsrCapUndeployedLr",
+ 26
+ ],
+ [
+ "nsrCapOffGen",
+ 3052
+ ],
+ [
+ "nsrCapEsr",
+ 517
+ ]
+ ],
+ "nonSpinReserveAwardsGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "nsrAwdGenWEo",
+ 2050
+ ],
+ [
+ "nsrAwdGenWOs",
+ 0
+ ],
+ [
+ "nsrAwdLr",
+ 32
+ ],
+ [
+ "nsrAwdOffGen",
+ 3052
+ ],
+ [
+ "nsrAwdQs",
+ 745
+ ],
+ [
+ "nsrAwdAs",
+ 518
+ ]
+ ],
+ "regulationCapacityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "regUpCap",
+ 334
+ ],
+ [
+ "regDownCap",
+ 367
+ ],
+ [
+ "regUpUndeployed",
+ 299
+ ],
+ [
+ "regDownUndeployed",
+ 372
+ ],
+ [
+ "regUpDeployed",
+ 35
+ ],
+ [
+ "regDownDeployed",
+ 0
+ ]
+ ],
+ "regulationAwardsGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "regUpAwd",
+ 334
+ ],
+ [
+ "regDownAwd",
+ 392
+ ]
+ ],
+ "systemAvailableCapacityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "capClrDecreaseBp",
+ -6
+ ],
+ [
+ "capClrIncreaseBp",
+ 202
+ ],
+ [
+ "capWEoIncreaseBp",
+ 5542
+ ],
+ [
+ "capWEoDecreaseBp",
+ -36905
+ ],
+ [
+ "capWoEoIncreaseBp",
+ 45
+ ],
+ [
+ "capWoEoDecreaseBp",
+ -3516
+ ],
+ [
+ "esrCapWEoIncreaseBp",
+ 12339
+ ],
+ [
+ "esrCapWEoDecreaseBp",
+ -16535
+ ],
+ [
+ "esrCapWoEoIncreaseBp",
+ 0
+ ],
+ [
+ "esrCapWoEoDecreaseBp",
+ 0
+ ],
+ [
+ "capIncreaseGenBp",
+ 14756
+ ],
+ [
+ "capDecreaseGenBp",
+ -39251
+ ],
+ [
+ "sumCapResRegUpRrs",
+ 15896
+ ],
+ [
+ "sumCapResRegUpRrsEcrs",
+ 18282
+ ],
+ [
+ "sumCapResRegUpRrsEcrsNsr",
+ 19107
+ ]
+ ],
+ "ercotWidePhysicalResponsiveCapabilityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "prc",
+ 7924
+ ]
+ ],
+ "realTimeOperatingReserveDemandCurveCapacityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "rtReserveOnline",
+ 0
+ ],
+ [
+ "rtReserveOnOffline",
+ 0
+ ]
+ ],
+ "emrOutAndOutLCapacityGroup": [
+ [
+ "key",
+ "value"
+ ],
+ [
+ "telemHslEmr",
+ 799
+ ],
+ [
+ "telemHslOut",
+ 6035
+ ],
+ [
+ "telemHslOutl",
+ 2136
+ ]
+ ]
+ }
+}
diff --git a/tools/inputs/dashboards/capacity-available-sced.json b/tools/inputs/dashboards/capacity-available-sced.json
new file mode 100644
index 00000000..830fbcab
--- /dev/null
+++ b/tools/inputs/dashboards/capacity-available-sced.json
@@ -0,0 +1,41 @@
+{
+ "lastUpdated": "2026-09-08 00:30:46-0500",
+ "current": {
+ "data": [
+ {
+ "timestamp": "2026-09-08 00:00:06-0500",
+ "epoch": 1788843606,
+ "dstFlag": "N",
+ "increaseGenResESRs": 17992,
+ "decreaseGenResESRs": -57669
+ },
+ {
+ "timestamp": "2026-09-08 00:30:46-0500",
+ "epoch": 1788845446,
+ "dstFlag": "N",
+ "increaseGenResESRs": 18143,
+ "decreaseGenResESRs": -56962
+ }
+ ],
+ "timestamp": "2026-09-08 00:00:00-0500"
+ },
+ "previous": {
+ "data": [
+ {
+ "timestamp": "2026-09-07 00:00:06-0500",
+ "epoch": 1788757206,
+ "dstFlag": "N",
+ "increaseGenResESRs": 19723,
+ "decreaseGenResESRs": -53909
+ },
+ {
+ "timestamp": "2026-09-07 23:59:54-0500",
+ "epoch": 1788843594,
+ "dstFlag": "N",
+ "increaseGenResESRs": 17989,
+ "decreaseGenResESRs": -57680
+ }
+ ],
+ "timestamp": "2026-09-07 00:00:00-0500"
+ }
+}
diff --git a/tools/inputs/dashboards/combine-wind-solar-before-day-ahead.json b/tools/inputs/dashboards/combine-wind-solar-before-day-ahead.json
new file mode 100644
index 00000000..04144db9
--- /dev/null
+++ b/tools/inputs/dashboards/combine-wind-solar-before-day-ahead.json
@@ -0,0 +1 @@
+{"lastUpdated":"2026-09-08 12:55:10-0500","currentDay":{"date":"2026-09-08 03:00:00-0500","data":{"1788847200000":{"hourEnding":1,"dstFlag":"N","actualWind":18107,"copHslWind":17321,"stwpf":18992,"wgrpp":17538,"copHslWindDayAhead":16848,"stwpfDayAhead":17568,"wgrppDayAhead":14510,"timestamp":"2026-09-08 01:00:00-0500","epoch":1788847200000,"actualSolar":1,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788850800000":{"hourEnding":2,"dstFlag":"N","actualWind":17002,"copHslWind":16898,"stwpf":17846,"wgrpp":16572,"copHslWindDayAhead":16075,"stwpfDayAhead":16785,"wgrppDayAhead":13577,"timestamp":"2026-09-08 02:00:00-0500","epoch":1788850800000,"actualSolar":1,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788854400000":{"hourEnding":3,"dstFlag":"N","actualWind":15615,"copHslWind":16012,"stwpf":16504,"wgrpp":15406,"copHslWindDayAhead":15162,"stwpfDayAhead":15855,"wgrppDayAhead":12726,"timestamp":"2026-09-08 03:00:00-0500","epoch":1788854400000,"actualSolar":1,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788858000000":{"hourEnding":4,"dstFlag":"N","actualWind":14308,"copHslWind":14926,"stwpf":15333,"wgrpp":14293,"copHslWindDayAhead":14126,"stwpfDayAhead":14819,"wgrppDayAhead":11837,"timestamp":"2026-09-08 04:00:00-0500","epoch":1788858000000,"actualSolar":1,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788861600000":{"hourEnding":5,"dstFlag":"N","actualWind":13088,"copHslWind":13749,"stwpf":13867,"wgrpp":12775,"copHslWindDayAhead":13039,"stwpfDayAhead":13696,"wgrppDayAhead":10992,"timestamp":"2026-09-08 05:00:00-0500","epoch":1788861600000,"actualSolar":1,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788865200000":{"hourEnding":6,"dstFlag":"N","actualWind":12331,"copHslWind":12779,"stwpf":12962,"wgrpp":12081,"copHslWindDayAhead":11960,"stwpfDayAhead":12567,"wgrppDayAhead":10004,"timestamp":"2026-09-08 06:00:00-0500","epoch":1788865200000,"actualSolar":1,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788868800000":{"hourEnding":7,"dstFlag":"N","actualWind":12226,"copHslWind":12034,"stwpf":12422,"wgrpp":11514,"copHslWindDayAhead":11083,"stwpfDayAhead":11680,"wgrppDayAhead":9379,"timestamp":"2026-09-08 07:00:00-0500","epoch":1788868800000,"actualSolar":1,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788872400000":{"hourEnding":8,"dstFlag":"N","actualWind":11587,"copHslWind":10693,"stwpf":12046,"wgrpp":11131,"copHslWindDayAhead":9996,"stwpfDayAhead":10516,"wgrppDayAhead":8162,"timestamp":"2026-09-08 08:00:00-0500","epoch":1788872400000,"actualSolar":1710,"copHslSolar":1359,"stppf":1478,"pvgrpp":1669,"copHslSolarDayAhead":1184,"stppfDayAhead":1244,"pvgrppDayAhead":1087},"1788876000000":{"hourEnding":9,"dstFlag":"N","actualWind":8529,"copHslWind":9215,"stwpf":10419,"wgrpp":9548,"copHslWindDayAhead":8333,"stwpfDayAhead":8751,"wgrppDayAhead":6579,"timestamp":"2026-09-08 09:00:00-0500","epoch":1788876000000,"actualSolar":16842,"copHslSolar":14649,"stppf":16087,"pvgrpp":16818,"copHslSolarDayAhead":14361,"stppfDayAhead":14611,"pvgrppDayAhead":10822},"1788879600000":{"hourEnding":10,"dstFlag":"N","actualWind":7486,"copHslWind":8944,"stwpf":7534,"wgrpp":6691,"copHslWindDayAhead":7450,"stwpfDayAhead":7852,"wgrppDayAhead":5873,"timestamp":"2026-09-08 10:00:00-0500","epoch":1788879600000,"actualSolar":29294,"copHslSolar":27229,"stppf":31395,"pvgrpp":30711,"copHslSolarDayAhead":27861,"stppfDayAhead":28276,"pvgrppDayAhead":21657},"1788883200000":{"hourEnding":11,"dstFlag":"N","actualWind":7606,"copHslWind":7864,"stwpf":7673,"wgrpp":7215,"copHslWindDayAhead":6832,"stwpfDayAhead":7262,"wgrppDayAhead":4788,"timestamp":"2026-09-08 11:00:00-0500","epoch":1788883200000,"actualSolar":31635,"copHslSolar":31186,"stppf":32282,"pvgrpp":31451,"copHslSolarDayAhead":31586,"stppfDayAhead":32041,"pvgrppDayAhead":25413},"1788886800000":{"hourEnding":12,"dstFlag":"N","actualWind":7425,"copHslWind":6431,"stwpf":7785,"wgrpp":7291,"copHslWindDayAhead":6294,"stwpfDayAhead":6683,"wgrppDayAhead":4225,"timestamp":"2026-09-08 12:00:00-0500","epoch":1788886800000,"actualSolar":31698,"copHslSolar":32182,"stppf":31475,"pvgrpp":30143,"copHslSolarDayAhead":32541,"stppfDayAhead":32991,"pvgrppDayAhead":25995},"1788890400000":{"hourEnding":13,"dstFlag":"N","actualWind":null,"copHslWind":6648,"stwpf":7727,"wgrpp":7051,"copHslWindDayAhead":6364,"stwpfDayAhead":6755,"wgrppDayAhead":4542,"timestamp":"2026-09-08 13:00:00-0500","epoch":1788890400000,"actualSolar":null,"copHslSolar":31444,"stppf":30266,"pvgrpp":28689,"copHslSolarDayAhead":32408,"stppfDayAhead":32852,"pvgrppDayAhead":26450},"1788894000000":{"hourEnding":14,"dstFlag":"N","actualWind":null,"copHslWind":7380,"stwpf":7885,"wgrpp":6759,"copHslWindDayAhead":7137,"stwpfDayAhead":7543,"wgrppDayAhead":5230,"timestamp":"2026-09-08 14:00:00-0500","epoch":1788894000000,"actualSolar":null,"copHslSolar":29480,"stppf":29818,"pvgrpp":26773,"copHslSolarDayAhead":31502,"stppfDayAhead":31946,"pvgrppDayAhead":25575},"1788897600000":{"hourEnding":15,"dstFlag":"N","actualWind":null,"copHslWind":8225,"stwpf":8639,"wgrpp":7353,"copHslWindDayAhead":8053,"stwpfDayAhead":8456,"wgrppDayAhead":6250,"timestamp":"2026-09-08 15:00:00-0500","epoch":1788897600000,"actualSolar":null,"copHslSolar":28464,"stppf":28773,"pvgrpp":23040,"copHslSolarDayAhead":30646,"stppfDayAhead":31032,"pvgrppDayAhead":24154},"1788901200000":{"hourEnding":16,"dstFlag":"N","actualWind":null,"copHslWind":9080,"stwpf":9469,"wgrpp":7908,"copHslWindDayAhead":8979,"stwpfDayAhead":9377,"wgrppDayAhead":7208,"timestamp":"2026-09-08 16:00:00-0500","epoch":1788901200000,"actualSolar":null,"copHslSolar":26617,"stppf":26954,"pvgrpp":20614,"copHslSolarDayAhead":29205,"stppfDayAhead":29646,"pvgrppDayAhead":21886},"1788904800000":{"hourEnding":17,"dstFlag":"N","actualWind":null,"copHslWind":10094,"stwpf":10454,"wgrpp":8778,"copHslWindDayAhead":10143,"stwpfDayAhead":10493,"wgrppDayAhead":8402,"timestamp":"2026-09-08 17:00:00-0500","epoch":1788904800000,"actualSolar":null,"copHslSolar":24661,"stppf":25006,"pvgrpp":17507,"copHslSolarDayAhead":27116,"stppfDayAhead":27546,"pvgrppDayAhead":18470},"1788908400000":{"hourEnding":18,"dstFlag":"N","actualWind":null,"copHslWind":11274,"stwpf":11653,"wgrpp":10001,"copHslWindDayAhead":11330,"stwpfDayAhead":11714,"wgrppDayAhead":9775,"timestamp":"2026-09-08 18:00:00-0500","epoch":1788908400000,"actualSolar":null,"copHslSolar":21252,"stppf":21740,"pvgrpp":14298,"copHslSolarDayAhead":23421,"stppfDayAhead":24009,"pvgrppDayAhead":14472},"1788912000000":{"hourEnding":19,"dstFlag":"N","actualWind":null,"copHslWind":12844,"stwpf":13247,"wgrpp":11146,"copHslWindDayAhead":12682,"stwpfDayAhead":13064,"wgrppDayAhead":11162,"timestamp":"2026-09-08 19:00:00-0500","epoch":1788912000000,"actualSolar":null,"copHslSolar":12341,"stppf":12908,"pvgrpp":7473,"copHslSolarDayAhead":13526,"stppfDayAhead":14107,"pvgrppDayAhead":6917},"1788915600000":{"hourEnding":20,"dstFlag":"N","actualWind":null,"copHslWind":13885,"stwpf":14300,"wgrpp":11779,"copHslWindDayAhead":13772,"stwpfDayAhead":14178,"wgrppDayAhead":12137,"timestamp":"2026-09-08 20:00:00-0500","epoch":1788915600000,"actualSolar":null,"copHslSolar":1870,"stppf":1985,"pvgrpp":694,"copHslSolarDayAhead":2021,"stppfDayAhead":2153,"pvgrppDayAhead":655},"1788919200000":{"hourEnding":21,"dstFlag":"N","actualWind":null,"copHslWind":15236,"stwpf":15694,"wgrpp":13073,"copHslWindDayAhead":14916,"stwpfDayAhead":15352,"wgrppDayAhead":13177,"timestamp":"2026-09-08 21:00:00-0500","epoch":1788919200000,"actualSolar":null,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":1,"stppfDayAhead":11,"pvgrppDayAhead":0},"1788922800000":{"hourEnding":22,"dstFlag":"N","actualWind":null,"copHslWind":16531,"stwpf":17021,"wgrpp":14228,"copHslWindDayAhead":16311,"stwpfDayAhead":16788,"wgrppDayAhead":14234,"timestamp":"2026-09-08 22:00:00-0500","epoch":1788922800000,"actualSolar":null,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788926400000":{"hourEnding":23,"dstFlag":"N","actualWind":null,"copHslWind":17274,"stwpf":17778,"wgrpp":14659,"copHslWindDayAhead":16810,"stwpfDayAhead":17299,"wgrppDayAhead":14197,"timestamp":"2026-09-08 23:00:00-0500","epoch":1788926400000,"actualSolar":null,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0},"1788930000000":{"hourEnding":24,"dstFlag":"N","actualWind":null,"copHslWind":17634,"stwpf":18136,"wgrpp":14715,"copHslWindDayAhead":17004,"stwpfDayAhead":17492,"wgrppDayAhead":14126,"timestamp":"2026-09-09 00:00:00-0500","epoch":1788930000000,"actualSolar":null,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":0,"stppfDayAhead":0,"pvgrppDayAhead":0}}},"nextDay":{"date":"2026-09-09 03:00:00-0500","data":{"1788933600000":{"hourEnding":1,"dstFlag":"N","actualWind":null,"copHslWind":16906,"stwpf":17532,"wgrpp":17532,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 01:00:00-0500","epoch":1788933600000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788937200000":{"hourEnding":2,"dstFlag":"N","actualWind":null,"copHslWind":16443,"stwpf":17099,"wgrpp":17099,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 02:00:00-0500","epoch":1788937200000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788940800000":{"hourEnding":3,"dstFlag":"N","actualWind":null,"copHslWind":15567,"stwpf":16187,"wgrpp":16187,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 03:00:00-0500","epoch":1788940800000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788944400000":{"hourEnding":4,"dstFlag":"N","actualWind":null,"copHslWind":14608,"stwpf":15253,"wgrpp":15253,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 04:00:00-0500","epoch":1788944400000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788948000000":{"hourEnding":5,"dstFlag":"N","actualWind":null,"copHslWind":13498,"stwpf":14112,"wgrpp":14112,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 05:00:00-0500","epoch":1788948000000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788951600000":{"hourEnding":6,"dstFlag":"N","actualWind":null,"copHslWind":12196,"stwpf":12775,"wgrpp":12775,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 06:00:00-0500","epoch":1788951600000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788955200000":{"hourEnding":7,"dstFlag":"N","actualWind":null,"copHslWind":10783,"stwpf":11345,"wgrpp":11345,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 07:00:00-0500","epoch":1788955200000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788958800000":{"hourEnding":8,"dstFlag":"N","actualWind":null,"copHslWind":9374,"stwpf":9833,"wgrpp":9833,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 08:00:00-0500","epoch":1788958800000,"copHslSolar":1411,"stppf":1490,"pvgrpp":1098,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788962400000":{"hourEnding":9,"dstFlag":"N","actualWind":null,"copHslWind":7233,"stwpf":7616,"wgrpp":7616,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 09:00:00-0500","epoch":1788962400000,"copHslSolar":14238,"stppf":14580,"pvgrpp":11180,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788966000000":{"hourEnding":10,"dstFlag":"N","actualWind":null,"copHslWind":5648,"stwpf":5945,"wgrpp":5945,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 10:00:00-0500","epoch":1788966000000,"copHslSolar":27205,"stppf":27800,"pvgrpp":22710,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788969600000":{"hourEnding":11,"dstFlag":"N","actualWind":null,"copHslWind":4806,"stwpf":5062,"wgrpp":5062,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 11:00:00-0500","epoch":1788969600000,"copHslSolar":30969,"stppf":31606,"pvgrpp":26075,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788973200000":{"hourEnding":12,"dstFlag":"N","actualWind":null,"copHslWind":3432,"stwpf":3658,"wgrpp":3658,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 12:00:00-0500","epoch":1788973200000,"copHslSolar":31838,"stppf":32507,"pvgrpp":26331,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788976800000":{"hourEnding":13,"dstFlag":"N","actualWind":null,"copHslWind":2492,"stwpf":2650,"wgrpp":2650,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 13:00:00-0500","epoch":1788976800000,"copHslSolar":31492,"stppf":32123,"pvgrpp":26106,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788980400000":{"hourEnding":14,"dstFlag":"N","actualWind":null,"copHslWind":3583,"stwpf":3773,"wgrpp":2615,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 14:00:00-0500","epoch":1788980400000,"copHslSolar":29325,"stppf":29912,"pvgrpp":24068,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788984000000":{"hourEnding":15,"dstFlag":"N","actualWind":null,"copHslWind":4109,"stwpf":4298,"wgrpp":3100,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 15:00:00-0500","epoch":1788984000000,"copHslSolar":28058,"stppf":28605,"pvgrpp":22805,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788987600000":{"hourEnding":16,"dstFlag":"N","actualWind":null,"copHslWind":4875,"stwpf":5059,"wgrpp":3789,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 16:00:00-0500","epoch":1788987600000,"copHslSolar":26703,"stppf":27273,"pvgrpp":21029,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788991200000":{"hourEnding":17,"dstFlag":"N","actualWind":null,"copHslWind":5997,"stwpf":6161,"wgrpp":4767,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 17:00:00-0500","epoch":1788991200000,"copHslSolar":24767,"stppf":25329,"pvgrpp":18106,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788994800000":{"hourEnding":18,"dstFlag":"N","actualWind":null,"copHslWind":7197,"stwpf":7386,"wgrpp":5827,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 18:00:00-0500","epoch":1788994800000,"copHslSolar":20751,"stppf":21349,"pvgrpp":14020,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1788998400000":{"hourEnding":19,"dstFlag":"N","actualWind":null,"copHslWind":8715,"stwpf":8959,"wgrpp":7268,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 19:00:00-0500","epoch":1788998400000,"copHslSolar":11201,"stppf":11785,"pvgrpp":6316,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1789002000000":{"hourEnding":20,"dstFlag":"N","actualWind":null,"copHslWind":10331,"stwpf":10595,"wgrpp":8828,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 20:00:00-0500","epoch":1789002000000,"copHslSolar":1505,"stppf":1618,"pvgrpp":486,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1789005600000":{"hourEnding":21,"dstFlag":"N","actualWind":null,"copHslWind":11793,"stwpf":12081,"wgrpp":10264,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 21:00:00-0500","epoch":1789005600000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1789009200000":{"hourEnding":22,"dstFlag":"N","actualWind":null,"copHslWind":13203,"stwpf":13531,"wgrpp":11650,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 22:00:00-0500","epoch":1789009200000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1789012800000":{"hourEnding":23,"dstFlag":"N","actualWind":null,"copHslWind":13949,"stwpf":14309,"wgrpp":12365,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-09 23:00:00-0500","epoch":1789012800000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null},"1789016400000":{"hourEnding":24,"dstFlag":"N","actualWind":null,"copHslWind":14155,"stwpf":14528,"wgrpp":12532,"copHslWindDayAhead":null,"stwpfDayAhead":null,"wgrppDayAhead":null,"timestamp":"2026-09-10 00:00:00-0500","epoch":1789016400000,"copHslSolar":0,"stppf":0,"pvgrpp":0,"copHslSolarDayAhead":null,"stppfDayAhead":null,"pvgrppDayAhead":null}}}}
\ No newline at end of file
diff --git a/tools/inputs/dashboards/current_np6788-missing-change.zip b/tools/inputs/dashboards/current_np6788-missing-change.zip
new file mode 100644
index 00000000..87d753d4
Binary files /dev/null and b/tools/inputs/dashboards/current_np6788-missing-change.zip differ
diff --git a/tools/inputs/dashboards/current_np6788.html b/tools/inputs/dashboards/current_np6788.html
new file mode 100644
index 00000000..f4a94b60
--- /dev/null
+++ b/tools/inputs/dashboards/current_np6788.html
@@ -0,0 +1,51 @@
+
+
+
+
Last Updated: Sep 08, 2026 00:50:15
+
LMP values do not include the Real-Time price adders.
+
+
+
+
+
+
+ Price Adders
+ RTRDPA: $0.71
+
+
+
+
+
+
+
+
+
+
+
+
+ 7RNCHSLR_ALL
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ A4_DGR1_RN
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+
diff --git a/tools/inputs/dashboards/demand-availability-evidence.json b/tools/inputs/dashboards/demand-availability-evidence.json
new file mode 100644
index 00000000..2860198d
--- /dev/null
+++ b/tools/inputs/dashboards/demand-availability-evidence.json
@@ -0,0 +1,33 @@
+{
+ "checked": "2026-09-08",
+ "url": "https://www.ercot.com/api/1/services/read/dashboards/system-wide-demand.json",
+ "fixture": "system-wide-demand-before-day-ahead.json",
+ "sha256": "81d8de96f0e12263b4eeecda6bfb304cb2dfdb3a8833a13cd30e89cd44a4f996",
+ "nextDayRowsWithAbsentDayAheadForecastAndHsl": 24,
+ "currentDayFirstSystemLoad": "66748.26",
+ "graphicsComparisons": [
+ {
+ "html": "loadForecastVsActualCurrentDay.html",
+ "sourceSha256": "82db245e8c6493df08b7b50018e59968f9382289f062c4eabd8c6f6096699d03",
+ "chartPoints": 97,
+ "matchingRoundedJsonValues": 97,
+ "differences": []
+ },
+ {
+ "html": "loadForecastVsActualPreviousDay.html",
+ "sourceSha256": "e36b5f4b2f0c3f6ad3bbbc7d0a6fc4e6ab5a23d9215833d974cff2ce31b04f33",
+ "chartPoints": 120,
+ "matchingRoundedJsonValues": 120,
+ "differences": []
+ }
+ ],
+ "roundingComparison": "Whole MW, ties to even. SDK retains full source decimal precision. No graphic pixels were decoded.",
+ "limits": "Two graphics snapshots and one pre-publication JSON response; not a guarantee about all historical schemas or issuance times.",
+ "combinedWindSolar": {
+ "url": "https://www.ercot.com/api/1/services/read/dashboards/combine-wind-solar.json",
+ "fixture": "combine-wind-solar-before-day-ahead.json",
+ "sha256": "f583b1d9b180a41114b33afdf91bd3a090af0afa2f77700d01b6bd872acd2ca5",
+ "nextDayRows": 24,
+ "nullDayAheadValues": 144
+ }
+}
diff --git a/tools/inputs/dashboards/hb_lz.html b/tools/inputs/dashboards/hb_lz.html
new file mode 100644
index 00000000..03bd66af
--- /dev/null
+++ b/tools/inputs/dashboards/hb_lz.html
@@ -0,0 +1,195 @@
+
+
+
+
Last Updated: Sep 08, 2026 00:50:15
+
LMP values do not include the Real-Time price adders.
+
+
+
+
+
+
+ Price Adders
+ RTRDPA: $0.71
+
+
+
+
+
+
+
+
+
+
+
+
+ HB_BUSAVG
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ HB_HOUSTON
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ HB_HUBAVG
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ HB_NORTH
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ HB_PAN
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ HB_SOUTH
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ HB_WEST
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_AEN
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_CPS
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_HOUSTON
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_LCRA
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_NORTH
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_RAYBN
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_SOUTH
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+ LZ_WEST
+
+ 32.17
+
+ 0.48
+
+ 32.88
+
+ -0.01
+
+
+
+
diff --git a/tools/inputs/dashboards/lmp-missing-change-evidence.json b/tools/inputs/dashboards/lmp-missing-change-evidence.json
new file mode 100644
index 00000000..0ad37015
--- /dev/null
+++ b/tools/inputs/dashboards/lmp-missing-change-evidence.json
@@ -0,0 +1,17 @@
+{
+ "checked": "2026-09-08",
+ "url": "https://www.ercot.com/content/cdr/html/current_np6788.html",
+ "fixture": "current_np6788-missing-change.zip",
+ "uncompressedSha256": "aca9219e42baae545cbc5cf1819c8aae7000fb1c3754a88b742c99c7094d9ad8",
+ "compressedSha256": "4eb483a91d985448ad5ae5bec3e8914e9de6316aeac7cd44a2513be41b3e9fd1",
+ "originalBytes": 383603,
+ "compressedBytes": 21762,
+ "settlementPoints": 1123,
+ "unavailableLmpChanges": [
+ "APPALOSA_ALL",
+ "HB_NORTH",
+ "MIDP_SLR_RN"
+ ],
+ "allSourceFieldsCompared": true,
+ "limits": "One complete live snapshot. Only the observed LMP change marker is normalized; unsupported price text remains an error."
+}
diff --git a/tools/inputs/dashboards/real-time-system-conditions.html b/tools/inputs/dashboards/real-time-system-conditions.html
new file mode 100644
index 00000000..e246363c
--- /dev/null
+++ b/tools/inputs/dashboards/real-time-system-conditions.html
@@ -0,0 +1,78 @@
+
+
+
+
Last Updated: Sep 08, 2026 00:42:50
+
+
+
+
+
+
+ Current Frequency
+ 59.984
+
+
+ Instantaneous Time Error
+ -2.123
+
+
+ Consecutive BAAL Clock-Minute Exceedances (min)
+ 0
+
+
+
+
+
+ Actual System Demand
+ 65912
+
+
+ Average Net Load
+ 48039
+
+
+ Total System Capacity (not including Ancillary Services)
+ 86005
+
+
+ Total Wind Output
+ 17978
+
+
+
+ Total PVGR Output
+ 0
+
+
+ Current System Inertia
+ 328564
+
+
+
+
+
+ DC_E (East)
+ -443
+
+
+ DC_L (Laredo VFT)
+ 70
+
+
+ DC_N (North)
+ -218
+
+
+ DC_R (Railroad)
+ 83
+
+
+ DC_S (Eagle Pass)
+ 0
+
+
+
+
diff --git a/tools/inputs/dashboards/rtd_ind_lmp_lz_hb.html b/tools/inputs/dashboards/rtd_ind_lmp_lz_hb.html
new file mode 100644
index 00000000..4da129e6
--- /dev/null
+++ b/tools/inputs/dashboards/rtd_ind_lmp_lz_hb.html
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
RTD Indicative LMP values include the Real-Time Reliability Deployment Price Adders.
+
+
+
+
+
Last SCED Date and Time: Sep 08, 2026 01:05:16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 09/08/2026 01:05:03
+
+ 36.14
+ 36.14
+ 34.57
+ 32.33
+ 31.92
+ 31.41
+ 31.07
+ 30.69
+ 30.12
+ 29.69
+ 29.47
+ 29.40
+
+
+ 09/08/2026 01:00:03
+
+ 32.73
+ 32.33
+ 33.62
+ 31.92
+ 31.35
+ 30.98
+ 30.69
+ 30.14
+ 29.89
+ 29.48
+ 29.47
+ 29.34
+
+
+
diff --git a/tools/inputs/dashboards/rtd_ind_lmp_lz_hb_HB_HOUSTON.html b/tools/inputs/dashboards/rtd_ind_lmp_lz_hb_HB_HOUSTON.html
new file mode 100644
index 00000000..2e81a5d0
--- /dev/null
+++ b/tools/inputs/dashboards/rtd_ind_lmp_lz_hb_HB_HOUSTON.html
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
RTD Indicative LMP values include the Real-Time Reliability Deployment Price Adders.
+
+
+
+
+
Last SCED Date and Time: Sep 08, 2026 01:05:16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 09/08/2026 01:05:03
+
+ 36.14
+ 36.14
+ 34.57
+ 32.33
+ 31.92
+ 31.41
+ 31.07
+ 30.69
+ 30.12
+ 29.69
+ 29.47
+ 29.40
+
+
+ 09/08/2026 01:00:03
+
+ 32.73
+ 32.33
+ 33.62
+ 31.92
+ 31.35
+ 30.98
+ 30.69
+ 30.14
+ 29.89
+ 29.48
+ 29.47
+ 29.34
+
+
+
diff --git a/tools/inputs/dashboards/system-wide-demand-before-day-ahead.json b/tools/inputs/dashboards/system-wide-demand-before-day-ahead.json
new file mode 100644
index 00000000..45d34a0a
--- /dev/null
+++ b/tools/inputs/dashboards/system-wide-demand-before-day-ahead.json
@@ -0,0 +1 @@
+{"lastUpdated":"2026-09-08 13:15:01-0500","previousDay":{"dayDate":"2026-09-07 00:00:00-0500","data":[{"hourEnding":1,"dstFlag":"N","currentLoadForecast":63783.161,"dayAheadForecast":64038.8511,"currentDayHsl":86144.8,"dayAheadHsl":87265.6,"systemLoad":63571.25,"timestamp":"2026-09-07 01:00:00-0500","epoch":1788760800000},{"hourEnding":2,"dstFlag":"N","currentLoadForecast":61541.9951,"dayAheadForecast":61325.2919,"currentDayHsl":85327.4,"dayAheadHsl":86218.9,"systemLoad":60998.57,"timestamp":"2026-09-07 02:00:00-0500","epoch":1788764400000},{"hourEnding":3,"dstFlag":"N","currentLoadForecast":59681.0172,"dayAheadForecast":59504.3445,"currentDayHsl":84485.2,"dayAheadHsl":84989.2,"systemLoad":59049.07,"timestamp":"2026-09-07 03:00:00-0500","epoch":1788768000000},{"hourEnding":4,"dstFlag":"N","currentLoadForecast":58228.5178,"dayAheadForecast":58274.9594,"currentDayHsl":83327.3,"dayAheadHsl":83770,"systemLoad":57674.8,"timestamp":"2026-09-07 04:00:00-0500","epoch":1788771600000},{"hourEnding":5,"dstFlag":"N","currentLoadForecast":57438.5698,"dayAheadForecast":57661.2469,"currentDayHsl":81998.4,"dayAheadHsl":82442.3,"systemLoad":56816.91,"timestamp":"2026-09-07 05:00:00-0500","epoch":1788775200000},{"hourEnding":6,"dstFlag":"N","currentLoadForecast":57047.0531,"dayAheadForecast":57630.4851,"currentDayHsl":81115.8,"dayAheadHsl":81382.8,"systemLoad":56597.16,"timestamp":"2026-09-07 06:00:00-0500","epoch":1788778800000},{"hourEnding":7,"dstFlag":"N","currentLoadForecast":56931.1855,"dayAheadForecast":57696.0425,"currentDayHsl":80217.8,"dayAheadHsl":80135.4,"systemLoad":56434.12,"timestamp":"2026-09-07 07:00:00-0500","epoch":1788782400000},{"hourEnding":8,"dstFlag":"N","currentLoadForecast":56689.1039,"dayAheadForecast":57811.7745,"currentDayHsl":80504.9,"dayAheadHsl":80862.7,"systemLoad":56053.53,"timestamp":"2026-09-07 08:00:00-0500","epoch":1788786000000},{"hourEnding":9,"dstFlag":"N","currentLoadForecast":58546.5061,"dayAheadForecast":60296.568,"currentDayHsl":92085.2,"dayAheadHsl":91601.6,"systemLoad":58583.19,"timestamp":"2026-09-07 09:00:00-0500","epoch":1788789600000},{"hourEnding":10,"dstFlag":"N","currentLoadForecast":62898.5204,"dayAheadForecast":64770.7451,"currentDayHsl":103779,"dayAheadHsl":103494.9,"systemLoad":63686.82,"timestamp":"2026-09-07 10:00:00-0500","epoch":1788793200000},{"hourEnding":11,"dstFlag":"N","currentLoadForecast":68096.7285,"dayAheadForecast":69897.4978,"currentDayHsl":107760.5,"dayAheadHsl":106974.4,"systemLoad":69271.7,"timestamp":"2026-09-07 11:00:00-0500","epoch":1788796800000},{"hourEnding":12,"dstFlag":"N","currentLoadForecast":73180.21,"dayAheadForecast":74912.3506,"currentDayHsl":108466.6,"dayAheadHsl":108155.8,"systemLoad":74589.21,"timestamp":"2026-09-07 12:00:00-0500","epoch":1788800400000},{"hourEnding":13,"dstFlag":"N","currentLoadForecast":77443.9688,"dayAheadForecast":79171.1174,"currentDayHsl":108028.4,"dayAheadHsl":108716.8,"systemLoad":79395.41,"timestamp":"2026-09-07 13:00:00-0500","epoch":1788804000000},{"hourEnding":14,"dstFlag":"N","currentLoadForecast":81278.9412,"dayAheadForecast":82672.7759,"currentDayHsl":108525.4,"dayAheadHsl":109062.4,"systemLoad":82985.99,"timestamp":"2026-09-07 14:00:00-0500","epoch":1788807600000},{"hourEnding":15,"dstFlag":"N","currentLoadForecast":84547.0398,"dayAheadForecast":85208.5964,"currentDayHsl":108603.4,"dayAheadHsl":109214.3,"systemLoad":85374.33,"timestamp":"2026-09-07 15:00:00-0500","epoch":1788811200000},{"hourEnding":16,"dstFlag":"N","currentLoadForecast":86391.5188,"dayAheadForecast":86271.2644,"currentDayHsl":109705.1,"dayAheadHsl":109688.9,"systemLoad":85921.76,"timestamp":"2026-09-07 16:00:00-0500","epoch":1788814800000},{"hourEnding":17,"dstFlag":"N","currentLoadForecast":86329.7693,"dayAheadForecast":86672.1409,"currentDayHsl":110223.4,"dayAheadHsl":109405,"systemLoad":86380.95,"timestamp":"2026-09-07 17:00:00-0500","epoch":1788818400000},{"hourEnding":18,"dstFlag":"N","currentLoadForecast":86080.1992,"dayAheadForecast":86448.5647,"currentDayHsl":108524.3,"dayAheadHsl":107610,"systemLoad":86412.36,"timestamp":"2026-09-07 18:00:00-0500","epoch":1788822000000},{"hourEnding":19,"dstFlag":"N","currentLoadForecast":85210.0393,"dayAheadForecast":84892.4607,"currentDayHsl":101019.8,"dayAheadHsl":101143.7,"systemLoad":85720.25,"timestamp":"2026-09-07 19:00:00-0500","epoch":1788825600000},{"hourEnding":20,"dstFlag":"N","currentLoadForecast":83052.4604,"dayAheadForecast":82693.2351,"currentDayHsl":91408.9,"dayAheadHsl":92340.5,"systemLoad":84003.87,"timestamp":"2026-09-07 20:00:00-0500","epoch":1788829200000},{"hourEnding":21,"dstFlag":"N","currentLoadForecast":80815.24,"dayAheadForecast":80863.6077,"currentDayHsl":91157.8,"dayAheadHsl":92083.5,"systemLoad":81749.58,"timestamp":"2026-09-07 21:00:00-0500","epoch":1788832800000},{"hourEnding":22,"dstFlag":"N","currentLoadForecast":77957.3086,"dayAheadForecast":77810.5496,"currentDayHsl":91208.2,"dayAheadHsl":93570.3,"systemLoad":78436.56,"timestamp":"2026-09-07 22:00:00-0500","epoch":1788836400000},{"hourEnding":23,"dstFlag":"N","currentLoadForecast":73897.5,"dayAheadForecast":73828.585,"currentDayHsl":92336,"dayAheadHsl":93095,"systemLoad":74649.48,"timestamp":"2026-09-07 23:00:00-0500","epoch":1788840000000},{"hourEnding":24,"dstFlag":"N","currentLoadForecast":70006.2806,"dayAheadForecast":69677.7935,"currentDayHsl":90459.1,"dayAheadHsl":92394.9,"systemLoad":70492.27,"timestamp":"2026-09-08 00:00:00-0500","epoch":1788843600000}]},"currentDay":{"dayDate":"2026-09-08 00:00:00-0500","data":[{"hourEnding":1,"dstFlag":"N","currentLoadForecast":66633.3994,"dayAheadForecast":66068.931,"currentDayHsl":88971.6,"dayAheadHsl":90444.1,"systemLoad":66748.26,"timestamp":"2026-09-08 01:00:00-0500","epoch":1788847200000},{"hourEnding":2,"dstFlag":"N","currentLoadForecast":63337.0009,"dayAheadForecast":63171.5403,"currentDayHsl":87889.3,"dayAheadHsl":89338.5,"systemLoad":63629.48,"timestamp":"2026-09-08 02:00:00-0500","epoch":1788850800000},{"hourEnding":3,"dstFlag":"N","currentLoadForecast":61543.1404,"dayAheadForecast":61139.631,"currentDayHsl":87348.4,"dayAheadHsl":88847.2,"systemLoad":61388.35,"timestamp":"2026-09-08 03:00:00-0500","epoch":1788854400000},{"hourEnding":4,"dstFlag":"N","currentLoadForecast":60015.6195,"dayAheadForecast":59762.1405,"currentDayHsl":86528.6,"dayAheadHsl":87859.9,"systemLoad":60054.86,"timestamp":"2026-09-08 04:00:00-0500","epoch":1788858000000},{"hourEnding":5,"dstFlag":"N","currentLoadForecast":59524.2207,"dayAheadForecast":59268.889,"currentDayHsl":85341.1,"dayAheadHsl":86803.6,"systemLoad":59629.22,"timestamp":"2026-09-08 05:00:00-0500","epoch":1788861600000},{"hourEnding":6,"dstFlag":"N","currentLoadForecast":60315.7188,"dayAheadForecast":59934.1799,"currentDayHsl":85005.9,"dayAheadHsl":86393.9,"systemLoad":60307.29,"timestamp":"2026-09-08 06:00:00-0500","epoch":1788865200000},{"hourEnding":7,"dstFlag":"N","currentLoadForecast":61957.6012,"dayAheadForecast":61600.8799,"currentDayHsl":84260.9,"dayAheadHsl":85170.7,"systemLoad":61809.82,"timestamp":"2026-09-08 07:00:00-0500","epoch":1788868800000},{"hourEnding":8,"dstFlag":"N","currentLoadForecast":61859.5098,"dayAheadForecast":61600.6504,"currentDayHsl":84226.3,"dayAheadHsl":85273.7,"systemLoad":62015.23,"timestamp":"2026-09-08 08:00:00-0500","epoch":1788872400000},{"hourEnding":9,"dstFlag":"N","currentLoadForecast":63796.01,"dayAheadForecast":63653.5487,"currentDayHsl":95215.7,"dayAheadHsl":95977.6,"systemLoad":64070.36,"timestamp":"2026-09-08 09:00:00-0500","epoch":1788876000000},{"hourEnding":10,"dstFlag":"N","currentLoadForecast":67954.5293,"dayAheadForecast":68020.4194,"currentDayHsl":107130.9,"dayAheadHsl":107844.2,"systemLoad":68542.66,"timestamp":"2026-09-08 10:00:00-0500","epoch":1788879600000},{"hourEnding":11,"dstFlag":"N","currentLoadForecast":73360.22,"dayAheadForecast":72912.0703,"currentDayHsl":109738.2,"dayAheadHsl":110584.3,"systemLoad":73252.48,"timestamp":"2026-09-08 11:00:00-0500","epoch":1788883200000},{"hourEnding":12,"dstFlag":"N","currentLoadForecast":78349.259,"dayAheadForecast":77454.3599,"currentDayHsl":109179.9,"dayAheadHsl":110723,"systemLoad":77850.91,"timestamp":"2026-09-08 12:00:00-0500","epoch":1788886800000},{"hourEnding":13,"dstFlag":"N","currentLoadForecast":82837.9897,"dayAheadForecast":81507.9709,"currentDayHsl":109219.4,"dayAheadHsl":111457.5,"systemLoad":82087.21,"timestamp":"2026-09-08 13:00:00-0500","epoch":1788890400000},{"hourEnding":14,"dstFlag":"N","currentLoadForecast":86267.7791,"dayAheadForecast":85133.2317,"dayAheadHsl":111706.5,"timestamp":"2026-09-08 14:00:00-0500","epoch":1788894000000},{"hourEnding":15,"dstFlag":"N","currentLoadForecast":88398.05,"dayAheadForecast":87543.2991,"dayAheadHsl":112137.8,"timestamp":"2026-09-08 15:00:00-0500","epoch":1788897600000},{"hourEnding":16,"dstFlag":"N","currentLoadForecast":88681.1296,"dayAheadForecast":88495.1997,"dayAheadHsl":111929.4,"timestamp":"2026-09-08 16:00:00-0500","epoch":1788901200000},{"hourEnding":17,"dstFlag":"N","currentLoadForecast":88193.6296,"dayAheadForecast":88913.8687,"dayAheadHsl":112068,"timestamp":"2026-09-08 17:00:00-0500","epoch":1788904800000},{"hourEnding":18,"dstFlag":"N","currentLoadForecast":86859.9019,"dayAheadForecast":88211.2407,"dayAheadHsl":110882.9,"timestamp":"2026-09-08 18:00:00-0500","epoch":1788908400000},{"hourEnding":19,"dstFlag":"N","currentLoadForecast":84341.7808,"dayAheadForecast":86548.2292,"dayAheadHsl":102875.9,"timestamp":"2026-09-08 19:00:00-0500","epoch":1788912000000},{"hourEnding":20,"dstFlag":"N","currentLoadForecast":81612.5588,"dayAheadForecast":83866.5886,"dayAheadHsl":92641,"timestamp":"2026-09-08 20:00:00-0500","epoch":1788915600000},{"hourEnding":21,"dstFlag":"N","currentLoadForecast":79557.2693,"dayAheadForecast":81436.5999,"dayAheadHsl":91857.2,"timestamp":"2026-09-08 21:00:00-0500","epoch":1788919200000},{"hourEnding":22,"dstFlag":"N","currentLoadForecast":76252.4805,"dayAheadForecast":78501.2903,"dayAheadHsl":93322.6,"timestamp":"2026-09-08 22:00:00-0500","epoch":1788922800000},{"hourEnding":23,"dstFlag":"N","currentLoadForecast":72101.3499,"dayAheadForecast":74293.3596,"dayAheadHsl":93352.2,"timestamp":"2026-09-08 23:00:00-0500","epoch":1788926400000},{"hourEnding":24,"dstFlag":"N","currentLoadForecast":68147.7408,"dayAheadForecast":69928.7207,"dayAheadHsl":91956.3,"timestamp":"2026-09-09 00:00:00-0500","epoch":1788930000000}]},"nextDay":{"dayDate":"2026-09-09 00:00:00-0500","data":[{"hourEnding":1,"dstFlag":"N","currentLoadForecast":65893.5609,"timestamp":"2026-09-09 01:00:00-0500","epoch":1788933600000},{"hourEnding":2,"dstFlag":"N","currentLoadForecast":62925.6281,"timestamp":"2026-09-09 02:00:00-0500","epoch":1788937200000},{"hourEnding":3,"dstFlag":"N","currentLoadForecast":60988.4996,"timestamp":"2026-09-09 03:00:00-0500","epoch":1788940800000},{"hourEnding":4,"dstFlag":"N","currentLoadForecast":59715.0109,"timestamp":"2026-09-09 04:00:00-0500","epoch":1788944400000},{"hourEnding":5,"dstFlag":"N","currentLoadForecast":59051.0895,"timestamp":"2026-09-09 05:00:00-0500","epoch":1788948000000},{"hourEnding":6,"dstFlag":"N","currentLoadForecast":59720.8196,"timestamp":"2026-09-09 06:00:00-0500","epoch":1788951600000},{"hourEnding":7,"dstFlag":"N","currentLoadForecast":61318.261,"timestamp":"2026-09-09 07:00:00-0500","epoch":1788955200000},{"hourEnding":8,"dstFlag":"N","currentLoadForecast":61274.2994,"timestamp":"2026-09-09 08:00:00-0500","epoch":1788958800000},{"hourEnding":9,"dstFlag":"N","currentLoadForecast":62971.7194,"timestamp":"2026-09-09 09:00:00-0500","epoch":1788962400000},{"hourEnding":10,"dstFlag":"N","currentLoadForecast":66654.1694,"timestamp":"2026-09-09 10:00:00-0500","epoch":1788966000000},{"hourEnding":11,"dstFlag":"N","currentLoadForecast":71128.0901,"timestamp":"2026-09-09 11:00:00-0500","epoch":1788969600000},{"hourEnding":12,"dstFlag":"N","currentLoadForecast":75338.0508,"timestamp":"2026-09-09 12:00:00-0500","epoch":1788973200000},{"hourEnding":13,"dstFlag":"N","currentLoadForecast":79354.9304,"timestamp":"2026-09-09 13:00:00-0500","epoch":1788976800000},{"hourEnding":14,"dstFlag":"N","currentLoadForecast":82966.2808,"timestamp":"2026-09-09 14:00:00-0500","epoch":1788980400000},{"hourEnding":15,"dstFlag":"N","currentLoadForecast":84893.2283,"timestamp":"2026-09-09 15:00:00-0500","epoch":1788984000000},{"hourEnding":16,"dstFlag":"N","currentLoadForecast":85545.9993,"timestamp":"2026-09-09 16:00:00-0500","epoch":1788987600000},{"hourEnding":17,"dstFlag":"N","currentLoadForecast":85753.4492,"timestamp":"2026-09-09 17:00:00-0500","epoch":1788991200000},{"hourEnding":18,"dstFlag":"N","currentLoadForecast":84868.6401,"timestamp":"2026-09-09 18:00:00-0500","epoch":1788994800000},{"hourEnding":19,"dstFlag":"N","currentLoadForecast":82976.5498,"timestamp":"2026-09-09 19:00:00-0500","epoch":1788998400000},{"hourEnding":20,"dstFlag":"N","currentLoadForecast":80164.8188,"timestamp":"2026-09-09 20:00:00-0500","epoch":1789002000000},{"hourEnding":21,"dstFlag":"N","currentLoadForecast":78035.7703,"timestamp":"2026-09-09 21:00:00-0500","epoch":1789005600000},{"hourEnding":22,"dstFlag":"N","currentLoadForecast":75262.8608,"timestamp":"2026-09-09 22:00:00-0500","epoch":1789009200000},{"hourEnding":23,"dstFlag":"N","currentLoadForecast":71559.041,"timestamp":"2026-09-09 23:00:00-0500","epoch":1789012800000},{"hourEnding":24,"dstFlag":"N","currentLoadForecast":67602.0817,"timestamp":"2026-09-10 00:00:00-0500","epoch":1789016400000}]}}
\ No newline at end of file
diff --git a/tools/inputs/esr/archive-middle.json b/tools/inputs/esr/archive-middle.json
new file mode 100644
index 00000000..cf4a4bfc
--- /dev/null
+++ b/tools/inputs/esr/archive-middle.json
@@ -0,0 +1,38 @@
+{
+ "_meta": {
+ "totalRecords": 54490,
+ "pageSize": 1,
+ "totalPages": 54490,
+ "currentPage": 27245,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "productId": "RPTESR-M",
+ "name": "Energy Storage Resource Four Second Data",
+ "reportTypeId": 10011001
+ },
+ "archives": [
+ {
+ "docId": 128856,
+ "friendlyName": "EnergyStorageResources_20250901104010",
+ "postDatetime": "2025-09-01T10:40:10.000",
+ "_links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m?download=128856"
+ }
+ }
+ }
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data"
+ }
+ }
+}
diff --git a/tools/inputs/esr/archive-oldest.json b/tools/inputs/esr/archive-oldest.json
new file mode 100644
index 00000000..ce798913
--- /dev/null
+++ b/tools/inputs/esr/archive-oldest.json
@@ -0,0 +1,38 @@
+{
+ "_meta": {
+ "totalRecords": 54490,
+ "pageSize": 1,
+ "totalPages": 54490,
+ "currentPage": 54490,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "productId": "RPTESR-M",
+ "name": "Energy Storage Resource Four Second Data",
+ "reportTypeId": 10011001
+ },
+ "archives": [
+ {
+ "docId": 100500,
+ "friendlyName": "EnergyStorageResources_20250529202753",
+ "postDatetime": "2025-05-29T20:27:53.000",
+ "_links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m?download=100500"
+ }
+ }
+ }
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data"
+ }
+ }
+}
diff --git a/tools/inputs/esr/archive-recent.json b/tools/inputs/esr/archive-recent.json
new file mode 100644
index 00000000..b5c63c33
--- /dev/null
+++ b/tools/inputs/esr/archive-recent.json
@@ -0,0 +1,38 @@
+{
+ "_meta": {
+ "totalRecords": 54490,
+ "pageSize": 1,
+ "totalPages": 54490,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "productId": "RPTESR-M",
+ "name": "Energy Storage Resource Four Second Data",
+ "reportTypeId": 10011001
+ },
+ "archives": [
+ {
+ "docId": 156101,
+ "friendlyName": "EnergyStorageResources_20251204235510",
+ "postDatetime": "2025-12-04T23:55:10.000",
+ "_links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m?download=156101"
+ }
+ }
+ }
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data"
+ }
+ }
+}
diff --git a/tools/inputs/esr/archive.json b/tools/inputs/esr/archive.json
new file mode 100644
index 00000000..b5c63c33
--- /dev/null
+++ b/tools/inputs/esr/archive.json
@@ -0,0 +1,38 @@
+{
+ "_meta": {
+ "totalRecords": 54490,
+ "pageSize": 1,
+ "totalPages": 54490,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "productId": "RPTESR-M",
+ "name": "Energy Storage Resource Four Second Data",
+ "reportTypeId": 10011001
+ },
+ "archives": [
+ {
+ "docId": 156101,
+ "friendlyName": "EnergyStorageResources_20251204235510",
+ "postDatetime": "2025-12-04T23:55:10.000",
+ "_links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m?download=156101"
+ }
+ }
+ }
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data"
+ }
+ }
+}
diff --git a/tools/inputs/esr/bundle.json b/tools/inputs/esr/bundle.json
new file mode 100644
index 00000000..5cd74133
--- /dev/null
+++ b/tools/inputs/esr/bundle.json
@@ -0,0 +1,26 @@
+{
+ "_meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "productId": "RPTESR-M",
+ "name": "Energy Storage Resource Four Second Data",
+ "reportTypeId": 10011001
+ },
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/bundle/rptesr-m"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data"
+ }
+ }
+}
diff --git a/tools/inputs/esr/evidence.json b/tools/inputs/esr/evidence.json
new file mode 100644
index 00000000..faf6eeee
--- /dev/null
+++ b/tools/inputs/esr/evidence.json
@@ -0,0 +1,65 @@
+{
+ "checked_at": "2026-09-08",
+ "files": {
+ "oldest": {
+ "document_id": 100500,
+ "posting": "2025-05-29T20:27:53.000",
+ "rows": 75,
+ "utc_from": "2025-05-30T01:20:00",
+ "utc_to": "2025-05-30T01:24:58",
+ "sha256": "61c986549388ca645494670691cd986fe900d4938e452779d8e86f865e30a6de",
+ "all_original_fields_equal": true,
+ "paged_query_equal": true,
+ "download_equal": true,
+ "publication_equal": true
+ },
+ "middle": {
+ "document_id": 128856,
+ "posting": "2025-09-01T10:40:10.000",
+ "rows": 75,
+ "utc_from": "2025-09-01T15:35:01",
+ "utc_to": "2025-09-01T15:39:57",
+ "sha256": "1fa67e17f7957ddd8549523619f14bc278529a3fc763f3bfc6b0476356a45ba9",
+ "all_original_fields_equal": true,
+ "paged_query_equal": true,
+ "download_equal": true,
+ "publication_equal": true
+ },
+ "recent": {
+ "document_id": 156101,
+ "posting": "2025-12-04T23:55:10.000",
+ "rows": 75,
+ "utc_from": "2025-12-05T05:50:02",
+ "utc_to": "2025-12-05T05:54:58",
+ "sha256": "ec5e40793b4023bf1b7f17ef265c3fbfa54bedb1ccb505e19700251431965d57",
+ "all_original_fields_equal": true,
+ "paged_query_equal": true,
+ "download_equal": true,
+ "publication_equal": true
+ }
+ },
+ "all_13_query_parameters_verified": true,
+ "live_async_page_and_iteration": true,
+ "full_retention_compared": false,
+ "operation_source": "https://apiexplorer.ercot.com/developer/apis/esrapi-apim-api/operations?api-version=2022-04-01-preview",
+ "api_base": "https://api.ercot.com/api/public-data",
+ "version": "1.0.1",
+ "operation_count": 8,
+ "query_count": 1,
+ "query_parameter_count": 13,
+ "archive_count": 54490,
+ "bundle_count": 0,
+ "query_row_count": 4087281,
+ "oldest_query_local": "2025-05-29T20:20:00",
+ "newest_query_local": "2025-12-04T23:54:58",
+ "normalized_metadata": {
+ "productId": "emilId",
+ "reportProductId": "reportEMIL"
+ },
+ "notes": [
+ "Source timestamps contain no offsets; local and UTC columns remain separate naive datetimes. DSTFlag is preserved without inferring its meaning from summer/winter dates.",
+ "Query formats normalized from official parameter descriptions. Response types from live field metadata.",
+ "225 rows and all five original fields compared across three complete archived CSVs; these also match live paginated queries, downloads and publications.",
+ "All retained files and intervening dates have not been compared. The newest returned data predates this verification. No bundle was available for a live download check."
+ ]
+}
diff --git a/tools/inputs/esr/history-formats.json b/tools/inputs/esr/history-formats.json
new file mode 100644
index 00000000..4ac886dd
--- /dev/null
+++ b/tools/inputs/esr/history-formats.json
@@ -0,0 +1,16 @@
+{
+ "rptesr-m/4_sec_esr_charging_mw": {
+ "columns": {
+ "AGC_EXEC_TIME": "AGCExecTime",
+ "AGC_EXEC_TIME_DST": "DSTFlag",
+ "AGC_EXEC_TIME_UTC": "AGCExecTimeUTC",
+ "SYSTEM_DEMAND": "systemDemand",
+ "ESR_CHARGING_MW": "ESRChargingMW"
+ },
+ "dates": {},
+ "datetimes": {
+ "AGCExecTime": "%m/%d/%Y %H:%M:%S",
+ "AGCExecTimeUTC": "%m/%d/%Y %H:%M:%S"
+ }
+ }
+}
diff --git a/tools/inputs/esr/middle.zip b/tools/inputs/esr/middle.zip
new file mode 100644
index 00000000..e67cfd80
Binary files /dev/null and b/tools/inputs/esr/middle.zip differ
diff --git a/tools/inputs/esr/oldest-query.json b/tools/inputs/esr/oldest-query.json
new file mode 100644
index 00000000..3570d85a
--- /dev/null
+++ b/tools/inputs/esr/oldest-query.json
@@ -0,0 +1,84 @@
+{
+ "_meta": {
+ "totalRecords": 4087281,
+ "pageSize": 1,
+ "totalPages": 4087281,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "AGCExecTimeUTC: ASC"
+ }
+ },
+ "report": {
+ "reportProductId": "RPTESR-M",
+ "reportName": "4_sec_esr_charging_mw",
+ "reportDisplayName": "Energy Storage Resource Four Second Data",
+ "reportId": "10011001",
+ "downloadLimit": 2000000
+ },
+ "fields": [
+ {
+ "name": "AGCExecTime",
+ "label": "AGC Exec Time (CPT)",
+ "cardinality": 1,
+ "dataType": "DATETIME",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ },
+ {
+ "name": "DSTFlag",
+ "label": "DST Flag",
+ "cardinality": 2,
+ "dataType": "BOOLEAN",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": false
+ },
+ {
+ "name": "AGCExecTimeUTC",
+ "label": "AGC Exec Time (UTC)",
+ "cardinality": 3,
+ "dataType": "DATETIME",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ },
+ {
+ "name": "systemDemand",
+ "label": "System Demand",
+ "cardinality": 4,
+ "dataType": "DOUBLE",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ },
+ {
+ "name": "ESRChargingMW",
+ "label": "ESR Charging MW",
+ "cardinality": 5,
+ "dataType": "DOUBLE",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ }
+ ],
+ "data": [
+ [
+ "2025-05-29T20:20:00",
+ false,
+ "2025-05-30T01:20:00",
+ 66074.6094,
+ 29.1482277
+ ]
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m/4_sec_esr_charging_mw"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m"
+ }
+ }
+}
diff --git a/tools/inputs/esr/oldest.zip b/tools/inputs/esr/oldest.zip
new file mode 100644
index 00000000..75cc9936
Binary files /dev/null and b/tools/inputs/esr/oldest.zip differ
diff --git a/tools/inputs/esr/operations.json b/tools/inputs/esr/operations.json
new file mode 100644
index 00000000..25afd8c6
--- /dev/null
+++ b/tools/inputs/esr/operations.json
@@ -0,0 +1,131 @@
+[
+ {
+ "id": "getListForProducts",
+ "name": "All available Data Products",
+ "method": "GET",
+ "urlTemplate": "/",
+ "request": {
+ "queryParameters": []
+ }
+ },
+ {
+ "id": "getProductHistoryBundles",
+ "name": "Available historical report archives for a specified Data product.",
+ "method": "GET",
+ "urlTemplate": "/bundle/{productId}",
+ "request": {
+ "queryParameters": []
+ }
+ },
+ {
+ "id": "getProductHistory",
+ "name": "Available report archives for a specified Data product.",
+ "method": "GET",
+ "urlTemplate": "/archive/{productId}",
+ "request": {
+ "queryParameters": []
+ }
+ },
+ {
+ "id": "getProduct",
+ "name": "Available report artifacts for a specified Data product.",
+ "method": "GET",
+ "urlTemplate": "/{productId}",
+ "request": {
+ "queryParameters": []
+ }
+ },
+ {
+ "id": "getProductArchives",
+ "name": "Download a collection of Data Product archives.",
+ "method": "POST",
+ "urlTemplate": "/archive/{productId}/download",
+ "request": {
+ "queryParameters": []
+ }
+ },
+ {
+ "id": "getProductBundle",
+ "name": "Download a Data Product historical archive.",
+ "method": "POST",
+ "urlTemplate": "/bundle/{productId}/download",
+ "request": {
+ "queryParameters": []
+ }
+ },
+ {
+ "id": "getData",
+ "name": "Energy Storage Resource Four Second Data",
+ "method": "GET",
+ "urlTemplate": "/rptesr-m/4_sec_esr_charging_mw",
+ "request": {
+ "queryParameters": [
+ {
+ "name": "AGCExecTimeFrom",
+ "type": "string",
+ "format": "yyyy-MM-ddTH24:mm:ss"
+ },
+ {
+ "name": "AGCExecTimeTo",
+ "type": "string",
+ "format": "yyyy-MM-ddTH24:mm:ss"
+ },
+ {
+ "name": "DSTFlag",
+ "type": "boolean"
+ },
+ {
+ "name": "AGCExecTimeUTCFrom",
+ "type": "string",
+ "format": "yyyy-MM-ddTH24:mm:ss"
+ },
+ {
+ "name": "AGCExecTimeUTCTo",
+ "type": "string",
+ "format": "yyyy-MM-ddTH24:mm:ss"
+ },
+ {
+ "name": "systemDemandFrom",
+ "type": "number"
+ },
+ {
+ "name": "systemDemandTo",
+ "type": "number"
+ },
+ {
+ "name": "ESRChargingMWFrom",
+ "type": "number"
+ },
+ {
+ "name": "ESRChargingMWTo",
+ "type": "number"
+ },
+ {
+ "name": "page",
+ "type": "integer"
+ },
+ {
+ "name": "size",
+ "type": "integer"
+ },
+ {
+ "name": "sort",
+ "type": "string"
+ },
+ {
+ "name": "dir",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ {
+ "id": "getVersion",
+ "name": "Retrieve the current version for the ERCOT ESR API Service.",
+ "method": "GET",
+ "urlTemplate": "/version",
+ "request": {
+ "queryParameters": []
+ }
+ }
+]
diff --git a/tools/inputs/esr/product.json b/tools/inputs/esr/product.json
new file mode 100644
index 00000000..111a663d
--- /dev/null
+++ b/tools/inputs/esr/product.json
@@ -0,0 +1,53 @@
+{
+ "productId": "RPTESR-M",
+ "name": "Energy Storage Resource Four Second Data",
+ "description": "",
+ "reportTypeId": 10011001,
+ "status": "Active",
+ "audience": "Public",
+ "generationFrequency": "Chron - 5 minutes",
+ "securityClassification": "Public",
+ "lastUpdated": "2025-06-01",
+ "firstRun": "2025-06-01",
+ "eceii": null,
+ "channel": "Public",
+ "userGuide": null,
+ "postingType": "Report",
+ "market": "Nodal",
+ "extractSubscriber": null,
+ "xsdName": null,
+ "misPostingLocation": null,
+ "certificateRole": null,
+ "fileType": "zip, csv, json",
+ "ddlName": null,
+ "misDisplayDuration": 365,
+ "archiveDuration": 2555,
+ "notificationType": null,
+ "contentType": "DATA",
+ "downloadLimit": 1000,
+ "lastPostDatetime": "2025-12-22T13:45:10",
+ "bundle": 0,
+ "protocolRules": {},
+ "artifacts": [
+ {
+ "reportTypeId": 10011001,
+ "displayName": "Energy Storage Resource Four Second Data",
+ "_links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m/4_sec_esr_charging_mw"
+ }
+ }
+ }
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data"
+ },
+ "archive": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m"
+ }
+ }
+}
diff --git a/tools/inputs/esr/products.json b/tools/inputs/esr/products.json
new file mode 100644
index 00000000..17837f5e
--- /dev/null
+++ b/tools/inputs/esr/products.json
@@ -0,0 +1,64 @@
+{
+ "_embedded": {
+ "products": [
+ {
+ "productId": "RPTESR-M",
+ "name": "Energy Storage Resource Four Second Data",
+ "description": "",
+ "reportTypeId": 10011001,
+ "status": "Active",
+ "audience": "Public",
+ "generationFrequency": "Chron - 5 minutes",
+ "securityClassification": "Public",
+ "lastUpdated": "2025-06-01",
+ "firstRun": "2025-06-01",
+ "eceii": null,
+ "channel": "Public",
+ "userGuide": null,
+ "postingType": "Report",
+ "market": "Nodal",
+ "extractSubscriber": null,
+ "xsdName": null,
+ "misPostingLocation": null,
+ "certificateRole": null,
+ "fileType": "zip, csv, json",
+ "ddlName": null,
+ "misDisplayDuration": 365,
+ "archiveDuration": 2555,
+ "notificationType": null,
+ "contentType": "DATA",
+ "downloadLimit": 1000,
+ "lastPostDatetime": "2025-12-22T13:45:10",
+ "bundle": 0,
+ "protocolRules": {},
+ "artifacts": [
+ {
+ "reportTypeId": 10011001,
+ "displayName": "Energy Storage Resource Four Second Data",
+ "_links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m/4_sec_esr_charging_mw"
+ }
+ }
+ }
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data"
+ },
+ "archive": {
+ "href": "https://api.ercot.com/api/public-data/archive/rptesr-m"
+ }
+ }
+ }
+ ]
+ },
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/"
+ }
+ }
+}
diff --git a/tools/inputs/esr/recent.zip b/tools/inputs/esr/recent.zip
new file mode 100644
index 00000000..8c24337b
Binary files /dev/null and b/tools/inputs/esr/recent.zip differ
diff --git a/tools/inputs/esr/response-fields.json b/tools/inputs/esr/response-fields.json
new file mode 100644
index 00000000..79d899fd
--- /dev/null
+++ b/tools/inputs/esr/response-fields.json
@@ -0,0 +1,9 @@
+{
+ "rptesr-m/4_sec_esr_charging_mw": {
+ "AGCExecTime": "DATETIME",
+ "DSTFlag": "BOOLEAN",
+ "AGCExecTimeUTC": "DATETIME",
+ "systemDemand": "DOUBLE",
+ "ESRChargingMW": "DOUBLE"
+ }
+}
diff --git a/tools/inputs/esr/sample.json b/tools/inputs/esr/sample.json
new file mode 100644
index 00000000..2ee9cd8b
--- /dev/null
+++ b/tools/inputs/esr/sample.json
@@ -0,0 +1,91 @@
+{
+ "_meta": {
+ "totalRecords": 4087281,
+ "pageSize": 2,
+ "totalPages": 2043641,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "AGCExecTimeUTC: DESC"
+ }
+ },
+ "report": {
+ "reportProductId": "RPTESR-M",
+ "reportName": "4_sec_esr_charging_mw",
+ "reportDisplayName": "Energy Storage Resource Four Second Data",
+ "reportId": "10011001",
+ "downloadLimit": 2000000
+ },
+ "fields": [
+ {
+ "name": "AGCExecTime",
+ "label": "AGC Exec Time (CPT)",
+ "cardinality": 1,
+ "dataType": "DATETIME",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ },
+ {
+ "name": "DSTFlag",
+ "label": "DST Flag",
+ "cardinality": 2,
+ "dataType": "BOOLEAN",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": false
+ },
+ {
+ "name": "AGCExecTimeUTC",
+ "label": "AGC Exec Time (UTC)",
+ "cardinality": 3,
+ "dataType": "DATETIME",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ },
+ {
+ "name": "systemDemand",
+ "label": "System Demand",
+ "cardinality": 4,
+ "dataType": "DOUBLE",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ },
+ {
+ "name": "ESRChargingMW",
+ "label": "ESR Charging MW",
+ "cardinality": 5,
+ "dataType": "DOUBLE",
+ "searchable": true,
+ "sortable": true,
+ "hasRange": true
+ }
+ ],
+ "data": [
+ [
+ "2025-12-04T23:54:58",
+ false,
+ "2025-12-05T05:54:58",
+ 53125.0508,
+ 1684.38782
+ ],
+ [
+ "2025-12-04T23:54:54",
+ false,
+ "2025-12-05T05:54:54",
+ 53135.2227,
+ 1685.69165
+ ]
+ ],
+ "_links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m/4_sec_esr_charging_mw"
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-data/rptesr-m"
+ }
+ }
+}
diff --git a/tools/inputs/esr/version.json b/tools/inputs/esr/version.json
new file mode 100644
index 00000000..fe1b2388
--- /dev/null
+++ b/tools/inputs/esr/version.json
@@ -0,0 +1,9 @@
+{
+ "info": {
+ "title": "ERCOT API Services for Energy Storage Resources",
+ "description": "Complete API services for Energy Storage Resource (ESR) four second data",
+ "version": "1.0.1",
+ "build": "@git.commit.id.abbrev@"
+ },
+ "openapi": "3.0.1"
+}
diff --git a/tools/inputs/forecast-performance/evidence.json b/tools/inputs/forecast-performance/evidence.json
new file mode 100644
index 00000000..ea075bad
--- /dev/null
+++ b/tools/inputs/forecast-performance/evidence.json
@@ -0,0 +1,648 @@
+{
+ "files": [
+ {
+ "title": "DayAhead Backcast Report February 2026",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/MidTerm_Load_Metrics_Feb26.xlsx",
+ "bytes": 702982,
+ "sha256": "8c3efa658db548e261ce814a42a7d1b3c030074eea0a8608b5530e780fb418e6",
+ "hourlyRows": 6048,
+ "timestampRows": 6048,
+ "summaryRows": 432,
+ "numericValues": 67356,
+ "markers": 0,
+ "firstTimestamp": "2026-02-01T01:00:00",
+ "lastTimestamp": "2026-03-01T00:00:00"
+ },
+ {
+ "title": "DayAhead Backcast Report January 2026",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/MidTerm_Load_Metrics_Jan26.xlsx",
+ "bytes": 769470,
+ "sha256": "de1a9b959cc85693ee2273ec4ccf3227161841bd73c2201717a6cd8ff46b7d5a",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 432,
+ "numericValues": 74484,
+ "markers": 0,
+ "firstTimestamp": "2026-01-01T01:00:00",
+ "lastTimestamp": "2026-02-01T00:00:00"
+ },
+ {
+ "title": "Metrics - November 2025",
+ "url": "https://www.ercot.com/files/docs/2025/12/03/Mid_Term_Load_Forecast_Metrics_Nov_2025.xlsx",
+ "bytes": 1558681,
+ "sha256": "efe07154f1e0ad66c7ce408b25b4b29635471a0680fc8a1686427a87e113cd93",
+ "hourlyRows": 6480,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 91593,
+ "markers": 0,
+ "firstTimestamp": "2025-11-01T01:00:00",
+ "lastTimestamp": "2025-12-01T00:00:00"
+ },
+ {
+ "title": "Metrics - October 2025",
+ "url": "https://www.ercot.com/files/docs/2025/11/05/Mid_Term_Load_Forecast_Metrics_Oct_2025.xlsx",
+ "bytes": 1596396,
+ "sha256": "3d732d85cd756f8b737b3e74b5afcb12614346c676c3a46473241d6532edbc13",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2025-10-01T01:00:00",
+ "lastTimestamp": "2025-11-01T00:00:00"
+ },
+ {
+ "title": "Metrics - September 2025",
+ "url": "https://www.ercot.com/files/docs/2025/10/03/Mid_Term_Load_Forecast_Metrics_Sep_2025.xlsx",
+ "bytes": 1554072,
+ "sha256": "0ab801107db10ffd66dec85e0a37c2f2e42f0844b9bcbef50612a62599c49fac",
+ "hourlyRows": 6480,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 91593,
+ "markers": 0,
+ "firstTimestamp": "2025-09-01T01:00:00",
+ "lastTimestamp": "2025-10-01T00:00:00"
+ },
+ {
+ "title": "Metrics - Aug 2025",
+ "url": "https://www.ercot.com/files/docs/2025/09/08/Mid_Term_Load_Forecast_Metrics_Aug_2025.xlsx",
+ "bytes": 1598146,
+ "sha256": "364c57826cb6e77e3efa78fc759c0e23e76aec6cb26c4892cbd0aa0435f88664",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2025-08-01T01:00:00",
+ "lastTimestamp": "2025-09-01T00:00:00"
+ },
+ {
+ "title": "Metrics - July 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/Mid_Term_Load_Forecast_Metrics_July_2025.xlsx",
+ "bytes": 1592422,
+ "sha256": "84b3d9e582e77721ca7b64529facf7cc6df461709928ddcf04ef1e36f8a176d1",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2025-07-01T01:00:00",
+ "lastTimestamp": "2025-08-01T00:00:00"
+ },
+ {
+ "title": "Metrtics - June 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/Mid_Term_Load_Forecast_Metrics_June_2025.xlsx",
+ "bytes": 1571998,
+ "sha256": "413c43cc4c33f5e809a9a95925df54dbf0979a21cd7c00a300ddad71ea6fde3b",
+ "hourlyRows": 6696,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 92019,
+ "markers": 438,
+ "firstTimestamp": "2025-06-01T01:00:00",
+ "lastTimestamp": "2025-07-01T00:00:00"
+ },
+ {
+ "title": "Metrics - May 2025",
+ "url": "https://www.ercot.com/files/docs/2025/06/12/Mid_Term_Load_Forecast_Metrics_May_2025.xlsb.xlsx",
+ "bytes": 1598355,
+ "sha256": "cf84a9c5249fb9374edff51f714bd902977f0947ba450a323220768b149da4a2",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94613,
+ "markers": 4,
+ "firstTimestamp": "2025-05-01T01:00:00",
+ "lastTimestamp": "2025-06-01T00:00:00"
+ },
+ {
+ "title": "Metrics - April 2025",
+ "url": "https://www.ercot.com/files/docs/2025/05/05/Mid_Term_Load_Forecast_Metrics.xlsb.xlsx",
+ "bytes": 1556750,
+ "sha256": "ebe3d373d5682d04ccde43903a1704bff94ac7851a8eb3f7f7db18fff0f3460e",
+ "hourlyRows": 6503,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 91593,
+ "markers": 23,
+ "firstTimestamp": "2025-04-01T01:00:00",
+ "lastTimestamp": "2025-05-01T00:00:00"
+ },
+ {
+ "title": "Metrics - March 2025",
+ "url": "https://www.ercot.com/files/docs/2025/04/07/Mid_Term_Load_Forecast_Metrics_Mar_2025.xlsb.xlsx",
+ "bytes": 1602523,
+ "sha256": "da4a3fc6718302e9bbbbf38e254ca8fa5d3d500a1e78705a5dfaddf21feb86f5",
+ "hourlyRows": 6687,
+ "timestampRows": 6687,
+ "summaryRows": 441,
+ "numericValues": 94491,
+ "markers": 0,
+ "firstTimestamp": "2025-03-01T01:00:00",
+ "lastTimestamp": "2025-04-01T00:00:00"
+ },
+ {
+ "title": "Metrics - February 2025",
+ "url": "https://www.ercot.com/files/docs/2025/03/21/Mid_Term_Load_Forecast_Metrics_Feb_2025.xlsb.xlsx",
+ "bytes": 1475916,
+ "sha256": "c190e032a037f07efdd0a1cb180b5ea55c82e28d07f69042cf3bfe2e109ce563",
+ "hourlyRows": 6048,
+ "timestampRows": 6048,
+ "summaryRows": 441,
+ "numericValues": 85545,
+ "markers": 0,
+ "firstTimestamp": "2025-02-01T01:00:00",
+ "lastTimestamp": "2025-03-01T00:00:00"
+ },
+ {
+ "title": "Metrics - January 2025",
+ "url": "https://www.ercot.com/files/docs/2025/02/04/mid_term_load_forecast_metrics_jan_2025-xlsb.xlsx",
+ "bytes": 1608019,
+ "sha256": "10f5264e2290f72fd3d1282bfa7b79b6286e6cb2db9d30cba4d36366c7d37030",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2025-01-01T01:00:00",
+ "lastTimestamp": "2025-02-01T00:00:00"
+ },
+ {
+ "title": "Metrics - February 2022",
+ "url": "https://www.ercot.com/files/docs/2022/03/11/Mid_Term_Load_Forecast_Metrics_February_2022.xlsx",
+ "bytes": 1433203,
+ "sha256": "2e726f254094db2f9178bca35dc1d16cc7e2c27f06728d691884e2187cd34470",
+ "hourlyRows": 6048,
+ "timestampRows": 6048,
+ "summaryRows": 441,
+ "numericValues": 85545,
+ "markers": 0,
+ "firstTimestamp": "2022-02-01T01:00:00",
+ "lastTimestamp": "2022-03-01T00:00:00"
+ },
+ {
+ "title": "Metrics - March 2022",
+ "url": "https://www.ercot.com/files/docs/2022/04/20/Mid_Term_Load_Forecast_Metrics_March_2022.xlsx",
+ "bytes": 1569615,
+ "sha256": "36a61d3719dafde8ba449b10084f2718e4546f1d6d2fbb6b499e45b8855fbdcc",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2022-03-01T01:00:00",
+ "lastTimestamp": "2022-04-01T00:00:00"
+ },
+ {
+ "title": "Metrics - April 2022",
+ "url": "https://www.ercot.com/files/docs/2022/06/16/Mid_Term_Load_Forecast_Metrics_April_2022.xlsx",
+ "bytes": 1539076,
+ "sha256": "432c1317b8e3be23653dc5bb5c5fd2fa4b72f016846d5d6bf2ce435910cb03c9",
+ "hourlyRows": 6504,
+ "timestampRows": 6504,
+ "summaryRows": 441,
+ "numericValues": 91926,
+ "markers": 3,
+ "firstTimestamp": "2022-03-31T01:00:00",
+ "lastTimestamp": "2022-05-01T00:00:00"
+ },
+ {
+ "title": "Metrics - May 2022",
+ "url": "https://www.ercot.com/files/docs/2022/06/16/Mid_Term_Load_Forecast_Metrics_May_2022.xlsx",
+ "bytes": 1562909,
+ "sha256": "c28171905aeedb79b975cc9921f0c28ee75f03e101b458ad049531028e017891",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 93650,
+ "markers": 7,
+ "firstTimestamp": "2022-05-01T01:00:00",
+ "lastTimestamp": "2022-06-01T00:00:00"
+ },
+ {
+ "title": "Metrics - June 2022",
+ "url": "https://www.ercot.com/files/docs/2022/07/29/Mid_Term_Load_Forecast_Metrics_June_2022.xlsx",
+ "bytes": 1548585,
+ "sha256": "e00eb40b1682cdd41863c93302a97155dc923220bb60d8bdb67b105978f4350c",
+ "hourlyRows": 6504,
+ "timestampRows": 6504,
+ "summaryRows": 441,
+ "numericValues": 91809,
+ "markers": 0,
+ "firstTimestamp": "2022-05-31T01:00:00",
+ "lastTimestamp": "2022-07-01T00:00:00"
+ },
+ {
+ "title": "Metrics - July 2022",
+ "url": "https://www.ercot.com/files/docs/2024/01/24/Mid_Term_Load_Forecast_Metrics_Jul_2022.xlsx",
+ "bytes": 1571836,
+ "sha256": "152349d77caeaa8f6e9d8f48f88cfe1d92ff61efabc35e4667d7ec3a9b78627f",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 93657,
+ "markers": 0,
+ "firstTimestamp": "2022-07-01T01:00:00",
+ "lastTimestamp": "2022-08-01T00:00:00"
+ },
+ {
+ "title": "Metrics - August 2022",
+ "url": "https://www.ercot.com/files/docs/2022/09/23/Mid_Term_Load_Forecast_Metrics_Aug_2022.xlsx",
+ "bytes": 1570894,
+ "sha256": "079c74b9d41f0fa5a42a5c9b63373d35a9a5925f1fc22813da44c261baed05ed",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 93657,
+ "markers": 0,
+ "firstTimestamp": "2022-08-01T01:00:00",
+ "lastTimestamp": "2022-09-01T00:00:00"
+ },
+ {
+ "title": "Metrics - September 2022",
+ "url": "https://www.ercot.com/files/docs/2022/10/21/Mid_Term_Load_Forecast_Metrics_Sep_2022.xlsx",
+ "bytes": 1546512,
+ "sha256": "49bbfe7069f95eb5e6460f5b5c9fe3ab8382f2845bb042ad05ecdb4d448df783",
+ "hourlyRows": 6504,
+ "timestampRows": 6504,
+ "summaryRows": 441,
+ "numericValues": 91809,
+ "markers": 0,
+ "firstTimestamp": "2022-05-31T01:00:00",
+ "lastTimestamp": "2022-10-01T00:00:00"
+ },
+ {
+ "title": "Metrics - October 2022",
+ "url": "https://www.ercot.com/files/docs/2022/11/30/Mid_Term_Load_Forecast_Metrics_Oct_2022.xlsx",
+ "bytes": 1574875,
+ "sha256": "2c33f81bc0d08a24a495537da534cb1eb2100eff9fbde8c064ad430d0874b224",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 93657,
+ "markers": 0,
+ "firstTimestamp": "2022-10-01T01:00:00",
+ "lastTimestamp": "2022-11-01T00:00:00"
+ },
+ {
+ "title": "Metrics - November 2022",
+ "url": "https://www.ercot.com/files/docs/2023/01/13/Mid_Term_Load_Forecast_Metrics_Nov_2022.xlsx",
+ "bytes": 1608257,
+ "sha256": "9c7fd4fe950853389e1bcee6e512fb39f93c27c058a450151442981678644696",
+ "hourlyRows": 6504,
+ "timestampRows": 6504,
+ "summaryRows": 441,
+ "numericValues": 91809,
+ "markers": 0,
+ "firstTimestamp": "2022-05-31T01:00:00",
+ "lastTimestamp": "2022-12-01T00:00:00"
+ },
+ {
+ "title": "Metrics - December 2022",
+ "url": "https://www.ercot.com/files/docs/2023/01/13/Mid-Term-Load-Forecast-Metrics-Dec-2022.xlsx",
+ "bytes": 1572777,
+ "sha256": "34d8ce33ba0d751ad67d459bb8543260e696dca74bfb7b60defbe7b7d18e0081",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 93657,
+ "markers": 0,
+ "firstTimestamp": "2022-12-01T01:00:00",
+ "lastTimestamp": "2023-01-01T00:00:00"
+ },
+ {
+ "title": "Metrics - January 2023",
+ "url": "https://www.ercot.com/files/docs/2023/02/15/Mid_Term_Load_Forecast_Metrics_Jan_2023.xlsx",
+ "bytes": 1597291,
+ "sha256": "21ef65fe2c31c590f80fc3916474d3d84ea7ed2b9fef9ef163722e2bec67123f",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94497,
+ "markers": 0,
+ "firstTimestamp": "2023-01-01T01:00:00",
+ "lastTimestamp": "2023-02-01T00:00:00"
+ },
+ {
+ "title": "Metrics - February 2023",
+ "url": "https://www.ercot.com/files/docs/2023/03/29/Mid-Term-Load-Forecast-Metrics-Feb-2023.xlsx",
+ "bytes": 1461853,
+ "sha256": "5c8221e25d58cec2197d35b6ac1c179df79415d4934b6fdc9eb6db4f52fbffe0",
+ "hourlyRows": 6048,
+ "timestampRows": 6048,
+ "summaryRows": 441,
+ "numericValues": 85545,
+ "markers": 0,
+ "firstTimestamp": "2023-02-01T01:00:00",
+ "lastTimestamp": "2023-03-01T00:00:00"
+ },
+ {
+ "title": "Metrics - March 2023",
+ "url": "https://www.ercot.com/files/docs/2023/04/26/Mid_Term_Load_Forecast_Metrics_Mar_2023.xlsx",
+ "bytes": 1604874,
+ "sha256": "3106ba32bfd7aa5f9f2b924ffb6e4aea5592cf372e10245f722fbb0b87fbebc2",
+ "hourlyRows": 6688,
+ "timestampRows": 6688,
+ "summaryRows": 441,
+ "numericValues": 94504,
+ "markers": 0,
+ "firstTimestamp": "2023-02-01T00:00:00",
+ "lastTimestamp": "2023-04-01T00:00:00"
+ },
+ {
+ "title": "Metrics - April 2023",
+ "url": "https://www.ercot.com/files/docs/2023/06/23/Mid_Term_Load_Forecast_Metrics_Apr_2023.xlsx",
+ "bytes": 1552796,
+ "sha256": "07c03eee80df7bfbffaaff21f12dba0269d59c2426dff5b57c1024aab1e4fc60",
+ "hourlyRows": 6480,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 91593,
+ "markers": 0,
+ "firstTimestamp": "2023-04-01T01:00:00",
+ "lastTimestamp": "2023-05-01T00:00:00"
+ },
+ {
+ "title": "Metrics - May 2023",
+ "url": "https://www.ercot.com/files/docs/2023/06/21/Mid_Term_Load_Forecast_Metrics_May_2023.xlsx",
+ "bytes": 1586989,
+ "sha256": "712de85fd661cc03637c6de6007779dc5ce7d4daff5b0d289cff15aad3d2bfd6",
+ "hourlyRows": 6704,
+ "timestampRows": 6704,
+ "summaryRows": 441,
+ "numericValues": 94648,
+ "markers": 0,
+ "firstTimestamp": "2023-05-01T00:00:00",
+ "lastTimestamp": "2023-06-01T00:00:00"
+ },
+ {
+ "title": "Metrics - June 2023",
+ "url": "https://www.ercot.com/files/docs/2023/07/14/Mid_Term_Load_Forecast_Metrics_Jun_2023.xlsx",
+ "bytes": 1590991,
+ "sha256": "2c0ed06e97e34428227bee8d21ca858d3b755388b2a5a869a55b391da05a86b3",
+ "hourlyRows": 6691,
+ "timestampRows": 6691,
+ "summaryRows": 441,
+ "numericValues": 94530,
+ "markers": 1,
+ "firstTimestamp": "2023-02-01T00:00:00",
+ "lastTimestamp": "2023-07-01T00:00:00"
+ },
+ {
+ "title": "Metrics - July 2023",
+ "url": "https://www.ercot.com/files/docs/2023/08/21/Mid_Term_Load_Forecast_Metrics_July_2023.xlsx",
+ "bytes": 1593353,
+ "sha256": "5f23629eee804e80e2ad9cf476f8544c20831ab9113350114e12d746ecc3d662",
+ "hourlyRows": 6704,
+ "timestampRows": 6704,
+ "summaryRows": 441,
+ "numericValues": 94641,
+ "markers": 7,
+ "firstTimestamp": "2023-06-01T00:00:00",
+ "lastTimestamp": "2023-08-01T00:00:00"
+ },
+ {
+ "title": "Metrics - August 2023",
+ "url": "https://www.ercot.com/files/docs/2023/10/20/Mid_Term_Load_Forecast_Metrics_Aug_2023.xlsx",
+ "bytes": 1590599,
+ "sha256": "9328e8c64d2f9280f2335ae9386e85eed5890136e6f61794707d44d484cb9227",
+ "hourlyRows": 6704,
+ "timestampRows": 6704,
+ "summaryRows": 441,
+ "numericValues": 94645,
+ "markers": 3,
+ "firstTimestamp": "2023-06-01T00:00:00",
+ "lastTimestamp": "2023-09-01T00:00:00"
+ },
+ {
+ "title": "Metrics - September 2023",
+ "url": "https://www.ercot.com/files/docs/2023/10/20/Mid_Term_Load_Forecast_Metrics_Sep_2023.xlsx",
+ "bytes": 1594688,
+ "sha256": "9dec775c09bfd24d5165c93f7f289bcfc1f6bf9a537122e50318fca0bb65e0ef",
+ "hourlyRows": 6691,
+ "timestampRows": 6691,
+ "summaryRows": 441,
+ "numericValues": 94531,
+ "markers": 0,
+ "firstTimestamp": "2023-02-01T00:00:00",
+ "lastTimestamp": "2023-10-01T00:00:00"
+ },
+ {
+ "title": "Metrics - October 2023",
+ "url": "https://www.ercot.com/files/docs/2023/11/29/Mid_Term_Load_Forecast_Metrics_Oct_2023.xlsx",
+ "bytes": 1593905,
+ "sha256": "1feaa6402ffeeb333676910514b468e1092e8ecb4fbefe38af2e74110495302c",
+ "hourlyRows": 6697,
+ "timestampRows": 6697,
+ "summaryRows": 441,
+ "numericValues": 94585,
+ "markers": 0,
+ "firstTimestamp": "2023-06-01T00:00:00",
+ "lastTimestamp": "2023-11-01T00:00:00"
+ },
+ {
+ "title": "Metrics - November 2023",
+ "url": "https://www.ercot.com/files/docs/2024/01/24/Mid_Term_Load_Forecast_Metrics_Nov_2023.xlsx",
+ "bytes": 1552050,
+ "sha256": "fbe185d498c4845bbd1e9c2d7fc26e9e0c3f18867c310d143efd9fad010d090a",
+ "hourlyRows": 6488,
+ "timestampRows": 6488,
+ "summaryRows": 441,
+ "numericValues": 91705,
+ "markers": 0,
+ "firstTimestamp": "2023-11-01T00:00:00",
+ "lastTimestamp": "2023-12-01T00:00:00"
+ },
+ {
+ "title": "Metrics - December 2023",
+ "url": "https://www.ercot.com/files/docs/2024/02/02/Mid_Term_Load_Forecast_Metrics_Dec_2023.xlsb.xlsx",
+ "bytes": 1595609,
+ "sha256": "bf526287cdb1ba74fb15fcbb303992fed4d07069ce6b8f52f1f8b3e3dc6da742",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94592,
+ "markers": 0,
+ "firstTimestamp": "2023-12-01T01:00:00",
+ "lastTimestamp": "2024-01-01T00:00:00"
+ },
+ {
+ "title": "Metrics - January 2024",
+ "url": "https://www.ercot.com/files/docs/2024/02/20/Mid_Term_Load_Forecast_Metrics_Jan_2024.xlsb.xlsx",
+ "bytes": 1597911,
+ "sha256": "ea5292c1c2fd1324b727062d302aa2eec82834e92d40b576794da879828599fb",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94592,
+ "markers": 0,
+ "firstTimestamp": "2024-01-01T01:00:00",
+ "lastTimestamp": "2024-02-01T00:00:00"
+ },
+ {
+ "title": "Metrics - February 2024",
+ "url": "https://www.ercot.com/files/docs/2024/03/08/Mid_Term_Load_Forecast_Metrics_Feb_2024.xlsb.xlsx",
+ "bytes": 1510512,
+ "sha256": "cd3cf33bf168ac165b2580956551cf8360e709a48bcd1173ace96bb23253c370",
+ "hourlyRows": 6272,
+ "timestampRows": 6272,
+ "summaryRows": 441,
+ "numericValues": 88681,
+ "markers": 0,
+ "firstTimestamp": "2024-02-01T00:00:00",
+ "lastTimestamp": "2024-03-01T00:00:00"
+ },
+ {
+ "title": "Metrics - March 2024",
+ "url": "https://www.ercot.com/files/docs/2024/04/03/Mid_Term_Load_Forecast_Metrics_Mar_2024.xlsb.xlsx",
+ "bytes": 1549591,
+ "sha256": "e4b37be461a58533f60ac8d4f5dba2ecab19fa27526f88ad9b424eebf3317a7e",
+ "hourlyRows": 6687,
+ "timestampRows": 6687,
+ "summaryRows": 441,
+ "numericValues": 92416,
+ "markers": 0,
+ "firstTimestamp": "2024-03-01T01:00:00",
+ "lastTimestamp": "2024-04-01T00:00:00"
+ },
+ {
+ "title": "Metrics - April 2024",
+ "url": "https://www.ercot.com/files/docs/2024/05/02/Mid_Term_Load_Forecast_Metrics_Apr_2024.xlsb.xlsx",
+ "bytes": 1547883,
+ "sha256": "0605e90b716a859b8097eee2e34c0b860769cb9766dd7b455b443294fa13fac0",
+ "hourlyRows": 6687,
+ "timestampRows": 6687,
+ "summaryRows": 441,
+ "numericValues": 92416,
+ "markers": 0,
+ "firstTimestamp": "2024-03-31T02:00:00",
+ "lastTimestamp": "2024-05-01T00:00:00"
+ },
+ {
+ "title": "Metrics - May 2024",
+ "url": "https://www.ercot.com/files/docs/2024/06/19/Mid_Term_Load_Forecast_Metrics_May_2024.xlsx",
+ "bytes": 1558835,
+ "sha256": "ca2b83f0f1cba664bae996684da51eff204c3ee1411aecb3b8c22b0e20045a27",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 92737,
+ "markers": 0,
+ "firstTimestamp": "2024-05-01T01:00:00",
+ "lastTimestamp": "2024-06-01T00:00:00"
+ },
+ {
+ "title": "Metrics - June 2024",
+ "url": "https://www.ercot.com/files/docs/2024/07/01/Mid_Term_Load_Forecast_Metrics_June_2024.xlsx",
+ "bytes": 1552382,
+ "sha256": "ef11199ada5d8d40693f059edc614eeabd42e092ef6187a35c126dbe60cd49cf",
+ "hourlyRows": 6480,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 91593,
+ "markers": 0,
+ "firstTimestamp": "2024-06-01T01:00:00",
+ "lastTimestamp": "2024-07-01T00:00:00"
+ },
+ {
+ "title": "Metrics - July 2024",
+ "url": "https://www.ercot.com/files/docs/2024/08/08/Mid_Term_Load_Forecast_Metrics_July_2024.xlsx",
+ "bytes": 1599906,
+ "sha256": "d9b585dbc30ef6d901a843c39592185f26e08c6ae4a07c78cce1d4f91106a70c",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2024-07-01T01:00:00",
+ "lastTimestamp": "2024-08-01T00:00:00"
+ },
+ {
+ "title": "Metrics - August 2024",
+ "url": "https://www.ercot.com/files/docs/2024/09/06/Mid_Term_Load_Forecast_Metrics_Aug_2024.xlsx",
+ "bytes": 1594308,
+ "sha256": "792055cf356c9d965f287d11a1767352478d9b908e31935ba4757a49d56935b7",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2024-08-01T01:00:00",
+ "lastTimestamp": "2024-09-01T00:00:00"
+ },
+ {
+ "title": "Metrics - September 2024",
+ "url": "https://www.ercot.com/files/docs/2024/10/07/Mid_Term_Load_Forecast_Metrics_Sep_2024.xlsx",
+ "bytes": 1557940,
+ "sha256": "1ec420025b9d358750a8818e84fd14200700bbac9c10028e453ec9e73013bdbc",
+ "hourlyRows": 6480,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 91593,
+ "markers": 0,
+ "firstTimestamp": "2024-09-01T01:00:00",
+ "lastTimestamp": "2024-10-01T00:00:00"
+ },
+ {
+ "title": "Metrics - October 2024",
+ "url": "https://www.ercot.com/files/docs/2024/11/14/Mid_Term_Load_Forecast_Metrics_Oct_2024.xlsb.xlsx",
+ "bytes": 1600945,
+ "sha256": "a728b32708119bb5c9f34431239973ed2aa89a27213ab542934302c1740959b6",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2024-10-01T01:00:00",
+ "lastTimestamp": "2024-11-01T00:00:00"
+ },
+ {
+ "title": "Metrics - November 2024",
+ "url": "https://www.ercot.com/files/docs/2024/12/05/mid_term_load_forecast_metrics_nov_2024-xlsb.xlsx",
+ "bytes": 1580987,
+ "sha256": "c4e47fbfed5f8c69ce9d65533bbdea3cf47871b5448fbdb2a81b99781bda11c6",
+ "hourlyRows": 6696,
+ "timestampRows": 6480,
+ "summaryRows": 441,
+ "numericValues": 92019,
+ "markers": 438,
+ "firstTimestamp": "2024-11-01T01:00:00",
+ "lastTimestamp": "2024-12-01T00:00:00"
+ },
+ {
+ "title": "Metrics - December 2024",
+ "url": "https://www.ercot.com/files/docs/2025/01/07/Mid_Term_Load_Forecast_Metrics_Dec_2024.xlsb.xlsx",
+ "bytes": 1606290,
+ "sha256": "f6d48b44e557cf7bf6cc7b0b3a5b52d4c5049d0fa98e9b63b5430a1c1375a087",
+ "hourlyRows": 6696,
+ "timestampRows": 6696,
+ "summaryRows": 441,
+ "numericValues": 94617,
+ "markers": 0,
+ "firstTimestamp": "2024-12-01T01:00:00",
+ "lastTimestamp": "2025-01-01T00:00:00"
+ }
+ ],
+ "hourlyRows": 316123,
+ "summaryRows": 21150,
+ "numericValues": 4412079,
+ "markers": 924,
+ "checkedAt": "2026-09-08",
+ "index": "https://www.ercot.com/gridinfo/load/forecast",
+ "decoderSha256": "8979b3e6637d1c7aba7d48f802a63d8f1fcdc78da5acb221c4f80bf84e5c0e8b",
+ "liveDiscoveryFileCount": 48,
+ "exactLiveDiscoveryUrls": true,
+ "timestampRows": 315668,
+ "notes": [
+ "All 48 original hourly metric workbooks compared against direct openpyxl source cells for forecast, actual, error, frequency and selected summary blocks.",
+ "316123 hourly/calculation records contain 315668 timestamps; counts do not establish unique observations or uninterrupted history.",
+ "Summary chart blocks and monthly MAPE are separate records. Duplicate pivot/helper tables and graphics are intentionally not returned as extra observations.",
+ "Original Hour numbers are retained as Decimal in sourceHour, including negative and fractional December2023 values. Only integral1..24 values populate hour.",
+ "924 markers include formula-error strings and zero/time-only secondary clocks; they are not all missing observations.",
+ "No forecast issuance times, timezones or missing values are reconstructed. Model-code meanings and absent units are not inferred.",
+ "Six regression workbooks retain original first60 rows, last2 stored rows, and error-bearing rows; unrelated rows are removed from worksheet XML. Original source/fixture hashes and retained coordinates are recorded separately.",
+ "Standalone monthly Forecast/Backcast summary workbooks remain outside this reader."
+ ]
+}
diff --git a/tools/inputs/forecast-performance/samples.json b/tools/inputs/forecast-performance/samples.json
new file mode 100644
index 00000000..34fa1635
--- /dev/null
+++ b/tools/inputs/forecast-performance/samples.json
@@ -0,0 +1,3711 @@
+[
+ {
+ "title": "DayAhead Backcast Report February 2026",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/MidTerm_Load_Metrics_Feb26.xlsx",
+ "sourceSha256": "8c3efa658db548e261ce814a42a7d1b3c030074eea0a8608b5530e780fb418e6",
+ "member": "e5474a2c60d1-MidTerm_Load_Metrics_Feb26.xlsx",
+ "fixtureSha256": "1431fffd00279c0d177072ef48fd5e64f84d0669e547ef8d77cee902f32e9f47",
+ "retainedRows": {
+ "xl/worksheets/sheet4.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet5.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet6.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet7.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet8.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet9.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet1.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet2.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet3.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ]
+ }
+ },
+ {
+ "title": "DayAhead Backcast Report January 2026",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/MidTerm_Load_Metrics_Jan26.xlsx",
+ "sourceSha256": "de1a9b959cc85693ee2273ec4ccf3227161841bd73c2201717a6cd8ff46b7d5a",
+ "member": "555eb6814b53-MidTerm_Load_Metrics_Jan26.xlsx",
+ "fixtureSha256": "9aa5da730d255e0da975dae86d417813582e6309b1c90e8f7095f811d069b640",
+ "retainedRows": {
+ "xl/worksheets/sheet4.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet5.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet6.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet7.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet8.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet9.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet1.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet2.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet3.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ]
+ }
+ },
+ {
+ "title": "Metrics - November 2025",
+ "url": "https://www.ercot.com/files/docs/2025/12/03/Mid_Term_Load_Forecast_Metrics_Nov_2025.xlsx",
+ "sourceSha256": "efe07154f1e0ad66c7ce408b25b4b29635471a0680fc8a1686427a87e113cd93",
+ "member": "32b25ba27c56-Mid_Term_Load_Forecast_Metrics_Nov_2025.xlsx",
+ "fixtureSha256": "a800376688dd382447772835138f29177c592a4f693b3caaecd5ed25983e29f9",
+ "retainedRows": {
+ "xl/worksheets/sheet1.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet2.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet3.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet4.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet5.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet6.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet7.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet8.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 720,
+ 721
+ ],
+ "xl/worksheets/sheet9.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 745,
+ 746
+ ]
+ }
+ },
+ {
+ "title": "Metrtics - June 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/Mid_Term_Load_Forecast_Metrics_June_2025.xlsx",
+ "sourceSha256": "413c43cc4c33f5e809a9a95925df54dbf0979a21cd7c00a300ddad71ea6fde3b",
+ "member": "8793c1310567-Mid_Term_Load_Forecast_Metrics_June_2025.xlsx",
+ "fixtureSha256": "97fcd4434ace24652477512b0224335d587e42290783205c9c5b1b6dca257616",
+ "retainedRows": {
+ "xl/worksheets/sheet1.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet2.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet3.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet4.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet5.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet6.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet7.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet8.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet9.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746
+ ]
+ }
+ },
+ {
+ "title": "Metrics - February 2022",
+ "url": "https://www.ercot.com/files/docs/2022/03/11/Mid_Term_Load_Forecast_Metrics_February_2022.xlsx",
+ "sourceSha256": "2e726f254094db2f9178bca35dc1d16cc7e2c27f06728d691884e2187cd34470",
+ "member": "98606499a199-Mid_Term_Load_Forecast_Metrics_February_2022.xlsx",
+ "fixtureSha256": "8ac9acca798f62b8ecda2fab9e5ad57dbc5385f845415d9ffd29310647e6eb12",
+ "retainedRows": {
+ "xl/worksheets/sheet1.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet2.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet3.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet4.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet5.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet6.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet7.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet8.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ],
+ "xl/worksheets/sheet9.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 672,
+ 673
+ ]
+ }
+ },
+ {
+ "title": "Metrics - December 2023",
+ "url": "https://www.ercot.com/files/docs/2024/02/02/Mid_Term_Load_Forecast_Metrics_Dec_2023.xlsb.xlsx",
+ "sourceSha256": "bf526287cdb1ba74fb15fcbb303992fed4d07069ce6b8f52f1f8b3e3dc6da742",
+ "member": "b71a544e2c34-Mid_Term_Load_Forecast_Metrics_Dec_2023.xlsb.xlsx",
+ "fixtureSha256": "a48f3f3c3bad83552143a5ce16b2b7016af2299ecaa4ba4cd4fd68c09e8ffbe2",
+ "retainedRows": {
+ "xl/worksheets/sheet1.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet2.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet3.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet4.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet5.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet6.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet7.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet8.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ],
+ "xl/worksheets/sheet9.xml": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 744,
+ 745
+ ]
+ }
+ }
+]
diff --git a/tools/inputs/forecast-performance/samples.zip b/tools/inputs/forecast-performance/samples.zip
new file mode 100644
index 00000000..f5757945
Binary files /dev/null and b/tools/inputs/forecast-performance/samples.zip differ
diff --git a/tools/inputs/forecast-performance/sources.json b/tools/inputs/forecast-performance/sources.json
new file mode 100644
index 00000000..26ce262e
--- /dev/null
+++ b/tools/inputs/forecast-performance/sources.json
@@ -0,0 +1,290 @@
+[
+ {
+ "title": "DayAhead Backcast Report February 2026",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/MidTerm_Load_Metrics_Feb26.xlsx",
+ "bytes": 702982,
+ "sha256": "8c3efa658db548e261ce814a42a7d1b3c030074eea0a8608b5530e780fb418e6"
+ },
+ {
+ "title": "DayAhead Backcast Report January 2026",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/MidTerm_Load_Metrics_Jan26.xlsx",
+ "bytes": 769470,
+ "sha256": "de1a9b959cc85693ee2273ec4ccf3227161841bd73c2201717a6cd8ff46b7d5a"
+ },
+ {
+ "title": "Metrics - November 2025",
+ "url": "https://www.ercot.com/files/docs/2025/12/03/Mid_Term_Load_Forecast_Metrics_Nov_2025.xlsx",
+ "bytes": 1558681,
+ "sha256": "efe07154f1e0ad66c7ce408b25b4b29635471a0680fc8a1686427a87e113cd93"
+ },
+ {
+ "title": "Metrics - October 2025",
+ "url": "https://www.ercot.com/files/docs/2025/11/05/Mid_Term_Load_Forecast_Metrics_Oct_2025.xlsx",
+ "bytes": 1596396,
+ "sha256": "3d732d85cd756f8b737b3e74b5afcb12614346c676c3a46473241d6532edbc13"
+ },
+ {
+ "title": "Metrics - September 2025",
+ "url": "https://www.ercot.com/files/docs/2025/10/03/Mid_Term_Load_Forecast_Metrics_Sep_2025.xlsx",
+ "bytes": 1554072,
+ "sha256": "0ab801107db10ffd66dec85e0a37c2f2e42f0844b9bcbef50612a62599c49fac"
+ },
+ {
+ "title": "Metrics - Aug 2025",
+ "url": "https://www.ercot.com/files/docs/2025/09/08/Mid_Term_Load_Forecast_Metrics_Aug_2025.xlsx",
+ "bytes": 1598146,
+ "sha256": "364c57826cb6e77e3efa78fc759c0e23e76aec6cb26c4892cbd0aa0435f88664"
+ },
+ {
+ "title": "Metrics - July 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/Mid_Term_Load_Forecast_Metrics_July_2025.xlsx",
+ "bytes": 1592422,
+ "sha256": "84b3d9e582e77721ca7b64529facf7cc6df461709928ddcf04ef1e36f8a176d1"
+ },
+ {
+ "title": "Metrtics - June 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/Mid_Term_Load_Forecast_Metrics_June_2025.xlsx",
+ "bytes": 1571998,
+ "sha256": "413c43cc4c33f5e809a9a95925df54dbf0979a21cd7c00a300ddad71ea6fde3b"
+ },
+ {
+ "title": "Metrics - May 2025",
+ "url": "https://www.ercot.com/files/docs/2025/06/12/Mid_Term_Load_Forecast_Metrics_May_2025.xlsb.xlsx",
+ "bytes": 1598355,
+ "sha256": "cf84a9c5249fb9374edff51f714bd902977f0947ba450a323220768b149da4a2"
+ },
+ {
+ "title": "Metrics - April 2025",
+ "url": "https://www.ercot.com/files/docs/2025/05/05/Mid_Term_Load_Forecast_Metrics.xlsb.xlsx",
+ "bytes": 1556750,
+ "sha256": "ebe3d373d5682d04ccde43903a1704bff94ac7851a8eb3f7f7db18fff0f3460e"
+ },
+ {
+ "title": "Metrics - March 2025",
+ "url": "https://www.ercot.com/files/docs/2025/04/07/Mid_Term_Load_Forecast_Metrics_Mar_2025.xlsb.xlsx",
+ "bytes": 1602523,
+ "sha256": "da4a3fc6718302e9bbbbf38e254ca8fa5d3d500a1e78705a5dfaddf21feb86f5"
+ },
+ {
+ "title": "Metrics - February 2025",
+ "url": "https://www.ercot.com/files/docs/2025/03/21/Mid_Term_Load_Forecast_Metrics_Feb_2025.xlsb.xlsx",
+ "bytes": 1475916,
+ "sha256": "c190e032a037f07efdd0a1cb180b5ea55c82e28d07f69042cf3bfe2e109ce563"
+ },
+ {
+ "title": "Metrics - January 2025",
+ "url": "https://www.ercot.com/files/docs/2025/02/04/mid_term_load_forecast_metrics_jan_2025-xlsb.xlsx",
+ "bytes": 1608019,
+ "sha256": "10f5264e2290f72fd3d1282bfa7b79b6286e6cb2db9d30cba4d36366c7d37030"
+ },
+ {
+ "title": "Metrics - February 2022",
+ "url": "https://www.ercot.com/files/docs/2022/03/11/Mid_Term_Load_Forecast_Metrics_February_2022.xlsx",
+ "bytes": 1433203,
+ "sha256": "2e726f254094db2f9178bca35dc1d16cc7e2c27f06728d691884e2187cd34470"
+ },
+ {
+ "title": "Metrics - March 2022",
+ "url": "https://www.ercot.com/files/docs/2022/04/20/Mid_Term_Load_Forecast_Metrics_March_2022.xlsx",
+ "bytes": 1569615,
+ "sha256": "36a61d3719dafde8ba449b10084f2718e4546f1d6d2fbb6b499e45b8855fbdcc"
+ },
+ {
+ "title": "Metrics - April 2022",
+ "url": "https://www.ercot.com/files/docs/2022/06/16/Mid_Term_Load_Forecast_Metrics_April_2022.xlsx",
+ "bytes": 1539076,
+ "sha256": "432c1317b8e3be23653dc5bb5c5fd2fa4b72f016846d5d6bf2ce435910cb03c9"
+ },
+ {
+ "title": "Metrics - May 2022",
+ "url": "https://www.ercot.com/files/docs/2022/06/16/Mid_Term_Load_Forecast_Metrics_May_2022.xlsx",
+ "bytes": 1562909,
+ "sha256": "c28171905aeedb79b975cc9921f0c28ee75f03e101b458ad049531028e017891"
+ },
+ {
+ "title": "Metrics - June 2022",
+ "url": "https://www.ercot.com/files/docs/2022/07/29/Mid_Term_Load_Forecast_Metrics_June_2022.xlsx",
+ "bytes": 1548585,
+ "sha256": "e00eb40b1682cdd41863c93302a97155dc923220bb60d8bdb67b105978f4350c"
+ },
+ {
+ "title": "Metrics - July 2022",
+ "url": "https://www.ercot.com/files/docs/2024/01/24/Mid_Term_Load_Forecast_Metrics_Jul_2022.xlsx",
+ "bytes": 1571836,
+ "sha256": "152349d77caeaa8f6e9d8f48f88cfe1d92ff61efabc35e4667d7ec3a9b78627f"
+ },
+ {
+ "title": "Metrics - August 2022",
+ "url": "https://www.ercot.com/files/docs/2022/09/23/Mid_Term_Load_Forecast_Metrics_Aug_2022.xlsx",
+ "bytes": 1570894,
+ "sha256": "079c74b9d41f0fa5a42a5c9b63373d35a9a5925f1fc22813da44c261baed05ed"
+ },
+ {
+ "title": "Metrics - September 2022",
+ "url": "https://www.ercot.com/files/docs/2022/10/21/Mid_Term_Load_Forecast_Metrics_Sep_2022.xlsx",
+ "bytes": 1546512,
+ "sha256": "49bbfe7069f95eb5e6460f5b5c9fe3ab8382f2845bb042ad05ecdb4d448df783"
+ },
+ {
+ "title": "Metrics - October 2022",
+ "url": "https://www.ercot.com/files/docs/2022/11/30/Mid_Term_Load_Forecast_Metrics_Oct_2022.xlsx",
+ "bytes": 1574875,
+ "sha256": "2c33f81bc0d08a24a495537da534cb1eb2100eff9fbde8c064ad430d0874b224"
+ },
+ {
+ "title": "Metrics - November 2022",
+ "url": "https://www.ercot.com/files/docs/2023/01/13/Mid_Term_Load_Forecast_Metrics_Nov_2022.xlsx",
+ "bytes": 1608257,
+ "sha256": "9c7fd4fe950853389e1bcee6e512fb39f93c27c058a450151442981678644696"
+ },
+ {
+ "title": "Metrics - December 2022",
+ "url": "https://www.ercot.com/files/docs/2023/01/13/Mid-Term-Load-Forecast-Metrics-Dec-2022.xlsx",
+ "bytes": 1572777,
+ "sha256": "34d8ce33ba0d751ad67d459bb8543260e696dca74bfb7b60defbe7b7d18e0081"
+ },
+ {
+ "title": "Metrics - January 2023",
+ "url": "https://www.ercot.com/files/docs/2023/02/15/Mid_Term_Load_Forecast_Metrics_Jan_2023.xlsx",
+ "bytes": 1597291,
+ "sha256": "21ef65fe2c31c590f80fc3916474d3d84ea7ed2b9fef9ef163722e2bec67123f"
+ },
+ {
+ "title": "Metrics - February 2023",
+ "url": "https://www.ercot.com/files/docs/2023/03/29/Mid-Term-Load-Forecast-Metrics-Feb-2023.xlsx",
+ "bytes": 1461853,
+ "sha256": "5c8221e25d58cec2197d35b6ac1c179df79415d4934b6fdc9eb6db4f52fbffe0"
+ },
+ {
+ "title": "Metrics - March 2023",
+ "url": "https://www.ercot.com/files/docs/2023/04/26/Mid_Term_Load_Forecast_Metrics_Mar_2023.xlsx",
+ "bytes": 1604874,
+ "sha256": "3106ba32bfd7aa5f9f2b924ffb6e4aea5592cf372e10245f722fbb0b87fbebc2"
+ },
+ {
+ "title": "Metrics - April 2023",
+ "url": "https://www.ercot.com/files/docs/2023/06/23/Mid_Term_Load_Forecast_Metrics_Apr_2023.xlsx",
+ "bytes": 1552796,
+ "sha256": "07c03eee80df7bfbffaaff21f12dba0269d59c2426dff5b57c1024aab1e4fc60"
+ },
+ {
+ "title": "Metrics - May 2023",
+ "url": "https://www.ercot.com/files/docs/2023/06/21/Mid_Term_Load_Forecast_Metrics_May_2023.xlsx",
+ "bytes": 1586989,
+ "sha256": "712de85fd661cc03637c6de6007779dc5ce7d4daff5b0d289cff15aad3d2bfd6"
+ },
+ {
+ "title": "Metrics - June 2023",
+ "url": "https://www.ercot.com/files/docs/2023/07/14/Mid_Term_Load_Forecast_Metrics_Jun_2023.xlsx",
+ "bytes": 1590991,
+ "sha256": "2c0ed06e97e34428227bee8d21ca858d3b755388b2a5a869a55b391da05a86b3"
+ },
+ {
+ "title": "Metrics - July 2023",
+ "url": "https://www.ercot.com/files/docs/2023/08/21/Mid_Term_Load_Forecast_Metrics_July_2023.xlsx",
+ "bytes": 1593353,
+ "sha256": "5f23629eee804e80e2ad9cf476f8544c20831ab9113350114e12d746ecc3d662"
+ },
+ {
+ "title": "Metrics - August 2023",
+ "url": "https://www.ercot.com/files/docs/2023/10/20/Mid_Term_Load_Forecast_Metrics_Aug_2023.xlsx",
+ "bytes": 1590599,
+ "sha256": "9328e8c64d2f9280f2335ae9386e85eed5890136e6f61794707d44d484cb9227"
+ },
+ {
+ "title": "Metrics - September 2023",
+ "url": "https://www.ercot.com/files/docs/2023/10/20/Mid_Term_Load_Forecast_Metrics_Sep_2023.xlsx",
+ "bytes": 1594688,
+ "sha256": "9dec775c09bfd24d5165c93f7f289bcfc1f6bf9a537122e50318fca0bb65e0ef"
+ },
+ {
+ "title": "Metrics - October 2023",
+ "url": "https://www.ercot.com/files/docs/2023/11/29/Mid_Term_Load_Forecast_Metrics_Oct_2023.xlsx",
+ "bytes": 1593905,
+ "sha256": "1feaa6402ffeeb333676910514b468e1092e8ecb4fbefe38af2e74110495302c"
+ },
+ {
+ "title": "Metrics - November 2023",
+ "url": "https://www.ercot.com/files/docs/2024/01/24/Mid_Term_Load_Forecast_Metrics_Nov_2023.xlsx",
+ "bytes": 1552050,
+ "sha256": "fbe185d498c4845bbd1e9c2d7fc26e9e0c3f18867c310d143efd9fad010d090a"
+ },
+ {
+ "title": "Metrics - December 2023",
+ "url": "https://www.ercot.com/files/docs/2024/02/02/Mid_Term_Load_Forecast_Metrics_Dec_2023.xlsb.xlsx",
+ "bytes": 1595609,
+ "sha256": "bf526287cdb1ba74fb15fcbb303992fed4d07069ce6b8f52f1f8b3e3dc6da742"
+ },
+ {
+ "title": "Metrics - January 2024",
+ "url": "https://www.ercot.com/files/docs/2024/02/20/Mid_Term_Load_Forecast_Metrics_Jan_2024.xlsb.xlsx",
+ "bytes": 1597911,
+ "sha256": "ea5292c1c2fd1324b727062d302aa2eec82834e92d40b576794da879828599fb"
+ },
+ {
+ "title": "Metrics - February 2024",
+ "url": "https://www.ercot.com/files/docs/2024/03/08/Mid_Term_Load_Forecast_Metrics_Feb_2024.xlsb.xlsx",
+ "bytes": 1510512,
+ "sha256": "cd3cf33bf168ac165b2580956551cf8360e709a48bcd1173ace96bb23253c370"
+ },
+ {
+ "title": "Metrics - March 2024",
+ "url": "https://www.ercot.com/files/docs/2024/04/03/Mid_Term_Load_Forecast_Metrics_Mar_2024.xlsb.xlsx",
+ "bytes": 1549591,
+ "sha256": "e4b37be461a58533f60ac8d4f5dba2ecab19fa27526f88ad9b424eebf3317a7e"
+ },
+ {
+ "title": "Metrics - April 2024",
+ "url": "https://www.ercot.com/files/docs/2024/05/02/Mid_Term_Load_Forecast_Metrics_Apr_2024.xlsb.xlsx",
+ "bytes": 1547883,
+ "sha256": "0605e90b716a859b8097eee2e34c0b860769cb9766dd7b455b443294fa13fac0"
+ },
+ {
+ "title": "Metrics - May 2024",
+ "url": "https://www.ercot.com/files/docs/2024/06/19/Mid_Term_Load_Forecast_Metrics_May_2024.xlsx",
+ "bytes": 1558835,
+ "sha256": "ca2b83f0f1cba664bae996684da51eff204c3ee1411aecb3b8c22b0e20045a27"
+ },
+ {
+ "title": "Metrics - June 2024",
+ "url": "https://www.ercot.com/files/docs/2024/07/01/Mid_Term_Load_Forecast_Metrics_June_2024.xlsx",
+ "bytes": 1552382,
+ "sha256": "ef11199ada5d8d40693f059edc614eeabd42e092ef6187a35c126dbe60cd49cf"
+ },
+ {
+ "title": "Metrics - July 2024",
+ "url": "https://www.ercot.com/files/docs/2024/08/08/Mid_Term_Load_Forecast_Metrics_July_2024.xlsx",
+ "bytes": 1599906,
+ "sha256": "d9b585dbc30ef6d901a843c39592185f26e08c6ae4a07c78cce1d4f91106a70c"
+ },
+ {
+ "title": "Metrics - August 2024",
+ "url": "https://www.ercot.com/files/docs/2024/09/06/Mid_Term_Load_Forecast_Metrics_Aug_2024.xlsx",
+ "bytes": 1594308,
+ "sha256": "792055cf356c9d965f287d11a1767352478d9b908e31935ba4757a49d56935b7"
+ },
+ {
+ "title": "Metrics - September 2024",
+ "url": "https://www.ercot.com/files/docs/2024/10/07/Mid_Term_Load_Forecast_Metrics_Sep_2024.xlsx",
+ "bytes": 1557940,
+ "sha256": "1ec420025b9d358750a8818e84fd14200700bbac9c10028e453ec9e73013bdbc"
+ },
+ {
+ "title": "Metrics - October 2024",
+ "url": "https://www.ercot.com/files/docs/2024/11/14/Mid_Term_Load_Forecast_Metrics_Oct_2024.xlsb.xlsx",
+ "bytes": 1600945,
+ "sha256": "a728b32708119bb5c9f34431239973ed2aa89a27213ab542934302c1740959b6"
+ },
+ {
+ "title": "Metrics - November 2024",
+ "url": "https://www.ercot.com/files/docs/2024/12/05/mid_term_load_forecast_metrics_nov_2024-xlsb.xlsx",
+ "bytes": 1580987,
+ "sha256": "c4e47fbfed5f8c69ce9d65533bbdea3cf47871b5448fbdb2a81b99781bda11c6"
+ },
+ {
+ "title": "Metrics - December 2024",
+ "url": "https://www.ercot.com/files/docs/2025/01/07/Mid_Term_Load_Forecast_Metrics_Dec_2024.xlsb.xlsx",
+ "bytes": 1606290,
+ "sha256": "f6d48b44e557cf7bf6cc7b0b3a5b52d4c5049d0fa98e9b63b5430a1c1375a087"
+ }
+]
diff --git a/tools/inputs/four-cp/allocations.zip b/tools/inputs/four-cp/allocations.zip
new file mode 100644
index 00000000..761a81fa
Binary files /dev/null and b/tools/inputs/four-cp/allocations.zip differ
diff --git a/tools/inputs/four-cp/monthly.zip b/tools/inputs/four-cp/monthly.zip
new file mode 100644
index 00000000..28086d65
Binary files /dev/null and b/tools/inputs/four-cp/monthly.zip differ
diff --git a/tools/inputs/generation-profiles/csv-header-samples.json b/tools/inputs/generation-profiles/csv-header-samples.json
new file mode 100644
index 00000000..f3bc349e
--- /dev/null
+++ b/tools/inputs/generation-profiles/csv-header-samples.json
@@ -0,0 +1,27 @@
+[
+{"href":"https://www.ercot.com/files/docs/2019/11/07/ERCOT_OperationalPlanned_SolarPVProfiles_1980-2018_v2.csv","title":"Solar PV hourly profiles: utility-scale operational and hypothetical plant sites for 1980-2018","url":"https://www.ercot.com/files/docs/2019/11/07/ERCOT_OperationalPlanned_SolarPVProfiles_1980-2018_v2.csv","header":["DATE","TIME_CST","ACACIA_UNIT_1","BOOTLEG_UNIT1","CAPRIDG4_BB_PV","CASL_GAP_UNIT1","ECLIPSE_UNIT1","HELIOS_UNIT1","HOVEY_UNIT1","HOVEY_UNIT2","LASSO_UNIT1","LMESASLR_IVORY","LMESASLR_UNIT1","MISAE_UNIT1","MISAE_UNIT2","PHOEBE_UNIT1","PHOEBE_UNIT2","REROCK_UNIT1","REROCK_UNIT2","RIGGINS_UNIT1","SIRIUS_UNIT1","SIRIUS_UNIT2","SOLARA_UNIT1","SPTX12B_UNIT1","WAYMARK_UNIT1","WEBBER_S_WSP1","OCI_ALM1_UNIT1"],"sample":[["19800101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["19800101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2019/11/08/ERCOT_DistributedSolarPV_Profiles_1980-2018.csv","title":"Solar PV hourly profiles: distributed rooftop for 1980-2018","url":"https://www.ercot.com/files/docs/2019/11/08/ERCOT_DistributedSolarPV_Profiles_1980-2018.csv","header":["DATE","TIME_CST","SITE_01022","SITE_01023","SITE_01024","SITE_02022","SITE_02023","SITE_02024","SITE_03022","SITE_03023","SITE_03024","SITE_04022","SITE_04023","SITE_04024"],"sample":[["19800101","0","0","0","0","0","0","0","0","0","0","0","0","0"],["19800101","100","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Metro-Distributed_1980-2020_CST.csv","title":"ERCOT DGPV Metro Solar PV Profiles 1980-2020","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Metro-Distributed_1980-2020_CST.csv","header":["DATE","TIME","SITE_01022","SITE_01023","SITE_01024","SITE_02022","SITE_02023","SITE_02024","SITE_03022","SITE_03023","SITE_03024","SITE_04022","SITE_04023","SITE_04024"],"sample":[["19800101","0000","0","0","0","0","0","0","0","0","0","0","0","0"],["19800101","0100","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Rural-Distributed_1980-2020_CST.csv","title":"ERCOT DGPV Rural Region Solar PV Profiles 1980-2020","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Rural-Distributed_1980-2020_CST.csv","header":["DATE","TIME","Coastal","Houston","North","Panhandle","South","West"],"sample":[["19800101","0000","0","0","0","0","0","0"],["19800101","0100","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_1980-1989_CST.csv","title":"ERCOT Hypothetical Dual Axis Solar PV Profiles 1980-1989","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_1980-1989_CST.csv","header":["DATE","TIME","DUAL_00004","DUAL_00030","DUAL_00105","DUAL_00136","DUAL_00176","DUAL_00439","DUAL_00509","DUAL_00555","DUAL_00577","DUAL_00647","DUAL_00651","DUAL_00672","DUAL_00704","DUAL_00736","DUAL_00745","DUAL_00805","DUAL_00831","DUAL_00896","DUAL_00903","DUAL_00906","DUAL_00945","DUAL_01008","DUAL_01047","DUAL_01097","DUAL_01115","DUAL_01117","DUAL_01136","DUAL_01158","DUAL_01161","DUAL_01162","DUAL_01217","DUAL_01233","DUAL_01238","DUAL_01309","DUAL_01336","DUAL_01348","DUAL_01403","DUAL_01475","DUAL_01487","DUAL_01488","DUAL_01545","DUAL_01618","DUAL_01633","DUAL_01713","DUAL_01715","DUAL_01720","DUAL_01908","DUAL_01914","DUAL_01919","DUAL_01923","DUAL_01957","DUAL_01980","DUAL_01992","DUAL_01999","DUAL_02010","DUAL_02062","DUAL_02101","DUAL_02134","DUAL_02154","DUAL_02168","DUAL_02173","DUAL_02279","DUAL_02326","DUAL_02338","DUAL_02346","DUAL_02351","DUAL_02405","DUAL_02416","DUAL_02436","DUAL_02437","DUAL_02512","DUAL_02536","DUAL_02548","DUAL_02560","DUAL_02638","DUAL_02688","DUAL_02695","DUAL_02723","DUAL_02740","DUAL_02759","DUAL_02791","DUAL_02804","DUAL_02864","DUAL_02870","DUAL_02916","DUAL_02925","DUAL_02946","DUAL_03005","DUAL_03022","DUAL_03061","DUAL_03062","DUAL_03075","DUAL_03116","DUAL_03188","DUAL_03202","DUAL_03225","DUAL_03236","DUAL_03284","DUAL_03397","DUAL_03399","DUAL_03405","DUAL_03415","DUAL_03443","DUAL_03480","DUAL_03511","DUAL_03839","DUAL_03846","DUAL_04051","DUAL_04156","DUAL_04433","DUAL_04458","DUAL_04515","DUAL_04553","DUAL_04657","DUAL_04671","DUAL_04753","DUAL_04779","DUAL_04831","DUAL_04927","DUAL_04946","DUAL_04963","DUAL_04971","DUAL_05018","DUAL_05044","DUAL_05198","DUAL_05366","DUAL_05375","DUAL_05417","DUAL_05516","DUAL_05597","DUAL_05718","DUAL_05726","DUAL_05790","DUAL_05804","DUAL_05892","DUAL_05922","DUAL_05961","DUAL_06003","DUAL_06025"],"sample":[["19800101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["19800101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_1990-1999_CST.csv","title":"ERCOT Hypothetical Dual Axis Solar PV Profiles 1990-1999","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_1990-1999_CST.csv","header":["DATE","TIME","DUAL_00004","DUAL_00030","DUAL_00105","DUAL_00136","DUAL_00176","DUAL_00439","DUAL_00509","DUAL_00555","DUAL_00577","DUAL_00647","DUAL_00651","DUAL_00672","DUAL_00704","DUAL_00736","DUAL_00745","DUAL_00805","DUAL_00831","DUAL_00896","DUAL_00903","DUAL_00906","DUAL_00945","DUAL_01008","DUAL_01047","DUAL_01097","DUAL_01115","DUAL_01117","DUAL_01136","DUAL_01158","DUAL_01161","DUAL_01162","DUAL_01217","DUAL_01233","DUAL_01238","DUAL_01309","DUAL_01336","DUAL_01348","DUAL_01403","DUAL_01475","DUAL_01487","DUAL_01488","DUAL_01545","DUAL_01618","DUAL_01633","DUAL_01713","DUAL_01715","DUAL_01720","DUAL_01908","DUAL_01914","DUAL_01919","DUAL_01923","DUAL_01957","DUAL_01980","DUAL_01992","DUAL_01999","DUAL_02010","DUAL_02062","DUAL_02101","DUAL_02134","DUAL_02154","DUAL_02168","DUAL_02173","DUAL_02279","DUAL_02326","DUAL_02338","DUAL_02346","DUAL_02351","DUAL_02405","DUAL_02416","DUAL_02436","DUAL_02437","DUAL_02512","DUAL_02536","DUAL_02548","DUAL_02560","DUAL_02638","DUAL_02688","DUAL_02695","DUAL_02723","DUAL_02740","DUAL_02759","DUAL_02791","DUAL_02804","DUAL_02864","DUAL_02870","DUAL_02916","DUAL_02925","DUAL_02946","DUAL_03005","DUAL_03022","DUAL_03061","DUAL_03062","DUAL_03075","DUAL_03116","DUAL_03188","DUAL_03202","DUAL_03225","DUAL_03236","DUAL_03284","DUAL_03397","DUAL_03399","DUAL_03405","DUAL_03415","DUAL_03443","DUAL_03480","DUAL_03511","DUAL_03839","DUAL_03846","DUAL_04051","DUAL_04156","DUAL_04433","DUAL_04458","DUAL_04515","DUAL_04553","DUAL_04657","DUAL_04671","DUAL_04753","DUAL_04779","DUAL_04831","DUAL_04927","DUAL_04946","DUAL_04963","DUAL_04971","DUAL_05018","DUAL_05044","DUAL_05198","DUAL_05366","DUAL_05375","DUAL_05417","DUAL_05516","DUAL_05597","DUAL_05718","DUAL_05726","DUAL_05790","DUAL_05804","DUAL_05892","DUAL_05922","DUAL_05961","DUAL_06003","DUAL_06025"],"sample":[["19900101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["19900101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2000-2009_CST.csv","title":"ERCOT Hypothetical Dual Axis Solar PV Profiles 2000-2009","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2000-2009_CST.csv","header":["DATE","TIME","DUAL_00004","DUAL_00030","DUAL_00105","DUAL_00136","DUAL_00176","DUAL_00439","DUAL_00509","DUAL_00555","DUAL_00577","DUAL_00647","DUAL_00651","DUAL_00672","DUAL_00704","DUAL_00736","DUAL_00745","DUAL_00805","DUAL_00831","DUAL_00896","DUAL_00903","DUAL_00906","DUAL_00945","DUAL_01008","DUAL_01047","DUAL_01097","DUAL_01115","DUAL_01117","DUAL_01136","DUAL_01158","DUAL_01161","DUAL_01162","DUAL_01217","DUAL_01233","DUAL_01238","DUAL_01309","DUAL_01336","DUAL_01348","DUAL_01403","DUAL_01475","DUAL_01487","DUAL_01488","DUAL_01545","DUAL_01618","DUAL_01633","DUAL_01713","DUAL_01715","DUAL_01720","DUAL_01908","DUAL_01914","DUAL_01919","DUAL_01923","DUAL_01957","DUAL_01980","DUAL_01992","DUAL_01999","DUAL_02010","DUAL_02062","DUAL_02101","DUAL_02134","DUAL_02154","DUAL_02168","DUAL_02173","DUAL_02279","DUAL_02326","DUAL_02338","DUAL_02346","DUAL_02351","DUAL_02405","DUAL_02416","DUAL_02436","DUAL_02437","DUAL_02512","DUAL_02536","DUAL_02548","DUAL_02560","DUAL_02638","DUAL_02688","DUAL_02695","DUAL_02723","DUAL_02740","DUAL_02759","DUAL_02791","DUAL_02804","DUAL_02864","DUAL_02870","DUAL_02916","DUAL_02925","DUAL_02946","DUAL_03005","DUAL_03022","DUAL_03061","DUAL_03062","DUAL_03075","DUAL_03116","DUAL_03188","DUAL_03202","DUAL_03225","DUAL_03236","DUAL_03284","DUAL_03397","DUAL_03399","DUAL_03405","DUAL_03415","DUAL_03443","DUAL_03480","DUAL_03511","DUAL_03839","DUAL_03846","DUAL_04051","DUAL_04156","DUAL_04433","DUAL_04458","DUAL_04515","DUAL_04553","DUAL_04657","DUAL_04671","DUAL_04753","DUAL_04779","DUAL_04831","DUAL_04927","DUAL_04946","DUAL_04963","DUAL_04971","DUAL_05018","DUAL_05044","DUAL_05198","DUAL_05366","DUAL_05375","DUAL_05417","DUAL_05516","DUAL_05597","DUAL_05718","DUAL_05726","DUAL_05790","DUAL_05804","DUAL_05892","DUAL_05922","DUAL_05961","DUAL_06003","DUAL_06025"],"sample":[["20000101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["20000101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2010-2019_CST.csv","title":"ERCOT Hypothetical Dual Axis Solar PV Profiles 2010-2019","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2010-2019_CST.csv","header":["DATE","TIME","DUAL_00004","DUAL_00030","DUAL_00105","DUAL_00136","DUAL_00176","DUAL_00439","DUAL_00509","DUAL_00555","DUAL_00577","DUAL_00647","DUAL_00651","DUAL_00672","DUAL_00704","DUAL_00736","DUAL_00745","DUAL_00805","DUAL_00831","DUAL_00896","DUAL_00903","DUAL_00906","DUAL_00945","DUAL_01008","DUAL_01047","DUAL_01097","DUAL_01115","DUAL_01117","DUAL_01136","DUAL_01158","DUAL_01161","DUAL_01162","DUAL_01217","DUAL_01233","DUAL_01238","DUAL_01309","DUAL_01336","DUAL_01348","DUAL_01403","DUAL_01475","DUAL_01487","DUAL_01488","DUAL_01545","DUAL_01618","DUAL_01633","DUAL_01713","DUAL_01715","DUAL_01720","DUAL_01908","DUAL_01914","DUAL_01919","DUAL_01923","DUAL_01957","DUAL_01980","DUAL_01992","DUAL_01999","DUAL_02010","DUAL_02062","DUAL_02101","DUAL_02134","DUAL_02154","DUAL_02168","DUAL_02173","DUAL_02279","DUAL_02326","DUAL_02338","DUAL_02346","DUAL_02351","DUAL_02405","DUAL_02416","DUAL_02436","DUAL_02437","DUAL_02512","DUAL_02536","DUAL_02548","DUAL_02560","DUAL_02638","DUAL_02688","DUAL_02695","DUAL_02723","DUAL_02740","DUAL_02759","DUAL_02791","DUAL_02804","DUAL_02864","DUAL_02870","DUAL_02916","DUAL_02925","DUAL_02946","DUAL_03005","DUAL_03022","DUAL_03061","DUAL_03062","DUAL_03075","DUAL_03116","DUAL_03188","DUAL_03202","DUAL_03225","DUAL_03236","DUAL_03284","DUAL_03397","DUAL_03399","DUAL_03405","DUAL_03415","DUAL_03443","DUAL_03480","DUAL_03511","DUAL_03839","DUAL_03846","DUAL_04051","DUAL_04156","DUAL_04433","DUAL_04458","DUAL_04515","DUAL_04553","DUAL_04657","DUAL_04671","DUAL_04753","DUAL_04779","DUAL_04831","DUAL_04927","DUAL_04946","DUAL_04963","DUAL_04971","DUAL_05018","DUAL_05044","DUAL_05198","DUAL_05366","DUAL_05375","DUAL_05417","DUAL_05516","DUAL_05597","DUAL_05718","DUAL_05726","DUAL_05790","DUAL_05804","DUAL_05892","DUAL_05922","DUAL_05961","DUAL_06003","DUAL_06025"],"sample":[["20100101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["20100101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2020_CST.csv","title":"ERCOT Hypothetical Dual Axis Solar PV Profiles 2020","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2020_CST.csv","header":["","DATE","TIME","DUAL_00004","DUAL_00030","DUAL_00105","DUAL_00136","DUAL_00176","DUAL_00439","DUAL_00509","DUAL_00555","DUAL_00577","DUAL_00647","DUAL_00651","DUAL_00672","DUAL_00704","DUAL_00736","DUAL_00745","DUAL_00805","DUAL_00831","DUAL_00896","DUAL_00903","DUAL_00906","DUAL_00945","DUAL_01008","DUAL_01047","DUAL_01097","DUAL_01115","DUAL_01117","DUAL_01136","DUAL_01158","DUAL_01161","DUAL_01162","DUAL_01217","DUAL_01233","DUAL_01238","DUAL_01309","DUAL_01336","DUAL_01348","DUAL_01403","DUAL_01475","DUAL_01487","DUAL_01488","DUAL_01545","DUAL_01618","DUAL_01633","DUAL_01713","DUAL_01715","DUAL_01720","DUAL_01908","DUAL_01914","DUAL_01919","DUAL_01923","DUAL_01957","DUAL_01980","DUAL_01992","DUAL_01999","DUAL_02010","DUAL_02062","DUAL_02101","DUAL_02134","DUAL_02154","DUAL_02168","DUAL_02173","DUAL_02279","DUAL_02326","DUAL_02338","DUAL_02346","DUAL_02351","DUAL_02405","DUAL_02416","DUAL_02436","DUAL_02437","DUAL_02512","DUAL_02536","DUAL_02548","DUAL_02560","DUAL_02638","DUAL_02688","DUAL_02695","DUAL_02723","DUAL_02740","DUAL_02759","DUAL_02791","DUAL_02804","DUAL_02864","DUAL_02870","DUAL_02916","DUAL_02925","DUAL_02946","DUAL_03005","DUAL_03022","DUAL_03061","DUAL_03062","DUAL_03075","DUAL_03116","DUAL_03188","DUAL_03202","DUAL_03225","DUAL_03236","DUAL_03284","DUAL_03397","DUAL_03399","DUAL_03405","DUAL_03415","DUAL_03443","DUAL_03480","DUAL_03511","DUAL_03839","DUAL_03846","DUAL_04051","DUAL_04156","DUAL_04433","DUAL_04458","DUAL_04515","DUAL_04553","DUAL_04657","DUAL_04671","DUAL_04753","DUAL_04779","DUAL_04831","DUAL_04927","DUAL_04946","DUAL_04963","DUAL_04971","DUAL_05018","DUAL_05044","DUAL_05198","DUAL_05366","DUAL_05375","DUAL_05417","DUAL_05516","DUAL_05597","DUAL_05718","DUAL_05726","DUAL_05790","DUAL_05804","DUAL_05892","DUAL_05922","DUAL_05961","DUAL_06003","DUAL_06025"],"sample":[["2020","20200101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["2020","20200101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_1980-1989_CST.csv","title":"ERCOT Hypothetical Single Axis Solar PV Profiles 1980-1989","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_1980-1989_CST.csv","header":["","DATE","TIME","SINGLE_00004","SINGLE_00030","SINGLE_00105","SINGLE_00136","SINGLE_00176","SINGLE_00439","SINGLE_00509","SINGLE_00555","SINGLE_00577","SINGLE_00647","SINGLE_00651","SINGLE_00672","SINGLE_00704","SINGLE_00736","SINGLE_00745","SINGLE_00805","SINGLE_00831","SINGLE_00896","SINGLE_00903","SINGLE_00906","SINGLE_00945","SINGLE_01008","SINGLE_01047","SINGLE_01097","SINGLE_01115","SINGLE_01117","SINGLE_01136","SINGLE_01158","SINGLE_01161","SINGLE_01162","SINGLE_01217","SINGLE_01233","SINGLE_01238","SINGLE_01309","SINGLE_01336","SINGLE_01348","SINGLE_01403","SINGLE_01475","SINGLE_01487","SINGLE_01488","SINGLE_01545","SINGLE_01618","SINGLE_01633","SINGLE_01713","SINGLE_01715","SINGLE_01720","SINGLE_01908","SINGLE_01914","SINGLE_01919","SINGLE_01923","SINGLE_01957","SINGLE_01980","SINGLE_01992","SINGLE_01999","SINGLE_02010","SINGLE_02062","SINGLE_02101","SINGLE_02134","SINGLE_02154","SINGLE_02168","SINGLE_02173","SINGLE_02279","SINGLE_02326","SINGLE_02338","SINGLE_02346","SINGLE_02351","SINGLE_02405","SINGLE_02416","SINGLE_02436","SINGLE_02437","SINGLE_02512","SINGLE_02536","SINGLE_02548","SINGLE_02560","SINGLE_02638","SINGLE_02688","SINGLE_02695","SINGLE_02723","SINGLE_02740","SINGLE_02759","SINGLE_02791","SINGLE_02804","SINGLE_02864","SINGLE_02870","SINGLE_02916","SINGLE_02925","SINGLE_02946","SINGLE_03005","SINGLE_03022","SINGLE_03061","SINGLE_03062","SINGLE_03075","SINGLE_03116","SINGLE_03188","SINGLE_03202","SINGLE_03225","SINGLE_03236","SINGLE_03284","SINGLE_03397","SINGLE_03399","SINGLE_03405","SINGLE_03415","SINGLE_03443","SINGLE_03480","SINGLE_03511","SINGLE_03839","SINGLE_03846","SINGLE_04051","SINGLE_04156","SINGLE_04433","SINGLE_04458","SINGLE_04515","SINGLE_04553","SINGLE_04657","SINGLE_04671","SINGLE_04753","SINGLE_04779","SINGLE_04831","SINGLE_04927","SINGLE_04946","SINGLE_04963","SINGLE_04971","SINGLE_05018","SINGLE_05044","SINGLE_05198","SINGLE_05366","SINGLE_05375","SINGLE_05417","SINGLE_05516","SINGLE_05597","SINGLE_05718","SINGLE_05726","SINGLE_05790","SINGLE_05804","SINGLE_05892","SINGLE_05922","SINGLE_05961","SINGLE_06003","SINGLE_06025"],"sample":[["1980","19800101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["1980","19800101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_1990-1999_CST.csv","title":"ERCOT Hypothetical Single Axis Solar PV Profiles 1990-1999","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_1990-1999_CST.csv","header":["DATE","TIME","SINGLE_00004","SINGLE_00030","SINGLE_00105","SINGLE_00136","SINGLE_00176","SINGLE_00439","SINGLE_00509","SINGLE_00555","SINGLE_00577","SINGLE_00647","SINGLE_00651","SINGLE_00672","SINGLE_00704","SINGLE_00736","SINGLE_00745","SINGLE_00805","SINGLE_00831","SINGLE_00896","SINGLE_00903","SINGLE_00906","SINGLE_00945","SINGLE_01008","SINGLE_01047","SINGLE_01097","SINGLE_01115","SINGLE_01117","SINGLE_01136","SINGLE_01158","SINGLE_01161","SINGLE_01162","SINGLE_01217","SINGLE_01233","SINGLE_01238","SINGLE_01309","SINGLE_01336","SINGLE_01348","SINGLE_01403","SINGLE_01475","SINGLE_01487","SINGLE_01488","SINGLE_01545","SINGLE_01618","SINGLE_01633","SINGLE_01713","SINGLE_01715","SINGLE_01720","SINGLE_01908","SINGLE_01914","SINGLE_01919","SINGLE_01923","SINGLE_01957","SINGLE_01980","SINGLE_01992","SINGLE_01999","SINGLE_02010","SINGLE_02062","SINGLE_02101","SINGLE_02134","SINGLE_02154","SINGLE_02168","SINGLE_02173","SINGLE_02279","SINGLE_02326","SINGLE_02338","SINGLE_02346","SINGLE_02351","SINGLE_02405","SINGLE_02416","SINGLE_02436","SINGLE_02437","SINGLE_02512","SINGLE_02536","SINGLE_02548","SINGLE_02560","SINGLE_02638","SINGLE_02688","SINGLE_02695","SINGLE_02723","SINGLE_02740","SINGLE_02759","SINGLE_02791","SINGLE_02804","SINGLE_02864","SINGLE_02870","SINGLE_02916","SINGLE_02925","SINGLE_02946","SINGLE_03005","SINGLE_03022","SINGLE_03061","SINGLE_03062","SINGLE_03075","SINGLE_03116","SINGLE_03188","SINGLE_03202","SINGLE_03225","SINGLE_03236","SINGLE_03284","SINGLE_03397","SINGLE_03399","SINGLE_03405","SINGLE_03415","SINGLE_03443","SINGLE_03480","SINGLE_03511","SINGLE_03839","SINGLE_03846","SINGLE_04051","SINGLE_04156","SINGLE_04433","SINGLE_04458","SINGLE_04515","SINGLE_04553","SINGLE_04657","SINGLE_04671","SINGLE_04753","SINGLE_04779","SINGLE_04831","SINGLE_04927","SINGLE_04946","SINGLE_04963","SINGLE_04971","SINGLE_05018","SINGLE_05044","SINGLE_05198","SINGLE_05366","SINGLE_05375","SINGLE_05417","SINGLE_05516","SINGLE_05597","SINGLE_05718","SINGLE_05726","SINGLE_05790","SINGLE_05804","SINGLE_05892","SINGLE_05922","SINGLE_05961","SINGLE_06003","SINGLE_06025"],"sample":[["19900101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["19900101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2000-2009_CST.csv","title":"ERCOT Hypothetical Single Axis Solar PV Profiles 2000-2009","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2000-2009_CST.csv","header":["DATE","TIME","SINGLE_00004","SINGLE_00030","SINGLE_00105","SINGLE_00136","SINGLE_00176","SINGLE_00439","SINGLE_00509","SINGLE_00555","SINGLE_00577","SINGLE_00647","SINGLE_00651","SINGLE_00672","SINGLE_00704","SINGLE_00736","SINGLE_00745","SINGLE_00805","SINGLE_00831","SINGLE_00896","SINGLE_00903","SINGLE_00906","SINGLE_00945","SINGLE_01008","SINGLE_01047","SINGLE_01097","SINGLE_01115","SINGLE_01117","SINGLE_01136","SINGLE_01158","SINGLE_01161","SINGLE_01162","SINGLE_01217","SINGLE_01233","SINGLE_01238","SINGLE_01309","SINGLE_01336","SINGLE_01348","SINGLE_01403","SINGLE_01475","SINGLE_01487","SINGLE_01488","SINGLE_01545","SINGLE_01618","SINGLE_01633","SINGLE_01713","SINGLE_01715","SINGLE_01720","SINGLE_01908","SINGLE_01914","SINGLE_01919","SINGLE_01923","SINGLE_01957","SINGLE_01980","SINGLE_01992","SINGLE_01999","SINGLE_02010","SINGLE_02062","SINGLE_02101","SINGLE_02134","SINGLE_02154","SINGLE_02168","SINGLE_02173","SINGLE_02279","SINGLE_02326","SINGLE_02338","SINGLE_02346","SINGLE_02351","SINGLE_02405","SINGLE_02416","SINGLE_02436","SINGLE_02437","SINGLE_02512","SINGLE_02536","SINGLE_02548","SINGLE_02560","SINGLE_02638","SINGLE_02688","SINGLE_02695","SINGLE_02723","SINGLE_02740","SINGLE_02759","SINGLE_02791","SINGLE_02804","SINGLE_02864","SINGLE_02870","SINGLE_02916","SINGLE_02925","SINGLE_02946","SINGLE_03005","SINGLE_03022","SINGLE_03061","SINGLE_03062","SINGLE_03075","SINGLE_03116","SINGLE_03188","SINGLE_03202","SINGLE_03225","SINGLE_03236","SINGLE_03284","SINGLE_03397","SINGLE_03399","SINGLE_03405","SINGLE_03415","SINGLE_03443","SINGLE_03480","SINGLE_03511","SINGLE_03839","SINGLE_03846","SINGLE_04051","SINGLE_04156","SINGLE_04433","SINGLE_04458","SINGLE_04515","SINGLE_04553","SINGLE_04657","SINGLE_04671","SINGLE_04753","SINGLE_04779","SINGLE_04831","SINGLE_04927","SINGLE_04946","SINGLE_04963","SINGLE_04971","SINGLE_05018","SINGLE_05044","SINGLE_05198","SINGLE_05366","SINGLE_05375","SINGLE_05417","SINGLE_05516","SINGLE_05597","SINGLE_05718","SINGLE_05726","SINGLE_05790","SINGLE_05804","SINGLE_05892","SINGLE_05922","SINGLE_05961","SINGLE_06003","SINGLE_06025"],"sample":[["20000101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["20000101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2010-2019_CST.csv","title":"ERCOT Hypothetical Single Axis Solar PV Profiles 2010-2019","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2010-2019_CST.csv","header":["DATE","TIME","SINGLE_00004","SINGLE_00030","SINGLE_00105","SINGLE_00136","SINGLE_00176","SINGLE_00439","SINGLE_00509","SINGLE_00555","SINGLE_00577","SINGLE_00647","SINGLE_00651","SINGLE_00672","SINGLE_00704","SINGLE_00736","SINGLE_00745","SINGLE_00805","SINGLE_00831","SINGLE_00896","SINGLE_00903","SINGLE_00906","SINGLE_00945","SINGLE_01008","SINGLE_01047","SINGLE_01097","SINGLE_01115","SINGLE_01117","SINGLE_01136","SINGLE_01158","SINGLE_01161","SINGLE_01162","SINGLE_01217","SINGLE_01233","SINGLE_01238","SINGLE_01309","SINGLE_01336","SINGLE_01348","SINGLE_01403","SINGLE_01475","SINGLE_01487","SINGLE_01488","SINGLE_01545","SINGLE_01618","SINGLE_01633","SINGLE_01713","SINGLE_01715","SINGLE_01720","SINGLE_01908","SINGLE_01914","SINGLE_01919","SINGLE_01923","SINGLE_01957","SINGLE_01980","SINGLE_01992","SINGLE_01999","SINGLE_02010","SINGLE_02062","SINGLE_02101","SINGLE_02134","SINGLE_02154","SINGLE_02168","SINGLE_02173","SINGLE_02279","SINGLE_02326","SINGLE_02338","SINGLE_02346","SINGLE_02351","SINGLE_02405","SINGLE_02416","SINGLE_02436","SINGLE_02437","SINGLE_02512","SINGLE_02536","SINGLE_02548","SINGLE_02560","SINGLE_02638","SINGLE_02688","SINGLE_02695","SINGLE_02723","SINGLE_02740","SINGLE_02759","SINGLE_02791","SINGLE_02804","SINGLE_02864","SINGLE_02870","SINGLE_02916","SINGLE_02925","SINGLE_02946","SINGLE_03005","SINGLE_03022","SINGLE_03061","SINGLE_03062","SINGLE_03075","SINGLE_03116","SINGLE_03188","SINGLE_03202","SINGLE_03225","SINGLE_03236","SINGLE_03284","SINGLE_03397","SINGLE_03399","SINGLE_03405","SINGLE_03415","SINGLE_03443","SINGLE_03480","SINGLE_03511","SINGLE_03839","SINGLE_03846","SINGLE_04051","SINGLE_04156","SINGLE_04433","SINGLE_04458","SINGLE_04515","SINGLE_04553","SINGLE_04657","SINGLE_04671","SINGLE_04753","SINGLE_04779","SINGLE_04831","SINGLE_04927","SINGLE_04946","SINGLE_04963","SINGLE_04971","SINGLE_05018","SINGLE_05044","SINGLE_05198","SINGLE_05366","SINGLE_05375","SINGLE_05417","SINGLE_05516","SINGLE_05597","SINGLE_05718","SINGLE_05726","SINGLE_05790","SINGLE_05804","SINGLE_05892","SINGLE_05922","SINGLE_05961","SINGLE_06003","SINGLE_06025"],"sample":[["20100101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["20100101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2020_CST.csv","title":"ERCOT Hypothetical Single Axis Solar PV Profiles 2020","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2020_CST.csv","header":["DATE","TIME","SINGLE_00004","SINGLE_00030","SINGLE_00105","SINGLE_00136","SINGLE_00176","SINGLE_00439","SINGLE_00509","SINGLE_00555","SINGLE_00577","SINGLE_00647","SINGLE_00651","SINGLE_00672","SINGLE_00704","SINGLE_00736","SINGLE_00745","SINGLE_00805","SINGLE_00831","SINGLE_00896","SINGLE_00903","SINGLE_00906","SINGLE_00945","SINGLE_01008","SINGLE_01047","SINGLE_01097","SINGLE_01115","SINGLE_01117","SINGLE_01136","SINGLE_01158","SINGLE_01161","SINGLE_01162","SINGLE_01217","SINGLE_01233","SINGLE_01238","SINGLE_01309","SINGLE_01336","SINGLE_01348","SINGLE_01403","SINGLE_01475","SINGLE_01487","SINGLE_01488","SINGLE_01545","SINGLE_01618","SINGLE_01633","SINGLE_01713","SINGLE_01715","SINGLE_01720","SINGLE_01908","SINGLE_01914","SINGLE_01919","SINGLE_01923","SINGLE_01957","SINGLE_01980","SINGLE_01992","SINGLE_01999","SINGLE_02010","SINGLE_02062","SINGLE_02101","SINGLE_02134","SINGLE_02154","SINGLE_02168","SINGLE_02173","SINGLE_02279","SINGLE_02326","SINGLE_02338","SINGLE_02346","SINGLE_02351","SINGLE_02405","SINGLE_02416","SINGLE_02436","SINGLE_02437","SINGLE_02512","SINGLE_02536","SINGLE_02548","SINGLE_02560","SINGLE_02638","SINGLE_02688","SINGLE_02695","SINGLE_02723","SINGLE_02740","SINGLE_02759","SINGLE_02791","SINGLE_02804","SINGLE_02864","SINGLE_02870","SINGLE_02916","SINGLE_02925","SINGLE_02946","SINGLE_03005","SINGLE_03022","SINGLE_03061","SINGLE_03062","SINGLE_03075","SINGLE_03116","SINGLE_03188","SINGLE_03202","SINGLE_03225","SINGLE_03236","SINGLE_03284","SINGLE_03397","SINGLE_03399","SINGLE_03405","SINGLE_03415","SINGLE_03443","SINGLE_03480","SINGLE_03511","SINGLE_03839","SINGLE_03846","SINGLE_04051","SINGLE_04156","SINGLE_04433","SINGLE_04458","SINGLE_04515","SINGLE_04553","SINGLE_04657","SINGLE_04671","SINGLE_04753","SINGLE_04779","SINGLE_04831","SINGLE_04927","SINGLE_04946","SINGLE_04963","SINGLE_04971","SINGLE_05018","SINGLE_05044","SINGLE_05198","SINGLE_05366","SINGLE_05375","SINGLE_05417","SINGLE_05516","SINGLE_05597","SINGLE_05718","SINGLE_05726","SINGLE_05790","SINGLE_05804","SINGLE_05892","SINGLE_05922","SINGLE_05961","SINGLE_06003","SINGLE_06025"],"sample":[["20200101","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["20200101","100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Operational-Planned_1980-2020_CST.csv","title":"ERCOT Operational and Planned Solar PV Profiles 1980-2020","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Operational-Planned_1980-2020_CST.csv","header":["DATE","TIME","ACACIA_UNIT_1","BOOTLEG_UNIT1","CAPRIDG4_BB_PV","CASL_GAP_UNIT1","ECLIPSE_UNIT1","HELIOS_UNIT1","HOVEY_UNIT1","HOVEY_UNIT2","LASSO_UNIT1","LMESASLR_IVORY","LMESASLR_UNIT1","MISAE_UNIT1","MISAE_UNIT2","PHOEBE_UNIT1","PHOEBE_UNIT2","REROCK_UNIT1","REROCK_UNIT2","RIGGINS_UNIT1","SIRIUS_UNIT1","SIRIUS_UNIT2","SOLARA_UNIT1","SPTX12B_UNIT1","WAYMARK_UNIT1","WEBBER_S_WSP1","FWLR_SLR_UNIT1","HOLSTEIN_SOLAR1","LAPETUS_UNIT_1","QUEEN_SL_SOLAR1_2","W_PECOS_UNIT1","WGU_UNIT1","LGDRAW_S_UNIT1_1","LGDRAW_S_UNIT1_2","PROSPERO_UNIT1","ANSON1_UNIT1_2","ARAGORN_UNIT1","CAPRIDG4_BB2_PV1_2","CONIGLIO_UNIT1","E_BLACK_UNIT_1","EUNICE_PV1_2","GALLOWAY_SOLAR1","GREASWOD_UNIT1_2","HOLSTEIN_SOLAR2","IMPACT_UNIT1","JUNO_UNIT1_2","KELAM_SL_UNIT1","OBERON_UNIT_1","PHOENIX_UNIT1","PROSPERO_UNIT2","REDBARN_UNIT_1_2","RIPPEY_UNIT1","TAYGETE_UNIT1_2","TI_SOLAR_UNIT1_2","OCI_ALM1_UNIT1"],"sample":[["19800101","0000","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["19800101","0100","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_1980-1989_CST.csv","title":"ERCOT Wind Operational and Planned 1980-1989","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_1980-1989_CST.csv","header":["DATE","TIME","SITE_00001:capacity=99.825","SITE_00002:capacity=163.2","SITE_00003:capacity=202","SITE_00004:capacity=228","SITE_00005:capacity=162","SITE_00007:capacity=19.69","SITE_00008:capacity=230","SITE_00010:capacity=99","SITE_00011:capacity=61","SITE_00012:capacity=149.85","SITE_00013:capacity=120","SITE_00015:capacity=120.6","SITE_00016:capacity=232.5","SITE_00017:capacity=170.2","SITE_00018:capacity=180","SITE_00019:capacity=114","SITE_00020:capacity=165","SITE_00021:capacity=214.5","SITE_00022:capacity=149.5","SITE_00023:capacity=298.5","SITE_00024:capacity=150","SITE_00025:capacity=148.35","SITE_00026:capacity=126.5","SITE_00027:capacity=50.4","SITE_00028:capacity=151.2","SITE_00029:capacity=200.1","SITE_00030:capacity=130.5","SITE_00031:capacity=120","SITE_00032:capacity=253","SITE_00033:capacity=230","SITE_00034:capacity=121.9","SITE_00036:capacity=78","SITE_00037:capacity=92.34","SITE_00038:capacity=121.9","SITE_00039:capacity=27.44","SITE_00040:capacity=60","SITE_00041:capacity=155.4","SITE_00042:capacity=200","SITE_00043:capacity=69.6","SITE_00044:capacity=80","SITE_00045:capacity=150","SITE_00046:capacity=200.48","SITE_00047:capacity=211.22","SITE_00048:capacity=119.93","SITE_00050:capacity=213","SITE_00051:capacity=299","SITE_00052:capacity=223.5","SITE_00053:capacity=300","SITE_00054:capacity=230","SITE_00055:capacity=299.7","SITE_00056:capacity=99.9","SITE_00057:capacity=100","SITE_00058:capacity=165.6","SITE_00059:capacity=197","SITE_00060:capacity=160.5","SITE_00061:capacity=110","SITE_00063:capacity=132","SITE_00064:capacity=78","SITE_00065:capacity=159.9","SITE_00066:capacity=40.3","SITE_00067:capacity=150","SITE_00068:capacity=200.1","SITE_00069:capacity=200","SITE_00071:capacity=200","SITE_00072:capacity=100.5","SITE_00073:capacity=49.5","SITE_00074:capacity=200.1","SITE_00075:capacity=201.6","SITE_00076:capacity=200","SITE_00077:capacity=200","SITE_00078:capacity=110","SITE_00079:capacity=230.4","SITE_00080:capacity=124.2","SITE_00081:capacity=90","SITE_00082:capacity=211.22","SITE_00083:capacity=288.6","SITE_00084:capacity=150","SITE_00085:capacity=100","SITE_00086:capacity=30","SITE_00087:capacity=150","SITE_00088:capacity=196.65","SITE_00090:capacity=60","SITE_00091:capacity=58.8","SITE_00092:capacity=82.5","SITE_00093:capacity=179.85","SITE_00094:capacity=142.5","SITE_00095:capacity=115.5","SITE_00096:capacity=199.5","SITE_00097:capacity=403.2","SITE_00099:capacity=218.3","SITE_00100:capacity=181.7","SITE_00101:capacity=249","SITE_00102:capacity=84","SITE_00103:capacity=203.28","SITE_00104:capacity=150","SITE_00106:capacity=160","SITE_00107:capacity=174","SITE_00108:capacity=250","SITE_00109:capacity=93","SITE_00110:capacity=243","SITE_00111:capacity=150","SITE_00114:capacity=204.085","SITE_00115:capacity=200","SITE_00116:capacity=300.3","SITE_00117:capacity=164.68","SITE_00118:capacity=211.22","SITE_00119:capacity=194","SITE_00120:capacity=160.95","SITE_00121:capacity=101.2","SITE_00123:capacity=120","SITE_00124:capacity=98.82","SITE_00125:capacity=135","SITE_00126:capacity=135","SITE_00127:capacity=105.8","SITE_00128:capacity=80.5","SITE_00129:capacity=37.5","SITE_00130:capacity=283.2","SITE_00131:capacity=209","SITE_00132:capacity=150","SITE_00133:capacity=198","SITE_00134:capacity=169.5","SITE_00135:capacity=119.6","SITE_00136:capacity=150","SITE_00137:capacity=257.25","SITE_00138:capacity=59.8","SITE_00139:capacity=112.5","SITE_00140:capacity=64.4","SITE_00141:capacity=77.22","SITE_00142:capacity=82.5","SITE_02006:capacity=137.7","SITE_02009:capacity=200","SITE_02014:capacity=100.05","SITE_02049:capacity=156.16","SITE_02070:capacity=200","SITE_02089:capacity=92.565","SITE_02105:capacity=206.345","SITE_02112:capacity=34.32","SITE_03000:capacity=210.105","SITE_03001:capacity=350.28","SITE_03002:capacity=307.06","SITE_03003:capacity=183.75","SITE_03004:capacity=162.855","SITE_03005:capacity=237.6","SITE_03006:capacity=30.24","SITE_03007:capacity=201","SITE_03008:capacity=302.4","SITE_03009:capacity=300.5","SITE_04000:capacity=200.2","SITE_04001:capacity=99.36","SITE_04002:capacity=158","SITE_04003:capacity=144.9","SITE_04004:capacity=151.2","SITE_04005:capacity=300","SITE_04006:capacity=199.5","SITE_04007:capacity=502.135"],"sample":[["19800101","0","0","89.115","0.02","0","15.955","1.26","14.158","25.424","10.417","34.428","7.21","23.963","52.907","29.769","10.108","30.587","0","41.176","14.003","39.629","11.041","12.5","27.059","21.329","58.595","0","42.706","41.958","75.435","49.719","10.469","5.007","4.802","23.856","6.596","4.22","51.952","13.445","15.346","15.065","16.652","116.26","92.389","20.972","30.09","41.554","33.36","51.869","48.99","84.318","29.025","33.955","31.358","58.444","57.836","10.341","80.701","16.797","34.342","7.171","41.164","30.406","72.257","39.639","13.998","9.102","1.93","0.882","22.479","22.119","19.547","34.858","16.344","8.052","56.99","180.804","20.822","11.484","5.776","51.267","15.791","2.817","1.33","41.866","0","10.623","7.465","23.66","0","100.959","112.122","60.368","15.123","0.396","58.731","21.987","64.601","102.02","0","0","7.003","17.749","91.428","90.138","38.398","46.518","28.002","32.064","42.266","11.47","35.909","34.284","31.687","19.765","15.25","10.823","0","30.588","61.547","31.868","22.046","25.893","17.802","113.122","22.462","14.792","7.891","38.747","40.604","11.367","14.432","8.883","1.193","32.475","4.546","34.18","1.285","70.292","88.776","1.086","25.341","0","11.636","8.892","0","87.802","38.057","39.083","17.481","35.246","0.009","1.743","124.08","52.773","174.298"],["19800101","100","0.034","94.767","0","0","24.1","2.262","36.938","29.482","13.624","44.676","6.577","39.129","77.207","44.412","13.539","41.006","0","61.468","21.192","60.075","26.468","19.988","34.772","26.968","73.487","0.035","52.881","49.425","82.961","42.733","14.007","9.718","9.422","29.276","7.854","5.57","59.27","21.06","22.461","21.611","22.161","99.547","80.973","37.487","45.576","60.238","51.137","94.043","85.623","93.586","32.81","40.97","43.45","66.475","79.683","21.543","80.783","20.649","37.9","7.313","68.562","41.753","84.105","50.224","17.896","11.147","1.482","0.839","43.46","46.11","25.6","46.913","25.295","16.851","62.014","172.586","19.485","11.504","10.137","56.803","26.161","14.325","2.115","45.215","0","28.854","16.003","42.234","0","98.108","101.81","73.226","19.142","0.552","76.142","48.246","67.136","144.252","0","0","11.754","22.898","101.98","99.335","46.377","55.665","44.419","46.72","62.072","13.172","49.578","40.731","38.878","27.122","19.769","16.669","0","40.86","83.698","48.091","31.2","27.808","27.902","131.747","28.39","15.932","10.848","40.285","45.133","12.296","31.38","16.471","2.038","45.824","20.301","44.686","1.863","69.772","122.032","1.408","28.173","0.09","14.239","10.009","0","115.02","62.585","50.349","22.817","49.947","0","1.354","187.266","79.715","228.918"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_1990-1999_CST.csv","title":"ERCOT Wind Operational and Planned 1990-1999","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_1990-1999_CST.csv","header":["DATE","TIME","SITE_00001:capacity=99.825","SITE_00002:capacity=163.2","SITE_00003:capacity=202","SITE_00004:capacity=228","SITE_00005:capacity=162","SITE_00007:capacity=19.69","SITE_00008:capacity=230","SITE_00010:capacity=99","SITE_00011:capacity=61","SITE_00012:capacity=149.85","SITE_00013:capacity=120","SITE_00015:capacity=120.6","SITE_00016:capacity=232.5","SITE_00017:capacity=170.2","SITE_00018:capacity=180","SITE_00019:capacity=114","SITE_00020:capacity=165","SITE_00021:capacity=214.5","SITE_00022:capacity=149.5","SITE_00023:capacity=298.5","SITE_00024:capacity=150","SITE_00025:capacity=148.35","SITE_00026:capacity=126.5","SITE_00027:capacity=50.4","SITE_00028:capacity=151.2","SITE_00029:capacity=200.1","SITE_00030:capacity=130.5","SITE_00031:capacity=120","SITE_00032:capacity=253","SITE_00033:capacity=230","SITE_00034:capacity=121.9","SITE_00036:capacity=78","SITE_00037:capacity=92.34","SITE_00038:capacity=121.9","SITE_00039:capacity=27.44","SITE_00040:capacity=60","SITE_00041:capacity=155.4","SITE_00042:capacity=200","SITE_00043:capacity=69.6","SITE_00044:capacity=80","SITE_00045:capacity=150","SITE_00046:capacity=200.48","SITE_00047:capacity=211.22","SITE_00048:capacity=119.93","SITE_00050:capacity=213","SITE_00051:capacity=299","SITE_00052:capacity=223.5","SITE_00053:capacity=300","SITE_00054:capacity=230","SITE_00055:capacity=299.7","SITE_00056:capacity=99.9","SITE_00057:capacity=100","SITE_00058:capacity=165.6","SITE_00059:capacity=197","SITE_00060:capacity=160.5","SITE_00061:capacity=110","SITE_00063:capacity=132","SITE_00064:capacity=78","SITE_00065:capacity=159.9","SITE_00066:capacity=40.3","SITE_00067:capacity=150","SITE_00068:capacity=200.1","SITE_00069:capacity=200","SITE_00071:capacity=200","SITE_00072:capacity=100.5","SITE_00073:capacity=49.5","SITE_00074:capacity=200.1","SITE_00075:capacity=201.6","SITE_00076:capacity=200","SITE_00077:capacity=200","SITE_00078:capacity=110","SITE_00079:capacity=230.4","SITE_00080:capacity=124.2","SITE_00081:capacity=90","SITE_00082:capacity=211.22","SITE_00083:capacity=288.6","SITE_00084:capacity=150","SITE_00085:capacity=100","SITE_00086:capacity=30","SITE_00087:capacity=150","SITE_00088:capacity=196.65","SITE_00090:capacity=60","SITE_00091:capacity=58.8","SITE_00092:capacity=82.5","SITE_00093:capacity=179.85","SITE_00094:capacity=142.5","SITE_00095:capacity=115.5","SITE_00096:capacity=199.5","SITE_00097:capacity=403.2","SITE_00099:capacity=218.3","SITE_00100:capacity=181.7","SITE_00101:capacity=249","SITE_00102:capacity=84","SITE_00103:capacity=203.28","SITE_00104:capacity=150","SITE_00106:capacity=160","SITE_00107:capacity=174","SITE_00108:capacity=250","SITE_00109:capacity=93","SITE_00110:capacity=243","SITE_00111:capacity=150","SITE_00114:capacity=204.085","SITE_00115:capacity=200","SITE_00116:capacity=300.3","SITE_00117:capacity=164.68","SITE_00118:capacity=211.22","SITE_00119:capacity=194","SITE_00120:capacity=160.95","SITE_00121:capacity=101.2","SITE_00123:capacity=120","SITE_00124:capacity=98.82","SITE_00125:capacity=135","SITE_00126:capacity=135","SITE_00127:capacity=105.8","SITE_00128:capacity=80.5","SITE_00129:capacity=37.5","SITE_00130:capacity=283.2","SITE_00131:capacity=209","SITE_00132:capacity=150","SITE_00133:capacity=198","SITE_00134:capacity=169.5","SITE_00135:capacity=119.6","SITE_00136:capacity=150","SITE_00137:capacity=257.25","SITE_00138:capacity=59.8","SITE_00139:capacity=112.5","SITE_00140:capacity=64.4","SITE_00141:capacity=77.22","SITE_00142:capacity=82.5","SITE_02006:capacity=137.7","SITE_02009:capacity=200","SITE_02014:capacity=100.05","SITE_02049:capacity=156.16","SITE_02070:capacity=200","SITE_02089:capacity=92.565","SITE_02105:capacity=206.345","SITE_02112:capacity=34.32","SITE_03000:capacity=210.105","SITE_03001:capacity=350.28","SITE_03002:capacity=307.06","SITE_03003:capacity=183.75","SITE_03004:capacity=162.855","SITE_03005:capacity=237.6","SITE_03006:capacity=30.24","SITE_03007:capacity=201","SITE_03008:capacity=302.4","SITE_03009:capacity=300.5","SITE_04000:capacity=200.2","SITE_04001:capacity=99.36","SITE_04002:capacity=158","SITE_04003:capacity=144.9","SITE_04004:capacity=151.2","SITE_04005:capacity=300","SITE_04006:capacity=199.5","SITE_04007:capacity=502.135"],"sample":[["19900101","0","0.445","116.083","30.665","47.806","17.565","0.059","5.848","5.406","1.813","36.767","16.531","3.864","11.423","7.729","0.615","6.956","47.041","17.452","7.555","11.458","6.311","4.249","5.798","10.645","14.989","30.023","29.93","26.929","41.41","0","17.306","0.286","4.547","1.743","0.16","5.033","32.465","17.866","5.4","5.561","0.604","51.776","51.23","30.266","8.617","10.571","8.218","4.999","22.157","163.432","54.264","70.207","31.231","11.869","0","33.207","0","0","0","0","0.799","33.263","55.723","29.191","1.407","0.707","48.238","41.088","0.549","0.127","0.461","192.646","9.889","6.15","15.025","8.363","5.278","7.194","2.933","20.416","9.165","1.009","2.717","0.002","29.45","9.227","10.162","14.337","74.828","36.529","42.09","23.212","5.467","54.668","43.114","5.891","22.695","46.659","17.698","15.404","27.279","27.115","31.072","23.79","9.302","9.962","183.359","133.796","10.358","23.899","9.497","1.013","5.808","4.491","6.173","4.025","41.234","1.443","10.145","29.892","7.989","68.821","3.822","42.988","15.099","42.807","9.114","0","0","0","14.749","19.917","6.511","31.806","0.536","12.51","2.172","157.593","7.988","23.903","0","33.397","0","1.041","44.705","52.809","35.501","3.86","0","27.752","23.36","29.929","1.795","6.727","0.329"],["19900101","100","0","139.15","29.075","44.733","3.857","0","2.011","11.407","8.359","32.213","11.908","1.892","7.497","8.257","1.004","5.007","53.257","18.843","7.941","11.863","2.119","2.516","7.455","12.527","19.921","21.605","35.356","31.786","74.046","0","24.157","0","1.728","3.083","0.416","2.764","52.985","19.318","5.746","5.455","0.375","64.625","71.632","41.538","6.388","11.501","9.478","4.562","10.025","172.067","58.819","73.098","32.34","21.987","0","21.274","0","0","0","0","0.153","36.2","54.039","32.077","2.356","1.1","47.753","35.722","0.19","0","0.222","215.713","11.691","7.065","19.933","10.373","5.675","6.006","3.392","28.311","10.339","3.079","5.313","0","16.189","11.472","12.15","17.899","76.787","50.352","54.194","30.839","8.38","45.261","65.529","3.984","32.816","52.482","15.525","25.116","10.38","3.912","52.419","63.368","11.328","13.689","183.236","140.399","9.229","25.179","12.74","5.074","8.482","6.547","5.149","4.067","38.316","5.553","10.215","13.032","8.147","25.901","2.107","56.641","17.775","16.17","3.635","0","0","0","6.315","14.612","6.633","33.536","4.694","13.954","4.655","198.417","9.09","12.913","0","25.307","0","0.095","42.351","62.053","18.77","3.328","0","40.834","31.289","25.871","0.03","2.759","0.001"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2000-2009_CST.csv","title":"ERCOT Wind Operational and Planned 2000-2009","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2000-2009_CST.csv","header":["DATE","TIME","SITE_00001:capacity=99.825","SITE_00002:capacity=163.2","SITE_00003:capacity=202","SITE_00004:capacity=228","SITE_00005:capacity=162","SITE_00007:capacity=19.69","SITE_00008:capacity=230","SITE_00010:capacity=99","SITE_00011:capacity=61","SITE_00012:capacity=149.85","SITE_00013:capacity=120","SITE_00015:capacity=120.6","SITE_00016:capacity=232.5","SITE_00017:capacity=170.2","SITE_00018:capacity=180","SITE_00019:capacity=114","SITE_00020:capacity=165","SITE_00021:capacity=214.5","SITE_00022:capacity=149.5","SITE_00023:capacity=298.5","SITE_00024:capacity=150","SITE_00025:capacity=148.35","SITE_00026:capacity=126.5","SITE_00027:capacity=50.4","SITE_00028:capacity=151.2","SITE_00029:capacity=200.1","SITE_00030:capacity=130.5","SITE_00031:capacity=120","SITE_00032:capacity=253","SITE_00033:capacity=230","SITE_00034:capacity=121.9","SITE_00036:capacity=78","SITE_00037:capacity=92.34","SITE_00038:capacity=121.9","SITE_00039:capacity=27.44","SITE_00040:capacity=60","SITE_00041:capacity=155.4","SITE_00042:capacity=200","SITE_00043:capacity=69.6","SITE_00044:capacity=80","SITE_00045:capacity=150","SITE_00046:capacity=200.48","SITE_00047:capacity=211.22","SITE_00048:capacity=119.93","SITE_00050:capacity=213","SITE_00051:capacity=299","SITE_00052:capacity=223.5","SITE_00053:capacity=300","SITE_00054:capacity=230","SITE_00055:capacity=299.7","SITE_00056:capacity=99.9","SITE_00057:capacity=100","SITE_00058:capacity=165.6","SITE_00059:capacity=197","SITE_00060:capacity=160.5","SITE_00061:capacity=110","SITE_00063:capacity=132","SITE_00064:capacity=78","SITE_00065:capacity=159.9","SITE_00066:capacity=40.3","SITE_00067:capacity=150","SITE_00068:capacity=200.1","SITE_00069:capacity=200","SITE_00071:capacity=200","SITE_00072:capacity=100.5","SITE_00073:capacity=49.5","SITE_00074:capacity=200.1","SITE_00075:capacity=201.6","SITE_00076:capacity=200","SITE_00077:capacity=200","SITE_00078:capacity=110","SITE_00079:capacity=230.4","SITE_00080:capacity=124.2","SITE_00081:capacity=90","SITE_00082:capacity=211.22","SITE_00083:capacity=288.6","SITE_00084:capacity=150","SITE_00085:capacity=100","SITE_00086:capacity=30","SITE_00087:capacity=150","SITE_00088:capacity=196.65","SITE_00090:capacity=60","SITE_00091:capacity=58.8","SITE_00092:capacity=82.5","SITE_00093:capacity=179.85","SITE_00094:capacity=142.5","SITE_00095:capacity=115.5","SITE_00096:capacity=199.5","SITE_00097:capacity=403.2","SITE_00099:capacity=218.3","SITE_00100:capacity=181.7","SITE_00101:capacity=249","SITE_00102:capacity=84","SITE_00103:capacity=203.28","SITE_00104:capacity=150","SITE_00106:capacity=160","SITE_00107:capacity=174","SITE_00108:capacity=250","SITE_00109:capacity=93","SITE_00110:capacity=243","SITE_00111:capacity=150","SITE_00114:capacity=204.085","SITE_00115:capacity=200","SITE_00116:capacity=300.3","SITE_00117:capacity=164.68","SITE_00118:capacity=211.22","SITE_00119:capacity=194","SITE_00120:capacity=160.95","SITE_00121:capacity=101.2","SITE_00123:capacity=120","SITE_00124:capacity=98.82","SITE_00125:capacity=135","SITE_00126:capacity=135","SITE_00127:capacity=105.8","SITE_00128:capacity=80.5","SITE_00129:capacity=37.5","SITE_00130:capacity=283.2","SITE_00131:capacity=209","SITE_00132:capacity=150","SITE_00133:capacity=198","SITE_00134:capacity=169.5","SITE_00135:capacity=119.6","SITE_00136:capacity=150","SITE_00137:capacity=257.25","SITE_00138:capacity=59.8","SITE_00139:capacity=112.5","SITE_00140:capacity=64.4","SITE_00141:capacity=77.22","SITE_00142:capacity=82.5","SITE_02006:capacity=137.7","SITE_02009:capacity=200","SITE_02014:capacity=100.05","SITE_02049:capacity=156.16","SITE_02070:capacity=200","SITE_02089:capacity=92.565","SITE_02105:capacity=206.345","SITE_02112:capacity=34.32","SITE_03000:capacity=210.105","SITE_03001:capacity=350.28","SITE_03002:capacity=307.06","SITE_03003:capacity=183.75","SITE_03004:capacity=162.855","SITE_03005:capacity=237.6","SITE_03006:capacity=30.24","SITE_03007:capacity=201","SITE_03008:capacity=302.4","SITE_03009:capacity=300.5","SITE_04000:capacity=200.2","SITE_04001:capacity=99.36","SITE_04002:capacity=158","SITE_04003:capacity=144.9","SITE_04004:capacity=151.2","SITE_04005:capacity=300","SITE_04006:capacity=199.5","SITE_04007:capacity=502.135"],"sample":[["20000101","0","51.107","149.262","34.685","44.184","129.952","14.572","196.923","0.847","0","130.73","38.564","94.617","179.849","112.948","0.463","83.525","38.769","142.814","43.152","122.87","121.476","101.919","116.27","48.112","141.993","14.156","117.646","106.416","0","164.14","111.402","64.056","60.961","100.104","23.614","33.738","0","148.497","44.592","49.524","125.001","162.707","190.992","0","118.972","152.811","113.892","275.402","180.111","218.98","74.707","82.312","153.032","188.037","115.378","64.702","77.128","39.312","73.883","17.589","138.073","148.373","158.403","168.905","86.485","45.639","45.296","37.239","88.969","107.735","47.582","189.209","87.452","69.403","0.844","258.752","53.942","29.312","23.83","141.457","153.053","56.717","45.133","50.999","9.335","125.905","105.953","99.637","71.069","206.541","173.422","235.14","3.105","56.496","138.164","137.041","125.761","238.633","22.208","40.681","85.494","109.737","183.334","272.137","1.837","2.022","169.255","130.127","86.12","0","94.317","108.21","96.928","73.075","50.281","28.975","32.281","182.558","122.179","147.209","59.935","50.683","124.03","245.565","52.23","41.041","58.524","47.472","48.555","27.378","166.935","64.379","63.472","174.188","76.74","191.243","23.058","191.73","268.149","71.715","140.534","17.651","116.274","28.864","36.416","5.945","241.899","139.501","72.684","3.13","33.869","0.877","276.466","173.978","403.497"],["20000101","100","62.531","142.727","33.797","40.527","139.2","14.591","194.976","0.849","0","129.799","45.788","95.813","191.909","120.54","0.432","83.525","39.455","146.799","42.794","121.549","121.397","101.922","115.992","48.112","142.029","11.948","117.496","105.873","0","190.195","111.74","65.953","60.203","116.333","23.648","36.253","0","178.799","50.745","49.883","125.001","162.713","190.906","0","111.481","148.111","125.615","275.402","191.053","235.653","79.96","82.424","153.081","188.037","115.354","90.202","77.127","37.397","77.239","15.133","138.567","175.438","158.403","169.869","80.339","45.022","43.464","40.851","82.677","106.621","46.413","187.514","94.485","70.799","0.844","258.01","43.483","25.029","23.416","143.161","167.835","56.388","46.605","48.282","9.626","125.139","106.251","129.433","59.179","207.668","173.422","235.255","3.149","48.456","137.974","137.483","144.654","238.633","21.273","32.145","111.962","163.573","183.338","272.072","1.837","2.022","169.309","132.63","86.128","0","94.317","97.522","102.791","72.264","53.964","29.302","27.005","178.814","122.182","147.324","68.629","68.69","124.043","245.565","52.231","52.555","59.029","44.741","47.333","27.365","166.534","74.763","87.201","175.214","77.115","191.531","23.289","192.516","267.785","58.432","139.348","13.967","107.877","28.864","40.767","5.945","237.222","141.944","74.453","3.135","20.596","1.022","276.432","173.984","403.624"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2010-2019_CST.csv","title":"ERCOT Wind Operational and Planned 2010-2019","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2010-2019_CST.csv","header":["DATE","TIME","SITE_00001:capacity=99.825","SITE_00002:capacity=163.2","SITE_00003:capacity=202","SITE_00004:capacity=228","SITE_00005:capacity=162","SITE_00007:capacity=19.69","SITE_00008:capacity=230","SITE_00010:capacity=99","SITE_00011:capacity=61","SITE_00012:capacity=149.85","SITE_00013:capacity=120","SITE_00015:capacity=120.6","SITE_00016:capacity=232.5","SITE_00017:capacity=170.2","SITE_00018:capacity=180","SITE_00019:capacity=114","SITE_00020:capacity=165","SITE_00021:capacity=214.5","SITE_00022:capacity=149.5","SITE_00023:capacity=298.5","SITE_00024:capacity=150","SITE_00025:capacity=148.35","SITE_00026:capacity=126.5","SITE_00027:capacity=50.4","SITE_00028:capacity=151.2","SITE_00029:capacity=200.1","SITE_00030:capacity=130.5","SITE_00031:capacity=120","SITE_00032:capacity=253","SITE_00033:capacity=230","SITE_00034:capacity=121.9","SITE_00036:capacity=78","SITE_00037:capacity=92.34","SITE_00038:capacity=121.9","SITE_00039:capacity=27.44","SITE_00040:capacity=60","SITE_00041:capacity=155.4","SITE_00042:capacity=200","SITE_00043:capacity=69.6","SITE_00044:capacity=80","SITE_00045:capacity=150","SITE_00046:capacity=200.48","SITE_00047:capacity=211.22","SITE_00048:capacity=119.93","SITE_00050:capacity=213","SITE_00051:capacity=299","SITE_00052:capacity=223.5","SITE_00053:capacity=300","SITE_00054:capacity=230","SITE_00055:capacity=299.7","SITE_00056:capacity=99.9","SITE_00057:capacity=100","SITE_00058:capacity=165.6","SITE_00059:capacity=197","SITE_00060:capacity=160.5","SITE_00061:capacity=110","SITE_00063:capacity=132","SITE_00064:capacity=78","SITE_00065:capacity=159.9","SITE_00066:capacity=40.3","SITE_00067:capacity=150","SITE_00068:capacity=200.1","SITE_00069:capacity=200","SITE_00071:capacity=200","SITE_00072:capacity=100.5","SITE_00073:capacity=49.5","SITE_00074:capacity=200.1","SITE_00075:capacity=201.6","SITE_00076:capacity=200","SITE_00077:capacity=200","SITE_00078:capacity=110","SITE_00079:capacity=230.4","SITE_00080:capacity=124.2","SITE_00081:capacity=90","SITE_00082:capacity=211.22","SITE_00083:capacity=288.6","SITE_00084:capacity=150","SITE_00085:capacity=100","SITE_00086:capacity=30","SITE_00087:capacity=150","SITE_00088:capacity=196.65","SITE_00090:capacity=60","SITE_00091:capacity=58.8","SITE_00092:capacity=82.5","SITE_00093:capacity=179.85","SITE_00094:capacity=142.5","SITE_00095:capacity=115.5","SITE_00096:capacity=199.5","SITE_00097:capacity=403.2","SITE_00099:capacity=218.3","SITE_00100:capacity=181.7","SITE_00101:capacity=249","SITE_00102:capacity=84","SITE_00103:capacity=203.28","SITE_00104:capacity=150","SITE_00106:capacity=160","SITE_00107:capacity=174","SITE_00108:capacity=250","SITE_00109:capacity=93","SITE_00110:capacity=243","SITE_00111:capacity=150","SITE_00114:capacity=204.085","SITE_00115:capacity=200","SITE_00116:capacity=300.3","SITE_00117:capacity=164.68","SITE_00118:capacity=211.22","SITE_00119:capacity=194","SITE_00120:capacity=160.95","SITE_00121:capacity=101.2","SITE_00123:capacity=120","SITE_00124:capacity=98.82","SITE_00125:capacity=135","SITE_00126:capacity=135","SITE_00127:capacity=105.8","SITE_00128:capacity=80.5","SITE_00129:capacity=37.5","SITE_00130:capacity=283.2","SITE_00131:capacity=209","SITE_00132:capacity=150","SITE_00133:capacity=198","SITE_00134:capacity=169.5","SITE_00135:capacity=119.6","SITE_00136:capacity=150","SITE_00137:capacity=257.25","SITE_00138:capacity=59.8","SITE_00139:capacity=112.5","SITE_00140:capacity=64.4","SITE_00141:capacity=77.22","SITE_00142:capacity=82.5","SITE_02006:capacity=137.7","SITE_02009:capacity=200","SITE_02014:capacity=100.05","SITE_02049:capacity=156.16","SITE_02070:capacity=200","SITE_02089:capacity=92.565","SITE_02105:capacity=206.345","SITE_02112:capacity=34.32","SITE_03000:capacity=210.105","SITE_03001:capacity=350.28","SITE_03002:capacity=307.06","SITE_03003:capacity=183.75","SITE_03004:capacity=162.855","SITE_03005:capacity=237.6","SITE_03006:capacity=30.24","SITE_03007:capacity=201","SITE_03008:capacity=302.4","SITE_03009:capacity=300.5","SITE_04000:capacity=200.2","SITE_04001:capacity=99.36","SITE_04002:capacity=158","SITE_04003:capacity=144.9","SITE_04004:capacity=151.2","SITE_04005:capacity=300","SITE_04006:capacity=199.5","SITE_04007:capacity=502.135"],"sample":[["20100101","0","95.285","88.343","170.642","214.963","8.36","13.678","198.154","0.193","0.265","39.776","53.113","15.223","20.496","17.132","0.785","22.978","147.412","18.326","17.7","31.673","118.115","33.131","6.693","4.943","10.7","164.344","5.631","3.437","23.94","0","1.227","65.258","61.233","116.333","23.636","15.365","15.101","151.312","5.212","1.251","2.395","117.812","141.816","2.93","70.047","61.645","30.6","32.028","11.122","139.177","45.663","59.639","15.793","7.491","0.352","55.418","4.489","0.441","7.535","1.936","35.306","75.327","59.873","23.271","5.263","2.569","191.017","192.451","184.927","166.388","90.101","145.65","7.826","7.09","14.54","74.052","141.222","91.614","0.907","20.531","8.848","4.13","0.101","0","153.699","10.02","2.298","11.062","350.831","101.238","115.534","13.239","1.198","192.362","81.258","100.819","70.002","19.884","80.263","202.734","47.402","22.64","14.267","12.504","10.609","12.198","185.131","132.742","7.453","0","8.274","4.926","10.784","9.228","8.617","2.617","203.659","5.213","9.878","23.822","35.273","55.133","4.904","20.209","9.416","32.748","5.72","0","0","1.298","184.03","28.535","113.53","18.639","1.632","19.678","0.062","187.832","11.899","286.744","1.332","149.696","167.032","1.853","177.234","22.854","264.41","6.514","1.795","11.479","47.472","119.942","100.331","68.978","59.922"],["20100101","100","95.285","116.987","161.629","215.017","2.243","10.804","151.181","0.074","0.062","48.785","34.613","10.027","15.13","13.043","0.576","16.762","147.581","12.964","9.059","16.055","79.23","35.52","0.553","7.365","14.39","159.557","1.76","1.519","12.902","0","0.089","57.774","37.441","116.333","23.636","10.621","8.629","110.868","1.551","0.605","0.59","131.971","162.892","3.179","44.939","42.899","24.64","36.515","4.608","170.811","58.051","73.681","8.552","1.022","0","37.018","0","0.049","1.563","0.119","25.564","71.205","77.453","12.768","1.276","0.923","191.017","192.451","168.725","164.173","88.774","184.593","7.727","5.356","14.485","95.082","140.94","91.547","0.504","22.122","4.634","0","0.007","0","153.592","8.736","1.162","10.626","345.304","122.28","147.219","6.435","1.097","192.108","103.66","85.976","95.043","8.235","80.473","202.725","32.727","11.454","31.037","37.012","9.556","11.686","184.154","139.303","6.601","0","8.689","1.272","10.115","8.838","8.399","2.459","230.97","0.18","6.869","12.27","29.6","42.125","2.526","33.996","14.312","27.342","3.033","0","0","0.434","163.04","20.664","101.961","8.992","0","7.94","0.019","199.509","9.015","293.126","0.33","139.867","160.378","0.413","177.663","33.096","201.529","5.234","0.804","6.297","47.597","119.942","62.973","50.986","34.142"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2020_CST.csv","title":"ERCOT Wind Operational and Planned 2020","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2020_CST.csv","header":["DATE","TIME","SITE_00001:capacity=99.825","SITE_00002:capacity=163.2","SITE_00003:capacity=202","SITE_00004:capacity=228","SITE_00005:capacity=162","SITE_00007:capacity=19.69","SITE_00008:capacity=230","SITE_00010:capacity=99","SITE_00011:capacity=61","SITE_00012:capacity=149.85","SITE_00013:capacity=120","SITE_00015:capacity=120.6","SITE_00016:capacity=232.5","SITE_00017:capacity=170.2","SITE_00018:capacity=180","SITE_00019:capacity=114","SITE_00020:capacity=165","SITE_00021:capacity=214.5","SITE_00022:capacity=149.5","SITE_00023:capacity=298.5","SITE_00024:capacity=150","SITE_00025:capacity=148.35","SITE_00026:capacity=126.5","SITE_00027:capacity=50.4","SITE_00028:capacity=151.2","SITE_00029:capacity=200.1","SITE_00030:capacity=130.5","SITE_00031:capacity=120","SITE_00032:capacity=253","SITE_00033:capacity=230","SITE_00034:capacity=121.9","SITE_00036:capacity=78","SITE_00037:capacity=92.34","SITE_00038:capacity=121.9","SITE_00039:capacity=27.44","SITE_00040:capacity=60","SITE_00041:capacity=155.4","SITE_00042:capacity=200","SITE_00043:capacity=69.6","SITE_00044:capacity=80","SITE_00045:capacity=150","SITE_00046:capacity=200.48","SITE_00047:capacity=211.22","SITE_00048:capacity=119.93","SITE_00050:capacity=213","SITE_00051:capacity=299","SITE_00052:capacity=223.5","SITE_00053:capacity=300","SITE_00054:capacity=230","SITE_00055:capacity=299.7","SITE_00056:capacity=99.9","SITE_00057:capacity=100","SITE_00058:capacity=165.6","SITE_00059:capacity=197","SITE_00060:capacity=160.5","SITE_00061:capacity=110","SITE_00063:capacity=132","SITE_00064:capacity=78","SITE_00065:capacity=159.9","SITE_00066:capacity=40.3","SITE_00067:capacity=150","SITE_00068:capacity=200.1","SITE_00069:capacity=200","SITE_00071:capacity=200","SITE_00072:capacity=100.5","SITE_00073:capacity=49.5","SITE_00074:capacity=200.1","SITE_00075:capacity=201.6","SITE_00076:capacity=200","SITE_00077:capacity=200","SITE_00078:capacity=110","SITE_00079:capacity=230.4","SITE_00080:capacity=124.2","SITE_00081:capacity=90","SITE_00082:capacity=211.22","SITE_00083:capacity=288.6","SITE_00084:capacity=150","SITE_00085:capacity=100","SITE_00086:capacity=30","SITE_00087:capacity=150","SITE_00088:capacity=196.65","SITE_00090:capacity=60","SITE_00091:capacity=58.8","SITE_00092:capacity=82.5","SITE_00093:capacity=179.85","SITE_00094:capacity=142.5","SITE_00095:capacity=115.5","SITE_00096:capacity=199.5","SITE_00097:capacity=403.2","SITE_00099:capacity=218.3","SITE_00100:capacity=181.7","SITE_00101:capacity=249","SITE_00102:capacity=84","SITE_00103:capacity=203.28","SITE_00104:capacity=150","SITE_00106:capacity=160","SITE_00107:capacity=174","SITE_00108:capacity=250","SITE_00109:capacity=93","SITE_00110:capacity=243","SITE_00111:capacity=150","SITE_00114:capacity=204.085","SITE_00115:capacity=200","SITE_00116:capacity=300.3","SITE_00117:capacity=164.68","SITE_00118:capacity=211.22","SITE_00119:capacity=194","SITE_00120:capacity=160.95","SITE_00121:capacity=101.2","SITE_00123:capacity=120","SITE_00124:capacity=98.82","SITE_00125:capacity=135","SITE_00126:capacity=135","SITE_00127:capacity=105.8","SITE_00128:capacity=80.5","SITE_00129:capacity=37.5","SITE_00130:capacity=283.2","SITE_00131:capacity=209","SITE_00132:capacity=150","SITE_00133:capacity=198","SITE_00134:capacity=169.5","SITE_00135:capacity=119.6","SITE_00136:capacity=150","SITE_00137:capacity=257.25","SITE_00138:capacity=59.8","SITE_00139:capacity=112.5","SITE_00140:capacity=64.4","SITE_00141:capacity=77.22","SITE_00142:capacity=82.5","SITE_02006:capacity=137.7","SITE_02009:capacity=200","SITE_02014:capacity=100.05","SITE_02049:capacity=156.16","SITE_02070:capacity=200","SITE_02089:capacity=92.565","SITE_02105:capacity=206.345","SITE_02112:capacity=34.32","SITE_03000:capacity=210.105","SITE_03001:capacity=350.28","SITE_03002:capacity=307.06","SITE_03003:capacity=183.75","SITE_03004:capacity=162.855","SITE_03005:capacity=237.6","SITE_03006:capacity=30.24","SITE_03007:capacity=201","SITE_03008:capacity=302.4","SITE_03009:capacity=300.5","SITE_04000:capacity=200.2","SITE_04001:capacity=99.36","SITE_04002:capacity=158","SITE_04003:capacity=144.9","SITE_04004:capacity=151.2","SITE_04005:capacity=300","SITE_04006:capacity=199.5","SITE_04007:capacity=502.135"],"sample":[["20200101","0","24.103","153.937","53.62","27.882","91.667","5.801","134.288","47.237","21.74","130.73","17.015","35.162","62.916","38.833","79.664","48.721","22.626","63.865","24.811","69.455","65.441","39.577","38.148","46.432","143.086","15.941","54.11","52.701","154.27","179.339","33.193","45.829","31.79","61.759","16.97","24.848","95.752","155.965","22.783","20.86","122.501","161.138","199.602","51.769","49.626","57.481","47.567","78.978","192.21","273.37","84.662","95.063","126.797","76.499","72.104","54.781","80.612","17.983","39.221","8.324","35.505","127.144","190.913","143.428","23.483","13.972","31.913","28.201","41.529","73.299","23.534","217.623","32.905","27.417","150.399","259.687","46.341","19.607","15.305","133.825","53.918","28.107","7.818","51.075","28.881","39.605","33.114","50.889","119.84","205.627","173.422","92.867","28.055","28.27","138.165","51.515","152.666","234.375","13.102","40.622","49.584","121.942","188.803","286.651","120.195","136.391","184.164","142.891","51.43","27.464","41.908","37.453","31.413","21.494","14.165","13.258","62.82","54.13","63.875","109.06","31.251","77.717","126.484","245.565","52.231","54.925","40.06","32.216","33.981","27.879","103.227","72.544","99.098","134.398","42.375","82.392","6.65","200.548","267.552","62.848","156.744","16.832","15.668","28.864","54.274","238.694","145.87","142.637","77.109","65.449","21.799","1.474","194.56","46.467","289.135"],["20200101","100","27.363","153.937","53.753","25.032","102.134","4.36","124.815","57.154","33.443","130.718","32.821","36.737","71.241","41.214","49.559","43.874","18.847","71.093","25.513","73.235","62.168","0","57.55","48.112","144.213","21.98","68.363","62.857","195.049","180.975","42.496","54.967","34.102","57.885","16.952","28.892","120.283","167.681","24.68","22.795","122.501","160.913","199.499","72.177","54.814","65.225","50.094","81.989","192.25","273.432","84.666","95.063","140.204","97.075","59.343","54.528","80.584","15.808","31.095","7.885","33.038","133.423","190.913","157.176","34.264","20.732","37.098","32.674","30.655","49.616","16.706","217.544","40.327","29.461","133.131","260.612","32.844","20.768","17.603","134.822","53.218","29.111","9.171","44.687","32.92","45.931","37.062","64.534","124.774","205.862","173.422","122.456","35.934","33.743","138.165","0","147.468","235.15","11.705","33.863","81.862","123.62","188.975","286.651","118.925","123.754","184.164","142.891","52.439","31.115","45.94","42.961","39.758","30.21","19.551","14.938","65.188","72.721","64.334","111.737","29.391","85.169","126.575","245.565","52.232","63.756","41.27","29.846","30.915","27.083","108.664","85.256","78.142","148.803","41.642","87.913","8.252","200.548","298.416","67.562","166.425","21.251","7.163","28.864","55.311","263.71","145.496","152.447","81.653","105.322","6.434","0.975","191.186","42.811","241.897"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_1980-1989_CST.csv","title":"ERCOT Wind Profiles, Hypothetical Sites, 1980-1989","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_1980-1989_CST.csv","header":["DATE","TIME","SITE00003:capacity=281","SITE00004:capacity=127.9","SITE00017:capacity=130.3","SITE00028:capacity=220.6","SITE00033:capacity=338.6","SITE00041:capacity=400","SITE00042:capacity=252.2","SITE00044:capacity=129.6","SITE00062:capacity=241","SITE00063:capacity=271.2","SITE00070:capacity=400","SITE00071:capacity=203.3","SITE00074:capacity=254.4","SITE00075:capacity=148.9","SITE00076:capacity=357.8","SITE00085:capacity=113","SITE00086:capacity=185.2","SITE00103:capacity=400","SITE00117:capacity=176.1","SITE00125:capacity=140.3","SITE00127:capacity=105.9","SITE00132:capacity=121.4","SITE00134:capacity=153.9","SITE00140:capacity=130.6","SITE00150:capacity=400","SITE00151:capacity=257.3","SITE00155:capacity=136.7","SITE00156:capacity=115.4","SITE00158:capacity=222.3","SITE00160:capacity=202","SITE00181:capacity=208","SITE00187:capacity=151.6","SITE00199:capacity=140.2","SITE00203:capacity=308.9","SITE00221:capacity=228.2","SITE00223:capacity=271.5","SITE00231:capacity=118.6","SITE00234:capacity=112.7","SITE00237:capacity=400","SITE00243:capacity=206.7","SITE00246:capacity=383.9","SITE00254:capacity=117","SITE00256:capacity=208.9","SITE00264:capacity=229.7","SITE00267:capacity=214","SITE00278:capacity=207.4","SITE00279:capacity=212.4","SITE00280:capacity=310.4","SITE00290:capacity=343.2","SITE00296:capacity=212.6","SITE00304:capacity=332.9","SITE00307:capacity=349.1","SITE00310:capacity=210.6","SITE00311:capacity=145.9","SITE00313:capacity=265.6","SITE00316:capacity=155.4","SITE00322:capacity=105.6","SITE00323:capacity=254.9","SITE00325:capacity=221.7","SITE00328:capacity=140.2","SITE00333:capacity=185.3","SITE00340:capacity=143","SITE00355:capacity=232.6","SITE00358:capacity=160","SITE00361:capacity=220.1","SITE00362:capacity=181.4","SITE00365:capacity=230.6","SITE00373:capacity=193.7","SITE00385:capacity=245.3","SITE00390:capacity=375.1","SITE00391:capacity=171.6","SITE00392:capacity=201.6","SITE00394:capacity=352.1","SITE00400:capacity=153.8","SITE00403:capacity=126","SITE00404:capacity=130.8","SITE00410:capacity=351.6","SITE00419:capacity=400","SITE00427:capacity=236.9","SITE00430:capacity=266.9","SITE00434:capacity=295.5","SITE00435:capacity=305.1","SITE00438:capacity=105.7","SITE00440:capacity=121","SITE00454:capacity=150.8","SITE00455:capacity=184.5","SITE00456:capacity=210","SITE00459:capacity=148","SITE00460:capacity=229.8","SITE00461:capacity=169.9","SITE00464:capacity=225.2","SITE00470:capacity=223","SITE00472:capacity=400","SITE00475:capacity=201.6","SITE00478:capacity=191.8","SITE00483:capacity=351.4","SITE00513:capacity=259.7","SITE00523:capacity=162.4","SITE00526:capacity=165","SITE00531:capacity=262.5","SITE00532:capacity=138.7","SITE00537:capacity=400","SITE00540:capacity=129.6","SITE00542:capacity=122.5","SITE00543:capacity=237.3","SITE00550:capacity=199.8","SITE00552:capacity=335.6","SITE00558:capacity=167.2","SITE00564:capacity=213.3","SITE00566:capacity=108.2","SITE00567:capacity=266.4","SITE00573:capacity=226","SITE00579:capacity=224.7","SITE00590:capacity=103.9","SITE00598:capacity=170.9","SITE00608:capacity=152.9","SITE00621:capacity=190.6","SITE00624:capacity=106.5","SITE00625:capacity=164.1","SITE00630:capacity=243.7","SITE00631:capacity=211.2","SITE00633:capacity=187.6","SITE00634:capacity=210","SITE00638:capacity=284.9","SITE00639:capacity=111.8","SITE00642:capacity=158.1","SITE00644:capacity=246.6","SITE00653:capacity=151.3","SITE00656:capacity=171.4","SITE00661:capacity=252","SITE00663:capacity=165.9","SITE00664:capacity=121.1","SITE00667:capacity=160","SITE00671:capacity=152.9","SITE00674:capacity=187","SITE00694:capacity=143.1","SITE00730:capacity=111.8","SITE00734:capacity=183","SITE00749:capacity=154.1","SITE00751:capacity=135.7","SITE00756:capacity=194.2","SITE00782:capacity=130.8","SITE00819:capacity=102.7","SITE00893:capacity=185.6","SITE00996:capacity=166.9","SITE02213:capacity=103.5","SITE00052:capacity=311.8","SITE00136:capacity=133.9"],"sample":[["19800101","0","203.223","118.194","119.955","29.408","138.852","238.865","29.954","14.288","95.528","166.766","341.646","64.024","44.723","129.19","75.983","74.386","39.881","188.041","23.986","61.198","19.724","19.368","21.534","74.295","205.071","19.08","99.835","2.293","97.063","29.376","86.861","40.322","38.682","87.256","133.885","242.89","25.4","14.829","6.446","7.82","182.896","27.265","34.876","22.099","15.399","0","144.37","113.864","143.427","95.125","29.828","125.414","87.412","37.445","72.817","36.014","27.841","0.141","128.472","4.06","7.211","11.673","21.949","152.379","43.383","54.543","18.395","24.486","95.413","16.573","76.38","134.112","32.107","0.095","0.044","25.603","76.153","69.856","1.117","35.336","32.222","0.048","7.796","18.208","5.968","16.286","41.751","6.557","11.118","0","21.371","26.961","13.613","0","43.674","51.837","32.637","18.575","4.555","0","0.334","16.784","8.606","0.054","59.796","1.174","77.717","0.023","37.689","16.676","0.76","12.214","31.904","14.874","2.501","5.56","43.961","0.016","5.139","11.437","31.761","1.792","4.584","21.115","4.612","18.911","1.57","0","0.672","5.015","4.687","0","29.798","2.117","1.304","18.675","37.501","23.861","9.677","38.157","1.422","6.763","3.865","0.102","0","37.246","158.913","31.265"],["19800101","100","259.612","118.235","121.933","55.698","156.916","279.847","55.718","32.459","124.363","179.09","359.748","89.864","86.206","122.962","98.16","73.097","51.683","158.063","36.167","75.458","31.582","28.102","37.116","114.868","197.639","48.859","105.416","19.169","84.099","46.124","102.732","38.965","32.902","117.862","152.321","236.314","35.442","17.885","28.026","32.346","207.356","42.612","65.945","39.252","28.209","1.429","146.895","111.543","217.372","137.202","66.014","112.909","126.023","48.942","100.508","55.766","32.674","0.558","141.838","10.354","10.921","17.586","45.506","152.143","44.091","68.734","40.756","43.137","87.672","10.467","84.457","118.295","30.054","5.439","4.031","36.92","84.842","96.386","0.099","62.28","70.295","7.544","12.657","29.817","16.438","27.682","78.943","16.197","14.44","0.281","21.718","19.457","14.907","0.295","36.27","59.138","51.227","10.364","3.016","0","1.376","17.409","11.61","0.002","42.955","0.496","61.64","0.412","30.26","21.379","0.895","19.658","49.848","10.279","2.71","18.947","62.27","0","4.608","7.981","25.301","5.001","4.071","15.185","5.967","33.986","1.464","0","1.35","18.157","14.715","0","17.171","5.353","0.03","11.033","36.388","20.851","6.536","31.166","0.428","7.005","0.634","0","0","36.68","184.578","31.022"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_1990-1999_CST.csv","title":"ERCOT Wind Profiles, Hypothetical Sites, 1990-1999","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_1990-1999_CST.csv","header":["DATE","TIME","SITE00003:capacity=281","SITE00004:capacity=127.9","SITE00017:capacity=130.3","SITE00028:capacity=220.6","SITE00033:capacity=338.6","SITE00041:capacity=400","SITE00042:capacity=252.2","SITE00044:capacity=129.6","SITE00062:capacity=241","SITE00063:capacity=271.2","SITE00070:capacity=400","SITE00071:capacity=203.3","SITE00074:capacity=254.4","SITE00075:capacity=148.9","SITE00076:capacity=357.8","SITE00085:capacity=113","SITE00086:capacity=185.2","SITE00103:capacity=400","SITE00117:capacity=176.1","SITE00125:capacity=140.3","SITE00127:capacity=105.9","SITE00132:capacity=121.4","SITE00134:capacity=153.9","SITE00140:capacity=130.6","SITE00150:capacity=400","SITE00151:capacity=257.3","SITE00155:capacity=136.7","SITE00156:capacity=115.4","SITE00158:capacity=222.3","SITE00160:capacity=202","SITE00181:capacity=208","SITE00187:capacity=151.6","SITE00199:capacity=140.2","SITE00203:capacity=308.9","SITE00221:capacity=228.2","SITE00223:capacity=271.5","SITE00231:capacity=118.6","SITE00234:capacity=112.7","SITE00237:capacity=400","SITE00243:capacity=206.7","SITE00246:capacity=383.9","SITE00254:capacity=117","SITE00256:capacity=208.9","SITE00264:capacity=229.7","SITE00267:capacity=214","SITE00278:capacity=207.4","SITE00279:capacity=212.4","SITE00280:capacity=310.4","SITE00290:capacity=343.2","SITE00296:capacity=212.6","SITE00304:capacity=332.9","SITE00307:capacity=349.1","SITE00310:capacity=210.6","SITE00311:capacity=145.9","SITE00313:capacity=265.6","SITE00316:capacity=155.4","SITE00322:capacity=105.6","SITE00323:capacity=254.9","SITE00325:capacity=221.7","SITE00328:capacity=140.2","SITE00333:capacity=185.3","SITE00340:capacity=143","SITE00355:capacity=232.6","SITE00358:capacity=160","SITE00361:capacity=220.1","SITE00362:capacity=181.4","SITE00365:capacity=230.6","SITE00373:capacity=193.7","SITE00385:capacity=245.3","SITE00390:capacity=375.1","SITE00391:capacity=171.6","SITE00392:capacity=201.6","SITE00394:capacity=352.1","SITE00400:capacity=153.8","SITE00403:capacity=126","SITE00404:capacity=130.8","SITE00410:capacity=351.6","SITE00419:capacity=400","SITE00427:capacity=236.9","SITE00430:capacity=266.9","SITE00434:capacity=295.5","SITE00435:capacity=305.1","SITE00438:capacity=105.7","SITE00440:capacity=121","SITE00454:capacity=150.8","SITE00455:capacity=184.5","SITE00456:capacity=210","SITE00459:capacity=148","SITE00460:capacity=229.8","SITE00461:capacity=169.9","SITE00464:capacity=225.2","SITE00470:capacity=223","SITE00472:capacity=400","SITE00475:capacity=201.6","SITE00478:capacity=191.8","SITE00483:capacity=351.4","SITE00513:capacity=259.7","SITE00523:capacity=162.4","SITE00526:capacity=165","SITE00531:capacity=262.5","SITE00532:capacity=138.7","SITE00537:capacity=400","SITE00540:capacity=129.6","SITE00542:capacity=122.5","SITE00543:capacity=237.3","SITE00550:capacity=199.8","SITE00552:capacity=335.6","SITE00558:capacity=167.2","SITE00564:capacity=213.3","SITE00566:capacity=108.2","SITE00567:capacity=266.4","SITE00573:capacity=226","SITE00579:capacity=224.7","SITE00590:capacity=103.9","SITE00598:capacity=170.9","SITE00608:capacity=152.9","SITE00621:capacity=190.6","SITE00624:capacity=106.5","SITE00625:capacity=164.1","SITE00630:capacity=243.7","SITE00631:capacity=211.2","SITE00633:capacity=187.6","SITE00634:capacity=210","SITE00638:capacity=284.9","SITE00639:capacity=111.8","SITE00642:capacity=158.1","SITE00644:capacity=246.6","SITE00653:capacity=151.3","SITE00656:capacity=171.4","SITE00661:capacity=252","SITE00663:capacity=165.9","SITE00664:capacity=121.1","SITE00667:capacity=160","SITE00671:capacity=152.9","SITE00674:capacity=187","SITE00694:capacity=143.1","SITE00730:capacity=111.8","SITE00734:capacity=183","SITE00749:capacity=154.1","SITE00751:capacity=135.7","SITE00756:capacity=194.2","SITE00782:capacity=130.8","SITE00819:capacity=102.7","SITE00893:capacity=185.6","SITE00996:capacity=166.9","SITE02213:capacity=103.5","SITE00052:capacity=311.8","SITE00136:capacity=133.9"],"sample":[["19900101","0","48.812","11.152","15.839","12.521","38.016","335.642","7.006","15.819","15.233","43.088","111.532","26.222","24.86","51.668","314.117","23.49","47.917","297.83","62.138","0.012","10.777","2.154","17.163","61.8","100.977","0.281","4.986","13.451","128.35","33.76","69.997","0.094","32.793","0.147","105.677","35.013","8.895","29.44","30.871","44.637","196.846","2.444","21.841","19.533","55.296","89.311","29.383","4.094","52.767","30.094","52.331","236.218","49.438","19.121","46.383","5.313","87.689","66.886","31.195","19.04","103.158","21.108","23.23","7.499","30.786","4.445","99.4","18.514","188.687","100.89","0","53.143","307.03","59.603","35.878","47.337","3.643","31.459","77.352","28.738","51.336","82.499","15.309","7.573","31.614","29.246","19.567","19.182","45.609","28.009","0","61.951","96.93","20.851","81.673","176.911","25.126","71.653","103.441","11.092","58.202","86.865","65.777","12.158","73.19","23.298","186.397","20.846","157.585","8.372","85.033","14.737","55.671","41.423","17.928","87.193","28.412","16.77","35.619","26.119","10.46","8.404","67.794","75.002","0.104","13.533","36.655","2.691","6.879","13.44","26.391","21.007","104.586","25.371","74.824","75.752","28.535","61.93","2.923","13.041","40.744","28.05","13.555","8.311","0.001","24.439","83.9","0"],["19900101","100","37.01","8.443","20.95","18.085","44.817","366.813","3.568","4.031","3.17","81.417","140.008","30.74","12.866","59.395","315.714","44.922","45.044","346.395","66.5","0.148","12.838","0.086","12.574","88.326","123.024","0.835","2.335","2.403","166.2","33.872","116.593","0.119","42.442","0.329","111.642","48.784","4.392","13.532","14.995","32.433","211.874","1.739","14.316","11.388","23.814","99.387","71.793","10.203","109.823","30.649","7.237","196.718","123.743","23.201","82.345","0","88.269","75.396","50.857","17.685","103.482","17.435","9.029","25.99","81.078","2.601","81.445","15.398","189.885","135.057","0.151","40.612","306.217","72.355","20.437","70.54","4.258","36.29","71.743","22.372","80.911","43.01","9.314","10.163","33.874","13.486","17.534","9.61","62.748","29.639","0","67.837","109.86","22.296","83.921","137.25","49.05","71.922","91.191","10.298","65.957","74.364","62.355","13.128","83.402","9.455","200.088","26.212","186.334","15.569","70.646","3.188","67.98","44.928","9.187","46.079","73.385","12.98","20.441","18.356","11.072","2.592","51.395","78.321","3.985","4.051","48.924","0.265","13.262","18.073","17.605","5.477","102.576","15.216","54.264","117.437","19.191","77.904","1.733","14.644","27.233","21.701","11.326","4.81","0.011","20.592","95.033","0.001"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_2000-2009_CST.csv","title":"ERCOT Wind Profiles, Hypothetical Sites, 2000-2009","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_2000-2009_CST.csv","header":["DATE","TIME","SITE00003:capacity=281","SITE00004:capacity=127.9","SITE00017:capacity=130.3","SITE00028:capacity=220.6","SITE00033:capacity=338.6","SITE00041:capacity=400","SITE00042:capacity=252.2","SITE00044:capacity=129.6","SITE00062:capacity=241","SITE00063:capacity=271.2","SITE00070:capacity=400","SITE00071:capacity=203.3","SITE00074:capacity=254.4","SITE00075:capacity=148.9","SITE00076:capacity=357.8","SITE00085:capacity=113","SITE00086:capacity=185.2","SITE00103:capacity=400","SITE00117:capacity=176.1","SITE00125:capacity=140.3","SITE00127:capacity=105.9","SITE00132:capacity=121.4","SITE00134:capacity=153.9","SITE00140:capacity=130.6","SITE00150:capacity=400","SITE00151:capacity=257.3","SITE00155:capacity=136.7","SITE00156:capacity=115.4","SITE00158:capacity=222.3","SITE00160:capacity=202","SITE00181:capacity=208","SITE00187:capacity=151.6","SITE00199:capacity=140.2","SITE00203:capacity=308.9","SITE00221:capacity=228.2","SITE00223:capacity=271.5","SITE00231:capacity=118.6","SITE00234:capacity=112.7","SITE00237:capacity=400","SITE00243:capacity=206.7","SITE00246:capacity=383.9","SITE00254:capacity=117","SITE00256:capacity=208.9","SITE00264:capacity=229.7","SITE00267:capacity=214","SITE00278:capacity=207.4","SITE00279:capacity=212.4","SITE00280:capacity=310.4","SITE00290:capacity=343.2","SITE00296:capacity=212.6","SITE00304:capacity=332.9","SITE00307:capacity=349.1","SITE00310:capacity=210.6","SITE00311:capacity=145.9","SITE00313:capacity=265.6","SITE00316:capacity=155.4","SITE00322:capacity=105.6","SITE00323:capacity=254.9","SITE00325:capacity=221.7","SITE00328:capacity=140.2","SITE00333:capacity=185.3","SITE00340:capacity=143","SITE00355:capacity=232.6","SITE00358:capacity=160","SITE00361:capacity=220.1","SITE00362:capacity=181.4","SITE00365:capacity=230.6","SITE00373:capacity=193.7","SITE00385:capacity=245.3","SITE00390:capacity=375.1","SITE00391:capacity=171.6","SITE00392:capacity=201.6","SITE00394:capacity=352.1","SITE00400:capacity=153.8","SITE00403:capacity=126","SITE00404:capacity=130.8","SITE00410:capacity=351.6","SITE00419:capacity=400","SITE00427:capacity=236.9","SITE00430:capacity=266.9","SITE00434:capacity=295.5","SITE00435:capacity=305.1","SITE00438:capacity=105.7","SITE00440:capacity=121","SITE00454:capacity=150.8","SITE00455:capacity=184.5","SITE00456:capacity=210","SITE00459:capacity=148","SITE00460:capacity=229.8","SITE00461:capacity=169.9","SITE00464:capacity=225.2","SITE00470:capacity=223","SITE00472:capacity=400","SITE00475:capacity=201.6","SITE00478:capacity=191.8","SITE00483:capacity=351.4","SITE00513:capacity=259.7","SITE00523:capacity=162.4","SITE00526:capacity=165","SITE00531:capacity=262.5","SITE00532:capacity=138.7","SITE00537:capacity=400","SITE00540:capacity=129.6","SITE00542:capacity=122.5","SITE00543:capacity=237.3","SITE00550:capacity=199.8","SITE00552:capacity=335.6","SITE00558:capacity=167.2","SITE00564:capacity=213.3","SITE00566:capacity=108.2","SITE00567:capacity=266.4","SITE00573:capacity=226","SITE00579:capacity=224.7","SITE00590:capacity=103.9","SITE00598:capacity=170.9","SITE00608:capacity=152.9","SITE00621:capacity=190.6","SITE00624:capacity=106.5","SITE00625:capacity=164.1","SITE00630:capacity=243.7","SITE00631:capacity=211.2","SITE00633:capacity=187.6","SITE00634:capacity=210","SITE00638:capacity=284.9","SITE00639:capacity=111.8","SITE00642:capacity=158.1","SITE00644:capacity=246.6","SITE00653:capacity=151.3","SITE00656:capacity=171.4","SITE00661:capacity=252","SITE00663:capacity=165.9","SITE00664:capacity=121.1","SITE00667:capacity=160","SITE00671:capacity=152.9","SITE00674:capacity=187","SITE00694:capacity=143.1","SITE00730:capacity=111.8","SITE00734:capacity=183","SITE00749:capacity=154.1","SITE00751:capacity=135.7","SITE00756:capacity=194.2","SITE00782:capacity=130.8","SITE00819:capacity=102.7","SITE00893:capacity=185.6","SITE00996:capacity=166.9","SITE02213:capacity=103.5","SITE00052:capacity=311.8","SITE00136:capacity=133.9"],"sample":[["20000101","0","266.752","117.985","122.097","188.855","286.24","377.294","199.712","102.885","226.798","255.045","381.571","111.675","226.124","141.218","333.505","95.323","137.241","376.942","166.899","117.873","95.355","114.453","144.983","114.408","358.78","171.518","129.743","104.23","209.142","109.111","198.435","57.887","91.873","187.555","198.304","246.68","110.691","88.195","311.92","189.886","361.57","91.894","193.239","202.106","182.998","71.504","147.565","242.928","209.119","199.384","194.775","326.942","193.05","133.568","200.697","138.15","84.6","35.577","167.861","49.047","87.954","130.01","117.932","23.604","179.963","169.784","182.508","181.139","167.713","70.052","118.466","118.375","326.013","65.006","60.449","122.046","293.748","381.245","62.192","121.596","91.591","148.178","70.373","114.438","137.227","106.326","198.506","46.931","17.029","17.207","178.129","40.856","74.588","33.931","16.04","70.156","225.101","18.361","33.576","27.386","38.207","94.876","11.632","12.284","4.325","46.108","16.879","9.089","13.811","102.974","26.149","111.682","213.325","0.385","39.847","112.445","141.268","16.187","5.332","96.201","62.598","83.35","0.963","4.452","71.641","58.325","8.36","15.414","53.649","113.808","59.725","13.396","10.695","44.665","13.089","2.265","0","0.023","24.532","0","9.168","1.515","3.318","11.589","57.735","67.354","293.761","63.714"],["20000101","100","267.038","117.879","122.126","207.731","320.101","377.631","230.435","115.783","228.973","248.826","381.309","188.235","237.261","141.194","321.562","95.33","169.006","378.426","167.462","122.786","95.324","114.492","144.989","121.902","358.764","195.801","129.661","106.75","209.689","132.51","198.393","96.787","116.818","217.061","198.44","240.39","110.714","103.276","373.14","188.812","360.9","101.109","198.341","203.192","193.92","107.568","193.921","247.382","220.209","200.986","184.962","327.162","194.338","133.611","194.4","116.293","82.464","46.962","201.882","73.815","96.325","124.704","179.17","25.623","190.362","170.895","213.242","183.204","170.06","91.681","106.806","155.431","328.096","84.489","69.858","122.105","234.236","380.118","59.723","181.718","145.903","201.241","65.039","114.505","137.434","121.791","198.519","56.204","36.118","9.286","176.657","63.804","84.467","51.253","25","82.332","190.581","19.254","37.023","45.79","54.707","119.995","18.344","18.665","12.838","19.383","35.458","19.728","16.797","103.042","14.146","101.644","212.97","3.386","33.219","128.117","144.928","19.683","4.284","74.575","36.133","71.935","1.886","16.968","69.138","68.837","20.654","39.517","53.871","137.122","71.864","31.707","14.568","44.253","16.15","6.545","0.112","2.62","20.269","0","15.696","4.032","1.103","21.676","51.552","95.093","293.744","93.522"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_2010-2019_CST.csv","title":"ERCOT Wind Profiles, Hypothetical Sites, 2010-2019","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_2010-2019_CST.csv","header":["DATE","TIME","SITE00003:capacity=281","SITE00004:capacity=127.9","SITE00017:capacity=130.3","SITE00028:capacity=220.6","SITE00033:capacity=338.6","SITE00041:capacity=400","SITE00042:capacity=252.2","SITE00044:capacity=129.6","SITE00062:capacity=241","SITE00063:capacity=271.2","SITE00070:capacity=400","SITE00071:capacity=203.3","SITE00074:capacity=254.4","SITE00075:capacity=148.9","SITE00076:capacity=357.8","SITE00085:capacity=113","SITE00086:capacity=185.2","SITE00103:capacity=400","SITE00117:capacity=176.1","SITE00125:capacity=140.3","SITE00127:capacity=105.9","SITE00132:capacity=121.4","SITE00134:capacity=153.9","SITE00140:capacity=130.6","SITE00150:capacity=400","SITE00151:capacity=257.3","SITE00155:capacity=136.7","SITE00156:capacity=115.4","SITE00158:capacity=222.3","SITE00160:capacity=202","SITE00181:capacity=208","SITE00187:capacity=151.6","SITE00199:capacity=140.2","SITE00203:capacity=308.9","SITE00221:capacity=228.2","SITE00223:capacity=271.5","SITE00231:capacity=118.6","SITE00234:capacity=112.7","SITE00237:capacity=400","SITE00243:capacity=206.7","SITE00246:capacity=383.9","SITE00254:capacity=117","SITE00256:capacity=208.9","SITE00264:capacity=229.7","SITE00267:capacity=214","SITE00278:capacity=207.4","SITE00279:capacity=212.4","SITE00280:capacity=310.4","SITE00290:capacity=343.2","SITE00296:capacity=212.6","SITE00304:capacity=332.9","SITE00307:capacity=349.1","SITE00310:capacity=210.6","SITE00311:capacity=145.9","SITE00313:capacity=265.6","SITE00316:capacity=155.4","SITE00322:capacity=105.6","SITE00323:capacity=254.9","SITE00325:capacity=221.7","SITE00328:capacity=140.2","SITE00333:capacity=185.3","SITE00340:capacity=143","SITE00355:capacity=232.6","SITE00358:capacity=160","SITE00361:capacity=220.1","SITE00362:capacity=181.4","SITE00365:capacity=230.6","SITE00373:capacity=193.7","SITE00385:capacity=245.3","SITE00390:capacity=375.1","SITE00391:capacity=171.6","SITE00392:capacity=201.6","SITE00394:capacity=352.1","SITE00400:capacity=153.8","SITE00403:capacity=126","SITE00404:capacity=130.8","SITE00410:capacity=351.6","SITE00419:capacity=400","SITE00427:capacity=236.9","SITE00430:capacity=266.9","SITE00434:capacity=295.5","SITE00435:capacity=305.1","SITE00438:capacity=105.7","SITE00440:capacity=121","SITE00454:capacity=150.8","SITE00455:capacity=184.5","SITE00456:capacity=210","SITE00459:capacity=148","SITE00460:capacity=229.8","SITE00461:capacity=169.9","SITE00464:capacity=225.2","SITE00470:capacity=223","SITE00472:capacity=400","SITE00475:capacity=201.6","SITE00478:capacity=191.8","SITE00483:capacity=351.4","SITE00513:capacity=259.7","SITE00523:capacity=162.4","SITE00526:capacity=165","SITE00531:capacity=262.5","SITE00532:capacity=138.7","SITE00537:capacity=400","SITE00540:capacity=129.6","SITE00542:capacity=122.5","SITE00543:capacity=237.3","SITE00550:capacity=199.8","SITE00552:capacity=335.6","SITE00558:capacity=167.2","SITE00564:capacity=213.3","SITE00566:capacity=108.2","SITE00567:capacity=266.4","SITE00573:capacity=226","SITE00579:capacity=224.7","SITE00590:capacity=103.9","SITE00598:capacity=170.9","SITE00608:capacity=152.9","SITE00621:capacity=190.6","SITE00624:capacity=106.5","SITE00625:capacity=164.1","SITE00630:capacity=243.7","SITE00631:capacity=211.2","SITE00633:capacity=187.6","SITE00634:capacity=210","SITE00638:capacity=284.9","SITE00639:capacity=111.8","SITE00642:capacity=158.1","SITE00644:capacity=246.6","SITE00653:capacity=151.3","SITE00656:capacity=171.4","SITE00661:capacity=252","SITE00663:capacity=165.9","SITE00664:capacity=121.1","SITE00667:capacity=160","SITE00671:capacity=152.9","SITE00674:capacity=187","SITE00694:capacity=143.1","SITE00730:capacity=111.8","SITE00734:capacity=183","SITE00749:capacity=154.1","SITE00751:capacity=135.7","SITE00756:capacity=194.2","SITE00782:capacity=130.8","SITE00819:capacity=102.7","SITE00893:capacity=185.6","SITE00996:capacity=166.9","SITE02213:capacity=103.5","SITE00052:capacity=311.8","SITE00136:capacity=133.9"],"sample":[["20100101","0","125.347","55.396","73.201","15.154","36.54","261.824","94.058","119.989","54.073","149.554","331.828","106.786","95.093","116.967","207.874","15.617","77.572","354.527","28.308","2.383","13.404","114.017","136.346","6.296","29.029","1.764","25.895","106.838","203.916","31.147","23.58","0.238","2.847","5.51","24.201","106.407","0.949","39.934","341.788","82.857","167.64","6.518","6.651","190.41","62.143","194.616","13.087","18.671","26.566","45.752","73.964","318.312","22.798","16.344","6.624","100.995","30.289","240.22","13.008","119.883","160.696","32.66","197.874","5.268","24.665","12.428","117.3","0.429","74.612","341.69","3.805","64.903","321.529","144.842","117.683","16.995","34.62","33.59","219.677","121.278","185.432","289.467","55.705","0","12.296","175.576","15.445","132.819","217.447","160.104","144.233","188.703","378.379","189.066","164.569","211.496","0.35","140.582","146.177","248.123","128.225","377.55","119.373","114.512","192.783","182.504","278.686","156.518","198.242","0","246.204","213.534","0.004","91.631","159.998","40.567","20.324","98.66","155.036","219.829","178.314","175.472","197.964","270.509","73.389","148.826","232.832","141.066","160.352","226.567","156.388","114.109","152.374","144.888","173.191","113.995","100.004","166.822","139.018","125.144","182.579","122.057","14.108","171.347","0.547","42.742","22.709","0.036"],["20100101","100","162.932","66.607","95.787","8.438","21.499","349.485","99.501","85.804","63.839","188.75","360.608","107.651","94.131","128.043","280.213","22.038","74.669","374.605","38.957","4.085","10.2","111.192","95.301","3.798","56.247","0.287","52.876","100.892","209.172","19.945","28.223","0","3.916","2.332","44.917","183.634","0","31.428","279.324","85.61","197.242","4.413","9.146","142.172","44.008","194.143","6.199","37.626","18.037","27.761","39.746","330.926","15.122","13.365","8.692","48.955","54.32","237.008","6.029","129.222","125.022","19.97","179.27","2.551","23.463","28.08","108.147","0","125.629","308.467","3.942","73.358","328.088","144.354","118.096","23.995","76.456","1.822","217.197","131.861","169.358","289.676","42.967","0","21.175","168.325","0.476","124.091","214.491","160.366","152.289","163.259","366.904","186.983","145.827","153.754","6.663","140.519","144.844","248.119","121.164","381.602","119.809","114.216","158.282","185.085","263.062","156.514","180.213","0.092","246.368","181.982","0","84.416","159.07","33.295","59.245","99.066","156.096","227.896","162.241","171.393","198.322","262.311","76.625","148.8","232.809","140.843","159.989","203.702","153.965","114.096","149.312","145.015","175.066","114.147","100.194","148.524","137.884","123.566","183.152","122.141","13.491","171.81","0.643","54.34","10.395","0"]]},
+{"href":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_2020_CST.csv","title":"ERCOT Wind Profiles, Hypothetical Sites, 2020","url":"https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_2020_CST.csv","header":["DATE","TIME","SITE00003:capacity=281","SITE00004:capacity=127.9","SITE00017:capacity=130.3","SITE00028:capacity=220.6","SITE00033:capacity=338.6","SITE00041:capacity=400","SITE00042:capacity=252.2","SITE00044:capacity=129.6","SITE00062:capacity=241","SITE00063:capacity=271.2","SITE00070:capacity=400","SITE00071:capacity=203.3","SITE00074:capacity=254.4","SITE00075:capacity=148.9","SITE00076:capacity=357.8","SITE00085:capacity=113","SITE00086:capacity=185.2","SITE00103:capacity=400","SITE00117:capacity=176.1","SITE00125:capacity=140.3","SITE00127:capacity=105.9","SITE00132:capacity=121.4","SITE00134:capacity=153.9","SITE00140:capacity=130.6","SITE00150:capacity=400","SITE00151:capacity=257.3","SITE00155:capacity=136.7","SITE00156:capacity=115.4","SITE00158:capacity=222.3","SITE00160:capacity=202","SITE00181:capacity=208","SITE00187:capacity=151.6","SITE00199:capacity=140.2","SITE00203:capacity=308.9","SITE00221:capacity=228.2","SITE00223:capacity=271.5","SITE00231:capacity=118.6","SITE00234:capacity=112.7","SITE00237:capacity=400","SITE00243:capacity=206.7","SITE00246:capacity=383.9","SITE00254:capacity=117","SITE00256:capacity=208.9","SITE00264:capacity=229.7","SITE00267:capacity=214","SITE00278:capacity=207.4","SITE00279:capacity=212.4","SITE00280:capacity=310.4","SITE00290:capacity=343.2","SITE00296:capacity=212.6","SITE00304:capacity=332.9","SITE00307:capacity=349.1","SITE00310:capacity=210.6","SITE00311:capacity=145.9","SITE00313:capacity=265.6","SITE00316:capacity=155.4","SITE00322:capacity=105.6","SITE00323:capacity=254.9","SITE00325:capacity=221.7","SITE00328:capacity=140.2","SITE00333:capacity=185.3","SITE00340:capacity=143","SITE00355:capacity=232.6","SITE00358:capacity=160","SITE00361:capacity=220.1","SITE00362:capacity=181.4","SITE00365:capacity=230.6","SITE00373:capacity=193.7","SITE00385:capacity=245.3","SITE00390:capacity=375.1","SITE00391:capacity=171.6","SITE00392:capacity=201.6","SITE00394:capacity=352.1","SITE00400:capacity=153.8","SITE00403:capacity=126","SITE00404:capacity=130.8","SITE00410:capacity=351.6","SITE00419:capacity=400","SITE00427:capacity=236.9","SITE00430:capacity=266.9","SITE00434:capacity=295.5","SITE00435:capacity=305.1","SITE00438:capacity=105.7","SITE00440:capacity=121","SITE00454:capacity=150.8","SITE00455:capacity=184.5","SITE00456:capacity=210","SITE00459:capacity=148","SITE00460:capacity=229.8","SITE00461:capacity=169.9","SITE00464:capacity=225.2","SITE00470:capacity=223","SITE00472:capacity=400","SITE00475:capacity=201.6","SITE00478:capacity=191.8","SITE00483:capacity=351.4","SITE00513:capacity=259.7","SITE00523:capacity=162.4","SITE00526:capacity=165","SITE00531:capacity=262.5","SITE00532:capacity=138.7","SITE00537:capacity=400","SITE00540:capacity=129.6","SITE00542:capacity=122.5","SITE00543:capacity=237.3","SITE00550:capacity=199.8","SITE00552:capacity=335.6","SITE00558:capacity=167.2","SITE00564:capacity=213.3","SITE00566:capacity=108.2","SITE00567:capacity=266.4","SITE00573:capacity=226","SITE00579:capacity=224.7","SITE00590:capacity=103.9","SITE00598:capacity=170.9","SITE00608:capacity=152.9","SITE00621:capacity=190.6","SITE00624:capacity=106.5","SITE00625:capacity=164.1","SITE00630:capacity=243.7","SITE00631:capacity=211.2","SITE00633:capacity=187.6","SITE00634:capacity=210","SITE00638:capacity=284.9","SITE00639:capacity=111.8","SITE00642:capacity=158.1","SITE00644:capacity=246.6","SITE00653:capacity=151.3","SITE00656:capacity=171.4","SITE00661:capacity=252","SITE00663:capacity=165.9","SITE00664:capacity=121.1","SITE00667:capacity=160","SITE00671:capacity=152.9","SITE00674:capacity=187","SITE00694:capacity=143.1","SITE00730:capacity=111.8","SITE00734:capacity=183","SITE00749:capacity=154.1","SITE00751:capacity=135.7","SITE00756:capacity=194.2","SITE00782:capacity=130.8","SITE00819:capacity=102.7","SITE00893:capacity=185.6","SITE00996:capacity=166.9","SITE02213:capacity=103.5","SITE00052:capacity=311.8","SITE00136:capacity=133.9"],"sample":[["20200101","0","267.077","118.187","122.157","209.208","173.643","228.79","78.096","50.036","53.255","255.321","377.899","134.807","53.367","141.219","190.835","106.752","159.57","198.434","106.643","132.792","38.217","79.754","80.106","114.4","376.811","238.181","129.754","46.259","102.935","172.666","189.599","123.804","116.092","287.872","215.167","251.649","33.478","71.678","130.761","159.248","361.087","110.55","21.99","124.197","99.419","62.893","199.667","271.1","317.648","127.079","158.892","210.053","150.971","116.262","218.966","81.4","64.418","73.63","205.791","107.576","108.73","73.36","62.588","0","209.306","171.728","143.084","49.697","131.747","104.584","159.673","178.18","194.571","43.298","47.399","59.501","330.502","126.085","81.518","139.618","100.112","145.653","46.658","58.94","116.591","34.151","82.29","25.727","13.796","15.299","54.121","44.413","136.053","55.047","55.026","137.121","106.533","22.642","33.661","40.671","27.208","122.756","11.731","19.786","19.648","1.942","61.985","17.243","26.407","58.804","17.846","25.075","119.741","5.008","21.093","111.779","98.889","3.87","4.875","26.079","51.079","23.451","7.085","5.891","0.618","23.342","6.21","24.397","17.059","32.019","32.595","20.215","17.7","18.344","8.636","7.171","3.481","1.774","49.383","0.765","15.055","0","0.727","1.927","1.88","88.429","216.198","118.187"],["20200101","100","267.124","118.196","122.137","209.842","230.074","228.707","74.724","46.246","48.338","255.543","377.864","100.081","52.079","141.113","190.836","106.725","137.303","198.487","106.836","133.529","40.751","67.638","76.414","116.337","381.736","244.042","129.754","41.696","102.972","187.054","197.515","127.426","105.138","289.928","216.631","251.772","35.537","86.824","136.722","173.718","360.742","110.68","22.224","126.242","157.183","67.217","201.979","281.836","322.607","129.285","155.653","211.732","187.489","133.093","233.646","74.841","64.883","79.462","207.807","92.563","112.451","116.443","62.39","7.951","209.777","171.69","170.104","57.233","133.116","82.657","159.582","182.396","191.607","41.114","42.247","75.696","330.582","96.045","52.45","133.114","100.704","131.825","46.601","38.809","132.608","29.428","78.042","31.053","17.675","22.621","13.912","72.533","143.624","50.899","65.598","206.208","103.197","23.444","46.156","44.918","36.274","103.805","10.195","15.765","32.452","4.806","89.135","10.324","35.955","36.061","22.475","29.994","132.212","9.791","20.61","125.168","75.256","4.032","7.914","7.756","43.678","26.306","4.792","15.21","0.08","26.59","6.613","15.567","24.464","27.133","34.063","12.644","24.162","20.586","5.118","12.028","3.89","6.883","31.146","0.366","10.907","0","0","1.873","0.415","67.788","257.63","119.054"]]}
+]
diff --git a/tools/inputs/generation-profiles/evidence.json b/tools/inputs/generation-profiles/evidence.json
new file mode 100644
index 00000000..612ec9e3
--- /dev/null
+++ b/tools/inputs/generation-profiles/evidence.json
@@ -0,0 +1,186 @@
+{
+ "checkedAt": "2026-09-08",
+ "scope": "Every DATE, TIME and generation value in eight complete original downloads compared with csv.reader or openpyxl independently of the typed reader. Spreadsheet comparisons use stored numeric values exposed by openpyxl, not original XML decimal lexemes. These are modeled planning profiles, not observed generation or point-in-time forecasts.",
+ "rows": 789073,
+ "generationValues": 18187437,
+ "methodologyUrl": "https://www.ercot.com/files/docs/2022/12/19/ERCOT_1980-2021_WindSolarGenProfiles_FINAL_public.pdf",
+ "files": [
+ {
+ "file": "ERCOT_SolarPVProfiles_Metro-Distributed_1980-2020_CST.csv",
+ "sha256": "2519363ad87002fa9c77c9e81a926d67d7b6f6be29d229aada0fafe4649222bb",
+ "rows": 359424,
+ "values": 4313088,
+ "sites": 12,
+ "first": [
+ "1980-01-01",
+ 0
+ ],
+ "last": [
+ "2020-12-31",
+ 2300
+ ],
+ "consecutiveRepeatedClocks": [],
+ "elapsed": 5.99,
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Metro-Distributed_1980-2020_CST.csv"
+ },
+ {
+ "file": "ERCOT_SolarPVProfiles_Rural-Distributed_1980-2020_CST.csv",
+ "sha256": "e52a3a7fe13039a876bf7af384bd7ce90c59b3712044ede6cff1302d8128ef4a",
+ "rows": 359424,
+ "values": 2156544,
+ "sites": 6,
+ "first": [
+ "1980-01-01",
+ 0
+ ],
+ "last": [
+ "2020-12-31",
+ 2300
+ ],
+ "consecutiveRepeatedClocks": [],
+ "elapsed": 4.33,
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Rural-Distributed_1980-2020_CST.csv"
+ },
+ {
+ "file": "ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2020_CST.csv",
+ "sha256": "43a404f66fc0db009bf94cd4f231cfade78f8260732255b60f695293ea5d9c03",
+ "rows": 8784,
+ "values": 1220976,
+ "sites": 139,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2020-12-31",
+ 2300
+ ],
+ "consecutiveRepeatedClocks": [],
+ "elapsed": 0.99,
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2020_CST.csv"
+ },
+ {
+ "file": "ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2020_CST.csv",
+ "sha256": "f3efc3ae0349e7012ab37506f84c7d13626210d033a22952856690217e6000e6",
+ "rows": 8784,
+ "values": 1220976,
+ "sites": 139,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2020-12-31",
+ 2300
+ ],
+ "consecutiveRepeatedClocks": [],
+ "elapsed": 1.0,
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-SingleAxis_2020_CST.csv"
+ },
+ {
+ "file": "ERCOT_WindProfiles_Operational-Planned_2020_CST.csv",
+ "sha256": "f8ac61379600ca5e980304ae80002d311667c3e6a99c579d36f09c96d3879c8c",
+ "rows": 8784,
+ "values": 1361520,
+ "sites": 155,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2020-12-31",
+ 2300
+ ],
+ "consecutiveRepeatedClocks": [],
+ "elapsed": 1.24,
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2020_CST.csv"
+ },
+ {
+ "file": "ERCOT_WindProfiles_Hypothetical_2020_CST.csv",
+ "sha256": "724765f92cfbf037acfbea236b9ebf9941211df6c6d4e177442193a6e0d4683a",
+ "rows": 8784,
+ "values": 1300032,
+ "sites": 148,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2020-12-31",
+ 2300
+ ],
+ "consecutiveRepeatedClocks": [],
+ "elapsed": 1.22,
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Hypothetical_2020_CST.csv"
+ },
+ {
+ "file": "ERCOT-OperationalPlanned-SolarPVProfiles-2020-2021-CST-CDT.xlsx",
+ "sha256": "d351f739b86d25da269aa5bfd9eb70dbc8527dab98fea3a56a7b135363f3e3c5",
+ "rows": 17544,
+ "values": 2877216,
+ "sites": 164,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2021-12-31",
+ 2300
+ ],
+ "consecutiveRepeatedClocks": [
+ [
+ "2020-11-01",
+ 100
+ ],
+ [
+ "2021-11-07",
+ 100
+ ]
+ ],
+ "elapsed": 21.84,
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-OperationalPlanned-SolarPVProfiles-2020-2021-CST-CDT.xlsx"
+ },
+ {
+ "file": "ERCOT-OperationalPlanned-WindProfiles-2020-2021-CST-CDT.xlsx",
+ "sha256": "067b9f02652397df1f5e794b0945b5c38609ec85da84bce6c0c53862221677e6",
+ "rows": 17545,
+ "values": 3737085,
+ "sites": 213,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2022-01-01",
+ 0
+ ],
+ "consecutiveRepeatedClocks": [
+ [
+ "2020-11-01",
+ 100
+ ],
+ [
+ "2021-11-07",
+ 100
+ ]
+ ],
+ "elapsed": 31.45,
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-OperationalPlanned-WindProfiles-2020-2021-CST-CDT.xlsx"
+ }
+ ],
+ "limits": [
+ "25 CSV header samples cover the first two source rows only; the eight complete-file comparisons are listed separately.",
+ "Other Excel vintages, separate site-key workbooks and older ZIP layouts have not all been decoded or verified.",
+ "Repeated clocks and rows beyond filename date ranges are retained. No timezone or hour-start/end convention is inferred.",
+ "Do not merge different profile vintages or treat modeled historical output as contemporaneously available data."
+ ],
+ "embeddedWorkbookSitesCompared": 377,
+ "discovery": {
+ "files": 69,
+ "csv": 25,
+ "xlsx": 19,
+ "zip": 25,
+ "note": "Live index discovery; discovery does not establish decoder support for each linked file."
+ },
+ "readerSha256": "802be208ad4f35fa297b196f5ceed64dd67c5c7f3acd83b8a23d8462259d7777"
+}
diff --git a/tools/inputs/generation-profiles/formats/2015_Wind_Profiles.zip b/tools/inputs/generation-profiles/formats/2015_Wind_Profiles.zip
new file mode 100644
index 00000000..c514122e
Binary files /dev/null and b/tools/inputs/generation-profiles/formats/2015_Wind_Profiles.zip differ
diff --git a/tools/inputs/generation-profiles/formats/ERCOT-Hypothetical-DualAxis-SolarPVProfiles-2020-2021-CST-CDT.xlsx b/tools/inputs/generation-profiles/formats/ERCOT-Hypothetical-DualAxis-SolarPVProfiles-2020-2021-CST-CDT.xlsx
new file mode 100644
index 00000000..4363fe41
Binary files /dev/null and b/tools/inputs/generation-profiles/formats/ERCOT-Hypothetical-DualAxis-SolarPVProfiles-2020-2021-CST-CDT.xlsx differ
diff --git a/tools/inputs/generation-profiles/formats/evidence.json b/tools/inputs/generation-profiles/formats/evidence.json
new file mode 100644
index 00000000..dec84c07
--- /dev/null
+++ b/tools/inputs/generation-profiles/formats/evidence.json
@@ -0,0 +1,102 @@
+{
+ "checkedAt": "2026-09-08",
+ "readerSha256": "4b304fc6f443462a478f0aeb2b4f39a007394751039f292f4572341692336289",
+ "scope": "Every date, clock and MW value in 40 distinct complete CSV bodies compared independently with csv.reader; duplicate byte-identical bodies reused across seven archives are recorded separately. Hypothetical solar workbooks compared with openpyxl, including all embedded site metadata. Values use source numeric precision as exposed by openpyxl; no XML-decimal exactness claim.",
+ "wind": {
+ "uniqueBodies": 40,
+ "rows": 499446,
+ "values": 40418046,
+ "reusedBodies": 36,
+ "archives": [
+ {
+ "title": "Wind shapes 1997-2014 (1997-2012 are updates of original files)",
+ "url": "https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip",
+ "sha256": "375f4342711ad2d68ab57247817c073f46047e1a1f9ad2a4df16bb213e660108",
+ "bytes": 71512340
+ },
+ {
+ "title": "ERCOT 2015 Historical Hourly Wind Generation Profiles",
+ "url": "https://www.ercot.com/files/docs/2017/02/17/2015_Wind_Profiles.zip",
+ "sha256": "4334ebb30e843c5415922cd22b462ac3da272e4256f159da0eb0726f12ec81dd",
+ "bytes": 3831587
+ },
+ {
+ "title": "ERCOT 2014 Historical Hourly Wind Generation Profiles",
+ "url": "https://www.ercot.com/files/docs/2017/02/17/ERCOT_2014_Profiles.zip",
+ "sha256": "b630d4b4daa32af7d30bee647901a7e8760fc0f112ef2918b86e2a667a3422fe",
+ "bytes": 3856820
+ },
+ {
+ "title": "ERCOT 1997-2013 Offshore Wind Generation Profiles",
+ "url": "https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip",
+ "sha256": "fe3b1cfdd721943bf8138e612ff0edebfff6c8756fafc51c5eb03dcf1ddcffd1",
+ "bytes": 1470643
+ },
+ {
+ "title": "ERCOT 1997-2004 Onshore Wind Generation Profiles",
+ "url": "https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip",
+ "sha256": "aae15d744c80dcc65d50a2e40b1126ec6f121804f4f0cf9fb90c972bdc623b82",
+ "bytes": 30890824
+ },
+ {
+ "title": "ERCOT 2005-2013 Onshore Wind Generation Profiles",
+ "url": "https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip",
+ "sha256": "fd54f7f8ba605dff1380d9616e98301a8bee7f3b0cff7219785690aedd91af56",
+ "bytes": 34832158
+ },
+ {
+ "title": "ERCOT 2016 Historical Wind Generation Profiles",
+ "url": "https://www.ercot.com/files/docs/2018/01/30/ERCOT_WindProfiles_2016.zip",
+ "sha256": "898f302248d9054d761170bf69ff46e6999db822336348f4308a99c4404ef2ab",
+ "bytes": 3618811
+ }
+ ]
+ },
+ "windMemberManifest": "legacy-wind-members.csv",
+ "hypotheticalSolar": [
+ {
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-Hypothetical-DualAxis-SolarPVProfiles-2020-2021-CST-CDT.xlsx",
+ "sha256": "60d0eb33800b5a4fe3df59a52df59d2cec5ce177dca796433dd5b34532139e6a",
+ "bytes": 14634931,
+ "sites": 149,
+ "rows": 17544,
+ "values": 2614056,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2021-12-31",
+ 2300
+ ],
+ "elapsed": 19.75
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-Hypothetical-SingleAxis-SolarPVProfiles-2020-2021-CST-CDT.xlsx",
+ "sha256": "37062dcd5ddb753738db2a3e6789f26e0591b3e62b9acf4021edd5a954c457ba",
+ "bytes": 14806204,
+ "sites": 149,
+ "rows": 17544,
+ "values": 2614056,
+ "first": [
+ "2020-01-01",
+ 0
+ ],
+ "last": [
+ "2021-12-31",
+ 2300
+ ],
+ "elapsed": 19.85
+ }
+ ],
+ "sourceDetails": [
+ "An ERCOT_onshore_2011.CSV row contains a 2011 onshore table and a separately dated 2013 offshore table; sourceBlock preserves their identity.",
+ "Six final rows in that file have an empty, shortened offshore block. No offshore records are synthesized.",
+ "Original source records are preserved; totals do not count unique site/timestamp observations across overlapping tables and publications."
+ ],
+ "remainingFormats": [
+ "The two older existing/hypothetical wind-shape workbook layouts are not yet supported. Their four linked URLs resolve to two distinct cached workbook ZIP contents.",
+ "The oldest solar shapes have Date (MM/DD), Time (HH:MM), weather-year columns and TMY3; their units and non-calendar-year representation require separate handling.",
+ "Fifteen of the nineteen newer profile workbooks remain unverified; discovery alone is not evidence of parsing or complete retention."
+ ]
+}
diff --git a/tools/inputs/generation-profiles/formats/legacy-compound.zip b/tools/inputs/generation-profiles/formats/legacy-compound.zip
new file mode 100644
index 00000000..0941d500
Binary files /dev/null and b/tools/inputs/generation-profiles/formats/legacy-compound.zip differ
diff --git a/tools/inputs/generation-profiles/formats/legacy-wind-members.csv b/tools/inputs/generation-profiles/formats/legacy-wind-members.csv
new file mode 100644
index 00000000..28ed5740
--- /dev/null
+++ b/tools/inputs/generation-profiles/formats/legacy-wind-members.csv
@@ -0,0 +1,77 @@
+url,member,sha256,reusesBody,rows,values,sites,blocks,first,last
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2011.CSV,9ba7098e5925ef31a35f7eca6b215d30905b71099ca89a35e3cc0f942e49f088,,17514,1997262,228,2,"[""2011-01-01"", 0]","[""2011-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2012.CSV,be8afea517147cef150b6c623baaab0c7c89cfd59e27eb83dfd8e8a921f12870,,17538,2002662,228,2,"[""2012-01-01"", 0]","[""2012-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2013.CSV,196261b7465a280ed7cf83ad9b1a2b39d7d91e3e2fd338e12d4a830b3bb43a04,,17508,1995912,228,2,"[""2013-01-01"", 0]","[""2013-12-31"", 1700]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2014.CSV,ba8932e72637884040447ca74b286f6db9bd3ee5f716d7a1d7c78215975b4bc5,,8754,1969650,225,1,"[""2014-01-01"", 0]","[""2014-12-31"", 1700]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_1997.CSV,f215ac08f400752bf8f00e37550e5a3f774a6940394873093ffef3aaa0de5a12,,8760,26280,3,1,"[""1997-01-01"", 0]","[""1997-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_1998.CSV,409c99803c74f0748364e503c144f7a3523158831e69bbc5a04ce969f209c118,,8760,26280,3,1,"[""1998-01-01"", 0]","[""1998-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_1999.CSV,b75289b17d915a8db8d1274afc1b5f4ed12ef213f63b411fab534a164adccfc6,,8760,26280,3,1,"[""1999-01-01"", 0]","[""1999-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2000.CSV,f0ec45a04f680248ed1f9f43a82edd0a2510b423cf1ca72d26035dcc88691c88,,8784,26352,3,1,"[""2000-01-01"", 0]","[""2000-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2001.CSV,5ca25fae285ef2ea1d84b33b0aaebc8d0682453c4552b978e55c29e63373e283,,8760,26280,3,1,"[""2001-01-01"", 0]","[""2001-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2002.CSV,7123c93bea72ff0f893993a77e69af70b13818bdeaa03fe8e05496ada460b984,,8760,26280,3,1,"[""2002-01-01"", 0]","[""2002-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2003.CSV,5a64806bb888161531ee80d4e086645998d9f4659c8d3d511bc655aa23b68ea1,,8760,26280,3,1,"[""2003-01-01"", 0]","[""2003-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2004.CSV,804fab5df9654b173dd222e806cf554c0a4f525c8c956b16e027966b2a894d8f,,8784,26352,3,1,"[""2004-01-01"", 0]","[""2004-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2005.CSV,46e0d3257e9777564c5d59c5019a352d92b5bc03e24c402d92da0ba63032aafa,,8760,26280,3,1,"[""2005-01-01"", 0]","[""2005-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2006.CSV,ff53ca453dbfd9c6fdb62d02f7d51cac9e9c57eca770209123c8819d5aa7707d,,8760,26280,3,1,"[""2006-01-01"", 0]","[""2006-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2007.CSV,76a04fd018fca068eaa585d12f454d531b18c0042eb1e244d5e2df638bcba249,,8760,26280,3,1,"[""2007-01-01"", 0]","[""2007-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2008.CSV,ac4be3970616db7856b6da74f90c45fa72f685c5bfcfb790375358e849afe84f,,8784,26352,3,1,"[""2008-01-01"", 0]","[""2008-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2009.CSV,ffeba4fa938e910201c4609248c1d0132e8c7d062a60ada26748aec4f8800096,,8760,26280,3,1,"[""2009-01-01"", 0]","[""2009-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2010.CSV,c4b2185417348dae296f44ea67f09864b872d5124a4cdcd00e3e576b877fa8bf,,8760,26280,3,1,"[""2010-01-01"", 0]","[""2010-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2011.CSV,75b24c2b43a592e25b14dc0373b1827dbb2ba34e3afb139cef7191b28832d2fa,,8760,26280,3,1,"[""2011-01-01"", 0]","[""2011-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2012.CSV,e03726cbc064772d5870c9727a5058ff5dfc595c7d712e268f526734249d39d4,,8784,26352,3,1,"[""2012-01-01"", 0]","[""2012-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2013.CSV,45ca995bed40902bacd2bdd50f9229c0c8dc0bcb3ed0afc24bc220aa4cbc505c,,8754,26262,3,1,"[""2013-01-01"", 0]","[""2013-12-31"", 1700]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_offshore_2014.CSV,7aaab2e55bc89bee2414bbb73f62ecb17cc04f6915823d5c96f6cd0ae8cf9562,,8754,26262,3,1,"[""2014-01-01"", 0]","[""2014-12-31"", 1700]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_1997.CSV,e396ed5fae19e5262ab6c3e368b4f9da26bc873f72c671bbe47468e8a8855cf0,,17514,1997262,228,2,"[""1997-01-01"", 0]","[""1997-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_1998.CSV,9ce23c4328f0c78a404d581fc7b13c8c8a344fc5c0def3ad258be1a0183d2d36,,17514,1997262,228,2,"[""1998-01-01"", 0]","[""1998-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_1999.CSV,e76b6240cdfb817b4a2915497d195aab39f109091633115d2b45eb2857f58c0a,,17514,1997262,228,2,"[""1999-01-01"", 0]","[""1999-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2000.CSV,4fb9b6dabb871ef039bbfd81990718b22eee53dbd666fb89cd1f5be310a7ee53,,17538,2002662,228,2,"[""2000-01-01"", 0]","[""2000-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2001.CSV,c698c52d0a9c539eaefb1dd1cd24129fb66eba23396b9b977efdf9dde5423e23,,17514,1997262,228,2,"[""2001-01-01"", 0]","[""2001-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2002.CSV,cc6d1dee0289855298990fc8e4a87c9db5cd84033c833d019ac9be528fee4ee4,,17514,1997262,228,2,"[""2002-01-01"", 0]","[""2002-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2003.CSV,d022a88840390192fbbca3a9fd4cd7e74b12b77f8c210f8999af4e8d649640c1,,17514,1997262,228,2,"[""2003-01-01"", 0]","[""2003-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2004.CSV,cdf539f547caeef3ecff23b8202df789810b6f93d64255823c9b49b8cd21432e,,17538,2002662,228,2,"[""2004-01-01"", 0]","[""2004-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2005.CSV,8d7766772f88a922e41131263a16393a0e4dc163b2342e650acc9e821bee9037,,17514,1997262,228,2,"[""2005-01-01"", 0]","[""2005-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2006.CSV,9edf57acfe6a087a9e1775a3c696b11d7141c35d45c6b9dd6ba56da512665f75,,17514,1997262,228,2,"[""2006-01-01"", 0]","[""2006-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2007.CSV,27a5db568b8757bdd6a7a0bdae83a7ffc44e8052523cd7c9291f9e1355f88f4c,,17514,1997262,228,2,"[""2007-01-01"", 0]","[""2007-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2008.CSV,a74e1b022a59569b3ac4bab94c5a1fd5cff39fd855b4776059e9760ec79bd485,,17538,2002662,228,2,"[""2008-01-01"", 0]","[""2008-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2009.CSV,6c8b1809992abc19b5564c6858fae541fe6d39876cc2df0e62156577710e04e9,,17514,1997262,228,2,"[""2009-01-01"", 0]","[""2009-12-31"", 2300]"
+https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip,ERCOT_onshore_2010.CSV,7402e83b37682d648d299de2c16c0b7b31c7a8da54cc8cd250daf3c610886de8,,17514,1997262,228,2,"[""2010-01-01"", 0]","[""2010-12-31"", 2300]"
+https://www.ercot.com/files/docs/2017/02/17/2015_Wind_Profiles.zip,ERCOT_offshore_2015.CSV,15f852f4efc95fbd3855cc8e42bbcc896766dac09a6881aca047777c131eb6e1,,8760,26280,3,1,"[""2014-12-31"", 1800]","[""2015-12-31"", 1700]"
+https://www.ercot.com/files/docs/2017/02/17/2015_Wind_Profiles.zip,ERCOT_onshore_2015.CSV,f0259420cf862fcdf09dc571640b4ea5cef265787f5357d19764efbfa465f104,,8760,1971000,225,1,"[""2014-12-31"", 1800]","[""2015-12-31"", 1700]"
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_2014_Profiles.zip,ERCOT_offshore_2014.CSV,7aaab2e55bc89bee2414bbb73f62ecb17cc04f6915823d5c96f6cd0ae8cf9562,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_2014_Profiles.zip,ERCOT_onshore_2014.CSV,ba8932e72637884040447ca74b286f6db9bd3ee5f716d7a1d7c78215975b4bc5,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_1997.CSV,f215ac08f400752bf8f00e37550e5a3f774a6940394873093ffef3aaa0de5a12,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_1998.CSV,409c99803c74f0748364e503c144f7a3523158831e69bbc5a04ce969f209c118,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_1999.CSV,b75289b17d915a8db8d1274afc1b5f4ed12ef213f63b411fab534a164adccfc6,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2000.CSV,f0ec45a04f680248ed1f9f43a82edd0a2510b423cf1ca72d26035dcc88691c88,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2001.CSV,5ca25fae285ef2ea1d84b33b0aaebc8d0682453c4552b978e55c29e63373e283,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2002.CSV,7123c93bea72ff0f893993a77e69af70b13818bdeaa03fe8e05496ada460b984,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2003.CSV,5a64806bb888161531ee80d4e086645998d9f4659c8d3d511bc655aa23b68ea1,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2004.CSV,804fab5df9654b173dd222e806cf554c0a4f525c8c956b16e027966b2a894d8f,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2005.CSV,46e0d3257e9777564c5d59c5019a352d92b5bc03e24c402d92da0ba63032aafa,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2006.CSV,ff53ca453dbfd9c6fdb62d02f7d51cac9e9c57eca770209123c8819d5aa7707d,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2007.CSV,76a04fd018fca068eaa585d12f454d531b18c0042eb1e244d5e2df638bcba249,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2008.CSV,ac4be3970616db7856b6da74f90c45fa72f685c5bfcfb790375358e849afe84f,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2009.CSV,ffeba4fa938e910201c4609248c1d0132e8c7d062a60ada26748aec4f8800096,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2010.CSV,c4b2185417348dae296f44ea67f09864b872d5124a4cdcd00e3e576b877fa8bf,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2011.CSV,75b24c2b43a592e25b14dc0373b1827dbb2ba34e3afb139cef7191b28832d2fa,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2012.CSV,e03726cbc064772d5870c9727a5058ff5dfc595c7d712e268f526734249d39d4,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_offshore_1997-2013.zip,ERCOT_offshore_2013.CSV,45ca995bed40902bacd2bdd50f9229c0c8dc0bcb3ed0afc24bc220aa4cbc505c,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_1997.CSV,e396ed5fae19e5262ab6c3e368b4f9da26bc873f72c671bbe47468e8a8855cf0,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_1998.CSV,9ce23c4328f0c78a404d581fc7b13c8c8a344fc5c0def3ad258be1a0183d2d36,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_1999.CSV,e76b6240cdfb817b4a2915497d195aab39f109091633115d2b45eb2857f58c0a,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_2000.CSV,4fb9b6dabb871ef039bbfd81990718b22eee53dbd666fb89cd1f5be310a7ee53,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_2001.CSV,c698c52d0a9c539eaefb1dd1cd24129fb66eba23396b9b977efdf9dde5423e23,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_2002.CSV,cc6d1dee0289855298990fc8e4a87c9db5cd84033c833d019ac9be528fee4ee4,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_2003.CSV,d022a88840390192fbbca3a9fd4cd7e74b12b77f8c210f8999af4e8d649640c1,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_1997-2004.zip,ERCOT_onshore_2004.CSV,cdf539f547caeef3ecff23b8202df789810b6f93d64255823c9b49b8cd21432e,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2005.CSV,8d7766772f88a922e41131263a16393a0e4dc163b2342e650acc9e821bee9037,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2006.CSV,9edf57acfe6a087a9e1775a3c696b11d7141c35d45c6b9dd6ba56da512665f75,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2007.CSV,27a5db568b8757bdd6a7a0bdae83a7ffc44e8052523cd7c9291f9e1355f88f4c,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2008.CSV,a74e1b022a59569b3ac4bab94c5a1fd5cff39fd855b4776059e9760ec79bd485,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2009.CSV,6c8b1809992abc19b5564c6858fae541fe6d39876cc2df0e62156577710e04e9,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2010.CSV,7402e83b37682d648d299de2c16c0b7b31c7a8da54cc8cd250daf3c610886de8,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2011.CSV,9ba7098e5925ef31a35f7eca6b215d30905b71099ca89a35e3cc0f942e49f088,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2012.CSV,be8afea517147cef150b6c623baaab0c7c89cfd59e27eb83dfd8e8a921f12870,True,,,,,,
+https://www.ercot.com/files/docs/2017/02/17/ERCOT_onshore_2005-2013.zip,ERCOT_onshore_2013.CSV,196261b7465a280ed7cf83ad9b1a2b39d7d91e3e2fd338e12d4a830b3bb43a04,True,,,,,,
+https://www.ercot.com/files/docs/2018/01/30/ERCOT_WindProfiles_2016.zip,ERCOT_offshore_20151231-20161231.CSV,65c461f16af6201b93e5f1f624d6962f89c38285383501aca49dda565ce99ebd,,8790,26370,3,1,"[""2015-12-31"", 1800]","[""2016-12-31"", 2300]"
+https://www.ercot.com/files/docs/2018/01/30/ERCOT_WindProfiles_2016.zip,ERCOT_onshore_20151231-20161231.CSV,2f017555169c66fde17297154a1c546b2d06f6cfc35e2ffc5fcaa9191d626e72,,8790,1977750,225,1,"[""2015-12-31"", 1800]","[""2016-12-31"", 2300]"
diff --git a/tools/inputs/generation-profiles/formats/sources.json b/tools/inputs/generation-profiles/formats/sources.json
new file mode 100644
index 00000000..216e1895
--- /dev/null
+++ b/tools/inputs/generation-profiles/formats/sources.json
@@ -0,0 +1,22 @@
+[
+ {
+ "url": "https://www.ercot.com/files/docs/2017/02/17/2015_Wind_Profiles.zip",
+ "title": "ERCOT 2015 Historical Hourly Wind Generation Profiles",
+ "sha256": "4334ebb30e843c5415922cd22b462ac3da272e4256f159da0eb0726f12ec81dd",
+ "bytes": 3831587
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-Hypothetical-DualAxis-SolarPVProfiles-2020-2021-CST-CDT.xlsx",
+ "title": "ERCOT Hypothetical Dual Axis Solar PV Profiles 2020-2021",
+ "sha256": "60d0eb33800b5a4fe3df59a52df59d2cec5ce177dca796433dd5b34532139e6a",
+ "bytes": 14634931
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/09/23/ercot_wind_shapes_updates_1997_2013_new_2014.zip",
+ "archiveSha256": "375f4342711ad2d68ab57247817c073f46047e1a1f9ad2a4df16bb213e660108",
+ "member": "ERCOT_onshore_2011.CSV",
+ "fixture": "legacy-compound.zip",
+ "bytes": 16229504,
+ "sha256": "9ba7098e5925ef31a35f7eca6b215d30905b71099ca89a35e3cc0f942e49f088"
+ }
+]
diff --git a/tools/inputs/generation-profiles/keys/ERCOT-SolarPVProfiles-1980-2021-Key-public.xlsx b/tools/inputs/generation-profiles/keys/ERCOT-SolarPVProfiles-1980-2021-Key-public.xlsx
new file mode 100644
index 00000000..3ecdb060
Binary files /dev/null and b/tools/inputs/generation-profiles/keys/ERCOT-SolarPVProfiles-1980-2021-Key-public.xlsx differ
diff --git a/tools/inputs/generation-profiles/keys/ERCOT-WindProfiles-1980-2021-Key-public.xlsx b/tools/inputs/generation-profiles/keys/ERCOT-WindProfiles-1980-2021-Key-public.xlsx
new file mode 100644
index 00000000..3de32adb
Binary files /dev/null and b/tools/inputs/generation-profiles/keys/ERCOT-WindProfiles-1980-2021-Key-public.xlsx differ
diff --git a/tools/inputs/generation-profiles/keys/ERCOT_SolarPVProfiles_1980-2020_Key-public.xlsx b/tools/inputs/generation-profiles/keys/ERCOT_SolarPVProfiles_1980-2020_Key-public.xlsx
new file mode 100644
index 00000000..61bbc2fc
Binary files /dev/null and b/tools/inputs/generation-profiles/keys/ERCOT_SolarPVProfiles_1980-2020_Key-public.xlsx differ
diff --git a/tools/inputs/generation-profiles/keys/ERCOT_WindProfiles_1980-2020_Key-public.xlsx b/tools/inputs/generation-profiles/keys/ERCOT_WindProfiles_1980-2020_Key-public.xlsx
new file mode 100644
index 00000000..9a3e8f99
Binary files /dev/null and b/tools/inputs/generation-profiles/keys/ERCOT_WindProfiles_1980-2020_Key-public.xlsx differ
diff --git a/tools/inputs/generation-profiles/keys/evidence.json b/tools/inputs/generation-profiles/keys/evidence.json
new file mode 100644
index 00000000..f2ca3516
--- /dev/null
+++ b/tools/inputs/generation-profiles/keys/evidence.json
@@ -0,0 +1,80 @@
+{
+ "checkedAt": "2026-09-08",
+ "scope": "Every original data-table cell in 11 site/unit tables and every numeric row in both SUMMARY worksheets compared in test_generation_keys.py against independently read original worksheet positions. All four fresh live download hashes match the fixtures. Legend flags checked for four sites and twelve unit rows. Summary counts are not recomputed.",
+ "siteRows": 1828,
+ "summaryRows": 32,
+ "files": [
+ {
+ "title": "ERCOT Solar PV Profiles 1980-2020 Key",
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_1980-2020_Key-public.xlsx",
+ "sha256": "21d3f577aa148048a16c45d60c1065f79b1d8fdfee2dad5e3cbff1beed0f6f50",
+ "bytes": 60004,
+ "siteRows": 420,
+ "summaryRows": 22,
+ "tables": {
+ "Utility_Operational&Planned": 53,
+ "Utility_Hypothetical": 139,
+ "DGPV_metro": 12,
+ "DGPV_rural": 216
+ },
+ "queuedModelFlagTrue": 0,
+ "notes": 11
+ },
+ {
+ "title": "ERCOT Wind Profile 1980-2020 Key",
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_1980-2020_Key-public.xlsx",
+ "sha256": "f9dd952f82a80c32fe179192065890e07b6135820657bd7ec165f8482fd3181b",
+ "bytes": 40998,
+ "siteRows": 530,
+ "summaryRows": 0,
+ "tables": {
+ "Op&Planned_Wind-Summary": 155,
+ "Op&Planned_Wind-Unit_Codes": 227,
+ "Hypo_Wind-Summary": 148
+ },
+ "queuedModelFlagTrue": 16,
+ "notes": 4
+ },
+ {
+ "title": "ERCOT Solar PV Profiles 1980-2021 Key",
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-SolarPVProfiles-1980-2021-Key-public.xlsx",
+ "sha256": "f5c9b981a2e3920c2829c36f9e841110efc0df2378cfbd1e3f8930f4692f6a6e",
+ "bytes": 45710,
+ "siteRows": 313,
+ "summaryRows": 10,
+ "tables": {
+ "Utility_Operational&Planned": 164,
+ "Utility_Hypothetical": 149
+ },
+ "queuedModelFlagTrue": 0,
+ "notes": 3,
+ "matchingSameVintageSolarProfileColumns": 163,
+ "unmatchedProfileColumns": [
+ "TREBA_UNIT1"
+ ],
+ "unmatchedKeyUnitCodes": [
+ "TREBA_UNIT 1"
+ ]
+ },
+ {
+ "title": "ERCOT Wind Profiles 1980-2021 Key",
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-WindProfiles-1980-2021-Key-public.xlsx",
+ "sha256": "bcc685b38b64c5b6943677b5ecbe606e316dcbdc9e9de7a6b2cc12042e278fb6",
+ "bytes": 36714,
+ "siteRows": 565,
+ "summaryRows": 0,
+ "tables": {
+ "Op&Planned_Wind-Summary": 213,
+ "Op&Planned_Wind-Unit_Codes": 352
+ },
+ "queuedModelFlagTrue": 0,
+ "notes": 0
+ }
+ ],
+ "readerSha256": "a24bf5ffd6453ddde40fe2be63e141d86494f4061e81549a29826a061743d68f",
+ "limits": [
+ "No inferred joins between different profile vintages or site families.",
+ "The 1980-2020 solar SUMMARY lists 313 utility profiles; detailed scenario totals sum to 331. Both source values are preserved.",
+ "Workbook source dates are not asserted to be publication dates."
+ ]
+}
diff --git a/tools/inputs/generation-profiles/keys/sources.json b/tools/inputs/generation-profiles/keys/sources.json
new file mode 100644
index 00000000..9717eceb
--- /dev/null
+++ b/tools/inputs/generation-profiles/keys/sources.json
@@ -0,0 +1,26 @@
+[
+ {
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_1980-2020_Key-public.xlsx",
+ "title": "ERCOT Wind Profile 1980-2020 Key",
+ "bytes": 40998,
+ "sha256": "f9dd952f82a80c32fe179192065890e07b6135820657bd7ec165f8482fd3181b"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-SolarPVProfiles-1980-2021-Key-public.xlsx",
+ "title": "ERCOT Solar PV Profiles 1980-2021 Key",
+ "bytes": 45710,
+ "sha256": "f5c9b981a2e3920c2829c36f9e841110efc0df2378cfbd1e3f8930f4692f6a6e"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-WindProfiles-1980-2021-Key-public.xlsx",
+ "title": "ERCOT Wind Profiles 1980-2021 Key",
+ "bytes": 36714,
+ "sha256": "bcc685b38b64c5b6943677b5ecbe606e316dcbdc9e9de7a6b2cc12042e278fb6"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_1980-2020_Key-public.xlsx",
+ "title": "ERCOT Solar PV Profiles 1980-2020 Key",
+ "bytes": 60004,
+ "sha256": "21d3f577aa148048a16c45d60c1065f79b1d8fdfee2dad5e3cbff1beed0f6f50"
+ }
+]
diff --git a/tools/inputs/generation-profiles/legacy-workbooks/evidence.json b/tools/inputs/generation-profiles/legacy-workbooks/evidence.json
new file mode 100644
index 00000000..c730d768
--- /dev/null
+++ b/tools/inputs/generation-profiles/legacy-workbooks/evidence.json
@@ -0,0 +1,51 @@
+{
+ "scope": "Complete original XLSX comparisons using independent openpyxl cell positions: every primary date, source clock, separate calendar date, source year, generation value and embedded site metadata. Numbers use openpyxl interpretation, not XML numeric lexemes. These are modeled scenarios, not observations.",
+ "sourceFiles": [
+ {
+ "url": "https://www.ercot.com/files/docs/2014/01/21/existing_sites_wind_shapes_120926_all_years.zip",
+ "archiveSha256": "96aa4bea385e9e95eebd3f4a15ecb10dafa2f1d1d139e6ec33ad2608d852e953",
+ "member": "new aws shapes 120926 all years.xlsx",
+ "workbookSha256": "f6a7dc047f5e267f79f22a15c176ce6898b78159d4dfdf1742730c1e6dfecfec",
+ "sites": 93,
+ "rows": 131496,
+ "values": 12229128,
+ "first": [
+ "1996-12-31",
+ 1900
+ ],
+ "last": [
+ "2012-01-01",
+ 1800
+ ],
+ "calendarDifferences": 0,
+ "elapsed": 114.37,
+ "decoderSha256": "055c3a734013355ad5f4deab167aac202aacb4e9b062ca2da2619560ac7d3894"
+ },
+ {
+ "decoderSha256": "9e562215e4074e5778ad32bfd142af3a9ebc3d48f08e8ab07a02bc136879e58c",
+ "url": "https://www.ercot.com/files/docs/2014/01/21/hypothetical_sites_wind_shapes_120926.zip",
+ "archiveSha256": "1504733d5c12f4a19a7019a3b77480b084d305656aca55e41e2cb264db04d98c",
+ "member": "Hypotherical sites wind shapes 120926.xlsx",
+ "workbookSha256": "6f9baca85a05aed892d071306f1d230cd515ed2e9fb202fe1809930af3b29b9f",
+ "sites": 133,
+ "rows": 131472,
+ "values": 17485776,
+ "first": [
+ "1997-01-01",
+ 0
+ ],
+ "last": [
+ "2011-12-31",
+ 2300
+ ],
+ "calendarDifferences": 0,
+ "elapsed": 161.44
+ }
+ ],
+ "decoderVersionNote": "The existing workbook passed before a row-width fix for the hypothetical workbook header, which stores only six cells. The existing workbook effective width remained 98 columns. The hypothetical workbook passed after that fix; each receipt retains its decoder hash.",
+ "regressionFixture": {
+ "path": "rows.json",
+ "sha256": "bb59c30bc962c8721bcbafd49d2f35a3954a04d93806b8022429022b58960fe8",
+ "scope": "Original metadata and first three existing/first two hypothetical source rows. Tests inject these source-cell excerpts at the table boundary; they do not read the complete original binary workbooks. Complete originals exceed 100 MB each and are not committed."
+ }
+}
diff --git a/tools/inputs/generation-profiles/legacy-workbooks/rows.json b/tools/inputs/generation-profiles/legacy-workbooks/rows.json
new file mode 100644
index 00000000..d7a78d77
--- /dev/null
+++ b/tools/inputs/generation-profiles/legacy-workbooks/rows.json
@@ -0,0 +1,4 @@
+[
+{"url":"https://www.ercot.com/files/docs/2014/01/21/existing_sites_wind_shapes_120926_all_years.zip","archiveSha256":"96aa4bea385e9e95eebd3f4a15ecb10dafa2f1d1d139e6ec33ad2608d852e953","workbookSha256":"f6a7dc047f5e267f79f22a15c176ce6898b78159d4dfdf1742730c1e6dfecfec","member":"new aws shapes 120926 all years.xlsx","metadata":[["Generator",null,"Wolf Ridge","Pecos Wind (Woodward 2)","Pecos Wind (Woodward 1)","Whirlwind Energy","Champion Wind Farm","Turkey Track Wind Energy Center","Stanton Wind Energy","West Texas Wind Energy","Red Canyon","Panther Creek 3","Penascal Wind 3","Papalote Creek Wind Farm","Ocotillo Wind Farm","Notrees-1","Langford Wind Power","King Mountain SE","King Mountain NW","King Mountain NE","Kunitz Wind","Sherbino I","Sherbino Mesa Wind Farm 2","Indian Mesa Wind Farm","Inadale Wind","Hackberry Wind Farm","Goat Wind 2","Goat Wind","Snyder Wind Farm","Elbow Creek Wind Project","Delaware Mountain Wind Farm","Papalote Creek Wind","Camp Springs 2","Camp Springs 1","Callahan Wind","Cedro Hill Wind","Buffalo Gap Wind Farm 2","Buffalo Gap Wind Farm 1","Buffalo Gap Wind Farm 3","Barton Chapel Wind","Bull Creek Wind Plant 2","Bull Creek Wind Plant 1","Green Mountain Energy 2","Green Mountain Energy 1","Gulf Wind I","Gulf Wind II","Desert Sky Wind Farm 1","Desert Sky Wind Farm 2","King Mountain SW","Mesquite Wind","Post Oak Wind 1","Post Oak Wind 2","Penascal Wind 1","Penascal Wind 2","Trent Wind Farm","South Trent Wind Farm","Capricorn Ridge Wind 4","Capricorn Ridge Wind 3","Capricorn Ridge Wind 1","Capricorn Ridge Wind 2","Horse Hollow Wind 3","Horse Hollow Wind 1","Horse Hollow Wind 4","Horse Hollow Wind 2","Loraine Windpark II","Loraine Windpark I","Sand Bluff Wind Farm","Forest Creek Wind Farm","Panther Creek 1","Panther Creek 2","McAdoo Wind Farm","Pyron Wind Farm","Texas Big Spring","Sweetwater Wind 2","Sweetwater Wind 1","Sweetwater Wind 3","Sweetwater Wind 4","Sweetwater Wind 6","Sweetwater Wind 7","Sweetwater Wind 5","Roscoe Wind Farm","Silver Star","Archer-Young","Briar Creek","WKN Mozart","Baker Ranch","Redfish (Magic Valley)","Los Vientos","Whitetail Wind Energy Project","Anacacho Windfarm","Blue Summit Windfarm","Penascal Wind Farm 3","Senate Wind Project","Gunsight Mountain","Stephens-Borlynn Wind Project",null,null,null],["Site Name per AWS",null,"#57 WHTTAIL_WR1 11/14/08","#17 WOODWRD2_WOODWRD2","#16 WOODWRD1_WOODWRD1","#39 WEC_WECG1","#48 TKWSW","#60 TTWEC_G1 11/18/08","#40 SWEC","#26 SW_MESA_SW_MESA","#15 RDCANYON_RDCNY1","#71 PC_SOUTH_PANTHER3 (7/13/09)","#76 PENA_UNIT3 (3/31/2010)","#72 PAP1_PAP1 (9/5/09)","#52 DUKE_OCOTILLO","#70 NWF_NWF1 (2/14/09)","#75 LGD_LANGFORD (10/31/09)","#24 KING_SE_KINGSE","#23 KING_NW_KINGNW","#22 KING_NE_KINGNE","#14 KUNITZ_WIND_LGE","#53 KEO_KEO_SM1","#82 KEO_SHRBINO2 (9/15/2011)","#21 INDNNWP_INDNNWP","#67 INDL_INADALE1 12/20/08","#56 HWF_HWFG1 11/08/08","#77 GOAT_GOATWIN2 (4/14/10)","#45 GOATWIND","#43 ENAS","#61 ELB_ELBCREEK 11/21/08","#18 DELAWARE_WIND_NWP","#78 COTTON_PAP2 (6/22/10)","#6 CSEC_CSECG2","#5 CSEC_CSECG1","#7 CALLAHAN_WND1","#79 CEDROHIL_CHW1 (10/27/10)","#4 BUFF_GAP_UNIT2","#3 BUFF_GAP_UNIT1","#42 BUFF_GAP_UNIT3","#41 BRTSW","#59 BULLCRK_WND2 11/15/08","#58 BULLCRK_WND1 11/15/08","#20 BRAZ_WND_WND2","#19 BRAZ_WND_WND1","#64 TGW_T1 12/20/08","#65 TGW_T1 12/20/08","#27 INDNENR_INDNENR","#28 INDNENR_INDNENR_2","#25 KING_SW_KINGSW","#29 LNCRK_G83","#46 LNCRK2_G871","#47 LNCRK2_G872","#62 PENA_UNIT1 12/2/08","#63 PENA_UNIT2 12/2/08","#38 TRENT_TRENT","#68 STWF_T1 12/25/08","#51 CAPRIDGE_CR4","#9 CAPRIDGE_CR2","#8 CAPRIDGE_CR1","#50 CAPRIDGE_CR3","#11 HHOLLOW3_WND_1","#13 H_HOLLOW_WND1","#12 HHOLLOW4_WND_1","#10 HHOLLOW2_WIND1","#74 LONEWOLF_G2 (10/24/09)","#73 LONEWOLF_G1 (10/24/09)","#2 MCDLD_SBW1","#1 MCDLD_FCW1","#54 PC_NORTH_PANTHER1 9/29/08","#66 PANTHER_CREEK2 12/20/08","#55 MWEC_G1 11/08/2008","#69 PYR_PYRON1 (12/30/08)","#30 SGMTN_SIGNALMT","#33 SWEETWN2_WND24","#31 SWEETWND_WND1","#32 SWEETWN2_WND2","#34 SWEETWN3_WND3","#36 SWEETWN4_WND4B","#35 SWEETWN4_WND4A","#37 SWEETWN4_WND5","#49 TKWSW1_Roscoe ","#44 FLTCK","#83 TRINITY_TH1_BUS1 (12/1/11)","Briar Creek","WKN Mozart","Baker Ranch","Redfish Wind Project","Los Vientos","Whitetail Wind Energy Project","Anacacho Windfarm","Blue Summit Windfarm","Penascal Wind Farm 3","Senate Wind Project","Gunsight Mountain","Hypothetical Site",null,null,null],["MW per ERCOT",null,112.5,78,82,60,126.5,169.5,123.6,75,84,199.5,101,179.9,58.8,152.6,150,40.3,79.3,79.3,39.8,150,150,82.5,197,165.6,69.6,80,63,121.9,28.5,200.1,120,130.5,114,150,232.5,120.6,170.2,120,89,91,66,99,138.5,138.5,84,76.5,79.3,200,100,100,160.8,100.8,150,101.2,112.5,149.5,214.5,186,223.5,213,115,184,124.5,126,90,124.2,142.5,115.5,150,249,30.4,16,37.5,97.5,129,105.8,119,80.5,209,60,117.5,50,30,400,206,400,92,100,170,202,150,120,179.9,null,null,null],["2006 MWh",null,378488.5999999989,259320.70000000097,263887.30000000173,234355.29999999978,451049.8000000002,542580.1000000007,380997.19999999914,234307.10000000085,309468.30000000185,637325.599999999,260179.3000000004,651281.4999999983,206095.10000000044,609444.8000000005,557684.4000000014,96816.30000000013,235299.0000000001,211521.50000000183,128349.90000000143,672283.2000000011,568394.0999999993,312907.2000000009,721862.9999999964,512072.2999999992,237395.10000000062,264519.0000000016,260647.40000000026,441961.5999999995,92803.80000000045,531045.6000000004,458689.0000000013,479379.9000000007,389154.39999999973,485593.9999999988,800905.700000001,451341.3999999997,626511.8000000019,361261.59999999905,277014.39999999973,294734.0000000013,242431.5000000001,393613.3000000019,361719.99999999994,341130.90000000026,292774.6000000013,264948.4000000005,229677.40000000125,682270.6999999997,374949.70000000065,379047.4999999997,409139.9999999996,243211.0000000003,590864.2999999988,410300.79999999824,329427.49999999854,506590.9000000004,707324.4999999988,555780.6999999988,708018.1999999997,716239.0999999981,344119.7000000007,618189.3999999979,405422.4000000003,411693.99999999994,310244.3000000001,524742.000000001,508521.60000000044,406313.20000000106,575926.1000000001,864305.9000000029,83066.20000000006,55553.49999999972,122253.70000000023,363400.79999999923,441490.60000000225,419940.90000000066,416237.1999999993,340696.1000000016,719101.1999999962,154828.99999999985,360738.69999999873,181815.30000000095,110944.5000000001,1465939.6999999976,486178.1,1056727.0999999994,271252.9999999999,188675.20000000045,673740.7000000001,497135.4999999982,590793.9999999979,440469.3000000001,601173.1000000008,null,null,null],["2011 MWh",null,397694.0000000009,280173.2999999994,284933.79999999877,247785.3999999997,462599.4,552132.6000000018,383961.2000000003,247776.80000000077,316705.2000000001,656661.2999999985,303747.8999999999,733142.9000000004,210262.400000001,625839.1999999973,576607.8000000004,101246.80000000088,248989.60000000134,221668.9000000004,141458.2000000002,719692.7999999973,612343.1999999976,334747.19999999925,737978.1999999968,535238.8000000007,243778.09999999945,273508.7000000008,265999.40000000084,449839.79999999993,100934.29999999994,613486.8999999987,469166.50000000163,487753.49999999773,407427.2000000006,533052.5999999993,831333.4000000006,465865.4,646566.7000000012,387309.5999999974,280952.3000000007,296800.5999999992,246259.7000000003,402641.5999999981,416066.0999999996,396690.09999999957,312119.1999999994,282289.5000000004,242129.3000000008,708141.8999999989,386985.1000000001,391469.7000000007,478085.4999999979,285502.4000000006,611052.8000000004,422222.6999999995,342362.80000000005,522648.5000000006,731413.6999999997,578145.900000001,733414.7000000019,739432.7000000037,358017.60000000027,638980.4999999997,413005.7999999986,419695.0999999996,316396.9999999998,535947.9999999991,516345.7000000005,412160.29999999894,602059.400000001,883007.9999999967,84959.39999999988,57852.19999999972,127919.70000000029,374781.0999999998,454473.899999998,424715.80000000144,427787.299999999,348077.2999999989,735632.6999999989,165289.6000000005,386529.90000000066,192195.70000000054,113281.8000000005,1532053.1999999925,566358.2999999983,1231704.1000000036,298840.60000000155,205047.1000000012,702551.6000000002,583603.6000000006,620376.2000000002,440261.2000000007,607284.6999999988,null,null,null],["2011 CF",null,0.40354540842212167,0.41004171057253164,0.39666694509410677,0.47143340943683354,0.41745573663977475,0.3718515375601095,0.35462125578164977,0.37713363774733755,0.4303995433789956,0.37574604319016636,0.34331106740811057,0.4652146296395006,0.408206753020845,0.4681705835532634,0.43881872146118756,0.2867953816694452,0.3584296383308305,0.31910049116988315,0.4057335765585926,0.5477114155251122,0.4660146118721443,0.463189705271896,0.42763495816238833,0.3689632828182565,0.3998354917860696,0.3902806792237455,0.48198775096035523,0.42125984694393553,0.4042870303612911,0.34998876132709833,0.4463151636225282,0.42666377998215305,0.4079820555956106,0.40567168949771637,0.4081766583198314,0.4409699978039786,0.43366030563022906,0.3684452054794496,0.36036157713816724,0.37232249485674046,0.4259369378718699,0.4642793229094577,0.3429323475594676,0.3269621515586103,0.42416721026309984,0.4212395917271024,0.3485539855009887,0.40419058219178017,0.44176381278538823,0.446883219178083,0.3394028004952392,0.3233293469594846,0.46503257229832606,0.4762740944285012,0.3474001014713344,0.39908408545990487,0.3892527487732966,0.3548300559728979,0.374600175702043,0.39629166934636934,0.3553877307921384,0.3964292361524715,0.3786890025856839,0.3802412662172933,0.4013153221714863,0.4926028867859314,0.4136391091884967,0.40736158058075767,0.4581882800608835,0.40481927710843224,0.319031633020908,0.41275827625570577,0.38940547945205567,0.4388023650626388,0.40217505575023715,0.4582565105178219,0.4103711484593828,0.49360064097109796,0.40180064888247957,0.31447792998478025,0.37552696006995107,0.4388029680365309,0.4310570776255727,0.4372297945205458,0.31384841734273083,0.3515137271689508,0.37080677982926535,0.23407203196347168,0.47176443728176215,0.3298089877480902,0.4721280060882802,0.41881773211567797,0.3853515144131308,null,null,null],["Site ID",null,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,4025,null,null,null],[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],["YYYYMMDD","YYMMHH(CST)",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Year","Month","Day"]],"sampleRows":[[10,[19961231,1900,33.9,0.1,1.1,16.5,4.1,6.2,0,0,4.5,2.9,48.8,60.3,0,0.5,12.1,0.4,1.7,0.8,1.9,2.2,2,0.4,0,24.3,0,0,0,0,0.2,34,0,0,3.2,3.6,8.6,3.7,9.5,26.7,13,11.8,6,3.9,68,60.4,0.9,0,2.9,34.5,19.5,18.1,76.1,48.4,2.8,3.1,0,0.4,2.9,0.1,10.6,8,6.8,6.9,0.8,0.6,1.7,7.3,1.5,1.9,29.4,0,0,0.4,1.3,6.9,9.5,9.7,4.1,6.3,0.2,2.3,31.6,16.2,0.8,69.1,93.9,177.5,0.1,7.4,48.3,94.4,59.2,1,19.9,1996,12,31]],[11,[19961231,2000,33.7,0,0,10.3,9.1,14.3,0,0,2,1.7,44.1,57,0,4.6,19.2,0.1,0.3,0.2,7,0,1.3,0,1,36.6,3.3,0.7,0,0,2.8,42.2,0.2,0.3,22.6,28,21,20.2,21.1,35.3,1.9,2,0.3,6,62.5,55.1,0.6,0,0.6,46.6,27.9,30.3,69.6,39.5,16.3,14.3,0.9,2.5,2,2.3,18,21.8,25,35.9,2.9,2.5,0.3,1,0,0,34.2,0.4,0,2,4.5,14.9,19.8,20.3,15,15.6,2.2,6.8,30.4,14.7,7.6,92.7,73.1,143.7,14.6,14.9,54.3,74.9,54.7,0,4.3,1996,12,31]],[12,[19961231,2100,19.5,0,0,11.9,35.8,57.7,0,0,0.2,19.4,32.1,46.3,0,4.7,35.4,0,0,0,10.7,7.2,14.8,0,38.3,43.1,26.3,21.2,0.7,0,11.4,31.8,1.7,2.2,41.9,24.8,92.5,58.2,66.1,27,0,0,0,1.3,42.8,38.2,4.7,0,0,65.5,35.4,34.1,53.4,30.2,76,52.9,10.9,23.2,35.9,31.3,76.1,73.5,26.1,55.4,24.5,23.9,3.3,8.8,0.6,1.6,33.6,14.7,0,6.8,14.4,51.3,57.2,57.8,45.6,42.7,41.5,5.2,25.6,15.6,5.3,88.4,41.7,76,12.6,7.5,27,68.5,45.6,0,0,1996,12,31]]],"emptySheets":["Sheet2","Sheet3"],"scope":"Source cell-value excerpts from the complete original workbook; not a full workbook or full-history fixture."},
+{"url":"https://www.ercot.com/files/docs/2014/01/21/hypothetical_sites_wind_shapes_120926.zip","archiveSha256":"1504733d5c12f4a19a7019a3b77480b084d305656aca55e41e2cb264db04d98c","workbookSha256":"6f9baca85a05aed892d071306f1d230cd515ed2e9fb202fe1809930af3b29b9f","member":"Hypotherical sites wind shapes 120926.xlsx","metadata":[[null,null,null,null,null,"COUNTY","Briscoe","Crockett","Briscoe","Crockett","Briscoe","Crockett","Crockett","Glasscock","Crockett","Knox","Haskell","Glasscock","Childress","Crockett","Glasscock","Haskell","Haskell","Crockett","Haskell","Childress","Knox","Briscoe","Briscoe","Briscoe","Castro","Castro","Castro","Castro","Swisher","Castro","Crosby","Castro","Swisher","Castro","Swisher","Swisher","Swisher","Swisher","Swisher","Gray","Gray","Gray","Gray","Gray","Gray","Gray","Gray","Gray","Parmer","Parmer","Parmer","Parmer","Parmer","Parmer","Carson","Carson","Floyd","Carson","Carson","Floyd","Borden","Floyd","King","Floyd","Borden","King","Floyd","Borden","King","Borden","Borden","Floyd","Cameron","Cameron","Howard","Kinney","Mills","Roberts","Roberts","Pecos","Pecos","Pecos","Roberts","Randall","Oldham","Baylor","Deaf Smith","Nolan","Deaf Smith","Randall","Oldham","Pecos","Deaf Smith","Deaf Smith","Pecos","Oldham","Deaf Smith","Schleicher","Comanche","Archer","Wilbarger","Wilbarger","Upton","Clay","Kenedy","Jack","Mills","Val Verde","Kenedy","Kent","Upton","Val Verde","Webb","Kleberg","Jack","Stonewall","Comanche","Kleberg","San Patricio","Jim Hogg","Willacy","San Patricio","Willacy","Hidalgo","San Patricio","Hidalgo","Willacy","Willacy","Live Oak","Caldwell","Galveston (NEAREST)","Nueces (NEAREST)","Cameron (NEAREST)"],[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],[null,null,null,null,null,"SITE_ID",1006,1009,1014,1017,1022,1024,1025,1026,1028,1029,1030,1031,1032,1033,1036,1037,1039,1040,1041,1042,1043,1050,1053,1054,2013,2014,2016,2018,2019,2021,2022,2026,2027,2028,2029,2030,2031,2032,2033,3001,3002,3003,3004,3005,3006,3007,3008,3009,3011,3014,3015,3017,3018,3019,4001,4002,4003,4004,4005,4006,4007,4011,4014,4015,4016,4017,4018,4019,4021,4025,4026,4030,5002,5003,6001,7001,8001,9001,9003,9012,9018,9023,9027,9035,9038,9043,9045,9047,9048,9049,9051,9053,9059,9063,9064,9065,9071,9075,9077,9080,9100,9111,9120,9130,9155,9161,9162,9168,9192,9199,9208,9216,9217,9237,9238,9244,9297,9303,9311,9334,9342,9360,9408,9411,9419,9441,9471,9489,9518,9592,20001,20002,20003],[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],[null,null,null,null,null,"MW",100.3,107.3,142.2,100,120.5,117.2,94.6,100.7,94.9,100,100.7,139.3,99.8,164.4,125.7,101,101.8,94.5,100.8,102.3,197.4,173.6,136.2,101.5,101.3,117.3,151.7,150.9,123.6,116.8,182.5,119.3,104.1,127.9,133,116.3,102.4,162.8,129.2,237.8,131.6,198.9,211,151.4,186.9,286.3,181.7,100.5,324.8,232.2,196.1,265.6,229.2,178.7,100.1,100.2,100.4,167.9,135.1,179.3,103.1,206.9,100.1,213.8,143.8,100.1,181.2,100.3,149.6,179.9,111.5,185,399.9,399.9,120,180,100.1,100.2,100.2,99.9,99.9,120.8,134.7,99.9,154.8,102,99.9,126.8,114.9,107.7,127.4,121.4,110.7,127.8,131.2,100,195.8,119.4,104.4,100,127.5,138.6,120.7,100.1,100.1,99.9,160.2,99.9,122.9,134.9,157,103,100,100,128.9,132.9,172.4,100.1,100.4,110.8,100,120.1,100.5,100.5,100,100.1,163.8,135.3,99.9,100.1,500,500,500],[null,null,null,null,null,"Sum",5393834.799999952,5830969.699999966,7716428.400000063,5195442.100000003,6306643.299999944,5986925.099999952,4825058.100000022,5035319.799999957,4731333.000000043,5003938.100000025,5049269.000000055,6964534.60000004,4977716.6999999825,8113235.399999978,6124654.799999953,4973318.500000039,4932222.499999996,4578473.300000061,4824778.300000114,4862860.099999973,9318838.899999972,8631450.999999944,5880496.799999933,4213339.900000066,5288270.199999934,6148071.900000033,7875597.899999984,7845499.500000001,6425970.79999992,6010370.399999928,9517795.59999991,6122042.099999865,5432039.599999945,6545026.099999954,6786387.099999879,6003723.39999991,5188979.099999942,8214932.299999992,6646219.699999981,13003638.500000013,7035068.299999955,11516109.099999921,12110634.899999952,8801957.999999939,10812103.800000027,16295015.000000007,10148092.09999976,5463964.800000027,16894357.599999785,11942467.899999985,9994646.999999918,13592823.29999973,11663483.199999807,9088561.399999864,5525130.5999999875,5444360.099999969,5459643.600000009,9827117.400000041,7841818.699999934,10101832.399999822,5317660.799999912,11232666.499999873,5117750.700000023,11047486.49999978,7432349.19999993,5028751.699999945,9036808.899999999,4933766.100000046,7301990.200000041,8412119.499999888,5174390.89999996,9656522.199999891,19688811.099999983,19199814.299999975,6299013.099999807,8245876.899999737,5200137.799999966,5657099.200000054,5543804.199999934,5941204.400000013,5945600.800000047,7083948.400000019,7588866.799999942,5610874.400000116,8900015.899999982,5641084.200000054,5501852.400000063,6916562.300000032,6237976.899999955,5860954.800000039,7158470.999999978,6663079.500000174,5964530.9000000125,6921135.299999937,7250635.399999999,5436350.7999999635,10360917.69999987,6336123.399999997,5548778.700000104,5328967.999999952,6670635.799999908,7147705.999999902,6218587.499999924,5071898.799999989,4957074.999999894,4960815.400000112,7872039.599999986,4945924.99999999,5890315.000000013,6489155.100000067,7410814.100000012,4923885.200000031,4659761.000000036,4564510.700000022,6072814.899999983,6133551.499999998,8935930.49999982,4950761.000000005,4935960.100000004,5458826.899999964,4814430.599999957,5702858.500000052,4629339.700000016,4638738.70000005,4500748.700000066,4481738.600000033,7153261.0999999875,5773513.900000004,4153566.900000095,3949863.7000000053,20180373.300000172,25073006.000000563,25064480.799999814],[null,null,null,null,null,"Count",131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472,131472],[null,null,null,null,null,"CF",0.4090377947331148,0.4133403406616926,0.41274656226235035,0.3951747976755509,0.39808695993580406,0.38854644843724573,0.3879521304514636,0.3803332707315039,0.37921371278773836,0.38060865431422847,0.3813868969302064,0.38028370306477927,0.37937295273277344,0.37536951055715795,0.3706065311364763,0.37453432843284623,0.3685204666376404,0.36851537141028934,0.3640688822509943,0.36156207667840506,0.35907187205732344,0.3781819692539159,0.3284003722807358,0.3157382403175971,0.39707351647758393,0.3986645839344379,0.3948795872649817,0.3954559275719663,0.3954458364988787,0.39140387827773887,0.3966799368499282,0.39032161183022784,0.39689801619074505,0.3892311314107541,0.38810900356952294,0.3926518889858863,0.385432822376148,0.38381002885041726,0.3912721259839987,0.4159295418798321,0.4066110335696634,0.44039027279341175,0.4365672837839925,0.44220143453602745,0.44001515571503497,0.4329125209652209,0.4248114395173362,0.41353146643562244,0.3956328935685969,0.3911997761358378,0.3876650033447001,0.3892676658853299,0.3870618653151864,0.3868452988157827,0.4198316743497457,0.41328139176192835,0.41361598149206813,0.44518669730087357,0.44149742882887527,0.4285352975389118,0.3923093839071945,0.41294204528763856,0.3888765715846785,0.39302711099521037,0.3931279761436233,0.38211390805859174,0.379335628855646,0.3741487976741589,0.37125848028315056,0.3556648943204847,0.3529808116826567,0.39702307181222396,0.37448533782161586,0.36518451559768317,0.3992620165003326,0.34844246092111447,0.3951368243536893,0.42943041749044614,0.42083019369560243,0.4523511889643091,0.4526859218960995,0.4460414153100473,0.4285249025166346,0.4272005363036241,0.43730712824675794,0.42065798846008323,0.4188998235183022,0.41489458815090396,0.41294333782104403,0.41392284763261983,0.42738332379037924,0.41746785329126485,0.40982212636920984,0.4119203196339168,0.42034797773874505,0.41349875258609925,0.40248737933129236,0.40363240944081874,0.40426266630437513,0.4053310210539089,0.39794566262673436,0.39225652884834533,0.39187829498304555,0.38539247657538916,0.3766674940004542,0.37770636950691355,0.3737588533683017,0.37657264481226915,0.36454686512403217,0.36588359300129664,0.35903186670635506,0.36361134446583265,0.35442991663624474,0.3471850051722056,0.3583470693078626,0.3510377041833566,0.3942477752181395,0.37618771942430246,0.37394235428979017,0.3747367560714335,0.3661943683826181,0.3611738668650362,0.3503641961181085,0.35107554445128997,0.3423351512109093,0.34054865968885933,0.332167326017727,0.32457057844583576,0.31624411468789704,0.30013370012000945,0.3069911966046029,0.3814197091395972,0.38129002068881307],[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],["year","DATE-CST","TIME-CST","Year","Month","Day",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]],"sampleRows":[[11,["1997",19970101,0,1997,1,1,50.1,47,73.2,55,70.2,66.3,39.5,20.8,43.3,7.2,21.6,0.2,19.9,75.8,2.2,13.5,25.8,27.1,14.7,26.7,17.5,48.2,13.3,0.8,58.3,76.1,81.7,90.2,76.6,61,37.3,71.9,62.9,81,67.3,49,50,81.5,68.1,110.4,56,97.6,118,101.4,100,179.4,82.4,38.9,167,13.6,46.1,124.5,56.5,98.8,66.1,65.7,47.4,112.9,84.1,86.6,0,90.1,18.8,87.4,0,25,78.2,0.4,37.3,4.1,0,69.3,122.1,96.7,7.1,17.8,19.4,53,70.8,54.4,83.4,16.5,86.6,68.4,103.1,18.4,8.8,47.9,44.9,73.4,44.1,0.9,34.7,4,98.7,3.4,43.6,72.3,7.8,21.3,30.7,18.4,21.7,29.2,30.4,21,46.1,16.9,28.9,24.3,57.5,12.1,10.2,27.2,31.2,32.6,12.7,29.6,30.8,11,27.3,32.1,13.5,18.4,23.8,8.7,28.6,15,12.8,9.1,81,212,187]],[12,["1997",19970101,100,1997,1,1,37.9,33.8,88.9,51.9,77.4,49,36,20.4,39.3,16.1,27.5,3,15.2,80.1,6.9,20.3,27.1,38,28.5,14.6,28.4,24.2,1.3,0,49.9,71.2,73.2,74.9,74,59.1,35.1,60.8,63.4,72.5,69.4,41.4,47.8,78.7,67.1,103.6,51.9,82.9,98.4,83.4,89.1,142.4,73.3,35.9,150.6,11.7,40.9,99.6,40.3,81.1,49.8,51,39,81.1,70.5,82.5,18.8,91.2,34.2,84.3,12.1,36,72.6,3.1,24.9,14.7,0,62,109,93.6,13.7,11.8,19.3,49.7,70.4,34,80,7.4,75.9,72,122.8,26,12.3,49.4,38.8,82.2,90.4,7.5,35.4,11.6,87,10.6,36.4,48.1,10.6,27.1,24.3,21.7,27.5,34.9,31.5,25.2,37,15.6,23.9,28.3,37.8,13.4,10.3,25.3,36.8,43.2,17.3,23,23.7,7.7,23.9,23.9,9.2,13.6,19.3,6.6,20.4,7.7,6.5,11.5,93.5,206.4,181.4]]],"emptySheets":[],"scope":"Source cell-value excerpts from the complete original workbook; not a full workbook or full-history fixture."}
+]
diff --git a/tools/inputs/generation-profiles/profiles.zip b/tools/inputs/generation-profiles/profiles.zip
new file mode 100644
index 00000000..3bcc7f2d
Binary files /dev/null and b/tools/inputs/generation-profiles/profiles.zip differ
diff --git a/tools/inputs/generation-profiles/sources.json b/tools/inputs/generation-profiles/sources.json
new file mode 100644
index 00000000..e6236f31
--- /dev/null
+++ b/tools/inputs/generation-profiles/sources.json
@@ -0,0 +1,20 @@
+[
+ {
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_SolarPVProfiles_Hypothetical-DualAxis_2020_CST.csv",
+ "title": "ERCOT Hypothetical Dual Axis Solar PV Profiles 2020",
+ "bytes": 5141649,
+ "sha256": "43a404f66fc0db009bf94cd4f231cfade78f8260732255b60f695293ea5d9c03"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2021/12/07/ERCOT_WindProfiles_Operational-Planned_2020_CST.csv",
+ "title": "ERCOT Wind Operational and Planned 2020",
+ "bytes": 9339820,
+ "sha256": "f8ac61379600ca5e980304ae80002d311667c3e6a99c579d36f09c96d3879c8c"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/12/19/ERCOT-OperationalPlanned-SolarPVProfiles-2020-2021-CST-CDT.xlsx",
+ "title": "ERCOT Operational Planned Solar PV Profiles 2020-2021",
+ "bytes": 17281139,
+ "sha256": "d351f739b86d25da269aa5bfd9eb70dbc8527dab98fea3a56a7b135363f3e3c5"
+ }
+]
diff --git a/tools/inputs/history-formats.json b/tools/inputs/history-formats.json
new file mode 100644
index 00000000..03ae0d57
--- /dev/null
+++ b/tools/inputs/history-formats.json
@@ -0,0 +1,10707 @@
+{
+ "np4-190-cd/dam_stlmnt_pnt_prices": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "SettlementPoint": "settlementPoint",
+ "SettlementPointPrice": "settlementPointPrice",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ }
+ },
+ "np6-905-cd/spp_node_zone_hub": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "SettlementPointName": "settlementPoint",
+ "SettlementPointType": "settlementPointType",
+ "SettlementPointPrice": "settlementPointPrice",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ }
+ },
+ "np4-188-cd/dam_clear_price_for_cap": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "AncillaryType": "ancillaryType",
+ "MCPC": "MCPC",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ }
+ },
+ "np6-345-cd/act_sys_load_by_wzn": {
+ "columns": {
+ "OperDay": "operatingDay",
+ "HourEnding": "hourEnding",
+ "COAST": "coast",
+ "EAST": "east",
+ "FAR_WEST": "farWest",
+ "NORTH": "north",
+ "NORTH_C": "northC",
+ "SOUTHERN": "southern",
+ "SOUTH_C": "southC",
+ "WEST": "west",
+ "TOTAL": "total",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "operatingDay": "%m/%d/%Y"
+ }
+ },
+ "np3-966-er/60_dam_qse_self_as": {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "Total Self-Arranged AS RegUp": "totalSelfArrangedASREGUP",
+ "Total Self-Arranged AS RegDown": "totalSelfArrangedASREGDN",
+ "Total Self-Arranged AS NonSpin": "totalSelfArrangedASNSPIN",
+ "Total Self-Arranged AS NSPNM": "totalSelfArrangedASNSPNM",
+ "Total Self-Arranged AS RRSPFR": "totalSelfArrangedASRRSPFR",
+ "Total Self-Arranged AS RRSFFR": "totalSelfArrangedASRRSFFR",
+ "Total Self-Arranged AS RRSUFR": "totalSelfArrangedASRRSUFR",
+ "Total Self-Arranged AS ECRSSD": "totalSelfArrangedASECRSSD",
+ "Total Self-Arranged AS ECRSMD": "totalSelfArrangedASECRSMD"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "totalSelfArrangedASREGUP": "Decimal",
+ "totalSelfArrangedASREGDN": "Decimal",
+ "totalSelfArrangedASNSPIN": "Decimal",
+ "totalSelfArrangedASNSPNM": "Decimal",
+ "totalSelfArrangedASRRSPFR": "Decimal",
+ "totalSelfArrangedASRRSFFR": "Decimal",
+ "totalSelfArrangedASRRSUFR": "Decimal",
+ "totalSelfArrangedASECRSSD": "Decimal",
+ "totalSelfArrangedASECRSMD": "Decimal",
+ "totalSelfArrangedASRRSGen": "Decimal",
+ "totalSelfArrangedASRRSCLR": "Decimal",
+ "totalSelfArrangedASRRSNCLR": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "Total Self-Arranged AS RegUp": "totalSelfArrangedASREGUP",
+ "Total Self-Arranged AS RegDown": "totalSelfArrangedASREGDN",
+ "Total Self-Arranged AS NonSpin": "totalSelfArrangedASNSPIN",
+ "Total Self-Arranged AS RRS for Gen": "totalSelfArrangedASRRSGen",
+ "Total Self-Arranged AS RRS for CLR": "totalSelfArrangedASRRSCLR",
+ "Total Self-Arranged AS RRS for NCLR": "totalSelfArrangedASRRSNCLR"
+ }
+ ]
+ },
+ "np3-966-er/60_dam_gen_res_data": {
+ "member": "60d_DAM_Gen_Resource_Data-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "QSE submitted Curve-MW1": "qseSubmittedCurveMW1",
+ "QSE submitted Curve-Price1": "qseSubmittedCurvePrice1",
+ "QSE submitted Curve-MW2": "qseSubmittedCurveMW2",
+ "QSE submitted Curve-Price2": "qseSubmittedCurvePrice2",
+ "QSE submitted Curve-MW3": "qseSubmittedCurveMW3",
+ "QSE submitted Curve-Price3": "qseSubmittedCurvePrice3",
+ "QSE submitted Curve-MW4": "qseSubmittedCurveMW4",
+ "QSE submitted Curve-Price4": "qseSubmittedCurvePrice4",
+ "QSE submitted Curve-MW5": "qseSubmittedCurveMW5",
+ "QSE submitted Curve-Price5": "qseSubmittedCurvePrice5",
+ "QSE submitted Curve-MW6": "qseSubmittedCurveMW6",
+ "QSE submitted Curve-Price6": "qseSubmittedCurvePrice6",
+ "QSE submitted Curve-MW7": "qseSubmittedCurveMW7",
+ "QSE submitted Curve-Price7": "qseSubmittedCurvePrice7",
+ "QSE submitted Curve-MW8": "qseSubmittedCurveMW8",
+ "QSE submitted Curve-Price8": "qseSubmittedCurvePrice8",
+ "QSE submitted Curve-MW9": "qseSubmittedCurveMW9",
+ "QSE submitted Curve-Price9": "qseSubmittedCurvePrice9",
+ "QSE submitted Curve-MW10": "qseSubmittedCurveMW10",
+ "QSE submitted Curve-Price10": "qseSubmittedCurvePrice10",
+ "Start Up Hot": "startUpHot",
+ "Start Up Inter": "startUpInter",
+ "Start Up Cold": "startUpCold",
+ "Min Gen Cost": "minGenCost",
+ "HSL": "HSL",
+ "LSL": "LSL",
+ "Resource Status": "resourceStatus",
+ "Awarded Quantity": "awardedQuantity",
+ "Settlement Point Name": "settlementPointName",
+ "Energy Settlement Point Price": "energySettlementPointPrice",
+ "RegUp Awarded": "REGUPAwarded",
+ "RegUp MCPC": "REGUPMCPC",
+ "RegDown Awarded": "REGDNAwarded",
+ "RegDown MCPC": "REGDNMCPC",
+ "RRSPFR Awarded": "RRSPFRAwarded",
+ "RRSFFR Awarded": "RRSFFRAwarded",
+ "RRSUFR Awarded": "RRSUFRAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "ECRSSD Awarded": "ECRSSDAwarded",
+ "ECRS MCPC": "ECRSMCPC",
+ "NonSpin Awarded": "NSPINAwarded",
+ "NonSpin MCPC": "NSPINMCPC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "resourceType": "str",
+ "qseSubmittedCurveMW1": "Decimal",
+ "qseSubmittedCurvePrice1": "Decimal",
+ "qseSubmittedCurveMW2": "Decimal",
+ "qseSubmittedCurvePrice2": "Decimal",
+ "qseSubmittedCurveMW3": "Decimal",
+ "qseSubmittedCurvePrice3": "Decimal",
+ "qseSubmittedCurveMW4": "Decimal",
+ "qseSubmittedCurvePrice4": "Decimal",
+ "qseSubmittedCurveMW5": "Decimal",
+ "qseSubmittedCurvePrice5": "Decimal",
+ "qseSubmittedCurveMW6": "Decimal",
+ "qseSubmittedCurvePrice6": "Decimal",
+ "qseSubmittedCurveMW7": "Decimal",
+ "qseSubmittedCurvePrice7": "Decimal",
+ "qseSubmittedCurveMW8": "Decimal",
+ "qseSubmittedCurvePrice8": "Decimal",
+ "qseSubmittedCurveMW9": "Decimal",
+ "qseSubmittedCurvePrice9": "Decimal",
+ "qseSubmittedCurveMW10": "Decimal",
+ "qseSubmittedCurvePrice10": "Decimal",
+ "startUpHot": "Decimal",
+ "startUpInter": "Decimal",
+ "startUpCold": "Decimal",
+ "minGenCost": "Decimal",
+ "HSL": "Decimal",
+ "LSL": "Decimal",
+ "resourceStatus": "str",
+ "awardedQuantity": "Decimal",
+ "settlementPointName": "str",
+ "energySettlementPointPrice": "Decimal",
+ "REGUPAwarded": "Decimal",
+ "REGUPMCPC": "Decimal",
+ "REGDNAwarded": "Decimal",
+ "REGDNMCPC": "Decimal",
+ "RRSPFRAwarded": "Decimal",
+ "RRSFFRAwarded": "Decimal",
+ "RRSUFRAwarded": "Decimal",
+ "RRSMCPC": "Decimal",
+ "ECRSSDAwarded": "Decimal",
+ "ECRSMCPC": "Decimal",
+ "NSPINAwarded": "Decimal",
+ "NSPINMCPC": "Decimal",
+ "RRSAwarded": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "QSE submitted Curve-MW1": "qseSubmittedCurveMW1",
+ "QSE submitted Curve-Price1": "qseSubmittedCurvePrice1",
+ "QSE submitted Curve-MW2": "qseSubmittedCurveMW2",
+ "QSE submitted Curve-Price2": "qseSubmittedCurvePrice2",
+ "QSE submitted Curve-MW3": "qseSubmittedCurveMW3",
+ "QSE submitted Curve-Price3": "qseSubmittedCurvePrice3",
+ "QSE submitted Curve-MW4": "qseSubmittedCurveMW4",
+ "QSE submitted Curve-Price4": "qseSubmittedCurvePrice4",
+ "QSE submitted Curve-MW5": "qseSubmittedCurveMW5",
+ "QSE submitted Curve-Price5": "qseSubmittedCurvePrice5",
+ "QSE submitted Curve-MW6": "qseSubmittedCurveMW6",
+ "QSE submitted Curve-Price6": "qseSubmittedCurvePrice6",
+ "QSE submitted Curve-MW7": "qseSubmittedCurveMW7",
+ "QSE submitted Curve-Price7": "qseSubmittedCurvePrice7",
+ "QSE submitted Curve-MW8": "qseSubmittedCurveMW8",
+ "QSE submitted Curve-Price8": "qseSubmittedCurvePrice8",
+ "QSE submitted Curve-MW9": "qseSubmittedCurveMW9",
+ "QSE submitted Curve-Price9": "qseSubmittedCurvePrice9",
+ "QSE submitted Curve-MW10": "qseSubmittedCurveMW10",
+ "QSE submitted Curve-Price10": "qseSubmittedCurvePrice10",
+ "Start Up Hot": "startUpHot",
+ "Start Up Inter": "startUpInter",
+ "Start Up Cold": "startUpCold",
+ "Min Gen Cost": "minGenCost",
+ "HSL": "HSL",
+ "LSL": "LSL",
+ "Resource Status": "resourceStatus",
+ "Awarded Quantity": "awardedQuantity",
+ "Settlement Point Name": "settlementPointName",
+ "Energy Settlement Point Price": "energySettlementPointPrice",
+ "RegUp Awarded": "REGUPAwarded",
+ "RegUp MCPC": "REGUPMCPC",
+ "RegDown Awarded": "REGDNAwarded",
+ "RegDown MCPC": "REGDNMCPC",
+ "RRS Awarded": "RRSAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "NonSpin Awarded": "NSPINAwarded",
+ "NonSpin MCPC": "NSPINMCPC"
+ }
+ ]
+ },
+ "np3-966-er/60_dam_gen_res_as_offers": {
+ "member": "60d_DAM_Generation_Resource_ASOffers-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Generation Resource Name": "resourceName",
+ "Multi-Hour Block Flag": "multiHourBlock",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRSPFR": "price1RRSPFR",
+ "PRICE1 RRSFFR": "price1RRSFFR",
+ "PRICE1 RRSUFR": "price1RRSUFR",
+ "PRICE1 ECRS": "price1ECRS",
+ "PRICE1 OFFEC": "price1OFFEC",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRSPFR": "price2RRSPFR",
+ "PRICE2 RRSFFR": "price2RRSFFR",
+ "PRICE2 RRSUFR": "price2RRSUFR",
+ "PRICE2 ECRS": "price2ECRS",
+ "PRICE2 OFFEC": "price2OFFEC",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRSPFR": "price3RRSPFR",
+ "PRICE3 RRSFFR": "price3RRSFFR",
+ "PRICE3 RRSUFR": "price3RRSUFR",
+ "PRICE3 ECRS": "price3ECRS",
+ "PRICE3 OFFEC": "price3OFFEC",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRSPFR": "price4RRSPFR",
+ "PRICE4 RRSFFR": "price4RRSFFR",
+ "PRICE4 RRSUFR": "price4RRSUFR",
+ "PRICE4 ECRS": "price4ECRS",
+ "PRICE4 OFFEC": "price4OFFEC",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRSPFR": "price5RRSPFR",
+ "PRICE5 RRSFFR": "price5RRSFFR",
+ "PRICE5 RRSUFR": "price5RRSUFR",
+ "PRICE5 ECRS": "price5ECRS",
+ "PRICE5 OFFEC": "price5OFFEC",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "multiHourBlock": "bool",
+ "blockIndicator1": "str",
+ "price1RRSPFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1ECRS": "Decimal",
+ "price1OFFEC": "Decimal",
+ "price1OnlineNSPIN": "Decimal",
+ "price1REGUP": "Decimal",
+ "price1REGDN": "Decimal",
+ "price1OfflineNSPIN": "Decimal",
+ "quantityMW1": "Decimal",
+ "blockIndicator2": "str",
+ "price2RRSPFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2ECRS": "Decimal",
+ "price2OFFEC": "Decimal",
+ "price2OnlineNSPIN": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDN": "Decimal",
+ "price2OfflineNSPIN": "Decimal",
+ "quantityMW2": "Decimal",
+ "blockIndicator3": "str",
+ "price3RRSPFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3ECRS": "Decimal",
+ "price3OFFEC": "Decimal",
+ "price3OnlineNSPIN": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDN": "Decimal",
+ "price3OfflineNSPIN": "Decimal",
+ "quantityMW3": "Decimal",
+ "blockIndicator4": "str",
+ "price4RRSPFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4ECRS": "Decimal",
+ "price4OFFEC": "Decimal",
+ "price4OnlineNSPIN": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDN": "Decimal",
+ "price4OfflineNSPIN": "Decimal",
+ "quantityMW4": "Decimal",
+ "blockIndicator5": "str",
+ "price5RRSPFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5ECRS": "Decimal",
+ "price5OFFEC": "Decimal",
+ "price5OnlineNSPIN": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDN": "Decimal",
+ "price5OfflineNSPIN": "Decimal",
+ "quantityMW5": "Decimal",
+ "price1RRS": "Decimal",
+ "price2RRS": "Decimal",
+ "price3RRS": "Decimal",
+ "price4RRS": "Decimal",
+ "price5RRS": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Generation Resource Name": "resourceName",
+ "Multi-Hour Block Flag": "multiHourBlock",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRS": "price1RRS",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRS": "price2RRS",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRS": "price3RRS",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRS": "price4RRS",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRS": "price5RRS",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ }
+ ]
+ },
+ "np3-966-er/60_dam_load_res_data": {
+ "member": "60d_DAM_Load_Resource_Data-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Load Resource Name": "loadResourceName",
+ "Max Power Consumption for Load Resource": "maxPowerConsumption",
+ "Low Power Consumption for Load Resource": "lowPowerConsumption",
+ "RegUp Awarded": "REGUPAwarded",
+ "RegUp MCPC": "REGUPMCPC",
+ "RegDown Awarded": "REGDNAwarded",
+ "RegDown MCPC": "REGDNMCPC",
+ "RRSPFR Awarded": "RRSPFRAwarded",
+ "RRSFFR Awarded": "RRSFFRAwarded",
+ "RRSUFR Awarded": "RRSUFRAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "ECRSSD Awarded": "ECRSSDAwarded",
+ "ECRSMD Awarded": "ECRSMDAwarded",
+ "ECRS MCPC": "ECRSMCPC",
+ "NonSpin Awarded": "NSPINAwarded",
+ "NonSpin MCPC": "NSPINMCPC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "loadResourceName": "str",
+ "maxPowerConsumption": "Decimal",
+ "lowPowerConsumption": "Decimal",
+ "REGUPAwarded": "Decimal",
+ "REGUPMCPC": "Decimal",
+ "REGDNAwarded": "Decimal",
+ "REGDNMCPC": "Decimal",
+ "RRSPFRAwarded": "Decimal",
+ "RRSFFRAwarded": "Decimal",
+ "RRSUFRAwarded": "Decimal",
+ "RRSMCPC": "Decimal",
+ "ECRSSDAwarded": "Decimal",
+ "ECRSMDAwarded": "Decimal",
+ "ECRSMCPC": "Decimal",
+ "NSPINAwarded": "Decimal",
+ "NSPINMCPC": "Decimal",
+ "RRSAwarded": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Load Resource Name": "loadResourceName",
+ "Max Power Consumption for Load Resource": "maxPowerConsumption",
+ "Low Power Consumption for Load Resource": "lowPowerConsumption",
+ "RegUp Awarded": "REGUPAwarded",
+ "RegUp MCPC": "REGUPMCPC",
+ "RegDown Awarded": "REGDNAwarded",
+ "RegDown MCPC": "REGDNMCPC",
+ "RRS Awarded": "RRSAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "NonSpin Awarded": "NSPINAwarded",
+ "NonSpin MCPC": "NSPINMCPC"
+ }
+ ]
+ },
+ "np3-966-er/60_dam_load_res_as_offers": {
+ "member": "60d_DAM_Load_Resource_ASOffers-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Load Resource Name": "loadResourceName",
+ "Multi-Hour Block Flag": "multiHourBlock",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRSPFR": "price1RRSPFR",
+ "PRICE1 RRSFFR": "price1RRSFFR",
+ "PRICE1 RRSUFR": "price1RRSUFR",
+ "PRICE1 ECRS": "price1ECRS",
+ "PRICE1 OFFEC": "price1OFFEC",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRSPFR": "price2RRSPFR",
+ "PRICE2 RRSFFR": "price2RRSFFR",
+ "PRICE2 RRSUFR": "price2RRSUFR",
+ "PRICE2 ECRS": "price2ECRS",
+ "PRICE2 OFFEC": "price2OFFEC",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRSPFR": "price3RRSPFR",
+ "PRICE3 RRSFFR": "price3RRSFFR",
+ "PRICE3 RRSUFR": "price3RRSUFR",
+ "PRICE3 ECRS": "price3ECRS",
+ "PRICE3 OFFEC": "price3OFFEC",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRSPFR": "price4RRSPFR",
+ "PRICE4 RRSFFR": "price4RRSFFR",
+ "PRICE4 RRSUFR": "price4RRSUFR",
+ "PRICE4 ECRS": "price4ECRS",
+ "PRICE4 OFFEC": "price4OFFEC",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRSPFR": "price5RRSPFR",
+ "PRICE5 RRSFFR": "price5RRSFFR",
+ "PRICE5 RRSUFR": "price5RRSUFR",
+ "PRICE5 ECRS": "price5ECRS",
+ "PRICE5 OFFEC": "price5OFFEC",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNSPIN",
+ "QUANTITY MW5": "quantityMW5",
+ "NCLR Flag": "NCLRFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "loadResourceName": "str",
+ "multiHourBlock": "bool",
+ "blockIndicator1": "str",
+ "price1RRSPFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1ECRS": "Decimal",
+ "price1OFFEC": "Decimal",
+ "price1OnlineNSPIN": "Decimal",
+ "price1REGUP": "Decimal",
+ "price1REGDN": "Decimal",
+ "price1OfflineNSPIN": "Decimal",
+ "quantityMW1": "Decimal",
+ "blockIndicator2": "str",
+ "price2RRSPFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2ECRS": "Decimal",
+ "price2OFFEC": "Decimal",
+ "price2OnlineNSPIN": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDN": "Decimal",
+ "price2OfflineNSPIN": "Decimal",
+ "quantityMW2": "Decimal",
+ "blockIndicator3": "str",
+ "price3RRSPFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3ECRS": "Decimal",
+ "price3OFFEC": "Decimal",
+ "price3OnlineNSPIN": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDN": "Decimal",
+ "price3OfflineNSPIN": "Decimal",
+ "quantityMW3": "Decimal",
+ "blockIndicator4": "str",
+ "price4RRSPFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4ECRS": "Decimal",
+ "price4OFFEC": "Decimal",
+ "price4OnlineNSPIN": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDN": "Decimal",
+ "price4OfflineNSPIN": "Decimal",
+ "quantityMW4": "Decimal",
+ "blockIndicator5": "str",
+ "price5RRSPFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5ECRS": "Decimal",
+ "price5OFFEC": "Decimal",
+ "price5OnlineNSPIN": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDN": "Decimal",
+ "price5OfflineNSPIN": "Decimal",
+ "quantityMW5": "Decimal",
+ "NCLRFlag": "bool",
+ "price1RRS": "Decimal",
+ "price2RRS": "Decimal",
+ "price3RRS": "Decimal",
+ "price4RRS": "Decimal",
+ "price5RRS": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Load Resource Name": "loadResourceName",
+ "Multi-Hour Block Flag": "multiHourBlock",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRS": "price1RRS",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRS": "price2RRS",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRS": "price3RRS",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRS": "price4RRS",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRS": "price5RRS",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNSPIN",
+ "QUANTITY MW5": "quantityMW5",
+ "NCLR Flag": "NCLRFlag"
+ }
+ ]
+ },
+ "np3-966-er/60_dam_energy_only_offers": {
+ "member": "60d_DAM_EnergyOnlyOffers-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point": "settlementPointName",
+ "QSE Name": "qseName",
+ "Energy Only Offer MW1": "energyOnlyOfferMW1",
+ "Energy Only Offer Price1": "energyOnlyOfferPrice1",
+ "Energy Only Offer MW2": "energyOnlyOfferMW2",
+ "Energy Only Offer Price2": "energyOnlyOfferPrice2",
+ "Energy Only Offer MW3": "energyOnlyOfferMW3",
+ "Energy Only Offer Price3": "energyOnlyOfferPrice3",
+ "Energy Only Offer MW4": "energyOnlyOfferMW4",
+ "Energy Only Offer Price4": "energyOnlyOfferPrice4",
+ "Energy Only Offer MW5": "energyOnlyOfferMW5",
+ "Energy Only Offer Price5": "energyOnlyOfferPrice5",
+ "Energy Only Offer MW6": "energyOnlyOfferMW6",
+ "Energy Only Offer Price6": "energyOnlyOfferPrice6",
+ "Energy Only Offer MW7": "energyOnlyOfferMW7",
+ "Energy Only Offer Price7": "energyOnlyOfferPrice7",
+ "Energy Only Offer MW8": "energyOnlyOfferMW8",
+ "Energy Only Offer Price8": "energyOnlyOfferPrice8",
+ "Energy Only Offer MW9": "energyOnlyOfferMW9",
+ "Energy Only Offer Price9": "energyOnlyOfferPrice9",
+ "Energy Only Offer MW10": "energyOnlyOfferMW10",
+ "Energy Only Offer Price10": "energyOnlyOfferPrice10",
+ "Energy Only Offer ID": "offerId",
+ "Multi-Hour Block Indicator": "multiHourBlock",
+ "Block/Curve indicator": "blockCurve"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointName": "str",
+ "qseName": "str",
+ "energyOnlyOfferMW1": "Decimal",
+ "energyOnlyOfferPrice1": "Decimal",
+ "energyOnlyOfferMW2": "Decimal",
+ "energyOnlyOfferPrice2": "Decimal",
+ "energyOnlyOfferMW3": "Decimal",
+ "energyOnlyOfferPrice3": "Decimal",
+ "energyOnlyOfferMW4": "Decimal",
+ "energyOnlyOfferPrice4": "Decimal",
+ "energyOnlyOfferMW5": "Decimal",
+ "energyOnlyOfferPrice5": "Decimal",
+ "energyOnlyOfferMW6": "Decimal",
+ "energyOnlyOfferPrice6": "Decimal",
+ "energyOnlyOfferMW7": "Decimal",
+ "energyOnlyOfferPrice7": "Decimal",
+ "energyOnlyOfferMW8": "Decimal",
+ "energyOnlyOfferPrice8": "Decimal",
+ "energyOnlyOfferMW9": "Decimal",
+ "energyOnlyOfferPrice9": "Decimal",
+ "energyOnlyOfferMW10": "Decimal",
+ "energyOnlyOfferPrice10": "Decimal",
+ "offerId": "str",
+ "multiHourBlock": "bool",
+ "blockCurve": "str"
+ }
+ },
+ "np3-966-er/60_dam_energy_only_offer_awards": {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point": "settlementPointName",
+ "QSE Name": "qseName",
+ "Energy Only Offer Award in MW": "energyOnlyOfferAwardInMW",
+ "Settlement Point Price": "settlementPointPrice",
+ "Offer ID": "offerId"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointName": "str",
+ "qseName": "str",
+ "energyOnlyOfferAwardInMW": "Decimal",
+ "settlementPointPrice": "Decimal",
+ "offerId": "str"
+ }
+ },
+ "np3-966-er/60_dam_energy_bids": {
+ "member": "60d_DAM_EnergyBids-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point": "settlementPointName",
+ "QSE Name": "qseName",
+ "Energy Only Bid MW1": "energyOnlyBidMW1",
+ "Energy Only Bid Price1": "energyOnlyBidPrice1",
+ "Energy Only Bid MW2": "energyOnlyBidMW2",
+ "Energy Only Bid Price2": "energyOnlyBidPrice2",
+ "Energy Only Bid MW3": "energyOnlyBidMW3",
+ "Energy Only Bid Price3": "energyOnlyBidPrice3",
+ "Energy Only Bid MW4": "energyOnlyBidMW4",
+ "Energy Only Bid Price4": "energyOnlyBidPrice4",
+ "Energy Only Bid MW5": "energyOnlyBidMW5",
+ "Energy Only Bid Price5": "energyOnlyBidPrice5",
+ "Energy Only Bid MW6": "energyOnlyBidMW6",
+ "Energy Only Bid Price6": "energyOnlyBidPrice6",
+ "Energy Only Bid MW7": "energyOnlyBidMW7",
+ "Energy Only Bid Price7": "energyOnlyBidPrice7",
+ "Energy Only Bid MW8": "energyOnlyBidMW8",
+ "Energy Only Bid Price8": "energyOnlyBidPrice8",
+ "Energy Only Bid MW9": "energyOnlyBidMW9",
+ "Energy Only Bid Price9": "energyOnlyBidPrice9",
+ "Energy Only Bid MW10": "energyOnlyBidMW10",
+ "Energy Only Bid Price10": "energyOnlyBidPrice10",
+ "Energy Only Bid ID": "bidId",
+ "Multi-Hour Block Indicator": "multiHourBlock",
+ "Block/Curve indicator": "blockCurve"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointName": "str",
+ "qseName": "str",
+ "energyOnlyBidMW1": "Decimal",
+ "energyOnlyBidPrice1": "Decimal",
+ "energyOnlyBidMW2": "Decimal",
+ "energyOnlyBidPrice2": "Decimal",
+ "energyOnlyBidMW3": "Decimal",
+ "energyOnlyBidPrice3": "Decimal",
+ "energyOnlyBidMW4": "Decimal",
+ "energyOnlyBidPrice4": "Decimal",
+ "energyOnlyBidMW5": "Decimal",
+ "energyOnlyBidPrice5": "Decimal",
+ "energyOnlyBidMW6": "Decimal",
+ "energyOnlyBidPrice6": "Decimal",
+ "energyOnlyBidMW7": "Decimal",
+ "energyOnlyBidPrice7": "Decimal",
+ "energyOnlyBidMW8": "Decimal",
+ "energyOnlyBidPrice8": "Decimal",
+ "energyOnlyBidMW9": "Decimal",
+ "energyOnlyBidPrice9": "Decimal",
+ "energyOnlyBidMW10": "Decimal",
+ "energyOnlyBidPrice10": "Decimal",
+ "bidId": "str",
+ "multiHourBlock": "bool",
+ "blockCurve": "str"
+ }
+ },
+ "np3-966-er/60_dam_energy_bid_awards": {
+ "member": "60d_DAM_EnergyBidAwards-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point": "settlementPointName",
+ "QSE Name": "qseName",
+ "Energy Only Bid Award in MW": "energyOnlyBidAwardInMW",
+ "Settlement Point Price": "settlementPointPrice",
+ "Bid ID": "bidId"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointName": "str",
+ "qseName": "str",
+ "energyOnlyBidAwardInMW": "Decimal",
+ "settlementPointPrice": "Decimal",
+ "bidId": "str"
+ }
+ },
+ "np3-966-er/60_dam_ptp_obl_opt": {
+ "member": "60d_DAM_PTP_Obligation_Option-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "Settlement Point Source": "settlementPointSource",
+ "Settlement Point Sink": "settlementPointSink",
+ "MW": "MW",
+ "Price": "price",
+ "Offer ID": "offerId",
+ "Multi-Hour Block Indicator": "multiHourBlock",
+ "CRR ID": "CRRId"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "MW": "Decimal",
+ "price": "Decimal",
+ "offerId": "str",
+ "multiHourBlock": "bool",
+ "CRRId": "str"
+ }
+ },
+ "np3-966-er/60_dam_ptp_obl_bids": {
+ "member": "60d_DAM_PTPObligationBids-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "Settlement Point Source": "settlementPointSource",
+ "Settlement Point Sink": "settlementPointSink",
+ "PtP Bid - MW": "PTPBidMW",
+ "PtP Bid - Price": "PTPBidPrice",
+ "Bid ID": "bidId",
+ "Multi-Hour Block Indicator": "multiHourBlock"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "PTPBidMW": "Decimal",
+ "PTPBidPrice": "Decimal",
+ "bidId": "str",
+ "multiHourBlock": "bool"
+ }
+ },
+ "np3-966-er/60_dam_ptp_obl_opt_awards": {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "Settlement Point Source": "settlementPointSource",
+ "Settlement Point Sink": "settlementPointSink",
+ "MW": "MW",
+ "Price": "price",
+ "Offer ID": "offerId",
+ "CRR ID": "CRRId"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "MW": "Decimal",
+ "price": "Decimal",
+ "offerId": "str",
+ "CRRId": "str"
+ }
+ },
+ "np3-966-er/60_dam_ptp_obl_bid_awards": {
+ "member": "60d_DAM_PTPObligationBidAwards-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "Settlement Point Source": "settlementPointSource",
+ "Settlement Point Sink": "settlementPointSink",
+ "PtP Bid Award - MW": "PTPBidAwardMW",
+ "PtP Bid - Price": "PTPBidPrice",
+ "Bid ID": "bidId"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "PTPBidAwardMW": "Decimal",
+ "PTPBidPrice": "Decimal",
+ "bidId": "str"
+ }
+ },
+ "np3-966-er/60d_dam_esr_as_offers": {
+ "member": "60d_DAM_ESR_ASOffers-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Multi-Hour Block Flag": "multiHourBlock",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRSPFR": "price1RRSPFR",
+ "PRICE1 RRSFFR": "price1RRSFFR",
+ "PRICE1 RRSUFR": "price1RRSUFR",
+ "PRICE1 ECRS": "price1ECRS",
+ "PRICE1 OFFEC": "price1OFFEC",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRSPFR": "price2RRSPFR",
+ "PRICE2 RRSFFR": "price2RRSFFR",
+ "PRICE2 RRSUFR": "price2RRSUFR",
+ "PRICE2 ECRS": "price2ECRS",
+ "PRICE2 OFFEC": "price2OFFEC",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRSPFR": "price3RRSPFR",
+ "PRICE3 RRSFFR": "price3RRSFFR",
+ "PRICE3 RRSUFR": "price3RRSUFR",
+ "PRICE3 ECRS": "price3ECRS",
+ "PRICE3 OFFEC": "price3OFFEC",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRSPFR": "price4RRSPFR",
+ "PRICE4 RRSFFR": "price4RRSFFR",
+ "PRICE4 RRSUFR": "price4RRSUFR",
+ "PRICE4 ECRS": "price4ECRS",
+ "PRICE4 OFFEC": "price4OFFEC",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRSPFR": "price5RRSPFR",
+ "PRICE5 RRSFFR": "price5RRSFFR",
+ "PRICE5 RRSUFR": "price5RRSUFR",
+ "PRICE5 ECRS": "price5ECRS",
+ "PRICE5 OFFEC": "price5OFFEC",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "multiHourBlock": "bool",
+ "blockIndicator1": "str",
+ "price1RRSPFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1ECRS": "Decimal",
+ "price1OFFEC": "Decimal",
+ "price1OnlineNSPIN": "Decimal",
+ "price1REGUP": "Decimal",
+ "price1REGDN": "Decimal",
+ "price1OfflineNSPIN": "Decimal",
+ "quantityMW1": "Decimal",
+ "blockIndicator2": "str",
+ "price2RRSPFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2ECRS": "Decimal",
+ "price2OFFEC": "Decimal",
+ "price2OnlineNSPIN": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDN": "Decimal",
+ "price2OfflineNSPIN": "Decimal",
+ "quantityMW2": "Decimal",
+ "blockIndicator3": "str",
+ "price3RRSPFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3ECRS": "Decimal",
+ "price3OFFEC": "Decimal",
+ "price3OnlineNSPIN": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDN": "Decimal",
+ "price3OfflineNSPIN": "Decimal",
+ "quantityMW3": "Decimal",
+ "blockIndicator4": "str",
+ "price4RRSPFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4ECRS": "Decimal",
+ "price4OFFEC": "Decimal",
+ "price4OnlineNSPIN": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDN": "Decimal",
+ "price4OfflineNSPIN": "Decimal",
+ "quantityMW4": "Decimal",
+ "blockIndicator5": "str",
+ "price5RRSPFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5ECRS": "Decimal",
+ "price5OFFEC": "Decimal",
+ "price5OnlineNSPIN": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDN": "Decimal",
+ "price5OfflineNSPIN": "Decimal",
+ "quantityMW5": "Decimal"
+ }
+ },
+ "np3-966-er/60d_dam_esr_data": {
+ "member": "60d_DAM_ESR_Data-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "QSE submitted Curve-MW1": "qseSubmittedCurveMW1",
+ "QSE submitted Curve-Price1": "qseSubmittedCurvePrice1",
+ "QSE submitted Curve-MW2": "qseSubmittedCurveMW2",
+ "QSE submitted Curve-Price2": "qseSubmittedCurvePrice2",
+ "QSE submitted Curve-MW3": "qseSubmittedCurveMW3",
+ "QSE submitted Curve-Price3": "qseSubmittedCurvePrice3",
+ "QSE submitted Curve-MW4": "qseSubmittedCurveMW4",
+ "QSE submitted Curve-Price4": "qseSubmittedCurvePrice4",
+ "QSE submitted Curve-MW5": "qseSubmittedCurveMW5",
+ "QSE submitted Curve-Price5": "qseSubmittedCurvePrice5",
+ "QSE submitted Curve-MW6": "qseSubmittedCurveMW6",
+ "QSE submitted Curve-Price6": "qseSubmittedCurvePrice6",
+ "QSE submitted Curve-MW7": "qseSubmittedCurveMW7",
+ "QSE submitted Curve-Price7": "qseSubmittedCurvePrice7",
+ "QSE submitted Curve-MW8": "qseSubmittedCurveMW8",
+ "QSE submitted Curve-Price8": "qseSubmittedCurvePrice8",
+ "QSE submitted Curve-MW9": "qseSubmittedCurveMW9",
+ "QSE submitted Curve-Price9": "qseSubmittedCurvePrice9",
+ "QSE submitted Curve-MW10": "qseSubmittedCurveMW10",
+ "QSE submitted Curve-Price10": "qseSubmittedCurvePrice10",
+ "Start Up Hot": "startUpHot",
+ "Start Up Inter": "startUpInter",
+ "Start Up Cold": "startUpCold",
+ "Min Gen Cost": "minGenCost",
+ "HSL": "HSL",
+ "LSL": "LSL",
+ "Resource Status": "resourceStatus",
+ "Awarded Quantity": "awardedQuantity",
+ "Settlement Point Name": "settlementPointName",
+ "Energy Settlement Point Price": "energySettlementPointPrice",
+ "RegUp Awarded": "REGUPAwarded",
+ "RegUp MCPC": "REGUPMCPC",
+ "RegDown Awarded": "REGDNAwarded",
+ "RegDown MCPC": "REGDNMCPC",
+ "RRSPFR Awarded": "RRSPFRAwarded",
+ "RRSFFR Awarded": "RRSFFRAwarded",
+ "RRSUFR Awarded": "RRSUFRAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "ECRSSD Awarded": "ECRSSDAwarded",
+ "ECRS MCPC": "ECRSMCPC",
+ "NonSpin Awarded": "NSPINAwarded",
+ "NonSpin MCPC": "NSPINMCPC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "resourceType": "str",
+ "qseSubmittedCurveMW1": "Decimal",
+ "qseSubmittedCurvePrice1": "Decimal",
+ "qseSubmittedCurveMW2": "Decimal",
+ "qseSubmittedCurvePrice2": "Decimal",
+ "qseSubmittedCurveMW3": "Decimal",
+ "qseSubmittedCurvePrice3": "Decimal",
+ "qseSubmittedCurveMW4": "Decimal",
+ "qseSubmittedCurvePrice4": "Decimal",
+ "qseSubmittedCurveMW5": "Decimal",
+ "qseSubmittedCurvePrice5": "Decimal",
+ "qseSubmittedCurveMW6": "Decimal",
+ "qseSubmittedCurvePrice6": "Decimal",
+ "qseSubmittedCurveMW7": "Decimal",
+ "qseSubmittedCurvePrice7": "Decimal",
+ "qseSubmittedCurveMW8": "Decimal",
+ "qseSubmittedCurvePrice8": "Decimal",
+ "qseSubmittedCurveMW9": "Decimal",
+ "qseSubmittedCurvePrice9": "Decimal",
+ "qseSubmittedCurveMW10": "Decimal",
+ "qseSubmittedCurvePrice10": "Decimal",
+ "startUpHot": "Decimal",
+ "startUpInter": "Decimal",
+ "startUpCold": "Decimal",
+ "minGenCost": "Decimal",
+ "HSL": "Decimal",
+ "LSL": "Decimal",
+ "resourceStatus": "str",
+ "awardedQuantity": "Decimal",
+ "settlementPointName": "str",
+ "energySettlementPointPrice": "Decimal",
+ "REGUPAwarded": "Decimal",
+ "REGUPMCPC": "Decimal",
+ "REGDNAwarded": "Decimal",
+ "REGDNMCPC": "Decimal",
+ "RRSPFRAwarded": "Decimal",
+ "RRSFFRAwarded": "Decimal",
+ "RRSUFRAwarded": "Decimal",
+ "RRSMCPC": "Decimal",
+ "ECRSSDAwarded": "Decimal",
+ "ECRSMCPC": "Decimal",
+ "NSPINAwarded": "Decimal",
+ "NSPINMCPC": "Decimal"
+ }
+ },
+ "np3-966-er/60d_dam_as_only_offers": {
+ "member": "60d_DAM_AS_Only_Offers-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "Offer ID": "offerId",
+ "AS Type": "ASType",
+ "AS Only Offer MW1": "ASOnlyOfferMW1",
+ "AS Only Offer Price1": "ASOnlyOfferPrice1",
+ "AS Only Offer MW2": "ASOnlyOfferMW2",
+ "AS Only Offer Price2": "ASOnlyOfferPrice2",
+ "AS Only Offer MW3": "ASOnlyOfferMW3",
+ "AS Only Offer Price3": "ASOnlyOfferPrice3",
+ "AS Only Offer MW4": "ASOnlyOfferMW4",
+ "AS Only Offer Price4": "ASOnlyOfferPrice4",
+ "AS Only Offer MW5": "ASOnlyOfferMW5",
+ "AS Only Offer Price5": "ASOnlyOfferPrice5"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "offerId": "str",
+ "ASType": "str",
+ "ASOnlyOfferMW1": "Decimal",
+ "ASOnlyOfferPrice1": "Decimal",
+ "ASOnlyOfferMW2": "Decimal",
+ "ASOnlyOfferPrice2": "Decimal",
+ "ASOnlyOfferMW3": "Decimal",
+ "ASOnlyOfferPrice3": "Decimal",
+ "ASOnlyOfferMW4": "Decimal",
+ "ASOnlyOfferPrice4": "Decimal",
+ "ASOnlyOfferMW5": "Decimal",
+ "ASOnlyOfferPrice5": "Decimal"
+ }
+ },
+ "np3-966-er/60d_dam_as_only_awards": {
+ "member": "60d_DAM_AS_Only_Awards-*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "AS Type": "ASType",
+ "Offer ID": "offerId",
+ "Quantity1 Award": "quantity1Award",
+ "Quantity2 Award": "quantity2Award",
+ "Quantity3 Award": "quantity3Award",
+ "Quantity4 Award": "quantity4Award",
+ "Quantity5 Award": "quantity5Award",
+ "Total Award": "totalAward",
+ "MCPC": "MCPC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "ASType": "str",
+ "offerId": "str",
+ "quantity1Award": "Decimal",
+ "quantity2Award": "Decimal",
+ "quantity3Award": "Decimal",
+ "quantity4Award": "Decimal",
+ "quantity5Award": "Decimal",
+ "totalAward": "Decimal",
+ "MCPC": "Decimal"
+ }
+ },
+ "np4-183-cd/dam_hourly_lmp": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "BusName": "busName",
+ "LMP": "LMP",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ }
+ },
+ "np4-191-cd/dam_shadow_prices": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "ConstraintID": "constraintId",
+ "ConstraintName": "constraintName",
+ "ContingencyName": "contingencyName",
+ "ConstraintLimit": "constraintLimit",
+ "ConstraintValue": "constraintValue",
+ "ViolationAmount": "violationAmount",
+ "ShadowPrice": "shadowPrice",
+ "FromStation": "fromStation",
+ "ToStation": "toStation",
+ "FromStationkV": "fromStationkV",
+ "ToStationkV": "toStationkV",
+ "DeliveryTime": "deliveryTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "deliveryTime": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np6-344-cd/act_sys_load_by_study_area": {
+ "columns": {
+ "OperatingDay": "operatingDay",
+ "HourEnding": "hourEnding",
+ "Valley": "valley",
+ "DSTFlag": "repeatedHourFlag"
+ },
+ "dates": {
+ "operatingDay": "%m/%d/%Y"
+ }
+ },
+ "np6-346-cd/act_sys_load_by_fzn": {
+ "columns": {
+ "OperDay": "operatingDay",
+ "HourEnding": "hourEnding",
+ "NORTH": "north",
+ "SOUTH": "south",
+ "WEST": "west",
+ "HOUSTON": "houston",
+ "TOTAL": "total",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "operatingDay": "%m/%d/%Y"
+ }
+ },
+ "np3-988-er/resources": {
+ "archive_only": true,
+ "columns": {
+ "OWNER RE": "ownerRE",
+ "RESOURCE NAME": "resourceName",
+ "TYPE": "resourceType",
+ "SPLIT GEN RESOURCE": "splitGenResource",
+ "DME": "DME",
+ "DME DUNS": "DMEDuns",
+ "RMR": "RMR"
+ },
+ "fields": {
+ "ownerRE": "str",
+ "resourceName": "str",
+ "resourceType": "str",
+ "splitGenResource": "str",
+ "DME": "str",
+ "DMEDuns": "str",
+ "RMR": "bool"
+ },
+ "dates": {},
+ "datetimes": {}
+ },
+ "copg-316/load_estimation_counts": {
+ "archive_only": true,
+ "columns": {
+ "TYPE": "type",
+ "Region": "region",
+ "TDSP": "TDSP",
+ "Operating Day": "operatingDay",
+ "Channel": "channel",
+ "Actual Count": "actualCount",
+ "Historical Estimated Count": "historicalEstimatedCount",
+ "Default Profile Count": "defaultProfileCount",
+ "Total Count": "totalCount",
+ "Percent Actual Count": "percentActualCount",
+ "Percent Hist Estimated Count": "percentHistoricalEstimatedCount",
+ "Percent Default Profile Count": "percentDefaultProfileCount"
+ },
+ "fields": {
+ "type": "str",
+ "region": "str",
+ "TDSP": "str",
+ "operatingDay": "date",
+ "channel": "str",
+ "actualCount": "int",
+ "historicalEstimatedCount": "int",
+ "defaultProfileCount": "int",
+ "totalCount": "int",
+ "percentActualCount": "Decimal",
+ "percentHistoricalEstimatedCount": "Decimal",
+ "percentDefaultProfileCount": "Decimal"
+ },
+ "dates": {
+ "operatingDay": "%d-%b-%y"
+ },
+ "datetimes": {}
+ },
+ "np1-300/adjusted_meter_load": {
+ "archive_only": true,
+ "columns": {
+ "SAVERECORDER": "saveRecorder",
+ "SAVECHANNEL": "saveChannel",
+ "STARTTIME": "startTime",
+ "INT001": "INT001",
+ "INT002": "INT002",
+ "INT003": "INT003",
+ "INT004": "INT004",
+ "INT005": "INT005",
+ "INT006": "INT006",
+ "INT007": "INT007",
+ "INT008": "INT008",
+ "INT009": "INT009",
+ "INT010": "INT010",
+ "INT011": "INT011",
+ "INT012": "INT012",
+ "INT013": "INT013",
+ "INT014": "INT014",
+ "INT015": "INT015",
+ "INT016": "INT016",
+ "INT017": "INT017",
+ "INT018": "INT018",
+ "INT019": "INT019",
+ "INT020": "INT020",
+ "INT021": "INT021",
+ "INT022": "INT022",
+ "INT023": "INT023",
+ "INT024": "INT024",
+ "INT025": "INT025",
+ "INT026": "INT026",
+ "INT027": "INT027",
+ "INT028": "INT028",
+ "INT029": "INT029",
+ "INT030": "INT030",
+ "INT031": "INT031",
+ "INT032": "INT032",
+ "INT033": "INT033",
+ "INT034": "INT034",
+ "INT035": "INT035",
+ "INT036": "INT036",
+ "INT037": "INT037",
+ "INT038": "INT038",
+ "INT039": "INT039",
+ "INT040": "INT040",
+ "INT041": "INT041",
+ "INT042": "INT042",
+ "INT043": "INT043",
+ "INT044": "INT044",
+ "INT045": "INT045",
+ "INT046": "INT046",
+ "INT047": "INT047",
+ "INT048": "INT048",
+ "INT049": "INT049",
+ "INT050": "INT050",
+ "INT051": "INT051",
+ "INT052": "INT052",
+ "INT053": "INT053",
+ "INT054": "INT054",
+ "INT055": "INT055",
+ "INT056": "INT056",
+ "INT057": "INT057",
+ "INT058": "INT058",
+ "INT059": "INT059",
+ "INT060": "INT060",
+ "INT061": "INT061",
+ "INT062": "INT062",
+ "INT063": "INT063",
+ "INT064": "INT064",
+ "INT065": "INT065",
+ "INT066": "INT066",
+ "INT067": "INT067",
+ "INT068": "INT068",
+ "INT069": "INT069",
+ "INT070": "INT070",
+ "INT071": "INT071",
+ "INT072": "INT072",
+ "INT073": "INT073",
+ "INT074": "INT074",
+ "INT075": "INT075",
+ "INT076": "INT076",
+ "INT077": "INT077",
+ "INT078": "INT078",
+ "INT079": "INT079",
+ "INT080": "INT080",
+ "INT081": "INT081",
+ "INT082": "INT082",
+ "INT083": "INT083",
+ "INT084": "INT084",
+ "INT085": "INT085",
+ "INT086": "INT086",
+ "INT087": "INT087",
+ "INT088": "INT088",
+ "INT089": "INT089",
+ "INT090": "INT090",
+ "INT091": "INT091",
+ "INT092": "INT092",
+ "INT093": "INT093",
+ "INT094": "INT094",
+ "INT095": "INT095",
+ "INT096": "INT096",
+ "INT097": "INT097",
+ "INT098": "INT098",
+ "INT099": "INT099",
+ "INT100": "INT100",
+ "LSTIME": "LSTime"
+ },
+ "fields": {
+ "saveRecorder": "str",
+ "saveChannel": "str",
+ "startTime": "date",
+ "INT001": "Decimal",
+ "INT002": "Decimal",
+ "INT003": "Decimal",
+ "INT004": "Decimal",
+ "INT005": "Decimal",
+ "INT006": "Decimal",
+ "INT007": "Decimal",
+ "INT008": "Decimal",
+ "INT009": "Decimal",
+ "INT010": "Decimal",
+ "INT011": "Decimal",
+ "INT012": "Decimal",
+ "INT013": "Decimal",
+ "INT014": "Decimal",
+ "INT015": "Decimal",
+ "INT016": "Decimal",
+ "INT017": "Decimal",
+ "INT018": "Decimal",
+ "INT019": "Decimal",
+ "INT020": "Decimal",
+ "INT021": "Decimal",
+ "INT022": "Decimal",
+ "INT023": "Decimal",
+ "INT024": "Decimal",
+ "INT025": "Decimal",
+ "INT026": "Decimal",
+ "INT027": "Decimal",
+ "INT028": "Decimal",
+ "INT029": "Decimal",
+ "INT030": "Decimal",
+ "INT031": "Decimal",
+ "INT032": "Decimal",
+ "INT033": "Decimal",
+ "INT034": "Decimal",
+ "INT035": "Decimal",
+ "INT036": "Decimal",
+ "INT037": "Decimal",
+ "INT038": "Decimal",
+ "INT039": "Decimal",
+ "INT040": "Decimal",
+ "INT041": "Decimal",
+ "INT042": "Decimal",
+ "INT043": "Decimal",
+ "INT044": "Decimal",
+ "INT045": "Decimal",
+ "INT046": "Decimal",
+ "INT047": "Decimal",
+ "INT048": "Decimal",
+ "INT049": "Decimal",
+ "INT050": "Decimal",
+ "INT051": "Decimal",
+ "INT052": "Decimal",
+ "INT053": "Decimal",
+ "INT054": "Decimal",
+ "INT055": "Decimal",
+ "INT056": "Decimal",
+ "INT057": "Decimal",
+ "INT058": "Decimal",
+ "INT059": "Decimal",
+ "INT060": "Decimal",
+ "INT061": "Decimal",
+ "INT062": "Decimal",
+ "INT063": "Decimal",
+ "INT064": "Decimal",
+ "INT065": "Decimal",
+ "INT066": "Decimal",
+ "INT067": "Decimal",
+ "INT068": "Decimal",
+ "INT069": "Decimal",
+ "INT070": "Decimal",
+ "INT071": "Decimal",
+ "INT072": "Decimal",
+ "INT073": "Decimal",
+ "INT074": "Decimal",
+ "INT075": "Decimal",
+ "INT076": "Decimal",
+ "INT077": "Decimal",
+ "INT078": "Decimal",
+ "INT079": "Decimal",
+ "INT080": "Decimal",
+ "INT081": "Decimal",
+ "INT082": "Decimal",
+ "INT083": "Decimal",
+ "INT084": "Decimal",
+ "INT085": "Decimal",
+ "INT086": "Decimal",
+ "INT087": "Decimal",
+ "INT088": "Decimal",
+ "INT089": "Decimal",
+ "INT090": "Decimal",
+ "INT091": "Decimal",
+ "INT092": "Decimal",
+ "INT093": "Decimal",
+ "INT094": "Decimal",
+ "INT095": "Decimal",
+ "INT096": "Decimal",
+ "INT097": "Decimal",
+ "INT098": "Decimal",
+ "INT099": "Decimal",
+ "INT100": "Decimal",
+ "LSTime": "date"
+ },
+ "dates": {
+ "startTime": "%d-%b-%y",
+ "LSTime": "%d-%b-%y"
+ },
+ "datetimes": {}
+ },
+ "eia-930-er/daily_operations": {
+ "archive_only": true,
+ "columns": {
+ "Product_Name": "productName",
+ "Posting_Type": "postingType",
+ "Balancing_Authority_Code": "balancingAuthorityCode",
+ "Data_Type": "dataType",
+ "Data_Code": "dataCode",
+ "Data_Date": "dataDate",
+ "UTC Offset": "UTCOffset",
+ "HR1": "HR1",
+ "HR2": "HR2",
+ "HR3": "HR3",
+ "HR4": "HR4",
+ "HR5": "HR5",
+ "HR6": "HR6",
+ "HR7": "HR7",
+ "HR8": "HR8",
+ "HR9": "HR9",
+ "HR10": "HR10",
+ "HR11": "HR11",
+ "HR12": "HR12",
+ "HR13": "HR13",
+ "HR14": "HR14",
+ "HR15": "HR15",
+ "HR16": "HR16",
+ "HR17": "HR17",
+ "HR18": "HR18",
+ "HR19": "HR19",
+ "HR20": "HR20",
+ "HR21": "HR21",
+ "HR22": "HR22",
+ "HR23": "HR23",
+ "HR24": "HR24",
+ "HR25": "HR25"
+ },
+ "variants": [
+ {
+ "Survey Name": "productName",
+ "Posting Type": "postingType",
+ "Balancing Authority Code": "balancingAuthorityCode",
+ "Interconnected Balancing Authority Code": "interconnectedBalancingAuthorityCode",
+ "Type": "dataType",
+ "Posted Date": "postedDate",
+ "UTCOffset": "UTCOffset",
+ "HR1": "HR1",
+ "HR2": "HR2",
+ "HR3": "HR3",
+ "HR4": "HR4",
+ "HR5": "HR5",
+ "HR6": "HR6",
+ "HR7": "HR7",
+ "HR8": "HR8",
+ "HR9": "HR9",
+ "HR10": "HR10",
+ "HR11": "HR11",
+ "HR12": "HR12",
+ "HR13": "HR13",
+ "HR14": "HR14",
+ "HR15": "HR15",
+ "HR16": "HR16",
+ "HR17": "HR17",
+ "HR18": "HR18",
+ "HR19": "HR19",
+ "HR20": "HR20",
+ "HR21": "HR21",
+ "HR22": "HR22",
+ "HR23": "HR23",
+ "HR24": "HR24",
+ "HR25": "HR25"
+ }
+ ],
+ "fields": {
+ "productName": "str",
+ "postingType": "str",
+ "balancingAuthorityCode": "str",
+ "interconnectedBalancingAuthorityCode": "str",
+ "dataType": "str",
+ "dataCode": "str",
+ "dataDate": "date",
+ "postedDate": "date",
+ "UTCOffset": "int",
+ "HR1": "EiaHour",
+ "HR2": "EiaHour",
+ "HR3": "EiaHour",
+ "HR4": "EiaHour",
+ "HR5": "EiaHour",
+ "HR6": "EiaHour",
+ "HR7": "EiaHour",
+ "HR8": "EiaHour",
+ "HR9": "EiaHour",
+ "HR10": "EiaHour",
+ "HR11": "EiaHour",
+ "HR12": "EiaHour",
+ "HR13": "EiaHour",
+ "HR14": "EiaHour",
+ "HR15": "EiaHour",
+ "HR16": "EiaHour",
+ "HR17": "EiaHour",
+ "HR18": "EiaHour",
+ "HR19": "EiaHour",
+ "HR20": "EiaHour",
+ "HR21": "EiaHour",
+ "HR22": "EiaHour",
+ "HR23": "EiaHour",
+ "HR24": "EiaHour",
+ "HR25": "EiaHour"
+ },
+ "dates": {
+ "dataDate": "%j%Y",
+ "postedDate": "%j%Y"
+ }
+ },
+ "np4-192-cd/dam_total_energy_purchased": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Settlement_Point": "settlementPoint",
+ "Total_DAM_Energy_Bought": "totalDamEnergyBought",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Settlement_Point": "settlementPoint",
+ "Total_DAM_Energy_Bought": "totalDamEnergyBought",
+ "DSTFlag": "repeatHourFlag"
+ }
+ ]
+ },
+ "np4-193-cd/total_dam_energy_sold": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Settlement_Point": "settlementPoint",
+ "TotalDAMEnergySold": "totalDAMEnergySold",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Settlement_Point": "settlementPoint",
+ "TotalDAMEnergySold": "totalDAMEnergySold",
+ "DSTFlag": "repeatHourFlag"
+ }
+ ]
+ },
+ "np4-194-cd/dam_ptp_obligation_sp_results": {
+ "columns": {
+ "DELIVERYDATE": "deliveryDate",
+ "HOURENDING": "hourEnding",
+ "STL_PNT": "stlPnt",
+ "TOTAL_PTP_OBL_AWARDED_SOURCE": "totalPtpOblAwardedSource",
+ "TOTAL_PTP_OBL_AWARDED_SINK": "totalPtpOblAwardedSink",
+ "DSTFlag": "repeatedHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np4-523-cd/dam_system_lambda": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "SystemLambda": "systemLambda",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np6-787-cd/lmp_electrical_bus": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatedHourFlag",
+ "ElectricalBus": "electricalBus",
+ "CappedLMP": "cappedLMP",
+ "UncappedLMP": "uncappedLMP"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatedHourFlag",
+ "ElectricalBus": "electricalBus",
+ "LMP": "LMP"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatedHourFlag": "bool",
+ "electricalBus": "str",
+ "cappedLMP": "Decimal",
+ "uncappedLMP": "Decimal",
+ "LMP": "Decimal"
+ }
+ },
+ "np6-788-cd/lmp_node_zone_hub": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "SettlementPoint": "settlementPoint",
+ "LMP": "LMP"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np4-33-cd/dam_as_plan": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "AncillaryType": "ancillaryType",
+ "Quantity": "quantity",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "ancillaryType": "str",
+ "quantity": "int",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-732-cd/wpp_hrly_avrg_actl_fcast": {
+ "columns": {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STWPF_SYSTEM_WIDE": "STWPFSystemWide",
+ "WGRPP_SYSTEM_WIDE": "WGRPPSystemWide",
+ "GEN_LZ_SOUTH_HOUSTON": "genLoadZoneSouthHouston",
+ "COP_HSL_LZ_SOUTH_HOUSTON": "COPHSLLoadZoneSouthHouston",
+ "STWPF_LZ_SOUTH_HOUSTON": "STWPFLoadZoneSouthHouston",
+ "WGRPP_LZ_SOUTH_HOUSTON": "WGRPPLoadZoneSouthHouston",
+ "GEN_LZ_WEST": "genLoadZoneWest",
+ "COP_HSL_LZ_WEST": "COPHSLLoadZoneWest",
+ "STWPF_LZ_WEST": "STWPFLoadZoneWest",
+ "WGRPP_LZ_WEST": "WGRPPLoadZoneWest",
+ "GEN_LZ_NORTH": "genLoadZoneNorth",
+ "COP_HSL_LZ_NORTH": "COPHSLLoadZoneNorth",
+ "STWPF_LZ_NORTH": "STWPFLoadZoneNorth",
+ "WGRPP_LZ_NORTH": "WGRPPLoadZoneNorth",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S",
+ "hourEndingTimestamp": "%m/%d/%Y %H:%M",
+ "hourBeginningTimestamp": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "HOUR_ENDING": "hourEndingTimestamp",
+ "ACTUAL_SYSTEM_WIDE": "actualSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STWPF_SYSTEM_WIDE": "STWPFSystemWide",
+ "WGRPP_SYSTEM_WIDE": "WGRPPSystemWide",
+ "ACTUAL_SOUTH_HOUSTON": "actualSouthHouston",
+ "COP_HSL_SOUTH_HOUSTON": "COPHSLSouthHouston",
+ "STWPF_SOUTH_HOUSTON": "STWPFSouthHouston",
+ "WGRPP_SOUTH_HOUSTON": "WGRPPSouthHouston",
+ "ACTUAL_WEST_NORTH": "actualWestNorth",
+ "COP_HSL_WEST_NORTH": "COPHSLWestNorth",
+ "STWPF_WEST_NORTH": "STWPFWestNorth",
+ "WGRPP_WEST_NORTH": "WGRPPWestNorth",
+ "DSTFlag": "DSTFlag"
+ },
+ {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "ACTUAL_SYSTEM_WIDE": "actualSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STWPF_SYSTEM_WIDE": "STWPFSystemWide",
+ "WGRPP_SYSTEM_WIDE": "WGRPPSystemWide",
+ "ACTUAL_LZ_SOUTH_HOUSTON": "actualLoadZoneSouthHouston",
+ "COP_HSL_LZ_SOUTH_HOUSTON": "COPHSLLoadZoneSouthHouston",
+ "STWPF_LZ_SOUTH_HOUSTON": "STWPFLoadZoneSouthHouston",
+ "WGRPP_LZ_SOUTH_HOUSTON": "WGRPPLoadZoneSouthHouston",
+ "ACTUAL_LZ_WEST": "actualLoadZoneWest",
+ "COP_HSL_LZ_WEST": "COPHSLLoadZoneWest",
+ "STWPF_LZ_WEST": "STWPFLoadZoneWest",
+ "WGRPP_LZ_WEST": "WGRPPLoadZoneWest",
+ "ACTUAL_LZ_NORTH": "actualLoadZoneNorth",
+ "COP_HSL_LZ_NORTH": "COPHSLLoadZoneNorth",
+ "STWPF_LZ_NORTH": "STWPFLoadZoneNorth",
+ "WGRPP_LZ_NORTH": "WGRPPLoadZoneNorth",
+ "DSTFlag": "DSTFlag"
+ },
+ {
+ "HOUR_BEGINNING": "hourBeginningTimestamp",
+ "ACTUAL_SYSTEM_WIDE": "actualSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STWPF_SYSTEM_WIDE": "STWPFSystemWide",
+ "WGRPP_SYSTEM_WIDE": "WGRPPSystemWide",
+ "ACTUAL_SOUTH_HOUSTON": "actualSouthHouston",
+ "COP_HSL_SOUTH_HOUSTON": "COPHSLSouthHouston",
+ "STWPF_SOUTH_HOUSTON": "STWPFSouthHouston",
+ "WGRPP_SOUTH_HOUSTON": "WGRPPSouthHouston",
+ "ACTUAL_WEST_NORTH": "actualWestNorth",
+ "COP_HSL_WEST_NORTH": "COPHSLWestNorth",
+ "STWPF_WEST_NORTH": "STWPFWestNorth",
+ "WGRPP_WEST_NORTH": "WGRPPWestNorth",
+ "DSTFlag": "DSTFlag"
+ },
+ {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "ACTUAL_SYSTEM_WIDE": "actualSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STWPF_SYSTEM_WIDE": "STWPFSystemWide",
+ "WGRPP_SYSTEM_WIDE": "WGRPPSystemWide",
+ "ACTUAL_SOUTH_HOUSTON": "actualSouthHouston",
+ "COP_HSL_SOUTH_HOUSTON": "COPHSLSouthHouston",
+ "STWPF_SOUTH_HOUSTON": "STWPFSouthHouston",
+ "WGRPP_SOUTH_HOUSTON": "WGRPPSouthHouston",
+ "ACTUAL_WEST_NORTH": "actualWestNorth",
+ "COP_HSL_WEST_NORTH": "COPHSLWestNorth",
+ "STWPF_WEST_NORTH": "STWPFWestNorth",
+ "WGRPP_WEST_NORTH": "WGRPPWestNorth",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "genSystemWide": "Decimal",
+ "COPHSLSystemWide": "Decimal",
+ "STWPFSystemWide": "Decimal",
+ "WGRPPSystemWide": "Decimal",
+ "genLoadZoneSouthHouston": "Decimal",
+ "COPHSLLoadZoneSouthHouston": "Decimal",
+ "STWPFLoadZoneSouthHouston": "Decimal",
+ "WGRPPLoadZoneSouthHouston": "Decimal",
+ "genLoadZoneWest": "Decimal",
+ "COPHSLLoadZoneWest": "Decimal",
+ "STWPFLoadZoneWest": "Decimal",
+ "WGRPPLoadZoneWest": "Decimal",
+ "genLoadZoneNorth": "Decimal",
+ "COPHSLLoadZoneNorth": "Decimal",
+ "STWPFLoadZoneNorth": "Decimal",
+ "WGRPPLoadZoneNorth": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool",
+ "hourEndingTimestamp": "datetime",
+ "actualSystemWide": "Decimal",
+ "actualSouthHouston": "Decimal",
+ "COPHSLSouthHouston": "Decimal",
+ "STWPFSouthHouston": "Decimal",
+ "WGRPPSouthHouston": "Decimal",
+ "actualWestNorth": "Decimal",
+ "COPHSLWestNorth": "Decimal",
+ "STWPFWestNorth": "Decimal",
+ "WGRPPWestNorth": "Decimal",
+ "actualLoadZoneSouthHouston": "Decimal",
+ "actualLoadZoneWest": "Decimal",
+ "actualLoadZoneNorth": "Decimal",
+ "hourBeginningTimestamp": "datetime"
+ }
+ },
+ "np1-346-er/outages": {
+ "archive_only": true,
+ "sheets": [
+ "Unplanned Resource Outages"
+ ],
+ "columns": {
+ "Resource Name": "resourceName",
+ "Resource Unit Code": "resourceUnitCode",
+ "Fuel Type": "fuelType",
+ "Outage Type": "outageType",
+ "Available MW Maximum": "availableMWMaximum",
+ "Available MW During Outage": "availableMWDuringOutage",
+ "Effective MW Reduction Due to Outage": "effectiveMWReduction",
+ "Actual Outage Start": "actualOutageStart",
+ "Return to Service Date": "returnToServiceDate",
+ "Nature Of Work": "natureOfWork"
+ },
+ "variants": [
+ {
+ "Resource Name": "resourceName",
+ "Resource Unit Code": "resourceUnitCode",
+ "Fuel Type": "fuelType",
+ "Outage Type": "outageType",
+ "Available MW Maximum": "availableMWMaximum",
+ "Available MW During Outage": "availableMWDuringOutage",
+ "Effective MW Reduction Due to Outage": "effectiveMWReduction",
+ "Actual Outage Start": "actualOutageStart",
+ "Planned End Date": "plannedEndDate",
+ "Actual End Date": "actualEndDate",
+ "Nature Of Work": "natureOfWork"
+ }
+ ],
+ "fields": {
+ "sourceSheet": "str",
+ "resourceName": "str",
+ "resourceUnitCode": "str",
+ "fuelType": "str",
+ "outageType": "str",
+ "availableMWMaximum": "Decimal",
+ "availableMWDuringOutage": "Decimal",
+ "effectiveMWReduction": "Decimal",
+ "actualOutageStart": "datetime",
+ "returnToServiceDate": "datetime",
+ "plannedEndDate": "datetime",
+ "actualEndDate": "datetime",
+ "natureOfWork": "str"
+ },
+ "dates": {}
+ },
+ "np3-108/demand_response": {
+ "archive_only": true,
+ "sheets": [
+ "Report Data",
+ "CLR Report Data",
+ "NCLR Report Data"
+ ],
+ "columns": {
+ "Month": "month",
+ "Hour": "hour",
+ "ASType": "ASType",
+ "Houston": "houston",
+ "North": "north",
+ "South": "south",
+ "West": "west"
+ },
+ "variants": [],
+ "fields": {
+ "sourceSheet": "str",
+ "month": "date",
+ "hour": "int",
+ "ASType": "str",
+ "houston": "Decimal",
+ "north": "Decimal",
+ "south": "Decimal",
+ "west": "Decimal"
+ },
+ "dates": {
+ "month": "%b-%y"
+ }
+ },
+ "np5-520-er/deployment_factors": {
+ "archive_only": true,
+ "sheets": [
+ "Monthly ASDF"
+ ],
+ "columns": {
+ "Delivery Month": "deliveryMonth",
+ "Hour Ending": "hourEnding",
+ "AS Type": "ASType",
+ "Avg AS Deployment Factors": "average",
+ "Min AS Deployment Factors": "minimum",
+ "Max AS Deployment Factors": "maximum"
+ },
+ "variants": [],
+ "fields": {
+ "sourceSheet": "str",
+ "deliveryMonth": "date",
+ "hourEnding": "int",
+ "ASType": "str",
+ "average": "Decimal",
+ "minimum": "Decimal",
+ "maximum": "Decimal"
+ },
+ "dates": {
+ "deliveryMonth": "%Y-%m"
+ }
+ },
+ "np4-733-cd/wpp_actual_5min_avg_values": {
+ "columns": {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "LZ_SOUTH_HOUSTON": "LZSouthHouston",
+ "LZ_WEST": "LZWest",
+ "LZ_NORTH": "LZNorth",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE": "genSystemWide",
+ "SOUTH_HOUSTON": "LZSouthHouston",
+ "WEST_NORTH": "LZWestNorth",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "intervalEnding": "datetime",
+ "genSystemWide": "Decimal",
+ "LZSouthHouston": "Decimal",
+ "LZWest": "Decimal",
+ "LZNorth": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool",
+ "LZWestNorth": "Decimal"
+ }
+ },
+ "np4-737-cd/spp_hrly_avrg_actl_fcast": {
+ "columns": {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STPPF_SYSTEM_WIDE": "STPPFSystemWide",
+ "PVGRPP_SYSTEM_WIDE": "PVGRPPSystemWide",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "hourEndingTimestamp": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "HOUR_ENDING": "hourEndingTimestamp",
+ "ACTUAL_SYSTEM_WIDE": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STPPF_SYSTEM_WIDE": "STPPFSystemWide",
+ "PVGRPP_SYSTEM_WIDE": "PVGRPPSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "ACTUAL_SYSTEM_WIDE": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STPPF_SYSTEM_WIDE": "STPPFSystemWide",
+ "PVGRPP_SYSTEM_WIDE": "PVGRPPSystemWide",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "genSystemWide": "Decimal",
+ "COPHSLSystemWide": "Decimal",
+ "STPPFSystemWide": "Decimal",
+ "PVGRPPSystemWide": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool",
+ "hourEndingTimestamp": "datetime"
+ }
+ },
+ "np4-738-cd/spp_actual_5min_avg_values": {
+ "columns": {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE": "genSystemWide",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "intervalEnding": "datetime",
+ "genSystemWide": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-742-cd/wpp_hrly_actual_fcast_geo": {
+ "columns": {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STWPF_SYSTEM_WIDE": "STWPFSystemWide",
+ "WGRPP_SYSTEM_WIDE": "WGRPPSystemWide",
+ "GEN_PANHANDLE": "genPanhandle",
+ "COP_HSL_PANHANDLE": "COPHSLPanhandle",
+ "STWPF_PANHANDLE": "STWPFPanhandle",
+ "WGRPP_PANHANDLE": "WGRPPPanhandle",
+ "GEN_COASTAL": "genCoastal",
+ "COP_HSL_COASTAL": "COPHSLCoastal",
+ "STWPF_COASTAL": "STWPFCoastal",
+ "WGRPP_COASTAL": "WGRPPCoastal",
+ "GEN_SOUTH": "genSouth",
+ "COP_HSL_SOUTH": "COPHSLSouth",
+ "STWPF_SOUTH": "STWPFSouth",
+ "WGRPP_SOUTH": "WGRPPSouth",
+ "GEN_WEST": "genWest",
+ "COP_HSL_WEST": "COPHSLWest",
+ "STWPF_WEST": "STWPFWest",
+ "WGRPP_WEST": "WGRPPWest",
+ "GEN_NORTH": "genNorth",
+ "COP_HSL_NORTH": "COPHSLNorth",
+ "STWPF_NORTH": "STWPFNorth",
+ "WGRPP_NORTH": "WGRPPNorth",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "ACTUAL_SYSTEM_WIDE": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STWPF_SYSTEM_WIDE": "STWPFSystemWide",
+ "WGRPP_SYSTEM_WIDE": "WGRPPSystemWide",
+ "ACTUAL_PANHANDLE": "genPanhandle",
+ "COP_HSL_PANHANDLE": "COPHSLPanhandle",
+ "STWPF_PANHANDLE": "STWPFPanhandle",
+ "WGRPP_PANHANDLE": "WGRPPPanhandle",
+ "ACTUAL_COASTAL": "genCoastal",
+ "COP_HSL_COASTAL": "COPHSLCoastal",
+ "STWPF_COASTAL": "STWPFCoastal",
+ "WGRPP_COASTAL": "WGRPPCoastal",
+ "ACTUAL_SOUTH": "genSouth",
+ "COP_HSL_SOUTH": "COPHSLSouth",
+ "STWPF_SOUTH": "STWPFSouth",
+ "WGRPP_SOUTH": "WGRPPSouth",
+ "ACTUAL_WEST": "genWest",
+ "COP_HSL_WEST": "COPHSLWest",
+ "STWPF_WEST": "STWPFWest",
+ "WGRPP_WEST": "WGRPPWest",
+ "ACTUAL_NORTH": "genNorth",
+ "COP_HSL_NORTH": "COPHSLNorth",
+ "STWPF_NORTH": "STWPFNorth",
+ "WGRPP_NORTH": "WGRPPNorth",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "genSystemWide": "Decimal",
+ "COPHSLSystemWide": "Decimal",
+ "STWPFSystemWide": "Decimal",
+ "WGRPPSystemWide": "Decimal",
+ "genPanhandle": "Decimal",
+ "COPHSLPanhandle": "Decimal",
+ "STWPFPanhandle": "Decimal",
+ "WGRPPPanhandle": "Decimal",
+ "genCoastal": "Decimal",
+ "COPHSLCoastal": "Decimal",
+ "STWPFCoastal": "Decimal",
+ "WGRPPCoastal": "Decimal",
+ "genSouth": "Decimal",
+ "COPHSLSouth": "Decimal",
+ "STWPFSouth": "Decimal",
+ "WGRPPSouth": "Decimal",
+ "genWest": "Decimal",
+ "COPHSLWest": "Decimal",
+ "STWPFWest": "Decimal",
+ "WGRPPWest": "Decimal",
+ "genNorth": "Decimal",
+ "COPHSLNorth": "Decimal",
+ "STWPFNorth": "Decimal",
+ "WGRPPNorth": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-743-cd/wpp_actual_5min_avg_values_geo": {
+ "columns": {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "PANHANDLE": "panhandle",
+ "COASTAL": "coastal",
+ "SOUTH": "south",
+ "WEST": "west",
+ "NORTH": "north",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE": "genSystemWide",
+ "PANHANDLE": "panhandle",
+ "COASTAL": "coastal",
+ "SOUTH": "south",
+ "WEST": "west",
+ "NORTH": "north",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "intervalEnding": "datetime",
+ "genSystemWide": "Decimal",
+ "panhandle": "Decimal",
+ "coastal": "Decimal",
+ "south": "Decimal",
+ "west": "Decimal",
+ "north": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-745-cd/spp_hrly_actual_fcast_geo": {
+ "columns": {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STPPF_SYSTEM_WIDE": "STPPFSystemWide",
+ "PVGRPP_SYSTEM_WIDE": "PVGRPPSystemWide",
+ "GEN_CenterWest": "genCenterWest",
+ "COP_HSL_CenterWest": "COPHSLCenterWest",
+ "STPPF_CenterWest": "STPPFCenterWest",
+ "PVGRPP_CenterWest": "PVGRPPCenterWest",
+ "GEN_NorthWest": "genNorthWest",
+ "COP_HSL_NorthWest": "COPHSLNorthWest",
+ "STPPF_NorthWest": "STPPFNorthWest",
+ "PVGRPP_NorthWest": "PVGRPPNorthWest",
+ "GEN_FarWest": "genFarWest",
+ "COP_HSL_FarWest": "COPHSLFarWest",
+ "STPPF_FarWest": "STPPFFarWest",
+ "PVGRPP_FarWest": "PVGRPPFarWest",
+ "GEN_FarEast": "genFarEast",
+ "COP_HSL_FarEast": "COPHSLFarEast",
+ "STPPF_FarEast": "STPPFFarEast",
+ "PVGRPP_FarEast": "PVGRPPFarEast",
+ "GEN_SouthEast": "genSouthEast",
+ "COP_HSL_SouthEast": "COPHSLSouthEast",
+ "STPPF_SouthEast": "STPPFSouthEast",
+ "PVGRPP_SouthEast": "PVGRPPSouthEast",
+ "GEN_CenterEast": "genCenterEast",
+ "COP_HSL_CenterEast": "COPHSLCenterEast",
+ "STPPF_CenterEast": "STPPFCenterEast",
+ "PVGRPP_CenterEast": "PVGRPPCenterEast",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "DELIVERY_DATE": "deliveryDate",
+ "HOUR_ENDING": "hourEnding",
+ "GEN_SYSTEM_WIDE": "genSystemWide",
+ "COP_HSL_SYSTEM_WIDE": "COPHSLSystemWide",
+ "STPPF_SYSTEM_WIDE": "STPPFSystemWide",
+ "PVGRPP_SYSTEM_WIDE": "PVGRPPSystemWide",
+ "GEN_CenterWest": "genCenterWest",
+ "COP_HSL_CenterWest": "COPHSLCenterWest",
+ "STPPF_CenterWest": "STPPFCenterWest",
+ "PVGRPP_CenterWest": "PVGRPPCenterWest",
+ "GEN_NorthWest": "genNorthWest",
+ "COP_HSL_NorthWest": "COPHSLNorthWest",
+ "STPPF_NorthWest": "STPPFNorthWest",
+ "PVGRPP_NorthWest": "PVGRPPNorthWest",
+ "GEN_FarWest": "genFarWest",
+ "COP_HSL_FarWest": "COPHSLFarWest",
+ "STPPF_FarWest": "STPPFFarWest",
+ "PVGRPP_FarWest": "PVGRPPFarWest",
+ "GEN_FarEast": "genFarEast",
+ "COP_HSL_FarEast": "COPHSLFarEast",
+ "STPPF_FarEast": "STPPFFarEast",
+ "PVGRPP_FarEast": "PVGRPPFarEast",
+ "GEN_SouthEast": "genSouthEast",
+ "COP_HSL_SouthEast": "COPHSLSouthEast",
+ "STPPF_SouthEast": "STPPFSouthEast",
+ "PVGRPP_SouthEast": "PVGRPPSouthEast",
+ "GEN_CenterEast": "genCenterEast",
+ "COP_HSL_CenterEast": "COPHSLCenterEast",
+ "STPPF_CenterEast": "STPPFCenterEast",
+ "PVGRPP_CenterEast": "PVGRPPCenterEast",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "genSystemWide": "Decimal",
+ "COPHSLSystemWide": "Decimal",
+ "STPPFSystemWide": "Decimal",
+ "PVGRPPSystemWide": "Decimal",
+ "genCenterWest": "Decimal",
+ "COPHSLCenterWest": "Decimal",
+ "STPPFCenterWest": "Decimal",
+ "PVGRPPCenterWest": "Decimal",
+ "genNorthWest": "Decimal",
+ "COPHSLNorthWest": "Decimal",
+ "STPPFNorthWest": "Decimal",
+ "PVGRPPNorthWest": "Decimal",
+ "genFarWest": "Decimal",
+ "COPHSLFarWest": "Decimal",
+ "STPPFFarWest": "Decimal",
+ "PVGRPPFarWest": "Decimal",
+ "genFarEast": "Decimal",
+ "COPHSLFarEast": "Decimal",
+ "STPPFFarEast": "Decimal",
+ "PVGRPPFarEast": "Decimal",
+ "genSouthEast": "Decimal",
+ "COPHSLSouthEast": "Decimal",
+ "STPPFSouthEast": "Decimal",
+ "PVGRPPSouthEast": "Decimal",
+ "genCenterEast": "Decimal",
+ "COPHSLCenterEast": "Decimal",
+ "STPPFCenterEast": "Decimal",
+ "PVGRPPCenterEast": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-746-cd/spp_actual_5min_avg_values_geo": {
+ "columns": {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "CenterWest_GEN": "genCenterWest",
+ "NorthWest_GEN": "genNorthWest",
+ "FarWest_GEN": "genFarWest",
+ "FarEast_GEN": "genFarEast",
+ "SouthEast_GEN": "genSouthEast",
+ "CenterEast_GEN": "genCenterEast",
+ "SYSTEM_WIDE_HSL": "HSLSystemWide",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %I:%M:%S %p"
+ },
+ "variants": [
+ {
+ "INTERVAL_ENDING": "intervalEnding",
+ "SYSTEM_WIDE_GEN": "genSystemWide",
+ "CenterWest_GEN": "genCenterWest",
+ "NorthWest_GEN": "genNorthWest",
+ "FarWest_GEN": "genFarWest",
+ "FarEast_GEN": "genFarEast",
+ "SouthEast_GEN": "genSouthEast",
+ "CenterEast_GEN": "genCenterEast",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "intervalEnding": "datetime",
+ "genSystemWide": "Decimal",
+ "genCenterWest": "Decimal",
+ "genNorthWest": "Decimal",
+ "genFarWest": "Decimal",
+ "genFarEast": "Decimal",
+ "genSouthEast": "Decimal",
+ "genCenterEast": "Decimal",
+ "HSLSystemWide": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np6-235-cd/system_wide_demand": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "TimeEnding": "timeEnding",
+ "Demand": "demand",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np6-322-cd/sced_system_lambda": {
+ "columns": {
+ "SCEDTimeStamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatedHourFlag",
+ "CappedSystemLambda": "cappedSystemLambda",
+ "UncappedSystemLambda": "uncappedSystemLambda"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatedHourFlag",
+ "SystemLambda": "systemLambda"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatedHourFlag": "bool",
+ "cappedSystemLambda": "Decimal",
+ "uncappedSystemLambda": "Decimal",
+ "systemLambda": "Decimal"
+ }
+ },
+ "np6-323-cd/rt_price_adder_sced": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "SystemLambda": "systemLambda",
+ "RTRDPA": "RTRDPA",
+ "RTRDPARUS": "RTRDPARUS",
+ "RTRDPARDS": "RTRDPARDS",
+ "RTRDPARRS": "RTRDPARRS",
+ "RTRDPAECRS": "RTRDPAECRS",
+ "RTRDPANSS": "RTRDPANSS",
+ "RTRRUC": "RTRRUC",
+ "RTRRMR": "RTRRMR",
+ "RTDNCLR": "RTDNCLR",
+ "RTDERS": "RTDERS",
+ "RTDCTIEIMPORT": "RTDCTIEIMPORT",
+ "RTDCTIEEXPORT": "RTDCTIEEXPORT",
+ "RTBLTIMPORT": "RTBLTIMPORT",
+ "RTBLTEXPORT": "RTBLTEXPORT",
+ "RTOLLSL": "RTOLLSL",
+ "RTOLHSL": "RTOLHSL",
+ "RTDLL": "RTDLL"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "BatchID": "BatchID",
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "SystemLambda": "systemLambda",
+ "PRC": "PRC",
+ "RTORPA": "RTORPA",
+ "RTOFFPA": "RTOFFPA",
+ "RTOLCAP": "RTOLCAP",
+ "RTOFFCAP": "RTOFFCAP",
+ "RTOLHSL": "RTOLHSL",
+ "RTBP": "RTBP",
+ "RTCLRCAP": "RTCLRCAP",
+ "RTCLRREG": "RTCLRREG",
+ "RTCLRBP": "RTCLRBP",
+ "RTCLRLSL": "RTCLRLSL",
+ "RTCLRNS": "RTCLRNS",
+ "RTNCLRRRS": "RTNCLRRRS",
+ "RTOLNSRS": "RTOLNSRS",
+ "RTCST30HSL": "RTCST30HSL",
+ "RTOFFNSHSL": "RTOFFNSHSL",
+ "RTOFF10": "RTOFF10",
+ "RTOFF30": "RTOFF30"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "systemLambda": "Decimal",
+ "RTRDPA": "Decimal",
+ "RTRDPARUS": "Decimal",
+ "RTRDPARDS": "Decimal",
+ "RTRDPARRS": "Decimal",
+ "RTRDPAECRS": "Decimal",
+ "RTRDPANSS": "Decimal",
+ "RTRRUC": "Decimal",
+ "RTRRMR": "Decimal",
+ "RTDNCLR": "Decimal",
+ "RTDERS": "Decimal",
+ "RTDCTIEIMPORT": "Decimal",
+ "RTDCTIEEXPORT": "Decimal",
+ "RTBLTIMPORT": "Decimal",
+ "RTBLTEXPORT": "Decimal",
+ "RTOLLSL": "Decimal",
+ "RTOLHSL": "Decimal",
+ "RTDLL": "Decimal",
+ "BatchID": "int",
+ "PRC": "Decimal",
+ "RTORPA": "Decimal",
+ "RTOFFPA": "Decimal",
+ "RTOLCAP": "Decimal",
+ "RTOFFCAP": "Decimal",
+ "RTBP": "Decimal",
+ "RTCLRCAP": "Decimal",
+ "RTCLRREG": "Decimal",
+ "RTCLRBP": "Decimal",
+ "RTCLRLSL": "Decimal",
+ "RTCLRNS": "Decimal",
+ "RTNCLRRRS": "Decimal",
+ "RTOLNSRS": "Decimal",
+ "RTCST30HSL": "Decimal",
+ "RTOFFNSHSL": "Decimal",
+ "RTOFF10": "Decimal",
+ "RTOFF30": "Decimal"
+ }
+ },
+ "np6-324-cd/rt_15min_price_adders": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "RTRDPA": "RTRDPA",
+ "RTRDPRU": "RTRDPRU",
+ "RTRDPRD": "RTRDPRD",
+ "RTRDPRRS": "RTRDPRRS",
+ "RTRDPECRS": "RTRDPECRS",
+ "RTRDPNS": "RTRDPNS",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "RTRSVPOR": "RTRSVPOR",
+ "RTRSVPOFF": "RTRSVPOFF",
+ "DSTFlag": "repeatHourFlag"
+ }
+ ],
+ "fields": {
+ "deliveryDate": "date",
+ "deliveryHour": "int",
+ "deliveryInterval": "int",
+ "RTRDPA": "Decimal",
+ "RTRDPRU": "Decimal",
+ "RTRDPRD": "Decimal",
+ "RTRDPRRS": "Decimal",
+ "RTRDPECRS": "Decimal",
+ "RTRDPNS": "Decimal",
+ "repeatHourFlag": "bool",
+ "RTRSVPOR": "Decimal",
+ "RTRSVPOFF": "Decimal"
+ }
+ },
+ "np6-325-cd/rtd_price_adders": {
+ "columns": {
+ "RTDTimestamp": "RTDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "IntervalID": "intervalID",
+ "IntervalEnding": "intervalEnding",
+ "IERepeatedHourFlag": "IERepeatHourFlag",
+ "SystemLambda": "systemLambda",
+ "RTRDPA": "RTRDPA",
+ "RTRDPARUS": "RTRDPARUS",
+ "RTRDPARDS": "RTRDPARDS",
+ "RTRDPARRS": "RTRDPARRS",
+ "RTRDPAECRS": "RTRDPAECRS",
+ "RTRDPANSS": "RTRDPANSS",
+ "RTRRUC": "RTRRUC",
+ "RTRRMR": "RTRRMR",
+ "RTDNCLR": "RTDNCLR",
+ "RTDERS": "RTDERS",
+ "RTDCTIEIMPORT": "RTDCTIEImport",
+ "RTDCTIEEXPORT": "RTDCTIEExport",
+ "RTBLTIMPORT": "RTBLTImport",
+ "RTBLTEXPORT": "RTBLTExport",
+ "RTOLLSL": "RTOLLSL",
+ "RTOLHSL": "RTOLHSL",
+ "RTDLL": "RTDLL"
+ },
+ "dates": {},
+ "datetimes": {
+ "RTDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "intervalEnding": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "BatchID": "BatchID",
+ "RTDTimestamp": "RTDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "IntervalID": "intervalID",
+ "IntervalEnding": "intervalEnding",
+ "IERepeatedHourFlag": "IERepeatHourFlag",
+ "SystemLambda": "systemLambda",
+ "RTORPA": "RTORPA",
+ "RTOFFPA": "RTOFFPA",
+ "RTOLCAP": "RTOLCAP",
+ "RTOFFCAP": "RTOFFCAP"
+ }
+ ],
+ "fields": {
+ "RTDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "intervalID": "int",
+ "intervalEnding": "datetime",
+ "IERepeatHourFlag": "bool",
+ "systemLambda": "Decimal",
+ "RTRDPA": "Decimal",
+ "RTRDPARUS": "Decimal",
+ "RTRDPARDS": "Decimal",
+ "RTRDPARRS": "Decimal",
+ "RTRDPAECRS": "Decimal",
+ "RTRDPANSS": "Decimal",
+ "RTRRUC": "Decimal",
+ "RTRRMR": "Decimal",
+ "RTDNCLR": "Decimal",
+ "RTDERS": "Decimal",
+ "RTDCTIEImport": "Decimal",
+ "RTDCTIEExport": "Decimal",
+ "RTBLTImport": "Decimal",
+ "RTBLTExport": "Decimal",
+ "RTOLLSL": "Decimal",
+ "RTOLHSL": "Decimal",
+ "RTDLL": "Decimal",
+ "BatchID": "int",
+ "RTORPA": "Decimal",
+ "RTOFFPA": "Decimal",
+ "RTOLCAP": "Decimal",
+ "RTOFFCAP": "Decimal"
+ }
+ },
+ "np6-625-cd/se_ld_rpt_ercot_gen": {
+ "columns": {
+ "SE_EXE_TIME": "seExeTime",
+ "SE_EXE_TIME_DST": "seExeTimeDST",
+ "SE_MW": "seMW",
+ "SE_MVAR": "seMVAR",
+ "SCADA_MW": "scadaMW",
+ "SCADA_MVAR": "scadaMVAR"
+ },
+ "dates": {},
+ "datetimes": {
+ "seExeTime": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np6-626-cd/se_load_dcties_flows": {
+ "columns": {
+ "TAGCLAST_TIME": "TAGCTimestamp",
+ "TAGCLAST_TIME_DST": "TAGCTimeDST",
+ "TIE_LINE_ID": "TIELineId",
+ "MW_TIE": "MWTIE",
+ "TEID_TIE": "TEIDTIE"
+ },
+ "dates": {},
+ "datetimes": {
+ "TAGCTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np6-915-cd/sum_hdl_ldl": {
+ "columns": {
+ "SCED_TimeStamp": "SCEDTimestamp",
+ "Repeated_Hour_Flag": "repeatHourFlag",
+ "GTBD": "GTBD",
+ "SUM_HDL": "sumHDL",
+ "SUM_LDL": "sumLDL"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np6-86-cd/shdw_prices_bnd_trns_const": {
+ "columns": {
+ "SCEDTimeStamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatedHourFlag",
+ "ConstraintID": "constraintID",
+ "ConstraintName": "constraintName",
+ "ContingencyName": "contingencyName",
+ "ShadowPrice": "shadowPrice",
+ "MaxShadowPrice": "maxShadowPrice",
+ "Limit": "limit",
+ "Value": "value",
+ "ViolatedMW": "violatedMW",
+ "FromStation": "fromStation",
+ "ToStation": "toStation",
+ "FromStationkV": "fromStationkV",
+ "ToStationkV": "toStationkV",
+ "CCTStatus": "CCTStatus"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "gen-55-cd/hrly_rt_load_fcast_actual": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "CurrentDayForecast": "currentDayFcast",
+ "DayAheadForecast": "dayAheadFcast",
+ "ActualLoad": "actualLoad",
+ "DayAheadHSL": "dayAheadHSL",
+ "CurrentDayHSL": "currentDayHSL",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-560-cd/7d_load_fcast_by_fzn": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "North": "north",
+ "South": "south",
+ "West": "west",
+ "Houston": "houston",
+ "SystemTotal": "systemTotal",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "North": "north",
+ "South": "south",
+ "West": "west",
+ "Houston": "houston",
+ "SystemTotal": "systemTotal",
+ "DSTFlag ": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "north": "Decimal",
+ "south": "Decimal",
+ "west": "Decimal",
+ "houston": "Decimal",
+ "systemTotal": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np3-561-cd/7d_load_fcast_by_wzn": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Coast": "coast",
+ "East": "east",
+ "FarWest": "farWest",
+ "North": "north",
+ "NorthCentral": "northCentral",
+ "SouthCentral": "southCentral",
+ "Southern": "southern",
+ "West": "west",
+ "SystemTotal": "systemTotal",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "coast": "Decimal",
+ "east": "Decimal",
+ "farWest": "Decimal",
+ "north": "Decimal",
+ "northCentral": "Decimal",
+ "southCentral": "Decimal",
+ "southern": "Decimal",
+ "west": "Decimal",
+ "systemTotal": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np3-562-cd/ih_load_fcast_by_wzn": {
+ "columns": {
+ "IntervalEnding": "intervalEnding",
+ "Coast": "coast",
+ "East": "east",
+ "FarWest": "farWest",
+ "North": "north",
+ "NorthCentral": "northCentral",
+ "SouthCentral": "southCentral",
+ "Southern": "southern",
+ "West": "west",
+ "SystemTotal": "systemTotal",
+ "Model": "model",
+ "InUseFlag": "inUseFlag",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "intervalEnding": "datetime",
+ "coast": "Decimal",
+ "east": "Decimal",
+ "farWest": "Decimal",
+ "north": "Decimal",
+ "northCentral": "Decimal",
+ "southCentral": "Decimal",
+ "southern": "Decimal",
+ "west": "Decimal",
+ "systemTotal": "Decimal",
+ "model": "str",
+ "inUseFlag": "bool",
+ "DSTFlag": "bool"
+ }
+ },
+ "np3-565-cd/lf_by_model_weather_zone": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Coast": "coast",
+ "East": "east",
+ "FarWest": "farWest",
+ "North": "north",
+ "NorthCentral": "northCentral",
+ "SouthCentral": "southCentral",
+ "Southern": "southern",
+ "West": "west",
+ "SystemTotal": "systemTotal",
+ "Model": "model",
+ "InUseFlag": "inUseFlag",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "coast": "Decimal",
+ "east": "Decimal",
+ "farWest": "Decimal",
+ "north": "Decimal",
+ "northCentral": "Decimal",
+ "southCentral": "Decimal",
+ "southern": "Decimal",
+ "west": "Decimal",
+ "systemTotal": "Decimal",
+ "model": "str",
+ "inUseFlag": "bool",
+ "DSTFlag": "bool"
+ }
+ },
+ "np3-566-cd/lf_by_model_study_area": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Valley": "valley",
+ "Model": "model",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "valley": "Decimal",
+ "model": "str",
+ "DSTFlag": "bool"
+ }
+ },
+ "np3-161-cd/7d_plus_avail_res_poc_margin": {
+ "columns": {
+ "OperatingDate": "operatingDate",
+ "ResourcePOLnonIRRnonPUN": "nonIRRNonPUN",
+ "ResourcePOLESR": "ESR",
+ "AggApprovedResourcePOLnonIRRnonPUN": "aggApprvdNonIRRNonPUN",
+ "AggReceivedResourcePOLnonIRRnonPUN": "aggRcvdNonIRRNonPUN",
+ "ResourcePOLIRR": "IRR",
+ "AggApprovedResourcePOLIRR": "aggApprvdIRR",
+ "AggReceivedResourcePOLIRR": "aggRcvdIRR",
+ "AggApprovedResourcePOLESR": "aggApprvdESR",
+ "AggReceivedResourcePOLESR": "aggRcvdESR"
+ },
+ "dates": {
+ "operatingDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "operatingDate": "date",
+ "nonIRRNonPUN": "Decimal",
+ "ESR": "Decimal",
+ "aggApprvdNonIRRNonPUN": "Decimal",
+ "aggRcvdNonIRRNonPUN": "Decimal",
+ "IRR": "Decimal",
+ "aggApprvdIRR": "Decimal",
+ "aggRcvdIRR": "Decimal",
+ "aggApprvdESR": "Decimal",
+ "aggRcvdESR": "Decimal"
+ }
+ },
+ "np3-162-cd/7d_avail_res_poc_margin": {
+ "columns": {
+ "OperatingDate": "operatingDate",
+ "HourEnding": "hourEnding",
+ "ResourcePOLnonIRRnonPUN": "nonIrrNonPun",
+ "AggApprovedResourcePOLnonIRRnonPUN": "aggApprvdNonIRRNonPUN",
+ "AggReceivedResourcePOLnonIRRnonPUN": "aggRcvdNonIRRNonPUN",
+ "ResourcePOLIRR": "IRR",
+ "AggApprovedResourcePOLIRR": "aggApprvdIRR",
+ "AggReceivedResourcePOLIRR": "aggRcvdIRR",
+ "ResourcePOLESR": "ESR",
+ "AggApprovedResourcePOLESR": "aggApprvdESR",
+ "AggReceivedResourcePOLESR": "aggRcvdESR",
+ "RepeatedHourFlag": "repeatedHourFlag"
+ },
+ "dates": {
+ "operatingDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "operatingDate": "date",
+ "hourEnding": "int",
+ "nonIrrNonPun": "Decimal",
+ "aggApprvdNonIRRNonPUN": "Decimal",
+ "aggRcvdNonIRRNonPUN": "Decimal",
+ "IRR": "Decimal",
+ "aggApprvdIRR": "Decimal",
+ "aggRcvdIRR": "Decimal",
+ "ESR": "Decimal",
+ "aggApprvdESR": "Decimal",
+ "aggRcvdESR": "Decimal",
+ "repeatedHourFlag": "bool"
+ }
+ },
+ "np3-233-cd/hourly_res_outage_cap": {
+ "columns": {
+ "Date": "operatingDate",
+ "HourEnding": "hourEnding",
+ "TotalResourceMWZoneSouth": "totalResourceMWZoneSouth",
+ "TotalResourceMWZoneNorth": "totalResourceMWZoneNorth",
+ "TotalResourceMWZoneWest": "totalResourceMWZoneWest",
+ "TotalResourceMWZoneHouston": "totalResourceMWZoneHouston",
+ "TotalIRRMWZoneSouth": "totalIRRMWZoneSouth",
+ "TotalIRRMWZoneNorth": "totalIRRMWZoneNorth",
+ "TotalIRRMWZoneWest": "totalIRRMWZoneWest",
+ "TotalIRRMWZoneHouston": "totalIRRMWZoneHouston",
+ "TotalNewEquipResourceMWZoneSouth": "totalNewEquipResourceMWZoneSouth",
+ "TotalNewEquipResourceMWZoneNorth": "totalNewEquipResourceMWZoneNorth",
+ "TotalNewEquipResourceMWZoneWest": "totalNewEquipResourceMWZoneWest",
+ "TotalNewEquipResourceMWZoneHouston": "totalNewEquipResourceMWZoneHouston"
+ },
+ "dates": {
+ "operatingDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "Date": "operatingDate",
+ "HourEnding": "hourEnding",
+ "TotalResourceMW": "totalResourceMW",
+ "TotalIRRMW": "totalIRRMW"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "operatingDate": "date",
+ "hourEnding": "int",
+ "totalResourceMWZoneSouth": "int",
+ "totalResourceMWZoneNorth": "int",
+ "totalResourceMWZoneWest": "int",
+ "totalResourceMWZoneHouston": "int",
+ "totalIRRMWZoneSouth": "int",
+ "totalIRRMWZoneNorth": "int",
+ "totalIRRMWZoneWest": "int",
+ "totalIRRMWZoneHouston": "int",
+ "totalNewEquipResourceMWZoneSouth": "int",
+ "totalNewEquipResourceMWZoneNorth": "int",
+ "totalNewEquipResourceMWZoneWest": "int",
+ "totalNewEquipResourceMWZoneHouston": "int",
+ "totalResourceMW": "int",
+ "totalIRRMW": "int"
+ }
+ },
+ "np3-763-cd/st_sys_adequacy": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "CapGenResSouth": "capGenResSouth",
+ "CapGenResNorth": "capGenResNorth",
+ "CapGenResWest": "capGenResWest",
+ "CapGenResHouston": "capGenResHouston",
+ "CapLoadResSouth": "capLoadResSouth",
+ "CapLoadResNorth": "capLoadResNorth",
+ "CapLoadResWest": "capLoadResWest",
+ "CapLoadResHouston": "capLoadResHouston",
+ "OfflineAvailableMWSouth": "offAvailMWSouth",
+ "OfflineAvailableMWNorth": "offAvailMWNorth",
+ "OfflineAvailableMWWest": "offAvailMWWest",
+ "OfflineAvailableMWHouston": "offAvailMWHouston",
+ "AvailCapGen": "availCapGen",
+ "AvailCapReserve": "availCapRes",
+ "CapGenResTotal": "capGenRes",
+ "CapLoadResTotal": "capLoadRes",
+ "OfflineAvailableMWTotal": "offAvailMW",
+ "CapREGUPTotal": "capREGUP",
+ "CapREGDNTotal": "capREGDN",
+ "CapRRSTotal": "capRRS",
+ "CapECRSTotal": "capECRS",
+ "CapNSPINTotal": "capNSPIN",
+ "CapREGUP_RRSTotal": "capREGUPRRS",
+ "CapREGUP_RRS_ECRSTotal": "capREGUPRRSECRS",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "capREGUPRRSECRSNSPIN",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "TotalCapGenRes": "capGenRes",
+ "TotalCapLoadRes": "capLoadRes",
+ "DSTFlag": "repeatHourFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "capGenResSouth": "Decimal",
+ "capGenResNorth": "Decimal",
+ "capGenResWest": "Decimal",
+ "capGenResHouston": "Decimal",
+ "capLoadResSouth": "Decimal",
+ "capLoadResNorth": "Decimal",
+ "capLoadResWest": "Decimal",
+ "capLoadResHouston": "Decimal",
+ "offAvailMWSouth": "Decimal",
+ "offAvailMWNorth": "Decimal",
+ "offAvailMWWest": "Decimal",
+ "offAvailMWHouston": "Decimal",
+ "availCapGen": "Decimal",
+ "availCapRes": "Decimal",
+ "capGenRes": "Decimal",
+ "capLoadRes": "Decimal",
+ "offAvailMW": "Decimal",
+ "capREGUP": "Decimal",
+ "capREGDN": "Decimal",
+ "capRRS": "Decimal",
+ "capECRS": "Decimal",
+ "capNSPIN": "Decimal",
+ "capREGUPRRS": "Decimal",
+ "capREGUPRRSECRS": "Decimal",
+ "capREGUPRRSECRSNSPIN": "Decimal",
+ "repeatHourFlag": "bool"
+ }
+ },
+ "np3-764-cd/hrly_ruc_online_sced_offline_cop": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "RUCTimestamp": "RUCTimestamp",
+ "SCEDTimestamp": "SCEDTimestamp",
+ "SumSCEDHSLsOnlineSCEDOfflineCOPSouth": "sumSCEDSouth",
+ "SumSCEDHSLsOnlineSCEDOfflineCOPNorth": "sumSCEDNorth",
+ "SumSCEDHSLsOnlineSCEDOfflineCOPWest": "sumSCEDWest",
+ "SumSCEDHSLsOnlineSCEDOfflineCOPHouston": "sumSCEDHouston",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S",
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "RUCTimestamp": "RUCTimestamp",
+ "SCEDTimestamp": "SCEDTimestamp",
+ "SumSCEDHSLsOnlineSCEDOfflineCOP": "sumSCEDTotal",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "RUCTimestamp": "datetime",
+ "SCEDTimestamp": "datetime",
+ "sumSCEDSouth": "Decimal",
+ "sumSCEDNorth": "Decimal",
+ "sumSCEDWest": "Decimal",
+ "sumSCEDHouston": "Decimal",
+ "DSTFlag": "bool",
+ "sumSCEDTotal": "Decimal"
+ }
+ },
+ "np3-765-cd/approved_dctie_schedules": {
+ "columns": {
+ "DC_Tie": "DCTie",
+ "GMT_Interval_Ending": "GMTIntervalEnding",
+ "Interval_Ending": "intervalEnding",
+ "Repeated_Hour": "repeatHourFlag",
+ "MW": "MW",
+ "Import_Export": "importExport"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "GMTIntervalEnding": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "DCTie": "str",
+ "GMTIntervalEnding": "datetime",
+ "intervalEnding": "datetime",
+ "repeatHourFlag": "bool",
+ "MW": "Decimal",
+ "importExport": "str"
+ }
+ },
+ "np4-179-cd/total_as_service_offers": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "REGDN": "REGDN",
+ "REGUP": "REGUP",
+ "RRSPFR": "RRSPFR",
+ "RRSFFR": "RRSFFR",
+ "RRSUFR": "RRSUFR",
+ "ECRSSD": "ECRSSD",
+ "ECRSMD": "ECRSMD",
+ "NSPIN": "NSPIN",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "REGDN": "REGDN",
+ "REGUP": "REGUP",
+ "RRS": "RRS",
+ "NSPIN": "NSPIN",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "REGDN": "Decimal",
+ "REGUP": "Decimal",
+ "RRSPFR": "Decimal",
+ "RRSFFR": "Decimal",
+ "RRSUFR": "Decimal",
+ "ECRSSD": "Decimal",
+ "ECRSMD": "Decimal",
+ "NSPIN": "Decimal",
+ "DSTFlag": "bool",
+ "RRS": "Decimal"
+ }
+ },
+ "np4-532-cd/dam_as_sold": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "ASType": "ASType",
+ "Quantity": "quantity",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np4-790-cd/peaker_net_margin": {
+ "columns": {
+ "AsOfDate": "asOfDate",
+ "PeakerNetMargin": "peakerNetMargin"
+ },
+ "dates": {},
+ "datetimes": {
+ "asOfDate": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np4-791-cd/da_sw_offer_caps": {
+ "columns": {
+ "SWCAPType": "SWCAPType",
+ "DASWCAP": "DASWCAP",
+ "RTSWCAP": "RTSWCAP"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "SWCAPType": "SWCAPType",
+ "SWCAP": "SWCAP"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "SWCAPType": "str",
+ "DASWCAP": "Decimal",
+ "RTSWCAP": "Decimal",
+ "SWCAP": "Decimal"
+ }
+ },
+ "np5-108-cd/hrly_rmr_services_deployed": {
+ "columns": {
+ "HourEnding": "hourEnding",
+ "ResourceName": "resourceName",
+ "MWHDeployment": "mwhDeployment",
+ "DSTFlag": "repeatHourFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "hourEnding": "str",
+ "resourceName": "str",
+ "mwhDeployment": "Decimal",
+ "repeatHourFlag": "bool"
+ }
+ },
+ "np7-464-cd/dam_ptp_option_price_report": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Price": "price",
+ "Source": "source",
+ "Sink": "sink",
+ "DSTFlag": "repeatedHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "price": "Decimal",
+ "source": "str",
+ "sink": "str",
+ "repeatedHourFlag": "bool"
+ }
+ },
+ "np4-442-cd/hrly_sys_reg_wind_fcast_model": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Region": "region",
+ "Value": "value",
+ "Model": "model",
+ "InUseFlag": "inUseFlag",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "region": "str",
+ "value": "Decimal",
+ "model": "str",
+ "inUseFlag": "bool",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-443-cd/hrly_sys_reg_solar_fcast_model": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Region": "region",
+ "Value": "value",
+ "Model": "model",
+ "InUseFlag": "inUseFlag",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "region": "str",
+ "value": "Decimal",
+ "model": "str",
+ "inUseFlag": "bool",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-751-cd/ih_wind_fcast_geo": {
+ "columns": {
+ "IntervalEnding": "intervalEnding",
+ "Region": "region",
+ "Value": "value",
+ "Model": "model",
+ "InUseFlag": "inUseFlag",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "intervalEnding": "datetime",
+ "region": "str",
+ "value": "Decimal",
+ "model": "str",
+ "inUseFlag": "bool",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-752-cd/ih_solar_fcast_geo": {
+ "columns": {
+ "IntervalEnding": "intervalEnding",
+ "Region": "region",
+ "Value": "value",
+ "Model": "model",
+ "InUseFlag": "inUseFlag",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "intervalEnding": "datetime",
+ "region": "str",
+ "value": "Decimal",
+ "model": "str",
+ "inUseFlag": "bool",
+ "DSTFlag": "bool"
+ }
+ },
+ "np5-525-cd/wruc_as_deploy_factors": {
+ "columns": {
+ "RUCTimestamp": "RUCTimestamp",
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "ASType": "ASType",
+ "ASDeploymentFactors": "ASDeploymentFactors",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S",
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "RUCTimestamp": "datetime",
+ "deliveryDate": "date",
+ "deliveryHour": "str",
+ "ASType": "str",
+ "ASDeploymentFactors": "Decimal",
+ "repeatHourFlag": "bool"
+ }
+ },
+ "np5-526-cd/proj_as_deploy_factor": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "ASType": "ASType",
+ "ASDeploymentFactors": "ASDeploymentFactors",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "ASType": "str",
+ "ASDeploymentFactors": "Decimal",
+ "repeatHourFlag": "bool"
+ }
+ },
+ "np5-527-cd/druc_as_deploy_factors": {
+ "columns": {
+ "RUCTimestamp": "RUCTimestamp",
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "ASType": "ASType",
+ "ASDeploymentFactors": "ASDeploymentFactors",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np5-528-cd/hruc_as_deploy_factors": {
+ "columns": {
+ "RUCTimestamp": "RUCTimestamp",
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "ASType": "ASType",
+ "ASDeploymentFactors": "ASDeploymentFactors",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np4-212-cd/dam_sced_as_demand_curves": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "ASType": "ASType",
+ "DemandCurvePoint": "demandCurvePoint",
+ "Quantity": "quantity",
+ "Price": "price",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "ASType": "str",
+ "demandCurvePoint": "Decimal",
+ "quantity": "Decimal",
+ "price": "Decimal",
+ "repeatHourFlag": "bool"
+ }
+ },
+ "np4-213-cd/hruc_as_demand_curves": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "RUCTimeStamp": "RUCTimestamp",
+ "ASType": "ASType",
+ "DemandCurvePoint": "demandCurvePoint",
+ "Quantity": "quantity",
+ "Price": "price",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np4-214-cd/druc_as_demand_curves": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "RUCTimeStamp": "RUCTimestamp",
+ "ASType": "ASType",
+ "DemandCurvePoint": "demandCurvePoint",
+ "Quantity": "quantity",
+ "Price": "price",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np4-215-cd/wruc_as_demand_curves": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "RUCTimeStamp": "RUCTimestamp",
+ "ASType": "ASType",
+ "DemandCurvePoint": "demandCurvePoint",
+ "Quantity": "quantity",
+ "Price": "price",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S",
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "RUCTimestamp": "datetime",
+ "ASType": "str",
+ "demandCurvePoint": "Decimal",
+ "quantity": "Decimal",
+ "price": "Decimal",
+ "repeatHourFlag": "bool"
+ }
+ },
+ "np6-328-cd/tot_as_res_cap": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "CapREGUPTotal": "capREGUP",
+ "CapREGDNTotal": "capREGDN",
+ "CapRRSTotal": "capRRS",
+ "CapECRSTotal": "capECRS",
+ "CapNSPINTotal": "capNSPIN",
+ "CapREGUP_RRSTotal": "capREGUPRRS",
+ "CapREGUP_RRS_ECRSTotal": "capREGUPRRSECRS",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "capREGUPRRSECRSNSPIN"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np6-329-cd/rtd_ind_mcpc": {
+ "columns": {
+ "RTDTimestamp": "RTDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "IntervalID": "intervalId",
+ "IntervalEnding": "intervalEnding",
+ "IntervalEndingRepeatedHourFlag": "intervalRepeatHourFlag",
+ "REGUP": "REGUP",
+ "REGDN": "REGDN",
+ "RRS": "RRS",
+ "ECRS": "ECRS",
+ "NSPIN": "NSPIN"
+ },
+ "dates": {},
+ "datetimes": {
+ "RTDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "intervalEnding": "%m/%d/%Y %H:%M"
+ }
+ },
+ "np6-331-cd/rt_clear_price_cap": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInt",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "ASType": "ASType",
+ "MCPC": "MCPC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np6-332-cd/rt_clear_price_cap_sced": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatedHourFlag",
+ "ASType": "ASType",
+ "CappedMCPC": "cappedMCPC",
+ "UncappedMCPC": "uncappedMCPC"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatedHourFlag",
+ "ASType": "ASType",
+ "MCPC": "MCPC"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatedHourFlag": "bool",
+ "ASType": "str",
+ "cappedMCPC": "Decimal",
+ "uncappedMCPC": "Decimal",
+ "MCPC": "Decimal"
+ }
+ },
+ "np5-754-cd/daily_ruc_act_and_bind_tran_const": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "RUCTimeStamp": "RUCTimestamp",
+ "ConstraintID": "constraintID",
+ "ConstraintName": "constraintName",
+ "ContingencyName": "contingencyName",
+ "Limit": "limit",
+ "Value": "value",
+ "ViolationAmount": "violationAmount",
+ "FromStation": "fromStation",
+ "ToStation": "toStation",
+ "FromStationkV": "fromStationkV",
+ "ToStationkV": "toStationkV",
+ "DSTFlag": "repeatedHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np5-755-cd/hrly_ruc_act_and_bind_tran_const": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "RUCTimeStamp": "RUCTimestamp",
+ "ConstraintID": "constraintID",
+ "ConstraintName": "constraintName",
+ "ContingencyName": "contingencyName",
+ "Limit": "limit",
+ "Value": "value",
+ "ViolationAmount": "violationAmount",
+ "FromStation": "fromStation",
+ "ToStation": "toStation",
+ "FromStationkV": "fromStationkV",
+ "ToStationkV": "toStationkV",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S",
+ "RUCTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "RUCTimestamp": "datetime",
+ "constraintID": "int",
+ "constraintName": "str",
+ "contingencyName": "str",
+ "limit": "Decimal",
+ "value": "Decimal",
+ "violationAmount": "Decimal",
+ "fromStation": "str",
+ "toStation": "str",
+ "fromStationkV": "Decimal",
+ "toStationkV": "Decimal",
+ "DSTFlag": "bool"
+ }
+ },
+ "np6-970-cd/rtd_lmp_node_zone_hub": {
+ "columns": {
+ "RTDTimestamp": "RTDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "IntervalId": "intervalId",
+ "IntervalEnding": "intervalEnding",
+ "IntervalRepeatedHourFlag": "intervalRepeatHourFlag",
+ "SettlementPoint": "settlementPoint",
+ "SettlementPointType": "settlementPointType",
+ "LMP": "LMP"
+ },
+ "dates": {},
+ "datetimes": {
+ "RTDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "intervalEnding": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np4-158-sg/dam_essps": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "SettlementPoint": "settlementPoint",
+ "GroupIndex": "groupIndex",
+ "UpdateTime": "updateTime",
+ "DSTFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S",
+ "updateTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "settlementPoint": "str",
+ "groupIndex": "int",
+ "updateTime": "datetime",
+ "repeatHourFlag": "bool"
+ }
+ },
+ "np4-159-cd/load_distribution_factors": {
+ "columns": {
+ "LdfDate": "LDFDate",
+ "LdfHour": "LDFHour",
+ "SubStation": "substation",
+ "DistributionFactor": "distributionFactor",
+ "LoadID": "loadId",
+ "MVARDistributionFactor": "MVARDistributionFactor",
+ "MRIDLoad": "MRIDLoad",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "LDFDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "LdfDate": "LDFDate",
+ "LdfHour": "LDFHour",
+ "SubStation": "substation",
+ "LoadDistributionFactor": "distributionFactor",
+ "LoadID": "loadId",
+ "MVARDistributionFactor": "MVARDistributionFactor",
+ "MRIDLoad": "MRIDLoad",
+ "DSTFlag": "DSTFlag"
+ }
+ ],
+ "fields": {
+ "postedDatetime": "datetime",
+ "LDFDate": "date",
+ "LDFHour": "str",
+ "substation": "str",
+ "distributionFactor": "Decimal",
+ "loadId": "str",
+ "MVARDistributionFactor": "Decimal",
+ "MRIDLoad": "str",
+ "DSTFlag": "bool"
+ }
+ },
+ "np4-200-cd/dam_de_energized_spbc": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "SettlementPoint": "settlementPoint",
+ "DSTFlag": "repeatedHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np4-231-cd/electrical_bus_map_heur_price": {
+ "columns": {
+ "MarketType": "marketType",
+ "FromEBName": "fromEBName",
+ "ToEBName": "toEBName",
+ "Type": "type",
+ "Priority": "priority"
+ },
+ "dates": {},
+ "datetimes": {
+ "postedDatetime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "postedDatetime": "datetime",
+ "marketType": "str",
+ "fromEBName": "str",
+ "toEBName": "str",
+ "type": "str",
+ "priority": "Decimal"
+ }
+ },
+ "np4-196-m/dam_price_corrections_eblmp": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "ElectricBusName": "electricalBus",
+ "LMPOriginal": "LMPOriginal",
+ "LMPCorrected": "LMPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_DAM_EBLMP_*.csv",
+ "document": "*pricecorrection_DAM_EBLMP_*"
+ },
+ "np4-196-m/dam_price_corrections_spp": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "SettlementPoint": "settlementPoint",
+ "SPPOriginal": "SPPOriginal",
+ "SPPCorrected": "SPPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_DAM_SPP_*.csv",
+ "document": "*pricecorrection_DAM_SPP_*"
+ },
+ "np4-196-m/dam_price_corrections_mcpc": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "ASType": "ASType",
+ "MCPCOriginal": "MCPCOriginal",
+ "MCPCCorrected": "MCPCCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_DAM_MCPC_*.csv",
+ "document": "*pricecorrection_DAM_MCPC_*"
+ },
+ "np4-197-m/rtm_price_corrections_soglmp": {
+ "columns": {
+ "ScedTimestamp": "SCEDTimestamp",
+ "ResourceType": "resourceType",
+ "ResourceName": "resourceName",
+ "MeterName": "meterName",
+ "MeterLMPOriginal": "meterLMPOriginal",
+ "MeterLMPCorrected": "meterLMPCorrected",
+ "RTRDPAOriginal": "RTRDPAOriginal",
+ "RTRDPACorrected": "RTRDPACorrected",
+ "FinalLMPOriginal": "finalLMPOriginal",
+ "FinalLMPCorrected": "finalLMPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_SOGLMP_*.csv",
+ "document": "*pricecorrection_RTM_SOGLMP_*",
+ "variants": [
+ {
+ "ScedTimestamp": "SCEDTimestamp",
+ "ResourceType": "resourceType",
+ "ResourceName": "resourceName",
+ "MeterName": "meterName",
+ "MeterLMPOriginal": "meterLMPOriginal",
+ "MeterLMPCorrected": "meterLMPCorrected",
+ "RTORPAOriginal": "RTORPAOriginal",
+ "RTORPACorrected": "RTORPACorrected",
+ "RTORDPAOriginal": "RTORDPAOriginal",
+ "RTORDPACorrected": "RTORDPACorrected",
+ "FinalLMPOriginal": "finalLMPOriginal",
+ "FinalLMPCorrected": "finalLMPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "repeatHourFlag"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "resourceType": "str",
+ "resourceName": "str",
+ "meterName": "str",
+ "meterLMPOriginal": "Decimal",
+ "meterLMPCorrected": "Decimal",
+ "RTRDPAOriginal": "Decimal",
+ "RTRDPACorrected": "Decimal",
+ "finalLMPOriginal": "Decimal",
+ "finalLMPCorrected": "Decimal",
+ "priceCorrectionTime": "datetime",
+ "repeatHourFlag": "bool",
+ "RTORPAOriginal": "Decimal",
+ "RTORPACorrected": "Decimal",
+ "RTORDPAOriginal": "Decimal",
+ "RTORDPACorrected": "Decimal"
+ }
+ },
+ "np4-197-m/rtm_price_corrections_spp": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "SettlementPointName": "settlementPointName",
+ "SettlementPointType": "settlementPointType",
+ "SPPOriginal": "SPPOriginal",
+ "SPPCorrected": "SPPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_SPP_*.csv",
+ "document": "*pricecorrection_RTM_SPP_*"
+ },
+ "np4-197-m/rtm_price_corrections_sogprice": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "ResourceType": "resourceType",
+ "ResourceName": "resourceName",
+ "MeterName": "meterName",
+ "PriceOriginal": "priceOriginal",
+ "PriceCorrected": "priceCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_SOGPRICE_*.csv",
+ "document": "*pricecorrection_RTM_SOGPRICE_*"
+ },
+ "np4-197-m/rtm_price_corrections_splmp": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "SettlementPoint": "settlementPointName",
+ "LMPOriginal": "LMPOriginal",
+ "LMPCorrected": "LMPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_SPLMP_*.csv",
+ "document": "*pricecorrection_RTM_SPLMP_*"
+ },
+ "np4-197-m/rtm_price_corrections_mcpc_spp": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "ASType": "ASType",
+ "MCPCOriginal": "MCPCOriginal",
+ "MCPCCorrected": "MCPCCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_MCPC_SPP_*.csv",
+ "document": "*pricecorrection_RTM_MCPC_SPP_*"
+ },
+ "np4-197-m/rtm_price_corrections_eblmp": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "ElectricalBus": "electricalBus",
+ "CappedLMPOriginal": "cappedLMPOriginal",
+ "UncappedLMPOriginal": "uncappedLMPOriginal",
+ "CappedLMPCorrected": "cappedLMPCorrected",
+ "UncappedLMPCorrected": "uncappedLMPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "RepeatedHourFlag": "repeatedHourFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_EBLMP_*.csv",
+ "document": "*pricecorrection_RTM_EBLMP_*",
+ "variants": [
+ {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "ElectricBusName": "electricalBus",
+ "LMPOriginal": "LMPOriginal",
+ "LMPCorrected": "LMPCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "repeatedHourFlag"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "electricalBus": "str",
+ "cappedLMPOriginal": "Decimal",
+ "uncappedLMPOriginal": "Decimal",
+ "cappedLMPCorrected": "Decimal",
+ "uncappedLMPCorrected": "Decimal",
+ "priceCorrectionTime": "datetime",
+ "repeatedHourFlag": "bool",
+ "LMPOriginal": "Decimal",
+ "LMPCorrected": "Decimal"
+ }
+ },
+ "np4-197-m/rtm_price_corrections_shadow": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "ConstrID": "constraintId",
+ "ConstrName": "constraintName",
+ "ContingencyName": "contingencyName",
+ "ShadowPriceOrig": "shadowPriceOriginal",
+ "ShadowPriceCorrected": "shadowPriceCorrected",
+ "LimitOrig": "limitOriginal",
+ "LimitCorrected": "limitCorrected",
+ "ValueOriginal": "valueOriginal",
+ "ValueCorrected": "valueCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_ShadowPrice_*.csv",
+ "document": "*pricecorrection_RTM_ShadowPrice_*"
+ },
+ "np4-197-m/rtm_price_corrections_mcpc_sced": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "ASType": "ASType",
+ "CappedMCPCOriginal": "cappedMCPCOriginal",
+ "UncappedMCPCOriginal": "uncappedMCPCOriginal",
+ "CappedMCPCCorrected": "cappedMCPCCorrected",
+ "UncappedMCPCCorrected": "uncappedMCPCCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "RepeatedHourFlag": "repeatedHourFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "priceCorrectionTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "member": "*pricecorrection_RTM_MCPC_SCED_*.csv",
+ "document": "*pricecorrection_RTM_MCPC_SCED_*",
+ "variants": [
+ {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "ASType": "ASType",
+ "MCPCOriginal": "MCPCOriginal",
+ "MCPCCorrected": "MCPCCorrected",
+ "PriceCorrectionTime": "priceCorrectionTime",
+ "RepeatedHourFlag": "repeatedHourFlag"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "ASType": "str",
+ "cappedMCPCOriginal": "Decimal",
+ "uncappedMCPCOriginal": "Decimal",
+ "cappedMCPCCorrected": "Decimal",
+ "uncappedMCPCCorrected": "Decimal",
+ "priceCorrectionTime": "datetime",
+ "repeatedHourFlag": "bool",
+ "MCPCOriginal": "Decimal",
+ "MCPCCorrected": "Decimal"
+ }
+ },
+ "np4-412-cd/epp_cumulative_hours": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "AvgRTSystemLambda": "RTSystemLambda",
+ "AvgRTRDPA": "RTRDPA",
+ "SumRTSysLambdaRTRDPA": "RTSystemLambdaRTDPA",
+ "HCAPforDAM": "HCAPDAM",
+ "CumHrsHCAPDAM24Hrs": "hoursHCAPDAM",
+ "RepeatedHourFlag": "repeatHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np6-326-cd/rt_price_sog": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "ResourceType": "resourceType",
+ "ResourceName": "resourceName",
+ "MeterName": "meterName",
+ "MeterPrice": "meterPrice",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np6-327-cd/lmp_sog_price_adders": {
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "ResourceType": "resourceType",
+ "ResourceName": "resourceName",
+ "StationName": "stationName",
+ "VoltageLevel": "voltageLevel",
+ "MeterName": "meterName",
+ "MeterLMP": "meterLMP",
+ "RTRDPA": "RTRDPA",
+ "FinalLMP": "finalLMP"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "ResourceType": "resourceType",
+ "ResourceName": "resourceName",
+ "StationName": "stationName",
+ "VoltageLevel": "voltageLevel",
+ "MeterName": "meterName",
+ "MeterLMP": "meterLMP",
+ "RTORPA": "RTORPA",
+ "RTORDPA": "RTORDPA",
+ "FinalLMP": "finalLMP"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "resourceType": "str",
+ "resourceName": "str",
+ "stationName": "str",
+ "voltageLevel": "Decimal",
+ "meterName": "str",
+ "meterLMP": "Decimal",
+ "RTRDPA": "Decimal",
+ "finalLMP": "Decimal",
+ "RTORPA": "Decimal",
+ "RTORDPA": "Decimal"
+ }
+ },
+ "np4-722-cd/weather_assumptions": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "Coast": "coast",
+ "East": "east",
+ "FarWest": "farWest",
+ "North": "north",
+ "NorthCentral": "northCentral",
+ "SouthCentral": "southCentral",
+ "Southern": "southern",
+ "West": "west",
+ "DSTFlag": "repeatedHourFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np4-19-cd/dam_agg_as_offer_curve": {
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "HourEnding": "hourEnding",
+ "AncillaryType": "ancillaryType",
+ "Price": "price",
+ "Quantity": "quantity",
+ "DSTFlag": "DSTFlag"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-257-ex/3d_high_price_bids_sel_disp_sced": {
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatedHourFlag",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Load Resource": "loadResource",
+ "Highest Price Dispatched by SCED": "highestPriceDispatched",
+ "Proxy Extension": "proxyExtension"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Batch ID": "batchId",
+ "Repeated Hour Flag": "repeatedHourFlag",
+ "QSE": "qseName",
+ "Load Resource": "loadResource",
+ "Highest Price Dispatched by SCED": "highestPriceDispatched",
+ "Proxy Extension": "proxyExtension"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatedHourFlag": "bool",
+ "qseName": "str",
+ "dmeName": "str",
+ "loadResource": "str",
+ "highestPriceDispatched": "Decimal",
+ "proxyExtension": "str",
+ "batchId": "str"
+ }
+ },
+ "np3-914-ex/3d_sced_high_as_offers": {
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name with Highest - Priced AS Offer Selected in SCED": "resourceName",
+ "AS Type": "ASType",
+ "Offered Quantity": "quantity",
+ "Offered Price": "price"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-915-ex/3d_dam_high_as_offers": {
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name with Highest-Priced AS Offer Selected in DAM": "resourceName",
+ "AS Type": "ASType",
+ "Block Indicator": "blockIndicator",
+ "Offered Quantity": "quantity",
+ "Offered Price": "price"
+ },
+ "dates": {
+ "deliveryDate": "%d-%b-%y"
+ },
+ "datetimes": {},
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Resource Name with Highest-Priced Offer Selected in DAM": "resourceName",
+ "AS Type": "ASType",
+ "Block Indicator": "blockIndicator",
+ "Offered Quantity": "quantity",
+ "Offered Price": "price"
+ }
+ ],
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "ASType": "str",
+ "blockIndicator": "str",
+ "quantity": "Decimal",
+ "price": "Decimal"
+ }
+ },
+ "np3-916-ex/3d_highest_price_offer_sced": {
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatedHourFlag",
+ "LMP": "LMP",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Generation Resource": "resourceName",
+ "Proxy Extension": "proxyExtension",
+ "Power Balance Penalty Flag": "penaltyFlag"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatedHourFlag",
+ "Batch ID": "batchId",
+ "LMP": "LMP",
+ "Generation Resource": "resourceName",
+ "Proxy Extension": "proxyExtension",
+ "Power Balance Penalty Flag": "penaltyFlag"
+ }
+ ],
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatedHourFlag": "bool",
+ "LMP": "Decimal",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "proxyExtension": "str",
+ "penaltyFlag": "str",
+ "batchId": "str"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_ecrss": {
+ "member": "2day_Agg_SCED_AS_Offers_ECRSS-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "ECRSS Offer Price": "ECRSSOfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_nspin": {
+ "member": "2day_Agg_SCED_AS_Offers_NSPIN-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "NSPIN Offer Price": "NSPINOfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_ecrsm": {
+ "member": "2day_Agg_SCED_AS_Offers_ECRSM-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "ECRSM Offer Price": "ECRSMOfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_nspnm": {
+ "member": "2day_Agg_SCED_AS_Offers_NSPNM-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "NSPNM Offer Price": "NSPNMOfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_rrsffr": {
+ "member": "2day_Agg_SCED_AS_Offers_RRSFFR-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "RRSFFR Offer Price": "RRSFFROfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_rrspfr": {
+ "member": "2day_Agg_SCED_AS_Offers_RRSPFR-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "RRSPFR Offer Price": "RRSPFROfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_rrsufr": {
+ "member": "2day_Agg_SCED_AS_Offers_RRSUFR-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "RRSUFR Offer Price": "RRSUFROfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_regdn": {
+ "member": "2day_Agg_SCED_AS_Offers_REGDN-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "REGDN Offer Price": "REGDNOfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-906-ex/2day_agg_sced_as_offers_regup": {
+ "member": "2day_Agg_SCED_AS_Offers_REGUP-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "MW Offered": "MWOffered",
+ "REGUP Offer Price": "REGUPOfferPrice"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-907-ex/2d_agg_min_esc": {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_min_esc_houston": {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_min_esc_north": {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_min_esc_south": {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_min_esc_west": {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_edc": {
+ "member": "2d_Agg_Energy_Demand_Curves-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_edc_houston": {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_edc_north": {
+ "member": "2d_Agg_Energy_Demand_Curves_North-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_edc_south": {
+ "member": "2d_Agg_Energy_Demand_Curves_South-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_edc_west": {
+ "member": "2d_Agg_Energy_Demand_Curves_West-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_esc": {
+ "member": "2d_Agg_Energy_Supply_Curves-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_esc_houston": {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_esc_north": {
+ "member": "2d_Agg_Energy_Supply_Curves_North-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_esc_south": {
+ "member": "2d_Agg_Energy_Supply_Curves_South-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-907-ex/2d_agg_esc_west": {
+ "member": "2d_Agg_Energy_Supply_Curves_West-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-909-er/2d_total_cleared_energy_bids_offers": {
+ "member": "*_Tot_*Offers-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum DAM EN Only Bids cleared": "sumDamENOnlyBidsCleared",
+ "Sum 3PO cleared": "sum3POCleared",
+ "Sum DAM EN Only Offers cleared": "sumDamENOnlyOffersCleared",
+ "Sum ESR Bids cleared": "sumESRBidsCleared",
+ "Sum ESR Offers cleared": "sumESROffersCleared"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "sumDamENOnlyBidsCleared": "Decimal",
+ "sum3POCleared": "Decimal",
+ "sumDamENOnlyOffersCleared": "Decimal",
+ "sumESRBidsCleared": "Decimal",
+ "sumESROffersCleared": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum Cleared DAM Bids": "sumDamENOnlyBidsCleared",
+ "Sum Cleared 3PO": "sum3POCleared",
+ "Sum Cleared Energy Only Offers": "sumDamENOnlyOffersCleared"
+ }
+ ]
+ },
+ "np3-909-er/2d_total_cleared_energy_bids_offers_houston": {
+ "member": "*_Tot_*Offers_Houston-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum DAM EN Only Bids cleared": "sumDamENOnlyBidsCleared",
+ "Sum 3PO cleared": "sum3POCleared",
+ "Sum DAM EN Only Offers cleared": "sumDamENOnlyOffersCleared",
+ "Sum ESR Bids cleared": "sumESRBidsCleared",
+ "Sum ESR Offers cleared": "sumESROffersCleared"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "sumDamENOnlyBidsCleared": "Decimal",
+ "sum3POCleared": "Decimal",
+ "sumDamENOnlyOffersCleared": "Decimal",
+ "sumESRBidsCleared": "Decimal",
+ "sumESROffersCleared": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum Cleared DAM Bids": "sumDamENOnlyBidsCleared",
+ "Sum Cleared 3PO": "sum3POCleared",
+ "Sum Cleared Energy Only Offers": "sumDamENOnlyOffersCleared"
+ }
+ ]
+ },
+ "np3-909-er/2d_total_cleared_energy_bids_offers_north": {
+ "member": "*_Tot_*Offers_North-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum DAM EN Only Bids cleared": "sumDamENOnlyBidsCleared",
+ "Sum 3PO cleared": "sum3POCleared",
+ "Sum DAM EN Only Offers cleared": "sumDamENOnlyOffersCleared",
+ "Sum ESR Bids cleared": "sumESRBidsCleared",
+ "Sum ESR Offers cleared": "sumESROffersCleared"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "sumDamENOnlyBidsCleared": "Decimal",
+ "sum3POCleared": "Decimal",
+ "sumDamENOnlyOffersCleared": "Decimal",
+ "sumESRBidsCleared": "Decimal",
+ "sumESROffersCleared": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum Cleared DAM Bids": "sumDamENOnlyBidsCleared",
+ "Sum Cleared 3PO": "sum3POCleared",
+ "Sum Cleared Energy Only Offers": "sumDamENOnlyOffersCleared"
+ }
+ ]
+ },
+ "np3-909-er/2d_total_cleared_energy_bids_offers_south": {
+ "member": "*_Tot_*Offers_South-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum DAM EN Only Bids cleared": "sumDamENOnlyBidsCleared",
+ "Sum 3PO cleared": "sum3POCleared",
+ "Sum DAM EN Only Offers cleared": "sumDamENOnlyOffersCleared",
+ "Sum ESR Bids cleared": "sumESRBidsCleared",
+ "Sum ESR Offers cleared": "sumESROffersCleared"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "sumDamENOnlyBidsCleared": "Decimal",
+ "sum3POCleared": "Decimal",
+ "sumDamENOnlyOffersCleared": "Decimal",
+ "sumESRBidsCleared": "Decimal",
+ "sumESROffersCleared": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum Cleared DAM Bids": "sumDamENOnlyBidsCleared",
+ "Sum Cleared 3PO": "sum3POCleared",
+ "Sum Cleared Energy Only Offers": "sumDamENOnlyOffersCleared"
+ }
+ ]
+ },
+ "np3-909-er/2d_total_cleared_energy_bids_offers_west": {
+ "member": "*_Tot_*Offers_West-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum DAM EN Only Bids cleared": "sumDamENOnlyBidsCleared",
+ "Sum 3PO cleared": "sum3POCleared",
+ "Sum DAM EN Only Offers cleared": "sumDamENOnlyOffersCleared",
+ "Sum ESR Bids cleared": "sumESRBidsCleared",
+ "Sum ESR Offers cleared": "sumESROffersCleared"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "sumDamENOnlyBidsCleared": "Decimal",
+ "sum3POCleared": "Decimal",
+ "sumDamENOnlyOffersCleared": "Decimal",
+ "sumESRBidsCleared": "Decimal",
+ "sumESROffersCleared": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Sum Cleared DAM Bids": "sumDamENOnlyBidsCleared",
+ "Sum Cleared 3PO": "sum3POCleared",
+ "Sum Cleared Energy Only Offers": "sumDamENOnlyOffersCleared"
+ }
+ ]
+ },
+ "np3-909-er/2d_ptp_obl_bids": {
+ "member": "*_PTP_Obligation_Bids[ -]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source Location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink Location for PtP Bid": "settlementPointSink",
+ "PtP Bid Price": "PTPBidPrice",
+ "PtP Bid MW": "PTPBidAwardMW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "PTPBidPrice": "Decimal",
+ "PTPBidAwardMW": "Decimal",
+ "bidId": "str"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink location for PtP Bid": "settlementPointSink",
+ "PtP Bid MW": "PTPBidAwardMW",
+ "PtP Bid Price": "PTPBidPrice",
+ "Bid ID": "bidId"
+ }
+ ]
+ },
+ "np3-909-er/2d_ptp_obl_bids_houston": {
+ "member": "*_PTP_Obligation_Bids_Houston[ -]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source Location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink Location for PtP Bid": "settlementPointSink",
+ "PtP Bid Price": "PTPBidPrice",
+ "PtP Bid MW": "PTPBidAwardMW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "PTPBidPrice": "Decimal",
+ "PTPBidAwardMW": "Decimal",
+ "bidId": "str"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink location for PtP Bid": "settlementPointSink",
+ "PtP Bid MW": "PTPBidAwardMW",
+ "PtP Bid Price": "PTPBidPrice",
+ "Bid ID": "bidId"
+ }
+ ]
+ },
+ "np3-909-er/2d_ptp_obl_bids_north": {
+ "member": "*_PTP_Obligation_Bids_North[ -]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source Location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink Location for PtP Bid": "settlementPointSink",
+ "PtP Bid Price": "PTPBidPrice",
+ "PtP Bid MW": "PTPBidAwardMW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "PTPBidPrice": "Decimal",
+ "PTPBidAwardMW": "Decimal",
+ "bidId": "str"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink location for PtP Bid": "settlementPointSink",
+ "PtP Bid MW": "PTPBidAwardMW",
+ "PtP Bid Price": "PTPBidPrice",
+ "Bid ID": "bidId"
+ }
+ ]
+ },
+ "np3-909-er/2d_ptp_obl_bids_south": {
+ "member": "*_PTP_Obligation_Bids_South[ -]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source Location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink Location for PtP Bid": "settlementPointSink",
+ "PtP Bid Price": "PTPBidPrice",
+ "PtP Bid MW": "PTPBidAwardMW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "PTPBidPrice": "Decimal",
+ "PTPBidAwardMW": "Decimal",
+ "bidId": "str"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink location for PtP Bid": "settlementPointSink",
+ "PtP Bid MW": "PTPBidAwardMW",
+ "PtP Bid Price": "PTPBidPrice",
+ "Bid ID": "bidId"
+ }
+ ]
+ },
+ "np3-909-er/2d_ptp_obl_bids_west": {
+ "member": "*_PTP_Obligation_Bids_West[ -]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source Location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink Location for PtP Bid": "settlementPointSink",
+ "PtP Bid Price": "PTPBidPrice",
+ "PtP Bid MW": "PTPBidAwardMW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "settlementPointSource": "str",
+ "settlementPointSink": "str",
+ "PTPBidPrice": "Decimal",
+ "PTPBidAwardMW": "Decimal",
+ "bidId": "str"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Settlement Point Source location for PtP Bid": "settlementPointSource",
+ "Settlement Point Sink location for PtP Bid": "settlementPointSink",
+ "PtP Bid MW": "PTPBidAwardMW",
+ "PtP Bid Price": "PTPBidPrice",
+ "Bid ID": "bidId"
+ }
+ ]
+ },
+ "np3-910-er/2d_agg_out_sched": {
+ "member": "*_Agg_Output_Sched[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM LSL OUTPUT SCHEDULE": "sumLSLOutputSched",
+ "SUM HSL OUTPUT SCHEDULE": "sumHSLOutputSched",
+ "SUM OUTPUTSCHEDULE": "sumOutputSched"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumLSLOutputSched": "Decimal",
+ "sumHSLOutputSched": "Decimal",
+ "sumOutputSched": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_out_sched_houston": {
+ "member": "*_Agg_Output_Sched_Houston[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM LSL OUTPUT SCHEDULE": "sumLSLOutputSched",
+ "SUM HSL OUTPUT SCHEDULE": "sumHSLOutputSched",
+ "SUM OUTPUTSCHEDULE": "sumOutputSched"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumLSLOutputSched": "Decimal",
+ "sumHSLOutputSched": "Decimal",
+ "sumOutputSched": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_out_sched_north": {
+ "member": "*_Agg_Output_Sched_North[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM LSL OUTPUT SCHEDULE": "sumLSLOutputSched",
+ "SUM HSL OUTPUT SCHEDULE": "sumHSLOutputSched",
+ "SUM OUTPUTSCHEDULE": "sumOutputSched"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumLSLOutputSched": "Decimal",
+ "sumHSLOutputSched": "Decimal",
+ "sumOutputSched": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_out_sched_south": {
+ "member": "*_Agg_Output_Sched_South[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM LSL OUTPUT SCHEDULE": "sumLSLOutputSched",
+ "SUM HSL OUTPUT SCHEDULE": "sumHSLOutputSched",
+ "SUM OUTPUTSCHEDULE": "sumOutputSched"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumLSLOutputSched": "Decimal",
+ "sumHSLOutputSched": "Decimal",
+ "sumOutputSched": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_out_sched_west": {
+ "member": "*_Agg_Output_Sched_West[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM LSL OUTPUT SCHEDULE": "sumLSLOutputSched",
+ "SUM HSL OUTPUT SCHEDULE": "sumHSLOutputSched",
+ "SUM OUTPUTSCHEDULE": "sumOutputSched"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumLSLOutputSched": "Decimal",
+ "sumHSLOutputSched": "Decimal",
+ "sumOutputSched": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_gen_summary": {
+ "member": "*_Agg_Gen_Summary[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON IRR": "sumBasePointNonIRR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM BASE POINT PVGR": "sumBasePointPVGR",
+ "SUM BASE POINT Remaining Res": "sumBasePointREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW",
+ "SUM BASE POINT ESR": "sumBasePointESR",
+ "SUM BASE POINT ESR CHARGING": "sumBasePointESRCharge",
+ "SUM BASE POINT ESR DISCHARGING": "sumBasePointESRDischarge"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumBasePointNonIRR": "Decimal",
+ "sumBasePointWGR": "Decimal",
+ "sumBasePointPVGR": "Decimal",
+ "sumBasePointREMRES": "Decimal",
+ "sumGenTelemMW": "Decimal",
+ "sumBasePointESR": "Decimal",
+ "sumBasePointESRCharge": "Decimal",
+ "sumBasePointESRDischarge": "Decimal",
+ "sumHASLNonIRR": "Decimal",
+ "sumLASLNonIRR": "Decimal",
+ "sumHASLWGR": "Decimal",
+ "sumLASLWGR": "Decimal",
+ "sumHASLPVGR": "Decimal",
+ "sumLASLPVGR": "Decimal",
+ "sumHASLREMRES": "Decimal",
+ "sumLASLREMRES": "Decimal",
+ "sumBasePointNonWGR": "Decimal",
+ "sumHASLNonWGR": "Decimal",
+ "sumLASLNonWGR": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON-WGR": "sumBasePointNonWGR",
+ "SUM HASL NON-WGR": "sumHASLNonWGR",
+ "SUM LASL NON-WGR": "sumLASLNonWGR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM HASL WGR": "sumHASLWGR",
+ "SUM LASL WGR": "sumLASLWGR",
+ "SUM BASE POINT REMAINING RESOURCES": "sumBasePointREMRES",
+ "SUM HASL REMAINING RESOURCES": "sumHASLREMRES",
+ "SUM LASL REMAINING RESOURCES": "sumLASLREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW"
+ }
+ ]
+ },
+ "np3-910-er/2d_agg_gen_summary_houston": {
+ "member": "*_Agg_Gen_Summary_Houston[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON IRR": "sumBasePointNonIRR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM BASE POINT PVGR": "sumBasePointPVGR",
+ "SUM BASE POINT Remaining Res": "sumBasePointREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW",
+ "SUM BASE POINT ESR": "sumBasePointESR",
+ "SUM BASE POINT ESR CHARGING": "sumBasePointESRCharge",
+ "SUM BASE POINT ESR DISCHARGING": "sumBasePointESRDischarge"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumBasePointNonIRR": "Decimal",
+ "sumBasePointWGR": "Decimal",
+ "sumBasePointPVGR": "Decimal",
+ "sumBasePointREMRES": "Decimal",
+ "sumGenTelemMW": "Decimal",
+ "sumBasePointESR": "Decimal",
+ "sumBasePointESRCharge": "Decimal",
+ "sumBasePointESRDischarge": "Decimal",
+ "sumBasePointNonWGR": "Decimal",
+ "sumHaslNonWGR": "Decimal",
+ "sumLaslNonWGR": "Decimal",
+ "sumHaslWGR": "Decimal",
+ "sumLaslWGR": "Decimal",
+ "sumHaslRemRes": "Decimal",
+ "sumLaslRemRes": "Decimal",
+ "sumHASLNonWGR": "Decimal",
+ "sumLASLNonWGR": "Decimal",
+ "sumHASLREMRES": "Decimal",
+ "sumLASLREMRES": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON-WGR": "sumBasePointNonWGR",
+ "SUM HASL NON-WGR": "sumHASLNonWGR",
+ "SUM LASL NON-WGR": "sumLASLNonWGR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM HASL WGR": "sumHaslWGR",
+ "SUM LASL WGR": "sumLaslWGR",
+ "SUM BASE POINT REMAINING RESOURCES": "sumBasePointREMRES",
+ "SUM HASL REMAINING RESOURCES": "sumHASLREMRES",
+ "SUM LASL REMAINING RESOURCES": "sumLASLREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW"
+ }
+ ]
+ },
+ "np3-910-er/2d_agg_gen_summary_north": {
+ "member": "*_Agg_Gen_Summary_North[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON IRR": "sumBasePointNonIRR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM BASE POINT PVGR": "sumBasePointPVGR",
+ "SUM BASE POINT Remaining Res": "sumBasePointREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW",
+ "SUM BASE POINT ESR": "sumBasePointESR",
+ "SUM BASE POINT ESR CHARGING": "sumBasePointESRCharge",
+ "SUM BASE POINT ESR DISCHARGING": "sumBasePointESRDischarge"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumBasePointNonIRR": "Decimal",
+ "sumBasePointWGR": "Decimal",
+ "sumBasePointPVGR": "Decimal",
+ "sumBasePointREMRES": "Decimal",
+ "sumGenTelemMW": "Decimal",
+ "sumBasePointESR": "Decimal",
+ "sumBasePointESRCharge": "Decimal",
+ "sumBasePointESRDischarge": "Decimal",
+ "sumBasePointNonWGR": "Decimal",
+ "sumHaslNonWGR": "Decimal",
+ "sumLaslNonWGR": "Decimal",
+ "sumHaslWGR": "Decimal",
+ "sumLaslWGR": "Decimal",
+ "sumHaslRemRes": "Decimal",
+ "sumLaslRemRes": "Decimal",
+ "sumHASLNonWGR": "Decimal",
+ "sumLASLNonWGR": "Decimal",
+ "sumHASLREMRES": "Decimal",
+ "sumLASLREMRES": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON-WGR": "sumBasePointNonWGR",
+ "SUM HASL NON-WGR": "sumHASLNonWGR",
+ "SUM LASL NON-WGR": "sumLASLNonWGR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM HASL WGR": "sumHaslWGR",
+ "SUM LASL WGR": "sumLaslWGR",
+ "SUM BASE POINT REMAINING RESOURCES": "sumBasePointREMRES",
+ "SUM HASL REMAINING RESOURCES": "sumHASLREMRES",
+ "SUM LASL REMAINING RESOURCES": "sumLASLREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW"
+ }
+ ]
+ },
+ "np3-910-er/2d_agg_gen_summary_south": {
+ "member": "*_Agg_Gen_Summary_South[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON IRR": "sumBasePointNonIRR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM BASE POINT PVGR": "sumBasePointPVGR",
+ "SUM BASE POINT Remaining Res": "sumBasePointREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW",
+ "SUM BASE POINT ESR": "sumBasePointESR",
+ "SUM BASE POINT ESR CHARGING": "sumBasePointESRCharge",
+ "SUM BASE POINT ESR DISCHARGING": "sumBasePointESRDischarge"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumBasePointNonIRR": "Decimal",
+ "sumBasePointWGR": "Decimal",
+ "sumBasePointPVGR": "Decimal",
+ "sumBasePointREMRES": "Decimal",
+ "sumGenTelemMW": "Decimal",
+ "sumBasePointESR": "Decimal",
+ "sumBasePointESRCharge": "Decimal",
+ "sumBasePointESRDischarge": "Decimal",
+ "sumBasePointNonWGR": "Decimal",
+ "sumHaslNonWGR": "Decimal",
+ "sumLaslNonWGR": "Decimal",
+ "sumHaslWGR": "Decimal",
+ "sumLaslWGR": "Decimal",
+ "sumHaslRemRes": "Decimal",
+ "sumLaslRemRes": "Decimal",
+ "sumHASLNonWGR": "Decimal",
+ "sumLASLNonWGR": "Decimal",
+ "sumHASLREMRES": "Decimal",
+ "sumLASLREMRES": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON-WGR": "sumBasePointNonWGR",
+ "SUM HASL NON-WGR": "sumHASLNonWGR",
+ "SUM LASL NON-WGR": "sumLASLNonWGR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM HASL WGR": "sumHaslWGR",
+ "SUM LASL WGR": "sumLaslWGR",
+ "SUM BASE POINT REMAINING RESOURCES": "sumBasePointREMRES",
+ "SUM HASL REMAINING RESOURCES": "sumHASLREMRES",
+ "SUM LASL REMAINING RESOURCES": "sumLASLREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW"
+ }
+ ]
+ },
+ "np3-910-er/2d_agg_gen_summary_west": {
+ "member": "*_Agg_Gen_Summary_West[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON IRR": "sumBasePointNonIRR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM BASE POINT PVGR": "sumBasePointPVGR",
+ "SUM BASE POINT Remaining Res": "sumBasePointREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW",
+ "SUM BASE POINT ESR": "sumBasePointESR",
+ "SUM BASE POINT ESR CHARGING": "sumBasePointESRCharge",
+ "SUM BASE POINT ESR DISCHARGING": "sumBasePointESRDischarge"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumBasePointNonIRR": "Decimal",
+ "sumBasePointWGR": "Decimal",
+ "sumBasePointPVGR": "Decimal",
+ "sumBasePointREMRES": "Decimal",
+ "sumGenTelemMW": "Decimal",
+ "sumBasePointESR": "Decimal",
+ "sumBasePointESRCharge": "Decimal",
+ "sumBasePointESRDischarge": "Decimal",
+ "sumBasePointNonWGR": "Decimal",
+ "sumHaslNonWGR": "Decimal",
+ "sumLaslNonWGR": "Decimal",
+ "sumHaslWGR": "Decimal",
+ "sumLaslWGR": "Decimal",
+ "sumHaslRemRes": "Decimal",
+ "sumLaslRemRes": "Decimal",
+ "sumHASLNonWGR": "Decimal",
+ "sumLASLNonWGR": "Decimal",
+ "sumHASLREMRES": "Decimal",
+ "sumLASLREMRES": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM BASE POINT NON-WGR": "sumBasePointNonWGR",
+ "SUM HASL NON-WGR": "sumHASLNonWGR",
+ "SUM LASL NON-WGR": "sumLASLNonWGR",
+ "SUM BASE POINT WGR": "sumBasePointWGR",
+ "SUM HASL WGR": "sumHaslWGR",
+ "SUM LASL WGR": "sumLaslWGR",
+ "SUM BASE POINT REMAINING RESOURCES": "sumBasePointREMRES",
+ "SUM HASL REMAINING RESOURCES": "sumHASLREMRES",
+ "SUM LASL REMAINING RESOURCES": "sumLASLREMRES",
+ "SUM GEN TELEM MW": "sumGenTelemMW"
+ }
+ ]
+ },
+ "np3-910-er/2d_agg_load_summary": {
+ "member": "*_Agg_Load_Summary[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM TELEM GEN MW": "sumTelemGenMW",
+ "SUM TELEM DCTIE MW": "sumTelemDCtieMW",
+ "AGG LOAD SUMMARY": "aggLoadSummary"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumTelemGenMW": "Decimal",
+ "sumTelemDCtieMW": "Decimal",
+ "aggLoadSummary": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_load_summary_houston": {
+ "member": "*_Agg_Load_Summary_Houston[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM TELEM GEN MW": "sumTelemGenMW",
+ "SUM TELEM DCTIE MW": "sumTelemDCtieMW",
+ "AGG LOAD SUMMARY": "aggLoadSummary"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumTelemGenMW": "Decimal",
+ "sumTelemDCtieMW": "Decimal",
+ "aggLoadSummary": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_load_summary_north": {
+ "member": "*_Agg_Load_Summary_North[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM TELEM GEN MW": "sumTelemGenMW",
+ "SUM TELEM DCTIE MW": "sumTelemDCtieMW",
+ "AGG LOAD SUMMARY": "aggLoadSummary"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumTelemGenMW": "Decimal",
+ "sumTelemDCtieMW": "Decimal",
+ "aggLoadSummary": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_load_summary_south": {
+ "member": "*_Agg_Load_Summary_South[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM TELEM GEN MW": "sumTelemGenMW",
+ "SUM TELEM DCTIE MW": "sumTelemDCtieMW",
+ "AGG LOAD SUMMARY": "aggLoadSummary"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumTelemGenMW": "Decimal",
+ "sumTelemDCtieMW": "Decimal",
+ "aggLoadSummary": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_load_summary_west": {
+ "member": "*_Agg_Load_Summary_West[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM TELEM GEN MW": "sumTelemGenMW",
+ "SUM TELEM DCTIE MW": "sumTelemDCtieMW",
+ "AGG LOAD SUMMARY": "aggLoadSummary"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumTelemGenMW": "Decimal",
+ "sumTelemDCtieMW": "Decimal",
+ "aggLoadSummary": "Decimal"
+ }
+ },
+ "np3-910-er/2d_agg_dsr_loads": {
+ "member": "*_Agg_DSR_Loads[ -]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "SUM TELEM DSR LOAD": "sumTelemDSRLoad",
+ "SUM TELEM DSR GEN": "sumTelemDSRGen"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "sumTelemDSRLoad": "Decimal",
+ "sumTelemDSRGen": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_esc_pvgr_houston": {
+ "member": "*_Agg_Supply_Curves_PVGR_Houston-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_pvgr_north": {
+ "member": "*_Agg_Supply_Curves_PVGR_North-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_pvgr_south": {
+ "member": "*_Agg_Supply_Curves_PVGR_South-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_pvgr_west": {
+ "member": "*_Agg_Supply_Curves_PVGR_West-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_pvgr": {
+ "member": "*_Agg_Supply_Curves_PVGR-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_edc_clr_houston": {
+ "member": "*_Agg_Energy_Demand_Curves_CLR_Houston-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "PRICE": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_edc_clr_north": {
+ "member": "*_Agg_Energy_Demand_Curves_CLR_North-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "PRICE": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_esr": {
+ "member": "*_Agg_Supply_Curves_ESR-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_esr_houston": {
+ "member": "*_Agg_Supply_Curves_ESR_Houston-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_esr_north": {
+ "member": "*_Agg_Supply_Curves_ESR_North-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_esr_south": {
+ "member": "*_Agg_Supply_Curves_ESR_South-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_esr_west": {
+ "member": "*_Agg_Supply_Curves_ESR_West-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_edc_clr_south": {
+ "member": "*_Agg_Energy_Demand_Curves_CLR_South-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "PRICE": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_edc_clr_west": {
+ "member": "*_Agg_Energy_Demand_Curves_CLR_West-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "PRICE": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_wind": {
+ "member": "*_Agg_Supply_Curves_Wind-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_nonirr": {
+ "member": "*_Agg_Supply_Curves_Non_IRR-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_nonirr_houston": {
+ "member": "*_Agg_Supply_Curves_Non_IRR_Houston-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_nonirr_north": {
+ "member": "*_Agg_Supply_Curves_Non_IRR_North-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_nonirr_south": {
+ "member": "*_Agg_Supply_Curves_Non_IRR_South-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_nonirr_west": {
+ "member": "*_Agg_Supply_Curves_Non_IRR_West-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_wind_houston": {
+ "member": "*_Agg_Supply_Curves_Wind_Houston-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_wind_north": {
+ "member": "*_Agg_Supply_Curves_Wind_North-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_wind_south": {
+ "member": "*_Agg_Supply_Curves_Wind_South-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_esc_wind_west": {
+ "member": "*_Agg_Supply_Curves_Wind_West-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_edc_clr": {
+ "member": "*_Energy_Demand_Curves_CLR-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "PRICE": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ }
+ },
+ "np3-908-er/2d_agg_dam_min_esc_west": {
+ "member": "*_Agg_Min_Energy_Supply_Curves_West-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW Offered": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_min_esc_south": {
+ "member": "*_Agg_Min_Energy_Supply_Curves_South-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW Offered": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_min_esc_north": {
+ "member": "*_Agg_Min_Energy_Supply_Curves_North-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW Offered": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_min_esc_houston": {
+ "member": "*_Agg_Min_Energy_Supply_Curves_Houston-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW Offered": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_min_esc": {
+ "member": "*_Agg_Min_Energy_Supply_Curves-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW Offered": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_esc_non_wind": {
+ "member": "*_Agg_Supply_Curves_Non_Wind-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "archive_only": true,
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_esc": {
+ "member": "*_Agg_Energy_Supply_Curves-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_esc_non_wind_west": {
+ "member": "*_Agg_Supply_Curves_Non_Wind_West-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "archive_only": true,
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_esc_non_wind_south": {
+ "member": "*_Agg_Supply_Curves_Non_Wind_South-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "archive_only": true,
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_esc_non_wind_north": {
+ "member": "*_Agg_Supply_Curves_Non_Wind_North-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "archive_only": true,
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_esc_non_wind_houston": {
+ "member": "*_Agg_Supply_Curves_Non_Wind_Houston-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "archive_only": true,
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_esc_west": {
+ "member": "*_Agg_Energy_Supply_Curves_West-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_esc_south": {
+ "member": "*_Agg_Energy_Supply_Curves_South-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_esc_north": {
+ "member": "*_Agg_Energy_Supply_Curves_North-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_esc_houston": {
+ "member": "*_Agg_Energy_Supply_Curves_Houston-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_edc_west": {
+ "member": "*_Agg_Energy_Demand_Curves_West-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_edc_south": {
+ "member": "*_Agg_Energy_Demand_Curves_South-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_edc_north": {
+ "member": "*_Agg_Energy_Demand_Curves_North-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_edc_houston": {
+ "member": "*_Agg_Energy_Demand_Curves_Houston-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-908-er/2d_agg_dam_edc": {
+ "member": "*_Agg_Energy_Demand_Curves-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Price": "price",
+ "MW": "MW"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "price": "Decimal",
+ "MW": "Decimal"
+ }
+ },
+ "np3-911-er/2d_agg_dam_as_offers_nspnm": {
+ "member": "*_Agg_DAM_AS_Offers_NSPNM-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "NSPNM Offer Price": "NSPNMOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_nspin": {
+ "member": "*_Agg_DAM_AS_Offers_NSPIN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "NSPIN Offer Price": "NSPINOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_nspnm": {
+ "member": "*_Cleared_DAM_AS_NSPNM-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - NSPNM": "totalClearedASNSPNM"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_regup": {
+ "member": "*_Agg_DAM_AS_Offers_REGUP-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "REGUP Offer Price": "REGUPOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_regdn": {
+ "member": "*_Agg_DAM_AS_Offers_REGDN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "REGDN Offer Price": "REGDNOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_regup": {
+ "member": "*_Self_Arranged_AS_REGUP-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - RegUp": "totalSelfArrangedASREGUP"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_regdn": {
+ "member": "*_Self_Arranged_AS_REGDN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - RegDown": "totalSelfArrangedASREGDN"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_nspin": {
+ "member": "*_Self_Arranged_AS_NSPIN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - NonSpin": "totalSelfArrangedASNSPIN"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_regup": {
+ "member": "*_Cleared_DAM_AS_REGUP-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - RegUp": "totalClearedASREGUP"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_regdn": {
+ "member": "*_Cleared_DAM_AS_REGDN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - RegDown": "totalClearedASREGDN"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_nspin": {
+ "member": "*_Cleared_DAM_AS_NSPIN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - NonSpin": "totalClearedASNSPIN"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_rrspfr": {
+ "member": "*_Agg_DAM_AS_Offers_RRSPFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSPFR Offer Price": "RRSPFROfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_rrsufr": {
+ "member": "*_Agg_DAM_AS_Offers_RRSUFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSUFR Offer Price": "RRSUFROfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_rrsffr": {
+ "member": "*_Agg_DAM_AS_Offers_RRSFFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSFFR Offer Price": "RRSFFROfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_rrspfr": {
+ "member": "*_Cleared_DAM_AS_RRSPFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - RRSPFR": "totalClearedASRRSPFR"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_rrsufr": {
+ "member": "*_Cleared_DAM_AS_RRSUFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - RRSUFR": "totalClearedASRRSUFR"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_rrsffr": {
+ "member": "*_Cleared_DAM_AS_RRSFFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - RRSFFR": "totalClearedASRRSFFR"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_rrspfr": {
+ "member": "*_Self_Arranged_AS_RRSPFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - RRSPFR": "totalSelfArrangedASRRSPFR"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_rrsufr": {
+ "member": "*_Self_Arranged_AS_RRSUFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - RRSUFR": "totalSelfArrangedASRRSUFR"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_rrsffr": {
+ "member": "*_Self_Arranged_AS_RRSFFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - RRSFFR": "totalSelfArrangedASRRSFFR"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_nspnm": {
+ "member": "*_Self_Arranged_AS_NSPNM-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - NSPNM": "totalSelfArrangedASNSPNM"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_ecrss": {
+ "member": "*_Agg_DAM_AS_Offers_ECRSS-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "ECRSS Offer Price": "ECRSSOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_dam_as_offers_ecrsm": {
+ "member": "*_Agg_DAM_AS_Offers_ECRSM-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "ECRSM Offer Price": "ECRSMOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_ecrss": {
+ "member": "*_Cleared_DAM_AS_ECRSS-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - ECRSS": "totalClearedASECRSS"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_ecrsm": {
+ "member": "*_Cleared_DAM_AS_ECRSM-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - ECRSM": "totalClearedASECRSM"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_ecrss": {
+ "member": "*_Self_Arranged_AS_ECRSS-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - ECRSS": "totalSelfArrangedASECRSS"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_self_arranged_as_ecrsm": {
+ "member": "*_Self_Arranged_AS_ECRSM-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - ECRSM": "totalSelfArrangedASECRSM"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_cleared_dam_as_rrsload": {
+ "member": "*_Cleared_DAM_AS_RRSLOAD-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - RRS Load": "totalClearedASRRSLOAD"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "totalClearedASRRSLOAD": "Decimal"
+ }
+ },
+ "np3-911-er/2d_cleared_dam_as_rrsgen": {
+ "member": "*_Cleared_DAM_AS_RRSGEN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Cleared AS - RRS Gen": "totalClearedASRRSGEN"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "totalClearedASRRSGEN": "Decimal"
+ }
+ },
+ "np3-911-er/2d_self_arranged_as_rrsload": {
+ "member": "*_Self_Arranged_AS_RRSLOAD-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - RRS Load": "totalSelfArrangedASRRSLOAD"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "totalSelfArrangedASRRSLOAD": "Decimal"
+ }
+ },
+ "np3-911-er/2d_self_arranged_as_rrsgen": {
+ "member": "*_Self_Arranged_AS_RRSGEN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Total Self-Arranged AS - RRS Gen": "totalSelfArrangedASRRSGEN"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "totalSelfArrangedASRRSGEN": "Decimal"
+ }
+ },
+ "np3-911-er/2d_agg_as_offers_rrsnc": {
+ "member": "*_Agg_AS_Offers_RRSNC-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSNC Offer Price": "RRSNCOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "MWOffered": "Decimal",
+ "RRSNCOfferPrice": "Decimal"
+ }
+ },
+ "np3-911-er/2d_agg_as_offers_rrsld": {
+ "member": "*_Agg_AS_Offers_RRSLD-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSLD Offer Price": "RRSLDOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "MWOffered": "Decimal",
+ "RRSLDOfferPrice": "Decimal"
+ }
+ },
+ "np3-911-er/2d_agg_as_offers_rrsgn": {
+ "member": "*_Agg_AS_Offers_RRSGN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSGN Offer Price": "RRSGNOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "archive_only": true,
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "MWOffered": "Decimal",
+ "RRSGNOfferPrice": "Decimal"
+ }
+ },
+ "np3-911-er/2d_agg_as_offers_offns": {
+ "member": "*_Agg_AS_Offers_OFFNS-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "OFFNS Offer Price": "OFFNSOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_onns": {
+ "member": "*_Agg_AS_Offers_ONNS-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "ONNS Offer Price": "ONNSOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_regdn": {
+ "member": "*_Agg_AS_Offers_REGDN-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "REGDN Offer Price": "REGDNOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_regup": {
+ "member": "*_Agg_AS_Offers_REGUP-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "REGUP Offer Price": "REGUPOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_rrspfr": {
+ "member": "*_Agg_AS_Offers_RRSPFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSPFR Offer Price": "RRSPFROfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_rrsufr": {
+ "member": "*_Agg_AS_Offers_RRSUFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSUFR Offer Price": "RRSUFROfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_rrsffr": {
+ "member": "*_Agg_AS_Offers_RRSFFR-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "RRSFFR Offer Price": "RRSFFROfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_ecrsm": {
+ "member": "*_Agg_AS_Offers_ECRSM-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "ECRSM Offer Price": "ECRSMOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np3-911-er/2d_agg_as_offers_ecrss": {
+ "member": "*_Agg_AS_Offers_ECRSS-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "MW Offered": "MWOffered",
+ "ECRSS Offer Price": "ECRSSOfferPrice"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {}
+ },
+ "np1-301/60_cop_adj_period_snapshot": {
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "QSE Name": "qseName",
+ "Resource Name": "resourceName",
+ "Hour Ending": "hourEnding",
+ "Status": "status",
+ "High Sustained Limit": "highSustainedLimit",
+ "Low Sustained Limit": "lowSustainedLimit",
+ "High Emergency Limit": "highEmergencyLimit",
+ "Low Emergency Limit": "lowEmergencyLimit",
+ "Reg Up": "REGUP",
+ "Reg Down": "REGDN",
+ "RRSPFR": "RRSPFR",
+ "RRSFFR": "RRSFFR",
+ "RRSUFR": "RRSUFR",
+ "NSPIN": "NSPIN",
+ "ECRS": "ECRS",
+ "Minimum SOC": "minSOC",
+ "Maximum SOC": "maxSOC",
+ "Hour Beginning Planned SOC": "hourBeginningPlannedSOC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "QSE Name": "qseName",
+ "Resource Name": "resourceName",
+ "Hour Ending": "hourEnding",
+ "Status": "status",
+ "High Sustained Limit": "highSustainedLimit",
+ "Low Sustained Limit": "lowSustainedLimit",
+ "High Emergency Limit": "highEmergencyLimit",
+ "Low Emergency Limit": "lowEmergencyLimit",
+ "Reg Up": "REGUP",
+ "Reg Down": "REGDN",
+ "RRS": "RRS",
+ "NSPIN": "NSPIN"
+ }
+ ],
+ "fields": {
+ "deliveryDate": "date",
+ "qseName": "str",
+ "resourceName": "str",
+ "hourEnding": "str",
+ "status": "str",
+ "highSustainedLimit": "Decimal",
+ "lowSustainedLimit": "Decimal",
+ "highEmergencyLimit": "Decimal",
+ "lowEmergencyLimit": "Decimal",
+ "REGUP": "Decimal",
+ "REGDN": "Decimal",
+ "RRSPFR": "Decimal",
+ "RRSFFR": "Decimal",
+ "RRSUFR": "Decimal",
+ "NSPIN": "Decimal",
+ "ECRS": "Decimal",
+ "minSOC": "Decimal",
+ "maxSOC": "Decimal",
+ "hourBeginningPlannedSOC": "Decimal",
+ "RRS": "Decimal"
+ }
+ },
+ "np1-302/as_obligation": {
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "Reg Up Obligation Advisory": "REGUPOblAdvisory",
+ "Reg Down Obligation Advisory": "REGDNOblAdvisory",
+ "RRS Obligation Advisory": "RRSOblAdvisory",
+ "NSPIN Obligation Advisory": "NSPINOblAdvisory",
+ "ECRS Obligation Advisory": "ECRSOblAdvisory",
+ "Reg Up Obligation Final": "REGUPOblFinal",
+ "Reg Down Obligation Final": "REGDNOblFinal",
+ "RRS Obligation Final": "RRSOblFinal",
+ "NSPIN Obligation Final": "NSPINOblFinal",
+ "ECRS Obligation Final": "ECRSOblFinal"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE Name": "qseName",
+ "Reg Up Obligation": "REGUPObligation",
+ "Reg Down Obligation": "REGDNObligation",
+ "RRS Obligation": "RRSObligation",
+ "NSPIN Obligation": "NSPINObligation",
+ "Reg Up Responsibility": "REGUPResponsibility",
+ "Reg Down Responsibility": "REGDNResponsibility",
+ "RRS Responsibility": "RRSResponsibility",
+ "NSPIN Responsibility": "NSPINResponsibility"
+ }
+ ],
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "str",
+ "qseName": "str",
+ "REGUPOblAdvisory": "Decimal",
+ "REGDNOblAdvisory": "Decimal",
+ "RRSOblAdvisory": "Decimal",
+ "NSPINOblAdvisory": "Decimal",
+ "ECRSOblAdvisory": "Decimal",
+ "REGUPOblFinal": "Decimal",
+ "REGDNOblFinal": "Decimal",
+ "RRSOblFinal": "Decimal",
+ "NSPINOblFinal": "Decimal",
+ "ECRSOblFinal": "Decimal",
+ "REGUPObligation": "Decimal",
+ "REGUPResponsibility": "Decimal",
+ "REGDNObligation": "Decimal",
+ "REGDNResponsibility": "Decimal",
+ "RRSObligation": "Decimal",
+ "RRSResponsibility": "Decimal",
+ "NSPINObligation": "Decimal",
+ "NSPINResponsibility": "Decimal"
+ }
+ },
+ "np3-987-ex/7d_trig_lmp_50xfip": {
+ "member": "7day_Event_Trigger_LMP_Exceeds_50XFIP-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Resource Name": "resourceName",
+ "LMP": "LMP",
+ "50xFIP": "FIPx50",
+ "SCED2 Curve-MW1": "SCED2CurveMW1",
+ "SCED2 Curve-Price1": "SCED2CurvePrice1",
+ "SCED2 Curve-MW2": "SCED2CurveMW2",
+ "SCED2 Curve-Price2": "SCED2CurvePrice2",
+ "SCED2 Curve-MW3": "SCED2CurveMW3",
+ "SCED2 Curve-Price3": "SCED2CurvePrice3",
+ "SCED2 Curve-MW4": "SCED2CurveMW4",
+ "SCED2 Curve-Price4": "SCED2CurvePrice4",
+ "SCED2 Curve-MW5": "SCED2CurveMW5",
+ "SCED2 Curve-Price5": "SCED2CurvePrice5",
+ "SCED2 Curve-MW6": "SCED2CurveMW6",
+ "SCED2 Curve-Price6": "SCED2CurvePrice6",
+ "SCED2 Curve-MW7": "SCED2CurveMW7",
+ "SCED2 Curve-Price7": "SCED2CurvePrice7",
+ "SCED2 Curve-MW8": "SCED2CurveMW8",
+ "SCED2 Curve-Price8": "SCED2CurvePrice8",
+ "SCED2 Curve-MW9": "SCED2CurveMW9",
+ "SCED2 Curve-Price9": "SCED2CurvePrice9",
+ "SCED2 Curve-MW10": "SCED2CurveMW10",
+ "SCED2 Curve-Price10": "SCED2CurvePrice10",
+ "SCED2 Curve-MW11": "SCED2CurveMW11",
+ "SCED2 Curve-Price11": "SCED2CurvePrice11",
+ "SCED2 Curve-MW12": "SCED2CurveMW12",
+ "SCED2 Curve-Price12": "SCED2CurvePrice12",
+ "SCED2 Curve-MW13": "SCED2CurveMW13",
+ "SCED2 Curve-Price13": "SCED2CurvePrice13",
+ "SCED2 Curve-MW14": "SCED2CurveMW14",
+ "SCED2 Curve-Price14": "SCED2CurvePrice14",
+ "SCED2 Curve-MW15": "SCED2CurveMW15",
+ "SCED2 Curve-Price15": "SCED2CurvePrice15",
+ "SCED2 Curve-MW16": "SCED2CurveMW16",
+ "SCED2 Curve-Price16": "SCED2CurvePrice16",
+ "SCED2 Curve-MW17": "SCED2CurveMW17",
+ "SCED2 Curve-Price17": "SCED2CurvePrice17",
+ "SCED2 Curve-MW18": "SCED2CurveMW18",
+ "SCED2 Curve-Price18": "SCED2CurvePrice18",
+ "SCED2 Curve-MW19": "SCED2CurveMW19",
+ "SCED2 Curve-Price19": "SCED2CurvePrice19",
+ "SCED2 Curve-MW20": "SCED2CurveMW20",
+ "SCED2 Curve-Price20": "SCED2CurvePrice20",
+ "SCED2 Curve-MW21": "SCED2CurveMW21",
+ "SCED2 Curve-Price21": "SCED2CurvePrice21",
+ "SCED2 Curve-MW22": "SCED2CurveMW22",
+ "SCED2 Curve-Price22": "SCED2CurvePrice22",
+ "SCED2 Curve-MW23": "SCED2CurveMW23",
+ "SCED2 Curve-Price23": "SCED2CurvePrice23",
+ "SCED2 Curve-MW24": "SCED2CurveMW24",
+ "SCED2 Curve-Price24": "SCED2CurvePrice24",
+ "SCED2 Curve-MW25": "SCED2CurveMW25",
+ "SCED2 Curve-Price25": "SCED2CurvePrice25",
+ "SCED2 Curve-MW26": "SCED2CurveMW26",
+ "SCED2 Curve-Price26": "SCED2CurvePrice26",
+ "SCED2 Curve-MW27": "SCED2CurveMW27",
+ "SCED2 Curve-Price27": "SCED2CurvePrice27",
+ "SCED2 Curve-MW28": "SCED2CurveMW28",
+ "SCED2 Curve-Price28": "SCED2CurvePrice28",
+ "SCED2 Curve-MW29": "SCED2CurveMW29",
+ "SCED2 Curve-Price29": "SCED2CurvePrice29",
+ "SCED2 Curve-MW30": "SCED2CurveMW30",
+ "SCED2 Curve-Price30": "SCED2CurvePrice30",
+ "SCED2 Curve-MW31": "SCED2CurveMW31",
+ "SCED2 Curve-Price31": "SCED2CurvePrice31",
+ "SCED2 Curve-MW32": "SCED2CurveMW32",
+ "SCED2 Curve-Price32": "SCED2CurvePrice32",
+ "SCED2 Curve-MW33": "SCED2CurveMW33",
+ "SCED2 Curve-Price33": "SCED2CurvePrice33",
+ "SCED2 Curve-MW34": "SCED2CurveMW34",
+ "SCED2 Curve-Price34": "SCED2CurvePrice34",
+ "SCED2 Curve-MW35": "SCED2CurveMW35",
+ "SCED2 Curve-Price35": "SCED2CurvePrice35",
+ "Bid Type": "bidType",
+ "Submitted TPO-MW1": "submittedTPOMW1",
+ "Submitted TPO-Price1": "submittedTPOPrice1",
+ "Submitted TPO-MW2": "submittedTPOMW2",
+ "Submitted TPO-Price2": "submittedTPOPrice2",
+ "Submitted TPO-MW3": "submittedTPOMW3",
+ "Submitted TPO-Price3": "submittedTPOPrice3",
+ "Submitted TPO-MW4": "submittedTPOMW4",
+ "Submitted TPO-Price4": "submittedTPOPrice4",
+ "Submitted TPO-MW5": "submittedTPOMW5",
+ "Submitted TPO-Price5": "submittedTPOPrice5",
+ "Submitted TPO-MW6": "submittedTPOMW6",
+ "Submitted TPO-Price6": "submittedTPOPrice6",
+ "Submitted TPO-MW7": "submittedTPOMW7",
+ "Submitted TPO-Price7": "submittedTPOPrice7",
+ "Submitted TPO-MW8": "submittedTPOMW8",
+ "Submitted TPO-Price8": "submittedTPOPrice8",
+ "Submitted TPO-MW9": "submittedTPOMW9",
+ "Submitted TPO-Price9": "submittedTPOPrice9",
+ "Submitted TPO-MW10": "submittedTPOMW10",
+ "Submitted TPO-Price10": "submittedTPOPrice10",
+ "Proxy Extension": "proxyExtension"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "resourceName": "str",
+ "LMP": "Decimal",
+ "FIPx50": "Decimal",
+ "SCED2CurveMW1": "Decimal",
+ "SCED2CurvePrice1": "Decimal",
+ "SCED2CurveMW2": "Decimal",
+ "SCED2CurvePrice2": "Decimal",
+ "SCED2CurveMW3": "Decimal",
+ "SCED2CurvePrice3": "Decimal",
+ "SCED2CurveMW4": "Decimal",
+ "SCED2CurvePrice4": "Decimal",
+ "SCED2CurveMW5": "Decimal",
+ "SCED2CurvePrice5": "Decimal",
+ "SCED2CurveMW6": "Decimal",
+ "SCED2CurvePrice6": "Decimal",
+ "SCED2CurveMW7": "Decimal",
+ "SCED2CurvePrice7": "Decimal",
+ "SCED2CurveMW8": "Decimal",
+ "SCED2CurvePrice8": "Decimal",
+ "SCED2CurveMW9": "Decimal",
+ "SCED2CurvePrice9": "Decimal",
+ "SCED2CurveMW10": "Decimal",
+ "SCED2CurvePrice10": "Decimal",
+ "SCED2CurveMW11": "Decimal",
+ "SCED2CurvePrice11": "Decimal",
+ "SCED2CurveMW12": "Decimal",
+ "SCED2CurvePrice12": "Decimal",
+ "SCED2CurveMW13": "Decimal",
+ "SCED2CurvePrice13": "Decimal",
+ "SCED2CurveMW14": "Decimal",
+ "SCED2CurvePrice14": "Decimal",
+ "SCED2CurveMW15": "Decimal",
+ "SCED2CurvePrice15": "Decimal",
+ "SCED2CurveMW16": "Decimal",
+ "SCED2CurvePrice16": "Decimal",
+ "SCED2CurveMW17": "Decimal",
+ "SCED2CurvePrice17": "Decimal",
+ "SCED2CurveMW18": "Decimal",
+ "SCED2CurvePrice18": "Decimal",
+ "SCED2CurveMW19": "Decimal",
+ "SCED2CurvePrice19": "Decimal",
+ "SCED2CurveMW20": "Decimal",
+ "SCED2CurvePrice20": "Decimal",
+ "SCED2CurveMW21": "Decimal",
+ "SCED2CurvePrice21": "Decimal",
+ "SCED2CurveMW22": "Decimal",
+ "SCED2CurvePrice22": "Decimal",
+ "SCED2CurveMW23": "Decimal",
+ "SCED2CurvePrice23": "Decimal",
+ "SCED2CurveMW24": "Decimal",
+ "SCED2CurvePrice24": "Decimal",
+ "SCED2CurveMW25": "Decimal",
+ "SCED2CurvePrice25": "Decimal",
+ "SCED2CurveMW26": "Decimal",
+ "SCED2CurvePrice26": "Decimal",
+ "SCED2CurveMW27": "Decimal",
+ "SCED2CurvePrice27": "Decimal",
+ "SCED2CurveMW28": "Decimal",
+ "SCED2CurvePrice28": "Decimal",
+ "SCED2CurveMW29": "Decimal",
+ "SCED2CurvePrice29": "Decimal",
+ "SCED2CurveMW30": "Decimal",
+ "SCED2CurvePrice30": "Decimal",
+ "SCED2CurveMW31": "Decimal",
+ "SCED2CurvePrice31": "Decimal",
+ "SCED2CurveMW32": "Decimal",
+ "SCED2CurvePrice32": "Decimal",
+ "SCED2CurveMW33": "Decimal",
+ "SCED2CurvePrice33": "Decimal",
+ "SCED2CurveMW34": "Decimal",
+ "SCED2CurvePrice34": "Decimal",
+ "SCED2CurveMW35": "Decimal",
+ "SCED2CurvePrice35": "Decimal",
+ "bidType": "str",
+ "submittedTPOMW1": "Decimal",
+ "submittedTPOPrice1": "Decimal",
+ "submittedTPOMW2": "Decimal",
+ "submittedTPOPrice2": "Decimal",
+ "submittedTPOMW3": "Decimal",
+ "submittedTPOPrice3": "Decimal",
+ "submittedTPOMW4": "Decimal",
+ "submittedTPOPrice4": "Decimal",
+ "submittedTPOMW5": "Decimal",
+ "submittedTPOPrice5": "Decimal",
+ "submittedTPOMW6": "Decimal",
+ "submittedTPOPrice6": "Decimal",
+ "submittedTPOMW7": "Decimal",
+ "submittedTPOPrice7": "Decimal",
+ "submittedTPOMW8": "Decimal",
+ "submittedTPOPrice8": "Decimal",
+ "submittedTPOMW9": "Decimal",
+ "submittedTPOPrice9": "Decimal",
+ "submittedTPOMW10": "Decimal",
+ "submittedTPOPrice10": "Decimal",
+ "proxyExtension": "str"
+ }
+ },
+ "np3-987-ex/7d_trig_mcpc_50xfip": {
+ "member": "7day_Event_Trigger_DAM_MCPC_Exceeds_50XFIP-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "50xFIP": "FIPx50",
+ "MCPC": "MCPC",
+ "Multi-Hour Block Flag": "multiHourBlockFlag",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRSPFR": "price1RRSPFR",
+ "PRICE1 RRSFFR": "price1RRSFFR",
+ "PRICE1 RRSUFR": "price1RRSUFR",
+ "PRICE1 ECRS": "price1ECRS",
+ "PRICE1 OFFEC": "price1OFFEC",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNONSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDOWN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNONSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRSPFR": "price2RRSPFR",
+ "PRICE2 RRSFFR": "price2RRSFFR",
+ "PRICE2 RRSUFR": "price2RRSUFR",
+ "PRICE2 ECRS": "price2ECRS",
+ "PRICE2 OFFEC": "price2OFFEC",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNONSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDOWN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNONSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRSPFR": "price3RRSPFR",
+ "PRICE3 RRSFFR": "price3RRSFFR",
+ "PRICE3 RRSUFR": "price3RRSUFR",
+ "PRICE3 ECRS": "price3ECRS",
+ "PRICE3 OFFEC": "price3OFFEC",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNONSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDOWN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNONSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRSPFR": "price4RRSPFR",
+ "PRICE4 RRSFFR": "price4RRSFFR",
+ "PRICE4 RRSUFR": "price4RRSUFR",
+ "PRICE4 ECRS": "price4ECRS",
+ "PRICE4 OFFEC": "price4OFFEC",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNONSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDOWN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNONSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRSPFR": "price5RRSPFR",
+ "PRICE5 RRSFFR": "price5RRSFFR",
+ "PRICE5 RRSUFR": "price5RRSUFR",
+ "PRICE5 ECRS": "price5ECRS",
+ "PRICE5 OFFEC": "price5OFFEC",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNONSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDOWN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNONSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "FIPx50": "Decimal",
+ "MCPC": "Decimal",
+ "multiHourBlockFlag": "bool",
+ "blockIndicator1": "str",
+ "price1RRSPFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1ECRS": "Decimal",
+ "price1OFFEC": "Decimal",
+ "price1OnlineNONSPIN": "Decimal",
+ "price1REGUP": "Decimal",
+ "price1REGDOWN": "Decimal",
+ "price1OfflineNONSPIN": "Decimal",
+ "quantityMW1": "Decimal",
+ "blockIndicator2": "str",
+ "price2RRSPFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2ECRS": "Decimal",
+ "price2OFFEC": "Decimal",
+ "price2OnlineNONSPIN": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDOWN": "Decimal",
+ "price2OfflineNONSPIN": "Decimal",
+ "quantityMW2": "Decimal",
+ "blockIndicator3": "str",
+ "price3RRSPFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3ECRS": "Decimal",
+ "price3OFFEC": "Decimal",
+ "price3OnlineNONSPIN": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDOWN": "Decimal",
+ "price3OfflineNONSPIN": "Decimal",
+ "quantityMW3": "Decimal",
+ "blockIndicator4": "str",
+ "price4RRSPFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4ECRS": "Decimal",
+ "price4OFFEC": "Decimal",
+ "price4OnlineNONSPIN": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDOWN": "Decimal",
+ "price4OfflineNONSPIN": "Decimal",
+ "quantityMW4": "Decimal",
+ "blockIndicator5": "str",
+ "price5RRSPFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5ECRS": "Decimal",
+ "price5OFFEC": "Decimal",
+ "price5OnlineNONSPIN": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDOWN": "Decimal",
+ "price5OfflineNONSPIN": "Decimal",
+ "quantityMW5": "Decimal"
+ }
+ },
+ "np3-987-ex/7d_trig_rtm_mcpc_50xfip": {
+ "member": "7day_Event_Trigger_RTM_MCPC_Exceeds_50XFIP-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Resource Name": "resourceName",
+ "50xFIP": "FIPx50",
+ "RTMCPC": "RTMCPC",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDOWN",
+ "PRICE1 RRSPFR": "price1RRSPFR",
+ "PRICE1 RRSUFR": "price1RRSUFR",
+ "PRICE1 RRSFFR": "price1RRSFFR",
+ "PRICE1 NONSPIN": "price1NONSPIN",
+ "PRICE1 ECRS": "price1ECRS",
+ "QUANTITY MW1": "quantityMW1",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDOWN",
+ "PRICE2 RRSPFR": "price2RRSPFR",
+ "PRICE2 RRSUFR": "price2RRSUFR",
+ "PRICE2 RRSFFR": "price2RRSFFR",
+ "PRICE2 NONSPIN": "price2NONSPIN",
+ "PRICE2 ECRS": "price2ECRS",
+ "QUANTITY MW2": "quantityMW2",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDOWN",
+ "PRICE3 RRSPFR": "price3RRSPFR",
+ "PRICE3 RRSUFR": "price3RRSUFR",
+ "PRICE3 RRSFFR": "price3RRSFFR",
+ "PRICE3 NONSPIN": "price3NONSPIN",
+ "PRICE3 ECRS": "price3ECRS",
+ "QUANTITY MW3": "quantityMW3",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDOWN",
+ "PRICE4 RRSPFR": "price4RRSPFR",
+ "PRICE4 RRSUFR": "price4RRSUFR",
+ "PRICE4 RRSFFR": "price4RRSFFR",
+ "PRICE4 NONSPIN": "price4NONSPIN",
+ "PRICE4 ECRS": "price4ECRS",
+ "QUANTITY MW4": "quantityMW4",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDOWN",
+ "PRICE5 RRSPFR": "price5RRSPFR",
+ "PRICE5 RRSUFR": "price5RRSUFR",
+ "PRICE5 RRSFFR": "price5RRSFFR",
+ "PRICE5 NONSPIN": "price5NONSPIN",
+ "PRICE5 ECRS": "price5ECRS",
+ "QUANTITY MW5": "quantityMW5"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "resourceName": "str",
+ "FIPx50": "Decimal",
+ "RTMCPC": "Decimal",
+ "price1REGUP": "Decimal",
+ "price1REGDOWN": "Decimal",
+ "price1RRSPFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1NONSPIN": "Decimal",
+ "price1ECRS": "Decimal",
+ "quantityMW1": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDOWN": "Decimal",
+ "price2RRSPFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2NONSPIN": "Decimal",
+ "price2ECRS": "Decimal",
+ "quantityMW2": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDOWN": "Decimal",
+ "price3RRSPFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3NONSPIN": "Decimal",
+ "price3ECRS": "Decimal",
+ "quantityMW3": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDOWN": "Decimal",
+ "price4RRSPFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4NONSPIN": "Decimal",
+ "price4ECRS": "Decimal",
+ "quantityMW4": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDOWN": "Decimal",
+ "price5RRSPFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5NONSPIN": "Decimal",
+ "price5ECRS": "Decimal",
+ "quantityMW5": "Decimal"
+ }
+ },
+ "np3-990-ex/60_sasm_gen_res_as_offer_awards": {
+ "member": "60d_SASM_Generation_Resource_AS_Offer_Awards-[0-9]*.csv",
+ "columns": {
+ "SASM ID": "SASMId",
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "REGUP Awarded": "REGUPAawarded",
+ "REGUP MCPC": "REGUPMCPC",
+ "REGDN Awarded": "REGDNAwarded",
+ "REGDN MCPC": "REGDNMCPC",
+ "RRSPFR Awarded": "RRSPFRAwarded",
+ "RRSFFR Awarded": "RRSFFRAwarded",
+ "RRSUFR Awarded": "RRSUFRAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "ECRSS Awarded": "ECRSSAwarded",
+ "OFFEC Awarded": "OFFECAwarded",
+ "ECRS MCPC": "ECRSMCPC",
+ "NSPIN Awarded": "NSPINAwarded",
+ "NSPIN MCPC": "NSPINMCPC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "SASMId": "%m/%d/%Y %I:%M:%S %p"
+ },
+ "fields": {
+ "SASMId": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "resourceName": "str",
+ "resourceType": "str",
+ "REGUPAawarded": "Decimal",
+ "REGUPMCPC": "Decimal",
+ "REGDNAwarded": "Decimal",
+ "REGDNMCPC": "Decimal",
+ "RRSPFRAwarded": "Decimal",
+ "RRSFFRAwarded": "Decimal",
+ "RRSUFRAwarded": "Decimal",
+ "RRSMCPC": "Decimal",
+ "ECRSSAwarded": "Decimal",
+ "OFFECAwarded": "Decimal",
+ "ECRSMCPC": "Decimal",
+ "NSPINAwarded": "Decimal",
+ "NSPINMCPC": "Decimal",
+ "RRSAwarded": "Decimal"
+ },
+ "variants": [
+ {
+ "SASM ID": "SASMId",
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "REGUP Awarded": "REGUPAawarded",
+ "REGUP MCPC": "REGUPMCPC",
+ "REGDN Awarded": "REGDNAwarded",
+ "REGDN MCPC": "REGDNMCPC",
+ "RRS Awarded": "RRSAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "NSPIN Awarded": "NSPINAwarded",
+ "NSPIN MCPC": "NSPINMCPC"
+ }
+ ]
+ },
+ "np3-990-ex/60_sasm_load_res_as_offer_awards": {
+ "member": "60d_SASM_Load_Resource_AS_Offer_Awards-[0-9]*.csv",
+ "columns": {
+ "SASM ID": "SASMId",
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "REGUP Awarded": "REGUPAawarded",
+ "REGUP MCPC": "REGUPMCPC",
+ "REGDN Awarded": "REGDNAwarded",
+ "REGDN MCPC": "REGDNMCPC",
+ "RRSPFR Awarded": "RRSPFRAwarded",
+ "RRSFFR Awarded": "RRSFFRAwarded",
+ "RRSUFR Awarded": "RRSUFRAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "ECRSM Awarded": "ECRSMAwarded",
+ "ECRSS Awarded": "ECRSSAwarded",
+ "ECRS MCPC": "ECRSMCPC",
+ "NSPIN Awarded": "NSPINAwarded",
+ "NSPIN MCPC": "NSPINMCPC"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "SASMId": "%m/%d/%Y %I:%M:%S %p"
+ },
+ "fields": {
+ "SASMId": "datetime",
+ "deliveryDate": "date",
+ "hourEnding": "int",
+ "resourceName": "str",
+ "resourceType": "str",
+ "REGUPAawarded": "Decimal",
+ "REGUPMCPC": "Decimal",
+ "REGDNAwarded": "Decimal",
+ "REGDNMCPC": "Decimal",
+ "RRSPFRAwarded": "Decimal",
+ "RRSFFRAwarded": "Decimal",
+ "RRSUFRAwarded": "Decimal",
+ "RRSMCPC": "Decimal",
+ "ECRSMAwarded": "Decimal",
+ "ECRSSAwarded": "Decimal",
+ "ECRSMCPC": "Decimal",
+ "NSPINAwarded": "Decimal",
+ "NSPINMCPC": "Decimal",
+ "RRSAwarded": "Decimal"
+ },
+ "variants": [
+ {
+ "SASM ID": "SASMId",
+ "Delivery Date": "deliveryDate",
+ "Hour Ending": "hourEnding",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "REGUP Awarded": "REGUPAawarded",
+ "REGUP MCPC": "REGUPMCPC",
+ "REGDN Awarded": "REGDNAwarded",
+ "REGDN MCPC": "REGDNMCPC",
+ "RRS Awarded": "RRSAwarded",
+ "RRS MCPC": "RRSMCPC",
+ "NSPIN Awarded": "NSPINAwarded",
+ "NSPIN MCPC": "NSPINMCPC"
+ }
+ ]
+ },
+ "np3-990-ex/60_sasm_load_res_as_offers": {
+ "member": "60d_SASM_Load_Resource_AS_Offers-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "SASM ID": "SASMId",
+ "Hour Ending": "hourEnding",
+ "QSE NAME": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Multi-Hour Block Flag": "multiHourBlockFlag",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRSPFR": "price1RRSPFR",
+ "PRICE1 RRSFFR": "price1RRSFFR",
+ "PRICE1 RRSUFR": "price1RRSUFR",
+ "PRICE1 ECRS": "price1ECRS",
+ "PRICE1 OFFEC": "price1OFFEC",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNONSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDOWN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNONSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRSPFR": "price2RRSPFR",
+ "PRICE2 RRSFFR": "price2RRSFFR",
+ "PRICE2 RRSUFR": "price2RRSUFR",
+ "PRICE2 ECRS": "price2ECRS",
+ "PRICE2 OFFEC": "price2OFFEC",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNONSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDOWN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNONSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRSPFR": "price3RRSPFR",
+ "PRICE3 RRSFFR": "price3RRSFFR",
+ "PRICE3 RRSUFR": "price3RRSUFR",
+ "PRICE3 ECRS": "price3ECRS",
+ "PRICE3 OFFEC": "price3OFFEC",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNONSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDOWN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNONSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRSPFR": "price4RRSPFR",
+ "PRICE4 RRSFFR": "price4RRSFFR",
+ "PRICE4 RRSUFR": "price4RRSUFR",
+ "PRICE4 ECRS": "price4ECRS",
+ "PRICE4 OFFEC": "price4OFFEC",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNONSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDOWN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNONSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRSPFR": "price5RRSPFR",
+ "PRICE5 RRSFFR": "price5RRSFFR",
+ "PRICE5 RRSUFR": "price5RRSUFR",
+ "PRICE5 ECRS": "price5ECRS",
+ "PRICE5 OFFEC": "price5OFFEC",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNONSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDOWN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNONSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "SASMId": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "SASMId": "datetime",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "multiHourBlockFlag": "bool",
+ "blockIndicator1": "str",
+ "price1RRSPFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1ECRS": "Decimal",
+ "price1OFFEC": "Decimal",
+ "price1OnlineNONSPIN": "Decimal",
+ "price1REGUP": "Decimal",
+ "price1REGDOWN": "Decimal",
+ "price1OfflineNONSPIN": "Decimal",
+ "quantityMW1": "Decimal",
+ "blockIndicator2": "str",
+ "price2RRSPFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2ECRS": "Decimal",
+ "price2OFFEC": "Decimal",
+ "price2OnlineNONSPIN": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDOWN": "Decimal",
+ "price2OfflineNONSPIN": "Decimal",
+ "quantityMW2": "Decimal",
+ "blockIndicator3": "str",
+ "price3RRSPFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3ECRS": "Decimal",
+ "price3OFFEC": "Decimal",
+ "price3OnlineNONSPIN": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDOWN": "Decimal",
+ "price3OfflineNONSPIN": "Decimal",
+ "quantityMW3": "Decimal",
+ "blockIndicator4": "str",
+ "price4RRSPFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4ECRS": "Decimal",
+ "price4OFFEC": "Decimal",
+ "price4OnlineNONSPIN": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDOWN": "Decimal",
+ "price4OfflineNONSPIN": "Decimal",
+ "quantityMW4": "Decimal",
+ "blockIndicator5": "str",
+ "price5RRSPFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5ECRS": "Decimal",
+ "price5OFFEC": "Decimal",
+ "price5OnlineNONSPIN": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDOWN": "Decimal",
+ "price5OfflineNONSPIN": "Decimal",
+ "quantityMW5": "Decimal",
+ "price1RRS": "Decimal",
+ "price2RRS": "Decimal",
+ "price3RRS": "Decimal",
+ "price4RRS": "Decimal",
+ "price5RRS": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "SASM ID": "SASMId",
+ "Hour Ending": "hourEnding",
+ "QSE NAME": "qseName",
+ "Resource Name": "resourceName",
+ "Multi-Hour Block Flag": "multiHourBlockFlag",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRS": "price1RRS",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNONSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDOWN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNONSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRS": "price2RRS",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNONSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDOWN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNONSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRS": "price3RRS",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNONSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDOWN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNONSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRS": "price4RRS",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNONSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDOWN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNONSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRS": "price5RRS",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNONSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDOWN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNONSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ }
+ ]
+ },
+ "np3-990-ex/60_sasm_gen_res_as_offers": {
+ "member": "60d_SASM_Generation_Resource_AS_Offers-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "SASM ID": "SASMId",
+ "Hour Ending": "hourEnding",
+ "QSE NAME": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Multi-Hour Block Flag": "multiHourBlockFlag",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRSPFR": "price1RRSPFR",
+ "PRICE1 RRSFFR": "price1RRSFFR",
+ "PRICE1 RRSUFR": "price1RRSUFR",
+ "PRICE1 ECRS": "price1ECRS",
+ "PRICE1 OFFEC": "price1OFFEC",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNONSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDOWN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNONSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRSPFR": "price2RRSPFR",
+ "PRICE2 RRSFFR": "price2RRSFFR",
+ "PRICE2 RRSUFR": "price2RRSUFR",
+ "PRICE2 ECRS": "price2ECRS",
+ "PRICE2 OFFEC": "price2OFFEC",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNONSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDOWN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNONSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRSPFR": "price3RRSPFR",
+ "PRICE3 RRSFFR": "price3RRSFFR",
+ "PRICE3 RRSUFR": "price3RRSUFR",
+ "PRICE3 ECRS": "price3ECRS",
+ "PRICE3 OFFEC": "price3OFFEC",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNONSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDOWN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNONSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRSPFR": "price4RRSPFR",
+ "PRICE4 RRSFFR": "price4RRSFFR",
+ "PRICE4 RRSUFR": "price4RRSUFR",
+ "PRICE4 ECRS": "price4ECRS",
+ "PRICE4 OFFEC": "price4OFFEC",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNONSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDOWN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNONSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRSPFR": "price5RRSPFR",
+ "PRICE5 RRSFFR": "price5RRSFFR",
+ "PRICE5 RRSUFR": "price5RRSUFR",
+ "PRICE5 ECRS": "price5ECRS",
+ "PRICE5 OFFEC": "price5OFFEC",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNONSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDOWN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNONSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "SASMId": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "deliveryDate": "date",
+ "SASMId": "datetime",
+ "hourEnding": "int",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "multiHourBlockFlag": "bool",
+ "blockIndicator1": "str",
+ "price1RRSPFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1ECRS": "Decimal",
+ "price1OFFEC": "Decimal",
+ "price1OnlineNONSPIN": "Decimal",
+ "price1REGUP": "Decimal",
+ "price1REGDOWN": "Decimal",
+ "price1OfflineNONSPIN": "Decimal",
+ "quantityMW1": "Decimal",
+ "blockIndicator2": "str",
+ "price2RRSPFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2ECRS": "Decimal",
+ "price2OFFEC": "Decimal",
+ "price2OnlineNONSPIN": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDOWN": "Decimal",
+ "price2OfflineNONSPIN": "Decimal",
+ "quantityMW2": "Decimal",
+ "blockIndicator3": "str",
+ "price3RRSPFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3ECRS": "Decimal",
+ "price3OFFEC": "Decimal",
+ "price3OnlineNONSPIN": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDOWN": "Decimal",
+ "price3OfflineNONSPIN": "Decimal",
+ "quantityMW3": "Decimal",
+ "blockIndicator4": "str",
+ "price4RRSPFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4ECRS": "Decimal",
+ "price4OFFEC": "Decimal",
+ "price4OnlineNONSPIN": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDOWN": "Decimal",
+ "price4OfflineNONSPIN": "Decimal",
+ "quantityMW4": "Decimal",
+ "blockIndicator5": "str",
+ "price5RRSPFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5ECRS": "Decimal",
+ "price5OFFEC": "Decimal",
+ "price5OnlineNONSPIN": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDOWN": "Decimal",
+ "price5OfflineNONSPIN": "Decimal",
+ "quantityMW5": "Decimal",
+ "price1RRS": "Decimal",
+ "price2RRS": "Decimal",
+ "price3RRS": "Decimal",
+ "price4RRS": "Decimal",
+ "price5RRS": "Decimal"
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "SASM ID": "SASMId",
+ "Hour Ending": "hourEnding",
+ "QSE NAME": "qseName",
+ "Resource Name": "resourceName",
+ "Multi-Hour Block Flag": "multiHourBlockFlag",
+ "BLOCK INDICATOR1": "blockIndicator1",
+ "PRICE1 RRS": "price1RRS",
+ "PRICE1 ONLINE NONSPIN": "price1OnlineNONSPIN",
+ "PRICE1 REGUP": "price1REGUP",
+ "PRICE1 REGDOWN": "price1REGDOWN",
+ "PRICE1 OFFLINE NONSPIN": "price1OfflineNONSPIN",
+ "QUANTITY MW1": "quantityMW1",
+ "BLOCK INDICATOR2": "blockIndicator2",
+ "PRICE2 RRS": "price2RRS",
+ "PRICE2 ONLINE NONSPIN": "price2OnlineNONSPIN",
+ "PRICE2 REGUP": "price2REGUP",
+ "PRICE2 REGDOWN": "price2REGDOWN",
+ "PRICE2 OFFLINE NONSPIN": "price2OfflineNONSPIN",
+ "QUANTITY MW2": "quantityMW2",
+ "BLOCK INDICATOR3": "blockIndicator3",
+ "PRICE3 RRS": "price3RRS",
+ "PRICE3 ONLINE NONSPIN": "price3OnlineNONSPIN",
+ "PRICE3 REGUP": "price3REGUP",
+ "PRICE3 REGDOWN": "price3REGDOWN",
+ "PRICE3 OFFLINE NONSPIN": "price3OfflineNONSPIN",
+ "QUANTITY MW3": "quantityMW3",
+ "BLOCK INDICATOR4": "blockIndicator4",
+ "PRICE4 RRS": "price4RRS",
+ "PRICE4 ONLINE NONSPIN": "price4OnlineNONSPIN",
+ "PRICE4 REGUP": "price4REGUP",
+ "PRICE4 REGDOWN": "price4REGDOWN",
+ "PRICE4 OFFLINE NONSPIN": "price4OfflineNONSPIN",
+ "QUANTITY MW4": "quantityMW4",
+ "BLOCK INDICATOR5": "blockIndicator5",
+ "PRICE5 RRS": "price5RRS",
+ "PRICE5 ONLINE NONSPIN": "price5OnlineNONSPIN",
+ "PRICE5 REGUP": "price5REGUP",
+ "PRICE5 REGDOWN": "price5REGDOWN",
+ "PRICE5 OFFLINE NONSPIN": "price5OfflineNONSPIN",
+ "QUANTITY MW5": "quantityMW5"
+ }
+ ]
+ },
+ "np3-991-ex/60_cop_all_updates": {
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "QSE Name": "qseName",
+ "Resource Name": "resourceName",
+ "Hour Ending": "hourEnding",
+ "Status": "status",
+ "High Sustained Limit": "highSustainedLimit",
+ "Low Sustained Limit": "lowSustainedLimit",
+ "High Emergency Limit": "highEmergencyLimit",
+ "Low Emergency Limit": "lowEmergencyLimit",
+ "Reg Up": "REGUP",
+ "Reg Down": "REGDN",
+ "RRSPFR": "RRSPFR",
+ "RRSFFR": "RRSFFR",
+ "RRSUFR": "RRSUFR",
+ "NSPIN": "NSPIN",
+ "ECRS": "ECRS",
+ "Minimum SOC": "minSOC",
+ "Maximum SOC": "maxSOC",
+ "Hour Beginning Planned SOC": "hourBeginningPlannedSOC",
+ "Cancel Flag": "cancelFlag",
+ "Update Time": "updateTime",
+ "Submit Time": "submitTime"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {
+ "updateTime": [
+ "%m/%d/%Y %H:%M:%S",
+ "%m/%d/%Y %H:%M"
+ ],
+ "submitTime": [
+ "%m/%d/%Y %H:%M:%S",
+ "%m/%d/%Y %H:%M"
+ ]
+ },
+ "variants": [
+ {
+ "Delivery Date": "deliveryDate",
+ "QSE Name": "qseName",
+ "Resource Name": "resourceName",
+ "Hour Ending": "hourEnding",
+ "Status": "status",
+ "High Sustained Limit": "highSustainedLimit",
+ "Low Sustained Limit": "lowSustainedLimit",
+ "High Emergency Limit": "highEmergencyLimit",
+ "Low Emergency Limit": "lowEmergencyLimit",
+ "Reg Up": "REGUP",
+ "Reg Down": "REGDN",
+ "RRS": "RRS",
+ "NSPIN": "NSPIN",
+ "Cancel Flag": "cancelFlag",
+ "Update Time": "updateTime",
+ "Submit Time": "submitTime"
+ }
+ ],
+ "fields": {
+ "deliveryDate": "date",
+ "qseName": "str",
+ "resourceName": "str",
+ "hourEnding": "str",
+ "status": "str",
+ "highSustainedLimit": "Decimal",
+ "lowSustainedLimit": "Decimal",
+ "highEmergencyLimit": "Decimal",
+ "lowEmergencyLimit": "Decimal",
+ "REGUP": "Decimal",
+ "REGDN": "Decimal",
+ "RRSPFR": "Decimal",
+ "RRSFFR": "Decimal",
+ "RRSUFR": "Decimal",
+ "NSPIN": "Decimal",
+ "ECRS": "Decimal",
+ "minSOC": "Decimal",
+ "maxSOC": "Decimal",
+ "hourBeginningPlannedSOC": "Decimal",
+ "cancelFlag": "bool",
+ "updateTime": "datetime",
+ "submitTime": "datetime",
+ "RRS": "Decimal"
+ }
+ },
+ "np3-965-er/60_sced_qse_self_arranged_as": {
+ "member": "60d_SCED_QSE_Self_Arranged_AS-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "REGUP": "REGUP",
+ "REGDN": "REGDN",
+ "NSPIN": "NSPIN",
+ "NSPNM": "NSPNM",
+ "RRSPFR": "RRSPFR",
+ "RRSFFR": "RRSFFR",
+ "RRSUFR": "RRSUFR",
+ "ECRSS": "ECRSS",
+ "ECRSM": "ECRSM"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": [
+ "%m/%d/%Y %H:%M:%S",
+ "%m/%d/%Y %H :%M :%S"
+ ]
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "qseName": "str",
+ "REGUP": "Decimal",
+ "REGDN": "Decimal",
+ "NSPIN": "Decimal",
+ "NSPNM": "Decimal",
+ "RRSPFR": "Decimal",
+ "RRSFFR": "Decimal",
+ "RRSUFR": "Decimal",
+ "ECRSS": "Decimal",
+ "ECRSM": "Decimal",
+ "RRSGN": "Decimal",
+ "RRSLD": "Decimal",
+ "RRSNC": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "REGUP": "REGUP",
+ "REGDN": "REGDN",
+ "NSPIN": "NSPIN",
+ "RRSGN": "RRSGN",
+ "RRSLD": "RRSLD",
+ "RRSNC": "RRSNC"
+ },
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "REGUP": "REGUP",
+ "REGDN": "REGDN",
+ "NSPIN": "NSPIN",
+ "NSPNM": "NSPNM",
+ "RRSPFR": "RRSPFR",
+ "RRSFFR": "RRSFFR",
+ "RRSUFR": "RRSUFR",
+ "ECRSS": "ECRSS",
+ "ECRSM ": "ECRSM"
+ }
+ ]
+ },
+ "np3-965-er/60_sced_smne_gen_res": {
+ "member": "60d_SCED_SMNE_GEN_RES-[0-9]*.csv",
+ "columns": {
+ "Interval Time": "intervalTime",
+ "Interval Number": "intervalNumber",
+ "Resource Code": "resourceCode",
+ "Interval Value": "intervalValue"
+ },
+ "dates": {},
+ "datetimes": {
+ "intervalTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "intervalTime": "datetime",
+ "intervalNumber": "int",
+ "resourceCode": "str",
+ "intervalValue": "Decimal"
+ }
+ },
+ "np3-965-er/60_sced_gen_res_data": {
+ "member": "60d_SCED_Gen_Resource_Data-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "SCED1 Curve-MW1": "SCED1CurveMW1",
+ "SCED1 Curve-Price1": "SCED1CurvePrice1",
+ "SCED1 Curve-MW2": "SCED1CurveMW2",
+ "SCED1 Curve-Price2": "SCED1CurvePrice2",
+ "SCED1 Curve-MW3": "SCED1CurveMW3",
+ "SCED1 Curve-Price3": "SCED1CurvePrice3",
+ "SCED1 Curve-MW4": "SCED1CurveMW4",
+ "SCED1 Curve-Price4": "SCED1CurvePrice4",
+ "SCED1 Curve-MW5": "SCED1CurveMW5",
+ "SCED1 Curve-Price5": "SCED1CurvePrice5",
+ "SCED1 Curve-MW6": "SCED1CurveMW6",
+ "SCED1 Curve-Price6": "SCED1CurvePrice6",
+ "SCED1 Curve-MW7": "SCED1CurveMW7",
+ "SCED1 Curve-Price7": "SCED1CurvePrice7",
+ "SCED1 Curve-MW8": "SCED1CurveMW8",
+ "SCED1 Curve-Price8": "SCED1CurvePrice8",
+ "SCED1 Curve-MW9": "SCED1CurveMW9",
+ "SCED1 Curve-Price9": "SCED1CurvePrice9",
+ "SCED1 Curve-MW10": "SCED1CurveMW10",
+ "SCED1 Curve-Price10": "SCED1CurvePrice10",
+ "SCED1 Curve-MW11": "SCED1CurveMW11",
+ "SCED1 Curve-Price11": "SCED1CurvePrice11",
+ "SCED1 Curve-MW12": "SCED1CurveMW12",
+ "SCED1 Curve-Price12": "SCED1CurvePrice12",
+ "SCED1 Curve-MW13": "SCED1CurveMW13",
+ "SCED1 Curve-Price13": "SCED1CurvePrice13",
+ "SCED1 Curve-MW14": "SCED1CurveMW14",
+ "SCED1 Curve-Price14": "SCED1CurvePrice14",
+ "SCED1 Curve-MW15": "SCED1CurveMW15",
+ "SCED1 Curve-Price15": "SCED1CurvePrice15",
+ "SCED1 Curve-MW16": "SCED1CurveMW16",
+ "SCED1 Curve-Price16": "SCED1CurvePrice16",
+ "SCED1 Curve-MW17": "SCED1CurveMW17",
+ "SCED1 Curve-Price17": "SCED1CurvePrice17",
+ "SCED1 Curve-MW18": "SCED1CurveMW18",
+ "SCED1 Curve-Price18": "SCED1CurvePrice18",
+ "SCED1 Curve-MW19": "SCED1CurveMW19",
+ "SCED1 Curve-Price19": "SCED1CurvePrice19",
+ "SCED1 Curve-MW20": "SCED1CurveMW20",
+ "SCED1 Curve-Price20": "SCED1CurvePrice20",
+ "SCED1 Curve-MW21": "SCED1CurveMW21",
+ "SCED1 Curve-Price21": "SCED1CurvePrice21",
+ "SCED1 Curve-MW22": "SCED1CurveMW22",
+ "SCED1 Curve-Price22": "SCED1CurvePrice22",
+ "SCED1 Curve-MW23": "SCED1CurveMW23",
+ "SCED1 Curve-Price23": "SCED1CurvePrice23",
+ "SCED1 Curve-MW24": "SCED1CurveMW24",
+ "SCED1 Curve-Price24": "SCED1CurvePrice24",
+ "SCED1 Curve-MW25": "SCED1CurveMW25",
+ "SCED1 Curve-Price25": "SCED1CurvePrice25",
+ "SCED1 Curve-MW26": "SCED1CurveMW26",
+ "SCED1 Curve-Price26": "SCED1CurvePrice26",
+ "SCED1 Curve-MW27": "SCED1CurveMW27",
+ "SCED1 Curve-Price27": "SCED1CurvePrice27",
+ "SCED1 Curve-MW28": "SCED1CurveMW28",
+ "SCED1 Curve-Price28": "SCED1CurvePrice28",
+ "SCED1 Curve-MW29": "SCED1CurveMW29",
+ "SCED1 Curve-Price29": "SCED1CurvePrice29",
+ "SCED1 Curve-MW30": "SCED1CurveMW30",
+ "SCED1 Curve-Price30": "SCED1CurvePrice30",
+ "SCED1 Curve-MW31": "SCED1CurveMW31",
+ "SCED1 Curve-Price31": "SCED1CurvePrice31",
+ "SCED1 Curve-MW32": "SCED1CurveMW32",
+ "SCED1 Curve-Price32": "SCED1CurvePrice32",
+ "SCED1 Curve-MW33": "SCED1CurveMW33",
+ "SCED1 Curve-Price33": "SCED1CurvePrice33",
+ "SCED1 Curve-MW34": "SCED1CurveMW34",
+ "SCED1 Curve-Price34": "SCED1CurvePrice34",
+ "SCED1 Curve-MW35": "SCED1CurveMW35",
+ "SCED1 Curve-Price35": "SCED1CurvePrice35",
+ "SCED2 Curve-MW1": "SCED2CurveMW1",
+ "SCED2 Curve-Price1": "SCED2CurvePrice1",
+ "SCED2 Curve-MW2": "SCED2CurveMW2",
+ "SCED2 Curve-Price2": "SCED2CurvePrice2",
+ "SCED2 Curve-MW3": "SCED2CurveMW3",
+ "SCED2 Curve-Price3": "SCED2CurvePrice3",
+ "SCED2 Curve-MW4": "SCED2CurveMW4",
+ "SCED2 Curve-Price4": "SCED2CurvePrice4",
+ "SCED2 Curve-MW5": "SCED2CurveMW5",
+ "SCED2 Curve-Price5": "SCED2CurvePrice5",
+ "SCED2 Curve-MW6": "SCED2CurveMW6",
+ "SCED2 Curve-Price6": "SCED2CurvePrice6",
+ "SCED2 Curve-MW7": "SCED2CurveMW7",
+ "SCED2 Curve-Price7": "SCED2CurvePrice7",
+ "SCED2 Curve-MW8": "SCED2CurveMW8",
+ "SCED2 Curve-Price8": "SCED2CurvePrice8",
+ "SCED2 Curve-MW9": "SCED2CurveMW9",
+ "SCED2 Curve-Price9": "SCED2CurvePrice9",
+ "SCED2 Curve-MW10": "SCED2CurveMW10",
+ "SCED2 Curve-Price10": "SCED2CurvePrice10",
+ "SCED2 Curve-MW11": "SCED2CurveMW11",
+ "SCED2 Curve-Price11": "SCED2CurvePrice11",
+ "SCED2 Curve-MW12": "SCED2CurveMW12",
+ "SCED2 Curve-Price12": "SCED2CurvePrice12",
+ "SCED2 Curve-MW13": "SCED2CurveMW13",
+ "SCED2 Curve-Price13": "SCED2CurvePrice13",
+ "SCED2 Curve-MW14": "SCED2CurveMW14",
+ "SCED2 Curve-Price14": "SCED2CurvePrice14",
+ "SCED2 Curve-MW15": "SCED2CurveMW15",
+ "SCED2 Curve-Price15": "SCED2CurvePrice15",
+ "SCED2 Curve-MW16": "SCED2CurveMW16",
+ "SCED2 Curve-Price16": "SCED2CurvePrice16",
+ "SCED2 Curve-MW17": "SCED2CurveMW17",
+ "SCED2 Curve-Price17": "SCED2CurvePrice17",
+ "SCED2 Curve-MW18": "SCED2CurveMW18",
+ "SCED2 Curve-Price18": "SCED2CurvePrice18",
+ "SCED2 Curve-MW19": "SCED2CurveMW19",
+ "SCED2 Curve-Price19": "SCED2CurvePrice19",
+ "SCED2 Curve-MW20": "SCED2CurveMW20",
+ "SCED2 Curve-Price20": "SCED2CurvePrice20",
+ "SCED2 Curve-MW21": "SCED2CurveMW21",
+ "SCED2 Curve-Price21": "SCED2CurvePrice21",
+ "SCED2 Curve-MW22": "SCED2CurveMW22",
+ "SCED2 Curve-Price22": "SCED2CurvePrice22",
+ "SCED2 Curve-MW23": "SCED2CurveMW23",
+ "SCED2 Curve-Price23": "SCED2CurvePrice23",
+ "SCED2 Curve-MW24": "SCED2CurveMW24",
+ "SCED2 Curve-Price24": "SCED2CurvePrice24",
+ "SCED2 Curve-MW25": "SCED2CurveMW25",
+ "SCED2 Curve-Price25": "SCED2CurvePrice25",
+ "SCED2 Curve-MW26": "SCED2CurveMW26",
+ "SCED2 Curve-Price26": "SCED2CurvePrice26",
+ "SCED2 Curve-MW27": "SCED2CurveMW27",
+ "SCED2 Curve-Price27": "SCED2CurvePrice27",
+ "SCED2 Curve-MW28": "SCED2CurveMW28",
+ "SCED2 Curve-Price28": "SCED2CurvePrice28",
+ "SCED2 Curve-MW29": "SCED2CurveMW29",
+ "SCED2 Curve-Price29": "SCED2CurvePrice29",
+ "SCED2 Curve-MW30": "SCED2CurveMW30",
+ "SCED2 Curve-Price30": "SCED2CurvePrice30",
+ "SCED2 Curve-MW31": "SCED2CurveMW31",
+ "SCED2 Curve-Price31": "SCED2CurvePrice31",
+ "SCED2 Curve-MW32": "SCED2CurveMW32",
+ "SCED2 Curve-Price32": "SCED2CurvePrice32",
+ "SCED2 Curve-MW33": "SCED2CurveMW33",
+ "SCED2 Curve-Price33": "SCED2CurvePrice33",
+ "SCED2 Curve-MW34": "SCED2CurveMW34",
+ "SCED2 Curve-Price34": "SCED2CurvePrice34",
+ "SCED2 Curve-MW35": "SCED2CurveMW35",
+ "SCED2 Curve-Price35": "SCED2CurvePrice35",
+ "Output Schedule": "outputSchedule",
+ "HSL": "HSL",
+ "HDL": "HDL",
+ "LSL": "LSL",
+ "LDL": "LDL",
+ "Telemetered Resource Status": "telemeteredResourceStatus",
+ "Base Point": "basePoint",
+ "Telemetered Net Output": "telemeteredNetOutput",
+ "Ramp Rate Up": "rampRateUp",
+ "Ramp Rate Down": "rampRateDown",
+ "AS Capability REGUP": "ASCapREGUP",
+ "AS Capability REGDN": "ASCapREGDN",
+ "AS Capability ECRS": "ASCapECRS",
+ "AS Capability NSPIN": "ASCapNSPIN",
+ "AS Capability RRSPFR": "ASCapRRSPFR",
+ "AS Capability RRSFFR": "ASCapRRSFFR",
+ "AS Awards NSPIN": "ASAwardsNSPIN",
+ "AS Awards RRSFFR": "ASAwardsRRSFFR",
+ "AS Awards RRSPFR": "ASAwardsRRSPFR",
+ "AS Awards RRSUFR": "ASAwardsRRSUFR",
+ "AS Awards ECRS": "ASAwardsECRS",
+ "AS Awards REGUP": "ASAwardsREGUP",
+ "AS Awards REGDN": "ASAwardsREGDN",
+ "Bid_Type": "bidType",
+ "Start Up Cold Offer": "startUpColdOffer",
+ "Start Up Hot Offer": "startUpHotOffer",
+ "Start Up Inter Offer": "startUpInterOffer",
+ "Min Gen Cost": "minGenCost",
+ "Submitted TPO-MW1": "submittedTPOMW1",
+ "Submitted TPO-Price1": "submittedTPOPrice1",
+ "Submitted TPO-MW2": "submittedTPOMW2",
+ "Submitted TPO-Price2": "submittedTPOPrice2",
+ "Submitted TPO-MW3": "submittedTPOMW3",
+ "Submitted TPO-Price3": "submittedTPOPrice3",
+ "Submitted TPO-MW4": "submittedTPOMW4",
+ "Submitted TPO-Price4": "submittedTPOPrice4",
+ "Submitted TPO-MW5": "submittedTPOMW5",
+ "Submitted TPO-Price5": "submittedTPOPrice5",
+ "Submitted TPO-MW6": "submittedTPOMW6",
+ "Submitted TPO-Price6": "submittedTPOPrice6",
+ "Submitted TPO-MW7": "submittedTPOMW7",
+ "Submitted TPO-Price7": "submittedTPOPrice7",
+ "Submitted TPO-MW8": "submittedTPOMW8",
+ "Submitted TPO-Price8": "submittedTPOPrice8",
+ "Submitted TPO-MW9": "submittedTPOMW9",
+ "Submitted TPO-Price9": "submittedTPOPrice9",
+ "Submitted TPO-MW10": "submittedTPOMW10",
+ "Submitted TPO-Price10": "submittedTPOPrice10",
+ "Proxy Extension": "proxyExtension"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "resourceType": "str",
+ "SCED1CurveMW1": "Decimal",
+ "SCED1CurvePrice1": "Decimal",
+ "SCED1CurveMW2": "Decimal",
+ "SCED1CurvePrice2": "Decimal",
+ "SCED1CurveMW3": "Decimal",
+ "SCED1CurvePrice3": "Decimal",
+ "SCED1CurveMW4": "Decimal",
+ "SCED1CurvePrice4": "Decimal",
+ "SCED1CurveMW5": "Decimal",
+ "SCED1CurvePrice5": "Decimal",
+ "SCED1CurveMW6": "Decimal",
+ "SCED1CurvePrice6": "Decimal",
+ "SCED1CurveMW7": "Decimal",
+ "SCED1CurvePrice7": "Decimal",
+ "SCED1CurveMW8": "Decimal",
+ "SCED1CurvePrice8": "Decimal",
+ "SCED1CurveMW9": "Decimal",
+ "SCED1CurvePrice9": "Decimal",
+ "SCED1CurveMW10": "Decimal",
+ "SCED1CurvePrice10": "Decimal",
+ "SCED1CurveMW11": "Decimal",
+ "SCED1CurvePrice11": "Decimal",
+ "SCED1CurveMW12": "Decimal",
+ "SCED1CurvePrice12": "Decimal",
+ "SCED1CurveMW13": "Decimal",
+ "SCED1CurvePrice13": "Decimal",
+ "SCED1CurveMW14": "Decimal",
+ "SCED1CurvePrice14": "Decimal",
+ "SCED1CurveMW15": "Decimal",
+ "SCED1CurvePrice15": "Decimal",
+ "SCED1CurveMW16": "Decimal",
+ "SCED1CurvePrice16": "Decimal",
+ "SCED1CurveMW17": "Decimal",
+ "SCED1CurvePrice17": "Decimal",
+ "SCED1CurveMW18": "Decimal",
+ "SCED1CurvePrice18": "Decimal",
+ "SCED1CurveMW19": "Decimal",
+ "SCED1CurvePrice19": "Decimal",
+ "SCED1CurveMW20": "Decimal",
+ "SCED1CurvePrice20": "Decimal",
+ "SCED1CurveMW21": "Decimal",
+ "SCED1CurvePrice21": "Decimal",
+ "SCED1CurveMW22": "Decimal",
+ "SCED1CurvePrice22": "Decimal",
+ "SCED1CurveMW23": "Decimal",
+ "SCED1CurvePrice23": "Decimal",
+ "SCED1CurveMW24": "Decimal",
+ "SCED1CurvePrice24": "Decimal",
+ "SCED1CurveMW25": "Decimal",
+ "SCED1CurvePrice25": "Decimal",
+ "SCED1CurveMW26": "Decimal",
+ "SCED1CurvePrice26": "Decimal",
+ "SCED1CurveMW27": "Decimal",
+ "SCED1CurvePrice27": "Decimal",
+ "SCED1CurveMW28": "Decimal",
+ "SCED1CurvePrice28": "Decimal",
+ "SCED1CurveMW29": "Decimal",
+ "SCED1CurvePrice29": "Decimal",
+ "SCED1CurveMW30": "Decimal",
+ "SCED1CurvePrice30": "Decimal",
+ "SCED1CurveMW31": "Decimal",
+ "SCED1CurvePrice31": "Decimal",
+ "SCED1CurveMW32": "Decimal",
+ "SCED1CurvePrice32": "Decimal",
+ "SCED1CurveMW33": "Decimal",
+ "SCED1CurvePrice33": "Decimal",
+ "SCED1CurveMW34": "Decimal",
+ "SCED1CurvePrice34": "Decimal",
+ "SCED1CurveMW35": "Decimal",
+ "SCED1CurvePrice35": "Decimal",
+ "SCED2CurveMW1": "Decimal",
+ "SCED2CurvePrice1": "Decimal",
+ "SCED2CurveMW2": "Decimal",
+ "SCED2CurvePrice2": "Decimal",
+ "SCED2CurveMW3": "Decimal",
+ "SCED2CurvePrice3": "Decimal",
+ "SCED2CurveMW4": "Decimal",
+ "SCED2CurvePrice4": "Decimal",
+ "SCED2CurveMW5": "Decimal",
+ "SCED2CurvePrice5": "Decimal",
+ "SCED2CurveMW6": "Decimal",
+ "SCED2CurvePrice6": "Decimal",
+ "SCED2CurveMW7": "Decimal",
+ "SCED2CurvePrice7": "Decimal",
+ "SCED2CurveMW8": "Decimal",
+ "SCED2CurvePrice8": "Decimal",
+ "SCED2CurveMW9": "Decimal",
+ "SCED2CurvePrice9": "Decimal",
+ "SCED2CurveMW10": "Decimal",
+ "SCED2CurvePrice10": "Decimal",
+ "SCED2CurveMW11": "Decimal",
+ "SCED2CurvePrice11": "Decimal",
+ "SCED2CurveMW12": "Decimal",
+ "SCED2CurvePrice12": "Decimal",
+ "SCED2CurveMW13": "Decimal",
+ "SCED2CurvePrice13": "Decimal",
+ "SCED2CurveMW14": "Decimal",
+ "SCED2CurvePrice14": "Decimal",
+ "SCED2CurveMW15": "Decimal",
+ "SCED2CurvePrice15": "Decimal",
+ "SCED2CurveMW16": "Decimal",
+ "SCED2CurvePrice16": "Decimal",
+ "SCED2CurveMW17": "Decimal",
+ "SCED2CurvePrice17": "Decimal",
+ "SCED2CurveMW18": "Decimal",
+ "SCED2CurvePrice18": "Decimal",
+ "SCED2CurveMW19": "Decimal",
+ "SCED2CurvePrice19": "Decimal",
+ "SCED2CurveMW20": "Decimal",
+ "SCED2CurvePrice20": "Decimal",
+ "SCED2CurveMW21": "Decimal",
+ "SCED2CurvePrice21": "Decimal",
+ "SCED2CurveMW22": "Decimal",
+ "SCED2CurvePrice22": "Decimal",
+ "SCED2CurveMW23": "Decimal",
+ "SCED2CurvePrice23": "Decimal",
+ "SCED2CurveMW24": "Decimal",
+ "SCED2CurvePrice24": "Decimal",
+ "SCED2CurveMW25": "Decimal",
+ "SCED2CurvePrice25": "Decimal",
+ "SCED2CurveMW26": "Decimal",
+ "SCED2CurvePrice26": "Decimal",
+ "SCED2CurveMW27": "Decimal",
+ "SCED2CurvePrice27": "Decimal",
+ "SCED2CurveMW28": "Decimal",
+ "SCED2CurvePrice28": "Decimal",
+ "SCED2CurveMW29": "Decimal",
+ "SCED2CurvePrice29": "Decimal",
+ "SCED2CurveMW30": "Decimal",
+ "SCED2CurvePrice30": "Decimal",
+ "SCED2CurveMW31": "Decimal",
+ "SCED2CurvePrice31": "Decimal",
+ "SCED2CurveMW32": "Decimal",
+ "SCED2CurvePrice32": "Decimal",
+ "SCED2CurveMW33": "Decimal",
+ "SCED2CurvePrice33": "Decimal",
+ "SCED2CurveMW34": "Decimal",
+ "SCED2CurvePrice34": "Decimal",
+ "SCED2CurveMW35": "Decimal",
+ "SCED2CurvePrice35": "Decimal",
+ "outputSchedule": "Decimal",
+ "HSL": "Decimal",
+ "HDL": "Decimal",
+ "LSL": "Decimal",
+ "LDL": "Decimal",
+ "telemeteredResourceStatus": "str",
+ "basePoint": "Decimal",
+ "telemeteredNetOutput": "Decimal",
+ "rampRateUp": "Decimal",
+ "rampRateDown": "Decimal",
+ "ASCapREGUP": "Decimal",
+ "ASCapREGDN": "Decimal",
+ "ASCapECRS": "Decimal",
+ "ASCapNSPIN": "Decimal",
+ "ASCapRRSPFR": "Decimal",
+ "ASCapRRSFFR": "Decimal",
+ "ASAwardsNSPIN": "Decimal",
+ "ASAwardsRRSFFR": "Decimal",
+ "ASAwardsRRSPFR": "Decimal",
+ "ASAwardsRRSUFR": "Decimal",
+ "ASAwardsECRS": "Decimal",
+ "ASAwardsREGUP": "Decimal",
+ "ASAwardsREGDN": "Decimal",
+ "bidType": "str",
+ "startUpColdOffer": "Decimal",
+ "startUpHotOffer": "Decimal",
+ "startUpInterOffer": "Decimal",
+ "minGenCost": "Decimal",
+ "submittedTPOMW1": "Decimal",
+ "submittedTPOPrice1": "Decimal",
+ "submittedTPOMW2": "Decimal",
+ "submittedTPOPrice2": "Decimal",
+ "submittedTPOMW3": "Decimal",
+ "submittedTPOPrice3": "Decimal",
+ "submittedTPOMW4": "Decimal",
+ "submittedTPOPrice4": "Decimal",
+ "submittedTPOMW5": "Decimal",
+ "submittedTPOPrice5": "Decimal",
+ "submittedTPOMW6": "Decimal",
+ "submittedTPOPrice6": "Decimal",
+ "submittedTPOMW7": "Decimal",
+ "submittedTPOPrice7": "Decimal",
+ "submittedTPOMW8": "Decimal",
+ "submittedTPOPrice8": "Decimal",
+ "submittedTPOMW9": "Decimal",
+ "submittedTPOPrice9": "Decimal",
+ "submittedTPOMW10": "Decimal",
+ "submittedTPOPrice10": "Decimal",
+ "proxyExtension": "str",
+ "HASL": "Decimal",
+ "LASL": "Decimal",
+ "ASREGUP": "Decimal",
+ "ASREGDN": "Decimal",
+ "ASRRS": "Decimal",
+ "ASRRSFFR": "Decimal",
+ "ASNSRS": "Decimal",
+ "ASECRS": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "SCED1 Curve-MW1": "SCED1CurveMW1",
+ "SCED1 Curve-Price1": "SCED1CurvePrice1",
+ "SCED1 Curve-MW2": "SCED1CurveMW2",
+ "SCED1 Curve-Price2": "SCED1CurvePrice2",
+ "SCED1 Curve-MW3": "SCED1CurveMW3",
+ "SCED1 Curve-Price3": "SCED1CurvePrice3",
+ "SCED1 Curve-MW4": "SCED1CurveMW4",
+ "SCED1 Curve-Price4": "SCED1CurvePrice4",
+ "SCED1 Curve-MW5": "SCED1CurveMW5",
+ "SCED1 Curve-Price5": "SCED1CurvePrice5",
+ "SCED1 Curve-MW6": "SCED1CurveMW6",
+ "SCED1 Curve-Price6": "SCED1CurvePrice6",
+ "SCED1 Curve-MW7": "SCED1CurveMW7",
+ "SCED1 Curve-Price7": "SCED1CurvePrice7",
+ "SCED1 Curve-MW8": "SCED1CurveMW8",
+ "SCED1 Curve-Price8": "SCED1CurvePrice8",
+ "SCED1 Curve-MW9": "SCED1CurveMW9",
+ "SCED1 Curve-Price9": "SCED1CurvePrice9",
+ "SCED1 Curve-MW10": "SCED1CurveMW10",
+ "SCED1 Curve-Price10": "SCED1CurvePrice10",
+ "SCED1 Curve-MW11": "SCED1CurveMW11",
+ "SCED1 Curve-Price11": "SCED1CurvePrice11",
+ "SCED1 Curve-MW12": "SCED1CurveMW12",
+ "SCED1 Curve-Price12": "SCED1CurvePrice12",
+ "SCED1 Curve-MW13": "SCED1CurveMW13",
+ "SCED1 Curve-Price13": "SCED1CurvePrice13",
+ "SCED1 Curve-MW14": "SCED1CurveMW14",
+ "SCED1 Curve-Price14": "SCED1CurvePrice14",
+ "SCED1 Curve-MW15": "SCED1CurveMW15",
+ "SCED1 Curve-Price15": "SCED1CurvePrice15",
+ "SCED1 Curve-MW16": "SCED1CurveMW16",
+ "SCED1 Curve-Price16": "SCED1CurvePrice16",
+ "SCED1 Curve-MW17": "SCED1CurveMW17",
+ "SCED1 Curve-Price17": "SCED1CurvePrice17",
+ "SCED1 Curve-MW18": "SCED1CurveMW18",
+ "SCED1 Curve-Price18": "SCED1CurvePrice18",
+ "SCED1 Curve-MW19": "SCED1CurveMW19",
+ "SCED1 Curve-Price19": "SCED1CurvePrice19",
+ "SCED1 Curve-MW20": "SCED1CurveMW20",
+ "SCED1 Curve-Price20": "SCED1CurvePrice20",
+ "SCED1 Curve-MW21": "SCED1CurveMW21",
+ "SCED1 Curve-Price21": "SCED1CurvePrice21",
+ "SCED1 Curve-MW22": "SCED1CurveMW22",
+ "SCED1 Curve-Price22": "SCED1CurvePrice22",
+ "SCED1 Curve-MW23": "SCED1CurveMW23",
+ "SCED1 Curve-Price23": "SCED1CurvePrice23",
+ "SCED1 Curve-MW24": "SCED1CurveMW24",
+ "SCED1 Curve-Price24": "SCED1CurvePrice24",
+ "SCED1 Curve-MW25": "SCED1CurveMW25",
+ "SCED1 Curve-Price25": "SCED1CurvePrice25",
+ "SCED1 Curve-MW26": "SCED1CurveMW26",
+ "SCED1 Curve-Price26": "SCED1CurvePrice26",
+ "SCED1 Curve-MW27": "SCED1CurveMW27",
+ "SCED1 Curve-Price27": "SCED1CurvePrice27",
+ "SCED1 Curve-MW28": "SCED1CurveMW28",
+ "SCED1 Curve-Price28": "SCED1CurvePrice28",
+ "SCED1 Curve-MW29": "SCED1CurveMW29",
+ "SCED1 Curve-Price29": "SCED1CurvePrice29",
+ "SCED1 Curve-MW30": "SCED1CurveMW30",
+ "SCED1 Curve-Price30": "SCED1CurvePrice30",
+ "SCED1 Curve-MW31": "SCED1CurveMW31",
+ "SCED1 Curve-Price31": "SCED1CurvePrice31",
+ "SCED1 Curve-MW32": "SCED1CurveMW32",
+ "SCED1 Curve-Price32": "SCED1CurvePrice32",
+ "SCED1 Curve-MW33": "SCED1CurveMW33",
+ "SCED1 Curve-Price33": "SCED1CurvePrice33",
+ "SCED1 Curve-MW34": "SCED1CurveMW34",
+ "SCED1 Curve-Price34": "SCED1CurvePrice34",
+ "SCED1 Curve-MW35": "SCED1CurveMW35",
+ "SCED1 Curve-Price35": "SCED1CurvePrice35",
+ "SCED2 Curve-MW1": "SCED2CurveMW1",
+ "SCED2 Curve-Price1": "SCED2CurvePrice1",
+ "SCED2 Curve-MW2": "SCED2CurveMW2",
+ "SCED2 Curve-Price2": "SCED2CurvePrice2",
+ "SCED2 Curve-MW3": "SCED2CurveMW3",
+ "SCED2 Curve-Price3": "SCED2CurvePrice3",
+ "SCED2 Curve-MW4": "SCED2CurveMW4",
+ "SCED2 Curve-Price4": "SCED2CurvePrice4",
+ "SCED2 Curve-MW5": "SCED2CurveMW5",
+ "SCED2 Curve-Price5": "SCED2CurvePrice5",
+ "SCED2 Curve-MW6": "SCED2CurveMW6",
+ "SCED2 Curve-Price6": "SCED2CurvePrice6",
+ "SCED2 Curve-MW7": "SCED2CurveMW7",
+ "SCED2 Curve-Price7": "SCED2CurvePrice7",
+ "SCED2 Curve-MW8": "SCED2CurveMW8",
+ "SCED2 Curve-Price8": "SCED2CurvePrice8",
+ "SCED2 Curve-MW9": "SCED2CurveMW9",
+ "SCED2 Curve-Price9": "SCED2CurvePrice9",
+ "SCED2 Curve-MW10": "SCED2CurveMW10",
+ "SCED2 Curve-Price10": "SCED2CurvePrice10",
+ "SCED2 Curve-MW11": "SCED2CurveMW11",
+ "SCED2 Curve-Price11": "SCED2CurvePrice11",
+ "SCED2 Curve-MW12": "SCED2CurveMW12",
+ "SCED2 Curve-Price12": "SCED2CurvePrice12",
+ "SCED2 Curve-MW13": "SCED2CurveMW13",
+ "SCED2 Curve-Price13": "SCED2CurvePrice13",
+ "SCED2 Curve-MW14": "SCED2CurveMW14",
+ "SCED2 Curve-Price14": "SCED2CurvePrice14",
+ "SCED2 Curve-MW15": "SCED2CurveMW15",
+ "SCED2 Curve-Price15": "SCED2CurvePrice15",
+ "SCED2 Curve-MW16": "SCED2CurveMW16",
+ "SCED2 Curve-Price16": "SCED2CurvePrice16",
+ "SCED2 Curve-MW17": "SCED2CurveMW17",
+ "SCED2 Curve-Price17": "SCED2CurvePrice17",
+ "SCED2 Curve-MW18": "SCED2CurveMW18",
+ "SCED2 Curve-Price18": "SCED2CurvePrice18",
+ "SCED2 Curve-MW19": "SCED2CurveMW19",
+ "SCED2 Curve-Price19": "SCED2CurvePrice19",
+ "SCED2 Curve-MW20": "SCED2CurveMW20",
+ "SCED2 Curve-Price20": "SCED2CurvePrice20",
+ "SCED2 Curve-MW21": "SCED2CurveMW21",
+ "SCED2 Curve-Price21": "SCED2CurvePrice21",
+ "SCED2 Curve-MW22": "SCED2CurveMW22",
+ "SCED2 Curve-Price22": "SCED2CurvePrice22",
+ "SCED2 Curve-MW23": "SCED2CurveMW23",
+ "SCED2 Curve-Price23": "SCED2CurvePrice23",
+ "SCED2 Curve-MW24": "SCED2CurveMW24",
+ "SCED2 Curve-Price24": "SCED2CurvePrice24",
+ "SCED2 Curve-MW25": "SCED2CurveMW25",
+ "SCED2 Curve-Price25": "SCED2CurvePrice25",
+ "SCED2 Curve-MW26": "SCED2CurveMW26",
+ "SCED2 Curve-Price26": "SCED2CurvePrice26",
+ "SCED2 Curve-MW27": "SCED2CurveMW27",
+ "SCED2 Curve-Price27": "SCED2CurvePrice27",
+ "SCED2 Curve-MW28": "SCED2CurveMW28",
+ "SCED2 Curve-Price28": "SCED2CurvePrice28",
+ "SCED2 Curve-MW29": "SCED2CurveMW29",
+ "SCED2 Curve-Price29": "SCED2CurvePrice29",
+ "SCED2 Curve-MW30": "SCED2CurveMW30",
+ "SCED2 Curve-Price30": "SCED2CurvePrice30",
+ "SCED2 Curve-MW31": "SCED2CurveMW31",
+ "SCED2 Curve-Price31": "SCED2CurvePrice31",
+ "SCED2 Curve-MW32": "SCED2CurveMW32",
+ "SCED2 Curve-Price32": "SCED2CurvePrice32",
+ "SCED2 Curve-MW33": "SCED2CurveMW33",
+ "SCED2 Curve-Price33": "SCED2CurvePrice33",
+ "SCED2 Curve-MW34": "SCED2CurveMW34",
+ "SCED2 Curve-Price34": "SCED2CurvePrice34",
+ "SCED2 Curve-MW35": "SCED2CurveMW35",
+ "SCED2 Curve-Price35": "SCED2CurvePrice35",
+ "Output Schedule": "outputSchedule",
+ "HSL": "HSL",
+ "HASL": "HASL",
+ "HDL": "HDL",
+ "LSL": "LSL",
+ "LASL": "LASL",
+ "LDL": "LDL",
+ "Telemetered Resource Status": "telemeteredResourceStatus",
+ "Base Point": "basePoint",
+ "Telemetered Net Output ": "telemeteredNetOutput",
+ "Ancillary Service REGUP": "ASREGUP",
+ "Ancillary Service REGDN": "ASREGDN",
+ "Ancillary Service RRS": "ASRRS",
+ "Ancillary Service NSRS": "ASNSRS",
+ "Bid_Type": "bidType",
+ "Start Up Cold Offer": "startUpColdOffer",
+ "Start Up Hot Offer": "startUpHotOffer",
+ "Start Up Inter Offer": "startUpInterOffer",
+ "Min Gen Cost": "minGenCost",
+ "Submitted TPO-MW1": "submittedTPOMW1",
+ "Submitted TPO-Price1": "submittedTPOPrice1",
+ "Submitted TPO-MW2": "submittedTPOMW2",
+ "Submitted TPO-Price2": "submittedTPOPrice2",
+ "Submitted TPO-MW3": "submittedTPOMW3",
+ "Submitted TPO-Price3": "submittedTPOPrice3",
+ "Submitted TPO-MW4": "submittedTPOMW4",
+ "Submitted TPO-Price4": "submittedTPOPrice4",
+ "Submitted TPO-MW5": "submittedTPOMW5",
+ "Submitted TPO-Price5": "submittedTPOPrice5",
+ "Submitted TPO-MW6": "submittedTPOMW6",
+ "Submitted TPO-Price6": "submittedTPOPrice6",
+ "Submitted TPO-MW7": "submittedTPOMW7",
+ "Submitted TPO-Price7": "submittedTPOPrice7",
+ "Submitted TPO-MW8": "submittedTPOMW8",
+ "Submitted TPO-Price8": "submittedTPOPrice8",
+ "Submitted TPO-MW9": "submittedTPOMW9",
+ "Submitted TPO-Price9": "submittedTPOPrice9",
+ "Submitted TPO-MW10": "submittedTPOMW10",
+ "Submitted TPO-Price10": "submittedTPOPrice10",
+ "Proxy Extension": "proxyExtension"
+ },
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "SCED1 Curve-MW1": "SCED1CurveMW1",
+ "SCED1 Curve-Price1": "SCED1CurvePrice1",
+ "SCED1 Curve-MW2": "SCED1CurveMW2",
+ "SCED1 Curve-Price2": "SCED1CurvePrice2",
+ "SCED1 Curve-MW3": "SCED1CurveMW3",
+ "SCED1 Curve-Price3": "SCED1CurvePrice3",
+ "SCED1 Curve-MW4": "SCED1CurveMW4",
+ "SCED1 Curve-Price4": "SCED1CurvePrice4",
+ "SCED1 Curve-MW5": "SCED1CurveMW5",
+ "SCED1 Curve-Price5": "SCED1CurvePrice5",
+ "SCED1 Curve-MW6": "SCED1CurveMW6",
+ "SCED1 Curve-Price6": "SCED1CurvePrice6",
+ "SCED1 Curve-MW7": "SCED1CurveMW7",
+ "SCED1 Curve-Price7": "SCED1CurvePrice7",
+ "SCED1 Curve-MW8": "SCED1CurveMW8",
+ "SCED1 Curve-Price8": "SCED1CurvePrice8",
+ "SCED1 Curve-MW9": "SCED1CurveMW9",
+ "SCED1 Curve-Price9": "SCED1CurvePrice9",
+ "SCED1 Curve-MW10": "SCED1CurveMW10",
+ "SCED1 Curve-Price10": "SCED1CurvePrice10",
+ "SCED1 Curve-MW11": "SCED1CurveMW11",
+ "SCED1 Curve-Price11": "SCED1CurvePrice11",
+ "SCED1 Curve-MW12": "SCED1CurveMW12",
+ "SCED1 Curve-Price12": "SCED1CurvePrice12",
+ "SCED1 Curve-MW13": "SCED1CurveMW13",
+ "SCED1 Curve-Price13": "SCED1CurvePrice13",
+ "SCED1 Curve-MW14": "SCED1CurveMW14",
+ "SCED1 Curve-Price14": "SCED1CurvePrice14",
+ "SCED1 Curve-MW15": "SCED1CurveMW15",
+ "SCED1 Curve-Price15": "SCED1CurvePrice15",
+ "SCED1 Curve-MW16": "SCED1CurveMW16",
+ "SCED1 Curve-Price16": "SCED1CurvePrice16",
+ "SCED1 Curve-MW17": "SCED1CurveMW17",
+ "SCED1 Curve-Price17": "SCED1CurvePrice17",
+ "SCED1 Curve-MW18": "SCED1CurveMW18",
+ "SCED1 Curve-Price18": "SCED1CurvePrice18",
+ "SCED1 Curve-MW19": "SCED1CurveMW19",
+ "SCED1 Curve-Price19": "SCED1CurvePrice19",
+ "SCED1 Curve-MW20": "SCED1CurveMW20",
+ "SCED1 Curve-Price20": "SCED1CurvePrice20",
+ "SCED1 Curve-MW21": "SCED1CurveMW21",
+ "SCED1 Curve-Price21": "SCED1CurvePrice21",
+ "SCED1 Curve-MW22": "SCED1CurveMW22",
+ "SCED1 Curve-Price22": "SCED1CurvePrice22",
+ "SCED1 Curve-MW23": "SCED1CurveMW23",
+ "SCED1 Curve-Price23": "SCED1CurvePrice23",
+ "SCED1 Curve-MW24": "SCED1CurveMW24",
+ "SCED1 Curve-Price24": "SCED1CurvePrice24",
+ "SCED1 Curve-MW25": "SCED1CurveMW25",
+ "SCED1 Curve-Price25": "SCED1CurvePrice25",
+ "SCED1 Curve-MW26": "SCED1CurveMW26",
+ "SCED1 Curve-Price26": "SCED1CurvePrice26",
+ "SCED1 Curve-MW27": "SCED1CurveMW27",
+ "SCED1 Curve-Price27": "SCED1CurvePrice27",
+ "SCED1 Curve-MW28": "SCED1CurveMW28",
+ "SCED1 Curve-Price28": "SCED1CurvePrice28",
+ "SCED1 Curve-MW29": "SCED1CurveMW29",
+ "SCED1 Curve-Price29": "SCED1CurvePrice29",
+ "SCED1 Curve-MW30": "SCED1CurveMW30",
+ "SCED1 Curve-Price30": "SCED1CurvePrice30",
+ "SCED1 Curve-MW31": "SCED1CurveMW31",
+ "SCED1 Curve-Price31": "SCED1CurvePrice31",
+ "SCED1 Curve-MW32": "SCED1CurveMW32",
+ "SCED1 Curve-Price32": "SCED1CurvePrice32",
+ "SCED1 Curve-MW33": "SCED1CurveMW33",
+ "SCED1 Curve-Price33": "SCED1CurvePrice33",
+ "SCED1 Curve-MW34": "SCED1CurveMW34",
+ "SCED1 Curve-Price34": "SCED1CurvePrice34",
+ "SCED1 Curve-MW35": "SCED1CurveMW35",
+ "SCED1 Curve-Price35": "SCED1CurvePrice35",
+ "SCED2 Curve-MW1": "SCED2CurveMW1",
+ "SCED2 Curve-Price1": "SCED2CurvePrice1",
+ "SCED2 Curve-MW2": "SCED2CurveMW2",
+ "SCED2 Curve-Price2": "SCED2CurvePrice2",
+ "SCED2 Curve-MW3": "SCED2CurveMW3",
+ "SCED2 Curve-Price3": "SCED2CurvePrice3",
+ "SCED2 Curve-MW4": "SCED2CurveMW4",
+ "SCED2 Curve-Price4": "SCED2CurvePrice4",
+ "SCED2 Curve-MW5": "SCED2CurveMW5",
+ "SCED2 Curve-Price5": "SCED2CurvePrice5",
+ "SCED2 Curve-MW6": "SCED2CurveMW6",
+ "SCED2 Curve-Price6": "SCED2CurvePrice6",
+ "SCED2 Curve-MW7": "SCED2CurveMW7",
+ "SCED2 Curve-Price7": "SCED2CurvePrice7",
+ "SCED2 Curve-MW8": "SCED2CurveMW8",
+ "SCED2 Curve-Price8": "SCED2CurvePrice8",
+ "SCED2 Curve-MW9": "SCED2CurveMW9",
+ "SCED2 Curve-Price9": "SCED2CurvePrice9",
+ "SCED2 Curve-MW10": "SCED2CurveMW10",
+ "SCED2 Curve-Price10": "SCED2CurvePrice10",
+ "SCED2 Curve-MW11": "SCED2CurveMW11",
+ "SCED2 Curve-Price11": "SCED2CurvePrice11",
+ "SCED2 Curve-MW12": "SCED2CurveMW12",
+ "SCED2 Curve-Price12": "SCED2CurvePrice12",
+ "SCED2 Curve-MW13": "SCED2CurveMW13",
+ "SCED2 Curve-Price13": "SCED2CurvePrice13",
+ "SCED2 Curve-MW14": "SCED2CurveMW14",
+ "SCED2 Curve-Price14": "SCED2CurvePrice14",
+ "SCED2 Curve-MW15": "SCED2CurveMW15",
+ "SCED2 Curve-Price15": "SCED2CurvePrice15",
+ "SCED2 Curve-MW16": "SCED2CurveMW16",
+ "SCED2 Curve-Price16": "SCED2CurvePrice16",
+ "SCED2 Curve-MW17": "SCED2CurveMW17",
+ "SCED2 Curve-Price17": "SCED2CurvePrice17",
+ "SCED2 Curve-MW18": "SCED2CurveMW18",
+ "SCED2 Curve-Price18": "SCED2CurvePrice18",
+ "SCED2 Curve-MW19": "SCED2CurveMW19",
+ "SCED2 Curve-Price19": "SCED2CurvePrice19",
+ "SCED2 Curve-MW20": "SCED2CurveMW20",
+ "SCED2 Curve-Price20": "SCED2CurvePrice20",
+ "SCED2 Curve-MW21": "SCED2CurveMW21",
+ "SCED2 Curve-Price21": "SCED2CurvePrice21",
+ "SCED2 Curve-MW22": "SCED2CurveMW22",
+ "SCED2 Curve-Price22": "SCED2CurvePrice22",
+ "SCED2 Curve-MW23": "SCED2CurveMW23",
+ "SCED2 Curve-Price23": "SCED2CurvePrice23",
+ "SCED2 Curve-MW24": "SCED2CurveMW24",
+ "SCED2 Curve-Price24": "SCED2CurvePrice24",
+ "SCED2 Curve-MW25": "SCED2CurveMW25",
+ "SCED2 Curve-Price25": "SCED2CurvePrice25",
+ "SCED2 Curve-MW26": "SCED2CurveMW26",
+ "SCED2 Curve-Price26": "SCED2CurvePrice26",
+ "SCED2 Curve-MW27": "SCED2CurveMW27",
+ "SCED2 Curve-Price27": "SCED2CurvePrice27",
+ "SCED2 Curve-MW28": "SCED2CurveMW28",
+ "SCED2 Curve-Price28": "SCED2CurvePrice28",
+ "SCED2 Curve-MW29": "SCED2CurveMW29",
+ "SCED2 Curve-Price29": "SCED2CurvePrice29",
+ "SCED2 Curve-MW30": "SCED2CurveMW30",
+ "SCED2 Curve-Price30": "SCED2CurvePrice30",
+ "SCED2 Curve-MW31": "SCED2CurveMW31",
+ "SCED2 Curve-Price31": "SCED2CurvePrice31",
+ "SCED2 Curve-MW32": "SCED2CurveMW32",
+ "SCED2 Curve-Price32": "SCED2CurvePrice32",
+ "SCED2 Curve-MW33": "SCED2CurveMW33",
+ "SCED2 Curve-Price33": "SCED2CurvePrice33",
+ "SCED2 Curve-MW34": "SCED2CurveMW34",
+ "SCED2 Curve-Price34": "SCED2CurvePrice34",
+ "SCED2 Curve-MW35": "SCED2CurveMW35",
+ "SCED2 Curve-Price35": "SCED2CurvePrice35",
+ "Output Schedule": "outputSchedule",
+ "HSL": "HSL",
+ "HASL": "HASL",
+ "HDL": "HDL",
+ "LSL": "LSL",
+ "LASL": "LASL",
+ "LDL": "LDL",
+ "Telemetered Resource Status": "telemeteredResourceStatus",
+ "Base Point": "basePoint",
+ "Telemetered Net Output ": "telemeteredNetOutput",
+ "Ancillary Service REGUP": "ASREGUP",
+ "Ancillary Service REGDN": "ASREGDN",
+ "Ancillary Service RRS": "ASRRS",
+ "Ancillary Service RRSFFR": "ASRRSFFR",
+ "Ancillary Service NSRS": "ASNSRS",
+ "Ancillary Service ECRS": "ASECRS",
+ "Bid_Type": "bidType",
+ "Start Up Cold Offer": "startUpColdOffer",
+ "Start Up Hot Offer": "startUpHotOffer",
+ "Start Up Inter Offer": "startUpInterOffer",
+ "Min Gen Cost": "minGenCost",
+ "Submitted TPO-MW1": "submittedTPOMW1",
+ "Submitted TPO-Price1": "submittedTPOPrice1",
+ "Submitted TPO-MW2": "submittedTPOMW2",
+ "Submitted TPO-Price2": "submittedTPOPrice2",
+ "Submitted TPO-MW3": "submittedTPOMW3",
+ "Submitted TPO-Price3": "submittedTPOPrice3",
+ "Submitted TPO-MW4": "submittedTPOMW4",
+ "Submitted TPO-Price4": "submittedTPOPrice4",
+ "Submitted TPO-MW5": "submittedTPOMW5",
+ "Submitted TPO-Price5": "submittedTPOPrice5",
+ "Submitted TPO-MW6": "submittedTPOMW6",
+ "Submitted TPO-Price6": "submittedTPOPrice6",
+ "Submitted TPO-MW7": "submittedTPOMW7",
+ "Submitted TPO-Price7": "submittedTPOPrice7",
+ "Submitted TPO-MW8": "submittedTPOMW8",
+ "Submitted TPO-Price8": "submittedTPOPrice8",
+ "Submitted TPO-MW9": "submittedTPOMW9",
+ "Submitted TPO-Price9": "submittedTPOPrice9",
+ "Submitted TPO-MW10": "submittedTPOMW10",
+ "Submitted TPO-Price10": "submittedTPOPrice10",
+ "Proxy Extension": "proxyExtension"
+ }
+ ]
+ },
+ "np3-965-er/60_load_res_data_in_sced": {
+ "member": "60d_Load?Resource_Data_in_SCED-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Telemetered Resource Status": "telResStatus",
+ "Max Power Consumption": "maxPowerConsumption",
+ "Low Power Consumption": "lowPowerConsumption",
+ "Real Power Consumption": "realPowerConsumption",
+ "AS Awards NSPIN": "ASAwardsNSPIN",
+ "AS Awards RRSFFR": "ASAwardsRRSFFR",
+ "AS Awards RRSPFR": "ASAwardsRRSPFR",
+ "AS Awards RRSUFR": "ASAwardsRRSUFR",
+ "AS Awards ECRS": "ASAwardsECRS",
+ "AS Awards REGUP": "ASAwardsREGUP",
+ "AS Awards REGDN": "ASAwardsREGDN",
+ "SCED Bid to Buy Curve-MW1": "SCEDBidCurveMW1",
+ "SCED Bid to Buy Curve-Price1": "SCEDBidCurvePrice1",
+ "SCED Bid to Buy Curve-MW2": "SCEDBidCurveMW2",
+ "SCED Bid to Buy Curve-Price2": "SCEDBidCurvePrice2",
+ "SCED Bid to Buy Curve-MW3": "SCEDBidCurveMW3",
+ "SCED Bid to Buy Curve-Price3": "SCEDBidCurvePrice3",
+ "SCED Bid to Buy Curve-MW4": "SCEDBidCurveMW4",
+ "SCED Bid to Buy Curve-Price4": "SCEDBidCurvePrice4",
+ "SCED Bid to Buy Curve-MW5": "SCEDBidCurveMW5",
+ "SCED Bid to Buy Curve-Price5": "SCEDBidCurvePrice5",
+ "SCED Bid to Buy Curve-MW6": "SCEDBidCurveMW6",
+ "SCED Bid to Buy Curve-Price6": "SCEDBidCurvePrice6",
+ "SCED Bid to Buy Curve-MW7": "SCEDBidCurveMW7",
+ "SCED Bid to Buy Curve-Price7": "SCEDBidCurvePrice7",
+ "SCED Bid to Buy Curve-MW8": "SCEDBidCurveMW8",
+ "SCED Bid to Buy Curve-Price8": "SCEDBidCurvePrice8",
+ "SCED Bid to Buy Curve-MW9": "SCEDBidCurveMW9",
+ "SCED Bid to Buy Curve-Price9": "SCEDBidCurvePrice9",
+ "SCED Bid to Buy Curve-MW10": "SCEDBidCurveMW10",
+ "SCED Bid to Buy Curve-Price10": "SCEDBidCurvePrice10",
+ "Self Provided RRSFFR": "selfRRSFFR",
+ "Self Provided RRSUFR": "selfRRSUFR",
+ "Self Provided ECRS": "selfECRS",
+ "Ramp Rate Up": "rampRateUp",
+ "Ramp Rate Down": "rampRateDown",
+ "AS Capability NSPIN": "ASCapNSPIN",
+ "AS Capability ECRS": "ASCapECRS",
+ "AS Capability REGUP": "ASCapREGUP",
+ "AS Capability REGDN": "ASCapREGDN",
+ "AS Capability RRSPFR": "ASCapRRSPFR",
+ "AS Capability RRSFFR": "ASCapRRSFFR",
+ "AS Capability RRSUFR": "ASCapRRSUFR",
+ "HDL": "HDL",
+ "LDL": "LDL",
+ "Base Point": "basePoint"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "telResStatus": "str",
+ "maxPowerConsumption": "Decimal",
+ "lowPowerConsumption": "Decimal",
+ "realPowerConsumption": "Decimal",
+ "ASAwardsNSPIN": "Decimal",
+ "ASAwardsRRSFFR": "Decimal",
+ "ASAwardsRRSPFR": "Decimal",
+ "ASAwardsRRSUFR": "Decimal",
+ "ASAwardsECRS": "Decimal",
+ "ASAwardsREGUP": "Decimal",
+ "ASAwardsREGDN": "Decimal",
+ "SCEDBidCurveMW1": "Decimal",
+ "SCEDBidCurvePrice1": "Decimal",
+ "SCEDBidCurveMW2": "Decimal",
+ "SCEDBidCurvePrice2": "Decimal",
+ "SCEDBidCurveMW3": "Decimal",
+ "SCEDBidCurvePrice3": "Decimal",
+ "SCEDBidCurveMW4": "Decimal",
+ "SCEDBidCurvePrice4": "Decimal",
+ "SCEDBidCurveMW5": "Decimal",
+ "SCEDBidCurvePrice5": "Decimal",
+ "SCEDBidCurveMW6": "Decimal",
+ "SCEDBidCurvePrice6": "Decimal",
+ "SCEDBidCurveMW7": "Decimal",
+ "SCEDBidCurvePrice7": "Decimal",
+ "SCEDBidCurveMW8": "Decimal",
+ "SCEDBidCurvePrice8": "Decimal",
+ "SCEDBidCurveMW9": "Decimal",
+ "SCEDBidCurvePrice9": "Decimal",
+ "SCEDBidCurveMW10": "Decimal",
+ "SCEDBidCurvePrice10": "Decimal",
+ "selfRRSFFR": "Decimal",
+ "selfRRSUFR": "Decimal",
+ "selfECRS": "Decimal",
+ "rampRateUp": "Decimal",
+ "rampRateDown": "Decimal",
+ "ASCapNSPIN": "Decimal",
+ "ASCapECRS": "Decimal",
+ "ASCapREGUP": "Decimal",
+ "ASCapREGDN": "Decimal",
+ "ASCapRRSPFR": "Decimal",
+ "ASCapRRSFFR": "Decimal",
+ "ASCapRRSUFR": "Decimal",
+ "HDL": "Decimal",
+ "LDL": "Decimal",
+ "basePoint": "Decimal",
+ "ASRespForRRS": "Decimal",
+ "ASRespForRRSFFR": "Decimal",
+ "ASRespForNSPIN": "Decimal",
+ "ASRespForREGUP": "Decimal",
+ "ASRespForREGDN": "Decimal",
+ "HASL": "Decimal",
+ "LASL": "Decimal",
+ "ASRespForECRS": "Decimal",
+ "SCEDBidCurveMW11": "Decimal",
+ "SCEDBidCurvePrice11": "Decimal",
+ "SCEDBidCurveMW12": "Decimal",
+ "SCEDBidCurvePrice12": "Decimal",
+ "SCEDBidCurveMW13": "Decimal",
+ "SCEDBidCurvePrice13": "Decimal",
+ "SCEDBidCurveMW14": "Decimal",
+ "SCEDBidCurvePrice14": "Decimal",
+ "SCEDBidCurveMW15": "Decimal",
+ "SCEDBidCurvePrice15": "Decimal",
+ "SCEDBidCurveMW16": "Decimal",
+ "SCEDBidCurvePrice16": "Decimal",
+ "SCEDBidCurveMW17": "Decimal",
+ "SCEDBidCurvePrice17": "Decimal",
+ "SCEDBidCurveMW18": "Decimal",
+ "SCEDBidCurvePrice18": "Decimal",
+ "SCEDBidCurveMW19": "Decimal",
+ "SCEDBidCurvePrice19": "Decimal",
+ "SCEDBidCurveMW20": "Decimal",
+ "SCEDBidCurvePrice20": "Decimal",
+ "SCEDBidCurveMW21": "Decimal",
+ "SCEDBidCurvePrice21": "Decimal",
+ "SCEDBidCurveMW22": "Decimal",
+ "SCEDBidCurvePrice22": "Decimal",
+ "SCEDBidCurveMW23": "Decimal",
+ "SCEDBidCurvePrice23": "Decimal",
+ "SCEDBidCurveMW24": "Decimal",
+ "SCEDBidCurvePrice24": "Decimal",
+ "SCEDBidCurveMW25": "Decimal",
+ "SCEDBidCurvePrice25": "Decimal",
+ "SCEDBidCurveMW26": "Decimal",
+ "SCEDBidCurvePrice26": "Decimal",
+ "SCEDBidCurveMW27": "Decimal",
+ "SCEDBidCurvePrice27": "Decimal",
+ "SCEDBidCurveMW28": "Decimal",
+ "SCEDBidCurvePrice28": "Decimal",
+ "SCEDBidCurveMW29": "Decimal",
+ "SCEDBidCurvePrice29": "Decimal",
+ "SCEDBidCurveMW30": "Decimal",
+ "SCEDBidCurvePrice30": "Decimal",
+ "SCEDBidCurveMW31": "Decimal",
+ "SCEDBidCurvePrice31": "Decimal",
+ "SCEDBidCurveMW32": "Decimal",
+ "SCEDBidCurvePrice32": "Decimal",
+ "SCEDBidCurveMW33": "Decimal",
+ "SCEDBidCurvePrice33": "Decimal",
+ "SCEDBidCurveMW34": "Decimal",
+ "SCEDBidCurvePrice34": "Decimal",
+ "SCEDBidCurveMW35": "Decimal",
+ "SCEDBidCurvePrice35": "Decimal"
+ },
+ "variants": [
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Resource Name": "resourceName",
+ "Telemetered Resource Status": "telResStatus",
+ "Max Power Consumption": "maxPowerConsumption",
+ "Low Power Consumption": "lowPowerConsumption",
+ "Real Power Consumption": "realPowerConsumption",
+ "AS Responsibility for RRS": "ASRespForRRS",
+ "AS Responsibility for NonSpin": "ASRespForNSPIN",
+ "AS Responsibility for RegUp": "ASRespForREGUP",
+ "AS Responsibility for RegDown": "ASRespForREGDN"
+ },
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Resource Name": "resourceName",
+ "Telemetered Resource Status": "telResStatus",
+ "Max Power Consumption": "maxPowerConsumption",
+ "Low Power Consumption": "lowPowerConsumption",
+ "Real Power Consumption": "realPowerConsumption",
+ "AS Responsibility for RRS": "ASRespForRRS",
+ "AS Responsibility for NonSpin": "ASRespForNSPIN",
+ "AS Responsibility for RegUp": "ASRespForREGUP",
+ "AS Responsibility for RegDown": "ASRespForREGDN",
+ "SCED Bid to Buy Curve-MW1": "SCEDBidCurveMW1",
+ "SCED Bid to Buy Curve-Price1": "SCEDBidCurvePrice1",
+ "SCED Bid to Buy Curve-MW2": "SCEDBidCurveMW2",
+ "SCED Bid to Buy Curve-Price2": "SCEDBidCurvePrice2",
+ "SCED Bid to Buy Curve-MW3": "SCEDBidCurveMW3",
+ "SCED Bid to Buy Curve-Price3": "SCEDBidCurvePrice3",
+ "SCED Bid to Buy Curve-MW4": "SCEDBidCurveMW4",
+ "SCED Bid to Buy Curve-Price4": "SCEDBidCurvePrice4",
+ "SCED Bid to Buy Curve-MW5": "SCEDBidCurveMW5",
+ "SCED Bid to Buy Curve-Price5": "SCEDBidCurvePrice5",
+ "SCED Bid to Buy Curve-MW6": "SCEDBidCurveMW6",
+ "SCED Bid to Buy Curve-Price6": "SCEDBidCurvePrice6",
+ "SCED Bid to Buy Curve-MW7": "SCEDBidCurveMW7",
+ "SCED Bid to Buy Curve-Price7": "SCEDBidCurvePrice7",
+ "SCED Bid to Buy Curve-MW8": "SCEDBidCurveMW8",
+ "SCED Bid to Buy Curve-Price8": "SCEDBidCurvePrice8",
+ "SCED Bid to Buy Curve-MW9": "SCEDBidCurveMW9",
+ "SCED Bid to Buy Curve-Price9": "SCEDBidCurvePrice9",
+ "SCED Bid to Buy Curve-MW10": "SCEDBidCurveMW10",
+ "SCED Bid to Buy Curve-Price10": "SCEDBidCurvePrice10",
+ "SCED Bid to Buy Curve-MW11": "SCEDBidCurveMW11",
+ "SCED Bid to Buy Curve-Price11": "SCEDBidCurvePrice11",
+ "SCED Bid to Buy Curve-MW12": "SCEDBidCurveMW12",
+ "SCED Bid to Buy Curve-Price12": "SCEDBidCurvePrice12",
+ "SCED Bid to Buy Curve-MW13": "SCEDBidCurveMW13",
+ "SCED Bid to Buy Curve-Price13": "SCEDBidCurvePrice13",
+ "SCED Bid to Buy Curve-MW14": "SCEDBidCurveMW14",
+ "SCED Bid to Buy Curve-Price14": "SCEDBidCurvePrice14",
+ "SCED Bid to Buy Curve-MW15": "SCEDBidCurveMW15",
+ "SCED Bid to Buy Curve-Price15": "SCEDBidCurvePrice15",
+ "SCED Bid to Buy Curve-MW16": "SCEDBidCurveMW16",
+ "SCED Bid to Buy Curve-Price16": "SCEDBidCurvePrice16",
+ "SCED Bid to Buy Curve-MW17": "SCEDBidCurveMW17",
+ "SCED Bid to Buy Curve-Price17": "SCEDBidCurvePrice17",
+ "SCED Bid to Buy Curve-MW18": "SCEDBidCurveMW18",
+ "SCED Bid to Buy Curve-Price18": "SCEDBidCurvePrice18",
+ "SCED Bid to Buy Curve-MW19": "SCEDBidCurveMW19",
+ "SCED Bid to Buy Curve-Price19": "SCEDBidCurvePrice19",
+ "SCED Bid to Buy Curve-MW20": "SCEDBidCurveMW20",
+ "SCED Bid to Buy Curve-Price20": "SCEDBidCurvePrice20",
+ "SCED Bid to Buy Curve-MW21": "SCEDBidCurveMW21",
+ "SCED Bid to Buy Curve-Price21": "SCEDBidCurvePrice21",
+ "SCED Bid to Buy Curve-MW22": "SCEDBidCurveMW22",
+ "SCED Bid to Buy Curve-Price22": "SCEDBidCurvePrice22",
+ "SCED Bid to Buy Curve-MW23": "SCEDBidCurveMW23",
+ "SCED Bid to Buy Curve-Price23": "SCEDBidCurvePrice23",
+ "SCED Bid to Buy Curve-MW24": "SCEDBidCurveMW24",
+ "SCED Bid to Buy Curve-Price24": "SCEDBidCurvePrice24",
+ "SCED Bid to Buy Curve-MW25": "SCEDBidCurveMW25",
+ "SCED Bid to Buy Curve-Price25": "SCEDBidCurvePrice25",
+ "SCED Bid to Buy Curve-MW26": "SCEDBidCurveMW26",
+ "SCED Bid to Buy Curve-Price26": "SCEDBidCurvePrice26",
+ "SCED Bid to Buy Curve-MW27": "SCEDBidCurveMW27",
+ "SCED Bid to Buy Curve-Price27": "SCEDBidCurvePrice27",
+ "SCED Bid to Buy Curve-MW28": "SCEDBidCurveMW28",
+ "SCED Bid to Buy Curve-Price28": "SCEDBidCurvePrice28",
+ "SCED Bid to Buy Curve-MW29": "SCEDBidCurveMW29",
+ "SCED Bid to Buy Curve-Price29": "SCEDBidCurvePrice29",
+ "SCED Bid to Buy Curve-MW30": "SCEDBidCurveMW30",
+ "SCED Bid to Buy Curve-Price30": "SCEDBidCurvePrice30",
+ "SCED Bid to Buy Curve-MW31": "SCEDBidCurveMW31",
+ "SCED Bid to Buy Curve-Price31": "SCEDBidCurvePrice31",
+ "SCED Bid to Buy Curve-MW32": "SCEDBidCurveMW32",
+ "SCED Bid to Buy Curve-Price32": "SCEDBidCurvePrice32",
+ "SCED Bid to Buy Curve-MW33": "SCEDBidCurveMW33",
+ "SCED Bid to Buy Curve-Price33": "SCEDBidCurvePrice33",
+ "SCED Bid to Buy Curve-MW34": "SCEDBidCurveMW34",
+ "SCED Bid to Buy Curve-Price34": "SCEDBidCurvePrice34",
+ "SCED Bid to Buy Curve-MW35": "SCEDBidCurveMW35",
+ "SCED Bid to Buy Curve-Price35": "SCEDBidCurvePrice35",
+ "HASL": "HASL",
+ "HDL": "HDL",
+ "LASL": "LASL",
+ "LDL": "LDL",
+ "Base Point": "basePoint"
+ },
+ {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Telemetered Resource Status": "telResStatus",
+ "Max Power Consumption": "maxPowerConsumption",
+ "Low Power Consumption": "lowPowerConsumption",
+ "Real Power Consumption": "realPowerConsumption",
+ "AS Responsibility for RRS": "ASRespForRRS",
+ "AS Responsibility for RRSFFR": "ASRespForRRSFFR",
+ "AS Responsibility for NonSpin": "ASRespForNSPIN",
+ "AS Responsibility for RegUp": "ASRespForREGUP",
+ "AS Responsibility for RegDown": "ASRespForREGDN",
+ "AS Responsibility for ECRS": "ASRespForECRS",
+ "SCED Bid to Buy Curve-MW1": "SCEDBidCurveMW1",
+ "SCED Bid to Buy Curve-Price1": "SCEDBidCurvePrice1",
+ "SCED Bid to Buy Curve-MW2": "SCEDBidCurveMW2",
+ "SCED Bid to Buy Curve-Price2": "SCEDBidCurvePrice2",
+ "SCED Bid to Buy Curve-MW3": "SCEDBidCurveMW3",
+ "SCED Bid to Buy Curve-Price3": "SCEDBidCurvePrice3",
+ "SCED Bid to Buy Curve-MW4": "SCEDBidCurveMW4",
+ "SCED Bid to Buy Curve-Price4": "SCEDBidCurvePrice4",
+ "SCED Bid to Buy Curve-MW5": "SCEDBidCurveMW5",
+ "SCED Bid to Buy Curve-Price5": "SCEDBidCurvePrice5",
+ "SCED Bid to Buy Curve-MW6": "SCEDBidCurveMW6",
+ "SCED Bid to Buy Curve-Price6": "SCEDBidCurvePrice6",
+ "SCED Bid to Buy Curve-MW7": "SCEDBidCurveMW7",
+ "SCED Bid to Buy Curve-Price7": "SCEDBidCurvePrice7",
+ "SCED Bid to Buy Curve-MW8": "SCEDBidCurveMW8",
+ "SCED Bid to Buy Curve-Price8": "SCEDBidCurvePrice8",
+ "SCED Bid to Buy Curve-MW9": "SCEDBidCurveMW9",
+ "SCED Bid to Buy Curve-Price9": "SCEDBidCurvePrice9",
+ "SCED Bid to Buy Curve-MW10": "SCEDBidCurveMW10",
+ "SCED Bid to Buy Curve-Price10": "SCEDBidCurvePrice10",
+ "HASL": "HASL",
+ "HDL": "HDL",
+ "LASL": "LASL",
+ "LDL": "LDL",
+ "Base Point": "basePoint"
+ }
+ ]
+ },
+ "np3-965-er/60_hdl_ldl_man_override": {
+ "member": "60d_HDL_LDL_ManOverride-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Participant Name": "participantName",
+ "Resource Name": "resourceName",
+ "HDL Original": "HDLOriginal",
+ "HDL Manual": "HDLManual",
+ "HDL Final": "HDLFinal",
+ "LDL Original": "LDLOriginal",
+ "LDL Manual": "LDLManual",
+ "LDL Final": "LDLFinal",
+ "Reason Code": "reasonCode"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "participantName": "str",
+ "resourceName": "str",
+ "HDLOriginal": "Decimal",
+ "HDLManual": "Decimal",
+ "HDLFinal": "Decimal",
+ "LDLOriginal": "Decimal",
+ "LDLManual": "Decimal",
+ "LDLFinal": "Decimal",
+ "reasonCode": "str"
+ }
+ },
+ "np3-965-er/60_sced_eoc_updates_in_ophour": {
+ "member": "60d_SCED_EOC_Updates_in_OpHour-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Delivery Hour": "deliveryHour",
+ "Resource Name": "resourceName",
+ "Reason": "reason",
+ "Count of Updates During Operating Hour": "opHourUpdates"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "deliveryHour": "int",
+ "resourceName": "str",
+ "reason": "str",
+ "opHourUpdates": "Decimal"
+ }
+ },
+ "np3-965-er/60d_sced_as_cap_man_override": {
+ "member": "60d_AS_Capability_ManOverride-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Start Timestamp": "startTime",
+ "End Timestamp": "endTime",
+ "Participant Name": "participantName",
+ "Resource Name": "resourceName",
+ "AS Type": "ASType",
+ "AS Capability Limit": "ASCapLimit",
+ "Derated Qty": "deratedQty",
+ "Reason Code": "reasonCode"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S",
+ "startTime": "%m/%d/%Y %H:%M:%S",
+ "endTime": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "startTime": "datetime",
+ "endTime": "datetime",
+ "participantName": "str",
+ "resourceName": "str",
+ "ASType": "str",
+ "ASCapLimit": "Decimal",
+ "deratedQty": "Decimal",
+ "reasonCode": "str"
+ }
+ },
+ "np3-965-er/60d_sced_esr_data": {
+ "member": "60d_ESR_Data_in_SCED-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE": "qseName",
+ "DME": "dmeName",
+ "Resource Name": "resourceName",
+ "Resource Type": "resourceType",
+ "SCED1 Curve-MW1": "SCED1CurveMW1",
+ "SCED1 Curve-Price1": "SCED1CurvePrice1",
+ "SCED1 Curve-MW2": "SCED1CurveMW2",
+ "SCED1 Curve-Price2": "SCED1CurvePrice2",
+ "SCED1 Curve-MW3": "SCED1CurveMW3",
+ "SCED1 Curve-Price3": "SCED1CurvePrice3",
+ "SCED1 Curve-MW4": "SCED1CurveMW4",
+ "SCED1 Curve-Price4": "SCED1CurvePrice4",
+ "SCED1 Curve-MW5": "SCED1CurveMW5",
+ "SCED1 Curve-Price5": "SCED1CurvePrice5",
+ "SCED1 Curve-MW6": "SCED1CurveMW6",
+ "SCED1 Curve-Price6": "SCED1CurvePrice6",
+ "SCED1 Curve-MW7": "SCED1CurveMW7",
+ "SCED1 Curve-Price7": "SCED1CurvePrice7",
+ "SCED1 Curve-MW8": "SCED1CurveMW8",
+ "SCED1 Curve-Price8": "SCED1CurvePrice8",
+ "SCED1 Curve-MW9": "SCED1CurveMW9",
+ "SCED1 Curve-Price9": "SCED1CurvePrice9",
+ "SCED1 Curve-MW10": "SCED1CurveMW10",
+ "SCED1 Curve-Price10": "SCED1CurvePrice10",
+ "SCED1 Curve-MW11": "SCED1CurveMW11",
+ "SCED1 Curve-Price11": "SCED1CurvePrice11",
+ "SCED1 Curve-MW12": "SCED1CurveMW12",
+ "SCED1 Curve-Price12": "SCED1CurvePrice12",
+ "SCED1 Curve-MW13": "SCED1CurveMW13",
+ "SCED1 Curve-Price13": "SCED1CurvePrice13",
+ "SCED1 Curve-MW14": "SCED1CurveMW14",
+ "SCED1 Curve-Price14": "SCED1CurvePrice14",
+ "SCED1 Curve-MW15": "SCED1CurveMW15",
+ "SCED1 Curve-Price15": "SCED1CurvePrice15",
+ "SCED1 Curve-MW16": "SCED1CurveMW16",
+ "SCED1 Curve-Price16": "SCED1CurvePrice16",
+ "SCED1 Curve-MW17": "SCED1CurveMW17",
+ "SCED1 Curve-Price17": "SCED1CurvePrice17",
+ "SCED1 Curve-MW18": "SCED1CurveMW18",
+ "SCED1 Curve-Price18": "SCED1CurvePrice18",
+ "SCED1 Curve-MW19": "SCED1CurveMW19",
+ "SCED1 Curve-Price19": "SCED1CurvePrice19",
+ "SCED1 Curve-MW20": "SCED1CurveMW20",
+ "SCED1 Curve-Price20": "SCED1CurvePrice20",
+ "SCED1 Curve-MW21": "SCED1CurveMW21",
+ "SCED1 Curve-Price21": "SCED1CurvePrice21",
+ "SCED1 Curve-MW22": "SCED1CurveMW22",
+ "SCED1 Curve-Price22": "SCED1CurvePrice22",
+ "SCED1 Curve-MW23": "SCED1CurveMW23",
+ "SCED1 Curve-Price23": "SCED1CurvePrice23",
+ "SCED1 Curve-MW24": "SCED1CurveMW24",
+ "SCED1 Curve-Price24": "SCED1CurvePrice24",
+ "SCED1 Curve-MW25": "SCED1CurveMW25",
+ "SCED1 Curve-Price25": "SCED1CurvePrice25",
+ "SCED1 Curve-MW26": "SCED1CurveMW26",
+ "SCED1 Curve-Price26": "SCED1CurvePrice26",
+ "SCED1 Curve-MW27": "SCED1CurveMW27",
+ "SCED1 Curve-Price27": "SCED1CurvePrice27",
+ "SCED1 Curve-MW28": "SCED1CurveMW28",
+ "SCED1 Curve-Price28": "SCED1CurvePrice28",
+ "SCED1 Curve-MW29": "SCED1CurveMW29",
+ "SCED1 Curve-Price29": "SCED1CurvePrice29",
+ "SCED1 Curve-MW30": "SCED1CurveMW30",
+ "SCED1 Curve-Price30": "SCED1CurvePrice30",
+ "SCED1 Curve-MW31": "SCED1CurveMW31",
+ "SCED1 Curve-Price31": "SCED1CurvePrice31",
+ "SCED1 Curve-MW32": "SCED1CurveMW32",
+ "SCED1 Curve-Price32": "SCED1CurvePrice32",
+ "SCED1 Curve-MW33": "SCED1CurveMW33",
+ "SCED1 Curve-Price33": "SCED1CurvePrice33",
+ "SCED1 Curve-MW34": "SCED1CurveMW34",
+ "SCED1 Curve-Price34": "SCED1CurvePrice34",
+ "SCED1 Curve-MW35": "SCED1CurveMW35",
+ "SCED1 Curve-Price35": "SCED1CurvePrice35",
+ "SCED2 Curve-MW1": "SCED2CurveMW1",
+ "SCED2 Curve-Price1": "SCED2CurvePrice1",
+ "SCED2 Curve-MW2": "SCED2CurveMW2",
+ "SCED2 Curve-Price2": "SCED2CurvePrice2",
+ "SCED2 Curve-MW3": "SCED2CurveMW3",
+ "SCED2 Curve-Price3": "SCED2CurvePrice3",
+ "SCED2 Curve-MW4": "SCED2CurveMW4",
+ "SCED2 Curve-Price4": "SCED2CurvePrice4",
+ "SCED2 Curve-MW5": "SCED2CurveMW5",
+ "SCED2 Curve-Price5": "SCED2CurvePrice5",
+ "SCED2 Curve-MW6": "SCED2CurveMW6",
+ "SCED2 Curve-Price6": "SCED2CurvePrice6",
+ "SCED2 Curve-MW7": "SCED2CurveMW7",
+ "SCED2 Curve-Price7": "SCED2CurvePrice7",
+ "SCED2 Curve-MW8": "SCED2CurveMW8",
+ "SCED2 Curve-Price8": "SCED2CurvePrice8",
+ "SCED2 Curve-MW9": "SCED2CurveMW9",
+ "SCED2 Curve-Price9": "SCED2CurvePrice9",
+ "SCED2 Curve-MW10": "SCED2CurveMW10",
+ "SCED2 Curve-Price10": "SCED2CurvePrice10",
+ "SCED2 Curve-MW11": "SCED2CurveMW11",
+ "SCED2 Curve-Price11": "SCED2CurvePrice11",
+ "SCED2 Curve-MW12": "SCED2CurveMW12",
+ "SCED2 Curve-Price12": "SCED2CurvePrice12",
+ "SCED2 Curve-MW13": "SCED2CurveMW13",
+ "SCED2 Curve-Price13": "SCED2CurvePrice13",
+ "SCED2 Curve-MW14": "SCED2CurveMW14",
+ "SCED2 Curve-Price14": "SCED2CurvePrice14",
+ "SCED2 Curve-MW15": "SCED2CurveMW15",
+ "SCED2 Curve-Price15": "SCED2CurvePrice15",
+ "SCED2 Curve-MW16": "SCED2CurveMW16",
+ "SCED2 Curve-Price16": "SCED2CurvePrice16",
+ "SCED2 Curve-MW17": "SCED2CurveMW17",
+ "SCED2 Curve-Price17": "SCED2CurvePrice17",
+ "SCED2 Curve-MW18": "SCED2CurveMW18",
+ "SCED2 Curve-Price18": "SCED2CurvePrice18",
+ "SCED2 Curve-MW19": "SCED2CurveMW19",
+ "SCED2 Curve-Price19": "SCED2CurvePrice19",
+ "SCED2 Curve-MW20": "SCED2CurveMW20",
+ "SCED2 Curve-Price20": "SCED2CurvePrice20",
+ "SCED2 Curve-MW21": "SCED2CurveMW21",
+ "SCED2 Curve-Price21": "SCED2CurvePrice21",
+ "SCED2 Curve-MW22": "SCED2CurveMW22",
+ "SCED2 Curve-Price22": "SCED2CurvePrice22",
+ "SCED2 Curve-MW23": "SCED2CurveMW23",
+ "SCED2 Curve-Price23": "SCED2CurvePrice23",
+ "SCED2 Curve-MW24": "SCED2CurveMW24",
+ "SCED2 Curve-Price24": "SCED2CurvePrice24",
+ "SCED2 Curve-MW25": "SCED2CurveMW25",
+ "SCED2 Curve-Price25": "SCED2CurvePrice25",
+ "SCED2 Curve-MW26": "SCED2CurveMW26",
+ "SCED2 Curve-Price26": "SCED2CurvePrice26",
+ "SCED2 Curve-MW27": "SCED2CurveMW27",
+ "SCED2 Curve-Price27": "SCED2CurvePrice27",
+ "SCED2 Curve-MW28": "SCED2CurveMW28",
+ "SCED2 Curve-Price28": "SCED2CurvePrice28",
+ "SCED2 Curve-MW29": "SCED2CurveMW29",
+ "SCED2 Curve-Price29": "SCED2CurvePrice29",
+ "SCED2 Curve-MW30": "SCED2CurveMW30",
+ "SCED2 Curve-Price30": "SCED2CurvePrice30",
+ "SCED2 Curve-MW31": "SCED2CurveMW31",
+ "SCED2 Curve-Price31": "SCED2CurvePrice31",
+ "SCED2 Curve-MW32": "SCED2CurveMW32",
+ "SCED2 Curve-Price32": "SCED2CurvePrice32",
+ "SCED2 Curve-MW33": "SCED2CurveMW33",
+ "SCED2 Curve-Price33": "SCED2CurvePrice33",
+ "SCED2 Curve-MW34": "SCED2CurveMW34",
+ "SCED2 Curve-Price34": "SCED2CurvePrice34",
+ "SCED2 Curve-MW35": "SCED2CurveMW35",
+ "SCED2 Curve-Price35": "SCED2CurvePrice35",
+ "Output Schedule": "outputSchedule",
+ "HSL": "HSL",
+ "HDL": "HDL",
+ "LSL": "LSL",
+ "LDL": "LDL",
+ "Telemetered Resource Status": "telemeteredResourceStatus",
+ "Base Point": "basePoint",
+ "Telemetered Net Output": "telemeteredNetOutput",
+ "Ramp Rate Up": "rampRateUp",
+ "Ramp Rate Down": "rampRateDown",
+ "AS Capability REGUP": "ASCapREGUP",
+ "AS Capability REGDN": "ASCapREGDN",
+ "AS Capability ECRS": "ASCapECRS",
+ "AS Capability NSPIN": "ASCapNSPIN",
+ "AS Capability RRSPFR": "ASCapRRSPFR",
+ "AS Capability RRSFFR": "ASCapRRSFFR",
+ "State of Charge": "SOC",
+ "Minimum SOC": "minSOC",
+ "Maximum SOC": "maxSOC",
+ "AS Awards NSPIN": "ASAwardsNSPIN",
+ "AS Awards RRSFFR": "ASAwardsRRSFFR",
+ "AS Awards RRSPFR": "ASAwardsRRSPFR",
+ "AS Awards RRSUFR": "ASAwardsRRSUFR",
+ "AS Awards ECRS": "ASAwardsECRS",
+ "AS Awards REGUP": "ASAwardsREGUP",
+ "AS Awards REGDN": "ASAwardsREGDN",
+ "Bid_Type": "bidType",
+ "Start Up Cold Offer": "startUpColdOffer",
+ "Start Up Hot Offer": "startUpHotOffer",
+ "Start Up Inter Offer": "startUpInterOffer",
+ "Min Gen Cost": "minGenCost",
+ "Submitted TPO-MW1": "submittedTPOMW1",
+ "Submitted TPO-Price1": "submittedTPOPrice1",
+ "Submitted TPO-MW2": "submittedTPOMW2",
+ "Submitted TPO-Price2": "submittedTPOPrice2",
+ "Submitted TPO-MW3": "submittedTPOMW3",
+ "Submitted TPO-Price3": "submittedTPOPrice3",
+ "Submitted TPO-MW4": "submittedTPOMW4",
+ "Submitted TPO-Price4": "submittedTPOPrice4",
+ "Submitted TPO-MW5": "submittedTPOMW5",
+ "Submitted TPO-Price5": "submittedTPOPrice5",
+ "Submitted TPO-MW6": "submittedTPOMW6",
+ "Submitted TPO-Price6": "submittedTPOPrice6",
+ "Submitted TPO-MW7": "submittedTPOMW7",
+ "Submitted TPO-Price7": "submittedTPOPrice7",
+ "Submitted TPO-MW8": "submittedTPOMW8",
+ "Submitted TPO-Price8": "submittedTPOPrice8",
+ "Submitted TPO-MW9": "submittedTPOMW9",
+ "Submitted TPO-Price9": "submittedTPOPrice9",
+ "Submitted TPO-MW10": "submittedTPOMW10",
+ "Submitted TPO-Price10": "submittedTPOPrice10",
+ "Proxy Extension": "proxyExtension"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "qseName": "str",
+ "dmeName": "str",
+ "resourceName": "str",
+ "resourceType": "str",
+ "SCED1CurveMW1": "Decimal",
+ "SCED1CurvePrice1": "Decimal",
+ "SCED1CurveMW2": "Decimal",
+ "SCED1CurvePrice2": "Decimal",
+ "SCED1CurveMW3": "Decimal",
+ "SCED1CurvePrice3": "Decimal",
+ "SCED1CurveMW4": "Decimal",
+ "SCED1CurvePrice4": "Decimal",
+ "SCED1CurveMW5": "Decimal",
+ "SCED1CurvePrice5": "Decimal",
+ "SCED1CurveMW6": "Decimal",
+ "SCED1CurvePrice6": "Decimal",
+ "SCED1CurveMW7": "Decimal",
+ "SCED1CurvePrice7": "Decimal",
+ "SCED1CurveMW8": "Decimal",
+ "SCED1CurvePrice8": "Decimal",
+ "SCED1CurveMW9": "Decimal",
+ "SCED1CurvePrice9": "Decimal",
+ "SCED1CurveMW10": "Decimal",
+ "SCED1CurvePrice10": "Decimal",
+ "SCED1CurveMW11": "Decimal",
+ "SCED1CurvePrice11": "Decimal",
+ "SCED1CurveMW12": "Decimal",
+ "SCED1CurvePrice12": "Decimal",
+ "SCED1CurveMW13": "Decimal",
+ "SCED1CurvePrice13": "Decimal",
+ "SCED1CurveMW14": "Decimal",
+ "SCED1CurvePrice14": "Decimal",
+ "SCED1CurveMW15": "Decimal",
+ "SCED1CurvePrice15": "Decimal",
+ "SCED1CurveMW16": "Decimal",
+ "SCED1CurvePrice16": "Decimal",
+ "SCED1CurveMW17": "Decimal",
+ "SCED1CurvePrice17": "Decimal",
+ "SCED1CurveMW18": "Decimal",
+ "SCED1CurvePrice18": "Decimal",
+ "SCED1CurveMW19": "Decimal",
+ "SCED1CurvePrice19": "Decimal",
+ "SCED1CurveMW20": "Decimal",
+ "SCED1CurvePrice20": "Decimal",
+ "SCED1CurveMW21": "Decimal",
+ "SCED1CurvePrice21": "Decimal",
+ "SCED1CurveMW22": "Decimal",
+ "SCED1CurvePrice22": "Decimal",
+ "SCED1CurveMW23": "Decimal",
+ "SCED1CurvePrice23": "Decimal",
+ "SCED1CurveMW24": "Decimal",
+ "SCED1CurvePrice24": "Decimal",
+ "SCED1CurveMW25": "Decimal",
+ "SCED1CurvePrice25": "Decimal",
+ "SCED1CurveMW26": "Decimal",
+ "SCED1CurvePrice26": "Decimal",
+ "SCED1CurveMW27": "Decimal",
+ "SCED1CurvePrice27": "Decimal",
+ "SCED1CurveMW28": "Decimal",
+ "SCED1CurvePrice28": "Decimal",
+ "SCED1CurveMW29": "Decimal",
+ "SCED1CurvePrice29": "Decimal",
+ "SCED1CurveMW30": "Decimal",
+ "SCED1CurvePrice30": "Decimal",
+ "SCED1CurveMW31": "Decimal",
+ "SCED1CurvePrice31": "Decimal",
+ "SCED1CurveMW32": "Decimal",
+ "SCED1CurvePrice32": "Decimal",
+ "SCED1CurveMW33": "Decimal",
+ "SCED1CurvePrice33": "Decimal",
+ "SCED1CurveMW34": "Decimal",
+ "SCED1CurvePrice34": "Decimal",
+ "SCED1CurveMW35": "Decimal",
+ "SCED1CurvePrice35": "Decimal",
+ "SCED2CurveMW1": "Decimal",
+ "SCED2CurvePrice1": "Decimal",
+ "SCED2CurveMW2": "Decimal",
+ "SCED2CurvePrice2": "Decimal",
+ "SCED2CurveMW3": "Decimal",
+ "SCED2CurvePrice3": "Decimal",
+ "SCED2CurveMW4": "Decimal",
+ "SCED2CurvePrice4": "Decimal",
+ "SCED2CurveMW5": "Decimal",
+ "SCED2CurvePrice5": "Decimal",
+ "SCED2CurveMW6": "Decimal",
+ "SCED2CurvePrice6": "Decimal",
+ "SCED2CurveMW7": "Decimal",
+ "SCED2CurvePrice7": "Decimal",
+ "SCED2CurveMW8": "Decimal",
+ "SCED2CurvePrice8": "Decimal",
+ "SCED2CurveMW9": "Decimal",
+ "SCED2CurvePrice9": "Decimal",
+ "SCED2CurveMW10": "Decimal",
+ "SCED2CurvePrice10": "Decimal",
+ "SCED2CurveMW11": "Decimal",
+ "SCED2CurvePrice11": "Decimal",
+ "SCED2CurveMW12": "Decimal",
+ "SCED2CurvePrice12": "Decimal",
+ "SCED2CurveMW13": "Decimal",
+ "SCED2CurvePrice13": "Decimal",
+ "SCED2CurveMW14": "Decimal",
+ "SCED2CurvePrice14": "Decimal",
+ "SCED2CurveMW15": "Decimal",
+ "SCED2CurvePrice15": "Decimal",
+ "SCED2CurveMW16": "Decimal",
+ "SCED2CurvePrice16": "Decimal",
+ "SCED2CurveMW17": "Decimal",
+ "SCED2CurvePrice17": "Decimal",
+ "SCED2CurveMW18": "Decimal",
+ "SCED2CurvePrice18": "Decimal",
+ "SCED2CurveMW19": "Decimal",
+ "SCED2CurvePrice19": "Decimal",
+ "SCED2CurveMW20": "Decimal",
+ "SCED2CurvePrice20": "Decimal",
+ "SCED2CurveMW21": "Decimal",
+ "SCED2CurvePrice21": "Decimal",
+ "SCED2CurveMW22": "Decimal",
+ "SCED2CurvePrice22": "Decimal",
+ "SCED2CurveMW23": "Decimal",
+ "SCED2CurvePrice23": "Decimal",
+ "SCED2CurveMW24": "Decimal",
+ "SCED2CurvePrice24": "Decimal",
+ "SCED2CurveMW25": "Decimal",
+ "SCED2CurvePrice25": "Decimal",
+ "SCED2CurveMW26": "Decimal",
+ "SCED2CurvePrice26": "Decimal",
+ "SCED2CurveMW27": "Decimal",
+ "SCED2CurvePrice27": "Decimal",
+ "SCED2CurveMW28": "Decimal",
+ "SCED2CurvePrice28": "Decimal",
+ "SCED2CurveMW29": "Decimal",
+ "SCED2CurvePrice29": "Decimal",
+ "SCED2CurveMW30": "Decimal",
+ "SCED2CurvePrice30": "Decimal",
+ "SCED2CurveMW31": "Decimal",
+ "SCED2CurvePrice31": "Decimal",
+ "SCED2CurveMW32": "Decimal",
+ "SCED2CurvePrice32": "Decimal",
+ "SCED2CurveMW33": "Decimal",
+ "SCED2CurvePrice33": "Decimal",
+ "SCED2CurveMW34": "Decimal",
+ "SCED2CurvePrice34": "Decimal",
+ "SCED2CurveMW35": "Decimal",
+ "SCED2CurvePrice35": "Decimal",
+ "outputSchedule": "Decimal",
+ "HSL": "Decimal",
+ "HDL": "Decimal",
+ "LSL": "Decimal",
+ "LDL": "Decimal",
+ "telemeteredResourceStatus": "str",
+ "basePoint": "Decimal",
+ "telemeteredNetOutput": "Decimal",
+ "rampRateUp": "Decimal",
+ "rampRateDown": "Decimal",
+ "ASCapREGUP": "Decimal",
+ "ASCapREGDN": "Decimal",
+ "ASCapECRS": "Decimal",
+ "ASCapNSPIN": "Decimal",
+ "ASCapRRSPFR": "Decimal",
+ "ASCapRRSFFR": "Decimal",
+ "SOC": "Decimal",
+ "minSOC": "Decimal",
+ "maxSOC": "Decimal",
+ "ASAwardsNSPIN": "Decimal",
+ "ASAwardsRRSFFR": "Decimal",
+ "ASAwardsRRSPFR": "Decimal",
+ "ASAwardsRRSUFR": "Decimal",
+ "ASAwardsECRS": "Decimal",
+ "ASAwardsREGUP": "Decimal",
+ "ASAwardsREGDN": "Decimal",
+ "bidType": "str",
+ "startUpColdOffer": "Decimal",
+ "startUpHotOffer": "Decimal",
+ "startUpInterOffer": "Decimal",
+ "minGenCost": "Decimal",
+ "submittedTPOMW1": "Decimal",
+ "submittedTPOPrice1": "Decimal",
+ "submittedTPOMW2": "Decimal",
+ "submittedTPOPrice2": "Decimal",
+ "submittedTPOMW3": "Decimal",
+ "submittedTPOPrice3": "Decimal",
+ "submittedTPOMW4": "Decimal",
+ "submittedTPOPrice4": "Decimal",
+ "submittedTPOMW5": "Decimal",
+ "submittedTPOPrice5": "Decimal",
+ "submittedTPOMW6": "Decimal",
+ "submittedTPOPrice6": "Decimal",
+ "submittedTPOMW7": "Decimal",
+ "submittedTPOPrice7": "Decimal",
+ "submittedTPOMW8": "Decimal",
+ "submittedTPOPrice8": "Decimal",
+ "submittedTPOMW9": "Decimal",
+ "submittedTPOPrice9": "Decimal",
+ "submittedTPOMW10": "Decimal",
+ "submittedTPOPrice10": "Decimal",
+ "proxyExtension": "str"
+ }
+ },
+ "np3-965-er/60d_sced_resource_as_offers": {
+ "member": "60d_SCED_Resource_AS_OFFERS-[0-9]*.csv",
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "Resource Name": "resourceName",
+ "PRICE1_REGUP": "price1REGUP",
+ "PRICE1_REGDN": "price1REGDN",
+ "PRICE1_RRSPFR": "price1RRSPFR",
+ "PRICE1_RRSUFR": "price1RRSUFR",
+ "PRICE1_RRSFFR": "price1RRSFFR",
+ "PRICE1_NSPIN": "price1NSPIN",
+ "PRICE1_ECRS": "price1ECRS",
+ "QUANTITY_MW1": "quantityMW1",
+ "PRICE2_REGUP": "price2REGUP",
+ "PRICE2_REGDN": "price2REGDN",
+ "PRICE2_RRSPFR": "price2RRSPFR",
+ "PRICE2_RRSUFR": "price2RRSUFR",
+ "PRICE2_RRSFFR": "price2RRSFFR",
+ "PRICE2_NSPIN": "price2NSPIN",
+ "PRICE2_ECRS": "price2ECRS",
+ "QUANTITY_MW2": "quantityMW2",
+ "PRICE3_REGUP": "price3REGUP",
+ "PRICE3_REGDN": "price3REGDN",
+ "PRICE3_RRSPFR": "price3RRSPFR",
+ "PRICE3_RRSUFR": "price3RRSUFR",
+ "PRICE3_RRSFFR": "price3RRSFFR",
+ "PRICE3_NSPIN": "price3NSPIN",
+ "PRICE3_ECRS": "price3ECRS",
+ "QUANTITY_MW3": "quantityMW3",
+ "PRICE4_REGUP": "price4REGUP",
+ "PRICE4_REGDN": "price4REGDN",
+ "PRICE4_RRSPFR": "price4RRSPFR",
+ "PRICE4_RRSUFR": "price4RRSUFR",
+ "PRICE4_RRSFFR": "price4RRSFFR",
+ "PRICE4_NSPIN": "price4NSPIN",
+ "PRICE4_ECRS": "price4ECRS",
+ "QUANTITY_MW4": "quantityMW4",
+ "PRICE5_REGUP": "price5REGUP",
+ "PRICE5_REGDN": "price5REGDN",
+ "PRICE5_RRSPFR": "price5RRSPFR",
+ "PRICE5_RRSUFR": "price5RRSUFR",
+ "PRICE5_RRSFFR": "price5RRSFFR",
+ "PRICE5_NSPIN": "price5NSPIN",
+ "PRICE5_ECRS": "price5ECRS",
+ "QUANTITY_MW5": "quantityMW5",
+ "PRICE6_REGUP": "price6REGUP",
+ "PRICE6_REGDN": "price6REGDN",
+ "PRICE6_RRSPFR": "price6RRSPFR",
+ "PRICE6_RRSUFR": "price6RRSUFR",
+ "PRICE6_RRSFFR": "price6RRSFFR",
+ "PRICE6_NSPIN": "price6NSPIN",
+ "PRICE6_ECRS": "price6ECRS",
+ "QUANTITY_MW6": "quantityMW6",
+ "Offer Type": "offerType"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "resourceName": "str",
+ "price1REGUP": "Decimal",
+ "price1REGDN": "Decimal",
+ "price1RRSPFR": "Decimal",
+ "price1RRSUFR": "Decimal",
+ "price1RRSFFR": "Decimal",
+ "price1NSPIN": "Decimal",
+ "price1ECRS": "Decimal",
+ "quantityMW1": "Decimal",
+ "price2REGUP": "Decimal",
+ "price2REGDN": "Decimal",
+ "price2RRSPFR": "Decimal",
+ "price2RRSUFR": "Decimal",
+ "price2RRSFFR": "Decimal",
+ "price2NSPIN": "Decimal",
+ "price2ECRS": "Decimal",
+ "quantityMW2": "Decimal",
+ "price3REGUP": "Decimal",
+ "price3REGDN": "Decimal",
+ "price3RRSPFR": "Decimal",
+ "price3RRSUFR": "Decimal",
+ "price3RRSFFR": "Decimal",
+ "price3NSPIN": "Decimal",
+ "price3ECRS": "Decimal",
+ "quantityMW3": "Decimal",
+ "price4REGUP": "Decimal",
+ "price4REGDN": "Decimal",
+ "price4RRSPFR": "Decimal",
+ "price4RRSUFR": "Decimal",
+ "price4RRSFFR": "Decimal",
+ "price4NSPIN": "Decimal",
+ "price4ECRS": "Decimal",
+ "quantityMW4": "Decimal",
+ "price5REGUP": "Decimal",
+ "price5REGDN": "Decimal",
+ "price5RRSPFR": "Decimal",
+ "price5RRSUFR": "Decimal",
+ "price5RRSFFR": "Decimal",
+ "price5NSPIN": "Decimal",
+ "price5ECRS": "Decimal",
+ "quantityMW5": "Decimal",
+ "price6REGUP": "Decimal",
+ "price6REGDN": "Decimal",
+ "price6RRSPFR": "Decimal",
+ "price6RRSUFR": "Decimal",
+ "price6RRSFFR": "Decimal",
+ "price6NSPIN": "Decimal",
+ "price6ECRS": "Decimal",
+ "quantityMW6": "Decimal",
+ "offerType": "str"
+ }
+ },
+ "np3-965-er/60d_sced_as_offer_updates": {
+ "member": "60d_SCED_AS_Offer_Updates_in_OpPeriod-[0-9]*.csv",
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Delivery Hour": "deliveryHour",
+ "Resource Name": "resourceName",
+ "AS Type": "ASType",
+ "Count of Updates During Operating Period": "opPeriodUpd"
+ },
+ "dates": {
+ "deliveryDate": "%m/%d/%Y"
+ },
+ "datetimes": {},
+ "fields": {
+ "deliveryDate": "date",
+ "deliveryHour": "int",
+ "resourceName": "str",
+ "ASType": "str",
+ "opPeriodUpd": "Decimal"
+ }
+ },
+ "np3-965-er/60_sced_dsr_load_data": {
+ "member": "60d_SCED_DSR_Load_Data-[0-9]*.csv",
+ "columns": {
+ "SCED Time Stamp": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "QSE Name": "qseName",
+ "Total Telemetered DSR Loads": "totalTelemeteredDSRLoads"
+ },
+ "dates": {},
+ "datetimes": {
+ "SCEDTimestamp": "%m/%d/%Y %H:%M:%S"
+ },
+ "fields": {
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "qseName": "str",
+ "totalTelemeteredDSRLoads": "Decimal"
+ }
+ },
+ "np6-792-er/price_adders": {
+ "archive_only": true,
+ "sheets": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "columns": {
+ " SCED Timestamp ": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "System Lamda": "systemLambda",
+ "RTRDPA": "RTRDPA",
+ "RTRDPARUS": "RTRDPARUS",
+ "RTRDPARDS": "RTRDPARDS",
+ "RTRDPARRS": "RTRDPARRS",
+ "RTRDPAECRS": "RTRDPAECRS",
+ "RTRDPANSS": "RTRDPANSS",
+ "RTRRUC": "RTRRUC",
+ "RTRRMR": "RTRRMR",
+ "RTDNCLR": "RTDNCLR",
+ "RTDERS": "RTDERS",
+ "RTDCTIEIMPORT": "RTDCTIEIMPORT",
+ "RTDCTIEEXPORT": "RTDCTIEEXPORT",
+ "RTBLTIMPORT": "RTBLTIMPORT",
+ "RTBLTEXPORT": "RTBLTEXPORT",
+ "RTOLLSL": "RTOLLSL",
+ "RTOLHSL": "RTOLHSL",
+ "RTDLL": "RTDLL"
+ },
+ "variants": [
+ {
+ "Batch ID": "batchId",
+ " SCED Timestamp ": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "System Lamda": "systemLambda",
+ "PRC": "PRC",
+ "RTOLCAP": "RTOLCAP",
+ "RTOFFCAP": "RTOFFCAP",
+ "RTORPA": "RTORPA",
+ "RTOFFPA": "RTOFFPA",
+ "RTOLHSL": "RTOLHSL",
+ "RTBP": "RTBP",
+ "RTOLNSRS": "RTOLNSRS",
+ "RTCLRCAP": "RTCLRCAP",
+ "RTCLRBP": "RTCLRBP",
+ "RTCLRLSL": "RTCLRLSL",
+ "RTCLRNS": "RTCLRNS",
+ "RTCLRREG": "RTCLRREG",
+ "RTNCLRRRS": "RTNCLRRRS",
+ "RTCST30HSL": "RTCST30HSL",
+ "RTOFFNSHSL": "RTOFFNSHSL",
+ "RTOFF10": "RTOFF10",
+ "RTOFF30": "RTOFF30",
+ "RTORDPA": "RTORDPA",
+ "RTRRUC": "RTRRUC",
+ "RTRRMR": "RTRRMR",
+ "RTDNCLR": "RTDNCLR",
+ "RTDERS": "RTDERS",
+ "RTOLLASL": "RTOLLASL",
+ "RTOLHASL": "RTOLHASL"
+ },
+ {
+ "Batch ID": "batchId",
+ " SCED Timestamp ": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "System Lamda": "systemLambda",
+ "PRC": "PRC",
+ "RTOLCAP": "RTOLCAP",
+ "RTOFFCAP": "RTOFFCAP",
+ "RTORPA": "RTORPA",
+ "RTOFFPA": "RTOFFPA",
+ "RTOLHSL": "RTOLHSL",
+ "RTBP": "RTBP",
+ "RTOLNSRS": "RTOLNSRS",
+ "RTCLRCAP": "RTCLRCAP",
+ "RTCLRBP": "RTCLRBP",
+ "RTCLRLSL": "RTCLRLSL",
+ "RTCLRNS": "RTCLRNS",
+ "RTCLRREG": "RTCLRREG",
+ "RTNCLRRRS": "RTNCLRRRS",
+ "RTCST30HSL": "RTCST30HSL",
+ "RTOFFNSHSL": "RTOFFNSHSL",
+ "RTRUCCST30HSL": "RTRUCCST30HSL",
+ "RTORDPA": "RTORDPA",
+ "RTRRUC": "RTRRUC",
+ "RTRRMR": "RTRRMR",
+ "RTDNCLR": "RTDNCLR",
+ "RTDERS": "RTDERS",
+ "RTDCTIEIMPORT": "RTDCTIEIMPORT",
+ "RTDCTIEEXPORT": "RTDCTIEEXPORT",
+ "RTBLTIMPORT": "RTBLTIMPORT",
+ "RTBLTEXPORT": "RTBLTEXPORT",
+ "RTOLLASL": "RTOLLASL",
+ "RTOLHASL": "RTOLHASL"
+ },
+ {
+ "Batch ID": "batchId",
+ " SCED Timestamp ": "SCEDTimestamp",
+ "Repeated Hour Flag": "repeatHourFlag",
+ "System Lamda": "systemLambda",
+ "PRC": "PRC",
+ "RTOLCAP": "RTOLCAP",
+ "RTOFFCAP": "RTOFFCAP",
+ "RTORPA": "RTORPA",
+ "RTOFFPA": "RTOFFPA",
+ "RTOLHSL": "RTOLHSL",
+ "RTBP": "RTBP",
+ "RTOLNSRS": "RTOLNSRS",
+ "RTCLRCAP": "RTCLRCAP",
+ "RTCLRBP": "RTCLRBP",
+ "RTCLRLSL": "RTCLRLSL",
+ "RTCLRNS": "RTCLRNS",
+ "RTCLRREG": "RTCLRREG",
+ "RTNCLRRRS": "RTNCLRRRS",
+ "RTCST30HSL": "RTCST30HSL",
+ "RTOFFNSHSL": "RTOFFNSHSL",
+ "RTRUCCST30HSL": "RTRUCCST30HSL",
+ "RTORDPA": "RTORDPA",
+ "RTRRUC": "RTRRUC",
+ "RTRRMR": "RTRRMR",
+ "RTDNCLR": "RTDNCLR",
+ "RTDERS": "RTDERS",
+ "RTDCTIEIMPORT": "RTDCTIEIMPORT",
+ "RTDCTIEEXPORT": "RTDCTIEEXPORT",
+ "RTBLTIMPORT": "RTBLTIMPORT",
+ "RTBLTEXPORT": "RTBLTEXPORT",
+ "RTOLLASL": "RTOLLASL",
+ "RTOLHASL": "RTOLHASL",
+ "RTNCLRNSCAP": "RTNCLRNSCAP"
+ }
+ ],
+ "fields": {
+ "sourceSheet": "str",
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "systemLambda": "Decimal",
+ "RTRDPA": "Decimal",
+ "RTRDPARUS": "Decimal",
+ "RTRDPARDS": "Decimal",
+ "RTRDPARRS": "Decimal",
+ "RTRDPAECRS": "Decimal",
+ "RTRDPANSS": "Decimal",
+ "RTRRUC": "Decimal",
+ "RTRRMR": "Decimal",
+ "RTDNCLR": "Decimal",
+ "RTDERS": "Decimal",
+ "RTDCTIEIMPORT": "Decimal",
+ "RTDCTIEEXPORT": "Decimal",
+ "RTBLTIMPORT": "Decimal",
+ "RTBLTEXPORT": "Decimal",
+ "RTOLLSL": "Decimal",
+ "RTOLHSL": "Decimal",
+ "RTDLL": "Decimal",
+ "batchId": "int",
+ "PRC": "Decimal",
+ "RTOLCAP": "Decimal",
+ "RTOFFCAP": "Decimal",
+ "RTORPA": "Decimal",
+ "RTOFFPA": "Decimal",
+ "RTBP": "Decimal",
+ "RTOLNSRS": "Decimal",
+ "RTCLRCAP": "Decimal",
+ "RTCLRBP": "Decimal",
+ "RTCLRLSL": "Decimal",
+ "RTCLRNS": "Decimal",
+ "RTCLRREG": "Decimal",
+ "RTNCLRRRS": "Decimal",
+ "RTCST30HSL": "Decimal",
+ "RTOFFNSHSL": "Decimal",
+ "RTOFF10": "Decimal",
+ "RTOFF30": "Decimal",
+ "RTORDPA": "Decimal",
+ "RTOLLASL": "Decimal",
+ "RTOLHASL": "Decimal",
+ "RTRUCCST30HSL": "Decimal",
+ "RTNCLRNSCAP": "Decimal"
+ },
+ "dates": {}
+ },
+ "np6-793-er/price_adders": {
+ "archive_only": true,
+ "sheets": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "columns": {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "RTRDPA": "RTRDPA",
+ "RTRDPRU": "RTRDPRU",
+ "RTRDPRD": "RTRDPRD",
+ "RTRDPRRS": "RTRDPRRS",
+ "RTRDPECRS": "RTRDPECRS",
+ "RTRDPNS": "RTRDPNS"
+ },
+ "variants": [
+ {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour ": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "RTRSVPOR": "RTRSVPOR",
+ "RTRSVPOFF": "RTRSVPOFF",
+ "RTRDP": "RTRDP"
+ },
+ {
+ "DeliveryDate": "deliveryDate",
+ " DeliveryHour ": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "RTRSVPOR": "RTRSVPOR",
+ "RTRSVPOFF": "RTRSVPOFF",
+ "RTRDP": "RTRDP"
+ },
+ {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "RTRSVPOR": "RTRSVPOR",
+ "RTRSVPOFF": "RTRSVPOFF",
+ "RTRDP": "RTRDP"
+ },
+ {
+ "DeliveryDate": "deliveryDate",
+ "DeliveryHour ": "deliveryHour",
+ "DeliveryInterval": "deliveryInterval",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "RTRSVPOR": "RTRSVPOR",
+ "RTRSVPOFF": "RTRSVPOFF",
+ "RTRDP": "RTRDP"
+ }
+ ],
+ "fields": {
+ "sourceSheet": "str",
+ "deliveryDate": "date",
+ "deliveryHour": "int",
+ "deliveryInterval": "int",
+ "repeatHourFlag": "bool",
+ "RTRDPA": "Decimal",
+ "RTRDPRU": "Decimal",
+ "RTRDPRD": "Decimal",
+ "RTRDPRRS": "Decimal",
+ "RTRDPECRS": "Decimal",
+ "RTRDPNS": "Decimal",
+ "RTRSVPOR": "Decimal",
+ "RTRSVPOFF": "Decimal",
+ "RTRDP": "Decimal"
+ },
+ "dates": {}
+ },
+ "np6-794-er/capability": {
+ "archive_only": true,
+ "sheets": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "columns": {
+ "SCEDTimestamp": "SCEDTimestamp",
+ "RepeatedHourFlag": "repeatHourFlag",
+ "CapREGUPTotal": "CapREGUPTotal",
+ "CapREGDNTotal": "CapREGDNTotal",
+ "CapRRSTotal": "CapRRSTotal",
+ "CapECRSTotal": "CapECRSTotal",
+ "CapNSPINTotal": "CapNSPINTotal",
+ "CapREGUP_RRSTotal": "CapREGUP_RRSTotal",
+ "CapREGUP_RRS_ECRSTotal": "CapREGUP_RRS_ECRSTotal",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "CapREGUP_RRS_ECRS_NSPINTotal"
+ },
+ "variants": [],
+ "fields": {
+ "sourceSheet": "str",
+ "SCEDTimestamp": "datetime",
+ "repeatHourFlag": "bool",
+ "CapREGUPTotal": "Decimal",
+ "CapREGDNTotal": "Decimal",
+ "CapRRSTotal": "Decimal",
+ "CapECRSTotal": "Decimal",
+ "CapNSPINTotal": "Decimal",
+ "CapREGUP_RRSTotal": "Decimal",
+ "CapREGUP_RRS_ECRSTotal": "Decimal",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "Decimal"
+ },
+ "dates": {}
+ },
+ "np6-795-er/clearing_prices": {
+ "archive_only": true,
+ "sheets": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "columns": {
+ "SCED Timestamp": "SCEDTimestamp",
+ "AS Type": "ASType",
+ "CAPPED_MCPC": "cappedMCPC",
+ "UNCAPPED_MCPC": "uncappedMCPC",
+ "Repeated Hour Flag": "repeatHourFlag"
+ },
+ "variants": [
+ {
+ "SCED Timestamp": "SCEDTimestamp",
+ "AS Type": "ASType",
+ "MCPC": "MCPC",
+ "Repeated Hour Flag": "repeatHourFlag"
+ }
+ ],
+ "fields": {
+ "sourceSheet": "str",
+ "SCEDTimestamp": "datetime",
+ "ASType": "str",
+ "cappedMCPC": "Decimal",
+ "uncappedMCPC": "Decimal",
+ "repeatHourFlag": "bool",
+ "MCPC": "Decimal"
+ },
+ "dates": {}
+ },
+ "np6-796-er/clearing_prices": {
+ "archive_only": true,
+ "sheets": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Delivery Hour": "deliveryHour",
+ "Delivery Interval": "deliveryInterval",
+ "AS Type": "ASType",
+ "MCPC": "MCPC",
+ "Repeated Hour Flag": "repeatHourFlag"
+ },
+ "variants": [],
+ "fields": {
+ "sourceSheet": "str",
+ "deliveryDate": "date",
+ "deliveryHour": "int",
+ "deliveryInterval": "int",
+ "ASType": "str",
+ "MCPC": "Decimal",
+ "repeatHourFlag": "bool"
+ },
+ "dates": {}
+ },
+ "np4-494-er/fuel_cost_submissions": {
+ "archive_only": true,
+ "sheets": [
+ "Exceptional Fuel Cost Data"
+ ],
+ "columns": {
+ "Delivery Date": "deliveryDate",
+ "Delivery Hour": "deliveryHour",
+ "Number of resources with submitted EFC": "resourceCount"
+ },
+ "fields": {
+ "sourceSheet": "str",
+ "deliveryDate": "date",
+ "deliveryHour": "int",
+ "resourceCount": "int"
+ },
+ "dates": {}
+ },
+ "np7-535-sg/path_adders": {
+ "archive_only": true,
+ "member": "*.CSV",
+ "columns": {
+ "TargetDate": "targetDate",
+ "Source": "source",
+ "Sink": "sink",
+ "TimeOfUse": "timeOfUse",
+ "StartDate": "startDate",
+ "ACI99": "ACI99",
+ "ACP": "ACP"
+ },
+ "fields": {
+ "targetDate": "date",
+ "source": "str",
+ "sink": "str",
+ "timeOfUse": "str",
+ "startDate": "date",
+ "ACI99": "Decimal",
+ "ACP": "Decimal"
+ },
+ "dates": {
+ "targetDate": "%m/%d/%Y",
+ "startDate": "%m/%d/%Y"
+ }
+ },
+ "eia-930-cd/hourly_operations": {
+ "archive_only": true,
+ "columns": {
+ "Product_Name": "productName",
+ "Posting_Type": "postingType",
+ "Balancing_Authority_Code": "balancingAuthorityCode",
+ "Data_Type": "dataType",
+ "Data_Code": "dataCode",
+ "Data_Date": "dataDate",
+ "UTC Offset": "UTCOffset",
+ "HR1": "HR1",
+ "HR2": "HR2",
+ "HR3": "HR3",
+ "HR4": "HR4",
+ "HR5": "HR5",
+ "HR6": "HR6",
+ "HR7": "HR7",
+ "HR8": "HR8",
+ "HR9": "HR9",
+ "HR10": "HR10",
+ "HR11": "HR11",
+ "HR12": "HR12",
+ "HR13": "HR13",
+ "HR14": "HR14",
+ "HR15": "HR15",
+ "HR16": "HR16",
+ "HR17": "HR17",
+ "HR18": "HR18",
+ "HR19": "HR19",
+ "HR20": "HR20",
+ "HR21": "HR21",
+ "HR22": "HR22",
+ "HR23": "HR23",
+ "HR24": "HR24",
+ "HR25": "HR25"
+ },
+ "fields": {
+ "productName": "str",
+ "postingType": "str",
+ "balancingAuthorityCode": "str",
+ "dataType": "str",
+ "dataCode": "str",
+ "dataDate": "date",
+ "UTCOffset": "int",
+ "HR1": "EiaHour",
+ "HR2": "EiaHour",
+ "HR3": "EiaHour",
+ "HR4": "EiaHour",
+ "HR5": "EiaHour",
+ "HR6": "EiaHour",
+ "HR7": "EiaHour",
+ "HR8": "EiaHour",
+ "HR9": "EiaHour",
+ "HR10": "EiaHour",
+ "HR11": "EiaHour",
+ "HR12": "EiaHour",
+ "HR13": "EiaHour",
+ "HR14": "EiaHour",
+ "HR15": "EiaHour",
+ "HR16": "EiaHour",
+ "HR17": "EiaHour",
+ "HR18": "EiaHour",
+ "HR19": "EiaHour",
+ "HR20": "EiaHour",
+ "HR21": "EiaHour",
+ "HR22": "EiaHour",
+ "HR23": "EiaHour",
+ "HR24": "EiaHour",
+ "HR25": "EiaHour"
+ },
+ "dates": {
+ "dataDate": "%j%Y"
+ }
+ },
+ "np4-765-er/daily_values": {
+ "archive_only": true,
+ "fields": {
+ "reportDate": "date",
+ "installedDischargeCapacityMW": "Decimal",
+ "totalDischargeCapacityMW": "Decimal",
+ "installedChargeCapacityMW": "Decimal",
+ "totalChargeCapacityMW": "Decimal",
+ "peakLoadMW": "Decimal",
+ "peakLoadHourEnding": "int",
+ "dischargeAtPeakLoadMW": "Decimal",
+ "chargeAtPeakLoadMW": "Decimal",
+ "netOutputAtPeakLoadMW": "Decimal",
+ "maxDischargeMW": "Decimal",
+ "maxDischargeTime": "time",
+ "penetrationAtMaxDischargePercent": "Decimal",
+ "maxChargeMW": "Decimal",
+ "maxChargeTime": "time",
+ "penetrationAtMaxChargePercent": "Decimal",
+ "maxDischargePenetrationPercent": "Decimal",
+ "maxDischargePenetrationTime": "time",
+ "dischargeAtMaxPenetrationMW": "Decimal",
+ "maxChargePenetrationPercent": "Decimal",
+ "maxChargePenetrationTime": "time",
+ "chargeAtMaxPenetrationMW": "Decimal",
+ "sourceNotes": "str"
+ },
+ "columns": {
+ "reportDate": "reportDate",
+ "installedDischargeCapacityMW": "installedDischargeCapacityMW",
+ "totalDischargeCapacityMW": "totalDischargeCapacityMW",
+ "installedChargeCapacityMW": "installedChargeCapacityMW",
+ "totalChargeCapacityMW": "totalChargeCapacityMW",
+ "peakLoadMW": "peakLoadMW",
+ "peakLoadHourEnding": "peakLoadHourEnding",
+ "dischargeAtPeakLoadMW": "dischargeAtPeakLoadMW",
+ "chargeAtPeakLoadMW": "chargeAtPeakLoadMW",
+ "netOutputAtPeakLoadMW": "netOutputAtPeakLoadMW",
+ "maxDischargeMW": "maxDischargeMW",
+ "maxDischargeTime": "maxDischargeTime",
+ "penetrationAtMaxDischargePercent": "penetrationAtMaxDischargePercent",
+ "maxChargeMW": "maxChargeMW",
+ "maxChargeTime": "maxChargeTime",
+ "penetrationAtMaxChargePercent": "penetrationAtMaxChargePercent",
+ "maxDischargePenetrationPercent": "maxDischargePenetrationPercent",
+ "maxDischargePenetrationTime": "maxDischargePenetrationTime",
+ "dischargeAtMaxPenetrationMW": "dischargeAtMaxPenetrationMW",
+ "maxChargePenetrationPercent": "maxChargePenetrationPercent",
+ "maxChargePenetrationTime": "maxChargePenetrationTime",
+ "chargeAtMaxPenetrationMW": "chargeAtMaxPenetrationMW",
+ "sourceNotes": "sourceNotes"
+ },
+ "dates": {},
+ "pdf": {
+ "start": "Current\\s*Daily\\s*Values:",
+ "end": "All\\s*Time\\s*Record\\s*Values:|\\*\\s*Sum",
+ "pattern": "Installed\\s*ESR\\s*Discharge\\s*Capacity\\*\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Total\\s*ESR\\s*Discharge\\s*Capacity\\*\\*\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Installed\\s*ESR\\s*Charge\\s*Capacity\\+\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Total\\s*ESR\\s*Charge\\s*Capacity\\+\\+\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Peak\\s*Load\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Peak\\s*Load\\s*Hour\\s*\\(HE\\)\\s*(?P\\d+)\\s*\\s*ESR\\s*Discharge\\s*at\\s*Peak\\s*Load\\s*Hour\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*ESR\\s*Charge\\s*at\\s*Peak\\s*Load\\s*Hour\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*ESR\\s*Net\\s*Charge/Discharge\\s*at\\s*Peak\\s*Load\\s*Hour\\^\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Discharge\\s*Generation\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Discharge\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*Penetration\\s*at\\s*Max\\s*ESR\\s*Discharge\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Charge\\s*Load\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Charge\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*Penetration\\s*at\\s*Max\\s*ESR\\s*Charge\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Discharge\\s*Penetration\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Discharge\\s*Penetration\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*ESR\\s*Discharge\\s*Generation\\s*at\\s*Max\\s*ESR\\s*Discharge\\s*Penetration\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*Max\\s*ESR\\s*Charge\\s*Penetration\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*Max\\s*ESR\\s*Charge\\s*Penetration\\s*Time\\s*(?P\\d{2}:\\d{2})\\s*\\s*ESR\\s*Charge\\s*Load\\s*at\\s*Max\\s*ESR\\s*Charge\\s*Penetration\\s*Time\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW",
+ "records": false,
+ "notes": true
+ },
+ "datetimes": {}
+ },
+ "np4-765-er/power_records": {
+ "archive_only": true,
+ "fields": {
+ "reportDate": "date",
+ "category": "str",
+ "recordMW": "Decimal",
+ "recordTime": "datetime",
+ "penetrationPercent": "Decimal",
+ "maxSocPercent": "Decimal",
+ "minSocPercent": "Decimal"
+ },
+ "columns": {
+ "reportDate": "reportDate",
+ "category": "category",
+ "recordMW": "recordMW",
+ "recordTime": "recordTime",
+ "penetrationPercent": "penetrationPercent",
+ "maxSocPercent": "maxSocPercent",
+ "minSocPercent": "minSocPercent"
+ },
+ "dates": {},
+ "pdf": {
+ "start": "Record\\s*Max\\s*MW\\s*Record\\s*Max\\s*MW\\s*Time\\s*Penetration\\s*at\\s*Record\\s*Max\\s*MW\\s*Max\\s*SOC\\s*in\\s*Record\\s*Hour\\s*Min\\s*SOC\\s*in\\s*Record\\s*Hour",
+ "end": "Record\\s*Penetration\\s*Record\\s*Penetration\\s*Time\\s*MW\\s*at\\s*Record\\s*Penetration\\s*Time\\s*Max\\s*SOC\\s*in\\s*Record\\s*Hour\\s*Min\\s*SOC\\s*in\\s*Record\\s*Hour",
+ "pattern": "(?PESR Discharge Generation|ESR Charge Load|ESR Injection)\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*(?P\\d{2}/\\d{2}/\\d{4}\\s+\\d{2}:\\d{2})\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%",
+ "records": true,
+ "notes": false
+ },
+ "datetimes": {
+ "recordTime": "%m/%d/%Y %H:%M"
+ }
+ },
+ "np4-765-er/penetration_records": {
+ "archive_only": true,
+ "fields": {
+ "reportDate": "date",
+ "category": "str",
+ "penetrationPercent": "Decimal",
+ "recordTime": "datetime",
+ "recordMW": "Decimal",
+ "maxSocPercent": "Decimal",
+ "minSocPercent": "Decimal"
+ },
+ "columns": {
+ "reportDate": "reportDate",
+ "category": "category",
+ "penetrationPercent": "penetrationPercent",
+ "recordTime": "recordTime",
+ "recordMW": "recordMW",
+ "maxSocPercent": "maxSocPercent",
+ "minSocPercent": "minSocPercent"
+ },
+ "dates": {},
+ "pdf": {
+ "start": "Record\\s*Penetration\\s*Record\\s*Penetration\\s*Time\\s*MW\\s*at\\s*Record\\s*Penetration\\s*Time\\s*Max\\s*SOC\\s*in\\s*Record\\s*Hour\\s*Min\\s*SOC\\s*in\\s*Record\\s*Hour",
+ "end": "Record\\s*SOC\\s*Delta\\s*Record\\s*SOC\\s*Delta\\s*Time",
+ "pattern": "(?PESR Discharge Generation|ESR Charge Load)\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P\\d{2}/\\d{2}/\\d{4}\\s+\\d{2}:\\d{2})\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MW\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*%",
+ "records": true,
+ "notes": false
+ },
+ "datetimes": {
+ "recordTime": "%m/%d/%Y %H:%M"
+ }
+ },
+ "np4-765-er/soc_records": {
+ "archive_only": true,
+ "fields": {
+ "reportDate": "date",
+ "category": "str",
+ "recordMWh": "Decimal",
+ "recordTime": "datetime"
+ },
+ "columns": {
+ "reportDate": "reportDate",
+ "category": "category",
+ "recordMWh": "recordMWh",
+ "recordTime": "recordTime"
+ },
+ "dates": {},
+ "pdf": {
+ "start": "Record\\s*SOC\\s*Delta\\s*Record\\s*SOC\\s*Delta\\s*Time",
+ "end": "\\*\\s*Sum",
+ "pattern": "(?PESR SOC Hourly Increase|ESR SOC Hourly Decrease)\\s*(?P-?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?)\\s*MWh\\s*(?P\\d{2}/\\d{2}/\\d{4}\\s+\\d{2}:\\d{2})",
+ "records": true,
+ "notes": false
+ },
+ "datetimes": {
+ "recordTime": "%m/%d/%Y %H:%M"
+ }
+ },
+ "np4-765-er/hourly_percentages": {
+ "archive_only": true,
+ "fields": {
+ "reportDate": "date",
+ "hourEnding": "str",
+ "dischargeCapacityPercent": "Decimal",
+ "chargeCapacityPercent": "Decimal",
+ "netLoadPercent": "Decimal"
+ },
+ "columns": {
+ "reportDate": "reportDate",
+ "hourEnding": "hourEnding",
+ "dischargeCapacityPercent": "dischargeCapacityPercent",
+ "chargeCapacityPercent": "chargeCapacityPercent",
+ "netLoadPercent": "netLoadPercent"
+ },
+ "dates": {},
+ "charts": {
+ "dischargeCapacityPercent": [
+ 3,
+ "Actual ESR Discharging Output"
+ ],
+ "chargeCapacityPercent": [
+ 3,
+ "Actual ESR Charging Output"
+ ],
+ "netLoadPercent": [
+ 4,
+ "Actual ESR Net Output"
+ ]
+ }
+ }
+}
diff --git a/tools/inputs/history/60_dam_energy_bid_awards-history-current.csv b/tools/inputs/history/60_dam_energy_bid_awards-history-current.csv
new file mode 100644
index 00000000..b3969ba5
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_bid_awards-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point,QSE Name,Energy Only Bid Award in MW,Settlement Point Price,Bid ID
+07/09/2026,1,LZ_HOUSTON,QAFFOR,-54,26.02,ETAFYB3
+07/09/2026,1,LZ_NORTH,QAFFOR,-16,26.03,ETAFYB5
+07/09/2026,1,LZ_SOUTH,QAFFOR,-14,26.8,ETAFYB7
diff --git a/tools/inputs/history/60_dam_energy_bid_awards-history-samples.csv b/tools/inputs/history/60_dam_energy_bid_awards-history-samples.csv
new file mode 100644
index 00000000..73964356
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_bid_awards-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point","QSE Name","Energy Only Bid Award in MW","Settlement Point Price","Bid ID"
+"03/02/2014","1","BYU_BYU_34","QEAGL3","-24","14.93","ETALYN09-335"
+"03/02/2014","1","DC_S","QMACQ1","0","15.79","d15"
+"03/02/2014","1","DDPEC_GT4","QCALP","-170","14.93","000016"
diff --git a/tools/inputs/history/60_dam_energy_bids-history-current.csv b/tools/inputs/history/60_dam_energy_bids-history-current.csv
new file mode 100644
index 00000000..86847927
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_bids-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point,QSE Name,Energy Only Bid MW1,Energy Only Bid Price1,Energy Only Bid MW2,Energy Only Bid Price2,Energy Only Bid MW3,Energy Only Bid Price3,Energy Only Bid MW4,Energy Only Bid Price4,Energy Only Bid MW5,Energy Only Bid Price5,Energy Only Bid MW6,Energy Only Bid Price6,Energy Only Bid MW7,Energy Only Bid Price7,Energy Only Bid MW8,Energy Only Bid Price8,Energy Only Bid MW9,Energy Only Bid Price9,Energy Only Bid MW10,Energy Only Bid Price10,Energy Only Bid ID,Multi-Hour Block Indicator,Block/Curve indicator
+07/09/2026,1,LZ_HOUSTON,QAFFOR,54,43.13,,,,,,,,,,,,,,,,,,,ETAFYB3,N,V
+07/09/2026,1,LZ_NORTH,QAFFOR,16,42.55,,,,,,,,,,,,,,,,,,,ETAFYB5,N,V
+07/09/2026,1,LZ_SOUTH,QAFFOR,14,43.34,,,,,,,,,,,,,,,,,,,ETAFYB7,N,V
diff --git a/tools/inputs/history/60_dam_energy_bids-history-samples.csv b/tools/inputs/history/60_dam_energy_bids-history-samples.csv
new file mode 100644
index 00000000..8d30ef3c
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_bids-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point","QSE Name","Energy Only Bid MW1","Energy Only Bid Price1","Energy Only Bid MW2","Energy Only Bid Price2","Energy Only Bid MW3","Energy Only Bid Price3","Energy Only Bid MW4","Energy Only Bid Price4","Energy Only Bid MW5","Energy Only Bid Price5","Energy Only Bid MW6","Energy Only Bid Price6","Energy Only Bid MW7","Energy Only Bid Price7","Energy Only Bid MW8","Energy Only Bid Price8","Energy Only Bid MW9","Energy Only Bid Price9","Energy Only Bid MW10","Energy Only Bid Price10","Energy Only Bid ID","Multi-Hour Block Indicator","Block/Curve indicator"
+"03/02/2014","1","BYU_BYU_34","QEAGL3","24","81","","","","","","","","","","","","","","","","","","","ETALYN09-335","N","V"
+"03/02/2014","1","DC_S","QMACQ1","10","-2000.15","","","","","","","","","","","","","","","","","","","d15","N","V"
+"03/02/2014","1","DDPEC_GT4","QCALP","170","100","","","","","","","","","","","","","","","","","","","000016","N","V"
diff --git a/tools/inputs/history/60_dam_energy_only_offer_awards-history-current.csv b/tools/inputs/history/60_dam_energy_only_offer_awards-history-current.csv
new file mode 100644
index 00000000..d4c5410f
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_only_offer_awards-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point,QSE Name,Energy Only Offer Award in MW,Settlement Point Price,Offer ID
+07/09/2026,1,7RNCHSLR_ALL,QCOMI1,.2,26.57,BVXBRVRBJQDP
+07/09/2026,1,ABINDUST_RN,QCOMI1,.2,25.69,KPVZXNND8P88
+07/09/2026,1,AEEC,QCOMI1,.2,23.95,9BB8R8KVNGJ8
diff --git a/tools/inputs/history/60_dam_energy_only_offer_awards-history-samples.csv b/tools/inputs/history/60_dam_energy_only_offer_awards-history-samples.csv
new file mode 100644
index 00000000..293237fa
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_only_offer_awards-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point","QSE Name","Energy Only Offer Award in MW","Settlement Point Price","Offer ID"
+"03/02/2014","1","BASTEN_CCU","QDIRE5","0","14.98","1927"
+"03/02/2014","1","BBSES_UNIT2","QLUMN","0","14.98","486042153"
+"03/02/2014","1","BUFF_GAP_ALL","QDIRE","0","15","2925"
diff --git a/tools/inputs/history/60_dam_energy_only_offers-history-current.csv b/tools/inputs/history/60_dam_energy_only_offers-history-current.csv
new file mode 100644
index 00000000..d15304df
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_only_offers-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point,QSE Name,Energy Only Offer MW1,Energy Only Offer Price1,Energy Only Offer MW2,Energy Only Offer Price2,Energy Only Offer MW3,Energy Only Offer Price3,Energy Only Offer MW4,Energy Only Offer Price4,Energy Only Offer MW5,Energy Only Offer Price5,Energy Only Offer MW6,Energy Only Offer Price6,Energy Only Offer MW7,Energy Only Offer Price7,Energy Only Offer MW8,Energy Only Offer Price8,Energy Only Offer MW9,Energy Only Offer Price9,Energy Only Offer MW10,Energy Only Offer Price10,Energy Only Offer ID,Multi-Hour Block Indicator,Block/Curve indicator
+07/09/2026,1,HB_HOUSTON,QALTRE,5.1,2,,,,,,,,,,,,,,,,,,,uploader,N,C
+07/09/2026,1,HB_WEST,QAMA,2,23.7,5,26.3,,,,,,,,,,,,,,,,,260709HBWESB,N,C
+07/09/2026,1,HB_BUSAVG,QAMPLI,77.7,0,,,,,,,,,,,,,,,,,,,jvNMYLDreA5p,N,V
diff --git a/tools/inputs/history/60_dam_energy_only_offers-history-samples.csv b/tools/inputs/history/60_dam_energy_only_offers-history-samples.csv
new file mode 100644
index 00000000..29552221
--- /dev/null
+++ b/tools/inputs/history/60_dam_energy_only_offers-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point","QSE Name","Energy Only Offer MW1","Energy Only Offer Price1","Energy Only Offer MW2","Energy Only Offer Price2","Energy Only Offer MW3","Energy Only Offer Price3","Energy Only Offer MW4","Energy Only Offer Price4","Energy Only Offer MW5","Energy Only Offer Price5","Energy Only Offer MW6","Energy Only Offer Price6","Energy Only Offer MW7","Energy Only Offer Price7","Energy Only Offer MW8","Energy Only Offer Price8","Energy Only Offer MW9","Energy Only Offer Price9","Energy Only Offer MW10","Energy Only Offer Price10","Energy Only Offer ID","Multi-Hour Block Indicator","Block/Curve indicator"
+"03/02/2014","1","BASTEN_CCU","QDIRE5","250","35","","","","","","","","","","","","","","","","","","","1927","Y","V"
+"03/02/2014","1","BBSES_UNIT2","QLUMN","227.5","27.01","","","","","","","","","","","","","","","","","","","486042153","N","C"
+"03/02/2014","1","BUFF_GAP_ALL","QDIRE","44","18","","","","","","","","","","","","","","","","","","","2925","N","F"
diff --git a/tools/inputs/history/60_dam_gen_res_as_offers-history-current.csv b/tools/inputs/history/60_dam_gen_res_as_offers-history-current.csv
new file mode 100644
index 00000000..c3750bda
--- /dev/null
+++ b/tools/inputs/history/60_dam_gen_res_as_offers-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,DME,Generation Resource Name,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5
+07/09/2026,1,QBTU,YBRYN,ATKINS_ATKINSG7,N,V,,,,,,500,,,,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+07/09/2026,1,QLCRA,YLCRA,AUSTPL_AUSTING2,N,V,,,,,.88,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+07/09/2026,1,QTENSK,YPHR,BAC_CTG1,N,V,,,,,,,,,1.01,55.6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
diff --git a/tools/inputs/history/60_dam_gen_res_as_offers-history-samples.csv b/tools/inputs/history/60_dam_gen_res_as_offers-history-samples.csv
new file mode 100644
index 00000000..721a9ba7
--- /dev/null
+++ b/tools/inputs/history/60_dam_gen_res_as_offers-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Generation Resource Name","Multi-Hour Block Flag","BLOCK INDICATOR1","PRICE1 RRS","PRICE1 ONLINE NONSPIN","PRICE1 REGUP","PRICE1 REGDOWN","PRICE1 OFFLINE NONSPIN","QUANTITY MW1","BLOCK INDICATOR2","PRICE2 RRS","PRICE2 ONLINE NONSPIN","PRICE2 REGUP","PRICE2 REGDOWN","PRICE2 OFFLINE NONSPIN","QUANTITY MW2","BLOCK INDICATOR3","PRICE3 RRS","PRICE3 ONLINE NONSPIN","PRICE3 REGUP","PRICE3 REGDOWN","PRICE3 OFFLINE NONSPIN","QUANTITY MW3","BLOCK INDICATOR4","PRICE4 RRS","PRICE4 ONLINE NONSPIN","PRICE4 REGUP","PRICE4 REGDOWN","PRICE4 OFFLINE NONSPIN","QUANTITY MW4","BLOCK INDICATOR5","PRICE5 RRS","PRICE5 ONLINE NONSPIN","PRICE5 REGUP","PRICE5 REGDOWN","PRICE5 OFFLINE NONSPIN","QUANTITY MW5"
+"03/02/2014","1","AUSTPL_AUSTING1","N","V",".81","","","","","7","","","","","","","","","","","","","","","","","","","","","","","","","","","",""
+"03/02/2014","1","AUSTPL_AUSTING2","N","V",".81","","","","","8","","","","","","","","","","","","","","","","","","","","","","","","","","","",""
+"03/02/2014","1","BASTEN_CC1_2","Y","V","4","","","","","75","","","","","","","","","","","","","","","","","","","","","","","","","","","",""
diff --git a/tools/inputs/history/60_dam_gen_res_data-history-current.csv b/tools/inputs/history/60_dam_gen_res_data-history-current.csv
new file mode 100644
index 00000000..f1b6c5e7
--- /dev/null
+++ b/tools/inputs/history/60_dam_gen_res_data-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,DME,Resource Name,Resource Type,QSE submitted Curve-MW1,QSE submitted Curve-Price1,QSE submitted Curve-MW2,QSE submitted Curve-Price2,QSE submitted Curve-MW3,QSE submitted Curve-Price3,QSE submitted Curve-MW4,QSE submitted Curve-Price4,QSE submitted Curve-MW5,QSE submitted Curve-Price5,QSE submitted Curve-MW6,QSE submitted Curve-Price6,QSE submitted Curve-MW7,QSE submitted Curve-Price7,QSE submitted Curve-MW8,QSE submitted Curve-Price8,QSE submitted Curve-MW9,QSE submitted Curve-Price9,QSE submitted Curve-MW10,QSE submitted Curve-Price10,Start Up Hot,Start Up Inter,Start Up Cold,Min Gen Cost,HSL,LSL,Resource Status,Awarded Quantity,Settlement Point Name,Energy Settlement Point Price,RegUp Awarded,RegUp MCPC,RegDown Awarded,RegDown MCPC,RRSPFR Awarded,RRSFFR Awarded,RRSUFR Awarded,RRS MCPC,ECRSSD Awarded,ECRS MCPC,NonSpin Awarded,NonSpin MCPC
+07/09/2026,1,QSUE66,Y7VSOL,7RNCHSLR_UNIT1,PVGR,,,,,,,,,,,,,,,,,,,,,,,,,0,0,ON,,7RNCHSLR_ALL,26.57,,,,,,,,,,,,
+07/09/2026,1,QSUE66,Y7VSOL,7RNCHSLR_UNIT2,PVGR,,,,,,,,,,,,,,,,,,,,,,,,,0,0,ON,,7RNCHSLR_ALL,26.57,,,,,,,,,,,,
+07/09/2026,1,QSUE66,Y7VSOL,7RNCHSLR_UNIT3,PVGR,,,,,,,,,,,,,,,,,,,,,,,,,0,0,ON,,7RNCHSLR_ALL,26.57,,,,,,,,,,,,
diff --git a/tools/inputs/history/60_dam_gen_res_data-history-samples.csv b/tools/inputs/history/60_dam_gen_res_data-history-samples.csv
new file mode 100644
index 00000000..14d2083f
--- /dev/null
+++ b/tools/inputs/history/60_dam_gen_res_data-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Resource Name","Resource Type","QSE submitted Curve-MW1","QSE submitted Curve-Price1","QSE submitted Curve-MW2","QSE submitted Curve-Price2","QSE submitted Curve-MW3","QSE submitted Curve-Price3","QSE submitted Curve-MW4","QSE submitted Curve-Price4","QSE submitted Curve-MW5","QSE submitted Curve-Price5","QSE submitted Curve-MW6","QSE submitted Curve-Price6","QSE submitted Curve-MW7","QSE submitted Curve-Price7","QSE submitted Curve-MW8","QSE submitted Curve-Price8","QSE submitted Curve-MW9","QSE submitted Curve-Price9","QSE submitted Curve-MW10","QSE submitted Curve-Price10","Start Up Hot","Start Up Inter","Start Up Cold","Min Gen Cost","HSL","LSL","Resource Status","Awarded Quantity","Settlement Point Name","Energy Settlement Point Price","RegUp Awarded","RegUp MCPC","RegDown Awarded","RegDown MCPC","RRS Awarded","RRS MCPC","NonSpin Awarded","NonSpin MCPC"
+"03/02/2014","1","AMISTAD_AMISTAG1","HYDRO","","","","","","","","","","","","","","","","","","","","","","","","","28","10","EMR","","AMISTAD_ALL","15.55","","","","","","","",""
+"03/02/2014","1","AMISTAD_AMISTAG2","HYDRO","","","","","","","","","","","","","","","","","","","","","","","","","27","24","ONEMR","","AMISTAD_ALL","15.55","","","","","","","",""
+"03/02/2014","1","AMOCOOIL_CC1_1","CCGT90","","","","","","","","","","","","","","","","","","","","","","","","","0","0","OFF","","AMOCOOIL_CC1","14.93","","","","","","","",""
diff --git a/tools/inputs/history/60_dam_load_res_as_offers-history-current.csv b/tools/inputs/history/60_dam_load_res_as_offers-history-current.csv
new file mode 100644
index 00000000..a65b7899
--- /dev/null
+++ b/tools/inputs/history/60_dam_load_res_as_offers-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,DME,Load Resource Name,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5,NCLR Flag
+07/09/2026,1,QEDE20,,AAPIPLNC_LD3,N,V,,,0,,,,,,,2.9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+07/09/2026,1,QEDE20,,AAPIPLNC_LD4,N,V,,,0,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+07/09/2026,1,QMP2ME,,ALIQUING_LD5,N,V,,,,.01,,,,,,30.3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
diff --git a/tools/inputs/history/60_dam_load_res_as_offers-history-samples.csv b/tools/inputs/history/60_dam_load_res_as_offers-history-samples.csv
new file mode 100644
index 00000000..074304f8
--- /dev/null
+++ b/tools/inputs/history/60_dam_load_res_as_offers-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Load Resource Name","Multi-Hour Block Flag","BLOCK INDICATOR1","PRICE1 RRS","PRICE1 ONLINE NONSPIN","PRICE1 REGUP","PRICE1 REGDOWN","PRICE1 OFFLINE NONSPIN","QUANTITY MW1","BLOCK INDICATOR2","PRICE2 RRS","PRICE2 ONLINE NONSPIN","PRICE2 REGUP","PRICE2 REGDOWN","PRICE2 OFFLINE NONSPIN","QUANTITY MW2","BLOCK INDICATOR3","PRICE3 RRS","PRICE3 ONLINE NONSPIN","PRICE3 REGUP","PRICE3 REGDOWN","PRICE3 OFFLINE NONSPIN","QUANTITY MW3","BLOCK INDICATOR4","PRICE4 RRS","PRICE4 ONLINE NONSPIN","PRICE4 REGUP","PRICE4 REGDOWN","PRICE4 OFFLINE NONSPIN","QUANTITY MW4","BLOCK INDICATOR5","PRICE5 RRS","PRICE5 ONLINE NONSPIN","PRICE5 REGUP","PRICE5 REGDOWN","PRICE5 OFFLINE NONSPIN","QUANTITY MW5","NCLR Flag"
+"03/02/2014","1","BCPOI_LD1","N","V","0","","","","","3","","","","","","","","","","","","","","","","","","","","","","","","","","","","","N"
+"03/02/2014","1","BLKRV_LD1","N","V","0","","","","","1.5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","N"
+"03/02/2014","1","BRKNR_LD3","N","V","0","","","","","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","N"
diff --git a/tools/inputs/history/60_dam_load_res_data-history-current.csv b/tools/inputs/history/60_dam_load_res_data-history-current.csv
new file mode 100644
index 00000000..2c894857
--- /dev/null
+++ b/tools/inputs/history/60_dam_load_res_data-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Load Resource Name,Max Power Consumption for Load Resource,Low Power Consumption for Load Resource,RegUp Awarded,RegUp MCPC,RegDown Awarded,RegDown MCPC,RRSPFR Awarded,RRSFFR Awarded,RRSUFR Awarded,RRS MCPC,ECRSSD Awarded,ECRSMD Awarded,ECRS MCPC,NonSpin Awarded,NonSpin MCPC
+07/09/2026,1,AAPIPLNC_LD3,24,0,0,.38,0,.49,0,0,2.6,.21,0,0,.3,0,2
+07/09/2026,1,AAPIPLNC_LD4,15,0,0,.38,0,.49,0,0,8,.21,0,0,.3,0,2
+07/09/2026,1,AIRPRTRD_LD1,10,0,,,,,,,,,,,,,
diff --git a/tools/inputs/history/60_dam_load_res_data-history-samples.csv b/tools/inputs/history/60_dam_load_res_data-history-samples.csv
new file mode 100644
index 00000000..be3cf5d7
--- /dev/null
+++ b/tools/inputs/history/60_dam_load_res_data-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Load Resource Name","Max Power Consumption for Load Resource","Low Power Consumption for Load Resource","RegUp Awarded","RegUp MCPC","RegDown Awarded","RegDown MCPC","RRS Awarded","RRS MCPC","NonSpin Awarded","NonSpin MCPC"
+"03/02/2014","1","ACRLY_LD1","2","0","","","","","","","",""
+"03/02/2014","1","ADMDS_LD1","9","0","","","","","","","",""
+"03/02/2014","1","AI_LD2","4","0","0","5","0","33.75","1.5","3","0","1"
diff --git a/tools/inputs/history/60_dam_ptp_obl_bid_awards-history-current.csv b/tools/inputs/history/60_dam_ptp_obl_bid_awards-history-current.csv
new file mode 100644
index 00000000..c1b7850b
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_bid_awards-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE Name,Settlement Point Source,Settlement Point Sink,PtP Bid Award - MW,PtP Bid - Price,Bid ID
+07/09/2026,1,QAEN,EXGNWTL_1,LZ_AEN,2,-.35,PTP2
+07/09/2026,1,QAEN,HB_NORTH,LZ_AEN,150,.34,PTP51
+07/09/2026,1,QAEN,HRFDWIND_ALL,LZ_AEN,11,1.89,PTP6
diff --git a/tools/inputs/history/60_dam_ptp_obl_bid_awards-history-samples.csv b/tools/inputs/history/60_dam_ptp_obl_bid_awards-history-samples.csv
new file mode 100644
index 00000000..54c03d0c
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_bid_awards-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","QSE Name","Settlement Point Source","Settlement Point Sink","PtP Bid Award - MW","PtP Bid - Price","Bid ID"
+"03/02/2014","1","QAEPS3","HB_NORTH","HB_WEST","50",".02","12000"
+"03/02/2014","1","QAEPS3","HB_NORTH","LZ_NORTH","8",".01","11001"
+"03/02/2014","1","QAEPS3","HB_NORTH","LZ_NORTH","11",".01","13007"
diff --git a/tools/inputs/history/60_dam_ptp_obl_bids-history-current.csv b/tools/inputs/history/60_dam_ptp_obl_bids-history-current.csv
new file mode 100644
index 00000000..ee17a8f8
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_bids-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE Name,Settlement Point Source,Settlement Point Sink,PtP Bid - MW,PtP Bid - Price,Bid ID,Multi-Hour Block Indicator
+07/09/2026,1,QAEN,EXGNWTL_1,LZ_AEN,2,50,PTP2,N
+07/09/2026,1,QAEN,HB_NORTH,LZ_AEN,150,200,PTP51,N
+07/09/2026,1,QAEN,HRFDWIND_ALL,LZ_AEN,11,53,PTP6,N
diff --git a/tools/inputs/history/60_dam_ptp_obl_bids-history-samples.csv b/tools/inputs/history/60_dam_ptp_obl_bids-history-samples.csv
new file mode 100644
index 00000000..a2201655
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_bids-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","QSE Name","Settlement Point Source","Settlement Point Sink","PtP Bid - MW","PtP Bid - Price","Bid ID","Multi-Hour Block Indicator"
+"03/02/2014","1","QAEPS3","HB_NORTH","HB_WEST","50","100","12000","Y"
+"03/02/2014","1","QAEPS3","HB_NORTH","LZ_NORTH","8","20","11001","Y"
+"03/02/2014","1","QAEPS3","HB_NORTH","LZ_NORTH","11","40","13007","N"
diff --git a/tools/inputs/history/60_dam_ptp_obl_opt-history-current.csv b/tools/inputs/history/60_dam_ptp_obl_opt-history-current.csv
new file mode 100644
index 00000000..95fb6802
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_opt-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE Name,Settlement Point Source,Settlement Point Sink,MW,Price,Offer ID,Multi-Hour Block Indicator,CRR ID
+07/09/2026,1,QAEN,WEC_WECG1,LZ_AEN,1,200,186382845_1,N,186382845
+07/09/2026,1,QAEN,WEC_WECG1,LZ_AEN,1,200,196880269_1,N,196880269
+07/09/2026,1,QAEN,TGW_T1_T2,LZ_AEN,1,200,186382841_1,N,186382841
diff --git a/tools/inputs/history/60_dam_ptp_obl_opt-history-samples.csv b/tools/inputs/history/60_dam_ptp_obl_opt-history-samples.csv
new file mode 100644
index 00000000..1772b4ed
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_opt-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","QSE Name","Settlement Point Source","Settlement Point Sink","MW","Price","Offer ID","Multi-Hour Block Indicator","CRR ID"
+"03/02/2014","1","QAEN","WEC_WECG1","LZ_AEN",".1","350","CRR167","N","15018581"
+"03/02/2014","1","QAEN","WEC_WECG1","LZ_AEN","1","350","CRR166","N","15018580"
+"03/02/2014","1","QAEN","WEC_WECG1","LZ_AEN","1","350","CRR169","N","22543894"
diff --git a/tools/inputs/history/60_dam_ptp_obl_opt_awards-history-current.csv b/tools/inputs/history/60_dam_ptp_obl_opt_awards-history-current.csv
new file mode 100644
index 00000000..90f1f0a4
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_opt_awards-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE Name,Settlement Point Source,Settlement Point Sink,MW,Price,Offer ID,CRR ID
+07/09/2026,1,QAEN,DECKER_GT,LZ_AEN,0,0,153586167_1,153586167
+07/09/2026,1,QAEN,DECKER_GT,LZ_AEN,0,0,153586168_1,153586168
+07/09/2026,1,QAEN,EXGNWTL_1,LZ_AEN,1,-.35,176843720_1,176843720
diff --git a/tools/inputs/history/60_dam_ptp_obl_opt_awards-history-samples.csv b/tools/inputs/history/60_dam_ptp_obl_opt_awards-history-samples.csv
new file mode 100644
index 00000000..2b589a5d
--- /dev/null
+++ b/tools/inputs/history/60_dam_ptp_obl_opt_awards-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","QSE Name","Settlement Point Source","Settlement Point Sink","MW","Price","Offer ID","CRR ID"
+"03/02/2014","1","QAEN","FPPYD_FPP_G1","LZ_AEN","273.6",".01","CRR0","13723248"
+"03/02/2014","1","QAEN","FPPYD_FPP_G2","LZ_AEN","273.6",".01","CRR3","13723247"
+"03/02/2014","1","QAEN","HB_NORTH","LZ_AEN","5","0","CRR7","15018574"
diff --git a/tools/inputs/history/60_dam_qse_self_as-history-current.csv b/tools/inputs/history/60_dam_qse_self_as-history-current.csv
new file mode 100644
index 00000000..f3686006
--- /dev/null
+++ b/tools/inputs/history/60_dam_qse_self_as-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,Total Self-Arranged AS RegUp,Total Self-Arranged AS RegDown,Total Self-Arranged AS NonSpin,Total Self-Arranged AS NSPNM,Total Self-Arranged AS RRSPFR,Total Self-Arranged AS RRSFFR,Total Self-Arranged AS RRSUFR,Total Self-Arranged AS ECRSSD,Total Self-Arranged AS ECRSMD
+07/09/2026,1,QAEN,13.4,0,62,,74.8,0,0,0,0
+07/09/2026,1,QALTRE,,,15,,15,0,16.7,,
+07/09/2026,1,QAMA,,,,,5,0,0,,
diff --git a/tools/inputs/history/60_dam_qse_self_as-history-samples.csv b/tools/inputs/history/60_dam_qse_self_as-history-samples.csv
new file mode 100644
index 00000000..cbcf1469
--- /dev/null
+++ b/tools/inputs/history/60_dam_qse_self_as-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","QSE","Total Self-Arranged AS RegUp","Total Self-Arranged AS RegDown","Total Self-Arranged AS NonSpin","Total Self-Arranged AS RRS for Gen","Total Self-Arranged AS RRS for CLR","Total Self-Arranged AS RRS for NCLR"
+"03/02/2014","1","QAEN","20.1","18.1","0","60","0","0"
+"03/02/2014","1","QALTRE","","","","0","0","10"
+"03/02/2014","1","QCPSE","0","0","91.6","0","0","0"
diff --git a/tools/inputs/history/60d_dam_as_only_awards-history-current.csv b/tools/inputs/history/60d_dam_as_only_awards-history-current.csv
new file mode 100644
index 00000000..690c4678
--- /dev/null
+++ b/tools/inputs/history/60d_dam_as_only_awards-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE Name,AS Type,Offer ID,Quantity1 Award,Quantity2 Award,Quantity3 Award,Quantity4 Award,Quantity5 Award,Total Award,MCPC
+07/09/2026,1,QBTU,NSPIN,NSRS,0,0,0,0,0,0,2
+07/09/2026,1,QBTU,REGDN,REGDN,0,0,0,0,0,0,.49
+07/09/2026,1,QBTU,REGUP,REGUP,0,0,0,0,0,0,.38
diff --git a/tools/inputs/history/60d_dam_as_only_offers-history-current.csv b/tools/inputs/history/60d_dam_as_only_offers-history-current.csv
new file mode 100644
index 00000000..de40477d
--- /dev/null
+++ b/tools/inputs/history/60d_dam_as_only_offers-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE Name,Offer ID,AS Type,AS Only Offer MW1,AS Only Offer Price1,AS Only Offer MW2,AS Only Offer Price2,AS Only Offer MW3,AS Only Offer Price3,AS Only Offer MW4,AS Only Offer Price4,AS Only Offer MW5,AS Only Offer Price5
+07/09/2026,1,QACCEN,RRS_070926,RRSPF,1,0,,,,,,,,
+07/09/2026,1,QBTU,ECRS,ECRSS,20,10,,,,,,,,
+07/09/2026,1,QBTU,NSRS,NSPIN,50,10,,,,,,,,
diff --git a/tools/inputs/history/60d_dam_esr_as_offers-history-current.csv b/tools/inputs/history/60d_dam_esr_as_offers-history-current.csv
new file mode 100644
index 00000000..80d86401
--- /dev/null
+++ b/tools/inputs/history/60d_dam_esr_as_offers-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,DME,Resource Name,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5
+07/09/2026,1,QMP2M1,YDIST,ABINDUST_ESR1,N,V,.01,,,.01,,.01,13.58,,,2.9,V,14.96,,,14.96,,14.96,16.6,,,3,V,20.2,,,20.2,,20.2,20.2,,,3.2,,,,,,,,,,,,,,,,,,,,,,
+07/09/2026,1,QMP2M1,YDIST,ABINDUST_ESR1,N,V,,,,,,,,3.77,,2.9,V,,,,,,,,6.76,,5.6,V,,,,,,,,9.61,,8.5,V,,,,,,,,20.2,,8.5,,,,,,,,,,,
+07/09/2026,1,QHEI1,YHABIT,ALP_BESS_ESR1,N,V,.97,,,1.94,,,,,,12.5,V,.97,,,,,,,,,29.3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
diff --git a/tools/inputs/history/60d_dam_esr_data-history-current.csv b/tools/inputs/history/60d_dam_esr_data-history-current.csv
new file mode 100644
index 00000000..39104e28
--- /dev/null
+++ b/tools/inputs/history/60d_dam_esr_data-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,DME,Resource Name,Resource Type,QSE submitted Curve-MW1,QSE submitted Curve-Price1,QSE submitted Curve-MW2,QSE submitted Curve-Price2,QSE submitted Curve-MW3,QSE submitted Curve-Price3,QSE submitted Curve-MW4,QSE submitted Curve-Price4,QSE submitted Curve-MW5,QSE submitted Curve-Price5,QSE submitted Curve-MW6,QSE submitted Curve-Price6,QSE submitted Curve-MW7,QSE submitted Curve-Price7,QSE submitted Curve-MW8,QSE submitted Curve-Price8,QSE submitted Curve-MW9,QSE submitted Curve-Price9,QSE submitted Curve-MW10,QSE submitted Curve-Price10,Start Up Hot,Start Up Inter,Start Up Cold,Min Gen Cost,HSL,LSL,Resource Status,Awarded Quantity,Settlement Point Name,Energy Settlement Point Price,RegUp Awarded,RegUp MCPC,RegDown Awarded,RegDown MCPC,RRSPFR Awarded,RRSFFR Awarded,RRSUFR Awarded,RRS MCPC,ECRSSD Awarded,ECRS MCPC,NonSpin Awarded,NonSpin MCPC
+07/09/2026,1,QMP2M1,YDIST,ABINDUST_ESR1,ESR,-8.5,.01,-4.7,3.69,-1.5,6.69,1.6,19.47,1.6,51.5,4,64.25,6.7,67.22,9.9,70.86,9.9,70.86,,,,,,,9.9,-8.5,ON,1.6,ABINDUST_RN,25.69,0,.38,0,.49,0,0,0,.21,0,.3,2.9,2
+07/09/2026,1,QTEN26,YLIB1S,ADL_ESR1,ESR,,,,,,,,,,,,,,,,,,,,,,,,,60,-60,ON,,ADL_RN,26.01,,,,,,,,,,,,
+07/09/2026,1,QTEN26,YWINMI,AE_ESR1,ESR,,,,,,,,,,,,,,,,,,,,,,,,,9.9,-9.9,ON,,AE_RN,26.12,,,,,,,,,,,,
diff --git a/tools/inputs/history/additional-evidence.json b/tools/inputs/history/additional-evidence.json
new file mode 100644
index 00000000..707eefd8
--- /dev/null
+++ b/tools/inputs/history/additional-evidence.json
@@ -0,0 +1,138 @@
+[
+ {
+ "endpoint": "np4-183-cd/dam_hourly_lmp",
+ "file": "cdr.00012328.0000000000000000.20140501.125925.DAMHRLMPNP4183.csv",
+ "fixture": "np4-183-cd-history-samples.csv",
+ "csv_rows": 264072,
+ "first_row": {
+ "DSTFlag": false,
+ "LMP": "30.39",
+ "busName": "EB_K",
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "01:00"
+ },
+ "rows_decoded": 264072
+ },
+ {
+ "endpoint": "np4-183-cd/dam_hourly_lmp",
+ "file": "cdr.00012328.0000000000000000.20260906.123242.DAMHRLMPNP4183.csv",
+ "fixture": "np4-183-cd-history-current.csv",
+ "csv_rows": 465096,
+ "first_row": {
+ "DSTFlag": false,
+ "LMP": "44.77",
+ "busName": "CADICKS_804V",
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00"
+ },
+ "rows_decoded": 465096
+ },
+ {
+ "endpoint": "np4-191-cd/dam_shadow_prices",
+ "file": "cdr.00012332.0000000000000000.20140501.125911.DASPBCNP4191.csv",
+ "fixture": "np4-191-cd-history-samples.csv",
+ "csv_rows": 548,
+ "first_row": {
+ "DSTFlag": false,
+ "constraintId": 1,
+ "constraintLimit": 45,
+ "constraintName": "MARSFO_SUT1",
+ "constraintValue": 45,
+ "contingencyName": "BASE CASE",
+ "deliveryDate": "2014-05-02",
+ "deliveryTime": "2014-05-02T00:00:00",
+ "fromStation": "MARSFO",
+ "fromStationkV": "1",
+ "hourEnding": "01:00",
+ "shadowPrice": "0.045",
+ "toStation": "MARSFO",
+ "toStationkV": "138",
+ "violationAmount": 0
+ },
+ "rows_decoded": 548
+ },
+ {
+ "endpoint": "np4-191-cd/dam_shadow_prices",
+ "file": "cdr.00012332.0000000000000000.20260906.123432.DASPBCNP4191.csv",
+ "fixture": "np4-191-cd-history-current.csv",
+ "csv_rows": 951,
+ "first_row": {
+ "DSTFlag": false,
+ "constraintId": 4,
+ "constraintLimit": 38,
+ "constraintName": "LAKENA_SAMATH1_1",
+ "constraintValue": 38,
+ "contingencyName": "DBAKCED5",
+ "deliveryDate": "2026-09-07",
+ "deliveryTime": "2026-09-07T00:00:00",
+ "fromStation": "LAKENASW",
+ "fromStationkV": "69",
+ "hourEnding": "01:00",
+ "shadowPrice": "13.014",
+ "toStation": "SAMATHIS",
+ "toStationkV": "69",
+ "violationAmount": 0
+ },
+ "rows_decoded": 951
+ },
+ {
+ "endpoint": "np6-344-cd/act_sys_load_by_study_area",
+ "file": "cdr.00015954.0000000000000000.20260828.055000.ACTUALSYSLOADSTUDYAREA6344.csv",
+ "fixture": "np6-344-cd-history-samples.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "hourEnding": "01:00",
+ "operatingDay": "2026-08-27",
+ "repeatedHourFlag": false,
+ "valley": "1757.77"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np6-344-cd/act_sys_load_by_study_area",
+ "file": "cdr.00015954.0000000000000000.20260907.055000.ACTUALSYSLOADSTUDYAREA6344.csv",
+ "fixture": "np6-344-cd-history-current.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "hourEnding": "01:00",
+ "operatingDay": "2026-09-06",
+ "repeatedHourFlag": false,
+ "valley": "1665.88"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np6-346-cd/act_sys_load_by_fzn",
+ "file": "cdr.00014836.0000000000000000.20170630.055000.ACTUALSYSLOADFZNP6346.csv",
+ "fixture": "np6-346-cd-history-samples.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "DSTFlag": false,
+ "hourEnding": "01:00",
+ "houston": "11614.47",
+ "north": "15306.84",
+ "operatingDay": "2017-06-29",
+ "south": "11509.76",
+ "total": "42251.85",
+ "west": "3820.78"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np6-346-cd/act_sys_load_by_fzn",
+ "file": "cdr.00014836.0000000000000000.20260907.055000.ACTUALSYSLOADFZNP6346.csv",
+ "fixture": "np6-346-cd-history-current.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "DSTFlag": false,
+ "hourEnding": "01:00",
+ "houston": "14828.90",
+ "north": "21917.89",
+ "operatingDay": "2026-09-06",
+ "south": "17508.48",
+ "total": "64360.71",
+ "west": "10105.44"
+ },
+ "rows_decoded": 24
+ }
+]
diff --git a/tools/inputs/history/adequacy-evidence.json b/tools/inputs/history/adequacy-evidence.json
new file mode 100644
index 00000000..c090faa1
--- /dev/null
+++ b/tools/inputs/history/adequacy-evidence.json
@@ -0,0 +1,284 @@
+[
+ {
+ "endpoint": "np3-161-cd/7d_plus_avail_res_poc_margin",
+ "fixture": "np3-161-cd-history-current.csv",
+ "file": "cdr.00022470.0000000000000000.20260907.060008.PLANNEDOUTAGECAP7DAYPLUSNP3161.csv",
+ "csv_rows": 1820,
+ "first_row": {
+ "postedDatetime": null,
+ "operatingDate": "2026-09-14",
+ "nonIRRNonPUN": "4906",
+ "ESR": "872",
+ "aggApprvdNonIRRNonPUN": "998",
+ "aggRcvdNonIRRNonPUN": "0",
+ "IRR": "3519",
+ "aggApprvdIRR": "58",
+ "aggRcvdIRR": "0",
+ "aggApprvdESR": "0",
+ "aggRcvdESR": "0"
+ },
+ "rows_decoded": 1820
+ },
+ {
+ "endpoint": "np3-161-cd/7d_plus_avail_res_poc_margin",
+ "fixture": "np3-161-cd-history-samples.csv",
+ "file": "cdr.00022470.0000000000000000.20260625.180007.PLANNEDOUTAGECAP7DAYPLUSNP3161.csv",
+ "csv_rows": 1820,
+ "first_row": {
+ "postedDatetime": null,
+ "operatingDate": "2026-07-02",
+ "nonIRRNonPUN": "2216",
+ "ESR": "0",
+ "aggApprvdNonIRRNonPUN": "30",
+ "aggRcvdNonIRRNonPUN": "0",
+ "IRR": "3519",
+ "aggApprvdIRR": "0",
+ "aggRcvdIRR": "0",
+ "aggApprvdESR": "0",
+ "aggRcvdESR": "0"
+ },
+ "rows_decoded": 1820
+ },
+ {
+ "endpoint": "np3-162-cd/7d_avail_res_poc_margin",
+ "fixture": "np3-162-cd-history-current.csv",
+ "file": "cdr.00022469.0000000000000000.20260907.120503.PLANNEDOUTAGECAP7DAYNP3162.csv",
+ "csv_rows": 168,
+ "first_row": {
+ "postedDatetime": null,
+ "operatingDate": "2026-09-07",
+ "hourEnding": 12,
+ "nonIrrNonPun": "33183",
+ "aggApprvdNonIRRNonPUN": "192",
+ "aggRcvdNonIRRNonPUN": "0",
+ "IRR": "3519",
+ "aggApprvdIRR": "0",
+ "aggRcvdIRR": "0",
+ "ESR": "872",
+ "aggApprvdESR": "0",
+ "aggRcvdESR": "0",
+ "repeatedHourFlag": false
+ },
+ "rows_decoded": 168
+ },
+ {
+ "endpoint": "np3-162-cd/7d_avail_res_poc_margin",
+ "fixture": "np3-162-cd-history-samples.csv",
+ "file": "cdr.00022469.0000000000000000.20260625.170503.PLANNEDOUTAGECAP7DAYNP3162.csv",
+ "csv_rows": 168,
+ "first_row": {
+ "postedDatetime": null,
+ "operatingDate": "2026-06-25",
+ "hourEnding": 17,
+ "nonIrrNonPun": "41315",
+ "aggApprvdNonIRRNonPUN": "30",
+ "aggRcvdNonIRRNonPUN": "0",
+ "IRR": "3519",
+ "aggApprvdIRR": "159",
+ "aggRcvdIRR": "0",
+ "ESR": "0",
+ "aggApprvdESR": "100",
+ "aggRcvdESR": "0",
+ "repeatedHourFlag": false
+ },
+ "rows_decoded": 168
+ },
+ {
+ "endpoint": "np3-233-cd/hourly_res_outage_cap",
+ "fixture": "np3-233-cd-history-current.csv",
+ "file": "cdr.00013103.0000000000000000.20260907.120053.HRLYRESOUTCAPNP3233.csv",
+ "csv_rows": 192,
+ "first_row": {
+ "postedDatetime": null,
+ "operatingDate": "2026-09-06",
+ "hourEnding": 24,
+ "totalResourceMWZoneSouth": 2077,
+ "totalResourceMWZoneNorth": 2476,
+ "totalResourceMWZoneWest": 143,
+ "totalResourceMWZoneHouston": 4559,
+ "totalIRRMWZoneSouth": 1546,
+ "totalIRRMWZoneNorth": 1368,
+ "totalIRRMWZoneWest": 2608,
+ "totalIRRMWZoneHouston": 61,
+ "totalNewEquipResourceMWZoneSouth": 810,
+ "totalNewEquipResourceMWZoneNorth": 2079,
+ "totalNewEquipResourceMWZoneWest": 288,
+ "totalNewEquipResourceMWZoneHouston": 611,
+ "totalResourceMW": null,
+ "totalIRRMW": null
+ },
+ "rows_decoded": 192
+ },
+ {
+ "endpoint": "np3-233-cd/hourly_res_outage_cap",
+ "fixture": "np3-233-cd-history-samples.csv",
+ "file": "cdr.00013103.0000000000000000.20140501.000040.HRLYRESOUTCAPNP3233.csv",
+ "csv_rows": 168,
+ "first_row": {
+ "postedDatetime": null,
+ "operatingDate": "2014-05-01",
+ "hourEnding": 1,
+ "totalResourceMWZoneSouth": null,
+ "totalResourceMWZoneNorth": null,
+ "totalResourceMWZoneWest": null,
+ "totalResourceMWZoneHouston": null,
+ "totalIRRMWZoneSouth": null,
+ "totalIRRMWZoneNorth": null,
+ "totalIRRMWZoneWest": null,
+ "totalIRRMWZoneHouston": null,
+ "totalNewEquipResourceMWZoneSouth": null,
+ "totalNewEquipResourceMWZoneNorth": null,
+ "totalNewEquipResourceMWZoneWest": null,
+ "totalNewEquipResourceMWZoneHouston": null,
+ "totalResourceMW": 18542,
+ "totalIRRMW": 685
+ },
+ "rows_decoded": 168
+ },
+ {
+ "endpoint": "np3-763-cd/st_sys_adequacy",
+ "fixture": "np3-763-cd-history-current.csv",
+ "file": "cdr.00012315.0000000000000000.20260907.120057.RESCAPACITNP3763.csv",
+ "csv_rows": 168,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "capGenResSouth": "24732.7",
+ "capGenResNorth": "31008",
+ "capGenResWest": "17437",
+ "capGenResHouston": "12967.1",
+ "capLoadResSouth": "1439.7",
+ "capLoadResNorth": "571.5",
+ "capLoadResWest": "1141.6",
+ "capLoadResHouston": "1352.9",
+ "offAvailMWSouth": "0",
+ "offAvailMWNorth": "0",
+ "offAvailMWWest": "0",
+ "offAvailMWHouston": "0",
+ "availCapGen": "86144.8",
+ "availCapRes": "22361.639",
+ "capGenRes": "86144.8",
+ "capLoadRes": "4505.7",
+ "offAvailMW": "0",
+ "capREGUP": "31738.4",
+ "capREGDN": "31572.3",
+ "capRRS": "15810.04",
+ "capECRS": "36845.1",
+ "capNSPIN": "24841.4",
+ "capREGUPRRS": "39441.96",
+ "capREGUPRRSECRS": "47365.28",
+ "capREGUPRRSECRSNSPIN": "55626",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 168
+ },
+ {
+ "endpoint": "np3-763-cd/st_sys_adequacy",
+ "fixture": "np3-763-cd-history-samples.csv",
+ "file": "cdr.00012315.0000000000000000.20140312.000001.RESCAPACITNP3763.csv",
+ "csv_rows": 168,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2014-03-12",
+ "hourEnding": "01:00",
+ "capGenResSouth": null,
+ "capGenResNorth": null,
+ "capGenResWest": null,
+ "capGenResHouston": null,
+ "capLoadResSouth": null,
+ "capLoadResNorth": null,
+ "capLoadResWest": null,
+ "capLoadResHouston": null,
+ "offAvailMWSouth": null,
+ "offAvailMWNorth": null,
+ "offAvailMWWest": null,
+ "offAvailMWHouston": null,
+ "availCapGen": null,
+ "availCapRes": null,
+ "capGenRes": "37749.5",
+ "capLoadRes": "1997.6",
+ "offAvailMW": null,
+ "capREGUP": null,
+ "capREGDN": null,
+ "capRRS": null,
+ "capECRS": null,
+ "capNSPIN": null,
+ "capREGUPRRS": null,
+ "capREGUPRRSECRS": null,
+ "capREGUPRRSECRSNSPIN": null,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 168
+ },
+ {
+ "endpoint": "np3-764-cd/hrly_ruc_online_sced_offline_cop",
+ "fixture": "np3-764-cd-history-current.csv",
+ "file": "cdr.00015753.0000000000000000.20260907.122050.HRUCONSCEDOFFCOPNP3764.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "13:00",
+ "RUCTimestamp": "2026-09-07T12:03:03",
+ "SCEDTimestamp": "2026-09-07T12:05:19",
+ "sumSCEDSouth": "0",
+ "sumSCEDNorth": "0",
+ "sumSCEDWest": "0",
+ "sumSCEDHouston": "256.2",
+ "DSTFlag": false,
+ "sumSCEDTotal": null
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np3-764-cd/hrly_ruc_online_sced_offline_cop",
+ "fixture": "np3-764-cd-history-samples.csv",
+ "file": "cdr.00015753.0000000000000000.20181025.171411.HRUCONSCEDOFFCOPNP3764.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "deliveryDate": "2018-10-25",
+ "hourEnding": "18:00",
+ "RUCTimestamp": "2018-10-25T17:03:01",
+ "SCEDTimestamp": "2018-10-25T17:05:09",
+ "sumSCEDSouth": null,
+ "sumSCEDNorth": null,
+ "sumSCEDWest": null,
+ "sumSCEDHouston": null,
+ "DSTFlag": false,
+ "sumSCEDTotal": "0"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np3-765-cd/approved_dctie_schedules",
+ "fixture": "np3-765-cd-history-current.csv",
+ "file": "cdr.00024347.0000000000000000.20260907.120500.APPDCTIESCHEDNP3765.csv",
+ "csv_rows": 2688,
+ "first_row": {
+ "postedDatetime": null,
+ "DCTie": "DC_E",
+ "GMTIntervalEnding": "2026-09-07T05:15:00",
+ "intervalEnding": "2026-09-07T00:15:00",
+ "repeatHourFlag": false,
+ "MW": "325",
+ "importExport": "IMPORT"
+ },
+ "rows_decoded": 2688
+ },
+ {
+ "endpoint": "np3-765-cd/approved_dctie_schedules",
+ "fixture": "np3-765-cd-history-samples.csv",
+ "file": "cdr.00024347.0000000000000000.20240627.170501.APPDCTIESCHEDNP3765.csv",
+ "csv_rows": 2016,
+ "first_row": {
+ "postedDatetime": null,
+ "DCTie": "DC_E",
+ "GMTIntervalEnding": "2024-06-27T05:15:00",
+ "intervalEnding": "2024-06-27T00:15:00",
+ "repeatHourFlag": false,
+ "MW": "100",
+ "importExport": "IMPORT"
+ },
+ "rows_decoded": 2016
+ }
+]
diff --git a/tools/inputs/history/annual-as-evidence.json b/tools/inputs/history/annual-as-evidence.json
new file mode 100644
index 00000000..7893aff7
--- /dev/null
+++ b/tools/inputs/history/annual-as-evidence.json
@@ -0,0 +1,1845 @@
+{
+ "scope": "One January publication per year where listed in 2015 through 2025. Every CSV header and up to three rows matched a generated reader. All ancillary-service disclosure rows were decoded and compared with independent CSV row counts. COP updates were checked only through headers and up to three rows. Empty January COP listings before 2020 and reused January 2020 observations are recorded. This is not proof of continuous retention, all historical layouts or numerical correctness of every field.",
+ "csvFilesWithExactlyOneReader": 214,
+ "fullyDecodedAncillaryServiceFiles": 208,
+ "fullyDecodedAncillaryServiceRows": 89849,
+ "formats": {
+ ".zip": 17,
+ ".csv": 214
+ },
+ "samples": [
+ {
+ "year": 2015,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 471247194,
+ "friendlyName": "48_Hour_AS_Disclosure",
+ "postDatetime": "2015-01-31T03:07:32"
+ },
+ "source": "work/history-annual-as-2015/NP3-911-ER.zip",
+ "zipSha256": "f44a04b111310408bf605d8422ba5e21a9c78d3147cda363fa540f9b61c8d572",
+ "files": [
+ {
+ "member": "48h_Cleared_DAM_AS_RRSLOAD-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "7e8c1da675c3461a538037889f261c7be1750dc0cc212aceb30d9a31c7873c3d",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_RRSGEN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "221942297c4fc5359e4b698dfac17ea38d79b3af7876bade4a8ae0a3b450cfe6",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_NSPIN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "362c8a99074da7e39e5e3e8aa92371e667a776eaf85381bf2dd4af8366bdc51c",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_REGDN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "314fda8504310a5c5726c129ec5c53e43af8ed697aa2ac5e8f27713e357bdcb4",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_REGUP-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "ef0f9df8ac2403d1987eb475f24032852e58a3be9d9423ef1a10cc941897e050",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_RRSLOAD-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "d549aae9b19e7d38edda685807a042f4d1da3af503aaeba4763b33e36be38699",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_RRSGEN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "dd26913063712200f2d5b16875a8649cfa4ed6c07d1b1f0399cb72fb300ad93f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_NSPIN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "a63938d0779632bbded96a7b586e85b2271a510a0bf7951df6de9ad7daa8ff06",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_REGDN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "28bb0d6bca592b063e5a755d138d66ce9bc7c58e3c175228541459351eb440d1",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_REGUP-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "d65898daf27477bbb5db8d22355d0f4824592b47802894fb10c8ec1ad4e11012",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSNC-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "dde08988bdfc462c9d09543e922d82e41790519d2fea171d25d762d32ade38dd",
+ "sourceRows": 321,
+ "decodedRows": 321
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSLD-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "70088585691715ed7542b03489059bd60326b77f72d90f30b60bb0207cb3e326",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSGN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "318fce3db5d2cf24ae76283c9cb663b11860399de24d17dfb1f69825160f01cc",
+ "sourceRows": 1207,
+ "decodedRows": 1207
+ },
+ {
+ "member": "48h_Agg_AS_Offers_OFFNS-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "dddaf509658280bf18a8e528960fc2e5c3cb13f38a5c659924fe962ee8471428",
+ "sourceRows": 461,
+ "decodedRows": 461
+ },
+ {
+ "member": "48h_Agg_AS_Offers_ONNS-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "0975d97b2809cf86696864eba5780bae5f983a629d6c7a776d8db1390bc55968",
+ "sourceRows": 846,
+ "decodedRows": 846
+ },
+ {
+ "member": "48h_Agg_AS_Offers_REGDN-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "c6c67a9ae670eb6d072fe3640edea89e112e7d6f64277901682659796c13af2d",
+ "sourceRows": 1471,
+ "decodedRows": 1471
+ },
+ {
+ "member": "48h_Agg_AS_Offers_REGUP-31-JAN-15.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "7905b1670d65f14283acc576d44819e7746ef00da3631e124112bcb8932d4904",
+ "sourceRows": 1083,
+ "decodedRows": 1083
+ }
+ ]
+ },
+ {
+ "year": 2015,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2016,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 508454718,
+ "friendlyName": "48_Hour_AS_Disclosure",
+ "postDatetime": "2016-01-31T03:13:33"
+ },
+ "source": "work/history-annual-as-2016/NP3-911-ER.zip",
+ "zipSha256": "d4d4cba45331d57e5c4abd354183c7286dd2618ea8a2782ae78881c274bbd1fe",
+ "files": [
+ {
+ "member": "48h_Cleared_DAM_AS_RRSLOAD-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "0bd6fc0197a3ae5cf9a08f236d48162375fa91f49b0e25a7ef870188d8718d3f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_RRSGEN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "c476179320f7dab3f1d951562d552a4c4bca55d478221cd554389411b8caa2e9",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_NSPIN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "a876412ff5a37adff21a40e40f7f98195b30399781ef187ae2aa2dcbd9a48aa2",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_REGDN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "d42f23d36f4bc480a66419ebd11ed91bd354eb82f5426389e12898e6a5ae803b",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_REGUP-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "0e06c10437e31c6fa55e31f3af7387e35448c1433f86bc1b5a80a65f505debff",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_RRSLOAD-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "ac6a105f84c02cc284b5e01ee0677bcada0e1b7bf87436e1a661567811261a3b",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_RRSGEN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "2a8bd25f1fc4697a00360975c1becb1dbf955354d37bae51b5481144ff8ec918",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_NSPIN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "c8d75d41028c8e279b199b84a279079fceb72296f8be394f6b7f429db245b96b",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_REGDN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "b3a0b33d24033f196803dc09a3c3bf51c78b72c1675fa206ea7e2f88bbf663ff",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_REGUP-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "b39961cd478aafc1f6221a700c100a71ca7d3c01f96290b073ac45a421f1331f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSNC-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "325a736b13a77b32830175906610189dc5b13edbb289169469b54b08c2f9ac39",
+ "sourceRows": 132,
+ "decodedRows": 132
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSLD-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "70088585691715ed7542b03489059bd60326b77f72d90f30b60bb0207cb3e326",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSGN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "a1568a9de7f1e1bfd379fa8707bc8af508c0ec0db4d64b6dfe1d4bfea008e5e3",
+ "sourceRows": 1248,
+ "decodedRows": 1248
+ },
+ {
+ "member": "48h_Agg_AS_Offers_OFFNS-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "bee7e4415d172155a64f452e4124d0d07d0d8774237f277786dd7a6fc6561bf7",
+ "sourceRows": 1257,
+ "decodedRows": 1257
+ },
+ {
+ "member": "48h_Agg_AS_Offers_ONNS-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "a493487ca57b7045c345d7bc7f965fbf35ab8995001d1b88a16db0e97de1570c",
+ "sourceRows": 727,
+ "decodedRows": 727
+ },
+ {
+ "member": "48h_Agg_AS_Offers_REGDN-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "6aa9b16691bd4e3cf9a738be8e59b2527d14cd171f3739bfdb2dac7ff2c14688",
+ "sourceRows": 1579,
+ "decodedRows": 1579
+ },
+ {
+ "member": "48h_Agg_AS_Offers_REGUP-31-JAN-16.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "26e50b745d41b431ab63801411c55d8d154997cc00f114a4f501eabab516e977",
+ "sourceRows": 1220,
+ "decodedRows": 1220
+ }
+ ]
+ },
+ {
+ "year": 2016,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2017,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 550571473,
+ "friendlyName": "48_Hour_AS_Disclosure",
+ "postDatetime": "2017-01-31T03:19:57"
+ },
+ "source": "work/history-annual-as-2017/NP3-911-ER.zip",
+ "zipSha256": "ba41eff96b5a0834cdf858d48af146184eceadbddd80be03009c656154a7c0cd",
+ "files": [
+ {
+ "member": "48h_Cleared_DAM_AS_RRSLOAD-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "d97bd88dca35558ecbcaf94abba008e6440cf1306bc0ed262c0ca5cab9678303",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_RRSGEN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "9708a865391802ef0e1facad6a08ebb1892e8500af43e0cbbb591c17b842e639",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_NSPIN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "bf541f62f4b0f18f707c662eae3b18276c4bd9a9a10a178227a501eb41302db3",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_REGDN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "eb26d6411795fbe8324e566580d30c1acc38e8c45c877e4ee2780d9ad454fe38",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Cleared_DAM_AS_REGUP-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "6c73c5d7269e14bd41c898b4490344dc1856db9ed88c087bbbf2d9e6e8feb0fd",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_RRSLOAD-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "a3ca10acde9ac5d3dca0895bd4b46084055ab68c5b1e19943fa6a68c547afc2d",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_RRSGEN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "ea6d70ab98fb19fef2f939dfcaad0ea7362aeba750dba0c3fd541f17aa6a7d78",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_NSPIN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "46573bb7bd46913f6be696f013f3e63acfa00bc3295a3a5c3d0aa8d3fcfc148b",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_REGDN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "cce456ab666465fc00736d7187845f8a0709924264dc021049d1050ff78284a7",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Self_Arranged_AS_REGUP-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "1c7c02e6d5eda37d32b2538412eea03e0875ed45d1f7f6ff6ef4cea977b011a0",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSNC-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "f011d63e9a1185ad29e900103372e06c73d2ab6d69ab924609c16c2f40efa2c2",
+ "sourceRows": 180,
+ "decodedRows": 180
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSLD-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "70088585691715ed7542b03489059bd60326b77f72d90f30b60bb0207cb3e326",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "48h_Agg_AS_Offers_RRSGN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "9f78513f91cfea86aabb36f3d6584cb238c60c0c709bbf4ae5f82c080380ec34",
+ "sourceRows": 1516,
+ "decodedRows": 1516
+ },
+ {
+ "member": "48h_Agg_AS_Offers_OFFNS-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "a98c053cb893553aa4bcd8c3e0c1bb43fefb2635976d2b33ac2bbcc8d77f28ef",
+ "sourceRows": 603,
+ "decodedRows": 603
+ },
+ {
+ "member": "48h_Agg_AS_Offers_ONNS-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "c59f0fdadc342aced212d141f32bb1fc5bd8c7018a9ed1e29df3f9595d03cbc8",
+ "sourceRows": 533,
+ "decodedRows": 533
+ },
+ {
+ "member": "48h_Agg_AS_Offers_REGDN-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "026cf0bb11cfa302104d34521d36563b003888be2c6fe9bd6d732fbeca8ed47b",
+ "sourceRows": 1275,
+ "decodedRows": 1275
+ },
+ {
+ "member": "48h_Agg_AS_Offers_REGUP-31-JAN-17.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "3394974de92b5108efb2a46ad89430f441316ae3529102054f5204e842e7905c",
+ "sourceRows": 1279,
+ "decodedRows": 1279
+ }
+ ]
+ },
+ {
+ "year": 2017,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2018,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 596923456,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2018-01-31T03:17:39"
+ },
+ "source": "work/history-annual-as-2018/NP3-911-ER.zip",
+ "zipSha256": "e1780b2d765fab568834c6d171c327148fe376782d76e60197bb794f989d4732",
+ "files": [
+ {
+ "member": "2d_Cleared_DAM_AS_RRSLOAD-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "b03da5662e2b203d65d885f4cc2087eda40d6997801e433087b2ffc63aea6f3f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSGEN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "91b7431605a6885cb6d4820adc36cd3e9acc97e6dbbf9fb5fb1618be93582847",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "c7b42740477d3740c82c3d536609dcee64daa509c8eac0ce1aec4fc41accc926",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "063aadfbe250b73fa671f7ee0553ddd94b155fa8e541b764868b968abf56d615",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "a421d0947f89e023ea4e6cea529036cca7248f320c5ff79f65aa07cf4ff0120c",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSLOAD-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "14237a5ca4e8ae8759da562d7a2a71a8807580e81912eda258405be4f0cbfc53",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSGEN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "80181562b6e70525aac352049286b5d5bc04ccec526287f423a8c453e1fcdd6d",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "ef8b163c206b9f2337cb484433d35352276823d97006df9c6ec3752223587156",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "356c4de6185023cf5baaac9bf8a0d8f006153b8336578c373ad88275c2bc3d00",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "c5bf4731f86a5039b4da65555b047b39f0a1e80cd019722a026cccaf3db8d239",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSNC-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "7c6a40be92bdfa4720b2bfc7baef9e9ac0cbfb6b6c903afc7b3a70a0e025cfbb",
+ "sourceRows": 552,
+ "decodedRows": 552
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSLD-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "70088585691715ed7542b03489059bd60326b77f72d90f30b60bb0207cb3e326",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSGN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "b3e494a24421dfb4a5cb23b07e18eebc1c1234a9322908047bbe73221a337480",
+ "sourceRows": 1572,
+ "decodedRows": 1572
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "28536b3e68df63094a77ac8abc4bc59f8b84f042ac6030cf90263e5bb14441ef",
+ "sourceRows": 1449,
+ "decodedRows": 1449
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "ce03c8f6eb4ad78e13280c2532717b14c9bea34d4d93245f29ae266ec3c4e2cf",
+ "sourceRows": 665,
+ "decodedRows": 665
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "ae91743ba2a2ee4956f04d85e6178613558edb475efc8b01322a7b2967981713",
+ "sourceRows": 1390,
+ "decodedRows": 1390
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-18.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "d1bf38437a5c64d8cee95d54835662eb226734dcfb6d5ebf3fce704218e1a3aa",
+ "sourceRows": 1291,
+ "decodedRows": 1291
+ }
+ ]
+ },
+ {
+ "year": 2018,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2019,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 646659128,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2019-01-31T03:09:23"
+ },
+ "source": "work/history-annual-as-2019/NP3-911-ER.zip",
+ "zipSha256": "4386c676fa3dff867d2e9741435a9888340d65281ec8a59453bfcf939e32b637",
+ "files": [
+ {
+ "member": "2d_Cleared_DAM_AS_RRSLOAD-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "02a2688fb7ad47c8fb443efeebc51ed59f07a3344c3fe59846993f4e52879716",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSGEN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "bfab6950f09f374a08edb955e87884dcf0149211a09b970f6ec94d5aabc600bc",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "8f2cd214462900c61fa245c05c96bb3fb79dee393df57d4396015b36aa135dfa",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "0ec0cda2f122cb4cfd61ae1cddf4c6e8216867f6000aaca7f020beeac8a6ab20",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "9f58ec14da8768fdcc68bf26963c3b10793980bfb3dd4224259ca105af27d6d7",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSLOAD-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "9f897df8339c1f4598ac186f59596a54bdcb555e8f3f8621fe166b388193e591",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSGEN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "d0c79ee409d3c54713f75c1bd141c321005ea546bdece892cdd03137ba2521dc",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "78f1e425a00106ccbb7948c53d9e5d15af894a3f345e7567e29211bd41217120",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "f2c64aae393b909e7676a3d9ba46b8d4462634d3115f6faf0e7260fb78772c6c",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "5c9db0c0f0caa2f757b39c59cde57b698f3fcb07c1b46666c950190b3832d95f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSNC-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "dbf895a250db47dcef693f2f28184317deba7f8a51cd37a97833ca2ce52cec7b",
+ "sourceRows": 120,
+ "decodedRows": 120
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSLD-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "70088585691715ed7542b03489059bd60326b77f72d90f30b60bb0207cb3e326",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSGN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "321bb08766b35da688b7d561198557a082fd44b719aaf4801435f03178dd6f1a",
+ "sourceRows": 1628,
+ "decodedRows": 1628
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "c923ba0783a86b34216a446ed8c14fc3a27de57d8ab1971953a115b27eba9d43",
+ "sourceRows": 1553,
+ "decodedRows": 1553
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "e6a7c7b6d63160aceceb318a3d08bc3e4be9cb7a1486adcb4f9c6a5b9fc3f1f2",
+ "sourceRows": 734,
+ "decodedRows": 734
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "6a9c40ce74770eb39062d215bd7b9f68b2aa776139268e2fe1c1bc1630a877b5",
+ "sourceRows": 2232,
+ "decodedRows": 2232
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-19.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "556b8ffdf0f30fedc822ca783cefcb0fa048244058c0811327159281fa84034e",
+ "sourceRows": 1485,
+ "decodedRows": 1485
+ }
+ ]
+ },
+ {
+ "year": 2019,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2020,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "listingReusedFrom": "history-middle-listings.json",
+ "document": {
+ "docId": 698693027,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2020-01-31T03:19:42"
+ },
+ "source": "work/history-middle-2020/NP3-911-ER.zip",
+ "zipSha256": "a1d5ab1a85c45f31313550fc0fe3f47d32c5f658de15fe14fa53bfa33def950c",
+ "files": [
+ {
+ "member": "2d_Cleared_DAM_AS_RRSLOAD-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "1f6ba851425ccba1878d2bb93649f3de50eb1603dd81601d1f330403480f1632",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSGEN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "39c5f4818d8d2b8b2c8fabf2aed0e992e9ed536c8ed1d31b4a8b7a4e175dfd49",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "7039ece87da5e6d05aa5077f8442386619d1e733c6fc4a3f13fa910491b5f3e4",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "ee6b8ad7465f6bcaa0282312ce4283c6488966c5c104d6651efd1be94185e410",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "b36b1d285f60c4e01f06b58926012c442934f0c793242ccbb8799e2a3eab7894",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSLOAD-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "252e1fdf8ecbebf9a0c16c097b72ddb9635be9504233c4703438818eee2169fe",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSGEN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "71c1a645fbb973c527582cc4ac572401473a8a374c93ef40964b83856e36047c",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "039203c50c4af4123f6d0d0c0fdae17a96a810e2a1a7688f4ecac411f6804670",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "2520c874f85608b78bf688f0911d31ed3d0be48df9d745ab07f16df7b27882a6",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "f39c001b5e1f613a9886895dc0c0f35e6ccce8d6ccaa7d596c28c6299a14e5e3",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSNC-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "635b4625093bb87965a6b2aa13523245f1d39ab19d709261ba6a38ad1413e9b8",
+ "sourceRows": 48,
+ "decodedRows": 48
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSLD-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "70088585691715ed7542b03489059bd60326b77f72d90f30b60bb0207cb3e326",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSGN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "ac5f7561548d420dcf5264b9e1fe9a5c85f801b1cf957de99d0f978e542f021b",
+ "sourceRows": 1664,
+ "decodedRows": 1664
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "5fd6f2c6f1f0237f5ad789bfc07693ad380aa849ccc478f1f5a868e23c977044",
+ "sourceRows": 1266,
+ "decodedRows": 1266
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "38e9d7b7301041743751cf8ce863d9cbac2b69b7ece8d8d7fcaaf05b6799ce1c",
+ "sourceRows": 514,
+ "decodedRows": 514
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "57bbd96b67ade97432f3338f80cd2f6a990c7e2b74fb33ba22e07398d0d1340e",
+ "sourceRows": 1472,
+ "decodedRows": 1472
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "f687a50cfa5980ee59060c8b46f55d58661b2df8186b9dd795e583304bc4ad3f",
+ "sourceRows": 1412,
+ "decodedRows": 1412
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "listingReusedFrom": "history-middle-listings.json",
+ "document": {
+ "docId": 698706908,
+ "friendlyName": "60_Day_COP_Disclosure",
+ "postDatetime": "2020-01-31T05:20:54"
+ },
+ "source": "work/history-middle-2020/NP3-991-EX.zip",
+ "zipSha256": "ec2249f31c7a3b53ae6d1b85f8ae954f36cb04e0e5a1e31b1756cc5856e3327b",
+ "files": [
+ {
+ "member": "60d_Complete_COP-31-JAN-20.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756220865,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2021-01-31T03:32:20"
+ },
+ "source": "work/history-annual-as-2021/NP3-911-ER.zip",
+ "zipSha256": "69a9c8e18100415a588035b665ae3ff7ae4701c9ae45cea82cfc7a8c65809d61",
+ "files": [
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "cce25c98b86b8cfedaa3b469a9b80a0107e20d36b61c8842034f6b8824129032",
+ "sourceRows": 1345,
+ "decodedRows": 1345
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "981d7470ab62f0bfcd36c8692d597fed10cd0df759f17be16d40b672f3e446e7",
+ "sourceRows": 1603,
+ "decodedRows": 1603
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "483b39b7a6dd1713710730cf3d0dd3becf99b1a8ae698ecfe5d7a434a30b76c4",
+ "sourceRows": 620,
+ "decodedRows": 620
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "06ac997be9ca15957409ea2231aa091cc06a33a1108f032305dbd0dc199904ea",
+ "sourceRows": 1323,
+ "decodedRows": 1323
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSGN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "3ff706e839baf117040185b44b12c19f83b2103b32e07a04c3364c240dcb8de6",
+ "sourceRows": 1592,
+ "decodedRows": 1592
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSLD-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "bbd98ff82939f161c19610b5712566563b4c1088d0cc2fb1b407832fbe6f8040",
+ "sourceRows": 31,
+ "decodedRows": 31
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSNC-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "c557366ae0099fc368955101f3be9835fb8b14991c021c1680be2bdca2e8e177",
+ "sourceRows": 72,
+ "decodedRows": 72
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "69f4d1ab816760bb29295c35609ce6255a932da882b0ea41a8756114573fb96c",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "fc2346dcfee11a7c2f4f33e79d5d9c12def88a3a346e5059fc2cab4611c3e644",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "5b882de39618de52b0d3d3bce527a7f8398136236cf6c2cd5730aed74956c0c7",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSGEN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "d33ea2d3479e862354ac0d93a80844d6cd1ffb44d43f7119eae5ee6d419a39bd",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSLOAD-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "e6dcce5f3c4d5dfe719f5dff5d56890ba424f0a4fff4281251fee60f548f4b6e",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "b4f629841991d3bd48df2ceeeab07aaaa6291dbeb3f4abb0d831134432c84d1d",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "226a231cd4a8416e79f563921a0488982f0caae7c52b5bbff436c52627a9f5dc",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "4ccdfe0e8fa0e99bc99265336d786a79c08e7875adc1856b9bdbd060cf44b6f9",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSGEN-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "e17f1cb5c909d73c1965d43fb58416ccb111e376dc2bd387fea47996ac4efd8d",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSLOAD-31-JAN-21.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "26315b2164e9052b3363cdb66dbbdcebbc72bd7bb06c628c50c1b435a0802d43",
+ "sourceRows": 24,
+ "decodedRows": 24
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756233846,
+ "friendlyName": "60_Day_COP_Disclosure",
+ "postDatetime": "2021-01-31T05:17:26"
+ },
+ "source": "work/history-annual-as-2021/NP3-991-EX.zip",
+ "zipSha256": "56969a5bd00fa59f87293e0bdca341ef0a64d096f736a8e8218f6d5fbdcf17bb",
+ "files": [
+ {
+ "member": "60d_Complete_COP-31-JAN-21.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820357577,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2022-01-31T03:24:03"
+ },
+ "source": "work/history-annual-as-2022/NP3-911-ER.zip",
+ "zipSha256": "823685b4b57b2bbf577c4b91e6b95c2d796719c277f0af0cf5a0305292ae3d2d",
+ "files": [
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "238ec0f107f0cbddee6c882a8a611b6d8d7f33448e9553f000a724ab49a0e0b0",
+ "sourceRows": 2123,
+ "decodedRows": 2123
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "2fd67a4f5e74c6343d42dbad0d4dc4405d918fa145b893e4be127f9386c38a75",
+ "sourceRows": 2057,
+ "decodedRows": 2057
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "83be578d693efddf0760879b0312d90e09dceddb9ef444c381b81b03115f02aa",
+ "sourceRows": 1147,
+ "decodedRows": 1147
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "a1b56f0008053f51485dca539fc34f8c6e18853307456ccbc965b7390e6fd60a",
+ "sourceRows": 2292,
+ "decodedRows": 2292
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSGN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "csvSha256": "c7f0777e5a29781811a76e0d793c8de8f15abfba92387506ba8d871510c313ed",
+ "sourceRows": 1842,
+ "decodedRows": 1842
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSLD-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld",
+ "csvSha256": "94c539f5ff7a9e18b46dc1f77ac27b952352c17e3b3caa4b5d3356f87150c03e",
+ "sourceRows": 157,
+ "decodedRows": 157
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSNC-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "csvSha256": "c74455cf096914ad82dc666593407d48b94a35170d25e3ab2143cee90fcfa7ec",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "cc0d7c6971d2b930ac28ea9fdb58bb1a91bab7d6a22cdf5bc2bcb251e19ea6a4",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "1c80e0160e807aba78f396e3f733e7b4d93588f8cbf0fe9da4b21fdb3434fa7c",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "cf9685a06342f75a6e51d979f83afb4b198e8772bf1fe8fdcf26bb3fbbcde559",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSGEN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "csvSha256": "7be8805e4e28960cae8652476b7d8254773ed6faaa940964bed9f2bfdec0f876",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSLOAD-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload",
+ "csvSha256": "f048356b3a900ef809b7d44072bf5183ed33457f66066ec95760af313722df67",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "a0f8d022c790be188c149ae0c8a02a8e7ac8a19ccbf10b460a56f26ce7ec8239",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "8a682f049e7900591b3b2173346ea2f406c19441aa4caeabf40c349adecbeab9",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "74170e26895387e194a8910a6744b5b5d88ddf8286b4d7570bb6dfab005b53cc",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSGEN-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "csvSha256": "1c80b9614ad675c9e2be071ee8cd9624c0c2e03f1a3eb86957640d40d27b6eb4",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSLOAD-31-JAN-22.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "csvSha256": "e2c90f0a1ec72ced76795956f21c16bde82338551586d649979be842d6ed025a",
+ "sourceRows": 24,
+ "decodedRows": 24
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820384216,
+ "friendlyName": "60_Day_COP_Disclosure",
+ "postDatetime": "2022-01-31T05:24:04"
+ },
+ "source": "work/history-annual-as-2022/NP3-991-EX.zip",
+ "zipSha256": "12846d74244b7e94af917b48cc4266bd79474e5a5423692e3ece2a05e61020c1",
+ "files": [
+ {
+ "member": "60d_Complete_COP-31-JAN-22.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 892920211,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2023-01-31T03:25:01.310000"
+ },
+ "source": "work/history-annual-as-2023/NP3-911-ER.zip",
+ "zipSha256": "004520ba80aebd28472394f29160be0e535cce905e18df2d5d33266ecb05749d",
+ "files": [
+ {
+ "member": "2d_Self_Arranged_AS_NSPNM-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspnm",
+ "csvSha256": "2c31a6e4ac302e8e3a21943baf6731fc1f7321ef4aac1671f53dda1328d9bb38",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSPFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrspfr",
+ "csvSha256": "4457aa933c8983a0e88bfbd4fabbc958c0f7e080938e05a817e300542cb0ffd3",
+ "sourceRows": 2346,
+ "decodedRows": 2346
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSUFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsufr",
+ "csvSha256": "9c82873eb2992fddd7a27b718be747c9d24d8ea9e4cec8be33a02f0634eac4a2",
+ "sourceRows": 29,
+ "decodedRows": 29
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSFFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsffr",
+ "csvSha256": "a964c706a743a7a36f4a4fa87c5368267bf7883c7af69ae859bfa29e50b521d4",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSPFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrspfr",
+ "csvSha256": "88d1dfa20496fe3098b687d06fe8a3ad8361c9addf5da2a31d7b54a36ab6c579",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSUFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsufr",
+ "csvSha256": "f03e387c0d34d864931b967ab59193ed01c145647a81bcf06cf2d1e25524abdd",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSFFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsffr",
+ "csvSha256": "472383eefd79dfbc6713042dc6ded1d6acfc1a8990f4edbbfb1a61d063e38d8e",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSPFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrspfr",
+ "csvSha256": "c6ab21944381bdb3cb0662f6eeefc312448f0367230240ad60b3b15c1362f213",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSUFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsufr",
+ "csvSha256": "a06e409299709467852bf831f2ddf493d0bcec361b984d93b199ad4363785bfe",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSFFR-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsffr",
+ "csvSha256": "4d7c0a5cb60435f9ad7968976759a646aff09a9a188d3505c0f37386d0c6347f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "eb9a043b1c676f0fd5467719d16441ff8b12e25a5c83d95bb41411d8104c022e",
+ "sourceRows": 1776,
+ "decodedRows": 1776
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "d8a83f19e0aa3dd672718359037a5931c82aefc008f440e94ef02489a2a4b505",
+ "sourceRows": 1802,
+ "decodedRows": 1802
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "6f64134fdbcab65981d3ac868650db093d5bcde482dfcaf2afb96edc7c8f85ed",
+ "sourceRows": 968,
+ "decodedRows": 968
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "93f68df19bc0fb439840a76dc3e6e2412caf064e8d654a3a00be499d52625703",
+ "sourceRows": 1659,
+ "decodedRows": 1659
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "50cd30a497eb071340681067a75f25b4f8fb1c0fd9b6b7c0d052eeb15da3c79e",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "c5584035ea882db8133ec21aeb808ecdb681ae5016218a708b0671287f376e2d",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "59194968d377c14c01c3102fb594e8bea0b7f945346cc5f9e3b8110aa9c318e9",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "b3ceb93e659e8c451fea15f93fd58e5f79db37783aebf5ba53b002d2fe661aff",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "eb0850501be69aaf8e21fae4f499216d613279132384e7216ab442b644929457",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "64b2930ea4e7bff9c4b342dab8cff8bb9c5316564008b4064bdd38f49a9daad4",
+ "sourceRows": 24,
+ "decodedRows": 24
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 892936514,
+ "friendlyName": "60_Day_COP_All_Updates",
+ "postDatetime": "2023-01-31T05:10:05.502000"
+ },
+ "source": "work/history-annual-as-2023/NP3-991-EX.zip",
+ "zipSha256": "b0251e9ff4bc819deb62b1fbace8d5598b957aba31c8b7e1a892430825060626",
+ "files": [
+ {
+ "member": "60d_COP_All_Updates-31-JAN-23.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977271304,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2024-01-31T03:11:07"
+ },
+ "source": "work/history-annual-as-2024/NP3-911-ER.zip",
+ "zipSha256": "0dc5cc61140b6da9fa666e77b5e28f815a1c1204363b69cc4ac63ca082fc7936",
+ "files": [
+ {
+ "member": "2d_Self_Arranged_AS_NSPNM-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspnm",
+ "csvSha256": "34755a4d6e7620e4f8f9fcf3c7cffb0676dcd7ae34abe31d534f114db5b3444d",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSPFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrspfr",
+ "csvSha256": "11bb1c6714e0c44cbcae61038a629fbe1fa95e3a93891360af602e728310fb1d",
+ "sourceRows": 2502,
+ "decodedRows": 2502
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSUFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsufr",
+ "csvSha256": "5515b6b5ea216a895122c1267a5b4941fb5d32894219f2547e13049f8c3a68f9",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSFFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsffr",
+ "csvSha256": "688104dadbdcef7ffa71d80b45b141c21de48c7e9760bb11448768f8598f5101",
+ "sourceRows": 135,
+ "decodedRows": 135
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSPFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrspfr",
+ "csvSha256": "600c527679c9c08839a60195b8ca6645110fb1b94c9a24ab026849184bf5b354",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSUFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsufr",
+ "csvSha256": "d90f78324a3f5c6337d4ab89804a10b84629d148f1bc122e78f29a24dd0d85ca",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSFFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsffr",
+ "csvSha256": "d63eb0b596e076af5a0599fc465eb08ae095014ca0f80d4b0d5fa833de06d078",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSPFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrspfr",
+ "csvSha256": "a1472adca95a23b1f358763ba7ad8863d4fa5bb73e28fa50c4fe00e6cff3cdb4",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSUFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsufr",
+ "csvSha256": "4a01560f94261b9c1c67d0db8d76711487e20e15f286d5aaa19cf43f948110bb",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSFFR-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsffr",
+ "csvSha256": "4ebc529c032e4b7ae1e04ce9e2ad3e08ae444c5c3152ee9bf5e89d406e95d531",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ECRSM-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_ecrsm",
+ "csvSha256": "1e9f053534b29fe347e52e7a317707fdafa0c8c1db4b8fd3670845d3b532abb7",
+ "sourceRows": 48,
+ "decodedRows": 48
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ECRSS-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_ecrss",
+ "csvSha256": "b6ebf04cc614a4b9a461e6e08afa3c386426596392bca97d53216d73a3265e65",
+ "sourceRows": 2306,
+ "decodedRows": 2306
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_ECRSM-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrsm",
+ "csvSha256": "c6c6801b41f2c8fd23a5a76746a5d60f9464e722f7c3833988207d237697f61e",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_ECRSS-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrss",
+ "csvSha256": "0f980c7125a7898f131c0c23e6c502845c16c8d0b2b6d2add1664ac4b236f5d2",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_ECRSM-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrsm",
+ "csvSha256": "7e40dad11e1bcf9e03652523b5a8f65225f9ccc96bd60413cd066b123129a860",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_ECRSS-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrss",
+ "csvSha256": "a63b6cef54ca17fc9eb821a39d36f5cc0cf54f31dd50127f7edbf58c45314648",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "cd7b7f9fc0696cad4b71b8e746d03c7bb0f9d693a506795a173ec372c43f8abe",
+ "sourceRows": 1779,
+ "decodedRows": 1779
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "24dacc717a2784f47d63867a0babf362aa1b0ee92f62502fd9c9be4394e60198",
+ "sourceRows": 2005,
+ "decodedRows": 2005
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "da0c8ac7ea73f3d1b8033584c12bd8aad8facb382352732accd9bfbf205ebf3a",
+ "sourceRows": 650,
+ "decodedRows": 650
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "79741a96f70d12ffd9ed28706291fda6fe39a12c90da7402149e7c7a7fcb7d71",
+ "sourceRows": 1507,
+ "decodedRows": 1507
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "5433ac482340bb0548f462552e585239d9282280e2e361764ce08c610e286804",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "8f05a49661c9f2ca3041db53e2b63d733e940d5b07b1854ccafa7c2fe59c7a0f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "0de16834b6143c0c7fa1de4d54b8af1c173d073891eaf2bbb20822daf09abf2b",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "088994b431c43267fdb63187950983600edee69487fa877fc1cbf7a586495f57",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "7538b8cce00316a01427b97f628e86d0be7195d7636d2a3158e5465c53850755",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-24.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "e1cfb64d26842a1075a495d894c6a6f8a81187b535aecb36d555d19a2ad69c35",
+ "sourceRows": 24,
+ "decodedRows": 24
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977292723,
+ "friendlyName": "60_Day_COP_All_Updates",
+ "postDatetime": "2024-01-31T05:11:21"
+ },
+ "source": "work/history-annual-as-2024/NP3-991-EX.zip",
+ "zipSha256": "ec09b7f743742d7632ce8400c45b40ce8aca53a6eb1fe620869263ab85caa314",
+ "files": [
+ {
+ "member": "60d_COP_All_Updates-31-JAN-24.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP3-911-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073732150,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2025-01-31T03:49:58"
+ },
+ "source": "work/history-annual-as-2025/NP3-911-ER.zip",
+ "zipSha256": "23ae632ac982eedcb62f3e6c41532bf4588d1d0a9c21e5169cb3fef3ec817d08",
+ "files": [
+ {
+ "member": "2d_Self_Arranged_AS_NSPNM-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspnm",
+ "csvSha256": "6ab261911a539bced96b2d31e0debb8f80e395fa26459e8a248c8edd3204dcb8",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSPFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrspfr",
+ "csvSha256": "943393996c1d1ef7ddd00f2edc67fddeb4c197a79fb02f62d24dbf57a5ab28aa",
+ "sourceRows": 2598,
+ "decodedRows": 2598
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSUFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsufr",
+ "csvSha256": "a0d168ce3792ddcfbd75f9b3bb6532a1564c4736f988c082fbcd772651a34ac5",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_RRSFFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsffr",
+ "csvSha256": "fda98662acc5c50c2cc2c5816489b35ed1cc6ce491cdcc6c2dca3f8f89997884",
+ "sourceRows": 177,
+ "decodedRows": 177
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSPFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrspfr",
+ "csvSha256": "13da81536d97084a10ae636b31aee110677124cec89d53ee03f0efec6628b5e5",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSUFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsufr",
+ "csvSha256": "73e61a83f87997938ae5b9eb8abde95a03df7281f3ab49b112eb9b20072de6e0",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_RRSFFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsffr",
+ "csvSha256": "143087683d751ab96132e2929eb4fe6dea3938e340178297bf9b4619748eb8cf",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSPFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrspfr",
+ "csvSha256": "d5f3e2c00f629ed10a448d42d3eee951cd11efc712be601a4e56fd1350874e20",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSUFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsufr",
+ "csvSha256": "713c1c7bf93382fb47c2a910a338a75f87a9f089482d2279483b61d148f3784c",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_RRSFFR-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsffr",
+ "csvSha256": "d18a33b132ed05f3cbaa2eb2ef1b39a3879c0b8b5b092fef60a5580a69330e65",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ECRSM-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_ecrsm",
+ "csvSha256": "f7e0d2c671a39169fee3c6ce7661baa329c7a8976b2bf2ea9c2eff6a5b15fa32",
+ "sourceRows": 113,
+ "decodedRows": 113
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ECRSS-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_ecrss",
+ "csvSha256": "2514ce0b0dfc29fe3edc6c72d7582f5e94232eca8fa72edaeb18f077dac36d85",
+ "sourceRows": 2482,
+ "decodedRows": 2482
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_ECRSM-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrsm",
+ "csvSha256": "1cba57801307c44acac5771368f13c113b4aeb4112d792594006fba87db72daf",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_ECRSS-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrss",
+ "csvSha256": "21bc7b7d55a1fb6bf5bee16e95889d0ef2427353b525640e8df3e29b830c7b2f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_ECRSM-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrsm",
+ "csvSha256": "3ceeec6120db5df25b819cbe0beb4428db803aa222afaf6e3108b7d5d0caf47f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_ECRSS-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrss",
+ "csvSha256": "6a6ae4ae4769cb40c54fdb42e65140d7d45cb8b285c031df808831aacbfd74ca",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup",
+ "csvSha256": "fab02cc2bfcd67eb04339bdf82b1f62df43234b6184d6c92716e98b313455f7f",
+ "sourceRows": 2171,
+ "decodedRows": 2171
+ },
+ {
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn",
+ "csvSha256": "e9d952ee56a00282316003c9539ce93cced6d30b92c954a4d16896775ba7662f",
+ "sourceRows": 3010,
+ "decodedRows": 3010
+ },
+ {
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns",
+ "csvSha256": "a82e8a594b9dfc4986a5b8d1cbda04c09ab453d9f5d7c3d4569fbce5ea6ed288",
+ "sourceRows": 972,
+ "decodedRows": 972
+ },
+ {
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns",
+ "csvSha256": "bc00422bea656d6d30b0a5f92580ec757e9f9c7759cae113cb412d8a38206f7a",
+ "sourceRows": 1505,
+ "decodedRows": 1505
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup",
+ "csvSha256": "eb7f9648cefd32d40eb685087743320a54fbcac3910b352e69d3857518e8ad82",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn",
+ "csvSha256": "8a92cb70ee90ecf78440018efe8e68265d4caa435c58e986117ed206873b166e",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin",
+ "csvSha256": "32012b2d183565950ec6ebf8afa91fde9097e34c29f01e89a35548e8ec98fe39",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup",
+ "csvSha256": "f457238d9c60ea0fb89a586104577e6477aece8074a7d15482ea8c631c0f33d5",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn",
+ "csvSha256": "21fa1f69a46270ece8a9704734314bd19736f0e4a495bd06eaf0673cbc2e4c3f",
+ "sourceRows": 24,
+ "decodedRows": 24
+ },
+ {
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-25.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin",
+ "csvSha256": "2ba112c3da34e9bb5f653af7903d6d1fc633a0e9c0fc16d461430197139d1e46",
+ "sourceRows": 24,
+ "decodedRows": 24
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP3-991-EX",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073751083,
+ "friendlyName": "60_Day_COP_All_Updates",
+ "postDatetime": "2025-01-31T05:19:58"
+ },
+ "source": "work/history-annual-as-2025/NP3-991-EX.zip",
+ "zipSha256": "5363006f8bb03fc0def48fbef63e2fbd7f8b656b7aa70b5c73894e08b1a3742e",
+ "files": [
+ {
+ "member": "60d_COP_All_Updates-31-JAN-25.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ }
+ ]
+ }
+ ]
+}
diff --git a/tools/inputs/history/annual-curves-solar-evidence.json b/tools/inputs/history/annual-curves-solar-evidence.json
new file mode 100644
index 00000000..37b162a7
--- /dev/null
+++ b/tools/inputs/history/annual-curves-solar-evidence.json
@@ -0,0 +1,1747 @@
+{
+ "scope": "One January publication per product/year in 2015 through 2025 where listed. Every CSV header and up to three rows was matched to a generated reader. Only the aggregate controllable-load energy-demand table and solar forecast table were decoded in full; their counts were compared with independent CSV counts. This is not proof of all retained publications or per-field numerical correctness.",
+ "csvFilesWithExactlyOneReader": 324,
+ "fullyDecodedFiles": 20,
+ "fullyDecodedRows": 4970040,
+ "formats": {
+ ".zip": 20,
+ ".csv": 324
+ },
+ "samples": [
+ {
+ "year": 2015,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 471248142,
+ "friendlyName": "48_Hour_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2015-01-31T03:22:51.385000"
+ },
+ "source": "work/history-annual-curves-solar-2015/NP3-908-ER.zip",
+ "zipSha256": "c828112b4bdc6fb47d6c9c79bd04953acd8af609d89fa0312cb2436e81f630aa",
+ "files": [
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_West-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_South-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_North-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_West-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_South-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_North-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_Houston-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_West-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_west"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_South-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_south"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_North-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_north"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_Houston-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_houston"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_West-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_South-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_North-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_Houston-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "48_Hour_Aggr_Energy_Demand_Curves_CLR-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "d0c182dff23ac8ba56406159fb506f1981f58ac7e19409017958c790abf2a11c",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_West-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_South-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_North-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_Houston-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves-31-JAN-15.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ }
+ ]
+ },
+ {
+ "year": 2015,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2016,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 508455692,
+ "friendlyName": "48_Hour_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2016-01-31T03:28:58.593000"
+ },
+ "source": "work/history-annual-curves-solar-2016/NP3-908-ER.zip",
+ "zipSha256": "1e576123ddc3ccb6b93f9a69d5188ea1aec704a6810b8ef49205fb983d54375b",
+ "files": [
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_West-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_South-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_North-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_West-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_South-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_North-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_Houston-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_West-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_west"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_South-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_south"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_North-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_north"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_Wind_Houston-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_houston"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_West-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_South-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_North-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_Houston-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "48_Hour_Aggr_Energy_Demand_Curves_CLR-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "d0c182dff23ac8ba56406159fb506f1981f58ac7e19409017958c790abf2a11c",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_West-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_South-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_North-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_Houston-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves-31-JAN-16.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ }
+ ]
+ },
+ {
+ "year": 2016,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2017,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 550572608,
+ "friendlyName": "48_Hour_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2017-01-31T03:34:59.215000"
+ },
+ "source": "work/history-annual-curves-solar-2017/NP3-908-ER.zip",
+ "zipSha256": "c588415363fa13a3f002ae4d75e9e58ec06ad0575ae72258054afb711147e045",
+ "files": [
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_West-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_South-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_North-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "48h_Agg_Min_Energy_Supply_Curves-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_IRR-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_West-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_South-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_North-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Wind_Houston-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_IRR_West-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_IRR_South-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_IRR_North-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_West-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_South-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_North-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "48h_Agg_Energy_Supply_Curves_Houston-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "48_Hour_Aggr_Energy_Demand_Curves_CLR-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "d0c182dff23ac8ba56406159fb506f1981f58ac7e19409017958c790abf2a11c",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_West-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_South-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_North-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves_Houston-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "48h_Agg_Energy_Demand_Curves-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "48h_Agg_Supply_Curves_PVGR-31-JAN-17.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ }
+ ]
+ },
+ {
+ "year": 2017,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 550677299,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2017-01-31T23:31:28.276000"
+ },
+ "source": "work/history-annual-curves-solar-2017/NP4-737-CD.zip",
+ "zipSha256": "5f32f908a2549926718bcc80ab03c66b4f3012ba77d024e5c3617f49cafdd528",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20170131.233128.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "f57ecd3f6109b3ec03fb3cd668d37063385b177fe4c65f00ed44e33ee73536b5",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2018,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 596924664,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2018-01-31T03:32:39.182000"
+ },
+ "source": "work/history-annual-curves-solar-2018/NP3-908-ER.zip",
+ "zipSha256": "8a107974da96dadbb9d7361544d21c7951edfa65dfe95780aea80726f0b832f9",
+ "files": [
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "d0c182dff23ac8ba56406159fb506f1981f58ac7e19409017958c790abf2a11c",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-18.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ }
+ ]
+ },
+ {
+ "year": 2018,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 597032986,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2018-01-31T23:30:53.128000"
+ },
+ "source": "work/history-annual-curves-solar-2018/NP4-737-CD.zip",
+ "zipSha256": "e18038cbcc01ba95a73861fcddba7ff206dd4f9300a4f80a9bdc1ea1dcf47571",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20180131.233052.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "c3a20841d41a1bbd90ca345954817f9426f323e2b64f78c64fbbd051b86cf756",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2019,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 646658498,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2019-01-31T03:39:26.807000"
+ },
+ "source": "work/history-annual-curves-solar-2019/NP3-908-ER.zip",
+ "zipSha256": "708cc1ed29908884124d997405e5363ca5c01c39c6755263d5126555c0c705fe",
+ "files": [
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "d0c182dff23ac8ba56406159fb506f1981f58ac7e19409017958c790abf2a11c",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-19.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ }
+ ]
+ },
+ {
+ "year": 2019,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 646776271,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2019-01-31T23:31:16.923000"
+ },
+ "source": "work/history-annual-curves-solar-2019/NP4-737-CD.zip",
+ "zipSha256": "99c76b38cde4490e2c53436d86eb38605aa68e307c3b64487134965ffb56f2a4",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20190131.233116.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "721f4b00f2ee10894e947435f693e090871ac77d1cbbbbfcb0d5503a5f533ed1",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "listingReusedFrom": "history-middle-listings.json",
+ "document": {
+ "docId": 698694258,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2020-01-31T03:34:45.026000"
+ },
+ "source": "work/history-middle-2020/NP3-908-ER.zip",
+ "zipSha256": "072a95b6c3b782974fb573ebe5c0cb2d8f8624fac6a5038b09a106dc49565cb6",
+ "files": [
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "d0c182dff23ac8ba56406159fb506f1981f58ac7e19409017958c790abf2a11c",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 698824372,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2020-01-31T23:55:12.988000"
+ },
+ "source": "work/history-annual-curves-solar-2020/NP4-737-CD.zip",
+ "zipSha256": "a6da99e1a9b979ec60bd13ed5b8dc36aa6ff617787653308dc331ca91f88e558",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20200131.235512.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "4b2e66fdf241507876059c24d8c4ae6caef77e2f8865ede8582c2236128077eb",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756228215,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2021-01-31T04:47:25.922000"
+ },
+ "source": "work/history-annual-curves-solar-2021/NP3-908-ER.zip",
+ "zipSha256": "c5e5be9fa6d6942bfc337342abfd98da1a63c214b990191e530f547373222e3c",
+ "files": [
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "9dafff8926ae86a54716ef60eb7056f5ffbb7b91741afba886a29c34b31c8df8",
+ "sourceRows": 1776096,
+ "decodedRows": 1776096
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-21.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 743,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756356361,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2021-01-31T23:55:14.914000"
+ },
+ "source": "work/history-annual-curves-solar-2021/NP4-737-CD.zip",
+ "zipSha256": "3f3ce52335ef9f57a506510acb37b0c2451b968b5b8b1a50ebc453b8ab953c9b",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20210131.235514.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "43343d1aada8c068f931064c5f68782f0b7844ca9b1c64f608efa36f7d8d5735",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820374503,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2022-01-31T04:24:14.358000"
+ },
+ "source": "work/history-annual-curves-solar-2022/NP3-908-ER.zip",
+ "zipSha256": "65031478f14c18121dddb2a565ec27a8c1435388507580fd567df04dec96595b",
+ "files": [
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "06e4de489c00d9d77a7b22bed8939b25adc68577ae8f76382a97d4e29a44af57",
+ "sourceRows": 1343904,
+ "decodedRows": 1343904
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-22.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820534504,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2022-01-31T23:55:21.234000"
+ },
+ "source": "work/history-annual-curves-solar-2022/NP4-737-CD.zip",
+ "zipSha256": "1e27ddce8ad815a30db02d86842690ae2add2b3dfacdca258264bf1fe06ee151",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20220131.235521.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "dbe1243effc300d5998179e1d86e9117d789e57197809aa8ff48a532bf6a4f04",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 892926235,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2023-01-31T04:10:12.737000"
+ },
+ "source": "work/history-annual-curves-solar-2023/NP3-908-ER.zip",
+ "zipSha256": "3edba57b3ed06478f96733b64f84e606dc6ce9e0a81a6b20656c63f1059bb215",
+ "files": [
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_Houston-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_North-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_South-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_West-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "68f6f5e210984f6f26056dd7415b3717d479b63aa81ba5b7e8440a51d95b1d3e",
+ "sourceRows": 672000,
+ "decodedRows": 672000
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 893111065,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2023-01-31T23:55:19.756000"
+ },
+ "source": "work/history-annual-curves-solar-2023/NP4-737-CD.zip",
+ "zipSha256": "9024127a366442900da1b5fd1f8a5eb2819ebadcfb8b40202f7d79767598a9b9",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20230131.235519.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "5765c0be96968faf1bf428fa816f21d441452a3953881773a0ba5dc1d4654d6e",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977271820,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2024-01-31T03:26:14.971000"
+ },
+ "source": "work/history-annual-curves-solar-2024/NP3-908-ER.zip",
+ "zipSha256": "d813354796b0f53b39612148af5c1c29945a50cdfb10d2441a214abba04dd7b4",
+ "files": [
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_Houston-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_North-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_South-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_West-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_Houston-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_North-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_South-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_West-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "a38a48cdb44407fbbed36ebf57360ac9b09833f0db4af10d4808c3fc84cb243f",
+ "sourceRows": 504096,
+ "decodedRows": 504096
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-24.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 742,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977491465,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2024-01-31T23:55:33"
+ },
+ "source": "work/history-annual-curves-solar-2024/NP4-737-CD.zip",
+ "zipSha256": "aa040a5194987b427d50c2f70db136dacf151f0817d84b95d63b30ca27824e0a",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20240131.235533.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "047d7797e5d1a3844145885e1b34261beee2df95e65624a1f837b0042b8b425b",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP3-908-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073728759,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2025-01-31T03:50:14.194000"
+ },
+ "source": "work/history-annual-curves-solar-2025/NP3-908-ER.zip",
+ "zipSha256": "e2484e9f8ceb5956683cf4985e2d658aa9a1f1b1108736761d7471e481bffbd4",
+ "files": [
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_Houston-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_North-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_South-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR_West-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_Houston-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_North-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_South-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_West-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr",
+ "csvSha256": "424540886ecfebbfdd0f8a151347039b99343925888b59795eb1598313776d4b",
+ "sourceRows": 672000,
+ "decodedRows": 672000
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-25.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP4-737-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073971532,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2025-01-31T23:55:08"
+ },
+ "source": "work/history-annual-curves-solar-2025/NP4-737-CD.zip",
+ "zipSha256": "8db06323de586ae8db0b0f02b4f9a4f42ba99f6bd0e43a4fc43548f550cfa307",
+ "files": [
+ {
+ "member": "cdr.00013483.0000000000000000.20250131.235508.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "csvSha256": "cb99d9e06fa7d3b98f591a9fb3e5ba09b23ee7f21d0992ec5ce98f8df536a001",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ }
+ ]
+}
diff --git a/tools/inputs/history/annual-dam-solar-evidence.json b/tools/inputs/history/annual-dam-solar-evidence.json
new file mode 100644
index 00000000..bb5a80e5
--- /dev/null
+++ b/tools/inputs/history/annual-dam-solar-evidence.json
@@ -0,0 +1,1360 @@
+{
+ "scope": "One January publication per product/year from 2015 through 2025, where listed. All CSV rows in each downloaded publication were decoded and compared with independent CSV row counts. Empty January listings and reused January 2020 observations are recorded. This does not establish continuous retention, every historical layout, or numerical correctness for every field.",
+ "products": {
+ "np3-966-er": 143,
+ "np4-745-cd": 3
+ },
+ "downloadedPublications": 14,
+ "csvFiles": 146,
+ "decodedRows": 3639815,
+ "samples": [
+ {
+ "year": 2015,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 471251519,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2015-01-31T04:22:53"
+ },
+ "source": "work/history-annual-dam-solar-2015/NP3-966-ER.zip",
+ "zipSha256": "77a772b0611b3f91117a4ef1c7214eba078c4d41cbad59b7cdf75167c32845f5",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "c4040c893fe73c37830d93a98c8da729f37499a57f18f7975c0ef1375d7ec590",
+ "sourceRows": 5810,
+ "decodedRows": 5810
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "5db8737d79b6c600377ad0e462ac71437846a42c4864314a1dc85ae3af3baa4a",
+ "sourceRows": 4861,
+ "decodedRows": 4861
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "c7a4cc2546b986e885a24334e1d31b2b979f0962f0e901ae584631159d33e451",
+ "sourceRows": 4861,
+ "decodedRows": 4861
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "15171f81d0382a26b94a5b55ca84a9752bff9434b9c23a8fa28d40593bd73fc4",
+ "sourceRows": 4921,
+ "decodedRows": 4921
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "f7b72357a64ac0f92a6d141d56ab59ed4df70e2a3ec3f2ab47ace963d7dcfa00",
+ "sourceRows": 4921,
+ "decodedRows": 4921
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "b21a9a96c0efd0453db1406d7d6a843330592f6309286f95c0d2bfbd6442c345",
+ "sourceRows": 2420,
+ "decodedRows": 2420
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "5b3230c365f4a65a8306e7cff5903ba6cf72cca346af38682a6f21f2ea13f1f3",
+ "sourceRows": 5520,
+ "decodedRows": 5520
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "6a6d2ffcdae524a65b77b7e7c2d330d5951448f74d585001e12c229fe27aff50",
+ "sourceRows": 3664,
+ "decodedRows": 3664
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "7032ec0f770b4bdf1c0d7fd7fb4fe4513ebb328777be57460eca52142011afa9",
+ "sourceRows": 15984,
+ "decodedRows": 15984
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "6eb0401e92acf340aa0986a4ad4ea867f204c4f70e65b062e080b780d5ab111f",
+ "sourceRows": 742,
+ "decodedRows": 742
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "d03a5f6075ee76bb237d7757db115ebd59e46594d5f5446f03527ed75fea27ec",
+ "sourceRows": 62733,
+ "decodedRows": 62733
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "935d9742f6b98d220ed70872f075e694d70f7f214f947139cd9f5f87477f946c",
+ "sourceRows": 62733,
+ "decodedRows": 62733
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-15.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "fe0da50d1e4b01680a98ba9f7d1f0310ec4d0fbf7006992db7a5db3aa7f60443",
+ "sourceRows": 5810,
+ "decodedRows": 5810
+ }
+ ]
+ },
+ {
+ "year": 2015,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2016,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 508458570,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2016-01-31T04:14:01"
+ },
+ "source": "work/history-annual-dam-solar-2016/NP3-966-ER.zip",
+ "zipSha256": "3f0afa536ed599273211bc9f4daae7a60be06ffa34d79fb3ed88b3c6c924a28b",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "24b031e98b45ca4d134469208ac8917b754c667cbc05b3b1a6b3223721243b4a",
+ "sourceRows": 4244,
+ "decodedRows": 4244
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "be5f8aa9c1699a9b21022534e8aca53d9df426a5e3544ad7e74678d8c5adabdc",
+ "sourceRows": 5987,
+ "decodedRows": 5987
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "5f28f55ee9f937a3e4251454a6b0dbdd268e23aa8ebf3f78ca3d395aba0ad46e",
+ "sourceRows": 5987,
+ "decodedRows": 5987
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "dfb971bab88f704f9a628c17e2d19a8c01d0a94e18cbad0164e55c7f357d8765",
+ "sourceRows": 4917,
+ "decodedRows": 4917
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "3f6ea0f0b8ac48da70eeca5988684d7985968c8ffcdb7ab4edaa483fe31dd4be",
+ "sourceRows": 4917,
+ "decodedRows": 4917
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "c65c438f2646c58ebf1f63a31c7fc0f87ade2826c3e2fa2e6d0c962922eed7b3",
+ "sourceRows": 3480,
+ "decodedRows": 3480
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "5ff2551277ab431c63c1b42332174d1257ad477467421a6878e30457db07a2ae",
+ "sourceRows": 5664,
+ "decodedRows": 5664
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "b3d1d31283155aec4630ce86d6f4ff596eea1b3188860af2b550c0e77b48de7c",
+ "sourceRows": 4314,
+ "decodedRows": 4314
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "30cc6c9b6bd2d1f3b85175d85364957ff61eeacf1097a40481b6fecbc8dc3d80",
+ "sourceRows": 16776,
+ "decodedRows": 16776
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "178c58772772c932a17d1226d4d2a1cbbd7fd4c70f5a01af7d6ea16b0cc9ad80",
+ "sourceRows": 797,
+ "decodedRows": 797
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "b3647c7134226485b5113fb5ee852b4d49101a3d42eda54788fadb7e67cd5fa9",
+ "sourceRows": 46423,
+ "decodedRows": 46423
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "cbfdd2f04fd5f139147f9ae0f673790de427b9acecc4bafc0b0cfa55f68eee3e",
+ "sourceRows": 46423,
+ "decodedRows": 46423
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-16.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "f38f5d0474b68a26af12d4d0caa2e2305342ccb5a75e81e50de94d97c6328140",
+ "sourceRows": 4244,
+ "decodedRows": 4244
+ }
+ ]
+ },
+ {
+ "year": 2016,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2017,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 550576165,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2017-01-31T04:20:07"
+ },
+ "source": "work/history-annual-dam-solar-2017/NP3-966-ER.zip",
+ "zipSha256": "2a102c2373ef11cf43f6e83d3f5ceef4a19340b27a4477416572045d1642a84a",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "4d5909a9a464ac1d79ea0c55a86224d427d4c8fe5c0c73f3a2f6ce5605b4d791",
+ "sourceRows": 5462,
+ "decodedRows": 5462
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "32f73ae04f5c0b4b0d1008e78b0c56226a12034c567d569d104582c33a6d34f6",
+ "sourceRows": 5426,
+ "decodedRows": 5426
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "e2fa051eba61bc75bd0b98b3e36cebc1d674edd931af47b49b3d19d389a2c828",
+ "sourceRows": 5426,
+ "decodedRows": 5426
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "ac8d38ba1dd3c5dd0384379a73d4521964288efb7c26e8a96289d48d4b6185df",
+ "sourceRows": 6815,
+ "decodedRows": 6815
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "16f4aeacb57c963a220f03fe587b3221c84db3f4558211302be201e7afc95834",
+ "sourceRows": 6815,
+ "decodedRows": 6815
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "51d61e2c401af0da380f9fd0c4e444c2151941200e022891dd634389d56cc58f",
+ "sourceRows": 4298,
+ "decodedRows": 4298
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "e974c3dcbc7c5b18e4d1d60af2f079d1982cc0e01e1ae1ee9771150bbcd679f0",
+ "sourceRows": 6744,
+ "decodedRows": 6744
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "4a4e4e5b2df63bd6739f7331ce5a6a848ae621668937e80f2bd42abb1bdc5655",
+ "sourceRows": 4802,
+ "decodedRows": 4802
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "c01739aae67ad9fe66a3d81ea0cd8c4a5db97fb987b72ae078c21fdab73ca24d",
+ "sourceRows": 18096,
+ "decodedRows": 18096
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "fcde0c8bcab62a16e2a2552d68aa23093f41712cde73c6b4e244a66b38ed0713",
+ "sourceRows": 816,
+ "decodedRows": 816
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "7f8608e64fb13fa62b3b820c39cd23bc75fc4a79ea94e47882c8b782fa5031a8",
+ "sourceRows": 50880,
+ "decodedRows": 50880
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "d34a1f0b3af6aa7b6cdce945e263493ca4de9c0908d7783fc5858429e052b92a",
+ "sourceRows": 50880,
+ "decodedRows": 50880
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-17.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "8b15ff92453e79ae550e5e06c99bf78176f4b3c31f11e8991408e057c095fd9f",
+ "sourceRows": 5462,
+ "decodedRows": 5462
+ }
+ ]
+ },
+ {
+ "year": 2017,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2018,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 596928045,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2018-01-31T04:17:45"
+ },
+ "source": "work/history-annual-dam-solar-2018/NP3-966-ER.zip",
+ "zipSha256": "398deed00de69f6a17396b17770fc244d8a30a843aa5c2d30362e38a8ecc90c3",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "fc63eed6814a344485c0e5cfd35a5ce04c5fa3ea67d4c52764a0e9681b8c883a",
+ "sourceRows": 7909,
+ "decodedRows": 7909
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "c54d8a18387b9da35f8ef3ea811f2a819d871f8c2e64746906110b0c5211e1bc",
+ "sourceRows": 6621,
+ "decodedRows": 6621
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "01ee91e06872dbefbbcae077b08f0c9e9849d7938098ca5ba5e5d17f6ae6d5fb",
+ "sourceRows": 6621,
+ "decodedRows": 6621
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "f51e55437217442fc262a95d69d5718938ed040fe93e127bb7f96894782edd6c",
+ "sourceRows": 6527,
+ "decodedRows": 6527
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "00e75183ca941a38f685ca0eca1d7664bdff373108c34cfdf36424cb066b52df",
+ "sourceRows": 6527,
+ "decodedRows": 6527
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "c63007a4a8eb727f6720ed50c7a887a7c2eee24966aeec782fe1043e360a9580",
+ "sourceRows": 5500,
+ "decodedRows": 5500
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "23d0b32396318c3862c25202cfe7f5db416f0fd15ad686a26b935cb943962d36",
+ "sourceRows": 8064,
+ "decodedRows": 8064
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "0cb4aba9595af69fc16e59db2ef2859190259f6b5e81ee6e0bbabac089cd3c75",
+ "sourceRows": 4807,
+ "decodedRows": 4807
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "962b27ebaa5d24afc079e93c00b57ea8d96c8cb20e8512ed621878938c34dfae",
+ "sourceRows": 18360,
+ "decodedRows": 18360
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "cfdc972fa40fb429350e81b254620fd83dc2025c670ac4ddab38f54af4b26639",
+ "sourceRows": 714,
+ "decodedRows": 714
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "ae23106f17dfbd336f8a612e136cf5a6438803f082c43a4eebaff28cf1e91df6",
+ "sourceRows": 78353,
+ "decodedRows": 78353
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "35365bb5d9bcc6713ecac801af225bc1bc6172e4487b4eb7b508b4e35b3ec7da",
+ "sourceRows": 78353,
+ "decodedRows": 78353
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-18.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "0258146905eedd081b6384427859b272102ebf6904f43741768eea47154da4aa",
+ "sourceRows": 7909,
+ "decodedRows": 7909
+ }
+ ]
+ },
+ {
+ "year": 2018,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2019,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 646664213,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2019-01-31T04:24:30"
+ },
+ "source": "work/history-annual-dam-solar-2019/NP3-966-ER.zip",
+ "zipSha256": "3c8b3da7d3af145ea2fe43ba931d57ad02bf7b3d8c2330ae753a91a3a3e327b1",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "1aee4bb1c04ee1770f8e387e6d219a39c9e77788bc46d84965b4f8b55a7ed96e",
+ "sourceRows": 5606,
+ "decodedRows": 5606
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "fcbf781c215e3dba3388a0868d2a49b96490d2268b2fc29101aa1943dc038efa",
+ "sourceRows": 6163,
+ "decodedRows": 6163
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "81e87ea5939893e917c8cbf4ab8d38b24c210f71c4f8838681b61ef4e653c095",
+ "sourceRows": 6163,
+ "decodedRows": 6163
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "386f845c98ca4a1a26e92e3bc01eefeee660c42a3730c19b67406f7e1c7e6d1a",
+ "sourceRows": 6097,
+ "decodedRows": 6097
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "658525f204804ccd5846018acf9566111b3d4d2167542ca2f73c146d50d5421a",
+ "sourceRows": 6097,
+ "decodedRows": 6097
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "091d9c71c8cd4cbee5a94efc8a89781a5c900611d1a1f87a2ebd6d9139839130",
+ "sourceRows": 5559,
+ "decodedRows": 5559
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "f2cc216fc4dab598651ac4bc781b0135db34404c50e1e529de6ef3f3e5f4e568",
+ "sourceRows": 9552,
+ "decodedRows": 9552
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "e0873d8699d90cbcfb6ac8f12d2e2601f323c973c7cf0aac0b8491f7a9dbe4e8",
+ "sourceRows": 5070,
+ "decodedRows": 5070
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "5e95b24a01edd37c40347512a71ec0d4420ac6e79948ac9ebe2d206d34e6adb3",
+ "sourceRows": 18960,
+ "decodedRows": 18960
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "d9caaffa8702f2a31af51f8e26566e8f94beac49ab0935b8f96fafb03917277f",
+ "sourceRows": 768,
+ "decodedRows": 768
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "91bc2e2401c7f29bbaf24bcfc756a226f3dae54d9858873a50f6aeea96d04db4",
+ "sourceRows": 82631,
+ "decodedRows": 82631
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "4af549f2ac06afe08401f464745b7955fdf7a276f76ab1d8473b6d6d99eb07b8",
+ "sourceRows": 82631,
+ "decodedRows": 82631
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-19.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "f17ffc8775dd68261eb8264b3d20768729e7bd984d66fb56977ab155d28caf3f",
+ "sourceRows": 5502,
+ "decodedRows": 5502
+ }
+ ]
+ },
+ {
+ "year": 2019,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2020,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "listingReusedFrom": "history-middle-listings.json",
+ "document": {
+ "docId": 698698411,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2020-01-31T04:19:53"
+ },
+ "source": "work/history-middle-2020/NP3-966-ER.zip",
+ "zipSha256": "c07e6bc0dbf055adf82037a153bf50de017ca9f86e6be202529fa238bcfe75c5",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "2ee0517462c6b6a7c813500b7a2dc37023f310d94a46aa31c0c25fec8ecf0972",
+ "sourceRows": 8855,
+ "decodedRows": 8855
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "27ecdb91e7c174a8ca62fa60fedf2915c1b48a498cd3620679fe29a146b77a22",
+ "sourceRows": 10081,
+ "decodedRows": 10081
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "b999a4e91ef6217598b8746edf62aebf20190581010d390ac328c7924f3987e8",
+ "sourceRows": 10081,
+ "decodedRows": 10081
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "7f86a641ebf352b53d75da4d2a55be9132e8ebfccdcea89ae22791200a596ab4",
+ "sourceRows": 8287,
+ "decodedRows": 8287
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "b5f71746e2f7327df91adebecbbaa81104bac6c7158b36d5e9154fc70631d522",
+ "sourceRows": 8287,
+ "decodedRows": 8287
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "30230b917bc02bdcaa561ce15f2614aaafae168b0250687381e7dce31c78b57e",
+ "sourceRows": 7231,
+ "decodedRows": 7231
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "7532bfa0f950f25e6b4f02d3117b2b18ca110ccafe95d3509379ab1e4732458e",
+ "sourceRows": 10560,
+ "decodedRows": 10560
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "d7ed8001fc73227db12cf582b8a18ec0939f57707556f3bbad51582b4a6a4bb0",
+ "sourceRows": 4618,
+ "decodedRows": 4618
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "2098d34ffb5b2a2d537eb9731b83146e549efa98068e5f8a07548b4af17d6042",
+ "sourceRows": 20136,
+ "decodedRows": 20136
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "589eff7667f8e4d5e248dd9c066f8c90f3495272c4fd08b14ba0adce20e1051c",
+ "sourceRows": 936,
+ "decodedRows": 936
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "606d74e37e6603ec2adb95f0782fa3687c5da5f18bbb1ed1cf4bf2f506dfeabb",
+ "sourceRows": 104414,
+ "decodedRows": 104414
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "b2e4e63a406b2637f94a7a210d2e7be6558ed65f43669212d5651bf69d251771",
+ "sourceRows": 104414,
+ "decodedRows": 104414
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "ccc1b87dafdaea28148d6bf2a516c8ab23001bcdc669ebd8520bfeeec112d746",
+ "sourceRows": 8855,
+ "decodedRows": 8855
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "listingReusedFrom": "history-middle-listings.json"
+ },
+ {
+ "year": 2021,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756238389,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2021-01-31T05:47:22"
+ },
+ "source": "work/history-annual-dam-solar-2021/NP3-966-ER.zip",
+ "zipSha256": "b3eef89fb938852b24453f9236d6db9dca462897f2f6e4617a86d1f5b1915948",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "6e93fe5d65e40a4fdb0391615038432edc81897fc7144152099c1968562c0fec",
+ "sourceRows": 6688,
+ "decodedRows": 6688
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "0a3197cc10dd89f9d11aa4baa6a4a6256fa3355b9063ae836f247afb3cf2a1d8",
+ "sourceRows": 167681,
+ "decodedRows": 167681
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "01edf65aa52cc3a6d8c910b83c4abe81291d594e95e2d547752d9908bda635a7",
+ "sourceRows": 167681,
+ "decodedRows": 167681
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "c4ec5b6709699f430aeec35b8efb984dcc879f86118de08922737f640ddce6fa",
+ "sourceRows": 1114,
+ "decodedRows": 1114
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "0d5ab69b828b5fa5bc609a1438779dbdf349989b3a2a751a67d4aaed2f5ddf5d",
+ "sourceRows": 21936,
+ "decodedRows": 21936
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "5ae9fe61bc77d415ae82e91039ef940d5cb0c8b1bd2a66246d40d3f3eeb1e8f4",
+ "sourceRows": 5436,
+ "decodedRows": 5436
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "a43bcab51665a25e33e27e46b264029c5576489306aff4fad8bc813d9208a741",
+ "sourceRows": 14688,
+ "decodedRows": 14688
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "0c313b7c0cf750b8ba834b8c4d91f63341934f557dbc02c1cd1f5722bb050784",
+ "sourceRows": 8253,
+ "decodedRows": 8253
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "4f3e0094d4fe00379ec8f4ef2aa6eea4813a70f0b785d64fa8829455556ce1d7",
+ "sourceRows": 16661,
+ "decodedRows": 16661
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "68b6e939465f2cb1615f89278cb5d630a58122a48144b502dcb020b76a5796e6",
+ "sourceRows": 16661,
+ "decodedRows": 16661
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "0320cf44fb195288abb647cc08006542def30789b278d521af10b7f6a82bd39b",
+ "sourceRows": 10146,
+ "decodedRows": 10146
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "211a6e58034ed0bcb558b1f4810d0630a223483740311c04edf3ab40ed5755c3",
+ "sourceRows": 10119,
+ "decodedRows": 10119
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-21.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "81b9a30c3e07f115c00a47c16f322af13970977e37a8aac93cf2221f4f7b873f",
+ "sourceRows": 6688,
+ "decodedRows": 6688
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2022,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820393235,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2022-01-31T06:24:04"
+ },
+ "source": "work/history-annual-dam-solar-2022/NP3-966-ER.zip",
+ "zipSha256": "c8ac3b76abb346e1b4050628da3bf1b6782ebd3c230fbab4d7038d82f59eb956",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "523b66149171e7d1c238c2c43c15a21bd77203955914a47944c2129a248b4feb",
+ "sourceRows": 6823,
+ "decodedRows": 6823
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "2ffee038b36290c002e5e8b4998e12cede278d47ec3324bcb335da5a31fd65bd",
+ "sourceRows": 112635,
+ "decodedRows": 112635
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "0b730296cdf307a2dc6310a62e4ce4139cd87fa56cdde231651d5a6764c4f34f",
+ "sourceRows": 112635,
+ "decodedRows": 112635
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "e8c664c4c2ef7d3975e344981fa6214391276afc541ff6523cbfdd12fdeb49c9",
+ "sourceRows": 1081,
+ "decodedRows": 1081
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "a1aaa652a6fd2e3580bb59c0671ea61bfbc39cc015a9e49b7aed8bb221c837f0",
+ "sourceRows": 25608,
+ "decodedRows": 25608
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "4aaf85d54439d1ed80c11ddffd1f4542e257536549792d47daeab2a3b0e777d8",
+ "sourceRows": 6594,
+ "decodedRows": 6594
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "1dcb11d1cac5fa69c590d4f41cdf4fe05debce56d25836bedf0b5493f4e5c9cc",
+ "sourceRows": 16392,
+ "decodedRows": 16392
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "7d82c155dd4a9127ea6a226fe82fc0d21967c4ace57ab4477be10ed297187b5f",
+ "sourceRows": 9965,
+ "decodedRows": 9965
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "2f0c5d3d8e55bf4be01b2e8b898d45f291cc39d7a38082b57a3731f563a88a45",
+ "sourceRows": 9200,
+ "decodedRows": 9200
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "7c374ae7f4570512f8ed9687b71ed96d7fbcd2c32ecc80d0a415fabda53158fc",
+ "sourceRows": 9200,
+ "decodedRows": 9200
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "6adeff3b4be2258e846b87abe2a5a5de32445d7fe085c5fe6b467a0798c43d89",
+ "sourceRows": 21095,
+ "decodedRows": 21095
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "e27f01ece5a3e423d4942c180ea62ccaa8e8e4828043287f6eb92ecf2d94c08d",
+ "sourceRows": 21071,
+ "decodedRows": 21071
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-22.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "cfa453055a481c4d5e6d26723fcf4a18fa9da1ab53e1fbb1868f472c2ff942b3",
+ "sourceRows": 6823,
+ "decodedRows": 6823
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2023,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 892930036,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2023-01-31T04:40:02.331000"
+ },
+ "source": "work/history-annual-dam-solar-2023/NP3-966-ER.zip",
+ "zipSha256": "323bd692e5ec9780e2ce5ddc384ddebdb435e0e32a317a4cd39e9893ab98bfac",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "3d2154440b9d2e8e7bca2850f7c90696dfde2986722f938faba6a86ddc7e2d98",
+ "sourceRows": 8350,
+ "decodedRows": 8350
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "e4c99c5b401b1de96c4cc083555ee402a8a67b99f294007c812a96fb26c58ad1",
+ "sourceRows": 169771,
+ "decodedRows": 169771
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "725c44b0d9c2d5753c7ae7fdcf94842bd42492b847a51b326c331d6c9198b04a",
+ "sourceRows": 169771,
+ "decodedRows": 169771
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "6687c4fb4c57cf2d7b712273d071a767ac0268a1b8dcea40980b3a49b1946221",
+ "sourceRows": 1010,
+ "decodedRows": 1010
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "2897b76ef51f5f488f36d75ef8caaefa383d34f05fa454f639b8a053d42d3c22",
+ "sourceRows": 27624,
+ "decodedRows": 27624
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "5bb3980d7f5aebbec94961ffb2de23433ba6fca0329f312a12d19f1b543c00bf",
+ "sourceRows": 6852,
+ "decodedRows": 6852
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "f2b4b99ec3f8fce532c5e2b25b939e2360b5b3a6d3ab4f7c14b896d8440ee9ad",
+ "sourceRows": 15408,
+ "decodedRows": 15408
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "c585a83adbf407e3881b8abf6cd7135f1b5c726d6d1cb78cbd2d366dde1f1b9b",
+ "sourceRows": 7411,
+ "decodedRows": 7411
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "8e818313efde2809dd45f6d163333d3f02a8849a60af16bef3546e3aea1ccb33",
+ "sourceRows": 16637,
+ "decodedRows": 16637
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "4989af12dee3135b9ebf3e87c2c58beded8bb2c6983febd3f6ba7a21bfc0b4e1",
+ "sourceRows": 16637,
+ "decodedRows": 16637
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "45d67027c03d0738b91729295bd43438df0dcc7b04ba58387a13512f779aa125",
+ "sourceRows": 13439,
+ "decodedRows": 13439
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "20748f5aed9386101e28a165071bd16ea92960ac1ec8305134f03cbe24abf2ba",
+ "sourceRows": 13438,
+ "decodedRows": 13438
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "61e206a6ef4dfffe6df5b2f19cc01abc56faeb1831cece04e16194c57e1ee6a8",
+ "sourceRows": 8350,
+ "decodedRows": 8350
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 893111071,
+ "friendlyName": "PVGRHRLYAVGACTGEONP4745_csv",
+ "postDatetime": "2023-01-31T23:55:22.910000"
+ },
+ "source": "work/history-annual-dam-solar-2023/NP4-745-CD.zip",
+ "zipSha256": "291811b0d2ceb260a5a31afea733e473fad008b4986d9eabfda7216038edca34",
+ "files": [
+ {
+ "member": "cdr.00021809.0000000000000000.20230131.235522.PVGRHRLYAVGACTGEONP4745.csv",
+ "reader": "np4-745-cd/spp_hrly_actual_fcast_geo",
+ "csvSha256": "02bd8dd306ac4852c4a9750945476c6fc7ac5d037ab31cde6ce5611bfcf3672a",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 32,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977282760,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2024-01-31T04:26:06.946000"
+ },
+ "source": "work/history-annual-dam-solar-2024/NP3-966-ER.zip",
+ "zipSha256": "1f527ef62c834d82337fe89873e698f745e731819358f1085b62ccd7a2ae944c",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "e0101b3239b058db59eb297c229a37bc85175ad6ebd0fb3afc35dcb4639e0c8b",
+ "sourceRows": 9092,
+ "decodedRows": 9092
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "5c445ee553be82f1b3f6f0bb8f01b085d87c07ac66b195079509d2b6eb3477ad",
+ "sourceRows": 181400,
+ "decodedRows": 181400
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "33351dd7a7c9373696b6d61faaea58428a9b69261f9771a5f86d77fa9dbb968e",
+ "sourceRows": 181400,
+ "decodedRows": 181400
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "f053283a819e0abe308d14c05d19beae996a47bdf5318ad6d58c747d7d74806d",
+ "sourceRows": 1053,
+ "decodedRows": 1053
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "f2875e4ae53df10305c58ac65faa7dc758034704840941b883145533c3235d66",
+ "sourceRows": 30888,
+ "decodedRows": 30888
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "ad69605572f9c9ad134732f5e2828a9441d413dae6f5d349e005e2ad8127e651",
+ "sourceRows": 8189,
+ "decodedRows": 8189
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "7b733f12ef2b809c5e26eee016486cf8ed0586d089d3f8571b6aefaa6d7f2306",
+ "sourceRows": 15264,
+ "decodedRows": 15264
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "5b4935043e2184a37a68d415a855b6e8cbe047ec74ce6a06d3915ec58d0006ae",
+ "sourceRows": 7959,
+ "decodedRows": 7959
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "59398520acdbd4b194eaa0080697a5b6e38946adfc058b33b9327b71f7355ca6",
+ "sourceRows": 18401,
+ "decodedRows": 18401
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "9f02365dbe0db715f4ce90f20c84d43b9a11ff472d649b6728153b3515c0418a",
+ "sourceRows": 18401,
+ "decodedRows": 18401
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "c5e5ee0f5a0d7a409fb46a2a19a12b10ecb1b7570ef51748f333d1264a858140",
+ "sourceRows": 22145,
+ "decodedRows": 22145
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "f29d564873edcf80e1cc9bb0d71d0a5c79ac9218b2e215a4243a8560aba670b8",
+ "sourceRows": 22138,
+ "decodedRows": 22138
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-24.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "fd2debfd77cfba1cbcdf3ad8b9798e5e1dd911a50e802022e6a833f5d5f112a8",
+ "sourceRows": 9092,
+ "decodedRows": 9092
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 742,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977491495,
+ "friendlyName": "PVGRHRLYAVGACTGEONP4745_csv",
+ "postDatetime": "2024-01-31T23:55:34"
+ },
+ "source": "work/history-annual-dam-solar-2024/NP4-745-CD.zip",
+ "zipSha256": "c477ecb319f2787382dc86f03c65da5f877cc4a41ad70c33974ecb9054b0b7c1",
+ "files": [
+ {
+ "member": "cdr.00021809.0000000000000000.20240131.235534.PVGRHRLYAVGACTGEONP4745.csv",
+ "reader": "np4-745-cd/spp_hrly_actual_fcast_geo",
+ "csvSha256": "b11e8e04caa66b9ab0f2fed8e77499792e92f0feb8b5cee58e02d36fc85ffd9d",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP3-966-ER",
+ "totalJanuaryPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073757827,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2025-01-31T05:49:58"
+ },
+ "source": "work/history-annual-dam-solar-2025/NP3-966-ER.zip",
+ "zipSha256": "a4a29cd5f0bc07167694b54190745f3ca22d1aff58f4902cb37c2f3f1d750645",
+ "files": [
+ {
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "csvSha256": "25e63c0be48da853f23adda0c5cfe318ff392711a77c4db48b5c97cc4f0b5c09",
+ "sourceRows": 8343,
+ "decodedRows": 8343
+ },
+ {
+ "member": "60d_DAM_PTPObligationBids-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids",
+ "csvSha256": "17888dd189643a893f6dfc81777c7363d1563268a353b614b0df228b16986577",
+ "sourceRows": 173135,
+ "decodedRows": 173135
+ },
+ {
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "csvSha256": "716e593eca330cbf35900f7b7a3617bdca70c08a2dbc138850a8f3bdbbbf1e5f",
+ "sourceRows": 173135,
+ "decodedRows": 173135
+ },
+ {
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as",
+ "csvSha256": "0cb72f588dd88cb576c59c6898b25d5b53cb9329f0555029f51aee45dfc258e8",
+ "sourceRows": 792,
+ "decodedRows": 792
+ },
+ {
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data",
+ "csvSha256": "38ac41ddf872b65689231fc539a722b91b8b18948a81e16522e44eefeba246e7",
+ "sourceRows": 34176,
+ "decodedRows": 34176
+ },
+ {
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers",
+ "csvSha256": "9f2ee4bb5eda9aa1a3c7b2ce1577387ba20ee7798603b2f6a7a639b9403d0c34",
+ "sourceRows": 8798,
+ "decodedRows": 8798
+ },
+ {
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_load_res_data",
+ "csvSha256": "a3e104433a8a116f9f60ba7e0aaba1bba0cc54ea6e81c097999a739ae539fcc7",
+ "sourceRows": 17256,
+ "decodedRows": 17256
+ },
+ {
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers",
+ "csvSha256": "0989bccd6fe7c9360f3359ed8aa9674a47879d13fdc285548d555eedb32b2d88",
+ "sourceRows": 6429,
+ "decodedRows": 6429
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers",
+ "csvSha256": "658d51e2e338592214ec3338ab651fac1bb6fd96b8c2373a459823082f69b2a4",
+ "sourceRows": 16785,
+ "decodedRows": 16785
+ },
+ {
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards",
+ "csvSha256": "55eb4e927d72e2ac22c29e36ded0df993a1177fc04fc24fa0ffa9e9e26db5e0d",
+ "sourceRows": 16785,
+ "decodedRows": 16785
+ },
+ {
+ "member": "60d_DAM_EnergyBids-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_energy_bids",
+ "csvSha256": "cb50b4045d971d3de2f67e637890227f403ecd7c6c46e26f28381f2fbe6fcabd",
+ "sourceRows": 33651,
+ "decodedRows": 33651
+ },
+ {
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards",
+ "csvSha256": "dc1282905b02f53834826918239ee9eee220b6e95c5d5bc84127d64c15291583",
+ "sourceRows": 33651,
+ "decodedRows": 33651
+ },
+ {
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-25.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt",
+ "csvSha256": "3139dadf94bd638b77819257679fecbf931bca7b248ef5b2343b3f829fde7e2f",
+ "sourceRows": 8343,
+ "decodedRows": 8343
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP4-745-CD",
+ "totalJanuaryPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073971825,
+ "friendlyName": "PVGRHRLYAVGACTGEONP4745_csv",
+ "postDatetime": "2025-01-31T23:55:07"
+ },
+ "source": "work/history-annual-dam-solar-2025/NP4-745-CD.zip",
+ "zipSha256": "2f3067019392d28871c050bb6237559fae6b919228bebc83953c2f4403ca4c4d",
+ "files": [
+ {
+ "member": "cdr.00021809.0000000000000000.20250131.235507.PVGRHRLYAVGACTGEONP4745.csv",
+ "reader": "np4-745-cd/spp_hrly_actual_fcast_geo",
+ "csvSha256": "9e27977037838f5bb03f7d079d2a4d62f7d34925ed17ff46cc34c5f6cd29f868",
+ "sourceRows": 216,
+ "decodedRows": 216
+ }
+ ]
+ }
+ ]
+}
diff --git a/tools/inputs/history/annual-evidence.json b/tools/inputs/history/annual-evidence.json
new file mode 100644
index 00000000..f7d74043
--- /dev/null
+++ b/tools/inputs/history/annual-evidence.json
@@ -0,0 +1,98 @@
+[
+ {
+ "endpoint": "np4-732-cd/wpp_hrly_avrg_actl_fcast",
+ "member": "cdr.00013028.0000000000000000.20160131.233108.WPPHRLYAVGACTNP4732.csv",
+ "fixture": "np4-732-cd-wpp_hrly_avrg_actl_fcast-2016.csv",
+ "source": "work/history-annual-2016/NP4-732-CD.zip",
+ "sourceRows": 215,
+ "fixtureRows": 3,
+ "csvSha256": "60462255ede089d784903d0dc45de500bae2fcf9e5d66e2f4f5467eb4d36fba4",
+ "firstRow": {
+ "postedDatetime": null,
+ "deliveryDate": null,
+ "hourEnding": null,
+ "genSystemWide": null,
+ "COPHSLSystemWide": "7732.1",
+ "STWPFSystemWide": "7960.3",
+ "WGRPPSystemWide": "6761.2",
+ "genLoadZoneSouthHouston": null,
+ "COPHSLLoadZoneSouthHouston": null,
+ "STWPFLoadZoneSouthHouston": null,
+ "WGRPPLoadZoneSouthHouston": null,
+ "genLoadZoneWest": null,
+ "COPHSLLoadZoneWest": null,
+ "STWPFLoadZoneWest": null,
+ "WGRPPLoadZoneWest": null,
+ "genLoadZoneNorth": null,
+ "COPHSLLoadZoneNorth": null,
+ "STWPFLoadZoneNorth": null,
+ "WGRPPLoadZoneNorth": null,
+ "HSLSystemWide": null,
+ "DSTFlag": false,
+ "hourEndingTimestamp": null,
+ "actualSystemWide": "6986.24",
+ "actualSouthHouston": "2151.24",
+ "COPHSLSouthHouston": "2358.7",
+ "STWPFSouthHouston": "2429",
+ "WGRPPSouthHouston": "2174.9",
+ "actualWestNorth": "4835",
+ "COPHSLWestNorth": "5373.4",
+ "STWPFWestNorth": "5531.3",
+ "WGRPPWestNorth": "4586.3",
+ "actualLoadZoneSouthHouston": null,
+ "actualLoadZoneWest": null,
+ "actualLoadZoneNorth": null,
+ "hourBeginningTimestamp": "2016-01-30T00:00:00"
+ },
+ "decodedRows": 215,
+ "zipSha256": "6c9a54e19f1812434adbebb4496051f5cb24bbb162a9a84efc956dc923636b35"
+ },
+ {
+ "endpoint": "np4-732-cd/wpp_hrly_avrg_actl_fcast",
+ "member": "cdr.00013028.0000000000000000.20170131.233128.WPPHRLYAVGACTNP4732.csv",
+ "fixture": "np4-732-cd-wpp_hrly_avrg_actl_fcast-2017.csv",
+ "source": "work/history-annual-2017/NP4-732-CD.zip",
+ "sourceRows": 216,
+ "fixtureRows": 3,
+ "csvSha256": "f561633f10d75d9f453ca075e5ec44ba17bcfab786f02f953465fbcbf2d948ef",
+ "firstRow": {
+ "postedDatetime": null,
+ "deliveryDate": "2017-01-29",
+ "hourEnding": 24,
+ "genSystemWide": null,
+ "COPHSLSystemWide": "7882.2",
+ "STWPFSystemWide": "7655.4",
+ "WGRPPSystemWide": "6328.2",
+ "genLoadZoneSouthHouston": null,
+ "COPHSLLoadZoneSouthHouston": null,
+ "STWPFLoadZoneSouthHouston": null,
+ "WGRPPLoadZoneSouthHouston": null,
+ "genLoadZoneWest": null,
+ "COPHSLLoadZoneWest": null,
+ "STWPFLoadZoneWest": null,
+ "WGRPPLoadZoneWest": null,
+ "genLoadZoneNorth": null,
+ "COPHSLLoadZoneNorth": null,
+ "STWPFLoadZoneNorth": null,
+ "WGRPPLoadZoneNorth": null,
+ "HSLSystemWide": null,
+ "DSTFlag": false,
+ "hourEndingTimestamp": null,
+ "actualSystemWide": "7172.73",
+ "actualSouthHouston": "751.69",
+ "COPHSLSouthHouston": "582.1",
+ "STWPFSouthHouston": "594.7",
+ "WGRPPSouthHouston": "355.6",
+ "actualWestNorth": "6421.04",
+ "COPHSLWestNorth": "7300.1",
+ "STWPFWestNorth": "7060.7",
+ "WGRPPWestNorth": "5972.6",
+ "actualLoadZoneSouthHouston": null,
+ "actualLoadZoneWest": null,
+ "actualLoadZoneNorth": null,
+ "hourBeginningTimestamp": null
+ },
+ "decodedRows": 216,
+ "zipSha256": "04cc24372aaa0851c648d9a1b9262fc06b6c5434257c5006d3cec2289db882e9"
+ }
+]
diff --git a/tools/inputs/history/annual-workbooks-evidence.json b/tools/inputs/history/annual-workbooks-evidence.json
new file mode 100644
index 00000000..3dc232e1
--- /dev/null
+++ b/tools/inputs/history/annual-workbooks-evidence.json
@@ -0,0 +1,1245 @@
+{
+ "scope": "One January publication per year where available. Demand-response selected sheets were compared with all seven source data cells for every row. Price-adder selected sheets were decoded in full, and SCEDTimestamp, repeatHourFlag, systemLambda, RTRUCCST30HSL and RTNCLRNSCAP were compared with source cells for every row. Empty future month sheets and empty January listings are retained in the evidence. This does not establish continuous retention or every historical layout. For 15-minute price-adders, all seven source values were compared for every row, and the absent newer price components remain None. These eight annual samples contain only the Jan worksheet.",
+ "demandResponse": {
+ "files": 8,
+ "rows": 816,
+ "allSourceValuesMatch": true
+ },
+ "priceAdders": {
+ "files": 7,
+ "rows": 55173,
+ "checkedFields": [
+ "SCEDTimestamp",
+ "repeatHourFlag",
+ "systemLambda",
+ "RTRUCCST30HSL",
+ "RTNCLRNSCAP"
+ ],
+ "allCheckedSourceValuesMatch": true
+ },
+ "samples": [
+ {
+ "year": 2015,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2015,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2016,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2016,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2017,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2017,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2018,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 593398390,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_17_12",
+ "postDatetime": "2018-01-04T08:07:38"
+ },
+ "source": "work/history-annual-workbooks-2018/NP3-108.zip",
+ "zipSha256": "b5b3272adfcc40e21b87c340aa0c85bf1254f904b51317ea876ecd41a33252cf",
+ "files": [
+ {
+ "member": "593398390.rpt.00013242.0000000000000000.20180104.080738083.Monthly_ERCOT_LoadResourceDR_17_12.xlsx",
+ "xlsxSha256": "0b5b557297a05f75dfc0378560f1796304c3ec1cced86c70b065fe76dbccdc8f",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 96,
+ "decodedRows": 96
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2018,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2019,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 642983796,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_18_12",
+ "postDatetime": "2019-01-04T08:14:39"
+ },
+ "source": "work/history-annual-workbooks-2019/NP3-108.zip",
+ "zipSha256": "34a309260936f013be7e658e7c44cd5f09a587dddc2108c491070b62488ef828",
+ "files": [
+ {
+ "member": "642983796.rpt.00013242.0000000000000000.20190104.081439650.Monthly_ERCOT_LoadResourceDR_18_12.xlsx",
+ "xlsxSha256": "04649131d66a736640b705b8165d709258cbea280c5c23e2bda4fc7e83f832aa",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 96,
+ "decodedRows": 96
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2019,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2020,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "listingReusedFrom": "history-middle-listings.json",
+ "document": {
+ "docId": 694720108,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_19_12",
+ "postDatetime": "2020-01-04T08:13:57"
+ },
+ "source": "work/history-middle-2020/NP3-108.zip",
+ "zipSha256": "bf177592474907018f70ab0c61deb6017cc3e4df5a3a8f95773f3b8ab5326999",
+ "files": [
+ {
+ "member": "694720108.rpt.00013242.0000000000000000.20200104.081357846.Monthly_ERCOT_LoadResourceDR_19_12.xlsx",
+ "xlsxSha256": "787da39c1f64f76d98c2ecdb8f76dee9c7ea8de03876a6a35ca8b2763f7b1efb",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 96,
+ "decodedRows": 96
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2021,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 751906418,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_20_12",
+ "postDatetime": "2021-01-04T19:17:49"
+ },
+ "source": "work/history-annual-workbooks-2021/NP3-108.zip",
+ "zipSha256": "f4175463359d0c36256c6c0a5324f66f3a81a75f38cd6cf84b62766d5e9c543f",
+ "files": [
+ {
+ "member": "751906418.rpt.00013242.0000000000000000.20210104.191749809.Monthly_ERCOT_LoadResourceDR_20_12.xlsx",
+ "xlsxSha256": "2e30d46bf0369b8f100878ff4ea403afc4aef9784b7e9c44735e779b59102bd7",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 96,
+ "decodedRows": 96
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2022,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 815470313,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_21_12",
+ "postDatetime": "2022-01-04T08:55:09"
+ },
+ "source": "work/history-annual-workbooks-2022/NP3-108.zip",
+ "zipSha256": "de41bfe68b231692ddcee756202f7c10e35a1f98e11882d101d20181dd924880",
+ "files": [
+ {
+ "member": "815470313.rpt.00013242.0000000000000000.20220104.085509846.Monthly_ERCOT_LoadResourceDR_21_12.xlsx",
+ "xlsxSha256": "9bf9aed0747d1923286d0398e69387ce2476370c698234fa8be37caeb7e35307",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 96,
+ "decodedRows": 96
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2023,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 887247882,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_22_12",
+ "postDatetime": "2023-01-04T08:16:58"
+ },
+ "source": "work/history-annual-workbooks-2023/NP3-108.zip",
+ "zipSha256": "8dc305cd378510c6a68e1761f9c2be28e642bf7f1158b1eeb96d1b40fcd0fdc1",
+ "files": [
+ {
+ "member": "887247882.rpt.00013242.0000000000000000.20230104.081658666.Monthly_ERCOT_LoadResourceDR_22_12.xlsx",
+ "xlsxSha256": "f81815341ae1a019209c7041ca18cc7974eb79a40c3c81e1058ab78cda6e7274",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 96,
+ "decodedRows": 96
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2024,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 970554714,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_23_12",
+ "postDatetime": "2024-01-04T08:14:10"
+ },
+ "source": "work/history-annual-workbooks-2024/NP3-108.zip",
+ "zipSha256": "a53ba3ceaa0276d2cc613bccffd231a632e59cad6f21007ba64ce8b7ca2b9ced",
+ "files": [
+ {
+ "member": "970554714.rpt.00013242.0000000000000000.20240104.081410154.Monthly_ERCOT_LoadResourceDR_23_12.xlsx",
+ "xlsxSha256": "73f77f0c036259d4cda464b7fb25c98da5955a23ed0858e3797d256e6c6ff439",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 120,
+ "decodedRows": 120
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2025,
+ "product": "NP3-108",
+ "totalJanuaryPublications": 1,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1066292055,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_24_12",
+ "postDatetime": "2025-01-04T08:20:35"
+ },
+ "source": "work/history-annual-workbooks-2025/NP3-108.zip",
+ "zipSha256": "a8d9370611a713a490f66634d16ae650870d50ed8356b56efd72b68dc90ce3d2",
+ "files": [
+ {
+ "member": "1066292055.rpt.00013242.0000000000000000.20250104.082035860.Monthly_ERCOT_LoadResourceDR_24_12.xlsx",
+ "xlsxSha256": "8b88ec539844a75f3b427894d0d1f6ef080aac3bc9397377647d435ea6e9aca7",
+ "sheets": [
+ {
+ "name": "Report Data",
+ "sourceRows": 120,
+ "decodedRows": 120
+ }
+ ],
+ "documentationSheet": "Report Info"
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP5-520-ER",
+ "totalJanuaryPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ }
+ },
+ {
+ "year": 2019,
+ "product": "NP6-792-ER",
+ "totalJanuaryPublications": 8,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 646145899,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2019",
+ "postDatetime": "2019-01-27T10:02:00"
+ },
+ "source": "work/history-annual-price-workbooks-2019/NP6-792-ER.zip",
+ "zipSha256": "3d338b36a4c853a5d8fdaeb6658abcf4ebee326a8f73698dfc5b0161dab091eb",
+ "files": [
+ {
+ "member": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2019.xlsx",
+ "xlsxSha256": "d3b99de28715a5aeb4fcc2e142dce042a494fe587195f276dcf8d5854397e24c",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 7527,
+ "decodedRows": 7527,
+ "firstTimestamp": "2019-01-01 00:00:20",
+ "lastTimestamp": "2019-01-26 23:55:09"
+ },
+ {
+ "name": "Feb",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Mar",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Apr",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "May",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jun",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jul",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Aug",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Sep",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Oct",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Nov",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Dec",
+ "sourceRows": 0,
+ "decodedRows": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "product": "NP6-792-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 697984113,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2020",
+ "postDatetime": "2020-01-26T10:02:05"
+ },
+ "source": "work/history-annual-price-workbooks-2020/NP6-792-ER.zip",
+ "zipSha256": "496dfe3cc14c62bd834938b22ddf7606d90b7a317c2dad0edd480ae0994931cd",
+ "files": [
+ {
+ "member": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2020.xlsx",
+ "xlsxSha256": "3a6ecd67b2c1903a555e1323a90e09f0d8e35b1257017ec91e270a28e3d26617",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 7234,
+ "decodedRows": 7234,
+ "firstTimestamp": "2020-01-01 00:00:25.999000",
+ "lastTimestamp": "2020-01-25 23:55:16.999000"
+ },
+ {
+ "name": "Feb",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Mar",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Apr",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "May",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jun",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jul",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Aug",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Sep",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Oct",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Nov",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Dec",
+ "sourceRows": 0,
+ "decodedRows": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP6-792-ER",
+ "totalJanuaryPublications": 6,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756271442,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2021",
+ "postDatetime": "2021-01-31T10:06:03"
+ },
+ "source": "work/history-annual-price-workbooks-2021/NP6-792-ER.zip",
+ "zipSha256": "6b7560e4d8e34f98b7ff89505823e3bd7b75788e3b211d6a61c3853d810cb35c",
+ "files": [
+ {
+ "member": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2021.xlsx",
+ "xlsxSha256": "a9ef1b85c398a3bd0a76ee18d4e14fa001f946ae9a2c668445719536113f7639",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 8757,
+ "decodedRows": 8757,
+ "firstTimestamp": "2021-01-01 00:00:20",
+ "lastTimestamp": "2021-01-30 23:55:14.999000"
+ },
+ {
+ "name": "Feb",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Mar",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Apr",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "May",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jun",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jul",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Aug",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Sep",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Oct",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Nov",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Dec",
+ "sourceRows": 0,
+ "decodedRows": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP6-792-ER",
+ "totalJanuaryPublications": 6,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820248364,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2022",
+ "postDatetime": "2022-01-30T10:06:22"
+ },
+ "source": "work/history-annual-price-workbooks-2022/NP6-792-ER.zip",
+ "zipSha256": "5ef1c2e0ca7c58068d63d3bad5590a357f6b4687ddc3a182452cb5f048dd7b54",
+ "files": [
+ {
+ "member": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2022.xlsx",
+ "xlsxSha256": "f4dfc4566c4eeb6154e2eaad2f9e169d3ba6ec04bee2584680ffeee0518bd101",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 8473,
+ "decodedRows": 8473,
+ "firstTimestamp": "2022-01-01 00:00:18.999000",
+ "lastTimestamp": "2022-01-29 23:55:18"
+ },
+ {
+ "name": "Feb",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Mar",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Apr",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "May",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jun",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jul",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Aug",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Sep",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Oct",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Nov",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Dec",
+ "sourceRows": 0,
+ "decodedRows": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP6-792-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 892552928,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2023",
+ "postDatetime": "2023-01-29T10:04:20"
+ },
+ "source": "work/history-annual-price-workbooks-2023/NP6-792-ER.zip",
+ "zipSha256": "c5b4b68486e0ba0d4df1802056ff9d0a72ad4537292ccd17ea3af7335f1d6dc4",
+ "files": [
+ {
+ "member": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2023.xlsx",
+ "xlsxSha256": "0cbcdea1044816a7f2b048fca1a712bd9e12a9362096f90cc4be5a0ce980aaee",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 8102,
+ "decodedRows": 8102,
+ "firstTimestamp": "2023-01-01 00:00:20",
+ "lastTimestamp": "2023-01-28 23:55:16"
+ },
+ {
+ "name": "Feb",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Mar",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Apr",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "May",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jun",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jul",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Aug",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Sep",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Oct",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Nov",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Dec",
+ "sourceRows": 0,
+ "decodedRows": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP6-792-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 976588816,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2024",
+ "postDatetime": "2024-01-28T10:02:20"
+ },
+ "source": "work/history-annual-price-workbooks-2024/NP6-792-ER.zip",
+ "zipSha256": "07fd9afad21125d1a8736524ade0eb0e5fb8967efce637254cdec70fd5f1054d",
+ "files": [
+ {
+ "member": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2024.xlsx",
+ "xlsxSha256": "28e12f795d4e618bcf2eb26409fb1a30afdabd588b9d89548bcd68eb490bce86",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 7829,
+ "decodedRows": 7829,
+ "firstTimestamp": "2024-01-01 00:00:27",
+ "lastTimestamp": "2024-01-27 23:55:19"
+ },
+ {
+ "name": "Feb",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Mar",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Apr",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "May",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jun",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jul",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Aug",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Sep",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Oct",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Nov",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Dec",
+ "sourceRows": 0,
+ "decodedRows": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP6-792-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1072411748,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2025",
+ "postDatetime": "2025-01-26T10:01:26"
+ },
+ "source": "work/history-annual-price-workbooks-2025/NP6-792-ER.zip",
+ "zipSha256": "4d76586c0e2ee53ccd1d244a3ddf7796cc98934642e3de1f33f158fa73504b42",
+ "files": [
+ {
+ "member": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2025.xlsx",
+ "xlsxSha256": "5eaa2ebd51f6e23a4f896a9d13439ad0c04332c832cd4c9400537390a5a1e8c0",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 7251,
+ "decodedRows": 7251,
+ "firstTimestamp": "2025-01-01 00:00:13",
+ "lastTimestamp": "2025-01-25 23:55:11"
+ },
+ {
+ "name": "Feb",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Mar",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Apr",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "May",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jun",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Jul",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Aug",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Sep",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Oct",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Nov",
+ "sourceRows": 0,
+ "decodedRows": 0
+ },
+ {
+ "name": "Dec",
+ "sourceRows": 0,
+ "decodedRows": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2018,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 596568513,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2018",
+ "postDatetime": "2018-01-28T10:04:58"
+ },
+ "source": "work/history-annual-interval-workbooks-2018/NP6-793-ER.zip",
+ "zipSha256": "be7efbdda8f7a891a7c5e36a130688ea0196682726dd19d2d9141a92376acccd",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20180128.100002.RTM_ORDC_REL_DPLY_PRC_15MINT_2018.xlsx",
+ "xlsxSha256": "3d7570276b70d1291cc9eb42fcc1dfb88d4cc6b854d88024060e52a13b7ed79d",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2592,
+ "decodedRows": 2592
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2019,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 646146980,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2019",
+ "postDatetime": "2019-01-27T10:10:42"
+ },
+ "source": "work/history-annual-interval-workbooks-2019/NP6-793-ER.zip",
+ "zipSha256": "5eb5a6f7f8e3be57878c4646fe9e4ffbafde28bd3211143a9811f97a52449035",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20190127.100002.RTM_ORDC_REL_DPLY_PRC_15MINT_2019.xlsx",
+ "xlsxSha256": "c61b5160ae68c1606ecea04a544feca1dd16e194e6236ec702c8cae0ca30bb23",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2496,
+ "decodedRows": 2496
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 697984658,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2020",
+ "postDatetime": "2020-01-26T10:14:02"
+ },
+ "source": "work/history-annual-interval-workbooks-2020/NP6-793-ER.zip",
+ "zipSha256": "cbd1e8b94adb2debd441e3f81a06c0cfeb3730de095c4bf35abb2e87fb09740d",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20200126.100003.RTM_ORDC_REL_DPLY_PRC_15MINT_2020.xlsx",
+ "xlsxSha256": "feec6b1ddd11d83cb01c10ec91be62ea76a92b9f4aa8e48a906a7d18b1aa2650",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2400,
+ "decodedRows": 2400
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 6,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756275177,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2021",
+ "postDatetime": "2021-01-31T10:46:56"
+ },
+ "source": "work/history-annual-interval-workbooks-2021/NP6-793-ER.zip",
+ "zipSha256": "6c2a508d5d107a2e36ca22a443d5c3b63f43c4c669ac88fc0f99d5aeb1929d32",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20210131.100003.RTM_ORDC_REL_DPLY_PRC_15MINT_2021.xlsx",
+ "xlsxSha256": "3eccb70ffcefadc13198160f17b1a54e6ff59cb02130e72f5a0b68ca9735287f",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2880,
+ "decodedRows": 2880
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 6,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820253100,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2022",
+ "postDatetime": "2022-01-30T10:51:52"
+ },
+ "source": "work/history-annual-interval-workbooks-2022/NP6-793-ER.zip",
+ "zipSha256": "71c48af58179463f116c063688ead39f62f570ef4c6676789bcda320d74c30e2",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20220130.100008.RTM_ORDC_REL_DPLY_PRC_15MINT_2022.xlsx",
+ "xlsxSha256": "24ac244f18383eadce1e6ebf9545e8e43f45645b573df91cd6382c79b9f951da",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2784,
+ "decodedRows": 2784
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 892560706,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2023",
+ "postDatetime": "2023-01-29T11:02:25"
+ },
+ "source": "work/history-annual-interval-workbooks-2023/NP6-793-ER.zip",
+ "zipSha256": "ea05f64070ed4f23936747dbc98a7924890e6038cb3735db7088bda281e30b39",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20230129.100006.RTM_ORDC_REL_DPLY_PRC_15MINT_2023.xlsx",
+ "xlsxSha256": "16d1697c8f6a6b188cb6d866131af1ada4cd7eb87c226fcd4199479b24dc7e48",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2688,
+ "decodedRows": 2688
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 976698157,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2024",
+ "postDatetime": "2024-01-28T21:26:55"
+ },
+ "source": "work/history-annual-interval-workbooks-2024/NP6-793-ER.zip",
+ "zipSha256": "fb696b5b07f27328644b56ed838f175613d6c980c32f27462e202bd0fc86baed",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20240128.100005.RTM_ORDC_REL_DPLY_PRC_15MINT_2024.xlsx",
+ "xlsxSha256": "35182cbdc7b8717c33bfe1f19945a95c40c0623f53d8f1203e6cddf6f6a67fbc",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2592,
+ "decodedRows": 2592
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "product": "NP6-793-ER",
+ "totalJanuaryPublications": 5,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1072411752,
+ "friendlyName": "RTM_ORDC_REL_DPLY_PRC_15MINT_2025",
+ "postDatetime": "2025-01-26T10:06:03"
+ },
+ "source": "work/history-annual-interval-workbooks-2025/NP6-793-ER.zip",
+ "zipSha256": "34aa684c3389116a45352fc85d71611c2a3b3f51979b3dccffdfe283c4baa3c2",
+ "files": [
+ {
+ "member": "rpt.00013240.0000000000000000.20250126.100011.RTM_ORDC_REL_DPLY_PRC_15MINT_2025.xlsx",
+ "xlsxSha256": "197fc1f1222895d051b47315eb6310562c5ead44153a61f9ba77d0979b4788fd",
+ "sheets": [
+ {
+ "name": "Jan",
+ "sourceRows": 2400,
+ "decodedRows": 2400
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "intervalPriceAdders": {
+ "files": 8,
+ "rows": 20832,
+ "allSourceValuesMatch": true,
+ "checkedFields": [
+ "deliveryDate",
+ "deliveryHour",
+ "deliveryInterval",
+ "repeatHourFlag",
+ "RTRSVPOR",
+ "RTRSVPOFF",
+ "RTRDP"
+ ],
+ "unreportedFieldsCheckedNull": [
+ "RTRDPA",
+ "RTRDPRU",
+ "RTRDPRD",
+ "RTRDPRRS",
+ "RTRDPECRS",
+ "RTRDPNS"
+ ]
+ }
+}
diff --git a/tools/inputs/history/archive-only-evidence.json b/tools/inputs/history/archive-only-evidence.json
new file mode 100644
index 00000000..6640f478
--- /dev/null
+++ b/tools/inputs/history/archive-only-evidence.json
@@ -0,0 +1,302 @@
+[
+ {
+ "endpoint": "np1-300/adjusted_meter_load",
+ "file": "1232383729.rpt.00012360.0000000000000000.20260529.084556.20260526_PublicAML.csv",
+ "fixture": "np1-300-history-samples.csv",
+ "csv_rows": 640,
+ "first_row": {
+ "saveRecorder": "POSTEDAML_123_101_LZ_HOUSTON",
+ "saveChannel": "3",
+ "startTime": "2025-11-30",
+ "INT001": "70.456297",
+ "INT002": "70.638771",
+ "INT003": "69.9157749999",
+ "INT004": "69.5513559999",
+ "INT005": "70.066984",
+ "INT006": "70.4402529999",
+ "INT007": "71.518983",
+ "INT008": "71.0531009999",
+ "INT009": "69.7941799999",
+ "INT010": "69.667612",
+ "INT011": "70.445317",
+ "INT012": "70.6792619999",
+ "INT013": "70.0102129999",
+ "INT014": "69.220692",
+ "INT015": "69.133565",
+ "INT016": "69.537682",
+ "INT017": "70.0050439999",
+ "INT018": "69.607776",
+ "INT019": "69.353965",
+ "INT020": "69.366872",
+ "INT021": "69.251064",
+ "INT022": "68.715705",
+ "INT023": "68.770436",
+ "INT024": "68.508516",
+ "INT025": "68.7938419999",
+ "INT026": "69.916466",
+ "INT027": "69.7402459999",
+ "INT028": "69.977159",
+ "INT029": "68.639167",
+ "INT030": "68.73215",
+ "INT031": "68.5863659999",
+ "INT032": "68.4622739999",
+ "INT033": "68.276454",
+ "INT034": "68.3406279999",
+ "INT035": "68.611483",
+ "INT036": "68.9905109999",
+ "INT037": "69.098566",
+ "INT038": "69.039264",
+ "INT039": "69.285325",
+ "INT040": "69.068763",
+ "INT041": "68.581136",
+ "INT042": "69.0108089999",
+ "INT043": "69.122157",
+ "INT044": "68.868081",
+ "INT045": "68.7639499999",
+ "INT046": "68.665103",
+ "INT047": "68.641523",
+ "INT048": "68.5249869999",
+ "INT049": "68.172404",
+ "INT050": "68.296402",
+ "INT051": "68.445682",
+ "INT052": "68.734622",
+ "INT053": "68.642735",
+ "INT054": "68.5021299999",
+ "INT055": "68.628679",
+ "INT056": "68.6212249999",
+ "INT057": "68.7822649999",
+ "INT058": "68.7395929999",
+ "INT059": "68.974704",
+ "INT060": "69.116381",
+ "INT061": "69.010666",
+ "INT062": "68.790243",
+ "INT063": "68.6991139999",
+ "INT064": "68.759286",
+ "INT065": "68.9509639999",
+ "INT066": "68.709247",
+ "INT067": "68.5145229999",
+ "INT068": "68.9947609999",
+ "INT069": "69.2245539999",
+ "INT070": "69.003928",
+ "INT071": "68.8039339999",
+ "INT072": "68.8797339999",
+ "INT073": "68.5910599999",
+ "INT074": "68.3952259999",
+ "INT075": "67.926539",
+ "INT076": "67.728009",
+ "INT077": "67.559211",
+ "INT078": "67.629091",
+ "INT079": "67.523025",
+ "INT080": "67.5260729999",
+ "INT081": "67.398401",
+ "INT082": "67.1771109999",
+ "INT083": "67.4438619999",
+ "INT084": "67.732208",
+ "INT085": "67.446365",
+ "INT086": "67.0223019999",
+ "INT087": "66.8199039999",
+ "INT088": "66.6190959999",
+ "INT089": "66.8602839999",
+ "INT090": "66.7412139999",
+ "INT091": "66.3582349999",
+ "INT092": "66.051134",
+ "INT093": "66.220579",
+ "INT094": "66.069445",
+ "INT095": "65.6514949999",
+ "INT096": "65.9150589999",
+ "INT097": null,
+ "INT098": null,
+ "INT099": null,
+ "INT100": null,
+ "LSTime": "2026-05-26"
+ },
+ "rows_decoded": 640
+ },
+ {
+ "endpoint": "np1-300/adjusted_meter_load",
+ "file": "1271634377.rpt.00012360.0000000000000000.20260907.091125.20260904_PublicAML.csv",
+ "fixture": "np1-300-history-current.csv",
+ "csv_rows": 649,
+ "first_row": {
+ "saveRecorder": "POSTEDAML_123_101_LZ_HOUSTON",
+ "saveChannel": "3",
+ "startTime": "2026-03-11",
+ "INT001": "64.9549319999",
+ "INT002": "65.79653",
+ "INT003": "66.018083",
+ "INT004": "66.086875",
+ "INT005": "66.27621",
+ "INT006": "65.538994",
+ "INT007": "66.3461029999",
+ "INT008": "65.358203",
+ "INT009": "65.156856",
+ "INT010": "65.590871",
+ "INT011": "65.935522",
+ "INT012": "65.66845",
+ "INT013": "66.487722",
+ "INT014": "66.5426939999",
+ "INT015": "67.1742299999",
+ "INT016": "67.323312",
+ "INT017": "67.723494",
+ "INT018": "66.68965",
+ "INT019": "66.586977",
+ "INT020": "66.8912339999",
+ "INT021": "67.897125",
+ "INT022": "69.682011",
+ "INT023": "70.0886289999",
+ "INT024": "71.1625549999",
+ "INT025": "71.8858409999",
+ "INT026": "72.661703",
+ "INT027": "73.094661",
+ "INT028": "72.8599329999",
+ "INT029": "72.5647809999",
+ "INT030": "73.314012",
+ "INT031": "73.8385669999",
+ "INT032": "73.749026",
+ "INT033": "72.0913809999",
+ "INT034": "73.4144519999",
+ "INT035": "74.1197959999",
+ "INT036": "74.3210339999",
+ "INT037": "74.967433",
+ "INT038": "75.036967",
+ "INT039": "75.474141",
+ "INT040": "75.036145",
+ "INT041": "75.2880779999",
+ "INT042": "75.4150539999",
+ "INT043": "76.1769259999",
+ "INT044": "76.293017",
+ "INT045": "76.6144599999",
+ "INT046": "75.009786",
+ "INT047": "76.277313",
+ "INT048": "75.836882",
+ "INT049": "74.5732469999",
+ "INT050": "74.4499459999",
+ "INT051": "74.522863",
+ "INT052": "74.7975019999",
+ "INT053": "75.2729719999",
+ "INT054": "74.86654",
+ "INT055": "74.586876",
+ "INT056": "74.07325",
+ "INT057": "73.6154059999",
+ "INT058": "72.3818559999",
+ "INT059": "72.1889199999",
+ "INT060": "72.2052139999",
+ "INT061": "72.224265",
+ "INT062": "72.4203779999",
+ "INT063": "73.429579",
+ "INT064": "72.721102",
+ "INT065": "72.375195",
+ "INT066": "71.1682919999",
+ "INT067": "71.279655",
+ "INT068": "71.166004",
+ "INT069": "70.8845079999",
+ "INT070": "70.530021",
+ "INT071": "70.168379",
+ "INT072": "69.51728",
+ "INT073": "67.926214",
+ "INT074": "67.428116",
+ "INT075": "67.331023",
+ "INT076": "67.3340769999",
+ "INT077": "66.4534639999",
+ "INT078": "66.1713409999",
+ "INT079": "66.4026",
+ "INT080": "66.4659319999",
+ "INT081": "65.977366",
+ "INT082": "65.4962979999",
+ "INT083": "65.148139",
+ "INT084": "64.977472",
+ "INT085": "64.3000509999",
+ "INT086": "64.0165049999",
+ "INT087": "63.872773",
+ "INT088": "63.6706709999",
+ "INT089": "63.046511",
+ "INT090": "62.9516679999",
+ "INT091": "62.8057039999",
+ "INT092": "63.47424",
+ "INT093": "63.4659809999",
+ "INT094": "62.121568",
+ "INT095": "61.93177",
+ "INT096": "61.480995",
+ "INT097": null,
+ "INT098": null,
+ "INT099": null,
+ "INT100": null,
+ "LSTime": "2026-09-04"
+ },
+ "rows_decoded": 649
+ },
+ {
+ "endpoint": "copg-316/load_estimation_counts",
+ "file": "1243154773.rpt.00011130.0000000000000000.20260626.080644.LoadEstCounts_20260626.csv",
+ "fixture": "copg-316-history-samples.csv",
+ "csv_rows": 434,
+ "first_row": {
+ "type": "IDR",
+ "region": "ERCOT",
+ "TDSP": "TRI COUNTY ELECTRIC CO OP INC (TDSP)",
+ "operatingDay": "2026-05-02",
+ "channel": "2",
+ "actualCount": 64,
+ "historicalEstimatedCount": 0,
+ "defaultProfileCount": 0,
+ "totalCount": 64,
+ "percentActualCount": "100",
+ "percentHistoricalEstimatedCount": "0",
+ "percentDefaultProfileCount": "0"
+ },
+ "rows_decoded": 434
+ },
+ {
+ "endpoint": "copg-316/load_estimation_counts",
+ "file": "1271634378.rpt.00011130.0000000000000000.20260907.091126.LoadEstCounts_20260907.csv",
+ "fixture": "copg-316-history-current.csv",
+ "csv_rows": 437,
+ "first_row": {
+ "type": "IDR",
+ "region": "ERCOT",
+ "TDSP": "J A C ELECTRIC CO OP INC (TDSP)",
+ "operatingDay": "2026-09-01",
+ "channel": "1",
+ "actualCount": 10,
+ "historicalEstimatedCount": 0,
+ "defaultProfileCount": 0,
+ "totalCount": 10,
+ "percentActualCount": "100",
+ "percentHistoricalEstimatedCount": "0",
+ "percentDefaultProfileCount": "0"
+ },
+ "rows_decoded": 437
+ },
+ {
+ "endpoint": "np3-988-er/resources",
+ "file": "1166614741.rpt.00010036.0000000000000000.20251201.051353614.ResDMEList_01122025.csv",
+ "fixture": "np3-988-er-history-samples.csv",
+ "csv_rows": 1589,
+ "first_row": {
+ "ownerRE": "224WB 8ME LLC (RE)",
+ "resourceName": "GALLOWAY_SOLAR2",
+ "resourceType": "Generation",
+ "splitGenResource": "Not Applicable",
+ "DME": "224WB 8ME LLC (DME)",
+ "DMEDuns": "0815527087000",
+ "RMR": false
+ },
+ "rows_decoded": 1589
+ },
+ {
+ "endpoint": "np3-988-er/resources",
+ "file": "1271562268.rpt.00010036.0000000000000000.20260907.051500.ResDMEList_07092026.csv",
+ "fixture": "np3-988-er-history-current.csv",
+ "csv_rows": 1653,
+ "first_row": {
+ "ownerRE": "1370 SHANNON LLC (RE)",
+ "resourceName": "SHANNONW_UNIT_1",
+ "resourceType": "Generation",
+ "splitGenResource": "Not Applicable",
+ "DME": "1370 SHANNON LLC (DME)",
+ "DMEDuns": "1450336317000",
+ "RMR": false
+ },
+ "rows_decoded": 1653
+ }
+]
diff --git a/tools/inputs/history/availability-observations.json b/tools/inputs/history/availability-observations.json
new file mode 100644
index 00000000..a26c3a90
--- /dev/null
+++ b/tools/inputs/history/availability-observations.json
@@ -0,0 +1,184 @@
+{
+ "checkedAt": "2026-09-07T19:36:49.618744+00:00",
+ "listings": [
+ {
+ "product": "EIA-930-CD",
+ "kind": "archive",
+ "meta": {
+ "totalRecords": 3122,
+ "pageSize": 1,
+ "totalPages": 3122,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": [
+ {
+ "docId": 1271713625,
+ "friendlyName": "ERCOsamedaydemand",
+ "postDatetime": "2026-09-07T14:05:00"
+ }
+ ]
+ },
+ {
+ "product": "EIA-930-CD",
+ "kind": "bundle",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ },
+ {
+ "product": "NP6-569-CD",
+ "kind": "archive",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ },
+ {
+ "product": "NP6-569-CD",
+ "kind": "bundle",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ },
+ {
+ "product": "NP6-655-CD",
+ "kind": "archive",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ },
+ {
+ "product": "NP6-655-CD",
+ "kind": "bundle",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ },
+ {
+ "product": "NP6-913-CD",
+ "kind": "archive",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ },
+ {
+ "product": "NP6-913-CD",
+ "kind": "bundle",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ }
+ ],
+ "eiaDateQueries": [
+ {
+ "day": "2026-09-06",
+ "meta": {
+ "totalRecords": 24,
+ "pageSize": 1,
+ "totalPages": 24,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2026-09-06T00:00:00",
+ "postDatetimeTo": "2026-09-07T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": [
+ {
+ "docId": 1271465461,
+ "friendlyName": "ERCOsamedaydemand",
+ "postDatetime": "2026-09-06T23:05:00"
+ }
+ ]
+ },
+ {
+ "day": "2019-09-08",
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2019-09-08T00:00:00",
+ "postDatetimeTo": "2019-09-09T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "documents": []
+ }
+ ],
+ "note": "Point-in-time public API observations. Empty listings do not establish permanent unavailability or historical retention."
+}
diff --git a/tools/inputs/history/backfill-first-rows-evidence.json b/tools/inputs/history/backfill-first-rows-evidence.json
new file mode 100644
index 00000000..93f08006
--- /dev/null
+++ b/tools/inputs/history/backfill-first-rows-evidence.json
@@ -0,0 +1,24 @@
+{
+ "checkedAt": "2026-09-08T15:18:09.065666+00:00",
+ "product": "NP6-905-CD",
+ "scope": "First 1000 rows of a live unbounded backfill, independently compared with original CSV fields. Proves bundle rows are available before any archive-listing requests; not a full-history comparison or latency guarantee.",
+ "rowsCompared": 1000,
+ "firstRowSeconds": 11.757,
+ "firstDeliveryDate": "2026-08-11",
+ "archiveRequestsBeforeRows": 0,
+ "bundleBytes": 23434293,
+ "bundleSha256": "fd59ec7ae3de4a8543d0c1bdbc0944ea388779a04943a0c7687172c2ec8dbfd7",
+ "historyDecoderSha256": "a9a2fcc790495bc8a6b7c643fd3a678ca23734c33f1563ce85f4264defa1f400",
+ "requests": [
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np6-905-cd",
+ "query": "page=1&size=1000"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/bundle/np6-905-cd/download",
+ "query": ""
+ }
+ ]
+}
diff --git a/tools/inputs/history/bundle-evidence.json b/tools/inputs/history/bundle-evidence.json
new file mode 100644
index 00000000..35d05888
--- /dev/null
+++ b/tools/inputs/history/bundle-evidence.json
@@ -0,0 +1,4059 @@
+{
+ "note": "Point-in-time listings and complete downloaded-file checks. Bundle publication timestamps do not bound source row dates. The listed DAM bundle initially failed POST; its GET link subsequently succeeded, and the client fallback decoded every row. Missing listed months remain unresolved.",
+ "listings": [
+ {
+ "product": "NP4-190-CD",
+ "checkedAt": "2026-09-07T19:53:20.070724+00:00",
+ "bundleMeta": null,
+ "bundles": [
+ {
+ "docId": -1257192853,
+ "friendlyName": "DAMSPNP4190_2026-08",
+ "postDatetime": "2026-08-31T23:59:59"
+ },
+ {
+ "docId": -1233594477,
+ "friendlyName": "DAMSPNP4190_2026-06",
+ "postDatetime": "2026-06-30T23:59:59"
+ },
+ {
+ "docId": -1221822399,
+ "friendlyName": "DAMSPNP4190_2026-05",
+ "postDatetime": "2026-05-31T23:59:59"
+ },
+ {
+ "docId": -1210457477,
+ "friendlyName": "DAMSPNP4190_2026-04",
+ "postDatetime": "2026-04-30T23:59:59"
+ },
+ {
+ "docId": -1199017492,
+ "friendlyName": "DAMSPNP4190_2026-03",
+ "postDatetime": "2026-03-31T23:59:59"
+ },
+ {
+ "docId": -1188872331,
+ "friendlyName": "DAMSPNP4190_2026-02",
+ "postDatetime": "2026-02-28T23:59:59"
+ },
+ {
+ "docId": -1177724586,
+ "friendlyName": "DAMSPNP4190_2026-01",
+ "postDatetime": "2026-01-31T23:59:59"
+ },
+ {
+ "docId": -1166751049,
+ "friendlyName": "DAMSPNP4190_2025-12",
+ "postDatetime": "2025-12-31T23:59:59"
+ },
+ {
+ "docId": -1156221915,
+ "friendlyName": "DAMSPNP4190_2025-11",
+ "postDatetime": "2025-11-30T23:59:59"
+ },
+ {
+ "docId": -1145974809,
+ "friendlyName": "DAMSPNP4190_2025-10",
+ "postDatetime": "2025-10-31T23:59:59"
+ },
+ {
+ "docId": -1136047137,
+ "friendlyName": "DAMSPNP4190_2025-09",
+ "postDatetime": "2025-09-30T23:59:59"
+ },
+ {
+ "docId": -1126295499,
+ "friendlyName": "DAMSPNP4190_2025-08",
+ "postDatetime": "2025-08-31T23:59:59"
+ },
+ {
+ "docId": -1116902653,
+ "friendlyName": "DAMSPNP4190_2025-07",
+ "postDatetime": "2025-07-31T23:59:59"
+ },
+ {
+ "docId": -1108107173,
+ "friendlyName": "DAMSPNP4190_2025-06",
+ "postDatetime": "2025-06-30T23:59:59"
+ },
+ {
+ "docId": -1099066295,
+ "friendlyName": "DAMSPNP4190_2025-05",
+ "postDatetime": "2025-05-31T23:59:59"
+ },
+ {
+ "docId": -1090563466,
+ "friendlyName": "DAMSPNP4190_2025-04",
+ "postDatetime": "2025-04-30T23:59:59"
+ },
+ {
+ "docId": -1081942620,
+ "friendlyName": "DAMSPNP4190_2025-03",
+ "postDatetime": "2025-03-31T23:59:59"
+ },
+ {
+ "docId": -1074117152,
+ "friendlyName": "DAMSPNP4190_2025-02",
+ "postDatetime": "2025-02-28T23:59:59"
+ },
+ {
+ "docId": -1065519626,
+ "friendlyName": "DAMSPNP4190_2025-01",
+ "postDatetime": "2025-01-31T23:59:59"
+ },
+ {
+ "docId": -1056999421,
+ "friendlyName": "DAMSPNP4190_2024-12",
+ "postDatetime": "2024-12-31T23:59:59"
+ },
+ {
+ "docId": -1048897798,
+ "friendlyName": "DAMSPNP4190_2024-11",
+ "postDatetime": "2024-11-30T23:59:59"
+ },
+ {
+ "docId": -1040602650,
+ "friendlyName": "DAMSPNP4190_2024-10",
+ "postDatetime": "2024-10-31T23:59:59"
+ },
+ {
+ "docId": -1032534792,
+ "friendlyName": "DAMSPNP4190_2024-09",
+ "postDatetime": "2024-09-30T23:59:59"
+ },
+ {
+ "docId": -1024358201,
+ "friendlyName": "DAMSPNP4190_2024-08",
+ "postDatetime": "2024-08-31T23:59:59"
+ },
+ {
+ "docId": -1016234742,
+ "friendlyName": "DAMSPNP4190_2024-07",
+ "postDatetime": "2024-07-31T23:59:59"
+ },
+ {
+ "docId": -1008424446,
+ "friendlyName": "DAMSPNP4190_2024-06",
+ "postDatetime": "2024-06-30T23:59:59"
+ },
+ {
+ "docId": -1000374995,
+ "friendlyName": "DAMSPNP4190_2024-05",
+ "postDatetime": "2024-05-31T23:59:59"
+ },
+ {
+ "docId": -1000105847,
+ "friendlyName": "DAMSPNP4190_2024-04",
+ "postDatetime": "2024-04-30T23:59:59"
+ },
+ {
+ "docId": -984863346,
+ "friendlyName": "DAMSPNP4190_2024-03",
+ "postDatetime": "2024-03-31T23:59:59"
+ },
+ {
+ "docId": -977630829,
+ "friendlyName": "DAMSPNP4190_2024-02",
+ "postDatetime": "2024-02-29T23:59:59"
+ },
+ {
+ "docId": -969849010,
+ "friendlyName": "DAMSPNP4190_2024-01",
+ "postDatetime": "2024-01-31T23:59:59"
+ },
+ {
+ "docId": -962295657,
+ "friendlyName": "DAMSPNP4190_2023-12",
+ "postDatetime": "2023-12-31T23:59:59"
+ },
+ {
+ "docId": -955117057,
+ "friendlyName": "DAMSPNP4190_2023-11",
+ "postDatetime": "2023-11-30T23:59:59"
+ },
+ {
+ "docId": -947803721,
+ "friendlyName": "DAMSPNP4190_2023-10",
+ "postDatetime": "2023-10-31T23:59:59"
+ },
+ {
+ "docId": -940744026,
+ "friendlyName": "DAMSPNP4190_2023-09",
+ "postDatetime": "2023-09-30T23:59:59"
+ },
+ {
+ "docId": -933447503,
+ "friendlyName": "DAMSPNP4190_2023-08",
+ "postDatetime": "2023-08-31T23:59:59"
+ },
+ {
+ "docId": -926308103,
+ "friendlyName": "DAMSPNP4190_2023-07",
+ "postDatetime": "2023-07-31T23:59:59"
+ },
+ {
+ "docId": -919484624,
+ "friendlyName": "DAMSPNP4190_2023-06",
+ "postDatetime": "2023-06-30T23:59:59"
+ },
+ {
+ "docId": -912520114,
+ "friendlyName": "DAMSPNP4190_2023-05",
+ "postDatetime": "2023-05-31T23:59:59"
+ },
+ {
+ "docId": -905952335,
+ "friendlyName": "DAMSPNP4190_2023-04",
+ "postDatetime": "2023-04-30T23:59:59"
+ },
+ {
+ "docId": -899237482,
+ "friendlyName": "DAMSPNP4190_2023-03",
+ "postDatetime": "2023-03-31T23:59:59"
+ },
+ {
+ "docId": -893229757,
+ "friendlyName": "DAMSPNP4190_2023-02",
+ "postDatetime": "2023-02-28T23:59:59"
+ },
+ {
+ "docId": -886666489,
+ "friendlyName": "DAMSPNP4190_2023-01",
+ "postDatetime": "2023-01-31T23:59:59"
+ },
+ {
+ "docId": -880199200,
+ "friendlyName": "DAMSPNP4190_2022-12",
+ "postDatetime": "2022-12-31T23:59:59"
+ },
+ {
+ "docId": -873998866,
+ "friendlyName": "DAMSPNP4190_2022-11",
+ "postDatetime": "2022-11-30T23:59:59"
+ },
+ {
+ "docId": -867655993,
+ "friendlyName": "DAMSPNP4190_2022-10",
+ "postDatetime": "2022-10-31T23:59:59"
+ },
+ {
+ "docId": -861572470,
+ "friendlyName": "DAMSPNP4190_2022-09",
+ "postDatetime": "2022-09-30T23:59:59"
+ },
+ {
+ "docId": -855333359,
+ "friendlyName": "DAMSPNP4190_2022-08",
+ "postDatetime": "2022-08-31T23:59:59"
+ },
+ {
+ "docId": -849116224,
+ "friendlyName": "DAMSPNP4190_2022-07",
+ "postDatetime": "2022-07-31T23:59:59"
+ },
+ {
+ "docId": -843154958,
+ "friendlyName": "DAMSPNP4190_2022-06",
+ "postDatetime": "2022-06-30T23:59:59"
+ },
+ {
+ "docId": -837094266,
+ "friendlyName": "DAMSPNP4190_2022-05",
+ "postDatetime": "2022-05-31T23:59:59"
+ },
+ {
+ "docId": -831484454,
+ "friendlyName": "DAMSPNP4190_2022-04",
+ "postDatetime": "2022-04-30T23:59:59"
+ },
+ {
+ "docId": -825787671,
+ "friendlyName": "DAMSPNP4190_2022-03",
+ "postDatetime": "2022-03-31T23:59:59"
+ },
+ {
+ "docId": -820676094,
+ "friendlyName": "DAMSPNP4190_2022-02",
+ "postDatetime": "2022-02-28T23:59:59"
+ },
+ {
+ "docId": -814952388,
+ "friendlyName": "DAMSPNP4190_2022-01",
+ "postDatetime": "2022-01-31T23:59:59"
+ },
+ {
+ "docId": -809338753,
+ "friendlyName": "DAMSPNP4190_2021-12",
+ "postDatetime": "2021-12-31T23:59:59"
+ },
+ {
+ "docId": -803929763,
+ "friendlyName": "DAMSPNP4190_2021-11",
+ "postDatetime": "2021-11-30T23:59:59"
+ },
+ {
+ "docId": -798378052,
+ "friendlyName": "DAMSPNP4190_2021-10",
+ "postDatetime": "2021-10-31T23:59:59"
+ },
+ {
+ "docId": -793011655,
+ "friendlyName": "DAMSPNP4190_2021-09",
+ "postDatetime": "2021-09-30T23:59:59"
+ },
+ {
+ "docId": -787477229,
+ "friendlyName": "DAMSPNP4190_2021-08",
+ "postDatetime": "2021-08-31T23:59:59"
+ },
+ {
+ "docId": -781972887,
+ "friendlyName": "DAMSPNP4190_2021-07",
+ "postDatetime": "2021-07-31T23:59:59"
+ },
+ {
+ "docId": -776744876,
+ "friendlyName": "DAMSPNP4190_2021-06",
+ "postDatetime": "2021-06-30T23:59:59"
+ },
+ {
+ "docId": -771399222,
+ "friendlyName": "DAMSPNP4190_2021-05",
+ "postDatetime": "2021-05-31T23:59:59"
+ },
+ {
+ "docId": -766274120,
+ "friendlyName": "DAMSPNP4190_2021-04",
+ "postDatetime": "2021-04-30T23:59:59"
+ },
+ {
+ "docId": -761108634,
+ "friendlyName": "DAMSPNP4190_2021-03",
+ "postDatetime": "2021-03-31T23:59:59"
+ },
+ {
+ "docId": -756453565,
+ "friendlyName": "DAMSPNP4190_2021-02",
+ "postDatetime": "2021-02-28T23:59:59"
+ },
+ {
+ "docId": -751382657,
+ "friendlyName": "DAMSPNP4190_2021-01",
+ "postDatetime": "2021-01-31T23:59:59"
+ },
+ {
+ "docId": -746350553,
+ "friendlyName": "DAMSPNP4190_2020-12",
+ "postDatetime": "2020-12-31T23:59:59"
+ },
+ {
+ "docId": -741618101,
+ "friendlyName": "DAMSPNP4190_2020-11",
+ "postDatetime": "2020-11-30T23:59:59"
+ },
+ {
+ "docId": -736726052,
+ "friendlyName": "DAMSPNP4190_2020-10",
+ "postDatetime": "2020-10-31T23:59:59"
+ },
+ {
+ "docId": -731930655,
+ "friendlyName": "DAMSPNP4190_2020-09",
+ "postDatetime": "2020-09-30T23:59:59"
+ },
+ {
+ "docId": -726935813,
+ "friendlyName": "DAMSPNP4190_2020-08",
+ "postDatetime": "2020-08-31T23:59:59"
+ },
+ {
+ "docId": -721999251,
+ "friendlyName": "DAMSPNP4190_2020-07",
+ "postDatetime": "2020-07-31T23:59:59"
+ },
+ {
+ "docId": -717285459,
+ "friendlyName": "DAMSPNP4190_2020-06",
+ "postDatetime": "2020-06-30T23:59:59"
+ },
+ {
+ "docId": -712520845,
+ "friendlyName": "DAMSPNP4190_2020-05",
+ "postDatetime": "2020-05-31T23:59:59"
+ },
+ {
+ "docId": -707963539,
+ "friendlyName": "DAMSPNP4190_2020-04",
+ "postDatetime": "2020-04-30T23:59:59"
+ },
+ {
+ "docId": -703274271,
+ "friendlyName": "DAMSPNP4190_2020-03",
+ "postDatetime": "2020-03-31T23:59:59"
+ },
+ {
+ "docId": -698905317,
+ "friendlyName": "DAMSPNP4190_2020-02",
+ "postDatetime": "2020-02-29T23:59:59"
+ },
+ {
+ "docId": -694308742,
+ "friendlyName": "DAMSPNP4190_2020-01",
+ "postDatetime": "2020-01-31T23:59:59"
+ },
+ {
+ "docId": -689788958,
+ "friendlyName": "DAMSPNP4190_2019-12",
+ "postDatetime": "2019-12-31T23:59:59"
+ },
+ {
+ "docId": -685550179,
+ "friendlyName": "DAMSPNP4190_2019-11",
+ "postDatetime": "2019-11-30T23:59:59"
+ },
+ {
+ "docId": -681114487,
+ "friendlyName": "DAMSPNP4190_2019-10",
+ "postDatetime": "2019-10-31T23:59:59"
+ },
+ {
+ "docId": -676714211,
+ "friendlyName": "DAMSPNP4190_2019-09",
+ "postDatetime": "2019-09-30T23:59:59"
+ },
+ {
+ "docId": -672204368,
+ "friendlyName": "DAMSPNP4190_2019-08",
+ "postDatetime": "2019-08-31T23:59:59"
+ },
+ {
+ "docId": -667729484,
+ "friendlyName": "DAMSPNP4190_2019-07",
+ "postDatetime": "2019-07-31T23:59:59"
+ },
+ {
+ "docId": -663400999,
+ "friendlyName": "DAMSPNP4190_2019-06",
+ "postDatetime": "2019-06-30T23:59:59"
+ },
+ {
+ "docId": -659008776,
+ "friendlyName": "DAMSPNP4190_2019-05",
+ "postDatetime": "2019-05-31T23:59:59"
+ },
+ {
+ "docId": -654829561,
+ "friendlyName": "DAMSPNP4190_2019-04",
+ "postDatetime": "2019-04-30T23:59:59"
+ },
+ {
+ "docId": -650647607,
+ "friendlyName": "DAMSPNP4190_2019-03",
+ "postDatetime": "2019-03-31T23:59:59"
+ },
+ {
+ "docId": -646855358,
+ "friendlyName": "DAMSPNP4190_2019-02",
+ "postDatetime": "2019-02-28T23:59:59"
+ },
+ {
+ "docId": -642588970,
+ "friendlyName": "DAMSPNP4190_2019-01",
+ "postDatetime": "2019-01-31T23:59:59"
+ },
+ {
+ "docId": -638360117,
+ "friendlyName": "DAMSPNP4190_2018-12",
+ "postDatetime": "2018-12-31T23:59:59"
+ },
+ {
+ "docId": -634325398,
+ "friendlyName": "DAMSPNP4190_2018-11",
+ "postDatetime": "2018-11-30T23:59:59"
+ },
+ {
+ "docId": -630130990,
+ "friendlyName": "DAMSPNP4190_2018-10",
+ "postDatetime": "2018-10-31T23:59:59"
+ },
+ {
+ "docId": -626006823,
+ "friendlyName": "DAMSPNP4190_2018-09",
+ "postDatetime": "2018-09-30T23:59:59"
+ },
+ {
+ "docId": -621676499,
+ "friendlyName": "DAMSPNP4190_2018-08",
+ "postDatetime": "2018-08-31T23:59:59"
+ },
+ {
+ "docId": -617324420,
+ "friendlyName": "DAMSPNP4190_2018-07",
+ "postDatetime": "2018-07-31T23:59:59"
+ },
+ {
+ "docId": -613170975,
+ "friendlyName": "DAMSPNP4190_2018-06",
+ "postDatetime": "2018-06-30T23:59:59"
+ },
+ {
+ "docId": -608939265,
+ "friendlyName": "DAMSPNP4190_2018-05",
+ "postDatetime": "2018-05-31T23:59:59"
+ },
+ {
+ "docId": -604906753,
+ "friendlyName": "DAMSPNP4190_2018-04",
+ "postDatetime": "2018-04-30T23:59:59"
+ },
+ {
+ "docId": -600817980,
+ "friendlyName": "DAMSPNP4190_2018-03",
+ "postDatetime": "2018-03-31T23:59:59"
+ },
+ {
+ "docId": -597110794,
+ "friendlyName": "DAMSPNP4190_2018-02",
+ "postDatetime": "2018-02-28T23:59:59"
+ },
+ {
+ "docId": -593019152,
+ "friendlyName": "DAMSPNP4190_2018-01",
+ "postDatetime": "2018-01-31T23:59:59"
+ }
+ ],
+ "missingBundleMonths": [
+ "2026-07"
+ ],
+ "oldestArchivePage": {
+ "meta": {
+ "totalRecords": 4513,
+ "pageSize": 1,
+ "totalPages": 4513,
+ "currentPage": 4513,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-190-CD",
+ "name": "DAM Settlement Point Prices",
+ "reportTypeId": 12331
+ },
+ "archives": [
+ {
+ "docId": 446428304,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2014-05-01T12:59:25",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-190-cd?download=446428304",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-190-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ },
+ {
+ "product": "NP6-345-CD",
+ "checkedAt": "2026-09-07T19:53:32.689316+00:00",
+ "bundleMeta": null,
+ "bundles": [
+ {
+ "docId": -1233471327,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2026-06",
+ "postDatetime": "2026-06-30T23:59:59"
+ },
+ {
+ "docId": -1221703513,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2026-05",
+ "postDatetime": "2026-05-31T23:59:59"
+ },
+ {
+ "docId": -1210341453,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2026-04",
+ "postDatetime": "2026-04-30T23:59:59"
+ },
+ {
+ "docId": -1198898866,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2026-03",
+ "postDatetime": "2026-03-31T23:59:59"
+ },
+ {
+ "docId": -1188767998,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2026-02",
+ "postDatetime": "2026-02-28T23:59:59"
+ },
+ {
+ "docId": -1177619709,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2026-01",
+ "postDatetime": "2026-01-31T23:59:59"
+ },
+ {
+ "docId": -1166628762,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-12",
+ "postDatetime": "2025-12-31T23:59:59"
+ },
+ {
+ "docId": -1156129795,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-11",
+ "postDatetime": "2025-11-30T23:59:59"
+ },
+ {
+ "docId": -1145875415,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-10",
+ "postDatetime": "2025-10-31T23:59:59"
+ },
+ {
+ "docId": -1135948523,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-09",
+ "postDatetime": "2025-09-30T23:59:59"
+ },
+ {
+ "docId": -1126197733,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-08",
+ "postDatetime": "2025-08-31T23:59:59"
+ },
+ {
+ "docId": -1116806074,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-07",
+ "postDatetime": "2025-07-31T23:59:59"
+ },
+ {
+ "docId": -1108020966,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-06",
+ "postDatetime": "2025-06-30T23:59:59"
+ },
+ {
+ "docId": -1098974831,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-05",
+ "postDatetime": "2025-05-31T23:59:59"
+ },
+ {
+ "docId": -1090471728,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-04",
+ "postDatetime": "2025-04-30T23:59:59"
+ },
+ {
+ "docId": -1081861185,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-03",
+ "postDatetime": "2025-03-31T23:59:59"
+ },
+ {
+ "docId": -1074034482,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-02",
+ "postDatetime": "2025-02-28T23:59:59"
+ },
+ {
+ "docId": -1065440007,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2025-01",
+ "postDatetime": "2025-01-31T23:59:59"
+ },
+ {
+ "docId": -1056918098,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-12",
+ "postDatetime": "2024-12-31T23:59:59"
+ },
+ {
+ "docId": -1048811748,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-11",
+ "postDatetime": "2024-11-30T23:59:59"
+ },
+ {
+ "docId": -1040515540,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-10",
+ "postDatetime": "2024-10-31T23:59:59"
+ },
+ {
+ "docId": -1032458361,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-09",
+ "postDatetime": "2024-09-30T23:59:59"
+ },
+ {
+ "docId": -1024277424,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-08",
+ "postDatetime": "2024-08-31T23:59:59"
+ },
+ {
+ "docId": -1016148744,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-07",
+ "postDatetime": "2024-07-31T23:59:59"
+ },
+ {
+ "docId": -1008348874,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-06",
+ "postDatetime": "2024-06-30T23:59:59"
+ },
+ {
+ "docId": -1000285179,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-05",
+ "postDatetime": "2024-05-31T23:59:59"
+ },
+ {
+ "docId": -1000019913,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-04",
+ "postDatetime": "2024-04-30T23:59:59"
+ },
+ {
+ "docId": -984782994,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-03",
+ "postDatetime": "2024-03-31T23:59:59"
+ },
+ {
+ "docId": -977548657,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-02",
+ "postDatetime": "2024-02-29T23:59:59"
+ },
+ {
+ "docId": -969776640,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2024-01",
+ "postDatetime": "2024-01-31T23:59:59"
+ },
+ {
+ "docId": -962214924,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-12",
+ "postDatetime": "2023-12-31T23:59:59"
+ },
+ {
+ "docId": -955035870,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-11",
+ "postDatetime": "2023-11-30T23:59:59"
+ },
+ {
+ "docId": -947733335,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-10",
+ "postDatetime": "2023-10-31T23:59:59"
+ },
+ {
+ "docId": -940665813,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-09",
+ "postDatetime": "2023-09-30T23:59:59"
+ },
+ {
+ "docId": -933370224,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-08",
+ "postDatetime": "2023-08-31T23:59:59"
+ },
+ {
+ "docId": -926241239,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-07",
+ "postDatetime": "2023-07-31T23:59:59"
+ },
+ {
+ "docId": -919409323,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-06",
+ "postDatetime": "2023-06-30T23:59:59"
+ },
+ {
+ "docId": -912445673,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-05",
+ "postDatetime": "2023-05-31T23:59:59"
+ },
+ {
+ "docId": -905885485,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-04",
+ "postDatetime": "2023-04-30T23:59:59"
+ },
+ {
+ "docId": -899168317,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-03",
+ "postDatetime": "2023-03-31T23:59:59"
+ },
+ {
+ "docId": -893161174,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-02",
+ "postDatetime": "2023-02-28T23:59:59"
+ },
+ {
+ "docId": -886604771,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2023-01",
+ "postDatetime": "2023-01-31T23:59:59"
+ },
+ {
+ "docId": -880133348,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-12",
+ "postDatetime": "2022-12-31T23:59:59"
+ },
+ {
+ "docId": -873936680,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-11",
+ "postDatetime": "2022-11-30T23:59:59"
+ },
+ {
+ "docId": -867595702,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-10",
+ "postDatetime": "2022-10-31T23:59:59"
+ },
+ {
+ "docId": -861507644,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-09",
+ "postDatetime": "2022-09-30T23:59:59"
+ },
+ {
+ "docId": -855267771,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-08",
+ "postDatetime": "2022-08-31T23:59:59"
+ },
+ {
+ "docId": -849049600,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-07",
+ "postDatetime": "2022-07-31T23:59:59"
+ },
+ {
+ "docId": -843070216,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-06",
+ "postDatetime": "2022-06-30T23:59:59"
+ },
+ {
+ "docId": -837036936,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-05",
+ "postDatetime": "2022-05-31T23:59:59"
+ },
+ {
+ "docId": -831424291,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-04",
+ "postDatetime": "2022-04-30T23:59:59"
+ },
+ {
+ "docId": -825725773,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-03",
+ "postDatetime": "2022-03-31T23:59:59"
+ },
+ {
+ "docId": -820579236,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-02",
+ "postDatetime": "2022-02-28T23:59:59"
+ },
+ {
+ "docId": -814899937,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2022-01",
+ "postDatetime": "2022-01-31T23:59:59"
+ },
+ {
+ "docId": -809278573,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-12",
+ "postDatetime": "2021-12-31T23:59:59"
+ },
+ {
+ "docId": -803868801,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-11",
+ "postDatetime": "2021-11-30T23:59:59"
+ },
+ {
+ "docId": -798320769,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-10",
+ "postDatetime": "2021-10-31T23:59:59"
+ },
+ {
+ "docId": -792954011,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-09",
+ "postDatetime": "2021-09-30T23:59:59"
+ },
+ {
+ "docId": -787424235,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-08",
+ "postDatetime": "2021-08-31T23:59:59"
+ },
+ {
+ "docId": -781914641,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-07",
+ "postDatetime": "2021-07-31T23:59:59"
+ },
+ {
+ "docId": -776685301,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-06",
+ "postDatetime": "2021-06-30T23:59:59"
+ },
+ {
+ "docId": -771347958,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-05",
+ "postDatetime": "2021-05-31T23:59:59"
+ },
+ {
+ "docId": -766219109,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-04",
+ "postDatetime": "2021-04-30T23:59:59"
+ },
+ {
+ "docId": -761052904,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-03",
+ "postDatetime": "2021-03-31T23:59:59"
+ },
+ {
+ "docId": -756398270,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-02",
+ "postDatetime": "2021-02-28T23:59:59"
+ },
+ {
+ "docId": -751335629,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2021-01",
+ "postDatetime": "2021-01-31T23:59:59"
+ },
+ {
+ "docId": -746297498,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-12",
+ "postDatetime": "2020-12-31T23:59:59"
+ },
+ {
+ "docId": -741573771,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-11",
+ "postDatetime": "2020-11-30T23:59:59"
+ },
+ {
+ "docId": -736667211,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-10",
+ "postDatetime": "2020-10-31T23:59:59"
+ },
+ {
+ "docId": -731879168,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-09",
+ "postDatetime": "2020-09-30T23:59:59"
+ },
+ {
+ "docId": -726889805,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-08",
+ "postDatetime": "2020-08-31T23:59:59"
+ },
+ {
+ "docId": -721946832,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-07",
+ "postDatetime": "2020-07-31T23:59:59"
+ },
+ {
+ "docId": -717231661,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-06",
+ "postDatetime": "2020-06-30T23:59:59"
+ },
+ {
+ "docId": -712469953,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-05",
+ "postDatetime": "2020-05-31T23:59:59"
+ },
+ {
+ "docId": -707913468,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-04",
+ "postDatetime": "2020-04-30T23:59:59"
+ },
+ {
+ "docId": -703231335,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-03",
+ "postDatetime": "2020-03-31T23:59:59"
+ },
+ {
+ "docId": -698862012,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-02",
+ "postDatetime": "2020-02-29T23:59:59"
+ },
+ {
+ "docId": -694269085,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2020-01",
+ "postDatetime": "2020-01-31T23:59:59"
+ },
+ {
+ "docId": -689747631,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-12",
+ "postDatetime": "2019-12-31T23:59:59"
+ },
+ {
+ "docId": -685504004,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-11",
+ "postDatetime": "2019-11-30T23:59:59"
+ },
+ {
+ "docId": -681067301,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-10",
+ "postDatetime": "2019-10-31T23:59:59"
+ },
+ {
+ "docId": -676672084,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-09",
+ "postDatetime": "2019-09-30T23:59:59"
+ },
+ {
+ "docId": -672157402,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-08",
+ "postDatetime": "2019-08-31T23:59:59"
+ },
+ {
+ "docId": -667679680,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-07",
+ "postDatetime": "2019-07-31T23:59:59"
+ },
+ {
+ "docId": -663358487,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-06",
+ "postDatetime": "2019-06-30T23:59:59"
+ },
+ {
+ "docId": -658961643,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-05",
+ "postDatetime": "2019-05-31T23:59:59"
+ },
+ {
+ "docId": -654781991,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-04",
+ "postDatetime": "2019-04-30T23:59:59"
+ },
+ {
+ "docId": -650600106,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-03",
+ "postDatetime": "2019-03-31T23:59:59"
+ },
+ {
+ "docId": -646809566,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-02",
+ "postDatetime": "2019-02-28T23:59:59"
+ },
+ {
+ "docId": -642551851,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2019-01",
+ "postDatetime": "2019-01-31T23:59:59"
+ },
+ {
+ "docId": -638322112,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-12",
+ "postDatetime": "2018-12-31T23:59:59"
+ },
+ {
+ "docId": -634280119,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-11",
+ "postDatetime": "2018-11-30T23:59:59"
+ },
+ {
+ "docId": -630081685,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-10",
+ "postDatetime": "2018-10-31T23:59:59"
+ },
+ {
+ "docId": -625963654,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-09",
+ "postDatetime": "2018-09-30T23:59:59"
+ },
+ {
+ "docId": -621629352,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-08",
+ "postDatetime": "2018-08-31T23:59:59"
+ },
+ {
+ "docId": -617283042,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-07",
+ "postDatetime": "2018-07-31T23:59:59"
+ },
+ {
+ "docId": -613123168,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-06",
+ "postDatetime": "2018-06-30T23:59:59"
+ },
+ {
+ "docId": -608892206,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-05",
+ "postDatetime": "2018-05-31T23:59:59"
+ },
+ {
+ "docId": -604869459,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-04",
+ "postDatetime": "2018-04-30T23:59:59"
+ },
+ {
+ "docId": -600771483,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-03",
+ "postDatetime": "2018-03-31T23:59:59"
+ },
+ {
+ "docId": -597066015,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-02",
+ "postDatetime": "2018-02-28T23:59:59"
+ },
+ {
+ "docId": -592978227,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_2018-01",
+ "postDatetime": "2018-01-31T23:59:59"
+ }
+ ],
+ "missingBundleMonths": [],
+ "oldestArchivePage": {
+ "meta": {
+ "totalRecords": 4512,
+ "pageSize": 1,
+ "totalPages": 4512,
+ "currentPage": 4512,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP6-345-CD",
+ "name": "Actual System Load by Weather Zone",
+ "reportTypeId": 13101
+ },
+ "archives": [
+ {
+ "docId": 446396866,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2014-05-01T05:50:00",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np6-345-cd?download=446396866",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np6-345-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ },
+ {
+ "product": "NP6-915-CD",
+ "checkedAt": "2026-09-07T19:53:45.347674+00:00",
+ "bundleMeta": null,
+ "bundles": [
+ {
+ "docId": -1233380966,
+ "friendlyName": "SUMHDLLDLNP6915_2026-06",
+ "postDatetime": "2026-06-30T23:59:59"
+ },
+ {
+ "docId": -1221612214,
+ "friendlyName": "SUMHDLLDLNP6915_2026-05",
+ "postDatetime": "2026-05-31T23:59:59"
+ },
+ {
+ "docId": -1221417052,
+ "friendlyName": "SUMHDLLDLNP6915_2026-04",
+ "postDatetime": "2026-04-30T23:59:59"
+ }
+ ],
+ "missingBundleMonths": [],
+ "oldestArchivePage": {
+ "meta": {
+ "totalRecords": 37727,
+ "pageSize": 1,
+ "totalPages": 37727,
+ "currentPage": 37727,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP6-915-CD",
+ "name": "Summary Report of HDL and LDL",
+ "reportTypeId": 13081
+ },
+ "archives": [
+ {
+ "docId": 1221417052,
+ "friendlyName": "SUMHDLLDLNP6915_20260430_111019_csv",
+ "postDatetime": "2026-04-30T11:10:21",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np6-915-cd?download=1221417052",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np6-915-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ },
+ {
+ "product": "NP6-325-CD",
+ "checkedAt": "2026-09-07T19:53:58.259634+00:00",
+ "bundleMeta": null,
+ "bundles": [
+ {
+ "docId": -1233381447,
+ "friendlyName": "RTDPriceAddersNP6325_2026-06",
+ "postDatetime": "2026-06-30T23:59:59"
+ },
+ {
+ "docId": -1218892380,
+ "friendlyName": "RTDPriceAddersNP6325_2026-05",
+ "postDatetime": "2026-05-31T23:59:59"
+ },
+ {
+ "docId": -1207608744,
+ "friendlyName": "RTDPriceAddersNP6325_2026-04",
+ "postDatetime": "2026-04-30T23:59:59"
+ },
+ {
+ "docId": -1198814224,
+ "friendlyName": "RTDPriceAddersNP6325_2026-03",
+ "postDatetime": "2026-03-31T23:59:59"
+ },
+ {
+ "docId": -1188683380,
+ "friendlyName": "RTDPriceAddersNP6325_2026-02",
+ "postDatetime": "2026-02-28T23:59:59"
+ },
+ {
+ "docId": -1177535802,
+ "friendlyName": "RTDPriceAddersNP6325_2026-01",
+ "postDatetime": "2026-01-31T23:59:59"
+ },
+ {
+ "docId": -1167880920,
+ "friendlyName": "RTDPriceAddersNP6325_2025-12",
+ "postDatetime": "2025-12-31T23:59:59"
+ },
+ {
+ "docId": -1000716037,
+ "friendlyName": "RTDPriceAddersNP6325_2025-11",
+ "postDatetime": "2025-11-30T23:59:59"
+ },
+ {
+ "docId": -1002811349,
+ "friendlyName": "RTDPriceAddersNP6325_2025-10",
+ "postDatetime": "2025-10-31T23:59:59"
+ },
+ {
+ "docId": -1001229296,
+ "friendlyName": "RTDPriceAddersNP6325_2025-09",
+ "postDatetime": "2025-09-30T23:59:59"
+ },
+ {
+ "docId": -1018941415,
+ "friendlyName": "RTDPriceAddersNP6325_2025-08",
+ "postDatetime": "2025-08-31T23:59:59"
+ },
+ {
+ "docId": -1116809010,
+ "friendlyName": "RTDPriceAddersNP6325_2025-07",
+ "postDatetime": "2025-07-31T23:59:59"
+ },
+ {
+ "docId": -1108029434,
+ "friendlyName": "RTDPriceAddersNP6325_2025-06",
+ "postDatetime": "2025-06-30T23:59:59"
+ },
+ {
+ "docId": -1098911176,
+ "friendlyName": "RTDPriceAddersNP6325_2025-05",
+ "postDatetime": "2025-05-31T23:59:59"
+ },
+ {
+ "docId": -1090515806,
+ "friendlyName": "RTDPriceAddersNP6325_2025-04",
+ "postDatetime": "2025-04-30T23:59:59"
+ },
+ {
+ "docId": -1081828620,
+ "friendlyName": "RTDPriceAddersNP6325_2025-03",
+ "postDatetime": "2025-03-31T23:59:59"
+ },
+ {
+ "docId": -1074097857,
+ "friendlyName": "RTDPriceAddersNP6325_2025-02",
+ "postDatetime": "2025-02-28T23:59:59"
+ },
+ {
+ "docId": -1065447223,
+ "friendlyName": "RTDPriceAddersNP6325_2025-01",
+ "postDatetime": "2025-01-31T23:59:59"
+ },
+ {
+ "docId": -1056855156,
+ "friendlyName": "RTDPriceAddersNP6325_2024-12",
+ "postDatetime": "2024-12-31T23:59:59"
+ },
+ {
+ "docId": -1048849233,
+ "friendlyName": "RTDPriceAddersNP6325_2024-11",
+ "postDatetime": "2024-11-30T23:59:59"
+ },
+ {
+ "docId": -1040586618,
+ "friendlyName": "RTDPriceAddersNP6325_2024-10",
+ "postDatetime": "2024-10-31T23:59:59"
+ },
+ {
+ "docId": -1032397632,
+ "friendlyName": "RTDPriceAddersNP6325_2024-09",
+ "postDatetime": "2024-09-30T23:59:59"
+ },
+ {
+ "docId": -1024294560,
+ "friendlyName": "RTDPriceAddersNP6325_2024-08",
+ "postDatetime": "2024-08-31T23:59:59"
+ },
+ {
+ "docId": -1016095595,
+ "friendlyName": "RTDPriceAddersNP6325_2024-07",
+ "postDatetime": "2024-07-31T23:59:59"
+ },
+ {
+ "docId": -1008379242,
+ "friendlyName": "RTDPriceAddersNP6325_2024-06",
+ "postDatetime": "2024-06-30T23:59:59"
+ },
+ {
+ "docId": -1000235484,
+ "friendlyName": "RTDPriceAddersNP6325_2024-05",
+ "postDatetime": "2024-05-31T23:59:59"
+ },
+ {
+ "docId": -992562652,
+ "friendlyName": "RTDPriceAddersNP6325_2024-04",
+ "postDatetime": "2024-04-30T23:59:59"
+ },
+ {
+ "docId": -984777347,
+ "friendlyName": "RTDPriceAddersNP6325_2024-03",
+ "postDatetime": "2024-03-31T23:59:59"
+ },
+ {
+ "docId": -977533882,
+ "friendlyName": "RTDPriceAddersNP6325_2024-02",
+ "postDatetime": "2024-02-29T23:59:59"
+ },
+ {
+ "docId": -969719742,
+ "friendlyName": "RTDPriceAddersNP6325_2024-01",
+ "postDatetime": "2024-01-31T23:59:59"
+ },
+ {
+ "docId": -962166582,
+ "friendlyName": "RTDPriceAddersNP6325_2023-12",
+ "postDatetime": "2023-12-31T23:59:59"
+ },
+ {
+ "docId": -955014200,
+ "friendlyName": "RTDPriceAddersNP6325_2023-11",
+ "postDatetime": "2023-11-30T23:59:59"
+ },
+ {
+ "docId": -951100129,
+ "friendlyName": "RTDPriceAddersNP6325_2023-10",
+ "postDatetime": "2023-10-31T23:59:59"
+ },
+ {
+ "docId": -940725005,
+ "friendlyName": "RTDPriceAddersNP6325_2023-09",
+ "postDatetime": "2023-09-30T23:59:59"
+ },
+ {
+ "docId": -933338704,
+ "friendlyName": "RTDPriceAddersNP6325_2023-08",
+ "postDatetime": "2023-08-31T23:59:59"
+ },
+ {
+ "docId": -926227816,
+ "friendlyName": "RTDPriceAddersNP6325_2023-07",
+ "postDatetime": "2023-07-31T23:59:59"
+ },
+ {
+ "docId": -919455057,
+ "friendlyName": "RTDPriceAddersNP6325_2023-06",
+ "postDatetime": "2023-06-30T23:59:59"
+ },
+ {
+ "docId": -912424651,
+ "friendlyName": "RTDPriceAddersNP6325_2023-05",
+ "postDatetime": "2023-05-31T23:59:59"
+ },
+ {
+ "docId": -905902137,
+ "friendlyName": "RTDPriceAddersNP6325_2023-04",
+ "postDatetime": "2023-04-30T23:59:59"
+ },
+ {
+ "docId": -899159173,
+ "friendlyName": "RTDPriceAddersNP6325_2023-03",
+ "postDatetime": "2023-03-31T23:59:59"
+ },
+ {
+ "docId": -893122783,
+ "friendlyName": "RTDPriceAddersNP6325_2023-02",
+ "postDatetime": "2023-02-28T23:59:59"
+ },
+ {
+ "docId": -886617002,
+ "friendlyName": "RTDPriceAddersNP6325_2023-01",
+ "postDatetime": "2023-01-31T23:59:59"
+ },
+ {
+ "docId": -880164188,
+ "friendlyName": "RTDPriceAddersNP6325_2022-12",
+ "postDatetime": "2022-12-31T23:59:59"
+ },
+ {
+ "docId": -873894418,
+ "friendlyName": "RTDPriceAddersNP6325_2022-11",
+ "postDatetime": "2022-11-30T23:59:59"
+ },
+ {
+ "docId": -867576965,
+ "friendlyName": "RTDPriceAddersNP6325_2022-10",
+ "postDatetime": "2022-10-31T23:59:59"
+ },
+ {
+ "docId": -861522940,
+ "friendlyName": "RTDPriceAddersNP6325_2022-09",
+ "postDatetime": "2022-09-30T23:59:59"
+ },
+ {
+ "docId": -855278211,
+ "friendlyName": "RTDPriceAddersNP6325_2022-08",
+ "postDatetime": "2022-08-31T23:59:59"
+ },
+ {
+ "docId": -849091050,
+ "friendlyName": "RTDPriceAddersNP6325_2022-07",
+ "postDatetime": "2022-07-31T23:59:59"
+ },
+ {
+ "docId": -843029568,
+ "friendlyName": "RTDPriceAddersNP6325_2022-06",
+ "postDatetime": "2022-06-30T23:59:59"
+ },
+ {
+ "docId": -837004541,
+ "friendlyName": "RTDPriceAddersNP6325_2022-05",
+ "postDatetime": "2022-05-31T23:59:59"
+ },
+ {
+ "docId": -831465051,
+ "friendlyName": "RTDPriceAddersNP6325_2022-04",
+ "postDatetime": "2022-04-30T23:59:59"
+ },
+ {
+ "docId": -825710956,
+ "friendlyName": "RTDPriceAddersNP6325_2022-03",
+ "postDatetime": "2022-03-31T23:59:59"
+ },
+ {
+ "docId": -820547418,
+ "friendlyName": "RTDPriceAddersNP6325_2022-02",
+ "postDatetime": "2022-02-28T23:59:59"
+ },
+ {
+ "docId": -814911911,
+ "friendlyName": "RTDPriceAddersNP6325_2022-01",
+ "postDatetime": "2022-01-31T23:59:59"
+ },
+ {
+ "docId": -809324096,
+ "friendlyName": "RTDPriceAddersNP6325_2021-12",
+ "postDatetime": "2021-12-31T23:59:59"
+ },
+ {
+ "docId": -449098042,
+ "friendlyName": "RTDPriceAddersNP6325_2021-11",
+ "postDatetime": "2021-11-30T23:59:59"
+ },
+ {
+ "docId": -798335817,
+ "friendlyName": "RTDPriceAddersNP6325_2021-10",
+ "postDatetime": "2021-10-31T23:59:59"
+ },
+ {
+ "docId": -792967134,
+ "friendlyName": "RTDPriceAddersNP6325_2021-09",
+ "postDatetime": "2021-09-30T23:59:59"
+ },
+ {
+ "docId": -787455015,
+ "friendlyName": "RTDPriceAddersNP6325_2021-08",
+ "postDatetime": "2021-08-31T23:59:59"
+ },
+ {
+ "docId": -781948475,
+ "friendlyName": "RTDPriceAddersNP6325_2021-07",
+ "postDatetime": "2021-07-31T23:59:59"
+ },
+ {
+ "docId": -776649316,
+ "friendlyName": "RTDPriceAddersNP6325_2021-06",
+ "postDatetime": "2021-06-30T23:59:59"
+ },
+ {
+ "docId": -577799295,
+ "friendlyName": "RTDPriceAddersNP6325_2021-05",
+ "postDatetime": "2021-05-31T23:59:59"
+ },
+ {
+ "docId": -524213579,
+ "friendlyName": "RTDPriceAddersNP6325_2021-04",
+ "postDatetime": "2021-04-30T23:59:59"
+ },
+ {
+ "docId": -533917955,
+ "friendlyName": "RTDPriceAddersNP6325_2021-03",
+ "postDatetime": "2021-03-31T23:59:59"
+ },
+ {
+ "docId": -756383413,
+ "friendlyName": "RTDPriceAddersNP6325_2021-02",
+ "postDatetime": "2021-02-28T23:59:59"
+ },
+ {
+ "docId": -531567498,
+ "friendlyName": "RTDPriceAddersNP6325_2021-01",
+ "postDatetime": "2021-01-31T23:59:59"
+ },
+ {
+ "docId": -1000451979,
+ "friendlyName": "RTDPriceAddersNP6325_2020-12",
+ "postDatetime": "2020-12-31T23:59:59"
+ },
+ {
+ "docId": -999923151,
+ "friendlyName": "RTDPriceAddersNP6325_2020-11",
+ "postDatetime": "2020-11-30T23:59:59"
+ },
+ {
+ "docId": -1010570477,
+ "friendlyName": "RTDPriceAddersNP6325_2020-10",
+ "postDatetime": "2020-10-31T23:59:59"
+ },
+ {
+ "docId": -1000715366,
+ "friendlyName": "RTDPriceAddersNP6325_2020-09",
+ "postDatetime": "2020-09-30T23:59:59"
+ },
+ {
+ "docId": -1033967615,
+ "friendlyName": "RTDPriceAddersNP6325_2020-08",
+ "postDatetime": "2020-08-31T23:59:59"
+ },
+ {
+ "docId": -721959791,
+ "friendlyName": "RTDPriceAddersNP6325_2020-07",
+ "postDatetime": "2020-07-31T23:59:59"
+ },
+ {
+ "docId": -717269495,
+ "friendlyName": "RTDPriceAddersNP6325_2020-06",
+ "postDatetime": "2020-06-30T23:59:59"
+ },
+ {
+ "docId": -712509922,
+ "friendlyName": "RTDPriceAddersNP6325_2020-05",
+ "postDatetime": "2020-05-31T23:59:59"
+ },
+ {
+ "docId": -707943119,
+ "friendlyName": "RTDPriceAddersNP6325_2020-04",
+ "postDatetime": "2020-04-30T23:59:59"
+ },
+ {
+ "docId": -703212833,
+ "friendlyName": "RTDPriceAddersNP6325_2020-03",
+ "postDatetime": "2020-03-31T23:59:59"
+ },
+ {
+ "docId": -698860689,
+ "friendlyName": "RTDPriceAddersNP6325_2020-02",
+ "postDatetime": "2020-02-29T23:59:59"
+ },
+ {
+ "docId": -694294108,
+ "friendlyName": "RTDPriceAddersNP6325_2020-01",
+ "postDatetime": "2020-01-31T23:59:59"
+ },
+ {
+ "docId": -689756154,
+ "friendlyName": "RTDPriceAddersNP6325_2019-12",
+ "postDatetime": "2019-12-31T23:59:59"
+ },
+ {
+ "docId": -685470022,
+ "friendlyName": "RTDPriceAddersNP6325_2019-11",
+ "postDatetime": "2019-11-30T23:59:59"
+ },
+ {
+ "docId": -681067007,
+ "friendlyName": "RTDPriceAddersNP6325_2019-10",
+ "postDatetime": "2019-10-31T23:59:59"
+ },
+ {
+ "docId": -676670930,
+ "friendlyName": "RTDPriceAddersNP6325_2019-09",
+ "postDatetime": "2019-09-30T23:59:59"
+ },
+ {
+ "docId": -672191483,
+ "friendlyName": "RTDPriceAddersNP6325_2019-08",
+ "postDatetime": "2019-08-31T23:59:59"
+ },
+ {
+ "docId": -667697320,
+ "friendlyName": "RTDPriceAddersNP6325_2019-07",
+ "postDatetime": "2019-07-31T23:59:59"
+ },
+ {
+ "docId": -663372764,
+ "friendlyName": "RTDPriceAddersNP6325_2019-06",
+ "postDatetime": "2019-06-30T23:59:59"
+ },
+ {
+ "docId": -658997882,
+ "friendlyName": "RTDPriceAddersNP6325_2019-05",
+ "postDatetime": "2019-05-31T23:59:59"
+ },
+ {
+ "docId": -654818327,
+ "friendlyName": "RTDPriceAddersNP6325_2019-04",
+ "postDatetime": "2019-04-30T23:59:59"
+ },
+ {
+ "docId": -650572960,
+ "friendlyName": "RTDPriceAddersNP6325_2019-03",
+ "postDatetime": "2019-03-31T23:59:59"
+ },
+ {
+ "docId": -646800598,
+ "friendlyName": "RTDPriceAddersNP6325_2019-02",
+ "postDatetime": "2019-02-28T23:59:59"
+ },
+ {
+ "docId": -642536875,
+ "friendlyName": "RTDPriceAddersNP6325_2019-01",
+ "postDatetime": "2019-01-31T23:59:59"
+ }
+ ],
+ "missingBundleMonths": [],
+ "oldestArchivePage": {
+ "meta": {
+ "totalRecords": 1290225,
+ "pageSize": 1,
+ "totalPages": 1290225,
+ "currentPage": 1290225,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP6-325-CD",
+ "name": "RTD Indicative Price Adders",
+ "reportTypeId": 13222
+ },
+ "archives": [
+ {
+ "docId": 449026337,
+ "friendlyName": "RTDPriceAdderORDCNP6325_20140601_001001_csv",
+ "postDatetime": "2014-06-01T00:10:15.208000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np6-325-cd?download=449026337",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np6-325-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ },
+ {
+ "product": "NP4-765-ER",
+ "checkedAt": "2026-09-07T19:54:31.738520+00:00",
+ "bundleMeta": null,
+ "bundles": [
+ {
+ "docId": -1257138158,
+ "friendlyName": "ESRIntegrationReport_2026-08",
+ "postDatetime": "2026-08-31T23:59:59"
+ },
+ {
+ "docId": -1233527832,
+ "friendlyName": "ESRIntegrationReport_2026-06",
+ "postDatetime": "2026-06-30T23:59:59"
+ },
+ {
+ "docId": -1221792715,
+ "friendlyName": "ESRIntegrationReport_2026-05",
+ "postDatetime": "2026-05-31T23:59:59"
+ },
+ {
+ "docId": -1210470042,
+ "friendlyName": "ESRIntegrationReport_2026-04",
+ "postDatetime": "2026-04-30T23:59:59"
+ },
+ {
+ "docId": -1198946797,
+ "friendlyName": "ESRIntegrationReport_2026-03",
+ "postDatetime": "2026-03-31T23:59:59"
+ },
+ {
+ "docId": -1188813730,
+ "friendlyName": "ESRIntegrationReport_2026-02",
+ "postDatetime": "2026-02-28T23:59:59"
+ },
+ {
+ "docId": -1177669229,
+ "friendlyName": "ESRIntegrationReport_2026-01",
+ "postDatetime": "2026-01-31T23:59:59"
+ },
+ {
+ "docId": -1166667917,
+ "friendlyName": "ESRIntegrationReport_2025-12",
+ "postDatetime": "2025-12-31T23:59:59"
+ },
+ {
+ "docId": -1156159631,
+ "friendlyName": "ESRIntegrationReport_2025-11",
+ "postDatetime": "2025-11-30T23:59:59"
+ },
+ {
+ "docId": -1145907249,
+ "friendlyName": "ESRIntegrationReport_2025-10",
+ "postDatetime": "2025-10-31T23:59:59"
+ },
+ {
+ "docId": -1135982111,
+ "friendlyName": "ESRIntegrationReport_2025-09",
+ "postDatetime": "2025-09-30T23:59:59"
+ },
+ {
+ "docId": -1126227694,
+ "friendlyName": "ESRIntegrationReport_2025-08",
+ "postDatetime": "2025-08-31T23:59:59"
+ },
+ {
+ "docId": -1116834904,
+ "friendlyName": "ESRIntegrationReport_2025-07",
+ "postDatetime": "2025-07-31T23:59:59"
+ },
+ {
+ "docId": -1108051081,
+ "friendlyName": "ESRIntegrationReport_2025-06",
+ "postDatetime": "2025-06-30T23:59:59"
+ },
+ {
+ "docId": -1099004577,
+ "friendlyName": "ESRIntegrationReport_2025-05",
+ "postDatetime": "2025-05-31T23:59:59"
+ },
+ {
+ "docId": -1090500908,
+ "friendlyName": "ESRIntegrationReport_2025-04",
+ "postDatetime": "2025-04-30T23:59:59"
+ },
+ {
+ "docId": -1085494646,
+ "friendlyName": "ESRIntegrationReport_2025-03",
+ "postDatetime": "2025-03-31T23:59:59"
+ },
+ {
+ "docId": -1074063100,
+ "friendlyName": "ESRIntegrationReport_2025-02",
+ "postDatetime": "2025-02-28T23:59:59"
+ },
+ {
+ "docId": -1065467624,
+ "friendlyName": "ESRIntegrationReport_2025-01",
+ "postDatetime": "2025-01-31T23:59:59"
+ },
+ {
+ "docId": -1056947247,
+ "friendlyName": "ESRIntegrationReport_2024-12",
+ "postDatetime": "2024-12-31T23:59:59"
+ },
+ {
+ "docId": -1050466843,
+ "friendlyName": "ESRIntegrationReport_2024-11",
+ "postDatetime": "2024-11-30T23:59:59"
+ },
+ {
+ "docId": -1040542909,
+ "friendlyName": "ESRIntegrationReport_2024-10",
+ "postDatetime": "2024-10-31T23:59:59"
+ },
+ {
+ "docId": -1032484127,
+ "friendlyName": "ESRIntegrationReport_2024-09",
+ "postDatetime": "2024-09-30T23:59:59"
+ },
+ {
+ "docId": -1024302541,
+ "friendlyName": "ESRIntegrationReport_2024-08",
+ "postDatetime": "2024-08-31T23:59:59"
+ },
+ {
+ "docId": -1016710095,
+ "friendlyName": "ESRIntegrationReport_2024-07",
+ "postDatetime": "2024-07-31T23:59:59"
+ },
+ {
+ "docId": -1008374431,
+ "friendlyName": "ESRIntegrationReport_2024-06",
+ "postDatetime": "2024-06-30T23:59:59"
+ },
+ {
+ "docId": -1000312012,
+ "friendlyName": "ESRIntegrationReport_2024-05",
+ "postDatetime": "2024-05-31T23:59:59"
+ },
+ {
+ "docId": -993407996,
+ "friendlyName": "ESRIntegrationReport_2024-04",
+ "postDatetime": "2024-04-30T23:59:59"
+ },
+ {
+ "docId": -985553472,
+ "friendlyName": "ESRIntegrationReport_2024-03",
+ "postDatetime": "2024-03-31T23:59:59"
+ },
+ {
+ "docId": -977646182,
+ "friendlyName": "ESRIntegrationReport_2024-02",
+ "postDatetime": "2024-02-29T23:59:59"
+ },
+ {
+ "docId": -970799651,
+ "friendlyName": "ESRIntegrationReport_2024-01",
+ "postDatetime": "2024-01-31T23:59:59"
+ },
+ {
+ "docId": -963449156,
+ "friendlyName": "ESRIntegrationReport_2023-12",
+ "postDatetime": "2023-12-31T23:59:59"
+ }
+ ],
+ "missingBundleMonths": [
+ "2026-07"
+ ],
+ "oldestArchivePage": {
+ "meta": {
+ "totalRecords": 1006,
+ "pageSize": 1,
+ "totalPages": 1006,
+ "currentPage": 1006,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-765-ER",
+ "name": "ESR Integration Report",
+ "reportTypeId": 23794
+ },
+ "archives": [
+ {
+ "docId": 963449156,
+ "friendlyName": "ESRIntegrationReport 12-05-23",
+ "postDatetime": "2023-12-06T08:02:21",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-765-er?download=963449156",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-765-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ },
+ {
+ "product": "NP3-987-EX",
+ "checkedAt": "2026-09-07T19:54:44.281527+00:00",
+ "bundleMeta": null,
+ "bundles": [
+ {
+ "docId": -1256994285,
+ "friendlyName": "7day_Event_Trigger_2026-08",
+ "postDatetime": "2026-08-31T23:59:59"
+ },
+ {
+ "docId": -1233778572,
+ "friendlyName": "7day_Event_Trigger_2026-06",
+ "postDatetime": "2026-06-30T23:59:59"
+ },
+ {
+ "docId": -1221622105,
+ "friendlyName": "7day_Event_Trigger_2026-05",
+ "postDatetime": "2026-05-31T23:59:59"
+ },
+ {
+ "docId": -1210259023,
+ "friendlyName": "7day_Event_Trigger_2026-04",
+ "postDatetime": "2026-04-30T23:59:59"
+ },
+ {
+ "docId": -1198821671,
+ "friendlyName": "7day_Event_Trigger_2026-03",
+ "postDatetime": "2026-03-31T23:59:59"
+ },
+ {
+ "docId": -1188688595,
+ "friendlyName": "7day_Event_Trigger_2026-02",
+ "postDatetime": "2026-02-28T23:59:59"
+ },
+ {
+ "docId": -1177885963,
+ "friendlyName": "7day_Event_Trigger_2026-01",
+ "postDatetime": "2026-01-31T23:59:59"
+ },
+ {
+ "docId": -1168232826,
+ "friendlyName": "7day_Event_Trigger_2025-12",
+ "postDatetime": "2025-12-31T23:59:59"
+ },
+ {
+ "docId": -1156057942,
+ "friendlyName": "7day_Event_Trigger_2025-11",
+ "postDatetime": "2025-11-30T23:59:59"
+ },
+ {
+ "docId": -1145805698,
+ "friendlyName": "7day_Event_Trigger_2025-10",
+ "postDatetime": "2025-10-31T23:59:59"
+ },
+ {
+ "docId": -1145457602,
+ "friendlyName": "7day_Event_Trigger_2025-09",
+ "postDatetime": "2025-09-30T23:59:59"
+ },
+ {
+ "docId": -1126128266,
+ "friendlyName": "7day_Event_Trigger_2025-08",
+ "postDatetime": "2025-08-31T23:59:59"
+ },
+ {
+ "docId": -1116738980,
+ "friendlyName": "7day_Event_Trigger_2025-07",
+ "postDatetime": "2025-07-31T23:59:59"
+ },
+ {
+ "docId": -1107953357,
+ "friendlyName": "7day_Event_Trigger_2025-06",
+ "postDatetime": "2025-06-30T23:59:59"
+ },
+ {
+ "docId": -1105913716,
+ "friendlyName": "7day_Event_Trigger_2025-05",
+ "postDatetime": "2025-05-31T23:59:59"
+ },
+ {
+ "docId": -1090409309,
+ "friendlyName": "7day_Event_Trigger_2025-04",
+ "postDatetime": "2025-04-30T23:59:59"
+ },
+ {
+ "docId": -1081800030,
+ "friendlyName": "7day_Event_Trigger_2025-03",
+ "postDatetime": "2025-03-31T23:59:59"
+ },
+ {
+ "docId": -1073974996,
+ "friendlyName": "7day_Event_Trigger_2025-02",
+ "postDatetime": "2025-02-28T23:59:59"
+ },
+ {
+ "docId": -1068667902,
+ "friendlyName": "7day_Event_Trigger_2025-01",
+ "postDatetime": "2025-01-31T23:59:59"
+ },
+ {
+ "docId": -1056857725,
+ "friendlyName": "7day_Event_Trigger_2024-12",
+ "postDatetime": "2024-12-31T23:59:59"
+ },
+ {
+ "docId": -1048751796,
+ "friendlyName": "7day_Event_Trigger_2024-11",
+ "postDatetime": "2024-11-30T23:59:59"
+ },
+ {
+ "docId": -1040455200,
+ "friendlyName": "7day_Event_Trigger_2024-10",
+ "postDatetime": "2024-10-31T23:59:59"
+ },
+ {
+ "docId": -1033191947,
+ "friendlyName": "7day_Event_Trigger_2024-09",
+ "postDatetime": "2024-09-30T23:59:59"
+ },
+ {
+ "docId": -1024218583,
+ "friendlyName": "7day_Event_Trigger_2024-08",
+ "postDatetime": "2024-08-31T23:59:59"
+ },
+ {
+ "docId": -1016089531,
+ "friendlyName": "7day_Event_Trigger_2024-07",
+ "postDatetime": "2024-07-31T23:59:59"
+ },
+ {
+ "docId": -1008291329,
+ "friendlyName": "7day_Event_Trigger_2024-06",
+ "postDatetime": "2024-06-30T23:59:59"
+ },
+ {
+ "docId": -1000227495,
+ "friendlyName": "7day_Event_Trigger_2024-05",
+ "postDatetime": "2024-05-31T23:59:59"
+ },
+ {
+ "docId": -999695095,
+ "friendlyName": "7day_Event_Trigger_2024-04",
+ "postDatetime": "2024-04-30T23:59:59"
+ },
+ {
+ "docId": -984726205,
+ "friendlyName": "7day_Event_Trigger_2024-03",
+ "postDatetime": "2024-03-31T23:59:59"
+ },
+ {
+ "docId": -977494634,
+ "friendlyName": "7day_Event_Trigger_2024-02",
+ "postDatetime": "2024-02-29T23:59:59"
+ },
+ {
+ "docId": -969719521,
+ "friendlyName": "7day_Event_Trigger_2024-01",
+ "postDatetime": "2024-01-31T23:59:59"
+ },
+ {
+ "docId": -966543327,
+ "friendlyName": "7day_Event_Trigger_2023-12",
+ "postDatetime": "2023-12-31T23:59:59"
+ },
+ {
+ "docId": -954983167,
+ "friendlyName": "7day_Event_Trigger_2023-11",
+ "postDatetime": "2023-11-30T23:59:59"
+ },
+ {
+ "docId": -947683655,
+ "friendlyName": "7day_Event_Trigger_2023-10",
+ "postDatetime": "2023-10-31T23:59:59"
+ },
+ {
+ "docId": -940611835,
+ "friendlyName": "7day_Event_Trigger_2023-09",
+ "postDatetime": "2023-09-30T23:59:59"
+ },
+ {
+ "docId": -935426076,
+ "friendlyName": "7day_Event_Trigger_2023-08",
+ "postDatetime": "2023-08-31T23:59:59"
+ },
+ {
+ "docId": -926192089,
+ "friendlyName": "7day_Event_Trigger_2023-07",
+ "postDatetime": "2023-07-31T23:59:59"
+ },
+ {
+ "docId": -919816456,
+ "friendlyName": "7day_Event_Trigger_2023-06",
+ "postDatetime": "2023-06-30T23:59:59"
+ },
+ {
+ "docId": -912386446,
+ "friendlyName": "7day_Event_Trigger_2023-05",
+ "postDatetime": "2023-05-31T23:59:59"
+ },
+ {
+ "docId": -905837683,
+ "friendlyName": "7day_Event_Trigger_2023-04",
+ "postDatetime": "2023-04-30T23:59:59"
+ },
+ {
+ "docId": -904733010,
+ "friendlyName": "7day_Event_Trigger_2023-03",
+ "postDatetime": "2023-03-31T23:59:59"
+ },
+ {
+ "docId": -893114936,
+ "friendlyName": "7day_Event_Trigger_2023-02",
+ "postDatetime": "2023-02-28T23:59:59"
+ },
+ {
+ "docId": -886559209,
+ "friendlyName": "7day_Event_Trigger_2023-01",
+ "postDatetime": "2023-01-31T23:59:59"
+ },
+ {
+ "docId": -880087584,
+ "friendlyName": "7day_Event_Trigger_2022-12",
+ "postDatetime": "2022-12-31T23:59:59"
+ },
+ {
+ "docId": -875980518,
+ "friendlyName": "7day_Event_Trigger_2022-11",
+ "postDatetime": "2022-11-30T23:59:59"
+ },
+ {
+ "docId": -867550429,
+ "friendlyName": "7day_Event_Trigger_2022-10",
+ "postDatetime": "2022-10-31T23:59:59"
+ },
+ {
+ "docId": -861863980,
+ "friendlyName": "7day_Event_Trigger_2022-09",
+ "postDatetime": "2022-09-30T23:59:59"
+ },
+ {
+ "docId": -855222781,
+ "friendlyName": "7day_Event_Trigger_2022-08",
+ "postDatetime": "2022-08-31T23:59:59"
+ },
+ {
+ "docId": -849004185,
+ "friendlyName": "7day_Event_Trigger_2022-07",
+ "postDatetime": "2022-07-31T23:59:59"
+ },
+ {
+ "docId": -843025266,
+ "friendlyName": "7day_Event_Trigger_2022-06",
+ "postDatetime": "2022-06-30T23:59:59"
+ },
+ {
+ "docId": -840676777,
+ "friendlyName": "7day_Event_Trigger_2022-05",
+ "postDatetime": "2022-05-31T23:59:59"
+ },
+ {
+ "docId": -831567320,
+ "friendlyName": "7day_Event_Trigger_2022-04",
+ "postDatetime": "2022-04-30T23:59:59"
+ },
+ {
+ "docId": -825873803,
+ "friendlyName": "7day_Event_Trigger_2022-03",
+ "postDatetime": "2022-03-31T23:59:59"
+ },
+ {
+ "docId": -820537218,
+ "friendlyName": "7day_Event_Trigger_2022-02",
+ "postDatetime": "2022-02-28T23:59:59"
+ },
+ {
+ "docId": -815210955,
+ "friendlyName": "7day_Event_Trigger_2022-01",
+ "postDatetime": "2022-01-31T23:59:59"
+ },
+ {
+ "docId": -809238318,
+ "friendlyName": "7day_Event_Trigger_2021-12",
+ "postDatetime": "2021-12-31T23:59:59"
+ },
+ {
+ "docId": -805837357,
+ "friendlyName": "7day_Event_Trigger_2021-11",
+ "postDatetime": "2021-11-30T23:59:59"
+ },
+ {
+ "docId": -798634023,
+ "friendlyName": "7day_Event_Trigger_2021-10",
+ "postDatetime": "2021-10-31T23:59:59"
+ },
+ {
+ "docId": -793628834,
+ "friendlyName": "7day_Event_Trigger_2021-09",
+ "postDatetime": "2021-09-30T23:59:59"
+ },
+ {
+ "docId": -787557886,
+ "friendlyName": "7day_Event_Trigger_2021-08",
+ "postDatetime": "2021-08-31T23:59:59"
+ },
+ {
+ "docId": -783292171,
+ "friendlyName": "7day_Event_Trigger_2021-07",
+ "postDatetime": "2021-07-31T23:59:59"
+ },
+ {
+ "docId": -776645225,
+ "friendlyName": "7day_Event_Trigger_2021-06",
+ "postDatetime": "2021-06-30T23:59:59"
+ },
+ {
+ "docId": -771309333,
+ "friendlyName": "7day_Event_Trigger_2021-05",
+ "postDatetime": "2021-05-31T23:59:59"
+ },
+ {
+ "docId": -766184160,
+ "friendlyName": "7day_Event_Trigger_2021-04",
+ "postDatetime": "2021-04-30T23:59:59"
+ },
+ {
+ "docId": -764164640,
+ "friendlyName": "7day_Event_Trigger_2021-03",
+ "postDatetime": "2021-03-31T23:59:59"
+ },
+ {
+ "docId": -756358998,
+ "friendlyName": "7day_Event_Trigger_2021-02",
+ "postDatetime": "2021-02-28T23:59:59"
+ },
+ {
+ "docId": -752436041,
+ "friendlyName": "7day_Event_Trigger_2021-01",
+ "postDatetime": "2021-01-31T23:59:59"
+ },
+ {
+ "docId": -746260953,
+ "friendlyName": "7day_Event_Trigger_2020-12",
+ "postDatetime": "2020-12-31T23:59:59"
+ },
+ {
+ "docId": -741728217,
+ "friendlyName": "7day_Event_Trigger_2020-11",
+ "postDatetime": "2020-11-30T23:59:59"
+ },
+ {
+ "docId": -736632402,
+ "friendlyName": "7day_Event_Trigger_2020-10",
+ "postDatetime": "2020-10-31T23:59:59"
+ },
+ {
+ "docId": -732169667,
+ "friendlyName": "7day_Event_Trigger_2020-09",
+ "postDatetime": "2020-09-30T23:59:59"
+ },
+ {
+ "docId": -730073913,
+ "friendlyName": "7day_Event_Trigger_2020-08",
+ "postDatetime": "2020-08-31T23:59:59"
+ },
+ {
+ "docId": -721912278,
+ "friendlyName": "7day_Event_Trigger_2020-07",
+ "postDatetime": "2020-07-31T23:59:59"
+ },
+ {
+ "docId": -717362354,
+ "friendlyName": "7day_Event_Trigger_2020-06",
+ "postDatetime": "2020-06-30T23:59:59"
+ },
+ {
+ "docId": -712435727,
+ "friendlyName": "7day_Event_Trigger_2020-05",
+ "postDatetime": "2020-05-31T23:59:59"
+ },
+ {
+ "docId": -707881546,
+ "friendlyName": "7day_Event_Trigger_2020-04",
+ "postDatetime": "2020-04-30T23:59:59"
+ },
+ {
+ "docId": -703340977,
+ "friendlyName": "7day_Event_Trigger_2020-03",
+ "postDatetime": "2020-03-31T23:59:59"
+ },
+ {
+ "docId": -699425681,
+ "friendlyName": "7day_Event_Trigger_2020-02",
+ "postDatetime": "2020-02-29T23:59:59"
+ },
+ {
+ "docId": -694236662,
+ "friendlyName": "7day_Event_Trigger_2020-01",
+ "postDatetime": "2020-01-31T23:59:59"
+ },
+ {
+ "docId": -689850766,
+ "friendlyName": "7day_Event_Trigger_2019-12",
+ "postDatetime": "2019-12-31T23:59:59"
+ },
+ {
+ "docId": -685462160,
+ "friendlyName": "7day_Event_Trigger_2019-11",
+ "postDatetime": "2019-11-30T23:59:59"
+ },
+ {
+ "docId": -681023813,
+ "friendlyName": "7day_Event_Trigger_2019-10",
+ "postDatetime": "2019-10-31T23:59:59"
+ },
+ {
+ "docId": -676641003,
+ "friendlyName": "7day_Event_Trigger_2019-09",
+ "postDatetime": "2019-09-30T23:59:59"
+ },
+ {
+ "docId": -676355059,
+ "friendlyName": "7day_Event_Trigger_2019-08",
+ "postDatetime": "2019-08-31T23:59:59"
+ },
+ {
+ "docId": -667646488,
+ "friendlyName": "7day_Event_Trigger_2019-07",
+ "postDatetime": "2019-07-31T23:59:59"
+ },
+ {
+ "docId": -664045088,
+ "friendlyName": "7day_Event_Trigger_2019-06",
+ "postDatetime": "2019-06-30T23:59:59"
+ },
+ {
+ "docId": -658929924,
+ "friendlyName": "7day_Event_Trigger_2019-05",
+ "postDatetime": "2019-05-31T23:59:59"
+ },
+ {
+ "docId": -654750939,
+ "friendlyName": "7day_Event_Trigger_2019-04",
+ "postDatetime": "2019-04-30T23:59:59"
+ },
+ {
+ "docId": -651530753,
+ "friendlyName": "7day_Event_Trigger_2019-03",
+ "postDatetime": "2019-03-31T23:59:59"
+ },
+ {
+ "docId": -646779607,
+ "friendlyName": "7day_Event_Trigger_2019-02",
+ "postDatetime": "2019-02-28T23:59:59"
+ },
+ {
+ "docId": -642939786,
+ "friendlyName": "7day_Event_Trigger_2019-01",
+ "postDatetime": "2019-01-31T23:59:59"
+ },
+ {
+ "docId": -638291882,
+ "friendlyName": "7day_Event_Trigger_2018-12",
+ "postDatetime": "2018-12-31T23:59:59"
+ }
+ ],
+ "missingBundleMonths": [
+ "2026-07"
+ ],
+ "oldestArchivePage": {
+ "meta": {
+ "totalRecords": 3118,
+ "pageSize": 1,
+ "totalPages": 3118,
+ "currentPage": 3118,
+ "query": {
+ "parameterCount": 0,
+ "parameters": {},
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-987-EX",
+ "name": "7-Day Event Trigger Posting",
+ "reportTypeId": 10047
+ },
+ "archives": [
+ {
+ "docId": 414522240,
+ "friendlyName": "7day_Event_Trigger",
+ "postDatetime": "2014-03-19T18:16:54",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-987-ex?download=414522240",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-987-ex",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ }
+ ],
+ "downloads": [
+ {
+ "product": "np4-190-cd",
+ "reader": "dam_stlmnt_pnt_prices",
+ "checkedAt": "2026-09-07T19:55:13.645879+00:00",
+ "error": "Client error '400 Bad Request' for url 'https://api.ercot.com/api/public-reports/bundle/np4-190-cd/download'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"
+ },
+ {
+ "product": "np6-345-cd",
+ "reader": "act_sys_load_by_wzn",
+ "checkedAt": "2026-09-07T19:55:18.035640+00:00",
+ "rows": 744,
+ "firstRow": {
+ "DSTFlag": false,
+ "coast": "9176.18",
+ "east": "1586.44",
+ "farWest": "2668.04",
+ "hourEnding": "01:00",
+ "north": "1233.95",
+ "northC": "14159.14",
+ "operatingDay": "2017-12-31",
+ "southC": "5515.79",
+ "southern": "2704.64",
+ "total": "38540.64",
+ "west": "1496.46"
+ },
+ "minDataDate": "2017-12-31",
+ "maxDataDate": "2018-01-30",
+ "dataDates": [
+ "2017-12-31",
+ "2018-01-01",
+ "2018-01-02",
+ "2018-01-03",
+ "2018-01-04",
+ "2018-01-05",
+ "2018-01-06",
+ "2018-01-07",
+ "2018-01-08",
+ "2018-01-09",
+ "2018-01-10",
+ "2018-01-11",
+ "2018-01-12",
+ "2018-01-13",
+ "2018-01-14",
+ "2018-01-15",
+ "2018-01-16",
+ "2018-01-17",
+ "2018-01-18",
+ "2018-01-19",
+ "2018-01-20",
+ "2018-01-21",
+ "2018-01-22",
+ "2018-01-23",
+ "2018-01-24",
+ "2018-01-25",
+ "2018-01-26",
+ "2018-01-27",
+ "2018-01-28",
+ "2018-01-29",
+ "2018-01-30"
+ ],
+ "zipBytes": 51209,
+ "zipSha256": "fbed23aa166597b4624aaa8fee594e284931923fb6642e9712698accd9542009",
+ "members": [
+ {
+ "name": "cdr.00013101.0000000000000000.20180101.055001.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2336,
+ "sha256": "1560aa6bbeb3060a35f27322f39f211be9db7c18968351851d86d699184777fc"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180102.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2351,
+ "sha256": "3aae73c4b6b3ca2891c3ca8a4ee9f718c6b6bd6934a9eaeb41d8b7227042089b"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180103.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2354,
+ "sha256": "312930d4cdc37951b5e2c7c562ec1df44c70e5620358111b3b866c09e68aed1c"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180104.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2350,
+ "sha256": "413980677bf99a90e40b32270404ddb9df0fc9633f2f10c2dda38b094492ab54"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180105.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2345,
+ "sha256": "4db48f3e1889efc524978cae6336a4d29cf525c2207746916ffdbe7c41f4a51d"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180106.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2342,
+ "sha256": "8ae888eb1f23e0d10b6faeeb942b6b2913beb1a9eb51b1b9e8962e8dd6504037"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180107.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2326,
+ "sha256": "4d9bc8ccb8bc8247a2eef822752c999ef5d8da3e3aca58fe0ccf26f78f416c05"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180108.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2299,
+ "sha256": "d81e6e4f78696d21b4c8a3a4c4aa5d70f456375f49caea607314d3b5b72c6436"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180109.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2322,
+ "sha256": "0e46ff560c25f49b926eb45fd87421c4095193d0e3cff967fe7b0a096409c706"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180110.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2332,
+ "sha256": "c0a208c6028fee858d7c331e3c8510c95fa0981609b6cf6e2ba16e14db982985"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180111.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2328,
+ "sha256": "56a25be0cfced33a35b79b9479431c466e29992931a840bf4e265273e256c474"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180112.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2327,
+ "sha256": "2a2ea41504ec3b52125099f7c401344cd29b7e0a6b830075af2c26c4aa9e513a"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180113.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2345,
+ "sha256": "e89b41f48c079cb41aa10922702c719b6398733c6648d178b9aadcb482678fa6"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180114.055001.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2345,
+ "sha256": "c3a06906070d8d59a03315495fd55cdb6d1b0495b163cbc2af95e59d51fb41f4"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180115.055001.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2342,
+ "sha256": "205b0f330cf298d2a26ffdf740ecb3994fea02e749dffa9548647701df6e62a2"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180116.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2343,
+ "sha256": "cb633bf247151634c63fbd5584d269461171453488d3fd0c2ddc52cb73dc8967"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180117.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2354,
+ "sha256": "6d2b561b26d3c9a4e384a3b1ad2e9c27d55756922068f3946a29a20fe403c771"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180118.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2353,
+ "sha256": "72fa65b087e5b3297e1a328514c8e02a185106d8e43c1a0541eda663d0bd6f85"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180119.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2345,
+ "sha256": "9d9cc07433b41203040e9fc4d22c4685626393b03f1eb8268d724109c2fef0be"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180120.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2342,
+ "sha256": "88306052557369783430f2da4cd8652dcbf2e77efe7dce1dc5248bc7b77c2f8c"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180121.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2300,
+ "sha256": "ec7ad098ad7fe6475140bc7aa9e36973db3c331c83c13ee2e4a9a5628b07f25a"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180122.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2288,
+ "sha256": "c7a2190533f967c02976ef78eaed810acb0f39764c50b271bd324bd33c5895c0"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180123.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2311,
+ "sha256": "c43d15ed4136cd786d72a83c083c1b710ed4acbd8dcf522eb523dc5f8ff33630"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180124.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2325,
+ "sha256": "8d652089db6fa22bcf9a193b94cfb97f57148ae13c11791f4ca04b13510bb945"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180125.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2331,
+ "sha256": "cebb0436a72d23fb7ad85f48eeac68e752a63a1ba29041df54e8d3f83da57da0"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180126.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2326,
+ "sha256": "f5851f53d6d957aa5b07ae00ae238331d6246825dd9210a2d13a94c6dae85f90"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180127.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2315,
+ "sha256": "4cbea0def521da7cdbbe5e24fdca9dceec482179d253e30677850279c2377b92"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180128.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2289,
+ "sha256": "467085436b4a6283f7759d196b60521051c657e6fa5dcc80f98d95667384f698"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180129.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2305,
+ "sha256": "847a908c8c2de2dcdd45d97820c9de0538b612575667cc7b5d40100590b2755d"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180130.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2326,
+ "sha256": "dddc3f8aa2970b2e6c46d0e5b3bdc97c6bc54e8e9c1c03d2b50aea02f0d28764"
+ },
+ {
+ "name": "cdr.00013101.0000000000000000.20180131.055000.ACTUALSYSLOADWZNP6345.csv",
+ "bytes": 2333,
+ "sha256": "f6f6526096084b773c62c466e56f629481b8a07bb389c2963fa6525e88b21219"
+ }
+ ],
+ "independentCsvRows": 744
+ },
+ {
+ "product": "np4-765-er",
+ "docId": -963449156,
+ "rows": 26,
+ "pdfMembers": 26,
+ "minReportDate": "2023-12-05",
+ "maxReportDate": "2023-12-30",
+ "firstRow": {
+ "reportDate": "2023-12-14",
+ "installedDischargeCapacityMW": "5036",
+ "totalDischargeCapacityMW": "7041",
+ "installedChargeCapacityMW": "7022",
+ "totalChargeCapacityMW": "7022",
+ "peakLoadMW": "49356",
+ "peakLoadHourEnding": 8,
+ "dischargeAtPeakLoadMW": "95",
+ "chargeAtPeakLoadMW": "49",
+ "netOutputAtPeakLoadMW": "46",
+ "maxDischargeMW": "492",
+ "maxDischargeTime": "19:29:00",
+ "penetrationAtMaxDischargePercent": "1.03",
+ "maxChargeMW": "619",
+ "maxChargeTime": "11:59:00",
+ "penetrationAtMaxChargePercent": "1.33",
+ "maxDischargePenetrationPercent": "1.04",
+ "maxDischargePenetrationTime": "19:29:00",
+ "dischargeAtMaxPenetrationMW": "492",
+ "maxChargePenetrationPercent": "1.33",
+ "maxChargePenetrationTime": "11:59:00",
+ "chargeAtMaxPenetrationMW": "619",
+ "sourceNotes": "* Sum of maximum capacity (i.e. seasonal max. reasonability limit in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model and are commercially operable (estimated based on commercial operations date in RIOO). ** Sum of maximum capacity (i.e. seasonal max. reasonability limit in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model. + Sum of maximum capacity (i.e. max. power consumption in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model and are commercially operable (estimated based on commercial operations date in RIOO). ++ Sum of maximum capacity (i.e. max. power consumption in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model. ^ ESR Net Charge/Discharge = Total Discharging from ESR generators - Total Charging from ESR CLRs. Positive represents Net Discharge; negative represents Net Charge. Note that generation, generation record, and generator capacity values in following pages of this report are based on units modeled in ERCOT\u2019s network operations model."
+ },
+ "zipSha256": "68421fd18547e7bd03ba8bc85c32beeb140ea78f04c127b60ed036614d17e697",
+ "members": [
+ {
+ "name": "965641539.rpt.00023794.0000000000000000.20231215.080213844.ESRIntegrationReport 12-14-23.pdf",
+ "sha256": "ce46e07946b9f2b6218f351b28386e49521982ec08de8f4197970b43f124b9dd"
+ },
+ {
+ "name": "967613046.rpt.00023794.0000000000000000.20231223.080215413.ESRIntegrationReport 12-22-23.pdf",
+ "sha256": "8b32a173cb0897dde0838b2bc2d6674b27e01691152091eb5935bb5c9e44ddc1"
+ },
+ {
+ "name": "968826018.rpt.00023794.0000000000000000.20231228.080203191.ESRIntegrationReport 12-27-23.pdf",
+ "sha256": "63ce32916ae4f8831a5ef8c52ed2db7b241e47b4ef649cd21118f969317a3272"
+ },
+ {
+ "name": "963691859.rpt.00023794.0000000000000000.20231207.080216985.ESRIntegrationReport 12-06-23.pdf",
+ "sha256": "3ec9cd34dca43bc93adaf5b2e2e30e02e5a4dd50fd29473ce7bb5dad96793429"
+ },
+ {
+ "name": "966867987.rpt.00023794.0000000000000000.20231220.080215152.ESRIntegrationReport 12-19-23.pdf",
+ "sha256": "3652e228e73d146430b5e36ef32c7268a988baf3b60f43996ad9f1b4d5bf6f3d"
+ },
+ {
+ "name": "966368925.rpt.00023794.0000000000000000.20231218.080219451.ESRIntegrationReport 12-17-23.pdf",
+ "sha256": "5837a52ab242335cb3e57a21c096b05ac6e8760bdd58e2d5ba1aae6b8fc72564"
+ },
+ {
+ "name": "963934709.rpt.00023794.0000000000000000.20231208.080216322.ESRIntegrationReport 12-07-23.pdf",
+ "sha256": "07332184a14f1b2cdfd21c67856b8e5d2fac354d66750fdcdde007c4e4f37895"
+ },
+ {
+ "name": "964899714.rpt.00023794.0000000000000000.20231212.080217984.ESRIntegrationReport 12-11-23.pdf",
+ "sha256": "1d8671491d80949e76ed770a8d165af7e4c496b6f44dd127d6f024d672772901"
+ },
+ {
+ "name": "964644082.rpt.00023794.0000000000000000.20231211.080218993.ESRIntegrationReport 12-10-23.pdf",
+ "sha256": "7a1518c63a76d759e15188914fa0ee31198fbad447ec9d8f9c6e1b82bcf16807"
+ },
+ {
+ "name": "965392663.rpt.00023794.0000000000000000.20231214.080233675.ESRIntegrationReport 12-13-23.pdf",
+ "sha256": "1eca7c906d14727c3be753b8203cb688fa29ff765fcf4173187e36ab617f549d"
+ },
+ {
+ "name": "967364854.rpt.00023794.0000000000000000.20231222.080214742.ESRIntegrationReport 12-21-23.pdf",
+ "sha256": "d11183fd65887b70cf35d77ea836ac2dbbdfb3cac36262ff9fac328407065326"
+ },
+ {
+ "name": "964176617.rpt.00023794.0000000000000000.20231209.080221220.ESRIntegrationReport 12-08-23.pdf",
+ "sha256": "fd1ee35f9265cec282ab4a6e2785cfed21ddbea385528ad500e3bfb165ea10d3"
+ },
+ {
+ "name": "969564820.rpt.00023794.0000000000000000.20231231.080226626.ESRIntegrationReport 12-30-23.pdf",
+ "sha256": "10896a150096d202e3f7c036517ed8dcc86450137e5db3334879ea346c062bcb"
+ },
+ {
+ "name": "967849886.rpt.00023794.0000000000000000.20231224.080227641.ESRIntegrationReport 12-23-23.pdf",
+ "sha256": "d70a706e590706d2ef13376610f0fd2ae0f942d23c9ab41483309c81d4108f55"
+ },
+ {
+ "name": "968312380.rpt.00023794.0000000000000000.20231226.080207839.ESRIntegrationReport 12-25-23.pdf",
+ "sha256": "dfa73589aef8bb094c018cd24915f8563cf9fb3b429e10667bf91c8faff516f1"
+ },
+ {
+ "name": "965890275.rpt.00023794.0000000000000000.20231216.080217527.ESRIntegrationReport 12-15-23.pdf",
+ "sha256": "d54f61ecd147877840059b421220f863eb379cec336d6897459fe0e97ff059b4"
+ },
+ {
+ "name": "969079755.rpt.00023794.0000000000000000.20231229.080205414.ESRIntegrationReport 12-28-23.pdf",
+ "sha256": "5524ee9eaac44ba56d6cd871be5c2be68b53ddfdcaf7ce1af9ea82c7bad7496c"
+ },
+ {
+ "name": "968079959.rpt.00023794.0000000000000000.20231225.080212966.ESRIntegrationReport 12-24-23.pdf",
+ "sha256": "72b2bc016bd800fff15eaa4865cff6304aaad83ae6ccce515cb2d3720b8efffd"
+ },
+ {
+ "name": "964407639.rpt.00023794.0000000000000000.20231210.080451892.ESRIntegrationReport 12-09-23.pdf",
+ "sha256": "a8a89334c85be9630bb7ee699ee245b91b0bdf43bc9e5f96b69d2826790b4252"
+ },
+ {
+ "name": "965147006.rpt.00023794.0000000000000000.20231213.080205389.ESRIntegrationReport 12-12-23.pdf",
+ "sha256": "d02de0c2d2167b2f2746e05c7c6db6c2f97d8ca422852e4ba192422e311163dd"
+ },
+ {
+ "name": "966128938.rpt.00023794.0000000000000000.20231217.080230967.ESRIntegrationReport 12-16-23.pdf",
+ "sha256": "e4f9318032c7e9cabfed501b2b592c6fac867468e24f208c51e33653fe9e5491"
+ },
+ {
+ "name": "963449156.rpt.00023794.0000000000000000.20231206.080221290.ESRIntegrationReport 12-05-23.pdf",
+ "sha256": "0ef80712cb83a13d67285a58d7154139c70cec390ade961f9f5532fd5005203c"
+ },
+ {
+ "name": "966625339.rpt.00023794.0000000000000000.20231219.080210074.ESRIntegrationReport 12-18-23.pdf",
+ "sha256": "9041ae311c37bcd06547a30c77d6a47558019331b02376b99fcbcd589b862240"
+ },
+ {
+ "name": "968565068.rpt.00023794.0000000000000000.20231227.080212872.ESRIntegrationReport 12-26-23.pdf",
+ "sha256": "709d54ed4dddb81bb2c5698b2f78de495ad49b45ddd4a518ebd6bd52dca288b7"
+ },
+ {
+ "name": "969324580.rpt.00023794.0000000000000000.20231230.080213816.ESRIntegrationReport 12-29-23.pdf",
+ "sha256": "9c5a7c084be082e47879295caec87260d8494aba00165f93e58cbf3de1f1d087"
+ },
+ {
+ "name": "967113627.rpt.00023794.0000000000000000.20231221.080217107.ESRIntegrationReport 12-20-23.pdf",
+ "sha256": "6576549f0c1b05782c021cf06dcef9275e0a95b92b4dda224618328952fc457a"
+ }
+ ]
+ }
+ ],
+ "rechecks": [
+ {
+ "product": "np4-190-cd",
+ "docId": -593019152,
+ "status": 400,
+ "body": "{\"timestamp\":\"2026-09-07 02:57:01\",\"code\":400,\"status\":\"BAD_REQUEST\",\"message\":\"Your request could not be processed. The request may be malformed or the URL does not exist.\"}"
+ },
+ {
+ "product": "np4-765-er",
+ "docId": -963449156,
+ "bytes": 4006121
+ }
+ ],
+ "alternateDownloadCheck": [
+ {
+ "product": "np4-190-cd",
+ "docId": -593019152,
+ "status": 200,
+ "contentType": "application/zip",
+ "bytes": 2119218,
+ "isZip": true
+ }
+ ],
+ "recoveredDamBundle": {
+ "product": "NP4-190-CD",
+ "docId": -593019152,
+ "checkedAt": "2026-09-07T20:03:45.258824+00:00",
+ "requests": [
+ {
+ "method": "POST",
+ "path": "/api/public-reports/bundle/np4-190-cd/download",
+ "status": 400,
+ "query": ""
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np4-190-cd",
+ "status": 200,
+ "query": "download=-593019152"
+ }
+ ],
+ "rows": 473256,
+ "independentCsvRows": 473256,
+ "firstRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2018-01-02",
+ "hourEnding": "01:00",
+ "settlementPoint": "AEEC",
+ "settlementPointPrice": "36.08"
+ },
+ "minDeliveryDate": "2018-01-02",
+ "maxDeliveryDate": "2018-02-01",
+ "zipSha256": "658c40c7f7ea43d06ab629ee608c42eead0db8ccf94d219e4c8af90249f2ab3a",
+ "members": [
+ {
+ "name": "cdr.00012331.0000000000000000.20180101.123343.DAMSPNP4190.csv",
+ "rows": 15288,
+ "sha256": "2fbb34844e0f3bcfeb58fdd72c3f2fd761e926c6a680133a40654d6d5fb11766"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180102.125150.DAMSPNP4190.csv",
+ "rows": 15288,
+ "sha256": "110db05260ed56cff8d126dcaf51605baed35c89fafe8904fec93bc2c0e1a0ad"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180103.123151.DAMSPNP4190.csv",
+ "rows": 15288,
+ "sha256": "47ac3c76e7b5340e105403b4cd129a1b5e0b488ddbc4097d7435ab9c0fef023b"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180104.122808.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "0ddf50a5366ec074e1ea878e3342860c5d60da12fa95b9a29fb243e51a4dae08"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180105.122557.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "21e07736822fc28048caa8a31e127575156968a34b40640369076710324a29f5"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180106.122455.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "516ed567a0596fd245b4a6e17bb0b4e26cad8120a8ffb220631fef1cb34fd01a"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180107.122257.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "c4ee6fdc962cb6d69d6328e03e0127a059388e5a72cb1594980ea1b94150888d"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180108.122938.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "dd4ac66beaa3241c92f41f9288cdbb43e0e036942082ebb06d62ba5a77685455"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180109.123143.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "5989ac7fc8c31c27221c619def8f9f78e2461e1a60142c632bf6a4ef5735b674"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180110.122754.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "7fd2422d22038ac5cf4c1265a1c15e5043a40f7f4891a926d80e55a0a7fec04b"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180111.123653.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "f244737e7ac56f33793812ca2fa3c435e6a4eb514777adc8dc6058966ee99951"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180112.123717.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "ea98da5788abb15c02b0265bdadd2a6c8acbea64583496372b5820b60b1fc714"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180113.122654.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "f58b8700a0349ba7bfa49c3ad3caf8416b163609758391429d3e64189ae88c98"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180114.122630.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "33dab3f069a591346e471801dfcf5f89f379f0985134094e8a5c330108284370"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180115.123747.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "2d151a88f9068deb2152271b3afa350d5ae14e3801b9cdde9040e49d0a3e3148"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180116.132811.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "eca597a50e32b5a31dea2db817a94f9b7d68c22bb443dfc5ddd5d78e586db628"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180117.123905.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "f04f1299f83b7fcc63149ec5672842625e4a317fd3a7d8f682e358cfd8c907aa"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180118.124817.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "f5594372fffdc4a8d6d646d0e377954bd3342d9727ae78de90b1b2c9500d854a"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180119.122736.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "9ef663dcba32f5bbbb046358dfba2abfbc0f0fd44d55a18c804bc768fc61336e"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180120.122945.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "72abdc7fd95beb82add7b829572d7ed055d71cb600d93ceb938344e6ddfbe73f"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180121.122258.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "a584d8ba716741ec7bcb9dbfdc4890cf9351f10308dd82d6234fb4a62f0f6803"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180122.173921.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "8577c8c2e66eab7156c07c66886621c0a59ff88a83b244d4d85a33f1ff88dc1b"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180123.124909.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "76612ef0df3a48b055d2a5796ca963b5e65a69bcde5fdbf4c7352de5843153cc"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180124.124834.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "6c1cbe17aa2e2ce416dd8dda46a61710bead831d5fdbe07de6499216e840e7f4"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180125.123629.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "1d29744ec79cba0b1177dc80487c457f476c45b39f11e647b5bfa219b0ed9d75"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180126.122802.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "6b835e11626dc0ae40fa6450532cdf08826eee6f62782e55d49deff70aed6751"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180127.122710.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "dc47b418f49a15ba74a9ea3f2d9a765877140cc0b354b8e74fd7219c9386d4e7"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180128.122910.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "c8706026ce57398432c7ce3dd628fd3abeb4a95615f516a02843878fb17707b0"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180129.125605.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "3592fd249dc1bcb5c732fb97fb6edd9c0a3c44d773d2afb998a1988e32da3413"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180130.123444.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "0e50b386f9dbdf706120e4277a62e1d903f7190f4d0013474dca3faf173a0536"
+ },
+ {
+ "name": "cdr.00012331.0000000000000000.20180131.123437.DAMSPNP4190.csv",
+ "rows": 15264,
+ "sha256": "8086d0a53c450601a1af80ab41fb8c863fd6ad6536336df32e22c220a783b1af"
+ }
+ ]
+ },
+ "archiveOverlapChecks": [
+ {
+ "product": "np4-190-cd",
+ "checkedAt": "2026-09-07T20:19:14.292699+00:00",
+ "publicationBounds": [
+ "2018-01-01T00:00:00",
+ "2018-01-31T23:59:59"
+ ],
+ "archiveMeta": {
+ "totalRecords": 31,
+ "pageSize": 1000,
+ "totalPages": 1,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-01-31T23:59:59"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "archiveDocuments": [
+ {
+ "docId": 596980574,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-31T12:34:38"
+ },
+ {
+ "docId": 596849986,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-30T12:34:45"
+ },
+ {
+ "docId": 596717785,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-29T12:56:06"
+ },
+ {
+ "docId": 596581954,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-28T12:29:11"
+ },
+ {
+ "docId": 596460407,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-27T12:27:11"
+ },
+ {
+ "docId": 596334632,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-26T12:28:03"
+ },
+ {
+ "docId": 596204356,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-25T12:36:30"
+ },
+ {
+ "docId": 596073611,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-24T12:48:35"
+ },
+ {
+ "docId": 595940090,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-23T12:49:10"
+ },
+ {
+ "docId": 595830910,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-22T17:39:22"
+ },
+ {
+ "docId": 595669650,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-21T12:22:59"
+ },
+ {
+ "docId": 595547176,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-20T12:29:45"
+ },
+ {
+ "docId": 595420681,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-19T12:27:37"
+ },
+ {
+ "docId": 595287760,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-18T12:48:18"
+ },
+ {
+ "docId": 595149386,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-17T12:39:05"
+ },
+ {
+ "docId": 595014349,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-16T13:28:12"
+ },
+ {
+ "docId": 594869025,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-15T12:37:48"
+ },
+ {
+ "docId": 594734822,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-14T12:26:31"
+ },
+ {
+ "docId": 594608286,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-13T12:26:55"
+ },
+ {
+ "docId": 594479664,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-12T12:37:17"
+ },
+ {
+ "docId": 594346190,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-11T12:36:53"
+ },
+ {
+ "docId": 594215170,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-10T12:27:55"
+ },
+ {
+ "docId": 594085534,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-09T12:31:44"
+ },
+ {
+ "docId": 593948498,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-08T12:29:38"
+ },
+ {
+ "docId": 593816307,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-07T12:22:58"
+ },
+ {
+ "docId": 593693158,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-06T12:24:55"
+ },
+ {
+ "docId": 593567432,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-05T12:25:58"
+ },
+ {
+ "docId": 593434284,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-04T12:28:09"
+ },
+ {
+ "docId": 593295228,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-03T12:31:52"
+ },
+ {
+ "docId": 593156958,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-02T12:51:50"
+ },
+ {
+ "docId": 593019152,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-01T12:33:44"
+ }
+ ],
+ "archiveZipSha256": "52a19e7e30ebc99202837c385bd02f2a6fd5bf5f186129bc302d727218d407bc",
+ "archiveCsvFiles": 31,
+ "bundleCsvFiles": 31,
+ "identicalNameAndContentPairs": 31,
+ "archiveOnlyFiles": [],
+ "bundleOnlyFiles": [],
+ "fileTimestampSetMatchesApiToSecond": false,
+ "matchingTimestampsToSecond": 7,
+ "fileTimestamps": [
+ "20180101123343",
+ "20180102125150",
+ "20180103123151",
+ "20180104122808",
+ "20180105122557",
+ "20180106122455",
+ "20180107122257",
+ "20180108122938",
+ "20180109123143",
+ "20180110122754",
+ "20180111123653",
+ "20180112123717",
+ "20180113122654",
+ "20180114122630",
+ "20180115123747",
+ "20180116132811",
+ "20180117123905",
+ "20180118124817",
+ "20180119122736",
+ "20180120122945",
+ "20180121122258",
+ "20180122173921",
+ "20180123124909",
+ "20180124124834",
+ "20180125123629",
+ "20180126122802",
+ "20180127122710",
+ "20180128122910",
+ "20180129125605",
+ "20180130123444",
+ "20180131123437"
+ ],
+ "apiPublicationTimestampsToSecond": [
+ "20180101123344",
+ "20180102125150",
+ "20180103123152",
+ "20180104122809",
+ "20180105122558",
+ "20180106122455",
+ "20180107122258",
+ "20180108122938",
+ "20180109123144",
+ "20180110122755",
+ "20180111123653",
+ "20180112123717",
+ "20180113122655",
+ "20180114122631",
+ "20180115123748",
+ "20180116132812",
+ "20180117123905",
+ "20180118124818",
+ "20180119122737",
+ "20180120122945",
+ "20180121122259",
+ "20180122173922",
+ "20180123124910",
+ "20180124124835",
+ "20180125123630",
+ "20180126122803",
+ "20180127122711",
+ "20180128122911",
+ "20180129125606",
+ "20180130123445",
+ "20180131123438"
+ ]
+ },
+ {
+ "product": "np6-345-cd",
+ "checkedAt": "2026-09-07T20:19:24.960550+00:00",
+ "publicationBounds": [
+ "2018-01-01T00:00:00",
+ "2018-01-31T23:59:59"
+ ],
+ "archiveMeta": {
+ "totalRecords": 31,
+ "pageSize": 1000,
+ "totalPages": 1,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-01-31T23:59:59"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "archiveDocuments": [
+ {
+ "docId": 596936905,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-31T05:50:00"
+ },
+ {
+ "docId": 596804259,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-30T05:50:00"
+ },
+ {
+ "docId": 596668014,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-29T05:50:00"
+ },
+ {
+ "docId": 596543614,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-28T05:50:00"
+ },
+ {
+ "docId": 596421539,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-27T05:50:00"
+ },
+ {
+ "docId": 596291164,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-26T05:50:00"
+ },
+ {
+ "docId": 596159111,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-25T05:50:01"
+ },
+ {
+ "docId": 596026800,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-24T05:50:00"
+ },
+ {
+ "docId": 595892033,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-23T05:50:00"
+ },
+ {
+ "docId": 595755570,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-22T05:50:00"
+ },
+ {
+ "docId": 595631236,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-21T05:50:00"
+ },
+ {
+ "docId": 595507696,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-20T05:50:00"
+ },
+ {
+ "docId": 595376321,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-19T05:50:00"
+ },
+ {
+ "docId": 595240247,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-18T05:50:00"
+ },
+ {
+ "docId": 595102314,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-17T05:50:00"
+ },
+ {
+ "docId": 594961829,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-16T05:50:00"
+ },
+ {
+ "docId": 594821924,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-15T05:50:01"
+ },
+ {
+ "docId": 594694910,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-14T05:50:01"
+ },
+ {
+ "docId": 594567567,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-13T05:50:00"
+ },
+ {
+ "docId": 594433261,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-12T05:50:01"
+ },
+ {
+ "docId": 594301440,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-11T05:50:00"
+ },
+ {
+ "docId": 594171312,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-10T05:50:01"
+ },
+ {
+ "docId": 594039647,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-09T05:50:00"
+ },
+ {
+ "docId": 593901749,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-08T05:50:00"
+ },
+ {
+ "docId": 593778129,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-07T05:50:00"
+ },
+ {
+ "docId": 593654338,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-06T05:50:00"
+ },
+ {
+ "docId": 593522617,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-05T05:50:00"
+ },
+ {
+ "docId": 593388176,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-04T05:50:01"
+ },
+ {
+ "docId": 593250406,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-03T05:50:00"
+ },
+ {
+ "docId": 593106759,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-02T05:50:00"
+ },
+ {
+ "docId": 592978227,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2018-01-01T05:50:01"
+ }
+ ],
+ "archiveZipSha256": "9e69d1a0cc530f667eae86334b0a375f44ee343c8f0c7c4c6144d929ca84a317",
+ "archiveCsvFiles": 31,
+ "bundleCsvFiles": 31,
+ "identicalNameAndContentPairs": 31,
+ "archiveOnlyFiles": [],
+ "bundleOnlyFiles": [],
+ "fileTimestampSetMatchesApiToSecond": false,
+ "matchingTimestampsToSecond": 27,
+ "fileTimestamps": [
+ "20180101055001",
+ "20180102055000",
+ "20180103055000",
+ "20180104055000",
+ "20180105055000",
+ "20180106055000",
+ "20180107055000",
+ "20180108055000",
+ "20180109055000",
+ "20180110055000",
+ "20180111055000",
+ "20180112055000",
+ "20180113055000",
+ "20180114055001",
+ "20180115055001",
+ "20180116055000",
+ "20180117055000",
+ "20180118055000",
+ "20180119055000",
+ "20180120055000",
+ "20180121055000",
+ "20180122055000",
+ "20180123055000",
+ "20180124055000",
+ "20180125055000",
+ "20180126055000",
+ "20180127055000",
+ "20180128055000",
+ "20180129055000",
+ "20180130055000",
+ "20180131055000"
+ ],
+ "apiPublicationTimestampsToSecond": [
+ "20180101055001",
+ "20180102055000",
+ "20180103055000",
+ "20180104055001",
+ "20180105055000",
+ "20180106055000",
+ "20180107055000",
+ "20180108055000",
+ "20180109055000",
+ "20180110055001",
+ "20180111055000",
+ "20180112055001",
+ "20180113055000",
+ "20180114055001",
+ "20180115055001",
+ "20180116055000",
+ "20180117055000",
+ "20180118055000",
+ "20180119055000",
+ "20180120055000",
+ "20180121055000",
+ "20180122055000",
+ "20180123055000",
+ "20180124055000",
+ "20180125055001",
+ "20180126055000",
+ "20180127055000",
+ "20180128055000",
+ "20180129055000",
+ "20180130055000",
+ "20180131055000"
+ ]
+ }
+ ],
+ "originalDocumentIdChecks": [
+ {
+ "product": "np4-190-cd",
+ "archiveDocuments": 31,
+ "matchedBundleMemberIds": 31,
+ "identicalOriginalPayloads": 31,
+ "example": {
+ "docId": 593019152,
+ "bundleMember": "593019152.cdr.00012331.0000000000000000.20180101.123344143.DAMSPNP4190_csv.zip"
+ },
+ "archiveSha256": "52a19e7e30ebc99202837c385bd02f2a6fd5bf5f186129bc302d727218d407bc",
+ "bundleSha256": "658c40c7f7ea43d06ab629ee608c42eead0db8ccf94d219e4c8af90249f2ab3a"
+ },
+ {
+ "product": "np6-345-cd",
+ "archiveDocuments": 31,
+ "matchedBundleMemberIds": 31,
+ "identicalOriginalPayloads": 31,
+ "example": {
+ "docId": 592978227,
+ "bundleMember": "592978227.cdr.00013101.0000000000000000.20180101.055001214.ACTUALSYSLOADWZNP6345_csv.zip"
+ },
+ "archiveSha256": "9e69d1a0cc530f667eae86334b0a375f44ee343c8f0c7c4c6144d929ca84a317",
+ "bundleSha256": "fbed23aa166597b4624aaa8fee594e284931923fb6642e9712698accd9542009"
+ }
+ ],
+ "combinedBackfillChecks": [
+ {
+ "product": "np4-190-cd",
+ "checkedAt": "2026-09-08T03:15:42.179621+00:00",
+ "postedFrom": "2018-01-01T00:00:00",
+ "postedTo": "2018-01-31T23:59:59",
+ "rows": 473256,
+ "matchesRecordedArchiveRowMultiset": true,
+ "comparison": "SHA256 of every typed row serialized with model_dump_json, counted with multiplicity; order ignored.",
+ "referenceArchiveSha256": "52a19e7e30ebc99202837c385bd02f2a6fd5bf5f186129bc302d727218d407bc",
+ "requests": [
+ {
+ "method": "GET",
+ "path": "/api/public-reports/archive/np4-190-cd",
+ "query": "page=1&size=1000&postDatetimeFrom=2018-01-01T00%3A00%3A00&postDatetimeTo=2018-01-31T23%3A59%3A59"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np4-190-cd",
+ "query": "page=1&size=1000"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/bundle/np4-190-cd/download",
+ "query": ""
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np4-190-cd",
+ "query": "download=-593019152"
+ }
+ ]
+ },
+ {
+ "product": "np6-345-cd",
+ "checkedAt": "2026-09-08T03:15:50.780096+00:00",
+ "postedFrom": "2018-01-01T00:00:00",
+ "postedTo": "2018-01-31T23:59:59",
+ "rows": 744,
+ "matchesRecordedArchiveRowMultiset": true,
+ "comparison": "SHA256 of every typed row serialized with model_dump_json, counted with multiplicity; order ignored.",
+ "referenceArchiveSha256": "9e69d1a0cc530f667eae86334b0a375f44ee343c8f0c7c4c6144d929ca84a317",
+ "requests": [
+ {
+ "method": "GET",
+ "path": "/api/public-reports/archive/np6-345-cd",
+ "query": "page=1&size=1000&postDatetimeFrom=2018-01-01T00%3A00%3A00&postDatetimeTo=2018-01-31T23%3A59%3A59"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np6-345-cd",
+ "query": "page=1&size=1000"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/bundle/np6-345-cd/download",
+ "query": ""
+ }
+ ]
+ }
+ ],
+ "retentionBoundaryBackfillCheck": {
+ "product": "np4-190-cd",
+ "checkedAt": "2026-09-08T03:17:43.985310+00:00",
+ "postedFrom": "2017-12-31T00:00:00",
+ "postedTo": "2018-01-01T23:59:59",
+ "archiveDocuments": [
+ {
+ "docId": 593019152,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2018-01-01T12:33:44"
+ },
+ {
+ "docId": 592891494,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2017-12-31T12:32:34"
+ }
+ ],
+ "rows": 30576,
+ "matchesFreshArchiveRowMultiset": true,
+ "comparison": "SHA256 of every typed row model_dump_json, counted with multiplicity; order ignored.",
+ "referenceArchiveSha256": "b3ba8ac856206aab9ae49b68b394a813401351f3a594c4993b3482a0521aeeab",
+ "requests": [
+ {
+ "method": "GET",
+ "path": "/api/public-reports/archive/np4-190-cd",
+ "query": "page=1&size=1000&postDatetimeFrom=2017-12-31T00%3A00%3A00&postDatetimeTo=2018-01-01T23%3A59%3A59"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np4-190-cd",
+ "query": "page=1&size=1000"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/bundle/np4-190-cd/download",
+ "query": ""
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np4-190-cd",
+ "query": "download=-593019152"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/archive/np4-190-cd/download",
+ "query": ""
+ }
+ ]
+ },
+ "fullLoadBackfillCheck": {
+ "startedAt": "2026-09-08T04:08:33.620310+00:00",
+ "finishedAt": "2026-09-08T04:17:01.657722+00:00",
+ "product": "NP6-345-CD",
+ "scope": "Unbounded SDK backfill of every listed archive and bundle publication at this snapshot, with every typed row independently compared to downloaded source CSV fields using stdlib CSV/date/Decimal. Original document IDs deduplicate exact source copies; distinct publications and repeated rows are preserved. No claim about other products or availability before the first retained source row.",
+ "archivePublications": 4512,
+ "bundlePublications": 102,
+ "uniqueOriginalPublications": 4512,
+ "bundleOnlyPublications": 0,
+ "rows": 108285,
+ "sourceCellsCompared": 1299420,
+ "firstOperatingDay": "2014-04-30",
+ "lastOperatingDay": "2026-09-06",
+ "operatingDays": 4512,
+ "missingOperatingDays": [
+ "2025-12-04"
+ ],
+ "rowsPerDayHistogram": {
+ "24": 4485,
+ "23": 15,
+ "25": 12
+ },
+ "sourceLayouts": {
+ "OperDay,HourEnding,COAST,EAST,FAR_WEST,NORTH,NORTH_C,SOUTHERN,SOUTH_C,WEST,TOTAL,DSTFlag": 4512
+ },
+ "allListedArchivesIncluded": true,
+ "allTypedRowsMatchIndependentSource": true,
+ "sourceManifestSha256": "c03cc098a78fdab8892ac1f019b509801a0a07bbf7a458babcf91ff014f861a7",
+ "downloadSummary": {
+ "bundles": 102,
+ "archiveBatches": 2,
+ "individualArchivePublications": 1410,
+ "bytes": 7314764,
+ "manifestSha256": "11da34943e56c8865033d39b07cde0a03a313a0e88fb1288ee7fee097af135d3"
+ },
+ "missingHours": [
+ {
+ "operatingDay": "2014-11-04",
+ "expectedClockHours": 24,
+ "sourceRows": 23,
+ "absentHourLabels": [
+ "24:00"
+ ]
+ },
+ {
+ "operatingDay": "2015-08-04",
+ "expectedClockHours": 24,
+ "sourceRows": 23,
+ "absentHourLabels": [
+ "24:00"
+ ]
+ },
+ {
+ "operatingDay": "2016-03-15",
+ "expectedClockHours": 24,
+ "sourceRows": 23,
+ "absentHourLabels": [
+ "24:00"
+ ]
+ }
+ ],
+ "gapQueryCheck": {
+ "checkedAt": "2026-09-08T04:19:45.077506+00:00",
+ "missingDay": "2025-12-04",
+ "missingDayRows": 0,
+ "controls": [
+ {
+ "operatingDay": "2025-12-03",
+ "totalRecords": 24,
+ "rows": 24
+ },
+ {
+ "operatingDay": "2025-12-05",
+ "totalRecords": 24,
+ "rows": 24
+ },
+ {
+ "operatingDay": "2014-11-03",
+ "totalRecords": 0,
+ "rows": 0
+ },
+ {
+ "operatingDay": "2014-11-04",
+ "totalRecords": 0,
+ "rows": 0
+ },
+ {
+ "operatingDay": "2015-08-03",
+ "totalRecords": 0,
+ "rows": 0
+ },
+ {
+ "operatingDay": "2015-08-04",
+ "totalRecords": 0,
+ "rows": 0
+ },
+ {
+ "operatingDay": "2016-03-14",
+ "totalRecords": 0,
+ "rows": 0
+ },
+ {
+ "operatingDay": "2016-03-15",
+ "totalRecords": 0,
+ "rows": 0
+ }
+ ],
+ "conclusion": "The missing December 2025 day is also absent from the report query, while both adjacent days return 24 rows. Queries for the three older short days and their adjacent control dates all return zero rows, so query access did not recover their missing hours; this does not establish a retention cutoff."
+ }
+ },
+ "fullAncillaryPriceBackfillCheck": {
+ "startedAt": "2026-09-08T04:24:34.767263+00:00",
+ "finishedAt": "2026-09-08T04:38:36.933901+00:00",
+ "product": "NP4-188-CD",
+ "scope": "Unbounded SDK backfill of every listed archive and bundle publication at this snapshot, with every typed row independently compared to downloaded source CSV fields using stdlib CSV/date/Decimal. Original document IDs deduplicate exact source copies; distinct publications and repeated rows are preserved. No claim about other products or availability before the first retained source row.",
+ "archivePublications": 4513,
+ "bundlePublications": 103,
+ "uniqueOriginalPublications": 4513,
+ "bundleOnlyPublications": 0,
+ "rows": 461736,
+ "sourceCellsCompared": 2308680,
+ "firstDeliveryDate": "2014-05-02",
+ "lastDeliveryDate": "2026-09-08",
+ "deliveryDates": 4513,
+ "missingDeliveryDates": [],
+ "rowsPerDayHistogram": {
+ "120": 1181,
+ "115": 3,
+ "125": 3,
+ "96": 3308,
+ "92": 9,
+ "100": 9
+ },
+ "serviceRows": {
+ "RRS": 108312,
+ "ECRS": 28488,
+ "REGDN": 108312,
+ "NSPIN": 108312,
+ "REGUP": 108312
+ },
+ "sourceLayouts": {
+ "DeliveryDate,HourEnding,AncillaryType,MCPC,DSTFlag": 4513
+ },
+ "allListedArchivesIncluded": true,
+ "allTypedRowsMatchIndependentSource": true,
+ "sourceManifestSha256": "81e0b03b7b6e2bf1bf58df8306fe552d6228189bbe7956c3bac53e0f150aee1d",
+ "downloadSummary": {
+ "bundles": 103,
+ "archiveBatches": 2,
+ "individualArchivePublications": 1379,
+ "bytes": 4703288,
+ "manifestSha256": "999978f615be37f70c604c5570606d120a60a8bb5e96e6275c3747602998b169"
+ },
+ "serviceIntervals": {
+ "scope": "Each source delivery date/service has the expected number of unique hour-ending/DST-flag pairs for the America/Chicago clock day. Service date continuity is checked within its observed first/last dates; no availability before first observation is inferred.",
+ "anomalies": [],
+ "serviceAvailability": [
+ {
+ "service": "ECRS",
+ "firstDeliveryDate": "2023-06-10",
+ "lastDeliveryDate": "2026-09-08",
+ "deliveryDates": 1187,
+ "missingDatesWithinObservedRange": []
+ },
+ {
+ "service": "NSPIN",
+ "firstDeliveryDate": "2014-05-02",
+ "lastDeliveryDate": "2026-09-08",
+ "deliveryDates": 4513,
+ "missingDatesWithinObservedRange": []
+ },
+ {
+ "service": "REGDN",
+ "firstDeliveryDate": "2014-05-02",
+ "lastDeliveryDate": "2026-09-08",
+ "deliveryDates": 4513,
+ "missingDatesWithinObservedRange": []
+ },
+ {
+ "service": "REGUP",
+ "firstDeliveryDate": "2014-05-02",
+ "lastDeliveryDate": "2026-09-08",
+ "deliveryDates": 4513,
+ "missingDatesWithinObservedRange": []
+ },
+ {
+ "service": "RRS",
+ "firstDeliveryDate": "2014-05-02",
+ "lastDeliveryDate": "2026-09-08",
+ "deliveryDates": 4513,
+ "missingDatesWithinObservedRange": []
+ }
+ ]
+ }
+ },
+ "dateParsingBenchmark": {
+ "scope": "Local paired CSV-reader benchmark of the same captured 26,736-row DAM report; 10 runs per variant in alternating order, with a full typed-row serialization digest comparison. Network time excluded; not a universal speedup claim.",
+ "rows": 26736,
+ "seconds": {
+ "before": [
+ 0.32261935000133235,
+ 0.30964967400359455,
+ 0.310778016995755,
+ 0.30941072999848984,
+ 0.3093402749946108,
+ 0.3085634910094086,
+ 0.30751861399039626,
+ 0.3087330909911543,
+ 0.30986054199456703,
+ 0.31206939899129793
+ ],
+ "after": [
+ 0.12877639100770466,
+ 0.12803452600201126,
+ 0.1285569530009525,
+ 0.129109490007977,
+ 0.12776305100123864,
+ 0.13109975900442805,
+ 0.1271814570063725,
+ 0.12504749599611387,
+ 0.12519647700537462,
+ 0.12780216899409425
+ ]
+ },
+ "medianSeconds": {
+ "before": 0.3095302020010422,
+ "after": 0.12791834749805275
+ },
+ "speedup": 2.4197482851766363,
+ "typedRowsSha256": "199f8874d238afbb16d443ab047aac48cc95bd2ae8372e7703a4f83140ac2e60",
+ "sourceSha256": "439316b6e7de3043a6db23d771825213bf58cbde3eccfa0f6a78e8218c16565d",
+ "baselineReaderSha256": "269558276f48c531998f97240d9cd20b3bea29bb3c1c1052a11fe2f05cb9f45c",
+ "optimizedReaderSha256": "9ff9e1243e35ca6a65f4e990bdd8d3e0568043f4590c101b67e8d32d69cf499e",
+ "pythonVersion": "3.13.15",
+ "bundleDocId": -1257192853,
+ "originalMember": "1257192853.cdr.00012331.0000000000000000.20260801.123250.DAMSPNP4190_csv.zip",
+ "cacheEntries": 128,
+ "cacheLifetime": "One Archive.read invocation; keys include date text and declared format"
+ },
+ "fullDamSettlementPriceBackfillCheck": {
+ "startedAt": "2026-09-08T04:48:43.819523+00:00",
+ "finishedAt": "2026-09-08T05:23:04.529689+00:00",
+ "product": "NP4-190-CD",
+ "scope": "Unbounded SDK backfill of all listed archive and bundle publications at the snapshot, all settlement points. Each emitted row compared exactly, in stream order, to an independent stdlib CSV/date/Decimal parser of original source members. Every source row must be consumed before the next download; original IDs deduplicate copies while preserving distinct publications. Memory is bounded by download/report size and compact counts, not total row count.",
+ "archivePublications": 4513,
+ "bundlePublications": 103,
+ "uniqueOriginalPublications": 4514,
+ "bundleOnlyPublications": 1,
+ "rows": 81236426,
+ "sourceCellsCompared": 406182130,
+ "settlementPoints": 1230,
+ "firstDeliveryDate": "2014-05-02",
+ "lastDeliveryDate": "2026-09-08",
+ "deliveryDates": 4513,
+ "missingDeliveryDates": [],
+ "sourceLayouts": {
+ "DeliveryDate,HourEnding,SettlementPoint,SettlementPointPrice,DSTFlag": 4514
+ },
+ "anomalousPointDays": 0,
+ "anomalyExamples": [],
+ "allListedArchivesIncluded": true,
+ "allTypedRowsMatchIndependentSource": true,
+ "sourceManifestSha256": "a359bfcd427bc088d2007679cb2684b146b5200fa40d31ee1c45ca8546fb3e0b",
+ "downloadsByKind": {
+ "bundle": 103,
+ "archive": 56
+ },
+ "remainingArchiveIdsDownloaded": 1380,
+ "bundleOnlyPublication": {
+ "docId": 1200847777,
+ "bundle": {
+ "docId": -1199017492,
+ "friendlyName": "DAMSPNP4190_2026-03",
+ "postDatetime": "2026-03-31T23:59:59"
+ },
+ "member": "1200847777.cdr.00012331.0000000000000000.20260306.123247.DAMSPNP4190_csv.zip",
+ "source": [
+ {
+ "name": "cdr.00012331.0000000000000000.20260306.123247.DAMSPNP4190.csv",
+ "bytes": 967381,
+ "firstLines": [
+ "DeliveryDate,HourEnding,SettlementPoint,SettlementPointPrice,DSTFlag",
+ "03/07/2026,01:00,7RNCHSLR_ALL, 28.92,N"
+ ]
+ }
+ ]
+ },
+ "readerProvenance": {
+ "commit": "762b3fcc6cf112a03327eb0aa4ebe0967ef710c9",
+ "historyModuleSha256": "269558276f48c531998f97240d9cd20b3bea29bb3c1c1052a11fe2f05cb9f45c",
+ "note": "The running audit retained this decoder in memory while 3adbe8d added bounded date memoization. The full corpus result applies to the pre-cache decoder; dateParsingBenchmark separately verifies unchanged typed output on a complete representative report."
+ },
+ "limits": "Continuous delivery dates across this product, not a claim that each settlement point existed throughout the range. Hour/DST pair counts were checked within each observed point/publication. Distinct publications are retained. Does not establish full historical coverage for other products."
+ }
+}
diff --git a/tools/inputs/history/capacity-workbooks-evidence.json b/tools/inputs/history/capacity-workbooks-evidence.json
new file mode 100644
index 00000000..633ccba6
--- /dev/null
+++ b/tools/inputs/history/capacity-workbooks-evidence.json
@@ -0,0 +1,408 @@
+[
+ {
+ "endpoint": "np6-794-er/capability",
+ "fixture": "np6-794-er-history-current.xlsx",
+ "file": "HistTotASResCapability_2026.xlsx",
+ "sheet_rows": {
+ "Jan": 9081,
+ "Feb": 8181,
+ "Mar": 9034,
+ "Apr": 8814,
+ "May": 8975,
+ "Jun": 8689,
+ "Jul": 8981,
+ "Aug": 9005,
+ "Sep": 1459
+ },
+ "source_folder": "history-current",
+ "rows_decoded": 72219,
+ "first_rows": {
+ "Jan": {
+ "sourceSheet": "Jan",
+ "SCEDTimestamp": "2026-01-01T00:00:16.999000",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "15870.8663",
+ "CapREGDNTotal": "18508.3761",
+ "CapRRSTotal": "14287.3083",
+ "CapECRSTotal": "14076.7994",
+ "CapNSPINTotal": "17121.7064",
+ "CapREGUP_RRSTotal": "21333.3254",
+ "CapREGUP_RRS_ECRSTotal": "25423.0417",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "35182.0952"
+ },
+ "Feb": {
+ "sourceSheet": "Feb",
+ "SCEDTimestamp": "2026-02-01T00:00:22",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "12825.428",
+ "CapREGDNTotal": "20240.4464",
+ "CapRRSTotal": "13644.6659",
+ "CapECRSTotal": "12813.0671",
+ "CapNSPINTotal": "15003.103",
+ "CapREGUP_RRSTotal": "19446.1497",
+ "CapREGUP_RRS_ECRSTotal": "24247.6107",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "31362.4362"
+ },
+ "Mar": {
+ "sourceSheet": "Mar",
+ "SCEDTimestamp": "2026-03-01T00:00:22",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "12396.0652",
+ "CapREGDNTotal": "22841.6794",
+ "CapRRSTotal": "11980.0885",
+ "CapECRSTotal": "10540.9308",
+ "CapNSPINTotal": "14652.9478",
+ "CapREGUP_RRSTotal": "16745.9895",
+ "CapREGUP_RRS_ECRSTotal": "19982.933",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "29391.1658"
+ },
+ "Apr": {
+ "sourceSheet": "Apr",
+ "SCEDTimestamp": "2026-04-01T00:00:28",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "9109.2682",
+ "CapREGDNTotal": "22223.8696",
+ "CapRRSTotal": "11049.7644",
+ "CapECRSTotal": "8550.6142",
+ "CapNSPINTotal": "13206.3851",
+ "CapREGUP_RRSTotal": "13777.9282",
+ "CapREGUP_RRS_ECRSTotal": "16949.5897",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "25287.8482"
+ },
+ "May": {
+ "sourceSheet": "May",
+ "SCEDTimestamp": "2026-05-01T00:00:28.999000",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "12694.4228",
+ "CapREGDNTotal": "22160.0591",
+ "CapRRSTotal": "12485.2641",
+ "CapECRSTotal": "11695.4264",
+ "CapNSPINTotal": "12708.4144",
+ "CapREGUP_RRSTotal": "17798.9363",
+ "CapREGUP_RRS_ECRSTotal": "21272.9713",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "28055.2669"
+ },
+ "Jun": {
+ "sourceSheet": "Jun",
+ "SCEDTimestamp": "2026-06-01T00:00:21",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "8220.0057",
+ "CapREGDNTotal": "24081.3226",
+ "CapRRSTotal": "10939.7045",
+ "CapECRSTotal": "9620.8275",
+ "CapNSPINTotal": "15781.4665",
+ "CapREGUP_RRSTotal": "14445.9717",
+ "CapREGUP_RRS_ECRSTotal": "18879.9263",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "28139.2593"
+ },
+ "Jul": {
+ "sourceSheet": "Jul",
+ "SCEDTimestamp": "2026-07-01T00:00:25.999000",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "11812.8694",
+ "CapREGDNTotal": "27165.9649",
+ "CapRRSTotal": "13192.6167",
+ "CapECRSTotal": "11783.7179",
+ "CapNSPINTotal": "17087.1674",
+ "CapREGUP_RRSTotal": "18012.6553",
+ "CapREGUP_RRS_ECRSTotal": "22214.7476",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "32606.7329"
+ },
+ "Aug": {
+ "sourceSheet": "Aug",
+ "SCEDTimestamp": "2026-08-01T00:00:21",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "15073.9164",
+ "CapREGDNTotal": "29445.8965",
+ "CapRRSTotal": "15242.6689",
+ "CapECRSTotal": "14914.3783",
+ "CapNSPINTotal": "17838.1071",
+ "CapREGUP_RRSTotal": "22137.1561",
+ "CapREGUP_RRS_ECRSTotal": "27075.0452",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "35677.6313"
+ },
+ "Sep": {
+ "sourceSheet": "Sep",
+ "SCEDTimestamp": "2026-09-01T00:00:20",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "7437.5419",
+ "CapREGDNTotal": "29584.4077",
+ "CapRRSTotal": "10788.5361",
+ "CapECRSTotal": "8950.6781",
+ "CapNSPINTotal": "15539.708",
+ "CapREGUP_RRSTotal": "14027.615",
+ "CapREGUP_RRS_ECRSTotal": "18275.6549",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "27534.1697"
+ }
+ }
+ },
+ {
+ "endpoint": "np6-794-er/capability",
+ "fixture": "np6-794-er-history-samples.xlsx",
+ "file": "HistTotASResCapability_2025.xlsx",
+ "sheet_rows": {
+ "Dec": 581
+ },
+ "source_folder": "history-samples",
+ "rows_decoded": 581,
+ "first_rows": {
+ "Dec": {
+ "sourceSheet": "Dec",
+ "SCEDTimestamp": "2025-12-05T00:00:18.999000",
+ "repeatHourFlag": false,
+ "CapREGUPTotal": "17673.1866",
+ "CapREGDNTotal": "12496.8657",
+ "CapRRSTotal": "15792.347",
+ "CapECRSTotal": "16307.1828",
+ "CapNSPINTotal": "17738.6429",
+ "CapREGUP_RRSTotal": "25196.7364",
+ "CapREGUP_RRS_ECRSTotal": "30327.3035",
+ "CapREGUP_RRS_ECRS_NSPINTotal": "39745.3392"
+ }
+ }
+ },
+ {
+ "endpoint": "np6-795-er/clearing_prices",
+ "fixture": "np6-795-er-history-current.xlsx",
+ "file": "rpt.00025569.0000000000000000.20260906.100008.HIST_SCED_RTM_MCPC_2026.xlsx",
+ "sheet_rows": {
+ "Jan": 45405,
+ "Feb": 40905,
+ "Mar": 45170,
+ "Apr": 44070,
+ "May": 44875,
+ "Jun": 43445,
+ "Jul": 44905,
+ "Aug": 45025,
+ "Sep": 7295
+ },
+ "source_folder": "history-current",
+ "rows_decoded": 361095,
+ "first_rows": {
+ "Jan": {
+ "sourceSheet": "Jan",
+ "SCEDTimestamp": "2026-01-01T00:00:16.999000",
+ "ASType": "ECRS",
+ "cappedMCPC": "0.06",
+ "uncappedMCPC": "0.06",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "Feb": {
+ "sourceSheet": "Feb",
+ "SCEDTimestamp": "2026-02-01T00:00:22",
+ "ASType": "ECRS",
+ "cappedMCPC": "1.09",
+ "uncappedMCPC": "1.09",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "Mar": {
+ "sourceSheet": "Mar",
+ "SCEDTimestamp": "2026-03-01T00:00:22",
+ "ASType": "ECRS",
+ "cappedMCPC": "0.09",
+ "uncappedMCPC": "0.09",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "Apr": {
+ "sourceSheet": "Apr",
+ "SCEDTimestamp": "2026-04-01T00:00:28",
+ "ASType": "ECRS",
+ "cappedMCPC": "0.27",
+ "uncappedMCPC": "0.27",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "May": {
+ "sourceSheet": "May",
+ "SCEDTimestamp": "2026-05-01T00:00:28.999000",
+ "ASType": "ECRS",
+ "cappedMCPC": "1.86",
+ "uncappedMCPC": "1.86",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "Jun": {
+ "sourceSheet": "Jun",
+ "SCEDTimestamp": "2026-06-01T00:00:21",
+ "ASType": "ECRS",
+ "cappedMCPC": "0.38",
+ "uncappedMCPC": "0.38",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "Jul": {
+ "sourceSheet": "Jul",
+ "SCEDTimestamp": "2026-07-01T00:00:25.999000",
+ "ASType": "ECRS",
+ "cappedMCPC": "0.24",
+ "uncappedMCPC": "0.24",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "Aug": {
+ "sourceSheet": "Aug",
+ "SCEDTimestamp": "2026-08-01T00:00:21",
+ "ASType": "ECRS",
+ "cappedMCPC": "0.27",
+ "uncappedMCPC": "0.27",
+ "repeatHourFlag": false,
+ "MCPC": null
+ },
+ "Sep": {
+ "sourceSheet": "Sep",
+ "SCEDTimestamp": "2026-09-01T00:00:20",
+ "ASType": "ECRS",
+ "cappedMCPC": "0.38",
+ "uncappedMCPC": "0.38",
+ "repeatHourFlag": false,
+ "MCPC": null
+ }
+ }
+ },
+ {
+ "endpoint": "np6-795-er/clearing_prices",
+ "fixture": "np6-795-er-history-samples.xlsx",
+ "file": "rpt.00025569.0000000000000000.20251207.105423.HIST_SCED_RTM_MCPC_2025.xlsx",
+ "sheet_rows": {
+ "Dec": 2905
+ },
+ "source_folder": "history-samples",
+ "rows_decoded": 2905,
+ "first_rows": {
+ "Dec": {
+ "sourceSheet": "Dec",
+ "SCEDTimestamp": "2025-12-05T00:00:18.999000",
+ "ASType": "ECRS",
+ "cappedMCPC": null,
+ "uncappedMCPC": null,
+ "repeatHourFlag": false,
+ "MCPC": "0.53"
+ }
+ }
+ },
+ {
+ "endpoint": "np6-796-er/clearing_prices",
+ "fixture": "np6-796-er-history-current.xlsx",
+ "file": "rpt.00025570.0000000000000000.20260906.100004.HIST_15Min_RTM_MCPC_2026.xlsx",
+ "sheet_rows": {
+ "Jan": 14880,
+ "Feb": 13440,
+ "Mar": 14860,
+ "Apr": 14400,
+ "May": 14880,
+ "Jun": 14400,
+ "Jul": 14880,
+ "Aug": 14880,
+ "Sep": 2400
+ },
+ "source_folder": "history-current",
+ "rows_decoded": 119020,
+ "first_rows": {
+ "Jan": {
+ "sourceSheet": "Jan",
+ "deliveryDate": "2026-01-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.07",
+ "repeatHourFlag": false
+ },
+ "Feb": {
+ "sourceSheet": "Feb",
+ "deliveryDate": "2026-02-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.96",
+ "repeatHourFlag": false
+ },
+ "Mar": {
+ "sourceSheet": "Mar",
+ "deliveryDate": "2026-03-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.09",
+ "repeatHourFlag": false
+ },
+ "Apr": {
+ "sourceSheet": "Apr",
+ "deliveryDate": "2026-04-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.27",
+ "repeatHourFlag": false
+ },
+ "May": {
+ "sourceSheet": "May",
+ "deliveryDate": "2026-05-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "1.65",
+ "repeatHourFlag": false
+ },
+ "Jun": {
+ "sourceSheet": "Jun",
+ "deliveryDate": "2026-06-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.48",
+ "repeatHourFlag": false
+ },
+ "Jul": {
+ "sourceSheet": "Jul",
+ "deliveryDate": "2026-07-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.25",
+ "repeatHourFlag": false
+ },
+ "Aug": {
+ "sourceSheet": "Aug",
+ "deliveryDate": "2026-08-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.27",
+ "repeatHourFlag": false
+ },
+ "Sep": {
+ "sourceSheet": "Sep",
+ "deliveryDate": "2026-09-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.64",
+ "repeatHourFlag": false
+ }
+ }
+ },
+ {
+ "endpoint": "np6-796-er/clearing_prices",
+ "fixture": "np6-796-er-history-samples.xlsx",
+ "file": "rpt.00025570.0000000000000000.20251207.100005.HIST_15Min_RTM_MCPC_2025.xlsx",
+ "sheet_rows": {
+ "Dec": 960
+ },
+ "source_folder": "history-samples",
+ "rows_decoded": 960,
+ "first_rows": {
+ "Dec": {
+ "sourceSheet": "Dec",
+ "deliveryDate": "2025-12-05",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "ASType": "ECRS",
+ "MCPC": "0.67",
+ "repeatHourFlag": false
+ }
+ }
+ }
+]
diff --git a/tools/inputs/history/chart-evidence.json b/tools/inputs/history/chart-evidence.json
new file mode 100644
index 00000000..8f87b250
--- /dev/null
+++ b/tools/inputs/history/chart-evidence.json
@@ -0,0 +1,1506 @@
+{
+ "note": "Every decoded nonempty percentage independently compared with ordered printed chart text; missing labels remain None. Current and DST chart positions visually checked. No values estimated from chart geometry.",
+ "totalRows": 791,
+ "totalPrintedLabels": 1809,
+ "samples": [
+ {
+ "sample": "work/history-samples/NP4-765-ER.zip",
+ "zipSha256": "4d1b1538548ee923145057965cfc59724a78e2e876e1a87d1c45ded88f20ec8e",
+ "pdfs": [
+ {
+ "filename": "963449156.rpt.00023794.0000000000000000.20231206.080221290.ESRIntegrationReport 12-05-23.pdf",
+ "sha256": "0ef80712cb83a13d67285a58d7154139c70cec390ade961f9f5532fd5005203c",
+ "reportDate": "2023-12-05",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 9
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-05",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.3",
+ "chargeCapacityPercent": "1.9",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ },
+ {
+ "sample": "work/history-current/NP4-765-ER.zip",
+ "zipSha256": "b27740746d092aa3fa78014913f48a3ba92ab9f35aeb81be0f84e8a694ff9d97",
+ "pdfs": [
+ {
+ "filename": "1271634350.rpt.00023794.0000000000000000.20260907.091110.ESRIntegrationReport 09-06-26.pdf",
+ "sha256": "cc487e168177681f6fa35d67e1db2e76b98f38cf39eb7099ef4354d25b099c53",
+ "reportDate": "2026-09-06",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 10
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2026-09-06",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.6",
+ "chargeCapacityPercent": "1.2",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ },
+ {
+ "sample": "work/integration-pdf-2024-09-07/NP4-765-ER.zip",
+ "zipSha256": "6f0c3a0333b2c5bea5d7c0a6a2de77367220a5924fc9bac21c9e176d39cb1e25",
+ "pdfs": [
+ {
+ "filename": "1034094117.rpt.00023794.0000000000000000.20240907.080202413.ESRIntegrationReport 09-06-24.pdf",
+ "sha256": "080fe5aa9be73f0612a4ab92a2c0587ed9962c7bee084add5f457833a6a06bf6",
+ "reportDate": "2024-09-06",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 5
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2024-09-06",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.3",
+ "chargeCapacityPercent": "1.4",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ },
+ {
+ "sample": "work/integration-pdf-2025-09-07/NP4-765-ER.zip",
+ "zipSha256": "2e6a19cdb0dfed1b41c76d54120bbb7cd078ffcc4628cb6000784d74d3c9bdb2",
+ "pdfs": [
+ {
+ "filename": "1137977183.rpt.00023794.0000000000000000.20250907.080147.ESRIntegrationReport 09-06-25.pdf",
+ "sha256": "34dbb5358185d7aae2b10f081be392719e0a3aeddb19518d80c2d162ccde2132",
+ "reportDate": "2025-09-06",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 8
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2025-09-06",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "2.3",
+ "chargeCapacityPercent": "4.3",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ },
+ {
+ "sample": "work/integration-pdf-2024-11-04/NP4-765-ER.zip",
+ "zipSha256": "af39282ae20a538272d1c48accd5763ffd1d58b815bb02067813a0280200e616",
+ "pdfs": [
+ {
+ "filename": "1049680121.rpt.00023794.0000000000000000.20241104.103231000.ESRIntegrationReport 11-03-24.pdf",
+ "sha256": "b5d7e340ad10fd4e28ead406539bfa3a0aeb9a09e5b029df2a681ca51b3d67dc",
+ "reportDate": "2024-11-03",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 6
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2024-11-03",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.4",
+ "chargeCapacityPercent": "2.2",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ },
+ {
+ "sample": "work/integration-pdf-2025-03-10/NP4-765-ER.zip",
+ "zipSha256": "1f5b8c0c8deee6c26edc8ff9432fdba09801b7ec47da1e795da56e9a33a1a13f",
+ "pdfs": [
+ {
+ "filename": "1084364626.rpt.00023794.0000000000000000.20250310.080229493.ESRIntegrationReport 03-09-25.pdf",
+ "sha256": "671778af162b0ee79d5a2945babc9b3f94cda40c0181b44d3903f4be76f21d85",
+ "reportDate": "2025-03-09",
+ "rows": 23,
+ "printedLabels": {
+ "dischargeCapacityPercent": 23,
+ "chargeCapacityPercent": 23,
+ "netLoadPercent": 9
+ },
+ "hours": [
+ "01",
+ "02",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2025-03-09",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.6",
+ "chargeCapacityPercent": "3.1",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ },
+ {
+ "sample": "work/integration-pdf-2025-11-03/NP4-765-ER.zip",
+ "zipSha256": "d0466b3e3c0e0c052fcb2de590d8950d3e5ac812bb898084cc11cdf10c048cb3",
+ "pdfs": [
+ {
+ "filename": "1156779987.rpt.00023794.0000000000000000.20251103.080149.ESRIntegrationReport 11-02-25.pdf",
+ "sha256": "bd6ea6b43fbaa8e9b545c80b096db199c9d0fe2f1f581e56d92930da929d81b1",
+ "reportDate": "2025-11-02",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 7
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2025-11-02",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.7",
+ "chargeCapacityPercent": "7.6",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ },
+ {
+ "sample": "work/bundle-audit/np4-765-er.zip",
+ "zipSha256": "68421fd18547e7bd03ba8bc85c32beeb140ea78f04c127b60ed036614d17e697",
+ "pdfs": [
+ {
+ "filename": "965641539.rpt.00023794.0000000000000000.20231215.080213844.ESRIntegrationReport 12-14-23.pdf",
+ "sha256": "ce46e07946b9f2b6218f351b28386e49521982ec08de8f4197970b43f124b9dd",
+ "reportDate": "2023-12-14",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 5
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-14",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.4",
+ "chargeCapacityPercent": "1.4",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "967613046.rpt.00023794.0000000000000000.20231223.080215413.ESRIntegrationReport 12-22-23.pdf",
+ "sha256": "8b32a173cb0897dde0838b2bc2d6674b27e01691152091eb5935bb5c9e44ddc1",
+ "reportDate": "2023-12-22",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 5
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-22",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.3",
+ "chargeCapacityPercent": "0.8",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "968826018.rpt.00023794.0000000000000000.20231228.080203191.ESRIntegrationReport 12-27-23.pdf",
+ "sha256": "63ce32916ae4f8831a5ef8c52ed2db7b241e47b4ef649cd21118f969317a3272",
+ "reportDate": "2023-12-27",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 9
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-27",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.8",
+ "chargeCapacityPercent": "1.0",
+ "netLoadPercent": "0.1"
+ }
+ },
+ {
+ "filename": "963691859.rpt.00023794.0000000000000000.20231207.080216985.ESRIntegrationReport 12-06-23.pdf",
+ "sha256": "3ec9cd34dca43bc93adaf5b2e2e30e02e5a4dd50fd29473ce7bb5dad96793429",
+ "reportDate": "2023-12-06",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 5
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-06",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.0",
+ "chargeCapacityPercent": "2.8",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "966867987.rpt.00023794.0000000000000000.20231220.080215152.ESRIntegrationReport 12-19-23.pdf",
+ "sha256": "3652e228e73d146430b5e36ef32c7268a988baf3b60f43996ad9f1b4d5bf6f3d",
+ "reportDate": "2023-12-19",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 6
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-19",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.0",
+ "chargeCapacityPercent": "0.9",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "966368925.rpt.00023794.0000000000000000.20231218.080219451.ESRIntegrationReport 12-17-23.pdf",
+ "sha256": "5837a52ab242335cb3e57a21c096b05ac6e8760bdd58e2d5ba1aae6b8fc72564",
+ "reportDate": "2023-12-17",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 7
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-17",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.8",
+ "chargeCapacityPercent": "4.0",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "963934709.rpt.00023794.0000000000000000.20231208.080216322.ESRIntegrationReport 12-07-23.pdf",
+ "sha256": "07332184a14f1b2cdfd21c67856b8e5d2fac354d66750fdcdde007c4e4f37895",
+ "reportDate": "2023-12-07",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 6
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-07",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.7",
+ "chargeCapacityPercent": "1.6",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "964899714.rpt.00023794.0000000000000000.20231212.080217984.ESRIntegrationReport 12-11-23.pdf",
+ "sha256": "1d8671491d80949e76ed770a8d165af7e4c496b6f44dd127d6f024d672772901",
+ "reportDate": "2023-12-11",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 5
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-11",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.8",
+ "chargeCapacityPercent": "1.1",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "964644082.rpt.00023794.0000000000000000.20231211.080218993.ESRIntegrationReport 12-10-23.pdf",
+ "sha256": "7a1518c63a76d759e15188914fa0ee31198fbad447ec9d8f9c6e1b82bcf16807",
+ "reportDate": "2023-12-10",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 8
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-10",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.2",
+ "chargeCapacityPercent": "1.2",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "965392663.rpt.00023794.0000000000000000.20231214.080233675.ESRIntegrationReport 12-13-23.pdf",
+ "sha256": "1eca7c906d14727c3be753b8203cb688fa29ff765fcf4173187e36ab617f549d",
+ "reportDate": "2023-12-13",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 3
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-13",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.4",
+ "chargeCapacityPercent": "2.3",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "967364854.rpt.00023794.0000000000000000.20231222.080214742.ESRIntegrationReport 12-21-23.pdf",
+ "sha256": "d11183fd65887b70cf35d77ea836ac2dbbdfb3cac36262ff9fac328407065326",
+ "reportDate": "2023-12-21",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 4
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-21",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.6",
+ "chargeCapacityPercent": "1.3",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "964176617.rpt.00023794.0000000000000000.20231209.080221220.ESRIntegrationReport 12-08-23.pdf",
+ "sha256": "fd1ee35f9265cec282ab4a6e2785cfed21ddbea385528ad500e3bfb165ea10d3",
+ "reportDate": "2023-12-08",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 10
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-08",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "4.8",
+ "chargeCapacityPercent": "2.8",
+ "netLoadPercent": "0.1"
+ }
+ },
+ {
+ "filename": "969564820.rpt.00023794.0000000000000000.20231231.080226626.ESRIntegrationReport 12-30-23.pdf",
+ "sha256": "10896a150096d202e3f7c036517ed8dcc86450137e5db3334879ea346c062bcb",
+ "reportDate": "2023-12-30",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 8
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-30",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.9",
+ "chargeCapacityPercent": "2.7",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "967849886.rpt.00023794.0000000000000000.20231224.080227641.ESRIntegrationReport 12-23-23.pdf",
+ "sha256": "d70a706e590706d2ef13376610f0fd2ae0f942d23c9ab41483309c81d4108f55",
+ "reportDate": "2023-12-23",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 6
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-23",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.0",
+ "chargeCapacityPercent": "2.5",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "968312380.rpt.00023794.0000000000000000.20231226.080207839.ESRIntegrationReport 12-25-23.pdf",
+ "sha256": "dfa73589aef8bb094c018cd24915f8563cf9fb3b429e10667bf91c8faff516f1",
+ "reportDate": "2023-12-25",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 7
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-25",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.6",
+ "chargeCapacityPercent": "2.2",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "965890275.rpt.00023794.0000000000000000.20231216.080217527.ESRIntegrationReport 12-15-23.pdf",
+ "sha256": "d54f61ecd147877840059b421220f863eb379cec336d6897459fe0e97ff059b4",
+ "reportDate": "2023-12-15",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 12
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-15",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.3",
+ "chargeCapacityPercent": "0.6",
+ "netLoadPercent": "0.1"
+ }
+ },
+ {
+ "filename": "969079755.rpt.00023794.0000000000000000.20231229.080205414.ESRIntegrationReport 12-28-23.pdf",
+ "sha256": "5524ee9eaac44ba56d6cd871be5c2be68b53ddfdcaf7ce1af9ea82c7bad7496c",
+ "reportDate": "2023-12-28",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 5
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-28",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.7",
+ "chargeCapacityPercent": "1.3",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "968079959.rpt.00023794.0000000000000000.20231225.080212966.ESRIntegrationReport 12-24-23.pdf",
+ "sha256": "72b2bc016bd800fff15eaa4865cff6304aaad83ae6ccce515cb2d3720b8efffd",
+ "reportDate": "2023-12-24",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 7
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-24",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.1",
+ "chargeCapacityPercent": "1.9",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "964407639.rpt.00023794.0000000000000000.20231210.080451892.ESRIntegrationReport 12-09-23.pdf",
+ "sha256": "a8a89334c85be9630bb7ee699ee245b91b0bdf43bc9e5f96b69d2826790b4252",
+ "reportDate": "2023-12-09",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 4
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-09",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.0",
+ "chargeCapacityPercent": "1.5",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "965147006.rpt.00023794.0000000000000000.20231213.080205389.ESRIntegrationReport 12-12-23.pdf",
+ "sha256": "d02de0c2d2167b2f2746e05c7c6db6c2f97d8ca422852e4ba192422e311163dd",
+ "reportDate": "2023-12-12",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 5
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-12",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.3",
+ "chargeCapacityPercent": "0.5",
+ "netLoadPercent": "0.1"
+ }
+ },
+ {
+ "filename": "966128938.rpt.00023794.0000000000000000.20231217.080230967.ESRIntegrationReport 12-16-23.pdf",
+ "sha256": "e4f9318032c7e9cabfed501b2b592c6fac867468e24f208c51e33653fe9e5491",
+ "reportDate": "2023-12-16",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 7
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-16",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.8",
+ "chargeCapacityPercent": "1.8",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "963449156.rpt.00023794.0000000000000000.20231206.080221290.ESRIntegrationReport 12-05-23.pdf",
+ "sha256": "0ef80712cb83a13d67285a58d7154139c70cec390ade961f9f5532fd5005203c",
+ "reportDate": "2023-12-05",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 9
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-05",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.3",
+ "chargeCapacityPercent": "1.9",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "966625339.rpt.00023794.0000000000000000.20231219.080210074.ESRIntegrationReport 12-18-23.pdf",
+ "sha256": "9041ae311c37bcd06547a30c77d6a47558019331b02376b99fcbcd589b862240",
+ "reportDate": "2023-12-18",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 6
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-18",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.0",
+ "chargeCapacityPercent": "2.0",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "968565068.rpt.00023794.0000000000000000.20231227.080212872.ESRIntegrationReport 12-26-23.pdf",
+ "sha256": "709d54ed4dddb81bb2c5698b2f78de495ad49b45ddd4a518ebd6bd52dca288b7",
+ "reportDate": "2023-12-26",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 8
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-26",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "0.4",
+ "chargeCapacityPercent": "7.0",
+ "netLoadPercent": null
+ }
+ },
+ {
+ "filename": "969324580.rpt.00023794.0000000000000000.20231230.080213816.ESRIntegrationReport 12-29-23.pdf",
+ "sha256": "9c5a7c084be082e47879295caec87260d8494aba00165f93e58cbf3de1f1d087",
+ "reportDate": "2023-12-29",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 9
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-29",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "4.0",
+ "chargeCapacityPercent": "0.7",
+ "netLoadPercent": "0.4"
+ }
+ },
+ {
+ "filename": "967113627.rpt.00023794.0000000000000000.20231221.080217107.ESRIntegrationReport 12-20-23.pdf",
+ "sha256": "6576549f0c1b05782c021cf06dcef9275e0a95b92b4dda224618328952fc457a",
+ "reportDate": "2023-12-20",
+ "rows": 24,
+ "printedLabels": {
+ "dischargeCapacityPercent": 24,
+ "chargeCapacityPercent": 24,
+ "netLoadPercent": 7
+ },
+ "hours": [
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24"
+ ],
+ "firstRow": {
+ "reportDate": "2023-12-20",
+ "hourEnding": "01",
+ "dischargeCapacityPercent": "1.0",
+ "chargeCapacityPercent": "2.6",
+ "netLoadPercent": null
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tools/inputs/history/clearing-evidence.json b/tools/inputs/history/clearing-evidence.json
new file mode 100644
index 00000000..351e0396
--- /dev/null
+++ b/tools/inputs/history/clearing-evidence.json
@@ -0,0 +1,138 @@
+[
+ {
+ "endpoint": "np6-328-cd/tot_as_res_cap",
+ "fixture": "np6-328-cd-history-current.csv",
+ "file": "cdr.00024887.0000000000000000.20260907.125023.TotASResCapabilityNP6328_20260907_125020.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-07T12:50:20",
+ "capECRS": "29013.7",
+ "capNSPIN": "22752.9",
+ "capREGDN": "7660.3",
+ "capREGUP": "28179",
+ "capREGUPRRS": "35878.2",
+ "capREGUPRRSECRS": "41029.5",
+ "capREGUPRRSECRSNSPIN": "50797.4",
+ "capRRS": "22879.1",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-328-cd/tot_as_res_cap",
+ "fixture": "np6-328-cd-history-samples.csv",
+ "file": "cdr.00024887.0000000000000000.20251205.000521.TotASResCapabilityNP6328_20251204_234516.csv",
+ "csv_rows": 5,
+ "first_row": {
+ "SCEDTimestamp": "2025-12-04T23:45:16",
+ "capECRS": "16069.9",
+ "capNSPIN": "17461.9",
+ "capREGDN": "12833.7",
+ "capREGUP": "17467.1",
+ "capREGUPRRS": "25063.6",
+ "capREGUPRRSECRS": "30106.1",
+ "capREGUPRRSECRSNSPIN": "39599.4",
+ "capRRS": "15920.6",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 5
+ },
+ {
+ "endpoint": "np6-329-cd/rtd_ind_mcpc",
+ "fixture": "np6-329-cd-history-current.csv",
+ "file": "cdr.00024889.0000000000000000.20260907.125141.RTDMCPCNP6329_20260907_125004.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "ECRS": "0.01",
+ "NSPIN": "0.04",
+ "REGDN": "4.05",
+ "REGUP": "2.96",
+ "RRS": "0.01",
+ "RTDTimestamp": "2026-09-07T12:50:04",
+ "intervalEnding": "2026-09-07T12:55:00",
+ "intervalId": 1,
+ "intervalRepeatHourFlag": false,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np6-329-cd/rtd_ind_mcpc",
+ "fixture": "np6-329-cd-history-samples.csv",
+ "file": "cdr.00024889.0000000000000000.20251205.000043.RTDMCPCNP6329_20251205_000003.csv",
+ "csv_rows": 11,
+ "first_row": {
+ "ECRS": "0.31",
+ "NSPIN": "2.37",
+ "REGDN": "5.69",
+ "REGUP": "2.96",
+ "RRS": "0.31",
+ "RTDTimestamp": "2025-12-05T00:00:03",
+ "intervalEnding": "2025-12-05T00:05:00",
+ "intervalId": 1,
+ "intervalRepeatHourFlag": false,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 11
+ },
+ {
+ "endpoint": "np6-331-cd/rt_clear_price_cap",
+ "fixture": "np6-331-cd-history-current.csv",
+ "file": "cdr.00024898.0000000000000000.20260907.124700.MCPC15MinNP6331.csv",
+ "csv_rows": 5,
+ "first_row": {
+ "ASType": "ECRS",
+ "MCPC": "0.01",
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": 13,
+ "deliveryInt": 3,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 5
+ },
+ {
+ "endpoint": "np6-331-cd/rt_clear_price_cap",
+ "fixture": "np6-331-cd-history-samples.csv",
+ "file": "cdr.00024898.0000000000000000.20251205.000200.MCPC15MinNP6331.csv",
+ "csv_rows": 5,
+ "first_row": {
+ "ASType": "ECRS",
+ "MCPC": "9.34",
+ "deliveryDate": "2025-12-04",
+ "deliveryHour": 24,
+ "deliveryInt": 4,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 5
+ },
+ {
+ "endpoint": "np6-332-cd/rt_clear_price_cap_sced",
+ "fixture": "np6-332-cd-history-current.csv",
+ "file": "cdr.00024891.0000000000000000.20260907.125022.SCEDMCPCNP6332.csv",
+ "csv_rows": 5,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-07T12:50:20",
+ "repeatedHourFlag": false,
+ "ASType": "ECRS",
+ "cappedMCPC": "0.01",
+ "uncappedMCPC": "0.01",
+ "MCPC": null
+ },
+ "rows_decoded": 5
+ },
+ {
+ "endpoint": "np6-332-cd/rt_clear_price_cap_sced",
+ "fixture": "np6-332-cd-history-samples.csv",
+ "file": "cdr.00024891.0000000000000000.20251205.000520.SCEDMCPCNP6332.csv",
+ "csv_rows": 5,
+ "first_row": {
+ "SCEDTimestamp": "2025-12-05T00:05:17",
+ "repeatedHourFlag": false,
+ "ASType": "ECRS",
+ "cappedMCPC": null,
+ "uncappedMCPC": null,
+ "MCPC": "0.47"
+ },
+ "rows_decoded": 5
+ }
+]
diff --git a/tools/inputs/history/cop-obligations-evidence.json b/tools/inputs/history/cop-obligations-evidence.json
new file mode 100644
index 00000000..526f0696
--- /dev/null
+++ b/tools/inputs/history/cop-obligations-evidence.json
@@ -0,0 +1,120 @@
+[
+ {
+ "endpoint": "np1-301/60_cop_adj_period_snapshot",
+ "fixture": "np1-301-history-current.csv",
+ "file": "60d_COP_Adjustment_Period_Snapshot-07-SEP-26.csv",
+ "csv_rows": 51502,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "qseName": "QAEN",
+ "resourceName": "ARAGORN_UNIT1",
+ "hourEnding": "01:00",
+ "status": "ON",
+ "highSustainedLimit": "0",
+ "lowSustainedLimit": "0",
+ "highEmergencyLimit": "0",
+ "lowEmergencyLimit": "0",
+ "REGUP": "0",
+ "REGDN": "0",
+ "RRSPFR": "0",
+ "RRSFFR": "0",
+ "RRSUFR": "0",
+ "NSPIN": "0",
+ "ECRS": "0",
+ "minSOC": "0",
+ "maxSOC": "0",
+ "hourBeginningPlannedSOC": "0",
+ "RRS": null
+ },
+ "rows_decoded": 51502
+ },
+ {
+ "endpoint": "np1-301/60_cop_adj_period_snapshot",
+ "fixture": "np1-301-history-samples.csv",
+ "file": "CompleteCOP_03022014.csv",
+ "csv_rows": 21000,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "qseName": "QAEN",
+ "resourceName": "DECKER_DPG1",
+ "hourEnding": "01:00",
+ "status": "OFF",
+ "highSustainedLimit": "315",
+ "lowSustainedLimit": "50",
+ "highEmergencyLimit": "316",
+ "lowEmergencyLimit": "50",
+ "REGUP": "0",
+ "REGDN": "0",
+ "RRSPFR": null,
+ "RRSFFR": null,
+ "RRSUFR": null,
+ "NSPIN": "0",
+ "ECRS": null,
+ "minSOC": null,
+ "maxSOC": null,
+ "hourBeginningPlannedSOC": null,
+ "RRS": "0"
+ },
+ "rows_decoded": 21000
+ },
+ {
+ "endpoint": "np1-302/as_obligation",
+ "fixture": "np1-302-history-current.csv",
+ "file": "AS_Obligation_03112026.csv",
+ "csv_rows": 4458,
+ "first_row": {
+ "deliveryDate": "2026-03-11",
+ "hourEnding": "01:00",
+ "qseName": "QACCEN",
+ "REGUPOblAdvisory": "0.07869",
+ "REGDNOblAdvisory": "0.07869",
+ "RRSOblAdvisory": "0.61689",
+ "NSPINOblAdvisory": "0.29209",
+ "ECRSOblAdvisory": "0.15939",
+ "REGUPOblFinal": "0.07869",
+ "REGDNOblFinal": "0.07873",
+ "RRSOblFinal": "0.61689",
+ "NSPINOblFinal": "0.921",
+ "ECRSOblFinal": "0.15939",
+ "REGUPObligation": null,
+ "REGUPResponsibility": null,
+ "REGDNObligation": null,
+ "REGDNResponsibility": null,
+ "RRSObligation": null,
+ "RRSResponsibility": null,
+ "NSPINObligation": null,
+ "NSPINResponsibility": null
+ },
+ "rows_decoded": 4458
+ },
+ {
+ "endpoint": "np1-302/as_obligation",
+ "fixture": "np1-302-history-samples.csv",
+ "file": "AS_Obligation_And_Responsibility_02252019.csv",
+ "csv_rows": 2923,
+ "first_row": {
+ "deliveryDate": "2019-02-25",
+ "hourEnding": "01:00",
+ "qseName": "QACCEN",
+ "REGUPOblAdvisory": null,
+ "REGDNOblAdvisory": null,
+ "RRSOblAdvisory": null,
+ "NSPINOblAdvisory": null,
+ "ECRSOblAdvisory": null,
+ "REGUPOblFinal": null,
+ "REGDNOblFinal": null,
+ "RRSOblFinal": null,
+ "NSPINOblFinal": null,
+ "ECRSOblFinal": null,
+ "REGUPObligation": "0",
+ "REGUPResponsibility": "0",
+ "REGDNObligation": "0",
+ "REGDNResponsibility": "0",
+ "RRSObligation": "1",
+ "RRSResponsibility": "0",
+ "NSPINObligation": "0",
+ "NSPINResponsibility": "0"
+ },
+ "rows_decoded": 2923
+ }
+]
diff --git a/tools/inputs/history/cop-updates-evidence.json b/tools/inputs/history/cop-updates-evidence.json
new file mode 100644
index 00000000..555b05b1
--- /dev/null
+++ b/tools/inputs/history/cop-updates-evidence.json
@@ -0,0 +1,66 @@
+[
+ {
+ "endpoint": "np3-991-ex/60_cop_all_updates",
+ "fixture": "np3-991-ex-history-current.csv",
+ "file": "60d_COP_All_Updates-06-SEP-26.csv",
+ "csv_rows": 1526639,
+ "first_row": {
+ "deliveryDate": "2026-07-08",
+ "qseName": "QAEN",
+ "resourceName": "ARAGORN_UNIT1",
+ "hourEnding": "1:00",
+ "status": "ON",
+ "highSustainedLimit": "14.00",
+ "lowSustainedLimit": "0.00",
+ "highEmergencyLimit": "187.20",
+ "lowEmergencyLimit": "0.00",
+ "REGUP": "0.00",
+ "REGDN": "0.00",
+ "RRSPFR": "0.00",
+ "RRSFFR": "0.00",
+ "RRSUFR": "0.00",
+ "NSPIN": "0.00",
+ "ECRS": "0.00",
+ "minSOC": "0.00",
+ "maxSOC": "0.00",
+ "hourBeginningPlannedSOC": "0.00",
+ "cancelFlag": false,
+ "updateTime": "2026-06-30T09:01:26",
+ "submitTime": "2026-06-30T08:01:25",
+ "RRS": null
+ },
+ "rows_decoded": 1526639
+ },
+ {
+ "endpoint": "np3-991-ex/60_cop_all_updates",
+ "fixture": "np3-991-ex-history-samples.csv",
+ "file": "60d_Complete_COP-08-FEB-19.csv",
+ "csv_rows": 563691,
+ "first_row": {
+ "deliveryDate": "2018-12-10",
+ "qseName": "QAEN",
+ "resourceName": "BOOTLEG_UNIT1",
+ "hourEnding": "7:00",
+ "status": "ON",
+ "highSustainedLimit": "0",
+ "lowSustainedLimit": "0",
+ "highEmergencyLimit": "121.1",
+ "lowEmergencyLimit": "0",
+ "REGUP": "0",
+ "REGDN": "0",
+ "RRSPFR": null,
+ "RRSFFR": null,
+ "RRSUFR": null,
+ "NSPIN": "0",
+ "ECRS": null,
+ "minSOC": null,
+ "maxSOC": null,
+ "hourBeginningPlannedSOC": null,
+ "cancelFlag": false,
+ "updateTime": "2018-12-03T11:41:00",
+ "submitTime": "2018-12-03T11:41:00",
+ "RRS": "0"
+ },
+ "rows_decoded": 563691
+ }
+]
diff --git a/tools/inputs/history/copg-316-history-current.csv b/tools/inputs/history/copg-316-history-current.csv
new file mode 100644
index 00000000..1a854de6
--- /dev/null
+++ b/tools/inputs/history/copg-316-history-current.csv
@@ -0,0 +1,4 @@
+"TYPE","Region","TDSP","Operating Day","Channel","Actual Count","Historical Estimated Count","Default Profile Count","Total Count","Percent Actual Count","Percent Hist Estimated Count","Percent Default Profile Count"
+"IDR","ERCOT","J A C ELECTRIC CO OP INC (TDSP)","01-SEP-26","1","10","0","0","10","100","0","0"
+"IDR","ERCOT","CITY OF YOAKUM (TDSP)","01-SEP-26","1","0","2","0","2","0","100","0"
+"IDR","ERCOT","GRAYSON COLLIN ELECTRIC COOPERATIVE INC (TDSP)","01-SEP-26","1","39","0","0","39","100","0","0"
diff --git a/tools/inputs/history/copg-316-history-samples.csv b/tools/inputs/history/copg-316-history-samples.csv
new file mode 100644
index 00000000..1b4bdc1e
--- /dev/null
+++ b/tools/inputs/history/copg-316-history-samples.csv
@@ -0,0 +1,4 @@
+"TYPE","Region","TDSP","Operating Day","Channel","Actual Count","Historical Estimated Count","Default Profile Count","Total Count","Percent Actual Count","Percent Hist Estimated Count","Percent Default Profile Count"
+"IDR","ERCOT","TRI COUNTY ELECTRIC CO OP INC (TDSP)","02-MAY-26","2","64","0","0","64","100","0","0"
+"IDR","ERCOT","SAN PATRICIO ELECTRIC CO OP (TDSP)","02-MAY-26","2","14","0","0","14","100","0","0"
+"IDR","ERCOT","GRAYSON COLLIN ELECTRIC COOPERATIVE INC (MEL) (TDSP)","02-MAY-26","2","2","0","0","2","100","0","0"
diff --git a/tools/inputs/history/corrections-evidence.json b/tools/inputs/history/corrections-evidence.json
new file mode 100644
index 00000000..3b2e7d9d
--- /dev/null
+++ b/tools/inputs/history/corrections-evidence.json
@@ -0,0 +1,601 @@
+[
+ {
+ "endpoint": "np4-196-m/dam_price_corrections_eblmp",
+ "fixture": "np4-196-m-eblmp-current.csv",
+ "file": "cdr.00013044.0000000000000000.20251208.224153.pricecorrection_DAM_EBLMP_20251206_to_20251206_NP4196.csv",
+ "csv_rows": 63763,
+ "download": "work/correction-samples/NP4-196-M-EBLMP-current.zip",
+ "document": {
+ "docId": 1169262090,
+ "friendlyName": "pricecorrection_DAM_EBLMP_20251206_to_20251206_NP4196_csv",
+ "postDatetime": "2025-12-08T22:41:53"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "LMPCorrected": "45.31",
+ "LMPOriginal": "45.3",
+ "deliveryDate": "2025-12-06",
+ "deliveryHour": 1,
+ "electricalBus": "0022",
+ "priceCorrectionTime": "2025-12-09T10:00:00"
+ },
+ "rows_decoded": 63763
+ },
+ {
+ "endpoint": "np4-196-m/dam_price_corrections_eblmp",
+ "fixture": "np4-196-m-eblmp-samples.csv",
+ "file": "cdr.00013044.0000000000000000.20150803.144726.pricecorrection_DAM_EBLMP_20150731_to_20150731_NP4196.csv",
+ "csv_rows": 14,
+ "download": "work/correction-samples/NP4-196-M-EBLMP-samples.zip",
+ "document": {
+ "docId": 489329315,
+ "friendlyName": "pricecorrection_DAM_EBLMP_20150731_to_20150731_NP4196_csv",
+ "postDatetime": "2015-08-03T14:47:26.954000"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "LMPCorrected": "23.07",
+ "LMPOriginal": "22.83",
+ "deliveryDate": "2015-07-31",
+ "deliveryHour": 1,
+ "electricalBus": "EB_PENA3_ZBR",
+ "priceCorrectionTime": "2015-08-03T15:00:00"
+ },
+ "rows_decoded": 14
+ },
+ {
+ "endpoint": "np4-196-m/dam_price_corrections_spp",
+ "fixture": "np4-196-m-spp-current.csv",
+ "file": "cdr.00013044.0000000000000000.20251208.224152.pricecorrection_DAM_SPP_20251206_to_20251206_NP4196.csv",
+ "csv_rows": 3564,
+ "download": "work/correction-samples/NP4-196-M-SPP-current.zip",
+ "document": {
+ "docId": 1169262089,
+ "friendlyName": "pricecorrection_DAM_SPP_20251206_to_20251206_NP4196_csv",
+ "postDatetime": "2025-12-08T22:41:52"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "SPPCorrected": "46.62",
+ "SPPOriginal": "46.61",
+ "deliveryDate": "2025-12-06",
+ "deliveryHour": 1,
+ "priceCorrectionTime": "2025-12-09T10:00:00",
+ "settlementPoint": "ASTRA_RN"
+ },
+ "rows_decoded": 3564
+ },
+ {
+ "endpoint": "np4-196-m/dam_price_corrections_spp",
+ "fixture": "np4-196-m-spp-samples.csv",
+ "file": "cdr.00013044.0000000000000000.20150803.144726.pricecorrection_DAM_SPP_20150731_to_20150731_NP4196.csv",
+ "csv_rows": 14,
+ "download": "work/correction-samples/NP4-196-M-SPP-samples.zip",
+ "document": {
+ "docId": 489329316,
+ "friendlyName": "pricecorrection_DAM_SPP_20150731_to_20150731_NP4196_csv",
+ "postDatetime": "2015-08-03T14:47:26.988000"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "SPPCorrected": "23.07",
+ "SPPOriginal": "22.83",
+ "deliveryDate": "2015-07-31",
+ "deliveryHour": 1,
+ "priceCorrectionTime": "2015-08-03T15:00:00",
+ "settlementPoint": "PENA_ALL"
+ },
+ "rows_decoded": 14
+ },
+ {
+ "endpoint": "np4-196-m/dam_price_corrections_mcpc",
+ "fixture": "np4-196-m-mcpc-current.csv",
+ "file": "cdr.00013044.0000000000000000.20250930.104252.pricecorrection_DAM_MCPC_20250627_to_20250627_NP4196.csv",
+ "csv_rows": 22,
+ "download": "work/correction-samples/NP4-196-M-MCPC-current.zip",
+ "document": {
+ "docId": 1145629594,
+ "friendlyName": "pricecorrection_DAM_MCPC_20250627_to_20250627_NP4196_csv",
+ "postDatetime": "2025-09-30T10:42:52"
+ },
+ "first_row": {
+ "ASType": "REGUP",
+ "DSTFlag": false,
+ "MCPCCorrected": "1.3",
+ "MCPCOriginal": "1.21",
+ "deliveryDate": "2025-06-27",
+ "deliveryHour": 2,
+ "priceCorrectionTime": "2025-09-26T16:00:00"
+ },
+ "rows_decoded": 22
+ },
+ {
+ "endpoint": "np4-196-m/dam_price_corrections_mcpc",
+ "fixture": "np4-196-m-mcpc-samples.csv",
+ "file": "cdr.00013044.0000000000000000.20180723.150557.pricecorrection_DAM_MCPC_20180720_to_20180720_NP4196.csv",
+ "csv_rows": 11,
+ "download": "work/correction-samples/NP4-196-M-MCPC-samples.zip",
+ "document": {
+ "docId": 620423342,
+ "friendlyName": "pricecorrection_DAM_MCPC_20180720_to_20180720_NP4196_csv",
+ "postDatetime": "2018-07-23T15:05:57.782000"
+ },
+ "first_row": {
+ "ASType": "NSPIN",
+ "DSTFlag": false,
+ "MCPCCorrected": "140.06",
+ "MCPCOriginal": "139.79",
+ "deliveryDate": "2018-07-20",
+ "deliveryHour": 15,
+ "priceCorrectionTime": "2018-07-23T15:00:00"
+ },
+ "rows_decoded": 11
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_soglmp",
+ "fixture": "np4-197-m-soglmp-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.152555.pricecorrection_RTM_SOGLMP_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 1327,
+ "download": "work/correction-samples/NP4-197-M-SOGLMP-current.zip",
+ "document": {
+ "docId": 1269376011,
+ "friendlyName": "pricecorrection_RTM_SOGLMP_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T15:25:55"
+ },
+ "first_row": {
+ "SCEDTimestamp": "2026-08-30T09:10:19",
+ "resourceType": "SODG",
+ "resourceName": "19599_1_PV_A1",
+ "meterName": "10443720004133031",
+ "meterLMPOriginal": "15.74",
+ "meterLMPCorrected": "15.81",
+ "RTRDPAOriginal": "0",
+ "RTRDPACorrected": "0",
+ "finalLMPOriginal": "15.74",
+ "finalLMPCorrected": "15.81",
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "repeatHourFlag": false,
+ "RTORPAOriginal": null,
+ "RTORPACorrected": null,
+ "RTORDPAOriginal": null,
+ "RTORDPACorrected": null
+ },
+ "rows_decoded": 1327
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_soglmp",
+ "fixture": "np4-197-m-soglmp-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20220712.142103.pricecorrection_RTM_SOGLMP_20220708_to_20220708_NP4197.csv",
+ "csv_rows": 5220,
+ "download": "work/correction-samples/NP4-197-M-SOGLMP-samples.zip",
+ "document": {
+ "docId": 851334207,
+ "friendlyName": "pricecorrection_RTM_SOGLMP_20220708_to_20220708_NP4197_csv",
+ "postDatetime": "2022-07-12T14:21:03.947000"
+ },
+ "first_row": {
+ "SCEDTimestamp": "2022-07-08T13:40:12",
+ "resourceType": "SODG",
+ "resourceName": "ALEXIS_ALEXIS",
+ "meterName": "CPLALXSGP0100",
+ "meterLMPOriginal": "112.12",
+ "meterLMPCorrected": "112.12",
+ "RTRDPAOriginal": null,
+ "RTRDPACorrected": null,
+ "finalLMPOriginal": "291.37",
+ "finalLMPCorrected": "291.07",
+ "priceCorrectionTime": "2022-07-12T15:00:00",
+ "repeatHourFlag": false,
+ "RTORPAOriginal": "178.95",
+ "RTORPACorrected": "178.95",
+ "RTORDPAOriginal": "0.3",
+ "RTORDPACorrected": "0"
+ },
+ "rows_decoded": 5220
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_spp",
+ "fixture": "np4-197-m-spp-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.152040.pricecorrection_RTM_SPP_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 2424,
+ "download": "work/correction-samples/NP4-197-M-SPP-current.zip",
+ "document": {
+ "docId": 1269374426,
+ "friendlyName": "pricecorrection_RTM_SPP_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T15:20:40"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "SPPCorrected": "15.68",
+ "SPPOriginal": "15.64",
+ "deliveryDate": "2026-08-30",
+ "deliveryHour": 10,
+ "deliveryInterval": 1,
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "settlementPointName": "7RNCHSLR_ALL",
+ "settlementPointType": "RN"
+ },
+ "rows_decoded": 2424
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_spp",
+ "fixture": "np4-197-m-spp-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20140602.091835.pricecorrection_RTM_SPP_20140529_to_20140529_NP4197.csv",
+ "csv_rows": 7,
+ "download": "work/correction-samples/NP4-197-M-SPP-samples.zip",
+ "document": {
+ "docId": 449144186,
+ "friendlyName": "pricecorrection_RTM_SPP_20140529_to_20140529_NP4197_csv",
+ "postDatetime": "2014-06-02T09:18:35.995000"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "SPPCorrected": "-47.36",
+ "SPPOriginal": "-225.33",
+ "deliveryDate": "2014-05-29",
+ "deliveryHour": 19,
+ "deliveryInterval": 1,
+ "priceCorrectionTime": "2014-05-30T16:00:00",
+ "settlementPointName": "CCEC_CC1",
+ "settlementPointType": "LCCRN"
+ },
+ "rows_decoded": 7
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_sogprice",
+ "fixture": "np4-197-m-sogprice-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.152040.pricecorrection_RTM_SOGPRICE_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 908,
+ "download": "work/correction-samples/NP4-197-M-SOGPRICE-current.zip",
+ "document": {
+ "docId": 1269374422,
+ "friendlyName": "pricecorrection_RTM_SOGPRICE_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T15:20:40"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-08-30",
+ "deliveryHour": 10,
+ "deliveryInterval": 1,
+ "meterName": "10443720004133031",
+ "priceCorrected": "15.68",
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "priceOriginal": "15.66",
+ "resourceName": "19599_1_PV_A1",
+ "resourceType": "SODG"
+ },
+ "rows_decoded": 908
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_sogprice",
+ "fixture": "np4-197-m-sogprice-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20220712.142316.pricecorrection_RTM_SOGPRICE_20220708_to_20220708_NP4197.csv",
+ "csv_rows": 2262,
+ "download": "work/correction-samples/NP4-197-M-SOGPRICE-samples.zip",
+ "document": {
+ "docId": 851334252,
+ "friendlyName": "pricecorrection_RTM_SOGPRICE_20220708_to_20220708_NP4197_csv",
+ "postDatetime": "2022-07-12T14:23:16.233000"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2022-07-08",
+ "deliveryHour": 14,
+ "deliveryInterval": 4,
+ "meterName": "CPLALXSGP0100",
+ "priceCorrected": "378.69",
+ "priceCorrectionTime": "2022-07-12T16:00:00",
+ "priceOriginal": "417.28",
+ "resourceName": "ALEXIS_ALEXIS",
+ "resourceType": "SODG"
+ },
+ "rows_decoded": 2262
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_splmp",
+ "fixture": "np4-197-m-splmp-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.150028.pricecorrection_RTM_SPLMP_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 3296,
+ "download": "work/correction-samples/NP4-197-M-SPLMP-current.zip",
+ "document": {
+ "docId": 1269369459,
+ "friendlyName": "pricecorrection_RTM_SPLMP_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T15:00:28"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "LMPCorrected": "15.66",
+ "LMPOriginal": "16.13",
+ "SCEDTimestamp": "2026-08-30T09:25:18",
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "settlementPointName": "7RNCHSLR_ALL"
+ },
+ "rows_decoded": 3296
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_splmp",
+ "fixture": "np4-197-m-splmp-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20140602.091835.pricecorrection_RTM_SPLMP_20140529_to_20140529_NP4197.csv",
+ "csv_rows": 7,
+ "download": "work/correction-samples/NP4-197-M-SPLMP-samples.zip",
+ "document": {
+ "docId": 449144187,
+ "friendlyName": "pricecorrection_RTM_SPLMP_20140529_to_20140529_NP4197_csv",
+ "postDatetime": "2014-06-02T09:18:36.144000"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "LMPCorrected": "-251",
+ "LMPOriginal": "-784.91",
+ "SCEDTimestamp": "2014-05-29T18:05:09",
+ "priceCorrectionTime": "2014-05-30T16:00:00",
+ "settlementPointName": "CCEC_CC1"
+ },
+ "rows_decoded": 7
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_mcpc_spp",
+ "fixture": "np4-197-m-mcpc_spp-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.144413.pricecorrection_RTM_MCPC_SPP_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 1,
+ "download": "work/correction-samples/NP4-197-M-MCPC_SPP-current.zip",
+ "document": {
+ "docId": 1269364484,
+ "friendlyName": "pricecorrection_RTM_MCPC_SPP_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T14:44:13"
+ },
+ "first_row": {
+ "ASType": "REGDN",
+ "MCPCCorrected": "0.04",
+ "MCPCOriginal": "0.05",
+ "deliveryDate": "2026-08-30",
+ "deliveryHour": 10,
+ "deliveryInterval": 2,
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_mcpc_spp",
+ "fixture": "np4-197-m-mcpc_spp-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20260710.104739.pricecorrection_RTM_MCPC_SPP_20260710_to_20260710_NP4197.csv",
+ "csv_rows": 278,
+ "download": "work/correction-samples/NP4-197-M-MCPC_SPP-samples.zip",
+ "document": {
+ "docId": 1248594191,
+ "friendlyName": "pricecorrection_RTM_MCPC_SPP_20260710_to_20260710_NP4197_csv",
+ "postDatetime": "2026-07-10T10:47:39"
+ },
+ "first_row": {
+ "ASType": "REGDN",
+ "MCPCCorrected": "0.16",
+ "MCPCOriginal": "0.15",
+ "deliveryDate": "2026-01-10",
+ "deliveryHour": 3,
+ "deliveryInterval": 2,
+ "priceCorrectionTime": "2026-07-10T16:00:00",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 278
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_eblmp",
+ "fixture": "np4-197-m-eblmp-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.143905.pricecorrection_RTM_EBLMP_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 57082,
+ "download": "work/correction-samples/NP4-197-M-EBLMP-current.zip",
+ "document": {
+ "docId": 1269363637,
+ "friendlyName": "pricecorrection_RTM_EBLMP_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T14:39:05"
+ },
+ "first_row": {
+ "SCEDTimestamp": "2026-08-30T09:25:18",
+ "electricalBus": "0001",
+ "cappedLMPOriginal": "15.9",
+ "uncappedLMPOriginal": "15.9",
+ "cappedLMPCorrected": "15.66",
+ "uncappedLMPCorrected": "16",
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "repeatedHourFlag": false,
+ "LMPOriginal": null,
+ "LMPCorrected": null
+ },
+ "rows_decoded": 57082
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_eblmp",
+ "fixture": "np4-197-m-eblmp-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20140928.173956.pricecorrection_RTM_EBLMP_20140925_to_20140925_NP4197.csv",
+ "csv_rows": 166727,
+ "download": "work/correction-samples/NP4-197-M-EBLMP-samples.zip",
+ "document": {
+ "docId": 459796629,
+ "friendlyName": "pricecorrection_RTM_EBLMP_20140925_to_20140925_NP4197_csv",
+ "postDatetime": "2014-09-28T17:40:06.751000"
+ },
+ "first_row": {
+ "SCEDTimestamp": "2014-09-25T13:50:09",
+ "electricalBus": "0001",
+ "cappedLMPOriginal": null,
+ "uncappedLMPOriginal": null,
+ "cappedLMPCorrected": null,
+ "uncappedLMPCorrected": null,
+ "priceCorrectionTime": "2014-09-28T15:00:00",
+ "repeatedHourFlag": false,
+ "LMPOriginal": "34.36",
+ "LMPCorrected": "33.4"
+ },
+ "rows_decoded": 166727
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_eblmp",
+ "fixture": "np4-197-m-eblmp_np4197_retry-current.csv",
+ "file": "cdr.00013045.0000000000000000.20160708.191926.pricecorrection_RTM_EBLMP_NP4197_retry_20160708_191842.csv",
+ "csv_rows": 299221,
+ "download": "work/correction-samples/NP4-197-M-EBLMP_NP4197_RETRY-current.zip",
+ "document": {
+ "docId": 526162657,
+ "friendlyName": "pricecorrection_RTM_EBLMP_NP4197_retry_20160708_191842_csv",
+ "postDatetime": "2016-07-08T19:19:49.885000"
+ },
+ "first_row": {
+ "SCEDTimestamp": "2016-07-07T13:20:25",
+ "electricalBus": "0001",
+ "cappedLMPOriginal": null,
+ "uncappedLMPOriginal": null,
+ "cappedLMPCorrected": null,
+ "uncappedLMPCorrected": null,
+ "priceCorrectionTime": "2016-07-08T17:00:00",
+ "repeatedHourFlag": false,
+ "LMPOriginal": "25.91",
+ "LMPCorrected": "18.12"
+ },
+ "rows_decoded": 299221
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_shadow",
+ "fixture": "np4-197-m-shadowprice-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.143052.pricecorrection_RTM_ShadowPrice_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 7,
+ "download": "work/correction-samples/NP4-197-M-SHADOWPRICE-current.zip",
+ "document": {
+ "docId": 1269360583,
+ "friendlyName": "pricecorrection_RTM_ShadowPrice_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T14:30:52"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "SCEDTimestamp": "2026-08-30T09:25:00",
+ "constraintId": 1,
+ "constraintName": "138_ALV_NAL_1",
+ "contingencyName": "SMDOPHR5",
+ "limitCorrected": "392.3",
+ "limitOriginal": "392.9",
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "shadowPriceCorrected": "2.62",
+ "shadowPriceOriginal": "0",
+ "valueCorrected": "392.3",
+ "valueOriginal": "373.3"
+ },
+ "rows_decoded": 7
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_shadow",
+ "fixture": "np4-197-m-shadowprice-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20140926.173535.pricecorrection_RTM_ShadowPrice_20140924_to_20140924_NP4197.csv",
+ "csv_rows": 96,
+ "download": "work/correction-samples/NP4-197-M-SHADOWPRICE-samples.zip",
+ "document": {
+ "docId": 459621702,
+ "friendlyName": "pricecorrection_RTM_ShadowPrice_20140924_to_20140924_NP4197_csv",
+ "postDatetime": "2014-09-26T17:35:35.648000"
+ },
+ "first_row": {
+ "DSTFlag": false,
+ "SCEDTimestamp": "2014-09-24T19:15:08",
+ "constraintId": 2,
+ "constraintName": "ABNW_ELYT1_1",
+ "contingencyName": "SMCEABS8",
+ "limitCorrected": "36.2",
+ "limitOriginal": "36.2",
+ "priceCorrectionTime": "2014-09-26T15:00:00",
+ "shadowPriceCorrected": "0",
+ "shadowPriceOriginal": "2800",
+ "valueCorrected": "32.5",
+ "valueOriginal": "37.9"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_mcpc_sced",
+ "fixture": "np4-197-m-mcpc_sced-current.csv",
+ "file": "cdr.00013045.0000000000000000.20260901.143052.pricecorrection_RTM_MCPC_SCED_20260901_to_20260901_NP4197.csv",
+ "csv_rows": 1,
+ "download": "work/correction-samples/NP4-197-M-MCPC_SCED-current.zip",
+ "document": {
+ "docId": 1269360734,
+ "friendlyName": "pricecorrection_RTM_MCPC_SCED_20260901_to_20260901_NP4197_csv",
+ "postDatetime": "2026-09-01T14:30:52"
+ },
+ "first_row": {
+ "SCEDTimestamp": "2026-08-30T09:15:19",
+ "ASType": "REGDN",
+ "cappedMCPCOriginal": "0.05",
+ "uncappedMCPCOriginal": "0.05",
+ "cappedMCPCCorrected": "0.03",
+ "uncappedMCPCCorrected": "0.03",
+ "priceCorrectionTime": "2026-09-01T16:00:00",
+ "repeatedHourFlag": false,
+ "MCPCOriginal": null,
+ "MCPCCorrected": null
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np4-197-m/rtm_price_corrections_mcpc_sced",
+ "fixture": "np4-197-m-mcpc_sced-samples.csv",
+ "file": "cdr.00013045.0000000000000000.20260713.105052.pricecorrection_RTM_MCPC_SCED_20260713_to_20260713_NP4197.csv",
+ "csv_rows": 751,
+ "download": "work/correction-samples/NP4-197-M-MCPC_SCED-samples.zip",
+ "document": {
+ "docId": 1249736950,
+ "friendlyName": "pricecorrection_RTM_MCPC_SCED_20260713_to_20260713_NP4197_csv",
+ "postDatetime": "2026-07-13T10:50:52"
+ },
+ "first_row": {
+ "SCEDTimestamp": "2026-01-10T00:45:16",
+ "ASType": "REGDN",
+ "cappedMCPCOriginal": null,
+ "uncappedMCPCOriginal": null,
+ "cappedMCPCCorrected": null,
+ "uncappedMCPCCorrected": null,
+ "priceCorrectionTime": "2026-07-13T16:00:00",
+ "repeatedHourFlag": false,
+ "MCPCOriginal": "0.06",
+ "MCPCCorrected": "0.07"
+ },
+ "rows_decoded": 751
+ },
+ {
+ "endpoint": "np4-412-cd/epp_cumulative_hours",
+ "fixture": "np4-412-cd-epp-current.csv",
+ "file": "cdr.00024885.0000000000000000.20260907.130200.EPPCumulativeHrsNP4412_20260907_1300.csv",
+ "csv_rows": 1,
+ "download": "work/history-current/NP4-412-CD.zip",
+ "document": null,
+ "first_row": {
+ "HCAPDAM": "5000",
+ "RTRDPA": "0",
+ "RTSystemLambda": "34.12",
+ "RTSystemLambdaRTDPA": "34.12",
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": 13,
+ "deliveryInterval": 4,
+ "hoursHCAPDAM": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np4-412-cd/epp_cumulative_hours",
+ "fixture": "np4-412-cd-epp-samples.csv",
+ "file": "cdr.00024885.0000000000000000.20251205.000200.EPPCumulativeHrsNP4412_20251205_0000.csv",
+ "csv_rows": 1,
+ "download": "work/history-samples/NP4-412-CD.zip",
+ "document": null,
+ "first_row": {
+ "HCAPDAM": "5000",
+ "RTRDPA": "0",
+ "RTSystemLambda": "44.32",
+ "RTSystemLambdaRTDPA": "44.32",
+ "deliveryDate": "2025-12-04",
+ "deliveryHour": 24,
+ "deliveryInterval": 4,
+ "hoursHCAPDAM": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1
+ }
+]
diff --git a/tools/inputs/history/curves-evidence.json b/tools/inputs/history/curves-evidence.json
new file mode 100644
index 00000000..6a14c03e
--- /dev/null
+++ b/tools/inputs/history/curves-evidence.json
@@ -0,0 +1,140 @@
+[
+ {
+ "endpoint": "np4-212-cd/dam_sced_as_demand_curves",
+ "fixture": "np4-212-cd-history-current.csv",
+ "file": "cdr.00024893.0000000000000000.20260906.045541.DAMSCEDASDCNP4212.csv",
+ "csv_rows": 370224,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-06",
+ "hourEnding": "01:00",
+ "ASType": "ECRS",
+ "demandCurvePoint": "1",
+ "quantity": "0",
+ "price": "5050",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 370224
+ },
+ {
+ "endpoint": "np4-212-cd/dam_sced_as_demand_curves",
+ "fixture": "np4-212-cd-history-samples.csv",
+ "file": "cdr.00024893.0000000000000000.20251205.045603.DAMSCEDASDCNP4212.csv",
+ "csv_rows": 370224,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2025-12-05",
+ "hourEnding": "01:00",
+ "ASType": "ECRS",
+ "demandCurvePoint": "1",
+ "quantity": "0",
+ "price": "5050",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 370224
+ },
+ {
+ "endpoint": "np4-213-cd/hruc_as_demand_curves",
+ "fixture": "np4-213-cd-history-current.csv",
+ "file": "cdr.00026382.0000000000000000.20260907.121843.HRUCASDCNP4213.csv",
+ "csv_rows": 40459,
+ "first_row": {
+ "ASType": "ECRS",
+ "RUCTimestamp": "2026-09-07T12:03:03",
+ "deliveryDate": "2026-09-07",
+ "demandCurvePoint": "1",
+ "hourEnding": "14:00",
+ "price": "5050",
+ "quantity": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 40459
+ },
+ {
+ "endpoint": "np4-213-cd/hruc_as_demand_curves",
+ "fixture": "np4-213-cd-history-samples.csv",
+ "file": "cdr.00026382.0000000000000000.20260226.152002.HRUCASDCNP4213.csv",
+ "csv_rows": 52443,
+ "first_row": {
+ "ASType": "ECRS",
+ "RUCTimestamp": "2026-02-26T15:03:03",
+ "deliveryDate": "2026-02-26",
+ "demandCurvePoint": "1",
+ "hourEnding": "17:00",
+ "price": "5050",
+ "quantity": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 52443
+ },
+ {
+ "endpoint": "np4-214-cd/druc_as_demand_curves",
+ "fixture": "np4-214-cd-history-current.csv",
+ "file": "cdr.00026383.0000000000000000.20260906.145756.DRUCASDCNP4214.csv",
+ "csv_rows": 93627,
+ "first_row": {
+ "ASType": "ECRS",
+ "RUCTimestamp": "2026-09-06T14:33:04",
+ "deliveryDate": "2026-09-07",
+ "demandCurvePoint": "1",
+ "hourEnding": "01:00",
+ "price": "5050",
+ "quantity": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 93627
+ },
+ {
+ "endpoint": "np4-214-cd/druc_as_demand_curves",
+ "fixture": "np4-214-cd-history-samples.csv",
+ "file": "cdr.00026383.0000000000000000.20260227.145758.DRUCASDCNP4214.csv",
+ "csv_rows": 142727,
+ "first_row": {
+ "ASType": "ECRS",
+ "RUCTimestamp": "2026-02-27T14:33:01",
+ "deliveryDate": "2026-02-28",
+ "demandCurvePoint": "1",
+ "hourEnding": "01:00",
+ "price": "5050",
+ "quantity": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 142727
+ },
+ {
+ "endpoint": "np4-215-cd/wruc_as_demand_curves",
+ "fixture": "np4-215-cd-history-current.csv",
+ "file": "cdr.00026384.0000000000000000.20260906.025437.WRUCASDCNP4215.csv",
+ "csv_rows": 655389,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "RUCTimestamp": "2026-09-06T01:05:26",
+ "ASType": "ECRS",
+ "demandCurvePoint": "1",
+ "quantity": "0",
+ "price": "5050",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 655389
+ },
+ {
+ "endpoint": "np4-215-cd/wruc_as_demand_curves",
+ "fixture": "np4-215-cd-history-samples.csv",
+ "file": "cdr.00026384.0000000000000000.20260227.024604.WRUCASDCNP4215.csv",
+ "csv_rows": 831845,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-02-28",
+ "hourEnding": "01:00",
+ "RUCTimestamp": "2026-02-27T01:10:53",
+ "ASType": "ECRS",
+ "demandCurvePoint": "1",
+ "quantity": "0",
+ "price": "5050",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 831845
+ }
+]
diff --git a/tools/inputs/history/dam-as-evidence.json b/tools/inputs/history/dam-as-evidence.json
new file mode 100644
index 00000000..9c123662
--- /dev/null
+++ b/tools/inputs/history/dam-as-evidence.json
@@ -0,0 +1,925 @@
+[
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_nspnm",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_nspnm-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_NSPNM-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_nspin",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_nspin-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_NSPIN-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 4466,
+ "first_row": {
+ "MWOffered": "305.3",
+ "NSPINOfferPrice": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 4466
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_nspnm",
+ "fixture": "np3-911-er--2d_cleared_dam_as_nspnm-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_NSPNM-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASNSPNM": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_regup",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_regup-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_REGUP-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 5931,
+ "first_row": {
+ "MWOffered": "12.9",
+ "REGUPOfferPrice": "0.01",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 5931
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_regdn",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_regdn-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_REGDN-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 5908,
+ "first_row": {
+ "MWOffered": "29.7",
+ "REGDNOfferPrice": "0.22",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 5908
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_regup",
+ "fixture": "np3-911-er--2d_self_arranged_as_regup-history-current.csv",
+ "file": "2d_Self_Arranged_AS_REGUP-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASREGUP": "9.4"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_regdn",
+ "fixture": "np3-911-er--2d_self_arranged_as_regdn-history-current.csv",
+ "file": "2d_Self_Arranged_AS_REGDN-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASREGDN": "-1"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_nspin",
+ "fixture": "np3-911-er--2d_self_arranged_as_nspin-history-current.csv",
+ "file": "2d_Self_Arranged_AS_NSPIN-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASNSPIN": "39.6"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_regup",
+ "fixture": "np3-911-er--2d_cleared_dam_as_regup-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_REGUP-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASREGUP": "324.5"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_regdn",
+ "fixture": "np3-911-er--2d_cleared_dam_as_regdn-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_REGDN-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASREGDN": "393.2"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_nspin",
+ "fixture": "np3-911-er--2d_cleared_dam_as_nspin-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_NSPIN-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASNSPIN": "4705"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_rrspfr",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_rrspfr-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_RRSPFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 5350,
+ "first_row": {
+ "MWOffered": "51",
+ "RRSPFROfferPrice": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 5350
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_rrsufr",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_rrsufr-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_RRSUFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "MWOffered": "886.4",
+ "RRSUFROfferPrice": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_rrsffr",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_rrsffr-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_RRSFFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 191,
+ "first_row": {
+ "MWOffered": "19.2",
+ "RRSFFROfferPrice": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 191
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrspfr",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrspfr-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_RRSPFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASRRSPFR": "1317.7"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrsufr",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrsufr-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_RRSUFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASRRSUFR": "883.7"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrsffr",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrsffr-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_RRSFFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASRRSFFR": "19.2"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrspfr",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrspfr-history-current.csv",
+ "file": "2d_Self_Arranged_AS_RRSPFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSPFR": "58.6"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrsufr",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrsufr-history-current.csv",
+ "file": "2d_Self_Arranged_AS_RRSUFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSUFR": "148.3"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrsffr",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrsffr-history-current.csv",
+ "file": "2d_Self_Arranged_AS_RRSFFR-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSFFR": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_nspnm",
+ "fixture": "np3-911-er--2d_self_arranged_as_nspnm-history-current.csv",
+ "file": "2d_Self_Arranged_AS_NSPNM-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASNSPNM": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_ecrss",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_ecrss-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_ECRSS-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 4050,
+ "first_row": {
+ "ECRSSOfferPrice": "0",
+ "MWOffered": "52",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 4050
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_dam_as_offers_ecrsm",
+ "fixture": "np3-911-er--2d_agg_dam_as_offers_ecrsm-history-current.csv",
+ "file": "2d_Agg_DAM_AS_Offers_ECRSM-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 48,
+ "first_row": {
+ "ECRSMOfferPrice": "0",
+ "MWOffered": "128",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1
+ },
+ "rows_decoded": 48
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_ecrss",
+ "fixture": "np3-911-er--2d_cleared_dam_as_ecrss-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_ECRSS-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASECRSS": "912.8"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_ecrsm",
+ "fixture": "np3-911-er--2d_cleared_dam_as_ecrsm-history-current.csv",
+ "file": "2d_Cleared_DAM_AS_ECRSM-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalClearedASECRSM": "248.3"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_ecrss",
+ "fixture": "np3-911-er--2d_self_arranged_as_ecrss-history-current.csv",
+ "file": "2d_Self_Arranged_AS_ECRSS-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASECRSS": "-11"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_ecrsm",
+ "fixture": "np3-911-er--2d_self_arranged_as_ecrsm-history-current.csv",
+ "file": "2d_Self_Arranged_AS_ECRSM-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "totalSelfArrangedASECRSM": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrsload",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrsload-history-samples.csv",
+ "file": "48h_Cleared_DAM_AS_RRSLOAD-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalClearedASRRSLOAD": "960.9"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrsgen",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrsgen-history-samples.csv",
+ "file": "48h_Cleared_DAM_AS_RRSGEN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalClearedASRRSGEN": "1467.9"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_nspin",
+ "fixture": "np3-911-er--2d_cleared_dam_as_nspin-history-samples.csv",
+ "file": "48h_Cleared_DAM_AS_NSPIN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalClearedASNSPIN": "1413.6"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_regdn",
+ "fixture": "np3-911-er--2d_cleared_dam_as_regdn-history-samples.csv",
+ "file": "48h_Cleared_DAM_AS_REGDN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalClearedASREGDN": "444.8"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_regup",
+ "fixture": "np3-911-er--2d_cleared_dam_as_regup-history-samples.csv",
+ "file": "48h_Cleared_DAM_AS_REGUP-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalClearedASREGUP": "549.9"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrsload",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrsload-history-samples.csv",
+ "file": "48h_Self_Arranged_AS_RRSLOAD-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSLOAD": "365.3"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrsgen",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrsgen-history-samples.csv",
+ "file": "48h_Self_Arranged_AS_RRSGEN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSGEN": "5.7"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_nspin",
+ "fixture": "np3-911-er--2d_self_arranged_as_nspin-history-samples.csv",
+ "file": "48h_Self_Arranged_AS_NSPIN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalSelfArrangedASNSPIN": "86.4"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_regdn",
+ "fixture": "np3-911-er--2d_self_arranged_as_regdn-history-samples.csv",
+ "file": "48h_Self_Arranged_AS_REGDN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalSelfArrangedASREGDN": "-17.7"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_regup",
+ "fixture": "np3-911-er--2d_self_arranged_as_regup-history-samples.csv",
+ "file": "48h_Self_Arranged_AS_REGUP-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "totalSelfArrangedASREGUP": "0.2"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_rrsnc",
+ "fixture": "np3-911-er--2d_agg_as_offers_rrsnc-history-samples.csv",
+ "file": "48h_Agg_AS_Offers_RRSNC-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 220,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "MWOffered": "961.5",
+ "RRSNCOfferPrice": "750"
+ },
+ "rows_decoded": 220
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_rrsld",
+ "fixture": "np3-911-er--2d_agg_as_offers_rrsld-history-samples.csv",
+ "file": "48h_Agg_AS_Offers_RRSLD-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_rrsgn",
+ "fixture": "np3-911-er--2d_agg_as_offers_rrsgn-history-samples.csv",
+ "file": "48h_Agg_AS_Offers_RRSGN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 1132,
+ "first_row": {
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1,
+ "MWOffered": "703.3",
+ "RRSGNOfferPrice": "0.01"
+ },
+ "rows_decoded": 1132
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_offns",
+ "fixture": "np3-911-er--2d_agg_as_offers_offns-history-samples.csv",
+ "file": "48h_Agg_AS_Offers_OFFNS-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 388,
+ "first_row": {
+ "MWOffered": "198",
+ "OFFNSOfferPrice": "0.01",
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1
+ },
+ "rows_decoded": 388
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_onns",
+ "fixture": "np3-911-er--2d_agg_as_offers_onns-history-samples.csv",
+ "file": "48h_Agg_AS_Offers_ONNS-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 690,
+ "first_row": {
+ "MWOffered": "164",
+ "ONNSOfferPrice": "1",
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1
+ },
+ "rows_decoded": 690
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_regdn",
+ "fixture": "np3-911-er--2d_agg_as_offers_regdn-history-samples.csv",
+ "file": "48h_Agg_AS_Offers_REGDN-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 1331,
+ "first_row": {
+ "MWOffered": "50",
+ "REGDNOfferPrice": "0.01",
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1
+ },
+ "rows_decoded": 1331
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_regup",
+ "fixture": "np3-911-er--2d_agg_as_offers_regup-history-samples.csv",
+ "file": "48h_Agg_AS_Offers_REGUP-01-MAY-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 1125,
+ "first_row": {
+ "MWOffered": "217.7",
+ "REGUPOfferPrice": "0.01",
+ "deliveryDate": "2014-04-29",
+ "hourEnding": 1
+ },
+ "rows_decoded": 1125
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_nspnm",
+ "fixture": "np3-911-er--2d_self_arranged_as_nspnm-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_NSPNM-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASNSPNM": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_rrspfr",
+ "fixture": "np3-911-er--2d_agg_as_offers_rrspfr-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_RRSPFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 3476,
+ "first_row": {
+ "MWOffered": "19.2",
+ "RRSPFROfferPrice": "0",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 3476
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_rrsufr",
+ "fixture": "np3-911-er--2d_agg_as_offers_rrsufr-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_RRSUFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "MWOffered": "958.3",
+ "RRSUFROfferPrice": "0",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_rrsffr",
+ "fixture": "np3-911-er--2d_agg_as_offers_rrsffr-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_RRSFFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 127,
+ "first_row": {
+ "MWOffered": "7.5",
+ "RRSFFROfferPrice": "0.1",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 127
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrspfr",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrspfr-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_RRSPFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASRRSPFR": "1502.2"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrsufr",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrsufr-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_RRSUFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASRRSUFR": "958.3"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_rrsffr",
+ "fixture": "np3-911-er--2d_cleared_dam_as_rrsffr-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_RRSFFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASRRSFFR": "125"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrspfr",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrspfr-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_RRSPFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSPFR": "22"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrsufr",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrsufr-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_RRSUFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSUFR": "460.5"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_rrsffr",
+ "fixture": "np3-911-er--2d_self_arranged_as_rrsffr-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_RRSFFR-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASRRSFFR": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_ecrsm",
+ "fixture": "np3-911-er--2d_agg_as_offers_ecrsm-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_ECRSM-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 106,
+ "first_row": {
+ "ECRSMOfferPrice": "0",
+ "MWOffered": "23.5",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 106
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_ecrss",
+ "fixture": "np3-911-er--2d_agg_as_offers_ecrss-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_ECRSS-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 2442,
+ "first_row": {
+ "ECRSSOfferPrice": "0.01",
+ "MWOffered": "47",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 2442
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_ecrsm",
+ "fixture": "np3-911-er--2d_cleared_dam_as_ecrsm-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_ECRSM-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASECRSM": "65.4"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_ecrss",
+ "fixture": "np3-911-er--2d_cleared_dam_as_ecrss-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_ECRSS-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASECRSS": "676.6"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_ecrsm",
+ "fixture": "np3-911-er--2d_self_arranged_as_ecrsm-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_ECRSM-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASECRSM": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_ecrss",
+ "fixture": "np3-911-er--2d_self_arranged_as_ecrss-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_ECRSS-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASECRSS": "38"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_regup",
+ "fixture": "np3-911-er--2d_agg_as_offers_regup-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_REGUP-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 3971,
+ "first_row": {
+ "MWOffered": "40.5",
+ "REGUPOfferPrice": "0",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 3971
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_regdn",
+ "fixture": "np3-911-er--2d_agg_as_offers_regdn-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_REGDN-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 4304,
+ "first_row": {
+ "MWOffered": "31.4",
+ "REGDNOfferPrice": "0",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 4304
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_onns",
+ "fixture": "np3-911-er--2d_agg_as_offers_onns-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_ONNS-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 1183,
+ "first_row": {
+ "MWOffered": "27.6",
+ "ONNSOfferPrice": "0.24",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 1183
+ },
+ {
+ "endpoint": "np3-911-er/2d_agg_as_offers_offns",
+ "fixture": "np3-911-er--2d_agg_as_offers_offns-history-middle.csv",
+ "file": "2d_Agg_AS_Offers_OFFNS-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 1139,
+ "first_row": {
+ "MWOffered": "615.7",
+ "OFFNSOfferPrice": "0.01",
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1
+ },
+ "rows_decoded": 1139
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_regup",
+ "fixture": "np3-911-er--2d_self_arranged_as_regup-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_REGUP-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASREGUP": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_regdn",
+ "fixture": "np3-911-er--2d_self_arranged_as_regdn-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_REGDN-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASREGDN": "17.5"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_self_arranged_as_nspin",
+ "fixture": "np3-911-er--2d_self_arranged_as_nspin-history-middle.csv",
+ "file": "2d_Self_Arranged_AS_NSPIN-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalSelfArrangedASNSPIN": "95"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_regup",
+ "fixture": "np3-911-er--2d_cleared_dam_as_regup-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_REGUP-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASREGUP": "374"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_regdn",
+ "fixture": "np3-911-er--2d_cleared_dam_as_regdn-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_REGDN-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASREGDN": "336.5"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-911-er/2d_cleared_dam_as_nspin",
+ "fixture": "np3-911-er--2d_cleared_dam_as_nspin-history-middle.csv",
+ "file": "2d_Cleared_DAM_AS_NSPIN-26-APR-25.csv",
+ "folder": "history-middle",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-04-24",
+ "hourEnding": 1,
+ "totalClearedASNSPIN": "1634"
+ },
+ "rows_decoded": 24
+ }
+]
diff --git a/tools/inputs/history/deployment-evidence.json b/tools/inputs/history/deployment-evidence.json
new file mode 100644
index 00000000..3c970483
--- /dev/null
+++ b/tools/inputs/history/deployment-evidence.json
@@ -0,0 +1,124 @@
+[
+ {
+ "endpoint": "np5-525-cd/wruc_as_deploy_factors",
+ "fixture": "np5-525-cd-history-current.csv",
+ "file": "cdr.00024897.0000000000000000.20260907.025218.WRUCASDFNP5525.csv",
+ "csv_rows": 864,
+ "first_row": {
+ "postedDatetime": null,
+ "RUCTimestamp": "2026-09-07T01:05:38",
+ "deliveryDate": "2026-09-08",
+ "deliveryHour": "01:00",
+ "ASType": "ECRS",
+ "ASDeploymentFactors": "0.05",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 864
+ },
+ {
+ "endpoint": "np5-525-cd/wruc_as_deploy_factors",
+ "fixture": "np5-525-cd-history-samples.csv",
+ "file": "cdr.00024897.0000000000000000.20251205.025832.WRUCASDFNP5525.csv",
+ "csv_rows": 720,
+ "first_row": {
+ "postedDatetime": null,
+ "RUCTimestamp": "2025-12-05T01:23:32",
+ "deliveryDate": "2025-12-06",
+ "deliveryHour": "01:00",
+ "ASType": "ECRS",
+ "ASDeploymentFactors": "0.04",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 720
+ },
+ {
+ "endpoint": "np5-526-cd/proj_as_deploy_factor",
+ "fixture": "np5-526-cd-history-current.csv",
+ "file": "cdr.00024886.0000000000000000.20260907.055500.ProjectedASDFNP5526.csv",
+ "csv_rows": 144,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-08",
+ "hourEnding": "01:00",
+ "ASType": "ECRS",
+ "ASDeploymentFactors": "0.05",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 144
+ },
+ {
+ "endpoint": "np5-526-cd/proj_as_deploy_factor",
+ "fixture": "np5-526-cd-history-samples.csv",
+ "file": "cdr.00024886.0000000000000000.20251205.045501.ProjectedASDFNP5526.csv",
+ "csv_rows": 144,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2025-12-06",
+ "hourEnding": "01:00",
+ "ASType": "ECRS",
+ "ASDeploymentFactors": "0.04",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 144
+ },
+ {
+ "endpoint": "np5-527-cd/druc_as_deploy_factors",
+ "fixture": "np5-527-cd-history-current.csv",
+ "file": "cdr.00024895.0000000000000000.20260906.145705.DRUCASDFNP5527.csv",
+ "csv_rows": 144,
+ "first_row": {
+ "ASDeploymentFactors": "0.05",
+ "ASType": "ECRS",
+ "RUCTimestamp": "2026-09-06T14:33:04",
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": "01:00",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 144
+ },
+ {
+ "endpoint": "np5-527-cd/druc_as_deploy_factors",
+ "fixture": "np5-527-cd-history-samples.csv",
+ "file": "cdr.00024895.0000000000000000.20251205.145924.DRUCASDFNP5527.csv",
+ "csv_rows": 144,
+ "first_row": {
+ "ASDeploymentFactors": "0.04",
+ "ASType": "ECRS",
+ "RUCTimestamp": "2025-12-05T14:33:01",
+ "deliveryDate": "2025-12-06",
+ "deliveryHour": "01:00",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 144
+ },
+ {
+ "endpoint": "np5-528-cd/hruc_as_deploy_factors",
+ "fixture": "np5-528-cd-history-current.csv",
+ "file": "cdr.00024896.0000000000000000.20260907.121750.HRUCASDFNP5528.csv",
+ "csv_rows": 66,
+ "first_row": {
+ "ASDeploymentFactors": "0",
+ "ASType": "ECRS",
+ "RUCTimestamp": "2026-09-07T12:03:03",
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": "14:00",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 66
+ },
+ {
+ "endpoint": "np5-528-cd/hruc_as_deploy_factors",
+ "fixture": "np5-528-cd-history-samples.csv",
+ "file": "cdr.00024896.0000000000000000.20251205.001542.HRUCASDFNP5528.csv",
+ "csv_rows": 138,
+ "first_row": {
+ "ASDeploymentFactors": "0.05",
+ "ASType": "ECRS",
+ "RUCTimestamp": "2025-12-05T00:07:23",
+ "deliveryDate": "2025-12-05",
+ "deliveryHour": "02:00",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 138
+ }
+]
diff --git a/tools/inputs/history/disclosure-curves-evidence.json b/tools/inputs/history/disclosure-curves-evidence.json
new file mode 100644
index 00000000..c67ed04c
--- /dev/null
+++ b/tools/inputs/history/disclosure-curves-evidence.json
@@ -0,0 +1,626 @@
+[
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_ecrss",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_ecrss-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_ECRSS-07-SEP-26.csv",
+ "csv_rows": 43000,
+ "first_row": {
+ "ECRSSOfferPrice": "0",
+ "MWOffered": "6880",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 43000
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_nspin",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_nspin-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_NSPIN-07-SEP-26.csv",
+ "csv_rows": 49906,
+ "first_row": {
+ "MWOffered": "7285.6",
+ "NSPINOfferPrice": "0",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 49906
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_ecrsm",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_ECRSM-07-SEP-26.csv",
+ "csv_rows": 1746,
+ "first_row": {
+ "ECRSMOfferPrice": "0",
+ "MWOffered": "155.6",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1746
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_nspnm",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_nspnm-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_NSPNM-07-SEP-26.csv",
+ "csv_rows": 533,
+ "first_row": {
+ "MWOffered": "28",
+ "NSPNMOfferPrice": "0.01",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 533
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_rrsffr",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_RRSFFR-07-SEP-26.csv",
+ "csv_rows": 2643,
+ "first_row": {
+ "MWOffered": "1372.6",
+ "RRSFFROfferPrice": "0",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 2643
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_rrspfr",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_RRSPFR-07-SEP-26.csv",
+ "csv_rows": 38533,
+ "first_row": {
+ "MWOffered": "6268.3",
+ "RRSPFROfferPrice": "0",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 38533
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_rrsufr",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_RRSUFR-07-SEP-26.csv",
+ "csv_rows": 2436,
+ "first_row": {
+ "MWOffered": "1611.3",
+ "RRSUFROfferPrice": "0",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 2436
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_regdn",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_regdn-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_REGDN-07-SEP-26.csv",
+ "csv_rows": 66144,
+ "first_row": {
+ "MWOffered": "1.2",
+ "REGDNOfferPrice": "0",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 66144
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_regup",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_regup-history-current.csv",
+ "file": "2day_Agg_SCED_AS_Offers_REGUP-07-SEP-26.csv",
+ "csv_rows": 80959,
+ "first_row": {
+ "MWOffered": "14.1",
+ "REGUPOfferPrice": "0",
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 80959
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_ecrss",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_ecrss-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_ECRSS-07-DEC-25.csv",
+ "csv_rows": 37561,
+ "first_row": {
+ "ECRSSOfferPrice": "0",
+ "MWOffered": "1303",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 37561
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_nspin",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_nspin-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_NSPIN-07-DEC-25.csv",
+ "csv_rows": 52061,
+ "first_row": {
+ "MWOffered": "1579.8",
+ "NSPINOfferPrice": "0",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 52061
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_ecrsm",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_ECRSM-07-DEC-25.csv",
+ "csv_rows": 1156,
+ "first_row": {
+ "ECRSMOfferPrice": "0",
+ "MWOffered": "74",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1156
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_nspnm",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_nspnm-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_NSPNM-07-DEC-25.csv",
+ "csv_rows": 289,
+ "first_row": {
+ "MWOffered": "6873.3",
+ "NSPNMOfferPrice": "203.1",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 289
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_rrsffr",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_RRSFFR-07-DEC-25.csv",
+ "csv_rows": 1535,
+ "first_row": {
+ "MWOffered": "397.6",
+ "RRSFFROfferPrice": "0",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1535
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_rrspfr",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_RRSPFR-07-DEC-25.csv",
+ "csv_rows": 37241,
+ "first_row": {
+ "MWOffered": "2046.1",
+ "RRSPFROfferPrice": "0",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 37241
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_rrsufr",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_RRSUFR-07-DEC-25.csv",
+ "csv_rows": 3058,
+ "first_row": {
+ "MWOffered": "1011.2",
+ "RRSUFROfferPrice": "0",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 3058
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_regdn",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_regdn-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_REGDN-07-DEC-25.csv",
+ "csv_rows": 41036,
+ "first_row": {
+ "MWOffered": "318.1",
+ "REGDNOfferPrice": "0",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 41036
+ },
+ {
+ "endpoint": "np3-906-ex/2day_agg_sced_as_offers_regup",
+ "fixture": "np3-906-ex--2day_agg_sced_as_offers_regup-history-samples.csv",
+ "file": "2day_Agg_SCED_AS_Offers_REGUP-07-DEC-25.csv",
+ "csv_rows": 45088,
+ "first_row": {
+ "MWOffered": "771.1",
+ "REGUPOfferPrice": "0",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 45088
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc",
+ "fixture": "np3-907-ex--2d_agg_min_esc-history-current.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves-07-SEP-26.csv",
+ "csv_rows": 1656,
+ "first_row": {
+ "MW": "167",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "0.01"
+ },
+ "rows_decoded": 1656
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_houston",
+ "fixture": "np3-907-ex--2d_agg_min_esc_houston-history-current.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_Houston-07-SEP-26.csv",
+ "csv_rows": 418,
+ "first_row": {
+ "MW": "92",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "0.01"
+ },
+ "rows_decoded": 418
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_north",
+ "fixture": "np3-907-ex--2d_agg_min_esc_north-history-current.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_North-07-SEP-26.csv",
+ "csv_rows": 576,
+ "first_row": {
+ "MW": "75",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "0.01"
+ },
+ "rows_decoded": 576
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_south",
+ "fixture": "np3-907-ex--2d_agg_min_esc_south-history-current.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_South-07-SEP-26.csv",
+ "csv_rows": 617,
+ "first_row": {
+ "MW": "180",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "1"
+ },
+ "rows_decoded": 617
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_west",
+ "fixture": "np3-907-ex--2d_agg_min_esc_west-history-current.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_West-07-SEP-26.csv",
+ "csv_rows": 240,
+ "first_row": {
+ "MW": "167",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "1"
+ },
+ "rows_decoded": 240
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc",
+ "fixture": "np3-907-ex--2d_agg_edc-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves-07-SEP-26.csv",
+ "csv_rows": 126651,
+ "first_row": {
+ "MW": "213645.8",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126651
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_houston",
+ "fixture": "np3-907-ex--2d_agg_edc_houston-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_Houston-07-SEP-26.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "31046.1",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_north",
+ "fixture": "np3-907-ex--2d_agg_edc_north-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_North-07-SEP-26.csv",
+ "csv_rows": 126034,
+ "first_row": {
+ "MW": "66301.2",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126034
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_south",
+ "fixture": "np3-907-ex--2d_agg_edc_south-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_South-07-SEP-26.csv",
+ "csv_rows": 126073,
+ "first_row": {
+ "MW": "59571.5",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126073
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_west",
+ "fixture": "np3-907-ex--2d_agg_edc_west-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_West-07-SEP-26.csv",
+ "csv_rows": 126603,
+ "first_row": {
+ "MW": "54870.1",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126603
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc",
+ "fixture": "np3-907-ex--2d_agg_esc-history-current.csv",
+ "file": "2d_Agg_Energy_Supply_Curves-07-SEP-26.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_houston",
+ "fixture": "np3-907-ex--2d_agg_esc_houston-history-current.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_Houston-07-SEP-26.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_north",
+ "fixture": "np3-907-ex--2d_agg_esc_north-history-current.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_North-07-SEP-26.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_south",
+ "fixture": "np3-907-ex--2d_agg_esc_south-history-current.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_South-07-SEP-26.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_west",
+ "fixture": "np3-907-ex--2d_agg_esc_west-history-current.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_West-07-SEP-26.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc",
+ "fixture": "np3-907-ex--2d_agg_min_esc-history-samples.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves-08-DEC-25.csv",
+ "csv_rows": 1738,
+ "first_row": {
+ "MW": "873",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "0"
+ },
+ "rows_decoded": 1738
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_houston",
+ "fixture": "np3-907-ex--2d_agg_min_esc_houston-history-samples.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_Houston-08-DEC-25.csv",
+ "csv_rows": 370,
+ "first_row": {
+ "MW": "423",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "0.01"
+ },
+ "rows_decoded": 370
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_north",
+ "fixture": "np3-907-ex--2d_agg_min_esc_north-history-samples.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_North-08-DEC-25.csv",
+ "csv_rows": 663,
+ "first_row": {
+ "MW": "873",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "0"
+ },
+ "rows_decoded": 663
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_south",
+ "fixture": "np3-907-ex--2d_agg_min_esc_south-history-samples.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_South-08-DEC-25.csv",
+ "csv_rows": 601,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "0"
+ },
+ "rows_decoded": 601
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_min_esc_west",
+ "fixture": "np3-907-ex--2d_agg_min_esc_west-history-samples.csv",
+ "file": "2d_Agg_Min_Energy_Supply_Curves_West-08-DEC-25.csv",
+ "csv_rows": 225,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "0"
+ },
+ "rows_decoded": 225
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc",
+ "fixture": "np3-907-ex--2d_agg_edc-history-samples.csv",
+ "file": "2d_Agg_Energy_Demand_Curves-08-DEC-25.csv",
+ "csv_rows": 131694,
+ "first_row": {
+ "MW": "51260.7",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 131694
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_houston",
+ "fixture": "np3-907-ex--2d_agg_edc_houston-history-samples.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_Houston-08-DEC-25.csv",
+ "csv_rows": 120024,
+ "first_row": {
+ "MW": "7835.9",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 120024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_north",
+ "fixture": "np3-907-ex--2d_agg_edc_north-history-samples.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_North-08-DEC-25.csv",
+ "csv_rows": 125069,
+ "first_row": {
+ "MW": "19048",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 125069
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_south",
+ "fixture": "np3-907-ex--2d_agg_edc_south-history-samples.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_South-08-DEC-25.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "13904.2",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_edc_west",
+ "fixture": "np3-907-ex--2d_agg_edc_west-history-samples.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_West-08-DEC-25.csv",
+ "csv_rows": 131649,
+ "first_row": {
+ "MW": "8749.8",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 131649
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc",
+ "fixture": "np3-907-ex--2d_agg_esc-history-samples.csv",
+ "file": "2d_Agg_Energy_Supply_Curves-08-DEC-25.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "1",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_houston",
+ "fixture": "np3-907-ex--2d_agg_esc_houston-history-samples.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_Houston-08-DEC-25.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_north",
+ "fixture": "np3-907-ex--2d_agg_esc_north-history-samples.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_North-08-DEC-25.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_south",
+ "fixture": "np3-907-ex--2d_agg_esc_south-history-samples.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_South-08-DEC-25.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "0",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-907-ex/2d_agg_esc_west",
+ "fixture": "np3-907-ex--2d_agg_esc_west-history-samples.csv",
+ "file": "2d_Agg_Energy_Supply_Curves_West-08-DEC-25.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "MW": "1",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": 1,
+ "price": "-250"
+ },
+ "rows_decoded": 126024
+ }
+]
diff --git a/tools/inputs/history/disclosure-evidence.json b/tools/inputs/history/disclosure-evidence.json
new file mode 100644
index 00000000..f6b6c7b4
--- /dev/null
+++ b/tools/inputs/history/disclosure-evidence.json
@@ -0,0 +1,1048 @@
+[
+ {
+ "endpoint": "np3-966-er/60_dam_qse_self_as",
+ "file": "60d_DAM_QSE_Self_Arranged_AS-07-SEP-26.csv",
+ "fixture": "60_dam_qse_self_as-history-current.csv",
+ "csv_rows": 624,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "totalSelfArrangedASREGUP": "13.4",
+ "totalSelfArrangedASREGDN": "0",
+ "totalSelfArrangedASNSPIN": "62",
+ "totalSelfArrangedASNSPNM": null,
+ "totalSelfArrangedASRRSPFR": "74.8",
+ "totalSelfArrangedASRRSFFR": "0",
+ "totalSelfArrangedASRRSUFR": "0",
+ "totalSelfArrangedASECRSSD": "0",
+ "totalSelfArrangedASECRSMD": "0",
+ "totalSelfArrangedASRRSGen": null,
+ "totalSelfArrangedASRRSCLR": null,
+ "totalSelfArrangedASRRSNCLR": null
+ },
+ "rows_decoded": 624
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_gen_res_data",
+ "file": "60d_DAM_Gen_Resource_Data-07-SEP-26.csv",
+ "fixture": "60_dam_gen_res_data-history-current.csv",
+ "csv_rows": 32568,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QSUE66",
+ "dmeName": "Y7VSOL",
+ "resourceName": "7RNCHSLR_UNIT1",
+ "resourceType": "PVGR",
+ "qseSubmittedCurveMW1": null,
+ "qseSubmittedCurvePrice1": null,
+ "qseSubmittedCurveMW2": null,
+ "qseSubmittedCurvePrice2": null,
+ "qseSubmittedCurveMW3": null,
+ "qseSubmittedCurvePrice3": null,
+ "qseSubmittedCurveMW4": null,
+ "qseSubmittedCurvePrice4": null,
+ "qseSubmittedCurveMW5": null,
+ "qseSubmittedCurvePrice5": null,
+ "qseSubmittedCurveMW6": null,
+ "qseSubmittedCurvePrice6": null,
+ "qseSubmittedCurveMW7": null,
+ "qseSubmittedCurvePrice7": null,
+ "qseSubmittedCurveMW8": null,
+ "qseSubmittedCurvePrice8": null,
+ "qseSubmittedCurveMW9": null,
+ "qseSubmittedCurvePrice9": null,
+ "qseSubmittedCurveMW10": null,
+ "qseSubmittedCurvePrice10": null,
+ "startUpHot": null,
+ "startUpInter": null,
+ "startUpCold": null,
+ "minGenCost": null,
+ "HSL": "0",
+ "LSL": "0",
+ "resourceStatus": "ON",
+ "awardedQuantity": null,
+ "settlementPointName": "7RNCHSLR_ALL",
+ "energySettlementPointPrice": "26.57",
+ "REGUPAwarded": null,
+ "REGUPMCPC": null,
+ "REGDNAwarded": null,
+ "REGDNMCPC": null,
+ "RRSPFRAwarded": null,
+ "RRSFFRAwarded": null,
+ "RRSUFRAwarded": null,
+ "RRSMCPC": null,
+ "ECRSSDAwarded": null,
+ "ECRSMCPC": null,
+ "NSPINAwarded": null,
+ "NSPINMCPC": null,
+ "RRSAwarded": null
+ },
+ "rows_decoded": 32568
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_gen_res_as_offers",
+ "file": "60d_DAM_Generation_Resource_ASOffers-07-SEP-26.csv",
+ "fixture": "60_dam_gen_res_as_offers-history-current.csv",
+ "csv_rows": 7241,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QBTU",
+ "dmeName": "YBRYN",
+ "resourceName": "ATKINS_ATKINSG7",
+ "multiHourBlock": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": null,
+ "price1RRSFFR": null,
+ "price1RRSUFR": null,
+ "price1ECRS": null,
+ "price1OFFEC": null,
+ "price1OnlineNSPIN": "500",
+ "price1REGUP": null,
+ "price1REGDN": null,
+ "price1OfflineNSPIN": null,
+ "quantityMW1": "12",
+ "blockIndicator2": null,
+ "price2RRSPFR": null,
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": null,
+ "price2OFFEC": null,
+ "price2OnlineNSPIN": null,
+ "price2REGUP": null,
+ "price2REGDN": null,
+ "price2OfflineNSPIN": null,
+ "quantityMW2": null,
+ "blockIndicator3": null,
+ "price3RRSPFR": null,
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": null,
+ "price3OFFEC": null,
+ "price3OnlineNSPIN": null,
+ "price3REGUP": null,
+ "price3REGDN": null,
+ "price3OfflineNSPIN": null,
+ "quantityMW3": null,
+ "blockIndicator4": null,
+ "price4RRSPFR": null,
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": null,
+ "price4OFFEC": null,
+ "price4OnlineNSPIN": null,
+ "price4REGUP": null,
+ "price4REGDN": null,
+ "price4OfflineNSPIN": null,
+ "quantityMW4": null,
+ "blockIndicator5": null,
+ "price5RRSPFR": null,
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": null,
+ "price5OFFEC": null,
+ "price5OnlineNSPIN": null,
+ "price5REGUP": null,
+ "price5REGDN": null,
+ "price5OfflineNSPIN": null,
+ "quantityMW5": null,
+ "price1RRS": null,
+ "price2RRS": null,
+ "price3RRS": null,
+ "price4RRS": null,
+ "price5RRS": null
+ },
+ "rows_decoded": 7241
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_load_res_data",
+ "file": "60d_DAM_Load_Resource_Data-07-SEP-26.csv",
+ "fixture": "60_dam_load_res_data-history-current.csv",
+ "csv_rows": 11062,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "loadResourceName": "AAPIPLNC_LD3",
+ "maxPowerConsumption": "24",
+ "lowPowerConsumption": "0",
+ "REGUPAwarded": "0",
+ "REGUPMCPC": "0.38",
+ "REGDNAwarded": "0",
+ "REGDNMCPC": "0.49",
+ "RRSPFRAwarded": "0",
+ "RRSFFRAwarded": "0",
+ "RRSUFRAwarded": "2.6",
+ "RRSMCPC": "0.21",
+ "ECRSSDAwarded": "0",
+ "ECRSMDAwarded": "0",
+ "ECRSMCPC": "0.3",
+ "NSPINAwarded": "0",
+ "NSPINMCPC": "2",
+ "RRSAwarded": null
+ },
+ "rows_decoded": 11062
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_load_res_as_offers",
+ "file": "60d_DAM_Load_Resource_ASOffers-07-SEP-26.csv",
+ "fixture": "60_dam_load_res_as_offers-history-current.csv",
+ "csv_rows": 3545,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QEDE20",
+ "dmeName": null,
+ "loadResourceName": "AAPIPLNC_LD3",
+ "multiHourBlock": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": null,
+ "price1RRSFFR": null,
+ "price1RRSUFR": "0",
+ "price1ECRS": null,
+ "price1OFFEC": null,
+ "price1OnlineNSPIN": null,
+ "price1REGUP": null,
+ "price1REGDN": null,
+ "price1OfflineNSPIN": null,
+ "quantityMW1": "2.9",
+ "blockIndicator2": null,
+ "price2RRSPFR": null,
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": null,
+ "price2OFFEC": null,
+ "price2OnlineNSPIN": null,
+ "price2REGUP": null,
+ "price2REGDN": null,
+ "price2OfflineNSPIN": null,
+ "quantityMW2": null,
+ "blockIndicator3": null,
+ "price3RRSPFR": null,
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": null,
+ "price3OFFEC": null,
+ "price3OnlineNSPIN": null,
+ "price3REGUP": null,
+ "price3REGDN": null,
+ "price3OfflineNSPIN": null,
+ "quantityMW3": null,
+ "blockIndicator4": null,
+ "price4RRSPFR": null,
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": null,
+ "price4OFFEC": null,
+ "price4OnlineNSPIN": null,
+ "price4REGUP": null,
+ "price4REGDN": null,
+ "price4OfflineNSPIN": null,
+ "quantityMW4": null,
+ "blockIndicator5": null,
+ "price5RRSPFR": null,
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": null,
+ "price5OFFEC": null,
+ "price5OnlineNSPIN": null,
+ "price5REGUP": null,
+ "price5REGDN": null,
+ "price5OfflineNSPIN": null,
+ "quantityMW5": null,
+ "NCLRFlag": null,
+ "price1RRS": null,
+ "price2RRS": null,
+ "price3RRS": null,
+ "price4RRS": null,
+ "price5RRS": null
+ },
+ "rows_decoded": 3545
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_only_offers",
+ "file": "60d_DAM_EnergyOnlyOffers-07-SEP-26.csv",
+ "fixture": "60_dam_energy_only_offers-history-current.csv",
+ "csv_rows": 54916,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "settlementPointName": "HB_HOUSTON",
+ "qseName": "QALTRE",
+ "energyOnlyOfferMW1": "5.1",
+ "energyOnlyOfferPrice1": "2",
+ "energyOnlyOfferMW2": null,
+ "energyOnlyOfferPrice2": null,
+ "energyOnlyOfferMW3": null,
+ "energyOnlyOfferPrice3": null,
+ "energyOnlyOfferMW4": null,
+ "energyOnlyOfferPrice4": null,
+ "energyOnlyOfferMW5": null,
+ "energyOnlyOfferPrice5": null,
+ "energyOnlyOfferMW6": null,
+ "energyOnlyOfferPrice6": null,
+ "energyOnlyOfferMW7": null,
+ "energyOnlyOfferPrice7": null,
+ "energyOnlyOfferMW8": null,
+ "energyOnlyOfferPrice8": null,
+ "energyOnlyOfferMW9": null,
+ "energyOnlyOfferPrice9": null,
+ "energyOnlyOfferMW10": null,
+ "energyOnlyOfferPrice10": null,
+ "offerId": "uploader",
+ "multiHourBlock": false,
+ "blockCurve": "C"
+ },
+ "rows_decoded": 54916
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_only_offer_awards",
+ "file": "60d_DAM_EnergyOnlyOfferAwards-07-SEP-26.csv",
+ "fixture": "60_dam_energy_only_offer_awards-history-current.csv",
+ "csv_rows": 54916,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "settlementPointName": "7RNCHSLR_ALL",
+ "qseName": "QCOMI1",
+ "energyOnlyOfferAwardInMW": "0.2",
+ "settlementPointPrice": "26.57",
+ "offerId": "BVXBRVRBJQDP"
+ },
+ "rows_decoded": 54916
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_bids",
+ "file": "60d_DAM_EnergyBids-07-SEP-26.csv",
+ "fixture": "60_dam_energy_bids-history-current.csv",
+ "csv_rows": 69450,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "settlementPointName": "LZ_HOUSTON",
+ "qseName": "QAFFOR",
+ "energyOnlyBidMW1": "54",
+ "energyOnlyBidPrice1": "43.13",
+ "energyOnlyBidMW2": null,
+ "energyOnlyBidPrice2": null,
+ "energyOnlyBidMW3": null,
+ "energyOnlyBidPrice3": null,
+ "energyOnlyBidMW4": null,
+ "energyOnlyBidPrice4": null,
+ "energyOnlyBidMW5": null,
+ "energyOnlyBidPrice5": null,
+ "energyOnlyBidMW6": null,
+ "energyOnlyBidPrice6": null,
+ "energyOnlyBidMW7": null,
+ "energyOnlyBidPrice7": null,
+ "energyOnlyBidMW8": null,
+ "energyOnlyBidPrice8": null,
+ "energyOnlyBidMW9": null,
+ "energyOnlyBidPrice9": null,
+ "energyOnlyBidMW10": null,
+ "energyOnlyBidPrice10": null,
+ "bidId": "ETAFYB3",
+ "multiHourBlock": false,
+ "blockCurve": "V"
+ },
+ "rows_decoded": 69450
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_bid_awards",
+ "file": "60d_DAM_EnergyBidAwards-07-SEP-26.csv",
+ "fixture": "60_dam_energy_bid_awards-history-current.csv",
+ "csv_rows": 69450,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "settlementPointName": "LZ_HOUSTON",
+ "qseName": "QAFFOR",
+ "energyOnlyBidAwardInMW": "-54",
+ "settlementPointPrice": "26.02",
+ "bidId": "ETAFYB3"
+ },
+ "rows_decoded": 69450
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_opt",
+ "file": "60d_DAM_PTP_Obligation_Option-07-SEP-26.csv",
+ "fixture": "60_dam_ptp_obl_opt-history-current.csv",
+ "csv_rows": 6812,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "settlementPointSource": "WEC_WECG1",
+ "settlementPointSink": "LZ_AEN",
+ "MW": "1",
+ "price": "200",
+ "offerId": "186382845_1",
+ "multiHourBlock": false,
+ "CRRId": "186382845"
+ },
+ "rows_decoded": 6812
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_bids",
+ "file": "60d_DAM_PTPObligationBids-07-SEP-26.csv",
+ "fixture": "60_dam_ptp_obl_bids-history-current.csv",
+ "csv_rows": 235821,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "settlementPointSource": "EXGNWTL_1",
+ "settlementPointSink": "LZ_AEN",
+ "PTPBidMW": "2",
+ "PTPBidPrice": "50",
+ "bidId": "PTP2",
+ "multiHourBlock": false
+ },
+ "rows_decoded": 235821
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "file": "60d_DAM_PTP_Obligation_OptionAwards-07-SEP-26.csv",
+ "fixture": "60_dam_ptp_obl_opt_awards-history-current.csv",
+ "csv_rows": 6812,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "settlementPointSource": "DECKER_GT",
+ "settlementPointSink": "LZ_AEN",
+ "MW": "0",
+ "price": "0",
+ "offerId": "153586167_1",
+ "CRRId": "153586167"
+ },
+ "rows_decoded": 6812
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "file": "60d_DAM_PTPObligationBidAwards-07-SEP-26.csv",
+ "fixture": "60_dam_ptp_obl_bid_awards-history-current.csv",
+ "csv_rows": 235821,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "settlementPointSource": "EXGNWTL_1",
+ "settlementPointSink": "LZ_AEN",
+ "PTPBidAwardMW": "2",
+ "PTPBidPrice": "-0.35",
+ "bidId": "PTP2"
+ },
+ "rows_decoded": 235821
+ },
+ {
+ "endpoint": "np3-966-er/60d_dam_esr_as_offers",
+ "file": "60d_DAM_ESR_ASOffers-07-SEP-26.csv",
+ "fixture": "60d_dam_esr_as_offers-history-current.csv",
+ "csv_rows": 7386,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QMP2M1",
+ "dmeName": "YDIST",
+ "resourceName": "ABINDUST_ESR1",
+ "multiHourBlock": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": "0.01",
+ "price1RRSFFR": null,
+ "price1RRSUFR": null,
+ "price1ECRS": "0.01",
+ "price1OFFEC": null,
+ "price1OnlineNSPIN": "0.01",
+ "price1REGUP": "13.58",
+ "price1REGDN": null,
+ "price1OfflineNSPIN": null,
+ "quantityMW1": "2.9",
+ "blockIndicator2": "V",
+ "price2RRSPFR": "14.96",
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": "14.96",
+ "price2OFFEC": null,
+ "price2OnlineNSPIN": "14.96",
+ "price2REGUP": "16.6",
+ "price2REGDN": null,
+ "price2OfflineNSPIN": null,
+ "quantityMW2": "3",
+ "blockIndicator3": "V",
+ "price3RRSPFR": "20.2",
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": "20.2",
+ "price3OFFEC": null,
+ "price3OnlineNSPIN": "20.2",
+ "price3REGUP": "20.2",
+ "price3REGDN": null,
+ "price3OfflineNSPIN": null,
+ "quantityMW3": "3.2",
+ "blockIndicator4": null,
+ "price4RRSPFR": null,
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": null,
+ "price4OFFEC": null,
+ "price4OnlineNSPIN": null,
+ "price4REGUP": null,
+ "price4REGDN": null,
+ "price4OfflineNSPIN": null,
+ "quantityMW4": null,
+ "blockIndicator5": null,
+ "price5RRSPFR": null,
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": null,
+ "price5OFFEC": null,
+ "price5OnlineNSPIN": null,
+ "price5REGUP": null,
+ "price5REGDN": null,
+ "price5OfflineNSPIN": null,
+ "quantityMW5": null
+ },
+ "rows_decoded": 7386
+ },
+ {
+ "endpoint": "np3-966-er/60d_dam_esr_data",
+ "file": "60d_DAM_ESR_Data-07-SEP-26.csv",
+ "fixture": "60d_dam_esr_data-history-current.csv",
+ "csv_rows": 7872,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QMP2M1",
+ "dmeName": "YDIST",
+ "resourceName": "ABINDUST_ESR1",
+ "resourceType": "ESR",
+ "qseSubmittedCurveMW1": "-8.5",
+ "qseSubmittedCurvePrice1": "0.01",
+ "qseSubmittedCurveMW2": "-4.7",
+ "qseSubmittedCurvePrice2": "3.69",
+ "qseSubmittedCurveMW3": "-1.5",
+ "qseSubmittedCurvePrice3": "6.69",
+ "qseSubmittedCurveMW4": "1.6",
+ "qseSubmittedCurvePrice4": "19.47",
+ "qseSubmittedCurveMW5": "1.6",
+ "qseSubmittedCurvePrice5": "51.5",
+ "qseSubmittedCurveMW6": "4",
+ "qseSubmittedCurvePrice6": "64.25",
+ "qseSubmittedCurveMW7": "6.7",
+ "qseSubmittedCurvePrice7": "67.22",
+ "qseSubmittedCurveMW8": "9.9",
+ "qseSubmittedCurvePrice8": "70.86",
+ "qseSubmittedCurveMW9": "9.9",
+ "qseSubmittedCurvePrice9": "70.86",
+ "qseSubmittedCurveMW10": null,
+ "qseSubmittedCurvePrice10": null,
+ "startUpHot": null,
+ "startUpInter": null,
+ "startUpCold": null,
+ "minGenCost": null,
+ "HSL": "9.9",
+ "LSL": "-8.5",
+ "resourceStatus": "ON",
+ "awardedQuantity": "1.6",
+ "settlementPointName": "ABINDUST_RN",
+ "energySettlementPointPrice": "25.69",
+ "REGUPAwarded": "0",
+ "REGUPMCPC": "0.38",
+ "REGDNAwarded": "0",
+ "REGDNMCPC": "0.49",
+ "RRSPFRAwarded": "0",
+ "RRSFFRAwarded": "0",
+ "RRSUFRAwarded": "0",
+ "RRSMCPC": "0.21",
+ "ECRSSDAwarded": "0",
+ "ECRSMCPC": "0.3",
+ "NSPINAwarded": "2.9",
+ "NSPINMCPC": "2"
+ },
+ "rows_decoded": 7872
+ },
+ {
+ "endpoint": "np3-966-er/60d_dam_as_only_offers",
+ "file": "60d_DAM_AS_Only_Offers-07-SEP-26.csv",
+ "fixture": "60d_dam_as_only_offers-history-current.csv",
+ "csv_rows": 1264,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QACCEN",
+ "offerId": "RRS_070926",
+ "ASType": "RRSPF",
+ "ASOnlyOfferMW1": "1",
+ "ASOnlyOfferPrice1": "0",
+ "ASOnlyOfferMW2": null,
+ "ASOnlyOfferPrice2": null,
+ "ASOnlyOfferMW3": null,
+ "ASOnlyOfferPrice3": null,
+ "ASOnlyOfferMW4": null,
+ "ASOnlyOfferPrice4": null,
+ "ASOnlyOfferMW5": null,
+ "ASOnlyOfferPrice5": null
+ },
+ "rows_decoded": 1264
+ },
+ {
+ "endpoint": "np3-966-er/60d_dam_as_only_awards",
+ "file": "60d_DAM_AS_Only_Awards-07-SEP-26.csv",
+ "fixture": "60d_dam_as_only_awards-history-current.csv",
+ "csv_rows": 617,
+ "first_row": {
+ "deliveryDate": "2026-07-09",
+ "hourEnding": 1,
+ "qseName": "QBTU",
+ "ASType": "NSPIN",
+ "offerId": "NSRS",
+ "quantity1Award": "0",
+ "quantity2Award": "0",
+ "quantity3Award": "0",
+ "quantity4Award": "0",
+ "quantity5Award": "0",
+ "totalAward": "0",
+ "MCPC": "2"
+ },
+ "rows_decoded": 617
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_opt",
+ "file": "60d_DAM_PTP_Obligation_Option-01-MAY-14.csv",
+ "fixture": "60_dam_ptp_obl_opt-history-samples.csv",
+ "csv_rows": 4540,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "settlementPointSource": "WEC_WECG1",
+ "settlementPointSink": "LZ_AEN",
+ "MW": "0.1",
+ "price": "350",
+ "offerId": "CRR167",
+ "multiHourBlock": false,
+ "CRRId": "15018581"
+ },
+ "rows_decoded": 4540
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_bid_awards",
+ "file": "60d_DAM_EnergyBidAwards-01-MAY-14.csv",
+ "fixture": "60_dam_energy_bid_awards-history-samples.csv",
+ "csv_rows": 4688,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "settlementPointName": "BYU_BYU_34",
+ "qseName": "QEAGL3",
+ "energyOnlyBidAwardInMW": "-24",
+ "settlementPointPrice": "14.93",
+ "bidId": "ETALYN09-335"
+ },
+ "rows_decoded": 4688
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_bids",
+ "file": "60d_DAM_EnergyBids-01-MAY-14.csv",
+ "fixture": "60_dam_energy_bids-history-samples.csv",
+ "csv_rows": 4688,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "settlementPointName": "BYU_BYU_34",
+ "qseName": "QEAGL3",
+ "energyOnlyBidMW1": "24",
+ "energyOnlyBidPrice1": "81",
+ "energyOnlyBidMW2": null,
+ "energyOnlyBidPrice2": null,
+ "energyOnlyBidMW3": null,
+ "energyOnlyBidPrice3": null,
+ "energyOnlyBidMW4": null,
+ "energyOnlyBidPrice4": null,
+ "energyOnlyBidMW5": null,
+ "energyOnlyBidPrice5": null,
+ "energyOnlyBidMW6": null,
+ "energyOnlyBidPrice6": null,
+ "energyOnlyBidMW7": null,
+ "energyOnlyBidPrice7": null,
+ "energyOnlyBidMW8": null,
+ "energyOnlyBidPrice8": null,
+ "energyOnlyBidMW9": null,
+ "energyOnlyBidPrice9": null,
+ "energyOnlyBidMW10": null,
+ "energyOnlyBidPrice10": null,
+ "bidId": "ETALYN09-335",
+ "multiHourBlock": false,
+ "blockCurve": "V"
+ },
+ "rows_decoded": 4688
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_only_offer_awards",
+ "file": "60d_DAM_EnergyOnlyOfferAwards-01-MAY-14.csv",
+ "fixture": "60_dam_energy_only_offer_awards-history-samples.csv",
+ "csv_rows": 4455,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "settlementPointName": "BASTEN_CCU",
+ "qseName": "QDIRE5",
+ "energyOnlyOfferAwardInMW": "0",
+ "settlementPointPrice": "14.98",
+ "offerId": "1927"
+ },
+ "rows_decoded": 4455
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_energy_only_offers",
+ "file": "60d_DAM_EnergyOnlyOffers-01-MAY-14.csv",
+ "fixture": "60_dam_energy_only_offers-history-samples.csv",
+ "csv_rows": 4455,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "settlementPointName": "BASTEN_CCU",
+ "qseName": "QDIRE5",
+ "energyOnlyOfferMW1": "250",
+ "energyOnlyOfferPrice1": "35",
+ "energyOnlyOfferMW2": null,
+ "energyOnlyOfferPrice2": null,
+ "energyOnlyOfferMW3": null,
+ "energyOnlyOfferPrice3": null,
+ "energyOnlyOfferMW4": null,
+ "energyOnlyOfferPrice4": null,
+ "energyOnlyOfferMW5": null,
+ "energyOnlyOfferPrice5": null,
+ "energyOnlyOfferMW6": null,
+ "energyOnlyOfferPrice6": null,
+ "energyOnlyOfferMW7": null,
+ "energyOnlyOfferPrice7": null,
+ "energyOnlyOfferMW8": null,
+ "energyOnlyOfferPrice8": null,
+ "energyOnlyOfferMW9": null,
+ "energyOnlyOfferPrice9": null,
+ "energyOnlyOfferMW10": null,
+ "energyOnlyOfferPrice10": null,
+ "offerId": "1927",
+ "multiHourBlock": true,
+ "blockCurve": "V"
+ },
+ "rows_decoded": 4455
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_load_res_as_offers",
+ "file": "60d_DAM_Load_Resource_ASOffers-01-MAY-14.csv",
+ "fixture": "60_dam_load_res_as_offers-history-samples.csv",
+ "csv_rows": 1429,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": null,
+ "dmeName": null,
+ "loadResourceName": "BCPOI_LD1",
+ "multiHourBlock": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": null,
+ "price1RRSFFR": null,
+ "price1RRSUFR": null,
+ "price1ECRS": null,
+ "price1OFFEC": null,
+ "price1OnlineNSPIN": null,
+ "price1REGUP": null,
+ "price1REGDN": null,
+ "price1OfflineNSPIN": null,
+ "quantityMW1": "3",
+ "blockIndicator2": null,
+ "price2RRSPFR": null,
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": null,
+ "price2OFFEC": null,
+ "price2OnlineNSPIN": null,
+ "price2REGUP": null,
+ "price2REGDN": null,
+ "price2OfflineNSPIN": null,
+ "quantityMW2": null,
+ "blockIndicator3": null,
+ "price3RRSPFR": null,
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": null,
+ "price3OFFEC": null,
+ "price3OnlineNSPIN": null,
+ "price3REGUP": null,
+ "price3REGDN": null,
+ "price3OfflineNSPIN": null,
+ "quantityMW3": null,
+ "blockIndicator4": null,
+ "price4RRSPFR": null,
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": null,
+ "price4OFFEC": null,
+ "price4OnlineNSPIN": null,
+ "price4REGUP": null,
+ "price4REGDN": null,
+ "price4OfflineNSPIN": null,
+ "quantityMW4": null,
+ "blockIndicator5": null,
+ "price5RRSPFR": null,
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": null,
+ "price5OFFEC": null,
+ "price5OnlineNSPIN": null,
+ "price5REGUP": null,
+ "price5REGDN": null,
+ "price5OfflineNSPIN": null,
+ "quantityMW5": null,
+ "NCLRFlag": false,
+ "price1RRS": "0",
+ "price2RRS": null,
+ "price3RRS": null,
+ "price4RRS": null,
+ "price5RRS": null
+ },
+ "rows_decoded": 1429
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_load_res_data",
+ "file": "60d_DAM_Load_Resource_Data-01-MAY-14.csv",
+ "fixture": "60_dam_load_res_data-history-samples.csv",
+ "csv_rows": 5472,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "loadResourceName": "ACRLY_LD1",
+ "maxPowerConsumption": "2",
+ "lowPowerConsumption": "0",
+ "REGUPAwarded": null,
+ "REGUPMCPC": null,
+ "REGDNAwarded": null,
+ "REGDNMCPC": null,
+ "RRSPFRAwarded": null,
+ "RRSFFRAwarded": null,
+ "RRSUFRAwarded": null,
+ "RRSMCPC": null,
+ "ECRSSDAwarded": null,
+ "ECRSMDAwarded": null,
+ "ECRSMCPC": null,
+ "NSPINAwarded": null,
+ "NSPINMCPC": null,
+ "RRSAwarded": null
+ },
+ "rows_decoded": 5472
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_gen_res_as_offers",
+ "file": "60d_DAM_Generation_Resource_ASOffers-01-MAY-14.csv",
+ "fixture": "60_dam_gen_res_as_offers-history-samples.csv",
+ "csv_rows": 2397,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": null,
+ "dmeName": null,
+ "resourceName": "AUSTPL_AUSTING1",
+ "multiHourBlock": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": null,
+ "price1RRSFFR": null,
+ "price1RRSUFR": null,
+ "price1ECRS": null,
+ "price1OFFEC": null,
+ "price1OnlineNSPIN": null,
+ "price1REGUP": null,
+ "price1REGDN": null,
+ "price1OfflineNSPIN": null,
+ "quantityMW1": "7",
+ "blockIndicator2": null,
+ "price2RRSPFR": null,
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": null,
+ "price2OFFEC": null,
+ "price2OnlineNSPIN": null,
+ "price2REGUP": null,
+ "price2REGDN": null,
+ "price2OfflineNSPIN": null,
+ "quantityMW2": null,
+ "blockIndicator3": null,
+ "price3RRSPFR": null,
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": null,
+ "price3OFFEC": null,
+ "price3OnlineNSPIN": null,
+ "price3REGUP": null,
+ "price3REGDN": null,
+ "price3OfflineNSPIN": null,
+ "quantityMW3": null,
+ "blockIndicator4": null,
+ "price4RRSPFR": null,
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": null,
+ "price4OFFEC": null,
+ "price4OnlineNSPIN": null,
+ "price4REGUP": null,
+ "price4REGDN": null,
+ "price4OfflineNSPIN": null,
+ "quantityMW4": null,
+ "blockIndicator5": null,
+ "price5RRSPFR": null,
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": null,
+ "price5OFFEC": null,
+ "price5OnlineNSPIN": null,
+ "price5REGUP": null,
+ "price5REGDN": null,
+ "price5OfflineNSPIN": null,
+ "quantityMW5": null,
+ "price1RRS": "0.81",
+ "price2RRS": null,
+ "price3RRS": null,
+ "price4RRS": null,
+ "price5RRS": null
+ },
+ "rows_decoded": 2397
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_gen_res_data",
+ "file": "60d_DAM_Gen_Resource_Data-01-MAY-14.csv",
+ "fixture": "60_dam_gen_res_data-history-samples.csv",
+ "csv_rows": 15504,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": null,
+ "dmeName": null,
+ "resourceName": "AMISTAD_AMISTAG1",
+ "resourceType": "HYDRO",
+ "qseSubmittedCurveMW1": null,
+ "qseSubmittedCurvePrice1": null,
+ "qseSubmittedCurveMW2": null,
+ "qseSubmittedCurvePrice2": null,
+ "qseSubmittedCurveMW3": null,
+ "qseSubmittedCurvePrice3": null,
+ "qseSubmittedCurveMW4": null,
+ "qseSubmittedCurvePrice4": null,
+ "qseSubmittedCurveMW5": null,
+ "qseSubmittedCurvePrice5": null,
+ "qseSubmittedCurveMW6": null,
+ "qseSubmittedCurvePrice6": null,
+ "qseSubmittedCurveMW7": null,
+ "qseSubmittedCurvePrice7": null,
+ "qseSubmittedCurveMW8": null,
+ "qseSubmittedCurvePrice8": null,
+ "qseSubmittedCurveMW9": null,
+ "qseSubmittedCurvePrice9": null,
+ "qseSubmittedCurveMW10": null,
+ "qseSubmittedCurvePrice10": null,
+ "startUpHot": null,
+ "startUpInter": null,
+ "startUpCold": null,
+ "minGenCost": null,
+ "HSL": "28",
+ "LSL": "10",
+ "resourceStatus": "EMR",
+ "awardedQuantity": null,
+ "settlementPointName": "AMISTAD_ALL",
+ "energySettlementPointPrice": "15.55",
+ "REGUPAwarded": null,
+ "REGUPMCPC": null,
+ "REGDNAwarded": null,
+ "REGDNMCPC": null,
+ "RRSPFRAwarded": null,
+ "RRSFFRAwarded": null,
+ "RRSUFRAwarded": null,
+ "RRSMCPC": null,
+ "ECRSSDAwarded": null,
+ "ECRSMCPC": null,
+ "NSPINAwarded": null,
+ "NSPINMCPC": null,
+ "RRSAwarded": null
+ },
+ "rows_decoded": 15504
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_qse_self_as",
+ "file": "60d_DAM_QSE_Self_Arranged_AS-01-MAY-14.csv",
+ "fixture": "60_dam_qse_self_as-history-samples.csv",
+ "csv_rows": 712,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "totalSelfArrangedASREGUP": "20.1",
+ "totalSelfArrangedASREGDN": "18.1",
+ "totalSelfArrangedASNSPIN": "0",
+ "totalSelfArrangedASNSPNM": null,
+ "totalSelfArrangedASRRSPFR": null,
+ "totalSelfArrangedASRRSFFR": null,
+ "totalSelfArrangedASRRSUFR": null,
+ "totalSelfArrangedASECRSSD": null,
+ "totalSelfArrangedASECRSMD": null,
+ "totalSelfArrangedASRRSGen": "60",
+ "totalSelfArrangedASRRSCLR": "0",
+ "totalSelfArrangedASRRSNCLR": "0"
+ },
+ "rows_decoded": 712
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_bid_awards",
+ "file": "60d_DAM_PTPObligationBidAwards-01-MAY-14.csv",
+ "fixture": "60_dam_ptp_obl_bid_awards-history-samples.csv",
+ "csv_rows": 70540,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": "QAEPS3",
+ "settlementPointSource": "HB_NORTH",
+ "settlementPointSink": "HB_WEST",
+ "PTPBidAwardMW": "50",
+ "PTPBidPrice": "0.02",
+ "bidId": "12000"
+ },
+ "rows_decoded": 70540
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_bids",
+ "file": "60d_DAM_PTPObligationBids-01-MAY-14.csv",
+ "fixture": "60_dam_ptp_obl_bids-history-samples.csv",
+ "csv_rows": 70540,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": "QAEPS3",
+ "settlementPointSource": "HB_NORTH",
+ "settlementPointSink": "HB_WEST",
+ "PTPBidMW": "50",
+ "PTPBidPrice": "100",
+ "bidId": "12000",
+ "multiHourBlock": true
+ },
+ "rows_decoded": 70540
+ },
+ {
+ "endpoint": "np3-966-er/60_dam_ptp_obl_opt_awards",
+ "file": "60d_DAM_PTP_Obligation_OptionAwards-01-MAY-14.csv",
+ "fixture": "60_dam_ptp_obl_opt_awards-history-samples.csv",
+ "csv_rows": 4540,
+ "first_row": {
+ "deliveryDate": "2014-03-02",
+ "hourEnding": 1,
+ "qseName": "QAEN",
+ "settlementPointSource": "FPPYD_FPP_G1",
+ "settlementPointSink": "LZ_AEN",
+ "MW": "273.6",
+ "price": "0.01",
+ "offerId": "CRR0",
+ "CRRId": "13723248"
+ },
+ "rows_decoded": 4540
+ }
+]
diff --git a/tools/inputs/history/eia-930-cd-eia-hourly-2026-09-06.csv b/tools/inputs/history/eia-930-cd-eia-hourly-2026-09-06.csv
new file mode 100644
index 00000000..fe8b6f53
--- /dev/null
+++ b/tools/inputs/history/eia-930-cd-eia-hourly-2026-09-06.csv
@@ -0,0 +1,3 @@
+Product_Name,Posting_Type,Balancing_Authority_Code,Data_Type,Data_Code,Data_Date,UTC Offset,HR1,HR2,HR3,HR4,HR5,HR6,HR7,HR8,HR9,HR10,HR11,HR12,HR13,HR14,HR15,HR16,HR17,HR18,HR19,HR20,HR21,HR22,HR23,HR24,HR25
+EIA-930,Same-Day,ERCO,UTC0,,2492026,5,2026-09-06T06:00:00.000Z,2026-09-06T07:00:00.000Z,2026-09-06T08:00:00.000Z,2026-09-06T09:00:00.000Z,2026-09-06T10:00:00.000Z,2026-09-06T11:00:00.000Z,2026-09-06T12:00:00.000Z,2026-09-06T13:00:00.000Z,2026-09-06T14:00:00.000Z,2026-09-06T15:00:00.000Z,2026-09-06T16:00:00.000Z,2026-09-06T17:00:00.000Z,2026-09-06T18:00:00.000Z,2026-09-06T19:00:00.000Z,2026-09-06T20:00:00.000Z,2026-09-06T21:00:00.000Z,2026-09-06T22:00:00.000Z,2026-09-06T23:00:00.000Z,2026-09-06T24:00:00.000Z,2026-09-07T01:00:00.000Z,2026-09-07T02:00:00.000Z,2026-09-07T03:00:00.000Z,2026-09-07T04:00:00.000Z,,
+EIA-930,Same-Day,ERCO,D,SYS,2492026,5,64270,61577,59631,58203,56756,56095,55799,55415,58469,63081,67805,72055,75321,77353,79422,81193,81923,82270,81130,78441,76310,73605,70073,,
diff --git a/tools/inputs/history/eia-930-cd-eia-hourly-old.csv b/tools/inputs/history/eia-930-cd-eia-hourly-old.csv
new file mode 100644
index 00000000..21eec168
--- /dev/null
+++ b/tools/inputs/history/eia-930-cd-eia-hourly-old.csv
@@ -0,0 +1,3 @@
+Product_Name,Posting_Type,Balancing_Authority_Code,Data_Type,Data_Code,Data_Date,UTC Offset,HR1,HR2,HR3,HR4,HR5,HR6,HR7,HR8,HR9,HR10,HR11,HR12,HR13,HR14,HR15,HR16,HR17,HR18,HR19,HR20,HR21,HR22,HR23,HR24,HR25
+EIA-930,Same-Day,ERCO,UTC0,,1202026,5,2026-04-30T06:00:00.000Z,2026-04-30T07:00:00.000Z,2026-04-30T08:00:00.000Z,2026-04-30T09:00:00.000Z,2026-04-30T10:00:00.000Z,2026-04-30T11:00:00.000Z,2026-04-30T12:00:00.000Z,2026-04-30T13:00:00.000Z,2026-04-30T14:00:00.000Z,2026-04-30T15:00:00.000Z,2026-04-30T16:00:00.000Z,2026-04-30T17:00:00.000Z,,,,,,,,,,,,,
+EIA-930,Same-Day,ERCO,D,SYS,1202026,5,48277,46486,45453,44641,44968,46288,48512,49391,50383,51493,52866,54317,,,,,,,,,,,,,
diff --git a/tools/inputs/history/eia-930-cd-remaining-archive.csv b/tools/inputs/history/eia-930-cd-remaining-archive.csv
new file mode 100644
index 00000000..eb9a92db
--- /dev/null
+++ b/tools/inputs/history/eia-930-cd-remaining-archive.csv
@@ -0,0 +1,3 @@
+Product_Name,Posting_Type,Balancing_Authority_Code,Data_Type,Data_Code,Data_Date,UTC Offset,HR1,HR2,HR3,HR4,HR5,HR6,HR7,HR8,HR9,HR10,HR11,HR12,HR13,HR14,HR15,HR16,HR17,HR18,HR19,HR20,HR21,HR22,HR23,HR24,HR25
+EIA-930,Same-Day,ERCO,UTC0,,2502026,5,2026-09-07T06:00:00.000Z,2026-09-07T07:00:00.000Z,2026-09-07T08:00:00.000Z,2026-09-07T09:00:00.000Z,2026-09-07T10:00:00.000Z,2026-09-07T11:00:00.000Z,2026-09-07T12:00:00.000Z,2026-09-07T13:00:00.000Z,2026-09-07T14:00:00.000Z,2026-09-07T15:00:00.000Z,2026-09-07T16:00:00.000Z,2026-09-07T17:00:00.000Z,2026-09-07T18:00:00.000Z,2026-09-07T19:00:00.000Z,,,,,,,,,,,
+EIA-930,Same-Day,ERCO,D,SYS,2502026,5,63489,60931,59000,57637,56808,56589,56429,56059,58720,63851,69424,74747,79518,83079,,,,,,,,,,,
diff --git a/tools/inputs/history/eia-930-er-history-current.csv b/tools/inputs/history/eia-930-er-history-current.csv
new file mode 100644
index 00000000..626cc53b
--- /dev/null
+++ b/tools/inputs/history/eia-930-er-history-current.csv
@@ -0,0 +1,27 @@
+"Product_Name","Posting_Type","Balancing_Authority_Code","Data_Type","Data_Code","Data_Date","UTC Offset","HR1","HR2","HR3","HR4","HR5","HR6","HR7","HR8","HR9","HR10","HR11","HR12","HR13","HR14","HR15","HR16","HR17","HR18","HR19","HR20","HR21","HR22","HR23","HR24","HR25"
+"EIA-930","Daily","ERCO","UTC1","","2492026","5","2026-09-06T06:00:00.000Z","2026-09-06T07:00:00.000Z","2026-09-06T08:00:00.000Z","2026-09-06T09:00:00.000Z","2026-09-06T10:00:00.000Z","2026-09-06T11:00:00.000Z","2026-09-06T12:00:00.000Z","2026-09-06T13:00:00.000Z","2026-09-06T14:00:00.000Z","2026-09-06T15:00:00.000Z","2026-09-06T16:00:00.000Z","2026-09-06T17:00:00.000Z","2026-09-06T18:00:00.000Z","2026-09-06T19:00:00.000Z","2026-09-06T20:00:00.000Z","2026-09-06T21:00:00.000Z","2026-09-06T22:00:00.000Z","2026-09-06T23:00:00.000Z","2026-09-06T24:00:00.000Z","2026-09-07T01:00:00.000Z","2026-09-07T02:00:00.000Z","2026-09-07T03:00:00.000Z","2026-09-07T04:00:00.000Z","2026-09-07T05:00:00.000Z",""
+"EIA-930","Daily","ERCO","D","SYS","2492026","5","64271","61577","59632","58203","56756","56095","55799","55415","58468","63083","67805","72055","75321","77352","79422","81194","81923","82270","81129","78442","76309","73604","70074","66626",""
+"EIA-930","Daily","ERCO","NG","SYS","2492026","5","63999","61468","59317","57835","56415","55532","55311","55016","58235","63057","67804","72054","75320","77278","79346","81192","81873","82220","81048","77828","75635","72920","69356","66099",""
+"EIA-930","Daily","ERCO","NG","BAT","2492026","5","-151","-626","-872","-104","372","983","2337","860","-4043","-9725","-8469","-5448","-3318","-1701","-629","-335","-348","74","2897","9394","8668","4107","644","-158",""
+"EIA-930","Daily","ERCO","FLOW","SYS","2492026","5","-271","-107","-312","-365","-339","-559","-485","-397","-231","-26","0","0","-1","-74","-75","-2","-49","-50","-80","-609","-669","-679","-712","-524",""
+"EIA-930","Daily","ERCO","NG","COL","2492026","5","10235","10028","9617","9326","9157","9087","8977","8708","7834","7208","7600","8145","8267","8420","8526","8954","8737","8588","9068","9238","9171","9183","9142","9064",""
+"EIA-930","Daily","ERCO","NG","NG","2492026","5","34965","33914","33778","33759","34292","34586","34727","35623","32162","31311","32023","32282","32328","31876","32555","34107","34217","35838","39966","41300","41669","41784","40861","38448",""
+"EIA-930","Daily","ERCO","NG","NUC","2492026","5","4962","4964","4964","4966","4966","4967","4967","4967","4967","4967","4967","4968","4968","4966","4964","4963","4961","4959","4957","4958","4960","4961","4962","4962",""
+"EIA-930","Daily","ERCO","NG","WAT","2492026","5","4","5","22","22","22","23","5","5","5","5","6","64","47","47","47","47","47","50","152","210","136","49","13","13",""
+"EIA-930","Daily","ERCO","NG","SUN","2492026","5","1","1","1","1","1","1","1","1561","15308","27896","29510","28693","27956","27840","27383","26909","26401","23543","14024","2504","9","4","1","1",""
+"EIA-930","Daily","ERCO","NG","WND","2492026","5","13934","13132","11756","9815","7554","5835","4233","3194","1919","1341","2118","3300","5023","5780","6450","6496","7808","9118","9923","10130","10918","12728","13654","13718",""
+"EIA-930","Daily","ERCO","NG","OTH","2492026","5","50","50","50","51","52","51","64","96","83","53","51","51","50","50","50","50","50","51","60","94","105","103","79","51",""
+"EIA-930","Daily","ERCO","UTC0","","2502026","5","2026-09-07T06:00:00.000Z","2026-09-07T07:00:00.000Z","2026-09-07T08:00:00.000Z","2026-09-07T09:00:00.000Z","2026-09-07T10:00:00.000Z","2026-09-07T11:00:00.000Z","2026-09-07T12:00:00.000Z","2026-09-07T13:00:00.000Z","2026-09-07T14:00:00.000Z","2026-09-07T15:00:00.000Z","2026-09-07T16:00:00.000Z","2026-09-07T17:00:00.000Z","2026-09-07T18:00:00.000Z","2026-09-07T19:00:00.000Z","2026-09-07T20:00:00.000Z","2026-09-07T21:00:00.000Z","2026-09-07T22:00:00.000Z","2026-09-07T23:00:00.000Z","2026-09-07T24:00:00.000Z","2026-09-08T01:00:00.000Z","2026-09-08T02:00:00.000Z","2026-09-08T03:00:00.000Z","2026-09-08T04:00:00.000Z","2026-09-08T05:00:00.000Z",""
+"EIA-930","Daily","ERCO","DF","","2502026","5","64038","61329","59516","58290","57676","57648","57709","57823","60306","64779","69899","74912","79152","82650","85182","86240","86625","86411","84861","82647","80834","77789","73791","69658",""
+"EIA-930","Daily","ERCO","UTC2","","2482026","5","2026-09-05T06:00:00.000Z","2026-09-05T07:00:00.000Z","2026-09-05T08:00:00.000Z","2026-09-05T09:00:00.000Z","2026-09-05T10:00:00.000Z","2026-09-05T11:00:00.000Z","2026-09-05T12:00:00.000Z","2026-09-05T13:00:00.000Z","2026-09-05T14:00:00.000Z","2026-09-05T15:00:00.000Z","2026-09-05T16:00:00.000Z","2026-09-05T17:00:00.000Z","2026-09-05T18:00:00.000Z","2026-09-05T19:00:00.000Z","2026-09-05T20:00:00.000Z","2026-09-05T21:00:00.000Z","2026-09-05T22:00:00.000Z","2026-09-05T23:00:00.000Z","2026-09-05T24:00:00.000Z","2026-09-06T01:00:00.000Z","2026-09-06T02:00:00.000Z","2026-09-06T03:00:00.000Z","2026-09-06T04:00:00.000Z","2026-09-06T05:00:00.000Z",""
+"EIA-930","Daily","ERCO","FLOW","SWPP","2482026","5","-434","-345","-366","-367","-367","-365","-219","-42","0","5","396","676","534","506","543","308","194","126","-42","-139","-437","-327","-269","-269",""
+"EIA-930","Daily","ERCO","FLOW","CEN","2482026","5","107","79","92","102","134","26","24","24","24","24","24","24","24","25","44","44","19","19","19","19","20","51","59","43",""
+"EIA-930","Daily","ERCO","UTCD","","2482026","5","2026-09-05T06:00:00.000Z","2026-09-05T07:00:00.000Z","2026-09-05T08:00:00.000Z","2026-09-05T09:00:00.000Z","2026-09-05T10:00:00.000Z","2026-09-05T11:00:00.000Z","2026-09-05T12:00:00.000Z","2026-09-05T13:00:00.000Z","2026-09-05T14:00:00.000Z","2026-09-05T15:00:00.000Z","2026-09-05T16:00:00.000Z","2026-09-05T17:00:00.000Z","2026-09-05T18:00:00.000Z","2026-09-05T19:00:00.000Z","2026-09-05T20:00:00.000Z","2026-09-05T21:00:00.000Z","2026-09-05T22:00:00.000Z","2026-09-05T23:00:00.000Z","2026-09-05T24:00:00.000Z","2026-09-06T01:00:00.000Z","2026-09-06T02:00:00.000Z","2026-09-06T03:00:00.000Z","2026-09-06T04:00:00.000Z","2026-09-06T05:00:00.000Z",""
+"EIA-930","Daily","ERCO","D","COAS","2482026","5","15781","15158","14628","14267","14041","13977","14001","14047","14904","16223","17363","18310","19027","19521","20010","20266","19765","19058","18417","17951","17661","17159","16559","15932",""
+"EIA-930","Daily","ERCO","D","EAST","2482026","5","2090","2013","1925","1859","1814","1777","1801","1779","1789","1913","2122","2324","2460","2514","2484","2450","2322","2262","2280","2227","2201","2103","2063","2003",""
+"EIA-930","Daily","ERCO","D","WEST","2482026","5","1991","1984","1894","1930","1880","1879","1865","1879","1957","2036","2192","2311","2442","2572","2633","2730","2731","2713","2639","2638","2563","2459","2408","2287",""
+"EIA-930","Daily","ERCO","D","FWES","2482026","5","7796","7749","7749","7661","7625","7634","7642","7547","7579","7680","7820","8006","8160","8186","8227","8283","8316","8262","8171","8123","8093","7965","7794","7731",""
+"EIA-930","Daily","ERCO","D","NRTH","2482026","5","1871","1785","1729","1715","1738","1694","1725","1796","1873","1971","2130","2301","2451","2549","2628","2676","2714","2704","2610","2455","2349","2218","2131","2079",""
+"EIA-930","Daily","ERCO","D","NCEN","2482026","5","19187","18115","17168","16429","15987","15708","15585","15625","16686","18371","20168","21960","23554","24902","25847","26516","26903","26995","26484","25317","24141","22973","21615","20256",""
+"EIA-930","Daily","ERCO","D","SCEN","2482026","5","10483","9973","9606","9306","9119","8968","8945","8984","9450","10178","10953","11778","12501","13208","13776","14247","14741","14878","14722","14298","13717","13106","12434","11730",""
+"EIA-930","Daily","ERCO","D","SOUT","2482026","5","5421","5241","5097","4973","4906","4883","4889","4826","5031","5329","5596","5932","6296","6525","6733","6900","7050","6827","6717","6647","6456","6045","5717","5482",""
diff --git a/tools/inputs/history/eia-930-er-history-samples.csv b/tools/inputs/history/eia-930-er-history-samples.csv
new file mode 100644
index 00000000..69303222
--- /dev/null
+++ b/tools/inputs/history/eia-930-er-history-samples.csv
@@ -0,0 +1,13 @@
+"Survey Name","Posting Type","Balancing Authority Code","Interconnected Balancing Authority Code","Type","Posted Date","UTCOffset","HR1","HR2","HR3","HR4","HR5","HR6","HR7","HR8","HR9","HR10","HR11","HR12","HR13","HR14","HR15","HR16","HR17","HR18","HR19","HR20","HR21","HR22","HR23","HR24","HR25"
+"EIA-930","Daily","ERCO","","UTC1","0392015","6","2015-02-08T07:00:00.000Z","2015-02-08T08:00:00.000Z","2015-02-08T09:00:00.000Z","2015-02-08T10:00:00.000Z","2015-02-08T11:00:00.000Z","2015-02-08T12:00:00.000Z","2015-02-08T13:00:00.000Z","2015-02-08T14:00:00.000Z","2015-02-08T15:00:00.000Z","2015-02-08T16:00:00.000Z","2015-02-08T17:00:00.000Z","2015-02-08T18:00:00.000Z","2015-02-08T19:00:00.000Z","2015-02-08T20:00:00.000Z","2015-02-08T21:00:00.000Z","2015-02-08T22:00:00.000Z","2015-02-08T23:00:00.000Z","2015-02-08T24:00:00.000Z","2015-02-09T01:00:00.000Z","2015-02-09T02:00:00.000Z","2015-02-09T03:00:00.000Z","2015-02-09T04:00:00.000Z","2015-02-09T05:00:00.000Z","2015-02-09T06:00:00.000Z",""
+"EIA-930","Daily","ERCO","","D","0392015","6","28241","27450","26988","26783","27011","27554","28566","29406","30379","31032","31185","31021","30843","30669","30641","30733","31034","31629","33552","34495","33754","32553","30463","28114",""
+"EIA-930","Daily","ERCO","","NG","0392015","6","28388","27548","27364","26890","27112","27558","28605","29391","30358","31105","31333","31175","30993","30827","30800","30893","31098","31688","33322","34235","33028","32478","30325","28018",""
+"EIA-930","Daily","ERCO","","TI","0392015","6","161","104","379","105","98","-4","28","-23","-31","69","149","155","155","157","160","158","57","49","-258","-257","-716","-56","-113","-70",""
+"EIA-930","Daily","ERCO","","UTC0","0402015","6","2015-02-09T07:00:00.000Z","2015-02-09T08:00:00.000Z","2015-02-09T09:00:00.000Z","2015-02-09T10:00:00.000Z","2015-02-09T11:00:00.000Z","2015-02-09T12:00:00.000Z","2015-02-09T13:00:00.000Z","2015-02-09T14:00:00.000Z","2015-02-09T15:00:00.000Z","2015-02-09T16:00:00.000Z","2015-02-09T17:00:00.000Z","2015-02-09T18:00:00.000Z","2015-02-09T19:00:00.000Z","2015-02-09T20:00:00.000Z","2015-02-09T21:00:00.000Z","2015-02-09T22:00:00.000Z","2015-02-09T23:00:00.000Z","2015-02-09T24:00:00.000Z","2015-02-10T01:00:00.000Z","2015-02-10T02:00:00.000Z","2015-02-10T03:00:00.000Z","2015-02-10T04:00:00.000Z","2015-02-10T05:00:00.000Z","2015-02-10T06:00:00.000Z",""
+"EIA-930","Daily","ERCO","","DF","0402015","6","26231","25290","24949","25220","26381","29264","34005","35830","35100","34695","34622","34451","34336","34472","34501","34709","34621","35067","36216","36106","35447","34220","32151","29751",""
+"EIA-930","Daily","ERCO","","UTC2","0382015","6","2015-02-07T07:00:00.000Z","2015-02-07T08:00:00.000Z","2015-02-07T09:00:00.000Z","2015-02-07T10:00:00.000Z","2015-02-07T11:00:00.000Z","2015-02-07T12:00:00.000Z","2015-02-07T13:00:00.000Z","2015-02-07T14:00:00.000Z","2015-02-07T15:00:00.000Z","2015-02-07T16:00:00.000Z","2015-02-07T17:00:00.000Z","2015-02-07T18:00:00.000Z","2015-02-07T19:00:00.000Z","2015-02-07T20:00:00.000Z","2015-02-07T21:00:00.000Z","2015-02-07T22:00:00.000Z","2015-02-07T23:00:00.000Z","2015-02-07T24:00:00.000Z","2015-02-08T01:00:00.000Z","2015-02-08T02:00:00.000Z","2015-02-08T03:00:00.000Z","2015-02-08T04:00:00.000Z","2015-02-08T05:00:00.000Z","2015-02-08T06:00:00.000Z",""
+"EIA-930","Daily","ERCO","DC_E","DIBA","0382015","6","-30","-124","-129","-34","-29","-31","-67","-73","-119","-242","-287","-212","-180","-33","-25","-23","-23","42","41","38","7","-32","88","112",""
+"EIA-930","Daily","ERCO","DC_L","DIBA","0382015","6","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0",""
+"EIA-930","Daily","ERCO","DC_N","DIBA","0382015","6","0","0","0","0","12","-23","-26","-170","-123","-212","-215","29","2","0","0","72","50","75","76","76","60","72","76","76",""
+"EIA-930","Daily","ERCO","DC_R","DIBA","0382015","6","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0",""
+"EIA-930","Daily","ERCO","DC_S","DIBA","0382015","6","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5",""
diff --git a/tools/inputs/history/eia-evidence.json b/tools/inputs/history/eia-evidence.json
new file mode 100644
index 00000000..e5a15162
--- /dev/null
+++ b/tools/inputs/history/eia-evidence.json
@@ -0,0 +1,88 @@
+[
+ {
+ "endpoint": "eia-930-er/daily_operations",
+ "file": "472125720.rpt.00013458.0000000000000000.20150209.104338218.DLYBALOPSRPT.csv",
+ "fixture": "eia-930-er-history-samples.csv",
+ "csv_rows": 12,
+ "rows_decoded": 12,
+ "first_row": {
+ "productName": "EIA-930",
+ "postingType": "Daily",
+ "balancingAuthorityCode": "ERCO",
+ "interconnectedBalancingAuthorityCode": null,
+ "dataType": "UTC1",
+ "dataCode": null,
+ "dataDate": null,
+ "postedDate": "2015-02-08",
+ "UTCOffset": 6,
+ "HR1": "2015-02-08T07:00:00Z",
+ "HR2": "2015-02-08T08:00:00Z",
+ "HR3": "2015-02-08T09:00:00Z",
+ "HR4": "2015-02-08T10:00:00Z",
+ "HR5": "2015-02-08T11:00:00Z",
+ "HR6": "2015-02-08T12:00:00Z",
+ "HR7": "2015-02-08T13:00:00Z",
+ "HR8": "2015-02-08T14:00:00Z",
+ "HR9": "2015-02-08T15:00:00Z",
+ "HR10": "2015-02-08T16:00:00Z",
+ "HR11": "2015-02-08T17:00:00Z",
+ "HR12": "2015-02-08T18:00:00Z",
+ "HR13": "2015-02-08T19:00:00Z",
+ "HR14": "2015-02-08T20:00:00Z",
+ "HR15": "2015-02-08T21:00:00Z",
+ "HR16": "2015-02-08T22:00:00Z",
+ "HR17": "2015-02-08T23:00:00Z",
+ "HR18": "2015-02-09T00:00:00Z",
+ "HR19": "2015-02-09T01:00:00Z",
+ "HR20": "2015-02-09T02:00:00Z",
+ "HR21": "2015-02-09T03:00:00Z",
+ "HR22": "2015-02-09T04:00:00Z",
+ "HR23": "2015-02-09T05:00:00Z",
+ "HR24": "2015-02-09T06:00:00Z",
+ "HR25": null
+ }
+ },
+ {
+ "endpoint": "eia-930-er/daily_operations",
+ "file": "1271517223.rpt.00013458.0000000000000000.20260907.022611.ERCODAILY2502026.csv",
+ "fixture": "eia-930-er-history-current.csv",
+ "csv_rows": 26,
+ "rows_decoded": 26,
+ "first_row": {
+ "productName": "EIA-930",
+ "postingType": "Daily",
+ "balancingAuthorityCode": "ERCO",
+ "interconnectedBalancingAuthorityCode": null,
+ "dataType": "UTC1",
+ "dataCode": null,
+ "dataDate": "2026-09-06",
+ "postedDate": null,
+ "UTCOffset": 5,
+ "HR1": "2026-09-06T06:00:00Z",
+ "HR2": "2026-09-06T07:00:00Z",
+ "HR3": "2026-09-06T08:00:00Z",
+ "HR4": "2026-09-06T09:00:00Z",
+ "HR5": "2026-09-06T10:00:00Z",
+ "HR6": "2026-09-06T11:00:00Z",
+ "HR7": "2026-09-06T12:00:00Z",
+ "HR8": "2026-09-06T13:00:00Z",
+ "HR9": "2026-09-06T14:00:00Z",
+ "HR10": "2026-09-06T15:00:00Z",
+ "HR11": "2026-09-06T16:00:00Z",
+ "HR12": "2026-09-06T17:00:00Z",
+ "HR13": "2026-09-06T18:00:00Z",
+ "HR14": "2026-09-06T19:00:00Z",
+ "HR15": "2026-09-06T20:00:00Z",
+ "HR16": "2026-09-06T21:00:00Z",
+ "HR17": "2026-09-06T22:00:00Z",
+ "HR18": "2026-09-06T23:00:00Z",
+ "HR19": "2026-09-07T00:00:00Z",
+ "HR20": "2026-09-07T01:00:00Z",
+ "HR21": "2026-09-07T02:00:00Z",
+ "HR22": "2026-09-07T03:00:00Z",
+ "HR23": "2026-09-07T04:00:00Z",
+ "HR24": "2026-09-07T05:00:00Z",
+ "HR25": null
+ }
+ }
+]
diff --git a/tools/inputs/history/eia-hourly-evidence.json b/tools/inputs/history/eia-hourly-evidence.json
new file mode 100644
index 00000000..3a10cf6e
--- /dev/null
+++ b/tools/inputs/history/eia-hourly-evidence.json
@@ -0,0 +1,236 @@
+[
+ {
+ "endpoint": "eia-930-cd/hourly_operations",
+ "fixture": "eia-930-cd-remaining-archive.csv",
+ "file": "1271713625.cdr.00013457.0000000000000000.20260907.140500.ERCOsamedaydemand.csv",
+ "source_folder": "remaining-archive",
+ "csv_rows": 2,
+ "rows_decoded": 2,
+ "rows": [
+ {
+ "productName": "EIA-930",
+ "postingType": "Same-Day",
+ "balancingAuthorityCode": "ERCO",
+ "dataType": "UTC0",
+ "dataCode": null,
+ "dataDate": "2026-09-07",
+ "UTCOffset": 5,
+ "HR1": "2026-09-07T06:00:00Z",
+ "HR2": "2026-09-07T07:00:00Z",
+ "HR3": "2026-09-07T08:00:00Z",
+ "HR4": "2026-09-07T09:00:00Z",
+ "HR5": "2026-09-07T10:00:00Z",
+ "HR6": "2026-09-07T11:00:00Z",
+ "HR7": "2026-09-07T12:00:00Z",
+ "HR8": "2026-09-07T13:00:00Z",
+ "HR9": "2026-09-07T14:00:00Z",
+ "HR10": "2026-09-07T15:00:00Z",
+ "HR11": "2026-09-07T16:00:00Z",
+ "HR12": "2026-09-07T17:00:00Z",
+ "HR13": "2026-09-07T18:00:00Z",
+ "HR14": "2026-09-07T19:00:00Z",
+ "HR15": null,
+ "HR16": null,
+ "HR17": null,
+ "HR18": null,
+ "HR19": null,
+ "HR20": null,
+ "HR21": null,
+ "HR22": null,
+ "HR23": null,
+ "HR24": null,
+ "HR25": null
+ },
+ {
+ "productName": "EIA-930",
+ "postingType": "Same-Day",
+ "balancingAuthorityCode": "ERCO",
+ "dataType": "D",
+ "dataCode": "SYS",
+ "dataDate": "2026-09-07",
+ "UTCOffset": 5,
+ "HR1": "63489",
+ "HR2": "60931",
+ "HR3": "59000",
+ "HR4": "57637",
+ "HR5": "56808",
+ "HR6": "56589",
+ "HR7": "56429",
+ "HR8": "56059",
+ "HR9": "58720",
+ "HR10": "63851",
+ "HR11": "69424",
+ "HR12": "74747",
+ "HR13": "79518",
+ "HR14": "83079",
+ "HR15": null,
+ "HR16": null,
+ "HR17": null,
+ "HR18": null,
+ "HR19": null,
+ "HR20": null,
+ "HR21": null,
+ "HR22": null,
+ "HR23": null,
+ "HR24": null,
+ "HR25": null
+ }
+ ]
+ },
+ {
+ "endpoint": "eia-930-cd/hourly_operations",
+ "fixture": "eia-930-cd-eia-hourly-2026-09-06.csv",
+ "file": "1271465461.cdr.00013457.0000000000000000.20260906.230500.ERCOsamedaydemand.csv",
+ "source_folder": "eia-hourly-2026-09-06",
+ "csv_rows": 2,
+ "rows_decoded": 2,
+ "rows": [
+ {
+ "productName": "EIA-930",
+ "postingType": "Same-Day",
+ "balancingAuthorityCode": "ERCO",
+ "dataType": "UTC0",
+ "dataCode": null,
+ "dataDate": "2026-09-06",
+ "UTCOffset": 5,
+ "HR1": "2026-09-06T06:00:00Z",
+ "HR2": "2026-09-06T07:00:00Z",
+ "HR3": "2026-09-06T08:00:00Z",
+ "HR4": "2026-09-06T09:00:00Z",
+ "HR5": "2026-09-06T10:00:00Z",
+ "HR6": "2026-09-06T11:00:00Z",
+ "HR7": "2026-09-06T12:00:00Z",
+ "HR8": "2026-09-06T13:00:00Z",
+ "HR9": "2026-09-06T14:00:00Z",
+ "HR10": "2026-09-06T15:00:00Z",
+ "HR11": "2026-09-06T16:00:00Z",
+ "HR12": "2026-09-06T17:00:00Z",
+ "HR13": "2026-09-06T18:00:00Z",
+ "HR14": "2026-09-06T19:00:00Z",
+ "HR15": "2026-09-06T20:00:00Z",
+ "HR16": "2026-09-06T21:00:00Z",
+ "HR17": "2026-09-06T22:00:00Z",
+ "HR18": "2026-09-06T23:00:00Z",
+ "HR19": "2026-09-07T00:00:00Z",
+ "HR20": "2026-09-07T01:00:00Z",
+ "HR21": "2026-09-07T02:00:00Z",
+ "HR22": "2026-09-07T03:00:00Z",
+ "HR23": "2026-09-07T04:00:00Z",
+ "HR24": null,
+ "HR25": null
+ },
+ {
+ "productName": "EIA-930",
+ "postingType": "Same-Day",
+ "balancingAuthorityCode": "ERCO",
+ "dataType": "D",
+ "dataCode": "SYS",
+ "dataDate": "2026-09-06",
+ "UTCOffset": 5,
+ "HR1": "64270",
+ "HR2": "61577",
+ "HR3": "59631",
+ "HR4": "58203",
+ "HR5": "56756",
+ "HR6": "56095",
+ "HR7": "55799",
+ "HR8": "55415",
+ "HR9": "58469",
+ "HR10": "63081",
+ "HR11": "67805",
+ "HR12": "72055",
+ "HR13": "75321",
+ "HR14": "77353",
+ "HR15": "79422",
+ "HR16": "81193",
+ "HR17": "81923",
+ "HR18": "82270",
+ "HR19": "81130",
+ "HR20": "78441",
+ "HR21": "76310",
+ "HR22": "73605",
+ "HR23": "70073",
+ "HR24": null,
+ "HR25": null
+ }
+ ]
+ },
+ {
+ "endpoint": "eia-930-cd/hourly_operations",
+ "fixture": "eia-930-cd-eia-hourly-old.csv",
+ "file": "1221431228.cdr.00013457.0000000000000000.20260430.120500.ERCOsamedaydemand.csv",
+ "source_folder": "eia-hourly-old",
+ "csv_rows": 2,
+ "rows_decoded": 2,
+ "rows": [
+ {
+ "productName": "EIA-930",
+ "postingType": "Same-Day",
+ "balancingAuthorityCode": "ERCO",
+ "dataType": "UTC0",
+ "dataCode": null,
+ "dataDate": "2026-04-30",
+ "UTCOffset": 5,
+ "HR1": "2026-04-30T06:00:00Z",
+ "HR2": "2026-04-30T07:00:00Z",
+ "HR3": "2026-04-30T08:00:00Z",
+ "HR4": "2026-04-30T09:00:00Z",
+ "HR5": "2026-04-30T10:00:00Z",
+ "HR6": "2026-04-30T11:00:00Z",
+ "HR7": "2026-04-30T12:00:00Z",
+ "HR8": "2026-04-30T13:00:00Z",
+ "HR9": "2026-04-30T14:00:00Z",
+ "HR10": "2026-04-30T15:00:00Z",
+ "HR11": "2026-04-30T16:00:00Z",
+ "HR12": "2026-04-30T17:00:00Z",
+ "HR13": null,
+ "HR14": null,
+ "HR15": null,
+ "HR16": null,
+ "HR17": null,
+ "HR18": null,
+ "HR19": null,
+ "HR20": null,
+ "HR21": null,
+ "HR22": null,
+ "HR23": null,
+ "HR24": null,
+ "HR25": null
+ },
+ {
+ "productName": "EIA-930",
+ "postingType": "Same-Day",
+ "balancingAuthorityCode": "ERCO",
+ "dataType": "D",
+ "dataCode": "SYS",
+ "dataDate": "2026-04-30",
+ "UTCOffset": 5,
+ "HR1": "48277",
+ "HR2": "46486",
+ "HR3": "45453",
+ "HR4": "44641",
+ "HR5": "44968",
+ "HR6": "46288",
+ "HR7": "48512",
+ "HR8": "49391",
+ "HR9": "50383",
+ "HR10": "51493",
+ "HR11": "52866",
+ "HR12": "54317",
+ "HR13": null,
+ "HR14": null,
+ "HR15": null,
+ "HR16": null,
+ "HR17": null,
+ "HR18": null,
+ "HR19": null,
+ "HR20": null,
+ "HR21": null,
+ "HR22": null,
+ "HR23": null,
+ "HR24": null,
+ "HR25": null
+ }
+ ]
+ }
+]
diff --git a/tools/inputs/history/event-sasm-evidence.json b/tools/inputs/history/event-sasm-evidence.json
new file mode 100644
index 00000000..c1b16658
--- /dev/null
+++ b/tools/inputs/history/event-sasm-evidence.json
@@ -0,0 +1,834 @@
+[
+ {
+ "endpoint": "np3-987-ex/7d_trig_lmp_50xfip",
+ "fixture": "np3-987-ex--7d_trig_lmp_50xfip-history-current.csv",
+ "file": "7day_Event_Trigger_LMP_Exceeds_50XFIP-07-SEP-26.csv",
+ "folder": "history-current",
+ "csv_rows": 52,
+ "first_row": {
+ "SCEDTimestamp": "2026-08-31T12:50:20",
+ "repeatHourFlag": false,
+ "resourceName": "RUSSEKST_ESR1",
+ "LMP": "124.447479248047",
+ "FIPx50": "123.75",
+ "SCED2CurveMW1": null,
+ "SCED2CurvePrice1": null,
+ "SCED2CurveMW2": null,
+ "SCED2CurvePrice2": null,
+ "SCED2CurveMW3": "0",
+ "SCED2CurvePrice3": "149.990005493164",
+ "SCED2CurveMW4": "3",
+ "SCED2CurvePrice4": "150",
+ "SCED2CurveMW5": "5",
+ "SCED2CurvePrice5": "500",
+ "SCED2CurveMW6": "9.89999961853027",
+ "SCED2CurvePrice6": "2000",
+ "SCED2CurveMW7": null,
+ "SCED2CurvePrice7": null,
+ "SCED2CurveMW8": null,
+ "SCED2CurvePrice8": null,
+ "SCED2CurveMW9": null,
+ "SCED2CurvePrice9": null,
+ "SCED2CurveMW10": null,
+ "SCED2CurvePrice10": null,
+ "SCED2CurveMW11": null,
+ "SCED2CurvePrice11": null,
+ "SCED2CurveMW12": null,
+ "SCED2CurvePrice12": null,
+ "SCED2CurveMW13": null,
+ "SCED2CurvePrice13": null,
+ "SCED2CurveMW14": null,
+ "SCED2CurvePrice14": null,
+ "SCED2CurveMW15": null,
+ "SCED2CurvePrice15": null,
+ "SCED2CurveMW16": null,
+ "SCED2CurvePrice16": null,
+ "SCED2CurveMW17": null,
+ "SCED2CurvePrice17": null,
+ "SCED2CurveMW18": null,
+ "SCED2CurvePrice18": null,
+ "SCED2CurveMW19": null,
+ "SCED2CurvePrice19": null,
+ "SCED2CurveMW20": null,
+ "SCED2CurvePrice20": null,
+ "SCED2CurveMW21": null,
+ "SCED2CurvePrice21": null,
+ "SCED2CurveMW22": null,
+ "SCED2CurvePrice22": null,
+ "SCED2CurveMW23": null,
+ "SCED2CurvePrice23": null,
+ "SCED2CurveMW24": null,
+ "SCED2CurvePrice24": null,
+ "SCED2CurveMW25": null,
+ "SCED2CurvePrice25": null,
+ "SCED2CurveMW26": null,
+ "SCED2CurvePrice26": null,
+ "SCED2CurveMW27": null,
+ "SCED2CurvePrice27": null,
+ "SCED2CurveMW28": null,
+ "SCED2CurvePrice28": null,
+ "SCED2CurveMW29": null,
+ "SCED2CurvePrice29": null,
+ "SCED2CurveMW30": null,
+ "SCED2CurvePrice30": null,
+ "SCED2CurveMW31": null,
+ "SCED2CurvePrice31": null,
+ "SCED2CurveMW32": null,
+ "SCED2CurvePrice32": null,
+ "SCED2CurveMW33": null,
+ "SCED2CurvePrice33": null,
+ "SCED2CurveMW34": null,
+ "SCED2CurvePrice34": null,
+ "SCED2CurveMW35": null,
+ "SCED2CurvePrice35": null,
+ "bidType": "3PT",
+ "submittedTPOMW1": null,
+ "submittedTPOPrice1": null,
+ "submittedTPOMW2": null,
+ "submittedTPOPrice2": null,
+ "submittedTPOMW3": "0",
+ "submittedTPOPrice3": "149.99",
+ "submittedTPOMW4": "3",
+ "submittedTPOPrice4": "150",
+ "submittedTPOMW5": "5",
+ "submittedTPOPrice5": "500",
+ "submittedTPOMW6": "9.9",
+ "submittedTPOPrice6": "2000",
+ "submittedTPOMW7": null,
+ "submittedTPOPrice7": null,
+ "submittedTPOMW8": null,
+ "submittedTPOPrice8": null,
+ "submittedTPOMW9": null,
+ "submittedTPOPrice9": null,
+ "submittedTPOMW10": null,
+ "submittedTPOPrice10": null,
+ "proxyExtension": "No"
+ },
+ "rows_decoded": 52
+ },
+ {
+ "endpoint": "np3-987-ex/7d_trig_lmp_50xfip",
+ "fixture": "np3-987-ex--7d_trig_lmp_50xfip-history-samples.csv",
+ "file": "7day_Event_Trigger_LMP_Exceeds_50XFIP-19-MAR-14.csv",
+ "folder": "history-samples",
+ "csv_rows": 45,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-12T19:45:14",
+ "repeatHourFlag": false,
+ "resourceName": "AMOCOOIL_CC1_1",
+ "LMP": "250.075744628906",
+ "FIPx50": "229.5",
+ "SCED2CurveMW1": null,
+ "SCED2CurvePrice1": null,
+ "SCED2CurveMW2": null,
+ "SCED2CurvePrice2": null,
+ "SCED2CurveMW3": "0",
+ "SCED2CurvePrice3": "5000",
+ "SCED2CurveMW4": null,
+ "SCED2CurvePrice4": null,
+ "SCED2CurveMW5": null,
+ "SCED2CurvePrice5": null,
+ "SCED2CurveMW6": null,
+ "SCED2CurvePrice6": null,
+ "SCED2CurveMW7": null,
+ "SCED2CurvePrice7": null,
+ "SCED2CurveMW8": null,
+ "SCED2CurvePrice8": null,
+ "SCED2CurveMW9": null,
+ "SCED2CurvePrice9": null,
+ "SCED2CurveMW10": null,
+ "SCED2CurvePrice10": null,
+ "SCED2CurveMW11": null,
+ "SCED2CurvePrice11": null,
+ "SCED2CurveMW12": null,
+ "SCED2CurvePrice12": null,
+ "SCED2CurveMW13": null,
+ "SCED2CurvePrice13": null,
+ "SCED2CurveMW14": null,
+ "SCED2CurvePrice14": null,
+ "SCED2CurveMW15": null,
+ "SCED2CurvePrice15": null,
+ "SCED2CurveMW16": null,
+ "SCED2CurvePrice16": null,
+ "SCED2CurveMW17": null,
+ "SCED2CurvePrice17": null,
+ "SCED2CurveMW18": null,
+ "SCED2CurvePrice18": null,
+ "SCED2CurveMW19": null,
+ "SCED2CurvePrice19": null,
+ "SCED2CurveMW20": null,
+ "SCED2CurvePrice20": null,
+ "SCED2CurveMW21": null,
+ "SCED2CurvePrice21": null,
+ "SCED2CurveMW22": null,
+ "SCED2CurvePrice22": null,
+ "SCED2CurveMW23": null,
+ "SCED2CurvePrice23": null,
+ "SCED2CurveMW24": null,
+ "SCED2CurvePrice24": null,
+ "SCED2CurveMW25": null,
+ "SCED2CurvePrice25": null,
+ "SCED2CurveMW26": null,
+ "SCED2CurvePrice26": null,
+ "SCED2CurveMW27": null,
+ "SCED2CurvePrice27": null,
+ "SCED2CurveMW28": null,
+ "SCED2CurvePrice28": null,
+ "SCED2CurveMW29": null,
+ "SCED2CurvePrice29": null,
+ "SCED2CurveMW30": null,
+ "SCED2CurvePrice30": null,
+ "SCED2CurveMW31": null,
+ "SCED2CurvePrice31": null,
+ "SCED2CurveMW32": null,
+ "SCED2CurvePrice32": null,
+ "SCED2CurveMW33": null,
+ "SCED2CurvePrice33": null,
+ "SCED2CurveMW34": null,
+ "SCED2CurvePrice34": null,
+ "SCED2CurveMW35": null,
+ "SCED2CurvePrice35": null,
+ "bidType": null,
+ "submittedTPOMW1": null,
+ "submittedTPOPrice1": null,
+ "submittedTPOMW2": null,
+ "submittedTPOPrice2": null,
+ "submittedTPOMW3": null,
+ "submittedTPOPrice3": null,
+ "submittedTPOMW4": null,
+ "submittedTPOPrice4": null,
+ "submittedTPOMW5": null,
+ "submittedTPOPrice5": null,
+ "submittedTPOMW6": null,
+ "submittedTPOPrice6": null,
+ "submittedTPOMW7": null,
+ "submittedTPOPrice7": null,
+ "submittedTPOMW8": null,
+ "submittedTPOPrice8": null,
+ "submittedTPOMW9": null,
+ "submittedTPOPrice9": null,
+ "submittedTPOMW10": null,
+ "submittedTPOPrice10": null,
+ "proxyExtension": "No"
+ },
+ "rows_decoded": 45
+ },
+ {
+ "endpoint": "np3-987-ex/7d_trig_lmp_50xfip",
+ "fixture": "np3-987-ex--7d_trig_lmp_50xfip-history-event-dam.csv",
+ "file": "7day_Event_Trigger_LMP_Exceeds_50XFIP-05-MAY-26.csv",
+ "folder": "history-event-dam",
+ "csv_rows": 7501,
+ "first_row": {
+ "SCEDTimestamp": "2026-04-28T06:20:17",
+ "repeatHourFlag": false,
+ "resourceName": "RUSSEKST_ESR1",
+ "LMP": "144.133056640625",
+ "FIPx50": "116.5",
+ "SCED2CurveMW1": null,
+ "SCED2CurvePrice1": null,
+ "SCED2CurveMW2": null,
+ "SCED2CurvePrice2": null,
+ "SCED2CurveMW3": null,
+ "SCED2CurvePrice3": null,
+ "SCED2CurveMW4": null,
+ "SCED2CurvePrice4": null,
+ "SCED2CurveMW5": null,
+ "SCED2CurvePrice5": null,
+ "SCED2CurveMW6": "6",
+ "SCED2CurvePrice6": "500",
+ "SCED2CurveMW7": "9.89999961853027",
+ "SCED2CurvePrice7": "2000",
+ "SCED2CurveMW8": null,
+ "SCED2CurvePrice8": null,
+ "SCED2CurveMW9": null,
+ "SCED2CurvePrice9": null,
+ "SCED2CurveMW10": null,
+ "SCED2CurvePrice10": null,
+ "SCED2CurveMW11": null,
+ "SCED2CurvePrice11": null,
+ "SCED2CurveMW12": null,
+ "SCED2CurvePrice12": null,
+ "SCED2CurveMW13": null,
+ "SCED2CurvePrice13": null,
+ "SCED2CurveMW14": null,
+ "SCED2CurvePrice14": null,
+ "SCED2CurveMW15": null,
+ "SCED2CurvePrice15": null,
+ "SCED2CurveMW16": null,
+ "SCED2CurvePrice16": null,
+ "SCED2CurveMW17": null,
+ "SCED2CurvePrice17": null,
+ "SCED2CurveMW18": null,
+ "SCED2CurvePrice18": null,
+ "SCED2CurveMW19": null,
+ "SCED2CurvePrice19": null,
+ "SCED2CurveMW20": null,
+ "SCED2CurvePrice20": null,
+ "SCED2CurveMW21": null,
+ "SCED2CurvePrice21": null,
+ "SCED2CurveMW22": null,
+ "SCED2CurvePrice22": null,
+ "SCED2CurveMW23": null,
+ "SCED2CurvePrice23": null,
+ "SCED2CurveMW24": null,
+ "SCED2CurvePrice24": null,
+ "SCED2CurveMW25": null,
+ "SCED2CurvePrice25": null,
+ "SCED2CurveMW26": null,
+ "SCED2CurvePrice26": null,
+ "SCED2CurveMW27": null,
+ "SCED2CurvePrice27": null,
+ "SCED2CurveMW28": null,
+ "SCED2CurvePrice28": null,
+ "SCED2CurveMW29": null,
+ "SCED2CurvePrice29": null,
+ "SCED2CurveMW30": null,
+ "SCED2CurvePrice30": null,
+ "SCED2CurveMW31": null,
+ "SCED2CurvePrice31": null,
+ "SCED2CurveMW32": null,
+ "SCED2CurvePrice32": null,
+ "SCED2CurveMW33": null,
+ "SCED2CurvePrice33": null,
+ "SCED2CurveMW34": null,
+ "SCED2CurvePrice34": null,
+ "SCED2CurveMW35": null,
+ "SCED2CurvePrice35": null,
+ "bidType": "3PT",
+ "submittedTPOMW1": null,
+ "submittedTPOPrice1": null,
+ "submittedTPOMW2": null,
+ "submittedTPOPrice2": null,
+ "submittedTPOMW3": null,
+ "submittedTPOPrice3": null,
+ "submittedTPOMW4": null,
+ "submittedTPOPrice4": null,
+ "submittedTPOMW5": null,
+ "submittedTPOPrice5": null,
+ "submittedTPOMW6": "6",
+ "submittedTPOPrice6": "500",
+ "submittedTPOMW7": "9.9",
+ "submittedTPOPrice7": "2000",
+ "submittedTPOMW8": null,
+ "submittedTPOPrice8": null,
+ "submittedTPOMW9": null,
+ "submittedTPOPrice9": null,
+ "submittedTPOMW10": null,
+ "submittedTPOPrice10": null,
+ "proxyExtension": "No"
+ },
+ "rows_decoded": 7501
+ },
+ {
+ "endpoint": "np3-987-ex/7d_trig_mcpc_50xfip",
+ "fixture": "np3-987-ex--7d_trig_mcpc_50xfip-history-event-dam.csv",
+ "file": "7day_Event_Trigger_DAM_MCPC_Exceeds_50XFIP-05-MAY-26.csv",
+ "folder": "history-event-dam",
+ "csv_rows": 248,
+ "first_row": {
+ "deliveryDate": "2026-04-28",
+ "hourEnding": 21,
+ "qseName": "QTEN26",
+ "dmeName": "YWINMI",
+ "resourceName": "AE_ESR1",
+ "FIPx50": "116.5",
+ "MCPC": "139.71",
+ "multiHourBlockFlag": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": null,
+ "price1RRSFFR": null,
+ "price1RRSUFR": null,
+ "price1ECRS": null,
+ "price1OFFEC": null,
+ "price1OnlineNONSPIN": "5000",
+ "price1REGUP": null,
+ "price1REGDOWN": null,
+ "price1OfflineNONSPIN": null,
+ "quantityMW1": "0.1",
+ "blockIndicator2": "V",
+ "price2RRSPFR": null,
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": null,
+ "price2OFFEC": null,
+ "price2OnlineNONSPIN": "5000",
+ "price2REGUP": null,
+ "price2REGDOWN": null,
+ "price2OfflineNONSPIN": null,
+ "quantityMW2": "0.2",
+ "blockIndicator3": "V",
+ "price3RRSPFR": null,
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": null,
+ "price3OFFEC": null,
+ "price3OnlineNONSPIN": "203.05",
+ "price3REGUP": null,
+ "price3REGDOWN": null,
+ "price3OfflineNONSPIN": null,
+ "quantityMW3": "2.3",
+ "blockIndicator4": "V",
+ "price4RRSPFR": null,
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": null,
+ "price4OFFEC": null,
+ "price4OnlineNONSPIN": "5000",
+ "price4REGUP": null,
+ "price4REGDOWN": null,
+ "price4OfflineNONSPIN": null,
+ "quantityMW4": "5",
+ "blockIndicator5": "V",
+ "price5RRSPFR": null,
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": null,
+ "price5OFFEC": null,
+ "price5OnlineNONSPIN": "5000",
+ "price5REGUP": null,
+ "price5REGDOWN": null,
+ "price5OfflineNONSPIN": null,
+ "quantityMW5": "8.9"
+ },
+ "rows_decoded": 248
+ },
+ {
+ "endpoint": "np3-987-ex/7d_trig_lmp_50xfip",
+ "fixture": "np3-987-ex--7d_trig_lmp_50xfip-history-event-rtm.csv",
+ "file": "7day_Event_Trigger_LMP_Exceeds_50XFIP-02-SEP-26.csv",
+ "folder": "history-event-rtm",
+ "csv_rows": 33239,
+ "first_row": {
+ "SCEDTimestamp": "2026-08-26T00:50:18",
+ "repeatHourFlag": false,
+ "resourceName": "KNAPP_ESR1",
+ "LMP": "126.278526306152",
+ "FIPx50": "118.25",
+ "SCED2CurveMW1": null,
+ "SCED2CurvePrice1": null,
+ "SCED2CurveMW2": null,
+ "SCED2CurvePrice2": null,
+ "SCED2CurveMW3": "0",
+ "SCED2CurvePrice3": "1999",
+ "SCED2CurveMW4": "10",
+ "SCED2CurvePrice4": "2000",
+ "SCED2CurveMW5": null,
+ "SCED2CurvePrice5": null,
+ "SCED2CurveMW6": null,
+ "SCED2CurvePrice6": null,
+ "SCED2CurveMW7": null,
+ "SCED2CurvePrice7": null,
+ "SCED2CurveMW8": null,
+ "SCED2CurvePrice8": null,
+ "SCED2CurveMW9": null,
+ "SCED2CurvePrice9": null,
+ "SCED2CurveMW10": null,
+ "SCED2CurvePrice10": null,
+ "SCED2CurveMW11": null,
+ "SCED2CurvePrice11": null,
+ "SCED2CurveMW12": null,
+ "SCED2CurvePrice12": null,
+ "SCED2CurveMW13": null,
+ "SCED2CurvePrice13": null,
+ "SCED2CurveMW14": null,
+ "SCED2CurvePrice14": null,
+ "SCED2CurveMW15": null,
+ "SCED2CurvePrice15": null,
+ "SCED2CurveMW16": null,
+ "SCED2CurvePrice16": null,
+ "SCED2CurveMW17": null,
+ "SCED2CurvePrice17": null,
+ "SCED2CurveMW18": null,
+ "SCED2CurvePrice18": null,
+ "SCED2CurveMW19": null,
+ "SCED2CurvePrice19": null,
+ "SCED2CurveMW20": null,
+ "SCED2CurvePrice20": null,
+ "SCED2CurveMW21": null,
+ "SCED2CurvePrice21": null,
+ "SCED2CurveMW22": null,
+ "SCED2CurvePrice22": null,
+ "SCED2CurveMW23": null,
+ "SCED2CurvePrice23": null,
+ "SCED2CurveMW24": null,
+ "SCED2CurvePrice24": null,
+ "SCED2CurveMW25": null,
+ "SCED2CurvePrice25": null,
+ "SCED2CurveMW26": null,
+ "SCED2CurvePrice26": null,
+ "SCED2CurveMW27": null,
+ "SCED2CurvePrice27": null,
+ "SCED2CurveMW28": null,
+ "SCED2CurvePrice28": null,
+ "SCED2CurveMW29": null,
+ "SCED2CurvePrice29": null,
+ "SCED2CurveMW30": null,
+ "SCED2CurvePrice30": null,
+ "SCED2CurveMW31": null,
+ "SCED2CurvePrice31": null,
+ "SCED2CurveMW32": null,
+ "SCED2CurvePrice32": null,
+ "SCED2CurveMW33": null,
+ "SCED2CurvePrice33": null,
+ "SCED2CurveMW34": null,
+ "SCED2CurvePrice34": null,
+ "SCED2CurveMW35": null,
+ "SCED2CurvePrice35": null,
+ "bidType": "3PT",
+ "submittedTPOMW1": null,
+ "submittedTPOPrice1": null,
+ "submittedTPOMW2": null,
+ "submittedTPOPrice2": null,
+ "submittedTPOMW3": "0",
+ "submittedTPOPrice3": "1999",
+ "submittedTPOMW4": "10",
+ "submittedTPOPrice4": "2000",
+ "submittedTPOMW5": null,
+ "submittedTPOPrice5": null,
+ "submittedTPOMW6": null,
+ "submittedTPOPrice6": null,
+ "submittedTPOMW7": null,
+ "submittedTPOPrice7": null,
+ "submittedTPOMW8": null,
+ "submittedTPOPrice8": null,
+ "submittedTPOMW9": null,
+ "submittedTPOPrice9": null,
+ "submittedTPOMW10": null,
+ "submittedTPOPrice10": null,
+ "proxyExtension": "No"
+ },
+ "rows_decoded": 33239
+ },
+ {
+ "endpoint": "np3-987-ex/7d_trig_rtm_mcpc_50xfip",
+ "fixture": "np3-987-ex--7d_trig_rtm_mcpc_50xfip-history-event-rtm.csv",
+ "file": "7day_Event_Trigger_RTM_MCPC_Exceeds_50XFIP-02-SEP-26.csv",
+ "folder": "history-event-rtm",
+ "csv_rows": 18050,
+ "first_row": {
+ "SCEDTimestamp": "2026-08-26T20:55:24",
+ "repeatHourFlag": false,
+ "resourceName": "AE_ESR1",
+ "FIPx50": "118.25",
+ "RTMCPC": "134.09",
+ "price1REGUP": null,
+ "price1REGDOWN": null,
+ "price1RRSPFR": null,
+ "price1RRSUFR": null,
+ "price1RRSFFR": null,
+ "price1NONSPIN": "2000",
+ "price1ECRS": null,
+ "quantityMW1": "0.1",
+ "price2REGUP": null,
+ "price2REGDOWN": null,
+ "price2RRSPFR": null,
+ "price2RRSUFR": null,
+ "price2RRSFFR": null,
+ "price2NONSPIN": null,
+ "price2ECRS": null,
+ "quantityMW2": null,
+ "price3REGUP": null,
+ "price3REGDOWN": null,
+ "price3RRSPFR": null,
+ "price3RRSUFR": null,
+ "price3RRSFFR": null,
+ "price3NONSPIN": "2000",
+ "price3ECRS": null,
+ "quantityMW3": "1.6",
+ "price4REGUP": null,
+ "price4REGDOWN": null,
+ "price4RRSPFR": null,
+ "price4RRSUFR": null,
+ "price4RRSFFR": null,
+ "price4NONSPIN": "2000",
+ "price4ECRS": null,
+ "quantityMW4": "3.4",
+ "price5REGUP": null,
+ "price5REGDOWN": null,
+ "price5RRSPFR": null,
+ "price5RRSUFR": null,
+ "price5RRSFFR": null,
+ "price5NONSPIN": "2000",
+ "price5ECRS": null,
+ "quantityMW5": "14.4"
+ },
+ "rows_decoded": 18050
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_gen_res_as_offer_awards",
+ "fixture": "np3-990-ex--60_sasm_gen_res_as_offer_awards-history-current.csv",
+ "file": "60d_SASM_Generation_Resource_AS_Offer_Awards-02-FEB-26.csv",
+ "folder": "history-current",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_load_res_as_offer_awards",
+ "fixture": "np3-990-ex--60_sasm_load_res_as_offer_awards-history-current.csv",
+ "file": "60d_SASM_Load_Resource_AS_Offer_Awards-02-FEB-26.csv",
+ "folder": "history-current",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_load_res_as_offers",
+ "fixture": "np3-990-ex--60_sasm_load_res_as_offers-history-current.csv",
+ "file": "60d_SASM_Load_Resource_AS_Offers-02-FEB-26.csv",
+ "folder": "history-current",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_gen_res_as_offers",
+ "fixture": "np3-990-ex--60_sasm_gen_res_as_offers-history-current.csv",
+ "file": "60d_SASM_Generation_Resource_AS_Offers-02-FEB-26.csv",
+ "folder": "history-current",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_gen_res_as_offers",
+ "fixture": "np3-990-ex--60_sasm_gen_res_as_offers-history-samples.csv",
+ "file": "60d_SASM_Generation_Resource_AS_Offers-12-DEC-18.csv",
+ "folder": "history-samples",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_load_res_as_offers",
+ "fixture": "np3-990-ex--60_sasm_load_res_as_offers-history-samples.csv",
+ "file": "60d_SASM_Load_Resource_AS_Offers-12-DEC-18.csv",
+ "folder": "history-samples",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_load_res_as_offer_awards",
+ "fixture": "np3-990-ex--60_sasm_load_res_as_offer_awards-history-samples.csv",
+ "file": "60d_SASM_Load_Resource_AS_Offer_Awards-12-DEC-18.csv",
+ "folder": "history-samples",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_gen_res_as_offer_awards",
+ "fixture": "np3-990-ex--60_sasm_gen_res_as_offer_awards-history-samples.csv",
+ "file": "60d_SASM_Generation_Resource_AS_Offer_Awards-12-DEC-18.csv",
+ "folder": "history-samples",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_gen_res_as_offer_awards",
+ "fixture": "np3-990-ex--60_sasm_gen_res_as_offer_awards-history-sasm-nonempty.csv",
+ "file": "60d_SASM_Generation_Resource_AS_Offer_Awards-26-JAN-26.csv",
+ "folder": "history-sasm-nonempty",
+ "csv_rows": 106,
+ "first_row": {
+ "SASMId": "2025-11-27T02:45:05",
+ "deliveryDate": "2025-11-27",
+ "hourEnding": 5,
+ "resourceName": "CROSSETT_BES1",
+ "resourceType": "PWRSTR",
+ "REGUPAawarded": null,
+ "REGUPMCPC": null,
+ "REGDNAwarded": null,
+ "REGDNMCPC": null,
+ "RRSPFRAwarded": "1.2",
+ "RRSFFRAwarded": null,
+ "RRSUFRAwarded": null,
+ "RRSMCPC": "10",
+ "ECRSSAwarded": null,
+ "OFFECAwarded": null,
+ "ECRSMCPC": null,
+ "NSPINAwarded": null,
+ "NSPINMCPC": null,
+ "RRSAwarded": null
+ },
+ "rows_decoded": 106
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_load_res_as_offer_awards",
+ "fixture": "np3-990-ex--60_sasm_load_res_as_offer_awards-history-sasm-nonempty.csv",
+ "file": "60d_SASM_Load_Resource_AS_Offer_Awards-26-JAN-26.csv",
+ "folder": "history-sasm-nonempty",
+ "csv_rows": 10,
+ "first_row": {
+ "SASMId": "2025-11-27T02:45:05",
+ "deliveryDate": "2025-11-27",
+ "hourEnding": 18,
+ "resourceName": "DOWGEN_LD7",
+ "resourceType": "NCLR",
+ "REGUPAawarded": null,
+ "REGUPMCPC": null,
+ "REGDNAwarded": null,
+ "REGDNMCPC": null,
+ "RRSPFRAwarded": null,
+ "RRSFFRAwarded": null,
+ "RRSUFRAwarded": "2",
+ "RRSMCPC": "33",
+ "ECRSMAwarded": null,
+ "ECRSSAwarded": null,
+ "ECRSMCPC": null,
+ "NSPINAwarded": null,
+ "NSPINMCPC": null,
+ "RRSAwarded": null
+ },
+ "rows_decoded": 10
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_load_res_as_offers",
+ "fixture": "np3-990-ex--60_sasm_load_res_as_offers-history-sasm-nonempty.csv",
+ "file": "60d_SASM_Load_Resource_AS_Offers-26-JAN-26.csv",
+ "folder": "history-sasm-nonempty",
+ "csv_rows": 302,
+ "first_row": {
+ "deliveryDate": "2025-11-27",
+ "SASMId": "2025-11-27T02:45:05",
+ "hourEnding": 1,
+ "qseName": "QSUE53",
+ "dmeName": "YPLUSP",
+ "resourceName": "ANEM_ESS_LD1",
+ "multiHourBlockFlag": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": null,
+ "price1RRSFFR": null,
+ "price1RRSUFR": null,
+ "price1ECRS": null,
+ "price1OFFEC": null,
+ "price1OnlineNONSPIN": null,
+ "price1REGUP": null,
+ "price1REGDOWN": "2450",
+ "price1OfflineNONSPIN": null,
+ "quantityMW1": "60",
+ "blockIndicator2": "V",
+ "price2RRSPFR": null,
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": null,
+ "price2OFFEC": null,
+ "price2OnlineNONSPIN": null,
+ "price2REGUP": null,
+ "price2REGDOWN": "3675",
+ "price2OfflineNONSPIN": null,
+ "quantityMW2": "50",
+ "blockIndicator3": "V",
+ "price3RRSPFR": null,
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": null,
+ "price3OFFEC": null,
+ "price3OnlineNONSPIN": null,
+ "price3REGUP": null,
+ "price3REGDOWN": "4900",
+ "price3OfflineNONSPIN": null,
+ "quantityMW3": "40",
+ "blockIndicator4": "V",
+ "price4RRSPFR": null,
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": null,
+ "price4OFFEC": null,
+ "price4OnlineNONSPIN": null,
+ "price4REGUP": null,
+ "price4REGDOWN": "5000",
+ "price4OfflineNONSPIN": null,
+ "quantityMW4": "30",
+ "blockIndicator5": "V",
+ "price5RRSPFR": null,
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": null,
+ "price5OFFEC": null,
+ "price5OnlineNONSPIN": null,
+ "price5REGUP": null,
+ "price5REGDOWN": "5000",
+ "price5OfflineNONSPIN": null,
+ "quantityMW5": "20",
+ "price1RRS": null,
+ "price2RRS": null,
+ "price3RRS": null,
+ "price4RRS": null,
+ "price5RRS": null
+ },
+ "rows_decoded": 302
+ },
+ {
+ "endpoint": "np3-990-ex/60_sasm_gen_res_as_offers",
+ "fixture": "np3-990-ex--60_sasm_gen_res_as_offers-history-sasm-nonempty.csv",
+ "file": "60d_SASM_Generation_Resource_AS_Offers-26-JAN-26.csv",
+ "folder": "history-sasm-nonempty",
+ "csv_rows": 962,
+ "first_row": {
+ "deliveryDate": "2025-11-27",
+ "SASMId": "2025-11-27T02:45:05",
+ "hourEnding": 1,
+ "qseName": "QSUE53",
+ "dmeName": "YPLUSP",
+ "resourceName": "ANEM_ESS_BESS1",
+ "multiHourBlockFlag": false,
+ "blockIndicator1": "V",
+ "price1RRSPFR": "5000",
+ "price1RRSFFR": null,
+ "price1RRSUFR": null,
+ "price1ECRS": "5000",
+ "price1OFFEC": null,
+ "price1OnlineNONSPIN": "5000",
+ "price1REGUP": "5000",
+ "price1REGDOWN": null,
+ "price1OfflineNONSPIN": null,
+ "quantityMW1": "20",
+ "blockIndicator2": "V",
+ "price2RRSPFR": "5000",
+ "price2RRSFFR": null,
+ "price2RRSUFR": null,
+ "price2ECRS": "5000",
+ "price2OFFEC": null,
+ "price2OnlineNONSPIN": "5000",
+ "price2REGUP": "5000",
+ "price2REGDOWN": null,
+ "price2OfflineNONSPIN": null,
+ "quantityMW2": "30",
+ "blockIndicator3": "V",
+ "price3RRSPFR": "2450",
+ "price3RRSFFR": null,
+ "price3RRSUFR": null,
+ "price3ECRS": "2450",
+ "price3OFFEC": null,
+ "price3OnlineNONSPIN": "2450",
+ "price3REGUP": "2450",
+ "price3REGDOWN": null,
+ "price3OfflineNONSPIN": null,
+ "quantityMW3": "50",
+ "blockIndicator4": "V",
+ "price4RRSPFR": "4900",
+ "price4RRSFFR": null,
+ "price4RRSUFR": null,
+ "price4ECRS": "4900",
+ "price4OFFEC": null,
+ "price4OnlineNONSPIN": "4900",
+ "price4REGUP": "4900",
+ "price4REGDOWN": null,
+ "price4OfflineNONSPIN": null,
+ "quantityMW4": "40",
+ "blockIndicator5": "V",
+ "price5RRSPFR": "1225",
+ "price5RRSFFR": null,
+ "price5RRSUFR": null,
+ "price5ECRS": "1225",
+ "price5OFFEC": null,
+ "price5OnlineNONSPIN": "1225",
+ "price5REGUP": "1225",
+ "price5REGDOWN": null,
+ "price5OfflineNONSPIN": null,
+ "quantityMW5": "60",
+ "price1RRS": null,
+ "price2RRS": null,
+ "price3RRS": null,
+ "price4RRS": null,
+ "price5RRS": null
+ },
+ "rows_decoded": 962
+ }
+]
diff --git a/tools/inputs/history/evidence.json b/tools/inputs/history/evidence.json
new file mode 100644
index 00000000..5019c21d
--- /dev/null
+++ b/tools/inputs/history/evidence.json
@@ -0,0 +1,198 @@
+[
+ {
+ "endpoint": "np4-190-cd/dam_stlmnt_pnt_prices",
+ "sample": "history-samples",
+ "file": "cdr.00012331.0000000000000000.20140501.125924.DAMSPNP4190.csv",
+ "rows_decoded": 13704,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "01:00",
+ "settlementPoint": "AMISTAD_ALL",
+ "settlementPointPrice": "29.92"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "24:00",
+ "settlementPoint": "WOO_WOODWRD2",
+ "settlementPointPrice": "33.48"
+ }
+ },
+ {
+ "endpoint": "np4-190-cd/dam_stlmnt_pnt_prices",
+ "sample": "history-current",
+ "file": "cdr.00012331.0000000000000000.20260906.123241.DAMSPNP4190.csv",
+ "rows_decoded": 26952,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "settlementPoint": "7RNCHSLR_ALL",
+ "settlementPointPrice": "45.04"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "24:00",
+ "settlementPoint": "ZIER_SLR_ALL",
+ "settlementPointPrice": "42.96"
+ }
+ },
+ {
+ "endpoint": "np6-905-cd/spp_node_zone_hub",
+ "sample": "history-samples",
+ "file": "cdr.00012301.0000000000000000.20140501.000205.SPPHLZNP6905_20140501_0000.csv",
+ "rows_decoded": 582,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2014-04-30",
+ "deliveryHour": 24,
+ "deliveryInterval": 4,
+ "settlementPoint": "AMISTAD_ALL",
+ "settlementPointPrice": "30.5",
+ "settlementPointType": "RN"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2014-04-30",
+ "deliveryHour": 24,
+ "deliveryInterval": 4,
+ "settlementPoint": "WOO_WOODWRD2",
+ "settlementPointPrice": "30.5",
+ "settlementPointType": "RN"
+ }
+ },
+ {
+ "endpoint": "np6-905-cd/spp_node_zone_hub",
+ "sample": "history-current",
+ "file": "cdr.00012301.0000000000000000.20260907.104701.SPPHLZNP6905_20260907_1045.csv",
+ "rows_decoded": 1135,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": 11,
+ "deliveryInterval": 3,
+ "settlementPoint": "7RNCHSLR_ALL",
+ "settlementPointPrice": "24.76",
+ "settlementPointType": "RN"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": 11,
+ "deliveryInterval": 3,
+ "settlementPoint": "ZIER_SLR_ALL",
+ "settlementPointPrice": "24.47",
+ "settlementPointType": "RN"
+ }
+ },
+ {
+ "endpoint": "np4-188-cd/dam_clear_price_for_cap",
+ "sample": "history-samples",
+ "file": "cdr.00012329.0000000000000000.20140501.125923.DAMCPCNP4188.csv",
+ "rows_decoded": 96,
+ "first_row": {
+ "DSTFlag": false,
+ "MCPC": "7.25",
+ "ancillaryType": "RRS",
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "01:00"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "MCPC": "4.42",
+ "ancillaryType": "NSPIN",
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "24:00"
+ }
+ },
+ {
+ "endpoint": "np4-188-cd/dam_clear_price_for_cap",
+ "sample": "history-current",
+ "file": "cdr.00012329.0000000000000000.20260906.123241.DAMCPCNP4188.csv",
+ "rows_decoded": 120,
+ "first_row": {
+ "DSTFlag": false,
+ "MCPC": "5.91",
+ "ancillaryType": "NSPIN",
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "MCPC": "1",
+ "ancillaryType": "REGDN",
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "24:00"
+ }
+ },
+ {
+ "endpoint": "np6-345-cd/act_sys_load_by_wzn",
+ "sample": "history-samples",
+ "file": "cdr.00013101.0000000000000000.20140501.055000.ACTUALSYSLOADWZNP6345.csv",
+ "rows_decoded": 24,
+ "first_row": {
+ "DSTFlag": false,
+ "coast": "8244.87",
+ "east": "1106.17",
+ "farWest": "1691.50",
+ "hourEnding": "01:00",
+ "north": "701.52",
+ "northC": "8254.29",
+ "operatingDay": "2014-04-30",
+ "southC": "4560.52",
+ "southern": "2479.81",
+ "total": "27934.84",
+ "west": "896.17"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "coast": "8475.31",
+ "east": "1157.06",
+ "farWest": "1707.65",
+ "hourEnding": "24:00",
+ "north": "718.80",
+ "northC": "8985.41",
+ "operatingDay": "2014-04-30",
+ "southC": "4808.23",
+ "southern": "2444.05",
+ "total": "29248.16",
+ "west": "951.65"
+ }
+ },
+ {
+ "endpoint": "np6-345-cd/act_sys_load_by_wzn",
+ "sample": "history-current",
+ "file": "cdr.00013101.0000000000000000.20260907.055000.ACTUALSYSLOADWZNP6345.csv",
+ "rows_decoded": 24,
+ "first_row": {
+ "DSTFlag": false,
+ "coast": "15364.16",
+ "east": "1909.48",
+ "farWest": "7714.55",
+ "hourEnding": "01:00",
+ "north": "1961.02",
+ "northC": "18981.63",
+ "operatingDay": "2026-09-06",
+ "southC": "11031.83",
+ "southern": "5214.50",
+ "total": "64360.71",
+ "west": "2183.53"
+ },
+ "last_row": {
+ "DSTFlag": false,
+ "coast": "15742.08",
+ "east": "2183.42",
+ "farWest": "7831.42",
+ "hourEnding": "24:00",
+ "north": "1982.45",
+ "northC": "20076.63",
+ "operatingDay": "2026-09-06",
+ "southC": "11107.31",
+ "southern": "5599.49",
+ "total": "66732.18",
+ "west": "2209.37"
+ }
+ }
+]
diff --git a/tools/inputs/history/forecasts-evidence.json b/tools/inputs/history/forecasts-evidence.json
new file mode 100644
index 00000000..4d06872d
--- /dev/null
+++ b/tools/inputs/history/forecasts-evidence.json
@@ -0,0 +1,240 @@
+[
+ {
+ "endpoint": "gen-55-cd/hrly_rt_load_fcast_actual",
+ "fixture": "gen-55-cd-history-current.csv",
+ "file": "cdr.00013499.0000000000000000.20260907.122000.HOURLYLFvsACTUALGEN55.csv",
+ "csv_rows": 48,
+ "first_row": {
+ "DSTFlag": false,
+ "actualLoad": "64360.71",
+ "currentDayFcast": "64907.8108",
+ "currentDayHSL": "87517.2",
+ "dayAheadFcast": "63314.2292",
+ "dayAheadHSL": "89854.7",
+ "deliveryDate": "2026-09-06",
+ "hourEnding": 1
+ },
+ "rows_decoded": 48
+ },
+ {
+ "endpoint": "gen-55-cd/hrly_rt_load_fcast_actual",
+ "fixture": "gen-55-cd-history-samples.csv",
+ "file": "cdr.00013499.0000000000000000.20151210.182000.HOURLYLFvsACTUALGEN55.csv",
+ "csv_rows": 72,
+ "first_row": {
+ "DSTFlag": false,
+ "actualLoad": "28376.64",
+ "currentDayFcast": "28464.0787",
+ "currentDayHSL": "38609.3",
+ "dayAheadFcast": "28079.7598",
+ "dayAheadHSL": "38909.7",
+ "deliveryDate": "2015-12-09",
+ "hourEnding": 1
+ },
+ "rows_decoded": 72
+ },
+ {
+ "endpoint": "np3-560-cd/7d_load_fcast_by_fzn",
+ "fixture": "np3-560-cd-history-current.csv",
+ "file": "cdr.00012311.0000000000000000.20260907.113000.LFCCONGESTNP3560.csv",
+ "csv_rows": 192,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "1:00",
+ "north": "22122.619443518067837",
+ "south": "17020.729026806640625",
+ "west": "10014.988855944825288",
+ "houston": "14624.82368447265625",
+ "systemTotal": "63783.16101074219",
+ "DSTFlag": false
+ },
+ "rows_decoded": 192
+ },
+ {
+ "endpoint": "np3-560-cd/7d_load_fcast_by_fzn",
+ "fixture": "np3-560-cd-history-samples.csv",
+ "file": "cdr.00012311.0000000000000000.20190101.003000.LFCCONGESTNP3560.csv",
+ "csv_rows": 192,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2019-01-01",
+ "hourEnding": "1:00",
+ "north": "13164.23181750488554",
+ "south": "10072.271223266608298",
+ "west": "4484.003995947268662",
+ "houston": "9231.9860052734375",
+ "systemTotal": "36952.4930419922",
+ "DSTFlag": false
+ },
+ "rows_decoded": 192
+ },
+ {
+ "endpoint": "np3-561-cd/7d_load_fcast_by_wzn",
+ "fixture": "np3-561-cd-history-current.csv",
+ "file": "cdr.00012312.0000000000000000.20260907.113000.LFCWEATHERNP3561.csv",
+ "csv_rows": 192,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "1:00",
+ "coast": "15153.1943",
+ "east": "2058.1025",
+ "farWest": "7683.0674",
+ "north": "1892.4691",
+ "northCentral": "19082.3848",
+ "southCentral": "10498.6553",
+ "southern": "5282.5381",
+ "west": "2132.7495",
+ "systemTotal": "63783.161",
+ "DSTFlag": false
+ },
+ "rows_decoded": 192
+ },
+ {
+ "endpoint": "np3-561-cd/7d_load_fcast_by_wzn",
+ "fixture": "np3-561-cd-history-samples.csv",
+ "file": "cdr.00012312.0000000000000000.20190101.003000.LFCWEATHERNP3561.csv",
+ "csv_rows": 192,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2019-01-01",
+ "hourEnding": "1:00",
+ "coast": "9566.0996",
+ "east": "1414.37",
+ "farWest": "2954.29",
+ "north": "942.583",
+ "northCentral": "11252.9004",
+ "southCentral": "6163.46",
+ "southern": "3024.51",
+ "west": "1634.28",
+ "systemTotal": "36952.493",
+ "DSTFlag": false
+ },
+ "rows_decoded": 192
+ },
+ {
+ "endpoint": "np3-562-cd/ih_load_fcast_by_wzn",
+ "fixture": "np3-562-cd-history-current.csv",
+ "file": "cdr.00016553.0000000000000000.20260907.122700.INTRAHRLOADFCASTNP3562.csv",
+ "csv_rows": 48,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-09-07T12:30:00",
+ "coast": "19700.279296875",
+ "east": "2558.06982421875",
+ "farWest": "8089.20166015625",
+ "north": "2374.83154296875",
+ "northCentral": "24508.83984375",
+ "southCentral": "13110.443359375",
+ "southern": "6365.06103515625",
+ "west": "2520.98071289062",
+ "systemTotal": "79227.7109375",
+ "model": "A6",
+ "inUseFlag": false,
+ "DSTFlag": false
+ },
+ "rows_decoded": 48
+ },
+ {
+ "endpoint": "np3-562-cd/ih_load_fcast_by_wzn",
+ "fixture": "np3-562-cd-history-samples.csv",
+ "file": "cdr.00016553.0000000000000000.20260326.114200.INTRAHRLOADFCASTNP3562.csv",
+ "csv_rows": 48,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-03-26T11:45:00",
+ "coast": "14440.2001953125",
+ "east": "1592.41003417969",
+ "farWest": "7492.72021484375",
+ "north": "2101.72998046875",
+ "northCentral": "14991.2998046875",
+ "southCentral": "8430.83984375",
+ "southern": "4567.33984375",
+ "west": "1421.42004394531",
+ "systemTotal": "55037.9609375",
+ "model": "E",
+ "inUseFlag": true,
+ "DSTFlag": false
+ },
+ "rows_decoded": 48
+ },
+ {
+ "endpoint": "np3-565-cd/lf_by_model_weather_zone",
+ "fixture": "np3-565-cd-history-current.csv",
+ "file": "cdr.00014837.0000000000000000.20260907.113000.LFMODWEATHERNP3565.csv",
+ "csv_rows": 1536,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "1:00",
+ "coast": "15084.543",
+ "east": "2044.0164",
+ "farWest": "7845.854",
+ "north": "1883.9669",
+ "northCentral": "18833.4199",
+ "southCentral": "10348.3779",
+ "southern": "5255.5454",
+ "west": "2072.2061",
+ "systemTotal": "63367.9296",
+ "model": "A3",
+ "inUseFlag": false,
+ "DSTFlag": false
+ },
+ "rows_decoded": 1536
+ },
+ {
+ "endpoint": "np3-565-cd/lf_by_model_weather_zone",
+ "fixture": "np3-565-cd-history-samples.csv",
+ "file": "cdr.00014837.0000000000000000.20170629.113002.LFMODWEATHERNP3565.csv",
+ "csv_rows": 1152,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2017-06-29",
+ "hourEnding": "1:00",
+ "coast": "12042.5664",
+ "east": "1585.0483",
+ "farWest": "2329.0618",
+ "north": "996.0685",
+ "northCentral": "13191.9385",
+ "southCentral": "7140.873",
+ "southern": "3232.8601",
+ "west": "1461.603",
+ "systemTotal": "41980.0196",
+ "model": "A3",
+ "inUseFlag": false,
+ "DSTFlag": false
+ },
+ "rows_decoded": 1152
+ },
+ {
+ "endpoint": "np3-566-cd/lf_by_model_study_area",
+ "fixture": "np3-566-cd-history-current.csv",
+ "file": "cdr.00015953.0000000000000000.20260907.113000.LFMODSTUDYAREA3566.csv",
+ "csv_rows": 768,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "1:00",
+ "valley": "1781.154",
+ "model": "E",
+ "DSTFlag": false
+ },
+ "rows_decoded": 768
+ },
+ {
+ "endpoint": "np3-566-cd/lf_by_model_study_area",
+ "fixture": "np3-566-cd-history-samples.csv",
+ "file": "cdr.00015953.0000000000000000.20190207.173000.LFMODSTUDYAREA3566.csv",
+ "csv_rows": 768,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2019-02-07",
+ "hourEnding": "1:00",
+ "valley": "962.75",
+ "model": "E",
+ "DSTFlag": false
+ },
+ "rows_decoded": 768
+ }
+]
diff --git a/tools/inputs/history/fuel-mix-originals.zip b/tools/inputs/history/fuel-mix-originals.zip
new file mode 100644
index 00000000..cf2792b9
Binary files /dev/null and b/tools/inputs/history/fuel-mix-originals.zip differ
diff --git a/tools/inputs/history/fuel-paths-evidence.json b/tools/inputs/history/fuel-paths-evidence.json
new file mode 100644
index 00000000..e39aff01
--- /dev/null
+++ b/tools/inputs/history/fuel-paths-evidence.json
@@ -0,0 +1,66 @@
+[
+ {
+ "endpoint": "np4-494-er/fuel_cost_submissions",
+ "file": "1271630534.rpt.00024276.0000000000000000.20260907.090038.ExceptionalFuelCost_090626.xlsx",
+ "fixture": "np4-494-er-history-current.xlsx",
+ "source_folder": "history-current",
+ "rows": 27,
+ "rows_decoded": 27,
+ "first_row": {
+ "sourceSheet": "Exceptional Fuel Cost Data",
+ "deliveryDate": "2026-09-06",
+ "deliveryHour": 1,
+ "resourceCount": 2
+ }
+ },
+ {
+ "endpoint": "np7-535-sg/path_adders",
+ "file": "OCT2026_MonthlyPathSpecificAdders.CSV",
+ "fixture": "np7-535-sg-history-current.csv",
+ "source_folder": "history-current",
+ "rows": 9708,
+ "rows_decoded": 9708,
+ "first_row": {
+ "targetDate": "2026-09-01",
+ "source": "INDNENR_2_RN",
+ "sink": "MAVCRK_W_ALL",
+ "timeOfUse": "PeakWE",
+ "startDate": "2026-10-01",
+ "ACI99": "-25.0135",
+ "ACP": "-13.8052"
+ },
+ "xml_rows_compared": 9708
+ },
+ {
+ "endpoint": "np4-494-er/fuel_cost_submissions",
+ "file": "1171555991.rpt.00024276.0000000000000000.20251215.090039150.ExceptionalFuelCost_121425.xlsx",
+ "fixture": "np4-494-er-history-samples.xlsx",
+ "source_folder": "history-samples",
+ "rows": 16,
+ "rows_decoded": 16,
+ "first_row": {
+ "sourceSheet": "Exceptional Fuel Cost Data",
+ "deliveryDate": "2025-12-14",
+ "deliveryHour": 12,
+ "resourceCount": 2
+ }
+ },
+ {
+ "endpoint": "np7-535-sg/path_adders",
+ "file": "MAY2026_MonthlyPathSpecificAdders.CSV",
+ "fixture": "np7-535-sg-history-samples.csv",
+ "source_folder": "history-samples",
+ "rows": 9482,
+ "rows_decoded": 9482,
+ "first_row": {
+ "targetDate": "2026-04-01",
+ "source": "HHOLLW4_WND1",
+ "sink": "CHISMGRD_RN",
+ "timeOfUse": "Off-peak",
+ "startDate": "2026-05-01",
+ "ACI99": "-2.9138",
+ "ACP": "-1.0881"
+ },
+ "xml_rows_compared": 9482
+ }
+]
diff --git a/tools/inputs/history/gen-55-cd-history-current.csv b/tools/inputs/history/gen-55-cd-history-current.csv
new file mode 100644
index 00000000..d9f51db7
--- /dev/null
+++ b/tools/inputs/history/gen-55-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,CurrentDayForecast,DayAheadForecast,ActualLoad,DayAheadHSL,CurrentDayHSL,DSTFlag
+09/06/2026,1,64907.8108,63314.2292,64360.71,89854.7,87517.2,N
+09/06/2026,2,62386.7998,60729.5787,61650.78,88480.5,86076.7,N
+09/06/2026,3,60178.5488,58756.3202,59677.71,87145.1,84690.5,N
diff --git a/tools/inputs/history/gen-55-cd-history-samples.csv b/tools/inputs/history/gen-55-cd-history-samples.csv
new file mode 100644
index 00000000..870f3bb8
--- /dev/null
+++ b/tools/inputs/history/gen-55-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,CurrentDayForecast,DayAheadForecast,ActualLoad,DayAheadHSL,CurrentDayHSL,DSTFlag
+12/09/2015,1,28464.0787,28079.7598,28376.64,38909.7,38609.3,N
+12/09/2015,2,27562.8936,27720.496,27620.77,38602.4,38600,N
+12/09/2015,3,27368.511,27162.8803,27441.93,38558,38872.3,N
diff --git a/tools/inputs/history/highest-evidence.json b/tools/inputs/history/highest-evidence.json
new file mode 100644
index 00000000..ea066211
--- /dev/null
+++ b/tools/inputs/history/highest-evidence.json
@@ -0,0 +1,130 @@
+[
+ {
+ "endpoint": "np3-257-ex/3d_high_price_bids_sel_disp_sced",
+ "fixture": "np3-257-ex-history-current.csv",
+ "file": "3d_Highest_Price_Bids_Selected_Dispatched_in_SCED-07-SEP-26.csv",
+ "csv_rows": 300,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-04T00:00:19",
+ "repeatedHourFlag": false,
+ "qseName": "QBASTX",
+ "dmeName": "YBASTX",
+ "loadResource": "MIDNT_ALD1",
+ "highestPriceDispatched": "23.75",
+ "proxyExtension": "No",
+ "batchId": null
+ },
+ "rows_decoded": 300
+ },
+ {
+ "endpoint": "np3-257-ex/3d_high_price_bids_sel_disp_sced",
+ "fixture": "np3-257-ex-history-samples.csv",
+ "file": "48h_Highest_Price_Bids_Selected_Dispatched_in_SCED-01-JAN-19.csv",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-914-ex/3d_sced_high_as_offers",
+ "fixture": "np3-914-ex-history-current.csv",
+ "file": "3d_SCED_Highest_Price_AS_Offer_Selected-07-SEP-26.csv",
+ "csv_rows": 68547,
+ "first_row": {
+ "ASType": "ECRS",
+ "SCEDTimestamp": "2026-09-04T00:00:19",
+ "dmeName": "YSUEZ",
+ "price": "0.02",
+ "qseName": "QSUE74",
+ "quantity": "0.7",
+ "resourceName": "ALVIN_ESR1"
+ },
+ "rows_decoded": 68547
+ },
+ {
+ "endpoint": "np3-914-ex/3d_sced_high_as_offers",
+ "fixture": "np3-914-ex-history-samples.csv",
+ "file": "3d_SCED_Highest_Price_AS_Offer_Selected-08-DEC-25.csv",
+ "csv_rows": 17293,
+ "first_row": {
+ "ASType": "ECRS",
+ "SCEDTimestamp": "2025-12-05T00:00:19",
+ "dmeName": "YCPS",
+ "price": "0.13",
+ "qseName": "QCPSE",
+ "quantity": "30",
+ "resourceName": "CALAVERS_JKS2"
+ },
+ "rows_decoded": 17293
+ },
+ {
+ "endpoint": "np3-915-ex/3d_dam_high_as_offers",
+ "fixture": "np3-915-ex-history-current.csv",
+ "file": "3d_DAM_Highest_Price_AS_Offer_Selected-07-SEP-26.csv",
+ "csv_rows": 1338,
+ "first_row": {
+ "deliveryDate": "2026-09-04",
+ "hourEnding": 1,
+ "qseName": "QHABIT",
+ "dmeName": "YGLIDE",
+ "resourceName": "WCOLLOCL_ESR1",
+ "ASType": "ECRS",
+ "blockIndicator": "V",
+ "quantity": "2.2",
+ "price": "0.25"
+ },
+ "rows_decoded": 1338
+ },
+ {
+ "endpoint": "np3-915-ex/3d_dam_high_as_offers",
+ "fixture": "np3-915-ex-history-samples.csv",
+ "file": "2day_Highest_Price_AS_Offer_Selected-12-MAR-14.csv",
+ "csv_rows": 205,
+ "first_row": {
+ "deliveryDate": "2014-03-09",
+ "hourEnding": 1,
+ "qseName": null,
+ "dmeName": null,
+ "resourceName": "HENNE_LD1",
+ "ASType": "RRS",
+ "blockIndicator": "V",
+ "quantity": "8",
+ "price": "24.7"
+ },
+ "rows_decoded": 205
+ },
+ {
+ "endpoint": "np3-916-ex/3d_highest_price_offer_sced",
+ "fixture": "np3-916-ex-history-current.csv",
+ "file": "3d_Highest_Price_Offered_SCED-07-SEP-26.csv",
+ "csv_rows": 41197,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-04T00:00:19",
+ "repeatedHourFlag": false,
+ "LMP": "26.6393718719482",
+ "qseName": "QBEEP1",
+ "dmeName": "YBEEPR",
+ "resourceName": "HOLCOMB_ESR1",
+ "proxyExtension": "No",
+ "penaltyFlag": "No",
+ "batchId": null
+ },
+ "rows_decoded": 41197
+ },
+ {
+ "endpoint": "np3-916-ex/3d_highest_price_offer_sced",
+ "fixture": "np3-916-ex-history-samples.csv",
+ "file": "48h_Highest_Price_Offered_SCED-01-JAN-19.csv",
+ "csv_rows": 845,
+ "first_row": {
+ "SCEDTimestamp": "2018-12-29T00:00:19",
+ "repeatedHourFlag": false,
+ "LMP": "238.545806884766",
+ "qseName": null,
+ "dmeName": null,
+ "resourceName": "PB2SES_CT5",
+ "proxyExtension": "Yes",
+ "penaltyFlag": "No",
+ "batchId": "5379175"
+ },
+ "rows_decoded": 845
+ }
+]
diff --git a/tools/inputs/history/hourly-load-2002.zip b/tools/inputs/history/hourly-load-2002.zip
new file mode 100644
index 00000000..20cd8ba5
Binary files /dev/null and b/tools/inputs/history/hourly-load-2002.zip differ
diff --git a/tools/inputs/history/hourly-load-2016.zip b/tools/inputs/history/hourly-load-2016.zip
new file mode 100644
index 00000000..51857c61
Binary files /dev/null and b/tools/inputs/history/hourly-load-2016.zip differ
diff --git a/tools/inputs/history/hourly-load-2022.zip b/tools/inputs/history/hourly-load-2022.zip
new file mode 100644
index 00000000..29b75207
Binary files /dev/null and b/tools/inputs/history/hourly-load-2022.zip differ
diff --git a/tools/inputs/history/integration-pdf-evidence.json b/tools/inputs/history/integration-pdf-evidence.json
new file mode 100644
index 00000000..b83c4841
--- /dev/null
+++ b/tools/inputs/history/integration-pdf-evidence.json
@@ -0,0 +1,230 @@
+[
+ {
+ "sample": "history-samples",
+ "zipSha256": "4d1b1538548ee923145057965cfc59724a78e2e876e1a87d1c45ded88f20ec8e",
+ "pdfMembers": [
+ {
+ "name": "963449156.rpt.00023794.0000000000000000.20231206.080221290.ESRIntegrationReport 12-05-23.pdf",
+ "sha256": "0ef80712cb83a13d67285a58d7154139c70cec390ade961f9f5532fd5005203c"
+ }
+ ],
+ "tables": {
+ "daily_values": [
+ {
+ "reportDate": "2023-12-05",
+ "installedDischargeCapacityMW": "5038",
+ "totalDischargeCapacityMW": "7046",
+ "installedChargeCapacityMW": "7024",
+ "totalChargeCapacityMW": "7024",
+ "peakLoadMW": "49649",
+ "peakLoadHourEnding": 8,
+ "dischargeAtPeakLoadMW": "430",
+ "chargeAtPeakLoadMW": "131",
+ "netOutputAtPeakLoadMW": "299",
+ "maxDischargeMW": "884",
+ "maxDischargeTime": "06:36:00",
+ "penetrationAtMaxDischargePercent": "1.80",
+ "maxChargeMW": "616",
+ "maxChargeTime": "11:45:00",
+ "penetrationAtMaxChargePercent": "1.36",
+ "maxDischargePenetrationPercent": "1.80",
+ "maxDischargePenetrationTime": "06:36:00",
+ "dischargeAtMaxPenetrationMW": "884",
+ "maxChargePenetrationPercent": "1.36",
+ "maxChargePenetrationTime": "11:45:00",
+ "chargeAtMaxPenetrationMW": "616",
+ "sourceNotes": "* Sum of maximum capacity (i.e. seasonal max. reasonability limit in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model and are commercially operable (estimated based on commercial operations date in RIOO). ** Sum of maximum capacity (i.e. seasonal max. reasonability limit in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model. + Sum of maximum capacity (i.e. max. power consumption in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model and are commercially operable (estimated based on commercial operations date in RIOO). ++ Sum of maximum capacity (i.e. max. power consumption in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model. ^ ESR Net Charge/Discharge = Total Discharging from ESR generators - Total Charging from ESR CLRs. Positive represents Net Discharge; negative represents Net Charge. Note that generation, generation record, and generator capacity values in following pages of this report are based on units modeled in ERCOT\u2019s network operations model."
+ }
+ ],
+ "power_records": [],
+ "penetration_records": [],
+ "soc_records": []
+ }
+ },
+ {
+ "sample": "history-current",
+ "zipSha256": "b27740746d092aa3fa78014913f48a3ba92ab9f35aeb81be0f84e8a694ff9d97",
+ "pdfMembers": [
+ {
+ "name": "1271634350.rpt.00023794.0000000000000000.20260907.091110.ESRIntegrationReport 09-06-26.pdf",
+ "sha256": "cc487e168177681f6fa35d67e1db2e76b98f38cf39eb7099ef4354d25b099c53"
+ }
+ ],
+ "tables": {
+ "daily_values": [
+ {
+ "reportDate": "2026-09-06",
+ "installedDischargeCapacityMW": "22024",
+ "totalDischargeCapacityMW": "22536",
+ "installedChargeCapacityMW": "21866",
+ "totalChargeCapacityMW": "22376",
+ "peakLoadMW": "82270",
+ "peakLoadHourEnding": 18,
+ "dischargeAtPeakLoadMW": "283",
+ "chargeAtPeakLoadMW": "210",
+ "netOutputAtPeakLoadMW": "73",
+ "maxDischargeMW": "10838",
+ "maxDischargeTime": "19:54:00",
+ "penetrationAtMaxDischargePercent": "13.98",
+ "maxChargeMW": "10241",
+ "maxChargeTime": "09:24:00",
+ "penetrationAtMaxChargePercent": "16.35",
+ "maxDischargePenetrationPercent": "13.98",
+ "maxDischargePenetrationTime": "19:54:00",
+ "dischargeAtMaxPenetrationMW": "10838",
+ "maxChargePenetrationPercent": "16.35",
+ "maxChargePenetrationTime": "09:24:00",
+ "chargeAtMaxPenetrationMW": "10241",
+ "sourceNotes": "* Sum of maximum discharge capacity (i.e. seasonal net max. sustainable rating in RIOO) of all ESRs modeled in ERCOT\u2019s network operations model and are commercially operable (estimated based on Commercial Operations Date in RIOO). ** Sum of maximum discharge capacity (i.e. seasonal net max. sustainable rating in RIOO) of all ESRs modeled in ERCOT\u2019s network operations model. + Sum of maximum charge capacity (i.e. maximum point of delivery total load in RIOO) of all ESRs that are modeled in ERCOT's network operations model and are commercially operable (estimated based on Commercial Operations Date in RIOO). ++ Sum of maximum charge capacity (i.e. maximum point of delivery total load in RIOO) of all ESRs that are modeled in ERCOT's network operations model. ^ ESR Net Charge/Discharge = ESR Net output (positive represents Net Discharge; negative represents Net Charge). Note that generation, generation record, and generator capacity values in following pages of this report are based on units modeled in ERCOT\u2019s network operations model."
+ }
+ ],
+ "power_records": [
+ {
+ "reportDate": "2026-09-06",
+ "category": "ESR Discharge Generation",
+ "recordMW": "13300",
+ "recordTime": "2026-08-23T19:45:00",
+ "penetrationPercent": "15.35",
+ "maxSocPercent": "79.61",
+ "minSocPercent": "45.49"
+ },
+ {
+ "reportDate": "2026-09-06",
+ "category": "ESR Charge Load",
+ "recordMW": "11576",
+ "recordTime": "2026-08-30T09:29:00",
+ "penetrationPercent": "18.15",
+ "maxSocPercent": "54.66",
+ "minSocPercent": "26.59"
+ },
+ {
+ "reportDate": "2026-09-06",
+ "category": "ESR Injection",
+ "recordMW": "13268",
+ "recordTime": "2026-08-23T19:45:00",
+ "penetrationPercent": "15.31",
+ "maxSocPercent": "79.61",
+ "minSocPercent": "45.49"
+ }
+ ],
+ "penetration_records": [
+ {
+ "reportDate": "2026-09-06",
+ "category": "ESR Discharge Generation",
+ "penetrationPercent": "20.61",
+ "recordTime": "2026-03-13T19:31:00",
+ "recordMW": "10514",
+ "maxSocPercent": "75.87",
+ "minSocPercent": "41.76"
+ },
+ {
+ "reportDate": "2026-09-06",
+ "category": "ESR Charge Load",
+ "penetrationPercent": "18.15",
+ "recordTime": "2026-08-30T09:29:00",
+ "recordMW": "11564",
+ "maxSocPercent": "54.66",
+ "minSocPercent": "26.59"
+ }
+ ],
+ "soc_records": [
+ {
+ "reportDate": "2026-09-06",
+ "category": "ESR SOC Hourly Increase",
+ "recordMWh": "9946",
+ "recordTime": "2026-08-30T10:04:00"
+ },
+ {
+ "reportDate": "2026-09-06",
+ "category": "ESR SOC Hourly Decrease",
+ "recordMWh": "12934",
+ "recordTime": "2026-08-23T20:17:00"
+ }
+ ]
+ }
+ },
+ {
+ "sample": "integration-pdf-2024-09-07",
+ "zipSha256": "6f0c3a0333b2c5bea5d7c0a6a2de77367220a5924fc9bac21c9e176d39cb1e25",
+ "pdfMembers": [
+ {
+ "name": "1034094117.rpt.00023794.0000000000000000.20240907.080202413.ESRIntegrationReport 09-06-24.pdf",
+ "sha256": "080fe5aa9be73f0612a4ab92a2c0587ed9962c7bee084add5f457833a6a06bf6"
+ }
+ ],
+ "tables": {
+ "daily_values": [
+ {
+ "reportDate": "2024-09-06",
+ "installedDischargeCapacityMW": "8589",
+ "totalDischargeCapacityMW": "10044",
+ "installedChargeCapacityMW": "9971",
+ "totalChargeCapacityMW": "9971",
+ "peakLoadMW": "65780",
+ "peakLoadHourEnding": 15,
+ "dischargeAtPeakLoadMW": "169",
+ "chargeAtPeakLoadMW": "354",
+ "netOutputAtPeakLoadMW": "-185",
+ "maxDischargeMW": "2190",
+ "maxDischargeTime": "19:29:00",
+ "penetrationAtMaxDischargePercent": "3.54",
+ "maxChargeMW": "1520",
+ "maxChargeTime": "09:10:00",
+ "penetrationAtMaxChargePercent": "2.76",
+ "maxDischargePenetrationPercent": "3.55",
+ "maxDischargePenetrationTime": "19:29:00",
+ "dischargeAtMaxPenetrationMW": "2190",
+ "maxChargePenetrationPercent": "2.76",
+ "maxChargePenetrationTime": "09:10:00",
+ "chargeAtMaxPenetrationMW": "1520",
+ "sourceNotes": "* Sum of maximum capacity (i.e. seasonal net max. sustainable rating in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model and are commercially operable (estimated based on Commercial Operations Date in RIOO). ** Sum of maximum capacity (i.e. seasonal net max. sustainable rating in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model. + Sum of maximum capacity (i.e. maximum point of delivery total load in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model and are commercially operable (estimated based on Commercial Operations Date in RIOO). ++ Sum of maximum capacity (i.e. maximum point of delivery total load in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model. ^ ESR Net Charge/Discharge = Total Discharging from ESR generators - Total Charging from ESR CLRs. Positive represents Net Discharge; negative represents Net Charge. Note that generation, generation record, and generator capacity values in following pages of this report are based on units modeled in ERCOT\u2019s network operations model."
+ }
+ ],
+ "power_records": [],
+ "penetration_records": [],
+ "soc_records": []
+ }
+ },
+ {
+ "sample": "integration-pdf-2025-09-07",
+ "zipSha256": "2e6a19cdb0dfed1b41c76d54120bbb7cd078ffcc4628cb6000784d74d3c9bdb2",
+ "pdfMembers": [
+ {
+ "name": "1137977183.rpt.00023794.0000000000000000.20250907.080147.ESRIntegrationReport 09-06-25.pdf",
+ "sha256": "34dbb5358185d7aae2b10f081be392719e0a3aeddb19518d80c2d162ccde2132"
+ }
+ ],
+ "tables": {
+ "daily_values": [
+ {
+ "reportDate": "2025-09-06",
+ "installedDischargeCapacityMW": "15008",
+ "totalDischargeCapacityMW": "17298",
+ "installedChargeCapacityMW": "15061",
+ "totalChargeCapacityMW": "17187",
+ "peakLoadMW": "65848",
+ "peakLoadHourEnding": 17,
+ "dischargeAtPeakLoadMW": "604",
+ "chargeAtPeakLoadMW": "209",
+ "netOutputAtPeakLoadMW": "396",
+ "maxDischargeMW": "4915",
+ "maxDischargeTime": "19:45:00",
+ "penetrationAtMaxDischargePercent": "7.89",
+ "maxChargeMW": "2940",
+ "maxChargeTime": "11:19:00",
+ "penetrationAtMaxChargePercent": "4.70",
+ "maxDischargePenetrationPercent": "7.90",
+ "maxDischargePenetrationTime": "19:45:00",
+ "dischargeAtMaxPenetrationMW": "4915",
+ "maxChargePenetrationPercent": "4.70",
+ "maxChargePenetrationTime": "11:18:00",
+ "chargeAtMaxPenetrationMW": "2940",
+ "sourceNotes": "* Sum of maximum capacity (i.e. seasonal net max. sustainable rating in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model and are commercially operable (estimated based on Commercial Operations Date in RIOO). ** Sum of maximum capacity (i.e. seasonal net max. sustainable rating in RIOO) of all ESR generators modeled in ERCOT\u2019s network operations model. + Sum of maximum capacity (i.e. maximum point of delivery total load in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model and are commercially operable (estimated based on Commercial Operations Date in RIOO). ++ Sum of maximum capacity (i.e. maximum point of delivery total load in RIOO) of all ESR CLRs that are modeled in ERCOT's network operations model. ^ ESR Net Charge/Discharge = Total Discharging from ESR generators - Total Charging from ESR CLRs. Positive represents Net Discharge; negative represents Net Charge. Note that generation, generation record, and generator capacity values in following pages of this report are based on units modeled in ERCOT\u2019s network operations model."
+ }
+ ],
+ "power_records": [],
+ "penetration_records": [],
+ "soc_records": []
+ }
+ }
+]
diff --git a/tools/inputs/history/intermediate-full-file-evidence.json b/tools/inputs/history/intermediate-full-file-evidence.json
new file mode 100644
index 00000000..9640992a
--- /dev/null
+++ b/tools/inputs/history/intermediate-full-file-evidence.json
@@ -0,0 +1,85 @@
+{
+ "checkedAt": "2026-09-08T13:51:56.361521+00:00",
+ "decoderCommit": "e922b11df888971f097531cbb6deb0f7862916fe",
+ "scope": "Complete saved intermediate/annual CSV samples previously covered only by the cross-product header/first-three-row audit. Every source row is decoded through the concrete generated history reader; row counts are cross-checked with csv.DictReader. This is not every retained publication and is not an independent numerical-value comparison. No network or credentials used.",
+ "auditEntries": 228,
+ "reusedEntries": 7,
+ "files": 221,
+ "rowsDecoded": 28881274,
+ "products": [
+ "np3-560-cd",
+ "np3-908-er",
+ "np3-911-er",
+ "np3-965-er",
+ "np3-966-er",
+ "np3-991-ex",
+ "np4-732-cd",
+ "np4-745-cd"
+ ],
+ "readers": 92,
+ "manifest": "intermediate-full-files.csv",
+ "manifestSha256": "caa8fd574df1ba08e9519a2e42c525c142e955499d24a37c8a51651ff8553e9e",
+ "decoderHashes": {
+ "tinyercot/_history.py": "9ff9e1243e35ca6a65f4e990bdd8d3e0568043f4590c101b67e8d32d69cf499e",
+ "tinyercot/_generated.py": "4add31219447d92ec33bf16f4096a6745799d61c36b272ab2edba095e0c836c2",
+ "tools/inputs/history-formats.json": "2566844e8cebcc6b40d42813d32074d474fbd2319742457a49684e1dba66a53e"
+ },
+ "existingOldestCurrentReceipts": {
+ "files": 433,
+ "scope": "Each reader/member identity in the oldest/current member audit matches an existing per-product complete-file rows_decoded receipt. Those passing files were not decoded again in this run."
+ },
+ "annualPriceSourcesExcludedByNoMisScope": [
+ {
+ "product": "np4-181-er",
+ "url": "https://www.ercot.com/mp/data-products/data-product-details?id=NP4-181-ER",
+ "productPageSha256": "dce272976ea74a90f8a1fd0552a3b7fae042f0098bab3630a7b6a57b5e3eab36",
+ "archiveSystem": "ICE",
+ "reportTypeId": "13091",
+ "routes": [
+ {
+ "type_s": "ICE Data Product",
+ "url_s": "13091",
+ "dataClassification_s": "Public",
+ "internal-name": "Historical DAM Clearing Prices for Capacity"
+ }
+ ],
+ "directFiles": [],
+ "hasMisListRoute": true
+ },
+ {
+ "product": "np4-180-er",
+ "url": "https://www.ercot.com/mp/data-products/data-product-details?id=NP4-180-ER",
+ "productPageSha256": "d9ef49bcd83f4215168915ced9f129a0b1ca9e23a752b72a78c714a2584e5184",
+ "archiveSystem": "ICE",
+ "reportTypeId": "13060",
+ "routes": [
+ {
+ "type_s": "ICE Data Product",
+ "url_s": "13060",
+ "dataClassification_s": "Public",
+ "internal-name": "Historical DAM Load Zone and Hub Prices"
+ }
+ ],
+ "directFiles": [],
+ "hasMisListRoute": true
+ },
+ {
+ "product": "np6-785-er",
+ "url": "https://www.ercot.com/mp/data-products/data-product-details?id=NP6-785-ER",
+ "productPageSha256": "f11c58af1248d340578b9d7d6d9ff2e61846af9a4f7c6c9990ae252c7148b79b",
+ "archiveSystem": "ICE",
+ "reportTypeId": "13061",
+ "routes": [
+ {
+ "type_s": "ICE Data Product",
+ "url_s": "13061",
+ "dataClassification_s": "Public",
+ "internal-name": "Historical RTM Load Zone and Hub Prices"
+ }
+ ],
+ "directFiles": [],
+ "hasMisListRoute": true
+ }
+ ],
+ "reusedEntryScope": "Seven source/member entries appear in both the intermediate and annual audits. They were checked twice but are counted once in this manifest and row total."
+}
diff --git a/tools/inputs/history/intermediate-full-files.csv b/tools/inputs/history/intermediate-full-files.csv
new file mode 100644
index 00000000..b2a3c8a1
--- /dev/null
+++ b/tools/inputs/history/intermediate-full-files.csv
@@ -0,0 +1,222 @@
+reader,source,member,sourceSha256,bytes,sourceRows,rowsDecoded
+np3-560-cd/7d_load_fcast_by_fzn,work/history-middle-2020/NP3-560-CD.zip/698822255.cdr.00012311.0000000000000000.20200131.233001.LFCCONGESTNP3560_csv.zip,cdr.00012311.0000000000000000.20200131.233000.LFCCONGESTNP3560.csv,6609c47d4a9baeb48790cc32acdfb55336c7f3bc996a1eafbe9df309140216a4,23380,192,192
+np3-908-er/2d_agg_dam_min_esc_west,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-20.csv,d7252778d11d06d8d8e79a96da94d18a10b7c8d7747b10dbbb14c6c7efa6ea7f,9510,307,307
+np3-908-er/2d_agg_dam_min_esc_south,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-20.csv,7c582f6ef4d27972c58803ddd25885e82edc229dfdade6a3e8fc0d66ed1be48c,23889,721,721
+np3-908-er/2d_agg_dam_min_esc_north,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-20.csv,0c50e329c4cfbdd2aacf45b7a3af737069b4101ad1c03b0a276fc86d07006ef0,30706,950,950
+np3-908-er/2d_agg_dam_min_esc_houston,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-20.csv,7adadbcf23c706bf472817ad29e8c55567426e6cb6fee65864c78298342931b3,9476,302,302
+np3-908-er/2d_agg_dam_min_esc,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves-31-JAN-20.csv,8d30422f0863e597860cafccb2401540626f2fa05b084343efbafe784ea51c3a,71494,2142,2142
+np3-908-er/2d_agg_esc_nonirr,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR-31-JAN-20.csv,39600d16de8a324065ab9110ce4eaf10035d41a398fe91a5cbc78ea4a853259f,44166883,888096,888096
+np3-908-er/2d_agg_esc_wind,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind-31-JAN-20.csv,e3d8b482a54d8e70551a29f519368589cdde05901a2a084f7a75f5e4206759ab,43337176,888096,888096
+np3-908-er/2d_agg_dam_esc,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves-31-JAN-20.csv,4a7041c993723d6038564b54810f5df6e1daee479baca78f59ca65b65febcff4,9140207,222024,222024
+np3-908-er/2d_agg_esc_wind_west,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_West-31-JAN-20.csv,9c886d04e2034b50ea053a515409d1e119782789c6b6b49ab287fcf51cae5a02,43182399,888096,888096
+np3-908-er/2d_agg_esc_wind_south,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_South-31-JAN-20.csv,a7a6f4e15794ea846ecdaa603632a45791ab99cbeff19d6d8207cf382272ea63,42829749,888096,888096
+np3-908-er/2d_agg_esc_wind_north,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_North-31-JAN-20.csv,29c03483e72054bc3f63886a9a0af04511d47c3499c077997e780af0d98c8601,42220664,888096,888096
+np3-908-er/2d_agg_esc_wind_houston,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_Houston-31-JAN-20.csv,ad398754da5f6d4b23f60d8d599411535dd5f20a3e68efffedd1d5d9bb3748fd,41217506,888096,888096
+np3-908-er/2d_agg_esc_nonirr_west,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-20.csv,a2f35349efe3ac536b5bca3f399be85b7337ac029d06c1563f1cb14bb2fc2e00,43059293,888096,888096
+np3-908-er/2d_agg_esc_nonirr_south,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-20.csv,9bb3cd7a4bab32cc1857d89423fee9332c298647ec6c7d45c210ff77c70e3f9c,44037925,888096,888096
+np3-908-er/2d_agg_esc_nonirr_north,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-20.csv,5eaaa82d819e869be2c7818283f34bdeae77bfee08a9b38271115646ae17efc5,44144799,888096,888096
+np3-908-er/2d_agg_esc_nonirr_houston,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-20.csv,025e86b7acd8c1825ed726692e8f7b510213ff7b4b4433d4abff8a9fd90041d4,43073076,888096,888096
+np3-908-er/2d_agg_dam_esc_west,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_West-31-JAN-20.csv,d0bad9cc1ecd0a3133e89beab0db1a4c306262167c0c878466f00ee031235920,8927969,222024,222024
+np3-908-er/2d_agg_dam_esc_south,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_South-31-JAN-20.csv,70f3fdb829bcae87e7a827ab07f474a552ae5947cdf76e0e21587afcd07c9475,9120719,222024,222024
+np3-908-er/2d_agg_dam_esc_north,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_North-31-JAN-20.csv,7708019ab86d0ee35bcc6df01ef938eebd7f0d6d4ad56536ac65494ecbc473d8,9114703,222024,222024
+np3-908-er/2d_agg_dam_esc_houston,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_Houston-31-JAN-20.csv,37a1f181f7cd1de1eb49317bba826cfa5f7fe65589db6707bda53a1cb93e9bed,8903271,222024,222024
+np3-908-er/2d_agg_edc_clr,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_CLR-31-JAN-20.csv,d0c182dff23ac8ba56406159fb506f1981f58ac7e19409017958c790abf2a11c,52,0,0
+np3-908-er/2d_agg_dam_edc_west,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_West-31-JAN-20.csv,35a08e95115462d1891dac94dd4274d98fb30edd7c8333227fb7fb7fda2d724d,6349411,187824,187824
+np3-908-er/2d_agg_dam_edc_south,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_South-31-JAN-20.csv,0cd3ee4214fef3261c878620c302cdeb518b8e63651bf2d0b632cda57a8e4ead,8807582,244800,244800
+np3-908-er/2d_agg_dam_edc_north,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_North-31-JAN-20.csv,8da007242b84a8191832fc1badf9704e68f60c49f257b513c41c4153dcb35a45,7664261,244800,244800
+np3-908-er/2d_agg_dam_edc_houston,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_Houston-31-JAN-20.csv,9dad37fc6fbf0455ccc6d94c9c52a5006e588bd139bf99d5e76d6b37f7592ebe,5805781,169824,169824
+np3-908-er/2d_agg_dam_edc,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves-31-JAN-20.csv,1bdaeb4f9403dbfa175717250c5b6019e72da2e95693a60e9bae24476e02c3ff,8795577,244800,244800
+np3-908-er/2d_agg_esc_pvgr,work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_PVGR-31-JAN-20.csv,857819b2e0cc5a8b772a9289dcac96418b0daf4bed59bc6d0c035f73ccba888c,41084251,888096,888096
+np3-911-er/2d_cleared_dam_as_rrsload,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_RRSLOAD-31-JAN-20.csv,1f6ba851425ccba1878d2bb93649f3de50eb1603dd81601d1f330403480f1632,671,24,24
+np3-911-er/2d_cleared_dam_as_rrsgen,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_RRSGEN-31-JAN-20.csv,39c5f4818d8d2b8b2c8fabf2aed0e992e9ed536c8ed1d31b4a8b7a4e175dfd49,688,24,24
+np3-911-er/2d_cleared_dam_as_nspin,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_NSPIN-31-JAN-20.csv,7039ece87da5e6d05aa5077f8442386619d1e733c6fc4a3f13fa910491b5f3e4,654,24,24
+np3-911-er/2d_cleared_dam_as_regdn,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_REGDN-31-JAN-20.csv,ee6b8ad7465f6bcaa0282312ce4283c6488966c5c104d6651efd1be94185e410,672,24,24
+np3-911-er/2d_cleared_dam_as_regup,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_REGUP-31-JAN-20.csv,b36b1d285f60c4e01f06b58926012c442934f0c793242ccbb8799e2a3eab7894,660,24,24
+np3-911-er/2d_self_arranged_as_rrsload,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_RRSLOAD-31-JAN-20.csv,252e1fdf8ecbebf9a0c16c097b72ddb9635be9504233c4703438818eee2169fe,675,24,24
+np3-911-er/2d_self_arranged_as_rrsgen,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_RRSGEN-31-JAN-20.csv,71c1a645fbb973c527582cc4ac572401473a8a374c93ef40964b83856e36047c,628,24,24
+np3-911-er/2d_self_arranged_as_nspin,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_NSPIN-31-JAN-20.csv,039203c50c4af4123f6d0d0c0fdae17a96a810e2a1a7688f4ecac411f6804670,608,24,24
+np3-911-er/2d_self_arranged_as_regdn,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_REGDN-31-JAN-20.csv,2520c874f85608b78bf688f0911d31ed3d0be48df9d745ab07f16df7b27882a6,631,24,24
+np3-911-er/2d_self_arranged_as_regup,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_REGUP-31-JAN-20.csv,f39c001b5e1f613a9886895dc0c0f35e6ccce8d6ccaa7d596c28c6299a14e5e3,619,24,24
+np3-911-er/2d_agg_as_offers_rrsnc,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_RRSNC-31-JAN-20.csv,635b4625093bb87965a6b2aa13523245f1d39ab19d709261ba6a38ad1413e9b8,1613,48,48
+np3-911-er/2d_agg_as_offers_rrsld,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_RRSLD-31-JAN-20.csv,70088585691715ed7542b03489059bd60326b77f72d90f30b60bb0207cb3e326,63,0,0
+np3-911-er/2d_agg_as_offers_rrsgn,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_RRSGN-31-JAN-20.csv,ac5f7561548d420dcf5264b9e1fe9a5c85f801b1cf957de99d0f978e542f021b,54881,1664,1664
+np3-911-er/2d_agg_as_offers_offns,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_OFFNS-31-JAN-20.csv,5fd6f2c6f1f0237f5ad789bfc07693ad380aa849ccc478f1f5a868e23c977044,41863,1266,1266
+np3-911-er/2d_agg_as_offers_onns,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_ONNS-31-JAN-20.csv,38e9d7b7301041743751cf8ce863d9cbac2b69b7ece8d8d7fcaaf05b6799ce1c,16416,514,514
+np3-911-er/2d_agg_as_offers_regdn,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_REGDN-31-JAN-20.csv,57bbd96b67ade97432f3338f80cd2f6a990c7e2b74fb33ba22e07398d0d1340e,48151,1472,1472
+np3-911-er/2d_agg_as_offers_regup,work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_REGUP-31-JAN-20.csv,f687a50cfa5980ee59060c8b46f55d58661b2df8186b9dd795e583304bc4ad3f,46033,1412,1412
+np3-965-er/60_load_res_data_in_sced,work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip,60d_Load_Resource_Data_in_SCED-31-JAN-20.csv,830a275df68b41677b0fc7d09d434d51d4d4e1eb393f37396f178635dbae4bdd,13157262,43008,43008
+np3-965-er/60_sced_gen_res_data,work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-20.csv,f376d85c1c81e7ecc2e62b1935c17e3ffe5927ae9a517b2fe61732a1cd60ed10,52323994,61056,61056
+np3-965-er/60_sced_smne_gen_res,work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-20.csv,37037bc6331336f2361520edba901146b446015b8c07c61ba93f5c9cf0f57140,4300144,86400,86400
+np3-965-er/60_sced_dsr_load_data,work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-20.csv,3b157892742ecd8d9abced8330566e85cb1969be1dc2a61aab407ed7f2b36c33,519010,13344,13344
+np3-965-er/60_sced_qse_self_arranged_as,work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-20.csv,f4b9f7be65b7eeb2701833670230d91f6a720ca5d76f8a90f8bb8dd63d3adb05,228245,3744,3744
+np3-965-er/60_hdl_ldl_man_override,work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-20.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np3-966-er/60_dam_ptp_obl_opt,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_PTP_Obligation_Option-31-JAN-20.csv,2ee0517462c6b6a7c813500b7a2dc37023f310d94a46aa31c0c25fec8ecf0972,768327,8855,8855
+np3-966-er/60_dam_energy_bid_awards,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyBidAwards-31-JAN-20.csv,27ecdb91e7c174a8ca62fa60fedf2915c1b48a498cd3620679fe29a146b77a22,604483,10081,10081
+np3-966-er/60_dam_energy_bids,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyBids-31-JAN-20.csv,b999a4e91ef6217598b8746edf62aebf20190581010d390ac328c7924f3987e8,1229602,10081,10081
+np3-966-er/60_dam_energy_only_offer_awards,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyOnlyOfferAwards-31-JAN-20.csv,7f86a641ebf352b53d75da4d2a55be9132e8ebfccdcea89ae22791200a596ab4,508611,8287,8287
+np3-966-er/60_dam_energy_only_offers,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyOnlyOffers-31-JAN-20.csv,b5f71746e2f7327df91adebecbbaa81104bac6c7158b36d5e9154fc70631d522,1021184,8287,8287
+np3-966-er/60_dam_load_res_as_offers,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_Load_Resource_ASOffers-31-JAN-20.csv,30230b917bc02bdcaa561ce15f2614aaafae168b0250687381e7dce31c78b57e,1071101,7231,7231
+np3-966-er/60_dam_load_res_data,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_Load_Resource_Data-31-JAN-20.csv,7532bfa0f950f25e6b4f02d3117b2b18ca110ccafe95d3509379ab1e4732458e,793521,10560,10560
+np3-966-er/60_dam_gen_res_as_offers,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_Generation_Resource_ASOffers-31-JAN-20.csv,d7ed8001fc73227db12cf582b8a18ec0939f57707556f3bbad51582b4a6a4bb0,727257,4618,4618
+np3-966-er/60_dam_gen_res_data,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_Gen_Resource_Data-31-JAN-20.csv,2098d34ffb5b2a2d537eb9731b83146e549efa98068e5f8a07548b4af17d6042,3865348,20136,20136
+np3-966-er/60_dam_qse_self_as,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_QSE_Self_Arranged_AS-31-JAN-20.csv,589eff7667f8e4d5e248dd9c066f8c90f3495272c4fd08b14ba0adce20e1051c,47572,936,936
+np3-966-er/60_dam_ptp_obl_bid_awards,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_PTPObligationBidAwards-31-JAN-20.csv,606d74e37e6603ec2adb95f0782fa3687c5da5f18bbb1ed1cf4bf2f506dfeabb,7687691,104414,104414
+np3-966-er/60_dam_ptp_obl_bids,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_PTPObligationBids-31-JAN-20.csv,b2e4e63a406b2637f94a7a210d2e7be6558ed65f43669212d5651bf69d251771,8092711,104414,104414
+np3-966-er/60_dam_ptp_obl_opt_awards,work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip,60d_DAM_PTP_Obligation_OptionAwards-31-JAN-20.csv,ccc1b87dafdaea28148d6bf2a516c8ab23001bcdc669ebd8520bfeeec112d746,741586,8855,8855
+np3-991-ex/60_cop_all_updates,work/history-middle-2020/NP3-991-EX.zip/698706908.ext.00015943.0000000000000000.20200131.052054194.60_Day_COP_Disclosure.zip,60d_Complete_COP-31-JAN-20.csv,9a68b8a7e2254b97130aa5deca3fe2d95be86bb8572e421a4287f9cce04e0ce4,99098863,636888,636888
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-middle-2020/NP4-732-CD.zip/698824711.cdr.00013028.0000000000000000.20200131.235518045.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20200131.235517.WPPHRLYAVGACTNP4732.csv,c1022c57b0c202302aca72ad693f4566340c5d909d5b589d3c2dcae559f4db44,22872,216,216
+np3-560-cd/7d_load_fcast_by_fzn,work/history-middle-2023/NP3-560-CD.zip/940606303.cdr.00012311.0000000000000000.20230831.233002.LFCCONGESTNP3560_csv.zip,cdr.00012311.0000000000000000.20230831.233002.LFCCONGESTNP3560.csv,d22dc18492ed5e3cbc8735c13d5354575d8697d2df7ef946da47eabc2de4c9f3,23117,192,192
+np3-908-er/2d_agg_esc_pvgr_houston,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_PVGR_Houston-31-AUG-23.csv,27e0d6fda0978bdeb321da50402e943a466a9da2a7ab9b1fb85799264bfc9dbc,22325248,504096,504096
+np3-908-er/2d_agg_esc_pvgr_north,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_PVGR_North-31-AUG-23.csv,b3dcc18222c0515f168a25dad13989363df4281a90d6826a58ee9bd2b258e5b7,23359725,504096,504096
+np3-908-er/2d_agg_esc_pvgr_south,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_PVGR_South-31-AUG-23.csv,ffbac5cce17f0bff18105374a9b6191a8c506351f4df6dab3d5efc2fa82316ea,22072094,504096,504096
+np3-908-er/2d_agg_esc_pvgr_west,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_PVGR_West-31-AUG-23.csv,f7ce8147d754e39599bf8bb73ff524e5133b5cd15d6240ecbfec431100697913,22098319,504096,504096
+np3-908-er/2d_agg_esc_pvgr,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_PVGR-31-AUG-23.csv,3a33f4ecf4a1ac992820d65b810d9500f0c08829d970042f20d21024333b8f45,23582923,504096,504096
+np3-908-er/2d_agg_edc_clr_houston,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_CLR_Houston-31-AUG-23.csv,38e07563c8d3b0bb970dfbf3d7ce6b4509335d2ac5b988e9f8172b4c5efcaf8e,23361280,504096,504096
+np3-908-er/2d_agg_edc_clr_north,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_CLR_North-31-AUG-23.csv,ba0402a893767595da3f417fd84e33a6063f48f747cefd2ab4735b29c8744f8a,23962487,504096,504096
+np3-908-er/2d_agg_edc_clr_south,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_CLR_South-31-AUG-23.csv,0ffaf84c76e5d8eb2965889759a67368dd43afbe343cc58508318a8b193e6a53,31047250,672000,672000
+np3-908-er/2d_agg_edc_clr_west,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_CLR_West-31-AUG-23.csv,2c289e8102d57edc2a18a9e29dc86fe3ffb21e547fc02f173c4db3055e18559e,30865600,672000,672000
+np3-908-er/2d_agg_dam_edc,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves-31-AUG-23.csv,27a0811395371711acf77bf8ce25ce6008477dc285614c2322b71f0f0611a3d4,5072010,134586,134586
+np3-908-er/2d_agg_dam_edc_houston,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_Houston-31-AUG-23.csv,fff09129084f2e8d1625d7d6ccb73093b9c07f99b94fc4876d48ff711c51a719,3999199,114370,114370
+np3-908-er/2d_agg_dam_edc_north,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_North-31-AUG-23.csv,ce2d840d9faa9fe0a94073c31e91d0e17bf6e1b33e6f657c4a8433122d880c8d,3767669,110951,110951
+np3-908-er/2d_agg_dam_edc_south,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_South-31-AUG-23.csv,35201a95a41cff23e6aa6e3f9f9617ac8f9c406f3f14f230a198cc5ae9580f9c,4581446,127803,127803
+np3-908-er/2d_agg_dam_edc_west,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_West-31-AUG-23.csv,c727e5926c91f7c7ceebe70f17118bf399c2f6edd51b36ef0651241dbfe3fca5,4542715,126524,126524
+np3-908-er/2d_agg_edc_clr,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Demand_Curves_CLR-31-AUG-23.csv,22f9cb9905f8ed7f30efb5ada6d41295dee3fd522a1d14e35d049202663eaecd,32294897,672000,672000
+np3-908-er/2d_agg_dam_esc_houston,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_Houston-31-AUG-23.csv,b672f2d1bc5eac322e5e4f1be8dff57227fa221169b47231af31a0d0638420d8,4936534,126024,126024
+np3-908-er/2d_agg_dam_esc_north,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_North-31-AUG-23.csv,9cb5e2ea1a88dbca4de9d6c6993ed9b16539758d2b45e340d79f89b462e1a923,5128522,126024,126024
+np3-908-er/2d_agg_dam_esc_south,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_South-31-AUG-23.csv,ff4db6c544463aec7a8c1568af44d55557c52b88e44588ab8f0cdbdfd859f67d,5130973,126024,126024
+np3-908-er/2d_agg_dam_esc_west,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves_West-31-AUG-23.csv,d0a95030cbc40d9e774b9259be9bb886b8964d2e51f7fcd9b5f3f313037569ff,5024847,126024,126024
+np3-908-er/2d_agg_esc_nonirr_houston,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_Houston-31-AUG-23.csv,1369d2db5bf3852e3f1ca66fdbfbf6beae635a0aca6233f72a32ca354c5dcab3,24760385,504096,504096
+np3-908-er/2d_agg_esc_nonirr_north,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_North-31-AUG-23.csv,694369eb9508c022ca671bd40dca399bda9dcc373e4b4fdd4a748037091a5906,24853218,504096,504096
+np3-908-er/2d_agg_esc_nonirr_south,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_South-31-AUG-23.csv,c8d9610dab1bdbf2e76cae19806ebc4755e39819396deb41b62cab2c9030f476,25006584,504096,504096
+np3-908-er/2d_agg_esc_nonirr_west,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR_West-31-AUG-23.csv,1d9a95e1dbe4360e7c5370994797c6de731c06702d3940b9fdcf50acdc1eff65,24287745,504096,504096
+np3-908-er/2d_agg_esc_wind_houston,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_Houston-31-AUG-23.csv,f60b7b5843e37e6da16ee76b6b50c5878b257713d64773976f2cee6b52391036,21176977,493594,493594
+np3-908-er/2d_agg_esc_wind_north,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_North-31-AUG-23.csv,9830ec45c715053f42bbc393526b9097e73351e2caa76367fdf4688bec4155e6,23859729,504096,504096
+np3-908-er/2d_agg_esc_wind_south,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_South-31-AUG-23.csv,ee2100fe617c4b27a93109d34830af6d947c43c7bc7fab895fe8a80306a29dfe,23966082,504096,504096
+np3-908-er/2d_agg_esc_wind_west,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind_West-31-AUG-23.csv,e812215bcacde0f90ea77780b2d332d47492e28444184e981abf98735c136a6f,24259236,504096,504096
+np3-908-er/2d_agg_dam_esc,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Energy_Supply_Curves-31-AUG-23.csv,34f670526b35f77101bd30efad272c4f5ac93307cd9bdf49b4be3ed3cb01c78c,5135310,126024,126024
+np3-908-er/2d_agg_esc_wind,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Wind-31-AUG-23.csv,61829d061b3812dcdbe989fabc54c94f4851d03666f7e3f7efa13a7265c73933,24326808,504096,504096
+np3-908-er/2d_agg_esc_nonirr,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Supply_Curves_Non_IRR-31-AUG-23.csv,ad32327e9da5c5446d87b792114ef093cc96635e9a8dec0f62c4477351a955ad,25009634,504096,504096
+np3-908-er/2d_agg_dam_min_esc,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves-31-AUG-23.csv,916b91a91d0a6ef74ea0a36a3cb7bc75cc5f8703f3784c96c3e02d8984b59388,65680,1966,1966
+np3-908-er/2d_agg_dam_min_esc_houston,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_Houston-31-AUG-23.csv,d3e200b54bd35822c2d1343f45fece7f49ce6e149b1648ee642f7b6ad78c585e,11306,365,365
+np3-908-er/2d_agg_dam_min_esc_north,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_North-31-AUG-23.csv,8b39c63c0f66a04aa6dac3011095944923fdc6e9bcfb9acc89afd3d14d1fc4a0,23888,754,754
+np3-908-er/2d_agg_dam_min_esc_south,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_South-31-AUG-23.csv,3c656ba4d1dcb8f637ec08d31691b956e4861c8fc5cad8e86263e44e675ab0c3,24961,782,782
+np3-908-er/2d_agg_dam_min_esc_west,work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip,2d_Agg_Min_Energy_Supply_Curves_West-31-AUG-23.csv,ea7765a3855b7910bddefbaa0919ca02bebef5ac53a85cc5a68ca0f98ada5c32,10037,317,317
+np3-911-er/2d_self_arranged_as_nspnm,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_NSPNM-31-AUG-23.csv,61c5b0681ccd61d723ca9071ba61b4bc583a4d22aa6dce745ad2f0b7230c79cd,582,24,24
+np3-911-er/2d_agg_as_offers_rrspfr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_RRSPFR-31-AUG-23.csv,55e37d7d43df7ebc32bb54eaf3aef0fbc6c737c06be88c6afa8aa7d4906c9691,86234,2573,2573
+np3-911-er/2d_agg_as_offers_rrsufr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_RRSUFR-31-AUG-23.csv,3ab53530b98fee82b767b40b5b92a321341ffb0950c1f1541b009d65ec41218e,802,24,24
+np3-911-er/2d_agg_as_offers_rrsffr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_RRSFFR-31-AUG-23.csv,6644f2c4f1e943e4c224dd8450522146122e25d1b437a503da4e5bd4454700cd,2626,82,82
+np3-911-er/2d_cleared_dam_as_rrspfr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_RRSPFR-31-AUG-23.csv,2093267d6310b7c371e1b9db1b02e296a61ec4ce03d2a128a034889d814b8061,695,24,24
+np3-911-er/2d_cleared_dam_as_rrsufr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_RRSUFR-31-AUG-23.csv,7f610b024f8430d9c266efe566ac87c694166a4abd05020437184d1a96c191e2,671,24,24
+np3-911-er/2d_cleared_dam_as_rrsffr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_RRSFFR-31-AUG-23.csv,20067a3676f7f85a8d9cf5ec798b0a1f5f45bd2e5526349e3b7558d089822e2f,612,24,24
+np3-911-er/2d_self_arranged_as_rrspfr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_RRSPFR-31-AUG-23.csv,7f52f1105d4537cf8bd98e4d10545fe0c0c75e55e778cd4a78382beabb1adc98,677,24,24
+np3-911-er/2d_self_arranged_as_rrsufr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_RRSUFR-31-AUG-23.csv,8950aa6b73f2ec12e6b5c7a090abdbee9327125fe67668b411ecba19ed8aaa04,673,24,24
+np3-911-er/2d_self_arranged_as_rrsffr,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_RRSFFR-31-AUG-23.csv,30270b2f7b1c5cde4e13032cdd763839f243f7ca8eefab0e1dc30ef9a008447f,583,24,24
+np3-911-er/2d_agg_as_offers_ecrsm,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_ECRSM-31-AUG-23.csv,64cca45c250b43bcf579cd745a1afc18624a9e823d8170b7556eb34fc5760af1,1115,35,35
+np3-911-er/2d_agg_as_offers_ecrss,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_ECRSS-31-AUG-23.csv,df4d4fb8096ee6adfb263e4d12c0bfddce9c607fbec8b8ae33275629d1c12a4b,84707,2516,2516
+np3-911-er/2d_cleared_dam_as_ecrsm,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_ECRSM-31-AUG-23.csv,c76a06e0745c59e09596e7ad910d50b0629e1b062cfc0b2506299d689adcfdb5,668,24,24
+np3-911-er/2d_cleared_dam_as_ecrss,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_ECRSS-31-AUG-23.csv,f087f05aa5387fe1bb447a1c928bca677de61b6cf7bc2415f2dbd81dcdbba260,692,24,24
+np3-911-er/2d_self_arranged_as_ecrsm,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_ECRSM-31-AUG-23.csv,8987f1d999442e2834da5559b817e964bf6c0be5a20a16c019b6dcf52ebb70a3,582,24,24
+np3-911-er/2d_self_arranged_as_ecrss,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_ECRSS-31-AUG-23.csv,2aa8c9d7736c8ed5f4c35a0a74c1e05db89dc227eb50ff2b488be6f9051790a7,670,24,24
+np3-911-er/2d_agg_as_offers_regup,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_REGUP-31-AUG-23.csv,1bfbf5a52783f0e63f9396607c36c94045e6f3cfd270436a62b330cb16353e93,63765,1926,1926
+np3-911-er/2d_agg_as_offers_regdn,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_REGDN-31-AUG-23.csv,009a2738605e3450e93866d48a06d3a18198dfadf24ad4a902e4017731cc6f1e,55815,1718,1718
+np3-911-er/2d_agg_as_offers_onns,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_ONNS-31-AUG-23.csv,fb9fa5fc935f5b73326aa7a604f4ab494c1940b7c248c38d0fbb46d9ec61171a,25463,799,799
+np3-911-er/2d_agg_as_offers_offns,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Agg_AS_Offers_OFFNS-31-AUG-23.csv,7f10d9d82b708977e6c80bae0f619af3012a106ae94f8ae164ff253ae6e30cf4,40838,1218,1218
+np3-911-er/2d_self_arranged_as_regup,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_REGUP-31-AUG-23.csv,5a1d99c68d9208202820715812141416fd9d623e42bc49a88f6b55d33fac2d6d,582,24,24
+np3-911-er/2d_self_arranged_as_regdn,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_REGDN-31-AUG-23.csv,372079d096a80d9fa1ef6fdb6e3f16376e711efa0705faadc969efe9375a05e7,656,24,24
+np3-911-er/2d_self_arranged_as_nspin,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Self_Arranged_AS_NSPIN-31-AUG-23.csv,64ec36aa4bff11c4f907cf2c54ce73d3a242819c4d4f32ef9e9cce4dc1ef205b,676,24,24
+np3-911-er/2d_cleared_dam_as_regup,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_REGUP-31-AUG-23.csv,f1302cc20e5d55dadef71779e7e7c8f3ee9c04554e513c8b6e4faf0cbe3ad4fd,639,24,24
+np3-911-er/2d_cleared_dam_as_regdn,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_REGDN-31-AUG-23.csv,6f8ef810e170ec0224002e28c403929099c7fcbf45bf387be6c38a409943f99c,670,24,24
+np3-911-er/2d_cleared_dam_as_nspin,work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip,2d_Cleared_DAM_AS_NSPIN-31-AUG-23.csv,142dd0d3d96ca893e9f2126914931894a4f445a8ad449460560cfc3b2dc951cf,696,24,24
+np3-965-er/60_hdl_ldl_man_override,work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-AUG-23.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np3-965-er/60_sced_qse_self_arranged_as,work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-AUG-23.csv,31ad55a8de18eec3fb8eec91df89455aa90cfbc75c024360940c56c46e718a10,314505,4416,4416
+np3-965-er/60_sced_dsr_load_data,work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-AUG-23.csv,45f7c889da0544444c292d2792b74ac72d59be59dae12b17eb7d93ee9cfb5160,803296,20640,20640
+np3-965-er/60_sced_smne_gen_res,work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-AUG-23.csv,71959e3a618cec67f26dced31510c8461d494af58627b0afdc902abd92ff78ac,6895948,137280,137280
+np3-965-er/60_sced_gen_res_data,work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-AUG-23.csv,08218ef1039c8a63ab97ae9d8a071676df8799ecef3ee4cbed4e7c234b2171f0,83954997,97824,97824
+np3-965-er/60_load_res_data_in_sced,work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip,60d_Load_Resource_Data_in_SCED-31-AUG-23.csv,a5aac8c864a4300a21b93786d27b63f069e9370327687fb5bdd887bb26dc1ac4,11700792,64032,64032
+np3-966-er/60_dam_ptp_obl_opt_awards,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_PTP_Obligation_OptionAwards-31-AUG-23.csv,292bfef8d6ad41ba896cf78f71542d4d6e327648bf982f4b2c3cabc211166e57,840761,9943,9943
+np3-966-er/60_dam_ptp_obl_bids,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_PTPObligationBids-31-AUG-23.csv,118d5155e1d62a5ccd531b44180559e4fe3f2b182fff5bdf821232947e417eac,10404402,133436,133436
+np3-966-er/60_dam_ptp_obl_bid_awards,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_PTPObligationBidAwards-31-AUG-23.csv,483600276f3210044b0a8fc64eccbf4280bfa3b65fa18b2c69afa307da16a9d4,9823430,133436,133436
+np3-966-er/60_dam_qse_self_as,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_QSE_Self_Arranged_AS-31-AUG-23.csv,8d1e2e959788cbab2ab46a2469a8f08e2b1006f4094f54a095ad50aa8c88b2fa,67466,1104,1104
+np3-966-er/60_dam_gen_res_data,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_Gen_Resource_Data-31-AUG-23.csv,b1eaa0ed6c4f9027c6312ee997ab16e40ad33b072a6aa9160485dfee3bdf9cf9,6564037,29616,29616
+np3-966-er/60_dam_gen_res_as_offers,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_Generation_Resource_ASOffers-31-AUG-23.csv,b97b28d4ee87b8bca30b1aff0984167c3adc3fbda45d2b388fbf7c0465e581b8,1864932,7916,7916
+np3-966-er/60_dam_load_res_data,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_Load_Resource_Data-31-AUG-23.csv,2c4b5ffee2c5b73878217bbcf18d453dce12f15efcc27999ff91ec200c00d31d,1462326,15648,15648
+np3-966-er/60_dam_load_res_as_offers,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_Load_Resource_ASOffers-31-AUG-23.csv,92dcd254dd5aaa6c60f459f6b21df499ecc1078f17b25faac5e379bc229c272b,1921768,8697,8697
+np3-966-er/60_dam_energy_only_offers,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyOnlyOffers-31-AUG-23.csv,dec304e4034affa0179320a9059188acd0513c981c4e481e8dcc4ea6fbdb40d3,1446297,11618,11618
+np3-966-er/60_dam_energy_only_offer_awards,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyOnlyOfferAwards-31-AUG-23.csv,b02c6a0c5a4f9bcb50bfbe9125323a668a46987a6cfbe465530263908edd5451,720936,11618,11618
+np3-966-er/60_dam_energy_bids,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyBids-31-AUG-23.csv,1fc42d15dcf755c088af66e16f90d12bc7f69ed367cd24c85bd695401691b0ed,2882941,23324,23324
+np3-966-er/60_dam_energy_bid_awards,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_EnergyBidAwards-31-AUG-23.csv,b3750769170f3280871b3fdf1eaeaa55893e8faaedf35f83a062be7e8cf7f5a5,1431311,23323,23323
+np3-966-er/60_dam_ptp_obl_opt,work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip,60d_DAM_PTP_Obligation_Option-31-AUG-23.csv,e6fdf532206df3f80b532e979afac756021162efeae728c3337c310c3d1481ce,871734,9943,9943
+np3-991-ex/60_cop_all_updates,work/history-middle-2023/NP3-991-EX.zip/940423384.ext.00015943.0000000000000000.20230831.051055962.60_Day_COP_All_Updates.zip,60d_COP_All_Updates-31-AUG-23.csv,67a1154cda605b898846ce51360821130e152b7fd19752ec9add351f8c88f81b,142097851,804012,804012
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-middle-2023/NP4-732-CD.zip/940611200.cdr.00013028.0000000000000000.20230831.235534731.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20230831.235534.WPPHRLYAVGACTNP4732.csv,663b2ed8f16d9bcc9fdc1bfc541e032354a2259ca554bc3d11dc16504e992eb8,23065,216,216
+np4-745-cd/spp_hrly_actual_fcast_geo,work/history-middle-2023/NP4-745-CD.zip/940611381.cdr.00021809.0000000000000000.20230831.235538617.PVGRHRLYAVGACTGEONP4745_csv.zip,cdr.00021809.0000000000000000.20230831.235538.PVGRHRLYAVGACTGEONP4745.csv,19bad0d1bd8498e3fdc53815dc0022121fe61b38867d682e024bc6dd3766bcc6,27059,216,216
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip,60d_Load Resource_Data_in_SCED-31-JAN-15.csv,3109dcff7b424ac2e22ec3b074b2a413c2f9578243b54fa95c147a3189a7550e,1762660,23040,23040
+np3-965-er/60_sced_gen_res_data,work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-15.csv,a5181b85a384684f9db36b9b0d8c746250c93a23bffd9973b8bcbc341b66ec63,42636559,43680,43680
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-15.csv,d9ec834fe96d2d7ea7a6ed97906b0d65919bb1eb58b51964342e34f4341f5f58,2663325,53664,53664
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-15.csv,95bcfe45a3f5a72a0de5755e4738054c42808564daff43129b32dfa58ea2e4e7,317470,8157,8157
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-15.csv,10bcbde6b77bcf04312f0f2364384ff5c7d19b9b5dd9ee3dc213c67739e6d49a,178201,2968,2968
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-15.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2015/NP4-732-CD.zip/471323977.cdr.00013028.0000000000000000.20150131.233042645.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20150131.233042.WPPHRLYAVGACTNP4732.csv,e0e2f204c70eaa9f8dec9348bc40e36c5ace6652d3b66cb46ea16661d3394cbd,8957,96,96
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip,60d_Load Resource_Data_in_SCED-31-JAN-16.csv,89a0f2e0f3cd885ecb6004c790734e47301dcbf5b1f9912bbef7a9fbbbf7fd1d,1795430,23328,23328
+np3-965-er/60_sced_gen_res_data,work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-16.csv,4b09b1d6a3737515339c266180f135e5f17326a829f70b7fb76d6adec11df474,45927656,47040,47040
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-16.csv,2db5a69f367c8f147dd8b8e5c75f35caf643592ab1e9f8379748e72883626fb5,2842795,56928,56928
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-16.csv,22337b48b53dd19c82d5b7af1512e67f998a5440fdf2fd91fd47a522590a6d36,361872,9301,9301
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-16.csv,7349e8f15bb29aaecc2f59ac9eb6b9c11c2c98027423795e874411947f63a2a6,190109,3188,3188
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-16.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2016/NP4-732-CD.zip/508541149.cdr.00013028.0000000000000000.20160131.233108482.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20160131.233108.WPPHRLYAVGACTNP4732.csv,60462255ede089d784903d0dc45de500bae2fcf9e5d66e2f4f5467eb4d36fba4,18909,215,215
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip,60d_Load Resource_Data_in_SCED-31-JAN-17.csv,6fd2f09972c2aa7e6cc373d1c62c98b90ef3bd9cfc1932ebf19b37c1f09c1a50,2171915,28224,28224
+np3-965-er/60_sced_gen_res_data,work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-17.csv,4e0dbf9564803dbd48e91614b905ba94f059a12cdd7cf8f32707467e09cb64cf,51363200,51744,51744
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-17.csv,ec77f874db1237072a0e1e36ef2470fdbfd4205b0c1e4f0e405f8560d0e64d2a,3127980,62400,62400
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-17.csv,dc2f4677e6b8ddb5093bb8b46c98c4fb4488b25f1f0c75c6bd52f6ed00d9df2d,429250,11036,11036
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-17.csv,2a205148b0c7203d19ba6c65e70bd2c7180c8db68453ea747c6c01a677c58658,192653,3264,3264
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-17.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2017/NP4-732-CD.zip/550677301.cdr.00013028.0000000000000000.20170131.233129026.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20170131.233128.WPPHRLYAVGACTNP4732.csv,f561633f10d75d9f453ca075e5ec44ba17bcfab786f02f953465fbcbf2d948ef,18460,216,216
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip,60d_Load Resource_Data_in_SCED-31-JAN-18.csv,bbd94c9ba3d7865ec2d8ee61e81ee57a722c496fb433f12e50b697bd8bf7bc0f,2593439,33888,33888
+np3-965-er/60_sced_gen_res_data,work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-18.csv,e8ce83b7534dc98f8e38e798da9e73b65110d8fbfce7875cee43e2eb21311b92,53506954,54816,54816
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-18.csv,64f9d16c02f37488d99efd7dff4876d7d702f3003a79e1cff0a3086a4da7b568,3482233,70272,70272
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-18.csv,d4797da79c99ecc4f26dca79c77c0755bedcb4d7265a331a74ea88225a08ff36,470246,12096,12096
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-18.csv,195511e447cadcd0e38ca17223068386393bf331fc9e59c156b6620f85949ce4,175213,2856,2856
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-18.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2018/NP4-732-CD.zip/597033993.cdr.00013028.0000000000000000.20180131.234255015.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20180131.234254.WPPHRLYAVGACTNP4732.csv,7da7ea05bdb74d3b363de374e2a2fbe511c3e56236f1fa3c6e3c36f0ac77ea48,23187,216,216
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip,60d_Load Resource_Data_in_SCED-31-JAN-19.csv,bb0daf54d514ee3c4ecda8ccd173bcabbb58fd9ae79853ee6f96c28701ab6143,3018592,39168,39168
+np3-965-er/60_sced_gen_res_data,work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-19.csv,1c9c87ae3461401d5bd3c6a8b324bb8a9695156cb3daa9ff75c3b2b06a9a6195,48062071,56640,56640
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-19.csv,0b8b38e92de7380ba88447c076fb417b4940edafa534fcf41cfc17ba0edf7a8d,3951567,79488,79488
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-19.csv,7cc3e4bf40b8a25ad2f7821ac4ecfb6335a280d3cab3b3d2e3e888b8e24c17ab,485314,12480,12480
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-19.csv,accdb13b0becb4096288cc4442eae9df82da812484eedb48902c00ef827b09cf,188753,3072,3072
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-19.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2019/NP4-732-CD.zip/646777019.cdr.00013028.0000000000000000.20190131.234311712.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20190131.234311.WPPHRLYAVGACTNP4732.csv,c7d2cbe9e2d62c2781ea65cf1f276ff54d83b9baac373bbfeb0a714d4a1c4209,22961,215,215
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-21.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-21.csv,8a573d44886a26b2c9d22b7db317fd7855af5a79851ae1442195832bdd011526,275069,4456,4456
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-21.csv,d17822be7f17432725424a50b828d07757886ddc807a575848fd7c45d47e3034,579304,14880,14880
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-21.csv,4f71dbad9f77dfa173e44b5c8b61a2f0b85f53eda7caa84d0e4ac07a30045bcb,5118784,102336,102336
+np3-965-er/60_sced_gen_res_data,work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-21.csv,af6ff378f72e130aa4c982ce8faa6f1827ffaa1037a0296d918b14aba32ef673,60337563,70368,70368
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip,60d_Load_Resource_Data_in_SCED-31-JAN-21.csv,9ca03c7c44de55a8aa06daac3bc3018745ac0df2e3e0cd588ca8ee5a9a6ca834,19564669,61344,61344
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2021/NP4-732-CD.zip/756356582.cdr.00013028.0000000000000000.20210131.235521704.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20210131.235521.WPPHRLYAVGACTNP4732.csv,8de9752cf245570bf444d7c084216b87666257082eca1ed4eccecf80818649c4,24011,216,216
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-22.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-22.csv,7354a651d5f6bac4103057e2d6869629827f38db92426d0e92271d2a60753c01,266409,4324,4324
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-22.csv,0f96d14a8d33c0414370566c26f17effb52f1f7401326c90e06d3b9023d24925,661586,16992,16992
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-22.csv,8a1de0863ab47065678e709b5e964ff5e4e5e6ae078dcd2fcc7de6c4a4ca52e9,5896151,117600,117600
+np3-965-er/60_sced_gen_res_data,work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-22.csv,d797c3c49e43125df0bde642e2350f792cc7017310f30de6f510bbd539c95468,70684983,83040,83040
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip,60d_Load_Resource_Data_in_SCED-31-JAN-22.csv,bc54056648ce9d16555809807a64f9093b14d436dc13a54d27f1071601f1e3bc,11539386,67488,67488
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2022/NP4-732-CD.zip/820534787.cdr.00013028.0000000000000000.20220131.235533819.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20220131.235533.WPPHRLYAVGACTNP4732.csv,032ecb11d58eb9ae85fcd49a7917b140c1fc139be8a3cb7d0dff9a0fee9e6fe5,23132,216,216
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-23.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-23.csv,237a13a30698146a148d182f27c56d2c94d7b1ca130c947a6b8a2c2d02b27748,258820,4040,4040
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-23.csv,90b2dba1103cba04d8a0cf4e2cb4e7c68052974cac883d3f1dbb0b9c797647f5,762572,19584,19584
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-23.csv,5331feeedd6bd5cc7e6bb3f616f2cc505c013b79307fa9bcd561fa29dee9c985,6593756,132000,132000
+np3-965-er/60_sced_gen_res_data,work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-23.csv,3079a68a396a6d7945584f3a7d3d11ed4fafc84f50a2e7741ecc22d918e7347c,78943235,93024,93024
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip,60d_Load_Resource_Data_in_SCED-31-JAN-23.csv,23a9c59800c0f6d8dc5092911a9b60476fe550f1bcd9e8dc1cb5a7afbc6b806c,11148801,62784,62784
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2023/NP4-732-CD.zip/893111283.cdr.00013028.0000000000000000.20230131.235529287.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20230131.235529.WPPHRLYAVGACTNP4732.csv,cf6b2ceb300263af76126903315426e375ca0612ede35256bbc6d153d80d3c67,22698,216,216
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-24.csv,1c0e3b7b3ae2f5991dc97ee06ad04c28c6f9a36658f2a80946a95c78bd794e7e,167,0,0
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-24.csv,7a597d79abc4fcc32e02e8ea68f5f3079fd1a290cab03057738f112de7eb8d3f,292305,4212,4212
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-24.csv,817ec8fe2ed8ab3f0c2195fb8b8fe76b559335c07e3f35875ecbc618709fa28c,879948,22610,22610
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-24.csv,8f5162c11fe9897f0c7b7e4defef5e8f2c1e535f6bf68e7b0ed7888d6f12215f,7260080,145152,145152
+np3-965-er/60_sced_gen_res_data,work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-24.csv,8b47fd05650754c8a4f590ce84da58e583d98851dec411d8017d314ad600b5fb,87601101,104064,104064
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip,60d_Load_Resource_Data_in_SCED-31-JAN-24.csv,848e3678e0ba48a4bc6e0cbf66290979d347c92418a847110c6219edf7557dc6,11787219,63552,63552
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2024/NP4-732-CD.zip/977491391.cdr.00013028.0000000000000000.20240131.235525.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20240131.235525.WPPHRLYAVGACTNP4732.csv,337669d33b69022d73514580da259740049538681522f8f9db6aee225110a9d8,23668,216,216
+np3-965-er/60_hdl_ldl_man_override,work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip,60d_HDL_LDL_ManOverride-31-JAN-25.csv,264685634871f2073cee949cab86b811bce1a67c742cddb65ab9176fcb2ea45b,145,0,0
+np3-965-er/60_sced_eoc_updates_in_ophour,work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip,60d_SCED_EOC_Updates_in_OpHour-31-JAN-25.csv,1ddc6f3dd7b6dccd64c6b884ea169aadbf7058aaa02dedaa2d5959bb6d6cda6f,88,0,0
+np3-965-er/60_sced_qse_self_arranged_as,work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip,60d_SCED_QSE_Self_Arranged_AS-31-JAN-25.csv,546a0e316293f83346e3d12622b5db15c7d9e6f8efad9ce10249ab0dcd6f03f4,144476,3168,3168
+np3-965-er/60_sced_dsr_load_data,work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip,60d_SCED_DSR_Load_Data-31-JAN-25.csv,f0e39d406c30ef32b965cc20e700259d2e37e1795a3d3222f61ea8786074fe38,783498,25344,25344
+np3-965-er/60_sced_smne_gen_res,work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip,60d_SCED_SMNE_GEN_RES-31-JAN-25.csv,6b7ba3a047b76ff6c030fd89ae418c5d870dcb6904a1caf2390177be9dbd945a,6669631,159552,159552
+np3-965-er/60_sced_gen_res_data,work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip,60d_SCED_Gen_Resource_Data-31-JAN-25.csv,9f0be5986a6f453dbf314f22a468530319bbddce689dc6a1b55a254d50e15dd9,54974038,115782,115782
+np3-965-er/60_load_res_data_in_sced,work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip,60d_Load_Resource_Data_in_SCED-31-JAN-25.csv,8391ba50e68a0dee3a48f0838fbc762a7eaca6e7f72fad801744f5c4e75b5a10,7839840,71520,71520
+np4-732-cd/wpp_hrly_avrg_actl_fcast,work/history-annual-2025/NP4-732-CD.zip/1073971845.cdr.00013028.0000000000000000.20250131.235510.WPPHRLYAVGACTNP4732_csv.zip,cdr.00013028.0000000000000000.20250131.235510.WPPHRLYAVGACTNP4732.csv,66f44157087da4d06f1825a6918abd70eca0c8456be4c41039a222ec1f234aaa,24984,216,216
diff --git a/tools/inputs/history/legacy-hourly-load.zip b/tools/inputs/history/legacy-hourly-load.zip
new file mode 100644
index 00000000..1f855451
Binary files /dev/null and b/tools/inputs/history/legacy-hourly-load.zip differ
diff --git a/tools/inputs/history/mappings-evidence.json b/tools/inputs/history/mappings-evidence.json
new file mode 100644
index 00000000..faef37f0
--- /dev/null
+++ b/tools/inputs/history/mappings-evidence.json
@@ -0,0 +1,126 @@
+[
+ {
+ "endpoint": "np4-158-sg/dam_essps",
+ "fixture": "np4-158-sg-history-current.csv",
+ "file": "cdr.00013058.0000000000000000.20260907.123434.DAMELECTRICALLYSIMILARSTLPNTNP4158CD.csv",
+ "csv_rows": 11700,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-08",
+ "hourEnding": "01:00",
+ "settlementPoint": "CHAMON_UN1",
+ "groupIndex": 1,
+ "updateTime": "2026-09-07T12:30:32",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 11700
+ },
+ {
+ "endpoint": "np4-158-sg/dam_essps",
+ "fixture": "np4-158-sg-history-samples.csv",
+ "file": "cdr.00013058.0000000000000000.20260528.123515.DAMELECTRICALLYSIMILARSTLPNTNP4158CD.csv",
+ "csv_rows": 11296,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-05-29",
+ "hourEnding": "01:00",
+ "settlementPoint": "CHAMON_UN1",
+ "groupIndex": 1,
+ "updateTime": "2026-05-28T12:30:15",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 11296
+ },
+ {
+ "endpoint": "np4-159-cd/load_distribution_factors",
+ "fixture": "np4-159-cd-history-current.csv",
+ "file": "cdr.00012324.0000000000000000.20260814.153148.LDFNP4159.csv",
+ "csv_rows": 1494864,
+ "first_row": {
+ "postedDatetime": null,
+ "LDFDate": "2026-08-15",
+ "LDFHour": "01:00",
+ "substation": "MIRAGE",
+ "distributionFactor": "0",
+ "loadId": "01NPS-XFM-0001",
+ "MVARDistributionFactor": "0",
+ "MRIDLoad": "6f09b475-c893-40f6-bcc8-3427ca4c9ed4",
+ "DSTFlag": false
+ },
+ "rows_decoded": 1494864
+ },
+ {
+ "endpoint": "np4-159-cd/load_distribution_factors",
+ "fixture": "np4-159-cd-history-samples.csv",
+ "file": "cdr.00012324.0000000000000000.20140501.000020.LFDFNP4159.csv",
+ "csv_rows": 913920,
+ "first_row": {
+ "postedDatetime": null,
+ "LDFDate": "2014-05-02",
+ "LDFHour": "01:00",
+ "substation": "SNOOK",
+ "distributionFactor": "0",
+ "loadId": "050",
+ "MVARDistributionFactor": "0.603000342845917",
+ "MRIDLoad": "{356A1C81-051D-432E-A1E7-2B63E50840C3}",
+ "DSTFlag": false
+ },
+ "rows_decoded": 913920
+ },
+ {
+ "endpoint": "np4-200-cd/dam_de_energized_spbc",
+ "fixture": "np4-200-cd-history-current.csv",
+ "file": "cdr.00013063.0000000000000000.20260907.123434.DAMDEENERGUZEDSTLPNTNP4200.csv",
+ "csv_rows": 802,
+ "first_row": {
+ "deliveryDate": "2026-09-08",
+ "hourEnding": "01:00",
+ "repeatedHourFlag": false,
+ "settlementPoint": "APCH_BES_RN"
+ },
+ "rows_decoded": 802
+ },
+ {
+ "endpoint": "np4-200-cd/dam_de_energized_spbc",
+ "fixture": "np4-200-cd-history-samples.csv",
+ "file": "cdr.00013063.0000000000000000.20260731.123726.DAMDEENERGUZEDSTLPNTNP4200.csv",
+ "csv_rows": 726,
+ "first_row": {
+ "deliveryDate": "2026-08-01",
+ "hourEnding": "01:00",
+ "repeatedHourFlag": false,
+ "settlementPoint": "ARMD_SLR_RN"
+ },
+ "rows_decoded": 726
+ },
+ {
+ "endpoint": "np4-231-cd/electrical_bus_map_heur_price",
+ "fixture": "np4-231-cd-history-current.csv",
+ "file": "cdr.00013098.0000000000000000.20260907.055000.DAMSCEDEBUSMAPPINGNP4231.csv",
+ "csv_rows": 8022,
+ "first_row": {
+ "postedDatetime": null,
+ "marketType": "DAM",
+ "fromEBName": "0014_EB",
+ "toEBName": "DOWGEN_040",
+ "type": "Equal",
+ "priority": "1"
+ },
+ "rows_decoded": 8022
+ },
+ {
+ "endpoint": "np4-231-cd/electrical_bus_map_heur_price",
+ "fixture": "np4-231-cd-history-samples.csv",
+ "file": "cdr.00013098.0000000000000000.20260731.055000.DAMSCEDEBUSMAPPINGNP4231.csv",
+ "csv_rows": 7942,
+ "first_row": {
+ "postedDatetime": null,
+ "marketType": "DAM",
+ "fromEBName": "0014_EB",
+ "toEBName": "DOWGEN_040",
+ "type": "Equal",
+ "priority": "1"
+ },
+ "rows_decoded": 7942
+ }
+]
diff --git a/tools/inputs/history/market-availability.json b/tools/inputs/history/market-availability.json
new file mode 100644
index 00000000..8526bc9c
--- /dev/null
+++ b/tools/inputs/history/market-availability.json
@@ -0,0 +1,284 @@
+{
+ "checkedAt": "2026-09-08T02:50:46.762333+00:00",
+ "supplementalCheckedAt": "2026-09-08T02:54:10.989159+00:00",
+ "scope": "Point-in-time listing boundaries, not a claim of uninterrupted row coverage. Archive bounds freeze publication time. Bundle dates describe bundle posting rather than member issue time.",
+ "source": "ERCOT Public Reports API /archive/{product} and /bundle/{product}; archive final page checked after confirming postDatetime DESC order.",
+ "archivePostedTo": "2026-09-07T21:50:46.762324",
+ "supplementalArchivePostedTo": "2026-09-07T21:54:10.987725",
+ "products": [
+ {
+ "product": "np4-190-cd",
+ "name": "DAM settlement prices",
+ "archiveDocuments": 4513,
+ "earliestArchive": {
+ "docId": 446428304,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2014-05-01T12:59:25"
+ },
+ "latestArchive": {
+ "docId": 1271688868,
+ "friendlyName": "DAMSPNP4190_csv",
+ "postDatetime": "2026-09-07T12:32:52"
+ },
+ "bundleCount": 103,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np6-905-cd",
+ "name": "Real-time settlement prices",
+ "archiveDocuments": 433143,
+ "earliestArchive": {
+ "docId": 446376890,
+ "friendlyName": "SPPHLZNP6905_20140501_0000_csv",
+ "postDatetime": "2014-05-01T00:02:05.910000"
+ },
+ "latestArchive": {
+ "docId": 1271834511,
+ "friendlyName": "SPPHLZNP6905_20260907_2145_csv",
+ "postDatetime": "2026-09-07T21:47:01"
+ },
+ "bundleCount": 103,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np4-188-cd",
+ "name": "DAM ancillary-service prices",
+ "archiveDocuments": 4513,
+ "earliestArchive": {
+ "docId": 446428298,
+ "friendlyName": "DAMCPCNP4188_csv",
+ "postDatetime": "2014-05-01T12:59:23"
+ },
+ "latestArchive": {
+ "docId": 1271688863,
+ "friendlyName": "DAMCPCNP4188_csv",
+ "postDatetime": "2026-09-07T12:32:52"
+ },
+ "bundleCount": 103,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np6-345-cd",
+ "name": "Actual system load by weather zone",
+ "archiveDocuments": 4512,
+ "earliestArchive": {
+ "docId": 446396866,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2014-05-01T05:50:00"
+ },
+ "latestArchive": {
+ "docId": 1271571171,
+ "friendlyName": "ACTUALSYSLOADWZNP6345_csv",
+ "postDatetime": "2026-09-07T05:50:00"
+ },
+ "bundleCount": 102,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-06-30T23:59:59"
+ },
+ {
+ "product": "np3-561-cd",
+ "name": "Weather-zone load forecast",
+ "archiveDocuments": 67363,
+ "earliestArchive": {
+ "docId": 642522821,
+ "friendlyName": "LFCWEATHERNP3561_csv",
+ "postDatetime": "2019-01-01T00:30:00"
+ },
+ "latestArchive": {
+ "docId": 1271830404,
+ "friendlyName": "LFCWEATHERNP3561_csv",
+ "postDatetime": "2026-09-07T21:30:00"
+ },
+ "bundleCount": 5,
+ "earliestBundlePostedAt": "2026-03-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np4-732-cd",
+ "name": "Wind actual/forecast",
+ "archiveDocuments": 108259,
+ "earliestArchive": {
+ "docId": 446378693,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2014-05-01T00:32:32.026000"
+ },
+ "latestArchive": {
+ "docId": 1271821829,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2026-09-07T20:55:12"
+ },
+ "bundleCount": 102,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-06-30T23:59:59"
+ },
+ {
+ "product": "np4-737-cd",
+ "name": "Solar actual/forecast",
+ "archiveDocuments": 92683,
+ "earliestArchive": {
+ "docId": 509506529,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2016-02-10T00:31:11.247000"
+ },
+ "latestArchive": {
+ "docId": 1271821820,
+ "friendlyName": "PVGRHRLYAVGACTNP4737_csv",
+ "postDatetime": "2026-09-07T20:55:12"
+ },
+ "bundleCount": 102,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-06-30T23:59:59"
+ },
+ {
+ "product": "np1-346-er",
+ "name": "Unplanned resource outages",
+ "archiveDocuments": 1371,
+ "earliestArchive": {
+ "docId": 881371516,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2022-12-07T05:06:18"
+ },
+ "latestArchive": {
+ "docId": 1271555662,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2026-09-07T05:01:06"
+ },
+ "bundleCount": 44,
+ "earliestBundlePostedAt": "2022-12-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np6-331-cd",
+ "name": "Real-time ancillary prices (15 min)",
+ "archiveDocuments": 23895,
+ "earliestArchive": {
+ "docId": 1167875528,
+ "friendlyName": "MCPC15MinNP6331_csv",
+ "postDatetime": "2025-12-05T00:02:00"
+ },
+ "latestArchive": {
+ "docId": 1271834710,
+ "friendlyName": "MCPC15MinNP6331_csv",
+ "postDatetime": "2026-09-07T21:47:00"
+ },
+ "bundleCount": 8,
+ "earliestBundlePostedAt": "2025-12-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np6-332-cd",
+ "name": "Real-time ancillary prices (SCED)",
+ "archiveDocuments": 80639,
+ "earliestArchive": {
+ "docId": 1167876108,
+ "friendlyName": "SCEDMCPCNP6332_csv",
+ "postDatetime": "2025-12-05T00:05:21"
+ },
+ "latestArchive": {
+ "docId": 1271835600,
+ "friendlyName": "SCEDMCPCNP6332_csv",
+ "postDatetime": "2026-09-07T21:50:25"
+ },
+ "bundleCount": 8,
+ "earliestBundlePostedAt": "2025-12-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np6-86-cd",
+ "name": "SCED binding constraints",
+ "archiveDocuments": 96576,
+ "earliestArchive": {
+ "docId": 446377120,
+ "friendlyName": "SCEDBTCNP686_csv",
+ "postDatetime": "2014-05-01T00:05:01.326000"
+ },
+ "latestArchive": {
+ "docId": 1271824076,
+ "friendlyName": "SCEDBTCNP686_csv",
+ "postDatetime": "2026-09-07T21:05:00"
+ },
+ "bundleCount": 103,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ },
+ {
+ "product": "np3-233-cd",
+ "name": "Hourly resource outage capacity",
+ "archiveDocuments": 108277,
+ "earliestArchive": {
+ "docId": 446376882,
+ "friendlyName": "HRLYRESOUTCAPNP3233_csv",
+ "postDatetime": "2014-05-01T00:00:40.455000"
+ },
+ "latestArchive": {
+ "docId": 1271823184,
+ "friendlyName": "HRLYRESOUTCAPNP3233_csv",
+ "postDatetime": "2026-09-07T21:00:47"
+ },
+ "bundleCount": 102,
+ "earliestBundlePostedAt": "2018-01-31T23:59:59",
+ "latestBundlePostedAt": "2026-06-30T23:59:59"
+ },
+ {
+ "product": "np6-329-cd",
+ "name": "Indicative real-time ancillary prices",
+ "archiveDocuments": 79661,
+ "earliestArchive": {
+ "docId": 1167875194,
+ "friendlyName": "RTDMCPCNP6329_20251205_000003_csv",
+ "postDatetime": "2025-12-05T00:00:44"
+ },
+ "latestArchive": {
+ "docId": 1271835680,
+ "friendlyName": "RTDMCPCNP6329_20260907_215003_csv",
+ "postDatetime": "2026-09-07T21:51:37"
+ },
+ "bundleCount": 8,
+ "earliestBundlePostedAt": "2025-12-31T23:59:59",
+ "latestBundlePostedAt": "2026-08-31T23:59:59"
+ }
+ ],
+ "forecastPublicationCheck": {
+ "document": {
+ "docId": 642522821,
+ "friendlyName": "LFCWEATHERNP3561_csv",
+ "postDatetime": "2019-01-01T00:30:00"
+ },
+ "kind": "archive",
+ "rows": 192,
+ "firstRow": {
+ "postedDatetime": null,
+ "deliveryDate": "2019-01-01",
+ "hourEnding": "1:00",
+ "coast": "9566.0996",
+ "east": "1414.37",
+ "farWest": "2954.29",
+ "north": "942.583",
+ "northCentral": "11252.9004",
+ "southCentral": "6163.46",
+ "southern": "3024.51",
+ "west": "1634.28",
+ "systemTotal": "36952.493",
+ "DSTFlag": false
+ },
+ "lastRow": {
+ "postedDatetime": null,
+ "deliveryDate": "2019-01-08",
+ "hourEnding": "24:00",
+ "coast": "9504.0664",
+ "east": "1249.0825",
+ "farWest": "2947.9585",
+ "north": "843.338",
+ "northCentral": "10714.7715",
+ "southCentral": "5352.1475",
+ "southern": "2492.3286",
+ "west": "1507.5747",
+ "systemTotal": "34611.2677",
+ "DSTFlag": false
+ },
+ "rowsWithEmbeddedPostedDatetime": 0
+ }
+}
diff --git a/tools/inputs/history/member-coverage-evidence.json b/tools/inputs/history/member-coverage-evidence.json
new file mode 100644
index 00000000..5ef4d9db
--- /dev/null
+++ b/tools/inputs/history/member-coverage-evidence.json
@@ -0,0 +1,6162 @@
+{
+ "audits": [
+ {
+ "audit": "history-member-audit",
+ "scope": "CSV headers and up to three rows in saved source archives; not all retained files or all rows. Report Info worksheets are report/column documentation.",
+ "formats": {
+ ".csv": 433,
+ ".zip": 210,
+ ".xlsx": 18,
+ ".pdf": 2,
+ ".xml": 2
+ },
+ "csvFilesWithExactlyOneReader": 433,
+ "unselectedDocumentationSheets": 14,
+ "files": [
+ {
+ "sample": "work/history-samples/COPG-316.zip",
+ "member": "1243154773.rpt.00011130.0000000000000000.20260626.080644.LoadEstCounts_20260626.csv",
+ "reader": "copg-316/load_estimation_counts"
+ },
+ {
+ "sample": "work/history-samples/EIA-930-ER.zip",
+ "member": "472125720.rpt.00013458.0000000000000000.20150209.104338218.DLYBALOPSRPT.csv",
+ "reader": "eia-930-er/daily_operations"
+ },
+ {
+ "sample": "work/history-samples/GEN-55-CD.zip/502991336.cdr.00013499.0000000000000000.20151210.182000994.HOURLYLFvsACTUALGEN55_csv.zip",
+ "member": "cdr.00013499.0000000000000000.20151210.182000.HOURLYLFvsACTUALGEN55.csv",
+ "reader": "gen-55-cd/hrly_rt_load_fcast_actual"
+ },
+ {
+ "sample": "work/history-samples/NP1-300.zip",
+ "member": "1232383729.rpt.00012360.0000000000000000.20260529.084556.20260526_PublicAML.csv",
+ "reader": "np1-300/adjusted_meter_load"
+ },
+ {
+ "sample": "work/history-samples/NP1-301.zip/446395379.rpt.00010038.0000000000000000.20140501.051707072.CompleteCOP_03022014.zip",
+ "member": "CompleteCOP_03022014.csv",
+ "reader": "np1-301/60_cop_adj_period_snapshot"
+ },
+ {
+ "sample": "work/history-samples/NP1-302.zip/675511799.rpt.00010039.0000000000000000.20190824.050839.AS_Obligation_And_Responsibility_02252019.zip",
+ "member": "AS_Obligation_And_Responsibility_02252019.csv",
+ "reader": "np1-302/as_obligation"
+ },
+ {
+ "sample": "work/history-samples/NP3-161-CD.zip/1242937736.cdr.00022470.0000000000000000.20260625.180007.PLANNEDOUTAGECAP7DAYPLUSNP3161_csv.zip",
+ "member": "cdr.00022470.0000000000000000.20260625.180007.PLANNEDOUTAGECAP7DAYPLUSNP3161.csv",
+ "reader": "np3-161-cd/7d_plus_avail_res_poc_margin"
+ },
+ {
+ "sample": "work/history-samples/NP3-162-CD.zip/1242924943.cdr.00022469.0000000000000000.20260625.170503.PLANNEDOUTAGECAP7DAYNP3162_csv.zip",
+ "member": "cdr.00022469.0000000000000000.20260625.170503.PLANNEDOUTAGECAP7DAYNP3162.csv",
+ "reader": "np3-162-cd/7d_avail_res_poc_margin"
+ },
+ {
+ "sample": "work/history-samples/NP3-233-CD.zip/446376882.cdr.00013103.0000000000000000.20140501.000040455.HRLYRESOUTCAPNP3233_csv.zip",
+ "member": "cdr.00013103.0000000000000000.20140501.000040.HRLYRESOUTCAPNP3233.csv",
+ "reader": "np3-233-cd/hourly_res_outage_cap"
+ },
+ {
+ "sample": "work/history-samples/NP3-257-EX.zip/642535651.ext.00013230.0000000000000000.20190101.031248.48h_Highest_Price_Bids_Selected_Dispatched_in_SCED.zip",
+ "member": "48h_Highest_Price_Bids_Selected_Dispatched_in_SCED-01-JAN-19.csv",
+ "reader": "np3-257-ex/3d_high_price_bids_sel_disp_sced"
+ },
+ {
+ "sample": "work/history-samples/NP3-560-CD.zip/642522820.cdr.00012311.0000000000000000.20190101.003000.LFCCONGESTNP3560_csv.zip",
+ "member": "cdr.00012311.0000000000000000.20190101.003000.LFCCONGESTNP3560.csv",
+ "reader": "np3-560-cd/7d_load_fcast_by_fzn"
+ },
+ {
+ "sample": "work/history-samples/NP3-561-CD.zip/642522821.cdr.00012312.0000000000000000.20190101.003000.LFCWEATHERNP3561_csv.zip",
+ "member": "cdr.00012312.0000000000000000.20190101.003000.LFCWEATHERNP3561.csv",
+ "reader": "np3-561-cd/7d_load_fcast_by_wzn"
+ },
+ {
+ "sample": "work/history-samples/NP3-562-CD.zip/1208218732.cdr.00016553.0000000000000000.20260326.114200.INTRAHRLOADFCASTNP3562_csv.zip",
+ "member": "cdr.00016553.0000000000000000.20260326.114200.INTRAHRLOADFCASTNP3562.csv",
+ "reader": "np3-562-cd/ih_load_fcast_by_wzn"
+ },
+ {
+ "sample": "work/history-samples/NP3-565-CD.zip/569033080.cdr.00014837.0000000000000000.20170629.113003857.LFMODWEATHERNP3565_csv.zip",
+ "member": "cdr.00014837.0000000000000000.20170629.113002.LFMODWEATHERNP3565.csv",
+ "reader": "np3-565-cd/lf_by_model_weather_zone"
+ },
+ {
+ "sample": "work/history-samples/NP3-566-CD.zip/647687525.cdr.00015953.0000000000000000.20190207.173000656.LFMODSTUDYAREA3566_csv.zip",
+ "member": "cdr.00015953.0000000000000000.20190207.173000.LFMODSTUDYAREA3566.csv",
+ "reader": "np3-566-cd/lf_by_model_study_area"
+ },
+ {
+ "sample": "work/history-samples/NP3-763-CD.zip/411835739.cdr.00012315.0000000000000000.20140312.000001000.RESCAPACITNP3763_csv.zip",
+ "member": "cdr.00012315.0000000000000000.20140312.000001.RESCAPACITNP3763.csv",
+ "reader": "np3-763-cd/st_sys_adequacy"
+ },
+ {
+ "sample": "work/history-samples/NP3-764-CD.zip/633414466.cdr.00015753.0000000000000000.20181025.171411434.HRUCONSCEDOFFCOPNP3764_csv.zip",
+ "member": "cdr.00015753.0000000000000000.20181025.171411.HRUCONSCEDOFFCOPNP3764.csv",
+ "reader": "np3-764-cd/hrly_ruc_online_sced_offline_cop"
+ },
+ {
+ "sample": "work/history-samples/NP3-765-CD.zip/1015249225.cdr.00024347.0000000000000000.20240627.170501248.APPDCTIESCHEDNP3765_csv.zip",
+ "member": "cdr.00024347.0000000000000000.20240627.170501.APPDCTIESCHEDNP3765.csv",
+ "reader": "np3-765-cd/approved_dctie_schedules"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_ECRSS-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_ecrss"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_NSPIN-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_nspin"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_ECRSM-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_ecrsm"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_NSPNM-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_nspnm"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_RRSFFR-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_rrsffr"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_RRSPFR-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_rrspfr"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_RRSUFR-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_rrsufr"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_REGDN-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_regdn"
+ },
+ {
+ "sample": "work/history-samples/NP3-906-EX.zip/1168752732.ext.00025814.0000000000000000.20251207.120547.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_REGUP-07-DEC-25.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_regup"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_edc"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_edc_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_North-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_edc_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_South-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_edc_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_West-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_edc_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_esc"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_esc_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_North-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_esc_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_South-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_esc_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-907-EX.zip/1168965306.ext.00025813.0000000000000000.20251208.033705.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_West-08-DEC-25.csv",
+ "reader": "np3-907-ex/2d_agg_esc_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Min_Energy_Supply_Curves_West-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Min_Energy_Supply_Curves_South-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Min_Energy_Supply_Curves_North-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Min_Energy_Supply_Curves_Houston-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Min_Energy_Supply_Curves-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Non_Wind-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Wind-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Supply_Curves-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Wind_West-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Wind_South-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Wind_North-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Wind_Houston-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Non_Wind_West-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Non_Wind_South-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Non_Wind_North-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Supply_Curves_Non_Wind_Houston-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_esc_non_wind_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Supply_Curves_West-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Supply_Curves_South-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Supply_Curves_North-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Supply_Curves_Houston-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Demand_Curves_West-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Demand_Curves_South-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Demand_Curves_North-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Demand_Curves_Houston-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-908-ER.zip/411909237.ext.00013054.0000000000000000.20140312.052131000.48_Hour_DAM_and_SCED_Energy_Curves.zip",
+ "member": "48h_Agg_Energy_Demand_Curves-12-MAR-14.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_PTP_Obligation_Bids_West-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_PTP_Obligation_Bids_South-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_PTP_Obligation_Bids_North-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_PTP_Obligation_Bids_Houston-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_PTP_Obligation_Bids-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_West-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_South-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_North-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_Houston-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-909-ER.zip/412023959.ext.00013055.0000000000000000.20140312.115356000.48_Hour_DAM_Offers_and_Bids.zip",
+ "member": "48h_Tot_Clrd_Ene_Bids_Ene_Offers-12-MAR-14.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Gen_Summary_South-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Gen_Summary_North-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Gen_Summary_Houston-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Load_Summary_West-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Load_Summary_South-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Load_Summary_North-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Load_Summary_Houston-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Load_Summary-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_load_summary"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_DSR_Loads-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_dsr_loads"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Gen_Summary_West-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Gen_Summary-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Output_Sched_West-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_west"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Output_Sched_South-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_south"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Output_Sched_North-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_north"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Output_Sched_Houston-01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_houston"
+ },
+ {
+ "sample": "work/history-samples/NP3-910-ER.zip/446387639.ext.00013056.0000000000000000.20140501.031648577.48_Hour_Real_Time_Gen_and_Load_Data.zip",
+ "member": "48h_Agg_Output_Sched -01-MAY-14.csv",
+ "reader": "np3-910-er/2d_agg_out_sched"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Cleared_DAM_AS_RRSLOAD-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Cleared_DAM_AS_RRSGEN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Cleared_DAM_AS_NSPIN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Cleared_DAM_AS_REGDN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Cleared_DAM_AS_REGUP-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Self_Arranged_AS_RRSLOAD-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Self_Arranged_AS_RRSGEN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Self_Arranged_AS_NSPIN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Self_Arranged_AS_REGDN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Self_Arranged_AS_REGUP-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Agg_AS_Offers_RRSNC-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Agg_AS_Offers_RRSLD-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Agg_AS_Offers_RRSGN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Agg_AS_Offers_OFFNS-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Agg_AS_Offers_ONNS-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Agg_AS_Offers_REGDN-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn"
+ },
+ {
+ "sample": "work/history-samples/NP3-911-ER.zip/446387641.ext.00013057.0000000000000000.20140501.031701422.48_Hour_AS_Disclosure.zip",
+ "member": "48h_Agg_AS_Offers_REGUP-01-MAY-14.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup"
+ },
+ {
+ "sample": "work/history-samples/NP3-914-EX.zip/1169048809.ext.00025812.0000000000000000.20251208.084650.3_day_SCED_Highest_Price_AS_Offer_Selected.zip",
+ "member": "3d_SCED_Highest_Price_AS_Offer_Selected-08-DEC-25.csv",
+ "reader": "np3-914-ex/3d_sced_high_as_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-915-EX.zip/411891731.ext.00013018.0000000000000000.20140312.042043000.48_Hour_Highest_Price_AS_Offer_Selected.zip",
+ "member": "2day_Highest_Price_AS_Offer_Selected-12-MAR-14.csv",
+ "reader": "np3-915-ex/3d_dam_high_as_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-916-EX.zip/642535653.ext.00013029.0000000000000000.20190101.032742.48_Hour_Highest_Price_Offered_SCED.zip",
+ "member": "48h_Highest_Price_Offered_SCED-01-JAN-19.csv",
+ "reader": "np3-916-ex/3d_highest_price_offer_sced"
+ },
+ {
+ "sample": "work/history-samples/NP3-965-ER.zip/446390848.ext.00013052.0000000000000000.20140501.041714833.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load Resource_Data_in_SCED-01-MAY-14.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-samples/NP3-965-ER.zip/446390848.ext.00013052.0000000000000000.20140501.041714833.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-01-MAY-14.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-samples/NP3-965-ER.zip/446390848.ext.00013052.0000000000000000.20140501.041714833.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-01-MAY-14.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-samples/NP3-965-ER.zip/446390848.ext.00013052.0000000000000000.20140501.041714833.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-01-MAY-14.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-samples/NP3-965-ER.zip/446390848.ext.00013052.0000000000000000.20140501.041714833.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-01-MAY-14.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-samples/NP3-965-ER.zip/446390848.ext.00013052.0000000000000000.20140501.041714833.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-01-MAY-14.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_Option-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBidAwards-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBids-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_energy_bids"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOfferAwards-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOffers-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_ASOffers-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_Data-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_load_res_data"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Generation_Resource_ASOffers-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Gen_Resource_Data-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_QSE_Self_Arranged_AS-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBidAwards-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBids-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids"
+ },
+ {
+ "sample": "work/history-samples/NP3-966-ER.zip/446390849.ext.00013051.0000000000000000.20140501.041715861.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-01-MAY-14.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards"
+ },
+ {
+ "sample": "work/history-samples/NP3-987-EX.zip/414522240.ext.00010047.0000000000000000.20140319.181654000.7day_Event_Trigger.zip",
+ "member": "7day_Event_Trigger_LMP_Exceeds_50XFIP-19-MAR-14.csv",
+ "reader": "np3-987-ex/7d_trig_lmp_50xfip"
+ },
+ {
+ "sample": "work/history-samples/NP3-988-ER.zip",
+ "member": "1166614741.rpt.00010036.0000000000000000.20251201.051353614.ResDMEList_01122025.csv",
+ "reader": "np3-988-er/resources"
+ },
+ {
+ "sample": "work/history-samples/NP3-990-EX.zip/639826315.ext.00015833.0000000000000000.20181212.050438743.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Generation_Resource_AS_Offers-12-DEC-18.csv",
+ "reader": "np3-990-ex/60_sasm_gen_res_as_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-990-EX.zip/639826315.ext.00015833.0000000000000000.20181212.050438743.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Load_Resource_AS_Offers-12-DEC-18.csv",
+ "reader": "np3-990-ex/60_sasm_load_res_as_offers"
+ },
+ {
+ "sample": "work/history-samples/NP3-990-EX.zip/639826315.ext.00015833.0000000000000000.20181212.050438743.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Load_Resource_AS_Offer_Awards-12-DEC-18.csv",
+ "reader": "np3-990-ex/60_sasm_load_res_as_offer_awards"
+ },
+ {
+ "sample": "work/history-samples/NP3-990-EX.zip/639826315.ext.00015833.0000000000000000.20181212.050438743.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Generation_Resource_AS_Offer_Awards-12-DEC-18.csv",
+ "reader": "np3-990-ex/60_sasm_gen_res_as_offer_awards"
+ },
+ {
+ "sample": "work/history-samples/NP3-991-EX.zip/647787063.ext.00015943.0000000000000000.20190208.102119071.60_Day_COP_Disclosure.zip",
+ "member": "60d_Complete_COP-08-FEB-19.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ },
+ {
+ "sample": "work/history-samples/NP4-158-SG.zip/1232068283.cdr.00013058.0000000000000000.20260528.123515.DAMELECTRICALLYSIMILARSTLPNTNP4158CD_csv.zip",
+ "member": "cdr.00013058.0000000000000000.20260528.123515.DAMELECTRICALLYSIMILARSTLPNTNP4158CD.csv",
+ "reader": "np4-158-sg/dam_essps"
+ },
+ {
+ "sample": "work/history-samples/NP4-159-CD.zip/446377636.cdr.00012324.0000000000000000.20140501.001431319.LFDFNP4159_csv.zip",
+ "member": "cdr.00012324.0000000000000000.20140501.000020.LFDFNP4159.csv",
+ "reader": "np4-159-cd/load_distribution_factors"
+ },
+ {
+ "sample": "work/history-samples/NP4-179-CD.zip/446428288.cdr.00012327.0000000000000000.20140501.125912075.TASONP4179_csv.zip",
+ "member": "cdr.00012327.0000000000000000.20140501.125911.TASONP4179.csv",
+ "reader": "np4-179-cd/total_as_service_offers"
+ },
+ {
+ "sample": "work/history-samples/NP4-183-CD.zip/446429071.cdr.00012328.0000000000000000.20140501.130102518.DAMHRLMPNP4183_csv.zip",
+ "member": "cdr.00012328.0000000000000000.20140501.125925.DAMHRLMPNP4183.csv",
+ "reader": "np4-183-cd/dam_hourly_lmp"
+ },
+ {
+ "sample": "work/history-samples/NP4-188-CD.zip/446428298.cdr.00012329.0000000000000000.20140501.125923528.DAMCPCNP4188_csv.zip",
+ "member": "cdr.00012329.0000000000000000.20140501.125923.DAMCPCNP4188.csv",
+ "reader": "np4-188-cd/dam_clear_price_for_cap"
+ },
+ {
+ "sample": "work/history-samples/NP4-19-CD.zip/412050916.cdr.00012330.0000000000000000.20140312.131116000.DAMASAGGNP419_csv.zip",
+ "member": "cdr.00012330.0000000000000000.20140312.131116.DAMASAGGNP419.csv",
+ "reader": "np4-19-cd/dam_agg_as_offer_curve"
+ },
+ {
+ "sample": "work/history-samples/NP4-190-CD.zip/446428304.cdr.00012331.0000000000000000.20140501.125925598.DAMSPNP4190_csv.zip",
+ "member": "cdr.00012331.0000000000000000.20140501.125924.DAMSPNP4190.csv",
+ "reader": "np4-190-cd/dam_stlmnt_pnt_prices"
+ },
+ {
+ "sample": "work/history-samples/NP4-191-CD.zip/446428286.cdr.00012332.0000000000000000.20140501.125911783.DASPBCNP4191_csv.zip",
+ "member": "cdr.00012332.0000000000000000.20140501.125911.DASPBCNP4191.csv",
+ "reader": "np4-191-cd/dam_shadow_prices"
+ },
+ {
+ "sample": "work/history-samples/NP4-192-CD.zip/412048751.cdr.00012333.0000000000000000.20140312.131027000.DAMTOTQTYENGYBUYNP4192_csv.zip",
+ "member": "cdr.00012333.0000000000000000.20140312.131027.DAMTOTQTYENGYBUYNP4192.csv",
+ "reader": "np4-192-cd/dam_total_energy_purchased"
+ },
+ {
+ "sample": "work/history-samples/NP4-193-CD.zip/412048778.cdr.00012334.0000000000000000.20140312.131028000.DAMTOTQTYENGYSOLDNP4193_csv.zip",
+ "member": "cdr.00012334.0000000000000000.20140312.131028.DAMTOTQTYENGYSOLDNP4193.csv",
+ "reader": "np4-193-cd/total_dam_energy_sold"
+ },
+ {
+ "sample": "work/history-samples/NP4-194-CD.zip/1242856628.cdr.00013042.0000000000000000.20260625.125059.DAMPTPOBLSPNP4194_csv.zip",
+ "member": "cdr.00013042.0000000000000000.20260625.125059.DAMPTPOBLSPNP4194.csv",
+ "reader": "np4-194-cd/dam_ptp_obligation_sp_results"
+ },
+ {
+ "sample": "work/history-samples/NP4-196-M.zip/489329315.cdr.00013044.0000000000000000.20150803.144726954.pricecorrection_DAM_EBLMP_20150731_to_20150731_NP4196_csv.zip",
+ "member": "cdr.00013044.0000000000000000.20150803.144726.pricecorrection_DAM_EBLMP_20150731_to_20150731_NP4196.csv",
+ "reader": "np4-196-m/dam_price_corrections_eblmp"
+ },
+ {
+ "sample": "work/history-samples/NP4-197-M.zip/449144186.cdr.00013045.0000000000000000.20140602.091835995.pricecorrection_RTM_SPP_20140529_to_20140529_NP4197_csv.zip",
+ "member": "cdr.00013045.0000000000000000.20140602.091835.pricecorrection_RTM_SPP_20140529_to_20140529_NP4197.csv",
+ "reader": "np4-197-m/rtm_price_corrections_spp"
+ },
+ {
+ "sample": "work/history-samples/NP4-200-CD.zip/1256809428.cdr.00013063.0000000000000000.20260731.123726.DAMDEENERGUZEDSTLPNTNP4200_csv.zip",
+ "member": "cdr.00013063.0000000000000000.20260731.123726.DAMDEENERGUZEDSTLPNTNP4200.csv",
+ "reader": "np4-200-cd/dam_de_energized_spbc"
+ },
+ {
+ "sample": "work/history-samples/NP4-212-CD.zip/1167941552.cdr.00024893.0000000000000000.20251205.045603.DAMSCEDASDCNP4212_csv.zip",
+ "member": "cdr.00024893.0000000000000000.20251205.045603.DAMSCEDASDCNP4212.csv",
+ "reader": "np4-212-cd/dam_sced_as_demand_curves"
+ },
+ {
+ "sample": "work/history-samples/NP4-213-CD.zip/1197966729.cdr.00026382.0000000000000000.20260226.152002.HRUCASDCNP4213_csv.zip",
+ "member": "cdr.00026382.0000000000000000.20260226.152002.HRUCASDCNP4213.csv",
+ "reader": "np4-213-cd/hruc_as_demand_curves"
+ },
+ {
+ "sample": "work/history-samples/NP4-214-CD.zip/1198328598.cdr.00026383.0000000000000000.20260227.145758.DRUCASDCNP4214_csv.zip",
+ "member": "cdr.00026383.0000000000000000.20260227.145758.DRUCASDCNP4214.csv",
+ "reader": "np4-214-cd/druc_as_demand_curves"
+ },
+ {
+ "sample": "work/history-samples/NP4-215-CD.zip/1198131169.cdr.00026384.0000000000000000.20260227.024604.WRUCASDCNP4215_csv.zip",
+ "member": "cdr.00026384.0000000000000000.20260227.024604.WRUCASDCNP4215.csv",
+ "reader": "np4-215-cd/wruc_as_demand_curves"
+ },
+ {
+ "sample": "work/history-samples/NP4-231-CD.zip/1256687028.cdr.00013098.0000000000000000.20260731.055000.DAMSCEDEBUSMAPPINGNP4231_csv.zip",
+ "member": "cdr.00013098.0000000000000000.20260731.055000.DAMSCEDEBUSMAPPINGNP4231.csv",
+ "reader": "np4-231-cd/electrical_bus_map_heur_price"
+ },
+ {
+ "sample": "work/history-samples/NP4-33-CD.zip/446393139.cdr.00012316.0000000000000000.20140501.050000639.ASPLANNP433_csv.zip",
+ "member": "cdr.00012316.0000000000000000.20140501.050000.ASPLANNP433.csv",
+ "reader": "np4-33-cd/dam_as_plan"
+ },
+ {
+ "sample": "work/history-samples/NP4-412-CD.zip/1167875543.cdr.00024885.0000000000000000.20251205.000202258.EPPCumulativeHrsNP4412_20251205_0000_csv.zip",
+ "member": "cdr.00024885.0000000000000000.20251205.000200.EPPCumulativeHrsNP4412_20251205_0000.csv",
+ "reader": "np4-412-cd/epp_cumulative_hours"
+ },
+ {
+ "sample": "work/history-samples/NP4-442-CD.zip/727773117.cdr.00019385.0000000000000000.20200806.165536352.HRLYSTWPFWGRPPFCSTMODLNP4442_csv.zip",
+ "member": "cdr.00019385.0000000000000000.20200806.165536.HRLYSTWPFWGRPPFCSTMODLNP4442.csv",
+ "reader": "np4-442-cd/hrly_sys_reg_wind_fcast_model"
+ },
+ {
+ "sample": "work/history-samples/NP4-443-CD.zip/1208221346.cdr.00021811.0000000000000000.20260326.115500.HRLYSTPPFPVGRPPFCSTMODLNP4443_csv.zip",
+ "member": "cdr.00021811.0000000000000000.20260326.115500.HRLYSTPPFPVGRPPFCSTMODLNP4443.csv",
+ "reader": "np4-443-cd/hrly_sys_reg_solar_fcast_model"
+ },
+ {
+ "sample": "work/history-samples/NP4-523-CD.zip/446428299.cdr.00013113.0000000000000000.20140501.125923531.DAMSYSLAMBDANP4523_csv.zip",
+ "member": "cdr.00013113.0000000000000000.20140501.125923.DAMSYSLAMBDANP4523.csv",
+ "reader": "np4-523-cd/dam_system_lambda"
+ },
+ {
+ "sample": "work/history-samples/NP4-532-CD.zip/1168078209.cdr.00024888.0000000000000000.20251205.131140.DAMASSOLDNP4532_csv.zip",
+ "member": "cdr.00024888.0000000000000000.20251205.131140.DAMASSOLDNP4532.csv",
+ "reader": "np4-532-cd/dam_as_sold"
+ },
+ {
+ "sample": "work/history-samples/NP4-722-CD.zip/1243100212.cdr.00012325.0000000000000000.20260626.050000.WANP4722_csv.zip",
+ "member": "cdr.00012325.0000000000000000.20260626.050000.WANP4722.csv",
+ "reader": "np4-722-cd/weather_assumptions"
+ },
+ {
+ "sample": "work/history-samples/NP4-732-CD.zip/446378693.cdr.00013028.0000000000000000.20140501.003232026.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20140501.003231.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-samples/NP4-733-CD.zip/446376884.cdr.00013071.0000000000000000.20140501.000053912.WPP5MINAVGACTNP4733_csv.zip",
+ "member": "cdr.00013071.0000000000000000.20140501.000053.WPP5MINAVGACTNP4733.csv",
+ "reader": "np4-733-cd/wpp_actual_5min_avg_values"
+ },
+ {
+ "sample": "work/history-samples/NP4-737-CD.zip/509506529.cdr.00013483.0000000000000000.20160210.003111247.PVGRHRLYAVGACTNP4737_csv.zip",
+ "member": "cdr.00013483.0000000000000000.20160210.003110.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-samples/NP4-738-CD.zip/509504026.cdr.00013484.0000000000000000.20160210.000007519.PVGR5MINAVGACTNP4738_csv.zip",
+ "member": "cdr.00013484.0000000000000000.20160210.000006.PVGR5MINAVGACTNP4738.csv",
+ "reader": "np4-738-cd/spp_actual_5min_avg_values"
+ },
+ {
+ "sample": "work/history-samples/NP4-742-CD.zip/562811009.cdr.00014787.0000000000000000.20170511.153109607.WPPHRLYAVGACTGEONP4742_csv.zip",
+ "member": "cdr.00014787.0000000000000000.20170511.153109.WPPHRLYAVGACTGEONP4742.csv",
+ "reader": "np4-742-cd/wpp_hrly_actual_fcast_geo"
+ },
+ {
+ "sample": "work/history-samples/NP4-743-CD.zip/562807721.cdr.00014788.0000000000000000.20170511.145532532.WPP5MINAVGACTGEONP4743_csv.zip",
+ "member": "cdr.00014788.0000000000000000.20170511.145532.WPP5MINAVGACTGEONP4743.csv",
+ "reader": "np4-743-cd/wpp_actual_5min_avg_values_geo"
+ },
+ {
+ "sample": "work/history-samples/NP4-745-CD.zip/848948663.cdr.00021809.0000000000000000.20220630.165528984.PVGRHRLYAVGACTGEONP4745_csv.zip",
+ "member": "cdr.00021809.0000000000000000.20220630.165528.PVGRHRLYAVGACTGEONP4745.csv",
+ "reader": "np4-745-cd/spp_hrly_actual_fcast_geo"
+ },
+ {
+ "sample": "work/history-samples/NP4-746-CD.zip/848947757.cdr.00021810.0000000000000000.20220630.164527349.PVGR5MINAVGACTGEONP4746_csv.zip",
+ "member": "cdr.00021810.0000000000000000.20220630.164527.PVGR5MINAVGACTGEONP4746.csv",
+ "reader": "np4-746-cd/spp_actual_5min_avg_values_geo"
+ },
+ {
+ "sample": "work/history-samples/NP4-751-CD.zip/1208218722.cdr.00016554.0000000000000000.20260326.114200.INTRAHRWINDFCASTNP4751_csv.zip",
+ "member": "cdr.00016554.0000000000000000.20260326.114200.INTRAHRWINDFCASTNP4751.csv",
+ "reader": "np4-751-cd/ih_wind_fcast_geo"
+ },
+ {
+ "sample": "work/history-samples/NP4-752-CD.zip/1208218726.cdr.00021812.0000000000000000.20260326.114200.INTRAHRSOLARFCASTNP4752_csv.zip",
+ "member": "cdr.00021812.0000000000000000.20260326.114200.INTRAHRSOLARFCASTNP4752.csv",
+ "reader": "np4-752-cd/ih_solar_fcast_geo"
+ },
+ {
+ "sample": "work/history-samples/NP4-790-CD.zip/1242907999.cdr.00012348.0000000000000000.20260625.160000.PNMNP4790_csv.zip",
+ "member": "cdr.00012348.0000000000000000.20260625.160000.PNMNP4790.csv",
+ "reader": "np4-790-cd/peaker_net_margin"
+ },
+ {
+ "sample": "work/history-samples/NP4-791-CD.zip/411898807.cdr.00012349.0000000000000000.20140312.050000000.SWOCNP4791_csv.zip",
+ "member": "cdr.00012349.0000000000000000.20140312.050000.SWOCNP4791.csv",
+ "reader": "np4-791-cd/da_sw_offer_caps"
+ },
+ {
+ "sample": "work/history-samples/NP5-108-CD.zip/1232059984.cdr.00010016.0000000000000000.20260528.120500.RMRServicesDeployedNP5108_csv.zip",
+ "member": "cdr.00010016.0000000000000000.20260528.120500.RMRServicesDeployedNP5108.csv",
+ "reader": "np5-108-cd/hrly_rmr_services_deployed"
+ },
+ {
+ "sample": "work/history-samples/NP5-525-CD.zip/1167915291.cdr.00024897.0000000000000000.20251205.025832.WRUCASDFNP5525_csv.zip",
+ "member": "cdr.00024897.0000000000000000.20251205.025832.WRUCASDFNP5525.csv",
+ "reader": "np5-525-cd/wruc_as_deploy_factors"
+ },
+ {
+ "sample": "work/history-samples/NP5-526-CD.zip/1167940578.cdr.00024886.0000000000000000.20251205.045501.ProjectedASDFNP5526_csv.zip",
+ "member": "cdr.00024886.0000000000000000.20251205.045501.ProjectedASDFNP5526.csv",
+ "reader": "np5-526-cd/proj_as_deploy_factor"
+ },
+ {
+ "sample": "work/history-samples/NP5-527-CD.zip/1168105312.cdr.00024895.0000000000000000.20251205.145924.DRUCASDFNP5527_csv.zip",
+ "member": "cdr.00024895.0000000000000000.20251205.145924.DRUCASDFNP5527.csv",
+ "reader": "np5-527-cd/druc_as_deploy_factors"
+ },
+ {
+ "sample": "work/history-samples/NP5-528-CD.zip/1167878491.cdr.00024896.0000000000000000.20251205.001542361.HRUCASDFNP5528_csv.zip",
+ "member": "cdr.00024896.0000000000000000.20251205.001542.HRUCASDFNP5528.csv",
+ "reader": "np5-528-cd/hruc_as_deploy_factors"
+ },
+ {
+ "sample": "work/history-samples/NP5-754-CD.zip/1267791671.cdr.00012338.0000000000000000.20260828.145900.DRUCAPROVABINDTRANSNP5754_csv.zip",
+ "member": "cdr.00012338.0000000000000000.20260828.145900.DRUCAPROVABINDTRANSNP5754.csv",
+ "reader": "np5-754-cd/daily_ruc_act_and_bind_tran_const"
+ },
+ {
+ "sample": "work/history-samples/NP5-755-CD.zip/1221419789.cdr.00012336.0000000000000000.20260430.112107.HRUCAPROVABINDTRANSNP5755_csv.zip",
+ "member": "cdr.00012336.0000000000000000.20260430.112107.HRUCAPROVABINDTRANSNP5755.csv",
+ "reader": "np5-755-cd/hrly_ruc_act_and_bind_tran_const"
+ },
+ {
+ "sample": "work/history-samples/NP6-235-CD.zip/1208268870.cdr.00012340.0000000000000000.20260326.150500.SYSWIDEDEMANDNP6235_csv.zip",
+ "member": "cdr.00012340.0000000000000000.20260326.150500.SYSWIDEDEMANDNP6235.csv",
+ "reader": "np6-235-cd/system_wide_demand"
+ },
+ {
+ "sample": "work/history-samples/NP6-322-CD.zip/446376760.cdr.00013114.0000000000000000.20140501.000017128.SCEDSYSLAMBDANP6322_20140501_000014_csv.zip",
+ "member": "cdr.00013114.0000000000000000.20140501.000016.SCEDSYSLAMBDANP6322_20140501_000014.csv",
+ "reader": "np6-322-cd/sced_system_lambda"
+ },
+ {
+ "sample": "work/history-samples/NP6-323-CD.zip/449025906.cdr.00013221.0000000000000000.20140601.000109230.SCEDPriceAdderORDCNP6323_20140601_000106_csv.zip",
+ "member": "cdr.00013221.0000000000000000.20140601.000108.SCEDPriceAdderORDCNP6323_20140601_000106.csv",
+ "reader": "np6-323-cd/rt_price_adder_sced"
+ },
+ {
+ "sample": "work/history-samples/NP6-324-CD.zip/449025984.cdr.00013220.0000000000000000.20140601.000201413.RTPRICEADDERORDCNP6324_20140601_0000_csv.zip",
+ "member": "cdr.00013220.0000000000000000.20140601.000201.RTPRICEADDERORDCNP6324_20140601_0000.csv",
+ "reader": "np6-324-cd/rt_15min_price_adders"
+ },
+ {
+ "sample": "work/history-samples/NP6-325-CD.zip/449026337.cdr.00013222.0000000000000000.20140601.001015208.RTDPriceAdderORDCNP6325_20140601_001001_csv.zip",
+ "member": "cdr.00013222.0000000000000000.20140601.001014.RTDPriceAdderORDCNP6325_20140601_001001.csv",
+ "reader": "np6-325-cd/rtd_price_adders"
+ },
+ {
+ "sample": "work/history-samples/NP6-326-CD.zip/1221419302.cdr.00021115.0000000000000000.20260430.111701.SOGPRICENP6326_20260430_1115_csv.zip",
+ "member": "cdr.00021115.0000000000000000.20260430.111701.SOGPRICENP6326_20260430_1115.csv",
+ "reader": "np6-326-cd/rt_price_sog"
+ },
+ {
+ "sample": "work/history-samples/NP6-327-CD.zip/822375718.cdr.00021114.0000000000000000.20220211.000523862.SOGLMPNP6327_20220211_000520_csv.zip",
+ "member": "cdr.00021114.0000000000000000.20220211.000523.SOGLMPNP6327_20220211_000520.csv",
+ "reader": "np6-327-cd/lmp_sog_price_adders"
+ },
+ {
+ "sample": "work/history-samples/NP6-328-CD.zip/1167876118.cdr.00024887.0000000000000000.20251205.000523521.TotASResCapabilityNP6328_20251204_234516_csv.zip",
+ "member": "cdr.00024887.0000000000000000.20251205.000521.TotASResCapabilityNP6328_20251204_234516.csv",
+ "reader": "np6-328-cd/tot_as_res_cap"
+ },
+ {
+ "sample": "work/history-samples/NP6-329-CD.zip/1167875194.cdr.00024889.0000000000000000.20251205.000044392.RTDMCPCNP6329_20251205_000003_csv.zip",
+ "member": "cdr.00024889.0000000000000000.20251205.000043.RTDMCPCNP6329_20251205_000003.csv",
+ "reader": "np6-329-cd/rtd_ind_mcpc"
+ },
+ {
+ "sample": "work/history-samples/NP6-331-CD.zip/1167875528.cdr.00024898.0000000000000000.20251205.000200318.MCPC15MinNP6331_csv.zip",
+ "member": "cdr.00024898.0000000000000000.20251205.000200.MCPC15MinNP6331.csv",
+ "reader": "np6-331-cd/rt_clear_price_cap"
+ },
+ {
+ "sample": "work/history-samples/NP6-332-CD.zip/1167876108.cdr.00024891.0000000000000000.20251205.000521242.SCEDMCPCNP6332_csv.zip",
+ "member": "cdr.00024891.0000000000000000.20251205.000520.SCEDMCPCNP6332.csv",
+ "reader": "np6-332-cd/rt_clear_price_cap_sced"
+ },
+ {
+ "sample": "work/history-samples/NP6-344-CD.zip/1267624012.cdr.00015954.0000000000000000.20260828.055000.ACTUALSYSLOADSTUDYAREA6344_csv.zip",
+ "member": "cdr.00015954.0000000000000000.20260828.055000.ACTUALSYSLOADSTUDYAREA6344.csv",
+ "reader": "np6-344-cd/act_sys_load_by_study_area"
+ },
+ {
+ "sample": "work/history-samples/NP6-345-CD.zip/446396866.cdr.00013101.0000000000000000.20140501.055000870.ACTUALSYSLOADWZNP6345_csv.zip",
+ "member": "cdr.00013101.0000000000000000.20140501.055000.ACTUALSYSLOADWZNP6345.csv",
+ "reader": "np6-345-cd/act_sys_load_by_wzn"
+ },
+ {
+ "sample": "work/history-samples/NP6-346-CD.zip/569124918.cdr.00014836.0000000000000000.20170630.055001582.ACTUALSYSLOADFZNP6346_csv.zip",
+ "member": "cdr.00014836.0000000000000000.20170630.055000.ACTUALSYSLOADFZNP6346.csv",
+ "reader": "np6-346-cd/act_sys_load_by_fzn"
+ },
+ {
+ "sample": "work/history-samples/NP6-625-CD.zip/642521191.cdr.00012358.0000000000000000.20190101.001000381.SELRTEGNP6625_csv.zip",
+ "member": "cdr.00012358.0000000000000000.20190101.001000.SELRTEGNP6625.csv",
+ "reader": "np6-625-cd/se_ld_rpt_ercot_gen"
+ },
+ {
+ "sample": "work/history-samples/NP6-626-CD.zip/642521193.cdr.00012359.0000000000000000.20190101.001000909.SELRTFNP6626_csv.zip",
+ "member": "cdr.00012359.0000000000000000.20190101.001000.SELRTFNP6626.csv",
+ "reader": "np6-626-cd/se_load_dcties_flows"
+ },
+ {
+ "sample": "work/history-samples/NP6-787-CD.zip/446376773.cdr.00011485.0000000000000000.20140501.000018267.LMPSELECTBUSNP6787_20140501_000014_csv.zip",
+ "member": "cdr.00011485.0000000000000000.20140501.000017.LMPSELECTBUSNP6787_20140501_000014.csv",
+ "reader": "np6-787-cd/lmp_electrical_bus"
+ },
+ {
+ "sample": "work/history-samples/NP6-788-CD.zip/446377326.cdr.00012300.0000000000000000.20140501.000531688.LMPSROSNODENP6788_20140501_000519_csv.zip",
+ "member": "cdr.00012300.0000000000000000.20140501.000531.LMPSROSNODENP6788_20140501_000519.csv",
+ "reader": "np6-788-cd/lmp_node_zone_hub"
+ },
+ {
+ "sample": "work/history-samples/NP6-86-CD.zip/446377120.cdr.00012302.0000000000000000.20140501.000501326.SCEDBTCNP686_csv.zip",
+ "member": "cdr.00012302.0000000000000000.20140501.000501.SCEDBTCNP686.csv",
+ "reader": "np6-86-cd/shdw_prices_bnd_trns_const"
+ },
+ {
+ "sample": "work/history-samples/NP6-905-CD.zip/446376890.cdr.00012301.0000000000000000.20140501.000205910.SPPHLZNP6905_20140501_0000_csv.zip",
+ "member": "cdr.00012301.0000000000000000.20140501.000205.SPPHLZNP6905_20140501_0000.csv",
+ "reader": "np6-905-cd/spp_node_zone_hub"
+ },
+ {
+ "sample": "work/history-samples/NP6-915-CD.zip/1221417052.cdr.00013081.0000000000000000.20260430.111021.SUMHDLLDLNP6915_20260430_111019_csv.zip",
+ "member": "cdr.00013081.0000000000000000.20260430.111021.SUMHDLLDLNP6915_20260430_111019.csv",
+ "reader": "np6-915-cd/sum_hdl_ldl"
+ },
+ {
+ "sample": "work/history-samples/NP6-970-CD.zip/446376744.cdr.00013073.0000000000000000.20140501.000013383.RTDLMPRNLZHUBNP6970_20140501_000001_csv.zip",
+ "member": "cdr.00013073.0000000000000000.20140501.000012.RTDLMPRNLZHUBNP6970_20140501_000001.csv",
+ "reader": "np6-970-cd/rtd_lmp_node_zone_hub"
+ },
+ {
+ "sample": "work/history-samples/NP7-464-CD.zip/1243245246.cdr.00010042.0000000000000000.20260626.132304.DAMPTPNP7464_csv.zip",
+ "member": "cdr.00010042.0000000000000000.20260626.132304.DAMPTPNP7464.csv",
+ "reader": "np7-464-cd/dam_ptp_option_price_report"
+ },
+ {
+ "sample": "work/history-samples/NP7-535-SG.zip/1210815496.rpt.00013110.0000000000000000.20260402.113007.MAY2026MonthlyPathSpecificAdders.zip",
+ "member": "MAY2026_MonthlyPathSpecificAdders.CSV",
+ "reader": "np7-535-sg/path_adders"
+ },
+ {
+ "sample": "work/history-current/COPG-316.zip",
+ "member": "1271634378.rpt.00011130.0000000000000000.20260907.091126.LoadEstCounts_20260907.csv",
+ "reader": "copg-316/load_estimation_counts"
+ },
+ {
+ "sample": "work/history-current/EIA-930-ER.zip",
+ "member": "1271517223.rpt.00013458.0000000000000000.20260907.022611.ERCODAILY2502026.csv",
+ "reader": "eia-930-er/daily_operations"
+ },
+ {
+ "sample": "work/history-current/GEN-55-CD.zip/1271685776.cdr.00013499.0000000000000000.20260907.122000.HOURLYLFvsACTUALGEN55_csv.zip",
+ "member": "cdr.00013499.0000000000000000.20260907.122000.HOURLYLFvsACTUALGEN55.csv",
+ "reader": "gen-55-cd/hrly_rt_load_fcast_actual"
+ },
+ {
+ "sample": "work/history-current/NP1-300.zip",
+ "member": "1271634377.rpt.00012360.0000000000000000.20260907.091125.20260904_PublicAML.csv",
+ "reader": "np1-300/adjusted_meter_load"
+ },
+ {
+ "sample": "work/history-current/NP1-301.zip/1271537243.rpt.00010038.0000000000000000.20260907.041506.60_Day_COP_Adjustment_Period_Snapshot.zip",
+ "member": "60d_COP_Adjustment_Period_Snapshot-07-SEP-26.csv",
+ "reader": "np1-301/60_cop_adj_period_snapshot"
+ },
+ {
+ "sample": "work/history-current/NP1-302.zip/1271562684.rpt.00010039.0000000000000000.20260907.051538.Ancillary_Service_Obligation_Report_03112026.zip",
+ "member": "AS_Obligation_03112026.csv",
+ "reader": "np1-302/as_obligation"
+ },
+ {
+ "sample": "work/history-current/NP3-161-CD.zip/1271574814.cdr.00022470.0000000000000000.20260907.060008.PLANNEDOUTAGECAP7DAYPLUSNP3161_csv.zip",
+ "member": "cdr.00022470.0000000000000000.20260907.060008.PLANNEDOUTAGECAP7DAYPLUSNP3161.csv",
+ "reader": "np3-161-cd/7d_plus_avail_res_poc_margin"
+ },
+ {
+ "sample": "work/history-current/NP3-162-CD.zip/1271681998.cdr.00022469.0000000000000000.20260907.120503.PLANNEDOUTAGECAP7DAYNP3162_csv.zip",
+ "member": "cdr.00022469.0000000000000000.20260907.120503.PLANNEDOUTAGECAP7DAYNP3162.csv",
+ "reader": "np3-162-cd/7d_avail_res_poc_margin"
+ },
+ {
+ "sample": "work/history-current/NP3-233-CD.zip/1271681020.cdr.00013103.0000000000000000.20260907.120053.HRLYRESOUTCAPNP3233_csv.zip",
+ "member": "cdr.00013103.0000000000000000.20260907.120053.HRLYRESOUTCAPNP3233.csv",
+ "reader": "np3-233-cd/hourly_res_outage_cap"
+ },
+ {
+ "sample": "work/history-current/NP3-257-EX.zip/1271529311.ext.00013230.0000000000000000.20260907.031500.3d_Highest_Price_Bids_Selected_Dispatched_in_SCED.zip",
+ "member": "3d_Highest_Price_Bids_Selected_Dispatched_in_SCED-07-SEP-26.csv",
+ "reader": "np3-257-ex/3d_high_price_bids_sel_disp_sced"
+ },
+ {
+ "sample": "work/history-current/NP3-560-CD.zip/1271672838.cdr.00012311.0000000000000000.20260907.113000.LFCCONGESTNP3560_csv.zip",
+ "member": "cdr.00012311.0000000000000000.20260907.113000.LFCCONGESTNP3560.csv",
+ "reader": "np3-560-cd/7d_load_fcast_by_fzn"
+ },
+ {
+ "sample": "work/history-current/NP3-561-CD.zip/1271672836.cdr.00012312.0000000000000000.20260907.113000.LFCWEATHERNP3561_csv.zip",
+ "member": "cdr.00012312.0000000000000000.20260907.113000.LFCWEATHERNP3561.csv",
+ "reader": "np3-561-cd/7d_load_fcast_by_wzn"
+ },
+ {
+ "sample": "work/history-current/NP3-562-CD.zip/1271687312.cdr.00016553.0000000000000000.20260907.122700.INTRAHRLOADFCASTNP3562_csv.zip",
+ "member": "cdr.00016553.0000000000000000.20260907.122700.INTRAHRLOADFCASTNP3562.csv",
+ "reader": "np3-562-cd/ih_load_fcast_by_wzn"
+ },
+ {
+ "sample": "work/history-current/NP3-565-CD.zip/1271672839.cdr.00014837.0000000000000000.20260907.113000.LFMODWEATHERNP3565_csv.zip",
+ "member": "cdr.00014837.0000000000000000.20260907.113000.LFMODWEATHERNP3565.csv",
+ "reader": "np3-565-cd/lf_by_model_weather_zone"
+ },
+ {
+ "sample": "work/history-current/NP3-566-CD.zip/1271673074.cdr.00015953.0000000000000000.20260907.113000.LFMODSTUDYAREA3566_csv.zip",
+ "member": "cdr.00015953.0000000000000000.20260907.113000.LFMODSTUDYAREA3566.csv",
+ "reader": "np3-566-cd/lf_by_model_study_area"
+ },
+ {
+ "sample": "work/history-current/NP3-763-CD.zip/1271681048.cdr.00012315.0000000000000000.20260907.120057.RESCAPACITNP3763_csv.zip",
+ "member": "cdr.00012315.0000000000000000.20260907.120057.RESCAPACITNP3763.csv",
+ "reader": "np3-763-cd/st_sys_adequacy"
+ },
+ {
+ "sample": "work/history-current/NP3-764-CD.zip/1271686063.cdr.00015753.0000000000000000.20260907.122050.HRUCONSCEDOFFCOPNP3764_csv.zip",
+ "member": "cdr.00015753.0000000000000000.20260907.122050.HRUCONSCEDOFFCOPNP3764.csv",
+ "reader": "np3-764-cd/hrly_ruc_online_sced_offline_cop"
+ },
+ {
+ "sample": "work/history-current/NP3-765-CD.zip/1271681983.cdr.00024347.0000000000000000.20260907.120500.APPDCTIESCHEDNP3765_csv.zip",
+ "member": "cdr.00024347.0000000000000000.20260907.120500.APPDCTIESCHEDNP3765.csv",
+ "reader": "np3-765-cd/approved_dctie_schedules"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_ECRSS-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_ecrss"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_NSPIN-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_nspin"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_ECRSM-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_ecrsm"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_NSPNM-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_nspnm"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_RRSFFR-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_rrsffr"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_RRSPFR-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_rrspfr"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_RRSUFR-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_rrsufr"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_REGDN-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_regdn"
+ },
+ {
+ "sample": "work/history-current/NP3-906-EX.zip/1271533283.ext.00025814.0000000000000000.20260907.033002.2_Day_SCED_AS_Disclosure.zip",
+ "member": "2day_Agg_SCED_AS_Offers_REGUP-07-SEP-26.csv",
+ "reader": "np3-906-ex/2day_agg_sced_as_offers_regup"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_north"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_south"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_min_esc_west"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_edc"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_edc_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_North-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_edc_north"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_South-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_edc_south"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_West-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_edc_west"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_esc"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_esc_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_North-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_esc_north"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_South-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_esc_south"
+ },
+ {
+ "sample": "work/history-current/NP3-907-EX.zip/1271536690.ext.00025813.0000000000000000.20260907.034501.2_Day_DAM_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_West-07-SEP-26.csv",
+ "reader": "np3-907-ex/2d_agg_esc_west"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_Houston-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_North-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_north"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_South-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_south"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_West-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_west"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_Houston-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_North-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_north"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_ESR-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_esr"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_ESR_Houston-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_esr_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_ESR_North-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_esr_north"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_ESR_South-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_esr_south"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_ESR_West-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_esr_west"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_South-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_south"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_West-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_west"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_North-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_South-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_West-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "sample": "work/history-current/NP3-908-ER.zip/1267591371.ext.00013054.0000000000000000.20260828.035246.2_Day_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-28-AUG-26.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_Tot_Cleared_Energy_Bids_Offers-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_Tot_Cleared_Energy_Bids_Offers_Houston-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_Tot_Cleared_Energy_Bids_Offers_North-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_north"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_Tot_Cleared_Energy_Bids_Offers_South-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_south"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_Tot_Cleared_Energy_Bids_Offers_West-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_total_cleared_energy_bids_offers_west"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_PTP_Obligation_Bids-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_PTP_Obligation_Bids_Houston-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_PTP_Obligation_Bids_North-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_north"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_PTP_Obligation_Bids_South-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_south"
+ },
+ {
+ "sample": "work/history-current/NP3-909-ER.zip/1271533069.ext.00013055.0000000000000000.20260907.033001.2_Day_DAM_Bids_and_Offers.zip",
+ "member": "2d_PTP_Obligation_Bids_West-07-SEP-26.csv",
+ "reader": "np3-909-er/2d_ptp_obl_bids_west"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Output_Sched-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_out_sched"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Output_Sched_Houston-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Output_Sched_North-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_north"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Output_Sched_South-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_south"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Output_Sched_West-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_out_sched_west"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Gen_Summary-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Gen_Summary_Houston-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Gen_Summary_North-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_north"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Gen_Summary_South-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_south"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Gen_Summary_West-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_gen_summary_west"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Load_Summary-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_load_summary"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Load_Summary_Houston-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_houston"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Load_Summary_North-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_north"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Load_Summary_South-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_south"
+ },
+ {
+ "sample": "work/history-current/NP3-910-ER.zip/1271533073.ext.00013056.0000000000000000.20260907.033003.2_Day_Real_Time_Generation_and_Load_Data.zip",
+ "member": "2d_Agg_Load_Summary_West-07-SEP-26.csv",
+ "reader": "np3-910-er/2d_agg_load_summary_west"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_NSPNM-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_nspnm"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_NSPIN-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_nspin"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_NSPNM-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspnm"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_REGUP-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_regup"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_REGDN-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_regdn"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_REGUP-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_REGDN-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_NSPIN-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_REGUP-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_REGDN-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_NSPIN-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_RRSPFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_rrspfr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_RRSUFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_rrsufr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_RRSFFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_rrsffr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSPFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrspfr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSUFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsufr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSFFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsffr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSPFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrspfr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSUFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsufr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSFFR-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsffr"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_NSPNM-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspnm"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_ECRSS-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_ecrss"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Agg_DAM_AS_Offers_ECRSM-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_agg_dam_as_offers_ecrsm"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_ECRSS-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrss"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_ECRSM-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrsm"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_ECRSS-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrss"
+ },
+ {
+ "sample": "work/history-current/NP3-911-ER.zip/1271533276.ext.00013057.0000000000000000.20260907.033000.2_Day_DAM_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_ECRSM-07-SEP-26.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrsm"
+ },
+ {
+ "sample": "work/history-current/NP3-914-EX.zip/1271529313.ext.00025812.0000000000000000.20260907.031500.3_day_SCED_Highest_Price_AS_Offer_Selected.zip",
+ "member": "3d_SCED_Highest_Price_AS_Offer_Selected-07-SEP-26.csv",
+ "reader": "np3-914-ex/3d_sced_high_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-915-EX.zip/1271529314.ext.00013018.0000000000000000.20260907.031500.3_day_DAM_Highest_Price_AS_Offer_Selected.zip",
+ "member": "3d_DAM_Highest_Price_AS_Offer_Selected-07-SEP-26.csv",
+ "reader": "np3-915-ex/3d_dam_high_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-916-EX.zip/1271536773.ext.00013029.0000000000000000.20260907.034526.3_Day_Highest_Price_Offered_SCED.zip",
+ "member": "3d_Highest_Price_Offered_SCED-07-SEP-26.csv",
+ "reader": "np3-916-ex/3d_highest_price_offer_sced"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-06-SEP-26.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-06-SEP-26.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-06-SEP-26.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-06-SEP-26.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-06-SEP-26.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_EOC_Updates_in_OpHour-06-SEP-26.csv",
+ "reader": "np3-965-er/60_sced_eoc_updates_in_ophour"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_AS_Capability_ManOverride-06-SEP-26.csv",
+ "reader": "np3-965-er/60d_sced_as_cap_man_override"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_ESR_Data_in_SCED-06-SEP-26.csv",
+ "reader": "np3-965-er/60d_sced_esr_data"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Resource_AS_OFFERS-06-SEP-26.csv",
+ "reader": "np3-965-er/60d_sced_resource_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-965-ER.zip/1271171684.ext.00013052.0000000000000000.20260906.050950.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_AS_Offer_Updates_in_OpPeriod-06-SEP-26.csv",
+ "reader": "np3-965-er/60d_sced_as_offer_updates"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_QSE_Self_Arranged_AS-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Gen_Resource_Data-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Generation_Resource_ASOffers-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_Data-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_load_res_data"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_ASOffers-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOffers-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOfferAwards-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBids-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_energy_bids"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBidAwards-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_Option-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBids-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBidAwards-07-SEP-26.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_ESR_ASOffers-07-SEP-26.csv",
+ "reader": "np3-966-er/60d_dam_esr_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_ESR_Data-07-SEP-26.csv",
+ "reader": "np3-966-er/60d_dam_esr_data"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_AS_Only_Offers-07-SEP-26.csv",
+ "reader": "np3-966-er/60d_dam_as_only_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-966-ER.zip/1271566309.ext.00013051.0000000000000000.20260907.053000.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_AS_Only_Awards-07-SEP-26.csv",
+ "reader": "np3-966-er/60d_dam_as_only_awards"
+ },
+ {
+ "sample": "work/history-current/NP3-987-EX.zip/1271486282.ext.00010047.0000000000000000.20260907.002610.7day_Event_Trigger.zip",
+ "member": "7day_Event_Trigger_LMP_Exceeds_50XFIP-07-SEP-26.csv",
+ "reader": "np3-987-ex/7d_trig_lmp_50xfip"
+ },
+ {
+ "sample": "work/history-current/NP3-988-ER.zip",
+ "member": "1271562268.rpt.00010036.0000000000000000.20260907.051500.ResDMEList_07092026.csv",
+ "reader": "np3-988-er/resources"
+ },
+ {
+ "sample": "work/history-current/NP3-990-EX.zip/1189109876.ext.00015833.0000000000000000.20260202.051713.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Generation_Resource_AS_Offer_Awards-02-FEB-26.csv",
+ "reader": "np3-990-ex/60_sasm_gen_res_as_offer_awards"
+ },
+ {
+ "sample": "work/history-current/NP3-990-EX.zip/1189109876.ext.00015833.0000000000000000.20260202.051713.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Load_Resource_AS_Offer_Awards-02-FEB-26.csv",
+ "reader": "np3-990-ex/60_sasm_load_res_as_offer_awards"
+ },
+ {
+ "sample": "work/history-current/NP3-990-EX.zip/1189109876.ext.00015833.0000000000000000.20260202.051713.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Load_Resource_AS_Offers-02-FEB-26.csv",
+ "reader": "np3-990-ex/60_sasm_load_res_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-990-EX.zip/1189109876.ext.00015833.0000000000000000.20260202.051713.60_Day_SASM_Disclosure.zip",
+ "member": "60d_SASM_Generation_Resource_AS_Offers-02-FEB-26.csv",
+ "reader": "np3-990-ex/60_sasm_gen_res_as_offers"
+ },
+ {
+ "sample": "work/history-current/NP3-991-EX.zip/1271171927.ext.00015943.0000000000000000.20260906.050947.60_Day_COP_All_Updates.zip",
+ "member": "60d_COP_All_Updates-06-SEP-26.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ },
+ {
+ "sample": "work/history-current/NP4-158-SG.zip/1271689784.cdr.00013058.0000000000000000.20260907.123434.DAMELECTRICALLYSIMILARSTLPNTNP4158CD_csv.zip",
+ "member": "cdr.00013058.0000000000000000.20260907.123434.DAMELECTRICALLYSIMILARSTLPNTNP4158CD.csv",
+ "reader": "np4-158-sg/dam_essps"
+ },
+ {
+ "sample": "work/history-current/NP4-159-CD.zip/1262319043.cdr.00012324.0000000000000000.20260814.153148.LDFNP4159_csv.zip",
+ "member": "cdr.00012324.0000000000000000.20260814.153148.LDFNP4159.csv",
+ "reader": "np4-159-cd/load_distribution_factors"
+ },
+ {
+ "sample": "work/history-current/NP4-179-CD.zip/1167729099.cdr.00012327.0000000000000000.20251204.123457.TASONP4179_csv.zip",
+ "member": "cdr.00012327.0000000000000000.20251204.123457.TASONP4179.csv",
+ "reader": "np4-179-cd/total_as_service_offers"
+ },
+ {
+ "sample": "work/history-current/NP4-183-CD.zip/1271299785.cdr.00012328.0000000000000000.20260906.123242.DAMHRLMPNP4183_csv.zip",
+ "member": "cdr.00012328.0000000000000000.20260906.123242.DAMHRLMPNP4183.csv",
+ "reader": "np4-183-cd/dam_hourly_lmp"
+ },
+ {
+ "sample": "work/history-current/NP4-188-CD.zip/1271299077.cdr.00012329.0000000000000000.20260906.123241.DAMCPCNP4188_csv.zip",
+ "member": "cdr.00012329.0000000000000000.20260906.123241.DAMCPCNP4188.csv",
+ "reader": "np4-188-cd/dam_clear_price_for_cap"
+ },
+ {
+ "sample": "work/history-current/NP4-19-CD.zip/1271689558.cdr.00012330.0000000000000000.20260907.123434.DAMASAGGNP419_csv.zip",
+ "member": "cdr.00012330.0000000000000000.20260907.123434.DAMASAGGNP419.csv",
+ "reader": "np4-19-cd/dam_agg_as_offer_curve"
+ },
+ {
+ "sample": "work/history-current/NP4-190-CD.zip/1271299081.cdr.00012331.0000000000000000.20260906.123241.DAMSPNP4190_csv.zip",
+ "member": "cdr.00012331.0000000000000000.20260906.123241.DAMSPNP4190.csv",
+ "reader": "np4-190-cd/dam_stlmnt_pnt_prices"
+ },
+ {
+ "sample": "work/history-current/NP4-191-CD.zip/1271300005.cdr.00012332.0000000000000000.20260906.123432.DASPBCNP4191_csv.zip",
+ "member": "cdr.00012332.0000000000000000.20260906.123432.DASPBCNP4191.csv",
+ "reader": "np4-191-cd/dam_shadow_prices"
+ },
+ {
+ "sample": "work/history-current/NP4-192-CD.zip/1271299084.cdr.00012333.0000000000000000.20260906.123241.DAMTOTQTYENGYBUYNP4192_csv.zip",
+ "member": "cdr.00012333.0000000000000000.20260906.123241.DAMTOTQTYENGYBUYNP4192.csv",
+ "reader": "np4-192-cd/dam_total_energy_purchased"
+ },
+ {
+ "sample": "work/history-current/NP4-193-CD.zip/1271299082.cdr.00012334.0000000000000000.20260906.123241.DAMTOTQTYENGYSOLDNP4193_csv.zip",
+ "member": "cdr.00012334.0000000000000000.20260906.123241.DAMTOTQTYENGYSOLDNP4193.csv",
+ "reader": "np4-193-cd/total_dam_energy_sold"
+ },
+ {
+ "sample": "work/history-current/NP4-194-CD.zip/1271299102.cdr.00013042.0000000000000000.20260906.123246.DAMPTPOBLSPNP4194_csv.zip",
+ "member": "cdr.00013042.0000000000000000.20260906.123246.DAMPTPOBLSPNP4194.csv",
+ "reader": "np4-194-cd/dam_ptp_obligation_sp_results"
+ },
+ {
+ "sample": "work/history-current/NP4-196-M.zip/1169262090.cdr.00013044.0000000000000000.20251208.224153.pricecorrection_DAM_EBLMP_20251206_to_20251206_NP4196_csv.zip",
+ "member": "cdr.00013044.0000000000000000.20251208.224153.pricecorrection_DAM_EBLMP_20251206_to_20251206_NP4196.csv",
+ "reader": "np4-196-m/dam_price_corrections_eblmp"
+ },
+ {
+ "sample": "work/history-current/NP4-197-M.zip/1269376011.cdr.00013045.0000000000000000.20260901.152555.pricecorrection_RTM_SOGLMP_20260901_to_20260901_NP4197_csv.zip",
+ "member": "cdr.00013045.0000000000000000.20260901.152555.pricecorrection_RTM_SOGLMP_20260901_to_20260901_NP4197.csv",
+ "reader": "np4-197-m/rtm_price_corrections_soglmp"
+ },
+ {
+ "sample": "work/history-current/NP4-200-CD.zip/1271689775.cdr.00013063.0000000000000000.20260907.123434.DAMDEENERGUZEDSTLPNTNP4200_csv.zip",
+ "member": "cdr.00013063.0000000000000000.20260907.123434.DAMDEENERGUZEDSTLPNTNP4200.csv",
+ "reader": "np4-200-cd/dam_de_energized_spbc"
+ },
+ {
+ "sample": "work/history-current/NP4-212-CD.zip/1271167013.cdr.00024893.0000000000000000.20260906.045541.DAMSCEDASDCNP4212_csv.zip",
+ "member": "cdr.00024893.0000000000000000.20260906.045541.DAMSCEDASDCNP4212.csv",
+ "reader": "np4-212-cd/dam_sced_as_demand_curves"
+ },
+ {
+ "sample": "work/history-current/NP4-213-CD.zip/1271685763.cdr.00026382.0000000000000000.20260907.121843.HRUCASDCNP4213_csv.zip",
+ "member": "cdr.00026382.0000000000000000.20260907.121843.HRUCASDCNP4213.csv",
+ "reader": "np4-213-cd/hruc_as_demand_curves"
+ },
+ {
+ "sample": "work/history-current/NP4-214-CD.zip/1271339993.cdr.00026383.0000000000000000.20260906.145756.DRUCASDCNP4214_csv.zip",
+ "member": "cdr.00026383.0000000000000000.20260906.145756.DRUCASDCNP4214.csv",
+ "reader": "np4-214-cd/druc_as_demand_curves"
+ },
+ {
+ "sample": "work/history-current/NP4-215-CD.zip/1271136101.cdr.00026384.0000000000000000.20260906.025437.WRUCASDCNP4215_csv.zip",
+ "member": "cdr.00026384.0000000000000000.20260906.025437.WRUCASDCNP4215.csv",
+ "reader": "np4-215-cd/wruc_as_demand_curves"
+ },
+ {
+ "sample": "work/history-current/NP4-231-CD.zip/1271571067.cdr.00013098.0000000000000000.20260907.055000.DAMSCEDEBUSMAPPINGNP4231_csv.zip",
+ "member": "cdr.00013098.0000000000000000.20260907.055000.DAMSCEDEBUSMAPPINGNP4231.csv",
+ "reader": "np4-231-cd/electrical_bus_map_heur_price"
+ },
+ {
+ "sample": "work/history-current/NP4-33-CD.zip/1271555795.cdr.00012316.0000000000000000.20260907.050000.ASPLANNP433_csv.zip",
+ "member": "cdr.00012316.0000000000000000.20260907.050000.ASPLANNP433.csv",
+ "reader": "np4-33-cd/dam_as_plan"
+ },
+ {
+ "sample": "work/history-current/NP4-412-CD.zip/1271697140.cdr.00024885.0000000000000000.20260907.130200.EPPCumulativeHrsNP4412_20260907_1300_csv.zip",
+ "member": "cdr.00024885.0000000000000000.20260907.130200.EPPCumulativeHrsNP4412_20260907_1300.csv",
+ "reader": "np4-412-cd/epp_cumulative_hours"
+ },
+ {
+ "sample": "work/history-current/NP4-442-CD.zip/1271679572.cdr.00019385.0000000000000000.20260907.115500.HrlySysWideRegWindForecastsModelNP4442_csv.zip",
+ "member": "cdr.00019385.0000000000000000.20260907.115500.HrlySysWideRegWindForecastsModelNP4442.csv",
+ "reader": "np4-442-cd/hrly_sys_reg_wind_fcast_model"
+ },
+ {
+ "sample": "work/history-current/NP4-443-CD.zip/1271679574.cdr.00021811.0000000000000000.20260907.115500.HRLYSTPPFPVGRPPFCSTMODLNP4443_csv.zip",
+ "member": "cdr.00021811.0000000000000000.20260907.115500.HRLYSTPPFPVGRPPFCSTMODLNP4443.csv",
+ "reader": "np4-443-cd/hrly_sys_reg_solar_fcast_model"
+ },
+ {
+ "sample": "work/history-current/NP4-523-CD.zip/1271299078.cdr.00013113.0000000000000000.20260906.123241.DAMSYSLAMBDANP4523_csv.zip",
+ "member": "cdr.00013113.0000000000000000.20260906.123241.DAMSYSLAMBDANP4523.csv",
+ "reader": "np4-523-cd/dam_system_lambda"
+ },
+ {
+ "sample": "work/history-current/NP4-532-CD.zip/1271688861.cdr.00024888.0000000000000000.20260907.123252.DAMASSOLDNP4532_csv.zip",
+ "member": "cdr.00024888.0000000000000000.20260907.123252.DAMASSOLDNP4532.csv",
+ "reader": "np4-532-cd/dam_as_sold"
+ },
+ {
+ "sample": "work/history-current/NP4-722-CD.zip/1271555794.cdr.00012325.0000000000000000.20260907.050000.WANP4722_csv.zip",
+ "member": "cdr.00012325.0000000000000000.20260907.050000.WANP4722.csv",
+ "reader": "np4-722-cd/weather_assumptions"
+ },
+ {
+ "sample": "work/history-current/NP4-732-CD.zip/1271664231.cdr.00013028.0000000000000000.20260907.105512.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20260907.105512.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-current/NP4-733-CD.zip/1271683377.cdr.00013071.0000000000000000.20260907.121027.WPP5MINAVGACTNP4733_csv.zip",
+ "member": "cdr.00013071.0000000000000000.20260907.121027.WPP5MINAVGACTNP4733.csv",
+ "reader": "np4-733-cd/wpp_actual_5min_avg_values"
+ },
+ {
+ "sample": "work/history-current/NP4-737-CD.zip/1271679647.cdr.00013483.0000000000000000.20260907.115512.PVGRHRLYAVGACTNP4737_csv.zip",
+ "member": "cdr.00013483.0000000000000000.20260907.115512.PVGRHRLYAVGACTNP4737.csv",
+ "reader": "np4-737-cd/spp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-current/NP4-738-CD.zip/1271683266.cdr.00013484.0000000000000000.20260907.121007.PVGR5MINAVGACTNP4738_csv.zip",
+ "member": "cdr.00013484.0000000000000000.20260907.121007.PVGR5MINAVGACTNP4738.csv",
+ "reader": "np4-738-cd/spp_actual_5min_avg_values"
+ },
+ {
+ "sample": "work/history-current/NP4-742-CD.zip/1271679645.cdr.00014787.0000000000000000.20260907.115512.WPPHRLYAVGACTGEONP4742_csv.zip",
+ "member": "cdr.00014787.0000000000000000.20260907.115512.WPPHRLYAVGACTGEONP4742.csv",
+ "reader": "np4-742-cd/wpp_hrly_actual_fcast_geo"
+ },
+ {
+ "sample": "work/history-current/NP4-743-CD.zip/1271683379.cdr.00014788.0000000000000000.20260907.121027.WPP5MINAVGACTGEONP4743_csv.zip",
+ "member": "cdr.00014788.0000000000000000.20260907.121027.WPP5MINAVGACTGEONP4743.csv",
+ "reader": "np4-743-cd/wpp_actual_5min_avg_values_geo"
+ },
+ {
+ "sample": "work/history-current/NP4-745-CD.zip/1271679643.cdr.00021809.0000000000000000.20260907.115511.PVGRHRLYAVGACTGEONP4745_csv.zip",
+ "member": "cdr.00021809.0000000000000000.20260907.115511.PVGRHRLYAVGACTGEONP4745.csv",
+ "reader": "np4-745-cd/spp_hrly_actual_fcast_geo"
+ },
+ {
+ "sample": "work/history-current/NP4-746-CD.zip/1271683298.cdr.00021810.0000000000000000.20260907.121011.PVGR5MINAVGACTGEONP4746_csv.zip",
+ "member": "cdr.00021810.0000000000000000.20260907.121011.PVGR5MINAVGACTGEONP4746.csv",
+ "reader": "np4-746-cd/spp_actual_5min_avg_values_geo"
+ },
+ {
+ "sample": "work/history-current/NP4-751-CD.zip/1271691983.cdr.00016554.0000000000000000.20260907.124200.INTRAHRWINDFCASTNP4751_csv.zip",
+ "member": "cdr.00016554.0000000000000000.20260907.124200.INTRAHRWINDFCASTNP4751.csv",
+ "reader": "np4-751-cd/ih_wind_fcast_geo"
+ },
+ {
+ "sample": "work/history-current/NP4-752-CD.zip/1271691985.cdr.00021812.0000000000000000.20260907.124200.INTRAHRSOLARFCASTNP4752_csv.zip",
+ "member": "cdr.00021812.0000000000000000.20260907.124200.INTRAHRSOLARFCASTNP4752.csv",
+ "reader": "np4-752-cd/ih_solar_fcast_geo"
+ },
+ {
+ "sample": "work/history-current/NP4-790-CD.zip/1271355384.cdr.00012348.0000000000000000.20260906.160000.PNMNP4790_csv.zip",
+ "member": "cdr.00012348.0000000000000000.20260906.160000.PNMNP4790.csv",
+ "reader": "np4-790-cd/peaker_net_margin"
+ },
+ {
+ "sample": "work/history-current/NP4-791-CD.zip/1271555558.cdr.00012349.0000000000000000.20260907.050000.SWOCNP4791_csv.zip",
+ "member": "cdr.00012349.0000000000000000.20260907.050000.SWOCNP4791.csv",
+ "reader": "np4-791-cd/da_sw_offer_caps"
+ },
+ {
+ "sample": "work/history-current/NP5-108-CD.zip/1271681974.cdr.00010016.0000000000000000.20260907.120500.RMRServicesDeployedNP5108_csv.zip",
+ "member": "cdr.00010016.0000000000000000.20260907.120500.RMRServicesDeployedNP5108.csv",
+ "reader": "np5-108-cd/hrly_rmr_services_deployed"
+ },
+ {
+ "sample": "work/history-current/NP5-525-CD.zip/1271523336.cdr.00024897.0000000000000000.20260907.025218.WRUCASDFNP5525_csv.zip",
+ "member": "cdr.00024897.0000000000000000.20260907.025218.WRUCASDFNP5525.csv",
+ "reader": "np5-525-cd/wruc_as_deploy_factors"
+ },
+ {
+ "sample": "work/history-current/NP5-526-CD.zip/1271572961.cdr.00024886.0000000000000000.20260907.055500.ProjectedASDFNP5526_csv.zip",
+ "member": "cdr.00024886.0000000000000000.20260907.055500.ProjectedASDFNP5526.csv",
+ "reader": "np5-526-cd/proj_as_deploy_factor"
+ },
+ {
+ "sample": "work/history-current/NP5-527-CD.zip/1271339609.cdr.00024895.0000000000000000.20260906.145705.DRUCASDFNP5527_csv.zip",
+ "member": "cdr.00024895.0000000000000000.20260906.145705.DRUCASDFNP5527.csv",
+ "reader": "np5-527-cd/druc_as_deploy_factors"
+ },
+ {
+ "sample": "work/history-current/NP5-528-CD.zip/1271685256.cdr.00024896.0000000000000000.20260907.121750.HRUCASDFNP5528_csv.zip",
+ "member": "cdr.00024896.0000000000000000.20260907.121750.HRUCASDFNP5528.csv",
+ "reader": "np5-528-cd/hruc_as_deploy_factors"
+ },
+ {
+ "sample": "work/history-current/NP5-754-CD.zip/1271339608.cdr.00012338.0000000000000000.20260906.145705.DRUCAPROVABINDTRANSNP5754_csv.zip",
+ "member": "cdr.00012338.0000000000000000.20260906.145705.DRUCAPROVABINDTRANSNP5754.csv",
+ "reader": "np5-754-cd/daily_ruc_act_and_bind_tran_const"
+ },
+ {
+ "sample": "work/history-current/NP5-755-CD.zip/1271685259.cdr.00012336.0000000000000000.20260907.121750.HRUCAPROVABINDTRANSNP5755_csv.zip",
+ "member": "cdr.00012336.0000000000000000.20260907.121750.HRUCAPROVABINDTRANSNP5755.csv",
+ "reader": "np5-755-cd/hrly_ruc_act_and_bind_tran_const"
+ },
+ {
+ "sample": "work/history-current/NP6-235-CD.zip/1271681972.cdr.00012340.0000000000000000.20260907.120500.SYSWIDEDEMANDNP6235_csv.zip",
+ "member": "cdr.00012340.0000000000000000.20260907.120500.SYSWIDEDEMANDNP6235.csv",
+ "reader": "np6-235-cd/system_wide_demand"
+ },
+ {
+ "sample": "work/history-current/NP6-322-CD.zip/1271684531.cdr.00013114.0000000000000000.20260907.121521.SCEDSYSLAMBDANP6322_20260907_121518_csv.zip",
+ "member": "cdr.00013114.0000000000000000.20260907.121521.SCEDSYSLAMBDANP6322_20260907_121518.csv",
+ "reader": "np6-322-cd/sced_system_lambda"
+ },
+ {
+ "sample": "work/history-current/NP6-323-CD.zip/1271685874.cdr.00013221.0000000000000000.20260907.122021.RTSCEDpriceAdderNP6323_20260907_122019_csv.zip",
+ "member": "cdr.00013221.0000000000000000.20260907.122021.RTSCEDpriceAdderNP6323_20260907_122019.csv",
+ "reader": "np6-323-cd/rt_price_adder_sced"
+ },
+ {
+ "sample": "work/history-current/NP6-324-CD.zip/1271684829.cdr.00013220.0000000000000000.20260907.121700.RT15MPRICEADDERNP6324_20260907_1215_csv.zip",
+ "member": "cdr.00013220.0000000000000000.20260907.121700.RT15MPRICEADDERNP6324_20260907_1215.csv",
+ "reader": "np6-324-cd/rt_15min_price_adders"
+ },
+ {
+ "sample": "work/history-current/NP6-325-CD.zip/1271686144.cdr.00013222.0000000000000000.20260907.122141.RTDPriceAddersNP6325_20260907_122003_csv.zip",
+ "member": "cdr.00013222.0000000000000000.20260907.122141.RTDPriceAddersNP6325_20260907_122003.csv",
+ "reader": "np6-325-cd/rtd_price_adders"
+ },
+ {
+ "sample": "work/history-current/NP6-326-CD.zip/1271697143.cdr.00021115.0000000000000000.20260907.130200.SOGPRICENP6326_20260907_1300_csv.zip",
+ "member": "cdr.00021115.0000000000000000.20260907.130200.SOGPRICENP6326_20260907_1300.csv",
+ "reader": "np6-326-cd/rt_price_sog"
+ },
+ {
+ "sample": "work/history-current/NP6-327-CD.zip/1271700999.cdr.00021114.0000000000000000.20260907.131533.SOGLMPNP6327_20260907_131520_csv.zip",
+ "member": "cdr.00021114.0000000000000000.20260907.131533.SOGLMPNP6327_20260907_131520.csv",
+ "reader": "np6-327-cd/lmp_sog_price_adders"
+ },
+ {
+ "sample": "work/history-current/NP6-328-CD.zip/1271694377.cdr.00024887.0000000000000000.20260907.125023.TotASResCapabilityNP6328_20260907_125020_csv.zip",
+ "member": "cdr.00024887.0000000000000000.20260907.125023.TotASResCapabilityNP6328_20260907_125020.csv",
+ "reader": "np6-328-cd/tot_as_res_cap"
+ },
+ {
+ "sample": "work/history-current/NP6-329-CD.zip/1271694529.cdr.00024889.0000000000000000.20260907.125141.RTDMCPCNP6329_20260907_125004_csv.zip",
+ "member": "cdr.00024889.0000000000000000.20260907.125141.RTDMCPCNP6329_20260907_125004.csv",
+ "reader": "np6-329-cd/rtd_ind_mcpc"
+ },
+ {
+ "sample": "work/history-current/NP6-331-CD.zip/1271693297.cdr.00024898.0000000000000000.20260907.124700.MCPC15MinNP6331_csv.zip",
+ "member": "cdr.00024898.0000000000000000.20260907.124700.MCPC15MinNP6331.csv",
+ "reader": "np6-331-cd/rt_clear_price_cap"
+ },
+ {
+ "sample": "work/history-current/NP6-332-CD.zip/1271694163.cdr.00024891.0000000000000000.20260907.125022.SCEDMCPCNP6332_csv.zip",
+ "member": "cdr.00024891.0000000000000000.20260907.125022.SCEDMCPCNP6332.csv",
+ "reader": "np6-332-cd/rt_clear_price_cap_sced"
+ },
+ {
+ "sample": "work/history-current/NP6-344-CD.zip/1271571072.cdr.00015954.0000000000000000.20260907.055000.ACTUALSYSLOADSTUDYAREA6344_csv.zip",
+ "member": "cdr.00015954.0000000000000000.20260907.055000.ACTUALSYSLOADSTUDYAREA6344.csv",
+ "reader": "np6-344-cd/act_sys_load_by_study_area"
+ },
+ {
+ "sample": "work/history-current/NP6-345-CD.zip/1271571171.cdr.00013101.0000000000000000.20260907.055000.ACTUALSYSLOADWZNP6345_csv.zip",
+ "member": "cdr.00013101.0000000000000000.20260907.055000.ACTUALSYSLOADWZNP6345.csv",
+ "reader": "np6-345-cd/act_sys_load_by_wzn"
+ },
+ {
+ "sample": "work/history-current/NP6-346-CD.zip/1271571070.cdr.00014836.0000000000000000.20260907.055000.ACTUALSYSLOADFZNP6346_csv.zip",
+ "member": "cdr.00014836.0000000000000000.20260907.055000.ACTUALSYSLOADFZNP6346.csv",
+ "reader": "np6-346-cd/act_sys_load_by_fzn"
+ },
+ {
+ "sample": "work/history-current/NP6-625-CD.zip/1271683228.cdr.00012358.0000000000000000.20260907.121000.SELRTEGNP6625_csv.zip",
+ "member": "cdr.00012358.0000000000000000.20260907.121000.SELRTEGNP6625.csv",
+ "reader": "np6-625-cd/se_ld_rpt_ercot_gen"
+ },
+ {
+ "sample": "work/history-current/NP6-626-CD.zip/1271683232.cdr.00012359.0000000000000000.20260907.121000.SELRTFNP6626_csv.zip",
+ "member": "cdr.00012359.0000000000000000.20260907.121000.SELRTFNP6626.csv",
+ "reader": "np6-626-cd/se_load_dcties_flows"
+ },
+ {
+ "sample": "work/history-current/NP6-787-CD.zip/1271675290.cdr.00011485.0000000000000000.20260907.114020.LMPSELECTBUSNP6787_20260907_114017_csv.zip",
+ "member": "cdr.00011485.0000000000000000.20260907.114020.LMPSELECTBUSNP6787_20260907_114017.csv",
+ "reader": "np6-787-cd/lmp_electrical_bus"
+ },
+ {
+ "sample": "work/history-current/NP6-788-CD.zip/1271675289.cdr.00012300.0000000000000000.20260907.114020.LMPSROSNODENP6788_20260907_114017_csv.zip",
+ "member": "cdr.00012300.0000000000000000.20260907.114020.LMPSROSNODENP6788_20260907_114017.csv",
+ "reader": "np6-788-cd/lmp_node_zone_hub"
+ },
+ {
+ "sample": "work/history-current/NP6-86-CD.zip/1271681979.cdr.00012302.0000000000000000.20260907.120500.SCEDBTCNP686_csv.zip",
+ "member": "cdr.00012302.0000000000000000.20260907.120500.SCEDBTCNP686.csv",
+ "reader": "np6-86-cd/shdw_prices_bnd_trns_const"
+ },
+ {
+ "sample": "work/history-current/NP6-905-CD.zip/1271661800.cdr.00012301.0000000000000000.20260907.104701.SPPHLZNP6905_20260907_1045_csv.zip",
+ "member": "cdr.00012301.0000000000000000.20260907.104701.SPPHLZNP6905_20260907_1045.csv",
+ "reader": "np6-905-cd/spp_node_zone_hub"
+ },
+ {
+ "sample": "work/history-current/NP6-915-CD.zip/1271676990.cdr.00013081.0000000000000000.20260907.122521.SUMHDLLDLNP6915_20260907_122518_csv.zip",
+ "member": "cdr.00013081.0000000000000000.20260907.122521.SUMHDLLDLNP6915_20260907_122518.csv",
+ "reader": "np6-915-cd/sum_hdl_ldl"
+ },
+ {
+ "sample": "work/history-current/NP6-970-CD.zip/1271696096.cdr.00013073.0000000000000000.20260907.125642.RTDLMPRNLZHUBNP6970_20260907_125503_csv.zip",
+ "member": "cdr.00013073.0000000000000000.20260907.125642.RTDLMPRNLZHUBNP6970_20260907_125503.csv",
+ "reader": "np6-970-cd/rtd_lmp_node_zone_hub"
+ },
+ {
+ "sample": "work/history-current/NP7-464-CD.zip/1271301684.cdr.00010042.0000000000000000.20260906.123921.DAMPTPNP7464_csv.zip",
+ "member": "cdr.00010042.0000000000000000.20260906.123921.DAMPTPNP7464.csv",
+ "reader": "np7-464-cd/dam_ptp_option_price_report"
+ },
+ {
+ "sample": "work/history-current/NP7-535-SG.zip/1269637864.rpt.00013110.0000000000000000.20260902.080006.OCT2026MonthlyPathSpecificAdders.zip",
+ "member": "OCT2026_MonthlyPathSpecificAdders.CSV",
+ "reader": "np7-535-sg/path_adders"
+ }
+ ]
+ },
+ {
+ "audit": "history-middle-audit",
+ "scope": "CSV headers and up to three rows in saved source archives; not all retained files or all rows. Report Info worksheets are report/column documentation.",
+ "formats": {
+ ".xlsx": 3,
+ ".zip": 16,
+ ".csv": 150
+ },
+ "csvFilesWithExactlyOneReader": 150,
+ "unselectedDocumentationSheets": 3,
+ "files": [
+ {
+ "sample": "work/history-middle-2020/NP3-560-CD.zip/698822255.cdr.00012311.0000000000000000.20200131.233001.LFCCONGESTNP3560_csv.zip",
+ "member": "cdr.00012311.0000000000000000.20200131.233000.LFCCONGESTNP3560.csv",
+ "reader": "np3-560-cd/7d_load_fcast_by_fzn"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-908-ER.zip/698694258.ext.00013054.0000000000000000.20200131.033445026.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR-31-JAN-20.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSLOAD-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsload"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSGEN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsgen"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_REGDN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_REGUP-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSLOAD-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsload"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSGEN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsgen"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_NSPIN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_REGDN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_REGUP-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_RRSNC-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsnc"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_RRSLD-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsld"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_RRSGN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsgn"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_OFFNS-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_ONNS-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_REGDN-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-911-ER.zip/698693027.ext.00013057.0000000000000000.20200131.031942395.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_REGUP-31-JAN-20.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-20.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-20.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_Option-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBidAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBids-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_bids"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOffers-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_ASOffers-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_Data-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_load_res_data"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Gen_Resource_Data-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBidAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBids-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-966-ER.zip/698698411.ext.00013051.0000000000000000.20200131.041953981.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-JAN-20.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-991-EX.zip/698706908.ext.00015943.0000000000000000.20200131.052054194.60_Day_COP_Disclosure.zip",
+ "member": "60d_Complete_COP-31-JAN-20.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ },
+ {
+ "sample": "work/history-middle-2020/NP4-732-CD.zip/698824711.cdr.00013028.0000000000000000.20200131.235518045.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20200131.235517.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-560-CD.zip/940606303.cdr.00012311.0000000000000000.20230831.233002.LFCCONGESTNP3560_csv.zip",
+ "member": "cdr.00012311.0000000000000000.20230831.233002.LFCCONGESTNP3560.csv",
+ "reader": "np3-560-cd/7d_load_fcast_by_fzn"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_Houston-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_houston"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_North-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_north"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_South-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_south"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR_West-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr_west"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_PVGR-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_pvgr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_Houston-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_houston"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_North-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_north"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_South-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_south"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR_West-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr_west"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_Houston-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_houston"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_North-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_north"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_South-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_south"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_West-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_edc_west"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Demand_Curves_CLR-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_edc_clr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_Houston-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_houston"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_North-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_north"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_South-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_south"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves_West-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc_west"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_Houston-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_houston"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_North-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_north"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_South-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_south"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR_West-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr_west"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_Houston-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_houston"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_North-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_north"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_South-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_south"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind_West-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind_west"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Energy_Supply_Curves-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_esc"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Wind-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_wind"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Supply_Curves_Non_IRR-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_esc_nonirr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_Houston-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_houston"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_North-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_north"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_South-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_south"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-908-ER.zip/940412340.ext.00013054.0000000000000000.20230831.041108411.2_Day_DAM_and_SCED_Energy_Curves.zip",
+ "member": "2d_Agg_Min_Energy_Supply_Curves_West-31-AUG-23.csv",
+ "reader": "np3-908-er/2d_agg_dam_min_esc_west"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_NSPNM-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspnm"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_RRSPFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrspfr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_RRSUFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsufr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_RRSFFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_rrsffr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSPFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrspfr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSUFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsufr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_RRSFFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_rrsffr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSPFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrspfr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSUFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsufr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_RRSFFR-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_rrsffr"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_ECRSM-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_ecrsm"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_ECRSS-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_ecrss"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_ECRSM-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrsm"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_ECRSS-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_ecrss"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_ECRSM-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrsm"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_ECRSS-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_ecrss"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_REGUP-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regup"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_REGDN-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_regdn"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_ONNS-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_onns"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Agg_AS_Offers_OFFNS-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_agg_as_offers_offns"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_REGUP-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regup"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_REGDN-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_regdn"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Self_Arranged_AS_NSPIN-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_self_arranged_as_nspin"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_REGUP-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regup"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_REGDN-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_regdn"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-911-ER.zip/940410046.ext.00013057.0000000000000000.20230831.035553849.2_Day_AS_Disclosure.zip",
+ "member": "2d_Cleared_DAM_AS_NSPIN-31-AUG-23.csv",
+ "reader": "np3-911-er/2d_cleared_dam_as_nspin"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-AUG-23.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-AUG-23.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-AUG-23.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-AUG-23.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-AUG-23.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-965-ER.zip/940425301.ext.00013052.0000000000000000.20230831.052556116.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-AUG-23.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_OptionAwards-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt_awards"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBids-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bids"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTPObligationBidAwards-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_bid_awards"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_QSE_Self_Arranged_AS-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_qse_self_as"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Gen_Resource_Data-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_gen_res_data"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Generation_Resource_ASOffers-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_gen_res_as_offers"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_Data-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_load_res_data"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_Load_Resource_ASOffers-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_load_res_as_offers"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOffers-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offers"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyOnlyOfferAwards-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_energy_only_offer_awards"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBids-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_energy_bids"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_EnergyBidAwards-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_energy_bid_awards"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-966-ER.zip/940441800.ext.00013051.0000000000000000.20230831.065555362.60_Day_DAM_Disclosure.zip",
+ "member": "60d_DAM_PTP_Obligation_Option-31-AUG-23.csv",
+ "reader": "np3-966-er/60_dam_ptp_obl_opt"
+ },
+ {
+ "sample": "work/history-middle-2023/NP3-991-EX.zip/940423384.ext.00015943.0000000000000000.20230831.051055962.60_Day_COP_All_Updates.zip",
+ "member": "60d_COP_All_Updates-31-AUG-23.csv",
+ "reader": "np3-991-ex/60_cop_all_updates"
+ },
+ {
+ "sample": "work/history-middle-2023/NP4-732-CD.zip/940611200.cdr.00013028.0000000000000000.20230831.235534731.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20230831.235534.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-middle-2023/NP4-745-CD.zip/940611381.cdr.00021809.0000000000000000.20230831.235538617.PVGRHRLYAVGACTGEONP4745_csv.zip",
+ "member": "cdr.00021809.0000000000000000.20230831.235538.PVGRHRLYAVGACTGEONP4745.csv",
+ "reader": "np4-745-cd/spp_hrly_actual_fcast_geo"
+ }
+ ]
+ },
+ {
+ "audit": "history-annual-audit",
+ "scope": "One January publication sample per year, 2015 through 2025, for SCED disclosure and wind. CSV headers and up to three rows; not all retained files or all rows. January 2020 sources reused from the prior sample.",
+ "formats": {
+ ".zip": 22,
+ ".csv": 78
+ },
+ "csvFilesWithExactlyOneReader": 78,
+ "files": [
+ {
+ "sample": "work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load Resource_Data_in_SCED-31-JAN-15.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-15.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-15.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-15.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-15.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2015/NP3-965-ER.zip/471251518.ext.00013052.0000000000000000.20150131.042252146.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-15.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2015/NP4-732-CD.zip/471323977.cdr.00013028.0000000000000000.20150131.233042645.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20150131.233042.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load Resource_Data_in_SCED-31-JAN-16.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-16.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-16.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-16.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-16.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2016/NP3-965-ER.zip/508459546.ext.00013052.0000000000000000.20160131.042853283.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-16.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2016/NP4-732-CD.zip/508541149.cdr.00013028.0000000000000000.20160131.233108482.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20160131.233108.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load Resource_Data_in_SCED-31-JAN-17.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-17.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-17.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-17.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-17.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2017/NP3-965-ER.zip/550576150.ext.00013052.0000000000000000.20170131.042006161.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-17.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2017/NP4-732-CD.zip/550677301.cdr.00013028.0000000000000000.20170131.233129026.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20170131.233128.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load Resource_Data_in_SCED-31-JAN-18.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-18.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-18.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-18.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-18.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2018/NP3-965-ER.zip/596928044.ext.00013052.0000000000000000.20180131.041744931.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-18.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2018/NP4-732-CD.zip/597033993.cdr.00013028.0000000000000000.20180131.234255015.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20180131.234254.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load Resource_Data_in_SCED-31-JAN-19.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-19.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-19.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-19.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-19.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2019/NP3-965-ER.zip/646664212.ext.00013052.0000000000000000.20190131.042429796.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-19.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2019/NP4-732-CD.zip/646777019.cdr.00013028.0000000000000000.20190131.234311712.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20190131.234311.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-21.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-21.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-21.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-21.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-21.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2021/NP3-965-ER.zip/756226707.ext.00013052.0000000000000000.20210131.043220982.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-21.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2021/NP4-732-CD.zip/756356582.cdr.00013028.0000000000000000.20210131.235521704.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20210131.235521.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-22.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-22.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-22.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-22.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-22.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2022/NP3-965-ER.zip/820409727.ext.00013052.0000000000000000.20220131.082750317.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-22.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2022/NP4-732-CD.zip/820534787.cdr.00013028.0000000000000000.20220131.235533819.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20220131.235533.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-23.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-23.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-23.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-23.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-23.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2023/NP3-965-ER.zip/892946917.ext.00013052.0000000000000000.20230131.061004604.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-23.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2023/NP4-732-CD.zip/893111283.cdr.00013028.0000000000000000.20230131.235529287.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20230131.235529.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-24.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-24.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-24.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-24.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-24.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2024/NP3-965-ER.zip/977282759.ext.00013052.0000000000000000.20240131.042605057.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-24.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2024/NP4-732-CD.zip/977491391.cdr.00013028.0000000000000000.20240131.235525.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20240131.235525.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-25.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_EOC_Updates_in_OpHour-31-JAN-25.csv",
+ "reader": "np3-965-er/60_sced_eoc_updates_in_ophour"
+ },
+ {
+ "sample": "work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-25.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-25.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-25.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-25.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-annual-2025/NP3-965-ER.zip/1073739299.ext.00013052.0000000000000000.20250131.043458.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-25.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-annual-2025/NP4-732-CD.zip/1073971845.cdr.00013028.0000000000000000.20250131.235510.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20250131.235510.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-20.csv",
+ "reader": "np3-965-er/60_load_res_data_in_sced"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_Gen_Resource_Data-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_gen_res_data"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_SMNE_GEN_RES-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_smne_gen_res"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_DSR_Load_Data-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_dsr_load_data"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-20.csv",
+ "reader": "np3-965-er/60_sced_qse_self_arranged_as"
+ },
+ {
+ "sample": "work/history-middle-2020/NP3-965-ER.zip/698699627.ext.00013052.0000000000000000.20200131.043452665.60_Day_SCED_Disclosure.zip",
+ "member": "60d_HDL_LDL_ManOverride-31-JAN-20.csv",
+ "reader": "np3-965-er/60_hdl_ldl_man_override"
+ },
+ {
+ "sample": "work/history-middle-2020/NP4-732-CD.zip/698824711.cdr.00013028.0000000000000000.20200131.235518045.WPPHRLYAVGACTNP4732_csv.zip",
+ "member": "cdr.00013028.0000000000000000.20200131.235517.WPPHRLYAVGACTNP4732.csv",
+ "reader": "np4-732-cd/wpp_hrly_avrg_actl_fcast"
+ }
+ ],
+ "listings": [
+ {
+ "year": 2015,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 471251518,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2015-01-31T04:22:52",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=471251518",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 3818136
+ },
+ {
+ "year": 2015,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 471323977,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2015-01-31T23:30:42.645000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=471323977",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 4274
+ },
+ {
+ "year": 2016,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 508459546,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2016-01-31T04:28:53",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=508459546",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 4175346
+ },
+ {
+ "year": 2016,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 508541149,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2016-01-31T23:31:08.482000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=508541149",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 8224
+ },
+ {
+ "year": 2017,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 550576150,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2017-01-31T04:20:06",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=550576150",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 4746331
+ },
+ {
+ "year": 2017,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 720,
+ "pageSize": 1,
+ "totalPages": 720,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 550677301,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2017-01-31T23:31:29.026000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=550677301",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 8255
+ },
+ {
+ "year": 2018,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 32,
+ "pageSize": 1,
+ "totalPages": 32,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 596928044,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2018-01-31T04:17:44",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=596928044",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 4793786
+ },
+ {
+ "year": 2018,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 597033993,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2018-01-31T23:42:55.015000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=597033993",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10234
+ },
+ {
+ "year": 2019,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 646664212,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2019-01-31T04:24:29",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=646664212",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 4943677
+ },
+ {
+ "year": 2019,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 742,
+ "pageSize": 1,
+ "totalPages": 742,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 646777019,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2019-01-31T23:43:11.712000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=646777019",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 9999
+ },
+ {
+ "year": 2020,
+ "product": "NP3-965-ER",
+ "existingSource": "work/history-middle-2020/NP3-965-ER.zip"
+ },
+ {
+ "year": 2020,
+ "product": "NP4-732-CD",
+ "existingSource": "work/history-middle-2020/NP4-732-CD.zip"
+ },
+ {
+ "year": 2021,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 756226707,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2021-01-31T04:32:20",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=756226707",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 6894600
+ },
+ {
+ "year": 2021,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 743,
+ "pageSize": 1,
+ "totalPages": 743,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 756356582,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2021-01-31T23:55:21.704000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=756356582",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10356
+ },
+ {
+ "year": 2022,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 820409727,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2022-01-31T08:27:50",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=820409727",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 7747261
+ },
+ {
+ "year": 2022,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 820534787,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2022-01-31T23:55:33.819000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=820534787",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10225
+ },
+ {
+ "year": 2023,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 892946917,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2023-01-31T06:10:04.604000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=892946917",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 8356399
+ },
+ {
+ "year": 2023,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 893111283,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2023-01-31T23:55:29",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=893111283",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 9712
+ },
+ {
+ "year": 2024,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 977282759,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2024-01-31T04:26:05.057000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=977282759",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 9241451
+ },
+ {
+ "year": 2024,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 977491391,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2024-01-31T23:55:25",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=977491391",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10255
+ },
+ {
+ "year": 2025,
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 1073739299,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2025-01-31T04:34:58",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=1073739299",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 9288524
+ },
+ {
+ "year": 2025,
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 1073971845,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2025-01-31T23:55:10",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=1073971845",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10876
+ }
+ ]
+ }
+ ],
+ "intermediateListings": [
+ {
+ "period": "2020",
+ "product": "NP3-966-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-966-ER",
+ "name": "60-Day DAM Disclosure Reports",
+ "reportTypeId": 13051
+ },
+ "archives": [
+ {
+ "docId": 698698411,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2020-01-31T04:19:53",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-966-er?download=698698411",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-966-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 3450570
+ },
+ {
+ "period": "2020",
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 698699627,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2020-01-31T04:34:52",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=698699627",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 5640797
+ },
+ {
+ "period": "2020",
+ "product": "NP3-908-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-908-ER",
+ "name": "2-Day SCED Energy Curves",
+ "reportTypeId": 13054
+ },
+ "archives": [
+ {
+ "docId": 698694258,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2020-01-31T03:34:45.026000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-908-er?download=698694258",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-908-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 31231606
+ },
+ {
+ "period": "2020",
+ "product": "NP3-911-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-911-ER",
+ "name": "2-Day DAM Ancillary Services Reports",
+ "reportTypeId": 13057
+ },
+ "archives": [
+ {
+ "docId": 698693027,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2020-01-31T03:19:42",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-911-er?download=698693027",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-911-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 41349
+ },
+ {
+ "period": "2020",
+ "product": "NP3-991-EX",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-991-EX",
+ "name": "60-Day COP All Updates",
+ "reportTypeId": 15943
+ },
+ "archives": [
+ {
+ "docId": 698706908,
+ "friendlyName": "60_Day_COP_Disclosure",
+ "postDatetime": "2020-01-31T05:20:54",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-991-ex?download=698706908",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-991-ex",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 4880446
+ },
+ {
+ "period": "2020",
+ "product": "NP3-108",
+ "listing": {
+ "meta": {
+ "totalRecords": 1,
+ "pageSize": 1,
+ "totalPages": 1,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-108",
+ "name": "Monthly ERCOT Demand Response from Load Resources",
+ "reportTypeId": 13242
+ },
+ "archives": [
+ {
+ "docId": 694720108,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_19_12",
+ "postDatetime": "2020-01-04T08:13:57",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-108?download=694720108",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-108",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 7516
+ },
+ {
+ "period": "2020",
+ "product": "NP1-346-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP1-346-ER",
+ "name": "Unplanned Resource Outages Report",
+ "reportTypeId": 22912
+ },
+ "archives": [],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np1-346-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ },
+ {
+ "period": "2020",
+ "product": "NP3-560-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-560-CD",
+ "name": "Seven-Day Load Forecast by Forecast Zone",
+ "reportTypeId": 12311
+ },
+ "archives": [
+ {
+ "docId": 698822255,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2020-01-31T23:30:01",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-560-cd?download=698822255",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-560-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10913
+ },
+ {
+ "period": "2020",
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 698824711,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2020-01-31T23:55:18.045000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=698824711",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 9862
+ },
+ {
+ "period": "2020",
+ "product": "NP4-745-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 0,
+ "pageSize": 1,
+ "totalPages": 0,
+ "currentPage": 0,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-745-CD",
+ "name": "Solar Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region",
+ "reportTypeId": 21809
+ },
+ "archives": [],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-745-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ },
+ {
+ "period": "2023",
+ "product": "NP3-966-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-966-ER",
+ "name": "60-Day DAM Disclosure Reports",
+ "reportTypeId": 13051
+ },
+ "archives": [
+ {
+ "docId": 940441800,
+ "friendlyName": "60_Day_DAM_Disclosure",
+ "postDatetime": "2023-08-31T06:55:55.362000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-966-er?download=940441800",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-966-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 5300712
+ },
+ {
+ "period": "2023",
+ "product": "NP3-965-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-965-ER",
+ "name": "60-Day SCED Disclosure Reports",
+ "reportTypeId": 13052
+ },
+ "archives": [
+ {
+ "docId": 940425301,
+ "friendlyName": "60_Day_SCED_Disclosure",
+ "postDatetime": "2023-08-31T05:25:56.116000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er?download=940425301",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-965-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 9055258
+ },
+ {
+ "period": "2023",
+ "product": "NP3-908-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-908-ER",
+ "name": "2-Day SCED Energy Curves",
+ "reportTypeId": 13054
+ },
+ "archives": [
+ {
+ "docId": 940412340,
+ "friendlyName": "2_Day_DAM_and_SCED_Energy_Curves",
+ "postDatetime": "2023-08-31T04:11:08.411000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-908-er?download=940412340",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-908-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 36722934
+ },
+ {
+ "period": "2023",
+ "product": "NP3-911-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-911-ER",
+ "name": "2-Day DAM Ancillary Services Reports",
+ "reportTypeId": 13057
+ },
+ "archives": [
+ {
+ "docId": 940410046,
+ "friendlyName": "2_Day_AS_Disclosure",
+ "postDatetime": "2023-08-31T03:55:53.849000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-911-er?download=940410046",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-911-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 69061
+ },
+ {
+ "period": "2023",
+ "product": "NP3-991-EX",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-991-EX",
+ "name": "60-Day COP All Updates",
+ "reportTypeId": 15943
+ },
+ "archives": [
+ {
+ "docId": 940423384,
+ "friendlyName": "60_Day_COP_All_Updates",
+ "postDatetime": "2023-08-31T05:10:55.962000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-991-ex?download=940423384",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-991-ex",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 6291241
+ },
+ {
+ "period": "2023",
+ "product": "NP3-108",
+ "listing": {
+ "meta": {
+ "totalRecords": 1,
+ "pageSize": 1,
+ "totalPages": 1,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-108",
+ "name": "Monthly ERCOT Demand Response from Load Resources",
+ "reportTypeId": 13242
+ },
+ "archives": [
+ {
+ "docId": 934101630,
+ "friendlyName": "Monthly_ERCOT_LoadResourceDR_23_07",
+ "postDatetime": "2023-08-04T08:24:01",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-108?download=934101630",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-108",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 8496
+ },
+ {
+ "period": "2023",
+ "product": "NP1-346-ER",
+ "listing": {
+ "meta": {
+ "totalRecords": 31,
+ "pageSize": 1,
+ "totalPages": 31,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP1-346-ER",
+ "name": "Unplanned Resource Outages Report",
+ "reportTypeId": 22912
+ },
+ "archives": [
+ {
+ "docId": 940421650,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2023-08-31T05:03:52",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np1-346-er?download=940421650",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np1-346-er",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 29029
+ },
+ {
+ "period": "2023",
+ "product": "NP3-560-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP3-560-CD",
+ "name": "Seven-Day Load Forecast by Forecast Zone",
+ "reportTypeId": 12311
+ },
+ "archives": [
+ {
+ "docId": 940606303,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2023-08-31T23:30:02",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-560-cd?download=940606303",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np3-560-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10654
+ },
+ {
+ "period": "2023",
+ "product": "NP4-732-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-732-CD",
+ "name": "Wind Power Production - Hourly Averaged Actual and Forecasted Values",
+ "reportTypeId": 13028
+ },
+ "archives": [
+ {
+ "docId": 940611200,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2023-08-31T23:55:34",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd?download=940611200",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-732-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 10050
+ },
+ {
+ "period": "2023",
+ "product": "NP4-745-CD",
+ "listing": {
+ "meta": {
+ "totalRecords": 744,
+ "pageSize": 1,
+ "totalPages": 744,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 2,
+ "parameters": {
+ "postDatetimeFrom": "2023-08-01T00:00:00",
+ "postDatetimeTo": "2023-09-01T00:00:00"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "product": {
+ "emilId": "NP4-745-CD",
+ "name": "Solar Power Production - Hourly Averaged Actual and Forecasted Values by Geographical Region",
+ "reportTypeId": 21809
+ },
+ "archives": [
+ {
+ "docId": 940611381,
+ "friendlyName": "PVGRHRLYAVGACTGEONP4745_csv",
+ "postDatetime": "2023-08-31T23:55:38.617000",
+ "links": {
+ "endpoint": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-745-cd?download=940611381",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ }
+ ],
+ "bundles": [],
+ "links": {
+ "self": {
+ "href": "https://api.ercot.com/api/public-reports/archive/np4-745-cd",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ },
+ "parent": {
+ "href": "https://api.ercot.com/api/public-reports",
+ "rel": null,
+ "title": null,
+ "type": null,
+ "hreflang": null,
+ "media": null,
+ "deprecation": null,
+ "profile": null,
+ "name": null
+ }
+ }
+ },
+ "bytes": 9492
+ }
+ ]
+}
diff --git a/tools/inputs/history/middle-evidence.json b/tools/inputs/history/middle-evidence.json
new file mode 100644
index 00000000..d4cc189d
--- /dev/null
+++ b/tools/inputs/history/middle-evidence.json
@@ -0,0 +1,614 @@
+[
+ {
+ "endpoint": "np3-965-er/60_load_res_data_in_sced",
+ "member": "60d_Load_Resource_Data_in_SCED-31-JAN-20.csv",
+ "fixture": "np3-965-er-60_load_res_data_in_sced-2020.csv",
+ "sourceRows": 43008,
+ "fixtureRows": 3,
+ "maxPopulatedCurvePoint": 0,
+ "firstRow": {
+ "SCEDTimestamp": "2019-12-02T00:00:22",
+ "repeatHourFlag": false,
+ "qseName": null,
+ "dmeName": null,
+ "resourceName": "ACRLY_LD1",
+ "telResStatus": "ONRL",
+ "maxPowerConsumption": "0.4",
+ "lowPowerConsumption": "0",
+ "realPowerConsumption": "0.3",
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": null,
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "SCEDBidCurveMW1": null,
+ "SCEDBidCurvePrice1": null,
+ "SCEDBidCurveMW2": null,
+ "SCEDBidCurvePrice2": null,
+ "SCEDBidCurveMW3": null,
+ "SCEDBidCurvePrice3": null,
+ "SCEDBidCurveMW4": null,
+ "SCEDBidCurvePrice4": null,
+ "SCEDBidCurveMW5": null,
+ "SCEDBidCurvePrice5": null,
+ "SCEDBidCurveMW6": null,
+ "SCEDBidCurvePrice6": null,
+ "SCEDBidCurveMW7": null,
+ "SCEDBidCurvePrice7": null,
+ "SCEDBidCurveMW8": null,
+ "SCEDBidCurvePrice8": null,
+ "SCEDBidCurveMW9": null,
+ "SCEDBidCurvePrice9": null,
+ "SCEDBidCurveMW10": null,
+ "SCEDBidCurvePrice10": null,
+ "selfRRSFFR": null,
+ "selfRRSUFR": null,
+ "selfECRS": null,
+ "rampRateUp": null,
+ "rampRateDown": null,
+ "ASCapNSPIN": null,
+ "ASCapECRS": null,
+ "ASCapREGUP": null,
+ "ASCapREGDN": null,
+ "ASCapRRSPFR": null,
+ "ASCapRRSFFR": null,
+ "ASCapRRSUFR": null,
+ "HDL": "0",
+ "LDL": "0",
+ "basePoint": null,
+ "ASRespForRRS": "0.1",
+ "ASRespForRRSFFR": null,
+ "ASRespForNSPIN": "0",
+ "ASRespForREGUP": "0",
+ "ASRespForREGDN": "0",
+ "HASL": "0",
+ "LASL": "0",
+ "ASRespForECRS": null,
+ "SCEDBidCurveMW11": null,
+ "SCEDBidCurvePrice11": null,
+ "SCEDBidCurveMW12": null,
+ "SCEDBidCurvePrice12": null,
+ "SCEDBidCurveMW13": null,
+ "SCEDBidCurvePrice13": null,
+ "SCEDBidCurveMW14": null,
+ "SCEDBidCurvePrice14": null,
+ "SCEDBidCurveMW15": null,
+ "SCEDBidCurvePrice15": null,
+ "SCEDBidCurveMW16": null,
+ "SCEDBidCurvePrice16": null,
+ "SCEDBidCurveMW17": null,
+ "SCEDBidCurvePrice17": null,
+ "SCEDBidCurveMW18": null,
+ "SCEDBidCurvePrice18": null,
+ "SCEDBidCurveMW19": null,
+ "SCEDBidCurvePrice19": null,
+ "SCEDBidCurveMW20": null,
+ "SCEDBidCurvePrice20": null,
+ "SCEDBidCurveMW21": null,
+ "SCEDBidCurvePrice21": null,
+ "SCEDBidCurveMW22": null,
+ "SCEDBidCurvePrice22": null,
+ "SCEDBidCurveMW23": null,
+ "SCEDBidCurvePrice23": null,
+ "SCEDBidCurveMW24": null,
+ "SCEDBidCurvePrice24": null,
+ "SCEDBidCurveMW25": null,
+ "SCEDBidCurvePrice25": null,
+ "SCEDBidCurveMW26": null,
+ "SCEDBidCurvePrice26": null,
+ "SCEDBidCurveMW27": null,
+ "SCEDBidCurvePrice27": null,
+ "SCEDBidCurveMW28": null,
+ "SCEDBidCurvePrice28": null,
+ "SCEDBidCurveMW29": null,
+ "SCEDBidCurvePrice29": null,
+ "SCEDBidCurveMW30": null,
+ "SCEDBidCurvePrice30": null,
+ "SCEDBidCurveMW31": null,
+ "SCEDBidCurvePrice31": null,
+ "SCEDBidCurveMW32": null,
+ "SCEDBidCurvePrice32": null,
+ "SCEDBidCurveMW33": null,
+ "SCEDBidCurvePrice33": null,
+ "SCEDBidCurveMW34": null,
+ "SCEDBidCurvePrice34": null,
+ "SCEDBidCurveMW35": null,
+ "SCEDBidCurvePrice35": null
+ },
+ "decodedRows": 43008,
+ "source": "work/history-middle-2020/NP3-965-ER.zip",
+ "zipSha256": "90f2a7799e101947bd326d13cfe0d64dfb7f2fb2999f44e1dad900c7a8aa6918"
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_qse_self_arranged_as",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-JAN-20.csv",
+ "fixture": "np3-965-er-60_sced_qse_self_arranged_as-2020.csv",
+ "sourceRows": 3744,
+ "fixtureRows": 3,
+ "maxPopulatedCurvePoint": 0,
+ "firstRow": {
+ "SCEDTimestamp": "2019-12-02T00:00:22",
+ "repeatHourFlag": false,
+ "qseName": "QAEN",
+ "REGUP": "7.8",
+ "REGDN": "9.6",
+ "NSPIN": "42.1",
+ "NSPNM": null,
+ "RRSPFR": null,
+ "RRSFFR": null,
+ "RRSUFR": null,
+ "ECRSS": null,
+ "ECRSM": null,
+ "RRSGN": "65",
+ "RRSLD": "0",
+ "RRSNC": "25"
+ },
+ "decodedRows": 3744,
+ "source": "work/history-middle-2020/NP3-965-ER.zip",
+ "zipSha256": "90f2a7799e101947bd326d13cfe0d64dfb7f2fb2999f44e1dad900c7a8aa6918"
+ },
+ {
+ "endpoint": "np4-732-cd/wpp_hrly_avrg_actl_fcast",
+ "member": "cdr.00013028.0000000000000000.20200131.235517.WPPHRLYAVGACTNP4732.csv",
+ "fixture": "np4-732-cd-wpp_hrly_avrg_actl_fcast-2020.csv",
+ "source": "work/history-middle-2020/NP4-732-CD.zip",
+ "sourceRows": 216,
+ "fixtureRows": 3,
+ "csvSha256": "c1022c57b0c202302aca72ad693f4566340c5d909d5b589d3c2dcae559f4db44",
+ "firstRow": {
+ "postedDatetime": null,
+ "deliveryDate": "2020-01-29",
+ "hourEnding": 24,
+ "genSystemWide": null,
+ "COPHSLSystemWide": "8867.9",
+ "STWPFSystemWide": "8495.7",
+ "WGRPPSystemWide": "6074.6",
+ "genLoadZoneSouthHouston": null,
+ "COPHSLLoadZoneSouthHouston": "3144.6",
+ "STWPFLoadZoneSouthHouston": "3222.4",
+ "WGRPPLoadZoneSouthHouston": "2418.6",
+ "genLoadZoneWest": null,
+ "COPHSLLoadZoneWest": "5319.5",
+ "STWPFLoadZoneWest": "4970.9",
+ "WGRPPLoadZoneWest": "3448.3",
+ "genLoadZoneNorth": null,
+ "COPHSLLoadZoneNorth": "403.8",
+ "STWPFLoadZoneNorth": "302.4",
+ "WGRPPLoadZoneNorth": "207.7",
+ "HSLSystemWide": null,
+ "DSTFlag": false,
+ "hourEndingTimestamp": null,
+ "actualSystemWide": "8380.21",
+ "actualSouthHouston": null,
+ "COPHSLSouthHouston": null,
+ "STWPFSouthHouston": null,
+ "WGRPPSouthHouston": null,
+ "actualWestNorth": null,
+ "COPHSLWestNorth": null,
+ "STWPFWestNorth": null,
+ "WGRPPWestNorth": null,
+ "actualLoadZoneSouthHouston": "3156.38",
+ "actualLoadZoneWest": "4921.15",
+ "actualLoadZoneNorth": "302.68",
+ "hourBeginningTimestamp": null
+ },
+ "decodedRows": 216,
+ "zipSha256": "10b99691ba1e4b9ed2e3af14d0b60541aa43fc090608b0a4580512fe80cff005"
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_qse_self_arranged_as",
+ "member": "60d_SCED_QSE_Self_Arranged_AS-31-AUG-23.csv",
+ "fixture": "np3-965-er-60_sced_qse_self_arranged_as-2023.csv",
+ "source": "work/history-middle-2023/NP3-965-ER.zip",
+ "sourceRows": 4416,
+ "fixtureRows": 3,
+ "csvSha256": "31ad55a8de18eec3fb8eec91df89455aa90cfbc75c024360940c56c46e718a10",
+ "firstRow": {
+ "SCEDTimestamp": "2023-07-02T00:00:25",
+ "repeatHourFlag": false,
+ "qseName": "QACCEN",
+ "REGUP": null,
+ "REGDN": null,
+ "NSPIN": null,
+ "NSPNM": null,
+ "RRSPFR": "1",
+ "RRSFFR": "0",
+ "RRSUFR": "0",
+ "ECRSS": null,
+ "ECRSM": null,
+ "RRSGN": null,
+ "RRSLD": null,
+ "RRSNC": null
+ },
+ "decodedRows": 4416,
+ "zipSha256": "3be719caffa040e3c40953bcf403dc71cb513f1ce4d5d83c1c3f06f4b856b340"
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_gen_res_data",
+ "member": "60d_SCED_Gen_Resource_Data-31-AUG-23.csv",
+ "fixture": "np3-965-er-60_sced_gen_res_data-2023.csv",
+ "source": "work/history-middle-2023/NP3-965-ER.zip",
+ "sourceRows": 97824,
+ "fixtureRows": 3,
+ "csvSha256": "08218ef1039c8a63ab97ae9d8a071676df8799ecef3ee4cbed4e7c234b2171f0",
+ "firstRow": {
+ "SCEDTimestamp": "2023-07-02T00:00:25",
+ "repeatHourFlag": false,
+ "qseName": "QGOLDN",
+ "dmeName": "YGOLDE",
+ "resourceName": "AEEC_ANTLP_1",
+ "resourceType": "DSL",
+ "SCED1CurveMW1": "0",
+ "SCED1CurvePrice1": "-250",
+ "SCED1CurveMW2": "30",
+ "SCED1CurvePrice2": "-250",
+ "SCED1CurveMW3": "30",
+ "SCED1CurvePrice3": "25.8999996185303",
+ "SCED1CurveMW4": "36",
+ "SCED1CurvePrice4": "26.5200004577637",
+ "SCED1CurveMW5": "38",
+ "SCED1CurvePrice5": "26.7199993133545",
+ "SCED1CurveMW6": "40",
+ "SCED1CurvePrice6": "26.9300003051758",
+ "SCED1CurveMW7": "42",
+ "SCED1CurvePrice7": "27.1399993896484",
+ "SCED1CurveMW8": "44",
+ "SCED1CurvePrice8": "27.3400001525879",
+ "SCED1CurveMW9": "46",
+ "SCED1CurvePrice9": "27.5499992370605",
+ "SCED1CurveMW10": "48",
+ "SCED1CurvePrice10": "27.75",
+ "SCED1CurveMW11": "50",
+ "SCED1CurvePrice11": "27.9599990844727",
+ "SCED1CurveMW12": "50.9000015258789",
+ "SCED1CurvePrice12": "28.0499992370605",
+ "SCED1CurveMW13": "50.9000015258789",
+ "SCED1CurvePrice13": "28.0499992370605",
+ "SCED1CurveMW14": null,
+ "SCED1CurvePrice14": null,
+ "SCED1CurveMW15": null,
+ "SCED1CurvePrice15": null,
+ "SCED1CurveMW16": null,
+ "SCED1CurvePrice16": null,
+ "SCED1CurveMW17": null,
+ "SCED1CurvePrice17": null,
+ "SCED1CurveMW18": null,
+ "SCED1CurvePrice18": null,
+ "SCED1CurveMW19": null,
+ "SCED1CurvePrice19": null,
+ "SCED1CurveMW20": null,
+ "SCED1CurvePrice20": null,
+ "SCED1CurveMW21": null,
+ "SCED1CurvePrice21": null,
+ "SCED1CurveMW22": null,
+ "SCED1CurvePrice22": null,
+ "SCED1CurveMW23": null,
+ "SCED1CurvePrice23": null,
+ "SCED1CurveMW24": null,
+ "SCED1CurvePrice24": null,
+ "SCED1CurveMW25": null,
+ "SCED1CurvePrice25": null,
+ "SCED1CurveMW26": null,
+ "SCED1CurvePrice26": null,
+ "SCED1CurveMW27": null,
+ "SCED1CurvePrice27": null,
+ "SCED1CurveMW28": null,
+ "SCED1CurvePrice28": null,
+ "SCED1CurveMW29": null,
+ "SCED1CurvePrice29": null,
+ "SCED1CurveMW30": null,
+ "SCED1CurvePrice30": null,
+ "SCED1CurveMW31": null,
+ "SCED1CurvePrice31": null,
+ "SCED1CurveMW32": null,
+ "SCED1CurvePrice32": null,
+ "SCED1CurveMW33": null,
+ "SCED1CurvePrice33": null,
+ "SCED1CurveMW34": null,
+ "SCED1CurvePrice34": null,
+ "SCED1CurveMW35": null,
+ "SCED1CurvePrice35": null,
+ "SCED2CurveMW1": "0",
+ "SCED2CurvePrice1": "-20",
+ "SCED2CurveMW2": "30",
+ "SCED2CurvePrice2": "-20",
+ "SCED2CurveMW3": "30",
+ "SCED2CurvePrice3": "25.8999996185303",
+ "SCED2CurveMW4": "36",
+ "SCED2CurvePrice4": "26.5200004577637",
+ "SCED2CurveMW5": "38",
+ "SCED2CurvePrice5": "26.7199993133545",
+ "SCED2CurveMW6": "40",
+ "SCED2CurvePrice6": "26.9300003051758",
+ "SCED2CurveMW7": "42",
+ "SCED2CurvePrice7": "27.1399993896484",
+ "SCED2CurveMW8": "44",
+ "SCED2CurvePrice8": "27.3400001525879",
+ "SCED2CurveMW9": "46",
+ "SCED2CurvePrice9": "27.5499992370605",
+ "SCED2CurveMW10": "48",
+ "SCED2CurvePrice10": "27.75",
+ "SCED2CurveMW11": "50",
+ "SCED2CurvePrice11": "27.9599990844727",
+ "SCED2CurveMW12": "50.9000015258789",
+ "SCED2CurvePrice12": "28.0499992370605",
+ "SCED2CurveMW13": "50.9000015258789",
+ "SCED2CurvePrice13": "28.0499992370605",
+ "SCED2CurveMW14": null,
+ "SCED2CurvePrice14": null,
+ "SCED2CurveMW15": null,
+ "SCED2CurvePrice15": null,
+ "SCED2CurveMW16": null,
+ "SCED2CurvePrice16": null,
+ "SCED2CurveMW17": null,
+ "SCED2CurvePrice17": null,
+ "SCED2CurveMW18": null,
+ "SCED2CurvePrice18": null,
+ "SCED2CurveMW19": null,
+ "SCED2CurvePrice19": null,
+ "SCED2CurveMW20": null,
+ "SCED2CurvePrice20": null,
+ "SCED2CurveMW21": null,
+ "SCED2CurvePrice21": null,
+ "SCED2CurveMW22": null,
+ "SCED2CurvePrice22": null,
+ "SCED2CurveMW23": null,
+ "SCED2CurvePrice23": null,
+ "SCED2CurveMW24": null,
+ "SCED2CurvePrice24": null,
+ "SCED2CurveMW25": null,
+ "SCED2CurvePrice25": null,
+ "SCED2CurveMW26": null,
+ "SCED2CurvePrice26": null,
+ "SCED2CurveMW27": null,
+ "SCED2CurvePrice27": null,
+ "SCED2CurveMW28": null,
+ "SCED2CurvePrice28": null,
+ "SCED2CurveMW29": null,
+ "SCED2CurvePrice29": null,
+ "SCED2CurveMW30": null,
+ "SCED2CurvePrice30": null,
+ "SCED2CurveMW31": null,
+ "SCED2CurvePrice31": null,
+ "SCED2CurveMW32": null,
+ "SCED2CurvePrice32": null,
+ "SCED2CurveMW33": null,
+ "SCED2CurvePrice33": null,
+ "SCED2CurveMW34": null,
+ "SCED2CurvePrice34": null,
+ "SCED2CurveMW35": null,
+ "SCED2CurvePrice35": null,
+ "outputSchedule": "0",
+ "HSL": "50",
+ "HDL": "0",
+ "LSL": "30",
+ "LDL": "0",
+ "telemeteredResourceStatus": "OFF",
+ "basePoint": "0",
+ "telemeteredNetOutput": "0",
+ "rampRateUp": null,
+ "rampRateDown": null,
+ "ASCapREGUP": null,
+ "ASCapREGDN": null,
+ "ASCapECRS": null,
+ "ASCapNSPIN": null,
+ "ASCapRRSPFR": null,
+ "ASCapRRSFFR": null,
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": null,
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "bidType": "3PT",
+ "startUpColdOffer": "172.5",
+ "startUpHotOffer": "172.5",
+ "startUpInterOffer": "172.5",
+ "minGenCost": "36.35",
+ "submittedTPOMW1": "30",
+ "submittedTPOPrice1": "25.9",
+ "submittedTPOMW2": "36",
+ "submittedTPOPrice2": "26.52",
+ "submittedTPOMW3": "38",
+ "submittedTPOPrice3": "26.72",
+ "submittedTPOMW4": "40",
+ "submittedTPOPrice4": "26.93",
+ "submittedTPOMW5": "42",
+ "submittedTPOPrice5": "27.14",
+ "submittedTPOMW6": "44",
+ "submittedTPOPrice6": "27.34",
+ "submittedTPOMW7": "46",
+ "submittedTPOPrice7": "27.55",
+ "submittedTPOMW8": "48",
+ "submittedTPOPrice8": "27.75",
+ "submittedTPOMW9": "50",
+ "submittedTPOPrice9": "27.96",
+ "submittedTPOMW10": "50.9",
+ "submittedTPOPrice10": "28.05",
+ "proxyExtension": "No",
+ "HASL": "50",
+ "LASL": "30",
+ "ASREGUP": "0",
+ "ASREGDN": "0",
+ "ASRRS": "0",
+ "ASRRSFFR": "0",
+ "ASNSRS": "0",
+ "ASECRS": "0"
+ },
+ "decodedRows": 97824,
+ "zipSha256": "3be719caffa040e3c40953bcf403dc71cb513f1ce4d5d83c1c3f06f4b856b340"
+ },
+ {
+ "endpoint": "np3-965-er/60_load_res_data_in_sced",
+ "member": "60d_Load_Resource_Data_in_SCED-31-AUG-23.csv",
+ "fixture": "np3-965-er-60_load_res_data_in_sced-2023.csv",
+ "source": "work/history-middle-2023/NP3-965-ER.zip",
+ "sourceRows": 64032,
+ "fixtureRows": 3,
+ "csvSha256": "a5aac8c864a4300a21b93786d27b63f069e9370327687fb5bdd887bb26dc1ac4",
+ "firstRow": {
+ "SCEDTimestamp": "2023-07-02T00:00:25",
+ "repeatHourFlag": false,
+ "qseName": "QEDE20",
+ "dmeName": null,
+ "resourceName": "AAPIPLNC_LD3",
+ "telResStatus": "ONRL",
+ "maxPowerConsumption": "12",
+ "lowPowerConsumption": "9.2",
+ "realPowerConsumption": "10.8",
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": null,
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "SCEDBidCurveMW1": null,
+ "SCEDBidCurvePrice1": null,
+ "SCEDBidCurveMW2": null,
+ "SCEDBidCurvePrice2": null,
+ "SCEDBidCurveMW3": null,
+ "SCEDBidCurvePrice3": null,
+ "SCEDBidCurveMW4": null,
+ "SCEDBidCurvePrice4": null,
+ "SCEDBidCurveMW5": null,
+ "SCEDBidCurvePrice5": null,
+ "SCEDBidCurveMW6": null,
+ "SCEDBidCurvePrice6": null,
+ "SCEDBidCurveMW7": null,
+ "SCEDBidCurvePrice7": null,
+ "SCEDBidCurveMW8": null,
+ "SCEDBidCurvePrice8": null,
+ "SCEDBidCurveMW9": null,
+ "SCEDBidCurvePrice9": null,
+ "SCEDBidCurveMW10": null,
+ "SCEDBidCurvePrice10": null,
+ "selfRRSFFR": null,
+ "selfRRSUFR": null,
+ "selfECRS": null,
+ "rampRateUp": null,
+ "rampRateDown": null,
+ "ASCapNSPIN": null,
+ "ASCapECRS": null,
+ "ASCapREGUP": null,
+ "ASCapREGDN": null,
+ "ASCapRRSPFR": null,
+ "ASCapRRSFFR": null,
+ "ASCapRRSUFR": null,
+ "HDL": "0",
+ "LDL": "0",
+ "basePoint": null,
+ "ASRespForRRS": "3.6",
+ "ASRespForRRSFFR": "0",
+ "ASRespForNSPIN": "0",
+ "ASRespForREGUP": "0",
+ "ASRespForREGDN": "0",
+ "HASL": "0",
+ "LASL": "0",
+ "ASRespForECRS": "0",
+ "SCEDBidCurveMW11": null,
+ "SCEDBidCurvePrice11": null,
+ "SCEDBidCurveMW12": null,
+ "SCEDBidCurvePrice12": null,
+ "SCEDBidCurveMW13": null,
+ "SCEDBidCurvePrice13": null,
+ "SCEDBidCurveMW14": null,
+ "SCEDBidCurvePrice14": null,
+ "SCEDBidCurveMW15": null,
+ "SCEDBidCurvePrice15": null,
+ "SCEDBidCurveMW16": null,
+ "SCEDBidCurvePrice16": null,
+ "SCEDBidCurveMW17": null,
+ "SCEDBidCurvePrice17": null,
+ "SCEDBidCurveMW18": null,
+ "SCEDBidCurvePrice18": null,
+ "SCEDBidCurveMW19": null,
+ "SCEDBidCurvePrice19": null,
+ "SCEDBidCurveMW20": null,
+ "SCEDBidCurvePrice20": null,
+ "SCEDBidCurveMW21": null,
+ "SCEDBidCurvePrice21": null,
+ "SCEDBidCurveMW22": null,
+ "SCEDBidCurvePrice22": null,
+ "SCEDBidCurveMW23": null,
+ "SCEDBidCurvePrice23": null,
+ "SCEDBidCurveMW24": null,
+ "SCEDBidCurvePrice24": null,
+ "SCEDBidCurveMW25": null,
+ "SCEDBidCurvePrice25": null,
+ "SCEDBidCurveMW26": null,
+ "SCEDBidCurvePrice26": null,
+ "SCEDBidCurveMW27": null,
+ "SCEDBidCurvePrice27": null,
+ "SCEDBidCurveMW28": null,
+ "SCEDBidCurvePrice28": null,
+ "SCEDBidCurveMW29": null,
+ "SCEDBidCurvePrice29": null,
+ "SCEDBidCurveMW30": null,
+ "SCEDBidCurvePrice30": null,
+ "SCEDBidCurveMW31": null,
+ "SCEDBidCurvePrice31": null,
+ "SCEDBidCurveMW32": null,
+ "SCEDBidCurvePrice32": null,
+ "SCEDBidCurveMW33": null,
+ "SCEDBidCurvePrice33": null,
+ "SCEDBidCurveMW34": null,
+ "SCEDBidCurvePrice34": null,
+ "SCEDBidCurveMW35": null,
+ "SCEDBidCurvePrice35": null
+ },
+ "decodedRows": 64032,
+ "zipSha256": "3be719caffa040e3c40953bcf403dc71cb513f1ce4d5d83c1c3f06f4b856b340"
+ },
+ {
+ "endpoint": "np4-732-cd/wpp_hrly_avrg_actl_fcast",
+ "member": "cdr.00013028.0000000000000000.20230831.235534.WPPHRLYAVGACTNP4732.csv",
+ "fixture": "np4-732-cd-wpp_hrly_avrg_actl_fcast-2023.csv",
+ "source": "work/history-middle-2023/NP4-732-CD.zip",
+ "sourceRows": 216,
+ "fixtureRows": 3,
+ "csvSha256": "663b2ed8f16d9bcc9fdc1bfc541e032354a2259ca554bc3d11dc16504e992eb8",
+ "firstRow": {
+ "postedDatetime": null,
+ "deliveryDate": "2023-08-29",
+ "hourEnding": 24,
+ "genSystemWide": null,
+ "COPHSLSystemWide": "6766.6",
+ "STWPFSystemWide": "6314.1",
+ "WGRPPSystemWide": "3616.8",
+ "genLoadZoneSouthHouston": null,
+ "COPHSLLoadZoneSouthHouston": "529.1",
+ "STWPFLoadZoneSouthHouston": "723.1",
+ "WGRPPLoadZoneSouthHouston": "420.5",
+ "genLoadZoneWest": null,
+ "COPHSLLoadZoneWest": "5397.9",
+ "STWPFLoadZoneWest": "4912.8",
+ "WGRPPLoadZoneWest": "2811.4",
+ "genLoadZoneNorth": null,
+ "COPHSLLoadZoneNorth": "839.6",
+ "STWPFLoadZoneNorth": "678.2",
+ "WGRPPLoadZoneNorth": "384.9",
+ "HSLSystemWide": null,
+ "DSTFlag": false,
+ "hourEndingTimestamp": null,
+ "actualSystemWide": "6304.72",
+ "actualSouthHouston": null,
+ "COPHSLSouthHouston": null,
+ "STWPFSouthHouston": null,
+ "WGRPPSouthHouston": null,
+ "actualWestNorth": null,
+ "COPHSLWestNorth": null,
+ "STWPFWestNorth": null,
+ "WGRPPWestNorth": null,
+ "actualLoadZoneSouthHouston": "702.54",
+ "actualLoadZoneWest": "4966.96",
+ "actualLoadZoneNorth": "635.22",
+ "hourBeginningTimestamp": null
+ },
+ "decodedRows": 216,
+ "zipSha256": "0a1b675dbdaf3bc30073138fb041b60c80b4ddc9d32b0946791ae5fc4b10659a"
+ }
+]
diff --git a/tools/inputs/history/next-evidence.json b/tools/inputs/history/next-evidence.json
new file mode 100644
index 00000000..fa5ad59b
--- /dev/null
+++ b/tools/inputs/history/next-evidence.json
@@ -0,0 +1,288 @@
+[
+ {
+ "endpoint": "np4-192-cd/dam_total_energy_purchased",
+ "fixture": "np4-192-cd-history-current.csv",
+ "file": "cdr.00012333.0000000000000000.20260906.123241.DAMTOTQTYENGYBUYNP4192.csv",
+ "csv_rows": 22978,
+ "first_row": {
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "repeatHourFlag": false,
+ "settlementPoint": "TGS_GT01",
+ "totalDamEnergyBought": "0"
+ },
+ "rows_decoded": 22978
+ },
+ {
+ "endpoint": "np4-192-cd/dam_total_energy_purchased",
+ "fixture": "np4-192-cd-history-samples.csv",
+ "file": "cdr.00012333.0000000000000000.20140312.131027.DAMTOTQTYENGYBUYNP4192.csv",
+ "csv_rows": 431,
+ "first_row": {
+ "deliveryDate": "2014-03-13",
+ "hourEnding": "01:00",
+ "repeatHourFlag": false,
+ "settlementPoint": "MWEC_G1",
+ "totalDamEnergyBought": "28"
+ },
+ "rows_decoded": 431
+ },
+ {
+ "endpoint": "np4-193-cd/total_dam_energy_sold",
+ "fixture": "np4-193-cd-history-current.csv",
+ "file": "cdr.00012334.0000000000000000.20260906.123241.DAMTOTQTYENGYSOLDNP4193.csv",
+ "csv_rows": 13978,
+ "first_row": {
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "repeatHourFlag": false,
+ "settlementPoint": "ABINDUST_RN",
+ "totalDAMEnergySold": "1.1"
+ },
+ "rows_decoded": 13978
+ },
+ {
+ "endpoint": "np4-193-cd/total_dam_energy_sold",
+ "fixture": "np4-193-cd-history-samples.csv",
+ "file": "cdr.00012334.0000000000000000.20140312.131028.DAMTOTQTYENGYSOLDNP4193.csv",
+ "csv_rows": 3631,
+ "first_row": {
+ "deliveryDate": "2014-03-13",
+ "hourEnding": "01:00",
+ "repeatHourFlag": false,
+ "settlementPoint": "AUSTPL_ALL",
+ "totalDAMEnergySold": "0"
+ },
+ "rows_decoded": 3631
+ },
+ {
+ "endpoint": "np4-194-cd/dam_ptp_obligation_sp_results",
+ "fixture": "np4-194-cd-history-current.csv",
+ "file": "cdr.00013042.0000000000000000.20260906.123246.DAMPTPOBLSPNP4194.csv",
+ "csv_rows": 20674,
+ "first_row": {
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "repeatedHourFlag": false,
+ "stlPnt": "7RNCHSLR_ALL",
+ "totalPtpOblAwardedSink": "23.4",
+ "totalPtpOblAwardedSource": "20"
+ },
+ "rows_decoded": 20674
+ },
+ {
+ "endpoint": "np4-194-cd/dam_ptp_obligation_sp_results",
+ "fixture": "np4-194-cd-history-samples.csv",
+ "file": "cdr.00013042.0000000000000000.20260625.125059.DAMPTPOBLSPNP4194.csv",
+ "csv_rows": 20855,
+ "first_row": {
+ "deliveryDate": "2026-06-26",
+ "hourEnding": "01:00",
+ "repeatedHourFlag": false,
+ "stlPnt": "7RNCHSLR_ALL",
+ "totalPtpOblAwardedSink": "40.7",
+ "totalPtpOblAwardedSource": "0"
+ },
+ "rows_decoded": 20855
+ },
+ {
+ "endpoint": "np4-523-cd/dam_system_lambda",
+ "fixture": "np4-523-cd-history-current.csv",
+ "file": "cdr.00013113.0000000000000000.20260906.123241.DAMSYSLAMBDANP4523.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "1:00",
+ "systemLambda": "44.2834"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np4-523-cd/dam_system_lambda",
+ "fixture": "np4-523-cd-history-samples.csv",
+ "file": "cdr.00013113.0000000000000000.20140501.125923.DAMSYSLAMBDANP4523.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "1:00",
+ "systemLambda": "30.0995"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np6-787-cd/lmp_electrical_bus",
+ "fixture": "np6-787-cd-history-current.csv",
+ "file": "cdr.00011485.0000000000000000.20260907.114020.LMPSELECTBUSNP6787_20260907_114017.csv",
+ "csv_rows": 19379,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-07T11:40:17",
+ "repeatedHourFlag": false,
+ "electricalBus": "0001",
+ "cappedLMP": "22.87",
+ "uncappedLMP": "22.87",
+ "LMP": null
+ },
+ "rows_decoded": 19379
+ },
+ {
+ "endpoint": "np6-787-cd/lmp_electrical_bus",
+ "fixture": "np6-787-cd-history-samples.csv",
+ "file": "cdr.00011485.0000000000000000.20140501.000017.LMPSELECTBUSNP6787_20140501_000014.csv",
+ "csv_rows": 10964,
+ "first_row": {
+ "SCEDTimestamp": "2014-05-01T00:00:14",
+ "repeatedHourFlag": false,
+ "electricalBus": "0001",
+ "cappedLMP": null,
+ "uncappedLMP": null,
+ "LMP": "28.88"
+ },
+ "rows_decoded": 10964
+ },
+ {
+ "endpoint": "np6-788-cd/lmp_node_zone_hub",
+ "fixture": "np6-788-cd-history-current.csv",
+ "file": "cdr.00012300.0000000000000000.20260907.114020.LMPSROSNODENP6788_20260907_114017.csv",
+ "csv_rows": 1123,
+ "first_row": {
+ "LMP": "23.53",
+ "SCEDTimestamp": "2026-09-07T11:40:17",
+ "repeatHourFlag": false,
+ "settlementPoint": "7RNCHSLR_ALL"
+ },
+ "rows_decoded": 1123
+ },
+ {
+ "endpoint": "np6-788-cd/lmp_node_zone_hub",
+ "fixture": "np6-788-cd-history-samples.csv",
+ "file": "cdr.00012300.0000000000000000.20140501.000531.LMPSROSNODENP6788_20140501_000519.csv",
+ "csv_rows": 571,
+ "first_row": {
+ "LMP": "30.95",
+ "SCEDTimestamp": "2014-05-01T00:05:19",
+ "repeatHourFlag": false,
+ "settlementPoint": "AMISTAD_ALL"
+ },
+ "rows_decoded": 571
+ },
+ {
+ "endpoint": "np4-33-cd/dam_as_plan",
+ "fixture": "np4-33-cd-history-current.csv",
+ "file": "cdr.00012316.0000000000000000.20260907.050000.ASPLANNP433.csv",
+ "csv_rows": 840,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "ancillaryType": "ECRS",
+ "quantity": 1150,
+ "DSTFlag": false
+ },
+ "rows_decoded": 840
+ },
+ {
+ "endpoint": "np4-33-cd/dam_as_plan",
+ "fixture": "np4-33-cd-history-samples.csv",
+ "file": "cdr.00012316.0000000000000000.20140501.050000.ASPLANNP433.csv",
+ "csv_rows": 192,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2014-05-01",
+ "hourEnding": "01:00",
+ "ancillaryType": "NSPIN",
+ "quantity": 1500,
+ "DSTFlag": false
+ },
+ "rows_decoded": 192
+ },
+ {
+ "endpoint": "np4-732-cd/wpp_hrly_avrg_actl_fcast",
+ "fixture": "np4-732-cd-history-current.csv",
+ "file": "cdr.00013028.0000000000000000.20260907.105512.WPPHRLYAVGACTNP4732.csv",
+ "csv_rows": 216,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 11,
+ "genSystemWide": "4230.6",
+ "COPHSLSystemWide": "3756.3",
+ "STWPFSystemWide": "4089",
+ "WGRPPSystemWide": "4089",
+ "genLoadZoneSouthHouston": "1665.85",
+ "COPHSLLoadZoneSouthHouston": "988.9",
+ "STWPFLoadZoneSouthHouston": "1579.2",
+ "WGRPPLoadZoneSouthHouston": "1579.2",
+ "genLoadZoneWest": "2435.26",
+ "COPHSLLoadZoneWest": "2662.6",
+ "STWPFLoadZoneWest": "2413",
+ "WGRPPLoadZoneWest": "2413",
+ "genLoadZoneNorth": "129.49",
+ "COPHSLLoadZoneNorth": "104.8",
+ "STWPFLoadZoneNorth": "96.8",
+ "WGRPPLoadZoneNorth": "96.8",
+ "HSLSystemWide": "4843.28",
+ "DSTFlag": false,
+ "hourEndingTimestamp": null,
+ "actualSystemWide": null,
+ "actualSouthHouston": null,
+ "COPHSLSouthHouston": null,
+ "STWPFSouthHouston": null,
+ "WGRPPSouthHouston": null,
+ "actualWestNorth": null,
+ "COPHSLWestNorth": null,
+ "STWPFWestNorth": null,
+ "WGRPPWestNorth": null,
+ "actualLoadZoneSouthHouston": null,
+ "actualLoadZoneWest": null,
+ "actualLoadZoneNorth": null,
+ "hourBeginningTimestamp": null
+ },
+ "rows_decoded": 216
+ },
+ {
+ "endpoint": "np4-732-cd/wpp_hrly_avrg_actl_fcast",
+ "fixture": "np4-732-cd-history-samples.csv",
+ "file": "cdr.00013028.0000000000000000.20140501.003231.WPPHRLYAVGACTNP4732.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": null,
+ "hourEnding": null,
+ "genSystemWide": null,
+ "COPHSLSystemWide": "5540.7",
+ "STWPFSystemWide": "5410.8",
+ "WGRPPSystemWide": "4510.1",
+ "genLoadZoneSouthHouston": null,
+ "COPHSLLoadZoneSouthHouston": null,
+ "STWPFLoadZoneSouthHouston": null,
+ "WGRPPLoadZoneSouthHouston": null,
+ "genLoadZoneWest": null,
+ "COPHSLLoadZoneWest": null,
+ "STWPFLoadZoneWest": null,
+ "WGRPPLoadZoneWest": null,
+ "genLoadZoneNorth": null,
+ "COPHSLLoadZoneNorth": null,
+ "STWPFLoadZoneNorth": null,
+ "WGRPPLoadZoneNorth": null,
+ "HSLSystemWide": null,
+ "DSTFlag": false,
+ "hourEndingTimestamp": "2014-04-29T01:00:00",
+ "actualSystemWide": "4222.85",
+ "actualSouthHouston": "960.72",
+ "COPHSLSouthHouston": "1238.5",
+ "STWPFSouthHouston": "1333.8",
+ "WGRPPSouthHouston": "1102.6",
+ "actualWestNorth": "3262.13",
+ "COPHSLWestNorth": "4302.2",
+ "STWPFWestNorth": "4077",
+ "WGRPPWestNorth": "3407.5",
+ "actualLoadZoneSouthHouston": null,
+ "actualLoadZoneWest": null,
+ "actualLoadZoneNorth": null,
+ "hourBeginningTimestamp": null
+ },
+ "rows_decoded": 96
+ }
+]
diff --git a/tools/inputs/history/np1-300-history-current.csv b/tools/inputs/history/np1-300-history-current.csv
new file mode 100644
index 00000000..46719e3c
--- /dev/null
+++ b/tools/inputs/history/np1-300-history-current.csv
@@ -0,0 +1,4 @@
+"SAVERECORDER","SAVECHANNEL","STARTTIME","INT001","INT002","INT003","INT004","INT005","INT006","INT007","INT008","INT009","INT010","INT011","INT012","INT013","INT014","INT015","INT016","INT017","INT018","INT019","INT020","INT021","INT022","INT023","INT024","INT025","INT026","INT027","INT028","INT029","INT030","INT031","INT032","INT033","INT034","INT035","INT036","INT037","INT038","INT039","INT040","INT041","INT042","INT043","INT044","INT045","INT046","INT047","INT048","INT049","INT050","INT051","INT052","INT053","INT054","INT055","INT056","INT057","INT058","INT059","INT060","INT061","INT062","INT063","INT064","INT065","INT066","INT067","INT068","INT069","INT070","INT071","INT072","INT073","INT074","INT075","INT076","INT077","INT078","INT079","INT080","INT081","INT082","INT083","INT084","INT085","INT086","INT087","INT088","INT089","INT090","INT091","INT092","INT093","INT094","INT095","INT096","INT097","INT098","INT099","INT100","LSTIME"
+"POSTEDAML_123_101_LZ_HOUSTON","3","11-MAR-26","64.9549319999","65.79653","66.018083","66.086875","66.27621","65.538994","66.3461029999","65.358203","65.156856","65.590871","65.935522","65.66845","66.487722","66.5426939999","67.1742299999","67.323312","67.723494","66.68965","66.586977","66.8912339999","67.897125","69.682011","70.0886289999","71.1625549999","71.8858409999","72.661703","73.094661","72.8599329999","72.5647809999","73.314012","73.8385669999","73.749026","72.0913809999","73.4144519999","74.1197959999","74.3210339999","74.967433","75.036967","75.474141","75.036145","75.2880779999","75.4150539999","76.1769259999","76.293017","76.6144599999","75.009786","76.277313","75.836882","74.5732469999","74.4499459999","74.522863","74.7975019999","75.2729719999","74.86654","74.586876","74.07325","73.6154059999","72.3818559999","72.1889199999","72.2052139999","72.224265","72.4203779999","73.429579","72.721102","72.375195","71.1682919999","71.279655","71.166004","70.8845079999","70.530021","70.168379","69.51728","67.926214","67.428116","67.331023","67.3340769999","66.4534639999","66.1713409999","66.4026","66.4659319999","65.977366","65.4962979999","65.148139","64.977472","64.3000509999","64.0165049999","63.872773","63.6706709999","63.046511","62.9516679999","62.8057039999","63.47424","63.4659809999","62.121568","61.93177","61.480995","","","","","04-SEP-26"
+"POSTEDAML_123_101_LZ_NORTH","3","11-MAR-26","81.9448419999","81.783894","81.908929","80.676837","80.4037629999","79.2563329999","79.2891079999","79.761043","79.7733719999","79.76814","79.3525539999","79.5257529999","79.4297499999","79.2133429999","78.759504","78.7013529999","78.993171","79.112898","79.1029819999","79.6532339999","80.601003","82.675437","83.4620929999","84.301113","86.208425","86.418188","87.000996","87.9659549999","88.7013019999","89.29349","89.606368","89.8571429999","89.566085","89.0389279999","89.139668","89.0046679999","89.273876","89.303599","89.2241","89.35961","89.617327","89.80826","89.738735","89.0466229999","88.8659559999","88.5060069999","88.905032","88.754123","89.186396","89.166162","90.058559","90.378034","90.7473099999","90.64691","90.7510379999","91.025614","91.3479379999","90.742569","90.3284979999","89.115046","89.111191","88.443432","88.4220619999","88.714269","88.268251","87.2613719999","87.362707","87.00038","86.543474","86.550182","86.959068","86.649585","85.72508","85.3424339999","85.1153029999","85.324302","84.5493649999","84.357194","84.8466939999","85.151566","84.475414","83.5379669999","83.684044","83.262867","82.7523369999","82.818358","82.895043","82.6281","81.9367079999","81.5684499999","81.5552119999","80.797235","80.087615","80.104218","79.3365629999","78.401508","","","","","04-SEP-26"
+"POSTEDAML_123_101_LZ_SOUTH","3","11-MAR-26","25.032578","25.2615629999","25.2420219999","25.256107","25.212869","24.841515","24.756155","24.461223","24.433671","24.467853","24.42576","24.331537","24.3117769999","24.513375","24.630118","24.576979","24.3335459999","24.379151","24.632197","24.654371","24.737628","24.48835","24.6566399999","24.778511","25.2296149999","25.305503","25.2009329999","25.286921","25.367991","25.720939","26.027424","25.988737","25.855176","25.6968999999","25.8451589999","25.884913","25.7601909999","25.619167","25.667735","25.6882799999","25.747215","25.973292","26.126942","26.126062","26.061907","26.182966","26.6655249999","26.835878","26.8145969999","26.9644149999","26.8803009999","27.0028289999","27.006428","26.788957","26.93326","26.996199","26.9988379999","27.0234969999","27.130303","27.098254","27.030733","27.0761949999","27.119982","27.421606","27.317898","27.655747","27.9663709999","27.3636589999","26.936733","26.7386389999","26.517688","26.5068079999","26.2308899999","26.141017","26.056923","26.051604","25.853985","25.904266","26.0266969999","25.814463","25.9820929999","26.026852","25.945017","25.6319839999","25.236024","24.734624","24.515919","24.5807229999","24.38127","24.337495","24.260777","24.152752","24.037879","23.991871","23.9410969999","23.8457849999","","","","","04-SEP-26"
diff --git a/tools/inputs/history/np1-300-history-samples.csv b/tools/inputs/history/np1-300-history-samples.csv
new file mode 100644
index 00000000..6b6eabc9
--- /dev/null
+++ b/tools/inputs/history/np1-300-history-samples.csv
@@ -0,0 +1,4 @@
+"SAVERECORDER","SAVECHANNEL","STARTTIME","INT001","INT002","INT003","INT004","INT005","INT006","INT007","INT008","INT009","INT010","INT011","INT012","INT013","INT014","INT015","INT016","INT017","INT018","INT019","INT020","INT021","INT022","INT023","INT024","INT025","INT026","INT027","INT028","INT029","INT030","INT031","INT032","INT033","INT034","INT035","INT036","INT037","INT038","INT039","INT040","INT041","INT042","INT043","INT044","INT045","INT046","INT047","INT048","INT049","INT050","INT051","INT052","INT053","INT054","INT055","INT056","INT057","INT058","INT059","INT060","INT061","INT062","INT063","INT064","INT065","INT066","INT067","INT068","INT069","INT070","INT071","INT072","INT073","INT074","INT075","INT076","INT077","INT078","INT079","INT080","INT081","INT082","INT083","INT084","INT085","INT086","INT087","INT088","INT089","INT090","INT091","INT092","INT093","INT094","INT095","INT096","INT097","INT098","INT099","INT100","LSTIME"
+"POSTEDAML_123_101_LZ_HOUSTON","3","30-NOV-25","70.456297","70.638771","69.9157749999","69.5513559999","70.066984","70.4402529999","71.518983","71.0531009999","69.7941799999","69.667612","70.445317","70.6792619999","70.0102129999","69.220692","69.133565","69.537682","70.0050439999","69.607776","69.353965","69.366872","69.251064","68.715705","68.770436","68.508516","68.7938419999","69.916466","69.7402459999","69.977159","68.639167","68.73215","68.5863659999","68.4622739999","68.276454","68.3406279999","68.611483","68.9905109999","69.098566","69.039264","69.285325","69.068763","68.581136","69.0108089999","69.122157","68.868081","68.7639499999","68.665103","68.641523","68.5249869999","68.172404","68.296402","68.445682","68.734622","68.642735","68.5021299999","68.628679","68.6212249999","68.7822649999","68.7395929999","68.974704","69.116381","69.010666","68.790243","68.6991139999","68.759286","68.9509639999","68.709247","68.5145229999","68.9947609999","69.2245539999","69.003928","68.8039339999","68.8797339999","68.5910599999","68.3952259999","67.926539","67.728009","67.559211","67.629091","67.523025","67.5260729999","67.398401","67.1771109999","67.4438619999","67.732208","67.446365","67.0223019999","66.8199039999","66.6190959999","66.8602839999","66.7412139999","66.3582349999","66.051134","66.220579","66.069445","65.6514949999","65.9150589999","","","","","26-MAY-26"
+"POSTEDAML_123_101_LZ_NORTH","3","30-NOV-25","56.992404","56.9331439999","57.185177","57.1922479999","57.564425","57.5689119999","57.1968019999","57.09279","57.3686459999","57.530329","57.6555779999","57.535929","57.2679789999","57.3977969999","57.371848","57.0869649999","57.1436259999","57.253914","57.0496619999","57.10421","57.293225","57.6448469999","57.844183","57.844039","58.495018","58.583196","58.559342","58.6123499999","58.6373109999","58.546115","57.942936","57.843668","57.6436259999","57.273954","57.1869689999","57.3080959999","57.733465","57.7946809999","57.486052","57.7750789999","57.335247","57.644694","57.206034","56.7998369999","56.312767","56.380169","56.3782879999","56.376437","56.706248","56.553707","56.8075789999","57.0335639999","56.941642","56.892907","56.5277699999","56.634427","56.511308","56.414644","56.5937759999","56.7696699999","56.911591","56.976526","57.226823","57.169763","57.185515","57.480043","57.724262","57.885168","57.900699","58.0746219999","57.966692","57.926985","57.953315","58.0956839999","57.863798","58.022801","57.9374189999","58.133336","58.0827519999","58.272916","58.9028339999","58.9605579999","58.5980509999","58.363709","58.014189","58.049377","58.09543","58.0059189999","58.005422","57.8225229999","57.772868","57.4965669999","57.739359","57.7373139999","57.909089","57.852617","","","","","26-MAY-26"
+"POSTEDAML_123_101_LZ_SOUTH","3","30-NOV-25","41.3495879999","41.004815","40.908067","40.619838","40.803024","40.8023349999","40.804518","40.6536249999","40.6914159999","40.7443079999","40.675167","40.6873459999","40.5698209999","40.5385089999","40.671995","40.9600349999","40.9515189999","40.634151","40.4010749999","40.1790269999","40.025129","39.358195","37.7654199999","37.329033","37.17539","36.941352","36.6800349999","36.57385","36.5368759999","36.549613","36.6130369999","36.834569","36.538981","36.153801","36.045343","35.8410519999","35.613559","35.416905","35.3522099999","35.2770799999","35.165678","35.123513","35.259798","35.010114","35.006957","35.0722659999","35.429651","35.590679","35.3883129999","34.658445","34.1762009999","34.0242629999","34.096992","34.116785","34.4451779999","34.7730499999","34.7041189999","34.7030189999","34.5276369999","34.3598599999","34.3910699999","34.442926","34.7966359999","34.9427779999","35.0690469999","34.747359","34.395197","34.5964659999","34.5195879999","34.4877159999","34.658943","34.6688949999","34.4271469999","34.4622049999","34.9330029999","35.143748","35.024304","35.1757309999","35.711765","35.441774","34.919027","35.2796549999","35.112493","35.111131","35.090344","35.1646179999","35.016471","34.7864519999","34.573078","34.589067","34.728003","34.699041","33.171033","33.2443129999","33.6762469999","33.8322239999","","","","","26-MAY-26"
diff --git a/tools/inputs/history/np1-301-history-current.csv b/tools/inputs/history/np1-301-history-current.csv
new file mode 100644
index 00000000..804abda0
--- /dev/null
+++ b/tools/inputs/history/np1-301-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,QSE Name,Resource Name,Hour Ending,Status,High Sustained Limit,Low Sustained Limit,High Emergency Limit,Low Emergency Limit,Reg Up,Reg Down,RRSPFR,RRSFFR,RRSUFR,NSPIN,ECRS,Minimum SOC,Maximum SOC,Hour Beginning Planned SOC
+07/09/2026,QAEN,ARAGORN_UNIT1,01:00,ON,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+07/09/2026,QAEN,ARAGORN_UNIT1,02:00,ON,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+07/09/2026,QAEN,ARAGORN_UNIT1,03:00,ON,0,0,0,0,0,0,0,0,0,0,0,0,0,0
diff --git a/tools/inputs/history/np1-301-history-samples.csv b/tools/inputs/history/np1-301-history-samples.csv
new file mode 100644
index 00000000..9e8c6441
--- /dev/null
+++ b/tools/inputs/history/np1-301-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","QSE Name","Resource Name","Hour Ending","Status","High Sustained Limit","Low Sustained Limit","High Emergency Limit","Low Emergency Limit","Reg Up","Reg Down","RRS","NSPIN"
+"03/02/2014","QAEN","DECKER_DPG1","01:00","OFF","315","50","316","50","0","0","0","0"
+"03/02/2014","QAEN","DECKER_DPG1","02:00","OFF","315","50","316","50","0","0","0","0"
+"03/02/2014","QAEN","DECKER_DPG1","03:00","OFF","315","50","316","50","0","0","0","0"
diff --git a/tools/inputs/history/np1-302-history-current.csv b/tools/inputs/history/np1-302-history-current.csv
new file mode 100644
index 00000000..d4295c5e
--- /dev/null
+++ b/tools/inputs/history/np1-302-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE Name,Reg Up Obligation Advisory,Reg Down Obligation Advisory,RRS Obligation Advisory,NSPIN Obligation Advisory,ECRS Obligation Advisory,Reg Up Obligation Final,Reg Down Obligation Final,RRS Obligation Final,NSPIN Obligation Final,ECRS Obligation Final
+03/11/2026,01:00,QACCEN,.07869,.07869,.61689,.29209,.15939,.07869,.07873,.61689,.921,.15939
+03/11/2026,01:00,QAEN,12.25151,12.25151,96.04312,45.47437,24.81557,12.25151,12.25777,96.04312,143.3896,24.81557
+03/11/2026,01:00,QAEPS2,.00059,.00059,.0046,.00218,.00119,.00059,.00059,.0046,.00686,.00119
diff --git a/tools/inputs/history/np1-302-history-samples.csv b/tools/inputs/history/np1-302-history-samples.csv
new file mode 100644
index 00000000..f5742fe5
--- /dev/null
+++ b/tools/inputs/history/np1-302-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","QSE Name","Reg Up Obligation","Reg Down Obligation","RRS Obligation","NSPIN Obligation","Reg Up Responsibility","Reg Down Responsibility","RRS Responsibility","NSPIN Responsibility"
+"02/25/2019","01:00","QACCEN","0","0","1","0","0","0","0","0"
+"02/25/2019","01:00","QAEN","8.1","10.9","101.8","44.9","15","10.9","90","44.9"
+"02/25/2019","01:00","QAEPS3","0","0","2.5","1.1","0","0","0","0"
diff --git a/tools/inputs/history/np1-346-er-history-current.xlsx b/tools/inputs/history/np1-346-er-history-current.xlsx
new file mode 100644
index 00000000..e7ff5c3e
Binary files /dev/null and b/tools/inputs/history/np1-346-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np1-346-er-history-samples.xlsx b/tools/inputs/history/np1-346-er-history-samples.xlsx
new file mode 100644
index 00000000..fb1714c8
Binary files /dev/null and b/tools/inputs/history/np1-346-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np3-108-history-current.xlsx b/tools/inputs/history/np3-108-history-current.xlsx
new file mode 100644
index 00000000..4e0bf0eb
Binary files /dev/null and b/tools/inputs/history/np3-108-history-current.xlsx differ
diff --git a/tools/inputs/history/np3-108-history-samples.xlsx b/tools/inputs/history/np3-108-history-samples.xlsx
new file mode 100644
index 00000000..ec4c22b0
Binary files /dev/null and b/tools/inputs/history/np3-108-history-samples.xlsx differ
diff --git a/tools/inputs/history/np3-161-cd-history-current.csv b/tools/inputs/history/np3-161-cd-history-current.csv
new file mode 100644
index 00000000..14a1631b
--- /dev/null
+++ b/tools/inputs/history/np3-161-cd-history-current.csv
@@ -0,0 +1,4 @@
+OperatingDate,ResourcePOLnonIRRnonPUN,ResourcePOLESR,AggApprovedResourcePOLnonIRRnonPUN,AggReceivedResourcePOLnonIRRnonPUN,ResourcePOLIRR,AggApprovedResourcePOLIRR,AggReceivedResourcePOLIRR,AggApprovedResourcePOLESR,AggReceivedResourcePOLESR
+09/14/2026,4906,872,998,0,3519,58,0,0,0
+09/15/2026,5000,872,998,0,3519,84,0,0,0
+09/16/2026,5000,872,952,0,3519,1170,0,71,0
diff --git a/tools/inputs/history/np3-161-cd-history-samples.csv b/tools/inputs/history/np3-161-cd-history-samples.csv
new file mode 100644
index 00000000..81b1ab48
--- /dev/null
+++ b/tools/inputs/history/np3-161-cd-history-samples.csv
@@ -0,0 +1,4 @@
+OperatingDate,ResourcePOLnonIRRnonPUN,ResourcePOLESR,AggApprovedResourcePOLnonIRRnonPUN,AggReceivedResourcePOLnonIRRnonPUN,ResourcePOLIRR,AggApprovedResourcePOLIRR,AggReceivedResourcePOLIRR,AggApprovedResourcePOLESR,AggReceivedResourcePOLESR
+07/02/2026,2216,0,30,0,3519,0,0,0,0
+07/03/2026,2221,0,30,0,3519,0,0,0,0
+07/04/2026,2225,0,30,0,3519,0,0,0,0
diff --git a/tools/inputs/history/np3-162-cd-history-current.csv b/tools/inputs/history/np3-162-cd-history-current.csv
new file mode 100644
index 00000000..ddad95dd
--- /dev/null
+++ b/tools/inputs/history/np3-162-cd-history-current.csv
@@ -0,0 +1,4 @@
+OperatingDate,HourEnding,ResourcePOLnonIRRnonPUN,AggApprovedResourcePOLnonIRRnonPUN,AggReceivedResourcePOLnonIRRnonPUN,ResourcePOLIRR,AggApprovedResourcePOLIRR,AggReceivedResourcePOLIRR,ResourcePOLESR,AggApprovedResourcePOLESR,AggReceivedResourcePOLESR,RepeatedHourFlag
+09/07/2026,12,33183,192,0,3519,0,0,872,0,0,N
+09/07/2026,13,28270,192,0,3519,0,0,872,0,0,N
+09/07/2026,14,22717,192,0,3519,0,0,872,0,0,N
diff --git a/tools/inputs/history/np3-162-cd-history-samples.csv b/tools/inputs/history/np3-162-cd-history-samples.csv
new file mode 100644
index 00000000..d255eb37
--- /dev/null
+++ b/tools/inputs/history/np3-162-cd-history-samples.csv
@@ -0,0 +1,4 @@
+OperatingDate,HourEnding,ResourcePOLnonIRRnonPUN,AggApprovedResourcePOLnonIRRnonPUN,AggReceivedResourcePOLnonIRRnonPUN,ResourcePOLIRR,AggApprovedResourcePOLIRR,AggReceivedResourcePOLIRR,ResourcePOLESR,AggApprovedResourcePOLESR,AggReceivedResourcePOLESR,RepeatedHourFlag
+06/25/2026,17,41315,30,0,3519,159,0,0,100,0,N
+06/25/2026,18,37955,30,0,3519,159,0,0,100,0,N
+06/25/2026,19,33590,30,0,3519,419,0,0,100,0,N
diff --git a/tools/inputs/history/np3-233-cd-history-current.csv b/tools/inputs/history/np3-233-cd-history-current.csv
new file mode 100644
index 00000000..c432d968
--- /dev/null
+++ b/tools/inputs/history/np3-233-cd-history-current.csv
@@ -0,0 +1,4 @@
+Date,HourEnding,TotalResourceMWZoneSouth,TotalResourceMWZoneNorth,TotalResourceMWZoneWest,TotalResourceMWZoneHouston,TotalIRRMWZoneSouth,TotalIRRMWZoneNorth,TotalIRRMWZoneWest,TotalIRRMWZoneHouston,TotalNewEquipResourceMWZoneSouth,TotalNewEquipResourceMWZoneNorth,TotalNewEquipResourceMWZoneWest,TotalNewEquipResourceMWZoneHouston
+09/06/2026,24,2077,2476,143,4559,1546,1368,2608,61,810,2079,288,611
+09/07/2026,01,2077,2476,283,4559,1546,1382,2608,61,810,2079,288,611
+09/07/2026,02,2077,2476,283,4559,1546,1382,2608,61,810,2079,288,611
diff --git a/tools/inputs/history/np3-233-cd-history-samples.csv b/tools/inputs/history/np3-233-cd-history-samples.csv
new file mode 100644
index 00000000..948854df
--- /dev/null
+++ b/tools/inputs/history/np3-233-cd-history-samples.csv
@@ -0,0 +1,4 @@
+Date,HourEnding,TotalResourceMW,TotalIRRMW
+05/01/2014,01,18542,685
+05/01/2014,02,18542,685
+05/01/2014,03,18542,685
diff --git a/tools/inputs/history/np3-257-ex-history-current.csv b/tools/inputs/history/np3-257-ex-history-current.csv
new file mode 100644
index 00000000..8f42f01c
--- /dev/null
+++ b/tools/inputs/history/np3-257-ex-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,DME,Load Resource,Highest Price Dispatched by SCED,Proxy Extension
+09/04/2026 00:00:19,N,QBASTX,YBASTX,MIDNT_ALD1,23.75,No
+09/04/2026 00:05:19,N,QBASTX,YBASTX,MIDNT_ALD1,24.15,No
+09/04/2026 00:10:17,N,QBASTX,YBASTX,MIDNT_ALD1,24.87,No
diff --git a/tools/inputs/history/np3-257-ex-history-samples.csv b/tools/inputs/history/np3-257-ex-history-samples.csv
new file mode 100644
index 00000000..cca80877
--- /dev/null
+++ b/tools/inputs/history/np3-257-ex-history-samples.csv
@@ -0,0 +1 @@
+"SCED Time Stamp","Batch ID","Repeated Hour Flag","QSE","Load Resource","Highest Price Dispatched by SCED","Proxy Extension"
diff --git a/tools/inputs/history/np3-560-cd-history-current.csv b/tools/inputs/history/np3-560-cd-history-current.csv
new file mode 100644
index 00000000..83f11713
--- /dev/null
+++ b/tools/inputs/history/np3-560-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,North,South,West,Houston,SystemTotal,DSTFlag
+09/07/2026,1:00,22122.619443518067837,17020.729026806640625,10014.988855944825288,14624.82368447265625,63783.16101074219,N
+09/07/2026,2:00,20896.932544433590661,16315.417444165037327,10089.482447143549512,14240.1626814453125,61541.99511718749,N
+09/07/2026,3:00,19834.340149853514442,15927.956511560057726,10034.156493273925332,13884.5640572265625,59681.01721191406,N
diff --git a/tools/inputs/history/np3-560-cd-history-samples.csv b/tools/inputs/history/np3-560-cd-history-samples.csv
new file mode 100644
index 00000000..93b01b8a
--- /dev/null
+++ b/tools/inputs/history/np3-560-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,North,South,West,Houston,SystemTotal,DSTFlag
+01/01/2019,1:00,13164.23181750488554,10072.271223266608298,4484.003995947268662,9231.9860052734375,36952.4930419922,N
+01/01/2019,2:00,13555.5923836547798701,10058.366638818359375,4442.3579507690377549,9212.98856875,37269.305541992177,N
+01/01/2019,3:00,13941.8456715820339224,10013.956187878412101,4496.9685236450182266,9071.10229755859375,37523.872680664058,N
diff --git a/tools/inputs/history/np3-561-cd-history-current.csv b/tools/inputs/history/np3-561-cd-history-current.csv
new file mode 100644
index 00000000..52df9e04
--- /dev/null
+++ b/tools/inputs/history/np3-561-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,SystemTotal,DSTFlag
+09/07/2026,1:00,15153.1943,2058.1025,7683.0674,1892.4691,19082.3848,10498.6553,5282.5381,2132.7495,63783.161,N
+09/07/2026,2:00,14754.9746,1965.3281,7875.3892,1860.3538,17962.7988,9950.5547,5189.2856,1983.3103,61541.9951,N
+09/07/2026,3:00,14386.5215,1812.9615,7840.1382,1762.7611,17096.2441,9701.1582,5045.2759,2035.9567,59681.0172,N
diff --git a/tools/inputs/history/np3-561-cd-history-samples.csv b/tools/inputs/history/np3-561-cd-history-samples.csv
new file mode 100644
index 00000000..6cf3f8c8
--- /dev/null
+++ b/tools/inputs/history/np3-561-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,SystemTotal,DSTFlag
+01/01/2019,1:00,9566.0996,1414.37,2954.29,942.583,11252.9004,6163.46,3024.51,1634.28,36952.493,N
+01/01/2019,2:00,9546.4902,1410.49,2918.47,951.766,11649.0996,6090.0298,3092.5,1610.46,37269.3056,N
+01/01/2019,3:00,9399.4697,1401.58,2913.1899,983.433,12028,5994.7002,3124.1599,1679.34,37523.8727,N
diff --git a/tools/inputs/history/np3-562-cd-history-current.csv b/tools/inputs/history/np3-562-cd-history-current.csv
new file mode 100644
index 00000000..3c9f448f
--- /dev/null
+++ b/tools/inputs/history/np3-562-cd-history-current.csv
@@ -0,0 +1,4 @@
+IntervalEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,SystemTotal,Model,InUseFlag,DSTFlag
+09/07/2026 12:30,19700.279296875,2558.06982421875,8089.20166015625,2374.83154296875,24508.83984375,13110.443359375,6365.06103515625,2520.98071289062,79227.7109375,A6,N,N
+09/07/2026 12:30,19789.900390625,2551.86010742188,8094.52001953125,2379.60009765625,24406,13081.2001953125,6372.97021484375,2519.8798828125,79195.9296875,E,Y,N
+09/07/2026 12:35,19882.30078125,2574.60009765625,8088.1201171875,2390.11010742188,24537.5,13123.7998046875,6403.81982421875,2538.73999023438,79538.9921875,E,Y,N
diff --git a/tools/inputs/history/np3-562-cd-history-samples.csv b/tools/inputs/history/np3-562-cd-history-samples.csv
new file mode 100644
index 00000000..b62b48c1
--- /dev/null
+++ b/tools/inputs/history/np3-562-cd-history-samples.csv
@@ -0,0 +1,4 @@
+IntervalEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,SystemTotal,Model,InUseFlag,DSTFlag
+03/26/2026 11:45,14440.2001953125,1592.41003417969,7492.72021484375,2101.72998046875,14991.2998046875,8430.83984375,4567.33984375,1421.42004394531,55037.9609375,E,Y,N
+03/26/2026 11:45,14441.4873046875,1577.59375,7507.29638671875,2099.830078125,15036.79296875,8450.06640625,4568.90771484375,1416.93640136719,55098.91015625,A6,N,N
+03/26/2026 11:50,14482.7001953125,1594.67004394531,7486.39990234375,2108.40991210938,15019.599609375,8441.9697265625,4596.1201171875,1422.77001953125,55152.640625,E,Y,N
diff --git a/tools/inputs/history/np3-565-cd-history-current.csv b/tools/inputs/history/np3-565-cd-history-current.csv
new file mode 100644
index 00000000..09e662fe
--- /dev/null
+++ b/tools/inputs/history/np3-565-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,SystemTotal,Model,InUseFlag,DSTFlag
+09/07/2026,1:00,15084.543,2044.0164,7845.854,1883.9669,18833.4199,10348.3779,5255.5454,2072.2061,63367.9296,A3,N,N
+09/07/2026,1:00,15187.0684,1971.7526,7764.9624,1929.8362,19065.998,10261.0605,5154.0083,2089.7778,63424.4642,A6,N,N
+09/07/2026,1:00,15169.5,2081.6699,7684.4302,1885.66,19085,10528.2998,5311.9199,2150.1699,63896.6497,E,N,N
diff --git a/tools/inputs/history/np3-565-cd-history-samples.csv b/tools/inputs/history/np3-565-cd-history-samples.csv
new file mode 100644
index 00000000..0d458606
--- /dev/null
+++ b/tools/inputs/history/np3-565-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,SystemTotal,Model,InUseFlag,DSTFlag
+06/29/2017,1:00,12042.5664,1585.0483,2329.0618,996.0685,13191.9385,7140.873,3232.8601,1461.603,41980.0196,A3,N,N
+06/29/2017,1:00,11706.6953,1567.9846,2374.1614,1046.4407,13298.3301,7288.8477,3402.3481,1506.1333,42190.9412,A6,N,N
+06/29/2017,1:00,11950,1497.39,2315.03,1053.25,13130.7002,7050.0298,3518.1001,1466.4399,41980.94,E,N,N
diff --git a/tools/inputs/history/np3-566-cd-history-current.csv b/tools/inputs/history/np3-566-cd-history-current.csv
new file mode 100644
index 00000000..b25beaa3
--- /dev/null
+++ b/tools/inputs/history/np3-566-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Valley,Model,DSTFlag
+09/07/2026,1:00,1781.154,E,N
+09/07/2026,1:00,1786.423,E1,N
+09/07/2026,1:00,1768.736,E2,N
diff --git a/tools/inputs/history/np3-566-cd-history-samples.csv b/tools/inputs/history/np3-566-cd-history-samples.csv
new file mode 100644
index 00000000..4b6e15e0
--- /dev/null
+++ b/tools/inputs/history/np3-566-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Valley,Model,DSTFlag
+02/07/2019,1:00,962.75,E,N
+02/07/2019,1:00,964.3582,E1,N
+02/07/2019,1:00,963.0673,E2,N
diff --git a/tools/inputs/history/np3-763-cd-history-current.csv b/tools/inputs/history/np3-763-cd-history-current.csv
new file mode 100644
index 00000000..c21e2585
--- /dev/null
+++ b/tools/inputs/history/np3-763-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,CapGenResSouth,CapGenResNorth,CapGenResWest,CapGenResHouston,CapLoadResSouth,CapLoadResNorth,CapLoadResWest,CapLoadResHouston,OfflineAvailableMWSouth,OfflineAvailableMWNorth,OfflineAvailableMWWest,OfflineAvailableMWHouston,AvailCapGen,AvailCapReserve,CapGenResTotal,CapLoadResTotal,OfflineAvailableMWTotal,CapREGUPTotal,CapREGDNTotal,CapRRSTotal,CapECRSTotal,CapNSPINTotal,CapREGUP_RRSTotal,CapREGUP_RRS_ECRSTotal,CapREGUP_RRS_ECRS_NSPINTotal,RepeatedHourFlag
+09/07/2026,01:00,24732.7,31008,17437,12967.1,1439.7,571.5,1141.6,1352.9,0,0,0,0,86144.8,22361.639,86144.8,4505.7,0,31738.4,31572.3,15810.04,36845.1,24841.4,39441.96,47365.28,55626,N
+09/07/2026,02:00,24390.5,31009.7,17064.4,12862.8,1439.7,574.6,1141.6,1352.2,0,0,0,0,85327.4,23785.4049,85327.4,4508.1,0,31779.2,31613,15863.66,36915.2,24942.2,39533.06,47471.4,55702.9,N
+09/07/2026,03:00,24227,31020.6,16387.2,12850.4,1439.7,574.3,1141.6,1352.1,0,0,0,0,84485.2,24804.1828,84485.2,4507.7,0,31788.8,31622.4,15861.94,36928.3,24946.2,39530.94,47468.5,55703.6,N
diff --git a/tools/inputs/history/np3-763-cd-history-samples.csv b/tools/inputs/history/np3-763-cd-history-samples.csv
new file mode 100644
index 00000000..adb1a12a
--- /dev/null
+++ b/tools/inputs/history/np3-763-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,TotalCapGenRes,TotalCapLoadRes,DSTFlag
+03/12/2014,01:00,37749.5,1997.6,N
+03/12/2014,02:00,36967.3,1997.1,N
+03/12/2014,03:00,37020.2,1996.1,N
diff --git a/tools/inputs/history/np3-764-cd-history-current.csv b/tools/inputs/history/np3-764-cd-history-current.csv
new file mode 100644
index 00000000..6e24c121
--- /dev/null
+++ b/tools/inputs/history/np3-764-cd-history-current.csv
@@ -0,0 +1,2 @@
+DeliveryDate,HourEnding,RUCTimestamp,SCEDTimestamp,SumSCEDHSLsOnlineSCEDOfflineCOPSouth,SumSCEDHSLsOnlineSCEDOfflineCOPNorth,SumSCEDHSLsOnlineSCEDOfflineCOPWest,SumSCEDHSLsOnlineSCEDOfflineCOPHouston,DSTFlag
+09/07/2026,13:00,09/07/2026 12:03:03,09/07/2026 12:05:19,0,0,0,256.2,N
diff --git a/tools/inputs/history/np3-764-cd-history-samples.csv b/tools/inputs/history/np3-764-cd-history-samples.csv
new file mode 100644
index 00000000..24d68ce7
--- /dev/null
+++ b/tools/inputs/history/np3-764-cd-history-samples.csv
@@ -0,0 +1,3 @@
+DeliveryDate,HourEnding,RUCTimestamp,SCEDTimestamp,SumSCEDHSLsOnlineSCEDOfflineCOP,DSTFlag
+10/25/2018,18:00,10/25/2018 17:03:01,10/25/2018 17:05:09,0,N
+
diff --git a/tools/inputs/history/np3-765-cd-history-current.csv b/tools/inputs/history/np3-765-cd-history-current.csv
new file mode 100644
index 00000000..b38313b2
--- /dev/null
+++ b/tools/inputs/history/np3-765-cd-history-current.csv
@@ -0,0 +1,4 @@
+DC_Tie,GMT_Interval_Ending,Interval_Ending,Repeated_Hour,MW,Import_Export
+DC_E,09/07/2026 05:15,09/07/2026 00:15,N,325,IMPORT
+DC_E,09/07/2026 05:30,09/07/2026 00:30,N,325,IMPORT
+DC_E,09/07/2026 05:45,09/07/2026 00:45,N,325,IMPORT
diff --git a/tools/inputs/history/np3-765-cd-history-samples.csv b/tools/inputs/history/np3-765-cd-history-samples.csv
new file mode 100644
index 00000000..0ed158a2
--- /dev/null
+++ b/tools/inputs/history/np3-765-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DC_Tie,GMT_Interval_Ending,Interval_Ending,Repeated_Hour,MW,Import_Export
+DC_E,06/27/2024 05:15,06/27/2024 00:15,N,100,IMPORT
+DC_E,06/27/2024 05:30,06/27/2024 00:30,N,100,IMPORT
+DC_E,06/27/2024 05:45,06/27/2024 00:45,N,100,IMPORT
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-current.csv
new file mode 100644
index 00000000..5be31043
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,ECRSM Offer Price
+09/05/2026 00:00:20,N,155.6,0
+09/05/2026 00:00:20,N,207.6,.01
+09/05/2026 00:00:20,N,342.6,1.5
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-samples.csv
new file mode 100644
index 00000000..7d69317e
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrsm-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,ECRSM Offer Price
+12/05/2025 00:00:19,N,74,0
+12/05/2025 00:00:19,N,102,.01
+12/05/2025 00:00:19,N,6348.2,1204.9
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrss-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrss-history-current.csv
new file mode 100644
index 00000000..6617cd60
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrss-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,ECRSS Offer Price
+09/05/2026 00:00:20,N,6880,0
+09/05/2026 00:00:20,N,10286.3,.01
+09/05/2026 00:00:20,N,11216.8,.02
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrss-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrss-history-samples.csv
new file mode 100644
index 00000000..85bafced
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_ecrss-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,ECRSS Offer Price
+12/05/2025 00:00:19,N,1303,0
+12/05/2025 00:00:19,N,9685.8,.01
+12/05/2025 00:00:19,N,9998.1,.1
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspin-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspin-history-current.csv
new file mode 100644
index 00000000..0f757990
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspin-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,NSPIN Offer Price
+09/05/2026 00:00:20,N,7285.6,0
+09/05/2026 00:00:20,N,11567.5,.01
+09/05/2026 00:00:20,N,11773.6,.02
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspin-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspin-history-samples.csv
new file mode 100644
index 00000000..474f2d62
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspin-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,NSPIN Offer Price
+12/05/2025 00:00:19,N,1579.8,0
+12/05/2025 00:00:19,N,9978.6,.01
+12/05/2025 00:00:19,N,10805.3,.1
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspnm-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspnm-history-current.csv
new file mode 100644
index 00000000..a3f5fde5
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspnm-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,NSPNM Offer Price
+09/05/2026 00:00:20,N,28,.01
+09/05/2026 00:00:20,N,540.9,510.42
+09/05/2026 00:05:18,N,28,.01
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspnm-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspnm-history-samples.csv
new file mode 100644
index 00000000..9ca2e667
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_nspnm-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,NSPNM Offer Price
+12/05/2025 00:00:19,N,6873.3,203.1
+12/05/2025 00:05:17,N,5970.8,203.1
+12/05/2025 00:10:17,N,5979.9,203.1
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regdn-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regdn-history-current.csv
new file mode 100644
index 00000000..9b54f144
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regdn-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,REGDN Offer Price
+09/05/2026 00:00:20,N,1.2,0
+09/05/2026 00:00:20,N,1.4,.46
+09/05/2026 00:00:20,N,6.5,1
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regdn-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regdn-history-samples.csv
new file mode 100644
index 00000000..895e2ebe
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regdn-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,REGDN Offer Price
+12/05/2025 00:00:19,N,318.1,0
+12/05/2025 00:00:19,N,368.1,.2
+12/05/2025 00:00:19,N,393.1,.4
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regup-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regup-history-current.csv
new file mode 100644
index 00000000..9537c075
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regup-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,REGUP Offer Price
+09/05/2026 00:00:20,N,14.1,0
+09/05/2026 00:00:20,N,254.1,.05
+09/05/2026 00:00:20,N,454.1,.25
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regup-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regup-history-samples.csv
new file mode 100644
index 00000000..52b5cc05
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_regup-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,REGUP Offer Price
+12/05/2025 00:00:19,N,771.1,0
+12/05/2025 00:00:19,N,1171.1,.01
+12/05/2025 00:00:19,N,1296.1,1.1
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-current.csv
new file mode 100644
index 00000000..6f53642d
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,RRSFFR Offer Price
+09/05/2026 00:00:20,N,1372.6,0
+09/05/2026 00:00:20,N,1402.6,.01
+09/05/2026 00:00:20,N,1427.6,.02
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-samples.csv
new file mode 100644
index 00000000..6083f7f2
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsffr-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,RRSFFR Offer Price
+12/05/2025 00:00:19,N,397.6,0
+12/05/2025 00:00:19,N,597.6,.01
+12/05/2025 00:00:19,N,641.6,.5
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-current.csv
new file mode 100644
index 00000000..081007b5
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,RRSPFR Offer Price
+09/05/2026 00:00:20,N,6268.3,0
+09/05/2026 00:00:20,N,9861.9,.01
+09/05/2026 00:00:20,N,10061.9,.02
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-samples.csv
new file mode 100644
index 00000000..1457a78a
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrspfr-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,RRSPFR Offer Price
+12/05/2025 00:00:19,N,2046.1,0
+12/05/2025 00:00:19,N,7737.4,.01
+12/05/2025 00:00:19,N,7767.4,.1
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-current.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-current.csv
new file mode 100644
index 00000000..1c78efc5
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,RRSUFR Offer Price
+09/05/2026 00:00:20,N,1611.3,0
+09/05/2026 00:00:20,N,2889.3,.01
+09/05/2026 00:00:20,N,3019.3,25
diff --git a/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-samples.csv b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-samples.csv
new file mode 100644
index 00000000..1d6b8482
--- /dev/null
+++ b/tools/inputs/history/np3-906-ex--2day_agg_sced_as_offers_rrsufr-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,MW Offered,RRSUFR Offer Price
+12/05/2025 00:00:19,N,1011.2,0
+12/05/2025 00:00:19,N,2526.8,.01
+12/05/2025 00:00:19,N,2540.8,100
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc-history-current.csv
new file mode 100644
index 00000000..4581f079
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,213645.8
+09/05/2026,1,-249,204244.95192997
+09/05/2026,1,-248,204212.4002577
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc-history-samples.csv
new file mode 100644
index 00000000..15b58dbe
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,51260.7
+12/06/2025,1,-249,47922.79882
+12/06/2025,1,-248,47868.43414871
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_houston-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_houston-history-current.csv
new file mode 100644
index 00000000..b993a3b8
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_houston-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,31046.1
+09/05/2026,1,-249,29431.3
+09/05/2026,1,-248,29430.3
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_houston-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_houston-history-samples.csv
new file mode 100644
index 00000000..1222f965
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_houston-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,7835.9
+12/06/2025,1,-249,7050.79915613
+12/06/2025,1,-248,7048.1959183
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_north-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_north-history-current.csv
new file mode 100644
index 00000000..2d36f34e
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_north-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,66301.2
+09/05/2026,1,-249,62725.6
+09/05/2026,1,-248,62724.6
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_north-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_north-history-samples.csv
new file mode 100644
index 00000000..b07a988a
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_north-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,19048
+12/06/2025,1,-249,18034.3
+12/06/2025,1,-248,18030.83989799
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_south-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_south-history-current.csv
new file mode 100644
index 00000000..84771411
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_south-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,59571.5
+09/05/2026,1,-249,58183.83232599
+09/05/2026,1,-248,58174.26105373
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_south-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_south-history-samples.csv
new file mode 100644
index 00000000..c660a31d
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_south-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,13904.2
+12/06/2025,1,-249,13594.49966387
+12/06/2025,1,-248,13584.0094645
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_west-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_west-history-current.csv
new file mode 100644
index 00000000..f7eb6922
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_west-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,54870.1
+09/05/2026,1,-249,52047.31960398
+09/05/2026,1,-248,52026.33920396
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_edc_west-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_edc_west-history-samples.csv
new file mode 100644
index 00000000..692f5040
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_edc_west-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,8749.8
+12/06/2025,1,-249,7520.4
+12/06/2025,1,-248,7482.58886791
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc-history-current.csv
new file mode 100644
index 00000000..89d89cbd
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,0
+09/05/2026,1,-249,0
+09/05/2026,1,-248,0
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc-history-samples.csv
new file mode 100644
index 00000000..1eefdb57
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,1
+12/06/2025,1,-249,140.500448
+12/06/2025,1,-248,140.50090514
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_houston-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_houston-history-current.csv
new file mode 100644
index 00000000..89d89cbd
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_houston-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,0
+09/05/2026,1,-249,0
+09/05/2026,1,-248,0
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_houston-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_houston-history-samples.csv
new file mode 100644
index 00000000..88a22ebf
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_houston-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,0
+12/06/2025,1,-249,19.800112
+12/06/2025,1,-248,19.80022628
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_north-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_north-history-current.csv
new file mode 100644
index 00000000..89d89cbd
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_north-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,0
+09/05/2026,1,-249,0
+09/05/2026,1,-248,0
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_north-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_north-history-samples.csv
new file mode 100644
index 00000000..336ad759
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_north-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,0
+12/06/2025,1,-249,.00018666
+12/06/2025,1,-248,.00037714
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_south-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_south-history-current.csv
new file mode 100644
index 00000000..89d89cbd
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_south-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,0
+09/05/2026,1,-249,0
+09/05/2026,1,-248,0
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_south-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_south-history-samples.csv
new file mode 100644
index 00000000..aec32a63
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_south-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,0
+12/06/2025,1,-249,119.700112
+12/06/2025,1,-248,119.70022628
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_west-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_west-history-current.csv
new file mode 100644
index 00000000..89d89cbd
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_west-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,-250,0
+09/05/2026,1,-249,0
+09/05/2026,1,-248,0
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_esc_west-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_esc_west-history-samples.csv
new file mode 100644
index 00000000..255204e9
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_esc_west-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,-250,1
+12/06/2025,1,-249,1.00003733
+12/06/2025,1,-248,1.00007542
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc-history-current.csv
new file mode 100644
index 00000000..93c15364
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,.01,167
+09/05/2026,1,1,1759
+09/05/2026,1,3,1852
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc-history-samples.csv
new file mode 100644
index 00000000..acc0df81
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,0,873
+12/06/2025,1,.01,2047
+12/06/2025,1,1.83,2566
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_houston-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_houston-history-current.csv
new file mode 100644
index 00000000..d5d779e1
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_houston-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,.01,92
+09/05/2026,1,1,623
+09/05/2026,1,3,716
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_houston-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_houston-history-samples.csv
new file mode 100644
index 00000000..11efe115
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_houston-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,.01,423
+12/06/2025,1,1.83,942
+12/06/2025,1,2,1127
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_north-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_north-history-current.csv
new file mode 100644
index 00000000..cfc436bc
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_north-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,.01,75
+09/05/2026,1,1,789
+09/05/2026,1,7,1089
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_north-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_north-history-samples.csv
new file mode 100644
index 00000000..9fe50797
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_north-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,0,873
+12/06/2025,1,3,973
+12/06/2025,1,5,1467
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_south-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_south-history-current.csv
new file mode 100644
index 00000000..50f19836
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_south-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,1,180
+09/05/2026,1,5,287
+09/05/2026,1,10,644
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_south-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_south-history-samples.csv
new file mode 100644
index 00000000..73501874
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_south-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,0,0
+12/06/2025,1,.01,268
+12/06/2025,1,10,280
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_west-history-current.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_west-history-current.csv
new file mode 100644
index 00000000..0325d006
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_west-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+09/05/2026,1,1,167
+09/05/2026,1,11.59,338
+09/05/2026,1,11.76,507
diff --git a/tools/inputs/history/np3-907-ex--2d_agg_min_esc_west-history-samples.csv b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_west-history-samples.csv
new file mode 100644
index 00000000..aea1836a
--- /dev/null
+++ b/tools/inputs/history/np3-907-ex--2d_agg_min_esc_west-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Price,MW
+12/06/2025,1,0,0
+12/06/2025,1,.01,483
+12/06/2025,1,3,566
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_edc-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_edc-history-samples.csv
new file mode 100644
index 00000000..708aa884
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_edc-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-2001","15532.8"
+"03/10/2014","1","-2000","15377.8"
+"03/10/2014","1","-1999","15377.8"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_edc_houston-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_houston-history-samples.csv
new file mode 100644
index 00000000..8b5fb311
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-2001","1257.6"
+"03/10/2014","1","-2000","1237.6"
+"03/10/2014","1","-1999","1237.6"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_edc_north-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_north-history-samples.csv
new file mode 100644
index 00000000..b0a976df
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_north-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-2001","6767.4"
+"03/10/2014","1","-2000","6732.4"
+"03/10/2014","1","-1999","6732.4"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_edc_south-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_south-history-samples.csv
new file mode 100644
index 00000000..e094a8f0
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_south-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-2001","5661.4"
+"03/10/2014","1","-2000","5601.4"
+"03/10/2014","1","-1999","5601.4"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_edc_west-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_west-history-samples.csv
new file mode 100644
index 00000000..9ac3f4ce
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_edc_west-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-2001","1836.4"
+"03/10/2014","1","-2000","1806.4"
+"03/10/2014","1","-1999","1806.4"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_esc-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_esc-history-samples.csv
new file mode 100644
index 00000000..3d5f39a6
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_esc-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-250","143"
+"03/10/2014","1","-249","143"
+"03/10/2014","1","-248","143"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_esc_houston-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_houston-history-samples.csv
new file mode 100644
index 00000000..70f82b9c
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-250","40"
+"03/10/2014","1","-249","40"
+"03/10/2014","1","-248","40"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_esc_north-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_north-history-samples.csv
new file mode 100644
index 00000000..ee50569a
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_north-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-250","78"
+"03/10/2014","1","-249","78"
+"03/10/2014","1","-248","78"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_esc_south-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_south-history-samples.csv
new file mode 100644
index 00000000..142e0dc2
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_south-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-250","15"
+"03/10/2014","1","-249","15"
+"03/10/2014","1","-248","15"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_esc_west-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_west-history-samples.csv
new file mode 100644
index 00000000..3ae7f668
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_esc_west-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW"
+"03/10/2014","1","-250","10"
+"03/10/2014","1","-249","10"
+"03/10/2014","1","-248","10"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc-history-samples.csv
new file mode 100644
index 00000000..1cd4fe6d
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW Offered"
+"03/10/2014","1","0","609"
+"03/10/2014","1","1","699"
+"03/10/2014","1","5","1265"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_houston-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_houston-history-samples.csv
new file mode 100644
index 00000000..17ac0dce
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW Offered"
+"03/10/2014","1","1","90"
+"03/10/2014","1","5","626"
+"03/10/2014","1","28.97","765"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_north-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_north-history-samples.csv
new file mode 100644
index 00000000..9b118b8e
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_north-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW Offered"
+"03/10/2014","1","0","609"
+"03/10/2014","1","33.76","783"
+"03/10/2014","1","39.31","1111"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_south-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_south-history-samples.csv
new file mode 100644
index 00000000..d71d65e8
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_south-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW Offered"
+"03/10/2014","1","5","30"
+"03/10/2014","1","10","41"
+"03/10/2014","1","20","46"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_west-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_west-history-samples.csv
new file mode 100644
index 00000000..16a5aeab
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_dam_min_esc_west-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Price","MW Offered"
+"03/10/2014","1","41.15","161"
+"03/10/2014","1","46.7","331"
+"03/10/2014","1","47.7","501"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_edc_clr-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_edc_clr-history-current.csv
new file mode 100644
index 00000000..3b21bf8b
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_edc_clr-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,PRICE,MW
+08/26/2026 00:00:29,N,-250,272.3
+08/26/2026 00:00:29,N,-249,271.89998708
+08/26/2026 00:00:29,N,-248,271.89998708
diff --git a/tools/inputs/history/np3-908-er--2d_agg_edc_clr_houston-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_houston-history-current.csv
new file mode 100644
index 00000000..7df673bd
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,PRICE,MW
+08/26/2026 00:00:29,N,-250,76
+08/26/2026 00:00:29,N,-249,75.79998733
+08/26/2026 00:00:29,N,-248,75.79998733
diff --git a/tools/inputs/history/np3-908-er--2d_agg_edc_clr_north-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_north-history-current.csv
new file mode 100644
index 00000000..cd9b8317
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,PRICE,MW
+08/26/2026 00:00:29,N,-250,45.1
+08/26/2026 00:00:29,N,-249,44.99999907
+08/26/2026 00:00:29,N,-248,44.99999907
diff --git a/tools/inputs/history/np3-908-er--2d_agg_edc_clr_south-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_south-history-current.csv
new file mode 100644
index 00000000..00d20751
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,PRICE,MW
+08/26/2026 00:00:29,N,-250,151.2
+08/26/2026 00:00:29,N,-249,151.10000067
+08/26/2026 00:00:29,N,-248,151.10000067
diff --git a/tools/inputs/history/np3-908-er--2d_agg_edc_clr_west-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_west-history-current.csv
new file mode 100644
index 00000000..871069f6
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_edc_clr_west-history-current.csv
@@ -0,0 +1 @@
+SCED Time Stamp,Repeated Hour Flag,PRICE,MW
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_esr-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_esr-history-current.csv
new file mode 100644
index 00000000..92576f29
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_esr-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,-17277.7348487
+08/26/2026 00:00:29,N,-249,-11685.23178065
+08/26/2026 00:00:29,N,-248,-11666.839284
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_esr_houston-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_houston-history-current.csv
new file mode 100644
index 00000000..844af2ef
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,-4089.48405957
+08/26/2026 00:00:29,N,-249,-2005.30792683
+08/26/2026 00:00:29,N,-248,-2004.50340668
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_esr_north-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_north-history-current.csv
new file mode 100644
index 00000000..10e49bf8
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,-5202.74882505
+08/26/2026 00:00:29,N,-249,-3298.11816542
+08/26/2026 00:00:29,N,-248,-3297.23117729
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_esr_south-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_south-history-current.csv
new file mode 100644
index 00000000..3e48950b
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,-3852.20493744
+08/26/2026 00:00:29,N,-249,-2894.02153285
+08/26/2026 00:00:29,N,-248,-2885.5693875
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_esr_west-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_west-history-current.csv
new file mode 100644
index 00000000..3e358fbe
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_esr_west-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,-4133.29702663
+08/26/2026 00:00:29,N,-249,-3487.78415554
+08/26/2026 00:00:29,N,-248,-3479.53531252
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind-history-samples.csv
new file mode 100644
index 00000000..674c518c
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","655.49999845"
+"03/10/2014 00:00:13","N","-249","2128.10030886"
+"03/10/2014 00:00:13","N","-248","2128.10031076"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_houston-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_houston-history-samples.csv
new file mode 100644
index 00000000..e0dd55c7
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","0"
+"03/10/2014 00:00:13","N","-249","0"
+"03/10/2014 00:00:13","N","-248","0"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_north-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_north-history-samples.csv
new file mode 100644
index 00000000..56d2df0e
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_north-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","400.89999997"
+"03/10/2014 00:00:13","N","-249","400.89999997"
+"03/10/2014 00:00:13","N","-248","400.89999997"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_south-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_south-history-samples.csv
new file mode 100644
index 00000000..fc1f9264
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_south-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","254.59999847"
+"03/10/2014 00:00:13","N","-249","1727.20030888"
+"03/10/2014 00:00:13","N","-248","1727.20031079"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_west-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_west-history-samples.csv
new file mode 100644
index 00000000..e0dd55c7
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_non_wind_west-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","0"
+"03/10/2014 00:00:13","N","-249","0"
+"03/10/2014 00:00:13","N","-248","0"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr-history-current.csv
new file mode 100644
index 00000000..cd8552d6
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,1451.40000152
+08/26/2026 00:00:29,N,-249,4949.72859652
+08/26/2026 00:00:29,N,-248,4949.73149673
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_houston-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_houston-history-current.csv
new file mode 100644
index 00000000..7f95baf0
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-50,2033.07033121
+08/26/2026 00:00:29,N,-49,2033.08234704
+08/26/2026 00:00:29,N,-48,2033.09436288
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_north-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_north-history-current.csv
new file mode 100644
index 00000000..f05b5139
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,466
+08/26/2026 00:00:29,N,-249,2373.00148371
+08/26/2026 00:00:29,N,-248,2373.00237261
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_south-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_south-history-current.csv
new file mode 100644
index 00000000..c1c6cf38
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-250,985.40000152
+08/26/2026 00:00:29,N,-249,2576.7271128
+08/26/2026 00:00:29,N,-248,2576.72912412
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_west-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_west-history-current.csv
new file mode 100644
index 00000000..6e7e3296
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_nonirr_west-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-50,.44039061
+08/26/2026 00:00:29,N,-49,.44039061
+08/26/2026 00:00:29,N,-48,.44039061
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr-history-current.csv
new file mode 100644
index 00000000..2f1d1bae
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-50,.03189789
+08/26/2026 00:00:29,N,-49,.0319967
+08/26/2026 00:00:29,N,-48,.0320955
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_houston-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_houston-history-current.csv
new file mode 100644
index 00000000..e469d5b2
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-50,0
+08/26/2026 00:00:29,N,-49,0
+08/26/2026 00:00:29,N,-48,0
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_north-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_north-history-current.csv
new file mode 100644
index 00000000..a7d54662
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-50,.01213621
+08/26/2026 00:00:29,N,-49,.01213621
+08/26/2026 00:00:29,N,-48,.01213621
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_south-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_south-history-current.csv
new file mode 100644
index 00000000..e469d5b2
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-50,0
+08/26/2026 00:00:29,N,-49,0
+08/26/2026 00:00:29,N,-48,0
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_west-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_west-history-current.csv
new file mode 100644
index 00000000..dc160df4
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_pvgr_west-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-50,.01976167
+08/26/2026 00:00:29,N,-49,.01986048
+08/26/2026 00:00:29,N,-48,.01995929
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind-history-current.csv
new file mode 100644
index 00000000..64225dc6
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-100,598.91592979
+08/26/2026 00:00:29,N,-99,598.92164411
+08/26/2026 00:00:29,N,-98,598.92735843
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind-history-samples.csv
new file mode 100644
index 00000000..e0dd55c7
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","0"
+"03/10/2014 00:00:13","N","-249","0"
+"03/10/2014 00:00:13","N","-248","0"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_houston-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_houston-history-current.csv
new file mode 100644
index 00000000..20c93d78
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-100,0
+08/26/2026 00:00:29,N,-99,0
+08/26/2026 00:00:29,N,-98,0
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_houston-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_houston-history-samples.csv
new file mode 100644
index 00000000..5fd7c59b
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_houston-history-samples.csv
@@ -0,0 +1 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_north-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_north-history-current.csv
new file mode 100644
index 00000000..281f7d8b
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-100,48.5
+08/26/2026 00:00:29,N,-99,48.5
+08/26/2026 00:00:29,N,-98,48.5
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_north-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_north-history-samples.csv
new file mode 100644
index 00000000..e0dd55c7
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_north-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","0"
+"03/10/2014 00:00:13","N","-249","0"
+"03/10/2014 00:00:13","N","-248","0"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_south-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_south-history-current.csv
new file mode 100644
index 00000000..ca639f5c
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-100,256.24688529
+08/26/2026 00:00:29,N,-99,256.25031389
+08/26/2026 00:00:29,N,-98,256.25374248
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_south-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_south-history-samples.csv
new file mode 100644
index 00000000..e0dd55c7
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_south-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","0"
+"03/10/2014 00:00:13","N","-249","0"
+"03/10/2014 00:00:13","N","-248","0"
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_west-history-current.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_west-history-current.csv
new file mode 100644
index 00000000..3ed3ed85
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_west-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Price,MW
+08/26/2026 00:00:29,N,-100,294.16904449
+08/26/2026 00:00:29,N,-99,294.17133022
+08/26/2026 00:00:29,N,-98,294.17361595
diff --git a/tools/inputs/history/np3-908-er--2d_agg_esc_wind_west-history-samples.csv b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_west-history-samples.csv
new file mode 100644
index 00000000..e0dd55c7
--- /dev/null
+++ b/tools/inputs/history/np3-908-er--2d_agg_esc_wind_west-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Price","MW"
+"03/10/2014 00:00:13","N","-250","0"
+"03/10/2014 00:00:13","N","-249","0"
+"03/10/2014 00:00:13","N","-248","0"
diff --git a/tools/inputs/history/np3-908-er-clr-history-2015.csv b/tools/inputs/history/np3-908-er-clr-history-2015.csv
new file mode 100644
index 00000000..28fad59a
--- /dev/null
+++ b/tools/inputs/history/np3-908-er-clr-history-2015.csv
@@ -0,0 +1 @@
+"SCED Time Stamp","Repeated Hour Flag","PRICE","MW"
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids-history-current.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids-history-current.csv
new file mode 100644
index 00000000..b4d6e34f
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point Source Location for PtP Bid,Settlement Point Sink Location for PtP Bid,PtP Bid Price,PtP Bid MW
+09/05/2026,1,7RNCHSLR_ALL,LEONLCPCT1_2,50.93,1.3
+09/05/2026,1,A4_DGR1_RN,LYSSY_RN,-.06,7.2
+09/05/2026,1,A4_DGR1_RN,TIMPP_RN1,-3.33,10
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids-history-samples.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids-history-samples.csv
new file mode 100644
index 00000000..1bfe0f83
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point Source location for PtP Bid","Settlement Point Sink location for PtP Bid","PtP Bid MW","PtP Bid Price","Bid ID"
+"03/10/2014","1","AMOCO_PUN1","CTL_GT_102","5","-.01","14a9934be3fb"
+"03/10/2014","1","AMOCO_PUN1","LZ_HOUSTON","5","-.01","5a35da567d87"
+"03/10/2014","1","AMOCO_PUN1","NUE_NUECESG8","1.9","-.5","2140310018"
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_houston-history-current.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_houston-history-current.csv
new file mode 100644
index 00000000..aa7c65f4
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_houston-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point Source Location for PtP Bid,Settlement Point Sink Location for PtP Bid,PtP Bid Price,PtP Bid MW
+09/05/2026,1,ADL_RN,BSS_U1,3.2,6.7
+09/05/2026,1,ADL_RN,BSS_U1,4,6.7
+09/05/2026,1,ADL_RN,BSS_U1,5,6.7
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_houston-history-samples.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_houston-history-samples.csv
new file mode 100644
index 00000000..29b5cb82
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point Source location for PtP Bid","Settlement Point Sink location for PtP Bid","PtP Bid MW","PtP Bid Price","Bid ID"
+"03/10/2014","1","AMOCO_PUN1","CTL_GT_102","5","-.01","14a9934be3fb"
+"03/10/2014","1","AMOCO_PUN1","LZ_HOUSTON","5","-.01","5a35da567d87"
+"03/10/2014","1","AMOCO_PUN1","THW_1_CCU","2.4","-.01","512908ff1d1c"
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_north-history-current.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_north-history-current.csv
new file mode 100644
index 00000000..ee4d7c58
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_north-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point Source Location for PtP Bid,Settlement Point Sink Location for PtP Bid,PtP Bid Price,PtP Bid MW
+09/05/2026,1,AGUAYO_UNIT1,CNLY_ESS_RN,100,10
+09/05/2026,1,AGUAYO_UNIT1,PANDA_T2_ST1,-.58,3
+09/05/2026,1,AGUAYO_UNIT1,RADN_SLR_ALL,-6.25,1
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_north-history-samples.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_north-history-samples.csv
new file mode 100644
index 00000000..a54e01f3
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_north-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point Source location for PtP Bid","Settlement Point Sink location for PtP Bid","PtP Bid MW","PtP Bid Price","Bid ID"
+"03/10/2014","1","ATK_ATKG345","ATK_ATKINSG6","25","-1","40132723"
+"03/10/2014","1","ATK_ATKG345","ATK_ATKINSG6","25","-.5","40132724"
+"03/10/2014","1","ATK_ATKG345","ATK_ATKINSG6","25","-.25","OTP_PTP"
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_south-history-current.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_south-history-current.csv
new file mode 100644
index 00000000..b4d6e34f
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_south-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point Source Location for PtP Bid,Settlement Point Sink Location for PtP Bid,PtP Bid Price,PtP Bid MW
+09/05/2026,1,7RNCHSLR_ALL,LEONLCPCT1_2,50.93,1.3
+09/05/2026,1,A4_DGR1_RN,LYSSY_RN,-.06,7.2
+09/05/2026,1,A4_DGR1_RN,TIMPP_RN1,-3.33,10
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_south-history-samples.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_south-history-samples.csv
new file mode 100644
index 00000000..8915de3d
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_south-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point Source location for PtP Bid","Settlement Point Sink location for PtP Bid","PtP Bid MW","PtP Bid Price","Bid ID"
+"03/10/2014","1","AMOCO_PUN1","NUE_NUECESG8","1.9","-.5","2140310018"
+"03/10/2014","1","AMOCO_PUN2","CCEC_GT1","2.5","-.5","2140310019"
+"03/10/2014","1","ANACACHO_ANA","AMISTAD_ALL","1","-3500","M112789"
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_west-history-current.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_west-history-current.csv
new file mode 100644
index 00000000..06805885
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_west-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Settlement Point Source Location for PtP Bid,Settlement Point Sink Location for PtP Bid,PtP Bid Price,PtP Bid MW
+09/05/2026,1,ABINDUST_RN,CALLAHA_WND1,-37,2.3
+09/05/2026,1,ABINDUST_RN,CALLAHA_WND1,-29,2.3
+09/05/2026,1,ABINDUST_RN,CALLAHA_WND1,-21,3.2
diff --git a/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_west-history-samples.csv b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_west-history-samples.csv
new file mode 100644
index 00000000..91034393
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_ptp_obl_bids_west-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Settlement Point Source location for PtP Bid","Settlement Point Sink location for PtP Bid","PtP Bid MW","PtP Bid Price","Bid ID"
+"03/10/2014","1","BLSMT1_5_A_6","BULLCRK_1_2","1","-999","M111933"
+"03/10/2014","1","BLSMT1_5_A_6","BULLCRK_1_2","7","-200","M112669"
+"03/10/2014","1","BLSMT1_5_A_6","CSC_CSECG1_2","1","-999","M111787"
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers-history-current.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers-history-current.csv
new file mode 100644
index 00000000..e49b3365
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Sum DAM EN Only Bids cleared,Sum 3PO cleared,Sum DAM EN Only Offers cleared,Sum ESR Bids cleared,Sum ESR Offers cleared
+09/05/2026,1,-40439.9,25272.9,15103.5,-3.2,66.7
+09/05/2026,2,-38446.2,25003.3,13434,-8.3,17.6
+09/05/2026,3,-37548.3,25079.7,12928.3,-489.8,30.3
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers-history-samples.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers-history-samples.csv
new file mode 100644
index 00000000..959eed58
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Sum Cleared DAM Bids","Sum Cleared 3PO","Sum Cleared Energy Only Offers"
+"03/10/2014","1","-12699.9","8672.5","4027.4"
+"03/10/2014","2","-12127.8","8031.3","4096.6"
+"03/10/2014","3","-12073.3","7943.1","4130.2"
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-current.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-current.csv
new file mode 100644
index 00000000..13222f0a
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Sum DAM EN Only Bids cleared,Sum 3PO cleared,Sum DAM EN Only Offers cleared,Sum ESR Bids cleared,Sum ESR Offers cleared
+09/05/2026,1,-5413.3,4048.1,1190.5,0,0
+09/05/2026,2,-5251.4,4047.1,1068.7,0,0
+09/05/2026,3,-5189.5,4052.1,1151.1,-103.4,0
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-samples.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-samples.csv
new file mode 100644
index 00000000..08feeed2
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Sum Cleared DAM Bids","Sum Cleared 3PO","Sum Cleared Energy Only Offers"
+"03/10/2014","1","-1237.6","930.1","791"
+"03/10/2014","2","-1248.1","934.1","812"
+"03/10/2014","3","-1250.9","938.1","824"
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_north-history-current.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_north-history-current.csv
new file mode 100644
index 00000000..7deaf046
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_north-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Sum DAM EN Only Bids cleared,Sum 3PO cleared,Sum DAM EN Only Offers cleared,Sum ESR Bids cleared,Sum ESR Offers cleared
+09/05/2026,1,-18984.7,10425,5515.7,0,0
+09/05/2026,2,-17953.6,10343.4,5283.2,0,0
+09/05/2026,3,-17573.5,10441.8,5345.4,-128.2,0
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_north-history-samples.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_north-history-samples.csv
new file mode 100644
index 00000000..d11e59d7
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_north-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Sum Cleared DAM Bids","Sum Cleared 3PO","Sum Cleared Energy Only Offers"
+"03/10/2014","1","-4667.3","2143.3","1832.3"
+"03/10/2014","2","-4222.5","2026.9","1861.5"
+"03/10/2014","3","-4235.6","1950","1852.1"
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_south-history-current.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_south-history-current.csv
new file mode 100644
index 00000000..0b845c4f
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_south-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Sum DAM EN Only Bids cleared,Sum 3PO cleared,Sum DAM EN Only Offers cleared,Sum ESR Bids cleared,Sum ESR Offers cleared
+09/05/2026,1,-11588.2,8916,3712,-3.2,25
+09/05/2026,2,-11202.3,8798.7,3565.7,-8.3,0
+09/05/2026,3,-10947.7,8792.2,3357.9,-130.7,0
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_south-history-samples.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_south-history-samples.csv
new file mode 100644
index 00000000..2169a172
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_south-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Sum Cleared DAM Bids","Sum Cleared 3PO","Sum Cleared Energy Only Offers"
+"03/10/2014","1","-5209.5","5343.3","544.3"
+"03/10/2014","2","-5063.6","4823","554.5"
+"03/10/2014","3","-4953","4813.9","568.9"
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_west-history-current.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_west-history-current.csv
new file mode 100644
index 00000000..a4571885
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_west-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Sum DAM EN Only Bids cleared,Sum 3PO cleared,Sum DAM EN Only Offers cleared,Sum ESR Bids cleared,Sum ESR Offers cleared
+09/05/2026,1,-3867.8,1883.8,4334.8,0,41.7
+09/05/2026,2,-3632.2,1814.1,3507.1,0,17.6
+09/05/2026,3,-3394.2,1793.6,3073.9,-127.5,30.3
diff --git a/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_west-history-samples.csv b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_west-history-samples.csv
new file mode 100644
index 00000000..dd380063
--- /dev/null
+++ b/tools/inputs/history/np3-909-er--2d_total_cleared_energy_bids_offers_west-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Sum Cleared DAM Bids","Sum Cleared 3PO","Sum Cleared Energy Only Offers"
+"03/10/2014","1","-1585.5","255.8","859.8"
+"03/10/2014","2","-1593.6","247.3","868.6"
+"03/10/2014","3","-1633.8","241.1","885.2"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_dsr_loads-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_dsr_loads-history-samples.csv
new file mode 100644
index 00000000..5bd3006a
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_dsr_loads-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM TELEM DSR LOAD","SUM TELEM DSR GEN"
+"04/29/2014 00:00:16","N","1426.2","0"
+"04/29/2014 00:15:08","N","1400.9","0"
+"04/29/2014 00:30:10","N","1373.9","0"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary-history-current.csv
new file mode 100644
index 00000000..75d6be49
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM BASE POINT NON IRR,SUM BASE POINT WGR,SUM BASE POINT PVGR,SUM BASE POINT Remaining Res,SUM GEN TELEM MW,SUM BASE POINT ESR,SUM BASE POINT ESR CHARGING,SUM BASE POINT ESR DISCHARGING
+09/05/2026 00:00:20,N,43705.56298071,16092.59081339,1.05502587,5571.98185966,65634.39591,216.2663321,-218.35036787,434.61669998
+09/05/2026 00:05:18,N,43577.22832918,16034.86565971,1.13090039,5568.69313635,65444.09128,396.91866157,-251.46030369,648.37896527
+09/05/2026 00:10:18,N,43275.25815019,15969.93537786,.96439416,5564.90928284,65225.57278,597.04957277,-244.71224424,841.76181701
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary-history-samples.csv
new file mode 100644
index 00000000..707f5538
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM BASE POINT NON-WGR","SUM HASL NON-WGR","SUM LASL NON-WGR","SUM BASE POINT WGR","SUM HASL WGR","SUM LASL WGR","SUM BASE POINT REMAINING RESOURCES","SUM HASL REMAINING RESOURCES","SUM LASL REMAINING RESOURCES","SUM GEN TELEM MW"
+"04/29/2014 00:00:16","N","25912.74570178","28511.51867675","16616.57844543","4241.11376839","4241.11376839","4","1267.07220083","1575.52243","564.94243675","31685.16178"
+"04/29/2014 00:15:08","N","25442.48604202","27528.00245666","16284.43547058","4091.30889725","4131.41424202","4","1163.4570298","1554.33677761","541.75678436","30924.45563"
+"04/29/2014 00:30:10","N","24735.69743347","27242.44395446","16110.4915924","4209.17186951","4209.17186951","4","1159.56618484","1175.22133478","425.64134153","30310.64647"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_houston-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_houston-history-current.csv
new file mode 100644
index 00000000..09863c28
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM BASE POINT NON IRR,SUM BASE POINT WGR,SUM BASE POINT PVGR,SUM BASE POINT Remaining Res,SUM GEN TELEM MW,SUM BASE POINT ESR,SUM BASE POINT ESR CHARGING,SUM BASE POINT ESR DISCHARGING
+09/05/2026 00:00:20,N,9575.66966539,104.07728004,.00970499,607.60309968,10600.70586,94.9439633,-4.2361173,99.18008061
+09/05/2026 00:05:18,N,9547.84942096,106.55943393,.07262801,604.95075627,10295.90249,197.81292796,-1.40075705,199.21368502
+09/05/2026 00:10:18,N,9558.99195969,112.0656166,.02794967,601.70975514,10366.0364,200.10912852,-.13565728,200.2447858
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_houston-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_houston-history-samples.csv
new file mode 100644
index 00000000..ee129b09
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM BASE POINT NON-WGR","SUM HASL NON-WGR","SUM LASL NON-WGR","SUM BASE POINT WGR","SUM HASL WGR","SUM LASL WGR","SUM BASE POINT REMAINING RESOURCES","SUM HASL REMAINING RESOURCES","SUM LASL REMAINING RESOURCES","SUM GEN TELEM MW"
+"04/29/2014 00:00:16","N","5120.02861404","5273.79998779","2969","","","","322.95237356","331.4424377","311.4424377","5324.22172"
+"04/29/2014 00:15:08","N","5102.64146423","5166.99998474","3025","","","","308.56273506","318.25678531","298.25678531","5329.34504"
+"04/29/2014 00:30:10","N","5072.15359497","5166.99998474","3025","","","","304.66304191","314.14134249","294.14134249","5350.31523"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_north-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_north-history-current.csv
new file mode 100644
index 00000000..090b62e2
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM BASE POINT NON IRR,SUM BASE POINT WGR,SUM BASE POINT PVGR,SUM BASE POINT Remaining Res,SUM GEN TELEM MW,SUM BASE POINT ESR,SUM BASE POINT ESR CHARGING,SUM BASE POINT ESR DISCHARGING
+09/05/2026 00:00:20,N,19487.91349601,1948.86145186,.32226315,2370.04131454,23939.09011,.98313852,-100.00001256,100.98315109
+09/05/2026 00:05:18,N,19376.54593181,1959.92382764,.32511989,2370.0464428,23772.03771,-13.8716502,-100.00000727,86.12835707
+09/05/2026 00:10:18,N,19244.4270935,1982.86026835,.32827519,2370.09523591,23593.21195,-30.99735493,-107.78446927,76.78711434
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_north-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_north-history-samples.csv
new file mode 100644
index 00000000..d4cc9a8e
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_north-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM BASE POINT NON-WGR","SUM HASL NON-WGR","SUM LASL NON-WGR","SUM BASE POINT WGR","SUM HASL WGR","SUM LASL WGR","SUM BASE POINT REMAINING RESOURCES","SUM HASL REMAINING RESOURCES","SUM LASL REMAINING RESOURCES","SUM GEN TELEM MW"
+"04/29/2014 00:00:16","N","12450.92651748","13118.58305358","8225.74284362","102.82153224","102.82153224","0","89.30606651","355","112","12557.14869"
+"04/29/2014 00:15:08","N","12605.43399429","13147.60316467","8245.63618469","84.41957092","84.41957092","0","0","375","112","12746.86326"
+"04/29/2014 00:30:10","N","12537.29205703","13143.04978942","8245.69743347","52.27859067","52.27859067","0","","","","12645.93045"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_south-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_south-history-current.csv
new file mode 100644
index 00000000..f0553d95
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM BASE POINT NON IRR,SUM BASE POINT WGR,SUM BASE POINT PVGR,SUM BASE POINT Remaining Res,SUM GEN TELEM MW,SUM BASE POINT ESR,SUM BASE POINT ESR CHARGING,SUM BASE POINT ESR DISCHARGING
+09/05/2026 00:00:20,N,11903.07099509,3472.72053718,.29553737,2594.33744544,17958.33817,7.20114108,-105.57041723,112.77155831
+09/05/2026 00:05:18,N,11910.60025984,3473.76325774,.30790014,2593.69593727,18085.49301,83.14967536,-141.38507561,224.53475098
+09/05/2026 00:10:18,N,11911.23296746,3387.11915516,.31748495,2593.10429178,18058.60017,173.56562357,-135.34479454,308.91041812
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_south-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_south-history-samples.csv
new file mode 100644
index 00000000..aecbfbf4
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_south-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM BASE POINT NON-WGR","SUM HASL NON-WGR","SUM LASL NON-WGR","SUM BASE POINT WGR","SUM HASL WGR","SUM LASL WGR","SUM BASE POINT REMAINING RESOURCES","SUM HASL REMAINING RESOURCES","SUM LASL REMAINING RESOURCES","SUM GEN TELEM MW"
+"04/29/2014 00:00:16","N","8326.79057025","9544.13563537","5418.8356018","1025.17955946","1025.17955946","0","854.81376075","889.07999229","141.49999904","10672.87029"
+"04/29/2014 00:15:08","N","7719.91058349","8636.89930725","5010.79928588","966.25799369","1006.36333847","0","854.89429473","861.07999229","131.49999904","9785.57461"
+"04/29/2014 00:30:10","N","7111.75178146","8355.89418029","4836.79415893","1055.04957461","1055.04957461","0","854.90314292","861.07999229","131.49999904","9190.90446"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_west-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_west-history-current.csv
new file mode 100644
index 00000000..2856516d
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_west-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM BASE POINT NON IRR,SUM BASE POINT WGR,SUM BASE POINT PVGR,SUM BASE POINT Remaining Res,SUM GEN TELEM MW,SUM BASE POINT ESR,SUM BASE POINT ESR CHARGING,SUM BASE POINT ESR DISCHARGING
+09/05/2026 00:00:20,N,2279.02405858,10566.9315443,.42752034,,12680.53762,113.13808919,-8.54382076,121.68190995
+09/05/2026 00:05:18,N,2280.06502246,10494.61914038,.42525234,,12831.7661,129.82770844,-8.67446374,138.50217219
+09/05/2026 00:10:18,N,2095.60612952,10487.89033773,.29068433,,12746.58003,254.3721756,-1.44732313,255.81949874
diff --git a/tools/inputs/history/np3-910-er--2d_agg_gen_summary_west-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_west-history-samples.csv
new file mode 100644
index 00000000..e4d6b6c1
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_gen_summary_west-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM BASE POINT NON-WGR","SUM HASL NON-WGR","SUM LASL NON-WGR","SUM BASE POINT WGR","SUM HASL WGR","SUM LASL WGR","SUM BASE POINT REMAINING RESOURCES","SUM HASL REMAINING RESOURCES","SUM LASL REMAINING RESOURCES","SUM GEN TELEM MW"
+"04/29/2014 00:00:16","N","15","575","3","3113.11267668","3113.11267668","4","","","","3130.92108"
+"04/29/2014 00:15:08","N","14.5","576.5","3","3040.63133263","3040.63133263","4","","","","3062.67272"
+"04/29/2014 00:30:10","N","14.5","576.5","3","3101.84370422","3101.84370422","4","","","","3123.49633"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary-history-current.csv
new file mode 100644
index 00000000..7bb78365
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM TELEM GEN MW,SUM TELEM DCTIE MW,AGG LOAD SUMMARY
+09/05/2026 00:00:20,N,65633.48059,-232.2,65865.68059
+09/05/2026 00:05:18,N,65443.18001,-327.3,65770.48001
+09/05/2026 00:10:18,N,65224.68439,-336.8,65561.48439
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary-history-samples.csv
new file mode 100644
index 00000000..4da72e70
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM TELEM GEN MW","SUM TELEM DCTIE MW","AGG LOAD SUMMARY"
+"04/29/2014 00:00:16","N","31685.34764","-542.3","32227.64764"
+"04/29/2014 00:15:08","N","30924.87509","-540.9","31465.77509"
+"04/29/2014 00:30:10","N","30310.84891","-542.8","30853.64891"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_houston-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_houston-history-current.csv
new file mode 100644
index 00000000..2ff800a9
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM TELEM GEN MW,SUM TELEM DCTIE MW,AGG LOAD SUMMARY
+09/05/2026 00:00:20,N,10599.51166,0,10599.51166
+09/05/2026 00:05:18,N,10294.70996,0,10294.70996
+09/05/2026 00:10:18,N,10364.85088,0,10364.85088
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_houston-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_houston-history-samples.csv
new file mode 100644
index 00000000..220877f0
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM TELEM GEN MW","SUM TELEM DCTIE MW","AGG LOAD SUMMARY"
+"04/29/2014 00:00:16","N","5324.22172","0","5324.22172"
+"04/29/2014 00:15:08","N","5329.56197","0","5329.56197"
+"04/29/2014 00:30:10","N","5350.31523","0","5350.31523"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_north-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_north-history-current.csv
new file mode 100644
index 00000000..dac97277
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM TELEM GEN MW,SUM TELEM DCTIE MW,AGG LOAD SUMMARY
+09/05/2026 00:00:20,N,23939.46944,-112.2,24051.66944
+09/05/2026 00:05:18,N,23772.41642,-216.5,23988.91642
+09/05/2026 00:10:18,N,23593.59053,-225.5,23819.09053
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_north-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_north-history-samples.csv
new file mode 100644
index 00000000..d6234539
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_north-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM TELEM GEN MW","SUM TELEM DCTIE MW","AGG LOAD SUMMARY"
+"04/29/2014 00:00:16","N","12557.22095","-562.9","13120.12095"
+"04/29/2014 00:15:08","N","12746.95219","-561.5","13308.45219"
+"04/29/2014 00:30:10","N","12646.01929","-563.2","13209.21929"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_south-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_south-history-current.csv
new file mode 100644
index 00000000..87dc3b60
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM TELEM GEN MW,SUM TELEM DCTIE MW,AGG LOAD SUMMARY
+09/05/2026 00:00:20,N,17958.21217,98.4,17859.81217
+09/05/2026 00:05:18,N,18085.37001,107.7,17977.67001
+09/05/2026 00:10:18,N,18058.48317,107.3,17951.18317
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_south-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_south-history-samples.csv
new file mode 100644
index 00000000..ee533b4b
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_south-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM TELEM GEN MW","SUM TELEM DCTIE MW","AGG LOAD SUMMARY"
+"04/29/2014 00:00:16","N","10672.98389",".3","10672.68389"
+"04/29/2014 00:15:08","N","9785.68821",".3","9785.38821"
+"04/29/2014 00:30:10","N","9191.01806",".3","9190.71806"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_west-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_west-history-current.csv
new file mode 100644
index 00000000..b3c2e372
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_west-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM TELEM GEN MW,SUM TELEM DCTIE MW,AGG LOAD SUMMARY
+09/05/2026 00:00:20,N,12680.56317,-218.4,12898.96317
+09/05/2026 00:05:18,N,12831.79165,-218.5,13050.29165
+09/05/2026 00:10:18,N,12746.61558,-218.6,12965.21558
diff --git a/tools/inputs/history/np3-910-er--2d_agg_load_summary_west-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_load_summary_west-history-samples.csv
new file mode 100644
index 00000000..2556310a
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_load_summary_west-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM TELEM GEN MW","SUM TELEM DCTIE MW","AGG LOAD SUMMARY"
+"04/29/2014 00:00:16","N","3130.92108","20.3","3110.62108"
+"04/29/2014 00:15:08","N","3062.67272","20.3","3042.37272"
+"04/29/2014 00:30:10","N","3123.49633","20.1","3103.39633"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched-history-current.csv
new file mode 100644
index 00000000..ad8374b2
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM LSL OUTPUT SCHEDULE,SUM HSL OUTPUT SCHEDULE,SUM OUTPUTSCHEDULE
+09/05/2026 00:00:20,N,1879.48216636,7466.23505074,5570.93914093
+09/05/2026 00:05:18,N,1877.48258635,7463.91013428,5567.21581812
+09/05/2026 00:10:18,N,1874.47260659,7460.55683939,5565.4887757
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched-history-samples.csv
new file mode 100644
index 00000000..c451a8a3
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM LSL OUTPUT SCHEDULE","SUM HSL OUTPUT SCHEDULE","SUM OUTPUTSCHEDULE"
+"04/29/2014 00:00:16","N","3192.4","8564.3","1356.6"
+"04/29/2014 00:15:08","N","3179.2","8563.1","1163.5"
+"04/29/2014 00:30:10","N","3175","8558.9","1158.1"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_houston-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_houston-history-current.csv
new file mode 100644
index 00000000..91b68398
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_houston-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM LSL OUTPUT SCHEDULE,SUM HSL OUTPUT SCHEDULE,SUM OUTPUTSCHEDULE
+09/05/2026 00:00:20,N,253.98100972,1236.34936594,606.03206092
+09/05/2026 00:05:18,N,251.98100972,1234.53440546,602.20387813
+09/05/2026 00:10:18,N,248.97099995,1230.26176905,600.62980573
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_houston-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_houston-history-samples.csv
new file mode 100644
index 00000000..178c1ab4
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_houston-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM LSL OUTPUT SCHEDULE","SUM HSL OUTPUT SCHEDULE","SUM OUTPUTSCHEDULE"
+"04/29/2014 00:00:16","N","683.5","1370.5","323.4"
+"04/29/2014 00:15:08","N","670.3","1357.3","308.6"
+"04/29/2014 00:30:10","N","666.1","1353.1","303.2"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_north-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_north-history-current.csv
new file mode 100644
index 00000000..9557778c
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_north-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM LSL OUTPUT SCHEDULE,SUM HSL OUTPUT SCHEDULE,SUM OUTPUTSCHEDULE
+09/05/2026 00:00:20,N,653.50000381,3383.10222148,2369.78692001
+09/05/2026 00:05:18,N,653.50000381,3383.10234355,2369.79155999
+09/05/2026 00:10:18,N,653.50000381,3384.42094707,2369.83839997
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_north-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_north-history-samples.csv
new file mode 100644
index 00000000..9620a947
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_north-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM LSL OUTPUT SCHEDULE","SUM HSL OUTPUT SCHEDULE","SUM OUTPUTSCHEDULE"
+"04/29/2014 00:00:16","N","999","2540","178.4"
+"04/29/2014 00:15:08","N","999","2546","0"
+"04/29/2014 00:30:10","N","999","2546","0"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_south-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_south-history-current.csv
new file mode 100644
index 00000000..16abfe83
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_south-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM LSL OUTPUT SCHEDULE,SUM HSL OUTPUT SCHEDULE,SUM OUTPUTSCHEDULE
+09/05/2026 00:00:20,N,967.01115305,2837.18346292,2595.12015999
+09/05/2026 00:05:18,N,967.01157305,2836.67338487,2595.22038
+09/05/2026 00:10:18,N,967.01160304,2836.27412288,2595.02057
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_south-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_south-history-samples.csv
new file mode 100644
index 00000000..5096b4b2
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_south-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM LSL OUTPUT SCHEDULE","SUM HSL OUTPUT SCHEDULE","SUM OUTPUTSCHEDULE"
+"04/29/2014 00:00:16","N","1300.3","4184.5","854.8"
+"04/29/2014 00:15:08","N","1300.3","4190.5","854.9"
+"04/29/2014 00:30:10","N","1300.3","4190.5","854.9"
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_west-history-current.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_west-history-current.csv
new file mode 100644
index 00000000..192afd06
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_west-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,SUM LSL OUTPUT SCHEDULE,SUM HSL OUTPUT SCHEDULE,SUM OUTPUTSCHEDULE
+09/05/2026 00:00:20,N,4.98999977,9.60000038,0
+09/05/2026 00:05:18,N,4.98999977,9.60000038,0
+09/05/2026 00:10:18,N,4.98999977,9.60000038,0
diff --git a/tools/inputs/history/np3-910-er--2d_agg_out_sched_west-history-samples.csv b/tools/inputs/history/np3-910-er--2d_agg_out_sched_west-history-samples.csv
new file mode 100644
index 00000000..c13435b8
--- /dev/null
+++ b/tools/inputs/history/np3-910-er--2d_agg_out_sched_west-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","SUM LSL OUTPUT SCHEDULE","SUM HSL OUTPUT SCHEDULE","SUM OUTPUTSCHEDULE"
+"04/29/2014 00:00:16","N","209.6","469.3","0"
+"04/29/2014 00:15:08","N","209.6","469.3","0"
+"04/29/2014 00:30:10","N","209.6","469.3","0"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_ecrsm-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_ecrsm-history-middle.csv
new file mode 100644
index 00000000..c2d2cda5
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_ecrsm-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,ECRSM Offer Price
+04/24/2025,01,23.5,0
+04/24/2025,01,65.4,.01
+04/24/2025,01,169.4,1
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_ecrss-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_ecrss-history-middle.csv
new file mode 100644
index 00000000..a9534fe4
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_ecrss-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,ECRSS Offer Price
+04/24/2025,01,47,.01
+04/24/2025,01,273.8,.02
+04/24/2025,01,369.3,.03
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_offns-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_offns-history-middle.csv
new file mode 100644
index 00000000..78aa2998
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_offns-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,OFFNS Offer Price
+04/24/2025,01,615.7,.01
+04/24/2025,01,715.7,.03
+04/24/2025,01,808.3,.04
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_offns-history-samples.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_offns-history-samples.csv
new file mode 100644
index 00000000..ee535af9
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_offns-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","MW Offered","OFFNS Offer Price"
+"04/29/2014","01","198",".01"
+"04/29/2014","01","268",".3"
+"04/29/2014","01","303",".5"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_onns-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_onns-history-middle.csv
new file mode 100644
index 00000000..b72c0637
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_onns-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,ONNS Offer Price
+04/24/2025,01,27.6,.24
+04/24/2025,01,260.8,.3
+04/24/2025,01,275.8,.37
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_onns-history-samples.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_onns-history-samples.csv
new file mode 100644
index 00000000..e2bd1fd3
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_onns-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","MW Offered","ONNS Offer Price"
+"04/29/2014","01","164","1"
+"04/29/2014","01","231","1.4"
+"04/29/2014","01","246","2.43"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_regdn-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regdn-history-middle.csv
new file mode 100644
index 00000000..2a828a3c
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regdn-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,REGDN Offer Price
+04/24/2025,01,31.4,0
+04/24/2025,01,81.4,.03
+04/24/2025,01,83.9,.1
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_regdn-history-samples.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regdn-history-samples.csv
new file mode 100644
index 00000000..0f67a1a5
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regdn-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","MW Offered","REGDN Offer Price"
+"04/29/2014","01","50",".01"
+"04/29/2014","01","120",".5"
+"04/29/2014","01","220","1"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_regup-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regup-history-middle.csv
new file mode 100644
index 00000000..c087d9e2
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regup-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,REGUP Offer Price
+04/24/2025,01,40.5,0
+04/24/2025,01,43,.1
+04/24/2025,01,45.2,.17
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_regup-history-samples.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regup-history-samples.csv
new file mode 100644
index 00000000..ae255c92
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_regup-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","MW Offered","REGUP Offer Price"
+"04/29/2014","01","217.7",".01"
+"04/29/2014","01","242.7",".02"
+"04/29/2014","01","464.7","1"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsffr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsffr-history-middle.csv
new file mode 100644
index 00000000..66bd5c9e
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsffr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,RRSFFR Offer Price
+04/24/2025,01,7.5,.1
+04/24/2025,01,5,0
+04/24/2025,01,130,.3
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsgn-history-samples.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsgn-history-samples.csv
new file mode 100644
index 00000000..f0a75312
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsgn-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","MW Offered","RRSGN Offer Price"
+"04/29/2014","01","703.3",".01"
+"04/29/2014","01","728.3",".02"
+"04/29/2014","01","827.3",".5"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsld-history-samples.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsld-history-samples.csv
new file mode 100644
index 00000000..805c98fb
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsld-history-samples.csv
@@ -0,0 +1 @@
+"Delivery Date","Hour Ending","MW Offered","RRSLD Offer Price"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsnc-history-samples.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsnc-history-samples.csv
new file mode 100644
index 00000000..ed54e20d
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsnc-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","MW Offered","RRSNC Offer Price"
+"04/29/2014","01","961.5","750"
+"04/29/2014","01","961.4","499"
+"04/29/2014","01","961.6","999"
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrspfr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrspfr-history-middle.csv
new file mode 100644
index 00000000..57903881
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrspfr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,RRSPFR Offer Price
+04/24/2025,01,19.2,0
+04/24/2025,01,65.2,.01
+04/24/2025,01,96,.08
diff --git a/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsufr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsufr-history-middle.csv
new file mode 100644
index 00000000..4c32ea52
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_as_offers_rrsufr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,RRSUFR Offer Price
+04/24/2025,01,958.3,0
+04/24/2025,02,952,0
+04/24/2025,03,930.3,0
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_ecrsm-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_ecrsm-history-current.csv
new file mode 100644
index 00000000..473827ba
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_ecrsm-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,ECRSM Offer Price
+09/05/2026,1,128,0
+09/05/2026,1,248.3,.01
+09/05/2026,2,131.8,0
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_ecrss-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_ecrss-history-current.csv
new file mode 100644
index 00000000..4d5ccfec
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_ecrss-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,ECRSS Offer Price
+09/05/2026,1,52,0
+09/05/2026,1,380.2,.01
+09/05/2026,1,476.2,.05
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_nspin-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_nspin-history-current.csv
new file mode 100644
index 00000000..d1dfd90b
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_nspin-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,NSPIN Offer Price
+09/05/2026,1,305.3,0
+09/05/2026,1,1238.6,.01
+09/05/2026,1,1331.4,.02
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_nspnm-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_nspnm-history-current.csv
new file mode 100644
index 00000000..f50997f9
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_nspnm-history-current.csv
@@ -0,0 +1 @@
+Delivery Date,Hour Ending,MW Offered,NSPNM Offer Price
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_regdn-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_regdn-history-current.csv
new file mode 100644
index 00000000..56910d39
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_regdn-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,REGDN Offer Price
+09/05/2026,1,29.7,.22
+09/05/2026,1,474.7,.23
+09/05/2026,1,494.7,.26
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_regup-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_regup-history-current.csv
new file mode 100644
index 00000000..666b44e1
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_regup-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,REGUP Offer Price
+09/05/2026,1,12.9,.01
+09/05/2026,1,19.5,.2
+09/05/2026,1,65.5,.46
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrsffr-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrsffr-history-current.csv
new file mode 100644
index 00000000..86c52dda
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrsffr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,RRSFFR Offer Price
+09/05/2026,1,19.2,0
+09/05/2026,1,101.2,.49
+09/05/2026,1,131.2,500
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrspfr-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrspfr-history-current.csv
new file mode 100644
index 00000000..06d23e91
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrspfr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,RRSPFR Offer Price
+09/05/2026,1,51,0
+09/05/2026,1,341,.01
+09/05/2026,1,1115.4,.09
diff --git a/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrsufr-history-current.csv b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrsufr-history-current.csv
new file mode 100644
index 00000000..62cf3ede
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_agg_dam_as_offers_rrsufr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,MW Offered,RRSUFR Offer Price
+09/05/2026,1,886.4,0
+09/05/2026,2,879.7,0
+09/05/2026,3,865.9,0
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrsm-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrsm-history-current.csv
new file mode 100644
index 00000000..4350fa7d
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrsm-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - ECRSM
+09/05/2026,1,248.3
+09/05/2026,2,252.1
+09/05/2026,3,252.1
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrsm-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrsm-history-middle.csv
new file mode 100644
index 00000000..4ec67883
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrsm-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - ECRSM
+04/24/2025,1,65.4
+04/24/2025,2,65.4
+04/24/2025,3,65.4
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrss-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrss-history-current.csv
new file mode 100644
index 00000000..e4d99271
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrss-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - ECRSS
+09/05/2026,1,912.8
+09/05/2026,2,830.1
+09/05/2026,3,814.1
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrss-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrss-history-middle.csv
new file mode 100644
index 00000000..0d28b1ae
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_ecrss-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - ECRSS
+04/24/2025,1,676.6
+04/24/2025,2,638.6
+04/24/2025,3,590.7
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-current.csv
new file mode 100644
index 00000000..aeec6a5f
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - NonSpin
+09/05/2026,1,4705
+09/05/2026,2,4984.5
+09/05/2026,3,4994.3
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-middle.csv
new file mode 100644
index 00000000..bd1dd849
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - NonSpin
+04/24/2025,1,1634
+04/24/2025,2,1633.9
+04/24/2025,3,2092
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-samples.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-samples.csv
new file mode 100644
index 00000000..fe630437
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspin-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Cleared AS - NonSpin"
+"04/29/2014","1","1413.6"
+"04/29/2014","2","1410.6"
+"04/29/2014","3","1411.6"
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspnm-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspnm-history-current.csv
new file mode 100644
index 00000000..98a480a5
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_nspnm-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - NSPNM
+09/05/2026,1,0
+09/05/2026,2,0
+09/05/2026,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-current.csv
new file mode 100644
index 00000000..a4b565bc
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RegDown
+09/05/2026,1,393.2
+09/05/2026,2,261
+09/05/2026,3,252.9
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-middle.csv
new file mode 100644
index 00000000..757be1e5
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RegDown
+04/24/2025,1,336.5
+04/24/2025,2,278.3
+04/24/2025,3,283.5
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-samples.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-samples.csv
new file mode 100644
index 00000000..b01b1103
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regdn-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Cleared AS - RegDown"
+"04/29/2014","1","444.8"
+"04/29/2014","2","400.6"
+"04/29/2014","3","362.2"
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-current.csv
new file mode 100644
index 00000000..308cb2df
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RegUp
+09/05/2026,1,324.5
+09/05/2026,2,266.4
+09/05/2026,3,251.8
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-middle.csv
new file mode 100644
index 00000000..7d247d0f
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RegUp
+04/24/2025,1,374
+04/24/2025,2,345
+04/24/2025,3,279.6
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-samples.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-samples.csv
new file mode 100644
index 00000000..0c0c5f6f
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_regup-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Cleared AS - RegUp"
+"04/29/2014","1","549.9"
+"04/29/2014","2","384.5"
+"04/29/2014","3","360.4"
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsffr-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsffr-history-current.csv
new file mode 100644
index 00000000..616a7c3e
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsffr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RRSFFR
+09/05/2026,1,19.2
+09/05/2026,2,19.2
+09/05/2026,3,19.2
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsffr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsffr-history-middle.csv
new file mode 100644
index 00000000..9d2424d3
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsffr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RRSFFR
+04/24/2025,1,125
+04/24/2025,2,124.9
+04/24/2025,3,95.9
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsgen-history-samples.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsgen-history-samples.csv
new file mode 100644
index 00000000..eb1047f0
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsgen-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Cleared AS - RRS Gen"
+"04/29/2014","1","1467.9"
+"04/29/2014","2","1468.3"
+"04/29/2014","3","1469.8"
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsload-history-samples.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsload-history-samples.csv
new file mode 100644
index 00000000..224b585a
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsload-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Cleared AS - RRS Load"
+"04/29/2014","1","960.9"
+"04/29/2014","2","959.1"
+"04/29/2014","3","956.7"
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrspfr-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrspfr-history-current.csv
new file mode 100644
index 00000000..883c1873
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrspfr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RRSPFR
+09/05/2026,1,1317.7
+09/05/2026,2,1319.1
+09/05/2026,3,1358.3
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrspfr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrspfr-history-middle.csv
new file mode 100644
index 00000000..3bf43490
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrspfr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RRSPFR
+04/24/2025,1,1502.2
+04/24/2025,2,1502
+04/24/2025,3,1609.8
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsufr-history-current.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsufr-history-current.csv
new file mode 100644
index 00000000..6aff63a4
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsufr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RRSUFR
+09/05/2026,1,883.7
+09/05/2026,2,879.2
+09/05/2026,3,865.9
diff --git a/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsufr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsufr-history-middle.csv
new file mode 100644
index 00000000..138442e9
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_cleared_dam_as_rrsufr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Cleared AS - RRSUFR
+04/24/2025,1,958.3
+04/24/2025,2,952
+04/24/2025,3,930.3
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrsm-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrsm-history-current.csv
new file mode 100644
index 00000000..b5a6512f
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrsm-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - ECRSM
+09/05/2026,1,0
+09/05/2026,2,0
+09/05/2026,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrsm-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrsm-history-middle.csv
new file mode 100644
index 00000000..8e82334a
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrsm-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - ECRSM
+04/24/2025,1,0
+04/24/2025,2,0
+04/24/2025,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrss-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrss-history-current.csv
new file mode 100644
index 00000000..79dc3cae
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrss-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - ECRSS
+09/05/2026,1,-11
+09/05/2026,2,-13.4
+09/05/2026,3,-15
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrss-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrss-history-middle.csv
new file mode 100644
index 00000000..cd96d44f
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_ecrss-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - ECRSS
+04/24/2025,1,38
+04/24/2025,2,38
+04/24/2025,3,38
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-current.csv
new file mode 100644
index 00000000..c4ba00fb
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - NonSpin
+09/05/2026,1,39.6
+09/05/2026,2,32.2
+09/05/2026,3,23.4
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-middle.csv
new file mode 100644
index 00000000..6efe0225
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - NonSpin
+04/24/2025,1,95
+04/24/2025,2,95
+04/24/2025,3,95
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-samples.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-samples.csv
new file mode 100644
index 00000000..00845e05
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspin-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Self-Arranged AS - NonSpin"
+"04/29/2014","1","86.4"
+"04/29/2014","2","89.4"
+"04/29/2014","3","88.4"
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspnm-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspnm-history-current.csv
new file mode 100644
index 00000000..9694a0a0
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspnm-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - NSPNM
+09/05/2026,1,0
+09/05/2026,2,0
+09/05/2026,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspnm-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspnm-history-middle.csv
new file mode 100644
index 00000000..dbdda6e0
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_nspnm-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - NSPNM
+04/24/2025,1,0
+04/24/2025,2,0
+04/24/2025,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-current.csv
new file mode 100644
index 00000000..6b6961ad
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RegDown
+09/05/2026,1,-1
+09/05/2026,2,-1
+09/05/2026,3,-1
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-middle.csv
new file mode 100644
index 00000000..7b607947
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RegDown
+04/24/2025,1,17.5
+04/24/2025,2,17.5
+04/24/2025,3,17.5
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-samples.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-samples.csv
new file mode 100644
index 00000000..bf2bbe13
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regdn-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Self-Arranged AS - RegDown"
+"04/29/2014","1","-17.7"
+"04/29/2014","2","-25.6"
+"04/29/2014","3","-47.2"
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-current.csv
new file mode 100644
index 00000000..d058d618
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RegUp
+09/05/2026,1,9.4
+09/05/2026,2,7.6
+09/05/2026,3,7.1
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-middle.csv
new file mode 100644
index 00000000..4059e25d
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RegUp
+04/24/2025,1,0
+04/24/2025,2,0
+04/24/2025,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-samples.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-samples.csv
new file mode 100644
index 00000000..5c19bcf0
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_regup-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Self-Arranged AS - RegUp"
+"04/29/2014","1",".2"
+"04/29/2014","2","-.5"
+"04/29/2014","3","-.4"
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsffr-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsffr-history-current.csv
new file mode 100644
index 00000000..e0614000
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsffr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RRSFFR
+09/05/2026,1,0
+09/05/2026,2,0
+09/05/2026,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsffr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsffr-history-middle.csv
new file mode 100644
index 00000000..2ff6f4bd
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsffr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RRSFFR
+04/24/2025,1,0
+04/24/2025,2,0
+04/24/2025,3,0
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsgen-history-samples.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsgen-history-samples.csv
new file mode 100644
index 00000000..24169ac4
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsgen-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Self-Arranged AS - RRS Gen"
+"04/29/2014","1","5.7"
+"04/29/2014","2","5.8"
+"04/29/2014","3","5.3"
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsload-history-samples.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsload-history-samples.csv
new file mode 100644
index 00000000..ab719460
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsload-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Total Self-Arranged AS - RRS Load"
+"04/29/2014","1","365.3"
+"04/29/2014","2","366.8"
+"04/29/2014","3","368.2"
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrspfr-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrspfr-history-current.csv
new file mode 100644
index 00000000..6dc3f7ab
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrspfr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RRSPFR
+09/05/2026,1,58.6
+09/05/2026,2,57.8
+09/05/2026,3,58.5
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrspfr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrspfr-history-middle.csv
new file mode 100644
index 00000000..5476ff1a
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrspfr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RRSPFR
+04/24/2025,1,22
+04/24/2025,2,22
+04/24/2025,3,22
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsufr-history-current.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsufr-history-current.csv
new file mode 100644
index 00000000..ce0331ab
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsufr-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RRSUFR
+09/05/2026,1,148.3
+09/05/2026,2,153.1
+09/05/2026,3,162.3
diff --git a/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsufr-history-middle.csv b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsufr-history-middle.csv
new file mode 100644
index 00000000..a14f280d
--- /dev/null
+++ b/tools/inputs/history/np3-911-er--2d_self_arranged_as_rrsufr-history-middle.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,Total Self-Arranged AS - RRSUFR
+04/24/2025,1,460.5
+04/24/2025,2,467.2
+04/24/2025,3,487
diff --git a/tools/inputs/history/np3-914-ex-history-current.csv b/tools/inputs/history/np3-914-ex-history-current.csv
new file mode 100644
index 00000000..ca8f462b
--- /dev/null
+++ b/tools/inputs/history/np3-914-ex-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,QSE,DME,Resource Name with Highest - Priced AS Offer Selected in SCED,AS Type,Offered Quantity,Offered Price
+09/04/2026 00:00:19,QSUE74,YSUEZ,ALVIN_ESR1,ECRS,.7,.02
+09/04/2026 00:00:19,QSUE74,YSUEZ,ALVIN_ESR1,ECRS,.7,.02
+09/04/2026 00:00:19,QSUE74,YSUEZ,ALVIN_ESR1,ECRS,.7,.02
diff --git a/tools/inputs/history/np3-914-ex-history-samples.csv b/tools/inputs/history/np3-914-ex-history-samples.csv
new file mode 100644
index 00000000..03176a1d
--- /dev/null
+++ b/tools/inputs/history/np3-914-ex-history-samples.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,QSE,DME,Resource Name with Highest - Priced AS Offer Selected in SCED,AS Type,Offered Quantity,Offered Price
+12/05/2025 00:00:19,QCPSE,YCPS,CALAVERS_JKS2,ECRS,30,.13
+12/05/2025 00:00:19,QCALP,YCALP,DUKE_CC1_2,NSPIN,104,2.1
+12/05/2025 00:00:19,QENE14,YENELT,ESTONIAN_ESR1,REGDN,81.5,8.38
diff --git a/tools/inputs/history/np3-915-ex-history-current.csv b/tools/inputs/history/np3-915-ex-history-current.csv
new file mode 100644
index 00000000..cb9cda45
--- /dev/null
+++ b/tools/inputs/history/np3-915-ex-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,DME,Resource Name with Highest-Priced AS Offer Selected in DAM,AS Type,Block Indicator,Offered Quantity,Offered Price
+04-SEP-26,1,QHABIT,YGLIDE,WCOLLOCL_ESR1,ECRS,V,2.2,.25
+04-SEP-26,1,QLUMN,YLUMN,DCSES_ESR2,ECRS,V,30,.25
+04-SEP-26,1,QLUMN,YLUMN,DCSES_ESR2,ECRS,V,30,.25
diff --git a/tools/inputs/history/np3-915-ex-history-samples.csv b/tools/inputs/history/np3-915-ex-history-samples.csv
new file mode 100644
index 00000000..11ccf6d4
--- /dev/null
+++ b/tools/inputs/history/np3-915-ex-history-samples.csv
@@ -0,0 +1,4 @@
+"Delivery Date","Hour Ending","Resource Name with Highest-Priced Offer Selected in DAM","AS Type","Block Indicator","Offered Quantity","Offered Price"
+"09-MAR-14","1","HENNE_LD1","RRS","V","8","24.7"
+"09-MAR-14","1","JACKCNTY_CC1_3","NSPIN","V","75","1"
+"09-MAR-14","1","JCKCNTY2_CC1_3","REGDN","V","25","15.55"
diff --git a/tools/inputs/history/np3-916-ex-history-current.csv b/tools/inputs/history/np3-916-ex-history-current.csv
new file mode 100644
index 00000000..2d3e1e25
--- /dev/null
+++ b/tools/inputs/history/np3-916-ex-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,LMP,QSE,DME,Generation Resource,Proxy Extension,Power Balance Penalty Flag
+09/04/2026 00:00:19,N,26.6393718719482,QBEEP1,YBEEPR,HOLCOMB_ESR1,No,No
+09/04/2026 00:05:19,N,25.2264518737793,QBEEP1,YBEEPR,HOLCOMB_ESR1,No,No
+09/04/2026 00:10:17,N,25.0432319641113,QBEEP1,YBEEPR,HOLCOMB_ESR1,No,No
diff --git a/tools/inputs/history/np3-916-ex-history-samples.csv b/tools/inputs/history/np3-916-ex-history-samples.csv
new file mode 100644
index 00000000..2319dae9
--- /dev/null
+++ b/tools/inputs/history/np3-916-ex-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Batch ID","LMP","Generation Resource","Proxy Extension","Power Balance Penalty Flag"
+"12/29/2018 00:00:19","N","5379175","238.545806884766","PB2SES_CT5","Yes","No"
+"12/29/2018 00:05:16","N","5379183","238.550170898437","PB2SES_CT5","Yes","No"
+"12/29/2018 00:10:17","N","5379185","238.550323486328","PB2SES_CT5","Yes","No"
diff --git a/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-current.csv b/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-current.csv
new file mode 100644
index 00000000..ddefc7cb
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-current.csv
@@ -0,0 +1 @@
+SCED Timestamp,Repeated Hour Flag,Participant Name,Resource Name,HDL Original,HDL Manual,HDL Final,LDL Original,LDL Manual,LDL Final,Reason Code
diff --git a/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-hdl-override.csv b/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-hdl-override.csv
new file mode 100644
index 00000000..61037f22
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-hdl-override.csv
@@ -0,0 +1,4 @@
+"SCED Timestamp","Repeated Hour Flag","Participant Name","Resource Name","HDL Original","HDL Manual","HDL Final","LDL Original","LDL Manual","LDL Final","Reason Code"
+"04/08/2024 11:40:17","N","QAEN","FPPYD1_FPP_G2_J02","95.13999938","0","95.13999938","78","160","95.13999938","."
+"04/08/2024 11:40:17","N","QLCRA","FPPYD2_FPP_G3","319.31054687","0","319.31054687","279.31054687","325","319.31054687","."
+"04/08/2024 11:45:17","N","QAEN","FPPYD1_FPP_G2_J02","107.44158935","0","107.44158935","78","160","107.44158935","."
diff --git a/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-samples.csv b/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-samples.csv
new file mode 100644
index 00000000..47881165
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_hdl_ldl_man_override-history-samples.csv
@@ -0,0 +1 @@
+"SCED Timestamp","Repeated Hour Flag","Participant Name","Resource Name","HDL Original","HDL Manual","HDL Final","LDL Original","LDL Manual","LDL Final","Reason Code"
diff --git a/tools/inputs/history/np3-965-er--60_load_res_data_in_sced-history-current.csv b/tools/inputs/history/np3-965-er--60_load_res_data_in_sced-history-current.csv
new file mode 100644
index 00000000..7ed37141
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_load_res_data_in_sced-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,DME,Resource Name,Telemetered Resource Status,Max Power Consumption,Low Power Consumption,Real Power Consumption,AS Awards NSPIN,AS Awards RRSFFR,AS Awards RRSPFR,AS Awards RRSUFR,AS Awards ECRS,AS Awards REGUP,AS Awards REGDN,SCED Bid to Buy Curve-MW1,SCED Bid to Buy Curve-Price1,SCED Bid to Buy Curve-MW2,SCED Bid to Buy Curve-Price2,SCED Bid to Buy Curve-MW3,SCED Bid to Buy Curve-Price3,SCED Bid to Buy Curve-MW4,SCED Bid to Buy Curve-Price4,SCED Bid to Buy Curve-MW5,SCED Bid to Buy Curve-Price5,SCED Bid to Buy Curve-MW6,SCED Bid to Buy Curve-Price6,SCED Bid to Buy Curve-MW7,SCED Bid to Buy Curve-Price7,SCED Bid to Buy Curve-MW8,SCED Bid to Buy Curve-Price8,SCED Bid to Buy Curve-MW9,SCED Bid to Buy Curve-Price9,SCED Bid to Buy Curve-MW10,SCED Bid to Buy Curve-Price10,Self Provided RRSFFR,Self Provided RRSUFR,Self Provided ECRS,Ramp Rate Up,Ramp Rate Down,AS Capability NSPIN,AS Capability ECRS,AS Capability REGUP,AS Capability REGDN,AS Capability RRSPFR,AS Capability RRSFFR,AS Capability RRSUFR,HDL,LDL,Base Point
+07/08/2026 00:00:21,N,QEDE20,,AAPIPLNC_LD3,ONL,24,0,12.8,,,,12.6,,,,,,,,,,,,,,,,,,,,,,,,0,12.6,0,0,0,0,0,0,0,0,0,12.786,12.78600025177,12.78600025177,
+07/08/2026 00:00:21,N,QEDE20,,AAPIPLNC_LD4,ONL,15,0,10.5,,,,10.5,,,,,,,,,,,,,,,,,,,,,,,,0,10.5,0,0,0,0,0,0,0,0,0,10.547,10.5470008850098,10.5470008850098,
+07/08/2026 00:00:21,N,QEDE20,,AIRPK_LD2,OUTL,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
diff --git a/tools/inputs/history/np3-965-er--60_load_res_data_in_sced-history-samples.csv b/tools/inputs/history/np3-965-er--60_load_res_data_in_sced-history-samples.csv
new file mode 100644
index 00000000..2f60e2d4
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_load_res_data_in_sced-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Resource Name","Telemetered Resource Status","Max Power Consumption","Low Power Consumption","Real Power Consumption","AS Responsibility for RRS","AS Responsibility for NonSpin","AS Responsibility for RegUp","AS Responsibility for RegDown"
+"03/02/2014 00:00:14","N","ACRLY_LD1","OUTL","0","0",".5","0","0","0","0"
+"03/02/2014 00:00:14","N","ADMDS_LD1","OUTL","9","0","3.4","0","0","0","0"
+"03/02/2014 00:00:14","N","AI_LD2","ONRL","4","0","2.1","1.5","0","0","0"
diff --git a/tools/inputs/history/np3-965-er--60_sced_dsr_load_data-history-samples.csv b/tools/inputs/history/np3-965-er--60_sced_dsr_load_data-history-samples.csv
new file mode 100644
index 00000000..412bb164
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_dsr_load_data-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","QSE Name","Total Telemetered DSR Loads"
+"03/02/2014 00:00:14","N","QLCRA","0"
+"03/02/2014 00:45:09","N","QSHERB","0"
+"03/02/2014 02:00:33","N","QBTU","0"
diff --git a/tools/inputs/history/np3-965-er--60_sced_eoc_updates_in_ophour-history-current.csv b/tools/inputs/history/np3-965-er--60_sced_eoc_updates_in_ophour-history-current.csv
new file mode 100644
index 00000000..6875e085
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_eoc_updates_in_ophour-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Delivery Hour,Resource Name,Reason,Count of Updates During Operating Hour
+07/08/2026,8,ABINDUST_ESR1,SOC Management; SOC Management,2
+07/08/2026,9,ABINDUST_ESR1,SOC Management,1
+07/08/2026,10,ABINDUST_ESR1,SOC Management,1
diff --git a/tools/inputs/history/np3-965-er--60_sced_gen_res_data-history-current.csv b/tools/inputs/history/np3-965-er--60_sced_gen_res_data-history-current.csv
new file mode 100644
index 00000000..5d05abff
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_gen_res_data-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,DME,Resource Name,Resource Type,SCED1 Curve-MW1,SCED1 Curve-Price1,SCED1 Curve-MW2,SCED1 Curve-Price2,SCED1 Curve-MW3,SCED1 Curve-Price3,SCED1 Curve-MW4,SCED1 Curve-Price4,SCED1 Curve-MW5,SCED1 Curve-Price5,SCED1 Curve-MW6,SCED1 Curve-Price6,SCED1 Curve-MW7,SCED1 Curve-Price7,SCED1 Curve-MW8,SCED1 Curve-Price8,SCED1 Curve-MW9,SCED1 Curve-Price9,SCED1 Curve-MW10,SCED1 Curve-Price10,SCED1 Curve-MW11,SCED1 Curve-Price11,SCED1 Curve-MW12,SCED1 Curve-Price12,SCED1 Curve-MW13,SCED1 Curve-Price13,SCED1 Curve-MW14,SCED1 Curve-Price14,SCED1 Curve-MW15,SCED1 Curve-Price15,SCED1 Curve-MW16,SCED1 Curve-Price16,SCED1 Curve-MW17,SCED1 Curve-Price17,SCED1 Curve-MW18,SCED1 Curve-Price18,SCED1 Curve-MW19,SCED1 Curve-Price19,SCED1 Curve-MW20,SCED1 Curve-Price20,SCED1 Curve-MW21,SCED1 Curve-Price21,SCED1 Curve-MW22,SCED1 Curve-Price22,SCED1 Curve-MW23,SCED1 Curve-Price23,SCED1 Curve-MW24,SCED1 Curve-Price24,SCED1 Curve-MW25,SCED1 Curve-Price25,SCED1 Curve-MW26,SCED1 Curve-Price26,SCED1 Curve-MW27,SCED1 Curve-Price27,SCED1 Curve-MW28,SCED1 Curve-Price28,SCED1 Curve-MW29,SCED1 Curve-Price29,SCED1 Curve-MW30,SCED1 Curve-Price30,SCED1 Curve-MW31,SCED1 Curve-Price31,SCED1 Curve-MW32,SCED1 Curve-Price32,SCED1 Curve-MW33,SCED1 Curve-Price33,SCED1 Curve-MW34,SCED1 Curve-Price34,SCED1 Curve-MW35,SCED1 Curve-Price35,SCED2 Curve-MW1,SCED2 Curve-Price1,SCED2 Curve-MW2,SCED2 Curve-Price2,SCED2 Curve-MW3,SCED2 Curve-Price3,SCED2 Curve-MW4,SCED2 Curve-Price4,SCED2 Curve-MW5,SCED2 Curve-Price5,SCED2 Curve-MW6,SCED2 Curve-Price6,SCED2 Curve-MW7,SCED2 Curve-Price7,SCED2 Curve-MW8,SCED2 Curve-Price8,SCED2 Curve-MW9,SCED2 Curve-Price9,SCED2 Curve-MW10,SCED2 Curve-Price10,SCED2 Curve-MW11,SCED2 Curve-Price11,SCED2 Curve-MW12,SCED2 Curve-Price12,SCED2 Curve-MW13,SCED2 Curve-Price13,SCED2 Curve-MW14,SCED2 Curve-Price14,SCED2 Curve-MW15,SCED2 Curve-Price15,SCED2 Curve-MW16,SCED2 Curve-Price16,SCED2 Curve-MW17,SCED2 Curve-Price17,SCED2 Curve-MW18,SCED2 Curve-Price18,SCED2 Curve-MW19,SCED2 Curve-Price19,SCED2 Curve-MW20,SCED2 Curve-Price20,SCED2 Curve-MW21,SCED2 Curve-Price21,SCED2 Curve-MW22,SCED2 Curve-Price22,SCED2 Curve-MW23,SCED2 Curve-Price23,SCED2 Curve-MW24,SCED2 Curve-Price24,SCED2 Curve-MW25,SCED2 Curve-Price25,SCED2 Curve-MW26,SCED2 Curve-Price26,SCED2 Curve-MW27,SCED2 Curve-Price27,SCED2 Curve-MW28,SCED2 Curve-Price28,SCED2 Curve-MW29,SCED2 Curve-Price29,SCED2 Curve-MW30,SCED2 Curve-Price30,SCED2 Curve-MW31,SCED2 Curve-Price31,SCED2 Curve-MW32,SCED2 Curve-Price32,SCED2 Curve-MW33,SCED2 Curve-Price33,SCED2 Curve-MW34,SCED2 Curve-Price34,SCED2 Curve-MW35,SCED2 Curve-Price35,Output Schedule,HSL,HDL,LSL,LDL,Telemetered Resource Status,Base Point,Telemetered Net Output,Ramp Rate Up,Ramp Rate Down,AS Capability REGUP,AS Capability REGDN,AS Capability ECRS,AS Capability NSPIN,AS Capability RRSPFR,AS Capability RRSFFR,AS Awards NSPIN,AS Awards RRSFFR,AS Awards RRSPFR,AS Awards RRSUFR,AS Awards ECRS,AS Awards REGUP,AS Awards REGDN,Bid_Type,Start Up Cold Offer,Start Up Hot Offer,Start Up Inter Offer,Min Gen Cost,Submitted TPO-MW1,Submitted TPO-Price1,Submitted TPO-MW2,Submitted TPO-Price2,Submitted TPO-MW3,Submitted TPO-Price3,Submitted TPO-MW4,Submitted TPO-Price4,Submitted TPO-MW5,Submitted TPO-Price5,Submitted TPO-MW6,Submitted TPO-Price6,Submitted TPO-MW7,Submitted TPO-Price7,Submitted TPO-MW8,Submitted TPO-Price8,Submitted TPO-MW9,Submitted TPO-Price9,Submitted TPO-MW10,Submitted TPO-Price10,Proxy Extension
+07/08/2026 00:00:21,N,QSUE66,Y7VSOL,7RNCHSLR_UNIT1,PVGR,0,-250,0,-10.0100002288818,139.199996948242,-10,139.199996948242,-10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,-50,0,-50,0,-10.0100002288818,139.199996948242,-10,139.199996948242,-10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,0,ON,0,0,27.84,27.84,0,0,0,0,0,0,,,,,,,,3PT,,,,,0,-10.01,139.2,-10,,,,,,,,,,,,,,,,,No
+07/08/2026 00:00:21,N,QSUE66,Y7VSOL,7RNCHSLR_UNIT2,PVGR,0,-250,0,-10.0100002288818,95.1999969482422,-10,95.1999969482422,-10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,-50,0,-50,0,-10.0100002288818,95.1999969482422,-10,95.1999969482422,-10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,0,ON,0,0,19.04,19.04,0,0,0,0,0,0,,,,,,,,3PT,,,,,0,-10.01,95.2,-10,,,,,,,,,,,,,,,,,No
+07/08/2026 00:00:21,N,QSUE66,Y7VSOL,7RNCHSLR_UNIT3,PVGR,0,-250,0,-10.0100002288818,5.59999990463257,-10,5.59999990463257,-10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,-50,0,-50,0,-10.0100002288818,5.59999990463257,-10,5.59999990463257,-10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,0,ON,0,0,1.12,1.12,0,0,0,0,0,0,,,,,,,,3PT,,,,,0,-10.01,5.6,-10,,,,,,,,,,,,,,,,,No
diff --git a/tools/inputs/history/np3-965-er--60_sced_gen_res_data-history-samples.csv b/tools/inputs/history/np3-965-er--60_sced_gen_res_data-history-samples.csv
new file mode 100644
index 00000000..49694cb6
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_gen_res_data-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Resource Name","Resource Type","SCED1 Curve-MW1","SCED1 Curve-Price1","SCED1 Curve-MW2","SCED1 Curve-Price2","SCED1 Curve-MW3","SCED1 Curve-Price3","SCED1 Curve-MW4","SCED1 Curve-Price4","SCED1 Curve-MW5","SCED1 Curve-Price5","SCED1 Curve-MW6","SCED1 Curve-Price6","SCED1 Curve-MW7","SCED1 Curve-Price7","SCED1 Curve-MW8","SCED1 Curve-Price8","SCED1 Curve-MW9","SCED1 Curve-Price9","SCED1 Curve-MW10","SCED1 Curve-Price10","SCED1 Curve-MW11","SCED1 Curve-Price11","SCED1 Curve-MW12","SCED1 Curve-Price12","SCED1 Curve-MW13","SCED1 Curve-Price13","SCED1 Curve-MW14","SCED1 Curve-Price14","SCED1 Curve-MW15","SCED1 Curve-Price15","SCED1 Curve-MW16","SCED1 Curve-Price16","SCED1 Curve-MW17","SCED1 Curve-Price17","SCED1 Curve-MW18","SCED1 Curve-Price18","SCED1 Curve-MW19","SCED1 Curve-Price19","SCED1 Curve-MW20","SCED1 Curve-Price20","SCED1 Curve-MW21","SCED1 Curve-Price21","SCED1 Curve-MW22","SCED1 Curve-Price22","SCED1 Curve-MW23","SCED1 Curve-Price23","SCED1 Curve-MW24","SCED1 Curve-Price24","SCED1 Curve-MW25","SCED1 Curve-Price25","SCED1 Curve-MW26","SCED1 Curve-Price26","SCED1 Curve-MW27","SCED1 Curve-Price27","SCED1 Curve-MW28","SCED1 Curve-Price28","SCED1 Curve-MW29","SCED1 Curve-Price29","SCED1 Curve-MW30","SCED1 Curve-Price30","SCED1 Curve-MW31","SCED1 Curve-Price31","SCED1 Curve-MW32","SCED1 Curve-Price32","SCED1 Curve-MW33","SCED1 Curve-Price33","SCED1 Curve-MW34","SCED1 Curve-Price34","SCED1 Curve-MW35","SCED1 Curve-Price35","SCED2 Curve-MW1","SCED2 Curve-Price1","SCED2 Curve-MW2","SCED2 Curve-Price2","SCED2 Curve-MW3","SCED2 Curve-Price3","SCED2 Curve-MW4","SCED2 Curve-Price4","SCED2 Curve-MW5","SCED2 Curve-Price5","SCED2 Curve-MW6","SCED2 Curve-Price6","SCED2 Curve-MW7","SCED2 Curve-Price7","SCED2 Curve-MW8","SCED2 Curve-Price8","SCED2 Curve-MW9","SCED2 Curve-Price9","SCED2 Curve-MW10","SCED2 Curve-Price10","SCED2 Curve-MW11","SCED2 Curve-Price11","SCED2 Curve-MW12","SCED2 Curve-Price12","SCED2 Curve-MW13","SCED2 Curve-Price13","SCED2 Curve-MW14","SCED2 Curve-Price14","SCED2 Curve-MW15","SCED2 Curve-Price15","SCED2 Curve-MW16","SCED2 Curve-Price16","SCED2 Curve-MW17","SCED2 Curve-Price17","SCED2 Curve-MW18","SCED2 Curve-Price18","SCED2 Curve-MW19","SCED2 Curve-Price19","SCED2 Curve-MW20","SCED2 Curve-Price20","SCED2 Curve-MW21","SCED2 Curve-Price21","SCED2 Curve-MW22","SCED2 Curve-Price22","SCED2 Curve-MW23","SCED2 Curve-Price23","SCED2 Curve-MW24","SCED2 Curve-Price24","SCED2 Curve-MW25","SCED2 Curve-Price25","SCED2 Curve-MW26","SCED2 Curve-Price26","SCED2 Curve-MW27","SCED2 Curve-Price27","SCED2 Curve-MW28","SCED2 Curve-Price28","SCED2 Curve-MW29","SCED2 Curve-Price29","SCED2 Curve-MW30","SCED2 Curve-Price30","SCED2 Curve-MW31","SCED2 Curve-Price31","SCED2 Curve-MW32","SCED2 Curve-Price32","SCED2 Curve-MW33","SCED2 Curve-Price33","SCED2 Curve-MW34","SCED2 Curve-Price34","SCED2 Curve-MW35","SCED2 Curve-Price35","Output Schedule","HSL","HASL","HDL","LSL","LASL","LDL","Telemetered Resource Status","Base Point","Telemetered Net Output ","Ancillary Service REGUP","Ancillary Service REGDN","Ancillary Service RRS","Ancillary Service NSRS","Bid_Type","Start Up Cold Offer","Start Up Hot Offer","Start Up Inter Offer","Min Gen Cost","Submitted TPO-MW1","Submitted TPO-Price1","Submitted TPO-MW2","Submitted TPO-Price2","Submitted TPO-MW3","Submitted TPO-Price3","Submitted TPO-MW4","Submitted TPO-Price4","Submitted TPO-MW5","Submitted TPO-Price5","Submitted TPO-MW6","Submitted TPO-Price6","Submitted TPO-MW7","Submitted TPO-Price7","Submitted TPO-MW8","Submitted TPO-Price8","Submitted TPO-MW9","Submitted TPO-Price9","Submitted TPO-MW10","Submitted TPO-Price10","Proxy Extension"
+"03/02/2014 00:00:14","N","AMISTAD_AMISTAG1","HYDRO","0","-250",".00999999977648258","4999.990234375","28","5000","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","-250",".00999999977648258","4999.990234375","28","5000","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","28","28","0","10","10","0","EMR","0","0","0","0","0","0","","","","","","","","","","","","","","","","","","","","","","","","","","No"
+"03/02/2014 00:00:14","N","AMISTAD_AMISTAG2","HYDRO","0","-250","10","-250","25","-249.990005493164","25.0100002288818","4999.990234375","28","5000","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","-250","10","-250","25","-249.990005493164","25.0100002288818","4999.990234375","28","5000","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","25","28","28","28","10","10","28","STARTUP","28","12.55103","0","0","0","0","","","","","","","","","","","","","","","","","","","","","","","","","","Yes"
+"03/02/2014 00:00:14","N","AMOCOOIL_CC1_1","CCGT90","0","-250","0","5000","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","-50","0","-50","0","5000","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","OFF","0","0","0","0","0","0","","","","","","","","","","","","","","","","","","","","","","","","","","No"
diff --git a/tools/inputs/history/np3-965-er--60_sced_qse_self_arranged_as-history-current.csv b/tools/inputs/history/np3-965-er--60_sced_qse_self_arranged_as-history-current.csv
new file mode 100644
index 00000000..97e99997
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_qse_self_arranged_as-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,REGUP,REGDN,NSPIN,NSPNM,RRSPFR,RRSFFR,RRSUFR,ECRSS,ECRSM
+07/08/2026 00:00:21,N,QAEN,13.3,0,61.7,,74.5,0,0,0,0
+07/08/2026 00:00:21,N,QALTRE,,,15,,15,0,17.1,,
+07/08/2026 00:00:21,N,QAMA,,,,,5,0,0,,
diff --git a/tools/inputs/history/np3-965-er--60_sced_qse_self_arranged_as-history-samples.csv b/tools/inputs/history/np3-965-er--60_sced_qse_self_arranged_as-history-samples.csv
new file mode 100644
index 00000000..047de5f2
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_qse_self_arranged_as-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","QSE","REGUP","REGDN","NSPIN","RRSGN","RRSLD","RRSNC"
+"03/02/2014 02:15:09","N","QEAGL1","9.9","9.4","6","12","0","45"
+"03/02/2014 14:15:08","N","QEDF7","0","0","","0","0","6"
+"03/02/2014 04:15:06","N","QAEN","14.9","0","0","60","0","0"
diff --git a/tools/inputs/history/np3-965-er--60_sced_smne_gen_res-history-current.csv b/tools/inputs/history/np3-965-er--60_sced_smne_gen_res-history-current.csv
new file mode 100644
index 00000000..558a6a09
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_smne_gen_res-history-current.csv
@@ -0,0 +1,4 @@
+Interval Time,Interval Number,Resource Code,Interval Value
+07/08/2026 00:14:59,1,19599_1_PV_A1,0
+07/08/2026 00:14:59,1,19599_2_PV_2,0
+07/08/2026 00:14:59,1,19599_PV_A,0
diff --git a/tools/inputs/history/np3-965-er--60_sced_smne_gen_res-history-samples.csv b/tools/inputs/history/np3-965-er--60_sced_smne_gen_res-history-samples.csv
new file mode 100644
index 00000000..b7e61cf2
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60_sced_smne_gen_res-history-samples.csv
@@ -0,0 +1,4 @@
+"Interval Time","Interval Number","Resource Code","Interval Value"
+"03/02/2014 00:14:59","1","ACACIA_UNIT_1","0"
+"03/02/2014 00:14:59","1","AMISTAD_AMISTAG1","0"
+"03/02/2014 00:14:59","1","AMISTAD_AMISTAG2","6.175434"
diff --git a/tools/inputs/history/np3-965-er--60d_sced_as_cap_man_override-history-as-override.csv b/tools/inputs/history/np3-965-er--60d_sced_as_cap_man_override-history-as-override.csv
new file mode 100644
index 00000000..77efa619
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60d_sced_as_cap_man_override-history-as-override.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,Start Timestamp,End Timestamp,Participant Name,Resource Name,AS Type,AS Capability Limit,Derated Qty,Reason Code
+04/15/2026 12:13:14,N,04/15/2026 12:03:39,04/15/2026 23:59:01,QTEN26,FTDUNCAN_ESR1,REGDN,0,200,
+04/15/2026 12:13:14,N,04/15/2026 12:09:28,04/15/2026 23:59:01,QTEN36,TSECA_ES_ESR1,REGDN,0,200,
+04/15/2026 12:13:14,N,04/15/2026 12:07:54,04/15/2026 23:59:01,QSUE74,PUEBLO_ESR1,REGDN,0,15,
diff --git a/tools/inputs/history/np3-965-er--60d_sced_as_cap_man_override-history-current.csv b/tools/inputs/history/np3-965-er--60d_sced_as_cap_man_override-history-current.csv
new file mode 100644
index 00000000..bfe8c689
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60d_sced_as_cap_man_override-history-current.csv
@@ -0,0 +1 @@
+SCED Timestamp,Repeated Hour Flag,Start Timestamp,End Timestamp,Participant Name,Resource Name,AS Type,AS Capability Limit,Derated Qty,Reason Code
diff --git a/tools/inputs/history/np3-965-er--60d_sced_as_offer_updates-history-current.csv b/tools/inputs/history/np3-965-er--60d_sced_as_offer_updates-history-current.csv
new file mode 100644
index 00000000..ec7606a0
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60d_sced_as_offer_updates-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,Delivery Hour,Resource Name,AS Type,Count of Updates During Operating Period
+07/08/2026,1,AE_ESR1,ONRES,10
+07/08/2026,1,ALAMO_ST_ESR1,ONRES,1
+07/08/2026,1,ALAMO_ST_ESR1,REGDN,1
diff --git a/tools/inputs/history/np3-965-er--60d_sced_esr_data-history-current.csv b/tools/inputs/history/np3-965-er--60d_sced_esr_data-history-current.csv
new file mode 100644
index 00000000..3c2f5198
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60d_sced_esr_data-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,DME,Resource Name,Resource Type,SCED1 Curve-MW1,SCED1 Curve-Price1,SCED1 Curve-MW2,SCED1 Curve-Price2,SCED1 Curve-MW3,SCED1 Curve-Price3,SCED1 Curve-MW4,SCED1 Curve-Price4,SCED1 Curve-MW5,SCED1 Curve-Price5,SCED1 Curve-MW6,SCED1 Curve-Price6,SCED1 Curve-MW7,SCED1 Curve-Price7,SCED1 Curve-MW8,SCED1 Curve-Price8,SCED1 Curve-MW9,SCED1 Curve-Price9,SCED1 Curve-MW10,SCED1 Curve-Price10,SCED1 Curve-MW11,SCED1 Curve-Price11,SCED1 Curve-MW12,SCED1 Curve-Price12,SCED1 Curve-MW13,SCED1 Curve-Price13,SCED1 Curve-MW14,SCED1 Curve-Price14,SCED1 Curve-MW15,SCED1 Curve-Price15,SCED1 Curve-MW16,SCED1 Curve-Price16,SCED1 Curve-MW17,SCED1 Curve-Price17,SCED1 Curve-MW18,SCED1 Curve-Price18,SCED1 Curve-MW19,SCED1 Curve-Price19,SCED1 Curve-MW20,SCED1 Curve-Price20,SCED1 Curve-MW21,SCED1 Curve-Price21,SCED1 Curve-MW22,SCED1 Curve-Price22,SCED1 Curve-MW23,SCED1 Curve-Price23,SCED1 Curve-MW24,SCED1 Curve-Price24,SCED1 Curve-MW25,SCED1 Curve-Price25,SCED1 Curve-MW26,SCED1 Curve-Price26,SCED1 Curve-MW27,SCED1 Curve-Price27,SCED1 Curve-MW28,SCED1 Curve-Price28,SCED1 Curve-MW29,SCED1 Curve-Price29,SCED1 Curve-MW30,SCED1 Curve-Price30,SCED1 Curve-MW31,SCED1 Curve-Price31,SCED1 Curve-MW32,SCED1 Curve-Price32,SCED1 Curve-MW33,SCED1 Curve-Price33,SCED1 Curve-MW34,SCED1 Curve-Price34,SCED1 Curve-MW35,SCED1 Curve-Price35,SCED2 Curve-MW1,SCED2 Curve-Price1,SCED2 Curve-MW2,SCED2 Curve-Price2,SCED2 Curve-MW3,SCED2 Curve-Price3,SCED2 Curve-MW4,SCED2 Curve-Price4,SCED2 Curve-MW5,SCED2 Curve-Price5,SCED2 Curve-MW6,SCED2 Curve-Price6,SCED2 Curve-MW7,SCED2 Curve-Price7,SCED2 Curve-MW8,SCED2 Curve-Price8,SCED2 Curve-MW9,SCED2 Curve-Price9,SCED2 Curve-MW10,SCED2 Curve-Price10,SCED2 Curve-MW11,SCED2 Curve-Price11,SCED2 Curve-MW12,SCED2 Curve-Price12,SCED2 Curve-MW13,SCED2 Curve-Price13,SCED2 Curve-MW14,SCED2 Curve-Price14,SCED2 Curve-MW15,SCED2 Curve-Price15,SCED2 Curve-MW16,SCED2 Curve-Price16,SCED2 Curve-MW17,SCED2 Curve-Price17,SCED2 Curve-MW18,SCED2 Curve-Price18,SCED2 Curve-MW19,SCED2 Curve-Price19,SCED2 Curve-MW20,SCED2 Curve-Price20,SCED2 Curve-MW21,SCED2 Curve-Price21,SCED2 Curve-MW22,SCED2 Curve-Price22,SCED2 Curve-MW23,SCED2 Curve-Price23,SCED2 Curve-MW24,SCED2 Curve-Price24,SCED2 Curve-MW25,SCED2 Curve-Price25,SCED2 Curve-MW26,SCED2 Curve-Price26,SCED2 Curve-MW27,SCED2 Curve-Price27,SCED2 Curve-MW28,SCED2 Curve-Price28,SCED2 Curve-MW29,SCED2 Curve-Price29,SCED2 Curve-MW30,SCED2 Curve-Price30,SCED2 Curve-MW31,SCED2 Curve-Price31,SCED2 Curve-MW32,SCED2 Curve-Price32,SCED2 Curve-MW33,SCED2 Curve-Price33,SCED2 Curve-MW34,SCED2 Curve-Price34,SCED2 Curve-MW35,SCED2 Curve-Price35,Output Schedule,HSL,HDL,LSL,LDL,Telemetered Resource Status,Base Point,Telemetered Net Output,Ramp Rate Up,Ramp Rate Down,AS Capability REGUP,AS Capability REGDN,AS Capability ECRS,AS Capability NSPIN,AS Capability RRSPFR,AS Capability RRSFFR,State of Charge,Minimum SOC,Maximum SOC,AS Awards NSPIN,AS Awards RRSFFR,AS Awards RRSPFR,AS Awards RRSUFR,AS Awards ECRS,AS Awards REGUP,AS Awards REGDN,Bid_Type,Start Up Cold Offer,Start Up Hot Offer,Start Up Inter Offer,Min Gen Cost,Submitted TPO-MW1,Submitted TPO-Price1,Submitted TPO-MW2,Submitted TPO-Price2,Submitted TPO-MW3,Submitted TPO-Price3,Submitted TPO-MW4,Submitted TPO-Price4,Submitted TPO-MW5,Submitted TPO-Price5,Submitted TPO-MW6,Submitted TPO-Price6,Submitted TPO-MW7,Submitted TPO-Price7,Submitted TPO-MW8,Submitted TPO-Price8,Submitted TPO-MW9,Submitted TPO-Price9,Submitted TPO-MW10,Submitted TPO-Price10,Proxy Extension
+07/08/2026 00:00:21,N,QMP2M1,YDIST,ABINDUST_ESR1,ESR,-8.5,4.19999980926514,-4.69999980926514,7.8899998664856,-1.5,10.8900003433228,1.60000002384186,23.6800003051758,1.60000002384186,56.4599990844727,3.40000009536743,68.5199966430664,5.30000019073486,70.6600036621094,7.40000009536743,73.0100021362305,9.89999961853027,75.9000015258789,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-8.5,4.19999980926514,-4.69999980926514,7.8899998664856,-1.5,10.8900003433228,1.60000002384186,23.6800003051758,1.60000002384186,56.4599990844727,3.40000009536743,68.5199966430664,5.30000019073486,70.6600036621094,7.40000009536743,73.0100021362305,9.89999961853027,75.9000015258789,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,9.9,9.89999961853027,-8.5,-8.5,ON,1.59999990463257,1.19753,1.98,1.98,1.98,1.98,.99,.33,0,0,.244,0,25.9,,,,,,,,3PT,,,,,-8.5,4.2,-4.7,7.89,-1.5,10.89,1.6,23.68,1.6,56.46,3.4,68.52,5.3,70.66,7.4,73.01,9.9,75.9,,,No
+07/08/2026 00:00:21,N,QTEN26,YLIB1S,ADL_ESR1,ESR,-60,-3.29999995231628,0,16.7000007629395,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-60,-3.29999995231628,0,16.7000007629395,0,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,-60,-60,ON,0,-.65,60,60,24,24,5.8,.4833,120,0,5.59,5.59,59.99,,,,,,,,3PT,,,,,-60,-3.3,0,16.7,0,2000,.1,2000,,,,,,,,,,,,,No
+07/08/2026 00:00:21,N,QTEN26,YWINMI,AE_ESR1,ESR,-9.89999961853027,-250,-4,-250,-4,17.2800006866455,0,17.2800006866455,0,43.2999992370605,.5,43.2999992370605,.5,2000,.5,2000,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-9.89999961853027,-250,-4,-250,-4,17.2800006866455,0,17.2800006866455,0,43.2999992370605,.5,43.2999992370605,.5,2000,9.89999961853027,2000,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,9.9,9.89999961853027,-9.9,-9.89999961853027,ON,0,-3.6,576,576,3.96,3.96,1.98,.0867,19.8,0,3.8943,0,19.47,,,,,,,,3PT,,,,,-9.9,-250,-4,-250,-4,17.28,0,17.28,0,43.3,.5,43.3,.5,2000,9.9,2000,,,,,No
diff --git a/tools/inputs/history/np3-965-er--60d_sced_resource_as_offers-history-current.csv b/tools/inputs/history/np3-965-er--60d_sced_resource_as_offers-history-current.csv
new file mode 100644
index 00000000..334ee6f7
--- /dev/null
+++ b/tools/inputs/history/np3-965-er--60d_sced_resource_as_offers-history-current.csv
@@ -0,0 +1,4 @@
+SCED Timestamp,Repeated Hour Flag,Resource Name,PRICE1_REGUP,PRICE1_REGDN,PRICE1_RRSPFR,PRICE1_RRSUFR,PRICE1_RRSFFR,PRICE1_NSPIN,PRICE1_ECRS,QUANTITY_MW1,PRICE2_REGUP,PRICE2_REGDN,PRICE2_RRSPFR,PRICE2_RRSUFR,PRICE2_RRSFFR,PRICE2_NSPIN,PRICE2_ECRS,QUANTITY_MW2,PRICE3_REGUP,PRICE3_REGDN,PRICE3_RRSPFR,PRICE3_RRSUFR,PRICE3_RRSFFR,PRICE3_NSPIN,PRICE3_ECRS,QUANTITY_MW3,PRICE4_REGUP,PRICE4_REGDN,PRICE4_RRSPFR,PRICE4_RRSUFR,PRICE4_RRSFFR,PRICE4_NSPIN,PRICE4_ECRS,QUANTITY_MW4,PRICE5_REGUP,PRICE5_REGDN,PRICE5_RRSPFR,PRICE5_RRSUFR,PRICE5_RRSFFR,PRICE5_NSPIN,PRICE5_ECRS,QUANTITY_MW5,PRICE6_REGUP,PRICE6_REGDN,PRICE6_RRSPFR,PRICE6_RRSUFR,PRICE6_RRSFFR,PRICE6_NSPIN,PRICE6_ECRS,QUANTITY_MW6,Offer Type
+07/08/2026 00:00:21,N,7RNCHSLR_UNIT1,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,OFFNS
+07/08/2026 00:00:21,N,7RNCHSLR_UNIT1,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,ONRES
+07/08/2026 00:00:21,N,7RNCHSLR_UNIT1,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,,,,,,,,0,REGDN
diff --git a/tools/inputs/history/np3-965-er-60_load_res_data_in_sced-2020.csv b/tools/inputs/history/np3-965-er-60_load_res_data_in_sced-2020.csv
new file mode 100644
index 00000000..70d6aa91
--- /dev/null
+++ b/tools/inputs/history/np3-965-er-60_load_res_data_in_sced-2020.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Resource Name,Telemetered Resource Status,Max Power Consumption,Low Power Consumption,Real Power Consumption,AS Responsibility for RRS,AS Responsibility for NonSpin,AS Responsibility for RegUp,AS Responsibility for RegDown,SCED Bid to Buy Curve-MW1,SCED Bid to Buy Curve-Price1,SCED Bid to Buy Curve-MW2,SCED Bid to Buy Curve-Price2,SCED Bid to Buy Curve-MW3,SCED Bid to Buy Curve-Price3,SCED Bid to Buy Curve-MW4,SCED Bid to Buy Curve-Price4,SCED Bid to Buy Curve-MW5,SCED Bid to Buy Curve-Price5,SCED Bid to Buy Curve-MW6,SCED Bid to Buy Curve-Price6,SCED Bid to Buy Curve-MW7,SCED Bid to Buy Curve-Price7,SCED Bid to Buy Curve-MW8,SCED Bid to Buy Curve-Price8,SCED Bid to Buy Curve-MW9,SCED Bid to Buy Curve-Price9,SCED Bid to Buy Curve-MW10,SCED Bid to Buy Curve-Price10,SCED Bid to Buy Curve-MW11,SCED Bid to Buy Curve-Price11,SCED Bid to Buy Curve-MW12,SCED Bid to Buy Curve-Price12,SCED Bid to Buy Curve-MW13,SCED Bid to Buy Curve-Price13,SCED Bid to Buy Curve-MW14,SCED Bid to Buy Curve-Price14,SCED Bid to Buy Curve-MW15,SCED Bid to Buy Curve-Price15,SCED Bid to Buy Curve-MW16,SCED Bid to Buy Curve-Price16,SCED Bid to Buy Curve-MW17,SCED Bid to Buy Curve-Price17,SCED Bid to Buy Curve-MW18,SCED Bid to Buy Curve-Price18,SCED Bid to Buy Curve-MW19,SCED Bid to Buy Curve-Price19,SCED Bid to Buy Curve-MW20,SCED Bid to Buy Curve-Price20,SCED Bid to Buy Curve-MW21,SCED Bid to Buy Curve-Price21,SCED Bid to Buy Curve-MW22,SCED Bid to Buy Curve-Price22,SCED Bid to Buy Curve-MW23,SCED Bid to Buy Curve-Price23,SCED Bid to Buy Curve-MW24,SCED Bid to Buy Curve-Price24,SCED Bid to Buy Curve-MW25,SCED Bid to Buy Curve-Price25,SCED Bid to Buy Curve-MW26,SCED Bid to Buy Curve-Price26,SCED Bid to Buy Curve-MW27,SCED Bid to Buy Curve-Price27,SCED Bid to Buy Curve-MW28,SCED Bid to Buy Curve-Price28,SCED Bid to Buy Curve-MW29,SCED Bid to Buy Curve-Price29,SCED Bid to Buy Curve-MW30,SCED Bid to Buy Curve-Price30,SCED Bid to Buy Curve-MW31,SCED Bid to Buy Curve-Price31,SCED Bid to Buy Curve-MW32,SCED Bid to Buy Curve-Price32,SCED Bid to Buy Curve-MW33,SCED Bid to Buy Curve-Price33,SCED Bid to Buy Curve-MW34,SCED Bid to Buy Curve-Price34,SCED Bid to Buy Curve-MW35,SCED Bid to Buy Curve-Price35,HASL,HDL,LASL,LDL,Base Point
+12/02/2019 00:00:22,N,ACRLY_LD1,ONRL,.4,0,.3,.1,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,
+12/02/2019 00:00:22,N,ADK_LD1,ONRL,10,0,1.3,.8,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,
+12/02/2019 00:00:22,N,ADMDS_LD1,OUTL,5.3,5.4,5.3,0,0,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,
diff --git a/tools/inputs/history/np3-965-er-60_load_res_data_in_sced-2023.csv b/tools/inputs/history/np3-965-er-60_load_res_data_in_sced-2023.csv
new file mode 100644
index 00000000..447125bc
--- /dev/null
+++ b/tools/inputs/history/np3-965-er-60_load_res_data_in_sced-2023.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,DME,Resource Name,Telemetered Resource Status,Max Power Consumption,Low Power Consumption,Real Power Consumption,AS Responsibility for RRS,AS Responsibility for RRSFFR,AS Responsibility for NonSpin,AS Responsibility for RegUp,AS Responsibility for RegDown,AS Responsibility for ECRS,SCED Bid to Buy Curve-MW1,SCED Bid to Buy Curve-Price1,SCED Bid to Buy Curve-MW2,SCED Bid to Buy Curve-Price2,SCED Bid to Buy Curve-MW3,SCED Bid to Buy Curve-Price3,SCED Bid to Buy Curve-MW4,SCED Bid to Buy Curve-Price4,SCED Bid to Buy Curve-MW5,SCED Bid to Buy Curve-Price5,SCED Bid to Buy Curve-MW6,SCED Bid to Buy Curve-Price6,SCED Bid to Buy Curve-MW7,SCED Bid to Buy Curve-Price7,SCED Bid to Buy Curve-MW8,SCED Bid to Buy Curve-Price8,SCED Bid to Buy Curve-MW9,SCED Bid to Buy Curve-Price9,SCED Bid to Buy Curve-MW10,SCED Bid to Buy Curve-Price10,HASL,HDL,LASL,LDL,Base Point
+07/02/2023 00:00:25,N,QEDE20,,AAPIPLNC_LD3,ONRL,12,9.2,10.8,3.6,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,0,0,0,0,
+07/02/2023 00:00:25,N,QEDE20,,AAPIPLNC_LD4,ONRL,15,4.5,6.3,1.8,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,0,0,0,0,
+07/02/2023 00:00:25,N,QLANCI,,ADK_LD2,OUTL,0,0,0,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,,,0,0,0,0,
diff --git a/tools/inputs/history/np3-965-er-60_sced_gen_res_data-2023.csv b/tools/inputs/history/np3-965-er-60_sced_gen_res_data-2023.csv
new file mode 100644
index 00000000..5696c484
--- /dev/null
+++ b/tools/inputs/history/np3-965-er-60_sced_gen_res_data-2023.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,DME,Resource Name,Resource Type,SCED1 Curve-MW1,SCED1 Curve-Price1,SCED1 Curve-MW2,SCED1 Curve-Price2,SCED1 Curve-MW3,SCED1 Curve-Price3,SCED1 Curve-MW4,SCED1 Curve-Price4,SCED1 Curve-MW5,SCED1 Curve-Price5,SCED1 Curve-MW6,SCED1 Curve-Price6,SCED1 Curve-MW7,SCED1 Curve-Price7,SCED1 Curve-MW8,SCED1 Curve-Price8,SCED1 Curve-MW9,SCED1 Curve-Price9,SCED1 Curve-MW10,SCED1 Curve-Price10,SCED1 Curve-MW11,SCED1 Curve-Price11,SCED1 Curve-MW12,SCED1 Curve-Price12,SCED1 Curve-MW13,SCED1 Curve-Price13,SCED1 Curve-MW14,SCED1 Curve-Price14,SCED1 Curve-MW15,SCED1 Curve-Price15,SCED1 Curve-MW16,SCED1 Curve-Price16,SCED1 Curve-MW17,SCED1 Curve-Price17,SCED1 Curve-MW18,SCED1 Curve-Price18,SCED1 Curve-MW19,SCED1 Curve-Price19,SCED1 Curve-MW20,SCED1 Curve-Price20,SCED1 Curve-MW21,SCED1 Curve-Price21,SCED1 Curve-MW22,SCED1 Curve-Price22,SCED1 Curve-MW23,SCED1 Curve-Price23,SCED1 Curve-MW24,SCED1 Curve-Price24,SCED1 Curve-MW25,SCED1 Curve-Price25,SCED1 Curve-MW26,SCED1 Curve-Price26,SCED1 Curve-MW27,SCED1 Curve-Price27,SCED1 Curve-MW28,SCED1 Curve-Price28,SCED1 Curve-MW29,SCED1 Curve-Price29,SCED1 Curve-MW30,SCED1 Curve-Price30,SCED1 Curve-MW31,SCED1 Curve-Price31,SCED1 Curve-MW32,SCED1 Curve-Price32,SCED1 Curve-MW33,SCED1 Curve-Price33,SCED1 Curve-MW34,SCED1 Curve-Price34,SCED1 Curve-MW35,SCED1 Curve-Price35,SCED2 Curve-MW1,SCED2 Curve-Price1,SCED2 Curve-MW2,SCED2 Curve-Price2,SCED2 Curve-MW3,SCED2 Curve-Price3,SCED2 Curve-MW4,SCED2 Curve-Price4,SCED2 Curve-MW5,SCED2 Curve-Price5,SCED2 Curve-MW6,SCED2 Curve-Price6,SCED2 Curve-MW7,SCED2 Curve-Price7,SCED2 Curve-MW8,SCED2 Curve-Price8,SCED2 Curve-MW9,SCED2 Curve-Price9,SCED2 Curve-MW10,SCED2 Curve-Price10,SCED2 Curve-MW11,SCED2 Curve-Price11,SCED2 Curve-MW12,SCED2 Curve-Price12,SCED2 Curve-MW13,SCED2 Curve-Price13,SCED2 Curve-MW14,SCED2 Curve-Price14,SCED2 Curve-MW15,SCED2 Curve-Price15,SCED2 Curve-MW16,SCED2 Curve-Price16,SCED2 Curve-MW17,SCED2 Curve-Price17,SCED2 Curve-MW18,SCED2 Curve-Price18,SCED2 Curve-MW19,SCED2 Curve-Price19,SCED2 Curve-MW20,SCED2 Curve-Price20,SCED2 Curve-MW21,SCED2 Curve-Price21,SCED2 Curve-MW22,SCED2 Curve-Price22,SCED2 Curve-MW23,SCED2 Curve-Price23,SCED2 Curve-MW24,SCED2 Curve-Price24,SCED2 Curve-MW25,SCED2 Curve-Price25,SCED2 Curve-MW26,SCED2 Curve-Price26,SCED2 Curve-MW27,SCED2 Curve-Price27,SCED2 Curve-MW28,SCED2 Curve-Price28,SCED2 Curve-MW29,SCED2 Curve-Price29,SCED2 Curve-MW30,SCED2 Curve-Price30,SCED2 Curve-MW31,SCED2 Curve-Price31,SCED2 Curve-MW32,SCED2 Curve-Price32,SCED2 Curve-MW33,SCED2 Curve-Price33,SCED2 Curve-MW34,SCED2 Curve-Price34,SCED2 Curve-MW35,SCED2 Curve-Price35,Output Schedule,HSL,HASL,HDL,LSL,LASL,LDL,Telemetered Resource Status,Base Point,Telemetered Net Output ,Ancillary Service REGUP,Ancillary Service REGDN,Ancillary Service RRS,Ancillary Service RRSFFR,Ancillary Service NSRS,Ancillary Service ECRS,Bid_Type,Start Up Cold Offer,Start Up Hot Offer,Start Up Inter Offer,Min Gen Cost,Submitted TPO-MW1,Submitted TPO-Price1,Submitted TPO-MW2,Submitted TPO-Price2,Submitted TPO-MW3,Submitted TPO-Price3,Submitted TPO-MW4,Submitted TPO-Price4,Submitted TPO-MW5,Submitted TPO-Price5,Submitted TPO-MW6,Submitted TPO-Price6,Submitted TPO-MW7,Submitted TPO-Price7,Submitted TPO-MW8,Submitted TPO-Price8,Submitted TPO-MW9,Submitted TPO-Price9,Submitted TPO-MW10,Submitted TPO-Price10,Proxy Extension
+07/02/2023 00:00:25,N,QGOLDN,YGOLDE,AEEC_ANTLP_1,DSL,0,-250,30,-250,30,25.8999996185303,36,26.5200004577637,38,26.7199993133545,40,26.9300003051758,42,27.1399993896484,44,27.3400001525879,46,27.5499992370605,48,27.75,50,27.9599990844727,50.9000015258789,28.0499992370605,50.9000015258789,28.0499992370605,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,-20,30,-20,30,25.8999996185303,36,26.5200004577637,38,26.7199993133545,40,26.9300003051758,42,27.1399993896484,44,27.3400001525879,46,27.5499992370605,48,27.75,50,27.9599990844727,50.9000015258789,28.0499992370605,50.9000015258789,28.0499992370605,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,50,50,0,30,30,0,OFF,0,0,0,0,0,0,0,0,3PT,172.5,172.5,172.5,36.35,30,25.9,36,26.52,38,26.72,40,26.93,42,27.14,44,27.34,46,27.55,48,27.75,50,27.96,50.9,28.05,No
+07/02/2023 00:00:25,N,QGOLDN,YGOLDE,AEEC_ANTLP_2,DSL,0,-250,30,-250,30,26.6299991607666,36,27.2700004577637,38,27.4799995422363,40,27.7000007629395,42,27.9099998474121,44,28.1299991607666,46,28.3400001525879,48,28.5499992370605,50,28.7700004577637,50.9000015258789,28.8600006103516,50.9000015258789,28.8600006103516,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,-20,30,-20,30,26.6299991607666,36,27.2700004577637,38,27.4799995422363,40,27.7000007629395,42,27.9099998474121,44,28.1299991607666,46,28.3400001525879,48,28.5499992370605,50,28.7700004577637,50.9000015258789,28.8600006103516,50.9000015258789,28.8600006103516,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,50,50,0,30,30,0,OFF,0,0,0,0,0,0,0,0,3PT,115,115,115,37.43,30,26.63,36,27.27,38,27.48,40,27.7,42,27.91,44,28.13,46,28.34,48,28.55,50,28.77,50.9,28.86,No
+07/02/2023 00:00:25,N,QGOLDN,YGOLDE,AEEC_ANTLP_3,DSL,0,-250,30,-250,30,26.6299991607666,36,27.2700004577637,38,27.4799995422363,40,27.7000007629395,42,27.9099998474121,44,28.1299991607666,46,28.3400001525879,48,28.5499992370605,50,28.7700004577637,50.9000015258789,28.8600006103516,50.9000015258789,28.8600006103516,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,-20,30,-20,30,26.6299991607666,36,27.2700004577637,38,27.4799995422363,40,27.7000007629395,42,27.9099998474121,44,28.1299991607666,46,28.3400001525879,48,28.5499992370605,50,28.7700004577637,50.9000015258789,28.8600006103516,50.9000015258789,28.8600006103516,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,50,50,0,30,30,0,OFF,0,0,0,0,0,0,0,0,3PT,57.5,57.5,57.5,37.43,30,26.63,36,27.27,38,27.48,40,27.7,42,27.91,44,28.13,46,28.34,48,28.55,50,28.77,50.9,28.86,No
diff --git a/tools/inputs/history/np3-965-er-60_sced_qse_self_arranged_as-2020.csv b/tools/inputs/history/np3-965-er-60_sced_qse_self_arranged_as-2020.csv
new file mode 100644
index 00000000..0f7d3663
--- /dev/null
+++ b/tools/inputs/history/np3-965-er-60_sced_qse_self_arranged_as-2020.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,REGUP,REGDN,NSPIN,RRSGN,RRSLD,RRSNC
+12/02/2019 00 :00 :22,N,QAEN,7.8,9.6,42.1,65,0,25
+12/02/2019 00 :00 :22,N,QALTRE,,,,0,0,27
+12/02/2019 00 :00 :22,N,QBPEC5,,,,0,0,5
diff --git a/tools/inputs/history/np3-965-er-60_sced_qse_self_arranged_as-2023.csv b/tools/inputs/history/np3-965-er-60_sced_qse_self_arranged_as-2023.csv
new file mode 100644
index 00000000..1baa5ffd
--- /dev/null
+++ b/tools/inputs/history/np3-965-er-60_sced_qse_self_arranged_as-2023.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,QSE,REGUP,REGDN,NSPIN,NSPNM,RRSPFR,RRSFFR,RRSUFR,ECRSS,ECRSM
+07/02/2023 00 :00 :25,N,QACCEN,,,,,1,0,0,,
+07/02/2023 00 :00 :25,N,QAEN,0,17.5,150,0,0,0,20,,
+07/02/2023 00 :00 :25,N,QAFFOR,,,2,,0,0,3,,
diff --git a/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-current.csv b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-current.csv
new file mode 100644
index 00000000..fe7c4a45
--- /dev/null
+++ b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-current.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Resource Name,LMP,50xFIP,SCED2 Curve-MW1,SCED2 Curve-Price1,SCED2 Curve-MW2,SCED2 Curve-Price2,SCED2 Curve-MW3,SCED2 Curve-Price3,SCED2 Curve-MW4,SCED2 Curve-Price4,SCED2 Curve-MW5,SCED2 Curve-Price5,SCED2 Curve-MW6,SCED2 Curve-Price6,SCED2 Curve-MW7,SCED2 Curve-Price7,SCED2 Curve-MW8,SCED2 Curve-Price8,SCED2 Curve-MW9,SCED2 Curve-Price9,SCED2 Curve-MW10,SCED2 Curve-Price10,SCED2 Curve-MW11,SCED2 Curve-Price11,SCED2 Curve-MW12,SCED2 Curve-Price12,SCED2 Curve-MW13,SCED2 Curve-Price13,SCED2 Curve-MW14,SCED2 Curve-Price14,SCED2 Curve-MW15,SCED2 Curve-Price15,SCED2 Curve-MW16,SCED2 Curve-Price16,SCED2 Curve-MW17,SCED2 Curve-Price17,SCED2 Curve-MW18,SCED2 Curve-Price18,SCED2 Curve-MW19,SCED2 Curve-Price19,SCED2 Curve-MW20,SCED2 Curve-Price20,SCED2 Curve-MW21,SCED2 Curve-Price21,SCED2 Curve-MW22,SCED2 Curve-Price22,SCED2 Curve-MW23,SCED2 Curve-Price23,SCED2 Curve-MW24,SCED2 Curve-Price24,SCED2 Curve-MW25,SCED2 Curve-Price25,SCED2 Curve-MW26,SCED2 Curve-Price26,SCED2 Curve-MW27,SCED2 Curve-Price27,SCED2 Curve-MW28,SCED2 Curve-Price28,SCED2 Curve-MW29,SCED2 Curve-Price29,SCED2 Curve-MW30,SCED2 Curve-Price30,SCED2 Curve-MW31,SCED2 Curve-Price31,SCED2 Curve-MW32,SCED2 Curve-Price32,SCED2 Curve-MW33,SCED2 Curve-Price33,SCED2 Curve-MW34,SCED2 Curve-Price34,SCED2 Curve-MW35,SCED2 Curve-Price35,Bid Type,Submitted TPO-MW1,Submitted TPO-Price1,Submitted TPO-MW2,Submitted TPO-Price2,Submitted TPO-MW3,Submitted TPO-Price3,Submitted TPO-MW4,Submitted TPO-Price4,Submitted TPO-MW5,Submitted TPO-Price5,Submitted TPO-MW6,Submitted TPO-Price6,Submitted TPO-MW7,Submitted TPO-Price7,Submitted TPO-MW8,Submitted TPO-Price8,Submitted TPO-MW9,Submitted TPO-Price9,Submitted TPO-MW10,Submitted TPO-Price10,Proxy Extension
+08/31/2026 12:50:20,N,RUSSEKST_ESR1,124.447479248047,123.75,,,,,0,149.990005493164,3,150,5,500,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,0,149.99,3,150,5,500,9.9,2000,,,,,,,,,No
+08/31/2026 13:10:20,N,STADIUM_ESR1,475.369720458984,123.75,,,,,,,,,,,,,8.89999961853027,1999.80004882812,9.80000019073486,1999.90002441406,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,,,,,,,,,8.9,1999.8,9.8,1999.9,9.9,2000,,,No
+08/31/2026 13:15:20,N,STADIUM_ESR1,580.205261230469,123.75,,,,,,,,,,,,,8.89999961853027,1999.80004882812,9.80000019073486,1999.90002441406,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,,,,,,,,,8.9,1999.8,9.8,1999.9,9.9,2000,,,No
diff --git a/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-event-dam.csv b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-event-dam.csv
new file mode 100644
index 00000000..fd4538e6
--- /dev/null
+++ b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-event-dam.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Resource Name,LMP,50xFIP,SCED2 Curve-MW1,SCED2 Curve-Price1,SCED2 Curve-MW2,SCED2 Curve-Price2,SCED2 Curve-MW3,SCED2 Curve-Price3,SCED2 Curve-MW4,SCED2 Curve-Price4,SCED2 Curve-MW5,SCED2 Curve-Price5,SCED2 Curve-MW6,SCED2 Curve-Price6,SCED2 Curve-MW7,SCED2 Curve-Price7,SCED2 Curve-MW8,SCED2 Curve-Price8,SCED2 Curve-MW9,SCED2 Curve-Price9,SCED2 Curve-MW10,SCED2 Curve-Price10,SCED2 Curve-MW11,SCED2 Curve-Price11,SCED2 Curve-MW12,SCED2 Curve-Price12,SCED2 Curve-MW13,SCED2 Curve-Price13,SCED2 Curve-MW14,SCED2 Curve-Price14,SCED2 Curve-MW15,SCED2 Curve-Price15,SCED2 Curve-MW16,SCED2 Curve-Price16,SCED2 Curve-MW17,SCED2 Curve-Price17,SCED2 Curve-MW18,SCED2 Curve-Price18,SCED2 Curve-MW19,SCED2 Curve-Price19,SCED2 Curve-MW20,SCED2 Curve-Price20,SCED2 Curve-MW21,SCED2 Curve-Price21,SCED2 Curve-MW22,SCED2 Curve-Price22,SCED2 Curve-MW23,SCED2 Curve-Price23,SCED2 Curve-MW24,SCED2 Curve-Price24,SCED2 Curve-MW25,SCED2 Curve-Price25,SCED2 Curve-MW26,SCED2 Curve-Price26,SCED2 Curve-MW27,SCED2 Curve-Price27,SCED2 Curve-MW28,SCED2 Curve-Price28,SCED2 Curve-MW29,SCED2 Curve-Price29,SCED2 Curve-MW30,SCED2 Curve-Price30,SCED2 Curve-MW31,SCED2 Curve-Price31,SCED2 Curve-MW32,SCED2 Curve-Price32,SCED2 Curve-MW33,SCED2 Curve-Price33,SCED2 Curve-MW34,SCED2 Curve-Price34,SCED2 Curve-MW35,SCED2 Curve-Price35,Bid Type,Submitted TPO-MW1,Submitted TPO-Price1,Submitted TPO-MW2,Submitted TPO-Price2,Submitted TPO-MW3,Submitted TPO-Price3,Submitted TPO-MW4,Submitted TPO-Price4,Submitted TPO-MW5,Submitted TPO-Price5,Submitted TPO-MW6,Submitted TPO-Price6,Submitted TPO-MW7,Submitted TPO-Price7,Submitted TPO-MW8,Submitted TPO-Price8,Submitted TPO-MW9,Submitted TPO-Price9,Submitted TPO-MW10,Submitted TPO-Price10,Proxy Extension
+04/28/2026 06:20:17,N,RUSSEKST_ESR1,144.133056640625,116.5,,,,,,,,,,,6,500,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,,,,,,,6,500,9.9,2000,,,,,,,No
+04/28/2026 06:25:17,N,RUSSEKST_ESR1,219.495681762695,116.5,,,,,,,,,,,6,500,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,,,,,,,6,500,9.9,2000,,,,,,,No
+04/28/2026 06:35:18,N,DCSES_CT10,119.670120239258,116.5,,,0,118.5,60,118.5,78.5,118.900001525879,95,118.900001525879,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,0,895.78,95,895.78,,,,,,,,,,,,,,,,,No
diff --git a/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-event-rtm.csv b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-event-rtm.csv
new file mode 100644
index 00000000..b447983c
--- /dev/null
+++ b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-event-rtm.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Resource Name,LMP,50xFIP,SCED2 Curve-MW1,SCED2 Curve-Price1,SCED2 Curve-MW2,SCED2 Curve-Price2,SCED2 Curve-MW3,SCED2 Curve-Price3,SCED2 Curve-MW4,SCED2 Curve-Price4,SCED2 Curve-MW5,SCED2 Curve-Price5,SCED2 Curve-MW6,SCED2 Curve-Price6,SCED2 Curve-MW7,SCED2 Curve-Price7,SCED2 Curve-MW8,SCED2 Curve-Price8,SCED2 Curve-MW9,SCED2 Curve-Price9,SCED2 Curve-MW10,SCED2 Curve-Price10,SCED2 Curve-MW11,SCED2 Curve-Price11,SCED2 Curve-MW12,SCED2 Curve-Price12,SCED2 Curve-MW13,SCED2 Curve-Price13,SCED2 Curve-MW14,SCED2 Curve-Price14,SCED2 Curve-MW15,SCED2 Curve-Price15,SCED2 Curve-MW16,SCED2 Curve-Price16,SCED2 Curve-MW17,SCED2 Curve-Price17,SCED2 Curve-MW18,SCED2 Curve-Price18,SCED2 Curve-MW19,SCED2 Curve-Price19,SCED2 Curve-MW20,SCED2 Curve-Price20,SCED2 Curve-MW21,SCED2 Curve-Price21,SCED2 Curve-MW22,SCED2 Curve-Price22,SCED2 Curve-MW23,SCED2 Curve-Price23,SCED2 Curve-MW24,SCED2 Curve-Price24,SCED2 Curve-MW25,SCED2 Curve-Price25,SCED2 Curve-MW26,SCED2 Curve-Price26,SCED2 Curve-MW27,SCED2 Curve-Price27,SCED2 Curve-MW28,SCED2 Curve-Price28,SCED2 Curve-MW29,SCED2 Curve-Price29,SCED2 Curve-MW30,SCED2 Curve-Price30,SCED2 Curve-MW31,SCED2 Curve-Price31,SCED2 Curve-MW32,SCED2 Curve-Price32,SCED2 Curve-MW33,SCED2 Curve-Price33,SCED2 Curve-MW34,SCED2 Curve-Price34,SCED2 Curve-MW35,SCED2 Curve-Price35,Bid Type,Submitted TPO-MW1,Submitted TPO-Price1,Submitted TPO-MW2,Submitted TPO-Price2,Submitted TPO-MW3,Submitted TPO-Price3,Submitted TPO-MW4,Submitted TPO-Price4,Submitted TPO-MW5,Submitted TPO-Price5,Submitted TPO-MW6,Submitted TPO-Price6,Submitted TPO-MW7,Submitted TPO-Price7,Submitted TPO-MW8,Submitted TPO-Price8,Submitted TPO-MW9,Submitted TPO-Price9,Submitted TPO-MW10,Submitted TPO-Price10,Proxy Extension
+08/26/2026 00:50:18,N,KNAPP_ESR1,126.278526306152,118.25,,,,,0,1999,10,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,0,1999,10,2000,,,,,,,,,,,,,No
+08/26/2026 06:10:20,N,JUNCTION_ESR1,189.912338256836,118.25,,,,,,,,,,,3,2000,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,,,,,,,3,2000,,,,,,,,,Yes
+08/26/2026 06:10:20,N,JUNORTH_ESR1,189.912338256836,118.25,,,,,,,,,,,,,,,,,6.19999980926514,2000,9.89999961853027,2000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3PT,,,,,,,,,,,,,,,,,6.2,2000,9.9,2000,No
diff --git a/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-samples.csv b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-samples.csv
new file mode 100644
index 00000000..88275f74
--- /dev/null
+++ b/tools/inputs/history/np3-987-ex--7d_trig_lmp_50xfip-history-samples.csv
@@ -0,0 +1,4 @@
+"SCED Time Stamp","Repeated Hour Flag","Resource Name","LMP","50xFIP","SCED2 Curve-MW1","SCED2 Curve-Price1","SCED2 Curve-MW2","SCED2 Curve-Price2","SCED2 Curve-MW3","SCED2 Curve-Price3","SCED2 Curve-MW4","SCED2 Curve-Price4","SCED2 Curve-MW5","SCED2 Curve-Price5","SCED2 Curve-MW6","SCED2 Curve-Price6","SCED2 Curve-MW7","SCED2 Curve-Price7","SCED2 Curve-MW8","SCED2 Curve-Price8","SCED2 Curve-MW9","SCED2 Curve-Price9","SCED2 Curve-MW10","SCED2 Curve-Price10","SCED2 Curve-MW11","SCED2 Curve-Price11","SCED2 Curve-MW12","SCED2 Curve-Price12","SCED2 Curve-MW13","SCED2 Curve-Price13","SCED2 Curve-MW14","SCED2 Curve-Price14","SCED2 Curve-MW15","SCED2 Curve-Price15","SCED2 Curve-MW16","SCED2 Curve-Price16","SCED2 Curve-MW17","SCED2 Curve-Price17","SCED2 Curve-MW18","SCED2 Curve-Price18","SCED2 Curve-MW19","SCED2 Curve-Price19","SCED2 Curve-MW20","SCED2 Curve-Price20","SCED2 Curve-MW21","SCED2 Curve-Price21","SCED2 Curve-MW22","SCED2 Curve-Price22","SCED2 Curve-MW23","SCED2 Curve-Price23","SCED2 Curve-MW24","SCED2 Curve-Price24","SCED2 Curve-MW25","SCED2 Curve-Price25","SCED2 Curve-MW26","SCED2 Curve-Price26","SCED2 Curve-MW27","SCED2 Curve-Price27","SCED2 Curve-MW28","SCED2 Curve-Price28","SCED2 Curve-MW29","SCED2 Curve-Price29","SCED2 Curve-MW30","SCED2 Curve-Price30","SCED2 Curve-MW31","SCED2 Curve-Price31","SCED2 Curve-MW32","SCED2 Curve-Price32","SCED2 Curve-MW33","SCED2 Curve-Price33","SCED2 Curve-MW34","SCED2 Curve-Price34","SCED2 Curve-MW35","SCED2 Curve-Price35","Bid Type","Submitted TPO-MW1","Submitted TPO-Price1","Submitted TPO-MW2","Submitted TPO-Price2","Submitted TPO-MW3","Submitted TPO-Price3","Submitted TPO-MW4","Submitted TPO-Price4","Submitted TPO-MW5","Submitted TPO-Price5","Submitted TPO-MW6","Submitted TPO-Price6","Submitted TPO-MW7","Submitted TPO-Price7","Submitted TPO-MW8","Submitted TPO-Price8","Submitted TPO-MW9","Submitted TPO-Price9","Submitted TPO-MW10","Submitted TPO-Price10","Proxy Extension"
+"03/12/2014 19:45:14","N","AMOCOOIL_CC1_1","250.075744628906","229.5","","","","","0","5000","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","No"
+"03/12/2014 19:45:14","N","AMOCOOIL_CC2_9","250.075744628906","229.5","","","","","","","","","615","5000","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3PT","","","","","","","","","","","","","","","","","","","","","No"
+"03/12/2014 19:45:14","N","AZ_AZ_G1","291.025756835938","229.5","","","","",".00999999977648258","4999.990234375","39","5000","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","No"
diff --git a/tools/inputs/history/np3-987-ex--7d_trig_mcpc_50xfip-history-event-dam.csv b/tools/inputs/history/np3-987-ex--7d_trig_mcpc_50xfip-history-event-dam.csv
new file mode 100644
index 00000000..0dcc07c4
--- /dev/null
+++ b/tools/inputs/history/np3-987-ex--7d_trig_mcpc_50xfip-history-event-dam.csv
@@ -0,0 +1,4 @@
+Delivery Date,Hour Ending,QSE,DME,Resource Name,50xFIP,MCPC,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5
+04/28/2026,21,QTEN26,YWINMI,AE_ESR1,116.5,139.71,N,V,,,,,,5000,,,,.1,V,,,,,,5000,,,,.2,V,,,,,,203.05,,,,2.3,V,,,,,,5000,,,,5,V,,,,,,5000,,,,8.9
+04/28/2026,21,QENE11,YENELT,ANCHOR_ESR1,116.5,139.71,N,V,,,,,,249,,,,3.5,V,,,,,,449,,,,3.5,V,,,,,,5000,,,,3.5,V,,,,,,5000,,,,3.5,V,,,,,,5000,,,,3.5
+04/28/2026,21,QENE11,YENELT,ANCHOR_ESR2,116.5,139.71,N,V,,,,,,249,,,,3.5,V,,,,,,449,,,,3.5,V,,,,,,5000,,,,3.5,V,,,,,,5000,,,,3.5,V,,,,,,5000,,,,3.5
diff --git a/tools/inputs/history/np3-987-ex--7d_trig_rtm_mcpc_50xfip-history-event-rtm.csv b/tools/inputs/history/np3-987-ex--7d_trig_rtm_mcpc_50xfip-history-event-rtm.csv
new file mode 100644
index 00000000..c66c77bc
--- /dev/null
+++ b/tools/inputs/history/np3-987-ex--7d_trig_rtm_mcpc_50xfip-history-event-rtm.csv
@@ -0,0 +1,4 @@
+SCED Time Stamp,Repeated Hour Flag,Resource Name,50xFIP,RTMCPC,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 RRSPFR,PRICE1 RRSUFR,PRICE1 RRSFFR,PRICE1 NONSPIN,PRICE1 ECRS,QUANTITY MW1,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 RRSPFR,PRICE2 RRSUFR,PRICE2 RRSFFR,PRICE2 NONSPIN,PRICE2 ECRS,QUANTITY MW2,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 RRSPFR,PRICE3 RRSUFR,PRICE3 RRSFFR,PRICE3 NONSPIN,PRICE3 ECRS,QUANTITY MW3,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 RRSPFR,PRICE4 RRSUFR,PRICE4 RRSFFR,PRICE4 NONSPIN,PRICE4 ECRS,QUANTITY MW4,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 RRSPFR,PRICE5 RRSUFR,PRICE5 RRSFFR,PRICE5 NONSPIN,PRICE5 ECRS,QUANTITY MW5
+08/26/2026 20:55:24,N,AE_ESR1,118.25,134.09,,,,,,2000,,.1,,,,,,,,,,,,,,2000,,1.6,,,,,,2000,,3.4,,,,,,2000,,14.4
+08/26/2026 20:55:24,N,ALP_BESS_ESR1,118.25,134.09,,,,,,,,,,,,,,2000,,201.1,,,,,,,,,,,,,,,,,,,,,,,,
+08/26/2026 20:55:24,N,ANCHOR_ESR1,118.25,134.09,,,,,,,,,,,,,,2000,,18.4,,,,,,2000,,21.5,,,,,,2000,,25.9,,,,,,,,
diff --git a/tools/inputs/history/np3-988-er-history-current.csv b/tools/inputs/history/np3-988-er-history-current.csv
new file mode 100644
index 00000000..22e10461
--- /dev/null
+++ b/tools/inputs/history/np3-988-er-history-current.csv
@@ -0,0 +1,4 @@
+"OWNER RE","RESOURCE NAME","TYPE","SPLIT GEN RESOURCE","DME","DME DUNS","RMR"
+"1370 SHANNON LLC (RE)","SHANNONW_UNIT_1","Generation","Not Applicable","1370 SHANNON LLC (DME)","1450336317000","N"
+"224WB 8ME LLC (RE)","GALLOWAY_SOLAR2","Generation","Not Applicable","224WB 8ME LLC (DME)","0815527087000","N"
+"225DD 8ME LLC (RE)","GALLOWAY_SOLAR1","Generation","Not Applicable","225DD 8ME LLC (DME)","0815490207000","N"
diff --git a/tools/inputs/history/np3-988-er-history-samples.csv b/tools/inputs/history/np3-988-er-history-samples.csv
new file mode 100644
index 00000000..380a8bf5
--- /dev/null
+++ b/tools/inputs/history/np3-988-er-history-samples.csv
@@ -0,0 +1,4 @@
+"OWNER RE","RESOURCE NAME","TYPE","SPLIT GEN RESOURCE","DME","DME DUNS","RMR"
+"224WB 8ME LLC (RE)","GALLOWAY_SOLAR2","Generation","Not Applicable","224WB 8ME LLC (DME)","0815527087000","N"
+"225DD 8ME LLC (RE)","GALLOWAY_SOLAR1","Generation","Not Applicable","225DD 8ME LLC (DME)","0815490207000","N"
+"226HC 8ME LLC (RE)","HOLSTEIN_SOLAR1","Generation","Not Applicable","226HC 8ME LLC (DME)","1169540657000","N"
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-current.csv b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-current.csv
new file mode 100644
index 00000000..1502f5fa
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-current.csv
@@ -0,0 +1 @@
+SASM ID,Delivery Date,Hour Ending,Resource Name,Resource Type,REGUP Awarded,REGUP MCPC,REGDN Awarded,REGDN MCPC,RRSPFR Awarded,RRSFFR Awarded,RRSUFR Awarded,RRS MCPC,ECRSS Awarded,OFFEC Awarded,ECRS MCPC,NSPIN Awarded,NSPIN MCPC
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-samples.csv b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-samples.csv
new file mode 100644
index 00000000..59ef07af
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-samples.csv
@@ -0,0 +1 @@
+"SASM ID","Delivery Date","Hour Ending","Resource Name","Resource Type","REGUP Awarded","REGUP MCPC","REGDN Awarded","REGDN MCPC","RRS Awarded","RRS MCPC","NSPIN Awarded","NSPIN MCPC"
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-sasm-nonempty.csv b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-sasm-nonempty.csv
new file mode 100644
index 00000000..23f87d45
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offer_awards-history-sasm-nonempty.csv
@@ -0,0 +1,4 @@
+SASM ID,Delivery Date,Hour Ending,Resource Name,Resource Type,REGUP Awarded,REGUP MCPC,REGDN Awarded,REGDN MCPC,RRSPFR Awarded,RRSFFR Awarded,RRSUFR Awarded,RRS MCPC,ECRSS Awarded,OFFEC Awarded,ECRS MCPC,NSPIN Awarded,NSPIN MCPC
+11/27/2025 02:45:05 AM,11/27/2025,05,CROSSETT_BES1,PWRSTR,,,,,1.2,,,10,,,,,
+11/27/2025 02:45:05 AM,11/27/2025,05,CROSSETT_BES2,PWRSTR,,,,,1.2,,,10,,,,,
+11/27/2025 02:45:05 AM,11/27/2025,05,DANSBY_DANSBYG1,GSREH,,,,,2.1,,,10,,,,,
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-current.csv b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-current.csv
new file mode 100644
index 00000000..ca71cc09
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-current.csv
@@ -0,0 +1 @@
+Delivery Date,SASM ID,Hour Ending,QSE NAME,DME,Resource Name,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-samples.csv b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-samples.csv
new file mode 100644
index 00000000..858db187
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-samples.csv
@@ -0,0 +1 @@
+"Delivery Date","SASM ID","Hour Ending","QSE NAME","Resource Name","Multi-Hour Block Flag","BLOCK INDICATOR1","PRICE1 RRS","PRICE1 ONLINE NONSPIN","PRICE1 REGUP","PRICE1 REGDOWN","PRICE1 OFFLINE NONSPIN","QUANTITY MW1","BLOCK INDICATOR2","PRICE2 RRS","PRICE2 ONLINE NONSPIN","PRICE2 REGUP","PRICE2 REGDOWN","PRICE2 OFFLINE NONSPIN","QUANTITY MW2","BLOCK INDICATOR3","PRICE3 RRS","PRICE3 ONLINE NONSPIN","PRICE3 REGUP","PRICE3 REGDOWN","PRICE3 OFFLINE NONSPIN","QUANTITY MW3","BLOCK INDICATOR4","PRICE4 RRS","PRICE4 ONLINE NONSPIN","PRICE4 REGUP","PRICE4 REGDOWN","PRICE4 OFFLINE NONSPIN","QUANTITY MW4","BLOCK INDICATOR5","PRICE5 RRS","PRICE5 ONLINE NONSPIN","PRICE5 REGUP","PRICE5 REGDOWN","PRICE5 OFFLINE NONSPIN","QUANTITY MW5"
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-sasm-nonempty.csv b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-sasm-nonempty.csv
new file mode 100644
index 00000000..d4f59477
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_gen_res_as_offers-history-sasm-nonempty.csv
@@ -0,0 +1,4 @@
+Delivery Date,SASM ID,Hour Ending,QSE NAME,DME,Resource Name,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5
+11/27/2025,11/27/2025 02:45:05,01,QSUE53,YPLUSP,ANEM_ESS_BESS1,N,V,5000,,,5000,,5000,5000,,,20,V,5000,,,5000,,5000,5000,,,30,V,2450,,,2450,,2450,2450,,,50,V,4900,,,4900,,4900,4900,,,40,V,1225,,,1225,,1225,1225,,,60
+11/27/2025,11/27/2025 02:45:05,01,QBTU,YBRYN,ATKINS_ATKINSG7,N,V,,,,,,500,,,,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+11/27/2025,11/27/2025 02:45:05,01,QSUE76,YBTCOS,CNLY_ESS_BESS_1,N,V,5,,,5,,5,6.33,,,11.6,V,5,,,5,,5,6.33,,,11.6,V,5,,,5,,5,6.33,,,11.6,V,5,,,5,,5,6.33,,,5.8,V,5,,,5,,5,6.33,,,5.9
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-current.csv b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-current.csv
new file mode 100644
index 00000000..a76c3e7c
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-current.csv
@@ -0,0 +1 @@
+SASM ID,Delivery Date,Hour Ending,Resource Name,Resource Type,REGUP Awarded,REGUP MCPC,REGDN Awarded,REGDN MCPC,RRSPFR Awarded,RRSFFR Awarded,RRSUFR Awarded,RRS MCPC,ECRSM Awarded,ECRSS Awarded,ECRS MCPC,NSPIN Awarded,NSPIN MCPC
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-samples.csv b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-samples.csv
new file mode 100644
index 00000000..59ef07af
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-samples.csv
@@ -0,0 +1 @@
+"SASM ID","Delivery Date","Hour Ending","Resource Name","Resource Type","REGUP Awarded","REGUP MCPC","REGDN Awarded","REGDN MCPC","RRS Awarded","RRS MCPC","NSPIN Awarded","NSPIN MCPC"
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-sasm-nonempty.csv b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-sasm-nonempty.csv
new file mode 100644
index 00000000..14811f9d
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offer_awards-history-sasm-nonempty.csv
@@ -0,0 +1,4 @@
+SASM ID,Delivery Date,Hour Ending,Resource Name,Resource Type,REGUP Awarded,REGUP MCPC,REGDN Awarded,REGDN MCPC,RRSPFR Awarded,RRSFFR Awarded,RRSUFR Awarded,RRS MCPC,ECRSM Awarded,ECRSS Awarded,ECRS MCPC,NSPIN Awarded,NSPIN MCPC
+11/27/2025 02:45:05 AM,11/27/2025,18,DOWGEN_LD7,NCLR,,,,,,,2,33,,,,,
+11/27/2025 02:45:05 AM,11/27/2025,18,DOWGEN_LD9,NCLR,,,,,,,1.1,33,,,,,
+11/27/2025 02:45:05 AM,11/27/2025,19,DOWGEN_LD5,NCLR,,,,,,,5,15,,,,,
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-current.csv b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-current.csv
new file mode 100644
index 00000000..ca71cc09
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-current.csv
@@ -0,0 +1 @@
+Delivery Date,SASM ID,Hour Ending,QSE NAME,DME,Resource Name,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-samples.csv b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-samples.csv
new file mode 100644
index 00000000..858db187
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-samples.csv
@@ -0,0 +1 @@
+"Delivery Date","SASM ID","Hour Ending","QSE NAME","Resource Name","Multi-Hour Block Flag","BLOCK INDICATOR1","PRICE1 RRS","PRICE1 ONLINE NONSPIN","PRICE1 REGUP","PRICE1 REGDOWN","PRICE1 OFFLINE NONSPIN","QUANTITY MW1","BLOCK INDICATOR2","PRICE2 RRS","PRICE2 ONLINE NONSPIN","PRICE2 REGUP","PRICE2 REGDOWN","PRICE2 OFFLINE NONSPIN","QUANTITY MW2","BLOCK INDICATOR3","PRICE3 RRS","PRICE3 ONLINE NONSPIN","PRICE3 REGUP","PRICE3 REGDOWN","PRICE3 OFFLINE NONSPIN","QUANTITY MW3","BLOCK INDICATOR4","PRICE4 RRS","PRICE4 ONLINE NONSPIN","PRICE4 REGUP","PRICE4 REGDOWN","PRICE4 OFFLINE NONSPIN","QUANTITY MW4","BLOCK INDICATOR5","PRICE5 RRS","PRICE5 ONLINE NONSPIN","PRICE5 REGUP","PRICE5 REGDOWN","PRICE5 OFFLINE NONSPIN","QUANTITY MW5"
diff --git a/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-sasm-nonempty.csv b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-sasm-nonempty.csv
new file mode 100644
index 00000000..6ff7b55a
--- /dev/null
+++ b/tools/inputs/history/np3-990-ex--60_sasm_load_res_as_offers-history-sasm-nonempty.csv
@@ -0,0 +1,4 @@
+Delivery Date,SASM ID,Hour Ending,QSE NAME,DME,Resource Name,Multi-Hour Block Flag,BLOCK INDICATOR1,PRICE1 RRSPFR,PRICE1 RRSFFR,PRICE1 RRSUFR,PRICE1 ECRS,PRICE1 OFFEC,PRICE1 ONLINE NONSPIN,PRICE1 REGUP,PRICE1 REGDOWN,PRICE1 OFFLINE NONSPIN,QUANTITY MW1,BLOCK INDICATOR2,PRICE2 RRSPFR,PRICE2 RRSFFR,PRICE2 RRSUFR,PRICE2 ECRS,PRICE2 OFFEC,PRICE2 ONLINE NONSPIN,PRICE2 REGUP,PRICE2 REGDOWN,PRICE2 OFFLINE NONSPIN,QUANTITY MW2,BLOCK INDICATOR3,PRICE3 RRSPFR,PRICE3 RRSFFR,PRICE3 RRSUFR,PRICE3 ECRS,PRICE3 OFFEC,PRICE3 ONLINE NONSPIN,PRICE3 REGUP,PRICE3 REGDOWN,PRICE3 OFFLINE NONSPIN,QUANTITY MW3,BLOCK INDICATOR4,PRICE4 RRSPFR,PRICE4 RRSFFR,PRICE4 RRSUFR,PRICE4 ECRS,PRICE4 OFFEC,PRICE4 ONLINE NONSPIN,PRICE4 REGUP,PRICE4 REGDOWN,PRICE4 OFFLINE NONSPIN,QUANTITY MW4,BLOCK INDICATOR5,PRICE5 RRSPFR,PRICE5 RRSFFR,PRICE5 RRSUFR,PRICE5 ECRS,PRICE5 OFFEC,PRICE5 ONLINE NONSPIN,PRICE5 REGUP,PRICE5 REGDOWN,PRICE5 OFFLINE NONSPIN,QUANTITY MW5
+11/27/2025,11/27/2025 02:45:05,01,QSUE53,YPLUSP,ANEM_ESS_LD1,N,V,,,,,,,,2450,,60,V,,,,,,,,3675,,50,V,,,,,,,,4900,,40,V,,,,,,,,5000,,30,V,,,,,,,,5000,,20
+11/27/2025,11/27/2025 02:45:05,01,QSUE76,YBTCOS,CNLY_ESS_LD1,N,V,,,,,,,,20,,9.1,V,,,,,,,,20,,9,V,,,,,,,,20,,9.1,V,,,,,,,,20,,4.5,V,,,,,,,,20,,4.6
+11/27/2025,11/27/2025 02:45:05,01,QSUE52,YPLUSP,EBNY_ESS_LD1,N,V,,,,,,,,2450,,50,V,,,,,,,,3675,,40,V,,,,,,,,4900,,30,V,,,,,,,,5000,,70,V,,,,,,,,5000,,10
diff --git a/tools/inputs/history/np3-991-ex-history-current.csv b/tools/inputs/history/np3-991-ex-history-current.csv
new file mode 100644
index 00000000..15f3b0f6
--- /dev/null
+++ b/tools/inputs/history/np3-991-ex-history-current.csv
@@ -0,0 +1,4 @@
+Delivery Date,QSE Name,Resource Name,Hour Ending,Status,High Sustained Limit,Low Sustained Limit,High Emergency Limit,Low Emergency Limit,Reg Up,Reg Down,RRSPFR,RRSFFR,RRSUFR,NSPIN,ECRS,Minimum SOC,Maximum SOC,Hour Beginning Planned SOC,Cancel Flag,Update Time,Submit Time
+07/08/2026,QAEN,ARAGORN_UNIT1,1:00,ON,14.00,0.00,187.20,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,N,06/30/2026 09:01:26,06/30/2026 08:01:25
+07/08/2026,QAEN,ARAGORN_UNIT1,1:00,ON,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,N,07/01/2026 01:51:15,06/30/2026 08:01:25
+07/08/2026,QAEN,ARAGORN_UNIT1,1:00,ON,0.00,0.00,187.20,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,N,07/07/2026 09:03:35,07/07/2026 08:03:35
diff --git a/tools/inputs/history/np3-991-ex-history-samples.csv b/tools/inputs/history/np3-991-ex-history-samples.csv
new file mode 100644
index 00000000..8c9cc0dd
--- /dev/null
+++ b/tools/inputs/history/np3-991-ex-history-samples.csv
@@ -0,0 +1,4 @@
+Delivery Date,QSE Name,Resource Name,Hour Ending,Status,High Sustained Limit,Low Sustained Limit,High Emergency Limit,Low Emergency Limit,Reg Up,Reg Down,RRS,NSPIN,Cancel Flag,Update Time,Submit Time
+12/10/2018,QAEN,BOOTLEG_UNIT1,7:00,ON,0,0,121.1,0,0,0,0,0,N,12/3/2018 11:41,12/3/2018 11:41
+12/10/2018,QAEN,BOOTLEG_UNIT1,7:00,ON,0,0,0,0,0,0,0,0,N,12/3/2018 12:10,12/3/2018 11:41
+12/10/2018,QAEN,BOOTLEG_UNIT1,7:00,ON,0,0,121.1,0,0,0,0,0,N,12/5/2018 11:43,12/5/2018 11:43
diff --git a/tools/inputs/history/np4-158-sg-history-current.csv b/tools/inputs/history/np4-158-sg-history-current.csv
new file mode 100644
index 00000000..d9cc724c
--- /dev/null
+++ b/tools/inputs/history/np4-158-sg-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SettlementPoint,GroupIndex,UpdateTime,DSTFlag
+09/08/2026,01:00,CHAMON_UN1,1,09/07/2026 12:30:32,N
+09/08/2026,01:00,CHAMON_UN2,1,09/07/2026 12:30:32,N
+09/08/2026,01:00,BVE_UNIT1,2,09/07/2026 12:30:32,N
diff --git a/tools/inputs/history/np4-158-sg-history-samples.csv b/tools/inputs/history/np4-158-sg-history-samples.csv
new file mode 100644
index 00000000..3432d96a
--- /dev/null
+++ b/tools/inputs/history/np4-158-sg-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SettlementPoint,GroupIndex,UpdateTime,DSTFlag
+05/29/2026,01:00,CHAMON_UN1,1,05/28/2026 12:30:15,N
+05/29/2026,01:00,CHAMON_UN2,1,05/28/2026 12:30:15,N
+05/29/2026,01:00,BVE_UNIT1,2,05/28/2026 12:30:15,N
diff --git a/tools/inputs/history/np4-159-cd-history-current.csv b/tools/inputs/history/np4-159-cd-history-current.csv
new file mode 100644
index 00000000..c25f6ec7
--- /dev/null
+++ b/tools/inputs/history/np4-159-cd-history-current.csv
@@ -0,0 +1,4 @@
+LdfDate,LdfHour,SubStation,DistributionFactor,LoadID,MVARDistributionFactor,MRIDLoad,DSTFlag
+08/15/2026,01:00,MIRAGE,0,01NPS-XFM-0001,0,6f09b475-c893-40f6-bcc8-3427ca4c9ed4,N
+08/15/2026,01:00,SNOOK,2.3,050,0.649999916553497,{356A1C81-051D-432E-A1E7-2B63E50840C3},N
+08/15/2026,01:00,MILLICAN,1,070,0.342594116926193,{D71F619B-5FEB-4D44-B7FC-27097FD8001F},N
diff --git a/tools/inputs/history/np4-159-cd-history-samples.csv b/tools/inputs/history/np4-159-cd-history-samples.csv
new file mode 100644
index 00000000..bc5ffb94
--- /dev/null
+++ b/tools/inputs/history/np4-159-cd-history-samples.csv
@@ -0,0 +1,4 @@
+LdfDate,LdfHour,SubStation,LoadDistributionFactor,LoadID,MVARDistributionFactor,MRIDLoad,DSTFlag
+05/02/2014,01:00,SNOOK,0,050,0.603000342845917,{356A1C81-051D-432E-A1E7-2B63E50840C3},N
+05/02/2014,01:00,MILLICAN,0,070,0.274599581956863,{D71F619B-5FEB-4D44-B7FC-27097FD8001F},N
+05/02/2014,01:00,STEELE_S,0.820144251,080,1.248251080513,{AB14B651-6C11-4BDB-9C7A-AAFAF380D614},N
diff --git a/tools/inputs/history/np4-179-cd-history-current.csv b/tools/inputs/history/np4-179-cd-history-current.csv
new file mode 100644
index 00000000..4989c36b
--- /dev/null
+++ b/tools/inputs/history/np4-179-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,REGDN,REGUP,RRSPFR,RRSFFR,RRSUFR,ECRSSD,ECRSMD,NSPIN,DSTFlag
+12/05/2025,01:00,5677.8,6695.8,8676.7,150.4,892.2,8449.1,268.5,8259,N
+12/05/2025,02:00,4762.3,6725.8,8736.9,100,888.9,8567.5,272.3,8275,N
+12/05/2025,03:00,4743.7,6701.5,8638.2,150.4,893.7,8515.8,272.3,8335.9,N
diff --git a/tools/inputs/history/np4-179-cd-history-samples.csv b/tools/inputs/history/np4-179-cd-history-samples.csv
new file mode 100644
index 00000000..7440a1dc
--- /dev/null
+++ b/tools/inputs/history/np4-179-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,REGDN,REGUP,RRS,NSPIN,DSTFlag
+05/02/2014, 01:00, 1525.7, 1898.2, 4378, 3424.3,N
+05/02/2014, 02:00, 1527.5, 1877.9, 4373.6, 3430.8,N
+05/02/2014, 03:00, 1527.5, 1878.3, 4362.1, 3436.6,N
diff --git a/tools/inputs/history/np4-183-cd-history-current.csv b/tools/inputs/history/np4-183-cd-history-current.csv
new file mode 100644
index 00000000..9d2137c4
--- /dev/null
+++ b/tools/inputs/history/np4-183-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,BusName,LMP,DSTFlag
+09/07/2026,01:00,CADICKS_804V,44.77,N
+09/07/2026,01:00,ADICKS__138C,44.77,N
+09/07/2026,01:00,ADICKS__8030,44.77,N
diff --git a/tools/inputs/history/np4-183-cd-history-samples.csv b/tools/inputs/history/np4-183-cd-history-samples.csv
new file mode 100644
index 00000000..20900809
--- /dev/null
+++ b/tools/inputs/history/np4-183-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,BusName,LMP,DSTFlag
+05/02/2014,01:00,EB_K,30.39,N
+05/02/2014,01:00,EB_KO,30.39,N
+05/02/2014,01:00,EB_KW,30.39,N
diff --git a/tools/inputs/history/np4-188-cd-recent.csv b/tools/inputs/history/np4-188-cd-recent.csv
new file mode 100644
index 00000000..f36936ac
--- /dev/null
+++ b/tools/inputs/history/np4-188-cd-recent.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,AncillaryType,MCPC,DSTFlag
+09/07/2026,01:00,NSPIN,5.91,N
+09/07/2026,01:00,RRS,0.21,N
+09/07/2026,01:00,REGDN,0.45,N
diff --git a/tools/inputs/history/np4-188-cd.csv b/tools/inputs/history/np4-188-cd.csv
new file mode 100644
index 00000000..ae2f1ff5
--- /dev/null
+++ b/tools/inputs/history/np4-188-cd.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,AncillaryType,MCPC,DSTFlag
+05/02/2014,01:00,RRS,7.25,N
+05/02/2014,01:00,REGUP,3.25,N
+05/02/2014,01:00,REGDN,14.11,N
diff --git a/tools/inputs/history/np4-19-cd-history-current.csv b/tools/inputs/history/np4-19-cd-history-current.csv
new file mode 100644
index 00000000..6b22ca54
--- /dev/null
+++ b/tools/inputs/history/np4-19-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,AncillaryType,Price,Quantity,DSTFlag
+09/08/2026,01:00,ECRSM, 0, 124,N
+09/08/2026,01:00,ECRSM, 0.01, 247.8,N
+09/08/2026,02:00,ECRSM, 0, 127.8,N
diff --git a/tools/inputs/history/np4-19-cd-history-samples.csv b/tools/inputs/history/np4-19-cd-history-samples.csv
new file mode 100644
index 00000000..673385dc
--- /dev/null
+++ b/tools/inputs/history/np4-19-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,AncillaryType,Price,Quantity,DSTFlag
+03/13/2014,01:00,OFFNS, 400, 1757,N
+03/13/2014,01:00,OFFNS, 0.77, 533.8,N
+03/13/2014,01:00,OFFNS, 0.01, 193,N
diff --git a/tools/inputs/history/np4-190-cd-recent.csv b/tools/inputs/history/np4-190-cd-recent.csv
new file mode 100644
index 00000000..f6fb982e
--- /dev/null
+++ b/tools/inputs/history/np4-190-cd-recent.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SettlementPoint,SettlementPointPrice,DSTFlag
+09/07/2026,01:00,7RNCHSLR_ALL, 45.04,N
+09/07/2026,01:00,A4_DGR1_RN, 45.3,N
+09/07/2026,01:00,A4_DGR2_RN, 45.3,N
diff --git a/tools/inputs/history/np4-190-cd.csv b/tools/inputs/history/np4-190-cd.csv
new file mode 100644
index 00000000..6e5691b9
--- /dev/null
+++ b/tools/inputs/history/np4-190-cd.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SettlementPoint,SettlementPointPrice,DSTFlag
+05/02/2014,01:00,AMISTAD_ALL, 29.92,N
+05/02/2014,01:00,AMOCOOIL_CC1, 30.21,N
+05/02/2014,01:00,AMOCOOIL_CC2, 30.21,N
diff --git a/tools/inputs/history/np4-191-cd-history-current.csv b/tools/inputs/history/np4-191-cd-history-current.csv
new file mode 100644
index 00000000..c04fb7a9
--- /dev/null
+++ b/tools/inputs/history/np4-191-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ConstraintID,ConstraintName,ContingencyName,ConstraintLimit,ConstraintValue,ViolationAmount,ShadowPrice,FromStation,ToStation,FromStationkV,ToStationkV,DeliveryTime,DSTFlag
+09/07/2026,01:00,4, LAKENA_SAMATH1_1, DBAKCED5, 38, 38, 0, 13.014, LAKENASW, SAMATHIS, 69, 69, 09/07/2026 00:00:00,N
+09/07/2026,01:00,16, BENTS_FRTER_1B_1, SSHAFRO8, 213, 213, 0, 8.375, FRONTERA, S_MISSIN, 138, 138, 09/07/2026 00:00:00,N
+09/07/2026,01:00,2, LPLMK_LPLNE_1, SBWDDBM5, 218, 218, 0, 35.441, LPLMK, LPLNE, 115, 115, 09/07/2026 00:00:00,N
diff --git a/tools/inputs/history/np4-191-cd-history-samples.csv b/tools/inputs/history/np4-191-cd-history-samples.csv
new file mode 100644
index 00000000..b4a96f6c
--- /dev/null
+++ b/tools/inputs/history/np4-191-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ConstraintID,ConstraintName,ContingencyName,ConstraintLimit,ConstraintValue,ViolationAmount,ShadowPrice,FromStation,ToStation,FromStationkV,ToStationkV,DeliveryTime,DSTFlag
+05/02/2014,01:00,1, MARSFO_SUT1, BASE CASE, 45, 45, 0, 0.045, MARSFO, MARSFO, 1, 138, 05/02/2014 00:00:00,N
+05/02/2014,01:00,15, 100027_D_1, SGRBBNK9, 52, 52, 0, 1.5, WHTNY, WND, 69, 69, 05/02/2014 00:00:00,N
+05/02/2014,01:00,3, MUNDAY_MUNDAY1_1, SASPPAI8, 27, 27, 0, 19.307, MUNDAYST, MUNDAYR2, 69, 69, 05/02/2014 00:00:00,N
diff --git a/tools/inputs/history/np4-192-cd-history-current.csv b/tools/inputs/history/np4-192-cd-history-current.csv
new file mode 100644
index 00000000..e7bc0c8a
--- /dev/null
+++ b/tools/inputs/history/np4-192-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Settlement_Point,Total_DAM_Energy_Bought,RepeatedHourFlag
+09/07/2026,01:00,TGS_GT01,0,N
+09/07/2026,01:00,FAGUSSLR_RN,0,N
+09/07/2026,01:00,ALP_BESS_RN,5,N
diff --git a/tools/inputs/history/np4-192-cd-history-samples.csv b/tools/inputs/history/np4-192-cd-history-samples.csv
new file mode 100644
index 00000000..fb9a95ce
--- /dev/null
+++ b/tools/inputs/history/np4-192-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Settlement_Point,Total_DAM_Energy_Bought,DSTFlag
+03/13/2014,01:00,MWEC_G1,28,N
+03/13/2014,01:00,LZ_CPS,1933.8,N
+03/13/2014,01:00,BYU_BYU_34,41,N
diff --git a/tools/inputs/history/np4-193-cd-history-current.csv b/tools/inputs/history/np4-193-cd-history-current.csv
new file mode 100644
index 00000000..9578ca4d
--- /dev/null
+++ b/tools/inputs/history/np4-193-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Settlement_Point,TotalDAMEnergySold,RepeatedHourFlag
+09/07/2026,01:00,ABINDUST_RN,1.1,N
+09/07/2026,01:00,AEEC,177.6,N
+09/07/2026,01:00,AE_RN,0,N
diff --git a/tools/inputs/history/np4-193-cd-history-samples.csv b/tools/inputs/history/np4-193-cd-history-samples.csv
new file mode 100644
index 00000000..8317390a
--- /dev/null
+++ b/tools/inputs/history/np4-193-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Settlement_Point,TotalDAMEnergySold,DSTFlag
+03/13/2014,01:00,AUSTPL_ALL,0,N
+03/13/2014,01:00,BBSES_UNIT1,22.5,N
+03/13/2014,01:00,BBSES_UNIT2,137.5,N
diff --git a/tools/inputs/history/np4-194-cd-history-current.csv b/tools/inputs/history/np4-194-cd-history-current.csv
new file mode 100644
index 00000000..366d3b0a
--- /dev/null
+++ b/tools/inputs/history/np4-194-cd-history-current.csv
@@ -0,0 +1,4 @@
+DELIVERYDATE,HOURENDING,STL_PNT,TOTAL_PTP_OBL_AWARDED_SOURCE,TOTAL_PTP_OBL_AWARDED_SINK,DSTFlag
+09/07/2026,01:00,7RNCHSLR_ALL,20,23.4,N
+09/07/2026,01:00,A4_DGR1_RN,3.8,0,N
+09/07/2026,01:00,ABINDUST_RN,2,46.5,N
diff --git a/tools/inputs/history/np4-194-cd-history-samples.csv b/tools/inputs/history/np4-194-cd-history-samples.csv
new file mode 100644
index 00000000..23577302
--- /dev/null
+++ b/tools/inputs/history/np4-194-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DELIVERYDATE,HOURENDING,STL_PNT,TOTAL_PTP_OBL_AWARDED_SOURCE,TOTAL_PTP_OBL_AWARDED_SINK,DSTFlag
+06/26/2026,01:00,7RNCHSLR_ALL,0,40.7,N
+06/26/2026,01:00,A4_DGR1_RN,12.2,21.6,N
+06/26/2026,01:00,ABINDUST_RN,1.8,50,N
diff --git a/tools/inputs/history/np4-196-m-eblmp-current.csv b/tools/inputs/history/np4-196-m-eblmp-current.csv
new file mode 100644
index 00000000..4182a605
--- /dev/null
+++ b/tools/inputs/history/np4-196-m-eblmp-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,ElectricBusName,LMPOriginal,LMPCorrected,PriceCorrectionTime,DSTFlag
+12/06/2025,1,0022,45.3,45.31,12/09/2025 10:00:00,N
+12/06/2025,1,1000,46.18,46.19,12/09/2025 10:00:00,N
+12/06/2025,1,1309_1,49.26,49.27,12/09/2025 10:00:00,N
diff --git a/tools/inputs/history/np4-196-m-eblmp-samples.csv b/tools/inputs/history/np4-196-m-eblmp-samples.csv
new file mode 100644
index 00000000..03ac492b
--- /dev/null
+++ b/tools/inputs/history/np4-196-m-eblmp-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,ElectricBusName,LMPOriginal,LMPCorrected,PriceCorrectionTime,DSTFlag
+07/31/2015,1,EB_PENA3_ZBR,22.83,23.07,08/03/2015 15:00:00,N
+07/31/2015,2,EB_PENA3_ZBR,20.92,21.09,08/03/2015 15:00:00,N
+07/31/2015,3,EB_PENA3_ZBR,20.01,20.05,08/03/2015 15:00:00,N
diff --git a/tools/inputs/history/np4-196-m-mcpc-current.csv b/tools/inputs/history/np4-196-m-mcpc-current.csv
new file mode 100644
index 00000000..95820444
--- /dev/null
+++ b/tools/inputs/history/np4-196-m-mcpc-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,ASType,MCPCOriginal,MCPCCorrected,PriceCorrectionTime,DSTFlag
+06/27/2025,2,REGUP,1.21,1.3,09/26/2025 16:00:00,N
+06/27/2025,2,RRS,0.79,0.9,09/26/2025 16:00:00,N
+06/27/2025,3,REGDN,0.62,0.68,09/26/2025 16:00:00,N
diff --git a/tools/inputs/history/np4-196-m-mcpc-samples.csv b/tools/inputs/history/np4-196-m-mcpc-samples.csv
new file mode 100644
index 00000000..1bc42f68
--- /dev/null
+++ b/tools/inputs/history/np4-196-m-mcpc-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,ASType,MCPCOriginal,MCPCCorrected,PriceCorrectionTime,DSTFlag
+07/20/2018,15,NSPIN,139.79,140.06,07/23/2018 15:00:00,N
+07/20/2018,15,REGUP,140.59,140.86,07/23/2018 15:00:00,N
+07/20/2018,15,RRS,151.85,151.95,07/23/2018 15:00:00,N
diff --git a/tools/inputs/history/np4-196-m-spp-current.csv b/tools/inputs/history/np4-196-m-spp-current.csv
new file mode 100644
index 00000000..18d79b34
--- /dev/null
+++ b/tools/inputs/history/np4-196-m-spp-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,SettlementPoint,SPPOriginal,SPPCorrected,PriceCorrectionTime,DSTFlag
+12/06/2025,1,ASTRA_RN,46.61,46.62,12/09/2025 10:00:00,N
+12/06/2025,1,BIGSTAR_ALL,45.86,45.87,12/09/2025 10:00:00,N
+12/06/2025,1,CPSES_UNIT1,45.3,45.31,12/09/2025 10:00:00,N
diff --git a/tools/inputs/history/np4-196-m-spp-samples.csv b/tools/inputs/history/np4-196-m-spp-samples.csv
new file mode 100644
index 00000000..6d7d33bf
--- /dev/null
+++ b/tools/inputs/history/np4-196-m-spp-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,SettlementPoint,SPPOriginal,SPPCorrected,PriceCorrectionTime,DSTFlag
+07/31/2015,1,PENA_ALL,22.83,23.07,08/03/2015 15:00:00,N
+07/31/2015,2,PENA_ALL,20.92,21.09,08/03/2015 15:00:00,N
+07/31/2015,3,PENA_ALL,20.01,20.05,08/03/2015 15:00:00,N
diff --git a/tools/inputs/history/np4-197-m-eblmp-current.csv b/tools/inputs/history/np4-197-m-eblmp-current.csv
new file mode 100644
index 00000000..f728ca2f
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-eblmp-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,ElectricalBus,CappedLMPOriginal,UncappedLMPOriginal,CappedLMPCorrected,UncappedLMPCorrected,PriceCorrectionTime,RepeatedHourFlag
+08/30/2026 09:25:18,0001,15.9,15.9,15.66,16,09/01/2026 16:00:00,N
+08/30/2026 09:25:18,0001DUPV1_,15.92,15.92,15.65,16,09/01/2026 16:00:00,N
+08/30/2026 09:25:18,0001HWFG1,15.35,15.35,15.67,16,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-eblmp-samples.csv b/tools/inputs/history/np4-197-m-eblmp-samples.csv
new file mode 100644
index 00000000..608c0a77
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-eblmp-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,ElectricBusName,LMPOriginal,LMPCorrected,PriceCorrectionTime,DSTFlag
+09/25/2014 13:50:09,0001,34.36,33.4,09/28/2014 15:00:00,N
+09/25/2014 13:50:09,0001DUPV1_,33.67,33.61,09/28/2014 15:00:00,N
+09/25/2014 13:50:09,0001HWFG1,34.26,33.34,09/28/2014 15:00:00,N
diff --git a/tools/inputs/history/np4-197-m-eblmp_np4197_retry-current.csv b/tools/inputs/history/np4-197-m-eblmp_np4197_retry-current.csv
new file mode 100644
index 00000000..7d37130e
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-eblmp_np4197_retry-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,ElectricBusName,LMPOriginal,LMPCorrected,PriceCorrectionTime,DSTFlag
+07/07/2016 13:20:25,0001,25.91,18.12,07/08/2016 17:00:00,N
+07/07/2016 13:20:25,0001DUPV1_,30.26,23.94,07/08/2016 17:00:00,N
+07/07/2016 13:20:25,0001HWFG1,32.29,22.37,07/08/2016 17:00:00,N
diff --git a/tools/inputs/history/np4-197-m-mcpc_sced-current.csv b/tools/inputs/history/np4-197-m-mcpc_sced-current.csv
new file mode 100644
index 00000000..292f3671
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-mcpc_sced-current.csv
@@ -0,0 +1,2 @@
+SCEDTimestamp,ASType,CappedMCPCOriginal,UncappedMCPCOriginal,CappedMCPCCorrected,UncappedMCPCCorrected,PriceCorrectionTime,RepeatedHourFlag
+08/30/2026 09:15:19,REGDN,0.05,0.05,0.03,0.03,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-mcpc_sced-samples.csv b/tools/inputs/history/np4-197-m-mcpc_sced-samples.csv
new file mode 100644
index 00000000..89a76ae6
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-mcpc_sced-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,ASType,MCPCOriginal,MCPCCorrected,PriceCorrectionTime,RepeatedHourFlag
+01/10/2026 00:45:16,REGDN,0.06,0.07,07/13/2026 16:00:00,N
+01/10/2026 01:05:18,ECRS,0.13,0.12,07/13/2026 16:00:00,N
+01/10/2026 02:10:17,REGDN,0.11,0.12,07/13/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-mcpc_spp-current.csv b/tools/inputs/history/np4-197-m-mcpc_spp-current.csv
new file mode 100644
index 00000000..43a788b0
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-mcpc_spp-current.csv
@@ -0,0 +1,2 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,ASType,MCPCOriginal,MCPCCorrected,PriceCorrectionTime,RepeatedHourFlag
+08/30/2026,10,2,REGDN,0.05,0.04,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-mcpc_spp-samples.csv b/tools/inputs/history/np4-197-m-mcpc_spp-samples.csv
new file mode 100644
index 00000000..a5b82577
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-mcpc_spp-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,ASType,MCPCOriginal,MCPCCorrected,PriceCorrectionTime,RepeatedHourFlag
+01/10/2026,3,2,REGDN,0.15,0.16,07/10/2026 16:00:00,N
+01/10/2026,7,3,REGUP,0.1,0.08,07/10/2026 16:00:00,N
+01/10/2026,7,4,REGUP,0.13,0.11,07/10/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-shadowprice-current.csv b/tools/inputs/history/np4-197-m-shadowprice-current.csv
new file mode 100644
index 00000000..8f3b41db
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-shadowprice-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,ConstrID,ConstrName,ContingencyName,ShadowPriceOrig,ShadowPriceCorrected,LimitOrig,LimitCorrected,ValueOriginal,ValueCorrected,PriceCorrectionTime,DSTFlag
+08/30/2026 09:25:00,1,138_ALV_NAL_1,SMDOPHR5,0,2.62,392.9,392.3,373.3,392.3,09/01/2026 16:00:00,N
+08/30/2026 09:25:00,3,421__A,SSNDBGR5,4.19,0,1203.4,1203.8,1203.4,1184,09/01/2026 16:00:00,N
+08/30/2026 09:25:00,4,PNHNDL,BASE CASE,15.34,15.67,3939.8,3893.4,3939.8,3893.4,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-shadowprice-samples.csv b/tools/inputs/history/np4-197-m-shadowprice-samples.csv
new file mode 100644
index 00000000..f740233d
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-shadowprice-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,ConstrID,ConstrName,ContingencyName,ShadowPriceOrig,ShadowPriceCorrected,LimitOrig,LimitCorrected,ValueOriginal,ValueCorrected,PriceCorrectionTime,DSTFlag
+09/24/2014 19:15:08,2,ABNW_ELYT1_1,SMCEABS8,2800,0,36.2,36.2,37.9,32.5,09/26/2014 15:00:00,N
+09/24/2014 19:10:07,2,ABNW_ELYT1_1,SMCEABS8,2800,0,36.2,36.2,39.6,34.1,09/26/2014 15:00:00,N
+09/24/2014 19:05:08,2,ABNW_ELYT1_1,SMCEABS8,2800,0,36.2,36.2,40.9,35.5,09/26/2014 15:00:00,N
diff --git a/tools/inputs/history/np4-197-m-soglmp-current.csv b/tools/inputs/history/np4-197-m-soglmp-current.csv
new file mode 100644
index 00000000..d4664a0e
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-soglmp-current.csv
@@ -0,0 +1,4 @@
+ScedTimestamp,ResourceType,ResourceName,MeterName,MeterLMPOriginal,MeterLMPCorrected,RTRDPAOriginal,RTRDPACorrected,FinalLMPOriginal,FinalLMPCorrected,PriceCorrectionTime,RepeatedHourFlag
+08/30/2026 09:10:19,SODG,19599_1_PV_A1,10443720004133031,15.74,15.81,0,0,15.74,15.81,09/01/2026 16:00:00,N
+08/30/2026 09:15:19,SODG,19599_1_PV_A1,10443720004133031,15.59,15.63,0,0,15.59,15.63,09/01/2026 16:00:00,N
+08/30/2026 09:25:18,SODG,19599_1_PV_A1,10443720004133031,15.29,15.67,0,0,15.29,15.67,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-soglmp-samples.csv b/tools/inputs/history/np4-197-m-soglmp-samples.csv
new file mode 100644
index 00000000..7df9711d
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-soglmp-samples.csv
@@ -0,0 +1,4 @@
+ScedTimestamp,ResourceType,ResourceName,MeterName,MeterLMPOriginal,MeterLMPCorrected,RTORPAOriginal,RTORPACorrected,RTORDPAOriginal,RTORDPACorrected,FinalLMPOriginal,FinalLMPCorrected,PriceCorrectionTime,DSTFlag
+07/08/2022 13:40:12,SODG,ALEXIS_ALEXIS,CPLALXSGP0100,112.12,112.12,178.95,178.95,0.3,0,291.37,291.07,07/12/2022 15:00:00,N
+07/08/2022 13:45:13,SODG,ALEXIS_ALEXIS,CPLALXSGP0100,84.96,84.96,112.87,112.87,28.3,0,226.13,197.83,07/12/2022 15:00:00,N
+07/08/2022 13:50:12,SODG,ALEXIS_ALEXIS,CPLALXSGP0100,125.14,125.14,202.13,202.13,87.24,0,414.51,327.27,07/12/2022 15:00:00,N
diff --git a/tools/inputs/history/np4-197-m-sogprice-current.csv b/tools/inputs/history/np4-197-m-sogprice-current.csv
new file mode 100644
index 00000000..6676294d
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-sogprice-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,ResourceType,ResourceName,MeterName,PriceOriginal,PriceCorrected,PriceCorrectionTime,DSTFlag
+08/30/2026,10,1,SODG,19599_1_PV_A1,10443720004133031,15.66,15.68,09/01/2026 16:00:00,N
+08/30/2026,10,2,SODG,19599_1_PV_A1,10443720004133031,15.4,15.53,09/01/2026 16:00:00,N
+08/30/2026,10,2,SODG,19599_2_PV_2,10443720006303128,15.4,15.53,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-sogprice-samples.csv b/tools/inputs/history/np4-197-m-sogprice-samples.csv
new file mode 100644
index 00000000..12165920
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-sogprice-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,ResourceType,ResourceName,MeterName,PriceOriginal,PriceCorrected,PriceCorrectionTime,DSTFlag
+07/08/2022,14,4,SODG,ALEXIS_ALEXIS,CPLALXSGP0100,417.28,378.69,07/12/2022 16:00:00,N
+07/08/2022,14,3,SODG,ALEXIS_ALEXIS,CPLALXSGP0100,243.8,243.7,07/12/2022 16:00:00,N
+07/08/2022,15,2,SODG,ALEXIS_ALEXIS,CPLALXSGP0100,737.21,670.15,07/12/2022 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-splmp-current.csv b/tools/inputs/history/np4-197-m-splmp-current.csv
new file mode 100644
index 00000000..602e7b26
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-splmp-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,SettlementPoint,LMPOriginal,LMPCorrected,PriceCorrectionTime,DSTFlag
+08/30/2026 09:25:18,7RNCHSLR_ALL,16.13,15.66,09/01/2026 16:00:00,N
+08/30/2026 09:25:18,A4_DGR1_RN,15.97,15.65,09/01/2026 16:00:00,N
+08/30/2026 09:25:18,A4_DGR2_RN,15.97,15.65,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-splmp-samples.csv b/tools/inputs/history/np4-197-m-splmp-samples.csv
new file mode 100644
index 00000000..0ee127ea
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-splmp-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,SettlementPoint,LMPOriginal,LMPCorrected,PriceCorrectionTime,DSTFlag
+05/29/2014 18:05:09,CCEC_CC1,-784.91,-251,05/30/2014 16:00:00,N
+05/29/2014 18:05:09,CCEC_GT1,-784.91,-251,05/30/2014 16:00:00,N
+05/29/2014 18:05:09,CCEC_GT2,-784.91,-251,05/30/2014 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-spp-current.csv b/tools/inputs/history/np4-197-m-spp-current.csv
new file mode 100644
index 00000000..bb0485c2
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-spp-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,SettlementPointName,SettlementPointType,SPPOriginal,SPPCorrected,PriceCorrectionTime,DSTFlag
+08/30/2026,10,1,7RNCHSLR_ALL,RN,15.64,15.68,09/01/2026 16:00:00,N
+08/30/2026,10,3,7RNCHSLR_ALL,RN,16.85,16.84,09/01/2026 16:00:00,N
+08/30/2026,10,2,7RNCHSLR_ALL,RN,15.87,15.91,09/01/2026 16:00:00,N
diff --git a/tools/inputs/history/np4-197-m-spp-samples.csv b/tools/inputs/history/np4-197-m-spp-samples.csv
new file mode 100644
index 00000000..d725a3ec
--- /dev/null
+++ b/tools/inputs/history/np4-197-m-spp-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,SettlementPointName,SettlementPointType,SPPOriginal,SPPCorrected,PriceCorrectionTime,DSTFlag
+05/29/2014,19,1,CCEC_CC1,LCCRN,-225.33,-47.36,05/30/2014 16:00:00,N
+05/29/2014,19,1,CCEC_GT1,PCCRN,-225.33,-47.36,05/30/2014 16:00:00,N
+05/29/2014,19,1,CCEC_GT2,PCCRN,-225.33,-47.36,05/30/2014 16:00:00,N
diff --git a/tools/inputs/history/np4-200-cd-history-current.csv b/tools/inputs/history/np4-200-cd-history-current.csv
new file mode 100644
index 00000000..44af90ac
--- /dev/null
+++ b/tools/inputs/history/np4-200-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SettlementPoint,DSTFlag
+09/08/2026,01:00,APCH_BES_RN,N
+09/08/2026,01:00,ARMD_SLR_RN,N
+09/08/2026,01:00,BKBN_RN,N
diff --git a/tools/inputs/history/np4-200-cd-history-samples.csv b/tools/inputs/history/np4-200-cd-history-samples.csv
new file mode 100644
index 00000000..aa88552e
--- /dev/null
+++ b/tools/inputs/history/np4-200-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SettlementPoint,DSTFlag
+08/01/2026,01:00,ARMD_SLR_RN,N
+08/01/2026,01:00,BIRD_ESR1,N
+08/01/2026,01:00,BKBN_RN,N
diff --git a/tools/inputs/history/np4-212-cd-history-current.csv b/tools/inputs/history/np4-212-cd-history-current.csv
new file mode 100644
index 00000000..fb659c95
--- /dev/null
+++ b/tools/inputs/history/np4-212-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+09/06/2026,01:00,ECRS,1,0,5050,N
+09/06/2026,01:00,ECRS,2,345,5050,N
+09/06/2026,01:00,ECRS,3,346,3353.06,N
diff --git a/tools/inputs/history/np4-212-cd-history-samples.csv b/tools/inputs/history/np4-212-cd-history-samples.csv
new file mode 100644
index 00000000..ea4be0c8
--- /dev/null
+++ b/tools/inputs/history/np4-212-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+12/05/2025,01:00,ECRS,1,0,5050,N
+12/05/2025,01:00,ECRS,2,40,5050,N
+12/05/2025,01:00,ECRS,3,41,3353.06,N
diff --git a/tools/inputs/history/np4-213-cd-history-current.csv b/tools/inputs/history/np4-213-cd-history-current.csv
new file mode 100644
index 00000000..eedaac85
--- /dev/null
+++ b/tools/inputs/history/np4-213-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+09/07/2026,14:00,09/07/2026 12:03:03,ECRS,1,0,5050,N
+09/07/2026,14:00,09/07/2026 12:03:03,ECRS,2,378,5050,N
+09/07/2026,14:00,09/07/2026 12:03:03,ECRS,3,379,3353.06,N
diff --git a/tools/inputs/history/np4-213-cd-history-samples.csv b/tools/inputs/history/np4-213-cd-history-samples.csv
new file mode 100644
index 00000000..83bb3114
--- /dev/null
+++ b/tools/inputs/history/np4-213-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+02/26/2026,17:00,02/26/2026 15:03:03,ECRS,1,0,5050,N
+02/26/2026,17:00,02/26/2026 15:03:03,ECRS,2,40,5050,N
+02/26/2026,17:00,02/26/2026 15:03:03,ECRS,3,41,3353.06,N
diff --git a/tools/inputs/history/np4-214-cd-history-current.csv b/tools/inputs/history/np4-214-cd-history-current.csv
new file mode 100644
index 00000000..55025929
--- /dev/null
+++ b/tools/inputs/history/np4-214-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+09/07/2026,01:00,09/06/2026 14:33:04,ECRS,1,0,5050,N
+09/07/2026,01:00,09/06/2026 14:33:04,ECRS,2,345,5050,N
+09/07/2026,01:00,09/06/2026 14:33:04,ECRS,3,346,3353.06,N
diff --git a/tools/inputs/history/np4-214-cd-history-samples.csv b/tools/inputs/history/np4-214-cd-history-samples.csv
new file mode 100644
index 00000000..28e8dc8b
--- /dev/null
+++ b/tools/inputs/history/np4-214-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+02/28/2026,01:00,02/27/2026 14:33:01,ECRS,1,0,5050,N
+02/28/2026,01:00,02/27/2026 14:33:01,ECRS,2,40,5050,N
+02/28/2026,01:00,02/27/2026 14:33:01,ECRS,3,41,3353.06,N
diff --git a/tools/inputs/history/np4-215-cd-history-current.csv b/tools/inputs/history/np4-215-cd-history-current.csv
new file mode 100644
index 00000000..bbd8e490
--- /dev/null
+++ b/tools/inputs/history/np4-215-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+09/07/2026,01:00,09/06/2026 01:05:26,ECRS,1,0,5050,N
+09/07/2026,01:00,09/06/2026 01:05:26,ECRS,2,345,5050,N
+09/07/2026,01:00,09/06/2026 01:05:26,ECRS,3,346,3353.06,N
diff --git a/tools/inputs/history/np4-215-cd-history-samples.csv b/tools/inputs/history/np4-215-cd-history-samples.csv
new file mode 100644
index 00000000..86dbfc26
--- /dev/null
+++ b/tools/inputs/history/np4-215-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ASType,DemandCurvePoint,Quantity,Price,RepeatedHourFlag
+02/28/2026,01:00,02/27/2026 01:10:53,ECRS,1,0,5050,N
+02/28/2026,01:00,02/27/2026 01:10:53,ECRS,2,40,5050,N
+02/28/2026,01:00,02/27/2026 01:10:53,ECRS,3,41,3353.06,N
diff --git a/tools/inputs/history/np4-231-cd-history-current.csv b/tools/inputs/history/np4-231-cd-history-current.csv
new file mode 100644
index 00000000..6cd97518
--- /dev/null
+++ b/tools/inputs/history/np4-231-cd-history-current.csv
@@ -0,0 +1,4 @@
+MarketType,FromEBName,ToEBName,Type,Priority
+DAM,0014_EB,DOWGEN_040,Equal,1
+DAM,0014_EB,EB_DOWAUTO2,Equal,2
+DAM,0014_EB,EB_DOWAUTO5,Equal,3
diff --git a/tools/inputs/history/np4-231-cd-history-samples.csv b/tools/inputs/history/np4-231-cd-history-samples.csv
new file mode 100644
index 00000000..6cd97518
--- /dev/null
+++ b/tools/inputs/history/np4-231-cd-history-samples.csv
@@ -0,0 +1,4 @@
+MarketType,FromEBName,ToEBName,Type,Priority
+DAM,0014_EB,DOWGEN_040,Equal,1
+DAM,0014_EB,EB_DOWAUTO2,Equal,2
+DAM,0014_EB,EB_DOWAUTO5,Equal,3
diff --git a/tools/inputs/history/np4-33-cd-history-current.csv b/tools/inputs/history/np4-33-cd-history-current.csv
new file mode 100644
index 00000000..9972072a
--- /dev/null
+++ b/tools/inputs/history/np4-33-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,AncillaryType,Quantity,DSTFlag
+09/07/2026,01:00,ECRS,1150,N
+09/07/2026,01:00,NSPIN,1878,N
+09/07/2026,01:00,REGDN,392,N
diff --git a/tools/inputs/history/np4-33-cd-history-samples.csv b/tools/inputs/history/np4-33-cd-history-samples.csv
new file mode 100644
index 00000000..7b9201a8
--- /dev/null
+++ b/tools/inputs/history/np4-33-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,AncillaryType,Quantity,DSTFlag
+05/01/2014,01:00,NSPIN,1500,N
+05/01/2014,01:00,REGDN,505,N
+05/01/2014,01:00,REGUP,515,N
diff --git a/tools/inputs/history/np4-412-cd-epp-current.csv b/tools/inputs/history/np4-412-cd-epp-current.csv
new file mode 100644
index 00000000..faf1079f
--- /dev/null
+++ b/tools/inputs/history/np4-412-cd-epp-current.csv
@@ -0,0 +1,2 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,AvgRTSystemLambda,AvgRTRDPA,SumRTSysLambdaRTRDPA,HCAPforDAM,CumHrsHCAPDAM24Hrs,RepeatedHourFlag
+09/07/2026,13,4,34.12,0,34.12,5000,0,N
diff --git a/tools/inputs/history/np4-412-cd-epp-samples.csv b/tools/inputs/history/np4-412-cd-epp-samples.csv
new file mode 100644
index 00000000..f909d7df
--- /dev/null
+++ b/tools/inputs/history/np4-412-cd-epp-samples.csv
@@ -0,0 +1,2 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,AvgRTSystemLambda,AvgRTRDPA,SumRTSysLambdaRTRDPA,HCAPforDAM,CumHrsHCAPDAM24Hrs,RepeatedHourFlag
+12/04/2025,24,4,44.32,0,44.32,5000,0,N
diff --git a/tools/inputs/history/np4-442-cd-history-current.csv b/tools/inputs/history/np4-442-cd-history-current.csv
new file mode 100644
index 00000000..7fc17af0
--- /dev/null
+++ b/tools/inputs/history/np4-442-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Region,Value,Model,InUseFlag,DSTFlag
+09/05/2026,12,SYSTEM_TOTAL,2661.1,S,Y,N
+09/05/2026,12,COASTAL,703.3,WF1,N,N
+09/05/2026,12,NORTH,88.1,WF1,N,N
diff --git a/tools/inputs/history/np4-442-cd-history-samples.csv b/tools/inputs/history/np4-442-cd-history-samples.csv
new file mode 100644
index 00000000..edddd3cb
--- /dev/null
+++ b/tools/inputs/history/np4-442-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Region,Value,Model,InUseFlag,DSTFlag
+08/04/2020,17,SYSTEM_TOTAL,3642.6999969482422,S,Y,N
+08/04/2020,17,COASTAL,739.5,WF1,N,N
+08/04/2020,17,NORTH,90.6999969482422,WF1,N,N
diff --git a/tools/inputs/history/np4-443-cd-history-current.csv b/tools/inputs/history/np4-443-cd-history-current.csv
new file mode 100644
index 00000000..3f900b71
--- /dev/null
+++ b/tools/inputs/history/np4-443-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Region,Value,Model,InUseFlag,DSTFlag
+09/05/2026,12,CENTEREAST,3940.5,PVGRPP1,N,N
+09/05/2026,12,CENTERWEST,4255.9,PVGRPP1,N,N
+09/05/2026,12,FAREAST,10791.5,PVGRPP1,N,N
diff --git a/tools/inputs/history/np4-443-cd-history-samples.csv b/tools/inputs/history/np4-443-cd-history-samples.csv
new file mode 100644
index 00000000..078559af
--- /dev/null
+++ b/tools/inputs/history/np4-443-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Region,Value,Model,InUseFlag,DSTFlag
+03/24/2026,12,CENTEREAST,3378.1,PVGRPP1,N,N
+03/24/2026,12,CENTERWEST,3474,PVGRPP1,N,N
+03/24/2026,12,FAREAST,9450.6,PVGRPP1,N,N
diff --git a/tools/inputs/history/np4-494-er-history-current.xlsx b/tools/inputs/history/np4-494-er-history-current.xlsx
new file mode 100644
index 00000000..61a1606c
Binary files /dev/null and b/tools/inputs/history/np4-494-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np4-494-er-history-samples.xlsx b/tools/inputs/history/np4-494-er-history-samples.xlsx
new file mode 100644
index 00000000..84918e7e
Binary files /dev/null and b/tools/inputs/history/np4-494-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np4-523-cd-history-current.csv b/tools/inputs/history/np4-523-cd-history-current.csv
new file mode 100644
index 00000000..60d50d8b
--- /dev/null
+++ b/tools/inputs/history/np4-523-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SystemLambda,DSTFlag
+09/07/2026,1:00,44.2834,N
+09/07/2026,2:00,39.9507,N
+09/07/2026,3:00,37.351,N
diff --git a/tools/inputs/history/np4-523-cd-history-samples.csv b/tools/inputs/history/np4-523-cd-history-samples.csv
new file mode 100644
index 00000000..66dff2f8
--- /dev/null
+++ b/tools/inputs/history/np4-523-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,SystemLambda,DSTFlag
+05/02/2014,1:00,30.0995,N
+05/02/2014,2:00,27.7101,N
+05/02/2014,3:00,26.2982,N
diff --git a/tools/inputs/history/np4-532-cd-history-current.csv b/tools/inputs/history/np4-532-cd-history-current.csv
new file mode 100644
index 00000000..1265cf9b
--- /dev/null
+++ b/tools/inputs/history/np4-532-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ASType,Quantity,RepeatedHourFlag
+09/08/2026,01:00,ECRSM,247.8,N
+09/08/2026,01:00,ECRSS,691.8,N
+09/08/2026,01:00,OFFEC,221.4,N
diff --git a/tools/inputs/history/np4-532-cd-history-samples.csv b/tools/inputs/history/np4-532-cd-history-samples.csv
new file mode 100644
index 00000000..c961e784
--- /dev/null
+++ b/tools/inputs/history/np4-532-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ASType,Quantity,RepeatedHourFlag
+12/06/2025,01:00,ECRSM,182.1,N
+12/06/2025,01:00,ECRSS,125.3,N
+12/06/2025,01:00,OFFEC,576.6,N
diff --git a/tools/inputs/history/np4-722-cd-history-current.csv b/tools/inputs/history/np4-722-cd-history-current.csv
new file mode 100644
index 00000000..074ea50c
--- /dev/null
+++ b/tools/inputs/history/np4-722-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,DSTFlag
+09/04/2026,02:00,82.7,77.5,84.5,80.5,79.5,81.5,84.4,85,N
+09/04/2026,03:00,82.9,76.5,85.5,79,79,81,83.8,83.2,N
+09/04/2026,04:00,81.7,76,83.5,78,77.25,80.5,82.8,82,N
diff --git a/tools/inputs/history/np4-722-cd-history-samples.csv b/tools/inputs/history/np4-722-cd-history-samples.csv
new file mode 100644
index 00000000..04c18bd2
--- /dev/null
+++ b/tools/inputs/history/np4-722-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Coast,East,FarWest,North,NorthCentral,SouthCentral,Southern,West,DSTFlag
+06/23/2026,02:00,81.9, 80.5, 82.5, 79, 83, 80, 82.4, 82,N
+06/23/2026,03:00,81.2, 79.5, 81, 78, 82.25, 79, 81.8, 80.6,N
+06/23/2026,04:00,81.2, 78.5, 80, 77.5, 81, 79.5, 81.2, 78.6,N
diff --git a/tools/inputs/history/np4-732-cd-history-current.csv b/tools/inputs/history/np4-732-cd-history-current.csv
new file mode 100644
index 00000000..18e76d93
--- /dev/null
+++ b/tools/inputs/history/np4-732-cd-history-current.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,SYSTEM_WIDE_GEN,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,GEN_LZ_SOUTH_HOUSTON,COP_HSL_LZ_SOUTH_HOUSTON,STWPF_LZ_SOUTH_HOUSTON,WGRPP_LZ_SOUTH_HOUSTON,GEN_LZ_WEST,COP_HSL_LZ_WEST,STWPF_LZ_WEST,WGRPP_LZ_WEST,GEN_LZ_NORTH,COP_HSL_LZ_NORTH,STWPF_LZ_NORTH,WGRPP_LZ_NORTH,SYSTEM_WIDE_HSL,DSTFlag
+09/05/2026,11,4230.6,3756.3,4089,4089,1665.85,988.9,1579.2,1579.2,2435.26,2662.6,2413,2413,129.49,104.8,96.8,96.8,4843.28,N
+09/05/2026,12,3000.43,3460.5,2661.1,2661.1,1419.98,1296.4,1332.8,1332.8,1517.54,2094.5,1310.2,1310.2,62.91,69.6,18.1,18.1,3405.96,N
+09/05/2026,13,2691.1,3354.8,2824.5,2132.7,1298.69,1493.2,1312.2,1098.7,1323.72,1753.6,1432.9,1015.2,68.69,108,79.4,18.8,2844.86,N
diff --git a/tools/inputs/history/np4-732-cd-history-samples.csv b/tools/inputs/history/np4-732-cd-history-samples.csv
new file mode 100644
index 00000000..dbf7ea45
--- /dev/null
+++ b/tools/inputs/history/np4-732-cd-history-samples.csv
@@ -0,0 +1,4 @@
+HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_SOUTH_HOUSTON,COP_HSL_SOUTH_HOUSTON,STWPF_SOUTH_HOUSTON,WGRPP_SOUTH_HOUSTON,ACTUAL_WEST_NORTH,COP_HSL_WEST_NORTH,STWPF_WEST_NORTH,WGRPP_WEST_NORTH,DSTFlag
+04/29/2014 01:00,4222.85,5540.7,5410.8,4510.1,960.72,1238.5,1333.8,1102.6,3262.13,4302.2,4077,3407.5,N
+04/29/2014 02:00,5103.39,5891.6,4938.2,4037.1,1027.02,1270.8,1090.4,859.4,4076.37,4620.8,3847.8,3177.7,N
+04/29/2014 03:00,5249.97,5644.9,5843.5,4942.9,1015.66,1258.2,1208.9,977.7,4234.31,4386.7,4634.6,3965.2,N
diff --git a/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2016.csv b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2016.csv
new file mode 100644
index 00000000..3fd093c3
--- /dev/null
+++ b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2016.csv
@@ -0,0 +1,4 @@
+HOUR_BEGINNING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_SOUTH_HOUSTON,COP_HSL_SOUTH_HOUSTON,STWPF_SOUTH_HOUSTON,WGRPP_SOUTH_HOUSTON,ACTUAL_WEST_NORTH,COP_HSL_WEST_NORTH,STWPF_WEST_NORTH,WGRPP_WEST_NORTH,DSTFlag
+01/30/2016 00:00,6986.24,7732.1,7960.3,6761.2,2151.24,2358.7,2429,2174.9,4835,5373.4,5531.3,4586.3,N
+01/30/2016 01:00,6482.05,7174.4,7004.8,5783.2,2039.62,2203.1,2201.5,1947.5,4442.43,4971.3,4803.3,3835.7,N
+01/30/2016 02:00,5979.41,6937.7,6747.9,5494.9,2020.17,2106.1,2178.9,1924.7,3959.24,4831.6,4569,3570.2,N
diff --git a/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2017.csv b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2017.csv
new file mode 100644
index 00000000..cb2416ce
--- /dev/null
+++ b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2017.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_SOUTH_HOUSTON,COP_HSL_SOUTH_HOUSTON,STWPF_SOUTH_HOUSTON,WGRPP_SOUTH_HOUSTON,ACTUAL_WEST_NORTH,COP_HSL_WEST_NORTH,STWPF_WEST_NORTH,WGRPP_WEST_NORTH,DSTFlag
+01/29/2017,24,7172.73,7882.2,7655.4,6328.2,751.69,582.1,594.7,355.6,6421.04,7300.1,7060.7,5972.6,N
+01/30/2017,01,7627.72,8155.8,7892.9,6537,978.62,604.9,707.5,446.8,6649.1,7550.9,7185.4,6090.2,N
+01/30/2017,02,7751.49,8332.2,8281.3,6892.9,1043.79,711.3,906.5,617.9,6707.7,7620.9,7374.8,6275,N
diff --git a/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2020.csv b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2020.csv
new file mode 100644
index 00000000..9611cbd8
--- /dev/null
+++ b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2020.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_LZ_SOUTH_HOUSTON,COP_HSL_LZ_SOUTH_HOUSTON,STWPF_LZ_SOUTH_HOUSTON,WGRPP_LZ_SOUTH_HOUSTON,ACTUAL_LZ_WEST,COP_HSL_LZ_WEST,STWPF_LZ_WEST,WGRPP_LZ_WEST,ACTUAL_LZ_NORTH,COP_HSL_LZ_NORTH,STWPF_LZ_NORTH,WGRPP_LZ_NORTH,DSTFlag
+01/29/2020,24,8380.21,8867.9,8495.7,6074.6,3156.38,3144.6,3222.4,2418.6,4921.15,5319.5,4970.9,3448.3,302.68,403.8,302.4,207.7,N
+01/30/2020,01,7508.55,8019.6,7645.3,5463.4,2866.59,3231.2,2916.2,2137.7,4368.9,4464.1,4451.7,3137.6,273.06,324.3,277.4,188.1,N
+01/30/2020,02,6632.11,7044.4,6688.3,4693,2461.57,2886.3,2461.4,1792.1,3956.01,3951.3,4003.8,2757.1,214.53,206.8,223.1,143.8,N
diff --git a/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2023.csv b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2023.csv
new file mode 100644
index 00000000..ef360c31
--- /dev/null
+++ b/tools/inputs/history/np4-732-cd-wpp_hrly_avrg_actl_fcast-2023.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_LZ_SOUTH_HOUSTON,COP_HSL_LZ_SOUTH_HOUSTON,STWPF_LZ_SOUTH_HOUSTON,WGRPP_LZ_SOUTH_HOUSTON,ACTUAL_LZ_WEST,COP_HSL_LZ_WEST,STWPF_LZ_WEST,WGRPP_LZ_WEST,ACTUAL_LZ_NORTH,COP_HSL_LZ_NORTH,STWPF_LZ_NORTH,WGRPP_LZ_NORTH,DSTFlag
+08/29/2023,24,6304.72,6766.6,6314.1,3616.8,702.54,529.1,723.1,420.5,4966.96,5397.9,4912.8,2811.4,635.22,839.6,678.2,384.9,N
+08/30/2023,01,5972.69,6063.6,5984,3399.8,702.4,560.7,648.7,341.4,4782.35,4731.8,4837.1,2800.2,487.94,771.1,498.2,258.2,N
+08/30/2023,02,5147.42,5196.8,5313.7,2900.2,755.26,553,746.4,392.7,4027.74,4145,4186,2317.8,364.42,498.8,381.3,189.7,N
diff --git a/tools/inputs/history/np4-733-cd-history-current.csv b/tools/inputs/history/np4-733-cd-history-current.csv
new file mode 100644
index 00000000..2ad99017
--- /dev/null
+++ b/tools/inputs/history/np4-733-cd-history-current.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE_GEN,LZ_SOUTH_HOUSTON,LZ_WEST,LZ_NORTH,SYSTEM_WIDE_HSL,DSTFlag
+09/07/2026 11:10,2813.42,1156.55,1600.67,56.21,3146.3,N
+09/07/2026 11:15,2835.51,1163.17,1616.11,56.22,3171.68,N
+09/07/2026 11:20,2898.53,1160.26,1673.84,64.43,3233.12,N
diff --git a/tools/inputs/history/np4-733-cd-history-samples.csv b/tools/inputs/history/np4-733-cd-history-samples.csv
new file mode 100644
index 00000000..cf7537ba
--- /dev/null
+++ b/tools/inputs/history/np4-733-cd-history-samples.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE,SOUTH_HOUSTON,WEST_NORTH,DSTFlag
+04/30/2014 23:00,1138.27,493.14,645.12,N
+04/30/2014 23:05,1105.55,491.95,613.6,N
+04/30/2014 23:10,1108.23,503.28,604.95,N
diff --git a/tools/inputs/history/np4-737-cd-history-2017.csv b/tools/inputs/history/np4-737-cd-history-2017.csv
new file mode 100644
index 00000000..37d267ab
--- /dev/null
+++ b/tools/inputs/history/np4-737-cd-history-2017.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STPPF_SYSTEM_WIDE,PVGRPP_SYSTEM_WIDE,DSTFlag
+01/29/2017,24,0,0,0,0,N
+01/30/2017,01,0.09,0,0,0,N
+02/07/2017,23,,0,0,0,N
diff --git a/tools/inputs/history/np4-737-cd-history-current.csv b/tools/inputs/history/np4-737-cd-history-current.csv
new file mode 100644
index 00000000..790ef41e
--- /dev/null
+++ b/tools/inputs/history/np4-737-cd-history-current.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,SYSTEM_WIDE_GEN,COP_HSL_SYSTEM_WIDE,STPPF_SYSTEM_WIDE,PVGRPP_SYSTEM_WIDE,SYSTEM_WIDE_HSL,DSTFlag
+09/05/2026,12,30281.46,31037,29787.6,28375,30623.38,N
+09/05/2026,13,29715.11,30122.2,28980.2,27416.3,29925.1,N
+09/05/2026,14,28920.79,28506.2,28055.2,26406.6,29085.69,N
diff --git a/tools/inputs/history/np4-737-cd-history-samples.csv b/tools/inputs/history/np4-737-cd-history-samples.csv
new file mode 100644
index 00000000..2c8f55ed
--- /dev/null
+++ b/tools/inputs/history/np4-737-cd-history-samples.csv
@@ -0,0 +1,4 @@
+HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STPPF_SYSTEM_WIDE,PVGRPP_SYSTEM_WIDE,DSTFlag
+02/08/2016 00:00,0,29.4,0,0,N
+02/08/2016 01:00,0,29.4,0,0,N
+02/08/2016 02:00,0,29.4,0,0,N
diff --git a/tools/inputs/history/np4-738-cd-history-current.csv b/tools/inputs/history/np4-738-cd-history-current.csv
new file mode 100644
index 00000000..a809decd
--- /dev/null
+++ b/tools/inputs/history/np4-738-cd-history-current.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE_GEN,SYSTEM_WIDE_HSL,DSTFlag
+09/07/2026 11:10,32404.92,32603.65,N
+09/07/2026 11:15,32337.17,32570.19,N
+09/07/2026 11:20,32497.77,32676.46,N
diff --git a/tools/inputs/history/np4-738-cd-history-samples.csv b/tools/inputs/history/np4-738-cd-history-samples.csv
new file mode 100644
index 00000000..ec51ff5c
--- /dev/null
+++ b/tools/inputs/history/np4-738-cd-history-samples.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE,DSTFlag
+02/09/2016 23:00,0,N
+02/09/2016 23:05,0,N
+02/09/2016 23:10,0,N
diff --git a/tools/inputs/history/np4-742-cd-history-current.csv b/tools/inputs/history/np4-742-cd-history-current.csv
new file mode 100644
index 00000000..32253e8e
--- /dev/null
+++ b/tools/inputs/history/np4-742-cd-history-current.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,SYSTEM_WIDE_GEN,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,GEN_PANHANDLE,COP_HSL_PANHANDLE,STWPF_PANHANDLE,WGRPP_PANHANDLE,GEN_COASTAL,COP_HSL_COASTAL,STWPF_COASTAL,WGRPP_COASTAL,GEN_SOUTH,COP_HSL_SOUTH,STWPF_SOUTH,WGRPP_SOUTH,GEN_WEST,COP_HSL_WEST,STWPF_WEST,WGRPP_WEST,GEN_NORTH,COP_HSL_NORTH,STWPF_NORTH,WGRPP_NORTH,SYSTEM_WIDE_HSL,DSTFlag
+09/05/2026,12,3000.43,3460.5,2661.1,2661.1,652,695.9,659.4,659.4,662.57,590.5,620.9,620.9,697.69,646.6,660.5,660.5,927.09,1472.9,703.8,703.8,61.08,54.6,16.5,16.5,3405.97,N
+09/05/2026,13,2691.09,3354.8,2824.5,2132.7,663.14,733.6,708.5,606.6,789.35,878.1,800.3,685.4,469.2,561.6,468.2,384,702.73,1080.5,771.4,439.3,66.67,101,76.1,17.4,2844.86,N
+09/05/2026,14,3717.14,3606.2,3851.1,3147,790.42,686.8,862.8,770.2,1418.4,1366.1,1355.5,1247.6,438.09,535.6,471.5,391.3,980.43,920,1066.2,696.4,89.8,97.7,95.1,41.5,3754.28,N
diff --git a/tools/inputs/history/np4-742-cd-history-samples.csv b/tools/inputs/history/np4-742-cd-history-samples.csv
new file mode 100644
index 00000000..07c05cba
--- /dev/null
+++ b/tools/inputs/history/np4-742-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_PANHANDLE,COP_HSL_PANHANDLE,STWPF_PANHANDLE,WGRPP_PANHANDLE,ACTUAL_COASTAL,COP_HSL_COASTAL,STWPF_COASTAL,WGRPP_COASTAL,ACTUAL_SOUTH,COP_HSL_SOUTH,STWPF_SOUTH,WGRPP_SOUTH,ACTUAL_WEST,COP_HSL_WEST,STWPF_WEST,WGRPP_WEST,ACTUAL_NORTH,COP_HSL_NORTH,STWPF_NORTH,WGRPP_NORTH,DSTFlag
+05/09/2017,16,11030.67,10662.3,10985.1,9430.8,2271.84,2296,2382.8,2039.6,1992.77,1857.6,1970.4,1795.3,1792.79,1752.9,1826.1,1625.8,4640.31,4316.2,4433.7,3682.1,332.96,439.6,372.1,288,N
+05/09/2017,17,11952.01,11738.5,12011.4,10456.7,2826.75,2722.3,2763.4,2419.8,2004.25,1851,1979.4,1804.3,1700.94,1883.1,1880.1,1679.6,5001.14,4813.9,4975.1,4223.9,418.93,468.2,413.4,329.1,N
+05/09/2017,18,12715.43,12435.2,12550.1,10995.8,3211.42,2898.1,3095.7,2752.4,2004.67,1844.6,1975.1,1800.1,1775.67,1948.4,1815.9,1615.2,5360.5,5258.5,5198.6,4447.5,363.17,485.6,464.8,380.6,N
diff --git a/tools/inputs/history/np4-743-cd-history-current.csv b/tools/inputs/history/np4-743-cd-history-current.csv
new file mode 100644
index 00000000..b5bc209a
--- /dev/null
+++ b/tools/inputs/history/np4-743-cd-history-current.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE_GEN,PANHANDLE,COASTAL,SOUTH,WEST,NORTH,SYSTEM_WIDE_HSL,DSTFlag
+09/07/2026 11:10,2813.42,644.5,439.77,675.7,1000.34,53.11,3146.3,N
+09/07/2026 11:15,2835.51,656.92,463.62,656.68,1005.15,53.13,3171.68,N
+09/07/2026 11:20,2898.53,688.71,452.36,663.58,1033.38,60.5,3233.12,N
diff --git a/tools/inputs/history/np4-743-cd-history-samples.csv b/tools/inputs/history/np4-743-cd-history-samples.csv
new file mode 100644
index 00000000..a53493a1
--- /dev/null
+++ b/tools/inputs/history/np4-743-cd-history-samples.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE,PANHANDLE,COASTAL,SOUTH,WEST,NORTH,DSTFlag
+05/11/2017 13:55,7593.69,2993.34,1591.15,225.51,2682.19,101.51,N
+05/11/2017 14:00,7594.45,2981.04,1592.48,238.34,2693.88,88.7,N
+05/11/2017 14:05,7636.96,3011.03,1582.99,243.77,2707.16,92.02,N
diff --git a/tools/inputs/history/np4-745-cd-history-current.csv b/tools/inputs/history/np4-745-cd-history-current.csv
new file mode 100644
index 00000000..ccbeca31
--- /dev/null
+++ b/tools/inputs/history/np4-745-cd-history-current.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,SYSTEM_WIDE_GEN,COP_HSL_SYSTEM_WIDE,STPPF_SYSTEM_WIDE,PVGRPP_SYSTEM_WIDE,GEN_CenterWest,COP_HSL_CenterWest,STPPF_CenterWest,PVGRPP_CenterWest,GEN_NorthWest,COP_HSL_NorthWest,STPPF_NorthWest,PVGRPP_NorthWest,GEN_FarWest,COP_HSL_FarWest,STPPF_FarWest,PVGRPP_FarWest,GEN_FarEast,COP_HSL_FarEast,STPPF_FarEast,PVGRPP_FarEast,GEN_SouthEast,COP_HSL_SouthEast,STPPF_SouthEast,PVGRPP_SouthEast,GEN_CenterEast,COP_HSL_CenterEast,STPPF_CenterEast,PVGRPP_CenterEast,SYSTEM_WIDE_HSL,DSTFlag
+09/05/2026,12,30281.47,31037,29787.6,28375,4566.3,4474.6,4506.3,4255.9,2379.05,2346.2,2369.8,2313.1,5302.6,5140.8,5188.7,4981.4,11275.85,12071,11384.6,10791.5,2432.33,2429.8,2215.9,2092.6,4325.34,4574.6,4122.3,3940.5,30623.38,N
+09/05/2026,13,29715.11,30122.2,28980.2,27416.3,4242.83,4337.5,4293.2,3951.6,2357.46,2330.3,2358.2,2294.1,5180.02,5081.8,5092.1,4843.8,11192.51,11560.7,10416.9,9873.8,2652.8,2441.2,2758,2598,4089.49,4370.7,4061.8,3855,29925.11,N
+09/05/2026,14,28920.8,28506.2,28055.2,26406.6,4166.27,4217.4,4076.1,3778.5,2324.57,2285.2,2344.1,2273.8,5146.85,4854.7,5027.4,4783.7,10574.33,10608.9,10066.8,9433.7,2724.13,2479.6,2831.8,2700.7,3984.65,4060.4,3709,3436.2,29085.69,N
diff --git a/tools/inputs/history/np4-745-cd-history-samples.csv b/tools/inputs/history/np4-745-cd-history-samples.csv
new file mode 100644
index 00000000..2c8f5823
--- /dev/null
+++ b/tools/inputs/history/np4-745-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DELIVERY_DATE,HOUR_ENDING,GEN_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STPPF_SYSTEM_WIDE,PVGRPP_SYSTEM_WIDE,GEN_CenterWest,COP_HSL_CenterWest,STPPF_CenterWest,PVGRPP_CenterWest,GEN_NorthWest,COP_HSL_NorthWest,STPPF_NorthWest,PVGRPP_NorthWest,GEN_FarWest,COP_HSL_FarWest,STPPF_FarWest,PVGRPP_FarWest,GEN_FarEast,COP_HSL_FarEast,STPPF_FarEast,PVGRPP_FarEast,GEN_SouthEast,COP_HSL_SouthEast,STPPF_SouthEast,PVGRPP_SouthEast,GEN_CenterEast,COP_HSL_CenterEast,STPPF_CenterEast,PVGRPP_CenterEast,DSTFlag
+06/28/2022,17,7622.22,6428.5,6533,5104,1590.59,1160.1,1213.4,877.1,312.51,260.3,312.4,262.3,3078.23,2755.5,2775,2194.2,1907.22,1442.2,1543.9,1275.4,339.6,383.6,397.6,298.2,394.07,426.8,290.7,196.8,N
+06/28/2022,18,6158.26,5841.7,6231,4616.9,1416.92,1114.8,1357.1,979.8,272.31,247,305.6,225.9,2538.86,2420.9,2511,1828.5,1381.35,1350,1451.9,1176.8,191.07,342.7,312.5,228.6,357.75,366.3,292.9,177.3,N
+06/28/2022,19,4912.19,4750.6,5019.6,3771,1280.85,978.1,1327.1,1043.2,243.89,235.9,244,192.2,1858.92,2036.5,2010.8,1481.7,1022.54,1030.9,996,792.3,161.01,232.1,169.4,91.7,344.98,237.1,272.3,169.9,N
diff --git a/tools/inputs/history/np4-746-cd-history-current.csv b/tools/inputs/history/np4-746-cd-history-current.csv
new file mode 100644
index 00000000..851a9468
--- /dev/null
+++ b/tools/inputs/history/np4-746-cd-history-current.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE_GEN,CenterWest_GEN,NorthWest_GEN,FarWest_GEN,FarEast_GEN,SouthEast_GEN,CenterEast_GEN,SYSTEM_WIDE_HSL,DSTFlag
+09/07/2026 11:10:30 AM,32404.92,4545.62,2363.6,5310.11,12736.52,3025.47,4423.61,32603.65,N
+09/07/2026 11:15:30 AM,32337.17,4529.49,2363.1,5319.88,12630.4,3040.12,4454.19,32570.19,N
+09/07/2026 11:20:30 AM,32497.77,4529.8,2361.56,5326.22,12746.16,3080.98,4453.06,32676.46,N
diff --git a/tools/inputs/history/np4-746-cd-history-samples.csv b/tools/inputs/history/np4-746-cd-history-samples.csv
new file mode 100644
index 00000000..e7eb2690
--- /dev/null
+++ b/tools/inputs/history/np4-746-cd-history-samples.csv
@@ -0,0 +1,4 @@
+INTERVAL_ENDING,SYSTEM_WIDE_GEN,CenterWest_GEN,NorthWest_GEN,FarWest_GEN,FarEast_GEN,SouthEast_GEN,CenterEast_GEN,DSTFlag
+06/30/2022 03:45:15 PM,8109.4,1600.07,368.84,3369.92,1764.36,478.21,527.99,N
+06/30/2022 03:50:15 PM,8150.77,1585.99,368.52,3476.91,1761.43,459.99,497.92,N
+06/30/2022 03:55:15 PM,8214.97,1522.79,366.58,3584.06,1777.55,474.64,489.35,N
diff --git a/tools/inputs/history/np4-751-cd-history-current.csv b/tools/inputs/history/np4-751-cd-history-current.csv
new file mode 100644
index 00000000..8085b5ca
--- /dev/null
+++ b/tools/inputs/history/np4-751-cd-history-current.csv
@@ -0,0 +1,4 @@
+IntervalEnding,Region,Value,Model,InUseFlag,DSTFlag
+09/07/2026 12:45,COASTAL,536.7,A,Y,N
+09/07/2026 12:45,COASTAL,509.12,B,N,N
+09/07/2026 12:45,COASTAL,522.91,C,N,N
diff --git a/tools/inputs/history/np4-751-cd-history-samples.csv b/tools/inputs/history/np4-751-cd-history-samples.csv
new file mode 100644
index 00000000..70daaaa2
--- /dev/null
+++ b/tools/inputs/history/np4-751-cd-history-samples.csv
@@ -0,0 +1,4 @@
+IntervalEnding,Region,Value,Model,InUseFlag,DSTFlag
+03/26/2026 11:45,COASTAL,2615.1,A,Y,N
+03/26/2026 11:45,COASTAL,2581.53,B,N,N
+03/26/2026 11:45,COASTAL,2598.32,C,N,N
diff --git a/tools/inputs/history/np4-752-cd-history-current.csv b/tools/inputs/history/np4-752-cd-history-current.csv
new file mode 100644
index 00000000..84efc5d3
--- /dev/null
+++ b/tools/inputs/history/np4-752-cd-history-current.csv
@@ -0,0 +1,4 @@
+IntervalEnding,Region,Value,Model,InUseFlag,DSTFlag
+09/07/2026 12:45,CENTEREAST,4616.9,A,N,N
+09/07/2026 12:45,CENTEREAST,4487.8,B,Y,N
+09/07/2026 12:45,CENTEREAST,4552.35,C,N,N
diff --git a/tools/inputs/history/np4-752-cd-history-samples.csv b/tools/inputs/history/np4-752-cd-history-samples.csv
new file mode 100644
index 00000000..87fec70c
--- /dev/null
+++ b/tools/inputs/history/np4-752-cd-history-samples.csv
@@ -0,0 +1,4 @@
+IntervalEnding,Region,Value,Model,InUseFlag,DSTFlag
+03/26/2026 11:45,CENTEREAST,4494.1,A,N,N
+03/26/2026 11:45,CENTEREAST,4665.2,B,Y,N
+03/26/2026 11:45,CENTEREAST,4579.65,C,N,N
diff --git a/tools/inputs/history/np4-765-er-current.pdf b/tools/inputs/history/np4-765-er-current.pdf
new file mode 100644
index 00000000..97d76e53
Binary files /dev/null and b/tools/inputs/history/np4-765-er-current.pdf differ
diff --git a/tools/inputs/history/np4-765-er-fall.pdf b/tools/inputs/history/np4-765-er-fall.pdf
new file mode 100644
index 00000000..44b92754
Binary files /dev/null and b/tools/inputs/history/np4-765-er-fall.pdf differ
diff --git a/tools/inputs/history/np4-765-er-old.pdf b/tools/inputs/history/np4-765-er-old.pdf
new file mode 100644
index 00000000..1ef5b692
Binary files /dev/null and b/tools/inputs/history/np4-765-er-old.pdf differ
diff --git a/tools/inputs/history/np4-765-er-spring.pdf b/tools/inputs/history/np4-765-er-spring.pdf
new file mode 100644
index 00000000..482d67eb
Binary files /dev/null and b/tools/inputs/history/np4-765-er-spring.pdf differ
diff --git a/tools/inputs/history/np4-790-cd-history-current.csv b/tools/inputs/history/np4-790-cd-history-current.csv
new file mode 100644
index 00000000..8c1c67ad
--- /dev/null
+++ b/tools/inputs/history/np4-790-cd-history-current.csv
@@ -0,0 +1,2 @@
+AsOfDate,PeakerNetMargin
+09/06/2026 16:00:00,52494.23
diff --git a/tools/inputs/history/np4-790-cd-history-samples.csv b/tools/inputs/history/np4-790-cd-history-samples.csv
new file mode 100644
index 00000000..0febb90b
--- /dev/null
+++ b/tools/inputs/history/np4-790-cd-history-samples.csv
@@ -0,0 +1,2 @@
+AsOfDate,PeakerNetMargin
+06/25/2026 16:00:00, 36025.36
diff --git a/tools/inputs/history/np4-791-cd-history-current.csv b/tools/inputs/history/np4-791-cd-history-current.csv
new file mode 100644
index 00000000..7d0e3ce7
--- /dev/null
+++ b/tools/inputs/history/np4-791-cd-history-current.csv
@@ -0,0 +1,3 @@
+SWCAPType,DASWCAP,RTSWCAP
+AS,5000,2000
+ENERGY,5000,2000
diff --git a/tools/inputs/history/np4-791-cd-history-samples.csv b/tools/inputs/history/np4-791-cd-history-samples.csv
new file mode 100644
index 00000000..8ba67531
--- /dev/null
+++ b/tools/inputs/history/np4-791-cd-history-samples.csv
@@ -0,0 +1,3 @@
+SWCAPType,SWCAP
+AS,5000,
+ENERGY,5000,
diff --git a/tools/inputs/history/np5-108-cd-history-current.csv b/tools/inputs/history/np5-108-cd-history-current.csv
new file mode 100644
index 00000000..53dcd3cf
--- /dev/null
+++ b/tools/inputs/history/np5-108-cd-history-current.csv
@@ -0,0 +1,4 @@
+HourEnding,ResourceName,MWHDeployment,DSTFlag
+12:00,A4_DGR1,0,N
+12:00,A4_DGR2,0,N
+12:00,BRAUNIG_VHB3,0,N
diff --git a/tools/inputs/history/np5-108-cd-history-samples.csv b/tools/inputs/history/np5-108-cd-history-samples.csv
new file mode 100644
index 00000000..53dcd3cf
--- /dev/null
+++ b/tools/inputs/history/np5-108-cd-history-samples.csv
@@ -0,0 +1,4 @@
+HourEnding,ResourceName,MWHDeployment,DSTFlag
+12:00,A4_DGR1,0,N
+12:00,A4_DGR2,0,N
+12:00,BRAUNIG_VHB3,0,N
diff --git a/tools/inputs/history/np5-520-er-history-current.xlsx b/tools/inputs/history/np5-520-er-history-current.xlsx
new file mode 100644
index 00000000..884392be
Binary files /dev/null and b/tools/inputs/history/np5-520-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np5-520-er-history-samples.xlsx b/tools/inputs/history/np5-520-er-history-samples.xlsx
new file mode 100644
index 00000000..072b3811
Binary files /dev/null and b/tools/inputs/history/np5-520-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np5-525-cd-history-current.csv b/tools/inputs/history/np5-525-cd-history-current.csv
new file mode 100644
index 00000000..d6105404
--- /dev/null
+++ b/tools/inputs/history/np5-525-cd-history-current.csv
@@ -0,0 +1,4 @@
+RUCTimestamp,DeliveryDate,DeliveryHour,ASType,ASDeploymentFactors,RepeatedHourFlag
+09/07/2026 01:05:38,09/08/2026,01:00,ECRS,0.05,N
+09/07/2026 01:05:38,09/08/2026,01:00,NSPIN,0.2,N
+09/07/2026 01:05:38,09/08/2026,01:00,REGDN,0.4,N
diff --git a/tools/inputs/history/np5-525-cd-history-samples.csv b/tools/inputs/history/np5-525-cd-history-samples.csv
new file mode 100644
index 00000000..f80399ba
--- /dev/null
+++ b/tools/inputs/history/np5-525-cd-history-samples.csv
@@ -0,0 +1,4 @@
+RUCTimestamp,DeliveryDate,DeliveryHour,ASType,ASDeploymentFactors,RepeatedHourFlag
+12/05/2025 01:23:32,12/06/2025,01:00,ECRS,0.04,N
+12/05/2025 01:23:32,12/06/2025,01:00,NSPIN,0.15,N
+12/05/2025 01:23:32,12/06/2025,01:00,REGDN,0.25,N
diff --git a/tools/inputs/history/np5-526-cd-history-current.csv b/tools/inputs/history/np5-526-cd-history-current.csv
new file mode 100644
index 00000000..f97cb568
--- /dev/null
+++ b/tools/inputs/history/np5-526-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ASType,ASDeploymentFactors,RepeatedHourFlag
+09/08/2026,01:00,ECRS,0.05,N
+09/08/2026,01:00,NSPIN,0.2,N
+09/08/2026,01:00,REGDN,0.4,N
diff --git a/tools/inputs/history/np5-526-cd-history-samples.csv b/tools/inputs/history/np5-526-cd-history-samples.csv
new file mode 100644
index 00000000..cc170d94
--- /dev/null
+++ b/tools/inputs/history/np5-526-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,ASType,ASDeploymentFactors,RepeatedHourFlag
+12/06/2025,01:00,ECRS,0.04,N
+12/06/2025,01:00,NSPIN,0.15,N
+12/06/2025,01:00,REGDN,0.25,N
diff --git a/tools/inputs/history/np5-527-cd-history-current.csv b/tools/inputs/history/np5-527-cd-history-current.csv
new file mode 100644
index 00000000..1427b93b
--- /dev/null
+++ b/tools/inputs/history/np5-527-cd-history-current.csv
@@ -0,0 +1,4 @@
+RUCTimestamp,DeliveryDate,DeliveryHour,ASType,ASDeploymentFactors,RepeatedHourFlag
+09/06/2026 14:33:04,09/07/2026,01:00,ECRS,0.05,N
+09/06/2026 14:33:04,09/07/2026,01:00,NSPIN,0.2,N
+09/06/2026 14:33:04,09/07/2026,01:00,REGDN,0.4,N
diff --git a/tools/inputs/history/np5-527-cd-history-samples.csv b/tools/inputs/history/np5-527-cd-history-samples.csv
new file mode 100644
index 00000000..31e3797c
--- /dev/null
+++ b/tools/inputs/history/np5-527-cd-history-samples.csv
@@ -0,0 +1,4 @@
+RUCTimestamp,DeliveryDate,DeliveryHour,ASType,ASDeploymentFactors,RepeatedHourFlag
+12/05/2025 14:33:01,12/06/2025,01:00,ECRS,0.04,N
+12/05/2025 14:33:01,12/06/2025,01:00,NSPIN,0.15,N
+12/05/2025 14:33:01,12/06/2025,01:00,REGDN,0.25,N
diff --git a/tools/inputs/history/np5-528-cd-history-current.csv b/tools/inputs/history/np5-528-cd-history-current.csv
new file mode 100644
index 00000000..4777a71c
--- /dev/null
+++ b/tools/inputs/history/np5-528-cd-history-current.csv
@@ -0,0 +1,4 @@
+RUCTimestamp,DeliveryDate,DeliveryHour,ASType,ASDeploymentFactors,RepeatedHourFlag
+09/07/2026 12:03:03,09/07/2026,14:00,ECRS,0,N
+09/07/2026 12:03:03,09/07/2026,14:00,NSPIN,0,N
+09/07/2026 12:03:03,09/07/2026,14:00,REGDN,0.3,N
diff --git a/tools/inputs/history/np5-528-cd-history-samples.csv b/tools/inputs/history/np5-528-cd-history-samples.csv
new file mode 100644
index 00000000..294e4a66
--- /dev/null
+++ b/tools/inputs/history/np5-528-cd-history-samples.csv
@@ -0,0 +1,4 @@
+RUCTimestamp,DeliveryDate,DeliveryHour,ASType,ASDeploymentFactors,RepeatedHourFlag
+12/05/2025 00:07:23,12/05/2025,02:00,ECRS,0.05,N
+12/05/2025 00:07:23,12/05/2025,02:00,NSPIN,0.2,N
+12/05/2025 00:07:23,12/05/2025,02:00,REGDN,0.3,N
diff --git a/tools/inputs/history/np5-754-cd-history-current.csv b/tools/inputs/history/np5-754-cd-history-current.csv
new file mode 100644
index 00000000..f2b072a6
--- /dev/null
+++ b/tools/inputs/history/np5-754-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ConstraintID,ConstraintName,ContingencyName,Limit,Value,ViolationAmount,FromStation,ToStation,FromStationkV,ToStationkV,DSTFlag
+09/07/2026,01:00,09/06/2026 14:33:04,2,6945__A,SRGRMGS5,1200,1200,0,MGSES,CATSW,345,345,N
+09/07/2026,01:00,09/06/2026 14:33:04,1,LPLMK_LPLNE_1,SBWDDBM5,218,218,0,LPLMK,LPLNE,115,115,N
+09/07/2026,03:00,09/06/2026 14:33:04,3,6945__A,SRGRMGS5,1220,1220,0,MGSES,CATSW,345,345,N
diff --git a/tools/inputs/history/np5-754-cd-history-samples.csv b/tools/inputs/history/np5-754-cd-history-samples.csv
new file mode 100644
index 00000000..57baf801
--- /dev/null
+++ b/tools/inputs/history/np5-754-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ConstraintID,ConstraintName,ContingencyName,Limit,Value,ViolationAmount,FromStation,ToStation,FromStationkV,ToStationkV,DSTFlag
+08/29/2026,01:00,08/28/2026 14:33:21,1,LPLMK_LPLNE_1,SBWDDBM5,218,218,0,LPLMK,LPLNE,115,115,N
+08/29/2026,01:00,08/28/2026 14:33:21,2,MGSES_MR4H,XMGS658,351,351,0,MGSES,MGSES,1,345,N
+08/29/2026,02:00,08/28/2026 14:33:21,4,6945__A,SRGRMGS5,1205,1205,0,MGSES,CATSW,345,345,N
diff --git a/tools/inputs/history/np5-755-cd-history-current.csv b/tools/inputs/history/np5-755-cd-history-current.csv
new file mode 100644
index 00000000..08888085
--- /dev/null
+++ b/tools/inputs/history/np5-755-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ConstraintID,ConstraintName,ContingencyName,Limit,Value,ViolationAmount,FromStation,ToStation,FromStationkV,ToStationkV,DSTFlag
+09/07/2026,14:00,09/07/2026 12:03:03,1,SEA_AAT1,DFRYBC58,100,100,0,SEA,SEA,138,69,N
+09/07/2026,14:00,09/07/2026 12:03:03,2,2270__B,SBLURDH8,34,34,0,MEXTP,ITALY,69,69,N
+09/07/2026,15:00,09/07/2026 12:03:03,3,1710__A,DSALHUT5,222,222,0,SALDS,SONTERRA,138,138,N
diff --git a/tools/inputs/history/np5-755-cd-history-samples.csv b/tools/inputs/history/np5-755-cd-history-samples.csv
new file mode 100644
index 00000000..cdf08a31
--- /dev/null
+++ b/tools/inputs/history/np5-755-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,RUCTimeStamp,ConstraintID,ConstraintName,ContingencyName,Limit,Value,ViolationAmount,FromStation,ToStation,FromStationkV,ToStationkV,DSTFlag
+04/30/2026,13:00,04/30/2026 11:03:03,2,940__A,SPEBTRU8,263,263,0,ENWSW,TMPTN,138,138,N
+04/30/2026,13:00,04/30/2026 11:03:03,1,LAN_CT_PAVLOV1_1,SWCPYT8,157,157,0,LAN_CTY,PAVLOV,138,138,N
+04/30/2026,14:00,04/30/2026 11:03:03,3,LAN_CT_PAVLOV1_1,SWCPYT8,157,157,0,LAN_CTY,PAVLOV,138,138,N
diff --git a/tools/inputs/history/np6-235-cd-history-current.csv b/tools/inputs/history/np6-235-cd-history-current.csv
new file mode 100644
index 00000000..5bbcc395
--- /dev/null
+++ b/tools/inputs/history/np6-235-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,TimeEnding,Demand,DSTFlag
+09/07/2026,11:15,72732.1484,N
+09/07/2026,11:30,74207.3359,N
+09/07/2026,11:45,75331.2604,N
diff --git a/tools/inputs/history/np6-235-cd-history-samples.csv b/tools/inputs/history/np6-235-cd-history-samples.csv
new file mode 100644
index 00000000..881ee62f
--- /dev/null
+++ b/tools/inputs/history/np6-235-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,TimeEnding,Demand,DSTFlag
+03/26/2026,14:15,60416.8893,N
+03/26/2026,14:30,61105.2734,N
+03/26/2026,14:45,61731.5313,N
diff --git a/tools/inputs/history/np6-322-cd-history-current.csv b/tools/inputs/history/np6-322-cd-history-current.csv
new file mode 100644
index 00000000..725d22d4
--- /dev/null
+++ b/tools/inputs/history/np6-322-cd-history-current.csv
@@ -0,0 +1,2 @@
+SCEDTimeStamp,RepeatedHourFlag,CappedSystemLambda,UncappedSystemLambda
+09/07/2026 12:15:18,N,31.61007,31.61007
diff --git a/tools/inputs/history/np6-322-cd-history-samples.csv b/tools/inputs/history/np6-322-cd-history-samples.csv
new file mode 100644
index 00000000..d9eb29b3
--- /dev/null
+++ b/tools/inputs/history/np6-322-cd-history-samples.csv
@@ -0,0 +1,2 @@
+SCEDTimestamp,RepeatedHourFlag,SystemLambda
+05/01/2014 00:00:14,N,28.8797130584717
diff --git a/tools/inputs/history/np6-323-cd-history-current.csv b/tools/inputs/history/np6-323-cd-history-current.csv
new file mode 100644
index 00000000..c4287e92
--- /dev/null
+++ b/tools/inputs/history/np6-323-cd-history-current.csv
@@ -0,0 +1,2 @@
+SCEDTimestamp,RepeatedHourFlag,SystemLambda,RTRDPA,RTRDPARUS,RTRDPARDS,RTRDPARRS,RTRDPAECRS,RTRDPANSS,RTRRUC,RTRRMR,RTDNCLR,RTDERS,RTDCTIEIMPORT,RTDCTIEEXPORT,RTBLTIMPORT,RTBLTEXPORT,RTOLLSL,RTOLHSL,RTDLL
+09/07/2026 12:20:19,N,34.8972,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,11900.76,106661.27,0.00
diff --git a/tools/inputs/history/np6-323-cd-history-samples.csv b/tools/inputs/history/np6-323-cd-history-samples.csv
new file mode 100644
index 00000000..24799222
--- /dev/null
+++ b/tools/inputs/history/np6-323-cd-history-samples.csv
@@ -0,0 +1,2 @@
+BatchID,SCEDTimestamp,RepeatedHourFlag,SystemLambda,PRC,RTORPA,RTOFFPA,RTOLCAP,RTOFFCAP,RTOLHSL,RTBP,RTCLRCAP,RTCLRREG,RTCLRBP,RTCLRLSL,RTCLRNS,RTNCLRRRS,RTOLNSRS,RTCST30HSL,RTOFFNSHSL,RTOFF10,RTOFF30
+3913022,06/01/2014 00:01:06,N,31.3914,4244.76,0.0033,0.0005,7345.24,2810.61,37075.46,31040.25,0.00,0.00,0.00,0.00,0.00,1310.02,0.00,2287.89,522.72,0.00,0.00
diff --git a/tools/inputs/history/np6-324-cd-history-current.csv b/tools/inputs/history/np6-324-cd-history-current.csv
new file mode 100644
index 00000000..ebda7c44
--- /dev/null
+++ b/tools/inputs/history/np6-324-cd-history-current.csv
@@ -0,0 +1,2 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,RTRDPA,RTRDPRU,RTRDPRD,RTRDPRRS,RTRDPECRS,RTRDPNS,RepeatedHourFlag
+09/07/2026,13,1,0.00,0.00,0.00,0.00,0.00,0.00,N
diff --git a/tools/inputs/history/np6-324-cd-history-samples.csv b/tools/inputs/history/np6-324-cd-history-samples.csv
new file mode 100644
index 00000000..c984fad9
--- /dev/null
+++ b/tools/inputs/history/np6-324-cd-history-samples.csv
@@ -0,0 +1,2 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,RTRSVPOR,RTRSVPOFF,DSTFlag
+05/31/2014,24,4,0.0000,0.0000,N
diff --git a/tools/inputs/history/np6-325-cd-history-current.csv b/tools/inputs/history/np6-325-cd-history-current.csv
new file mode 100644
index 00000000..610a1f34
--- /dev/null
+++ b/tools/inputs/history/np6-325-cd-history-current.csv
@@ -0,0 +1,4 @@
+RTDTimestamp,RepeatedHourFlag,IntervalID,IntervalEnding,IERepeatedHourFlag,SystemLambda,RTRDPA,RTRDPARUS,RTRDPARDS,RTRDPARRS,RTRDPAECRS,RTRDPANSS,RTRRUC,RTRRMR,RTDNCLR,RTDERS,RTDCTIEIMPORT,RTDCTIEEXPORT,RTBLTIMPORT,RTBLTEXPORT,RTOLLSL,RTOLHSL,RTDLL
+09/07/2026 12:20:03,N,1,09/07/2026 12:25:00,N,31.4268,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,11956.84,106231.59,0.00
+09/07/2026 12:20:03,N,2,09/07/2026 12:30:00,N,38.6330,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,11956.84,106231.59,0.00
+09/07/2026 12:20:03,N,3,09/07/2026 12:35:00,N,37.8011,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,11956.84,106231.59,0.00
diff --git a/tools/inputs/history/np6-325-cd-history-samples.csv b/tools/inputs/history/np6-325-cd-history-samples.csv
new file mode 100644
index 00000000..217a5943
--- /dev/null
+++ b/tools/inputs/history/np6-325-cd-history-samples.csv
@@ -0,0 +1,4 @@
+BatchID,RTDTimestamp,RepeatedHourFlag,IntervalID,IntervalEnding,IERepeatedHourFlag,SystemLambda,RTORPA,RTOFFPA,RTOLCAP,RTOFFCAP
+3913027,06/01/2014 00:10:01,N,1,06/01/2014 00:15:00,N,33.8459,0.0882,0.0503,6762.25,1987.92
+3913027,06/01/2014 00:10:01,N,2,06/01/2014 00:20:00,N,32.0338,0.0278,0.0110,6950.97,2294.82
+3913027,06/01/2014 00:10:01,N,3,06/01/2014 00:25:00,N,31.4318,0.0111,0.0052,7182.94,2294.82
diff --git a/tools/inputs/history/np6-326-cd-history-current.csv b/tools/inputs/history/np6-326-cd-history-current.csv
new file mode 100644
index 00000000..1834dd33
--- /dev/null
+++ b/tools/inputs/history/np6-326-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,ResourceType,ResourceName,MeterName,MeterPrice,DSTFlag
+09/07/2026,13,4,SODG,19599_1_PV_A1,10443720004133031,29.33,N
+09/07/2026,13,4,SODG,19599_2_PV_2,10443720006303128,29.33,N
+09/07/2026,13,4,SODG,19599_PV_A,10443720007007287,29.33,N
diff --git a/tools/inputs/history/np6-326-cd-history-samples.csv b/tools/inputs/history/np6-326-cd-history-samples.csv
new file mode 100644
index 00000000..a5b82db1
--- /dev/null
+++ b/tools/inputs/history/np6-326-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,ResourceType,ResourceName,MeterName,MeterPrice,DSTFlag
+04/30/2026,12,1,SODG,19599_1_PV_A1,10443720004133031,34.04,N
+04/30/2026,12,1,SODG,19599_2_PV_2,10443720006303128,34.04,N
+04/30/2026,12,1,SODG,19599_PV_A,10443720007007287,34.04,N
diff --git a/tools/inputs/history/np6-327-cd-history-current.csv b/tools/inputs/history/np6-327-cd-history-current.csv
new file mode 100644
index 00000000..9ca0245f
--- /dev/null
+++ b/tools/inputs/history/np6-327-cd-history-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,ResourceType,ResourceName,StationName,VoltageLevel,MeterName,MeterLMP,RTRDPA,FinalLMP
+09/07/2026 13:15:20,N,SODG,19599_1_PV_A1,BLMND,138.00,10443720004133031,27.52,0.00,27.52
+09/07/2026 13:15:20,N,SODG,19599_2_PV_2,BLMND,138.00,10443720006303128,27.52,0.00,27.52
+09/07/2026 13:15:20,N,SODG,19599_PV_A,BLMND,138.00,10443720007007287,27.52,0.00,27.52
diff --git a/tools/inputs/history/np6-327-cd-history-samples.csv b/tools/inputs/history/np6-327-cd-history-samples.csv
new file mode 100644
index 00000000..04a7ffce
--- /dev/null
+++ b/tools/inputs/history/np6-327-cd-history-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,ResourceType,ResourceName,StationName,VoltageLevel,MeterName,MeterLMP,RTORPA,RTORDPA,FinalLMP
+02/11/2022 00:05:20,N,SODG,ALEXIS_ALEXIS,RACHAL, 138.00,CPLALXSGP0100, 17.85, .00, .00, 17.85
+02/11/2022 00:05:20,N,SODG,BOVINE2_BOVINE2,WA, 138.00,1008901022901448240117, 17.85, .00, .00, 17.85
+02/11/2022 00:05:20,N,SODG,BRNSN2_BRNSN2,OR, 138.00,1008901006901417790117, 17.85, .00, .00, 17.85
diff --git a/tools/inputs/history/np6-328-cd-history-current.csv b/tools/inputs/history/np6-328-cd-history-current.csv
new file mode 100644
index 00000000..35b2b13f
--- /dev/null
+++ b/tools/inputs/history/np6-328-cd-history-current.csv
@@ -0,0 +1,2 @@
+SCEDTimestamp,RepeatedHourFlag,CapREGUPTotal,CapREGDNTotal,CapRRSTotal,CapECRSTotal,CapNSPINTotal,CapREGUP_RRSTotal,CapREGUP_RRS_ECRSTotal,CapREGUP_RRS_ECRS_NSPINTotal
+09/07/2026 12:50:20,N,28179,7660.3,22879.1,29013.7,22752.9,35878.2,41029.5,50797.4
diff --git a/tools/inputs/history/np6-328-cd-history-samples.csv b/tools/inputs/history/np6-328-cd-history-samples.csv
new file mode 100644
index 00000000..84faa667
--- /dev/null
+++ b/tools/inputs/history/np6-328-cd-history-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,CapREGUPTotal,CapREGDNTotal,CapRRSTotal,CapECRSTotal,CapNSPINTotal,CapREGUP_RRSTotal,CapREGUP_RRS_ECRSTotal,CapREGUP_RRS_ECRS_NSPINTotal
+12/04/2025 23:45:16,N,17467.1,12833.7,15920.6,16069.9,17461.9,25063.6,30106.1,39599.4
+12/04/2025 23:50:17,N,17495.2,12774.9,15840.6,16067.4,17540.1,25077.6,30067.3,39594.3
+12/04/2025 23:55:16,N,17608.3,12638.1,15943,16231.8,17687.5,25245.4,30185.8,39722.6
diff --git a/tools/inputs/history/np6-329-cd-history-current.csv b/tools/inputs/history/np6-329-cd-history-current.csv
new file mode 100644
index 00000000..952f1a38
--- /dev/null
+++ b/tools/inputs/history/np6-329-cd-history-current.csv
@@ -0,0 +1,4 @@
+RTDTimestamp,RepeatedHourFlag,IntervalID,IntervalEnding,IntervalEndingRepeatedHourFlag,REGUP,REGDN,RRS,ECRS,NSPIN
+09/07/2026 12:50:04,N,1,09/07/2026 12:55,N,2.96,4.05,0.01,0.01,0.04
+09/07/2026 12:50:04,N,2,09/07/2026 13:00,N,3,4.05,0.01,0.02,0.05
+09/07/2026 12:50:04,N,3,09/07/2026 13:05,N,3.21,5,0.01,0.01,0.05
diff --git a/tools/inputs/history/np6-329-cd-history-samples.csv b/tools/inputs/history/np6-329-cd-history-samples.csv
new file mode 100644
index 00000000..1e6f126a
--- /dev/null
+++ b/tools/inputs/history/np6-329-cd-history-samples.csv
@@ -0,0 +1,4 @@
+RTDTimestamp,RepeatedHourFlag,IntervalID,IntervalEnding,IntervalEndingRepeatedHourFlag,REGUP,REGDN,RRS,ECRS,NSPIN
+12/05/2025 00:00:03,N,1,12/05/2025 00:05,N,2.96,5.69,0.31,0.31,2.37
+12/05/2025 00:00:03,N,2,12/05/2025 00:10,N,3.13,5.82,0.61,0.61,2.54
+12/05/2025 00:00:03,N,3,12/05/2025 00:15,N,3.13,8.96,0.63,0.63,2.54
diff --git a/tools/inputs/history/np6-331-cd-history-current.csv b/tools/inputs/history/np6-331-cd-history-current.csv
new file mode 100644
index 00000000..6762f5ac
--- /dev/null
+++ b/tools/inputs/history/np6-331-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,RepeatedHourFlag,ASType,MCPC
+09/07/2026,13,3,N,ECRS,0.01
+09/07/2026,13,3,N,NSPIN,0.02
+09/07/2026,13,3,N,REGDN,2.13
diff --git a/tools/inputs/history/np6-331-cd-history-samples.csv b/tools/inputs/history/np6-331-cd-history-samples.csv
new file mode 100644
index 00000000..1691dde7
--- /dev/null
+++ b/tools/inputs/history/np6-331-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,RepeatedHourFlag,ASType,MCPC
+12/04/2025,24,4,N,ECRS,9.34
+12/04/2025,24,4,N,NSPIN,9.34
+12/04/2025,24,4,N,REGDN,9.96
diff --git a/tools/inputs/history/np6-332-cd-history-current.csv b/tools/inputs/history/np6-332-cd-history-current.csv
new file mode 100644
index 00000000..0f97f8d3
--- /dev/null
+++ b/tools/inputs/history/np6-332-cd-history-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,ASType,CappedMCPC,UncappedMCPC
+09/07/2026 12:50:20,N,ECRS,0.01,0.01
+09/07/2026 12:50:20,N,NSPIN,0.02,0.02
+09/07/2026 12:50:20,N,REGDN,2.3,2.3
diff --git a/tools/inputs/history/np6-332-cd-history-samples.csv b/tools/inputs/history/np6-332-cd-history-samples.csv
new file mode 100644
index 00000000..a717d904
--- /dev/null
+++ b/tools/inputs/history/np6-332-cd-history-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,ASType,MCPC
+12/05/2025 00:05:17,N,ECRS,0.47
+12/05/2025 00:05:17,N,NSPIN,1.86
+12/05/2025 00:05:17,N,REGDN,0.4
diff --git a/tools/inputs/history/np6-344-cd-history-current.csv b/tools/inputs/history/np6-344-cd-history-current.csv
new file mode 100644
index 00000000..48c481ec
--- /dev/null
+++ b/tools/inputs/history/np6-344-cd-history-current.csv
@@ -0,0 +1,4 @@
+OperatingDay,HourEnding,Valley,DSTFlag
+09/06/2026,01:00,1665.88,N
+09/06/2026,02:00,1553.78,N
+09/06/2026,03:00,1463.68,N
diff --git a/tools/inputs/history/np6-344-cd-history-samples.csv b/tools/inputs/history/np6-344-cd-history-samples.csv
new file mode 100644
index 00000000..e8797201
--- /dev/null
+++ b/tools/inputs/history/np6-344-cd-history-samples.csv
@@ -0,0 +1,4 @@
+OperatingDay,HourEnding,Valley,DSTFlag
+08/27/2026,01:00,1757.77,N
+08/27/2026,02:00,1627.67,N
+08/27/2026,03:00,1531.83,N
diff --git a/tools/inputs/history/np6-345-cd-recent.csv b/tools/inputs/history/np6-345-cd-recent.csv
new file mode 100644
index 00000000..c877d2cf
--- /dev/null
+++ b/tools/inputs/history/np6-345-cd-recent.csv
@@ -0,0 +1,4 @@
+OperDay,HourEnding,COAST,EAST,FAR_WEST,NORTH,NORTH_C,SOUTHERN,SOUTH_C,WEST,TOTAL,DSTFlag
+09/06/2026,01:00,15364.16,1909.48,7714.55,1961.02,18981.63,5214.50,11031.83,2183.53,64360.71,N
+09/06/2026,02:00,14915.21,1838.23,7658.99,1823.84,17892.79,4997.48,10449.71,2074.54,61650.78,N
+09/06/2026,03:00,14671.59,1791.66,7621.40,1790.64,17036.00,4810.84,9927.95,2027.64,59677.71,N
diff --git a/tools/inputs/history/np6-345-cd.csv b/tools/inputs/history/np6-345-cd.csv
new file mode 100644
index 00000000..4c511c83
--- /dev/null
+++ b/tools/inputs/history/np6-345-cd.csv
@@ -0,0 +1,4 @@
+OperDay,HourEnding,COAST,EAST,FAR_WEST,NORTH,NORTH_C,SOUTHERN,SOUTH_C,WEST,TOTAL,DSTFlag
+04/30/2014,01:00,8244.87,1106.17,1691.50,701.52,8254.29,2479.81,4560.52,896.17,27934.84,N
+04/30/2014,02:00,7813.85,1077.60,1666.71,688.74,7771.67,2295.72,4279.31,928.68,26522.29,N
+04/30/2014,03:00,7571.26,1047.46,1654.65,669.85,7505.79,2173.52,4090.48,901.49,25614.51,N
diff --git a/tools/inputs/history/np6-346-cd-history-current.csv b/tools/inputs/history/np6-346-cd-history-current.csv
new file mode 100644
index 00000000..f322fc3f
--- /dev/null
+++ b/tools/inputs/history/np6-346-cd-history-current.csv
@@ -0,0 +1,4 @@
+OperDay,HourEnding,NORTH,SOUTH,WEST,HOUSTON,TOTAL,DSTFlag
+09/06/2026,01:00,21917.89,17508.48,10105.44,14828.90,64360.71,N
+09/06/2026,02:00,20685.68,16657.78,9912.04,14395.27,61650.78,N
+09/06/2026,03:00,19769.91,15926.51,9821.57,14159.72,59677.71,N
diff --git a/tools/inputs/history/np6-346-cd-history-samples.csv b/tools/inputs/history/np6-346-cd-history-samples.csv
new file mode 100644
index 00000000..27b84840
--- /dev/null
+++ b/tools/inputs/history/np6-346-cd-history-samples.csv
@@ -0,0 +1,4 @@
+OperDay,HourEnding,NORTH,SOUTH,WEST,HOUSTON,TOTAL,DSTFlag
+06/29/2017,01:00,15306.84,11509.76,3820.78,11614.47,42251.85,N
+06/29/2017,02:00,14398.26,10781.79,3687.67,11039.10,39906.81,N
+06/29/2017,03:00,13764.82,10247.55,3584.47,10628.50,38225.33,N
diff --git a/tools/inputs/history/np6-625-cd-history-current.csv b/tools/inputs/history/np6-625-cd-history-current.csv
new file mode 100644
index 00000000..00873fb6
--- /dev/null
+++ b/tools/inputs/history/np6-625-cd-history-current.csv
@@ -0,0 +1,2 @@
+SE_EXE_TIME,SE_EXE_TIME_DST,SE_MW,SE_MVAR,SCADA_MW,SCADA_MVAR
+09/07/2026 12:07:11,d,84567.655625,10126.730488,84606.420248,9695.052226
diff --git a/tools/inputs/history/np6-625-cd-history-samples.csv b/tools/inputs/history/np6-625-cd-history-samples.csv
new file mode 100644
index 00000000..38e03a8c
--- /dev/null
+++ b/tools/inputs/history/np6-625-cd-history-samples.csv
@@ -0,0 +1,3 @@
+SE_EXE_TIME,SE_EXE_TIME_DST,SE_MW,SE_MVAR,SCADA_MW,SCADA_MVAR
+01/01/2019 00:07:31,s,42347.593624,4221.460911,42286.856412,4140.795098
+
diff --git a/tools/inputs/history/np6-626-cd-history-current.csv b/tools/inputs/history/np6-626-cd-history-current.csv
new file mode 100644
index 00000000..fe0a5b78
--- /dev/null
+++ b/tools/inputs/history/np6-626-cd-history-current.csv
@@ -0,0 +1,4 @@
+TAGCLAST_TIME,TAGCLAST_TIME_DST,TIE_LINE_ID,MW_TIE,TEID_TIE
+09/07/2026 12:09:52,d,DC_L,-0.400000005960464,289735
+09/07/2026 12:09:52,d,DC_E,53.1989364624023,289724
+09/07/2026 12:09:52,d,DC_N,-26,289764
diff --git a/tools/inputs/history/np6-626-cd-history-samples.csv b/tools/inputs/history/np6-626-cd-history-samples.csv
new file mode 100644
index 00000000..5f7fbb8e
--- /dev/null
+++ b/tools/inputs/history/np6-626-cd-history-samples.csv
@@ -0,0 +1,4 @@
+TAGCLAST_TIME,TAGCLAST_TIME_DST,TIE_LINE_ID,MW_TIE,TEID_TIE
+01/01/2019 00:09:52,s,DC_L,0.200000002980232,289735
+01/01/2019 00:09:52,s,DC_S,0.493484288454056,289734
+01/01/2019 00:09:52,s,DC_E,14.7044448852539,289724
diff --git a/tools/inputs/history/np6-787-cd-history-current.csv b/tools/inputs/history/np6-787-cd-history-current.csv
new file mode 100644
index 00000000..dddd7ddd
--- /dev/null
+++ b/tools/inputs/history/np6-787-cd-history-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,ElectricalBus,CappedLMP,UncappedLMP
+09/07/2026 11:40:17,N,0001,22.87,22.87
+09/07/2026 11:40:17,N,0001DUPV1_,23.82,23.82
+09/07/2026 11:40:17,N,0001HWFG1,22.17,22.17
diff --git a/tools/inputs/history/np6-787-cd-history-samples.csv b/tools/inputs/history/np6-787-cd-history-samples.csv
new file mode 100644
index 00000000..9b96cf7b
--- /dev/null
+++ b/tools/inputs/history/np6-787-cd-history-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,ElectricalBus,LMP
+05/01/2014 00:00:14,N,0001, 28.88
+05/01/2014 00:00:14,N,0001DUPV1_, 28.88
+05/01/2014 00:00:14,N,0001HWFG1, 28.88
diff --git a/tools/inputs/history/np6-788-cd-history-current.csv b/tools/inputs/history/np6-788-cd-history-current.csv
new file mode 100644
index 00000000..96e78b57
--- /dev/null
+++ b/tools/inputs/history/np6-788-cd-history-current.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,SettlementPoint,LMP
+09/07/2026 11:40:17,N,7RNCHSLR_ALL, 23.53
+09/07/2026 11:40:17,N,A4_DGR1_RN, 23.29
+09/07/2026 11:40:17,N,A4_DGR2_RN, 23.29
diff --git a/tools/inputs/history/np6-788-cd-history-samples.csv b/tools/inputs/history/np6-788-cd-history-samples.csv
new file mode 100644
index 00000000..a1b24124
--- /dev/null
+++ b/tools/inputs/history/np6-788-cd-history-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimestamp,RepeatedHourFlag,SettlementPoint,LMP
+05/01/2014 00:05:19,N,AMISTAD_ALL, 30.95
+05/01/2014 00:05:19,N,AMOCOOIL_CC1, 30.95
+05/01/2014 00:05:19,N,AMOCOOIL_CC2, 30.95
diff --git a/tools/inputs/history/np6-792-er-history-2019.xlsx b/tools/inputs/history/np6-792-er-history-2019.xlsx
new file mode 100644
index 00000000..5139b85d
Binary files /dev/null and b/tools/inputs/history/np6-792-er-history-2019.xlsx differ
diff --git a/tools/inputs/history/np6-792-er-history-2023.xlsx b/tools/inputs/history/np6-792-er-history-2023.xlsx
new file mode 100644
index 00000000..f32edd91
Binary files /dev/null and b/tools/inputs/history/np6-792-er-history-2023.xlsx differ
diff --git a/tools/inputs/history/np6-792-er-history-current.xlsx b/tools/inputs/history/np6-792-er-history-current.xlsx
new file mode 100644
index 00000000..d9f504f6
Binary files /dev/null and b/tools/inputs/history/np6-792-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np6-792-er-history-samples.xlsx b/tools/inputs/history/np6-792-er-history-samples.xlsx
new file mode 100644
index 00000000..3c9646ce
Binary files /dev/null and b/tools/inputs/history/np6-792-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np6-793-er-history-current.xlsx b/tools/inputs/history/np6-793-er-history-current.xlsx
new file mode 100644
index 00000000..81911463
Binary files /dev/null and b/tools/inputs/history/np6-793-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np6-793-er-history-samples.xlsx b/tools/inputs/history/np6-793-er-history-samples.xlsx
new file mode 100644
index 00000000..42aa4226
Binary files /dev/null and b/tools/inputs/history/np6-793-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np6-794-er-history-current.xlsx b/tools/inputs/history/np6-794-er-history-current.xlsx
new file mode 100644
index 00000000..af999d3b
Binary files /dev/null and b/tools/inputs/history/np6-794-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np6-794-er-history-samples.xlsx b/tools/inputs/history/np6-794-er-history-samples.xlsx
new file mode 100644
index 00000000..1eafc0fa
Binary files /dev/null and b/tools/inputs/history/np6-794-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np6-795-er-history-current.xlsx b/tools/inputs/history/np6-795-er-history-current.xlsx
new file mode 100644
index 00000000..996d405a
Binary files /dev/null and b/tools/inputs/history/np6-795-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np6-795-er-history-samples.xlsx b/tools/inputs/history/np6-795-er-history-samples.xlsx
new file mode 100644
index 00000000..33f7f890
Binary files /dev/null and b/tools/inputs/history/np6-795-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np6-796-er-history-current.xlsx b/tools/inputs/history/np6-796-er-history-current.xlsx
new file mode 100644
index 00000000..026348f1
Binary files /dev/null and b/tools/inputs/history/np6-796-er-history-current.xlsx differ
diff --git a/tools/inputs/history/np6-796-er-history-samples.xlsx b/tools/inputs/history/np6-796-er-history-samples.xlsx
new file mode 100644
index 00000000..a4f67930
Binary files /dev/null and b/tools/inputs/history/np6-796-er-history-samples.xlsx differ
diff --git a/tools/inputs/history/np6-86-cd-history-current.csv b/tools/inputs/history/np6-86-cd-history-current.csv
new file mode 100644
index 00000000..54e35524
--- /dev/null
+++ b/tools/inputs/history/np6-86-cd-history-current.csv
@@ -0,0 +1,4 @@
+SCEDTimeStamp,RepeatedHourFlag,ConstraintID,ConstraintName,ContingencyName,ShadowPrice,MaxShadowPrice,Limit,Value,ViolatedMW,FromStation,ToStation,FromStationkV,ToStationkV,CCTStatus
+09/07/2026 11:55:19,N,1,138_ALV_NAL_1,SMDOPHR5,14.63911,3500,389.2,389.2,0,TNNALVIN,ALVIN,138,138,NONCOMP
+09/07/2026 11:55:19,N,2,N_TO_H,BASE CASE,0,5251,5468,5067.1,-401,,,0,0,COMP
+09/07/2026 11:55:19,N,4,WAPWLY72_A,DBLW2JC5,0,4500,1789.2,1743,-46.2,WLY,WAP,345,345,NONCOMP
diff --git a/tools/inputs/history/np6-86-cd-history-samples.csv b/tools/inputs/history/np6-86-cd-history-samples.csv
new file mode 100644
index 00000000..d1457bb9
--- /dev/null
+++ b/tools/inputs/history/np6-86-cd-history-samples.csv
@@ -0,0 +1,4 @@
+SCEDTimeStamp,RepeatedHourFlag,ConstraintID,ConstraintName,ContingencyName,ShadowPrice,MaxShadowPrice,Limit,Value,ViolatedMW,FromStation,ToStation,FromStationkV,ToStationkV,CCTStatus
+04/30/2014 23:55:08,N,1,GILA_HIWAY_2_1,SKOCNU28,0,3500,254.7,239.4,-15.3,GILA,HIWAY_9,138,138,NONCOMP
+04/30/2014 23:50:08,N,1,GILA_HIWAY_2_1,SKOCNU28,0,3500,254.8,233.2,-21.6,GILA,HIWAY_9,138,138,NONCOMP
+04/30/2014 23:45:07,N,1,GILA_HIWAY_2_1,SKOCNU28,0,3500,254.7,232.2,-22.5,GILA,HIWAY_9,138,138,NONCOMP
diff --git a/tools/inputs/history/np6-905-cd-recent.csv b/tools/inputs/history/np6-905-cd-recent.csv
new file mode 100644
index 00000000..871dd1b8
--- /dev/null
+++ b/tools/inputs/history/np6-905-cd-recent.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,SettlementPointName,SettlementPointType,SettlementPointPrice,DSTFlag
+09/07/2026,11,3,7RNCHSLR_ALL,RN,24.76,N
+09/07/2026,11,3,A4_DGR1_RN,RN,24.58,N
+09/07/2026,11,3,A4_DGR2_RN,RN,24.58,N
diff --git a/tools/inputs/history/np6-905-cd.csv b/tools/inputs/history/np6-905-cd.csv
new file mode 100644
index 00000000..19b0866c
--- /dev/null
+++ b/tools/inputs/history/np6-905-cd.csv
@@ -0,0 +1,4 @@
+DeliveryDate,DeliveryHour,DeliveryInterval,SettlementPointName,SettlementPointType,SettlementPointPrice,DSTFlag
+04/30/2014,24,4,AMISTAD_ALL,RN,30.5,N
+04/30/2014,24,4,AMOCOOIL_CC1,LCCRN,30.5,N
+04/30/2014,24,4,AMOCOOIL_CC2,LCCRN,30.5,N
diff --git a/tools/inputs/history/np6-915-cd-history-current.csv b/tools/inputs/history/np6-915-cd-history-current.csv
new file mode 100644
index 00000000..1be1c193
--- /dev/null
+++ b/tools/inputs/history/np6-915-cd-history-current.csv
@@ -0,0 +1,2 @@
+SCED_TimeStamp,Repeated_Hour_Flag,GTBD,SUM_HDL,SUM_LDL
+09/07/2026 12:25:18,N,79818.1,100488.2,28563.5
diff --git a/tools/inputs/history/np6-915-cd-history-samples.csv b/tools/inputs/history/np6-915-cd-history-samples.csv
new file mode 100644
index 00000000..b13e93f6
--- /dev/null
+++ b/tools/inputs/history/np6-915-cd-history-samples.csv
@@ -0,0 +1,2 @@
+SCED_TimeStamp,Repeated_Hour_Flag,GTBD,SUM_HDL,SUM_LDL
+04/30/2026 11:10:19,N,53549.7,72718.9,23091.2
diff --git a/tools/inputs/history/np6-970-cd-history-current.csv b/tools/inputs/history/np6-970-cd-history-current.csv
new file mode 100644
index 00000000..871524cc
--- /dev/null
+++ b/tools/inputs/history/np6-970-cd-history-current.csv
@@ -0,0 +1,4 @@
+RTDTimestamp,RepeatedHourFlag,IntervalId,IntervalEnding,IntervalRepeatedHourFlag,SettlementPoint,SettlementPointType,LMP
+09/07/2026 12:55:03,N,1,09/07/2026 13:00:00,N,7RNCHSLR_ALL,RN,33.86
+09/07/2026 12:55:03,N,1,09/07/2026 13:00:00,N,A4_DGR1_RN,RN,33.89
+09/07/2026 12:55:03,N,1,09/07/2026 13:00:00,N,A4_DGR2_RN,RN,33.89
diff --git a/tools/inputs/history/np6-970-cd-history-samples.csv b/tools/inputs/history/np6-970-cd-history-samples.csv
new file mode 100644
index 00000000..540924ee
--- /dev/null
+++ b/tools/inputs/history/np6-970-cd-history-samples.csv
@@ -0,0 +1,4 @@
+RTDTimestamp,RepeatedHourFlag,IntervalId,IntervalEnding,IntervalRepeatedHourFlag,SettlementPoint,SettlementPointType,LMP
+05/01/2014 00:00:01,N,1,05/01/2014 00:05:00,N,AMISTAD_ALL,RN,28.71
+05/01/2014 00:00:01,N,1,05/01/2014 00:05:00,N,AMOCOOIL_CC1,LCCRN,28.71
+05/01/2014 00:00:01,N,1,05/01/2014 00:05:00,N,AMOCOOIL_CC2,LCCRN,28.71
diff --git a/tools/inputs/history/np7-464-cd-history-current.csv b/tools/inputs/history/np7-464-cd-history-current.csv
new file mode 100644
index 00000000..2aeb7346
--- /dev/null
+++ b/tools/inputs/history/np7-464-cd-history-current.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Price,Source,Sink,DSTFlag
+09/07/2026,01:00,0,7RNCHSLR_ALL,FPPYD_FPP_G2,N
+09/07/2026,01:00,0,A4_DGR1_RN,FERD_ESS_RN,N
+09/07/2026,01:00,0,A4_DGR1_RN,LEONLCPCT3_4,N
diff --git a/tools/inputs/history/np7-464-cd-history-samples.csv b/tools/inputs/history/np7-464-cd-history-samples.csv
new file mode 100644
index 00000000..478df646
--- /dev/null
+++ b/tools/inputs/history/np7-464-cd-history-samples.csv
@@ -0,0 +1,4 @@
+DeliveryDate,HourEnding,Price,Source,Sink,DSTFlag
+06/27/2026,01:00,0,7RNCHSLR_ALL,CBECII_89,N
+06/27/2026,01:00,0,7RNCHSLR_ALL,FPPYD_FPP_G3,N
+06/27/2026,01:00,0,A4_DGR1_RN,V4_DGR1_RN,N
diff --git a/tools/inputs/history/np7-535-sg-history-current.csv b/tools/inputs/history/np7-535-sg-history-current.csv
new file mode 100644
index 00000000..45c7e029
--- /dev/null
+++ b/tools/inputs/history/np7-535-sg-history-current.csv
@@ -0,0 +1,4 @@
+TargetDate,Source,Sink,TimeOfUse,StartDate,ACI99,ACP
+09/01/2026,INDNENR_2_RN,MAVCRK_W_ALL,PeakWE,10/01/2026,-25.0135,-13.8052
+09/01/2026,L_FRE_ESR_RN,LAUR_BESS_RN,PeakWE,10/01/2026,-1.8488,-0.07
+09/01/2026,GRANDVW1_A_B,HRNT_SLR_RN,PeakWE,10/01/2026,-0.7806,-0.1948
diff --git a/tools/inputs/history/np7-535-sg-history-samples.csv b/tools/inputs/history/np7-535-sg-history-samples.csv
new file mode 100644
index 00000000..167364a6
--- /dev/null
+++ b/tools/inputs/history/np7-535-sg-history-samples.csv
@@ -0,0 +1,4 @@
+TargetDate,Source,Sink,TimeOfUse,StartDate,ACI99,ACP
+04/01/2026,HHOLLW4_WND1,CHISMGRD_RN,Off-peak,05/01/2026,-2.9138,-1.0881
+04/01/2026,HHOLLW4_WND1,FRMRSVLW_RN,Off-peak,05/01/2026,-1.6985,-0.5574
+04/01/2026,HHOLLW3_WND1,CISC_RN,Off-peak,05/01/2026,-1.6345,0.12
diff --git a/tools/inputs/history/offers-evidence.json b/tools/inputs/history/offers-evidence.json
new file mode 100644
index 00000000..fa231c97
--- /dev/null
+++ b/tools/inputs/history/offers-evidence.json
@@ -0,0 +1,32 @@
+[
+ {
+ "endpoint": "np4-19-cd/dam_agg_as_offer_curve",
+ "fixture": "np4-19-cd-history-current.csv",
+ "file": "cdr.00012330.0000000000000000.20260907.123434.DAMASAGGNP419.csv",
+ "csv_rows": 20778,
+ "first_row": {
+ "DSTFlag": false,
+ "ancillaryType": "ECRSM",
+ "deliveryDate": "2026-09-08",
+ "hourEnding": "01:00",
+ "price": "0",
+ "quantity": "124"
+ },
+ "rows_decoded": 20778
+ },
+ {
+ "endpoint": "np4-19-cd/dam_agg_as_offer_curve",
+ "fixture": "np4-19-cd-history-samples.csv",
+ "file": "cdr.00012330.0000000000000000.20140312.131116.DAMASAGGNP419.csv",
+ "csv_rows": 5726,
+ "first_row": {
+ "DSTFlag": false,
+ "ancillaryType": "OFFNS",
+ "deliveryDate": "2014-03-13",
+ "hourEnding": "01:00",
+ "price": "400",
+ "quantity": "1757"
+ },
+ "rows_decoded": 5726
+ }
+]
diff --git a/tools/inputs/history/operations-evidence.json b/tools/inputs/history/operations-evidence.json
new file mode 100644
index 00000000..033c7f82
--- /dev/null
+++ b/tools/inputs/history/operations-evidence.json
@@ -0,0 +1,374 @@
+[
+ {
+ "endpoint": "np6-322-cd/sced_system_lambda",
+ "fixture": "np6-322-cd-history-current.csv",
+ "file": "cdr.00013114.0000000000000000.20260907.121521.SCEDSYSLAMBDANP6322_20260907_121518.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-07T12:15:18",
+ "repeatedHourFlag": false,
+ "cappedSystemLambda": "31.61007",
+ "uncappedSystemLambda": "31.61007",
+ "systemLambda": null
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-322-cd/sced_system_lambda",
+ "fixture": "np6-322-cd-history-samples.csv",
+ "file": "cdr.00013114.0000000000000000.20140501.000016.SCEDSYSLAMBDANP6322_20140501_000014.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "SCEDTimestamp": "2014-05-01T00:00:14",
+ "repeatedHourFlag": false,
+ "cappedSystemLambda": null,
+ "uncappedSystemLambda": null,
+ "systemLambda": "28.8797130584717"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-323-cd/rt_price_adder_sced",
+ "fixture": "np6-323-cd-history-current.csv",
+ "file": "cdr.00013221.0000000000000000.20260907.122021.RTSCEDpriceAdderNP6323_20260907_122019.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-07T12:20:19",
+ "repeatHourFlag": false,
+ "systemLambda": "34.8972",
+ "RTRDPA": "0.00",
+ "RTRDPARUS": "0.00",
+ "RTRDPARDS": "0.00",
+ "RTRDPARRS": "0.00",
+ "RTRDPAECRS": "0.00",
+ "RTRDPANSS": "0.00",
+ "RTRRUC": "0.00",
+ "RTRRMR": "0.00",
+ "RTDNCLR": "0.00",
+ "RTDERS": "0.00",
+ "RTDCTIEIMPORT": "0.00",
+ "RTDCTIEEXPORT": "0.00",
+ "RTBLTIMPORT": "0.00",
+ "RTBLTEXPORT": "0.00",
+ "RTOLLSL": "11900.76",
+ "RTOLHSL": "106661.27",
+ "RTDLL": "0.00",
+ "BatchID": null,
+ "PRC": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTBP": null,
+ "RTCLRCAP": null,
+ "RTCLRREG": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTNCLRRRS": null,
+ "RTOLNSRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-323-cd/rt_price_adder_sced",
+ "fixture": "np6-323-cd-history-samples.csv",
+ "file": "cdr.00013221.0000000000000000.20140601.000108.SCEDPriceAdderORDCNP6323_20140601_000106.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "SCEDTimestamp": "2014-06-01T00:01:06",
+ "repeatHourFlag": false,
+ "systemLambda": "31.3914",
+ "RTRDPA": null,
+ "RTRDPARUS": null,
+ "RTRDPARDS": null,
+ "RTRDPARRS": null,
+ "RTRDPAECRS": null,
+ "RTRDPANSS": null,
+ "RTRRUC": null,
+ "RTRRMR": null,
+ "RTDNCLR": null,
+ "RTDERS": null,
+ "RTDCTIEIMPORT": null,
+ "RTDCTIEEXPORT": null,
+ "RTBLTIMPORT": null,
+ "RTBLTEXPORT": null,
+ "RTOLLSL": null,
+ "RTOLHSL": "37075.46",
+ "RTDLL": null,
+ "BatchID": 3913022,
+ "PRC": "4244.76",
+ "RTORPA": "0.0033",
+ "RTOFFPA": "0.0005",
+ "RTOLCAP": "7345.24",
+ "RTOFFCAP": "2810.61",
+ "RTBP": "31040.25",
+ "RTCLRCAP": "0.00",
+ "RTCLRREG": "0.00",
+ "RTCLRBP": "0.00",
+ "RTCLRLSL": "0.00",
+ "RTCLRNS": "0.00",
+ "RTNCLRRRS": "1310.02",
+ "RTOLNSRS": "0.00",
+ "RTCST30HSL": "2287.89",
+ "RTOFFNSHSL": "522.72",
+ "RTOFF10": "0.00",
+ "RTOFF30": "0.00"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-324-cd/rt_15min_price_adders",
+ "fixture": "np6-324-cd-history-current.csv",
+ "file": "cdr.00013220.0000000000000000.20260907.121700.RT15MPRICEADDERNP6324_20260907_1215.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": 13,
+ "deliveryInterval": 1,
+ "RTRDPA": "0.00",
+ "RTRDPRU": "0.00",
+ "RTRDPRD": "0.00",
+ "RTRDPRRS": "0.00",
+ "RTRDPECRS": "0.00",
+ "RTRDPNS": "0.00",
+ "repeatHourFlag": false,
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-324-cd/rt_15min_price_adders",
+ "fixture": "np6-324-cd-history-samples.csv",
+ "file": "cdr.00013220.0000000000000000.20140601.000201.RTPRICEADDERORDCNP6324_20140601_0000.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "deliveryDate": "2014-05-31",
+ "deliveryHour": 24,
+ "deliveryInterval": 4,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "repeatHourFlag": false,
+ "RTRSVPOR": "0.0000",
+ "RTRSVPOFF": "0.0000"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-325-cd/rtd_price_adders",
+ "fixture": "np6-325-cd-history-current.csv",
+ "file": "cdr.00013222.0000000000000000.20260907.122141.RTDPriceAddersNP6325_20260907_122003.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "RTDTimestamp": "2026-09-07T12:20:03",
+ "repeatHourFlag": false,
+ "intervalID": 1,
+ "intervalEnding": "2026-09-07T12:25:00",
+ "IERepeatHourFlag": false,
+ "systemLambda": "31.4268",
+ "RTRDPA": "0.00",
+ "RTRDPARUS": "0.00",
+ "RTRDPARDS": "0.00",
+ "RTRDPARRS": "0.00",
+ "RTRDPAECRS": "0.00",
+ "RTRDPANSS": "0.00",
+ "RTRRUC": "0.00",
+ "RTRRMR": "0.00",
+ "RTDNCLR": "0.00",
+ "RTDERS": "0.00",
+ "RTDCTIEImport": "0.00",
+ "RTDCTIEExport": "0.00",
+ "RTBLTImport": "0.00",
+ "RTBLTExport": "0.00",
+ "RTOLLSL": "11956.84",
+ "RTOLHSL": "106231.59",
+ "RTDLL": "0.00",
+ "BatchID": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np6-325-cd/rtd_price_adders",
+ "fixture": "np6-325-cd-history-samples.csv",
+ "file": "cdr.00013222.0000000000000000.20140601.001014.RTDPriceAdderORDCNP6325_20140601_001001.csv",
+ "csv_rows": 11,
+ "first_row": {
+ "RTDTimestamp": "2014-06-01T00:10:01",
+ "repeatHourFlag": false,
+ "intervalID": 1,
+ "intervalEnding": "2014-06-01T00:15:00",
+ "IERepeatHourFlag": false,
+ "systemLambda": "33.8459",
+ "RTRDPA": null,
+ "RTRDPARUS": null,
+ "RTRDPARDS": null,
+ "RTRDPARRS": null,
+ "RTRDPAECRS": null,
+ "RTRDPANSS": null,
+ "RTRRUC": null,
+ "RTRRMR": null,
+ "RTDNCLR": null,
+ "RTDERS": null,
+ "RTDCTIEImport": null,
+ "RTDCTIEExport": null,
+ "RTBLTImport": null,
+ "RTBLTExport": null,
+ "RTOLLSL": null,
+ "RTOLHSL": null,
+ "RTDLL": null,
+ "BatchID": 3913027,
+ "RTORPA": "0.0882",
+ "RTOFFPA": "0.0503",
+ "RTOLCAP": "6762.25",
+ "RTOFFCAP": "1987.92"
+ },
+ "rows_decoded": 11
+ },
+ {
+ "endpoint": "np6-625-cd/se_ld_rpt_ercot_gen",
+ "fixture": "np6-625-cd-history-current.csv",
+ "file": "cdr.00012358.0000000000000000.20260907.121000.SELRTEGNP6625.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "scadaMVAR": "9695.052226",
+ "scadaMW": "84606.420248",
+ "seExeTime": "2026-09-07T12:07:11",
+ "seExeTimeDST": "d",
+ "seMVAR": "10126.730488",
+ "seMW": "84567.655625"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-625-cd/se_ld_rpt_ercot_gen",
+ "fixture": "np6-625-cd-history-samples.csv",
+ "file": "cdr.00012358.0000000000000000.20190101.001000.SELRTEGNP6625.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "scadaMVAR": "4140.795098",
+ "scadaMW": "42286.856412",
+ "seExeTime": "2019-01-01T00:07:31",
+ "seExeTimeDST": "s",
+ "seMVAR": "4221.460911",
+ "seMW": "42347.593624"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-626-cd/se_load_dcties_flows",
+ "fixture": "np6-626-cd-history-current.csv",
+ "file": "cdr.00012359.0000000000000000.20260907.121000.SELRTFNP6626.csv",
+ "csv_rows": 4,
+ "first_row": {
+ "MWTIE": "-0.400000005960464",
+ "TAGCTimeDST": "d",
+ "TAGCTimestamp": "2026-09-07T12:09:52",
+ "TEIDTIE": "289735",
+ "TIELineId": "DC_L"
+ },
+ "rows_decoded": 4
+ },
+ {
+ "endpoint": "np6-626-cd/se_load_dcties_flows",
+ "fixture": "np6-626-cd-history-samples.csv",
+ "file": "cdr.00012359.0000000000000000.20190101.001000.SELRTFNP6626.csv",
+ "csv_rows": 5,
+ "first_row": {
+ "MWTIE": "0.200000002980232",
+ "TAGCTimeDST": "s",
+ "TAGCTimestamp": "2019-01-01T00:09:52",
+ "TEIDTIE": "289735",
+ "TIELineId": "DC_L"
+ },
+ "rows_decoded": 5
+ },
+ {
+ "endpoint": "np6-915-cd/sum_hdl_ldl",
+ "fixture": "np6-915-cd-history-current.csv",
+ "file": "cdr.00013081.0000000000000000.20260907.122521.SUMHDLLDLNP6915_20260907_122518.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "GTBD": "79818.1",
+ "SCEDTimestamp": "2026-09-07T12:25:18",
+ "repeatHourFlag": false,
+ "sumHDL": "100488.2",
+ "sumLDL": "28563.5"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-915-cd/sum_hdl_ldl",
+ "fixture": "np6-915-cd-history-samples.csv",
+ "file": "cdr.00013081.0000000000000000.20260430.111021.SUMHDLLDLNP6915_20260430_111019.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "GTBD": "53549.7",
+ "SCEDTimestamp": "2026-04-30T11:10:19",
+ "repeatHourFlag": false,
+ "sumHDL": "72718.9",
+ "sumLDL": "23091.2"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np6-86-cd/shdw_prices_bnd_trns_const",
+ "fixture": "np6-86-cd-history-current.csv",
+ "file": "cdr.00012302.0000000000000000.20260907.120500.SCEDBTCNP686.csv",
+ "csv_rows": 58,
+ "first_row": {
+ "CCTStatus": "NONCOMP",
+ "SCEDTimestamp": "2026-09-07T11:55:19",
+ "constraintID": 1,
+ "constraintName": "138_ALV_NAL_1",
+ "contingencyName": "SMDOPHR5",
+ "fromStation": "TNNALVIN",
+ "fromStationkV": "138",
+ "limit": "389.2",
+ "maxShadowPrice": "3500",
+ "repeatedHourFlag": false,
+ "shadowPrice": "14.63911",
+ "toStation": "ALVIN",
+ "toStationkV": "138",
+ "value": "389.2",
+ "violatedMW": "0"
+ },
+ "rows_decoded": 58
+ },
+ {
+ "endpoint": "np6-86-cd/shdw_prices_bnd_trns_const",
+ "fixture": "np6-86-cd-history-samples.csv",
+ "file": "cdr.00012302.0000000000000000.20140501.000501.SCEDBTCNP686.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "CCTStatus": "NONCOMP",
+ "SCEDTimestamp": "2014-04-30T23:55:08",
+ "constraintID": 1,
+ "constraintName": "GILA_HIWAY_2_1",
+ "contingencyName": "SKOCNU28",
+ "fromStation": "GILA",
+ "fromStationkV": "138",
+ "limit": "254.7",
+ "maxShadowPrice": "3500",
+ "repeatedHourFlag": false,
+ "shadowPrice": "0",
+ "toStation": "HIWAY_9",
+ "toStationkV": "138",
+ "value": "239.4",
+ "violatedMW": "-15.3"
+ },
+ "rows_decoded": 12
+ }
+]
diff --git a/tools/inputs/history/outage-load-evidence.json b/tools/inputs/history/outage-load-evidence.json
new file mode 100644
index 00000000..302231f0
--- /dev/null
+++ b/tools/inputs/history/outage-load-evidence.json
@@ -0,0 +1,695 @@
+{
+ "scope": "One publication from January, April, July and October of 2023\u20132025 for outages; one January publication per year where listed in 2015\u20132025 for load forecasts. All rows and all published data values were compared independently with source cells/CSV values, normalizing dates, numeric quantities and surrounding text whitespace. Missing complementary outage end-date fields and load forecast publication timestamps remain None. These checks do not establish continuous retention or every historical layout.",
+ "outages": {
+ "files": 12,
+ "decodedRows": 4519,
+ "allSourceValuesMatch": true
+ },
+ "loadForecasts": {
+ "files": 7,
+ "decodedRows": 1344,
+ "allSourceValuesMatch": true
+ },
+ "samples": [
+ {
+ "product": "NP1-346-ER",
+ "period": "2023-01",
+ "totalPublications": 32,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 892933823,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2023-01-31T05:03:09"
+ },
+ "source": "work/history-outage-2023-01/NP1-346-ER.zip",
+ "zipSha256": "9e9c22ce5c39d4931e907d3596cbc56bcea0a138290e2d77c11f3ce53a90d2dd",
+ "files": [
+ {
+ "member": "230131050008.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "34dc80c90d6231c19934562f7581b357f1d6259ddefca13cc5deddb6ce1c929c",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 271,
+ "decodedRows": 271,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2023-04",
+ "totalPublications": 30,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-04-01T00:00:00",
+ "postDatetimeTo": "2023-05-01T00:00:00"
+ },
+ "document": {
+ "docId": 912227552,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2023-04-30T05:03:22"
+ },
+ "source": "work/history-outage-2023-04/NP1-346-ER.zip",
+ "zipSha256": "d73fe29d2089c94862d41e4f3dd8df151f7fc4092b4742b220c5d653049f8243",
+ "files": [
+ {
+ "member": "230430050007.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "267211f5595b56a0929d6d170234daf455d415b1a8479deaed76413cad935518",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 364,
+ "decodedRows": 364,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2023-07",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-07-01T00:00:00",
+ "postDatetimeTo": "2023-08-01T00:00:00"
+ },
+ "document": {
+ "docId": 933122574,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2023-07-31T05:05:34"
+ },
+ "source": "work/history-outage-2023-07/NP1-346-ER.zip",
+ "zipSha256": "28540ea9263c1989fd57423f4bceec8639027d22eaf95b567d6043cef4d6e095",
+ "files": [
+ {
+ "member": "230731050012.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "34f6119357a9d411d29ed34f64ec2eae09955d722cc8bd28329082273d9a823d",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 315,
+ "decodedRows": 315,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2023-10",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-10-01T00:00:00",
+ "postDatetimeTo": "2023-11-01T00:00:00"
+ },
+ "document": {
+ "docId": 954784528,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2023-10-31T05:00:45"
+ },
+ "source": "work/history-outage-2023-10/NP1-346-ER.zip",
+ "zipSha256": "bfdb9e725d629015a02de58a19889cacdd58126e0e56f414f4dc19906fc2d75e",
+ "files": [
+ {
+ "member": "231031050004.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "04f0a3ba9079521d154ce8685b854af7ccb7c5a51037ad5e6486042e02b99a38",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 388,
+ "decodedRows": 388,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2024-01",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977288125,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2024-01-31T05:00:51"
+ },
+ "source": "work/history-outage-2024-01/NP1-346-ER.zip",
+ "zipSha256": "616c852573ce277283cdd7ea633b5527b28f9cfe996127993bdf00cdd468552f",
+ "files": [
+ {
+ "member": "240131050006.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "7150198835267ff91d990402af0897050377e5d8d8c4eed00fab7228a4e553f5",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 328,
+ "decodedRows": 328,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2024-04",
+ "totalPublications": 30,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-04-01T00:00:00",
+ "postDatetimeTo": "2024-05-01T00:00:00"
+ },
+ "document": {
+ "docId": 1000009344,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2024-04-30T05:01:14"
+ },
+ "source": "work/history-outage-2024-04/NP1-346-ER.zip",
+ "zipSha256": "d162a67e1b283dce017c8f1ba3e58b0c9c72a964b8d13053c9c84caec1eb1166",
+ "files": [
+ {
+ "member": "240430050011.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "1b6faaf85e4c1b23186fef563d11010e8520f9e8364be6d4cb79af8a964ae459",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 374,
+ "decodedRows": 374,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2024-07",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-07-01T00:00:00",
+ "postDatetimeTo": "2024-08-01T00:00:00"
+ },
+ "document": {
+ "docId": 1024003166,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2024-07-31T05:00:56"
+ },
+ "source": "work/history-outage-2024-07/NP1-346-ER.zip",
+ "zipSha256": "abca6063b697e1413faedc5113c967e407758aa04efa158f90f45c38a1e3e42d",
+ "files": [
+ {
+ "member": "240731050005.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "2221be5710c777196667d0d738c1a1ebd905a715fc5002b2463dd668cd3f77dc",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 349,
+ "decodedRows": 349,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2024-10",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-10-01T00:00:00",
+ "postDatetimeTo": "2024-11-01T00:00:00"
+ },
+ "document": {
+ "docId": 1048529591,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2024-10-31T05:01:04"
+ },
+ "source": "work/history-outage-2024-10/NP1-346-ER.zip",
+ "zipSha256": "dc9d5c28be3b3203832f63cb9371936f01a35df22be68102561db9b0bcd2203f",
+ "files": [
+ {
+ "member": "241031050011.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "196ef458286135f7b82e62bef4fe73fc0f6198f262c3c73adf963aaf595bf08f",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 363,
+ "decodedRows": 363,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2025-01",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073744783,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2025-01-31T05:00:56"
+ },
+ "source": "work/history-outage-2025-01/NP1-346-ER.zip",
+ "zipSha256": "cf94787d4cd533bda3ec3d14cbed318dc5eaf61a8e86f038b003816d4b4fef8f",
+ "files": [
+ {
+ "member": "250131050006.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "dc19ceffad0c5a3bbce4baed4b5f27df20b2a3de5267240158272e185c259d1f",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 514,
+ "decodedRows": 514,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2025-04",
+ "totalPublications": 30,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-04-01T00:00:00",
+ "postDatetimeTo": "2025-05-01T00:00:00"
+ },
+ "document": {
+ "docId": 1098677985,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2025-04-30T05:00:52"
+ },
+ "source": "work/history-outage-2025-04/NP1-346-ER.zip",
+ "zipSha256": "aac34c1e8fc600cc337f3ea523b1f4455ec71b0b8dc4e03e45ca938f892d9967",
+ "files": [
+ {
+ "member": "250430050004.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "bc4305c5856adb16ab31a5b63584512068c43c34b0107c6907061631c1c3a001",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 416,
+ "decodedRows": 416,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2025-07",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-07-01T00:00:00",
+ "postDatetimeTo": "2025-08-01T00:00:00"
+ },
+ "document": {
+ "docId": 1125875478,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2025-07-31T05:06:46"
+ },
+ "source": "work/history-outage-2025-07/NP1-346-ER.zip",
+ "zipSha256": "1b375287a83396fea7c16abb76a512e1255a3467c2682bfa85650509a6b8f6f5",
+ "files": [
+ {
+ "member": "250731050602.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "a1c139dd79f34d571fd5897189ecfdf59bfac6848063baa6a2231fc286fdad07",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 411,
+ "decodedRows": 411,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP1-346-ER",
+ "period": "2025-10",
+ "totalPublications": 31,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-10-01T00:00:00",
+ "postDatetimeTo": "2025-11-01T00:00:00"
+ },
+ "document": {
+ "docId": 1155776946,
+ "friendlyName": "UnplannedResOutage",
+ "postDatetime": "2025-10-31T05:01:00"
+ },
+ "source": "work/history-outage-2025-10/NP1-346-ER.zip",
+ "zipSha256": "f26967195fafa7cc141c5927f6262f75ea1cb758cd1996e615d0798d1c009468",
+ "files": [
+ {
+ "member": "251031050005.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx",
+ "xlsxSha256": "e172f448517f6c1c23aa9345844177dc192cb08c655116f3fe01a91e6c073b96",
+ "sheet": "Unplanned Resource Outages",
+ "columns": [
+ "Resource Name",
+ "Resource Unit Code",
+ "Fuel Type",
+ "Outage Type",
+ "Available MW Maximum",
+ "Available MW During Outage",
+ "Effective MW Reduction Due to Outage",
+ "Actual Outage Start",
+ "Planned End Date",
+ "Actual End Date",
+ "Nature Of Work"
+ ],
+ "sourceRows": 426,
+ "decodedRows": 426,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2015",
+ "totalPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2015-01-01T00:00:00",
+ "postDatetimeTo": "2015-02-01T00:00:00"
+ }
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2016",
+ "totalPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2016-01-01T00:00:00",
+ "postDatetimeTo": "2016-02-01T00:00:00"
+ }
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2017",
+ "totalPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2017-01-01T00:00:00",
+ "postDatetimeTo": "2017-02-01T00:00:00"
+ }
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2018",
+ "totalPublications": 0,
+ "publicationQuery": {
+ "postDatetimeFrom": "2018-01-01T00:00:00",
+ "postDatetimeTo": "2018-02-01T00:00:00"
+ }
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2019",
+ "totalPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2019-01-01T00:00:00",
+ "postDatetimeTo": "2019-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 646775914,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2019-01-31T23:30:01"
+ },
+ "source": "work/history-annual-load-2019/NP3-560-CD.zip",
+ "zipSha256": "7ffee61c3b2d8ef5dcb4100753667899dbe31f1e68bcc888c4c8fccedc59c3ec",
+ "files": [
+ {
+ "member": "cdr.00012311.0000000000000000.20190131.233000.LFCCONGESTNP3560.csv",
+ "csvSha256": "e032b3aaf6cd6d486c5c40041c50986f7ead99eeddad40310aafe7303f8c2716",
+ "sourceRows": 192,
+ "decodedRows": 192,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2020",
+ "totalPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2020-01-01T00:00:00",
+ "postDatetimeTo": "2020-02-01T00:00:00"
+ },
+ "listingReusedFrom": "history-middle-listings.json",
+ "document": {
+ "docId": 698822255,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2020-01-31T23:30:01"
+ },
+ "source": "work/history-middle-2020/NP3-560-CD.zip",
+ "zipSha256": "ec487dc8296e4b4e1dc84666843325fafa3c5ddfefcb0a694ec46472c063781e",
+ "files": [
+ {
+ "member": "cdr.00012311.0000000000000000.20200131.233000.LFCCONGESTNP3560.csv",
+ "csvSha256": "6609c47d4a9baeb48790cc32acdfb55336c7f3bc996a1eafbe9df309140216a4",
+ "sourceRows": 192,
+ "decodedRows": 192,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2021",
+ "totalPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2021-01-01T00:00:00",
+ "postDatetimeTo": "2021-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 756350731,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2021-01-31T23:30:01"
+ },
+ "source": "work/history-annual-load-2021/NP3-560-CD.zip",
+ "zipSha256": "07d90a28c572d9437174d41e02bf594d0dddc56e15a15d4a7efbe9e0615c3d79",
+ "files": [
+ {
+ "member": "cdr.00012311.0000000000000000.20210131.233000.LFCCONGESTNP3560.csv",
+ "csvSha256": "a4fa935a783dd793f2388820cc756f00846562e71873bf12aae293de39c5fd02",
+ "sourceRows": 192,
+ "decodedRows": 192,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2022",
+ "totalPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2022-01-01T00:00:00",
+ "postDatetimeTo": "2022-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 820531535,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2022-01-31T23:30:00"
+ },
+ "source": "work/history-annual-load-2022/NP3-560-CD.zip",
+ "zipSha256": "0fbbe82a52c47a01313cbc72a32693b4cb5a1fe0fae2253673a07b2c6222519e",
+ "files": [
+ {
+ "member": "cdr.00012311.0000000000000000.20220131.233000.LFCCONGESTNP3560.csv",
+ "csvSha256": "53eaf38c285d8f827bbcacbac7c66162f71c1c0204a1f6520f06e0cfc8b7a0aa",
+ "sourceRows": 192,
+ "decodedRows": 192,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2023",
+ "totalPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2023-01-01T00:00:00",
+ "postDatetimeTo": "2023-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 893107715,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2023-01-31T23:30:00"
+ },
+ "source": "work/history-annual-load-2023/NP3-560-CD.zip",
+ "zipSha256": "1d6dc908011e394f3a0271b09ed6590e66552c5bf7751d06882c6b1638b496af",
+ "files": [
+ {
+ "member": "cdr.00012311.0000000000000000.20230131.233000.LFCCONGESTNP3560.csv",
+ "csvSha256": "7d6343bb173384b25217067d81bfb1c979cea294caf1e787ccf9b63082850a76",
+ "sourceRows": 192,
+ "decodedRows": 192,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2024",
+ "totalPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2024-01-01T00:00:00",
+ "postDatetimeTo": "2024-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 977487127,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2024-01-31T23:30:00"
+ },
+ "source": "work/history-annual-load-2024/NP3-560-CD.zip",
+ "zipSha256": "e4a46614a1a80a90077ff909be59ac26acae6be915ca42b12f2666ba566e4ded",
+ "files": [
+ {
+ "member": "cdr.00012311.0000000000000000.20240131.233000.LFCCONGESTNP3560.csv",
+ "csvSha256": "f560451df616cf6d0fcbf899edcbe9c054d894eb19994842d4e197c0babd5bfb",
+ "sourceRows": 192,
+ "decodedRows": 192,
+ "allSourceValuesMatch": true
+ }
+ ]
+ },
+ {
+ "product": "NP3-560-CD",
+ "period": "2025",
+ "totalPublications": 744,
+ "publicationQuery": {
+ "postDatetimeFrom": "2025-01-01T00:00:00",
+ "postDatetimeTo": "2025-02-01T00:00:00"
+ },
+ "document": {
+ "docId": 1073967218,
+ "friendlyName": "LFCCONGESTNP3560_csv",
+ "postDatetime": "2025-01-31T23:30:00"
+ },
+ "source": "work/history-annual-load-2025/NP3-560-CD.zip",
+ "zipSha256": "c3e56a880a3d2c0bac6d430717511ea817ea7aa512e8c664b91de8d271488f96",
+ "files": [
+ {
+ "member": "cdr.00012311.0000000000000000.20250131.233000.LFCCONGESTNP3560.csv",
+ "csvSha256": "4c6a47ea05b1ecca13039f1de267d8bfa66ea33769997bbc4b1d7d1924721069",
+ "sourceRows": 192,
+ "decodedRows": 192,
+ "allSourceValuesMatch": true
+ }
+ ]
+ }
+ ]
+}
diff --git a/tools/inputs/history/price-workbooks-evidence.json b/tools/inputs/history/price-workbooks-evidence.json
new file mode 100644
index 00000000..0a5de3b5
--- /dev/null
+++ b/tools/inputs/history/price-workbooks-evidence.json
@@ -0,0 +1,887 @@
+[
+ {
+ "endpoint": "np6-792-er/price_adders",
+ "fixture": "np6-792-er-history-current.xlsx",
+ "file": "HIST_RT_SCED_PRC_ADDR_2026.xlsx",
+ "sheet_rows": {
+ "Jan": 9081,
+ "Feb": 8181,
+ "Mar": 9034,
+ "Apr": 8814,
+ "May": 8975,
+ "Jun": 8689,
+ "Jul": 8981,
+ "Aug": 9005,
+ "Sep": 1459,
+ "Oct": 0,
+ "Nov": 0,
+ "Dec": 0
+ },
+ "source_folder": "history-current",
+ "rows_decoded": 72219,
+ "first_rows": {
+ "Jan": {
+ "sourceSheet": "Jan",
+ "SCEDTimestamp": "2026-01-01T00:00:16.999000",
+ "repeatHourFlag": false,
+ "systemLambda": "17.9768",
+ "RTRDPA": "0",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "4354.91",
+ "RTOLHSL": "74352.19",
+ "RTDLL": null,
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "Feb": {
+ "sourceSheet": "Feb",
+ "SCEDTimestamp": "2026-02-01T00:00:22",
+ "repeatHourFlag": false,
+ "systemLambda": "124.248",
+ "RTRDPA": "0",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "14851.69",
+ "RTOLHSL": "79482.89",
+ "RTDLL": null,
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "Mar": {
+ "sourceSheet": "Mar",
+ "SCEDTimestamp": "2026-03-01T00:00:22",
+ "repeatHourFlag": false,
+ "systemLambda": "20.0706",
+ "RTRDPA": "0",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "-386.23",
+ "RTOLHSL": "67568.86",
+ "RTDLL": null,
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "Apr": {
+ "sourceSheet": "Apr",
+ "SCEDTimestamp": "2026-04-01T00:00:28",
+ "repeatHourFlag": false,
+ "systemLambda": "31.4034",
+ "RTRDPA": "0",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "1672.86",
+ "RTOLHSL": "68522.91",
+ "RTDLL": null,
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "May": {
+ "sourceSheet": "May",
+ "SCEDTimestamp": "2026-05-01T00:00:28.999000",
+ "repeatHourFlag": false,
+ "systemLambda": "33.4362",
+ "RTRDPA": "0",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "5801.96",
+ "RTOLHSL": "66179.66",
+ "RTDLL": null,
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "Jun": {
+ "sourceSheet": "Jun",
+ "SCEDTimestamp": "2026-06-01T00:00:21",
+ "repeatHourFlag": false,
+ "systemLambda": "44.5377",
+ "RTRDPA": "0",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "6838.95",
+ "RTOLHSL": "74670.61",
+ "RTDLL": null,
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "Jul": {
+ "sourceSheet": "Jul",
+ "SCEDTimestamp": "2026-07-01T00:00:25.999000",
+ "repeatHourFlag": false,
+ "systemLambda": "28.3218",
+ "RTRDPA": "0",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "5595.01",
+ "RTOLHSL": "84487.76",
+ "RTDLL": "0",
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "Aug": {
+ "sourceSheet": "Aug",
+ "SCEDTimestamp": "2026-08-01T00:00:21",
+ "repeatHourFlag": false,
+ "systemLambda": "33.7135",
+ "RTRDPA": "1.64",
+ "RTRDPARUS": "0.01",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0.01",
+ "RTRDPANSS": "0.04",
+ "RTRRUC": "0",
+ "RTRRMR": "33.66",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "10516.48",
+ "RTOLHSL": "90274.86",
+ "RTDLL": "0",
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ },
+ "Sep": {
+ "sourceSheet": "Sep",
+ "SCEDTimestamp": "2026-09-01T00:00:20",
+ "repeatHourFlag": false,
+ "systemLambda": "33.4275",
+ "RTRDPA": "2.37",
+ "RTRDPARUS": "0",
+ "RTRDPARDS": "0",
+ "RTRDPARRS": "0",
+ "RTRDPAECRS": "0",
+ "RTRDPANSS": "0",
+ "RTRRUC": "100",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": "0",
+ "RTDCTIEEXPORT": "0",
+ "RTBLTIMPORT": "0",
+ "RTBLTEXPORT": "0",
+ "RTOLLSL": "7478.15",
+ "RTOLHSL": "87725.13",
+ "RTDLL": "0",
+ "batchId": null,
+ "PRC": null,
+ "RTOLCAP": null,
+ "RTOFFCAP": null,
+ "RTORPA": null,
+ "RTOFFPA": null,
+ "RTBP": null,
+ "RTOLNSRS": null,
+ "RTCLRCAP": null,
+ "RTCLRBP": null,
+ "RTCLRLSL": null,
+ "RTCLRNS": null,
+ "RTCLRREG": null,
+ "RTNCLRRRS": null,
+ "RTCST30HSL": null,
+ "RTOFFNSHSL": null,
+ "RTOFF10": null,
+ "RTOFF30": null,
+ "RTORDPA": null,
+ "RTOLLASL": null,
+ "RTOLHASL": null,
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ }
+ }
+ },
+ {
+ "endpoint": "np6-792-er/price_adders",
+ "fixture": "np6-792-er-history-samples.xlsx",
+ "file": "RTM_ORDC_REL_DPLY_PRC_ADDR_RSRV_2018.xlsx",
+ "sheet_rows": {
+ "Jan": 1733,
+ "Feb": 0,
+ "Mar": 0,
+ "Apr": 0,
+ "May": 0,
+ "Jun": 0,
+ "Jul": 0,
+ "Aug": 0,
+ "Sep": 0,
+ "Oct": 0,
+ "Nov": 0,
+ "Dec": 0
+ },
+ "source_folder": "history-samples",
+ "rows_decoded": 1733,
+ "first_rows": {
+ "Jan": {
+ "sourceSheet": "Jan",
+ "SCEDTimestamp": "2018-01-01T00:00:21",
+ "repeatHourFlag": false,
+ "systemLambda": "27.4455",
+ "RTRDPA": null,
+ "RTRDPARUS": null,
+ "RTRDPARDS": null,
+ "RTRDPARRS": null,
+ "RTRDPAECRS": null,
+ "RTRDPANSS": null,
+ "RTRRUC": "0",
+ "RTRRMR": "0",
+ "RTDNCLR": "0",
+ "RTDERS": "0",
+ "RTDCTIEIMPORT": null,
+ "RTDCTIEEXPORT": null,
+ "RTBLTIMPORT": null,
+ "RTBLTEXPORT": null,
+ "RTOLLSL": null,
+ "RTOLHSL": "56470.52",
+ "RTDLL": null,
+ "batchId": 5061293,
+ "PRC": "5417",
+ "RTOLCAP": "12572.99",
+ "RTOFFCAP": "3628.33",
+ "RTORPA": "0",
+ "RTOFFPA": "0",
+ "RTBP": "45192.4",
+ "RTOLNSRS": "0",
+ "RTCLRCAP": "0",
+ "RTCLRBP": "0",
+ "RTCLRLSL": "0",
+ "RTCLRNS": "0",
+ "RTCLRREG": "0",
+ "RTNCLRRRS": "1294.87",
+ "RTCST30HSL": "3392.33",
+ "RTOFFNSHSL": "236",
+ "RTOFF10": "0",
+ "RTOFF30": "0",
+ "RTORDPA": "0",
+ "RTOLLASL": "28149.78",
+ "RTOLHASL": "61085.07",
+ "RTRUCCST30HSL": null,
+ "RTNCLRNSCAP": null
+ }
+ }
+ },
+ {
+ "endpoint": "np6-793-er/price_adders",
+ "fixture": "np6-793-er-history-current.xlsx",
+ "file": "rpt.00013240.0000000000000000.20260906.100007106.HIST_RT15MPRICEADDER_2026.xlsx",
+ "sheet_rows": {
+ "Jan": 2976,
+ "Feb": 2688,
+ "Mar": 2972,
+ "Apr": 2880,
+ "May": 2976,
+ "Jun": 2880,
+ "Jul": 2976,
+ "Aug": 2976,
+ "Sep": 480
+ },
+ "source_folder": "history-current",
+ "rows_decoded": 23804,
+ "first_rows": {
+ "Jan": {
+ "sourceSheet": "Jan",
+ "deliveryDate": "2026-01-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "0",
+ "RTRDPRU": "0.01",
+ "RTRDPRD": "0",
+ "RTRDPRRS": "0.03",
+ "RTRDPECRS": "0.07",
+ "RTRDPNS": "0.26",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "Feb": {
+ "sourceSheet": "Feb",
+ "deliveryDate": "2026-02-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "0",
+ "RTRDPRU": "3.44",
+ "RTRDPRD": "1.02",
+ "RTRDPRRS": "0.68",
+ "RTRDPECRS": "0.96",
+ "RTRDPNS": "5.35",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "Mar": {
+ "sourceSheet": "Mar",
+ "deliveryDate": "2026-03-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "0",
+ "RTRDPRU": "0.37",
+ "RTRDPRD": "0.45",
+ "RTRDPRRS": "0.11",
+ "RTRDPECRS": "0.09",
+ "RTRDPNS": "0.83",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "Apr": {
+ "sourceSheet": "Apr",
+ "deliveryDate": "2026-04-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "0",
+ "RTRDPRU": "0.68",
+ "RTRDPRD": "0.2",
+ "RTRDPRRS": "0.14",
+ "RTRDPECRS": "0.27",
+ "RTRDPNS": "1.12",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "May": {
+ "sourceSheet": "May",
+ "deliveryDate": "2026-05-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "0",
+ "RTRDPRU": "1.39",
+ "RTRDPRD": "0.26",
+ "RTRDPRRS": "0.84",
+ "RTRDPECRS": "1.65",
+ "RTRDPNS": "6.68",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "Jun": {
+ "sourceSheet": "Jun",
+ "deliveryDate": "2026-06-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "0",
+ "RTRDPRU": "1.09",
+ "RTRDPRD": "0",
+ "RTRDPRRS": "0.35",
+ "RTRDPECRS": "0.48",
+ "RTRDPNS": "2.7",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "Jul": {
+ "sourceSheet": "Jul",
+ "deliveryDate": "2026-07-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "0",
+ "RTRDPRU": "0.51",
+ "RTRDPRD": "0.29",
+ "RTRDPRRS": "0.13",
+ "RTRDPECRS": "0.25",
+ "RTRDPNS": "1.01",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "Aug": {
+ "sourceSheet": "Aug",
+ "deliveryDate": "2026-08-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "2.45",
+ "RTRDPRU": "1.21",
+ "RTRDPRD": "0.16",
+ "RTRDPRRS": "0.23",
+ "RTRDPECRS": "0.27",
+ "RTRDPNS": "1.79",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ },
+ "Sep": {
+ "sourceSheet": "Sep",
+ "deliveryDate": "2026-09-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": "2.74",
+ "RTRDPRU": "2.05",
+ "RTRDPRD": "0.52",
+ "RTRDPRRS": "0.32",
+ "RTRDPECRS": "0.64",
+ "RTRDPNS": "2.45",
+ "RTRSVPOR": null,
+ "RTRSVPOFF": null,
+ "RTRDP": null
+ }
+ }
+ },
+ {
+ "endpoint": "np6-793-er/price_adders",
+ "fixture": "np6-793-er-history-samples.xlsx",
+ "file": "rpt.00013240.0000000000000000.20180101.100002.RTM_ORDC_REL_DPLY_PRC_15MINT_2017.xlsx",
+ "sheet_rows": {
+ "Jan": 2976,
+ "Feb": 2688,
+ "Mar": 2972,
+ "Apr": 2880,
+ "May": 2976,
+ "Jun": 2880,
+ "Jul": 2976,
+ "Aug": 2976,
+ "Sep": 2880,
+ "Oct": 2976,
+ "Nov": 2884,
+ "Dec": 2976
+ },
+ "source_folder": "history-samples",
+ "rows_decoded": 35040,
+ "first_rows": {
+ "Jan": {
+ "sourceSheet": "Jan",
+ "deliveryDate": "2017-01-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0.31",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Feb": {
+ "sourceSheet": "Feb",
+ "deliveryDate": "2017-02-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Mar": {
+ "sourceSheet": "Mar",
+ "deliveryDate": "2017-03-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Apr": {
+ "sourceSheet": "Apr",
+ "deliveryDate": "2017-04-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "May": {
+ "sourceSheet": "May",
+ "deliveryDate": "2017-05-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Jun": {
+ "sourceSheet": "Jun",
+ "deliveryDate": "2017-06-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Jul": {
+ "sourceSheet": "Jul",
+ "deliveryDate": "2017-07-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Aug": {
+ "sourceSheet": "Aug",
+ "deliveryDate": "2017-08-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Sep": {
+ "sourceSheet": "Sep",
+ "deliveryDate": "2017-09-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Oct": {
+ "sourceSheet": "Oct",
+ "deliveryDate": "2017-10-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Nov": {
+ "sourceSheet": "Nov",
+ "deliveryDate": "2017-11-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ },
+ "Dec": {
+ "sourceSheet": "Dec",
+ "deliveryDate": "2017-12-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "repeatHourFlag": false,
+ "RTRDPA": null,
+ "RTRDPRU": null,
+ "RTRDPRD": null,
+ "RTRDPRRS": null,
+ "RTRDPECRS": null,
+ "RTRDPNS": null,
+ "RTRSVPOR": "0",
+ "RTRSVPOFF": "0",
+ "RTRDP": "0"
+ }
+ }
+ }
+]
diff --git a/tools/inputs/history/regional-evidence.json b/tools/inputs/history/regional-evidence.json
new file mode 100644
index 00000000..ec186eaf
--- /dev/null
+++ b/tools/inputs/history/regional-evidence.json
@@ -0,0 +1,134 @@
+[
+ {
+ "endpoint": "np4-442-cd/hrly_sys_reg_wind_fcast_model",
+ "fixture": "np4-442-cd-history-current.csv",
+ "file": "cdr.00019385.0000000000000000.20260907.115500.HrlySysWideRegWindForecastsModelNP4442.csv",
+ "csv_rows": 11016,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 12,
+ "region": "SYSTEM_TOTAL",
+ "value": "2661.1",
+ "model": "S",
+ "inUseFlag": true,
+ "DSTFlag": false
+ },
+ "rows_decoded": 11016
+ },
+ {
+ "endpoint": "np4-442-cd/hrly_sys_reg_wind_fcast_model",
+ "fixture": "np4-442-cd-history-samples.csv",
+ "file": "cdr.00019385.0000000000000000.20200806.165536.HRLYSTWPFWGRPPFCSTMODLNP4442.csv",
+ "csv_rows": 8856,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2020-08-04",
+ "hourEnding": 17,
+ "region": "SYSTEM_TOTAL",
+ "value": "3642.6999969482422",
+ "model": "S",
+ "inUseFlag": true,
+ "DSTFlag": false
+ },
+ "rows_decoded": 8856
+ },
+ {
+ "endpoint": "np4-443-cd/hrly_sys_reg_solar_fcast_model",
+ "fixture": "np4-443-cd-history-current.csv",
+ "file": "cdr.00021811.0000000000000000.20260907.115500.HRLYSTPPFPVGRPPFCSTMODLNP4443.csv",
+ "csv_rows": 13176,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 12,
+ "region": "CENTEREAST",
+ "value": "3940.5",
+ "model": "PVGRPP1",
+ "inUseFlag": false,
+ "DSTFlag": false
+ },
+ "rows_decoded": 13176
+ },
+ {
+ "endpoint": "np4-443-cd/hrly_sys_reg_solar_fcast_model",
+ "fixture": "np4-443-cd-history-samples.csv",
+ "file": "cdr.00021811.0000000000000000.20260326.115500.HRLYSTPPFPVGRPPFCSTMODLNP4443.csv",
+ "csv_rows": 13176,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-03-24",
+ "hourEnding": 12,
+ "region": "CENTEREAST",
+ "value": "3378.1",
+ "model": "PVGRPP1",
+ "inUseFlag": false,
+ "DSTFlag": false
+ },
+ "rows_decoded": 13176
+ },
+ {
+ "endpoint": "np4-751-cd/ih_wind_fcast_geo",
+ "fixture": "np4-751-cd-history-current.csv",
+ "file": "cdr.00016554.0000000000000000.20260907.124200.INTRAHRWINDFCASTNP4751.csv",
+ "csv_rows": 384,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-09-07T12:45:00",
+ "region": "COASTAL",
+ "value": "536.7",
+ "model": "A",
+ "inUseFlag": true,
+ "DSTFlag": false
+ },
+ "rows_decoded": 384
+ },
+ {
+ "endpoint": "np4-751-cd/ih_wind_fcast_geo",
+ "fixture": "np4-751-cd-history-samples.csv",
+ "file": "cdr.00016554.0000000000000000.20260326.114200.INTRAHRWINDFCASTNP4751.csv",
+ "csv_rows": 384,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-03-26T11:45:00",
+ "region": "COASTAL",
+ "value": "2615.1",
+ "model": "A",
+ "inUseFlag": true,
+ "DSTFlag": false
+ },
+ "rows_decoded": 384
+ },
+ {
+ "endpoint": "np4-752-cd/ih_solar_fcast_geo",
+ "fixture": "np4-752-cd-history-current.csv",
+ "file": "cdr.00021812.0000000000000000.20260907.124200.INTRAHRSOLARFCASTNP4752.csv",
+ "csv_rows": 456,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-09-07T12:45:00",
+ "region": "CENTEREAST",
+ "value": "4616.9",
+ "model": "A",
+ "inUseFlag": false,
+ "DSTFlag": false
+ },
+ "rows_decoded": 456
+ },
+ {
+ "endpoint": "np4-752-cd/ih_solar_fcast_geo",
+ "fixture": "np4-752-cd-history-samples.csv",
+ "file": "cdr.00021812.0000000000000000.20260326.114200.INTRAHRSOLARFCASTNP4752.csv",
+ "csv_rows": 456,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-03-26T11:45:00",
+ "region": "CENTEREAST",
+ "value": "4494.1",
+ "model": "A",
+ "inUseFlag": false,
+ "DSTFlag": false
+ },
+ "rows_decoded": 456
+ }
+]
diff --git a/tools/inputs/history/renewables-evidence.json b/tools/inputs/history/renewables-evidence.json
new file mode 100644
index 00000000..85758000
--- /dev/null
+++ b/tools/inputs/history/renewables-evidence.json
@@ -0,0 +1,368 @@
+[
+ {
+ "endpoint": "np4-733-cd/wpp_actual_5min_avg_values",
+ "fixture": "np4-733-cd-history-current.csv",
+ "file": "cdr.00013071.0000000000000000.20260907.121027.WPP5MINAVGACTNP4733.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-09-07T11:10:00",
+ "genSystemWide": "2813.42",
+ "LZSouthHouston": "1156.55",
+ "LZWest": "1600.67",
+ "LZNorth": "56.21",
+ "HSLSystemWide": "3146.3",
+ "DSTFlag": false,
+ "LZWestNorth": null
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np4-733-cd/wpp_actual_5min_avg_values",
+ "fixture": "np4-733-cd-history-samples.csv",
+ "file": "cdr.00013071.0000000000000000.20140501.000053.WPP5MINAVGACTNP4733.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2014-04-30T23:00:00",
+ "genSystemWide": "1138.27",
+ "LZSouthHouston": "493.14",
+ "LZWest": null,
+ "LZNorth": null,
+ "HSLSystemWide": null,
+ "DSTFlag": false,
+ "LZWestNorth": "645.12"
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "fixture": "np4-737-cd-history-current.csv",
+ "file": "cdr.00013483.0000000000000000.20260907.115512.PVGRHRLYAVGACTNP4737.csv",
+ "csv_rows": 216,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 12,
+ "genSystemWide": "30281.46",
+ "COPHSLSystemWide": "31037",
+ "STPPFSystemWide": "29787.6",
+ "PVGRPPSystemWide": "28375",
+ "HSLSystemWide": "30623.38",
+ "DSTFlag": false,
+ "hourEndingTimestamp": null
+ },
+ "rows_decoded": 216
+ },
+ {
+ "endpoint": "np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "fixture": "np4-737-cd-history-samples.csv",
+ "file": "cdr.00013483.0000000000000000.20160210.003110.PVGRHRLYAVGACTNP4737.csv",
+ "csv_rows": 216,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": null,
+ "hourEnding": null,
+ "genSystemWide": "0",
+ "COPHSLSystemWide": "29.4",
+ "STPPFSystemWide": "0",
+ "PVGRPPSystemWide": "0",
+ "HSLSystemWide": null,
+ "DSTFlag": false,
+ "hourEndingTimestamp": "2016-02-08T00:00:00"
+ },
+ "rows_decoded": 216
+ },
+ {
+ "endpoint": "np4-738-cd/spp_actual_5min_avg_values",
+ "fixture": "np4-738-cd-history-current.csv",
+ "file": "cdr.00013484.0000000000000000.20260907.121007.PVGR5MINAVGACTNP4738.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-09-07T11:10:00",
+ "genSystemWide": "32404.92",
+ "HSLSystemWide": "32603.65",
+ "DSTFlag": false
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np4-738-cd/spp_actual_5min_avg_values",
+ "fixture": "np4-738-cd-history-samples.csv",
+ "file": "cdr.00013484.0000000000000000.20160210.000006.PVGR5MINAVGACTNP4738.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2016-02-09T23:00:00",
+ "genSystemWide": "0",
+ "HSLSystemWide": null,
+ "DSTFlag": false
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np4-742-cd/wpp_hrly_actual_fcast_geo",
+ "fixture": "np4-742-cd-history-current.csv",
+ "file": "cdr.00014787.0000000000000000.20260907.115512.WPPHRLYAVGACTGEONP4742.csv",
+ "csv_rows": 216,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 12,
+ "genSystemWide": "3000.43",
+ "COPHSLSystemWide": "3460.5",
+ "STWPFSystemWide": "2661.1",
+ "WGRPPSystemWide": "2661.1",
+ "genPanhandle": "652",
+ "COPHSLPanhandle": "695.9",
+ "STWPFPanhandle": "659.4",
+ "WGRPPPanhandle": "659.4",
+ "genCoastal": "662.57",
+ "COPHSLCoastal": "590.5",
+ "STWPFCoastal": "620.9",
+ "WGRPPCoastal": "620.9",
+ "genSouth": "697.69",
+ "COPHSLSouth": "646.6",
+ "STWPFSouth": "660.5",
+ "WGRPPSouth": "660.5",
+ "genWest": "927.09",
+ "COPHSLWest": "1472.9",
+ "STWPFWest": "703.8",
+ "WGRPPWest": "703.8",
+ "genNorth": "61.08",
+ "COPHSLNorth": "54.6",
+ "STWPFNorth": "16.5",
+ "WGRPPNorth": "16.5",
+ "HSLSystemWide": "3405.97",
+ "DSTFlag": false
+ },
+ "rows_decoded": 216
+ },
+ {
+ "endpoint": "np4-742-cd/wpp_hrly_actual_fcast_geo",
+ "fixture": "np4-742-cd-history-samples.csv",
+ "file": "cdr.00014787.0000000000000000.20170511.153109.WPPHRLYAVGACTGEONP4742.csv",
+ "csv_rows": 216,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2017-05-09",
+ "hourEnding": 16,
+ "genSystemWide": "11030.67",
+ "COPHSLSystemWide": "10662.3",
+ "STWPFSystemWide": "10985.1",
+ "WGRPPSystemWide": "9430.8",
+ "genPanhandle": "2271.84",
+ "COPHSLPanhandle": "2296",
+ "STWPFPanhandle": "2382.8",
+ "WGRPPPanhandle": "2039.6",
+ "genCoastal": "1992.77",
+ "COPHSLCoastal": "1857.6",
+ "STWPFCoastal": "1970.4",
+ "WGRPPCoastal": "1795.3",
+ "genSouth": "1792.79",
+ "COPHSLSouth": "1752.9",
+ "STWPFSouth": "1826.1",
+ "WGRPPSouth": "1625.8",
+ "genWest": "4640.31",
+ "COPHSLWest": "4316.2",
+ "STWPFWest": "4433.7",
+ "WGRPPWest": "3682.1",
+ "genNorth": "332.96",
+ "COPHSLNorth": "439.6",
+ "STWPFNorth": "372.1",
+ "WGRPPNorth": "288",
+ "HSLSystemWide": null,
+ "DSTFlag": false
+ },
+ "rows_decoded": 216
+ },
+ {
+ "endpoint": "np4-743-cd/wpp_actual_5min_avg_values_geo",
+ "fixture": "np4-743-cd-history-current.csv",
+ "file": "cdr.00014788.0000000000000000.20260907.121027.WPP5MINAVGACTGEONP4743.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-09-07T11:10:00",
+ "genSystemWide": "2813.42",
+ "panhandle": "644.5",
+ "coastal": "439.77",
+ "south": "675.7",
+ "west": "1000.34",
+ "north": "53.11",
+ "HSLSystemWide": "3146.3",
+ "DSTFlag": false
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np4-743-cd/wpp_actual_5min_avg_values_geo",
+ "fixture": "np4-743-cd-history-samples.csv",
+ "file": "cdr.00014788.0000000000000000.20170511.145532.WPP5MINAVGACTGEONP4743.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2017-05-11T13:55:00",
+ "genSystemWide": "7593.69",
+ "panhandle": "2993.34",
+ "coastal": "1591.15",
+ "south": "225.51",
+ "west": "2682.19",
+ "north": "101.51",
+ "HSLSystemWide": null,
+ "DSTFlag": false
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np4-745-cd/spp_hrly_actual_fcast_geo",
+ "fixture": "np4-745-cd-history-current.csv",
+ "file": "cdr.00021809.0000000000000000.20260907.115511.PVGRHRLYAVGACTGEONP4745.csv",
+ "csv_rows": 216,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 12,
+ "genSystemWide": "30281.47",
+ "COPHSLSystemWide": "31037",
+ "STPPFSystemWide": "29787.6",
+ "PVGRPPSystemWide": "28375",
+ "genCenterWest": "4566.3",
+ "COPHSLCenterWest": "4474.6",
+ "STPPFCenterWest": "4506.3",
+ "PVGRPPCenterWest": "4255.9",
+ "genNorthWest": "2379.05",
+ "COPHSLNorthWest": "2346.2",
+ "STPPFNorthWest": "2369.8",
+ "PVGRPPNorthWest": "2313.1",
+ "genFarWest": "5302.6",
+ "COPHSLFarWest": "5140.8",
+ "STPPFFarWest": "5188.7",
+ "PVGRPPFarWest": "4981.4",
+ "genFarEast": "11275.85",
+ "COPHSLFarEast": "12071",
+ "STPPFFarEast": "11384.6",
+ "PVGRPPFarEast": "10791.5",
+ "genSouthEast": "2432.33",
+ "COPHSLSouthEast": "2429.8",
+ "STPPFSouthEast": "2215.9",
+ "PVGRPPSouthEast": "2092.6",
+ "genCenterEast": "4325.34",
+ "COPHSLCenterEast": "4574.6",
+ "STPPFCenterEast": "4122.3",
+ "PVGRPPCenterEast": "3940.5",
+ "HSLSystemWide": "30623.38",
+ "DSTFlag": false
+ },
+ "rows_decoded": 216
+ },
+ {
+ "endpoint": "np4-745-cd/spp_hrly_actual_fcast_geo",
+ "fixture": "np4-745-cd-history-samples.csv",
+ "file": "cdr.00021809.0000000000000000.20220630.165528.PVGRHRLYAVGACTGEONP4745.csv",
+ "csv_rows": 74,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2022-06-28",
+ "hourEnding": 17,
+ "genSystemWide": "7622.22",
+ "COPHSLSystemWide": "6428.5",
+ "STPPFSystemWide": "6533",
+ "PVGRPPSystemWide": "5104",
+ "genCenterWest": "1590.59",
+ "COPHSLCenterWest": "1160.1",
+ "STPPFCenterWest": "1213.4",
+ "PVGRPPCenterWest": "877.1",
+ "genNorthWest": "312.51",
+ "COPHSLNorthWest": "260.3",
+ "STPPFNorthWest": "312.4",
+ "PVGRPPNorthWest": "262.3",
+ "genFarWest": "3078.23",
+ "COPHSLFarWest": "2755.5",
+ "STPPFFarWest": "2775",
+ "PVGRPPFarWest": "2194.2",
+ "genFarEast": "1907.22",
+ "COPHSLFarEast": "1442.2",
+ "STPPFFarEast": "1543.9",
+ "PVGRPPFarEast": "1275.4",
+ "genSouthEast": "339.6",
+ "COPHSLSouthEast": "383.6",
+ "STPPFSouthEast": "397.6",
+ "PVGRPPSouthEast": "298.2",
+ "genCenterEast": "394.07",
+ "COPHSLCenterEast": "426.8",
+ "STPPFCenterEast": "290.7",
+ "PVGRPPCenterEast": "196.8",
+ "HSLSystemWide": null,
+ "DSTFlag": false
+ },
+ "rows_decoded": 74
+ },
+ {
+ "endpoint": "np4-746-cd/spp_actual_5min_avg_values_geo",
+ "fixture": "np4-746-cd-history-current.csv",
+ "file": "cdr.00021810.0000000000000000.20260907.121011.PVGR5MINAVGACTGEONP4746.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2026-09-07T11:10:30",
+ "genSystemWide": "32404.92",
+ "genCenterWest": "4545.62",
+ "genNorthWest": "2363.6",
+ "genFarWest": "5310.11",
+ "genFarEast": "12736.52",
+ "genSouthEast": "3025.47",
+ "genCenterEast": "4423.61",
+ "HSLSystemWide": "32603.65",
+ "DSTFlag": false
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np4-746-cd/spp_actual_5min_avg_values_geo",
+ "fixture": "np4-746-cd-history-samples.csv",
+ "file": "cdr.00021810.0000000000000000.20220630.164527.PVGR5MINAVGACTGEONP4746.csv",
+ "csv_rows": 12,
+ "first_row": {
+ "postedDatetime": null,
+ "intervalEnding": "2022-06-30T15:45:15",
+ "genSystemWide": "8109.4",
+ "genCenterWest": "1600.07",
+ "genNorthWest": "368.84",
+ "genFarWest": "3369.92",
+ "genFarEast": "1764.36",
+ "genSouthEast": "478.21",
+ "genCenterEast": "527.99",
+ "HSLSystemWide": null,
+ "DSTFlag": false
+ },
+ "rows_decoded": 12
+ },
+ {
+ "endpoint": "np6-235-cd/system_wide_demand",
+ "fixture": "np6-235-cd-history-current.csv",
+ "file": "cdr.00012340.0000000000000000.20260907.120500.SYSWIDEDEMANDNP6235.csv",
+ "csv_rows": 4,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-07",
+ "demand": "72732.1484",
+ "timeEnding": "11:15"
+ },
+ "rows_decoded": 4
+ },
+ {
+ "endpoint": "np6-235-cd/system_wide_demand",
+ "fixture": "np6-235-cd-history-samples.csv",
+ "file": "cdr.00012340.0000000000000000.20260326.150500.SYSWIDEDEMANDNP6235.csv",
+ "csv_rows": 4,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-03-26",
+ "demand": "60416.8893",
+ "timeEnding": "14:15"
+ },
+ "rows_decoded": 4
+ }
+]
diff --git a/tools/inputs/history/sced-curves-evidence.json b/tools/inputs/history/sced-curves-evidence.json
new file mode 100644
index 00000000..5b3fcfbe
--- /dev/null
+++ b/tools/inputs/history/sced-curves-evidence.json
@@ -0,0 +1,640 @@
+[
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_pvgr_houston",
+ "fixture": "np3-908-er--2d_agg_esc_pvgr_houston-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_PVGR_Houston-28-AUG-26.csv",
+ "csv_rows": 15456,
+ "first_row": {
+ "MW": "0",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -50,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 15456
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_pvgr_north",
+ "fixture": "np3-908-er--2d_agg_esc_pvgr_north-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_PVGR_North-28-AUG-26.csv",
+ "csv_rows": 131508,
+ "first_row": {
+ "MW": "0.01213621",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -50,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 131508
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_pvgr_south",
+ "fixture": "np3-908-er--2d_agg_esc_pvgr_south-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_PVGR_South-28-AUG-26.csv",
+ "csv_rows": 260047,
+ "first_row": {
+ "MW": "0",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -50,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 260047
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_pvgr_west",
+ "fixture": "np3-908-er--2d_agg_esc_pvgr_west-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_PVGR_West-28-AUG-26.csv",
+ "csv_rows": 341954,
+ "first_row": {
+ "MW": "0.01976167",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -50,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 341954
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_pvgr",
+ "fixture": "np3-908-er--2d_agg_esc_pvgr-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_PVGR-28-AUG-26.csv",
+ "csv_rows": 408378,
+ "first_row": {
+ "MW": "0.03189789",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -50,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 408378
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_edc_clr_houston",
+ "fixture": "np3-908-er--2d_agg_edc_clr_houston-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_CLR_Houston-28-AUG-26.csv",
+ "csv_rows": 1514895,
+ "first_row": {
+ "MW": "76",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1514895
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_edc_clr_north",
+ "fixture": "np3-908-er--2d_agg_edc_clr_north-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_CLR_North-28-AUG-26.csv",
+ "csv_rows": 1524845,
+ "first_row": {
+ "MW": "45.1",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1524845
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_esr",
+ "fixture": "np3-908-er--2d_agg_esc_esr-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_ESR-28-AUG-26.csv",
+ "csv_rows": 664045,
+ "first_row": {
+ "MW": "-17277.7348487",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 664045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_esr_houston",
+ "fixture": "np3-908-er--2d_agg_esc_esr_houston-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_ESR_Houston-28-AUG-26.csv",
+ "csv_rows": 664045,
+ "first_row": {
+ "MW": "-4089.48405957",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 664045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_esr_north",
+ "fixture": "np3-908-er--2d_agg_esc_esr_north-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_ESR_North-28-AUG-26.csv",
+ "csv_rows": 664045,
+ "first_row": {
+ "MW": "-5202.74882505",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 664045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_esr_south",
+ "fixture": "np3-908-er--2d_agg_esc_esr_south-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_ESR_South-28-AUG-26.csv",
+ "csv_rows": 664045,
+ "first_row": {
+ "MW": "-3852.20493744",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 664045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_esr_west",
+ "fixture": "np3-908-er--2d_agg_esc_esr_west-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_ESR_West-28-AUG-26.csv",
+ "csv_rows": 664045,
+ "first_row": {
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "repeatHourFlag": false,
+ "price": -250,
+ "MW": "-4133.29702663"
+ },
+ "rows_decoded": 664045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_edc_clr_south",
+ "fixture": "np3-908-er--2d_agg_edc_clr_south-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_CLR_South-28-AUG-26.csv",
+ "csv_rows": 1540778,
+ "first_row": {
+ "MW": "151.2",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1540778
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_edc_clr_west",
+ "fixture": "np3-908-er--2d_agg_edc_clr_west-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_CLR_West-28-AUG-26.csv",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind",
+ "fixture": "np3-908-er--2d_agg_esc_wind-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Wind-28-AUG-26.csv",
+ "csv_rows": 95350,
+ "first_row": {
+ "MW": "598.91592979",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -100,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 95350
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_nonirr",
+ "fixture": "np3-908-er--2d_agg_esc_nonirr-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Non_IRR-28-AUG-26.csv",
+ "csv_rows": 685045,
+ "first_row": {
+ "MW": "1451.40000152",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 685045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_nonirr_houston",
+ "fixture": "np3-908-er--2d_agg_esc_nonirr_houston-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Non_IRR_Houston-28-AUG-26.csv",
+ "csv_rows": 605045,
+ "first_row": {
+ "MW": "2033.07033121",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -50,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 605045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_nonirr_north",
+ "fixture": "np3-908-er--2d_agg_esc_nonirr_north-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Non_IRR_North-28-AUG-26.csv",
+ "csv_rows": 664045,
+ "first_row": {
+ "MW": "466",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 664045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_nonirr_south",
+ "fixture": "np3-908-er--2d_agg_esc_nonirr_south-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Non_IRR_South-28-AUG-26.csv",
+ "csv_rows": 685045,
+ "first_row": {
+ "MW": "985.40000152",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 685045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_nonirr_west",
+ "fixture": "np3-908-er--2d_agg_esc_nonirr_west-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Non_IRR_West-28-AUG-26.csv",
+ "csv_rows": 605045,
+ "first_row": {
+ "MW": "0.44039061",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -50,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 605045
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_houston",
+ "fixture": "np3-908-er--2d_agg_esc_wind_houston-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Wind_Houston-28-AUG-26.csv",
+ "csv_rows": 17110,
+ "first_row": {
+ "MW": "0",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -100,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 17110
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_north",
+ "fixture": "np3-908-er--2d_agg_esc_wind_north-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Wind_North-28-AUG-26.csv",
+ "csv_rows": 29522,
+ "first_row": {
+ "MW": "48.5",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -100,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 29522
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_south",
+ "fixture": "np3-908-er--2d_agg_esc_wind_south-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Wind_South-28-AUG-26.csv",
+ "csv_rows": 88551,
+ "first_row": {
+ "MW": "256.24688529",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -100,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 88551
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_west",
+ "fixture": "np3-908-er--2d_agg_esc_wind_west-history-current.csv",
+ "file": "2d_Agg_Supply_Curves_Wind_West-28-AUG-26.csv",
+ "csv_rows": 95350,
+ "first_row": {
+ "MW": "294.16904449",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -100,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 95350
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_edc_clr",
+ "fixture": "np3-908-er--2d_agg_edc_clr-history-current.csv",
+ "file": "2d_Agg_Energy_Demand_Curves_CLR-28-AUG-26.csv",
+ "csv_rows": 1548795,
+ "first_row": {
+ "MW": "272.3",
+ "SCEDTimestamp": "2026-08-26T00:00:29",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 1548795
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_min_esc_west",
+ "fixture": "np3-908-er--2d_agg_dam_min_esc_west-history-samples.csv",
+ "file": "48h_Agg_Min_Energy_Supply_Curves_West-12-MAR-14.csv",
+ "csv_rows": 124,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "41.15",
+ "MW": "161"
+ },
+ "rows_decoded": 124
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_min_esc_south",
+ "fixture": "np3-908-er--2d_agg_dam_min_esc_south-history-samples.csv",
+ "file": "48h_Agg_Min_Energy_Supply_Curves_South-12-MAR-14.csv",
+ "csv_rows": 721,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "5",
+ "MW": "30"
+ },
+ "rows_decoded": 721
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_min_esc_north",
+ "fixture": "np3-908-er--2d_agg_dam_min_esc_north-history-samples.csv",
+ "file": "48h_Agg_Min_Energy_Supply_Curves_North-12-MAR-14.csv",
+ "csv_rows": 494,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "0",
+ "MW": "609"
+ },
+ "rows_decoded": 494
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_min_esc_houston",
+ "fixture": "np3-908-er--2d_agg_dam_min_esc_houston-history-samples.csv",
+ "file": "48h_Agg_Min_Energy_Supply_Curves_Houston-12-MAR-14.csv",
+ "csv_rows": 278,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "1",
+ "MW": "90"
+ },
+ "rows_decoded": 278
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_min_esc",
+ "fixture": "np3-908-er--2d_agg_dam_min_esc-history-samples.csv",
+ "file": "48h_Agg_Min_Energy_Supply_Curves-12-MAR-14.csv",
+ "csv_rows": 1583,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "0",
+ "MW": "609"
+ },
+ "rows_decoded": 1583
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_non_wind",
+ "fixture": "np3-908-er--2d_agg_esc_non_wind-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Non_Wind-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "repeatHourFlag": false,
+ "price": "-250",
+ "MW": "655.49999845"
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind",
+ "fixture": "np3-908-er--2d_agg_esc_wind-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Wind-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "MW": "0",
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_esc",
+ "fixture": "np3-908-er--2d_agg_dam_esc-history-samples.csv",
+ "file": "48h_Agg_Energy_Supply_Curves-12-MAR-14.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-250",
+ "MW": "143"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_west",
+ "fixture": "np3-908-er--2d_agg_esc_wind_west-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Wind_West-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "MW": "0",
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_south",
+ "fixture": "np3-908-er--2d_agg_esc_wind_south-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Wind_South-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "MW": "0",
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_north",
+ "fixture": "np3-908-er--2d_agg_esc_wind_north-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Wind_North-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "MW": "0",
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "price": -250,
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_wind_houston",
+ "fixture": "np3-908-er--2d_agg_esc_wind_houston-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Wind_Houston-12-MAR-14.csv",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_non_wind_west",
+ "fixture": "np3-908-er--2d_agg_esc_non_wind_west-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Non_Wind_West-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "repeatHourFlag": false,
+ "price": "-250",
+ "MW": "0"
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_non_wind_south",
+ "fixture": "np3-908-er--2d_agg_esc_non_wind_south-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Non_Wind_South-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "repeatHourFlag": false,
+ "price": "-250",
+ "MW": "254.59999847"
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_non_wind_north",
+ "fixture": "np3-908-er--2d_agg_esc_non_wind_north-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Non_Wind_North-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "repeatHourFlag": false,
+ "price": "-250",
+ "MW": "400.89999997"
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_esc_non_wind_houston",
+ "fixture": "np3-908-er--2d_agg_esc_non_wind_houston-history-samples.csv",
+ "file": "48h_Agg_Supply_Curves_Non_Wind_Houston-12-MAR-14.csv",
+ "csv_rows": 504096,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-10T00:00:13",
+ "repeatHourFlag": false,
+ "price": "-250",
+ "MW": "0"
+ },
+ "rows_decoded": 504096
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_esc_west",
+ "fixture": "np3-908-er--2d_agg_dam_esc_west-history-samples.csv",
+ "file": "48h_Agg_Energy_Supply_Curves_West-12-MAR-14.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-250",
+ "MW": "10"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_esc_south",
+ "fixture": "np3-908-er--2d_agg_dam_esc_south-history-samples.csv",
+ "file": "48h_Agg_Energy_Supply_Curves_South-12-MAR-14.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-250",
+ "MW": "15"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_esc_north",
+ "fixture": "np3-908-er--2d_agg_dam_esc_north-history-samples.csv",
+ "file": "48h_Agg_Energy_Supply_Curves_North-12-MAR-14.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-250",
+ "MW": "78"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_esc_houston",
+ "fixture": "np3-908-er--2d_agg_dam_esc_houston-history-samples.csv",
+ "file": "48h_Agg_Energy_Supply_Curves_Houston-12-MAR-14.csv",
+ "csv_rows": 126024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-250",
+ "MW": "40"
+ },
+ "rows_decoded": 126024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_edc_west",
+ "fixture": "np3-908-er--2d_agg_dam_edc_west-history-samples.csv",
+ "file": "48h_Agg_Energy_Demand_Curves_West-12-MAR-14.csv",
+ "csv_rows": 288024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-2001",
+ "MW": "1836.4"
+ },
+ "rows_decoded": 288024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_edc_south",
+ "fixture": "np3-908-er--2d_agg_dam_edc_south-history-samples.csv",
+ "file": "48h_Agg_Energy_Demand_Curves_South-12-MAR-14.csv",
+ "csv_rows": 288024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-2001",
+ "MW": "5661.4"
+ },
+ "rows_decoded": 288024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_edc_north",
+ "fixture": "np3-908-er--2d_agg_dam_edc_north-history-samples.csv",
+ "file": "48h_Agg_Energy_Demand_Curves_North-12-MAR-14.csv",
+ "csv_rows": 288024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-2001",
+ "MW": "6767.4"
+ },
+ "rows_decoded": 288024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_edc_houston",
+ "fixture": "np3-908-er--2d_agg_dam_edc_houston-history-samples.csv",
+ "file": "48h_Agg_Energy_Demand_Curves_Houston-12-MAR-14.csv",
+ "csv_rows": 288024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-2001",
+ "MW": "1257.6"
+ },
+ "rows_decoded": 288024
+ },
+ {
+ "endpoint": "np3-908-er/2d_agg_dam_edc",
+ "fixture": "np3-908-er--2d_agg_dam_edc-history-samples.csv",
+ "file": "48h_Agg_Energy_Demand_Curves-12-MAR-14.csv",
+ "csv_rows": 288024,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "price": "-2001",
+ "MW": "15532.8"
+ },
+ "rows_decoded": 288024
+ }
+]
diff --git a/tools/inputs/history/sced-disclosure-evidence.json b/tools/inputs/history/sced-disclosure-evidence.json
new file mode 100644
index 00000000..afc531ae
--- /dev/null
+++ b/tools/inputs/history/sced-disclosure-evidence.json
@@ -0,0 +1,1105 @@
+[
+ {
+ "endpoint": "np3-965-er/60_sced_qse_self_arranged_as",
+ "fixture": "np3-965-er--60_sced_qse_self_arranged_as-history-current.csv",
+ "file": "60d_SCED_QSE_Self_Arranged_AS-06-SEP-26.csv",
+ "csv_rows": 7488,
+ "first_row": {
+ "SCEDTimestamp": "2026-07-08T00:00:21",
+ "repeatHourFlag": false,
+ "qseName": "QAEN",
+ "REGUP": "13.3",
+ "REGDN": "0",
+ "NSPIN": "61.7",
+ "NSPNM": null,
+ "RRSPFR": "74.5",
+ "RRSFFR": "0",
+ "RRSUFR": "0",
+ "ECRSS": "0",
+ "ECRSM": "0",
+ "RRSGN": null,
+ "RRSLD": null,
+ "RRSNC": null
+ },
+ "rows_decoded": 7488
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_smne_gen_res",
+ "fixture": "np3-965-er--60_sced_smne_gen_res-history-current.csv",
+ "file": "60d_SCED_SMNE_GEN_RES-06-SEP-26.csv",
+ "csv_rows": 155136,
+ "first_row": {
+ "intervalTime": "2026-07-08T00:14:59",
+ "intervalNumber": 1,
+ "resourceCode": "19599_1_PV_A1",
+ "intervalValue": "0"
+ },
+ "rows_decoded": 155136
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_gen_res_data",
+ "fixture": "np3-965-er--60_sced_gen_res_data-history-current.csv",
+ "file": "60d_SCED_Gen_Resource_Data-06-SEP-26.csv",
+ "csv_rows": 325728,
+ "first_row": {
+ "SCEDTimestamp": "2026-07-08T00:00:21",
+ "repeatHourFlag": false,
+ "qseName": "QSUE66",
+ "dmeName": "Y7VSOL",
+ "resourceName": "7RNCHSLR_UNIT1",
+ "resourceType": "PVGR",
+ "SCED1CurveMW1": "0",
+ "SCED1CurvePrice1": "-250",
+ "SCED1CurveMW2": "0",
+ "SCED1CurvePrice2": "-10.0100002288818",
+ "SCED1CurveMW3": "139.199996948242",
+ "SCED1CurvePrice3": "-10",
+ "SCED1CurveMW4": "139.199996948242",
+ "SCED1CurvePrice4": "-10",
+ "SCED1CurveMW5": null,
+ "SCED1CurvePrice5": null,
+ "SCED1CurveMW6": null,
+ "SCED1CurvePrice6": null,
+ "SCED1CurveMW7": null,
+ "SCED1CurvePrice7": null,
+ "SCED1CurveMW8": null,
+ "SCED1CurvePrice8": null,
+ "SCED1CurveMW9": null,
+ "SCED1CurvePrice9": null,
+ "SCED1CurveMW10": null,
+ "SCED1CurvePrice10": null,
+ "SCED1CurveMW11": null,
+ "SCED1CurvePrice11": null,
+ "SCED1CurveMW12": null,
+ "SCED1CurvePrice12": null,
+ "SCED1CurveMW13": null,
+ "SCED1CurvePrice13": null,
+ "SCED1CurveMW14": null,
+ "SCED1CurvePrice14": null,
+ "SCED1CurveMW15": null,
+ "SCED1CurvePrice15": null,
+ "SCED1CurveMW16": null,
+ "SCED1CurvePrice16": null,
+ "SCED1CurveMW17": null,
+ "SCED1CurvePrice17": null,
+ "SCED1CurveMW18": null,
+ "SCED1CurvePrice18": null,
+ "SCED1CurveMW19": null,
+ "SCED1CurvePrice19": null,
+ "SCED1CurveMW20": null,
+ "SCED1CurvePrice20": null,
+ "SCED1CurveMW21": null,
+ "SCED1CurvePrice21": null,
+ "SCED1CurveMW22": null,
+ "SCED1CurvePrice22": null,
+ "SCED1CurveMW23": null,
+ "SCED1CurvePrice23": null,
+ "SCED1CurveMW24": null,
+ "SCED1CurvePrice24": null,
+ "SCED1CurveMW25": null,
+ "SCED1CurvePrice25": null,
+ "SCED1CurveMW26": null,
+ "SCED1CurvePrice26": null,
+ "SCED1CurveMW27": null,
+ "SCED1CurvePrice27": null,
+ "SCED1CurveMW28": null,
+ "SCED1CurvePrice28": null,
+ "SCED1CurveMW29": null,
+ "SCED1CurvePrice29": null,
+ "SCED1CurveMW30": null,
+ "SCED1CurvePrice30": null,
+ "SCED1CurveMW31": null,
+ "SCED1CurvePrice31": null,
+ "SCED1CurveMW32": null,
+ "SCED1CurvePrice32": null,
+ "SCED1CurveMW33": null,
+ "SCED1CurvePrice33": null,
+ "SCED1CurveMW34": null,
+ "SCED1CurvePrice34": null,
+ "SCED1CurveMW35": null,
+ "SCED1CurvePrice35": null,
+ "SCED2CurveMW1": "0",
+ "SCED2CurvePrice1": "-50",
+ "SCED2CurveMW2": "0",
+ "SCED2CurvePrice2": "-50",
+ "SCED2CurveMW3": "0",
+ "SCED2CurvePrice3": "-10.0100002288818",
+ "SCED2CurveMW4": "139.199996948242",
+ "SCED2CurvePrice4": "-10",
+ "SCED2CurveMW5": "139.199996948242",
+ "SCED2CurvePrice5": "-10",
+ "SCED2CurveMW6": null,
+ "SCED2CurvePrice6": null,
+ "SCED2CurveMW7": null,
+ "SCED2CurvePrice7": null,
+ "SCED2CurveMW8": null,
+ "SCED2CurvePrice8": null,
+ "SCED2CurveMW9": null,
+ "SCED2CurvePrice9": null,
+ "SCED2CurveMW10": null,
+ "SCED2CurvePrice10": null,
+ "SCED2CurveMW11": null,
+ "SCED2CurvePrice11": null,
+ "SCED2CurveMW12": null,
+ "SCED2CurvePrice12": null,
+ "SCED2CurveMW13": null,
+ "SCED2CurvePrice13": null,
+ "SCED2CurveMW14": null,
+ "SCED2CurvePrice14": null,
+ "SCED2CurveMW15": null,
+ "SCED2CurvePrice15": null,
+ "SCED2CurveMW16": null,
+ "SCED2CurvePrice16": null,
+ "SCED2CurveMW17": null,
+ "SCED2CurvePrice17": null,
+ "SCED2CurveMW18": null,
+ "SCED2CurvePrice18": null,
+ "SCED2CurveMW19": null,
+ "SCED2CurvePrice19": null,
+ "SCED2CurveMW20": null,
+ "SCED2CurvePrice20": null,
+ "SCED2CurveMW21": null,
+ "SCED2CurvePrice21": null,
+ "SCED2CurveMW22": null,
+ "SCED2CurvePrice22": null,
+ "SCED2CurveMW23": null,
+ "SCED2CurvePrice23": null,
+ "SCED2CurveMW24": null,
+ "SCED2CurvePrice24": null,
+ "SCED2CurveMW25": null,
+ "SCED2CurvePrice25": null,
+ "SCED2CurveMW26": null,
+ "SCED2CurvePrice26": null,
+ "SCED2CurveMW27": null,
+ "SCED2CurvePrice27": null,
+ "SCED2CurveMW28": null,
+ "SCED2CurvePrice28": null,
+ "SCED2CurveMW29": null,
+ "SCED2CurvePrice29": null,
+ "SCED2CurveMW30": null,
+ "SCED2CurvePrice30": null,
+ "SCED2CurveMW31": null,
+ "SCED2CurvePrice31": null,
+ "SCED2CurveMW32": null,
+ "SCED2CurvePrice32": null,
+ "SCED2CurveMW33": null,
+ "SCED2CurvePrice33": null,
+ "SCED2CurveMW34": null,
+ "SCED2CurvePrice34": null,
+ "SCED2CurveMW35": null,
+ "SCED2CurvePrice35": null,
+ "outputSchedule": "0",
+ "HSL": "0",
+ "HDL": "0",
+ "LSL": "0",
+ "LDL": "0",
+ "telemeteredResourceStatus": "ON",
+ "basePoint": "0",
+ "telemeteredNetOutput": "0",
+ "rampRateUp": "27.84",
+ "rampRateDown": "27.84",
+ "ASCapREGUP": "0",
+ "ASCapREGDN": "0",
+ "ASCapECRS": "0",
+ "ASCapNSPIN": "0",
+ "ASCapRRSPFR": "0",
+ "ASCapRRSFFR": "0",
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": null,
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "bidType": "3PT",
+ "startUpColdOffer": null,
+ "startUpHotOffer": null,
+ "startUpInterOffer": null,
+ "minGenCost": null,
+ "submittedTPOMW1": "0",
+ "submittedTPOPrice1": "-10.01",
+ "submittedTPOMW2": "139.2",
+ "submittedTPOPrice2": "-10",
+ "submittedTPOMW3": null,
+ "submittedTPOPrice3": null,
+ "submittedTPOMW4": null,
+ "submittedTPOPrice4": null,
+ "submittedTPOMW5": null,
+ "submittedTPOPrice5": null,
+ "submittedTPOMW6": null,
+ "submittedTPOPrice6": null,
+ "submittedTPOMW7": null,
+ "submittedTPOPrice7": null,
+ "submittedTPOMW8": null,
+ "submittedTPOPrice8": null,
+ "submittedTPOMW9": null,
+ "submittedTPOPrice9": null,
+ "submittedTPOMW10": null,
+ "submittedTPOPrice10": null,
+ "proxyExtension": "No",
+ "HASL": null,
+ "LASL": null,
+ "ASREGUP": null,
+ "ASREGDN": null,
+ "ASRRS": null,
+ "ASRRSFFR": null,
+ "ASNSRS": null,
+ "ASECRS": null
+ },
+ "rows_decoded": 325728
+ },
+ {
+ "endpoint": "np3-965-er/60_load_res_data_in_sced",
+ "fixture": "np3-965-er--60_load_res_data_in_sced-history-current.csv",
+ "file": "60d_Load_Resource_Data_in_SCED-06-SEP-26.csv",
+ "csv_rows": 146304,
+ "first_row": {
+ "SCEDTimestamp": "2026-07-08T00:00:21",
+ "repeatHourFlag": false,
+ "qseName": "QEDE20",
+ "dmeName": null,
+ "resourceName": "AAPIPLNC_LD3",
+ "telResStatus": "ONL",
+ "maxPowerConsumption": "24",
+ "lowPowerConsumption": "0",
+ "realPowerConsumption": "12.8",
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": "12.6",
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "SCEDBidCurveMW1": null,
+ "SCEDBidCurvePrice1": null,
+ "SCEDBidCurveMW2": null,
+ "SCEDBidCurvePrice2": null,
+ "SCEDBidCurveMW3": null,
+ "SCEDBidCurvePrice3": null,
+ "SCEDBidCurveMW4": null,
+ "SCEDBidCurvePrice4": null,
+ "SCEDBidCurveMW5": null,
+ "SCEDBidCurvePrice5": null,
+ "SCEDBidCurveMW6": null,
+ "SCEDBidCurvePrice6": null,
+ "SCEDBidCurveMW7": null,
+ "SCEDBidCurvePrice7": null,
+ "SCEDBidCurveMW8": null,
+ "SCEDBidCurvePrice8": null,
+ "SCEDBidCurveMW9": null,
+ "SCEDBidCurvePrice9": null,
+ "SCEDBidCurveMW10": null,
+ "SCEDBidCurvePrice10": null,
+ "selfRRSFFR": "0",
+ "selfRRSUFR": "12.6",
+ "selfECRS": "0",
+ "rampRateUp": "0",
+ "rampRateDown": "0",
+ "ASCapNSPIN": "0",
+ "ASCapECRS": "0",
+ "ASCapREGUP": "0",
+ "ASCapREGDN": "0",
+ "ASCapRRSPFR": "0",
+ "ASCapRRSFFR": "0",
+ "ASCapRRSUFR": "12.786",
+ "HDL": "12.78600025177",
+ "LDL": "12.78600025177",
+ "basePoint": null,
+ "ASRespForRRS": null,
+ "ASRespForRRSFFR": null,
+ "ASRespForNSPIN": null,
+ "ASRespForREGUP": null,
+ "ASRespForREGDN": null,
+ "HASL": null,
+ "LASL": null,
+ "ASRespForECRS": null,
+ "SCEDBidCurveMW11": null,
+ "SCEDBidCurvePrice11": null,
+ "SCEDBidCurveMW12": null,
+ "SCEDBidCurvePrice12": null,
+ "SCEDBidCurveMW13": null,
+ "SCEDBidCurvePrice13": null,
+ "SCEDBidCurveMW14": null,
+ "SCEDBidCurvePrice14": null,
+ "SCEDBidCurveMW15": null,
+ "SCEDBidCurvePrice15": null,
+ "SCEDBidCurveMW16": null,
+ "SCEDBidCurvePrice16": null,
+ "SCEDBidCurveMW17": null,
+ "SCEDBidCurvePrice17": null,
+ "SCEDBidCurveMW18": null,
+ "SCEDBidCurvePrice18": null,
+ "SCEDBidCurveMW19": null,
+ "SCEDBidCurvePrice19": null,
+ "SCEDBidCurveMW20": null,
+ "SCEDBidCurvePrice20": null,
+ "SCEDBidCurveMW21": null,
+ "SCEDBidCurvePrice21": null,
+ "SCEDBidCurveMW22": null,
+ "SCEDBidCurvePrice22": null,
+ "SCEDBidCurveMW23": null,
+ "SCEDBidCurvePrice23": null,
+ "SCEDBidCurveMW24": null,
+ "SCEDBidCurvePrice24": null,
+ "SCEDBidCurveMW25": null,
+ "SCEDBidCurvePrice25": null,
+ "SCEDBidCurveMW26": null,
+ "SCEDBidCurvePrice26": null,
+ "SCEDBidCurveMW27": null,
+ "SCEDBidCurvePrice27": null,
+ "SCEDBidCurveMW28": null,
+ "SCEDBidCurvePrice28": null,
+ "SCEDBidCurveMW29": null,
+ "SCEDBidCurvePrice29": null,
+ "SCEDBidCurveMW30": null,
+ "SCEDBidCurvePrice30": null,
+ "SCEDBidCurveMW31": null,
+ "SCEDBidCurvePrice31": null,
+ "SCEDBidCurveMW32": null,
+ "SCEDBidCurvePrice32": null,
+ "SCEDBidCurveMW33": null,
+ "SCEDBidCurvePrice33": null,
+ "SCEDBidCurveMW34": null,
+ "SCEDBidCurvePrice34": null,
+ "SCEDBidCurveMW35": null,
+ "SCEDBidCurvePrice35": null
+ },
+ "rows_decoded": 146304
+ },
+ {
+ "endpoint": "np3-965-er/60_hdl_ldl_man_override",
+ "fixture": "np3-965-er--60_hdl_ldl_man_override-history-current.csv",
+ "file": "60d_HDL_LDL_ManOverride-06-SEP-26.csv",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_eoc_updates_in_ophour",
+ "fixture": "np3-965-er--60_sced_eoc_updates_in_ophour-history-current.csv",
+ "file": "60d_SCED_EOC_Updates_in_OpHour-06-SEP-26.csv",
+ "csv_rows": 5583,
+ "first_row": {
+ "deliveryDate": "2026-07-08",
+ "deliveryHour": 8,
+ "resourceName": "ABINDUST_ESR1",
+ "reason": "SOC Management; SOC Management",
+ "opHourUpdates": "2"
+ },
+ "rows_decoded": 5583
+ },
+ {
+ "endpoint": "np3-965-er/60d_sced_as_cap_man_override",
+ "fixture": "np3-965-er--60d_sced_as_cap_man_override-history-current.csv",
+ "file": "60d_AS_Capability_ManOverride-06-SEP-26.csv",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-965-er/60d_sced_esr_data",
+ "fixture": "np3-965-er--60d_sced_esr_data-history-current.csv",
+ "file": "60d_ESR_Data_in_SCED-06-SEP-26.csv",
+ "csv_rows": 96480,
+ "first_row": {
+ "SCEDTimestamp": "2026-07-08T00:00:21",
+ "repeatHourFlag": false,
+ "qseName": "QMP2M1",
+ "dmeName": "YDIST",
+ "resourceName": "ABINDUST_ESR1",
+ "resourceType": "ESR",
+ "SCED1CurveMW1": "-8.5",
+ "SCED1CurvePrice1": "4.19999980926514",
+ "SCED1CurveMW2": "-4.69999980926514",
+ "SCED1CurvePrice2": "7.8899998664856",
+ "SCED1CurveMW3": "-1.5",
+ "SCED1CurvePrice3": "10.8900003433228",
+ "SCED1CurveMW4": "1.60000002384186",
+ "SCED1CurvePrice4": "23.6800003051758",
+ "SCED1CurveMW5": "1.60000002384186",
+ "SCED1CurvePrice5": "56.4599990844727",
+ "SCED1CurveMW6": "3.40000009536743",
+ "SCED1CurvePrice6": "68.5199966430664",
+ "SCED1CurveMW7": "5.30000019073486",
+ "SCED1CurvePrice7": "70.6600036621094",
+ "SCED1CurveMW8": "7.40000009536743",
+ "SCED1CurvePrice8": "73.0100021362305",
+ "SCED1CurveMW9": "9.89999961853027",
+ "SCED1CurvePrice9": "75.9000015258789",
+ "SCED1CurveMW10": null,
+ "SCED1CurvePrice10": null,
+ "SCED1CurveMW11": null,
+ "SCED1CurvePrice11": null,
+ "SCED1CurveMW12": null,
+ "SCED1CurvePrice12": null,
+ "SCED1CurveMW13": null,
+ "SCED1CurvePrice13": null,
+ "SCED1CurveMW14": null,
+ "SCED1CurvePrice14": null,
+ "SCED1CurveMW15": null,
+ "SCED1CurvePrice15": null,
+ "SCED1CurveMW16": null,
+ "SCED1CurvePrice16": null,
+ "SCED1CurveMW17": null,
+ "SCED1CurvePrice17": null,
+ "SCED1CurveMW18": null,
+ "SCED1CurvePrice18": null,
+ "SCED1CurveMW19": null,
+ "SCED1CurvePrice19": null,
+ "SCED1CurveMW20": null,
+ "SCED1CurvePrice20": null,
+ "SCED1CurveMW21": null,
+ "SCED1CurvePrice21": null,
+ "SCED1CurveMW22": null,
+ "SCED1CurvePrice22": null,
+ "SCED1CurveMW23": null,
+ "SCED1CurvePrice23": null,
+ "SCED1CurveMW24": null,
+ "SCED1CurvePrice24": null,
+ "SCED1CurveMW25": null,
+ "SCED1CurvePrice25": null,
+ "SCED1CurveMW26": null,
+ "SCED1CurvePrice26": null,
+ "SCED1CurveMW27": null,
+ "SCED1CurvePrice27": null,
+ "SCED1CurveMW28": null,
+ "SCED1CurvePrice28": null,
+ "SCED1CurveMW29": null,
+ "SCED1CurvePrice29": null,
+ "SCED1CurveMW30": null,
+ "SCED1CurvePrice30": null,
+ "SCED1CurveMW31": null,
+ "SCED1CurvePrice31": null,
+ "SCED1CurveMW32": null,
+ "SCED1CurvePrice32": null,
+ "SCED1CurveMW33": null,
+ "SCED1CurvePrice33": null,
+ "SCED1CurveMW34": null,
+ "SCED1CurvePrice34": null,
+ "SCED1CurveMW35": null,
+ "SCED1CurvePrice35": null,
+ "SCED2CurveMW1": "-8.5",
+ "SCED2CurvePrice1": "4.19999980926514",
+ "SCED2CurveMW2": "-4.69999980926514",
+ "SCED2CurvePrice2": "7.8899998664856",
+ "SCED2CurveMW3": "-1.5",
+ "SCED2CurvePrice3": "10.8900003433228",
+ "SCED2CurveMW4": "1.60000002384186",
+ "SCED2CurvePrice4": "23.6800003051758",
+ "SCED2CurveMW5": "1.60000002384186",
+ "SCED2CurvePrice5": "56.4599990844727",
+ "SCED2CurveMW6": "3.40000009536743",
+ "SCED2CurvePrice6": "68.5199966430664",
+ "SCED2CurveMW7": "5.30000019073486",
+ "SCED2CurvePrice7": "70.6600036621094",
+ "SCED2CurveMW8": "7.40000009536743",
+ "SCED2CurvePrice8": "73.0100021362305",
+ "SCED2CurveMW9": "9.89999961853027",
+ "SCED2CurvePrice9": "75.9000015258789",
+ "SCED2CurveMW10": null,
+ "SCED2CurvePrice10": null,
+ "SCED2CurveMW11": null,
+ "SCED2CurvePrice11": null,
+ "SCED2CurveMW12": null,
+ "SCED2CurvePrice12": null,
+ "SCED2CurveMW13": null,
+ "SCED2CurvePrice13": null,
+ "SCED2CurveMW14": null,
+ "SCED2CurvePrice14": null,
+ "SCED2CurveMW15": null,
+ "SCED2CurvePrice15": null,
+ "SCED2CurveMW16": null,
+ "SCED2CurvePrice16": null,
+ "SCED2CurveMW17": null,
+ "SCED2CurvePrice17": null,
+ "SCED2CurveMW18": null,
+ "SCED2CurvePrice18": null,
+ "SCED2CurveMW19": null,
+ "SCED2CurvePrice19": null,
+ "SCED2CurveMW20": null,
+ "SCED2CurvePrice20": null,
+ "SCED2CurveMW21": null,
+ "SCED2CurvePrice21": null,
+ "SCED2CurveMW22": null,
+ "SCED2CurvePrice22": null,
+ "SCED2CurveMW23": null,
+ "SCED2CurvePrice23": null,
+ "SCED2CurveMW24": null,
+ "SCED2CurvePrice24": null,
+ "SCED2CurveMW25": null,
+ "SCED2CurvePrice25": null,
+ "SCED2CurveMW26": null,
+ "SCED2CurvePrice26": null,
+ "SCED2CurveMW27": null,
+ "SCED2CurvePrice27": null,
+ "SCED2CurveMW28": null,
+ "SCED2CurvePrice28": null,
+ "SCED2CurveMW29": null,
+ "SCED2CurvePrice29": null,
+ "SCED2CurveMW30": null,
+ "SCED2CurvePrice30": null,
+ "SCED2CurveMW31": null,
+ "SCED2CurvePrice31": null,
+ "SCED2CurveMW32": null,
+ "SCED2CurvePrice32": null,
+ "SCED2CurveMW33": null,
+ "SCED2CurvePrice33": null,
+ "SCED2CurveMW34": null,
+ "SCED2CurvePrice34": null,
+ "SCED2CurveMW35": null,
+ "SCED2CurvePrice35": null,
+ "outputSchedule": "0",
+ "HSL": "9.9",
+ "HDL": "9.89999961853027",
+ "LSL": "-8.5",
+ "LDL": "-8.5",
+ "telemeteredResourceStatus": "ON",
+ "basePoint": "1.59999990463257",
+ "telemeteredNetOutput": "1.19753",
+ "rampRateUp": "1.98",
+ "rampRateDown": "1.98",
+ "ASCapREGUP": "1.98",
+ "ASCapREGDN": "1.98",
+ "ASCapECRS": "0.99",
+ "ASCapNSPIN": "0.33",
+ "ASCapRRSPFR": "0",
+ "ASCapRRSFFR": "0",
+ "SOC": "0.244",
+ "minSOC": "0",
+ "maxSOC": "25.9",
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": null,
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "bidType": "3PT",
+ "startUpColdOffer": null,
+ "startUpHotOffer": null,
+ "startUpInterOffer": null,
+ "minGenCost": null,
+ "submittedTPOMW1": "-8.5",
+ "submittedTPOPrice1": "4.2",
+ "submittedTPOMW2": "-4.7",
+ "submittedTPOPrice2": "7.89",
+ "submittedTPOMW3": "-1.5",
+ "submittedTPOPrice3": "10.89",
+ "submittedTPOMW4": "1.6",
+ "submittedTPOPrice4": "23.68",
+ "submittedTPOMW5": "1.6",
+ "submittedTPOPrice5": "56.46",
+ "submittedTPOMW6": "3.4",
+ "submittedTPOPrice6": "68.52",
+ "submittedTPOMW7": "5.3",
+ "submittedTPOPrice7": "70.66",
+ "submittedTPOMW8": "7.4",
+ "submittedTPOPrice8": "73.01",
+ "submittedTPOMW9": "9.9",
+ "submittedTPOPrice9": "75.9",
+ "submittedTPOMW10": null,
+ "submittedTPOPrice10": null,
+ "proxyExtension": "No"
+ },
+ "rows_decoded": 96480
+ },
+ {
+ "endpoint": "np3-965-er/60d_sced_resource_as_offers",
+ "fixture": "np3-965-er--60d_sced_resource_as_offers-history-current.csv",
+ "file": "60d_SCED_Resource_AS_OFFERS-06-SEP-26.csv",
+ "csv_rows": 1559232,
+ "first_row": {
+ "SCEDTimestamp": "2026-07-08T00:00:21",
+ "repeatHourFlag": false,
+ "resourceName": "7RNCHSLR_UNIT1",
+ "price1REGUP": null,
+ "price1REGDN": null,
+ "price1RRSPFR": null,
+ "price1RRSUFR": null,
+ "price1RRSFFR": null,
+ "price1NSPIN": null,
+ "price1ECRS": null,
+ "quantityMW1": "0",
+ "price2REGUP": null,
+ "price2REGDN": null,
+ "price2RRSPFR": null,
+ "price2RRSUFR": null,
+ "price2RRSFFR": null,
+ "price2NSPIN": null,
+ "price2ECRS": null,
+ "quantityMW2": "0",
+ "price3REGUP": null,
+ "price3REGDN": null,
+ "price3RRSPFR": null,
+ "price3RRSUFR": null,
+ "price3RRSFFR": null,
+ "price3NSPIN": null,
+ "price3ECRS": null,
+ "quantityMW3": "0",
+ "price4REGUP": null,
+ "price4REGDN": null,
+ "price4RRSPFR": null,
+ "price4RRSUFR": null,
+ "price4RRSFFR": null,
+ "price4NSPIN": null,
+ "price4ECRS": null,
+ "quantityMW4": "0",
+ "price5REGUP": null,
+ "price5REGDN": null,
+ "price5RRSPFR": null,
+ "price5RRSUFR": null,
+ "price5RRSFFR": null,
+ "price5NSPIN": null,
+ "price5ECRS": null,
+ "quantityMW5": "0",
+ "price6REGUP": null,
+ "price6REGDN": null,
+ "price6RRSPFR": null,
+ "price6RRSUFR": null,
+ "price6RRSFFR": null,
+ "price6NSPIN": null,
+ "price6ECRS": null,
+ "quantityMW6": "0",
+ "offerType": "OFFNS"
+ },
+ "rows_decoded": 1559232
+ },
+ {
+ "endpoint": "np3-965-er/60d_sced_as_offer_updates",
+ "fixture": "np3-965-er--60d_sced_as_offer_updates-history-current.csv",
+ "file": "60d_SCED_AS_Offer_Updates_in_OpPeriod-06-SEP-26.csv",
+ "csv_rows": 7666,
+ "first_row": {
+ "deliveryDate": "2026-07-08",
+ "deliveryHour": 1,
+ "resourceName": "AE_ESR1",
+ "ASType": "ONRES",
+ "opPeriodUpd": "10"
+ },
+ "rows_decoded": 7666
+ },
+ {
+ "endpoint": "np3-965-er/60_load_res_data_in_sced",
+ "fixture": "np3-965-er--60_load_res_data_in_sced-history-samples.csv",
+ "file": "60d_Load Resource_Data_in_SCED-01-MAY-14.csv",
+ "csv_rows": 22752,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-02T00:00:14",
+ "repeatHourFlag": false,
+ "qseName": null,
+ "dmeName": null,
+ "resourceName": "ACRLY_LD1",
+ "telResStatus": "OUTL",
+ "maxPowerConsumption": "0",
+ "lowPowerConsumption": "0",
+ "realPowerConsumption": "0.5",
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": null,
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "SCEDBidCurveMW1": null,
+ "SCEDBidCurvePrice1": null,
+ "SCEDBidCurveMW2": null,
+ "SCEDBidCurvePrice2": null,
+ "SCEDBidCurveMW3": null,
+ "SCEDBidCurvePrice3": null,
+ "SCEDBidCurveMW4": null,
+ "SCEDBidCurvePrice4": null,
+ "SCEDBidCurveMW5": null,
+ "SCEDBidCurvePrice5": null,
+ "SCEDBidCurveMW6": null,
+ "SCEDBidCurvePrice6": null,
+ "SCEDBidCurveMW7": null,
+ "SCEDBidCurvePrice7": null,
+ "SCEDBidCurveMW8": null,
+ "SCEDBidCurvePrice8": null,
+ "SCEDBidCurveMW9": null,
+ "SCEDBidCurvePrice9": null,
+ "SCEDBidCurveMW10": null,
+ "SCEDBidCurvePrice10": null,
+ "selfRRSFFR": null,
+ "selfRRSUFR": null,
+ "selfECRS": null,
+ "rampRateUp": null,
+ "rampRateDown": null,
+ "ASCapNSPIN": null,
+ "ASCapECRS": null,
+ "ASCapREGUP": null,
+ "ASCapREGDN": null,
+ "ASCapRRSPFR": null,
+ "ASCapRRSFFR": null,
+ "ASCapRRSUFR": null,
+ "HDL": null,
+ "LDL": null,
+ "basePoint": null,
+ "ASRespForRRS": "0",
+ "ASRespForRRSFFR": null,
+ "ASRespForNSPIN": "0",
+ "ASRespForREGUP": "0",
+ "ASRespForREGDN": "0",
+ "HASL": null,
+ "LASL": null,
+ "ASRespForECRS": null,
+ "SCEDBidCurveMW11": null,
+ "SCEDBidCurvePrice11": null,
+ "SCEDBidCurveMW12": null,
+ "SCEDBidCurvePrice12": null,
+ "SCEDBidCurveMW13": null,
+ "SCEDBidCurvePrice13": null,
+ "SCEDBidCurveMW14": null,
+ "SCEDBidCurvePrice14": null,
+ "SCEDBidCurveMW15": null,
+ "SCEDBidCurvePrice15": null,
+ "SCEDBidCurveMW16": null,
+ "SCEDBidCurvePrice16": null,
+ "SCEDBidCurveMW17": null,
+ "SCEDBidCurvePrice17": null,
+ "SCEDBidCurveMW18": null,
+ "SCEDBidCurvePrice18": null,
+ "SCEDBidCurveMW19": null,
+ "SCEDBidCurvePrice19": null,
+ "SCEDBidCurveMW20": null,
+ "SCEDBidCurvePrice20": null,
+ "SCEDBidCurveMW21": null,
+ "SCEDBidCurvePrice21": null,
+ "SCEDBidCurveMW22": null,
+ "SCEDBidCurvePrice22": null,
+ "SCEDBidCurveMW23": null,
+ "SCEDBidCurvePrice23": null,
+ "SCEDBidCurveMW24": null,
+ "SCEDBidCurvePrice24": null,
+ "SCEDBidCurveMW25": null,
+ "SCEDBidCurvePrice25": null,
+ "SCEDBidCurveMW26": null,
+ "SCEDBidCurvePrice26": null,
+ "SCEDBidCurveMW27": null,
+ "SCEDBidCurvePrice27": null,
+ "SCEDBidCurveMW28": null,
+ "SCEDBidCurvePrice28": null,
+ "SCEDBidCurveMW29": null,
+ "SCEDBidCurvePrice29": null,
+ "SCEDBidCurveMW30": null,
+ "SCEDBidCurvePrice30": null,
+ "SCEDBidCurveMW31": null,
+ "SCEDBidCurvePrice31": null,
+ "SCEDBidCurveMW32": null,
+ "SCEDBidCurvePrice32": null,
+ "SCEDBidCurveMW33": null,
+ "SCEDBidCurvePrice33": null,
+ "SCEDBidCurveMW34": null,
+ "SCEDBidCurvePrice34": null,
+ "SCEDBidCurveMW35": null,
+ "SCEDBidCurvePrice35": null
+ },
+ "rows_decoded": 22752
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_gen_res_data",
+ "fixture": "np3-965-er--60_sced_gen_res_data-history-samples.csv",
+ "file": "60d_SCED_Gen_Resource_Data-01-MAY-14.csv",
+ "csv_rows": 42048,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-02T00:00:14",
+ "repeatHourFlag": false,
+ "qseName": null,
+ "dmeName": null,
+ "resourceName": "AMISTAD_AMISTAG1",
+ "resourceType": "HYDRO",
+ "SCED1CurveMW1": "0",
+ "SCED1CurvePrice1": "-250",
+ "SCED1CurveMW2": "0.00999999977648258",
+ "SCED1CurvePrice2": "4999.990234375",
+ "SCED1CurveMW3": "28",
+ "SCED1CurvePrice3": "5000",
+ "SCED1CurveMW4": "0",
+ "SCED1CurvePrice4": "0",
+ "SCED1CurveMW5": "0",
+ "SCED1CurvePrice5": "0",
+ "SCED1CurveMW6": "0",
+ "SCED1CurvePrice6": "0",
+ "SCED1CurveMW7": "0",
+ "SCED1CurvePrice7": "0",
+ "SCED1CurveMW8": "0",
+ "SCED1CurvePrice8": "0",
+ "SCED1CurveMW9": "0",
+ "SCED1CurvePrice9": "0",
+ "SCED1CurveMW10": "0",
+ "SCED1CurvePrice10": "0",
+ "SCED1CurveMW11": "0",
+ "SCED1CurvePrice11": "0",
+ "SCED1CurveMW12": "0",
+ "SCED1CurvePrice12": "0",
+ "SCED1CurveMW13": "0",
+ "SCED1CurvePrice13": "0",
+ "SCED1CurveMW14": "0",
+ "SCED1CurvePrice14": "0",
+ "SCED1CurveMW15": "0",
+ "SCED1CurvePrice15": "0",
+ "SCED1CurveMW16": "0",
+ "SCED1CurvePrice16": "0",
+ "SCED1CurveMW17": "0",
+ "SCED1CurvePrice17": "0",
+ "SCED1CurveMW18": "0",
+ "SCED1CurvePrice18": "0",
+ "SCED1CurveMW19": "0",
+ "SCED1CurvePrice19": "0",
+ "SCED1CurveMW20": "0",
+ "SCED1CurvePrice20": "0",
+ "SCED1CurveMW21": "0",
+ "SCED1CurvePrice21": "0",
+ "SCED1CurveMW22": "0",
+ "SCED1CurvePrice22": "0",
+ "SCED1CurveMW23": "0",
+ "SCED1CurvePrice23": "0",
+ "SCED1CurveMW24": "0",
+ "SCED1CurvePrice24": "0",
+ "SCED1CurveMW25": "0",
+ "SCED1CurvePrice25": "0",
+ "SCED1CurveMW26": "0",
+ "SCED1CurvePrice26": "0",
+ "SCED1CurveMW27": "0",
+ "SCED1CurvePrice27": "0",
+ "SCED1CurveMW28": "0",
+ "SCED1CurvePrice28": "0",
+ "SCED1CurveMW29": "0",
+ "SCED1CurvePrice29": "0",
+ "SCED1CurveMW30": "0",
+ "SCED1CurvePrice30": "0",
+ "SCED1CurveMW31": "0",
+ "SCED1CurvePrice31": "0",
+ "SCED1CurveMW32": "0",
+ "SCED1CurvePrice32": "0",
+ "SCED1CurveMW33": "0",
+ "SCED1CurvePrice33": "0",
+ "SCED1CurveMW34": "0",
+ "SCED1CurvePrice34": "0",
+ "SCED1CurveMW35": "0",
+ "SCED1CurvePrice35": "0",
+ "SCED2CurveMW1": "0",
+ "SCED2CurvePrice1": "-250",
+ "SCED2CurveMW2": "0.00999999977648258",
+ "SCED2CurvePrice2": "4999.990234375",
+ "SCED2CurveMW3": "28",
+ "SCED2CurvePrice3": "5000",
+ "SCED2CurveMW4": "0",
+ "SCED2CurvePrice4": "0",
+ "SCED2CurveMW5": "0",
+ "SCED2CurvePrice5": "0",
+ "SCED2CurveMW6": "0",
+ "SCED2CurvePrice6": "0",
+ "SCED2CurveMW7": "0",
+ "SCED2CurvePrice7": "0",
+ "SCED2CurveMW8": "0",
+ "SCED2CurvePrice8": "0",
+ "SCED2CurveMW9": "0",
+ "SCED2CurvePrice9": "0",
+ "SCED2CurveMW10": "0",
+ "SCED2CurvePrice10": "0",
+ "SCED2CurveMW11": "0",
+ "SCED2CurvePrice11": "0",
+ "SCED2CurveMW12": "0",
+ "SCED2CurvePrice12": "0",
+ "SCED2CurveMW13": "0",
+ "SCED2CurvePrice13": "0",
+ "SCED2CurveMW14": "0",
+ "SCED2CurvePrice14": "0",
+ "SCED2CurveMW15": "0",
+ "SCED2CurvePrice15": "0",
+ "SCED2CurveMW16": "0",
+ "SCED2CurvePrice16": "0",
+ "SCED2CurveMW17": "0",
+ "SCED2CurvePrice17": "0",
+ "SCED2CurveMW18": "0",
+ "SCED2CurvePrice18": "0",
+ "SCED2CurveMW19": "0",
+ "SCED2CurvePrice19": "0",
+ "SCED2CurveMW20": "0",
+ "SCED2CurvePrice20": "0",
+ "SCED2CurveMW21": "0",
+ "SCED2CurvePrice21": "0",
+ "SCED2CurveMW22": "0",
+ "SCED2CurvePrice22": "0",
+ "SCED2CurveMW23": "0",
+ "SCED2CurvePrice23": "0",
+ "SCED2CurveMW24": "0",
+ "SCED2CurvePrice24": "0",
+ "SCED2CurveMW25": "0",
+ "SCED2CurvePrice25": "0",
+ "SCED2CurveMW26": "0",
+ "SCED2CurvePrice26": "0",
+ "SCED2CurveMW27": "0",
+ "SCED2CurvePrice27": "0",
+ "SCED2CurveMW28": "0",
+ "SCED2CurvePrice28": "0",
+ "SCED2CurveMW29": "0",
+ "SCED2CurvePrice29": "0",
+ "SCED2CurveMW30": "0",
+ "SCED2CurvePrice30": "0",
+ "SCED2CurveMW31": "0",
+ "SCED2CurvePrice31": "0",
+ "SCED2CurveMW32": "0",
+ "SCED2CurvePrice32": "0",
+ "SCED2CurveMW33": "0",
+ "SCED2CurvePrice33": "0",
+ "SCED2CurveMW34": "0",
+ "SCED2CurvePrice34": "0",
+ "SCED2CurveMW35": "0",
+ "SCED2CurvePrice35": "0",
+ "outputSchedule": "0",
+ "HSL": "28",
+ "HDL": "0",
+ "LSL": "10",
+ "LDL": "0",
+ "telemeteredResourceStatus": "EMR",
+ "basePoint": "0",
+ "telemeteredNetOutput": "0",
+ "rampRateUp": null,
+ "rampRateDown": null,
+ "ASCapREGUP": null,
+ "ASCapREGDN": null,
+ "ASCapECRS": null,
+ "ASCapNSPIN": null,
+ "ASCapRRSPFR": null,
+ "ASCapRRSFFR": null,
+ "ASAwardsNSPIN": null,
+ "ASAwardsRRSFFR": null,
+ "ASAwardsRRSPFR": null,
+ "ASAwardsRRSUFR": null,
+ "ASAwardsECRS": null,
+ "ASAwardsREGUP": null,
+ "ASAwardsREGDN": null,
+ "bidType": null,
+ "startUpColdOffer": null,
+ "startUpHotOffer": null,
+ "startUpInterOffer": null,
+ "minGenCost": null,
+ "submittedTPOMW1": null,
+ "submittedTPOPrice1": null,
+ "submittedTPOMW2": null,
+ "submittedTPOPrice2": null,
+ "submittedTPOMW3": null,
+ "submittedTPOPrice3": null,
+ "submittedTPOMW4": null,
+ "submittedTPOPrice4": null,
+ "submittedTPOMW5": null,
+ "submittedTPOPrice5": null,
+ "submittedTPOMW6": null,
+ "submittedTPOPrice6": null,
+ "submittedTPOMW7": null,
+ "submittedTPOPrice7": null,
+ "submittedTPOMW8": null,
+ "submittedTPOPrice8": null,
+ "submittedTPOMW9": null,
+ "submittedTPOPrice9": null,
+ "submittedTPOMW10": null,
+ "submittedTPOPrice10": null,
+ "proxyExtension": "No",
+ "HASL": "28",
+ "LASL": "10",
+ "ASREGUP": "0",
+ "ASREGDN": "0",
+ "ASRRS": "0",
+ "ASRRSFFR": null,
+ "ASNSRS": "0",
+ "ASECRS": null
+ },
+ "rows_decoded": 42048
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_smne_gen_res",
+ "fixture": "np3-965-er--60_sced_smne_gen_res-history-samples.csv",
+ "file": "60d_SCED_SMNE_GEN_RES-01-MAY-14.csv",
+ "csv_rows": 51648,
+ "first_row": {
+ "intervalTime": "2014-03-02T00:14:59",
+ "intervalNumber": 1,
+ "resourceCode": "ACACIA_UNIT_1",
+ "intervalValue": "0"
+ },
+ "rows_decoded": 51648
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_dsr_load_data",
+ "fixture": "np3-965-er--60_sced_dsr_load_data-history-samples.csv",
+ "file": "60d_SCED_DSR_Load_Data-01-MAY-14.csv",
+ "csv_rows": 7363,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-02T00:00:14",
+ "repeatHourFlag": false,
+ "qseName": "QLCRA",
+ "totalTelemeteredDSRLoads": "0"
+ },
+ "rows_decoded": 7363
+ },
+ {
+ "endpoint": "np3-965-er/60_sced_qse_self_arranged_as",
+ "fixture": "np3-965-er--60_sced_qse_self_arranged_as-history-samples.csv",
+ "file": "60d_SCED_QSE_Self_Arranged_AS-01-MAY-14.csv",
+ "csv_rows": 2848,
+ "first_row": {
+ "SCEDTimestamp": "2014-03-02T02:15:09",
+ "repeatHourFlag": false,
+ "qseName": "QEAGL1",
+ "REGUP": "9.9",
+ "REGDN": "9.4",
+ "NSPIN": "6",
+ "NSPNM": null,
+ "RRSPFR": null,
+ "RRSFFR": null,
+ "RRSUFR": null,
+ "ECRSS": null,
+ "ECRSM": null,
+ "RRSGN": "12",
+ "RRSLD": "0",
+ "RRSNC": "45"
+ },
+ "rows_decoded": 2848
+ },
+ {
+ "endpoint": "np3-965-er/60_hdl_ldl_man_override",
+ "fixture": "np3-965-er--60_hdl_ldl_man_override-history-samples.csv",
+ "file": "60d_HDL_LDL_ManOverride-01-MAY-14.csv",
+ "csv_rows": 0,
+ "rows_decoded": 0
+ },
+ {
+ "endpoint": "np3-965-er/60_hdl_ldl_man_override",
+ "fixture": "np3-965-er--60_hdl_ldl_man_override-history-hdl-override.csv",
+ "file": "60d_HDL_LDL_ManOverride-07-JUN-24.csv",
+ "csv_rows": 234,
+ "rows_decoded": 234,
+ "first_row": {
+ "SCEDTimestamp": "2024-04-08T11:40:17",
+ "repeatHourFlag": false,
+ "participantName": "QAEN",
+ "resourceName": "FPPYD1_FPP_G2_J02",
+ "HDLOriginal": "95.13999938",
+ "HDLManual": "0",
+ "HDLFinal": "95.13999938",
+ "LDLOriginal": "78",
+ "LDLManual": "160",
+ "LDLFinal": "95.13999938",
+ "reasonCode": "."
+ }
+ },
+ {
+ "endpoint": "np3-965-er/60d_sced_as_cap_man_override",
+ "fixture": "np3-965-er--60d_sced_as_cap_man_override-history-as-override.csv",
+ "file": "60d_AS_Capability_ManOverride-14-JUN-26.csv",
+ "csv_rows": 240,
+ "rows_decoded": 240,
+ "first_row": {
+ "SCEDTimestamp": "2026-04-15T12:13:14",
+ "repeatHourFlag": false,
+ "startTime": "2026-04-15T12:03:39",
+ "endTime": "2026-04-15T23:59:01",
+ "participantName": "QTEN26",
+ "resourceName": "FTDUNCAN_ESR1",
+ "ASType": "REGDN",
+ "ASCapLimit": "0",
+ "deratedQty": "200",
+ "reasonCode": null
+ }
+ }
+]
diff --git a/tools/inputs/history/scheduled-zonal-generation.zip b/tools/inputs/history/scheduled-zonal-generation.zip
new file mode 100644
index 00000000..6c35d7cf
Binary files /dev/null and b/tools/inputs/history/scheduled-zonal-generation.zip differ
diff --git a/tools/inputs/history/sdk-workflow-evidence.json b/tools/inputs/history/sdk-workflow-evidence.json
new file mode 100644
index 00000000..86d04315
--- /dev/null
+++ b/tools/inputs/history/sdk-workflow-evidence.json
@@ -0,0 +1,173 @@
+{
+ "scope": "Fresh SDK clients using vault credentials and default transports; no token injection. Bounded report, individual archive, monthly bundle and async query. Public response metadata only; no credential/header/body logging. Event hooks recorded only method, host, path and status. This verifies the stated bounded workflows, not all products, pagination, token-expiry refresh or full historical completeness.",
+ "checks": [
+ {
+ "name": "typedQuery",
+ "rows": 24,
+ "firstRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-04",
+ "hourEnding": "01:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "28.76"
+ },
+ "lastRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-04",
+ "hourEnding": "24:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "31.55"
+ },
+ "minDeliveryDate": "2026-09-04",
+ "maxDeliveryDate": "2026-09-04",
+ "rowType": "np4_190_cd.DamStlmntPntPricesRow",
+ "query": {
+ "deliveryDateFrom": "2026-09-04",
+ "deliveryDateTo": "2026-09-04",
+ "settlementPoint": "HB_HOUSTON",
+ "size": 100
+ }
+ },
+ {
+ "name": "archiveRowsMay2014",
+ "rows": 24,
+ "firstRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "01:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "30.2"
+ },
+ "lastRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "24:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "33.69"
+ },
+ "minDeliveryDate": "2014-05-02",
+ "maxDeliveryDate": "2014-05-02",
+ "rowType": "np4_190_cd.DamStlmntPntPricesRow",
+ "where": "settlementPoint == HB_HOUSTON",
+ "kind": "archive",
+ "postedFrom": "2014-05-01T00:00:00",
+ "postedTo": "2014-05-01T23:59:59"
+ },
+ {
+ "name": "bundleRowsJanuary2018",
+ "rows": 744,
+ "firstRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2018-01-02",
+ "hourEnding": "01:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "34.55"
+ },
+ "lastRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2018-02-01",
+ "hourEnding": "24:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "18.51"
+ },
+ "minDeliveryDate": "2018-01-02",
+ "maxDeliveryDate": "2018-02-01",
+ "rowType": "np4_190_cd.DamStlmntPntPricesRow",
+ "where": "settlementPoint == HB_HOUSTON",
+ "kind": "bundle",
+ "postedFrom": "2018-01-01T00:00:00",
+ "postedTo": "2018-01-31T23:59:59"
+ },
+ {
+ "name": "freshAsyncQuery",
+ "rows": 1,
+ "firstRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-04",
+ "hourEnding": "01:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "28.76"
+ },
+ "lastRow": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-04",
+ "hourEnding": "01:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "28.76"
+ },
+ "minDeliveryDate": "2026-09-04",
+ "maxDeliveryDate": "2026-09-04",
+ "rowType": "np4_190_cd.DamStlmntPntPricesRow",
+ "query": {
+ "deliveryDateFrom": "2026-09-04",
+ "deliveryDateTo": "2026-09-04",
+ "settlementPoint": "HB_HOUSTON",
+ "size": 1
+ }
+ }
+ ],
+ "requests": [
+ {
+ "method": "POST",
+ "host": "ercotb2c.b2clogin.com",
+ "path": "/ercotb2c.onmicrosoft.com/B2C_1_PUBAPI-ROPC-FLOW/oauth2/v2.0/token",
+ "status": 200
+ },
+ {
+ "method": "GET",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/",
+ "status": 200
+ },
+ {
+ "method": "GET",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices",
+ "status": 200
+ },
+ {
+ "method": "GET",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/archive/np4-190-cd",
+ "status": 200
+ },
+ {
+ "method": "POST",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/archive/np4-190-cd/download",
+ "status": 200
+ },
+ {
+ "method": "GET",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/bundle/np4-190-cd",
+ "status": 200
+ },
+ {
+ "method": "POST",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/bundle/np4-190-cd/download",
+ "status": 400
+ },
+ {
+ "method": "GET",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/bundle/np4-190-cd",
+ "status": 200
+ },
+ {
+ "method": "POST",
+ "host": "ercotb2c.b2clogin.com",
+ "path": "/ercotb2c.onmicrosoft.com/B2C_1_PUBAPI-ROPC-FLOW/oauth2/v2.0/token",
+ "status": 200
+ },
+ {
+ "method": "GET",
+ "host": "api.ercot.com",
+ "path": "/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices",
+ "status": 200
+ }
+ ],
+ "productCount": 116,
+ "authenticationRequests": 2
+}
diff --git a/tools/inputs/history/sog-evidence.json b/tools/inputs/history/sog-evidence.json
new file mode 100644
index 00000000..2c90b1ac
--- /dev/null
+++ b/tools/inputs/history/sog-evidence.json
@@ -0,0 +1,118 @@
+[
+ {
+ "endpoint": "np6-326-cd/rt_price_sog",
+ "fixture": "np6-326-cd-history-current.csv",
+ "file": "cdr.00021115.0000000000000000.20260907.130200.SOGPRICENP6326_20260907_1300.csv",
+ "csv_rows": 452,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-07",
+ "deliveryHour": 13,
+ "deliveryInterval": 4,
+ "meterName": "10443720004133031",
+ "meterPrice": "29.33",
+ "resourceName": "19599_1_PV_A1",
+ "resourceType": "SODG"
+ },
+ "rows_decoded": 452
+ },
+ {
+ "endpoint": "np6-326-cd/rt_price_sog",
+ "fixture": "np6-326-cd-history-samples.csv",
+ "file": "cdr.00021115.0000000000000000.20260430.111701.SOGPRICENP6326_20260430_1115.csv",
+ "csv_rows": 450,
+ "first_row": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-04-30",
+ "deliveryHour": 12,
+ "deliveryInterval": 1,
+ "meterName": "10443720004133031",
+ "meterPrice": "34.04",
+ "resourceName": "19599_1_PV_A1",
+ "resourceType": "SODG"
+ },
+ "rows_decoded": 450
+ },
+ {
+ "endpoint": "np6-327-cd/lmp_sog_price_adders",
+ "fixture": "np6-327-cd-history-current.csv",
+ "file": "cdr.00021114.0000000000000000.20260907.131533.SOGLMPNP6327_20260907_131520.csv",
+ "csv_rows": 452,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-07T13:15:20",
+ "repeatHourFlag": false,
+ "resourceType": "SODG",
+ "resourceName": "19599_1_PV_A1",
+ "stationName": "BLMND",
+ "voltageLevel": "138.00",
+ "meterName": "10443720004133031",
+ "meterLMP": "27.52",
+ "RTRDPA": "0.00",
+ "finalLMP": "27.52",
+ "RTORPA": null,
+ "RTORDPA": null
+ },
+ "rows_decoded": 452
+ },
+ {
+ "endpoint": "np6-327-cd/lmp_sog_price_adders",
+ "fixture": "np6-327-cd-history-samples.csv",
+ "file": "cdr.00021114.0000000000000000.20220211.000523.SOGLMPNP6327_20220211_000520.csv",
+ "csv_rows": 159,
+ "first_row": {
+ "SCEDTimestamp": "2022-02-11T00:05:20",
+ "repeatHourFlag": false,
+ "resourceType": "SODG",
+ "resourceName": "ALEXIS_ALEXIS",
+ "stationName": "RACHAL",
+ "voltageLevel": "138.00",
+ "meterName": "CPLALXSGP0100",
+ "meterLMP": "17.85",
+ "RTRDPA": null,
+ "finalLMP": "17.85",
+ "RTORPA": "0.00",
+ "RTORDPA": "0.00"
+ },
+ "rows_decoded": 159
+ },
+ {
+ "endpoint": "np4-722-cd/weather_assumptions",
+ "fixture": "np4-722-cd-history-current.csv",
+ "file": "cdr.00012325.0000000000000000.20260907.050000.WANP4722.csv",
+ "csv_rows": 288,
+ "first_row": {
+ "coast": "82.7",
+ "deliveryDate": "2026-09-04",
+ "east": "77.5",
+ "farWest": "84.5",
+ "hourEnding": "02:00",
+ "north": "80.5",
+ "northCentral": "79.5",
+ "repeatedHourFlag": false,
+ "southCentral": "81.5",
+ "southern": "84.4",
+ "west": "85"
+ },
+ "rows_decoded": 288
+ },
+ {
+ "endpoint": "np4-722-cd/weather_assumptions",
+ "fixture": "np4-722-cd-history-samples.csv",
+ "file": "cdr.00012325.0000000000000000.20260626.050000.WANP4722.csv",
+ "csv_rows": 288,
+ "first_row": {
+ "coast": "81.9",
+ "deliveryDate": "2026-06-23",
+ "east": "80.5",
+ "farWest": "82.5",
+ "hourEnding": "02:00",
+ "north": "79",
+ "northCentral": "83",
+ "repeatedHourFlag": false,
+ "southCentral": "80",
+ "southern": "82.4",
+ "west": "82"
+ },
+ "rows_decoded": 288
+ }
+]
diff --git a/tools/inputs/history/sparse-table-evidence.json b/tools/inputs/history/sparse-table-evidence.json
new file mode 100644
index 00000000..33d49063
--- /dev/null
+++ b/tools/inputs/history/sparse-table-evidence.json
@@ -0,0 +1,86 @@
+[
+ {
+ "product": "np3-965-er",
+ "table": "60d_sced_esr_data",
+ "checkedAt": "2026-09-08T03:46:13.947473+00:00",
+ "postedFrom": "2014-05-01T00:00:00",
+ "postedTo": "2014-05-01T23:59:59",
+ "docId": 446390848,
+ "originalSha256": "44c8aec9850c0d7c9eff6b30a8f30ea4fa71fc65443df6a2901cb7bdbb9d73f8",
+ "originalMembers": [
+ "60d_Load Resource_Data_in_SCED-01-MAY-14.csv",
+ "60d_SCED_Gen_Resource_Data-01-MAY-14.csv",
+ "60d_SCED_SMNE_GEN_RES-01-MAY-14.csv",
+ "60d_SCED_DSR_Load_Data-01-MAY-14.csv",
+ "60d_SCED_QSE_Self_Arranged_AS-01-MAY-14.csv",
+ "60d_HDL_LDL_ManOverride-01-MAY-14.csv"
+ ],
+ "rows": 0,
+ "matchesRecordedSource": true,
+ "comparison": "Original 2014 ZIP has no selected ESR member and explicit read raises; current source compared by Counter of SHA256 of every typed row model_dump_json, including multiplicity.",
+ "requests": [
+ {
+ "method": "GET",
+ "path": "/api/public-reports/archive/np3-965-er",
+ "query": "page=1&size=1000&postDatetimeFrom=2014-05-01T00%3A00%3A00&postDatetimeTo=2014-05-01T23%3A59%3A59"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np3-965-er",
+ "query": "page=1&size=1000"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/archive/np3-965-er/download",
+ "query": "",
+ "docIds": [
+ 446390848
+ ]
+ }
+ ]
+ },
+ {
+ "product": "np3-965-er",
+ "table": "60d_sced_esr_data",
+ "checkedAt": "2026-09-08T03:46:52.081595+00:00",
+ "postedFrom": "2026-09-06T00:00:00",
+ "postedTo": "2026-09-06T23:59:59",
+ "docId": 1271171684,
+ "originalSha256": "31f9c73ea31136893a7cccf3f7459018b66d2b12b7a4660152fdf88e16b5375e",
+ "originalMembers": [
+ "60d_SCED_QSE_Self_Arranged_AS-06-SEP-26.csv",
+ "60d_SCED_SMNE_GEN_RES-06-SEP-26.csv",
+ "60d_SCED_Gen_Resource_Data-06-SEP-26.csv",
+ "60d_Load_Resource_Data_in_SCED-06-SEP-26.csv",
+ "60d_HDL_LDL_ManOverride-06-SEP-26.csv",
+ "60d_SCED_EOC_Updates_in_OpHour-06-SEP-26.csv",
+ "60d_AS_Capability_ManOverride-06-SEP-26.csv",
+ "60d_ESR_Data_in_SCED-06-SEP-26.csv",
+ "60d_SCED_Resource_AS_OFFERS-06-SEP-26.csv",
+ "60d_SCED_AS_Offer_Updates_in_OpPeriod-06-SEP-26.csv"
+ ],
+ "rows": 96480,
+ "matchesRecordedSource": true,
+ "comparison": "Original 2014 ZIP has no selected ESR member and explicit read raises; current source compared by Counter of SHA256 of every typed row model_dump_json, including multiplicity.",
+ "requests": [
+ {
+ "method": "GET",
+ "path": "/api/public-reports/archive/np3-965-er",
+ "query": "page=1&size=1000&postDatetimeFrom=2026-09-06T00%3A00%3A00&postDatetimeTo=2026-09-06T23%3A59%3A59"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/bundle/np3-965-er",
+ "query": "page=1&size=1000"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/archive/np3-965-er/download",
+ "query": "",
+ "docIds": [
+ 1271171684
+ ]
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tools/inputs/history/summaries-evidence.json b/tools/inputs/history/summaries-evidence.json
new file mode 100644
index 00000000..03e9f9fb
--- /dev/null
+++ b/tools/inputs/history/summaries-evidence.json
@@ -0,0 +1,182 @@
+[
+ {
+ "endpoint": "np4-179-cd/total_as_service_offers",
+ "fixture": "np4-179-cd-history-current.csv",
+ "file": "cdr.00012327.0000000000000000.20251204.123457.TASONP4179.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2025-12-05",
+ "hourEnding": "01:00",
+ "REGDN": "5677.8",
+ "REGUP": "6695.8",
+ "RRSPFR": "8676.7",
+ "RRSFFR": "150.4",
+ "RRSUFR": "892.2",
+ "ECRSSD": "8449.1",
+ "ECRSMD": "268.5",
+ "NSPIN": "8259",
+ "DSTFlag": false,
+ "RRS": null
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np4-179-cd/total_as_service_offers",
+ "fixture": "np4-179-cd-history-samples.csv",
+ "file": "cdr.00012327.0000000000000000.20140501.125911.TASONP4179.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-05-02",
+ "hourEnding": "01:00",
+ "REGDN": "1525.7",
+ "REGUP": "1898.2",
+ "RRSPFR": null,
+ "RRSFFR": null,
+ "RRSUFR": null,
+ "ECRSSD": null,
+ "ECRSMD": null,
+ "NSPIN": "3424.3",
+ "DSTFlag": false,
+ "RRS": "4378"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np4-532-cd/dam_as_sold",
+ "fixture": "np4-532-cd-history-current.csv",
+ "file": "cdr.00024888.0000000000000000.20260907.123252.DAMASSOLDNP4532.csv",
+ "csv_rows": 240,
+ "first_row": {
+ "ASType": "ECRSM",
+ "deliveryDate": "2026-09-08",
+ "hourEnding": "01:00",
+ "quantity": "247.8",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 240
+ },
+ {
+ "endpoint": "np4-532-cd/dam_as_sold",
+ "fixture": "np4-532-cd-history-samples.csv",
+ "file": "cdr.00024888.0000000000000000.20251205.131140.DAMASSOLDNP4532.csv",
+ "csv_rows": 240,
+ "first_row": {
+ "ASType": "ECRSM",
+ "deliveryDate": "2025-12-06",
+ "hourEnding": "01:00",
+ "quantity": "182.1",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 240
+ },
+ {
+ "endpoint": "np4-790-cd/peaker_net_margin",
+ "fixture": "np4-790-cd-history-current.csv",
+ "file": "cdr.00012348.0000000000000000.20260906.160000.PNMNP4790.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "asOfDate": "2026-09-06T16:00:00",
+ "peakerNetMargin": "52494.23"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np4-790-cd/peaker_net_margin",
+ "fixture": "np4-790-cd-history-samples.csv",
+ "file": "cdr.00012348.0000000000000000.20260625.160000.PNMNP4790.csv",
+ "csv_rows": 1,
+ "first_row": {
+ "asOfDate": "2026-06-25T16:00:00",
+ "peakerNetMargin": "36025.36"
+ },
+ "rows_decoded": 1
+ },
+ {
+ "endpoint": "np4-791-cd/da_sw_offer_caps",
+ "fixture": "np4-791-cd-history-current.csv",
+ "file": "cdr.00012349.0000000000000000.20260907.050000.SWOCNP4791.csv",
+ "csv_rows": 2,
+ "first_row": {
+ "postedDatetime": null,
+ "SWCAPType": "AS",
+ "DASWCAP": "5000",
+ "RTSWCAP": "2000",
+ "SWCAP": null
+ },
+ "rows_decoded": 2
+ },
+ {
+ "endpoint": "np4-791-cd/da_sw_offer_caps",
+ "fixture": "np4-791-cd-history-samples.csv",
+ "file": "cdr.00012349.0000000000000000.20140312.050000.SWOCNP4791.csv",
+ "csv_rows": 2,
+ "first_row": {
+ "postedDatetime": null,
+ "SWCAPType": "AS",
+ "DASWCAP": null,
+ "RTSWCAP": null,
+ "SWCAP": "5000"
+ },
+ "rows_decoded": 2
+ },
+ {
+ "endpoint": "np5-108-cd/hrly_rmr_services_deployed",
+ "fixture": "np5-108-cd-history-current.csv",
+ "file": "cdr.00010016.0000000000000000.20260907.120500.RMRServicesDeployedNP5108.csv",
+ "csv_rows": 16,
+ "first_row": {
+ "postedDatetime": null,
+ "hourEnding": "12:00",
+ "resourceName": "A4_DGR1",
+ "mwhDeployment": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 16
+ },
+ {
+ "endpoint": "np5-108-cd/hrly_rmr_services_deployed",
+ "fixture": "np5-108-cd-history-samples.csv",
+ "file": "cdr.00010016.0000000000000000.20260528.120500.RMRServicesDeployedNP5108.csv",
+ "csv_rows": 16,
+ "first_row": {
+ "postedDatetime": null,
+ "hourEnding": "12:00",
+ "resourceName": "A4_DGR1",
+ "mwhDeployment": "0",
+ "repeatHourFlag": false
+ },
+ "rows_decoded": 16
+ },
+ {
+ "endpoint": "np7-464-cd/dam_ptp_option_price_report",
+ "fixture": "np7-464-cd-history-current.csv",
+ "file": "cdr.00010042.0000000000000000.20260906.123921.DAMPTPNP7464.csv",
+ "csv_rows": 163608,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "01:00",
+ "price": "0",
+ "source": "7RNCHSLR_ALL",
+ "sink": "FPPYD_FPP_G2",
+ "repeatedHourFlag": false
+ },
+ "rows_decoded": 163608
+ },
+ {
+ "endpoint": "np7-464-cd/dam_ptp_option_price_report",
+ "fixture": "np7-464-cd-history-samples.csv",
+ "file": "cdr.00010042.0000000000000000.20260626.132304.DAMPTPNP7464.csv",
+ "csv_rows": 145008,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-06-27",
+ "hourEnding": "01:00",
+ "price": "0",
+ "source": "7RNCHSLR_ALL",
+ "sink": "CBECII_89",
+ "repeatedHourFlag": false
+ },
+ "rows_decoded": 145008
+ }
+]
diff --git a/tools/inputs/history/summaries2-evidence.json b/tools/inputs/history/summaries2-evidence.json
new file mode 100644
index 00000000..abf16f98
--- /dev/null
+++ b/tools/inputs/history/summaries2-evidence.json
@@ -0,0 +1,915 @@
+[
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers-history-current.csv",
+ "file": "2d_Tot_Cleared_Energy_Bids_Offers-07-SEP-26.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-40439.9",
+ "sum3POCleared": "25272.9",
+ "sumDamENOnlyOffersCleared": "15103.5",
+ "sumESRBidsCleared": "-3.2",
+ "sumESROffersCleared": "66.7"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_houston",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-current.csv",
+ "file": "2d_Tot_Cleared_Energy_Bids_Offers_Houston-07-SEP-26.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-5413.3",
+ "sum3POCleared": "4048.1",
+ "sumDamENOnlyOffersCleared": "1190.5",
+ "sumESRBidsCleared": "0",
+ "sumESROffersCleared": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_north",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_north-history-current.csv",
+ "file": "2d_Tot_Cleared_Energy_Bids_Offers_North-07-SEP-26.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-18984.7",
+ "sum3POCleared": "10425",
+ "sumDamENOnlyOffersCleared": "5515.7",
+ "sumESRBidsCleared": "0",
+ "sumESROffersCleared": "0"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_south",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_south-history-current.csv",
+ "file": "2d_Tot_Cleared_Energy_Bids_Offers_South-07-SEP-26.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-11588.2",
+ "sum3POCleared": "8916",
+ "sumDamENOnlyOffersCleared": "3712",
+ "sumESRBidsCleared": "-3.2",
+ "sumESROffersCleared": "25"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_west",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_west-history-current.csv",
+ "file": "2d_Tot_Cleared_Energy_Bids_Offers_West-07-SEP-26.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-3867.8",
+ "sum3POCleared": "1883.8",
+ "sumDamENOnlyOffersCleared": "4334.8",
+ "sumESRBidsCleared": "0",
+ "sumESROffersCleared": "41.7"
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids",
+ "fixture": "np3-909-er--2d_ptp_obl_bids-history-current.csv",
+ "file": "2d_PTP_Obligation_Bids-07-SEP-26.csv",
+ "csv_rows": 192580,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "settlementPointSource": "7RNCHSLR_ALL",
+ "settlementPointSink": "LEONLCPCT1_2",
+ "PTPBidPrice": "50.93",
+ "PTPBidAwardMW": "1.3",
+ "bidId": null
+ },
+ "rows_decoded": 192580
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_houston",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_houston-history-current.csv",
+ "file": "2d_PTP_Obligation_Bids_Houston-07-SEP-26.csv",
+ "csv_rows": 19150,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "settlementPointSource": "ADL_RN",
+ "settlementPointSink": "BSS_U1",
+ "PTPBidPrice": "3.2",
+ "PTPBidAwardMW": "6.7",
+ "bidId": null
+ },
+ "rows_decoded": 19150
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_north",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_north-history-current.csv",
+ "file": "2d_PTP_Obligation_Bids_North-07-SEP-26.csv",
+ "csv_rows": 44133,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "settlementPointSource": "AGUAYO_UNIT1",
+ "settlementPointSink": "CNLY_ESS_RN",
+ "PTPBidPrice": "100",
+ "PTPBidAwardMW": "10",
+ "bidId": null
+ },
+ "rows_decoded": 44133
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_south",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_south-history-current.csv",
+ "file": "2d_PTP_Obligation_Bids_South-07-SEP-26.csv",
+ "csv_rows": 65317,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "settlementPointSource": "7RNCHSLR_ALL",
+ "settlementPointSink": "LEONLCPCT1_2",
+ "PTPBidPrice": "50.93",
+ "PTPBidAwardMW": "1.3",
+ "bidId": null
+ },
+ "rows_decoded": 65317
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_west",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_west-history-current.csv",
+ "file": "2d_PTP_Obligation_Bids_West-07-SEP-26.csv",
+ "csv_rows": 57512,
+ "first_row": {
+ "deliveryDate": "2026-09-05",
+ "hourEnding": 1,
+ "settlementPointSource": "ABINDUST_RN",
+ "settlementPointSink": "CALLAHA_WND1",
+ "PTPBidPrice": "-37",
+ "PTPBidAwardMW": "2.3",
+ "bidId": null
+ },
+ "rows_decoded": 57512
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_west",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_west-history-samples.csv",
+ "file": "48h_PTP_Obligation_Bids_West-12-MAR-14.csv",
+ "csv_rows": 10419,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "settlementPointSource": "BLSMT1_5_A_6",
+ "settlementPointSink": "BULLCRK_1_2",
+ "PTPBidPrice": "-999",
+ "PTPBidAwardMW": "1",
+ "bidId": "M111933"
+ },
+ "rows_decoded": 10419
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_south",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_south-history-samples.csv",
+ "file": "48h_PTP_Obligation_Bids_South-12-MAR-14.csv",
+ "csv_rows": 25150,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "settlementPointSource": "AMOCO_PUN1",
+ "settlementPointSink": "NUE_NUECESG8",
+ "PTPBidPrice": "-0.5",
+ "PTPBidAwardMW": "1.9",
+ "bidId": "2140310018"
+ },
+ "rows_decoded": 25150
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_north",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_north-history-samples.csv",
+ "file": "48h_PTP_Obligation_Bids_North-12-MAR-14.csv",
+ "csv_rows": 19702,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "settlementPointSource": "ATK_ATKG345",
+ "settlementPointSink": "ATK_ATKINSG6",
+ "PTPBidPrice": "-1",
+ "PTPBidAwardMW": "25",
+ "bidId": "40132723"
+ },
+ "rows_decoded": 19702
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids_houston",
+ "fixture": "np3-909-er--2d_ptp_obl_bids_houston-history-samples.csv",
+ "file": "48h_PTP_Obligation_Bids_Houston-12-MAR-14.csv",
+ "csv_rows": 10260,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "settlementPointSource": "AMOCO_PUN1",
+ "settlementPointSink": "CTL_GT_102",
+ "PTPBidPrice": "-0.01",
+ "PTPBidAwardMW": "5",
+ "bidId": "14a9934be3fb"
+ },
+ "rows_decoded": 10260
+ },
+ {
+ "endpoint": "np3-909-er/2d_ptp_obl_bids",
+ "fixture": "np3-909-er--2d_ptp_obl_bids-history-samples.csv",
+ "file": "48h_PTP_Obligation_Bids-12-MAR-14.csv",
+ "csv_rows": 65889,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "settlementPointSource": "AMOCO_PUN1",
+ "settlementPointSink": "CTL_GT_102",
+ "PTPBidPrice": "-0.01",
+ "PTPBidAwardMW": "5",
+ "bidId": "14a9934be3fb"
+ },
+ "rows_decoded": 65889
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_west",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_west-history-samples.csv",
+ "file": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_West-12-MAR-14.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-1585.5",
+ "sum3POCleared": "255.8",
+ "sumDamENOnlyOffersCleared": "859.8",
+ "sumESRBidsCleared": null,
+ "sumESROffersCleared": null
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_south",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_south-history-samples.csv",
+ "file": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_South-12-MAR-14.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-5209.5",
+ "sum3POCleared": "5343.3",
+ "sumDamENOnlyOffersCleared": "544.3",
+ "sumESRBidsCleared": null,
+ "sumESROffersCleared": null
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_north",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_north-history-samples.csv",
+ "file": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_North-12-MAR-14.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-4667.3",
+ "sum3POCleared": "2143.3",
+ "sumDamENOnlyOffersCleared": "1832.3",
+ "sumESRBidsCleared": null,
+ "sumESROffersCleared": null
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers_houston",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers_houston-history-samples.csv",
+ "file": "48h_Tot_Clrd_Ene_Bids_Ene_Offers_Houston-12-MAR-14.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-1237.6",
+ "sum3POCleared": "930.1",
+ "sumDamENOnlyOffersCleared": "791",
+ "sumESRBidsCleared": null,
+ "sumESROffersCleared": null
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-909-er/2d_total_cleared_energy_bids_offers",
+ "fixture": "np3-909-er--2d_total_cleared_energy_bids_offers-history-samples.csv",
+ "file": "48h_Tot_Clrd_Ene_Bids_Ene_Offers-12-MAR-14.csv",
+ "csv_rows": 24,
+ "first_row": {
+ "deliveryDate": "2014-03-10",
+ "hourEnding": 1,
+ "sumDamENOnlyBidsCleared": "-12699.9",
+ "sum3POCleared": "8672.5",
+ "sumDamENOnlyOffersCleared": "4027.4",
+ "sumESRBidsCleared": null,
+ "sumESROffersCleared": null
+ },
+ "rows_decoded": 24
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched",
+ "fixture": "np3-910-er--2d_agg_out_sched-history-current.csv",
+ "file": "2d_Agg_Output_Sched-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "1879.48216636",
+ "sumHSLOutputSched": "7466.23505074",
+ "sumOutputSched": "5570.93914093"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_houston",
+ "fixture": "np3-910-er--2d_agg_out_sched_houston-history-current.csv",
+ "file": "2d_Agg_Output_Sched_Houston-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "253.98100972",
+ "sumHSLOutputSched": "1236.34936594",
+ "sumOutputSched": "606.03206092"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_north",
+ "fixture": "np3-910-er--2d_agg_out_sched_north-history-current.csv",
+ "file": "2d_Agg_Output_Sched_North-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "653.50000381",
+ "sumHSLOutputSched": "3383.10222148",
+ "sumOutputSched": "2369.78692001"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_south",
+ "fixture": "np3-910-er--2d_agg_out_sched_south-history-current.csv",
+ "file": "2d_Agg_Output_Sched_South-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "967.01115305",
+ "sumHSLOutputSched": "2837.18346292",
+ "sumOutputSched": "2595.12015999"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_west",
+ "fixture": "np3-910-er--2d_agg_out_sched_west-history-current.csv",
+ "file": "2d_Agg_Output_Sched_West-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "4.98999977",
+ "sumHSLOutputSched": "9.60000038",
+ "sumOutputSched": "0"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary",
+ "fixture": "np3-910-er--2d_agg_gen_summary-history-current.csv",
+ "file": "2d_Agg_Gen_Summary-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": "43705.56298071",
+ "sumBasePointWGR": "16092.59081339",
+ "sumBasePointPVGR": "1.05502587",
+ "sumBasePointREMRES": "5571.98185966",
+ "sumGenTelemMW": "65634.39591",
+ "sumBasePointESR": "216.2663321",
+ "sumBasePointESRCharge": "-218.35036787",
+ "sumBasePointESRDischarge": "434.61669998",
+ "sumHASLNonIRR": null,
+ "sumLASLNonIRR": null,
+ "sumHASLWGR": null,
+ "sumLASLWGR": null,
+ "sumHASLPVGR": null,
+ "sumLASLPVGR": null,
+ "sumHASLREMRES": null,
+ "sumLASLREMRES": null,
+ "sumBasePointNonWGR": null,
+ "sumHASLNonWGR": null,
+ "sumLASLNonWGR": null
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_houston",
+ "fixture": "np3-910-er--2d_agg_gen_summary_houston-history-current.csv",
+ "file": "2d_Agg_Gen_Summary_Houston-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": "9575.66966539",
+ "sumBasePointWGR": "104.07728004",
+ "sumBasePointPVGR": "0.00970499",
+ "sumBasePointREMRES": "607.60309968",
+ "sumGenTelemMW": "10600.70586",
+ "sumBasePointESR": "94.9439633",
+ "sumBasePointESRCharge": "-4.2361173",
+ "sumBasePointESRDischarge": "99.18008061",
+ "sumBasePointNonWGR": null,
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": null,
+ "sumLaslWGR": null,
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": null,
+ "sumLASLNonWGR": null,
+ "sumHASLREMRES": null,
+ "sumLASLREMRES": null
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_north",
+ "fixture": "np3-910-er--2d_agg_gen_summary_north-history-current.csv",
+ "file": "2d_Agg_Gen_Summary_North-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": "19487.91349601",
+ "sumBasePointWGR": "1948.86145186",
+ "sumBasePointPVGR": "0.32226315",
+ "sumBasePointREMRES": "2370.04131454",
+ "sumGenTelemMW": "23939.09011",
+ "sumBasePointESR": "0.98313852",
+ "sumBasePointESRCharge": "-100.00001256",
+ "sumBasePointESRDischarge": "100.98315109",
+ "sumBasePointNonWGR": null,
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": null,
+ "sumLaslWGR": null,
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": null,
+ "sumLASLNonWGR": null,
+ "sumHASLREMRES": null,
+ "sumLASLREMRES": null
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_south",
+ "fixture": "np3-910-er--2d_agg_gen_summary_south-history-current.csv",
+ "file": "2d_Agg_Gen_Summary_South-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": "11903.07099509",
+ "sumBasePointWGR": "3472.72053718",
+ "sumBasePointPVGR": "0.29553737",
+ "sumBasePointREMRES": "2594.33744544",
+ "sumGenTelemMW": "17958.33817",
+ "sumBasePointESR": "7.20114108",
+ "sumBasePointESRCharge": "-105.57041723",
+ "sumBasePointESRDischarge": "112.77155831",
+ "sumBasePointNonWGR": null,
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": null,
+ "sumLaslWGR": null,
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": null,
+ "sumLASLNonWGR": null,
+ "sumHASLREMRES": null,
+ "sumLASLREMRES": null
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_west",
+ "fixture": "np3-910-er--2d_agg_gen_summary_west-history-current.csv",
+ "file": "2d_Agg_Gen_Summary_West-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": "2279.02405858",
+ "sumBasePointWGR": "10566.9315443",
+ "sumBasePointPVGR": "0.42752034",
+ "sumBasePointREMRES": null,
+ "sumGenTelemMW": "12680.53762",
+ "sumBasePointESR": "113.13808919",
+ "sumBasePointESRCharge": "-8.54382076",
+ "sumBasePointESRDischarge": "121.68190995",
+ "sumBasePointNonWGR": null,
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": null,
+ "sumLaslWGR": null,
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": null,
+ "sumLASLNonWGR": null,
+ "sumHASLREMRES": null,
+ "sumLASLREMRES": null
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary",
+ "fixture": "np3-910-er--2d_agg_load_summary-history-current.csv",
+ "file": "2d_Agg_Load_Summary-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "65633.48059",
+ "sumTelemDCtieMW": "-232.2",
+ "aggLoadSummary": "65865.68059"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_houston",
+ "fixture": "np3-910-er--2d_agg_load_summary_houston-history-current.csv",
+ "file": "2d_Agg_Load_Summary_Houston-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "10599.51166",
+ "sumTelemDCtieMW": "0",
+ "aggLoadSummary": "10599.51166"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_north",
+ "fixture": "np3-910-er--2d_agg_load_summary_north-history-current.csv",
+ "file": "2d_Agg_Load_Summary_North-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "23939.46944",
+ "sumTelemDCtieMW": "-112.2",
+ "aggLoadSummary": "24051.66944"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_south",
+ "fixture": "np3-910-er--2d_agg_load_summary_south-history-current.csv",
+ "file": "2d_Agg_Load_Summary_South-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "17958.21217",
+ "sumTelemDCtieMW": "98.4",
+ "aggLoadSummary": "17859.81217"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_west",
+ "fixture": "np3-910-er--2d_agg_load_summary_west-history-current.csv",
+ "file": "2d_Agg_Load_Summary_West-07-SEP-26.csv",
+ "csv_rows": 291,
+ "first_row": {
+ "SCEDTimestamp": "2026-09-05T00:00:20",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "12680.56317",
+ "sumTelemDCtieMW": "-218.4",
+ "aggLoadSummary": "12898.96317"
+ },
+ "rows_decoded": 291
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_south",
+ "fixture": "np3-910-er--2d_agg_gen_summary_south-history-samples.csv",
+ "file": "48h_Agg_Gen_Summary_South-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": null,
+ "sumBasePointWGR": "1025.17955946",
+ "sumBasePointPVGR": null,
+ "sumBasePointREMRES": "854.81376075",
+ "sumGenTelemMW": "10672.87029",
+ "sumBasePointESR": null,
+ "sumBasePointESRCharge": null,
+ "sumBasePointESRDischarge": null,
+ "sumBasePointNonWGR": "8326.79057025",
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": "1025.17955946",
+ "sumLaslWGR": "0",
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": "9544.13563537",
+ "sumLASLNonWGR": "5418.8356018",
+ "sumHASLREMRES": "889.07999229",
+ "sumLASLREMRES": "141.49999904"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_north",
+ "fixture": "np3-910-er--2d_agg_gen_summary_north-history-samples.csv",
+ "file": "48h_Agg_Gen_Summary_North-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": null,
+ "sumBasePointWGR": "102.82153224",
+ "sumBasePointPVGR": null,
+ "sumBasePointREMRES": "89.30606651",
+ "sumGenTelemMW": "12557.14869",
+ "sumBasePointESR": null,
+ "sumBasePointESRCharge": null,
+ "sumBasePointESRDischarge": null,
+ "sumBasePointNonWGR": "12450.92651748",
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": "102.82153224",
+ "sumLaslWGR": "0",
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": "13118.58305358",
+ "sumLASLNonWGR": "8225.74284362",
+ "sumHASLREMRES": "355",
+ "sumLASLREMRES": "112"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_houston",
+ "fixture": "np3-910-er--2d_agg_gen_summary_houston-history-samples.csv",
+ "file": "48h_Agg_Gen_Summary_Houston-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": null,
+ "sumBasePointWGR": null,
+ "sumBasePointPVGR": null,
+ "sumBasePointREMRES": "322.95237356",
+ "sumGenTelemMW": "5324.22172",
+ "sumBasePointESR": null,
+ "sumBasePointESRCharge": null,
+ "sumBasePointESRDischarge": null,
+ "sumBasePointNonWGR": "5120.02861404",
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": null,
+ "sumLaslWGR": null,
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": "5273.79998779",
+ "sumLASLNonWGR": "2969",
+ "sumHASLREMRES": "331.4424377",
+ "sumLASLREMRES": "311.4424377"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_west",
+ "fixture": "np3-910-er--2d_agg_load_summary_west-history-samples.csv",
+ "file": "48h_Agg_Load_Summary_West-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "3130.92108",
+ "sumTelemDCtieMW": "20.3",
+ "aggLoadSummary": "3110.62108"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_south",
+ "fixture": "np3-910-er--2d_agg_load_summary_south-history-samples.csv",
+ "file": "48h_Agg_Load_Summary_South-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "10672.98389",
+ "sumTelemDCtieMW": "0.3",
+ "aggLoadSummary": "10672.68389"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_north",
+ "fixture": "np3-910-er--2d_agg_load_summary_north-history-samples.csv",
+ "file": "48h_Agg_Load_Summary_North-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "12557.22095",
+ "sumTelemDCtieMW": "-562.9",
+ "aggLoadSummary": "13120.12095"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary_houston",
+ "fixture": "np3-910-er--2d_agg_load_summary_houston-history-samples.csv",
+ "file": "48h_Agg_Load_Summary_Houston-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "5324.22172",
+ "sumTelemDCtieMW": "0",
+ "aggLoadSummary": "5324.22172"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_load_summary",
+ "fixture": "np3-910-er--2d_agg_load_summary-history-samples.csv",
+ "file": "48h_Agg_Load_Summary-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumTelemGenMW": "31685.34764",
+ "sumTelemDCtieMW": "-542.3",
+ "aggLoadSummary": "32227.64764"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_dsr_loads",
+ "fixture": "np3-910-er--2d_agg_dsr_loads-history-samples.csv",
+ "file": "48h_Agg_DSR_Loads-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumTelemDSRLoad": "1426.2",
+ "sumTelemDSRGen": "0"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary_west",
+ "fixture": "np3-910-er--2d_agg_gen_summary_west-history-samples.csv",
+ "file": "48h_Agg_Gen_Summary_West-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": null,
+ "sumBasePointWGR": "3113.11267668",
+ "sumBasePointPVGR": null,
+ "sumBasePointREMRES": null,
+ "sumGenTelemMW": "3130.92108",
+ "sumBasePointESR": null,
+ "sumBasePointESRCharge": null,
+ "sumBasePointESRDischarge": null,
+ "sumBasePointNonWGR": "15",
+ "sumHaslNonWGR": null,
+ "sumLaslNonWGR": null,
+ "sumHaslWGR": "3113.11267668",
+ "sumLaslWGR": "4",
+ "sumHaslRemRes": null,
+ "sumLaslRemRes": null,
+ "sumHASLNonWGR": "575",
+ "sumLASLNonWGR": "3",
+ "sumHASLREMRES": null,
+ "sumLASLREMRES": null
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_gen_summary",
+ "fixture": "np3-910-er--2d_agg_gen_summary-history-samples.csv",
+ "file": "48h_Agg_Gen_Summary-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumBasePointNonIRR": null,
+ "sumBasePointWGR": "4241.11376839",
+ "sumBasePointPVGR": null,
+ "sumBasePointREMRES": "1267.07220083",
+ "sumGenTelemMW": "31685.16178",
+ "sumBasePointESR": null,
+ "sumBasePointESRCharge": null,
+ "sumBasePointESRDischarge": null,
+ "sumHASLNonIRR": null,
+ "sumLASLNonIRR": null,
+ "sumHASLWGR": "4241.11376839",
+ "sumLASLWGR": "4",
+ "sumHASLPVGR": null,
+ "sumLASLPVGR": null,
+ "sumHASLREMRES": "1575.52243",
+ "sumLASLREMRES": "564.94243675",
+ "sumBasePointNonWGR": "25912.74570178",
+ "sumHASLNonWGR": "28511.51867675",
+ "sumLASLNonWGR": "16616.57844543"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_west",
+ "fixture": "np3-910-er--2d_agg_out_sched_west-history-samples.csv",
+ "file": "48h_Agg_Output_Sched_West-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "209.6",
+ "sumHSLOutputSched": "469.3",
+ "sumOutputSched": "0"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_south",
+ "fixture": "np3-910-er--2d_agg_out_sched_south-history-samples.csv",
+ "file": "48h_Agg_Output_Sched_South-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "1300.3",
+ "sumHSLOutputSched": "4184.5",
+ "sumOutputSched": "854.8"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_north",
+ "fixture": "np3-910-er--2d_agg_out_sched_north-history-samples.csv",
+ "file": "48h_Agg_Output_Sched_North-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "999",
+ "sumHSLOutputSched": "2540",
+ "sumOutputSched": "178.4"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched_houston",
+ "fixture": "np3-910-er--2d_agg_out_sched_houston-history-samples.csv",
+ "file": "48h_Agg_Output_Sched_Houston-01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "683.5",
+ "sumHSLOutputSched": "1370.5",
+ "sumOutputSched": "323.4"
+ },
+ "rows_decoded": 96
+ },
+ {
+ "endpoint": "np3-910-er/2d_agg_out_sched",
+ "fixture": "np3-910-er--2d_agg_out_sched-history-samples.csv",
+ "file": "48h_Agg_Output_Sched -01-MAY-14.csv",
+ "csv_rows": 96,
+ "first_row": {
+ "SCEDTimestamp": "2014-04-29T00:00:16",
+ "repeatHourFlag": false,
+ "sumLSLOutputSched": "3192.4",
+ "sumHSLOutputSched": "8564.3",
+ "sumOutputSched": "1356.6"
+ },
+ "rows_decoded": 96
+ }
+]
diff --git a/tools/inputs/history/transmission-evidence.json b/tools/inputs/history/transmission-evidence.json
new file mode 100644
index 00000000..8ff5994a
--- /dev/null
+++ b/tools/inputs/history/transmission-evidence.json
@@ -0,0 +1,130 @@
+[
+ {
+ "endpoint": "np5-754-cd/daily_ruc_act_and_bind_tran_const",
+ "fixture": "np5-754-cd-history-current.csv",
+ "file": "cdr.00012338.0000000000000000.20260906.145705.DRUCAPROVABINDTRANSNP5754.csv",
+ "csv_rows": 77,
+ "first_row": {
+ "RUCTimestamp": "2026-09-06T14:33:04",
+ "constraintID": 2,
+ "constraintName": "6945__A",
+ "contingencyName": "SRGRMGS5",
+ "deliveryDate": "2026-09-07",
+ "fromStation": "MGSES",
+ "fromStationkV": "345",
+ "hourEnding": "01:00",
+ "limit": "1200",
+ "repeatedHourFlag": false,
+ "toStation": "CATSW",
+ "toStationkV": "345",
+ "value": "1200",
+ "violationAmount": "0"
+ },
+ "rows_decoded": 77
+ },
+ {
+ "endpoint": "np5-754-cd/daily_ruc_act_and_bind_tran_const",
+ "fixture": "np5-754-cd-history-samples.csv",
+ "file": "cdr.00012338.0000000000000000.20260828.145900.DRUCAPROVABINDTRANSNP5754.csv",
+ "csv_rows": 84,
+ "first_row": {
+ "RUCTimestamp": "2026-08-28T14:33:21",
+ "constraintID": 1,
+ "constraintName": "LPLMK_LPLNE_1",
+ "contingencyName": "SBWDDBM5",
+ "deliveryDate": "2026-08-29",
+ "fromStation": "LPLMK",
+ "fromStationkV": "115",
+ "hourEnding": "01:00",
+ "limit": "218",
+ "repeatedHourFlag": false,
+ "toStation": "LPLNE",
+ "toStationkV": "115",
+ "value": "218",
+ "violationAmount": "0"
+ },
+ "rows_decoded": 84
+ },
+ {
+ "endpoint": "np5-755-cd/hrly_ruc_act_and_bind_tran_const",
+ "fixture": "np5-755-cd-history-current.csv",
+ "file": "cdr.00012336.0000000000000000.20260907.121750.HRUCAPROVABINDTRANSNP5755.csv",
+ "csv_rows": 61,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-09-07",
+ "hourEnding": "14:00",
+ "RUCTimestamp": "2026-09-07T12:03:03",
+ "constraintID": 1,
+ "constraintName": "SEA_AAT1",
+ "contingencyName": "DFRYBC58",
+ "limit": "100",
+ "value": "100",
+ "violationAmount": "0",
+ "fromStation": "SEA",
+ "toStation": "SEA",
+ "fromStationkV": "138",
+ "toStationkV": "69",
+ "DSTFlag": false
+ },
+ "rows_decoded": 61
+ },
+ {
+ "endpoint": "np5-755-cd/hrly_ruc_act_and_bind_tran_const",
+ "fixture": "np5-755-cd-history-samples.csv",
+ "file": "cdr.00012336.0000000000000000.20260430.112107.HRUCAPROVABINDTRANSNP5755.csv",
+ "csv_rows": 22,
+ "first_row": {
+ "postedDatetime": null,
+ "deliveryDate": "2026-04-30",
+ "hourEnding": "13:00",
+ "RUCTimestamp": "2026-04-30T11:03:03",
+ "constraintID": 2,
+ "constraintName": "940__A",
+ "contingencyName": "SPEBTRU8",
+ "limit": "263",
+ "value": "263",
+ "violationAmount": "0",
+ "fromStation": "ENWSW",
+ "toStation": "TMPTN",
+ "fromStationkV": "138",
+ "toStationkV": "138",
+ "DSTFlag": false
+ },
+ "rows_decoded": 22
+ },
+ {
+ "endpoint": "np6-970-cd/rtd_lmp_node_zone_hub",
+ "fixture": "np6-970-cd-history-current.csv",
+ "file": "cdr.00013073.0000000000000000.20260907.125642.RTDLMPRNLZHUBNP6970_20260907_125503.csv",
+ "csv_rows": 26952,
+ "first_row": {
+ "LMP": "33.86",
+ "RTDTimestamp": "2026-09-07T12:55:03",
+ "intervalEnding": "2026-09-07T13:00:00",
+ "intervalId": 1,
+ "intervalRepeatHourFlag": false,
+ "repeatHourFlag": false,
+ "settlementPoint": "7RNCHSLR_ALL",
+ "settlementPointType": "RN"
+ },
+ "rows_decoded": 26952
+ },
+ {
+ "endpoint": "np6-970-cd/rtd_lmp_node_zone_hub",
+ "fixture": "np6-970-cd-history-samples.csv",
+ "file": "cdr.00013073.0000000000000000.20140501.000012.RTDLMPRNLZHUBNP6970_20140501_000001.csv",
+ "csv_rows": 6259,
+ "first_row": {
+ "LMP": "28.71",
+ "RTDTimestamp": "2014-05-01T00:00:01",
+ "intervalEnding": "2014-05-01T00:05:00",
+ "intervalId": 1,
+ "intervalRepeatHourFlag": false,
+ "repeatHourFlag": false,
+ "settlementPoint": "AMISTAD_ALL",
+ "settlementPointType": "RN"
+ },
+ "rows_decoded": 6259
+ }
+]
diff --git a/tools/inputs/history/wind-backfill-evidence.json b/tools/inputs/history/wind-backfill-evidence.json
new file mode 100644
index 00000000..1f9929eb
--- /dev/null
+++ b/tools/inputs/history/wind-backfill-evidence.json
@@ -0,0 +1,154 @@
+{
+ "startedAt": "2026-09-08T18:21:42.676789+00:00",
+ "finishedAt": "2026-09-08T19:10:02.091330+00:00",
+ "product": "NP4-732-CD",
+ "rowsCompared": 21676139,
+ "modelFieldsCompared": 35,
+ "fields": [
+ "postedDatetime",
+ "deliveryDate",
+ "hourEnding",
+ "genSystemWide",
+ "COPHSLSystemWide",
+ "STWPFSystemWide",
+ "WGRPPSystemWide",
+ "genLoadZoneSouthHouston",
+ "COPHSLLoadZoneSouthHouston",
+ "STWPFLoadZoneSouthHouston",
+ "WGRPPLoadZoneSouthHouston",
+ "genLoadZoneWest",
+ "COPHSLLoadZoneWest",
+ "STWPFLoadZoneWest",
+ "WGRPPLoadZoneWest",
+ "genLoadZoneNorth",
+ "COPHSLLoadZoneNorth",
+ "STWPFLoadZoneNorth",
+ "WGRPPLoadZoneNorth",
+ "HSLSystemWide",
+ "DSTFlag",
+ "hourEndingTimestamp",
+ "actualSystemWide",
+ "actualSouthHouston",
+ "COPHSLSouthHouston",
+ "STWPFSouthHouston",
+ "WGRPPSouthHouston",
+ "actualWestNorth",
+ "COPHSLWestNorth",
+ "STWPFWestNorth",
+ "WGRPPWestNorth",
+ "actualLoadZoneSouthHouston",
+ "actualLoadZoneWest",
+ "actualLoadZoneNorth",
+ "hourBeginningTimestamp"
+ ],
+ "archivePublications": 108275,
+ "bundlePublications": 102,
+ "uniqueOriginalPublications": 108275,
+ "bundleOnlyPublications": 0,
+ "bounds": {
+ "deliveryDate": [
+ "2016-06-21",
+ "2026-09-15"
+ ],
+ "hourBeginningTimestamp": [
+ "2015-02-04T12:00:00",
+ "2016-06-30T09:00:00"
+ ],
+ "hourEndingTimestamp": [
+ "2014-04-29T01:00:00",
+ "2015-02-08T10:00:00"
+ ]
+ },
+ "sourceLayouts": {
+ "DELIVERY_DATE,HOUR_ENDING,SYSTEM_WIDE_GEN,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,GEN_LZ_SOUTH_HOUSTON,COP_HSL_LZ_SOUTH_HOUSTON,STWPF_LZ_SOUTH_HOUSTON,WGRPP_LZ_SOUTH_HOUSTON,GEN_LZ_WEST,COP_HSL_LZ_WEST,STWPF_LZ_WEST,WGRPP_LZ_WEST,GEN_LZ_NORTH,COP_HSL_LZ_NORTH,STWPF_LZ_NORTH,WGRPP_LZ_NORTH,SYSTEM_WIDE_HSL,DSTFlag": 17086,
+ "DELIVERY_DATE,HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_LZ_SOUTH_HOUSTON,COP_HSL_LZ_SOUTH_HOUSTON,STWPF_LZ_SOUTH_HOUSTON,WGRPP_LZ_SOUTH_HOUSTON,ACTUAL_LZ_WEST,COP_HSL_LZ_WEST,STWPF_LZ_WEST,WGRPP_LZ_WEST,ACTUAL_LZ_NORTH,COP_HSL_LZ_NORTH,STWPF_LZ_NORTH,WGRPP_LZ_NORTH,DSTFlag": 64662,
+ "DELIVERY_DATE,HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_SOUTH_HOUSTON,COP_HSL_SOUTH_HOUSTON,STWPF_SOUTH_HOUSTON,WGRPP_SOUTH_HOUSTON,ACTUAL_WEST_NORTH,COP_HSL_WEST_NORTH,STWPF_WEST_NORTH,WGRPP_WEST_NORTH,DSTFlag": 7708,
+ "HOUR_BEGINNING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_SOUTH_HOUSTON,COP_HSL_SOUTH_HOUSTON,STWPF_SOUTH_HOUSTON,WGRPP_SOUTH_HOUSTON,ACTUAL_WEST_NORTH,COP_HSL_WEST_NORTH,STWPF_WEST_NORTH,WGRPP_WEST_NORTH,DSTFlag": 12064,
+ "HOUR_ENDING,ACTUAL_SYSTEM_WIDE,COP_HSL_SYSTEM_WIDE,STWPF_SYSTEM_WIDE,WGRPP_SYSTEM_WIDE,ACTUAL_SOUTH_HOUSTON,COP_HSL_SOUTH_HOUSTON,STWPF_SOUTH_HOUSTON,WGRPP_SOUTH_HOUSTON,ACTUAL_WEST_NORTH,COP_HSL_WEST_NORTH,STWPF_WEST_NORTH,WGRPP_WEST_NORTH,DSTFlag": 6755
+ },
+ "allListedArchivesIncluded": true,
+ "allTypedRowsMatchIndependentSource": true,
+ "scope": "Every row from unbounded NP4-732-CD backfill was compared field-for-field with independent stdlib CSV/date/Decimal decoding of downloaded originals. A separate pass accounted for every original CSV member, hash and row count. Captured archive IDs all appear in decoded sources; a fresh source-time-bounded listing agrees in cardinality and endpoints. These checks cover the enumerated retained publications, not continuous actual-generation observations or every ERCOT product.",
+ "limitations": [
+ "Forecast horizons overlap across publications; the row count is not a count of unique actual hours.",
+ "Dates extending after the retrieval day are forecast periods, not future actual generation.",
+ "Legacy hour-beginning/hour-ending timestamps and modern deliveryDate/hourEnding remain distinct; no UTC offset is inferred.",
+ "Newer generation fields, older actual fields and combined versus separate regional fields are preserved rather than interchanged.",
+ "Listing checks are not an atomic snapshot guarantee against retroactive changes with equal timestamps.",
+ "No claim of availability before the earliest retained source or through excluded MIS sources."
+ ],
+ "downloadsByKind": {
+ "bundle": 102,
+ "archive": 34
+ },
+ "remainingArchiveIdsDownloaded": 33813,
+ "sourceManifestSha256": "998483ebd4be2548837c58d24a34cca82149722302c4ed99c0ea06cf0d6201e0",
+ "sourceDownloadManifestSha256": "cadf325e46d2de8dd26008cb4de776b01d5e912f2f4e27b2020bf87cd39bef76",
+ "readerFilesSha256": {
+ "tinyercot/_history.py": "a9a2fcc790495bc8a6b7c643fd3a678ca23734c33f1563ce85f4264defa1f400",
+ "tinyercot/_client.py": "2882187b44b08a97a5ae4d4b73fce38db919483646ac15e9bca4fce191d79209",
+ "tinyercot/_generated.py": "4add31219447d92ec33bf16f4096a6745799d61c36b272ab2edba095e0c836c2",
+ "tools/inputs/history-formats.json": "2566844e8cebcc6b40d42813d32074d474fbd2319742457a49684e1dba66a53e"
+ },
+ "independentAccounting": {
+ "allDownloadHashesMatch": true,
+ "allOriginalMemberHashesAndRowCountsMatch": true,
+ "allBundleIdsDownloaded": true,
+ "allListedArchiveIdsDecoded": true,
+ "originalDocuments": 108275,
+ "rows": 21676139,
+ "repeatedOriginalCopies": 0,
+ "archiveListingRecords": 108276,
+ "uniqueArchiveIds": 108275,
+ "bundleListingRecords": 102
+ },
+ "boundedListingRecheck": {
+ "checkedAt": "2026-09-08T14:10:21.240724-05:00",
+ "postedTo": "2026-09-08T12:55:12",
+ "capturedListingRows": 108276,
+ "capturedUniqueIds": 108275,
+ "freshBoundedTotal": 108275,
+ "firstMeta": {
+ "totalRecords": 108275,
+ "pageSize": 1,
+ "totalPages": 108275,
+ "currentPage": 1,
+ "query": {
+ "parameterCount": 1,
+ "parameters": {
+ "postDatetimeTo": "2026-09-08T12:55:12"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "lastMeta": {
+ "totalRecords": 108275,
+ "pageSize": 1,
+ "totalPages": 108275,
+ "currentPage": 108275,
+ "query": {
+ "parameterCount": 1,
+ "parameters": {
+ "postDatetimeTo": "2026-09-08T12:55:12"
+ },
+ "sortedBy": "postDatetime: DESC"
+ }
+ },
+ "freshFirstDocument": [
+ {
+ "docId": 1272100900,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2026-09-08T12:55:12"
+ }
+ ],
+ "freshLastDocument": [
+ {
+ "docId": 446378693,
+ "friendlyName": "WPPHRLYAVGACTNP4732_csv",
+ "postDatetime": "2014-05-01T00:32:32.026000"
+ }
+ ],
+ "boundedCardinalityAndEndpointsMatch": true,
+ "limits": "Fresh bounded cardinality and endpoints agree with captured listing; not an atomic snapshot guarantee against retroactive insertions/deletions at equal timestamps."
+ }
+}
diff --git a/tools/inputs/history/workbook-evidence.json b/tools/inputs/history/workbook-evidence.json
new file mode 100644
index 00000000..56ca438a
--- /dev/null
+++ b/tools/inputs/history/workbook-evidence.json
@@ -0,0 +1,63 @@
+[
+ {
+ "endpoint": "np1-346-er/outages",
+ "fixture": "np1-346-er-history-samples.xlsx",
+ "files": [
+ "221207050015.rpt.00022912.0000000000000000.UnplannedResOutage.xlsx"
+ ],
+ "sheet_rows": {
+ "Unplanned Resource Outages": 1425
+ }
+ },
+ {
+ "endpoint": "np1-346-er/outages",
+ "fixture": "np1-346-er-history-current.xlsx",
+ "files": [
+ "UnplannedResOutage_20260907.xlsx"
+ ],
+ "sheet_rows": {
+ "Unplanned Resource Outages": 474
+ }
+ },
+ {
+ "endpoint": "np3-108/demand_response",
+ "fixture": "np3-108-history-samples.xlsx",
+ "files": [
+ "593398390.rpt.00013242.0000000000000000.20180104.080738083.Monthly_ERCOT_LoadResourceDR_17_12.xlsx"
+ ],
+ "sheet_rows": {
+ "Report Data": 96
+ }
+ },
+ {
+ "endpoint": "np3-108/demand_response",
+ "fixture": "np3-108-history-current.xlsx",
+ "files": [
+ "1270433337.rpt.00013242.0000000000000000.20260904.080058.Monthly_ERCOT_LoadResourceDR_26_08.xlsx"
+ ],
+ "sheet_rows": {
+ "CLR Report Data": 48,
+ "NCLR Report Data": 72
+ }
+ },
+ {
+ "endpoint": "np5-520-er/deployment_factors",
+ "fixture": "np5-520-er-history-samples.xlsx",
+ "files": [
+ "rpt.00025822.0000000000000000.20260104.080019.202512_MonthlyASDeployFactors.xlsx"
+ ],
+ "sheet_rows": {
+ "Monthly ASDF": 144
+ }
+ },
+ {
+ "endpoint": "np5-520-er/deployment_factors",
+ "fixture": "np5-520-er-history-current.xlsx",
+ "files": [
+ "rpt.00025822.0000000000000000.20260904.080036.202608_MonthlyASDeployFactors.xlsx"
+ ],
+ "sheet_rows": {
+ "Monthly ASDF": 144
+ }
+ }
+]
diff --git a/tools/inputs/hourly-forecasts/evidence.json b/tools/inputs/hourly-forecasts/evidence.json
new file mode 100644
index 00000000..124e890e
--- /dev/null
+++ b/tools/inputs/hourly-forecasts/evidence.json
@@ -0,0 +1,158 @@
+{
+ "checkedOn": "2026-09-08",
+ "scope": "Six main public hourly long-term load forecast workbooks, 2021-2025 publication vintages. Complete original numeric/time comparisons, not unique actual demand observations.",
+ "discovery": [
+ {
+ "title": "2021 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2021/02/05/2021_LTLF_-_Hourly.xlsx"
+ },
+ {
+ "title": "2022 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2022/02/10/2022_LTLF_Hourly.xlsx"
+ },
+ {
+ "title": "2023 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2023/01/18/2023_LTLF_Hourly.xlsx"
+ },
+ {
+ "title": "2024 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2024/07/19/2024-ERCOT-Hourly-Forecast.xlsb"
+ },
+ {
+ "title": "ERCOT Adjusted Forecast",
+ "url": "https://www.ercot.com/files/docs/2025/04/08/ErcotAdjustedForecast.xlsb"
+ },
+ {
+ "title": "TSP Provided Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2025/04/08/TSP-Provided-Hourly-Forecast.xlsb"
+ }
+ ],
+ "rows": 701294,
+ "numericValues": 32084130,
+ "verification": "Every published component cell and date/hour compared with an independent reader: openpyxl for XLSX, pyxlsb for XLSB. Runtime uses python-calamine. Nonempty original rows only; formatted trailing blanks in the 2024 workbook are excluded. Original totals, negative PV, repeated hours and differing Date/YMD columns are preserved.",
+ "decoderSha256": "8b7a6a8c201d902995aea1df638a11d4e33b5406ac0d83569c6f7c8f0bfc5461",
+ "comparisonScriptSha256": "f7fd3169d4c68c2d6d300b7cb87a9e4e40d873b712c404a5d55e8bf55afe3d31",
+ "fixtureScope": "Offline tests use first 49 original worksheet rows, including headers (48 hourly records, or 47 in 2023). Later XML row elements or XLSB row records were removed; retained row bytes and other ZIP members were not changed. Expected cells were extracted with the independent reader. These are excerpts, not full original workbooks.",
+ "fixtureScriptSha256": "7f2bc00b2e8ce54ecb786ba1f8b5ae37b0760289a500b8d150c3d3eb49980f2d",
+ "exclusions": [
+ "Eight separate weather-year regional hourly scenario workbooks. Coast original downloaded and its layout inspected only.",
+ "Winter 2025-2026 reliability-standard magnitude workbook: original downloaded and its layout inspected only.",
+ "Forecast-performance workbook families.",
+ "MIS and separate ESR API."
+ ],
+ "files": [
+ {
+ "title": "TSP Provided Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2025/04/08/TSP-Provided-Hourly-Forecast.xlsb",
+ "bytes": 48732718,
+ "sha256": "fa568bfcf146ae2694f3889674d73367292336ddb64886fc7904585a6d8870ba",
+ "rows": 175320,
+ "numericValues": 10168560,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2044-12-31",
+ "sourceDateDifferences": 0,
+ "duplicateHourLabels": 20,
+ "hoursPerDay": {
+ "23": 20,
+ "24": 7265,
+ "25": 20
+ },
+ "elapsedSeconds": 71.79,
+ "firstRow": 2
+ },
+ {
+ "title": "ERCOT Adjusted Forecast",
+ "url": "https://www.ercot.com/files/docs/2025/04/08/ErcotAdjustedForecast.xlsb",
+ "bytes": 48422999,
+ "sha256": "05f3cc81aa17a1f91a2270088a07a911e65f83764809c4fe6cea7524a41300d1",
+ "rows": 175320,
+ "numericValues": 10519200,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2044-12-31",
+ "sourceDateDifferences": 0,
+ "duplicateHourLabels": 20,
+ "hoursPerDay": {
+ "23": 20,
+ "24": 7265,
+ "25": 20
+ },
+ "elapsedSeconds": 73.63,
+ "firstRow": 2
+ },
+ {
+ "title": "2021 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2021/02/05/2021_LTLF_-_Hourly.xlsx",
+ "bytes": 12545658,
+ "sha256": "4c5041d5eea3fad0f8b0a80e9c1bf81cdc198185c136733221082867014751e5",
+ "rows": 87648,
+ "numericValues": 788832,
+ "dateFrom": "2021-01-01",
+ "dateTo": "2030-12-31",
+ "sourceDateDifferences": 9,
+ "duplicateHourLabels": 10,
+ "hoursPerDay": {
+ "23": 10,
+ "24": 3632,
+ "25": 10
+ },
+ "elapsedSeconds": 10.43,
+ "firstRow": 2
+ },
+ {
+ "title": "2022 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2022/02/10/2022_LTLF_Hourly.xlsx",
+ "bytes": 31999424,
+ "sha256": "5b0505bf3580dca9ff58fcf961ec209815f91e799461f21df77b75b211ad8e45",
+ "rows": 87664,
+ "numericValues": 2366640,
+ "dateFrom": "2022-01-01",
+ "dateTo": "2031-12-31",
+ "sourceDateDifferences": 8,
+ "duplicateHourLabels": 18,
+ "hoursPerDay": {
+ "23": 2,
+ "24": 3632,
+ "25": 18
+ },
+ "elapsedSeconds": 21.28,
+ "firstRow": 2
+ },
+ {
+ "title": "2023 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2023/01/18/2023_LTLF_Hourly.xlsx",
+ "bytes": 31400184,
+ "sha256": "a2264d0eeb828756feddffb2ada8f98b83d17abc19b6984900574ef135d7e1b7",
+ "rows": 87670,
+ "numericValues": 2366874,
+ "dateFrom": "2023-01-01",
+ "dateTo": "2032-12-31",
+ "sourceDateDifferences": 8,
+ "duplicateHourLabels": 0,
+ "hoursPerDay": {
+ "23": 2,
+ "24": 3651
+ },
+ "elapsedSeconds": 21.19,
+ "firstRow": 3
+ },
+ {
+ "title": "2024 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2024/07/19/2024-ERCOT-Hourly-Forecast.xlsb",
+ "bytes": 29792835,
+ "sha256": "63ad0b2af38496452ac5fe81e7803c605beab064d6f4422aa65c84833a2ce079",
+ "rows": 87672,
+ "numericValues": 5874024,
+ "dateFrom": "2024-01-01",
+ "dateTo": "2033-12-31",
+ "sourceDateDifferences": 8,
+ "duplicateHourLabels": 10,
+ "hoursPerDay": {
+ "23": 10,
+ "24": 3633,
+ "25": 10
+ },
+ "elapsedSeconds": 42.93,
+ "firstRow": 2
+ }
+ ]
+}
diff --git a/tools/inputs/hourly-forecasts/samples.zip b/tools/inputs/hourly-forecasts/samples.zip
new file mode 100644
index 00000000..8b214c08
Binary files /dev/null and b/tools/inputs/hourly-forecasts/samples.zip differ
diff --git a/tools/inputs/hourly-forecasts/sources.json b/tools/inputs/hourly-forecasts/sources.json
new file mode 100644
index 00000000..207b3894
--- /dev/null
+++ b/tools/inputs/hourly-forecasts/sources.json
@@ -0,0 +1,694 @@
+[
+ {
+ "title": "TSP Provided Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2025/04/08/TSP-Provided-Hourly-Forecast.xlsb",
+ "bytes": 48732718,
+ "sha256": "fa568bfcf146ae2694f3889674d73367292336ddb64886fc7904585a6d8870ba",
+ "file": "TSP-Provided-Hourly-Forecast.xlsb",
+ "fixtureSha256": "22ae6a8e3e9993030aa2c5b057e1709a46ecd869e5ba2697d508f1fe8f43ca54",
+ "fixtureBytes": 513535,
+ "groups": [
+ [
+ "baseLoad",
+ 4,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "electricVehicles",
+ 13,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "rooftopPV",
+ 22,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "largeFlexibleLoad",
+ 31,
+ [
+ "coast",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "total"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 37,
+ [
+ "coast"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 38,
+ [
+ "coast"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 39,
+ [
+ "east"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 40,
+ [
+ "east"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 41,
+ [
+ "farWest"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 42,
+ [
+ "farWest"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 43,
+ [
+ "northCentral"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 44,
+ [
+ "northCentral"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 45,
+ [
+ "north"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 46,
+ [
+ "north"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 47,
+ [
+ "southCentral"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 48,
+ [
+ "southCentral"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 49,
+ [
+ "south"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 50,
+ [
+ "south"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 51,
+ [
+ "west"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 52,
+ [
+ "west"
+ ]
+ ],
+ [
+ "net",
+ 53,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ]
+ ],
+ "firstRow": 2
+ },
+ {
+ "title": "ERCOT Adjusted Forecast",
+ "url": "https://www.ercot.com/files/docs/2025/04/08/ErcotAdjustedForecast.xlsb",
+ "bytes": 48422999,
+ "sha256": "05f3cc81aa17a1f91a2270088a07a911e65f83764809c4fe6cea7524a41300d1",
+ "file": "ErcotAdjustedForecast.xlsb",
+ "fixtureSha256": "9cec0b608d295026bf0649b0fc9b54894d0c8b27ee9a78b779b65699120a3670",
+ "fixtureBytes": 183404,
+ "groups": [
+ [
+ "baseLoad",
+ 4,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "electricVehicles",
+ 13,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "rooftopPV",
+ 22,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "largeFlexibleLoad",
+ 31,
+ [
+ "coast",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "total"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 37,
+ [
+ "coast"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 38,
+ [
+ "coast"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 39,
+ [
+ "east"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 40,
+ [
+ "east"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 41,
+ [
+ "farWest"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 42,
+ [
+ "farWest"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 43,
+ [
+ "northCentral"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 44,
+ [
+ "northCentral"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 45,
+ [
+ "north"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 46,
+ [
+ "north"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 47,
+ [
+ "southCentral"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 48,
+ [
+ "southCentral"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 49,
+ [
+ "south"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 50,
+ [
+ "south"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 51,
+ [
+ "west"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 52,
+ [
+ "west"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 53,
+ [
+ "total"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 54,
+ [
+ "total"
+ ]
+ ],
+ [
+ "net",
+ 55,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ]
+ ],
+ "firstRow": 2
+ },
+ {
+ "title": "2021 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2021/02/05/2021_LTLF_-_Hourly.xlsx",
+ "bytes": 12545658,
+ "sha256": "4c5041d5eea3fad0f8b0a80e9c1bf81cdc198185c136733221082867014751e5",
+ "file": "2021_LTLF_-_Hourly.xlsx",
+ "fixtureSha256": "beb0ae8171467eed37ff6a981ec2d41256d9ecbfce994ba20010046ea1b5e84f",
+ "fixtureBytes": 13170,
+ "groups": [
+ [
+ "forecast",
+ 5,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ]
+ ],
+ "firstRow": 2
+ },
+ {
+ "title": "2022 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2022/02/10/2022_LTLF_Hourly.xlsx",
+ "bytes": 31999424,
+ "sha256": "5b0505bf3580dca9ff58fcf961ec209815f91e799461f21df77b75b211ad8e45",
+ "file": "2022_LTLF_Hourly.xlsx",
+ "fixtureSha256": "4ac6af2bf47a755503309ea120c2f6eaccb13881517b724434515e18be53d9c7",
+ "fixtureBytes": 22832,
+ "groups": [
+ [
+ "gross",
+ 5,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "rooftopPV",
+ 14,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west"
+ ]
+ ],
+ [
+ "net",
+ 22,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "rooftopPV",
+ 31,
+ [
+ "total"
+ ]
+ ]
+ ],
+ "firstRow": 2
+ },
+ {
+ "title": "2023 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2023/01/18/2023_LTLF_Hourly.xlsx",
+ "bytes": 31400184,
+ "sha256": "a2264d0eeb828756feddffb2ada8f98b83d17abc19b6984900574ef135d7e1b7",
+ "file": "2023_LTLF_Hourly.xlsx",
+ "fixtureSha256": "89cd7e0ebb0867fb1af1f1064926a92f5d45b453fad0f73af65fca49dee1ae0f",
+ "fixtureBytes": 24012,
+ "groups": [
+ [
+ "gross",
+ 5,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "rooftopPV",
+ 14,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west"
+ ]
+ ],
+ [
+ "net",
+ 22,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "rooftopPV",
+ 31,
+ [
+ "total"
+ ]
+ ]
+ ],
+ "firstRow": 3
+ },
+ {
+ "title": "2024 ERCOT Hourly Forecast",
+ "url": "https://www.ercot.com/files/docs/2024/07/19/2024-ERCOT-Hourly-Forecast.xlsb",
+ "bytes": 29792835,
+ "sha256": "63ad0b2af38496452ac5fe81e7803c605beab064d6f4422aa65c84833a2ce079",
+ "file": "2024-ERCOT-Hourly-Forecast.xlsb",
+ "fixtureSha256": "d1170b3abd0a49a1f296e1c8ac71019e7ec9d626ae99d6a145401bcfde02890b",
+ "fixtureBytes": 1045682,
+ "groups": [
+ [
+ "baseLoad",
+ 5,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "electricVehicles",
+ 14,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "rooftopPV",
+ 23,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "largeFlexibleLoad",
+ 32,
+ [
+ "coast",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "total"
+ ]
+ ],
+ [
+ "contractedLoad",
+ 38,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "officerLetterLoad",
+ 47,
+ [
+ "coast",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "contractedFlexibleLoad",
+ 55,
+ [
+ "farWest",
+ "north",
+ "total"
+ ]
+ ],
+ [
+ "officerLetterFlexibleLoad",
+ 58,
+ [
+ "farWest",
+ "north",
+ "southCentral",
+ "west",
+ "total"
+ ]
+ ],
+ [
+ "net",
+ 63,
+ [
+ "coast",
+ "east",
+ "farWest",
+ "northCentral",
+ "north",
+ "southCentral",
+ "south",
+ "west",
+ "total"
+ ]
+ ]
+ ],
+ "firstRow": 2
+ }
+]
diff --git a/tools/inputs/live-inventory-evidence.json b/tools/inputs/live-inventory-evidence.json
new file mode 100644
index 00000000..6302edd4
--- /dev/null
+++ b/tools/inputs/live-inventory-evidence.json
@@ -0,0 +1,2083 @@
+{
+ "checkedAt": "2026-09-07T21:53:22.371002+00:00",
+ "scope": "Live public developer-portal operation list, all operation detail responses, authenticated product catalog, and generated method signatures. Compares parameter names, types, formats, values, required flags and defaults against saved inputs; checks all four generated variants against live names/types. Does not refresh every report response schema or prove historical file layouts.",
+ "operationListUrl": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api/operations?api-version=2022-04-01-preview",
+ "operationDetailUrlTemplate": "https://apiexplorer.ercot.com/developer/apis/pubapi-apim-api/operations/{id}?api-version=2022-04-01-preview",
+ "operationListPageSizes": [
+ 100,
+ 100,
+ 49
+ ],
+ "operations": 249,
+ "generatedReportQueries": 242,
+ "sharedOperations": 7,
+ "catalogProducts": 116,
+ "catalogArtifactPaths": 242,
+ "queryParameterDefinitions": 5973,
+ "generatedMethods": 968,
+ "generatedParameterAnnotations": 23408,
+ "addedOperations": [],
+ "removedOperations": [],
+ "changedParameters": [],
+ "missingCatalogArtifacts": [],
+ "retryRecoveredOperations": [
+ "getData_2d_self_arranged_as_rrspfr"
+ ],
+ "operationsInputSha256": "49244f7c16e377af7bf0cb03b247207c1b6205fc6f9b0079630b4ec4d0cb35c0",
+ "generatedFileSha256": "4add31219447d92ec33bf16f4096a6745799d61c36b272ab2edba095e0c836c2",
+ "catalogSha256": "a847cab14476319d13782a6840a7fbcd402b0eaa9146d2092ab01fc6e1083ccc",
+ "operationDetails": [
+ {
+ "id": "getData_2d_agg_edc",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_edc",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "3d5cf5724463bc2f887337bce053b1927922bbb45fd20de3e3023487cd7adb6a"
+ },
+ {
+ "id": "getData_2d_agg_edc_houston",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_edc_houston",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "a2ef3f278a4ac25f25c09bf854559fb02b434f6143948f22115132178f72c945"
+ },
+ {
+ "id": "getData_2d_agg_edc_north",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_edc_north",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "35d9b702ed3882d1602004487bfa8877457e82551775c811a51cc892a5e457e6"
+ },
+ {
+ "id": "getData_2d_agg_edc_south",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_edc_south",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "90625bda79263f73720b54dafe78029ffa30bcfd1fb6544e6091fa6aa13546d8"
+ },
+ {
+ "id": "getData_2d_agg_edc_west",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_edc_west",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "e073b70b32bfe544a88f9468b23f0dc049d35def429a32a41f76b369353bf9e4"
+ },
+ {
+ "id": "getData_2d_agg_esc",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_esc",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "721efda7f80fafeab714cffa08318044217f49eb5737308d532bcb2a1c42fda8"
+ },
+ {
+ "id": "getData_2d_agg_esc_houston",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_esc_houston",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "38c979b8913d0fb0a0cede71b53154f93b69c50c10ed671b36337cfd44103ba1"
+ },
+ {
+ "id": "getData_2d_agg_esc_north",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_esc_north",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "f9e00dd97ada5c02b6c7f4ff4f5132620491d9d63ef087cced577c47f5317937"
+ },
+ {
+ "id": "getData_2d_agg_esc_south",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_esc_south",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "d830c54133045612df2176afcf7f0f8ce3607bc6d2c3573f419d658aa15d24c4"
+ },
+ {
+ "id": "getData_2d_agg_esc_west",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_esc_west",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "e48de52337f04ca58f998d87ecba1cc0a6c6794859da4340a5d14b1125d6cc93"
+ },
+ {
+ "id": "getData_2d_agg_min_esc",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_min_esc",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "16d677346dac4c9babb09b1e23315721ec73d66ea0a21cc832d3020547baa6bb"
+ },
+ {
+ "id": "getData_2d_agg_min_esc_houston",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_min_esc_houston",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "edada6f91edb6b33aeac306a4b8bf0dd5a2e4ccf15d35d722c136e470f57d8d9"
+ },
+ {
+ "id": "getData_2d_agg_min_esc_north",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_min_esc_north",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "cd0d9a7c08d3e8968b9060079ec4a40d7564585d98b63041f3b47762ad66b292"
+ },
+ {
+ "id": "getData_2d_agg_min_esc_south",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_min_esc_south",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "7f0626c9e97327269cb38f4310931da15dafc6a5237671e096eb8709dcae5354"
+ },
+ {
+ "id": "getData_2d_agg_min_esc_west",
+ "method": "GET",
+ "path": "/np3-907-ex/2d_agg_min_esc_west",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "0ca1619a3c8f50a8250f5a5a333a2e955c6210971f536b185afac3bd5fca5df1"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_ecrsm",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_ecrsm",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "72f3e6ba4ab2529f61a543854653b9e64cd9869b0593256711ef99a95dbce43f"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_ecrss",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_ecrss",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "2c7a00564c310f0b90313b7b133d39831f9fd00612f3c8976d4d0bb5401f7d8d"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_nspin",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_nspin",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "76f9208a287efb807ebe54bf53bca8a6c333c099660d73fba423c3a0fd08bed4"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_nspnm",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_nspnm",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "a4986b31adda13f002215735a096b1fa6379a55ab946810f83f778afc3fe7d49"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_regdn",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_regdn",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "0acb07ab16a0931a4fe80d5ef56350aedc805779faa0da94ec157a60bf9814b6"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_regup",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_regup",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "8c3539104ed484cc87f9f28e19860109edebf811157fb9ced7098b656459cf87"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_rrsffr",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_rrsffr",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "d6de205242002ba5da2eee9d7e9bd758f8a7a5bf67cb9c1e996ee28aa7d49f1d"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_rrspfr",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_rrspfr",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "61d8864ce1583f8016693cad26becc54e494de21bbf3d229dbfab7f4a0d5d388"
+ },
+ {
+ "id": "getData_2day_agg_sced_as_offers_rrsufr",
+ "method": "GET",
+ "path": "/np3-906-ex/2day_agg_sced_as_offers_rrsufr",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "88badd782720259d42cc4f5457359392984035120bbf005a1454dca7418b3a4e"
+ },
+ {
+ "id": "getData_2d_agg_esc_esr",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_esr",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "29ac324040aa9302cc66c79ced956443a3f0e8f33ec241b6bd9609a21c4be1c9"
+ },
+ {
+ "id": "getData_2d_agg_esc_esr_houston",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_esr_houston",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "53afac4884778b0da64bdd4175e34479554e5474634f70b828545f03f7532406"
+ },
+ {
+ "id": "getData_2d_agg_esc_esr_north",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_esr_north",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "4237b36b8ccfa05696ffc4ee82bfd3b196ef961f84d2ba8b1ca4957814d7ad3b"
+ },
+ {
+ "id": "getData_2d_agg_esc_esr_south",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_esr_south",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "788529da4f19082d30b20eca6106ff22a3ba61bd9d5e2d428b74c94b1dde780a"
+ },
+ {
+ "id": "getData_2d_agg_esc_esr_west",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_esr_west",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "9f8cd3e8a7f79de532feaec9ef1ac8ebdc64ad5d1bc5023c10802ef13b70fabe"
+ },
+ {
+ "id": "getData_2d_agg_esc_nonirr_houston",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_nonirr_houston",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "4257342efbc38e7a36bc2f538a0a970e2c60fd01fdb808c62044eb4d4553f141"
+ },
+ {
+ "id": "getData_2d_agg_esc_nonirr_north",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_nonirr_north",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "29c17f65e24b068c2599526ed3886651e6cba08e98e03033cc9edc085dc562b3"
+ },
+ {
+ "id": "getData_2d_agg_esc_nonirr_south",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_nonirr_south",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "a0b58155648f1eae9ed1930ecedf1f6c0f7f737f88cc714ec34199828456571e"
+ },
+ {
+ "id": "getData_2d_agg_esc_nonirr_west",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_nonirr_west",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "817d03dc9a7c9b7aa583f910c5b04e31ee2f75f72ac1c1d0a76b62f36eeb03e4"
+ },
+ {
+ "id": "getData_2d_agg_esc_pvgr",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_pvgr",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "b61be0fff4cc2abf81f81d4b168639da5476adb076419f3b2ad9cdc5653cb750"
+ },
+ {
+ "id": "getData_2d_agg_esc_pvgr_houston",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_pvgr_houston",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "6cf59a6e7ac218d9a5edf9634df74e9579cfb1322ac49c567d8585b9c9d146f7"
+ },
+ {
+ "id": "getData_2d_agg_esc_pvgr_north",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_pvgr_north",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "9e87380da79a4b8dd9bf21812618082e7f984e5ce3d0a6c64814354b51513c36"
+ },
+ {
+ "id": "getData_2d_agg_esc_pvgr_south",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_pvgr_south",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "595376388e9861667780bbeb1662f2d4e510c5e5bbc46210d2bfacfbcc02582d"
+ },
+ {
+ "id": "getData_2d_agg_esc_pvgr_west",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_pvgr_west",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "13069a65f15f61194935d202da63859b87fe310eb8224a3c315297827285c7cd"
+ },
+ {
+ "id": "getData_2d_agg_esc_wind",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_wind",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "d8613349d705b2aea2d3a5d10e08b0fa765ccabf5c6e81feb67309de5a7787df"
+ },
+ {
+ "id": "getData_2d_agg_esc_wind_houston",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_wind_houston",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "ebb7e6a3f49a6a2b68ad6d7821b01824f3be29759c3b0a9b1d71d355206650b0"
+ },
+ {
+ "id": "getData_2d_agg_esc_wind_north",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_wind_north",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "3c5907daec8f73e790a4510800939351b6299c377352038f6dfe91de77c4ec35"
+ },
+ {
+ "id": "getData_2d_agg_esc_wind_south",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_wind_south",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "05bbafb21967a17cd2da4d108674aa10a92ab6e0acbadf124b6052b4fb230e1f"
+ },
+ {
+ "id": "getData_2d_agg_esc_wind_west",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_wind_west",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "27035ef32c72cf670e9c57f9d872bc5d664a7df9c58cebf5d8d22e6dbdf81116"
+ },
+ {
+ "id": "getData_2d_agg_esc_nonirr",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_esc_nonirr",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "8a37b1198788830963ccffe51c696388b8a89b190c0a04096f8e4600b159a0a9"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_ecrsm",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_ecrsm",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "1a489c857ae696f71a4064e11f493c2852ee56245e297f26ec9917d77a9b2858"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_ecrss",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_ecrss",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "471593e6921377d8c4057ac699f9d5787924c849c7c4dbf3072032988dafd890"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_offns",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_offns",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "7a713aca508849dbd02416d5fab56c0ec71ff8c5019f1b5da4381cee4e4b9ab5"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_onns",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_onns",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "c2f10d8ab82492a9553514c275bf30cec7cb63ffb4f07b23e53ef4119a527e21"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_regdn",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_regdn",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "c1b0fa45bd5d37e2baa5aaf0ac4a90c7d904d5909eb1333633a8510935b866d2"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_regup",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_regup",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "ab4030e54a953a2536df348385b9600ffd227ec600e06f93caeac675183278ab"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_rrsffr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_rrsffr",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "f50b4c152aeb62f1eb3c2af88bd8cfcdd8023b7120d20672ffe9937fefcc7b42"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_rrspfr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_rrspfr",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "1bfd13599e0b19911bad14d9fb10b80b8faa514a8412d239c9e3309d1d54d754"
+ },
+ {
+ "id": "getData_2d_agg_as_offers_rrsufr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_as_offers_rrsufr",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "55ba1f5e61baa4df25bcab9f06c10dc6ebaa9d0a5d1614603651e1f20529a083"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_ecrsm",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_ecrsm",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "35b552822dc09553b120dea0f868fae834b2b8d2fbf828d854fbb7f24f5d5963"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_ecrss",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_ecrss",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "96a0894e7fce4924765cd7f1a73ba88a11baf9b74ee89db855d8d5f7e72844bd"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_nspin",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_nspin",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "d51d8d66a1e2ca0f8042bb84b8f52e83183b5d276e59067b1899270e0b1b0490"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_nspnm",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_nspnm",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "991e5e76e1fbb9a515193a7afdf663362a599d1883d21a35ed9645013472b8be"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_regdn",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_regdn",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "49b721d69e465a72f4dee144b05362add4aa9ac8d6671956c41816726b1653b5"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_regup",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_regup",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "a0cc417751fcb7a2081e37db8e2a2d7d5022bdf812d763fafadfcd53a06c41d1"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_rrsffr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_rrsffr",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "f975f2567c0fa96de846d84c3ee49c5a7911b8c5f8a69ea720ef6cd857d9e048"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_rrspfr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_rrspfr",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "55d11d4b15c48c0cc81436ed403b38c6beff23ddf880dc1b8ba4f0f859086617"
+ },
+ {
+ "id": "getData_2d_agg_dam_as_offers_rrsufr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_agg_dam_as_offers_rrsufr",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "569cf4249f5e573ff224210ffc63b98409b73e39a36c89f03bd8e858065cace6"
+ },
+ {
+ "id": "getData_2d_agg_dsr_loads",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_dsr_loads",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "c189a83129df57f6b0f32142a06b8cf67c99d82765ae8847cc3725be37825a0d"
+ },
+ {
+ "id": "getData_2d_agg_edc_clr",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_edc_clr",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "ff14a1fed53b5f0d22f86d9b5d914447c2b53df54c170b97fe9de544af967a1b"
+ },
+ {
+ "id": "getData_2d_agg_edc_clr_houston",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_edc_clr_houston",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "98a669b0653f06afb31bd8267c34b83457ae2d0fae5a44f2869c12ad81e456b3"
+ },
+ {
+ "id": "getData_2d_agg_edc_clr_north",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_edc_clr_north",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "25e0590a93083e4e48801f43d241245d7aaab693684ee2220e33b9c84edeef57"
+ },
+ {
+ "id": "getData_2d_agg_edc_clr_south",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_edc_clr_south",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "0404f5ba20904df1afdd779aa0a117c1ae01667cd6a3acd1f0c644424b8f4d30"
+ },
+ {
+ "id": "getData_2d_agg_edc_clr_west",
+ "method": "GET",
+ "path": "/np3-908-er/2d_agg_edc_clr_west",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "ce862a922574547a66aef85b084be9b024f3f3ea559feab378d89d3b957eff62"
+ },
+ {
+ "id": "getData_2d_agg_gen_summary",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_gen_summary",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "b2ca4673501bcd8b3d248c6cc5d012f755a1fc5dd984550628b0d41d02e05da6"
+ },
+ {
+ "id": "getData_2d_agg_gen_summary_houston",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_gen_summary_houston",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "78ce2ba7ee6b4c2e0c2546a4fb2e1f9d2eae6c454cc41668685e0a22cb8a326c"
+ },
+ {
+ "id": "getData_2d_agg_gen_summary_north",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_gen_summary_north",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "8c37f1a42ccf1d399c95cadc3bbe2dfeafbef721626b520c6b0e34749dd3a47a"
+ },
+ {
+ "id": "getData_2d_agg_gen_summary_south",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_gen_summary_south",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "b150f9ae987399e529d9727366052bdf71e7f14a05dd71e83ff4b0fce7d87fcb"
+ },
+ {
+ "id": "getData_2d_agg_gen_summary_west",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_gen_summary_west",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "a454c1a4779508a2751d1bd60e602393aaf8391000dd8c8604c07f22e0760af5"
+ },
+ {
+ "id": "getData_2d_agg_load_summary",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_load_summary",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "3a3bd174797d38f79bfcb382e2d9eaa55ebf376a4e85b95fa9b1d0f987806b6c"
+ },
+ {
+ "id": "getData_2d_agg_load_summary_houston",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_load_summary_houston",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "9334126c9d1098d41c550bd9540498aa9c718ca012f04bec7cd912ab1e5395aa"
+ },
+ {
+ "id": "getData_2d_agg_load_summary_north",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_load_summary_north",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "c21602f0892fb625e5a2bc6c87d4b3f4299c64f6710f7721afb6796f612db03a"
+ },
+ {
+ "id": "getData_2d_agg_load_summary_south",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_load_summary_south",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "c679821b69115bca7261136ad8aee4e39ef43c59b3bfb33e9b9dc7a2c7c418d9"
+ },
+ {
+ "id": "getData_2d_agg_load_summary_west",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_load_summary_west",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "25014f9ccf9963b3356da30a234268433f6dc7f42a6e5e756689ed7f503a3c74"
+ },
+ {
+ "id": "getData_2d_agg_out_sched",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_out_sched",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "fd6068f075e521598557dfc8d597f222e669854c3f8d24e33db6b29c0b4c7b41"
+ },
+ {
+ "id": "getData_2d_agg_out_sched_houston",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_out_sched_houston",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "10499f8c5702bc7d07c8894d945d2616d4759400597d55c18d422e78d4e2d058"
+ },
+ {
+ "id": "getData_2d_agg_out_sched_north",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_out_sched_north",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "e3cc8af6ad14f89f7a002421ec2604f037934e95e1a26026fefab47ec7c60ca0"
+ },
+ {
+ "id": "getData_2d_agg_out_sched_south",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_out_sched_south",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "73ff8a9a1e076e378e74021a0794cb928b182eec1ef68ca3ddb4ea30ae2650a4"
+ },
+ {
+ "id": "getData_2d_agg_out_sched_west",
+ "method": "GET",
+ "path": "/np3-910-er/2d_agg_out_sched_west",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "6818da590cc95e640c56d42970883b0ece745f082536cfd747f15c154b14c658"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_ecrsm",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_ecrsm",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "217dc13d3e6a44f121d6ee0aaddaac812891b9ed34882cebb53d82e13761ba72"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_ecrss",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_ecrss",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "0007aca911355d115c28af2157624ecfad2469d7d462880d65a59d52e50afd27"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_nspin",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_nspin",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "91a60d5f385fddbbefba0227526bb23dfd8c658ebfdceb2699dbdb225644c7ac"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_nspnm",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_nspnm",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "a0aaea88128af8c056d2aa8bce253cd56279aa251e1ef68f35f5a9c6607dba0c"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_regdn",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_regdn",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "ee5d97753677b32b6011437ea98d7b427129aef593a6a58ba1f3a7df5e302f85"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_regup",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_regup",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "a76857608cef710c5bd321354e9d5e4661fccb258771a88ccff3248356d75b5b"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_rrsffr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_rrsffr",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "ae569f761076d7bc97199ad0f74ec58d97b0f0a912048687cc01d7a3abac531c"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_rrspfr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_rrspfr",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "262dee1390ba373ed06f33b96bc5fb50c57efd37ca14c5a976f62c1033d76f68"
+ },
+ {
+ "id": "getData_2d_cleared_dam_as_rrsufr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_cleared_dam_as_rrsufr",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "bb97334b6198d22a1e04d705eb18e0a3b573660252181dec75ceccf90a7e51cc"
+ },
+ {
+ "id": "getData_2d_ptp_obl_bids",
+ "method": "GET",
+ "path": "/np3-909-er/2d_ptp_obl_bids",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "9152a23dddd9b3d77269bd1104eb1d483552bf9bc371f809ef2b33f358a4c4a3"
+ },
+ {
+ "id": "getData_2d_ptp_obl_bids_houston",
+ "method": "GET",
+ "path": "/np3-909-er/2d_ptp_obl_bids_houston",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "5da8350f775855b275ee8a301cd9b285690c1082f5f6fd0922c9684be1cb57b0"
+ },
+ {
+ "id": "getData_2d_ptp_obl_bids_north",
+ "method": "GET",
+ "path": "/np3-909-er/2d_ptp_obl_bids_north",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "6f9e02d9c2f29dcc9f7b1e84b6f183b4ee6a44797814fbacbf49364e2c08a78c"
+ },
+ {
+ "id": "getData_2d_ptp_obl_bids_south",
+ "method": "GET",
+ "path": "/np3-909-er/2d_ptp_obl_bids_south",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "717c5359b3f346de394c248728e1e14de5cfb39a0823e524bf691c19c3a93995"
+ },
+ {
+ "id": "getData_2d_ptp_obl_bids_west",
+ "method": "GET",
+ "path": "/np3-909-er/2d_ptp_obl_bids_west",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "afc0e8abf57fa7881beb614bcea661e67bfc11dd80cc782323f141c39ec132a8"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_ecrsm",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_ecrsm",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "3bfac460aec94611c77ac9c152ed887bfb42f36d9fbf19c5ab3ec20f397179e8"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_ecrss",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_ecrss",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "44ad2ad01ffac0e46bad342f8579486af79f1b7d068bf2bfdec7e7304ab472e6"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_nspin",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_nspin",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "0a61012dfcf5a2eecfa6dbf8f5b6ffe316de18ec0c685149a7c271865b2f3061"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_nspnm",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_nspnm",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "b04cd0cf371201492ab46367479070fe955c49fa00e7f7bb498dfd947dd2080a"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_regdn",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_regdn",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "8751577e038d84dbfc76011340cacc072893ce65aac39fd0a9ba035bdad9eac2"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_regup",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_regup",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "740c74a62a5fbf05497df7044e6b71f7a8b2473eee42d5ce710e751384d1f256"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_rrsffr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_rrsffr",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "8bfa165f24385959cbf10c086fdc9868be04758e403767827d803288df6e0f63"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_rrspfr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_rrspfr",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "c56595df80380318a6ace2c946b82dc415a302bd81f3fba7124e25ff389d613e"
+ },
+ {
+ "id": "getData_2d_self_arranged_as_rrsufr",
+ "method": "GET",
+ "path": "/np3-911-er/2d_self_arranged_as_rrsufr",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "292492cac2549bc1d96234f9b0d3ee4387abace423dc29b439fa2b06af5dd4b0"
+ },
+ {
+ "id": "getData_2d_total_cleared_energy_bids_offers",
+ "method": "GET",
+ "path": "/np3-909-er/2d_total_cleared_energy_bids_offers",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "71f9aa305b8557d57368f4f2a482cd4e57707dcfc77a1bc9cfc5a09d353a9bfc"
+ },
+ {
+ "id": "getData_2d_total_cleared_energy_bids_offers_houston",
+ "method": "GET",
+ "path": "/np3-909-er/2d_total_cleared_energy_bids_offers_houston",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "64b0bf3c775ed933fe5f62d6d0a7dd38c6bd28406460106db5704a2185717adf"
+ },
+ {
+ "id": "getData_2d_total_cleared_energy_bids_offers_north",
+ "method": "GET",
+ "path": "/np3-909-er/2d_total_cleared_energy_bids_offers_north",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "121fcb1759db7c2d5b88090436cfae078d73d9c04008ed2a6a62c4d34a3b9260"
+ },
+ {
+ "id": "getData_2d_total_cleared_energy_bids_offers_south",
+ "method": "GET",
+ "path": "/np3-909-er/2d_total_cleared_energy_bids_offers_south",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "8a25669ecf29310775e3ad8342caa5e55c63e5d18750f441ddac6be2ad8b6ea4"
+ },
+ {
+ "id": "getData_2d_total_cleared_energy_bids_offers_west",
+ "method": "GET",
+ "path": "/np3-909-er/2d_total_cleared_energy_bids_offers_west",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "40d34e50d74a745fb5fb4a2ce5c5ddfc4583d35e2cbb95efebb9953f341b334b"
+ },
+ {
+ "id": "getData_3d_dam_high_as_offers",
+ "method": "GET",
+ "path": "/np3-915-ex/3d_dam_high_as_offers",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "75f5936b64716d30a2909bfe6be29b9a34955b8f13821eefb6c7b9d510b19c3b"
+ },
+ {
+ "id": "getData_3d_high_price_bids_sel_disp_sced",
+ "method": "GET",
+ "path": "/np3-257-ex/3d_high_price_bids_sel_disp_sced",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "8f9343c1674ce67a69373a343087046b2ea95da1d15f5b018c758e4a7087ef4c"
+ },
+ {
+ "id": "getData_3d_highest_price_offer_sced",
+ "method": "GET",
+ "path": "/np3-916-ex/3d_highest_price_offer_sced",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "6e93fceb07641551b9e190cf4a048aad7b6edcf62ee3fbdf4d21bb4f3c113155"
+ },
+ {
+ "id": "getData_3d_sced_high_as_offers",
+ "method": "GET",
+ "path": "/np3-914-ex/3d_sced_high_as_offers",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "42a057e9ddca2a04a3dad54115424dd98ac4c7e27b47a6009d7a91a73e9e0d5e"
+ },
+ {
+ "id": "getData_60d_sced_resource_as_offers",
+ "method": "GET",
+ "path": "/np3-965-er/60d_sced_resource_as_offers",
+ "queryParameterDefinitions": 105,
+ "detailSha256": "5a9723c06515b5227da021fceff11f82ef7695e2a3a6f0083558627ebf501ac5"
+ },
+ {
+ "id": "getData_60d_sced_as_cap_man_override",
+ "method": "GET",
+ "path": "/np3-965-er/60d_sced_as_cap_man_override",
+ "queryParameterDefinitions": 19,
+ "detailSha256": "d1ae38301fbae7d1ccbcc2854eddd75cb8b78d140f45d02b75ef5fbde5872f15"
+ },
+ {
+ "id": "getData_60_cop_adj_period_snapshot",
+ "method": "GET",
+ "path": "/np1-301/60_cop_adj_period_snapshot",
+ "queryParameterDefinitions": 38,
+ "detailSha256": "c6a7d5f87b951640488b97356a85a1284b403f4b74dded99c10308cafe18436e"
+ },
+ {
+ "id": "getData_60_cop_all_updates",
+ "method": "GET",
+ "path": "/np3-991-ex/60_cop_all_updates",
+ "queryParameterDefinitions": 43,
+ "detailSha256": "de680ca9bfbd92b3290fc820ec88547c5afb7c84a52b0f301f4fd9cbd84e9bc9"
+ },
+ {
+ "id": "getData_60d_dam_as_only_awards",
+ "method": "GET",
+ "path": "/np3-966-er/60d_dam_as_only_awards",
+ "queryParameterDefinitions": 25,
+ "detailSha256": "791155a54b06d7499bffe2e4e035eeda60c3b175457da80e116d8fd2f7be1b66"
+ },
+ {
+ "id": "getData_60d_dam_as_only_offers",
+ "method": "GET",
+ "path": "/np3-966-er/60d_dam_as_only_offers",
+ "queryParameterDefinitions": 31,
+ "detailSha256": "da72a306383b0b099fba3b3991ebceba0aab8cd11fb264afb9bb395c594f0976"
+ },
+ {
+ "id": "getData_60_dam_energy_bid_awards",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_energy_bid_awards",
+ "queryParameterDefinitions": 15,
+ "detailSha256": "bb666a31b23f01ea6b6bc1bd01fff038bffdab027e80efba14bfc247cee4041a"
+ },
+ {
+ "id": "getData_60_dam_energy_bids",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_energy_bids",
+ "queryParameterDefinitions": 54,
+ "detailSha256": "11956c8707b309852224754b2f76f4477a9d965c08b23e85b8ef23ab81c19f7e"
+ },
+ {
+ "id": "getData_60_dam_energy_only_offer_awards",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_energy_only_offer_awards",
+ "queryParameterDefinitions": 15,
+ "detailSha256": "c0cce25de8a1c28e81584be26e6c30ea6a1f1fdb3b5d722ab6f16d9b7a44194b"
+ },
+ {
+ "id": "getData_60_dam_energy_only_offers",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_energy_only_offers",
+ "queryParameterDefinitions": 54,
+ "detailSha256": "b1e5a02fe7f28b89645f4ee126aa07471b91bb96886aa14ffe661adb12c62098"
+ },
+ {
+ "id": "getData_60d_dam_esr_as_offers",
+ "method": "GET",
+ "path": "/np3-966-er/60d_dam_esr_as_offers",
+ "queryParameterDefinitions": 117,
+ "detailSha256": "e73b394fa064c2c677a4d17b14e2dae156cd599d72567216eadc25f68bbbc0a4"
+ },
+ {
+ "id": "getData_60d_dam_esr_data",
+ "method": "GET",
+ "path": "/np3-966-er/60d_dam_esr_data",
+ "queryParameterDefinitions": 94,
+ "detailSha256": "05a75ca6dd7e0b92856c9933da789a45156f7e6b36a265ab149393c613646bbf"
+ },
+ {
+ "id": "getData_60_dam_gen_res_data",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_gen_res_data",
+ "queryParameterDefinitions": 94,
+ "detailSha256": "3f1be08d80a371e29a0f536814a0c5dfe744079a6c596f67dd8b203c06512c9d"
+ },
+ {
+ "id": "getData_60_dam_gen_res_as_offers",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_gen_res_as_offers",
+ "queryParameterDefinitions": 117,
+ "detailSha256": "2b2943060dbcbf5f7d2aefa557b927834d1a243fae48c962ffddaa4dcbbd2059"
+ },
+ {
+ "id": "getData_60_dam_load_res_data",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_load_res_data",
+ "queryParameterDefinitions": 39,
+ "detailSha256": "5cfcddde3b3d2e744d90ebf083066b47b4ab7b365cbeb1623c4ae14d4890fdb6"
+ },
+ {
+ "id": "getData_60_dam_load_res_as_offers",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_load_res_as_offers",
+ "queryParameterDefinitions": 118,
+ "detailSha256": "d4ed44b425ab9f79254454b76421cd8919de569754ab428c6f107d8dc18f884d"
+ },
+ {
+ "id": "getData_60_dam_ptp_obl_bid_awards",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_ptp_obl_bid_awards",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "42710c75da74a11fec418c9db65289719bc8b06f6ff51aabcd319bbe052e1b77"
+ },
+ {
+ "id": "getData_60_dam_ptp_obl_bids",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_ptp_obl_bids",
+ "queryParameterDefinitions": 17,
+ "detailSha256": "fd2ebbaafcc5e40a7a27efca001dff8fd26c16fd1aa051b87f1495366e0365b7"
+ },
+ {
+ "id": "getData_60_dam_ptp_obl_opt",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_ptp_obl_opt",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "8bba077c855fc7a1ddbb9b79295589de40ad763c1bfc018ddd6a767d6fa75f6c"
+ },
+ {
+ "id": "getData_60_dam_ptp_obl_opt_awards",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_ptp_obl_opt_awards",
+ "queryParameterDefinitions": 17,
+ "detailSha256": "4f715cfe3de1b0f0adc660465cc359590b6d20ebd7e42fd8d2bfd69c0edabcb7"
+ },
+ {
+ "id": "getData_60_dam_qse_self_as",
+ "method": "GET",
+ "path": "/np3-966-er/60_dam_qse_self_as",
+ "queryParameterDefinitions": 27,
+ "detailSha256": "1d62aa5f71e5201058c5832faede063ce779ab08c77b2dd1f35d265e1cad8338"
+ },
+ {
+ "id": "getData_60d_sced_esr_data",
+ "method": "GET",
+ "path": "/np3-965-er/60d_sced_esr_data",
+ "queryParameterDefinitions": 392,
+ "detailSha256": "b7325296e32ae57b1e5eb8d7d6cfe306083db3b95a32a52f75f736ac4bf45917"
+ },
+ {
+ "id": "getData_60_hdl_ldl_man_override",
+ "method": "GET",
+ "path": "/np3-965-er/60_hdl_ldl_man_override",
+ "queryParameterDefinitions": 22,
+ "detailSha256": "f57689e028328521fdd2ee43ca2949baf9d84ed151b775bff84c21689dd149b1"
+ },
+ {
+ "id": "getData_60_load_res_data_in_sced",
+ "method": "GET",
+ "path": "/np3-965-er/60_load_res_data_in_sced",
+ "queryParameterDefinitions": 101,
+ "detailSha256": "6db99bbb220fa4d83e0f8b303e085fc5becbc66cccac4cbb11bd5824cf280828"
+ },
+ {
+ "id": "getData_60_sced_qse_self_arranged_as",
+ "method": "GET",
+ "path": "/np3-965-er/60_sced_qse_self_arranged_as",
+ "queryParameterDefinitions": 26,
+ "detailSha256": "585c5e210cb08ec11005e53101a833abf2f7e0546f4d15ac67d701529e1d51ae"
+ },
+ {
+ "id": "getData_60_sasm_gen_res_as_offer_awards",
+ "method": "GET",
+ "path": "/np3-990-ex/60_sasm_gen_res_as_offer_awards",
+ "queryParameterDefinitions": 38,
+ "detailSha256": "887738c7dd9f7ca274394f286965bd6af962e6e92b05d063c19399564bc77c0b"
+ },
+ {
+ "id": "getData_60_sasm_gen_res_as_offers",
+ "method": "GET",
+ "path": "/np3-990-ex/60_sasm_gen_res_as_offers",
+ "queryParameterDefinitions": 119,
+ "detailSha256": "7fcf1d0268267b99cecdd643575a0e1ed68cc91b782e31b8f17f12f72f31e32d"
+ },
+ {
+ "id": "getData_60_sasm_load_res_as_offer_awards",
+ "method": "GET",
+ "path": "/np3-990-ex/60_sasm_load_res_as_offer_awards",
+ "queryParameterDefinitions": 38,
+ "detailSha256": "b6e641cc0861264e12045a2bed422ba5d83073ef8ab8c6178024b934661f9177"
+ },
+ {
+ "id": "getData_60_sasm_load_res_as_offers",
+ "method": "GET",
+ "path": "/np3-990-ex/60_sasm_load_res_as_offers",
+ "queryParameterDefinitions": 119,
+ "detailSha256": "e6e32bdcea7ddbd3baa142ce1f22b16660477100e23571fcb6616ab7eb64d427"
+ },
+ {
+ "id": "getData_60d_sced_as_offer_updates",
+ "method": "GET",
+ "path": "/np3-965-er/60d_sced_as_offer_updates",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "2f6f122c6eee71f352386f93b4dadffd2e8de69f661721711872330ceb1f199b"
+ },
+ {
+ "id": "getData_60_sced_dsr_load_data",
+ "method": "GET",
+ "path": "/np3-965-er/60_sced_dsr_load_data",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "2c801d944a566a2ba2efd333331e5b8b0a7aedc673884308f9b986cfd7e43663"
+ },
+ {
+ "id": "getData_60_sced_eoc_updates_in_ophour",
+ "method": "GET",
+ "path": "/np3-965-er/60_sced_eoc_updates_in_ophour",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "340a4c932527b052141e752c6fa992befa2fabba7ab4a0b78d5f8d0d12f8726e"
+ },
+ {
+ "id": "getData_60_sced_gen_res_data",
+ "method": "GET",
+ "path": "/np3-965-er/60_sced_gen_res_data",
+ "queryParameterDefinitions": 386,
+ "detailSha256": "504a840c28c3895f5161b2f3fe3b52b96d2e58f2b1b96d234326e51f0e700b2c"
+ },
+ {
+ "id": "getData_60_sced_smne_gen_res",
+ "method": "GET",
+ "path": "/np3-965-er/60_sced_smne_gen_res",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "b02778f0444c60967233eae0d57d43e50fa51954445e7f01becf2d6d5640c55d"
+ },
+ {
+ "id": "getData_7d_trig_mcpc_50xfip",
+ "method": "GET",
+ "path": "/np3-987-ex/7d_trig_mcpc_50xfip",
+ "queryParameterDefinitions": 121,
+ "detailSha256": "29a71cd02c09ce1bd67f4996e3aeb6d6d644141ef33399bf392dd1d276408121"
+ },
+ {
+ "id": "getData_7d_trig_lmp_50xfip",
+ "method": "GET",
+ "path": "/np3-987-ex/7d_trig_lmp_50xfip",
+ "queryParameterDefinitions": 194,
+ "detailSha256": "6dc873df601615da421d67c2f1260c2f53b5c40523f48d7f71889ddce04be556"
+ },
+ {
+ "id": "getData_7d_trig_rtm_mcpc_50xfip",
+ "method": "GET",
+ "path": "/np3-987-ex/7d_trig_rtm_mcpc_50xfip",
+ "queryParameterDefinitions": 92,
+ "detailSha256": "5c14f2c342eb64fff6e0867dc61cc99e3150a8e2b3a08d0092096ed3a071b3c7"
+ },
+ {
+ "id": "getData_act_sys_load_by_fzn",
+ "method": "GET",
+ "path": "/np6-346-cd/act_sys_load_by_fzn",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "ebbf0541547029237d178697bf2eb950297e5e205ebdac5188f3e1336b711e90"
+ },
+ {
+ "id": "getData_act_sys_load_by_study_area",
+ "method": "GET",
+ "path": "/np6-344-cd/act_sys_load_by_study_area",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "332581a78ef163309c289972b0e8e9692b1535ac247006f5b54712e01a2c0b6b"
+ },
+ {
+ "id": "getData_act_sys_load_by_wzn",
+ "method": "GET",
+ "path": "/np6-345-cd/act_sys_load_by_wzn",
+ "queryParameterDefinitions": 26,
+ "detailSha256": "10a8dca4d628ce61226925f75c90ff9c161cc3fa9130fb7444acb07f3c55ab8e"
+ },
+ {
+ "id": "getListForProducts",
+ "method": "GET",
+ "path": "/",
+ "queryParameterDefinitions": 0,
+ "detailSha256": "0f92e8368c8be7fce8141bc005cbcd8c0d01cdfab49acda21dc1c9eb30136580"
+ },
+ {
+ "id": "getData_as_obligation",
+ "method": "GET",
+ "path": "/np1-302/as_obligation",
+ "queryParameterDefinitions": 28,
+ "detailSha256": "0c9a915899365eb22dbf858cba3455c512105f1cbbed65f6c2401c8d0bce6fff"
+ },
+ {
+ "id": "getData_approved_dctie_schedules",
+ "method": "GET",
+ "path": "/np3-765-cd/approved_dctie_schedules",
+ "queryParameterDefinitions": 15,
+ "detailSha256": "66722ced0ba2eab405f4f7ba3351b95f96bbaa566d66c371b8e0774dffaee6ea"
+ },
+ {
+ "id": "getProductHistoryBundles",
+ "method": "GET",
+ "path": "/bundle/{emilId}",
+ "queryParameterDefinitions": 0,
+ "detailSha256": "a515bdb92a45889782f1d415d0b030322d105d5d4cce871059dd6e95e976485d"
+ },
+ {
+ "id": "getProductHistory",
+ "method": "GET",
+ "path": "/archive/{emilId}",
+ "queryParameterDefinitions": 0,
+ "detailSha256": "8a50c478aae63a61070350417b9605d0c662ea8e211f2c02e1ee053b4e87969e"
+ },
+ {
+ "id": "getProduct",
+ "method": "GET",
+ "path": "/{emilId}",
+ "queryParameterDefinitions": 0,
+ "detailSha256": "2db141349c77f169abdf1b783b94720df0801b86c700442c3d8690df3debe04d"
+ },
+ {
+ "id": "getData_7d_avail_res_poc_margin",
+ "method": "GET",
+ "path": "/np3-162-cd/7d_avail_res_poc_margin",
+ "queryParameterDefinitions": 29,
+ "detailSha256": "057851677b25a5242d0e026a85853319c0f8d78305bf3dfb4662cf8743481eb9"
+ },
+ {
+ "id": "getData_7d_plus_avail_res_poc_margin",
+ "method": "GET",
+ "path": "/np3-161-cd/7d_plus_avail_res_poc_margin",
+ "queryParameterDefinitions": 26,
+ "detailSha256": "03fa9877bae1202e81109f73b73f378aac0c021d09e11ca280db8fd7e86d65a9"
+ },
+ {
+ "id": "getData_daily_ruc_act_and_bind_tran_const",
+ "method": "GET",
+ "path": "/np5-754-cd/daily_ruc_act_and_bind_tran_const",
+ "queryParameterDefinitions": 26,
+ "detailSha256": "ea60a9d850ee0647eddd064defc9e26a111289ee290ab10fbaf1e69e35447e7e"
+ },
+ {
+ "id": "getData_druc_as_demand_curves",
+ "method": "GET",
+ "path": "/np4-214-cd/druc_as_demand_curves",
+ "queryParameterDefinitions": 17,
+ "detailSha256": "65997c24896c1669434b6bb55ec680ba75169ebd51cb0639aa0fd5f32508eee4"
+ },
+ {
+ "id": "getData_dam_agg_as_offer_curve",
+ "method": "GET",
+ "path": "/np4-19-cd/dam_agg_as_offer_curve",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "de8687c1aabe1e50fc1094a0700ff66115bed0f900a11d066a050bbcdfcee223"
+ },
+ {
+ "id": "getData_dam_as_plan",
+ "method": "GET",
+ "path": "/np4-33-cd/dam_as_plan",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "fb04a0a7e234f3ef43a1418ffa6e03692bbd0c57e546fc515dade25855c2b0e2"
+ },
+ {
+ "id": "getData_dam_sced_as_demand_curves",
+ "method": "GET",
+ "path": "/np4-212-cd/dam_sced_as_demand_curves",
+ "queryParameterDefinitions": 17,
+ "detailSha256": "fdf8a6a294600e233c5e1ee7d898730fa76342528621951a9cd26065236b9dc8"
+ },
+ {
+ "id": "getData_dam_clear_price_for_cap",
+ "method": "GET",
+ "path": "/np4-188-cd/dam_clear_price_for_cap",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "fc432305d4f88b8e6c6f6196685b5374794c769e2793580899c6f044dff2451c"
+ },
+ {
+ "id": "getData_dam_de_energized_spbc",
+ "method": "GET",
+ "path": "/np4-200-cd/dam_de_energized_spbc",
+ "queryParameterDefinitions": 9,
+ "detailSha256": "72d7de72ac9e9036d64256f57b56cf5e1d5b120114dedd6e4a51b03ab3f36976"
+ },
+ {
+ "id": "getData_dam_essps",
+ "method": "GET",
+ "path": "/np4-158-sg/dam_essps",
+ "queryParameterDefinitions": 15,
+ "detailSha256": "98cabb16e84cfdfadf01f329df24872e2ed4a840cacf20eb843f7c99ebffbac6"
+ },
+ {
+ "id": "getData_dam_hourly_lmp",
+ "method": "GET",
+ "path": "/np4-183-cd/dam_hourly_lmp",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "f1c0aad974d384b31436afdc10d41787e6bc6f6ee1d24dd9eebcbe6858e68efa"
+ },
+ {
+ "id": "getData_dam_price_corrections_eblmp",
+ "method": "GET",
+ "path": "/np4-196-m/dam_price_corrections_eblmp",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "bfc2d218ed11a251f1a2f262fb966d0f431f2180d1e5f72faf499215cb463150"
+ },
+ {
+ "id": "getData_dam_price_corrections_mcpc",
+ "method": "GET",
+ "path": "/np4-196-m/dam_price_corrections_mcpc",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "e69121ade2936d0f2347440d205558db1adcabb44b587d65b50f87ed99e382f7"
+ },
+ {
+ "id": "getData_dam_price_corrections_spp",
+ "method": "GET",
+ "path": "/np4-196-m/dam_price_corrections_spp",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "23163b686df47af976c4a2ef471666e8ee97483bbf21e1c3579fe8c81b52e332"
+ },
+ {
+ "id": "getData_dam_ptp_obligation_sp_results",
+ "method": "GET",
+ "path": "/np4-194-cd/dam_ptp_obligation_sp_results",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "1c0d319b70886b7ef9f59e16441641e2061e168729a2105ece21528b3fc7ddbf"
+ },
+ {
+ "id": "getData_dam_stlmnt_pnt_prices",
+ "method": "GET",
+ "path": "/np4-190-cd/dam_stlmnt_pnt_prices",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "331a037306837047aaa30fcc4a4be698105fbee02fb535f943637633b9aecbbf"
+ },
+ {
+ "id": "getData_dam_shadow_prices",
+ "method": "GET",
+ "path": "/np4-191-cd/dam_shadow_prices",
+ "queryParameterDefinitions": 28,
+ "detailSha256": "9baacf9a8bb8cc8cbaebd75191891595548265da01306c9c65b09517644d41e5"
+ },
+ {
+ "id": "getData_dam_system_lambda",
+ "method": "GET",
+ "path": "/np4-523-cd/dam_system_lambda",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "5dec796b56e31069fffa25836efacba6ba85933afc33367747013035a5292ffd"
+ },
+ {
+ "id": "getData_dam_as_sold",
+ "method": "GET",
+ "path": "/np4-532-cd/dam_as_sold",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "5ce86063855b24c9ee89371e62f09c5f91f2b72ad8f21743388e9e4408070ba3"
+ },
+ {
+ "id": "getData_dam_total_energy_purchased",
+ "method": "GET",
+ "path": "/np4-192-cd/dam_total_energy_purchased",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "c630958edbabd7d971b82c0bc1fc842bfe20ea29c50b23d423183af3959fc8c8"
+ },
+ {
+ "id": "getData_total_dam_energy_sold",
+ "method": "GET",
+ "path": "/np4-193-cd/total_dam_energy_sold",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "f9d6ce3a24ea0ef67a65d05b88eef879e108ba965f72b040176daf4628ce1fc9"
+ },
+ {
+ "id": "getData_dam_ptp_option_price_report",
+ "method": "GET",
+ "path": "/np7-464-cd/dam_ptp_option_price_report",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "d90eabe45ceeffa8b0effa0a3167e556638bb010c5c0b2311c0b20acf94c29e6"
+ },
+ {
+ "id": "getData_da_sw_offer_caps",
+ "method": "GET",
+ "path": "/np4-791-cd/da_sw_offer_caps",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "6de90230712e3366614827d55c58f3a9a3e7a7a120ccce2025dcfbba8dc43b20"
+ },
+ {
+ "id": "getProductArchives",
+ "method": "POST",
+ "path": "/archive/{emilId}/download",
+ "queryParameterDefinitions": 0,
+ "detailSha256": "a4d39f2fbd8708decc47c6bba1e87e0f6ac16ba4e62902cd317a57b40fd3f000"
+ },
+ {
+ "id": "getProductBundle",
+ "method": "POST",
+ "path": "/bundle/{emilId}/download",
+ "queryParameterDefinitions": 0,
+ "detailSha256": "842d46909c9a2a326c1177b0b4c0752d3068b1477d01e3fef9d5e19f4d4cd4be"
+ },
+ {
+ "id": "getData_druc_as_deploy_factors",
+ "method": "GET",
+ "path": "/np5-527-cd/druc_as_deploy_factors",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "aa67d22b1468c73779ba7d20d54afbb3025d916057e6f222462a24eccbd959dc"
+ },
+ {
+ "id": "getData_electrical_bus_map_heur_price",
+ "method": "GET",
+ "path": "/np4-231-cd/electrical_bus_map_heur_price",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "9fd8dfeb390d2e99289f3367a6abbf6a887ac6f3899817ef5880ef97d022416a"
+ },
+ {
+ "id": "getData_epp_cumulative_hours",
+ "method": "GET",
+ "path": "/np4-412-cd/epp_cumulative_hours",
+ "queryParameterDefinitions": 21,
+ "detailSha256": "b37e7e384318845d6f3a0322fa404622c826cad0c638e4108003a9544ee922bf"
+ },
+ {
+ "id": "getData_241",
+ "method": "GET",
+ "path": "/gen-55-cd/hrly_rt_load_fcast_actual",
+ "queryParameterDefinitions": 19,
+ "detailSha256": "348355dc80a9bddcddf2a6c09cd97a3ba335c3c5c417c8ce97da08a13fcd5fc8"
+ },
+ {
+ "id": "getData_hourly_res_outage_cap",
+ "method": "GET",
+ "path": "/np3-233-cd/hourly_res_outage_cap",
+ "queryParameterDefinitions": 34,
+ "detailSha256": "3bd00cd14c5a801e83d4fbca87b8167e6c6aefd4089824021c8f046d396223f2"
+ },
+ {
+ "id": "getData_hrly_rmr_services_deployed",
+ "method": "GET",
+ "path": "/np5-108-cd/hrly_rmr_services_deployed",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "790a97a1a093645b8c20eac9268017b11ac795400e98d45af6313532e2822831"
+ },
+ {
+ "id": "getData_hrly_ruc_act_and_bind_tran_const",
+ "method": "GET",
+ "path": "/np5-755-cd/hrly_ruc_act_and_bind_tran_const",
+ "queryParameterDefinitions": 28,
+ "detailSha256": "c1996a5d966d2b9cf7580296e33ff5269865967317335fb4a0ad579eea9056cf"
+ },
+ {
+ "id": "getData_hruc_as_demand_curves",
+ "method": "GET",
+ "path": "/np4-213-cd/hruc_as_demand_curves",
+ "queryParameterDefinitions": 17,
+ "detailSha256": "5d829ab8a8bdcc00cf5396970e409aa7abb9e035d40632ca5e64913b7e12c2c2"
+ },
+ {
+ "id": "getData_hrly_ruc_online_sced_offline_cop",
+ "method": "GET",
+ "path": "/np3-764-cd/hrly_ruc_online_sced_offline_cop",
+ "queryParameterDefinitions": 20,
+ "detailSha256": "d1c72e54fdaf4b4cf3efd686942b4772789a8232174f379059b760aac6c37878"
+ },
+ {
+ "id": "getData_hrly_sys_reg_solar_fcast_model",
+ "method": "GET",
+ "path": "/np4-443-cd/hrly_sys_reg_solar_fcast_model",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "233c4683510997ab0cc082416aed57868b701c3de402b1c6abb473005990cb7d"
+ },
+ {
+ "id": "getData_hrly_sys_reg_wind_fcast_model",
+ "method": "GET",
+ "path": "/np4-442-cd/hrly_sys_reg_wind_fcast_model",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "dfcb6bec5cbf0ba4bb0742213a74de84a1438a3758bebcaa8ccfefa28b076bd7"
+ },
+ {
+ "id": "getData_hruc_as_deploy_factors",
+ "method": "GET",
+ "path": "/np5-528-cd/hruc_as_deploy_factors",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "ac3e1e8710b238b5bad7d886b557bbd52491b88088e52191417b4a571dc2925a"
+ },
+ {
+ "id": "getData_ih_load_fcast_by_wzn",
+ "method": "GET",
+ "path": "/np3-562-cd/ih_load_fcast_by_wzn",
+ "queryParameterDefinitions": 29,
+ "detailSha256": "f8acd4396e75645afaef3a27171811563a47d06948282fe41890ad6fb99c1655"
+ },
+ {
+ "id": "getData_ih_solar_fcast_geo",
+ "method": "GET",
+ "path": "/np4-752-cd/ih_solar_fcast_geo",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "9cc9b44cab9c94c147ab423fb2bfcddf032715452ddaf2498f5ec98b66d7c45d"
+ },
+ {
+ "id": "getData_ih_wind_fcast_geo",
+ "method": "GET",
+ "path": "/np4-751-cd/ih_wind_fcast_geo",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "f7bde0686f8a1c003306be9b74a13df9227f733195a281ac7c9babcf19b7bd25"
+ },
+ {
+ "id": "getData_lmp_electrical_bus",
+ "method": "GET",
+ "path": "/np6-787-cd/lmp_electrical_bus",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "aef751a5d35f7825504b749024355856b313588c65303276beb0ceb030ee4b28"
+ },
+ {
+ "id": "getData_lmp_sog_price_adders",
+ "method": "GET",
+ "path": "/np6-327-cd/lmp_sog_price_adders",
+ "queryParameterDefinitions": 19,
+ "detailSha256": "7a5df149cca2e9ac2fbaa78729a265b16570c19a9ea073720dcc0f05c86194ca"
+ },
+ {
+ "id": "getData_lmp_node_zone_hub",
+ "method": "GET",
+ "path": "/np6-788-cd/lmp_node_zone_hub",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "1865836ceefee0cba666c9e9993c32373e31c361228377f6d7a1904653456694"
+ },
+ {
+ "id": "getData_load_distribution_factors",
+ "method": "GET",
+ "path": "/np4-159-cd/load_distribution_factors",
+ "queryParameterDefinitions": 17,
+ "detailSha256": "9a5b22b9670fb70e610c16ba712ddf1ebaecd3810ad3e352869112e2a36b81fc"
+ },
+ {
+ "id": "getData_peaker_net_margin",
+ "method": "GET",
+ "path": "/np4-790-cd/peaker_net_margin",
+ "queryParameterDefinitions": 8,
+ "detailSha256": "5f2560d170d0c8b844cd1ab64c2b10e3ea26b000414ddac93a9496c8548d47b1"
+ },
+ {
+ "id": "getData_proj_as_deploy_factor",
+ "method": "GET",
+ "path": "/np5-526-cd/proj_as_deploy_factor",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "630529b45f5d65488e2671d5f32f4389d81cb26e3a35ea389676a23b7822277d"
+ },
+ {
+ "id": "getData_rt_clear_price_cap_sced",
+ "method": "GET",
+ "path": "/np6-332-cd/rt_clear_price_cap_sced",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "340ce7d07ce3483e7e6fc97140087515a774b39d35b2c841fbe5b851d858f215"
+ },
+ {
+ "id": "getData_rt_clear_price_cap",
+ "method": "GET",
+ "path": "/np6-331-cd/rt_clear_price_cap",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "386a57c08f45b370c378a89a4e008a6f71d6e86374cf5d5a6e7944bd7bab3f36"
+ },
+ {
+ "id": "getData_rt_price_adder_sced",
+ "method": "GET",
+ "path": "/np6-323-cd/rt_price_adder_sced",
+ "queryParameterDefinitions": 43,
+ "detailSha256": "7531b729efd8ab572189304524f1b5073bc2af024801e2d82cf6c36b333c09d9"
+ },
+ {
+ "id": "getData_rt_15min_price_adders",
+ "method": "GET",
+ "path": "/np6-324-cd/rt_15min_price_adders",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "751516d187eb0dd0afbf4e29046ca3d8f07f26cb45444c4276f9a21078f5262d"
+ },
+ {
+ "id": "getData_rt_price_sog",
+ "method": "GET",
+ "path": "/np6-326-cd/rt_price_sog",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "b6bf00fbb1fdc2fce02a83159ec4dbd0d576da8d3ff19ee4fb502f9f43a47db9"
+ },
+ {
+ "id": "getVersion",
+ "method": "GET",
+ "path": "/version",
+ "queryParameterDefinitions": 0,
+ "detailSha256": "842964d97c2bf4ee61e8ff31a406d2f4f31e2a0a03061bb0818b8d5a833b4363"
+ },
+ {
+ "id": "getData_rtd_lmp_node_zone_hub",
+ "method": "GET",
+ "path": "/np6-970-cd/rtd_lmp_node_zone_hub",
+ "queryParameterDefinitions": 16,
+ "detailSha256": "1b78a9640c0596ef180ec901d21c6c58c86f2f79147cc345e268dbad200800b3"
+ },
+ {
+ "id": "getData_rtd_price_adders",
+ "method": "GET",
+ "path": "/np6-325-cd/rtd_price_adders",
+ "queryParameterDefinitions": 48,
+ "detailSha256": "e7758bb6df130beb50d8f349e4f47e64eef792e01219d3aa5f9eceae71d77390"
+ },
+ {
+ "id": "getData_rtd_ind_mcpc",
+ "method": "GET",
+ "path": "/np6-329-cd/rtd_ind_mcpc",
+ "queryParameterDefinitions": 22,
+ "detailSha256": "4fb77c48440567b4f74897075de68435a14fef42d90ec8d1c41a0c99c7cd4298"
+ },
+ {
+ "id": "getData_rtm_price_corrections_eblmp",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_eblmp",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "6351d6e8a7cd437601375b62065c2009d902b89ffe980ed8a71ecd7fb7f042f2"
+ },
+ {
+ "id": "getData_rtm_price_corrections_mcpc_spp",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_mcpc_spp",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "0339ccd62651596d1cc0b6add3d15dac9aa7e0e0d11d8ae697d7c82457b7bd07"
+ },
+ {
+ "id": "getData_rtm_price_corrections_mcpc_sced",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_mcpc_sced",
+ "queryParameterDefinitions": 18,
+ "detailSha256": "c67aef5447d0a085447689c7cb1fa70512173a1a2d13fda9cb57f1fb28ae0275"
+ },
+ {
+ "id": "getData_rtm_price_corrections_shadow",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_shadow",
+ "queryParameterDefinitions": 25,
+ "detailSha256": "361dfb8e584832fc21e2da5e08d671efff9bdde7bc9e5a31934e59d3a8be66c3"
+ },
+ {
+ "id": "getData_rtm_price_corrections_soglmp",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_soglmp",
+ "queryParameterDefinitions": 24,
+ "detailSha256": "70c0b325d7e99db850855324b27205d46c33052f8fd49f292b9345216371100c"
+ },
+ {
+ "id": "getData_rtm_price_corrections_sogprice",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_sogprice",
+ "queryParameterDefinitions": 20,
+ "detailSha256": "aa7377a36f8489bdebca5b32dfa8430dcc3e4ecb008d9d249831675613eea16d"
+ },
+ {
+ "id": "getData_rtm_price_corrections_spp",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_spp",
+ "queryParameterDefinitions": 19,
+ "detailSha256": "208912a44f5da7d9732144a4a899b3b3835bf1290b93ec79186eeb9337338706"
+ },
+ {
+ "id": "getData_rtm_price_corrections_splmp",
+ "method": "GET",
+ "path": "/np4-197-m/rtm_price_corrections_splmp",
+ "queryParameterDefinitions": 14,
+ "detailSha256": "c8c3608974179300ff768509bc779fd30bf27494ba51f3e5ba589e9b8debbd6a"
+ },
+ {
+ "id": "getData_shdw_prices_bnd_trns_const",
+ "method": "GET",
+ "path": "/np6-86-cd/shdw_prices_bnd_trns_const",
+ "queryParameterDefinitions": 28,
+ "detailSha256": "d06f45815c01a52a543a32f5b4f49e308a52bf8d8b4ea9e08a695975ac0b80b1"
+ },
+ {
+ "id": "getData_sced_system_lambda",
+ "method": "GET",
+ "path": "/np6-322-cd/sced_system_lambda",
+ "queryParameterDefinitions": 11,
+ "detailSha256": "34153a2c4115d5201b91e15463c54abf0bb08dc994075d1016741661954daf67"
+ },
+ {
+ "id": "getData_spp_node_zone_hub",
+ "method": "GET",
+ "path": "/np6-905-cd/spp_node_zone_hub",
+ "queryParameterDefinitions": 15,
+ "detailSha256": "1c9be63e74d472e7b6f0ce81405505ea8b0a72c3980a3ac61be38123612b9db8"
+ },
+ {
+ "id": "getData_7d_load_fcast_by_fzn",
+ "method": "GET",
+ "path": "/np3-560-cd/7d_load_fcast_by_fzn",
+ "queryParameterDefinitions": 20,
+ "detailSha256": "1d9b676535b99cb835720e6d4a53bb0d7753f3b813cd5517ea7d67d5c56e1e7e"
+ },
+ {
+ "id": "getData_lf_by_model_study_area",
+ "method": "GET",
+ "path": "/np3-566-cd/lf_by_model_study_area",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "4fb2e8ee17e4069db8bdc13965b52c7e040678edca874bf1341e07a7bc399fd4"
+ },
+ {
+ "id": "getData_lf_by_model_weather_zone",
+ "method": "GET",
+ "path": "/np3-565-cd/lf_by_model_weather_zone",
+ "queryParameterDefinitions": 30,
+ "detailSha256": "a332ca2467cd0ecd93e42ee0267a71072c8f95b4aaf60004c6f947aaf8e48ea4"
+ },
+ {
+ "id": "getData_7d_load_fcast_by_wzn",
+ "method": "GET",
+ "path": "/np3-561-cd/7d_load_fcast_by_wzn",
+ "queryParameterDefinitions": 28,
+ "detailSha256": "63e97313018d46c47b21e6cbb76e812324151a649551ba629240857b60b33216"
+ },
+ {
+ "id": "getData_st_sys_adequacy",
+ "method": "GET",
+ "path": "/np3-763-cd/st_sys_adequacy",
+ "queryParameterDefinitions": 61,
+ "detailSha256": "ca057f136ab6a873f407e07114d9eb5b6dcee4cf1902a314de47e5be24b853f9"
+ },
+ {
+ "id": "getData_spp_actual_5min_avg_values",
+ "method": "GET",
+ "path": "/np4-738-cd/spp_actual_5min_avg_values",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "f46285e293a8b23742e6de61372fad10f2ad0cbfe9db51d8f3492ea68d25f9fe"
+ },
+ {
+ "id": "getData_spp_actual_5min_avg_values_geo",
+ "method": "GET",
+ "path": "/np4-746-cd/spp_actual_5min_avg_values_geo",
+ "queryParameterDefinitions": 25,
+ "detailSha256": "f0944f2b9380d90b65dd5b95f5edb9f0624ae55775c5c24cf71be8e3aec9ea07"
+ },
+ {
+ "id": "getData_spp_hrly_avrg_actl_fcast",
+ "method": "GET",
+ "path": "/np4-737-cd/spp_hrly_avrg_actl_fcast",
+ "queryParameterDefinitions": 21,
+ "detailSha256": "4ba5eee3089cd60345c31a61b023d7b0145b1a080d5e8018aa0621d0c43150e2"
+ },
+ {
+ "id": "getData_spp_hrly_actual_fcast_geo",
+ "method": "GET",
+ "path": "/np4-745-cd/spp_hrly_actual_fcast_geo",
+ "queryParameterDefinitions": 69,
+ "detailSha256": "ab42d0e52a0e457eb71e26274a908a86aab5b0113ce26335f9748d5dfa91a33b"
+ },
+ {
+ "id": "getData_se_load_dcties_flows",
+ "method": "GET",
+ "path": "/np6-626-cd/se_load_dcties_flows",
+ "queryParameterDefinitions": 12,
+ "detailSha256": "12f09f65673f957e05536a1a397b185e3a81ebb62391bc58719843dae7e68679"
+ },
+ {
+ "id": "getData_se_ld_rpt_ercot_gen",
+ "method": "GET",
+ "path": "/np6-625-cd/se_ld_rpt_ercot_gen",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "1e88f4c314a81e106f5187a40d15cc270db01932245a80f11688cbeaaeeeec94"
+ },
+ {
+ "id": "getData_sum_hdl_ldl",
+ "method": "GET",
+ "path": "/np6-915-cd/sum_hdl_ldl",
+ "queryParameterDefinitions": 13,
+ "detailSha256": "e038dd86959e56b02ed8c219a6d06684a7136bf59de4192686fe54614501fd97"
+ },
+ {
+ "id": "getData_system_wide_demand",
+ "method": "GET",
+ "path": "/np6-235-cd/system_wide_demand",
+ "queryParameterDefinitions": 10,
+ "detailSha256": "6d12e2b1177df60a35627fc0e7ab7708f1122b5fb40da8f02c46a38a0e56ca2d"
+ },
+ {
+ "id": "getData_total_as_service_offers",
+ "method": "GET",
+ "path": "/np4-179-cd/total_as_service_offers",
+ "queryParameterDefinitions": 24,
+ "detailSha256": "4dbbdc480839f339ac51d7b7a27ed46102f01d7b9db189cf0062f3ddda718c2c"
+ },
+ {
+ "id": "getData_tot_as_res_cap",
+ "method": "GET",
+ "path": "/np6-328-cd/tot_as_res_cap",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "600e0eb7067de26167e17dd13baa8bf7ef8d275a20c3f3f41c13f5702fb3f8a2"
+ },
+ {
+ "id": "getData_weather_assumptions",
+ "method": "GET",
+ "path": "/np4-722-cd/weather_assumptions",
+ "queryParameterDefinitions": 24,
+ "detailSha256": "43bc5ef34be13602a67eab6f7d16df704aeeab797b851492c19d96c4f47080d3"
+ },
+ {
+ "id": "getData_wruc_as_demand_curves",
+ "method": "GET",
+ "path": "/np4-215-cd/wruc_as_demand_curves",
+ "queryParameterDefinitions": 19,
+ "detailSha256": "06456bcc1de58b404e045b77d9114f1406ff283ae99faf63c494a7c8771d5687"
+ },
+ {
+ "id": "getData_wpp_actual_5min_avg_values",
+ "method": "GET",
+ "path": "/np4-733-cd/wpp_actual_5min_avg_values",
+ "queryParameterDefinitions": 19,
+ "detailSha256": "353d3e6969f79646c2bdcff6ea07bbeee91643a047664fe084d0d18925c8ebac"
+ },
+ {
+ "id": "getData_wpp_actual_5min_avg_values_geo",
+ "method": "GET",
+ "path": "/np4-743-cd/wpp_actual_5min_avg_values_geo",
+ "queryParameterDefinitions": 23,
+ "detailSha256": "0269df3f10e04ccee6de31b1ed46038e97833121963df6ec9a46a521aeec89cb"
+ },
+ {
+ "id": "getData_wpp_hrly_avrg_actl_fcast",
+ "method": "GET",
+ "path": "/np4-732-cd/wpp_hrly_avrg_actl_fcast",
+ "queryParameterDefinitions": 45,
+ "detailSha256": "f4bc89ca00241ab744e8564ce4040546ce98e9a63d469f94d0788a082922dc93"
+ },
+ {
+ "id": "getData_wpp_hrly_actual_fcast_geo",
+ "method": "GET",
+ "path": "/np4-742-cd/wpp_hrly_actual_fcast_geo",
+ "queryParameterDefinitions": 61,
+ "detailSha256": "98dd97fc3edcf02025f1a05da1f663885b2d723cc0e94f1386d24645e2f0fa8f"
+ },
+ {
+ "id": "getData_wruc_as_deploy_factors",
+ "method": "GET",
+ "path": "/np5-525-cd/wruc_as_deploy_factors",
+ "queryParameterDefinitions": 15,
+ "detailSha256": "f0f463f13e6ddd059e2a7f0d394b63a45fe6ae3d4c11d13231e4cc7a47254cfc"
+ }
+ ],
+ "releaseAudit": {
+ "checkedAt": "2026-09-08T04:00:06.399876+00:00",
+ "runtimeCommit": "a45bcf33d1ef0ed1932f4706652bb574330a4402",
+ "scope": "Rechecked live operation methods/paths, catalog artifacts, all 11 typed dashboard methods, the three empty products, and direct public file indexes. Statically checked every generated history property has a concrete Pydantic row type and all report queries have historical contracts. Full current test suite and required mechanical checks passed. Parameter-detail evidence above retains its original check date. Historical source comparisons remain sampled as described in their own evidence files; this is not an exhaustive download of every retained publication or a claim of gap-free history.",
+ "operations": {
+ "pageSizes": [
+ 100,
+ 100,
+ 49
+ ],
+ "count": 249,
+ "added": [],
+ "removed": []
+ },
+ "catalog": {
+ "products": 116,
+ "artifacts": 242,
+ "missingGeneratedQueries": [],
+ "queriesAbsentFromCatalog": []
+ },
+ "dashboards": [
+ {
+ "method": "fuel_mix",
+ "status": "pass",
+ "type": "FuelMixSnapshot"
+ },
+ {
+ "method": "grid_conditions",
+ "status": "pass",
+ "type": "GridConditionsSnapshot"
+ },
+ {
+ "method": "energy_storage",
+ "status": "pass",
+ "type": "EsrSnapshot"
+ },
+ {
+ "method": "generation_outages",
+ "status": "pass",
+ "type": "GenerationOutagesSnapshot"
+ },
+ {
+ "method": "dc_tie_flows",
+ "status": "pass",
+ "type": "DcTieSnapshot"
+ },
+ {
+ "method": "system_prices",
+ "status": "pass",
+ "type": "SystemPricesSnapshot"
+ },
+ {
+ "method": "supply_demand",
+ "status": "pass",
+ "type": "SupplyDemandSnapshot"
+ },
+ {
+ "method": "combined_wind_solar",
+ "status": "pass",
+ "type": "WindSolarSnapshot"
+ },
+ {
+ "method": "system_demand",
+ "status": "pass",
+ "type": "DemandSnapshot"
+ },
+ {
+ "method": "ancillary_services",
+ "status": "pass",
+ "type": "AncillarySnapshot"
+ },
+ {
+ "method": "weather_forecast",
+ "status": "pass",
+ "type": "list"
+ }
+ ],
+ "emptyProducts": [
+ {
+ "product": "NP6-569-CD",
+ "kind": "archives",
+ "totalRecords": 0
+ },
+ {
+ "product": "NP6-569-CD",
+ "kind": "bundles",
+ "totalRecords": 0
+ },
+ {
+ "product": "NP6-655-CD",
+ "kind": "archives",
+ "totalRecords": 0
+ },
+ {
+ "product": "NP6-655-CD",
+ "kind": "bundles",
+ "totalRecords": 0
+ },
+ {
+ "product": "NP6-913-CD",
+ "kind": "archives",
+ "totalRecords": 0
+ },
+ {
+ "product": "NP6-913-CD",
+ "kind": "bundles",
+ "totalRecords": 0
+ }
+ ],
+ "static": {
+ "queries": 242,
+ "historyReaders": 289,
+ "historyFormats": {
+ "csv": 275,
+ "workbook": 9,
+ "pdf": 5
+ },
+ "products": 113,
+ "typedHistoryFields": 3434,
+ "nonemptyCapturedQuerySamples": 242,
+ "wheelBytes": 169393,
+ "runtimeModules": 11,
+ "wheelMatchesCurrentRuntime": true,
+ "generatedSha256": "4add31219447d92ec33bf16f4096a6745799d61c36b272ab2edba095e0c836c2"
+ },
+ "publicFileIndexes": {
+ "checkedAt": "2026-09-08T04:02:33.652496+00:00",
+ "hourlyLoadLinks": 33,
+ "fuelMixLinks": 3,
+ "nativeLoad2026": {
+ "url": "https://www.ercot.com/files/docs/2026/02/10/Native_Load_2026.zip",
+ "bytes": 722951,
+ "sha256": "3a642883ab3889c23650cde4cf6bade371c62999ee4c54bfdda6f8063422aef0",
+ "badMember": "Native_Load_2026.xlsx"
+ }
+ },
+ "checks": {
+ "pytest": "934 passed in 60.19s",
+ "mypy": "strict; 16 source files including examples",
+ "ruff": "check and format passed",
+ "generator": "242 endpoints, 113 namespaces; byte-identical output",
+ "wheel": "11 runtime modules byte-identical to checkout; py.typed present; fixtures, tests, examples and tools excluded"
+ }
+ },
+ "coreWheelSmokeCheck": {
+ "queryEndpointsExercised": 242,
+ "typedApiRows": 242,
+ "typedCsvRows": 3,
+ "optionalPackagesAbsent": [
+ "openpyxl",
+ "xlrd",
+ "pypdf"
+ ],
+ "optionalReaderConstructionSucceeded": true,
+ "dependencies": {
+ "httpcore": "1.0.9",
+ "pydantic": "2.13.5",
+ "annotated-types": "0.8.0",
+ "h11": "0.16.0",
+ "anyio": "4.15.1",
+ "httpx": "0.28.1",
+ "typing_extensions": "4.16.0",
+ "typing-inspection": "0.4.4",
+ "idna": "3.19",
+ "certifi": "2026.7.22",
+ "httpx-retries": "0.6.0",
+ "tinyercot": "0.2.2",
+ "pydantic_core": "2.46.5"
+ },
+ "scope": "Isolated installed wheel, captured responses through all generated query methods and a historical CSV; no live network queries or optional format decoding.",
+ "wheelSha256": "759efde4a1612d2a6690339b478309cc22555eb3779b6426857651132e683345",
+ "commit": "3adbe8d2658edbcfdba95ffd37ff2cff7411c57f"
+ },
+ "additionalCapacityDashboardCheck": {
+ "checkedAt": "2026-09-08T05:34:44.407551+00:00",
+ "scedCapacityRows": 8846,
+ "scedCapacityCurrentRows": 206,
+ "scedCapacityPreviousRows": 8640,
+ "scedLastUpdated": "2026-09-08T00:34:14-05:00",
+ "ancillaryGroups": 12,
+ "ancillaryValues": 60,
+ "ancillaryLastUpdated": "2026-09-08T00:34:26-05:00",
+ "allSourceValuesMatched": true,
+ "credentialsUsed": false,
+ "sources": {
+ "capacity-available-sced.json": {
+ "url": "https://www.ercot.com/api/1/services/read/dashboards/capacity-available-sced.json",
+ "sha256": "ba2d9c1869aec66637f14a9304497840c82df07a75a1f04236be04eb9eae8f17"
+ },
+ "ancillary-service-capacity-monitor.json": {
+ "url": "https://www.ercot.com/api/1/services/read/dashboards/ancillary-service-capacity-monitor.json",
+ "sha256": "217b6d7e0cd9cc4d4f7c80e04e979f827da86f5d89f0af9dc0ed7ebc33110c67"
+ }
+ },
+ "discovery": "Two additional public dashboard pages linked from https://www.ercot.com/gridinfo/index, absent from the main dashboard index and previously unimplemented.",
+ "pages": [
+ "https://www.ercot.com/gridmktinfo/dashboards/capacityavailablesced",
+ "https://www.ercot.com/gridmktinfo/dashboards/ancillaryservicecapacitymonitor"
+ ],
+ "fixtureScope": "Capacity fixture retains the first and last source row of each current/previous section; ancillary fixture preserves the complete captured 12-group table. Live comparison covers every row and field in the fetched responses.",
+ "methods": [
+ "sced_capacity",
+ "ancillary_capacity"
+ ],
+ "typedNumericDashboardFeeds": 13
+ },
+ "publicRealTimeConditionsCheck": {
+ "checkedAt": "2026-09-08T05:46:37.790529+00:00",
+ "url": "https://www.ercot.com/content/cdr/html/real_time_system_conditions.html",
+ "sourceSha256": "3aebe765ed7f013870cc5a0524bed2c408d31ab45e3233479b0ee534d7a304eb",
+ "numericFields": 14,
+ "allNumericValuesMatched": true,
+ "lastUpdated": "2026-09-08T00:46:20",
+ "sourceTimestampHasUtcOffset": false,
+ "credentialsUsed": false,
+ "verification": "Actual SDK method with raw response captured; all 14 values independently extracted by HTML label regex and Decimal, and timestamp independently parsed. No SDK parser/model used to construct reference values.",
+ "values": {
+ "lastUpdated": "2026-09-08T00:46:20",
+ "currentFrequency": "60.015",
+ "instantaneousTimeError": "-2.114",
+ "consecutiveBaalExceedances": 0,
+ "actualSystemDemand": "65754",
+ "averageNetLoad": "47930",
+ "totalSystemCapacity": "85873",
+ "totalWindOutput": "17978",
+ "totalPvgrOutput": "0",
+ "currentSystemInertia": "328564",
+ "dcE": "-443",
+ "dcL": "70",
+ "dcN": "-218",
+ "dcR": "83",
+ "dcS": "0"
+ },
+ "fixtureScope": "Captured source display body and table only, excluding tracking/header scripts. Values and source markup retained; line endings normalized.",
+ "fixtureSha256": "ce5414142d4bc12f94ba1e094729b5c6f2562dffd7175508beca1b1567f71772"
+ },
+ "publicRealTimeLmpDisplayCheck": {
+ "checkedAt": "2026-09-08T05:57:59.556384+00:00",
+ "credentialsUsed": false,
+ "scope": "Actual SDK requests for both display variants; every point, four price/change values, adder and timestamp compared independently with regex/Decimal extraction from the recorded HTML response. These are current snapshots, not historical queries.",
+ "checks": [
+ {
+ "source": "https://www.ercot.com/content/cdr/html/current_np6788.html",
+ "hubsAndZonesOnly": false,
+ "rows": 1123,
+ "fieldsCompared": 5615,
+ "lastUpdated": "2026-09-08T00:55:18",
+ "RTRDPA": "0.87",
+ "allValuesMatched": true,
+ "sourceSha256": "4833dc4da14bb063479ea506821cb5cfb8e543bcc2dfc23f77ee5b44790e496e"
+ },
+ {
+ "source": "https://www.ercot.com/content/cdr/html/hb_lz.html",
+ "hubsAndZonesOnly": true,
+ "rows": 15,
+ "fieldsCompared": 75,
+ "lastUpdated": "2026-09-08T00:55:18",
+ "RTRDPA": "0.87",
+ "allValuesMatched": true,
+ "sourceSha256": "324c9a15b121fe49af66a8af04879b0d72f154c636b3d9fc086f0a3219495e8e"
+ }
+ ],
+ "fixtures": "Full hubs/load-zones display body (15 points) and the first two data rows of the full settlement-point display, preserving source headers, metadata and nested adder table; tracking scripts excluded and line endings normalized."
+ },
+ "publicRtdDisplayCheck": {
+ "checkedAt": "2026-09-08T06:07:48.958949+00:00",
+ "credentialsUsed": false,
+ "allPublishedPointOptionsCovered": true,
+ "allSourceValuesMatched": true,
+ "includesReliabilityAdderVerifiedFromSourceText": true,
+ "sourceTimestampsHaveOffsets": false,
+ "scope": "All 15 point options currently published by the public RTD display. Actual SDK requests; every run timestamp, Actual LMP value, interval id, displayed minute offset, forecast price and last SCED timestamp compared with independent regex/Decimal extraction from each original response.",
+ "runs": 360,
+ "forecastPrices": 3960,
+ "runsPerPoint": 24,
+ "forecastHorizonsMinutes": [
+ 5,
+ 10,
+ 15,
+ 20,
+ 25,
+ 30,
+ 35,
+ 40,
+ 45,
+ 50,
+ 55
+ ],
+ "sourceHashesByPoint": {
+ "HB_BUSAVG": "1f5e6af5fcdd0d0a5c79a34a81f2c59f31b5450269b439e5db4a23751f5c4c9d",
+ "HB_HOUSTON": "71626d2823ab7be24e113ea89f4f1e2e9df26eef1e770579d0960640f5cff37a",
+ "HB_HUBAVG": "9315db5b56c68553dbe3cdee6d4690e5b4edd1f3bfc5c4f7be9250ff886f3a4c",
+ "HB_NORTH": "dd38043eed4151ed4f0b66bf392a8fe693698784c7e4088f31d5b126836e6817",
+ "HB_PAN": "6f5cfa283260a11d6d980429faf1b9da1545032aea0f18e4b0200fa0a354784e",
+ "HB_SOUTH": "85920e8354b182df2f818f216badd3429a5107d3d109fca06f19f80e3a942b14",
+ "HB_WEST": "c51f147cff86b0d25466dc08a70cf6eaba03e31a1d18d64dead8d5419a358710",
+ "LZ_AEN": "e4d8518db41741dd965facd5ce89875a1711d4b539d42713ef31cbee689b5840",
+ "LZ_CPS": "a99616ad789fafc1e80762a74ed2a37aee2ea50e3ef1fab2597f6b7999334f18",
+ "LZ_HOUSTON": "b4ddf09bac3da7434fc92f9705f7257c5bf1c47f4165996cd8d08c644f2ca1c0",
+ "LZ_LCRA": "4d2636f64614eee1049e3e70d72b7d92937ce77e306482d46cc8ae6d1bf2a90a",
+ "LZ_NORTH": "bb0a68d122e5e3e4cfe42a10c5558a9d39b060e44522b93dabe6ad803cbc46b3",
+ "LZ_RAYBN": "cb94ab472879967cb9e2b9aec18318a4e53fa94a06a4c253b07d29f17a0fcec6",
+ "LZ_SOUTH": "d655bf0030de1a5faef487b97e63e9297a34b8db5e5e7d1ba420acff9728e32d",
+ "LZ_WEST": "e973889bd90d2f4aec15a28679130b25695c5406d8631725f1bd05c528ead0c8"
+ },
+ "sourcePage": "https://www.ercot.com/content/cdr/html/rtd_ind_lmp_lz_hb.html",
+ "pointRoutes": "HB_BUSAVG uses the source page; other points use rtd_ind_lmp_lz_hb_{POINT}.html, matching the actual published selector options.",
+ "fixtures": "First two runs of the actual HB_BUSAVG and HB_HOUSTON display bodies, retaining selector/header/last-SCED metadata and all horizon values; tracking scripts excluded and line endings normalized."
+ }
+}
diff --git a/tools/inputs/load-profiles/1997.zip b/tools/inputs/load-profiles/1997.zip
new file mode 100644
index 00000000..211969c7
Binary files /dev/null and b/tools/inputs/load-profiles/1997.zip differ
diff --git a/tools/inputs/load-profiles/2007.zip b/tools/inputs/load-profiles/2007.zip
new file mode 100644
index 00000000..affcaae6
Binary files /dev/null and b/tools/inputs/load-profiles/2007.zip differ
diff --git a/tools/inputs/load-profiles/2008.zip b/tools/inputs/load-profiles/2008.zip
new file mode 100644
index 00000000..01422174
Binary files /dev/null and b/tools/inputs/load-profiles/2008.zip differ
diff --git a/tools/inputs/load-profiles/2012.zip b/tools/inputs/load-profiles/2012.zip
new file mode 100644
index 00000000..6cc71dd8
Binary files /dev/null and b/tools/inputs/load-profiles/2012.zip differ
diff --git a/tools/inputs/load-profiles/2013.zip b/tools/inputs/load-profiles/2013.zip
new file mode 100644
index 00000000..97a4789b
Binary files /dev/null and b/tools/inputs/load-profiles/2013.zip differ
diff --git a/tools/inputs/load-profiles/2026.zip b/tools/inputs/load-profiles/2026.zip
new file mode 100644
index 00000000..d6ebf24c
Binary files /dev/null and b/tools/inputs/load-profiles/2026.zip differ
diff --git a/tools/inputs/load-profiles/counts.zip b/tools/inputs/load-profiles/counts.zip
new file mode 100644
index 00000000..8069f361
Binary files /dev/null and b/tools/inputs/load-profiles/counts.zip differ
diff --git a/tools/inputs/load-profiles/index.html b/tools/inputs/load-profiles/index.html
new file mode 100644
index 00000000..49f9ecc0
--- /dev/null
+++ b/tools/inputs/load-profiles/index.html
@@ -0,0 +1,30 @@
+2026 Actual Load Profiles
+2025 Actual Load Profiles
+2024 Actual Load Profiles
+2023 Actual Load Profiles
+2022 Actual Load Profiles
+2021 Actual Load Profiles
+2020 Actual Load Profiles
+2019 Actual Load Profiles
+2018 Actual Load Profiles
+2017 Actual Load Profiles
+2016 Actual Load Profiles
+2015 Actual Load Profiles
+2014 Actual Load Profiles
+2013 Actual Load Profiles
+2012 Actual Load Profiles
+2011 Actual Load Profiles
+2010 Actual Load Profiles
+2009 Actual Load Profiles
+2008 Actual Load Profiles
+2007 Actual Load Profiles
+2006 Actual Load Profiles
+2005 Actual Load Profiles
+2004 Actual Load Profiles
+2003 Actual Load Profiles
+2002 Actual Load Profiles
+2001 Actual Load Profiles
+2000 Actual Load Profiles
+1999 Actual Load Profiles
+1998 Actual Load Profiles
+1997 Actual Load Profiles
diff --git a/tools/inputs/load-scenarios/evidence.json b/tools/inputs/load-scenarios/evidence.json
new file mode 100644
index 00000000..038d7980
--- /dev/null
+++ b/tools/inputs/load-scenarios/evidence.json
@@ -0,0 +1,319 @@
+{
+ "checkedOn": "2026-09-08",
+ "scope": "All eight regional hourly weather-year scenario workbooks linked from the public 2025 load-forecast page. Forecast target dates, not realized demand history.",
+ "discovery": [
+ {
+ "title": "Coast",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/Coast.xlsx"
+ },
+ {
+ "title": "East",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/East.xlsx"
+ },
+ {
+ "title": "Far West",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/FWest.xlsx"
+ },
+ {
+ "title": "North Central",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/Ncent.xlsx"
+ },
+ {
+ "title": "North",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/North.xlsx"
+ },
+ {
+ "title": "South Central",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/SCENT.xlsx"
+ },
+ {
+ "title": "South",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/South.xlsx"
+ },
+ {
+ "title": "West",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/West.xlsx"
+ }
+ ],
+ "rows": 771233,
+ "weatherYearValues": 34704958,
+ "componentValues": 3566972,
+ "numericValues": 38271930,
+ "sourceMarkerCells": 12,
+ "verification": "Complete original-cell comparisons with separately specified source column positions for dates, hours, predictions and components. Both final runtime and reference use openpyxl to retain spreadsheet error labels. All source error and text markers, zone labels, original row positions, date differences and hour multiplicities are compared. Runtime chooses columns by header names. Empty formatted rows are not data.",
+ "decoderSha256": {
+ "tinyercot/_load_scenarios.py": "bd165d084a56f80eff1fba56830ea82d571711c3271bbc064a635d35996a349b",
+ "tinyercot/_hourly_forecasts.py": "9988211832a2f61411c9bf5dcaea38e36d2c6e5b21683eddbca2b4e544eeb142",
+ "tinyercot/_load.py": "9c669a11f2fc07c3e2a6eba739f902f2c1e52cf657a9cc4ca5f2f9ac55e73f16"
+ },
+ "comparisonScriptSha256": "b0431bc6ad4ad8db12ffc68138169ec1d4b1fdde20a931c0714e4a98d98b30d7",
+ "fixtureScope": "First49 original worksheet rows including headers in all eight XLSX files. Later XML row elements removed, retained row bytes and other ZIP members unchanged. Additional South excerpt retains header and all twelve original rows containing #REF! errors or literal dot markers. Expected cells independently captured from original worksheets. These are excerpts, not whole source files.",
+ "fixtureScripts": {
+ "make_weather_scenario_fixtures.py": "54fd1656b798e85c6af11c701933ff7a6f1e31bfd7c68b943ea1348667807d5a",
+ "add_scenario_error_fixture.py": "97d1a4b579b311871ae567785cc6e39dd0973fb0e55f0f8c2ec29fe8ec358804"
+ },
+ "limits": [
+ "No inferred units, timezone, DST flags or forecast availability timestamps.",
+ "Predictions are not relabelled as net demand or recombined with the separate adjustments.",
+ "File row counts differ; no regional clock gaps or repeat hours are filled or dropped.",
+ "MIS and separate ESR API excluded."
+ ],
+ "files": [
+ {
+ "title": "Coast",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/Coast.xlsx",
+ "bytes": 71566674,
+ "sha256": "669a04b9bd5b5185a71cd8a667dc62a58a6cfbd0190465c6f896186c3488bc34",
+ "errorRows": [],
+ "rows": 96408,
+ "weatherYearValues": 4338360,
+ "componentValues": 482040,
+ "numericValues": 4820400,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 11,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 11,
+ "24": 3995,
+ "25": 11
+ },
+ "elapsedSeconds": 56.11,
+ "dateOffset": 1,
+ "zoneColumn": 50
+ },
+ {
+ "title": "East",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/East.xlsx",
+ "bytes": 70745927,
+ "sha256": "f1f2772b20a50a097c2715663bbebb82865378b11db62c9b9cfdc3c85dcb46de",
+ "errorRows": [],
+ "rows": 96397,
+ "weatherYearValues": 4337865,
+ "componentValues": 385588,
+ "numericValues": 4723453,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 0,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 11,
+ "24": 4006
+ },
+ "elapsedSeconds": 57.02,
+ "dateOffset": 1,
+ "zoneColumn": 50
+ },
+ {
+ "title": "Far West",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/FWest.xlsx",
+ "bytes": 71607380,
+ "sha256": "7f84bce206f5bb2e6f8671bb218a4dc94ae6c67eb56158f0853adb0fca5daf85",
+ "errorRows": [],
+ "rows": 96408,
+ "weatherYearValues": 4338360,
+ "componentValues": 482040,
+ "numericValues": 4820400,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 11,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 11,
+ "24": 3995,
+ "25": 11
+ },
+ "elapsedSeconds": 57.24,
+ "dateOffset": 1,
+ "zoneColumn": 50
+ },
+ {
+ "title": "North Central",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/Ncent.xlsx",
+ "bytes": 71851812,
+ "sha256": "bd6409a1fe11386a6afc013f6966e021642baea773f076f0663b64760d0ef455",
+ "errorRows": [],
+ "rows": 96408,
+ "weatherYearValues": 4338360,
+ "componentValues": 482040,
+ "numericValues": 4820400,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 11,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 11,
+ "24": 3995,
+ "25": 11
+ },
+ "elapsedSeconds": 57.73,
+ "dateOffset": 1,
+ "zoneColumn": 50
+ },
+ {
+ "title": "North",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/North.xlsx",
+ "bytes": 71759375,
+ "sha256": "832c75e8597eba8dba5ade3cb5a87cf808a55fe688b6c718bf684b4e1800941e",
+ "errorRows": [],
+ "rows": 96408,
+ "weatherYearValues": 4338360,
+ "componentValues": 482040,
+ "numericValues": 4820400,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 11,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 11,
+ "24": 3995,
+ "25": 11
+ },
+ "elapsedSeconds": 58.32,
+ "dateOffset": 1,
+ "zoneColumn": 50
+ },
+ {
+ "title": "South Central",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/SCENT.xlsx",
+ "bytes": 81968322,
+ "sha256": "30d467d042743f783f0ca3a09373aa15196c214da57beeacd142e82475b2d05c",
+ "errorRows": [],
+ "rows": 96408,
+ "weatherYearValues": 4338360,
+ "componentValues": 482040,
+ "numericValues": 4820400,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 11,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 11,
+ "24": 3995,
+ "25": 11
+ },
+ "elapsedSeconds": 83.15,
+ "dateOffset": 1,
+ "zoneColumn": null
+ },
+ {
+ "title": "South",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/South.xlsx",
+ "bytes": 69747135,
+ "sha256": "9cab37fe5a2094edf295677c3cceb91735390416412624ccea038e2241c783f4",
+ "errorRows": [
+ {
+ "sourceRow": 27984,
+ "markers": {
+ "Pred_2017": "#REF!"
+ }
+ },
+ {
+ "sourceRow": 27985,
+ "markers": {
+ "Pred_2017": "#REF!"
+ }
+ },
+ {
+ "sourceRow": 27986,
+ "markers": {
+ "Pred_2017": "#REF!"
+ }
+ },
+ {
+ "sourceRow": 28007,
+ "markers": {
+ "Pred_2017": "."
+ }
+ },
+ {
+ "sourceRow": 28031,
+ "markers": {
+ "Pred_2017": "."
+ }
+ },
+ {
+ "sourceRow": 28055,
+ "markers": {
+ "Pred_2017": "."
+ }
+ },
+ {
+ "sourceRow": 63068,
+ "markers": {
+ "Pred_2017": "."
+ }
+ },
+ {
+ "sourceRow": 63115,
+ "markers": {
+ "Pred_2017": "."
+ }
+ },
+ {
+ "sourceRow": 80562,
+ "markers": {
+ "Pred_2017": "#REF!"
+ }
+ },
+ {
+ "sourceRow": 80563,
+ "markers": {
+ "Pred_2017": "#REF!"
+ }
+ },
+ {
+ "sourceRow": 80564,
+ "markers": {
+ "Pred_2017": "#REF!"
+ }
+ },
+ {
+ "sourceRow": 80565,
+ "markers": {
+ "Pred_2017": "#REF!"
+ }
+ }
+ ],
+ "rows": 96398,
+ "weatherYearValues": 4337898,
+ "componentValues": 385592,
+ "numericValues": 4723490,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 11,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 21,
+ "24": 3985,
+ "25": 11
+ },
+ "elapsedSeconds": 53.4,
+ "dateOffset": 0,
+ "zoneColumn": 49
+ },
+ {
+ "title": "West",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/West.xlsx",
+ "bytes": 69356115,
+ "sha256": "276ce675a8661eb813ccaea0af9e8e4a6e2b01a98ee0f8545e0e600a97d53773",
+ "errorRows": [],
+ "rows": 96398,
+ "weatherYearValues": 4337395,
+ "componentValues": 385592,
+ "numericValues": 4722987,
+ "dateFrom": "2025-01-01",
+ "dateTo": "2035-12-31",
+ "duplicateHours": 11,
+ "sourceDateDifferences": 0,
+ "hoursPerDay": {
+ "23": 21,
+ "24": 3985,
+ "25": 11
+ },
+ "elapsedSeconds": 54.57,
+ "dateOffset": 0,
+ "zoneColumn": 49
+ }
+ ]
+}
diff --git a/tools/inputs/load-scenarios/samples.zip b/tools/inputs/load-scenarios/samples.zip
new file mode 100644
index 00000000..a9ddd11c
Binary files /dev/null and b/tools/inputs/load-scenarios/samples.zip differ
diff --git a/tools/inputs/load-scenarios/sources.json b/tools/inputs/load-scenarios/sources.json
new file mode 100644
index 00000000..2df83856
--- /dev/null
+++ b/tools/inputs/load-scenarios/sources.json
@@ -0,0 +1,336 @@
+[
+ {
+ "title": "Coast",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/Coast.xlsx",
+ "bytes": 71566674,
+ "sha256": "669a04b9bd5b5185a71cd8a667dc62a58a6cfbd0190465c6f896186c3488bc34",
+ "file": "Coast.xlsx",
+ "fixtureSha256": "243e84ded57eb6564f3336c9d9756c13ad670adfcdb0a63da65ad581be7ecef5",
+ "fixtureBytes": 40431,
+ "dateOffset": 1,
+ "zoneColumn": 50,
+ "components": [
+ [
+ "electricVehicles",
+ 51
+ ],
+ [
+ "rooftopPV",
+ 52
+ ],
+ [
+ "largeFlexibleLoad",
+ 53
+ ],
+ [
+ "contractedLoad",
+ 54
+ ],
+ [
+ "officerLetterLoad",
+ 55
+ ]
+ ],
+ "sheet": "Coast",
+ "clockColumns": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ },
+ {
+ "title": "East",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/East.xlsx",
+ "bytes": 70745927,
+ "sha256": "f1f2772b20a50a097c2715663bbebb82865378b11db62c9b9cfdc3c85dcb46de",
+ "file": "East.xlsx",
+ "fixtureSha256": "501a1e8b60886c96f70e1b7f29cb40a4778303bfef0c0290e4ee89e91ad1a085",
+ "fixtureBytes": 40239,
+ "dateOffset": 1,
+ "zoneColumn": 50,
+ "components": [
+ [
+ "electricVehicles",
+ 51
+ ],
+ [
+ "rooftopPV",
+ 52
+ ],
+ [
+ "contractedLoad",
+ 53
+ ],
+ [
+ "officerLetterLoad",
+ 54
+ ]
+ ],
+ "sheet": "East",
+ "clockColumns": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ },
+ {
+ "title": "Far West",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/FWest.xlsx",
+ "bytes": 71607380,
+ "sha256": "7f84bce206f5bb2e6f8671bb218a4dc94ae6c67eb56158f0853adb0fca5daf85",
+ "file": "FWest.xlsx",
+ "fixtureSha256": "5d337b4eb4666ba3313f70c95c4d5abcd4a5071b1031cd9181ab589fce84dd67",
+ "fixtureBytes": 40400,
+ "dateOffset": 1,
+ "zoneColumn": 50,
+ "components": [
+ [
+ "electricVehicles",
+ 51
+ ],
+ [
+ "rooftopPV",
+ 52
+ ],
+ [
+ "largeFlexibleLoad",
+ 53
+ ],
+ [
+ "contractedLoad",
+ 54
+ ],
+ [
+ "officerLetterLoad",
+ 55
+ ]
+ ],
+ "sheet": "FWest",
+ "clockColumns": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ },
+ {
+ "title": "North Central",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/Ncent.xlsx",
+ "bytes": 71851812,
+ "sha256": "bd6409a1fe11386a6afc013f6966e021642baea773f076f0663b64760d0ef455",
+ "file": "Ncent.xlsx",
+ "fixtureSha256": "19264b1bc5a5ead43beaaee7bdd4a4b7f4177b0a84d3c5caae37c37982670639",
+ "fixtureBytes": 40970,
+ "dateOffset": 1,
+ "zoneColumn": 50,
+ "components": [
+ [
+ "electricVehicles",
+ 51
+ ],
+ [
+ "rooftopPV",
+ 52
+ ],
+ [
+ "largeFlexibleLoad",
+ 53
+ ],
+ [
+ "contractedLoad",
+ 54
+ ],
+ [
+ "officerLetterLoad",
+ 55
+ ]
+ ],
+ "sheet": "NCENT",
+ "clockColumns": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ },
+ {
+ "title": "North",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/North.xlsx",
+ "bytes": 71759375,
+ "sha256": "832c75e8597eba8dba5ade3cb5a87cf808a55fe688b6c718bf684b4e1800941e",
+ "file": "North.xlsx",
+ "fixtureSha256": "ffecc77d180f28e83dddad63bdc426bf957114ecadbe65b43061aacc9206ee9d",
+ "fixtureBytes": 40589,
+ "dateOffset": 1,
+ "zoneColumn": 50,
+ "components": [
+ [
+ "electricVehicles",
+ 51
+ ],
+ [
+ "rooftopPV",
+ 52
+ ],
+ [
+ "largeFlexibleLoad",
+ 53
+ ],
+ [
+ "contractedLoad",
+ 54
+ ],
+ [
+ "officerLetterLoad",
+ 55
+ ]
+ ],
+ "sheet": "North",
+ "clockColumns": [
+ 4,
+ 2,
+ 3,
+ 0,
+ 1
+ ]
+ },
+ {
+ "title": "South Central",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/SCENT.xlsx",
+ "bytes": 81968322,
+ "sha256": "30d467d042743f783f0ca3a09373aa15196c214da57beeacd142e82475b2d05c",
+ "file": "SCENT.xlsx",
+ "fixtureSha256": "153bd35451be1cc74932491bc8ccb781402481eefaca89d4b28a3344aaa40431",
+ "fixtureBytes": 41253,
+ "dateOffset": 1,
+ "zoneColumn": null,
+ "components": [
+ [
+ "rooftopPV",
+ 50
+ ],
+ [
+ "electricVehicles",
+ 51
+ ],
+ [
+ "largeFlexibleLoad",
+ 52
+ ],
+ [
+ "contractedLoad",
+ 53
+ ],
+ [
+ "officerLetterLoad",
+ 54
+ ]
+ ],
+ "sheet": "SCENT",
+ "clockColumns": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ },
+ {
+ "title": "South",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/South.xlsx",
+ "bytes": 69747135,
+ "sha256": "9cab37fe5a2094edf295677c3cceb91735390416412624ccea038e2241c783f4",
+ "file": "South.xlsx",
+ "fixtureSha256": "47f3247f8f44f5acc9f00f3e97ab2f6d5b9c8d7f3ad73010ab101a9d73e0c3ac",
+ "fixtureBytes": 40226,
+ "dateOffset": 0,
+ "zoneColumn": 49,
+ "components": [
+ [
+ "electricVehicles",
+ 50
+ ],
+ [
+ "rooftopPV",
+ 51
+ ],
+ [
+ "contractedLoad",
+ 52
+ ],
+ [
+ "officerLetterLoad",
+ 53
+ ]
+ ],
+ "sheet": "South",
+ "clockColumns": [
+ null,
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "errorExcerpt": {
+ "file": "South-error.xlsx",
+ "sourceRows": [
+ 27984,
+ 27985,
+ 27986,
+ 28007,
+ 28031,
+ 28055,
+ 63068,
+ 63115,
+ 80562,
+ 80563,
+ 80564,
+ 80565
+ ],
+ "sha256": "073a492d6f58beb34481499946bd6012965ab65259fe0d53f0182502e4f09e50"
+ }
+ },
+ {
+ "title": "West",
+ "url": "https://www.ercot.com/files/docs/2025/08/22/West.xlsx",
+ "bytes": 69356115,
+ "sha256": "276ce675a8661eb813ccaea0af9e8e4a6e2b01a98ee0f8545e0e600a97d53773",
+ "file": "West.xlsx",
+ "fixtureSha256": "c2eddba4b8cb8c1df9dd607f6e8a2cdca60980f9c00fc39fa119d791be73e1cd",
+ "fixtureBytes": 39734,
+ "dateOffset": 0,
+ "zoneColumn": 49,
+ "components": [
+ [
+ "electricVehicles",
+ 50
+ ],
+ [
+ "rooftopPV",
+ 51
+ ],
+ [
+ "contractedLoad",
+ 52
+ ],
+ [
+ "officerLetterLoad",
+ 53
+ ]
+ ],
+ "sheet": "West",
+ "clockColumns": [
+ null,
+ 0,
+ 1,
+ 2,
+ 3
+ ]
+ }
+]
diff --git a/tools/inputs/loss-factors/historical.xlsx b/tools/inputs/loss-factors/historical.xlsx
new file mode 100644
index 00000000..65081b09
Binary files /dev/null and b/tools/inputs/loss-factors/historical.xlsx differ
diff --git a/tools/inputs/loss-factors/indexes.zip b/tools/inputs/loss-factors/indexes.zip
new file mode 100644
index 00000000..0c56be5c
Binary files /dev/null and b/tools/inputs/loss-factors/indexes.zip differ
diff --git a/tools/inputs/loss-factors/legacy.zip b/tools/inputs/loss-factors/legacy.zip
new file mode 100644
index 00000000..018860b1
Binary files /dev/null and b/tools/inputs/loss-factors/legacy.zip differ
diff --git a/tools/inputs/market-displays/displays.zip b/tools/inputs/market-displays/displays.zip
new file mode 100644
index 00000000..b418a25f
Binary files /dev/null and b/tools/inputs/market-displays/displays.zip differ
diff --git a/tools/inputs/market-displays/evidence.json b/tools/inputs/market-displays/evidence.json
new file mode 100644
index 00000000..4e7845c2
--- /dev/null
+++ b/tools/inputs/market-displays/evidence.json
@@ -0,0 +1,278 @@
+{
+ "checked": "2026-09-08",
+ "decoderSha256": "b144085e35b25ce88b140361248bcd6bb7ef8e4dcb0a1657956079908dde6df8",
+ "liveComparisons": [
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260903_dam_mcpc.html",
+ "rows": 24,
+ "numericValues": 120,
+ "operatingDay": "2026-09-03",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260903_dam_spp.html",
+ "rows": 24,
+ "numericValues": 360,
+ "operatingDay": "2026-09-03",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260903_real_time_spp.html",
+ "rows": 96,
+ "numericValues": 1440,
+ "operatingDay": "2026-09-03",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260903_actual_loads_of_forecast_zones.html",
+ "rows": 24,
+ "numericValues": 120,
+ "operatingDay": "2026-09-03",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260903_actual_loads_of_weather_zones.html",
+ "rows": 24,
+ "numericValues": 216,
+ "operatingDay": "2026-09-03",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20251102_dam_mcpc.html",
+ "wrong_day_without_table_rejected": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20251102_dam_spp.html",
+ "wrong_day_without_table_rejected": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20251102_real_time_spp.html",
+ "rows": 100,
+ "numericValues": 1500,
+ "operatingDay": "2025-11-02",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20251102_actual_loads_of_forecast_zones.html",
+ "rows": 25,
+ "numericValues": 125,
+ "operatingDay": "2025-11-02",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20251102_actual_loads_of_weather_zones.html",
+ "rows": 25,
+ "numericValues": 225,
+ "operatingDay": "2025-11-02",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260308_dam_mcpc.html",
+ "rows": 23,
+ "numericValues": 115,
+ "operatingDay": "2026-03-08",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260308_dam_spp.html",
+ "rows": 23,
+ "numericValues": 345,
+ "operatingDay": "2026-03-08",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260308_real_time_spp.html",
+ "rows": 92,
+ "numericValues": 1380,
+ "operatingDay": "2026-03-08",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260308_actual_loads_of_forecast_zones.html",
+ "rows": 23,
+ "numericValues": 115,
+ "operatingDay": "2026-03-08",
+ "all_source_values_equal": true
+ },
+ {
+ "url": "https://www.ercot.com/content/cdr/html/20260308_actual_loads_of_weather_zones.html",
+ "rows": 23,
+ "numericValues": 207,
+ "operatingDay": "2026-03-08",
+ "all_source_values_equal": true
+ }
+ ],
+ "olderDateProbes": [
+ {
+ "name": "20101201_dam_mcpc",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20101201_dam_spp",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20101201_real_time_spp",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20101201_actual_loads_of_forecast_zones",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20101201_actual_loads_of_weather_zones",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20140501_dam_mcpc",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20140501_dam_spp",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20140501_real_time_spp",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20140501_actual_loads_of_forecast_zones",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20140501_actual_loads_of_weather_zones",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20200101_dam_mcpc",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20200101_dam_spp",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20200101_real_time_spp",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20200101_actual_loads_of_forecast_zones",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20200101_actual_loads_of_weather_zones",
+ "status": 404,
+ "bytes": 62,
+ "operating_day": []
+ },
+ {
+ "name": "20251102_dam_mcpc",
+ "status": 200,
+ "bytes": 4533,
+ "operating_day": [
+ "11/03/2025"
+ ]
+ },
+ {
+ "name": "20251102_dam_spp",
+ "status": 200,
+ "bytes": 4522,
+ "operating_day": [
+ "11/03/2025"
+ ]
+ },
+ {
+ "name": "20251102_real_time_spp",
+ "status": 200,
+ "bytes": 79966,
+ "operating_day": [
+ "11/02/2025"
+ ]
+ },
+ {
+ "name": "20251102_actual_loads_of_forecast_zones",
+ "status": 200,
+ "bytes": 13858,
+ "operating_day": [
+ "11/02/2025"
+ ]
+ },
+ {
+ "name": "20251102_actual_loads_of_weather_zones",
+ "status": 200,
+ "bytes": 18717,
+ "operating_day": [
+ "11/02/2025"
+ ]
+ },
+ {
+ "name": "20260308_dam_mcpc",
+ "status": 200,
+ "bytes": 11883,
+ "operating_day": [
+ "03/08/2026"
+ ]
+ },
+ {
+ "name": "20260308_dam_spp",
+ "status": 200,
+ "bytes": 22411,
+ "operating_day": [
+ "03/08/2026"
+ ]
+ },
+ {
+ "name": "20260308_real_time_spp",
+ "status": 200,
+ "bytes": 74350,
+ "operating_day": [
+ "03/08/2026"
+ ]
+ },
+ {
+ "name": "20260308_actual_loads_of_forecast_zones",
+ "status": 200,
+ "bytes": 13144,
+ "operating_day": [
+ "03/08/2026"
+ ]
+ },
+ {
+ "name": "20260308_actual_loads_of_weather_zones",
+ "status": 200,
+ "bytes": 17628,
+ "operating_day": [
+ "03/08/2026"
+ ]
+ }
+ ],
+ "fullRetentionVerified": false
+}
diff --git a/tools/inputs/market-displays/sources.json b/tools/inputs/market-displays/sources.json
new file mode 100644
index 00000000..d5c22d82
--- /dev/null
+++ b/tools/inputs/market-displays/sources.json
@@ -0,0 +1,138 @@
+{
+ "captured": "2026-09-08",
+ "sources": [
+ {
+ "file": "20251102_actual_loads_of_forecast_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/20251102_actual_loads_of_forecast_zones.html",
+ "sha256": "30268d4f33ad016319001f577fff22525303c6cdf9831059a3598ed2d8249a48",
+ "bytes": 13858
+ },
+ {
+ "file": "20251102_actual_loads_of_weather_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/20251102_actual_loads_of_weather_zones.html",
+ "sha256": "3cdd68967f8642314daff3bdab3ffde05fdadbdf9df6aac4244182472bc19daa",
+ "bytes": 18717
+ },
+ {
+ "file": "20251102_dam_mcpc.html",
+ "url": "https://www.ercot.com/content/cdr/html/20251102_dam_mcpc.html",
+ "sha256": "9c48308ee52efffa1400241e8de8644db7028771cdc2cfcf11da826caf76f7ca",
+ "bytes": 4533
+ },
+ {
+ "file": "20251102_dam_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20251102_dam_spp.html",
+ "sha256": "1052234c12e08392e3e21fd6796f219506fb5293918a93c75f3991ccde3c0a64",
+ "bytes": 4522
+ },
+ {
+ "file": "20251102_real_time_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20251102_real_time_spp.html",
+ "sha256": "cb73a2ff2cc9dc297ffc387ff9243dfe1fda90dd5a098ecaeb17009c8da90451",
+ "bytes": 79966
+ },
+ {
+ "file": "20260308_actual_loads_of_forecast_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260308_actual_loads_of_forecast_zones.html",
+ "sha256": "3b6715c71a9f694667951894620a0430b2350de715498ab5eec5ebafa477bfb9",
+ "bytes": 13144
+ },
+ {
+ "file": "20260308_actual_loads_of_weather_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260308_actual_loads_of_weather_zones.html",
+ "sha256": "d7dd1edb142b47ebfb5f1e074a3c7983be0692e297ac8a8ea8d60e38fe90d632",
+ "bytes": 17628
+ },
+ {
+ "file": "20260308_dam_mcpc.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260308_dam_mcpc.html",
+ "sha256": "0585d4d2c9ec9db108540986e48c7ce6f9ad7a699069d831182fcc344e2c0dd0",
+ "bytes": 11883
+ },
+ {
+ "file": "20260308_dam_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260308_dam_spp.html",
+ "sha256": "d2908533a99c7424cde38591e49e661f30a808eb00c3c3415438f7d1749cd927",
+ "bytes": 22411
+ },
+ {
+ "file": "20260308_real_time_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260308_real_time_spp.html",
+ "sha256": "10e78d49659bfb8b898c9c1aafef7fa107110aeebd7757e96feab72c8b55fa84",
+ "bytes": 74350
+ },
+ {
+ "file": "20260809_real_time_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260809_real_time_spp.html",
+ "sha256": "a9b10c97ef48793c7564279a2a60c9523728d1d9aadc20828c5720bd2bd52187",
+ "bytes": 77377
+ },
+ {
+ "file": "20260902_real_time_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260902_real_time_spp.html",
+ "sha256": "623362561c09567a9b80e59c04ce5ac47c4e0de133d054c18100d366d5d78283",
+ "bytes": 77554
+ },
+ {
+ "file": "20260903_actual_loads_of_forecast_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260903_actual_loads_of_forecast_zones.html",
+ "sha256": "b5c91f3fd5d48637c78916c47c6b1862452722c9f05258cef9b21a9e618ff12c",
+ "bytes": 13521
+ },
+ {
+ "file": "20260903_actual_loads_of_weather_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260903_actual_loads_of_weather_zones.html",
+ "sha256": "4185805bb7297e5d0b85882a81a31e374e47b1e3a0c99c43ccf08cc066377909",
+ "bytes": 17241
+ },
+ {
+ "file": "20260903_dam_mcpc.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260903_dam_mcpc.html",
+ "sha256": "f6e278f2b7712e0c53879a70c55b0fe3edd808e604d46805914da5e9fd370211",
+ "bytes": 12197
+ },
+ {
+ "file": "20260903_dam_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260903_dam_spp.html",
+ "sha256": "f3b334ba4351163d3e58fcd605f17a2795de1256e40f32e6d3c44607b001a8d7",
+ "bytes": 23168
+ },
+ {
+ "file": "20260903_real_time_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/20260903_real_time_spp.html",
+ "sha256": "ae1065301741fe00d3487cf84429fa4ccbe559cb28c7075bc3995ef0a3d3d0ed",
+ "bytes": 77392
+ },
+ {
+ "file": "actual_loads_of_forecast_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/actual_loads_of_forecast_zones.html",
+ "sha256": "39638270be0c5220e993a9f9fd11253df268fb8bbb5f18693f85e73f96fc25c8",
+ "bytes": 9166
+ },
+ {
+ "file": "actual_loads_of_weather_zones.html",
+ "url": "https://www.ercot.com/content/cdr/html/actual_loads_of_weather_zones.html",
+ "sha256": "c98034b68f3b0890a2d633a4b290830cc93a9c66b3123948632f3d28a7d73b64",
+ "bytes": 11595
+ },
+ {
+ "file": "dam_mcpc.html",
+ "url": "https://www.ercot.com/content/cdr/html/dam_mcpc.html",
+ "sha256": "a9afa3f493e48cc33f163a31547aaf6d8890b974cd58718bb5bec34d8dc30b3d",
+ "bytes": 12202
+ },
+ {
+ "file": "dam_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/dam_spp.html",
+ "sha256": "73ec0968ef19a6db5f3124d7acfaa3f82aa436f81cfe8615be7955ded9c7c88c",
+ "bytes": 22225
+ },
+ {
+ "file": "real_time_spp.html",
+ "url": "https://www.ercot.com/content/cdr/html/real_time_spp.html",
+ "sha256": "f265df2d58436e452df607640a104ed6f6c805eea85fa0117b7d83d89e78eb72",
+ "bytes": 44392
+ }
+ ],
+ "limits": "Sampled published dates, not continuous retention. Two November DAM responses contain no table and report the wrong operating day; these must raise rather than return an empty success."
+}
diff --git a/tools/inputs/market-workflows-evidence.json b/tools/inputs/market-workflows-evidence.json
new file mode 100644
index 00000000..ca623e43
--- /dev/null
+++ b/tools/inputs/market-workflows-evidence.json
@@ -0,0 +1,97 @@
+{
+ "checkedAt": "2026-09-08T03:31:47.197178+00:00",
+ "marketDay": "2026-09-01",
+ "settlementPoint": "HB_HOUSTON",
+ "rows": {
+ "dam_prices": 24,
+ "rt_prices": 96,
+ "dam_ancillary_prices": 120,
+ "actual_load": 24
+ },
+ "ancillaryTypes": [
+ "ECRS",
+ "NSPIN",
+ "REGDN",
+ "REGUP",
+ "RRS"
+ ],
+ "firstRows": {
+ "dam_prices": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-01",
+ "hourEnding": "01:00",
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "25.79"
+ },
+ "rt_prices": {
+ "DSTFlag": false,
+ "deliveryDate": "2026-09-01",
+ "deliveryHour": 1,
+ "deliveryInterval": 1,
+ "settlementPoint": "HB_HOUSTON",
+ "settlementPointPrice": "36.35",
+ "settlementPointType": "HU"
+ },
+ "dam_ancillary_prices": {
+ "DSTFlag": false,
+ "MCPC": "0.19",
+ "ancillaryType": "RRS",
+ "deliveryDate": "2026-09-01",
+ "hourEnding": "01:00"
+ },
+ "actual_load": {
+ "DSTFlag": false,
+ "coast": "16195.48",
+ "east": "2218.43",
+ "farWest": "7831.93",
+ "hourEnding": "01:00",
+ "north": "1860.38",
+ "northC": "18904.07",
+ "operatingDay": "2026-09-01",
+ "southC": "11129.06",
+ "southern": "5415.08",
+ "total": "65688.68",
+ "west": "2134.26"
+ }
+ },
+ "forecastRows": 192,
+ "forecastDocument": {
+ "docId": 642522821,
+ "friendlyName": "LFCWEATHERNP3561_csv",
+ "postDatetime": "2019-01-01T00:30:00"
+ },
+ "forecastsWithMissingEmbeddedPostedTime": 192,
+ "requests": [
+ {
+ "method": "GET",
+ "path": "/api/public-reports/np4-190-cd/dam_stlmnt_pnt_prices",
+ "query": "deliveryDateFrom=2026-09-01&deliveryDateTo=2026-09-01&settlementPoint=HB_HOUSTON&page=1"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/np6-905-cd/spp_node_zone_hub",
+ "query": "deliveryDateFrom=2026-09-01&deliveryDateTo=2026-09-01&settlementPoint=HB_HOUSTON&page=1"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/np4-188-cd/dam_clear_price_for_cap",
+ "query": "deliveryDateFrom=2026-09-01&deliveryDateTo=2026-09-01&page=1"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/np6-345-cd/act_sys_load_by_wzn",
+ "query": "operatingDayFrom=2026-09-01&operatingDayTo=2026-09-01&page=1"
+ },
+ {
+ "method": "GET",
+ "path": "/api/public-reports/archive/np3-561-cd",
+ "query": "page=1&size=1000&postDatetimeFrom=2019-01-01T00%3A30%3A00&postDatetimeTo=2019-01-01T00%3A30%3A00"
+ },
+ {
+ "method": "POST",
+ "path": "/api/public-reports/archive/np3-561-cd/download",
+ "query": ""
+ }
+ ],
+ "checks": "Every exported line reparsed through its concrete SDK row model. Selected price point/day and RT intervals/hours verified; load operating day and original forecast document identity/time verified. This is workflow verification, not an independent numerical source comparison or an investment/backtest claim."
+}
\ No newline at end of file
diff --git a/tools/inputs/monthly-forecasts/evidence.json b/tools/inputs/monthly-forecasts/evidence.json
new file mode 100644
index 00000000..6cb4bfb5
--- /dev/null
+++ b/tools/inputs/monthly-forecasts/evidence.json
@@ -0,0 +1,17 @@
+{
+ "checkedAt": "2026-09-08T15:42:44.417864+00:00",
+ "sourceIndex": "https://www.ercot.com/gridinfo/load/forecast",
+ "linkedWorkbooks": 11,
+ "liveDiscoveryMatchesSources": true,
+ "rows": 1705,
+ "numericPeakEnergyValues": 3408,
+ "missingDateRows": 1,
+ "blankValueRows": 1,
+ "unspecifiedUnitRows": 481,
+ "sourceYearBounds": [
+ 2014,
+ 2044
+ ],
+ "decoderSha256": "c35faad9c952d06c8345db36d50926c54b46bcfa58f638594aff039d33544642",
+ "scope": "Every source year/month/peak/energy cell in all 11 linked monthly workbooks compared using separately recorded original table coordinates. Keeps date and value columns on the same source row; no repairs or unit inference. 2025 TSP first value pair is beside year/month headers and has unknown date, while its final December 2044 row has blank values. Monthly Peaks / Annual Energy labels have no declared units in this workbook, so both unit fields remain None for both 2025 scenarios. Other workbooks explicitly label MW and MWh. Source target years are not issue dates, retention bounds or actual-load observations. Reuses peak-forecast captured index fixtures; original monthly binaries are unchanged."
+}
diff --git a/tools/inputs/monthly-forecasts/sources.json b/tools/inputs/monthly-forecasts/sources.json
new file mode 100644
index 00000000..72927ecd
--- /dev/null
+++ b/tools/inputs/monthly-forecasts/sources.json
@@ -0,0 +1,197 @@
+[
+ {
+ "url": "https://www.ercot.com/files/docs/2025/04/08/2025-ERCOT-Monthly-Peak-Demand-and-Energy-Forecast.xlsx",
+ "title": "2025 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "cf2f50b9f9846f6d378715b7027a58bbeda926ce43626178e0604e48866e2e75",
+ "bytes": 27202,
+ "file": "a786c1c6b50a-2025-ERCOT-Monthly-Peak-Demand-and-Energy-Forecast.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 3,
+ "lastRow": 242,
+ "column": 1,
+ "headerRow": 2,
+ "title": "ERCOT Adjusted Forecast"
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 3,
+ "lastRow": 243,
+ "column": 6,
+ "headerRow": 2,
+ "title": "TSP Provided Forecast"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2014/07/24/ercot_monthly_peak_demand_and_energy_forecast1.xls",
+ "title": "ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "4fe6ea1d6b5194083b8e46358534d820a5cecdff31a9f4f4d3bc3f9a81418ad8",
+ "bytes": 33280,
+ "file": "861f4048e3ea-ercot_monthly_peak_demand_and_energy_forecast1.xls",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 135,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/01/11/ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2016.xls",
+ "title": "ERCOT Monthly Peak Demand and Energy Forecast 2016",
+ "sha256": "c4a3ed7748f4704047b2520dc55eca3d1b99bd6eb83c7a1c6f000893b1169c87",
+ "bytes": 29696,
+ "file": "53123807a8bc-ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2016.xls",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/12/12/ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2017.xls",
+ "title": "ERCOT Monthly Peak Demand and Energy Forecast 2017",
+ "sha256": "7de4384b910733962c0290cc33890426b0e754c13de1a32b90cfb398cc81d076",
+ "bytes": 35328,
+ "file": "def7997f9048-ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2017.xls",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/12/15/ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2018_2027.xls",
+ "title": "2018 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "e470c73914cae24868716f4c86f7efe9a3f3f61e1786427699d1735db45fb7b6",
+ "bytes": 36864,
+ "file": "fe6fca6ee85b-ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2018_2027.xls",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2018/12/11/ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2019_2028.xlsx",
+ "title": "2019 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "4e104aeab396bfd32d1eb21f2d9d82879f205bb476f293fce00c0418b47a6d03",
+ "bytes": 17460,
+ "file": "8a61fe530891-ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2019_2028.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2019/12/16/ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2020_2029.xlsx",
+ "title": "2020 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "5dd5c23b44350a1a141eab5651a2def68bdb9450e327581deb4390d38963ae24",
+ "bytes": 17541,
+ "file": "49556659a9df-ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2020_2029.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2020/12/28/ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2021_2030.xlsx",
+ "title": "2021 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "0e2dbd49829154aca0ff9f336fd385e31fa581cb36c0296e4582e1f0ec1f717c",
+ "bytes": 17476,
+ "file": "4c0e0ebfdc8a-ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2021_2030.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/02/10/ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2022_2031.xlsx",
+ "title": "2022 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "7c9ef4786c97c789422aaf48bd1c32f3d5bba3e99bf72d47f35fb5007ecb8cae",
+ "bytes": 16387,
+ "file": "b33087fcf830-ERCOT_Monthly_Peak_Demand_and_Energy_Forecast_2022_2031.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2023/01/18/ERCOT-Monthly-Peak-Demand-and-Energy-Forecast-2023-2032.xlsx",
+ "title": "2023 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "be01712f33d422a522b256ceb54c21886354068377acf2426633884a2e207192",
+ "bytes": 16332,
+ "file": "0315b3e8d5fb-ERCOT-Monthly-Peak-Demand-and-Energy-Forecast-2023-2032.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 123,
+ "column": 1,
+ "headerRow": 3,
+ "title": "ERCOT - Monthly Forecast of Peak Demand and Energy"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/07/18/2024-ERCOT-Monthly-Peak-Demand-and-Energy-Forecast.xlsx",
+ "title": "2024 ERCOT Monthly Peak Demand and Energy Forecast",
+ "sha256": "090f9b764f28e922e5b6f24d707f4b93bc96bacfce61ca619b4072c37bd9a7ee",
+ "bytes": 16521,
+ "file": "148fde8a58e0-2024-ERCOT-Monthly-Peak-Demand-and-Energy-Forecast.xlsx",
+ "tables": [
+ {
+ "sheet": "Monthly Peak and Energy",
+ "firstRow": 2,
+ "lastRow": 133,
+ "column": 1,
+ "headerRow": 1,
+ "title": null
+ }
+ ]
+ }
+]
diff --git a/tools/inputs/monthly-forecasts/workbooks.zip b/tools/inputs/monthly-forecasts/workbooks.zip
new file mode 100644
index 00000000..1c06cafe
Binary files /dev/null and b/tools/inputs/monthly-forecasts/workbooks.zip differ
diff --git a/tools/inputs/monthly-performance/evidence.json b/tools/inputs/monthly-performance/evidence.json
new file mode 100644
index 00000000..d6c8d6b3
--- /dev/null
+++ b/tools/inputs/monthly-performance/evidence.json
@@ -0,0 +1,292 @@
+{
+ "checkedAt": "2026-09-08",
+ "files": [
+ {
+ "title": "DayAhead Backcast Report August 2026",
+ "url": "https://www.ercot.com/files/docs/2026/09/02/DayAhead-Backcast-Report-Aug26.xlsx",
+ "bytes": 31454,
+ "sha256": "56c5c02cab3124b4b6bf8951be579940257ec78421e036a27d4712737d267c7e",
+ "member": "b6ddae1d4ee5-DayAhead-Backcast-Report-Aug26.xlsx",
+ "rows": 222,
+ "numericValues": 218,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2021-01-01",
+ "lastMonth": "2026-12-01",
+ "lastNonemptyMonth": "2026-08-01"
+ },
+ {
+ "title": "DayAhead Backcast Report July 2026",
+ "url": "https://www.ercot.com/files/docs/2026/08/07/DayAhead-Backcast-Report-July26.xlsx",
+ "bytes": 30295,
+ "sha256": "b95bc46e25f9eb641c96a716595edb1b59564cf306c00fb15b0c660033576b4c",
+ "member": "ea5c3cea1e03-DayAhead-Backcast-Report-July26.xlsx",
+ "rows": 222,
+ "numericValues": 217,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2021-01-01",
+ "lastMonth": "2026-12-01",
+ "lastNonemptyMonth": "2026-07-01"
+ },
+ {
+ "title": "DayAhead Backcast Report June 2026",
+ "url": "https://www.ercot.com/files/docs/2026/07/13/DayAhead-Backcast-Report-June26.xlsx",
+ "bytes": 29993,
+ "sha256": "c813b1b34c1ecbbe847075eaf473af73d578c1f3e87c8c14f575637082f9ce28",
+ "member": "9d10dc854e34-DayAhead-Backcast-Report-June26.xlsx",
+ "rows": 222,
+ "numericValues": 216,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2021-01-01",
+ "lastMonth": "2026-12-01",
+ "lastNonemptyMonth": "2026-06-01"
+ },
+ {
+ "title": "DayAhead Backcast Report May 2026",
+ "url": "https://www.ercot.com/files/docs/2026/06/03/DayAhead-Backcast-Report-May26.xlsx",
+ "bytes": 29699,
+ "sha256": "39433f58103b3f63674a5ffb1d425504b7857c840d53297681de3677e81a6d33",
+ "member": "6e0099a97f4e-DayAhead-Backcast-Report-May26.xlsx",
+ "rows": 222,
+ "numericValues": 215,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2021-01-01",
+ "lastMonth": "2026-12-01",
+ "lastNonemptyMonth": "2026-05-01"
+ },
+ {
+ "title": "DayAhead Backcast Report April 2026",
+ "url": "https://www.ercot.com/files/docs/2026/05/05/DayAhead-Backcast-Report-Apr26.xlsx",
+ "bytes": 29688,
+ "sha256": "d47b79ec29a1eff4df5875fc663ccd7792e259fec1fbd1671a6666142e922503",
+ "member": "47d0ab2c33e6-DayAhead-Backcast-Report-Apr26.xlsx",
+ "rows": 222,
+ "numericValues": 214,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2021-01-01",
+ "lastMonth": "2026-12-01",
+ "lastNonemptyMonth": "2026-04-01"
+ },
+ {
+ "title": "DayAhead Backcast Report March 2026",
+ "url": "https://www.ercot.com/files/docs/2026/04/10/DayAhead-Backcast-Report-Mar26.xlsx",
+ "bytes": 29703,
+ "sha256": "2335beefa0f84f7da085a8988de43a640c965d1d8abac03542946d1d9ea8aeff",
+ "member": "8cbfb296c145-DayAhead-Backcast-Report-Mar26.xlsx",
+ "rows": 222,
+ "numericValues": 213,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2021-01-01",
+ "lastMonth": "2026-12-01",
+ "lastNonemptyMonth": "2026-03-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report December 2025",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/DayAhead-Backcast-Report-Dec25.xlsx",
+ "bytes": 29822,
+ "sha256": "85a29b8985a491bc613e76888cabfe55c07f6e4e923226a9798b5bd4bb0e141d",
+ "member": "8d20bbf5b746-DayAhead-Backcast-Report-Dec25.xlsx",
+ "rows": 222,
+ "numericValues": 222,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-12-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report November 2025",
+ "url": "https://www.ercot.com/files/docs/2025/12/03/DayAhead-Backcast-ReportNov25.xlsx",
+ "bytes": 39009,
+ "sha256": "8fb8e7004886945e051bf610b2a83f7cbdbad22d3670cbe833b9da7dbe03dbfd",
+ "member": "d8519c31f962-DayAhead-Backcast-ReportNov25.xlsx",
+ "rows": 222,
+ "numericValues": 221,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-11-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report October 2025",
+ "url": "https://www.ercot.com/files/docs/2025/11/05/DayAhead-Backcast-ReportOct25.xlsx",
+ "bytes": 39295,
+ "sha256": "e8ce2ca39640ae664319a5b56ed6a6197d2f8b99a2a52dae39c4496e29958a2a",
+ "member": "9c05bc97f3a3-DayAhead-Backcast-ReportOct25.xlsx",
+ "rows": 222,
+ "numericValues": 220,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-10-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report September 2025",
+ "url": "https://www.ercot.com/files/docs/2025/10/03/DayAhead-Backcast-ReportSep25.xlsx",
+ "bytes": 39040,
+ "sha256": "f91e671b3002cb8d53c8dbcd3cd0e78b36c9fe827762600f370f4180082e8cce",
+ "member": "3470dd93bd83-DayAhead-Backcast-ReportSep25.xlsx",
+ "rows": 222,
+ "numericValues": 219,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-09-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report August 2025",
+ "url": "https://www.ercot.com/files/docs/2025/09/08/DayAhead-Backcast-ReportAug25.xlsx",
+ "bytes": 39026,
+ "sha256": "6407d1a591ef0ccbb5703a4893503189ec2f51d2e9c1cc56cc63bfe455b6869b",
+ "member": "7c588414b54d-DayAhead-Backcast-ReportAug25.xlsx",
+ "rows": 222,
+ "numericValues": 218,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-08-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report July 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/DayAhead-Backcast-ReportJul25.xlsx",
+ "bytes": 39022,
+ "sha256": "974170e626faa417dc0fa67a355132cb7bc1732989fdae3b774d8ddc7baffba9",
+ "member": "6bd62e74c0a3-DayAhead-Backcast-ReportJul25.xlsx",
+ "rows": 222,
+ "numericValues": 217,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-07-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report June 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/DayAhead-Backcast-ReportJun25.xlsx",
+ "bytes": 38977,
+ "sha256": "8da367d7fc3bda1473886592b502fa5b0a48eeb32e5e46bade0d319e132decab",
+ "member": "2dab7f9356ab-DayAhead-Backcast-ReportJun25.xlsx",
+ "rows": 222,
+ "numericValues": 216,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-06-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report May 2025",
+ "url": "https://www.ercot.com/files/docs/2025/06/12/DayAhead-Backcast-ReportMay25.xlsb.xlsx",
+ "bytes": 38906,
+ "sha256": "d598836a7de9103530d0537a27c5275476ec9f5ddd77fa2f81793c9c62a6aac8",
+ "member": "1cc4189567ea-DayAhead-Backcast-ReportMay25.xlsb.xlsx",
+ "rows": 222,
+ "numericValues": 215,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-05-01"
+ },
+ {
+ "title": "Day-Ahead Backcast Report April 2025",
+ "url": "https://www.ercot.com/files/docs/2024/07/01/DayAhead-Backcast-Report.xlsb.xlsx",
+ "bytes": 38924,
+ "sha256": "99d73d62cfa710ca573ce67124ae7e8259a54b0c3d6946e310dc00e7e4288647",
+ "member": "e9b84faff61e-DayAhead-Backcast-Report.xlsb.xlsx",
+ "rows": 222,
+ "numericValues": 214,
+ "explicitPercentValues": 150,
+ "kinds": {
+ "forecast": 75,
+ "target": 50,
+ "backcast": 97
+ },
+ "firstMonth": "2020-01-01",
+ "lastMonth": "2025-12-01",
+ "lastNonemptyMonth": "2025-04-01"
+ }
+ ],
+ "liveOriginalsByteEqual": true,
+ "rows": 3330,
+ "numericValues": 3255,
+ "explicitPercentValues": 2250,
+ "index": "https://www.ercot.com/gridinfo/load/forecast",
+ "decoderSha256": "e247154645a2aae089b16c1c62614d5adf8a549f9dc7354b0e65b80ac59cdda8",
+ "allMonthlyTableCellsCompared": true,
+ "regressionTest": "tests/test_monthly_performance.py",
+ "notes": [
+ "All15 complete original workbooks are regression fixtures and were freshly downloaded with byte-identical SHA256 hashes.",
+ "Each workbook has125 forecast/target cells,72 year/month backcast cells and25 rolling backcast cells; all222 values and their dates/formats/labels match originalcells.",
+ "3330 records include75 blank future values.2250 values explicitly use Excel percentage formatting and support the percent property; unlabelled numeric scales return percent=None.",
+ "Original date days20/24/25/26 are retained as sourceDate; month is explicitly normalized to its calendar first day.",
+ "Forecast errors, backcasts and Goal/Stretch targets have distinct kinds. Backcast and Day-Ahead Backcast series remain distinct, including overlapping months and publication vintages.",
+ "Charts, external chart references, the empty Average label and two unlabelled diagnostic #DIV/0! cells outside monthly tables are not treated as monthly observations.",
+ "Backcasts use retrospectively supplied inputs and do not establish forecasts available at a historical decision time. No issuance times are inferred."
+ ]
+}
diff --git a/tools/inputs/monthly-performance/sources.json b/tools/inputs/monthly-performance/sources.json
new file mode 100644
index 00000000..a7d2cc09
--- /dev/null
+++ b/tools/inputs/monthly-performance/sources.json
@@ -0,0 +1,107 @@
+[
+ {
+ "title": "DayAhead Backcast Report August 2026",
+ "url": "https://www.ercot.com/files/docs/2026/09/02/DayAhead-Backcast-Report-Aug26.xlsx",
+ "bytes": 31454,
+ "sha256": "56c5c02cab3124b4b6bf8951be579940257ec78421e036a27d4712737d267c7e",
+ "member": "b6ddae1d4ee5-DayAhead-Backcast-Report-Aug26.xlsx"
+ },
+ {
+ "title": "DayAhead Backcast Report July 2026",
+ "url": "https://www.ercot.com/files/docs/2026/08/07/DayAhead-Backcast-Report-July26.xlsx",
+ "bytes": 30295,
+ "sha256": "b95bc46e25f9eb641c96a716595edb1b59564cf306c00fb15b0c660033576b4c",
+ "member": "ea5c3cea1e03-DayAhead-Backcast-Report-July26.xlsx"
+ },
+ {
+ "title": "DayAhead Backcast Report June 2026",
+ "url": "https://www.ercot.com/files/docs/2026/07/13/DayAhead-Backcast-Report-June26.xlsx",
+ "bytes": 29993,
+ "sha256": "c813b1b34c1ecbbe847075eaf473af73d578c1f3e87c8c14f575637082f9ce28",
+ "member": "9d10dc854e34-DayAhead-Backcast-Report-June26.xlsx"
+ },
+ {
+ "title": "DayAhead Backcast Report May 2026",
+ "url": "https://www.ercot.com/files/docs/2026/06/03/DayAhead-Backcast-Report-May26.xlsx",
+ "bytes": 29699,
+ "sha256": "39433f58103b3f63674a5ffb1d425504b7857c840d53297681de3677e81a6d33",
+ "member": "6e0099a97f4e-DayAhead-Backcast-Report-May26.xlsx"
+ },
+ {
+ "title": "DayAhead Backcast Report April 2026",
+ "url": "https://www.ercot.com/files/docs/2026/05/05/DayAhead-Backcast-Report-Apr26.xlsx",
+ "bytes": 29688,
+ "sha256": "d47b79ec29a1eff4df5875fc663ccd7792e259fec1fbd1671a6666142e922503",
+ "member": "47d0ab2c33e6-DayAhead-Backcast-Report-Apr26.xlsx"
+ },
+ {
+ "title": "DayAhead Backcast Report March 2026",
+ "url": "https://www.ercot.com/files/docs/2026/04/10/DayAhead-Backcast-Report-Mar26.xlsx",
+ "bytes": 29703,
+ "sha256": "2335beefa0f84f7da085a8988de43a640c965d1d8abac03542946d1d9ea8aeff",
+ "member": "8cbfb296c145-DayAhead-Backcast-Report-Mar26.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report December 2025",
+ "url": "https://www.ercot.com/files/docs/2026/03/27/DayAhead-Backcast-Report-Dec25.xlsx",
+ "bytes": 29822,
+ "sha256": "85a29b8985a491bc613e76888cabfe55c07f6e4e923226a9798b5bd4bb0e141d",
+ "member": "8d20bbf5b746-DayAhead-Backcast-Report-Dec25.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report November 2025",
+ "url": "https://www.ercot.com/files/docs/2025/12/03/DayAhead-Backcast-ReportNov25.xlsx",
+ "bytes": 39009,
+ "sha256": "8fb8e7004886945e051bf610b2a83f7cbdbad22d3670cbe833b9da7dbe03dbfd",
+ "member": "d8519c31f962-DayAhead-Backcast-ReportNov25.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report October 2025",
+ "url": "https://www.ercot.com/files/docs/2025/11/05/DayAhead-Backcast-ReportOct25.xlsx",
+ "bytes": 39295,
+ "sha256": "e8ce2ca39640ae664319a5b56ed6a6197d2f8b99a2a52dae39c4496e29958a2a",
+ "member": "9c05bc97f3a3-DayAhead-Backcast-ReportOct25.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report September 2025",
+ "url": "https://www.ercot.com/files/docs/2025/10/03/DayAhead-Backcast-ReportSep25.xlsx",
+ "bytes": 39040,
+ "sha256": "f91e671b3002cb8d53c8dbcd3cd0e78b36c9fe827762600f370f4180082e8cce",
+ "member": "3470dd93bd83-DayAhead-Backcast-ReportSep25.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report August 2025",
+ "url": "https://www.ercot.com/files/docs/2025/09/08/DayAhead-Backcast-ReportAug25.xlsx",
+ "bytes": 39026,
+ "sha256": "6407d1a591ef0ccbb5703a4893503189ec2f51d2e9c1cc56cc63bfe455b6869b",
+ "member": "7c588414b54d-DayAhead-Backcast-ReportAug25.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report July 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/DayAhead-Backcast-ReportJul25.xlsx",
+ "bytes": 39022,
+ "sha256": "974170e626faa417dc0fa67a355132cb7bc1732989fdae3b774d8ddc7baffba9",
+ "member": "6bd62e74c0a3-DayAhead-Backcast-ReportJul25.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report June 2025",
+ "url": "https://www.ercot.com/files/docs/2025/08/06/DayAhead-Backcast-ReportJun25.xlsx",
+ "bytes": 38977,
+ "sha256": "8da367d7fc3bda1473886592b502fa5b0a48eeb32e5e46bade0d319e132decab",
+ "member": "2dab7f9356ab-DayAhead-Backcast-ReportJun25.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report May 2025",
+ "url": "https://www.ercot.com/files/docs/2025/06/12/DayAhead-Backcast-ReportMay25.xlsb.xlsx",
+ "bytes": 38906,
+ "sha256": "d598836a7de9103530d0537a27c5275476ec9f5ddd77fa2f81793c9c62a6aac8",
+ "member": "1cc4189567ea-DayAhead-Backcast-ReportMay25.xlsb.xlsx"
+ },
+ {
+ "title": "Day-Ahead Backcast Report April 2025",
+ "url": "https://www.ercot.com/files/docs/2024/07/01/DayAhead-Backcast-Report.xlsb.xlsx",
+ "bytes": 38924,
+ "sha256": "99d73d62cfa710ca573ce67124ae7e8259a54b0c3d6946e310dc00e7e4288647",
+ "member": "e9b84faff61e-DayAhead-Backcast-Report.xlsb.xlsx"
+ }
+]
diff --git a/tools/inputs/monthly-performance/workbooks.zip b/tools/inputs/monthly-performance/workbooks.zip
new file mode 100644
index 00000000..cb058fc9
Binary files /dev/null and b/tools/inputs/monthly-performance/workbooks.zip differ
diff --git a/tools/inputs/peak-forecasts/evidence.json b/tools/inputs/peak-forecasts/evidence.json
new file mode 100644
index 00000000..d990999d
--- /dev/null
+++ b/tools/inputs/peak-forecasts/evidence.json
@@ -0,0 +1,20 @@
+{
+ "checkedAt": "2026-09-08T15:31:30.879064+00:00",
+ "sourceIndex": "https://www.ercot.com/gridinfo/load/forecast",
+ "linkedWorkbooks": 11,
+ "liveDiscoveryMatchesSources": true,
+ "forecastRows": 155,
+ "weatherScenarioValues": 2276,
+ "summaryValues": 286,
+ "unlabelledAuxiliaryValues": 150,
+ "forecastYearBounds": [
+ 2014,
+ 2033
+ ],
+ "weatherYearBounds": [
+ 2002,
+ 2023
+ ],
+ "decoderSha256": "6caff9fcc60781fed3c6cb72bd412a7ec0ac8f43bc5125f408d20b9713ae1ce2",
+ "scope": "Every numerical cell on the forecast-year rows of all labelled forecast tables in 11 linked XLS/XLSX files compared in regression tests with independently addressed original source cells. Includes separate gross/net/rooftop PV tables, TSP/adjusted sheets, large-load summaries and unlabelled numeric cells with original one-based column positions. Excludes Excel Compatibility Report. Forecasts are scenarios, not actual loads or point-in-time hourly forecasts. Forecast year bounds are source target years, not issue dates. Monthly/hourly/seasonal and forecast-performance workbook families are not covered by this reader."
+}
diff --git a/tools/inputs/peak-forecasts/indexes.zip b/tools/inputs/peak-forecasts/indexes.zip
new file mode 100644
index 00000000..d950774b
Binary files /dev/null and b/tools/inputs/peak-forecasts/indexes.zip differ
diff --git a/tools/inputs/peak-forecasts/sources.json b/tools/inputs/peak-forecasts/sources.json
new file mode 100644
index 00000000..3ea434ab
--- /dev/null
+++ b/tools/inputs/peak-forecasts/sources.json
@@ -0,0 +1,213 @@
+[
+ {
+ "url": "https://www.ercot.com/files/docs/2025/04/08/ERCOT-Peak-Demand-Scenarios.xlsx",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "6466032a028185f22abb287ca7e55816694ebe8233605299b053bb3a8c34696f",
+ "bytes": 15096,
+ "file": "25d1b3f59259-ERCOT-Peak-Demand-Scenarios.xlsx",
+ "tables": [
+ {
+ "sheet": "TSP Provided",
+ "titleRow": 2,
+ "headerRow": 6,
+ "firstRow": 7,
+ "lastRow": 13
+ },
+ {
+ "sheet": "ERCOT Adjusted",
+ "titleRow": 2,
+ "headerRow": 6,
+ "firstRow": 7,
+ "lastRow": 13
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/05/08/ercot_peak_demand_scenarios.xls",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "c526076699563b6566175264758c2f36ae43760b0524bbfe1e769c9ca4aff405",
+ "bytes": 27648,
+ "file": "344debffaa39-ercot_peak_demand_scenarios.xls",
+ "tables": [
+ {
+ "sheet": "ERCOT Peak - Weather Scenarios",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 16
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/01/04/ercot_peak_demand_scenarios_2016.xls",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "10ef5f43b7f22976703ea15afa4d9b732ea120d4505a73741167dd457a787740",
+ "bytes": 34816,
+ "file": "53d2d26ea538-ercot_peak_demand_scenarios_2016.xls",
+ "tables": [
+ {
+ "sheet": "ERCOT Peak - Weather Scenarios",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/01/19/ERCOT_Peak_Demand_Scenarios_2017_01192017.xls",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "3ad2dbc187f6886fc0f8b00e2d857d34cf9ff5004614bd144f334ee2b5315af6",
+ "bytes": 35328,
+ "file": "29d0be507777-ERCOT_Peak_Demand_Scenarios_2017_01192017.xls",
+ "tables": [
+ {
+ "sheet": "ERCOT Peak - Weather Scenarios",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/12/13/ERCOT_Peak_Demand_Scenarios_2018_2027.xls",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "21633819e404c270b3fc38f5706d9e2e35f47af00de10e7bdcd8c9d7f66b0a08",
+ "bytes": 32256,
+ "file": "f571952deb38-ERCOT_Peak_Demand_Scenarios_2018_2027.xls",
+ "tables": [
+ {
+ "sheet": "ERCOT Peak - Weather Scenarios",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2018/12/11/ERCOT_Peak_Demand_Scenarios_2019_2028.xlsx",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "141f9ffd3595b59c6c0e774be122caec01d7c65bd9a1306486ff300f4f21842a",
+ "bytes": 17793,
+ "file": "6420b6ba441c-ERCOT_Peak_Demand_Scenarios_2019_2028.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2019/12/10/ERCOT_Peak_Demand_Scenarios_2020_2029.xlsx",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "288aed8cab2746de0cfcb66b4ad67dacb403fc83aa6f52dffa5aa38896dfc3b3",
+ "bytes": 19307,
+ "file": "6535a835e2e7-ERCOT_Peak_Demand_Scenarios_2020_2029.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2020/12/28/ERCOT_Peak_Demand_Scenarios_2021_2030.xlsx",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "a515547d2c875b3b81c580e91f3386cdd1f6e49864b24bd74fb6c9cfe812aac0",
+ "bytes": 17884,
+ "file": "1d62d1cb3994-ERCOT_Peak_Demand_Scenarios_2021_2030.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/02/24/ERCOT_Peak_Demand_Scenarios.xlsx",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "2975371c69da9a520c7db8643c2dd4079af867f44a371481ff45aaa1316886d6",
+ "bytes": 24852,
+ "file": "7ee1cc8be426-ERCOT_Peak_Demand_Scenarios.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ },
+ {
+ "sheet": "Sheet1",
+ "titleRow": 19,
+ "headerRow": 23,
+ "firstRow": 24,
+ "lastRow": 33
+ },
+ {
+ "sheet": "Sheet1",
+ "titleRow": 37,
+ "headerRow": 41,
+ "firstRow": 42,
+ "lastRow": 51
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2023/01/18/ERCOT-Peak-Demand-Scenarios-2023-2032.xlsx",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "3dbabeee96344530adbba2199849707a5d3c3af17b420bdf9182f6e164842c5b",
+ "bytes": 29688,
+ "file": "0a2c016277e4-ERCOT-Peak-Demand-Scenarios-2023-2032.xlsx",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "titleRow": 1,
+ "headerRow": 5,
+ "firstRow": 6,
+ "lastRow": 15
+ },
+ {
+ "sheet": "Sheet1",
+ "titleRow": 19,
+ "headerRow": 23,
+ "firstRow": 24,
+ "lastRow": 33
+ },
+ {
+ "sheet": "Sheet1",
+ "titleRow": 37,
+ "headerRow": 41,
+ "firstRow": 42,
+ "lastRow": 51
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/07/18/ERCOT-Peak-Demand-Scenarios.xlsx",
+ "title": "ERCOT Peak Demand Scenarios",
+ "sha256": "91b40c1cfc150e9cb8a317fbaf1296830e5da57ece20ed36673c0318eb6e99c5",
+ "bytes": 13943,
+ "file": "4c9b09d0b4d5-ERCOT-Peak-Demand-Scenarios.xlsx",
+ "tables": [
+ {
+ "sheet": "Net Summer Peak Demand",
+ "titleRow": 2,
+ "headerRow": 6,
+ "firstRow": 7,
+ "lastRow": 16
+ }
+ ]
+ }
+]
diff --git a/tools/inputs/peak-forecasts/workbooks.zip b/tools/inputs/peak-forecasts/workbooks.zip
new file mode 100644
index 00000000..9228f2d6
Binary files /dev/null and b/tools/inputs/peak-forecasts/workbooks.zip differ
diff --git a/tools/inputs/public-capacity-changes-evidence.json b/tools/inputs/public-capacity-changes-evidence.json
new file mode 100644
index 00000000..5a2f0611
--- /dev/null
+++ b/tools/inputs/public-capacity-changes-evidence.json
@@ -0,0 +1,172 @@
+{
+ "checkedAt": "2026-09-08T10:51:53.474202+00:00",
+ "sourceManifest": "public-capacity-changes-sources.csv",
+ "sourceManifestSha256": "f0479fa993badaade1295beac82f22713edb6e9bf487945f6c51aedf47b09247",
+ "discovery": {
+ "capacityWorkbooks": 169,
+ "moraWorkbooks": 37,
+ "pagesPerDiscovery": 27,
+ "source": "Captured current-page link set plus all original historical-year HTML pages; URL encoding normalized for comparison against downloaded inventories."
+ },
+ "comparison": {
+ "counts": {
+ "totalNumericCells": 92312,
+ "projectRows": 42628,
+ "totalRows": 16554,
+ "totalBlankCells": 4
+ },
+ "missingProjectFields": {
+ "approvedForSynchronization": 16146,
+ "comments": 221,
+ "interconnectionAgreementSigned": 82,
+ "financialSecurity": 58,
+ "fuel": 52
+ },
+ "agreementStatuses": {
+ "12/31/1899": 1,
+ "Not Required": 1,
+ "Date Not Available": 11
+ },
+ "sourceGroups": {
+ "None": 40388,
+ "DGRs": 134,
+ "Small Generator": 38,
+ "Small Generators": 2068
+ },
+ "periodTypes": {
+ "Year:int": 10722,
+ "Year:date": 1062,
+ "Month/Year:date": 4770
+ },
+ "firstReportMonth": "2018-08-01",
+ "lastReportMonth": "2026-07-01",
+ "uniqueReportMonths": 96,
+ "firstPeriodYear": 1999,
+ "lastPeriodYear": 2033,
+ "comparison": "All project fields and every named capacity-series cell compared against original openpyxl values. Independent source-row completeness, date/status types, original column/group/period labels, correction/footnote text and actual source URLs checked. No SDK parsing helper used for expected values."
+ },
+ "fixture": {
+ "path": "tools/inputs/public-tables/capacity-changes.zip",
+ "bytes": 1313683,
+ "sha256": "552fc4efb2d2f85da92f4109d2ab853b3193a1702232b1ee86cdb16e30978329",
+ "files": [
+ {
+ "member": "2018/10/02/Capacity_Changes_by_Fuel_Type_Charts_September_2018.xlsx",
+ "url": "https://www.ercot.com/files/docs/2018/10/02/Capacity_Changes_by_Fuel_Type_Charts_September_2018.xlsx",
+ "sha256": "06e4e25504c71bff2a28193d7c23f21e8abde907e2e71496cd881c6863b1bc6c",
+ "bytes": 70601
+ },
+ {
+ "member": "2018/12/04/Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx",
+ "url": "https://www.ercot.com/files/docs/2018/12/04/Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx",
+ "sha256": "3e450d89f54a232fdc985467a8e69c61d86cd1af55d09df37612849cfcf241cc",
+ "bytes": 74113
+ },
+ {
+ "member": "2018/12/11/Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx",
+ "url": "https://www.ercot.com/files/docs/2018/12/11/Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx",
+ "sha256": "3e450d89f54a232fdc985467a8e69c61d86cd1af55d09df37612849cfcf241cc",
+ "bytes": 74113
+ },
+ {
+ "member": "2019/01/09/Capacity_Changes_by_Fuel_Type_Charts_December_2018.xlsx",
+ "url": "https://www.ercot.com/files/docs/2019/01/09/Capacity_Changes_by_Fuel_Type_Charts_December_2018.xlsx",
+ "sha256": "8bdf23f280a9eef4f29141359dc30d59913ff0eea0860afd5b0259d1742f70a9",
+ "bytes": 74877
+ },
+ {
+ "member": "2019/02/06/CapacityChangesbyFuelTypeCharts_January_2019.xlsx",
+ "url": "https://www.ercot.com/files/docs/2019/02/06/CapacityChangesbyFuelTypeCharts_January_2019.xlsx",
+ "sha256": "484e5becfcc8a319f8bec49ae784644344aab1d5ae8725bdc9463a397b003e2a",
+ "bytes": 75538
+ },
+ {
+ "member": "2019/03/11/Capacity_Changes_by_Fuel_Type_Charts_February_2019.xlsx",
+ "url": "https://www.ercot.com/files/docs/2019/03/11/Capacity_Changes_by_Fuel_Type_Charts_February_2019.xlsx",
+ "sha256": "d21cac3d5910c92f2504bb6b47600336a65b9bef8f76e1b00f6d4e825325f56b",
+ "bytes": 72922
+ },
+ {
+ "member": "2020/12/09/Capacity_Changes_by_Fuel_Type_Charts_November_2020_monthly.xlsx",
+ "url": "https://www.ercot.com/files/docs/2020/12/09/Capacity_Changes_by_Fuel_Type_Charts_November_2020_monthly.xlsx",
+ "sha256": "e98879f3c826540222e56c093a02e210321cd0f40577aff9abd78b06680e1479",
+ "bytes": 60974
+ },
+ {
+ "member": "2022/01/06/CapacityChangesFuelTypeCharts_December_2021_PlannedMonthly.xlsx",
+ "url": "https://www.ercot.com/files/docs/2022/01/06/CapacityChangesFuelTypeCharts_December_2021_PlannedMonthly.xlsx",
+ "sha256": "e0459d115edd91ee3423adc63bcf1f9f27440593f28c369d89262034c9fa7cd3",
+ "bytes": 86197
+ },
+ {
+ "member": "2022/04/06/Capacity_Changes_by_Fuel_Type_Charts_March_2022.xlsx",
+ "url": "https://www.ercot.com/files/docs/2022/04/06/Capacity_Changes_by_Fuel_Type_Charts_March_2022.xlsx",
+ "sha256": "991c43ad41f5593e7d17fe75157d3aab4fb884efd61f313dbc31deda7fd4f273",
+ "bytes": 87376
+ },
+ {
+ "member": "2022/12/06/Capacity Changes by Fuel Type Charts_November_2022.xlsx",
+ "url": "https://www.ercot.com/files/docs/2022/12/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_November_2022.xlsx",
+ "sha256": "d4aa69d9260b78b48d7047be81885ffced192ac25143786b1bc53fc6bf74fb50",
+ "bytes": 92646
+ },
+ {
+ "member": "2023/11/07/Capacity-Changes-by-Fuel-Type-Charts_October_2023.xlsx",
+ "url": "https://www.ercot.com/files/docs/2023/11/07/Capacity-Changes-by-Fuel-Type-Charts_October_2023.xlsx",
+ "sha256": "c70625ab41cb6d3e6b931ad7ba2ed273aa46a921ea996395f5b66a0cf39a95ab",
+ "bytes": 101937
+ },
+ {
+ "member": "2023/11/07/Capacity-Changes-by-Fuel-Type-Charts_October_2023_PlannedMonthly.xlsx",
+ "url": "https://www.ercot.com/files/docs/2023/11/07/Capacity-Changes-by-Fuel-Type-Charts_October_2023_PlannedMonthly.xlsx",
+ "sha256": "89a63dd534c2cfc770a3a8de51a972b3fc150a2be7cb8269fbddc05a8a34ccff",
+ "bytes": 98149
+ },
+ {
+ "member": "2023/11/13/Capacity Changes by Fuel Type Charts_October_2023_PlannedMonthly_Corrected.xlsx",
+ "url": "https://www.ercot.com/files/docs/2023/11/13/Capacity%20Changes%20by%20Fuel%20Type%20Charts_October_2023_PlannedMonthly_Corrected.xlsx",
+ "sha256": "ebf5de77374cbec2286d8ed52dc577e4ff6f216b3a7719620911f45c5dd2d3a2",
+ "bytes": 100513
+ },
+ {
+ "member": "2023/11/13/Capacity-Changes-by-Fuel-Type-Charts_October_2023_Corrected.xlsx",
+ "url": "https://www.ercot.com/files/docs/2023/11/13/Capacity-Changes-by-Fuel-Type-Charts_October_2023_Corrected.xlsx",
+ "sha256": "cc01847328337925ecc0e906262913f5d4ccac47b9cfd7ca5e8dae757b1e02b6",
+ "bytes": 105059
+ },
+ {
+ "member": "2025/05/09/Capacity-Changes-by-Fuel-Type-Charts_April_2025.xlsx",
+ "url": "https://www.ercot.com/files/docs/2025/05/09/Capacity-Changes-by-Fuel-Type-Charts_April_2025.xlsx",
+ "sha256": "8ee3fbd4a85ec384e5d64baa71469351be7da4b9d29fb30575057a279170bc44",
+ "bytes": 109737
+ },
+ {
+ "member": "2026/08/07/Capacity-Changes-by-Fuel-Type-Charts_July_2026.xlsx",
+ "url": "https://www.ercot.com/files/docs/2026/08/07/Capacity-Changes-by-Fuel-Type-Charts_July_2026.xlsx",
+ "sha256": "c393be4ba1a753ad4d7cd1b97e7d543f98a9d7dce2a8a156def5bd5f7a928ff1",
+ "bytes": 115980
+ },
+ {
+ "member": "2026/08/07/Capacity-Changes-by-Fuel-Type-Charts_July_2026_PlannedMonthly.xlsx",
+ "url": "https://www.ercot.com/files/docs/2026/08/07/Capacity-Changes-by-Fuel-Type-Charts_July_2026_PlannedMonthly.xlsx",
+ "sha256": "47dc9675ba749d15d9834ebc1964da93a81e482e80c07bbe80404032b49a25a1",
+ "bytes": 95498
+ }
+ ],
+ "selection": "Complete original workbooks with old/shifted headers, synchronization fields, source agreement status strings, project and DGR comments, absent project table, monthly dates under Year headers, original/corrected small-generator security fields, same-name source revisions and different companion-file projected dates. Also includes a singular Small Generator group and original blank small-generator totals.",
+ "projectRows": 3970,
+ "totalRows": 1656
+ },
+ "decoder": {
+ "path": "tinyercot/_capacity.py",
+ "sha256": "99aa5b54ab12f5e0e125a49ef3332a58c351ae20c23a8578bb40594b17d9c17e"
+ },
+ "limitations": [
+ "Reporting months come from original filenames, not an inferred immutable publication timestamp.",
+ "Project dates are projected or agreement/synchronization milestones, not proof of commercial operation. Source project years can differ from projected COD years.",
+ "Companion reports and source revisions remain separate, even where filenames or project identifiers repeat.",
+ "Original installed, synchronized, operational and signed-project capacity categories remain separate; no totals are recalculated.",
+ "Source totals contain historical periods and future projections through 2033; source period labels can say Year while containing full monthly dates.",
+ "Underlying project and capacity tables are covered. Other resource documents and chart-specific annotations are not claimed as structured data."
+ ]
+}
diff --git a/tools/inputs/public-capacity-changes-sources.csv b/tools/inputs/public-capacity-changes-sources.csv
new file mode 100644
index 00000000..0684db22
--- /dev/null
+++ b/tools/inputs/public-capacity-changes-sources.csv
@@ -0,0 +1,170 @@
+url,file,reportMonth,sha256,bytes,projectRows,totalRows
+https://www.ercot.com/files/docs/2018/09/07/Capacity_Changes_by_Fuel_Type_Charts_August_2018.xlsx,Capacity_Changes_by_Fuel_Type_Charts_August_2018.xlsx,2018-08-01,4aecd1de9a1b2ba4aa313eaab14b719bcbe37728247365f7dd9511118eaec67f,61337,87,77
+https://www.ercot.com/files/docs/2018/10/02/Capacity_Changes_by_Fuel_Type_Charts_September_2018.xlsx,Capacity_Changes_by_Fuel_Type_Charts_September_2018.xlsx,2018-09-01,06e4e25504c71bff2a28193d7c23f21e8abde907e2e71496cd881c6863b1bc6c,70601,91,86
+https://www.ercot.com/files/docs/2018/11/01/Capacity_Changes_by_Fuel_Type_Charts_October_2018.xlsx,Capacity_Changes_by_Fuel_Type_Charts_October_2018.xlsx,2018-10-01,d3a0ae654bd3dfc6367f81c1f3ea8a222483d43b7e760aa694429dcbb8284a27,73979,98,86
+https://www.ercot.com/files/docs/2018/12/04/Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx,Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx,2018-11-01,3e450d89f54a232fdc985467a8e69c61d86cd1af55d09df37612849cfcf241cc,74113,100,86
+https://www.ercot.com/files/docs/2018/12/11/Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx,Capacity_Changes_by_Fuel_Type_Charts_November_2018.xlsx,2018-11-01,3e450d89f54a232fdc985467a8e69c61d86cd1af55d09df37612849cfcf241cc,74113,100,86
+https://www.ercot.com/files/docs/2019/01/09/Capacity_Changes_by_Fuel_Type_Charts_December_2018.xlsx,Capacity_Changes_by_Fuel_Type_Charts_December_2018.xlsx,2018-12-01,8bdf23f280a9eef4f29141359dc30d59913ff0eea0860afd5b0259d1742f70a9,74877,103,88
+https://www.ercot.com/files/docs/2019/02/06/CapacityChangesbyFuelTypeCharts_January_2019.xlsx,CapacityChangesbyFuelTypeCharts_January_2019.xlsx,2019-01-01,484e5becfcc8a319f8bec49ae784644344aab1d5ae8725bdc9463a397b003e2a,75538,107,91
+https://www.ercot.com/files/docs/2019/03/11/Capacity_Changes_by_Fuel_Type_Charts_February_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2019.xlsx,2019-02-01,d21cac3d5910c92f2504bb6b47600336a65b9bef8f76e1b00f6d4e825325f56b,72922,115,91
+https://www.ercot.com/files/docs/2019/04/05/Capacity_Changes_by_Fuel_Type_Charts_March_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_March_2019.xlsx,2019-03-01,a8dbeaed680d732294c2377b0e7bf9caf069c770319536a6200913b31e8e9ebc,73324,115,91
+https://www.ercot.com/files/docs/2019/05/06/Capacity_Changes_by_Fuel_Type_Charts_April_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_April_2019.xlsx,2019-04-01,d967c022c13ab16814cc327f0837c71626c8dbb143024f0394b06c238f5117e4,73646,120,91
+https://www.ercot.com/files/docs/2019/06/07/Capacity_Changes_by_Fuel_Type_Charts_May_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_May_2019.xlsx,2019-05-01,b178f885edbb2355c3338ceac00ce56b1cc9da78bd7bc75eb438c18e74596906,77033,128,91
+https://www.ercot.com/files/docs/2019/07/16/Capacity_Changes_by_Fuel_Type_Charts_June_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_June_2019.xlsx,2019-06-01,c809198146c2a80c16b0a5ffcab7976f29b6fc8bccea1b7f6d2890693f9366f8,73406,133,89
+https://www.ercot.com/files/docs/2019/08/14/Capacity_Changes_by_Fuel_Type_Charts_July_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_July_2019.xlsx,2019-07-01,dbe6d3ad22fb07715548edb3588abc906740d98a9f4e8372ff2932f54b1de5c9,73792,141,89
+https://www.ercot.com/files/docs/2019/09/16/Capacity_Changes_by_Fuel_Type_Charts_August_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_August_2019.xlsx,2019-08-01,4408b7cb52f76d4c0a446d737403d5a8ba81bb3c51ff228f4d7b1598ca905617,73358,130,89
+https://www.ercot.com/files/docs/2019/10/18/Capacity_Changes_by_Fuel_Type_Charts_September_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_September_2019.xlsx,2019-09-01,d2aec4303c3f866f1e6cec8d5cdb93d64b3b6ca01efd5c54e405f74dc87e565c,72908,128,89
+https://www.ercot.com/files/docs/2019/11/11/Capacity_Changes_by_Fuel_Type_Charts_October_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_October_2019.xlsx,2019-10-01,cdab873ae4dcd5c2ff7c00898f68d40d907bf900de21f86ccab9c6ab361bf4a3,73484,133,89
+https://www.ercot.com/files/docs/2019/12/05/Capacity_Changes_by_Fuel_Type_Charts_November_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_November_2019.xlsx,2019-11-01,202e5c80d4d66f9a8c7ca0c31ea6916dd26e4098bdba564bc65b58d677375e17,74828,131,89
+https://www.ercot.com/files/docs/2019/12/18/Capacity_Changes_by_Fuel_Type_Charts_November_2019_Revised.xlsx,Capacity_Changes_by_Fuel_Type_Charts_November_2019_Revised.xlsx,2019-11-01,73f6b69872f1eff259a7065bc500a0dce1d404227c4f01f0035a5d2acbb58dbf,75387,131,89
+https://www.ercot.com/files/docs/2020/01/08/Capacity_Changes_by_Fuel_Type_Charts_December_2019.xlsx,Capacity_Changes_by_Fuel_Type_Charts_December_2019.xlsx,2019-12-01,29f7133c2376a6f29664be74b7aa0d0b95c4d33f16ed23f9e4523b18295d124d,74379,126,91
+https://www.ercot.com/files/docs/2020/02/10/Capacity_Changes_by_Fuel_Type_Charts_January_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_January_2020.xlsx,2020-01-01,450b9a023f5d62c78374577f82628d47041d965f42795372319b59afd283c9b6,75252,131,91
+https://www.ercot.com/files/docs/2020/03/09/Capacity_Changes_by_Fuel_Type_Charts_February_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2020.xlsx,2020-02-01,edb449a0bd5677e4f8db2cd13fa462ffa6ca2f3256f13cc3e417fe3224718360,74777,137,91
+https://www.ercot.com/files/docs/2020/04/13/Capacity_Changes_by_Fuel_Type_Charts_March_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_March_2020.xlsx,2020-03-01,e98095eba7885c21a2ba1336581e1fc6dc455caed7bd3e6d461549864e7b3c04,80315,144,91
+https://www.ercot.com/files/docs/2020/05/07/Capacity_Changes_by_Fuel_Type_Charts_April_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_April_2020.xlsx,2020-04-01,ab9ddde3000280a83aa605d67134e276983d9e5e6cab9bc098df3b8b071a4977,81408,155,92
+https://www.ercot.com/files/docs/2020/06/09/Capacity_Changes_by_Fuel_Type_Charts_May_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_May_2020.xlsx,2020-05-01,c65fe140683d6a04186741992ee004554479c3ab125d7b0c0ff71bdc074480e5,83031,157,92
+https://www.ercot.com/files/docs/2020/07/14/Capacity_Changes_by_Fuel_Type_Charts_June_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_June_2020.xlsx,2020-06-01,13132f611740ca697657b348d62b5844a4290bf2afca7456190e0c6710a30172,82430,153,94
+https://www.ercot.com/files/docs/2020/08/07/Capacity_Changes_by_Fuel_Type_Charts_July_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_July_2020.xlsx,2020-07-01,9ea642ac4f4498459e98438f16100b2a7d11d3a1145828f304a58d2eef32d53c,83265,156,94
+https://www.ercot.com/files/docs/2020/09/10/Capacity_Changes_by_Fuel_Type_Charts_August_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_August_2020.xlsx,2020-08-01,cf0443d24c29df3fdb2267d936efb8bd8c7dfd81c685dd16a581c6fe1e563c81,83360,164,94
+https://www.ercot.com/files/docs/2020/10/13/Capacity_Changes_by_Fuel_Type_Charts_September_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_September_2020.xlsx,2020-09-01,b3dbced4329b633a735572b89d0aeedb4c19c73b81c12d22634dfe62ae71f57d,85427,180,95
+https://www.ercot.com/files/docs/2020/11/09/Capacity_Changes_by_Fuel_Type_Charts_October_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_October_2020.xlsx,2020-10-01,85197e00aa21ff660058488f2c662f305e5f6ff07be2ceaf7cd167a4ff297ea3,86147,196,95
+https://www.ercot.com/files/docs/2020/12/07/Capacity_Changes_by_Fuel_Type_Charts_November_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_November_2020.xlsx,2020-11-01,7476b40c1bc657847626f2373348a5dcccf149277d43494ad4a711bbca61add0,86459,197,95
+https://www.ercot.com/files/docs/2020/12/09/Capacity_Changes_by_Fuel_Type_Charts_November_2020_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_November_2020_monthly.xlsx,2020-11-01,e98879f3c826540222e56c093a02e210321cd0f40577aff9abd78b06680e1479,60974,179,54
+https://www.ercot.com/files/docs/2021/01/07/Capacity_Changes_by_Fuel_Type_Charts_December_2020.xlsx,Capacity_Changes_by_Fuel_Type_Charts_December_2020.xlsx,2020-12-01,70fdd517e3120010e281bae8e2db1b1b9c46c3157500d5545f12548c8bb1a92e,86664,200,96
+https://www.ercot.com/files/docs/2021/01/11/Capacity_Changes_by_Fuel_Type_Charts_December_2020_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_December_2020_monthly.xlsx,2020-12-01,12c436a9882f14cafcd28cd5c164768a623ddc787aa200b3c94e15c41b9e4bb8,62238,182,54
+https://www.ercot.com/files/docs/2021/02/03/Capacity_Changes_by_Fuel_Type_Charts_January_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_January_2021.xlsx,2021-01-01,fe8cfd72712aee8315baa5b396433a86dd901678a1b98f523458e8ede291dc67,87716,214,96
+https://www.ercot.com/files/docs/2021/02/05/Capacity_Changes_by_Fuel_Type_Charts_January_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_January_2021_monthly.xlsx,2021-01-01,1f8a5f03dfbbac2fc925366bb4c56b3d29a8abebcad80844491b96ddf18a3a33,64293,196,54
+https://www.ercot.com/files/docs/2021/03/05/Capacity_Changes_by_Fuel_Type_Charts_February_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2021.xlsx,2021-02-01,d8b4e650ef5a001059d1b60bd7e769bbbd9b5b356d3968119fd95210b90f6605,88318,224,96
+https://www.ercot.com/files/docs/2021/03/05/Capacity_Changes_by_Fuel_Type_Charts_February_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2021_monthly.xlsx,2021-02-01,859dd55fe16acda06e122135cb96132e0aea18785a15ee2589e1a58c552de26f,63080,206,54
+https://www.ercot.com/files/docs/2021/04/06/Capacity_Changes_by_Fuel_Type_Charts_March_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_March_2021.xlsx,2021-03-01,61a748f653095098d5972313ed83222ddabc4e717848639bc0886517adefa111,88930,229,97
+https://www.ercot.com/files/docs/2021/04/06/Capacity_Changes_by_Fuel_Type_Charts_March_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_March_2021_monthly.xlsx,2021-03-01,08ef0287d3b020494f17cfbb9b6c49db00c334359bc24f691b0fcef30e488c21,63023,211,54
+https://www.ercot.com/files/docs/2021/05/07/Capacity_Changes_by_Fuel_Type_Charts_April_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_April_2021.xlsx,2021-04-01,eeb4e31ad727d55420cf6fd73cd94871401fc8b4ae1dbd73d06213974311b2ea,88780,230,97
+https://www.ercot.com/files/docs/2021/05/07/Capacity_Changes_by_Fuel_Type_Charts_April_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_April_2021_monthly.xlsx,2021-04-01,6d42ee4185efd03a645ff826b65fcfba39d2770488397c0fb7ca39c96a155a6d,60349,175,54
+https://www.ercot.com/files/docs/2021/06/03/Capacity_Changes_by_Fuel_Type_Charts_May_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_May_2021.xlsx,2021-05-01,b7e80fd26d1e11ea258c5927d97ec22784f2bb7d9ba11994ac2a4197aa3719df,88559,227,97
+https://www.ercot.com/files/docs/2021/06/03/Capacity_Changes_by_Fuel_Type_Charts_May_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_May_2021_monthly.xlsx,2021-05-01,1123c957a7efaf39415a71b51e75833222912c3b2693c473d74164c4e93d87d3,62696,211,54
+https://www.ercot.com/files/docs/2021/07/09/Capacity_Changes_by_Fuel_Type_Charts_June_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_June_2021.xlsx,2021-06-01,a017672bd515f68f17982d9d6f5055fd57ae304b7c60174da6c097409b87e8b6,88816,225,97
+https://www.ercot.com/files/docs/2021/07/09/Capacity_Changes_by_Fuel_Type_Charts_June_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_June_2021_monthly.xlsx,2021-06-01,7ac2e24ff9001755a0d705b503282601d48d8b9586cc779453ecbf3b04b98a45,63831,209,54
+https://www.ercot.com/files/docs/2021/08/06/Capacity_Changes_by_Fuel_Type_Charts_July_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_July_2021.xlsx,2021-07-01,2fc62e5790bc0a63cc62dc1101205fb7ecdcd30fa16d6f8b3845a0fd6aa559df,83115,235,99
+https://www.ercot.com/files/docs/2021/08/06/Capacity_Changes_by_Fuel_Type_Charts_July_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_July_2021_monthly.xlsx,2021-07-01,12f4945cb6c140d8527ea95dd4229f09146a81776017f52fbad71adbb2fc0b79,59364,219,54
+https://www.ercot.com/files/docs/2021/09/03/Capacity_Changes_by_Fuel_Type_Charts_August_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_August_2021.xlsx,2021-08-01,0451d3cbaf85a20543d524160a0d56309397d18c793dee865b10156862b0bad3,83172,233,100
+https://www.ercot.com/files/docs/2021/09/03/Capacity_Changes_by_Fuel_Type_Charts_August_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_August_2021_monthly.xlsx,2021-08-01,94937c1083c5acef08f49ed0b6dfb2a44c8eb842689b3ad1a5e76bc707e6b319,56772,170,54
+https://www.ercot.com/files/docs/2021/10/08/Capacity_Changes_by_Fuel_Type_Charts_September_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_September_2021.xlsx,2021-09-01,2a1e027de44b50df188cf3f2c093de9e9a9110b8f0a06faef9cb75d4d31284f1,83818,236,100
+https://www.ercot.com/files/docs/2021/10/08/Capacity_Changes_by_Fuel_Type_Charts_September_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_September_2021_monthly.xlsx,2021-09-01,5620d88b71718a44dbc5f0269afb0e649090fbb2c524d0347020a70f1cbb7964,57304,171,54
+https://www.ercot.com/files/docs/2021/11/03/Capacity_Changes_by_Fuel_Type_Charts_October_2021.xlsx,Capacity_Changes_by_Fuel_Type_Charts_October_2021.xlsx,2021-10-01,909dd9b11dfbc5e8232571db5011e4d792a2b5eb75357a66a6ac3861690c45f2,82583,227,100
+https://www.ercot.com/files/docs/2021/11/03/Capacity_Changes_by_Fuel_Type_Charts_October_2021_monthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_October_2021_monthly.xlsx,2021-10-01,387aa9aee09e507f98572e7e0d5d83345288567e727e621c0932bfae6da413fa,57721,164,54
+https://www.ercot.com/files/docs/2021/12/07/Capacit_Changes_by_Fuel_Type_Charts_November_2021.xlsx,Capacit_Changes_by_Fuel_Type_Charts_November_2021.xlsx,2021-11-01,51ccd00cdd26cf5205e712fe5719ab331e374b87976361fb897c8cce6eee5a41,91203,228,100
+https://www.ercot.com/files/docs/2021/12/07/Capacity_Changes_by_Fuel_Type_Charts_November_2021_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_November_2021_PlannedMonthly.xlsx,2021-11-01,5c8a86250331e5eea859814925948fac2d89ae7445f6895c653d4948a8aabdce,61985,165,54
+https://www.ercot.com/files/docs/2022/01/06/CapacityChangesFuelTypeCharts_December_2021_PlannedMonthly.xlsx,CapacityChangesFuelTypeCharts_December_2021_PlannedMonthly.xlsx,2021-12-01,e0459d115edd91ee3423adc63bcf1f9f27440593f28c369d89262034c9fa7cd3,86197,189,90
+https://www.ercot.com/files/docs/2022/01/06/Capacity_Changes_Fuel_Type_Charts_December_2021.xlsx,Capacity_Changes_Fuel_Type_Charts_December_2021.xlsx,2021-12-01,54a3e13f0064782d660e34de1aeb0b1db4f1570f08e3c92fb0c7e73d4f23696b,82938,234,100
+https://www.ercot.com/files/docs/2022/02/04/Capacity%20Changes%20by%20Fuel%20Type%20Charts_January_2022.xlsx,Capacity Changes by Fuel Type Charts_January_2022.xlsx,2022-01-01,1bc8049e46493d48c588e3bafdf5c54ed0e4ec2a4fe1dfe39fa621c6f58f91fd,84985,245,103
+https://www.ercot.com/files/docs/2022/02/04/Capacity%20Changes%20by%20Fuel%20Type%20Charts_January_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_January_2022_PlannedMonthly.xlsx,2022-01-01,72bf858f780718cb850dfaeaf5f29669cf1b95795f9406fea3b394611e725bbc,86632,212,90
+https://www.ercot.com/files/docs/2022/03/07/Capacity%20Changes%20by%20Fuel%20Type%20Charts_February_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_February_2022_PlannedMonthly.xlsx,2022-02-01,dd3e393b8b567eccdb16561976c30dfbd891b6a3c5efed52fbb40ac35c8b729d,88257,216,90
+https://www.ercot.com/files/docs/2022/03/07/Capacity_Changes_by_Fuel_Type_Charts_February_2022.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2022.xlsx,2022-02-01,dc903222b31e1fb07bac661ada96664cc38deb106ff902dec453ee7295799a73,85641,255,103
+https://www.ercot.com/files/docs/2022/04/06/Capacity_Changes_by_Fuel_Type_Charts_March_2022.xlsx,Capacity_Changes_by_Fuel_Type_Charts_March_2022.xlsx,2022-03-01,991c43ad41f5593e7d17fe75157d3aab4fb884efd61f313dbc31deda7fd4f273,87376,260,104
+https://www.ercot.com/files/docs/2022/04/06/Capacity_Changes_by_Fuel_Type_Charts_March_2022_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_March_2022_PlannedMonthly.xlsx,2022-03-01,17fd1d3a65f7f5a177688712dd1c4eebcc60ab76f9ef64d2e7521c575707cbab,89564,212,90
+https://www.ercot.com/files/docs/2022/05/04/Capacity_Changes_by_Fuel_Type_Charts_April_2022.xlsx,Capacity_Changes_by_Fuel_Type_Charts_April_2022.xlsx,2022-04-01,13caab719a2e2762c86657e002630e0b38434991137628bf8e546b4c9a76946b,87471,274,104
+https://www.ercot.com/files/docs/2022/05/04/Capacity_Changes_by_Fuel_Type_Charts_April_2022_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_April_2022_PlannedMonthly.xlsx,2022-04-01,2e16afeb45999a84517ea1ef2272075334914b27755eea8b70deb742ec3ce852,89681,226,90
+https://www.ercot.com/files/docs/2022/06/08/Capacity_Changes_by_Fuel_Type_Charts_May_2022.xlsx,Capacity_Changes_by_Fuel_Type_Charts_May_2022.xlsx,2022-05-01,0e325f81d35632f1759ca770ef2c36b21e5e3b910068cbf01dc10f88bc5a8d65,88618,276,104
+https://www.ercot.com/files/docs/2022/06/08/Capacity_Changes_by_Fuel_Type_Charts_May_2022_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_May_2022_PlannedMonthly.xlsx,2022-05-01,d01e72ee27a96f7d82a59daebecff0690e9e9d5b1bb94e77b8aa2895c39c7f85,91536,219,90
+https://www.ercot.com/files/docs/2022/07/08/Capacity%20Changes%20by%20Fuel%20Type%20Charts_June_2022.xlsx,Capacity Changes by Fuel Type Charts_June_2022.xlsx,2022-06-01,c4ae734dc6366db8c697c79114221ab171c7e86f8beede14abd7fae03da1ee1d,89409,281,104
+https://www.ercot.com/files/docs/2022/07/08/Capacity%20Changes%20by%20Fuel%20Type%20Charts_June_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_June_2022_PlannedMonthly.xlsx,2022-06-01,590d17f296fd2ad4b411829ed1b353511807c55b9a1ec5458ad0770f41b88b19,92649,219,90
+https://www.ercot.com/files/docs/2022/08/05/Capacity%20Changes%20by%20Fuel%20Type%20Charts_July_2022.xlsx,Capacity Changes by Fuel Type Charts_July_2022.xlsx,2022-07-01,019903b1c25091d722f9e26571558175e634b8fc6565f14ceadd5c965408754e,89315,286,104
+https://www.ercot.com/files/docs/2022/08/05/Capacity%20Changes%20by%20Fuel%20Type%20Charts_July_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_July_2022_PlannedMonthly.xlsx,2022-07-01,c43918696ff515711e0e53bdc7ef8fb3ee14ba0dfeb17a28259777ac2c4bdbd8,93074,239,90
+https://www.ercot.com/files/docs/2022/09/08/Capacity%20Changes%20by%20Fuel%20Type%20Charts_August_2022.xlsx,Capacity Changes by Fuel Type Charts_August_2022.xlsx,2022-08-01,f2d562d81e6fdd0e8fa784c985c7eff8eaaf540d189242bdc0e27ec3a91f4275,91112,293,107
+https://www.ercot.com/files/docs/2022/09/08/Capacity%20Changes%20by%20Fuel%20Type%20Charts_August_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_August_2022_PlannedMonthly.xlsx,2022-08-01,6f350e8c33c231cb0ae8ff859b8292a134636658759067818f848609a5d0991b,93642,235,90
+https://www.ercot.com/files/docs/2022/10/05/Capacity%20Changes%20by%20Fuel%20Type%20Charts_September_2022.xlsx,Capacity Changes by Fuel Type Charts_September_2022.xlsx,2022-09-01,2da4fe96547d2f57c36f8febd3582d68d14027b6a5d9e0f621c2c1cdd39ee5a8,91569,300,110
+https://www.ercot.com/files/docs/2022/10/05/Capacity%20Changes%20by%20Fuel%20Type%20Charts_September_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_September_2022_PlannedMonthly.xlsx,2022-09-01,2998a11d76423f022e016661de6641f4b807598bb64c25daf21bde7d68eaecb4,93684,235,90
+https://www.ercot.com/files/docs/2022/11/08/Capacity%20Changes%20by%20Fuel%20Type%20Charts_October_2022.xlsx,Capacity Changes by Fuel Type Charts_October_2022.xlsx,2022-10-01,67d7896e5aa73a93328e1d367c1ecb99a9160c0d392eca230f04b2e11fb80a86,93245,304,110
+https://www.ercot.com/files/docs/2022/11/08/Capacity%20Changes%20by%20Fuel%20Type%20Charts_October_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_October_2022_PlannedMonthly.xlsx,2022-10-01,da1557be664adaa0e076d82ba8736f428cb35d1254901e7bf8fcc8da0f467558,94033,242,90
+https://www.ercot.com/files/docs/2022/12/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_November_2022.xlsx,Capacity Changes by Fuel Type Charts_November_2022.xlsx,2022-11-01,d4aa69d9260b78b48d7047be81885ffced192ac25143786b1bc53fc6bf74fb50,92646,309,110
+https://www.ercot.com/files/docs/2022/12/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_November_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_November_2022_PlannedMonthly.xlsx,2022-11-01,2379ba6460296cce015b112a01bd6adac3a30ac0cf880f2cf3b79540a6133d32,99744,302,90
+https://www.ercot.com/files/docs/2023/01/05/Capacity%20Changes%20by%20Fuel%20Type%20Charts_December_2022_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_December_2022_PlannedMonthly.xlsx,2022-12-01,95eaeac77bdf79d96546fa5fa2f10b56ecd487bcb99e0f9cec3fcc99d0eba6a3,96411,255,90
+https://www.ercot.com/files/docs/2023/01/05/Capacity_Changes_by_Fuel_Type_Charts_December_2022.xlsx,Capacity_Changes_by_Fuel_Type_Charts_December_2022.xlsx,2022-12-01,4a3d8cc6ded4f07e9ac87047dc3e4d096ac956b03c158f899a582fc20306877b,94644,315,110
+https://www.ercot.com/files/docs/2023/02/07/Capacity%20Changes%20by%20Fuel%20Type%20Charts_January_2023.xlsx,Capacity Changes by Fuel Type Charts_January_2023.xlsx,2023-01-01,38a892fcd82e05ed5743117dfc5ca102cabe7f1675839b33bed71a1c33c8e06e,94690,319,110
+https://www.ercot.com/files/docs/2023/02/07/Capacity%20Changes%20by%20Fuel%20Type%20Charts_January_2023_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_January_2023_PlannedMonthly.xlsx,2023-01-01,aa2354133b9cb7ef4de0a1e563dc2cc59dd4a4fd32b35c4518944bd3aa849ba2,95245,250,90
+https://www.ercot.com/files/docs/2023/03/06/Capacity_Changes_by_Fuel_Type_Charts_February_2023.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2023.xlsx,2023-02-01,438e8fc736e28921524631170e3418b78cee00f15d5a5408d62070484f14fd1d,95686,328,110
+https://www.ercot.com/files/docs/2023/03/06/Capacity_Changes_by_Fuel_Type_Charts_February_2023_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2023_PlannedMonthly.xlsx,2023-02-01,225134ebd263dbcaee0ea2c85fe4b061c431b9e05e8850ae2b496df4c5640458,95959,255,90
+https://www.ercot.com/files/docs/2023/04/07/Capacity-Changes-by-Fuel-Type-Charts-March-2023-PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts-March-2023-PlannedMonthly.xlsx,2023-03-01,a62ae5fd835f08a51ad37618aa03edc339654bf21f853ea446a5897872a13cde,96664,256,90
+https://www.ercot.com/files/docs/2023/04/07/Capacity-Changes-by-Fuel-Type-Charts-March-2023.xlsx,Capacity-Changes-by-Fuel-Type-Charts-March-2023.xlsx,2023-03-01,ca063878ce1b1a81bfd8be5c7dfbb8f840bbb63004148e863045be1037c3114d,96547,332,111
+https://www.ercot.com/files/docs/2023/05/04/Capacity-Changes-by-Fuel-Type-Charts-April-2023-PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts-April-2023-PlannedMonthly.xlsx,2023-04-01,83445d7de47e4dd862f35c367268b5ae8153a08749575170254ebaa0a2e22747,94618,256,90
+https://www.ercot.com/files/docs/2023/05/04/Capacity-Changes-by-Fuel-Type-Charts-April-2023.xlsx,Capacity-Changes-by-Fuel-Type-Charts-April-2023.xlsx,2023-04-01,63b341abca08e7c1818b71dbb0fdc84da96ef372b70d7f86e50acdde1cb776d4,96259,336,111
+https://www.ercot.com/files/docs/2023/06/02/Capacity-Changes-by-Fuel-Type-Charts_May_2023.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2023.xlsx,2023-05-01,84bff5365575b1ed107aec138161d981d1213618031272f544bc44523005bfcc,97254,349,111
+https://www.ercot.com/files/docs/2023/06/02/Capacity-Changes-by-Fuel-Type-Charts_May_2023_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2023_PlannedMonthly.xlsx,2023-05-01,d4bd08d634ff2efdf80e3cbcbf6d3be860c806462f70242eddea26ae89220184,96272,265,90
+https://www.ercot.com/files/docs/2023/07/06/Capacity-Changes-by-Fuel-Type-Charts_June_2023.xlsx,Capacity-Changes-by-Fuel-Type-Charts_June_2023.xlsx,2023-06-01,47c4b97fb4a718a8975cc8a448f0cc52b40177db00a8c02a1ce3dcae4f9fc3b4,95928,358,111
+https://www.ercot.com/files/docs/2023/07/06/Capacity-Changes-by-Fuel-Type-Charts_June_2023_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_June_2023_PlannedMonthly.xlsx,2023-06-01,12389fd878f86340226d032686d86f69a17272cc19cb02f7671cc44d007cab18,94492,251,90
+https://www.ercot.com/files/docs/2023/08/04/Capacity-Changes-by-Fuel-Type-Charts_July_2023.xlsx,Capacity-Changes-by-Fuel-Type-Charts_July_2023.xlsx,2023-07-01,18bed3fc323fb87a76ff0229fade8f3422aa96f872373876d0f4f5e2191db380,97294,356,115
+https://www.ercot.com/files/docs/2023/08/04/Capacity-Changes-by-Fuel-Type-Charts_July_2023_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_July_2023_PlannedMonthly.xlsx,2023-07-01,5185e655673ccaba52d8c5f71cc73ccc0be4bd840d628de2dd08d54da8c808e5,98720,283,90
+https://www.ercot.com/files/docs/2023/09/07/capacity-changes-by-fuel-type-charts_august_2023.xlsx,capacity-changes-by-fuel-type-charts_august_2023.xlsx,2023-08-01,e7df42b1e9c3baf2dd4795d6af61f5e195d40b87e9dff4130c9bcbd505e304b3,100480,361,115
+https://www.ercot.com/files/docs/2023/09/07/capacity-changes-by-fuel-type-charts_august_2023_plannedmonthly.xlsx,capacity-changes-by-fuel-type-charts_august_2023_plannedmonthly.xlsx,2023-08-01,5dc575d3e7b0419339b70d93f212a256bacac4d6d353f8f5b090b2c9110822c5,97979,285,90
+https://www.ercot.com/files/docs/2023/10/05/Capacity_Changes_by_Fuel_Type_Charts_September_2023.xlsx,Capacity_Changes_by_Fuel_Type_Charts_September_2023.xlsx,2023-09-01,ebb658a6178ea9317c8deecd8078c6a66465796c06822423a77f992aa17f78fd,101432,372,115
+https://www.ercot.com/files/docs/2023/10/05/Capacity_Changes_by_Fuel_Type_Charts_September_2023_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_September_2023_PlannedMonthly.xlsx,2023-09-01,4d88419c6207732dcc08a636189b50883816344bb40aa9f1ac314a1aac2e1f04,97807,284,90
+https://www.ercot.com/files/docs/2023/11/07/Capacity-Changes-by-Fuel-Type-Charts_October_2023.xlsx,Capacity-Changes-by-Fuel-Type-Charts_October_2023.xlsx,2023-10-01,c70625ab41cb6d3e6b931ad7ba2ed273aa46a921ea996395f5b66a0cf39a95ab,101937,379,115
+https://www.ercot.com/files/docs/2023/11/07/Capacity-Changes-by-Fuel-Type-Charts_October_2023_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_October_2023_PlannedMonthly.xlsx,2023-10-01,89a63dd534c2cfc770a3a8de51a972b3fc150a2be7cb8269fbddc05a8a34ccff,98149,282,90
+https://www.ercot.com/files/docs/2023/11/13/Capacity%20Changes%20by%20Fuel%20Type%20Charts_October_2023_PlannedMonthly_Corrected.xlsx,Capacity Changes by Fuel Type Charts_October_2023_PlannedMonthly_Corrected.xlsx,2023-10-01,ebf5de77374cbec2286d8ed52dc577e4ff6f216b3a7719620911f45c5dd2d3a2,100513,282,90
+https://www.ercot.com/files/docs/2023/11/13/Capacity-Changes-by-Fuel-Type-Charts_October_2023_Corrected.xlsx,Capacity-Changes-by-Fuel-Type-Charts_October_2023_Corrected.xlsx,2023-10-01,cc01847328337925ecc0e906262913f5d4ccac47b9cfd7ca5e8dae757b1e02b6,105059,379,115
+https://www.ercot.com/files/docs/2023/12/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_November_2023.xlsx,Capacity Changes by Fuel Type Charts_November_2023.xlsx,2023-11-01,5f9c2fa77dbc7e8f64f04f88314e6d3c4f06e912c7b23793a025349224543e35,103781,399,117
+https://www.ercot.com/files/docs/2023/12/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_November_2023_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_November_2023_PlannedMonthly.xlsx,2023-11-01,9df57794b8d613fea88c329f69a90edea99a2029eac895297c3813e71cf62cb5,96892,275,90
+https://www.ercot.com/files/docs/2024/01/09/Capacity_Changes_by_Fuel_Type_Charts_December_2023.xlsx,Capacity_Changes_by_Fuel_Type_Charts_December_2023.xlsx,2023-12-01,5be9c36a1636aba52cf24a346e145d7d44fe45aae01aa373b887fa33af4a2a5c,104038,401,117
+https://www.ercot.com/files/docs/2024/01/09/Capacity_Changes_by_Fuel_Type_Charts_December_2023_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_December_2023_PlannedMonthly.xlsx,2023-12-01,a0a43fd7499f9440f5e6b3fcd6348906199eaf98133054795b9c339693e9ad8f,98769,281,90
+https://www.ercot.com/files/docs/2024/02/06/Capacity-Changes-by-Fuel-Type-Charts_January_2024.xlsx,Capacity-Changes-by-Fuel-Type-Charts_January_2024.xlsx,2024-01-01,3cd093d8b4b661dff65bf2d0d6784f8a2a73fa1f324dc9da9c672a6dc092d357,105149,407,119
+https://www.ercot.com/files/docs/2024/02/06/Capacity-Changes-by-Fuel-Type-Charts_January_2024_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_January_2024_PlannedMonthly.xlsx,2024-01-01,45c83701b79e7127c9293c946a39028ee3c2f55aa27e964246b18478840ca1f8,101352,289,90
+https://www.ercot.com/files/docs/2024/03/06/Capacity_Changes_by_Fuel_Type_Charts_February_2024.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2024.xlsx,2024-02-01,15f20bacddb29d8184fb09dcf8e6d684d49e94578fd577727fcf691459896a82,99366,307,122
+https://www.ercot.com/files/docs/2024/03/06/Capacity_Changes_by_Fuel_Type_Charts_February_2024_PlannedMonthly.xlsx,Capacity_Changes_by_Fuel_Type_Charts_February_2024_PlannedMonthly.xlsx,2024-02-01,29d53632c949d15fe7da73b2f81eb1cccc399409cb75b723caafe01da1138c22,90700,192,90
+https://www.ercot.com/files/docs/2024/04/05/Capacity%20Changes%20by%20Fuel%20Type%20Charts_March_2024.xlsx,Capacity Changes by Fuel Type Charts_March_2024.xlsx,2024-03-01,f7e2c13fc1a795247c2f382596c60ce31f78cc1efe049e17adaed3b9c4df064c,100730,305,121
+https://www.ercot.com/files/docs/2024/04/05/Capacity%20Changes%20by%20Fuel%20Type%20Charts_March_2024_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_March_2024_PlannedMonthly.xlsx,2024-03-01,97610d44e95b00bea8bb5612f0567563ebc344e490fddf001b3e5de03bedc8db,91131,189,90
+https://www.ercot.com/files/docs/2024/05/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_April_2024.xlsx,Capacity Changes by Fuel Type Charts_April_2024.xlsx,2024-04-01,d76537f1b5f51f44a14466c78a291a079c95e348cb8a6761d6a44513c970029a,101788,317,123
+https://www.ercot.com/files/docs/2024/05/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_April_2024_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_April_2024_PlannedMonthly.xlsx,2024-04-01,43478aec6e949a93b940f18dff53c99f18d4e824951f3113499aad68372c566d,96286,202,90
+https://www.ercot.com/files/docs/2024/06/06/Capacity-Changes-by-Fuel-Type-Charts_May_2024.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2024.xlsx,2024-05-01,d3bc6d99fd073fa13ee6aacb3553cce34ed7e46a2aeade0f69ab3fd1364b0096,101560,324,125
+https://www.ercot.com/files/docs/2024/06/06/Capacity-Changes-by-Fuel-Type-Charts_May_2024_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2024_PlannedMonthly.xlsx,2024-05-01,9393d1f3c610753d4fc63948d5a7eb7cc7f80ff688e5428e4a0a179c26c86355,95540,199,90
+https://www.ercot.com/files/docs/2024/07/03/Capacity%20Changes%20by%20Fuel%20Type%20Charts_June_2024.xlsx,Capacity Changes by Fuel Type Charts_June_2024.xlsx,2024-06-01,abeabc6bc135c7f8b70fac78a667255bcd00f3413795571ddec5493a4efe5a65,104133,332,122
+https://www.ercot.com/files/docs/2024/07/03/Capacity%20Changes%20by%20Fuel%20Type%20Charts_June_2024_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_June_2024_PlannedMonthly.xlsx,2024-06-01,8e3d807eaa649dea420a65acb0679e4b8945ee74147349b3a31d0051e9b9d705,94789,191,90
+https://www.ercot.com/files/docs/2024/08/06/Capacity-Changes-by%20Fuel-Type-Charts_July_2024_PlannedMonthly.xlsx,Capacity-Changes-by Fuel-Type-Charts_July_2024_PlannedMonthly.xlsx,2024-07-01,a2a97ae3381f9d7a69d7bf15d51887e4a96434141cb12691cedbbf570e1e26d5,95818,200,90
+https://www.ercot.com/files/docs/2024/08/06/Capacity-Changes-by-Fuel-Type-Charts_July_2024.xlsx,Capacity-Changes-by-Fuel-Type-Charts_July_2024.xlsx,2024-07-01,897a67b7fcde160dbab9bcb55c2d86fde467504c2af23d3ee5c89798e2ad8a37,102373,342,123
+https://www.ercot.com/files/docs/2024/09/06/Capacity-Changes-by-Fuel-Type-Charts_August_2024.xlsx,Capacity-Changes-by-Fuel-Type-Charts_August_2024.xlsx,2024-08-01,b6c20eac4e77d1713185416ff2455fd8feb7563dcb04775aabfb9cfaae1444a0,104509,356,123
+https://www.ercot.com/files/docs/2024/09/06/Capacity-Changes-by-Fuel-Type-Charts_August_2024_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_August_2024_PlannedMonthly.xlsx,2024-08-01,19b59585b9d068e7c1834ee51a317c41d95720c599dada2432671f5b6ddacd03,95743,199,90
+https://www.ercot.com/files/docs/2024/10/04/Capacity-Changes-by-Fuel-Type-Charts_September_2024.xlsx,Capacity-Changes-by-Fuel-Type-Charts_September_2024.xlsx,2024-09-01,88d4190be2ba4ee534961e469158d045b9ef8664635c7173bca887b2864ca4d0,104761,357,123
+https://www.ercot.com/files/docs/2024/10/04/Capacity-Changes-by-Fuel-Type-Charts_September_2024_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_September_2024_PlannedMonthly.xlsx,2024-09-01,48118f03fc0515b696015ce228314cef7121706958607c389f7294a41ee83034,96983,196,90
+https://www.ercot.com/files/docs/2024/11/05/Capacity-Changes-by-Fuel-Type-Charts_October_2024.xlsx,Capacity-Changes-by-Fuel-Type-Charts_October_2024.xlsx,2024-10-01,8f4e3d671f563dd1b1766a72a7ef87681633aeecae1d1fb72d56b057278197db,106036,370,124
+https://www.ercot.com/files/docs/2024/11/05/Capacity-Changes-by-Fuel-Type-Charts_October_2024_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_October_2024_PlannedMonthly.xlsx,2024-10-01,7393655547896bfd2db954fd3b73145b75274e973d40e727f16377245b07609c,97620,203,90
+https://www.ercot.com/files/docs/2024/12/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_November_2024.xlsx,Capacity Changes by Fuel Type Charts_November_2024.xlsx,2024-11-01,65662b798cb620f53182e872b467918755e7248e7cd2e48734a4e87c87f08b2d,104928,359,124
+https://www.ercot.com/files/docs/2024/12/06/Capacity%20Changes%20by%20Fuel%20Type%20Charts_November_2024_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_November_2024_PlannedMonthly.xlsx,2024-11-01,4ac8d499f3cb45158a70dff193013796076b8deacbf1dbc449e1718593e00629,96470,186,90
+https://www.ercot.com/files/docs/2025/01/08/capacity-changes-by-fuel-type-charts_december_2024.xlsx,capacity-changes-by-fuel-type-charts_december_2024.xlsx,2024-12-01,9b5781c9e5310859bd6a0b60fa59cd277e5ce7403e6d0585bb32f949355edf80,105407,363,125
+https://www.ercot.com/files/docs/2025/01/08/capacity-changes-by-fuel-type-charts_december_2024_plannedmonthly.xlsx,capacity-changes-by-fuel-type-charts_december_2024_plannedmonthly.xlsx,2024-12-01,f14f949a4859ae283bc199dd78b833ec0fff962d5cb1d0522db4b79d6ca8d6cf,97097,193,90
+https://www.ercot.com/files/docs/2025/02/07/Capacity%20Changes%20by%20Fuel%20Type%20Charts_January_2025.xlsx,Capacity Changes by Fuel Type Charts_January_2025.xlsx,2025-01-01,202bc4ce7771f031874e16798b580fb8e3f2d82ed5a1b32f0e4e35e859a624df,105024,358,125
+https://www.ercot.com/files/docs/2025/02/07/Capacity%20Changes%20by%20Fuel%20Type%20Charts_January_2025_PlannedMonthly.xlsx,Capacity Changes by Fuel Type Charts_January_2025_PlannedMonthly.xlsx,2025-01-01,1548c4803efa5017b50dbc0a5ef65f90a6afd076f5a6543ebb9198882a7e3916,97096,211,90
+https://www.ercot.com/files/docs/2025/03/07/CapacityChangesbyFuelTypeCharts_February_2025.xlsx,CapacityChangesbyFuelTypeCharts_February_2025.xlsx,2025-02-01,50253fdb72f6a40962ae56a0dcb886a66a1691bb7d8f97c38454fa8e2570cb5b,106741,380,126
+https://www.ercot.com/files/docs/2025/03/07/CapacityChangesbyFuelTypeCharts_February_2025_PlannedMonthly.xlsx,CapacityChangesbyFuelTypeCharts_February_2025_PlannedMonthly.xlsx,2025-02-01,ea2b19e33de5456ad4e5c72616acf3f4ea7f65167c8295ff0c760eb38a90d248,99009,212,90
+https://www.ercot.com/files/docs/2025/04/04/Capacity-Changes-by-Fuel-Type-Charts_March_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_March_2025.xlsx,2025-03-01,8f66f637d79b41bcc924bb58090113ca5678cf7e7dcbba5d61151004977f9fb0,107812,408,128
+https://www.ercot.com/files/docs/2025/04/04/Capacity-Changes-by-Fuel-Type-Charts_March_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_March_2025_PlannedMonthly.xlsx,2025-03-01,5fc6c36c73d85b6389fe9194349019a3e1314537ff8bba08c266be7d6d0f7c67,94478,219,90
+https://www.ercot.com/files/docs/2025/05/09/Capacity-Changes-by-Fuel-Type-Charts_April_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_April_2025.xlsx,2025-04-01,8ee3fbd4a85ec384e5d64baa71469351be7da4b9d29fb30575057a279170bc44,109737,414,128
+https://www.ercot.com/files/docs/2025/05/09/Capacity-Changes-by-Fuel-Type-Charts_April_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_April_2025_PlannedMonthly.xlsx,2025-04-01,8fee9092693ca7054bf2f2eb436cbd8f83ff9b4db04a73dc6372ada931242a88,93175,208,90
+https://www.ercot.com/files/docs/2025/06/06/Capacity-Changes-by-Fuel-Type-Charts_May_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2025.xlsx,2025-05-01,541bb7612298b285eca422ea06d018e36004a2f7a1506ce7e8940f94aa96e209,110611,422,130
+https://www.ercot.com/files/docs/2025/06/06/Capacity-Changes-by-Fuel-Type-Charts_May_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2025_PlannedMonthly.xlsx,2025-05-01,50d32492439c0dc282c0191d2dafe5d950e437895042e3db145871fe56ff4e93,92194,201,90
+https://www.ercot.com/files/docs/2025/07/09/Capacity-Changes-by-Fuel-Type-Charts_June_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_June_2025.xlsx,2025-06-01,6163f2fef606670470168d04118294c07f09d7c78bfe7c140a371e51972a6a8f,110279,426,130
+https://www.ercot.com/files/docs/2025/07/09/Capacity-Changes-by-Fuel-Type-Charts_June_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_June_2025_PlannedMonthly.xlsx,2025-06-01,6bb02eaaab579fc24a88ea13526457df2090cf260ca36c88c23745a66c212b52,91638,191,90
+https://www.ercot.com/files/docs/2025/08/08/Capacity-Changes-by-Fuel-Type-Charts_July_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_July_2025.xlsx,2025-07-01,a5b135830d20c5f0a2bcea892d8f01b012fe54cdf928ebd406de132bbcc05d3f,111003,431,130
+https://www.ercot.com/files/docs/2025/08/08/Capacity-Changes-by-Fuel-Type-Charts_July_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_July_2025_PlannedMonthly.xlsx,2025-07-01,a2fdbf4c75e7d060f5ee75ca508d1d018a0530ef198645510d5a3056c6b5468f,93304,206,90
+https://www.ercot.com/files/docs/2025/09/09/Capacity-Changes-by-Fuel-Type-Charts_August_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_August_2025.xlsx,2025-08-01,45d378b91f303082e5eab7a1644cc511378dc1d7e087610e895c1babbe6e0718,112107,443,130
+https://www.ercot.com/files/docs/2025/09/09/Capacity-Changes-by-Fuel-Type-Charts_August_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_August_2025_PlannedMonthly.xlsx,2025-08-01,28ebce8c59f968d64777bdbe66f180c1358637060624aa12c9baddbc1e42662b,92972,200,90
+https://www.ercot.com/files/docs/2025/10/08/Capacity-Changes-by-Fuel-Type-Charts_September_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_September_2025.xlsx,2025-09-01,efa662795da005dc2ddeb56769b31870cdd300d69a9496f35bc813f1bd27af4f,111966,443,130
+https://www.ercot.com/files/docs/2025/10/08/Capacity-Changes-by-Fuel-Type-Charts_September_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_September_2025_PlannedMonthly.xlsx,2025-09-01,146aca4531f012bfb33c4d3502bc0dcb2be86ca4b0153f7e7d7520f2e16e1902,91616,185,90
+https://www.ercot.com/files/docs/2025/11/06/Capacity-Changes-by-Fuel-Type-Charts_October_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_October_2025.xlsx,2025-10-01,77339280971713ff569a05a1b1ae7d912885edf149c2d04937f2057e1a3a3ec0,112346,446,130
+https://www.ercot.com/files/docs/2025/11/06/Capacity-Changes-by-Fuel-Type-Charts_October_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_October_2025_PlannedMonthly.xlsx,2025-10-01,1c08a1076ddbd65d599015b0067341bf942565226dfc56bc27cc175916ce5476,92297,190,90
+https://www.ercot.com/files/docs/2025/12/04/Capacity-Changes-by-Fuel-Type-Charts_November_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_November_2025.xlsx,2025-11-01,a0f1f651ce9eef0c631db154c738f759212ddb68321ce83d09da110a61b93c2c,112033,439,131
+https://www.ercot.com/files/docs/2025/12/04/Capacity-Changes-by-Fuel-Type-Charts_November_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_November_2025_PlannedMonthly.xlsx,2025-11-01,72afa0696d4e78a8aaaeeac3e16e2d42f0356d683d855ae31cdbafb6a2b9f556,92935,194,90
+https://www.ercot.com/files/docs/2026/01/08/Capacity-Changes-by-Fuel-Type-Charts_December_2025.xlsx,Capacity-Changes-by-Fuel-Type-Charts_December_2025.xlsx,2025-12-01,acb4e59c8cf97c0b48c078c744d2e93cb1773a121e936485661d131e2736a6b6,111888,441,129
+https://www.ercot.com/files/docs/2026/01/08/Capacity-Changes-by-Fuel-Type-Charts_December_2025_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_December_2025_PlannedMonthly.xlsx,2025-12-01,3b615a2e7615e7e31e20d8978ead860d797ce8352125fc6aacedb48f0000c882,92169,185,90
+https://www.ercot.com/files/docs/2026/02/05/Capacity-Changes-by-Fuel-Type-Charts_January_2026.xlsx,Capacity-Changes-by-Fuel-Type-Charts_January_2026.xlsx,2026-01-01,6ea4d6a2da1c93c93a1fe7a698d40584810fc2bfd56d2023be11f904535fd3a3,116513,469,140
+https://www.ercot.com/files/docs/2026/02/05/Capacity-Changes-by-Fuel-Type-Charts_January_2026_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_January_2026_PlannedMonthly.xlsx,2026-01-01,dbe977d16e22f27956ef228d6112a11da6412a2592647b723cf23cc98835a66c,92315,197,90
+https://www.ercot.com/files/docs/2026/03/05/Capacity-Changes-by-Fuel-Type-Charts_February_2026.xlsx,Capacity-Changes-by-Fuel-Type-Charts_February_2026.xlsx,2026-02-01,a81ad341dd40f41d8cbbc569221f86aaec8c64c7baa4e5070704c17646623f81,115665,462,140
+https://www.ercot.com/files/docs/2026/03/05/Capacity-Changes-by-Fuel-Type-Charts_February_2026_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_February_2026_PlannedMonthly.xlsx,2026-02-01,2725b2bdd2fca96ea26d0f10f63b3c0c79536d4ca1142d3c94208c3153a57b79,93088,191,90
+https://www.ercot.com/files/docs/2026/04/07/Capacity-Changes-by-Fuel-Type-Charts_March_2026.xlsx,Capacity-Changes-by-Fuel-Type-Charts_March_2026.xlsx,2026-03-01,1261a5e392ae1f444530c639e6f61d5259eca770b0e47ce0a56c8264f6f98631,115804,464,139
+https://www.ercot.com/files/docs/2026/04/07/Capacity-Changes-by-Fuel-Type-Charts_March_2026_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_March_2026_PlannedMonthly.xlsx,2026-03-01,ed37c88c79671302146802a9f36bc54fed362d5dd624e1db505e6a06cd9aa1a4,93682,198,90
+https://www.ercot.com/files/docs/2026/05/05/Capacity-Changes-by-Fuel-Type-Charts_April_2026.xlsx,Capacity-Changes-by-Fuel-Type-Charts_April_2026.xlsx,2026-04-01,5ae61b8b72fb9a9f5bde228e60a897ff591e75a233449b20123f5ee9550470e7,114759,455,139
+https://www.ercot.com/files/docs/2026/05/05/Capacity-Changes-by-Fuel-Type-Charts_April_2026_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_April_2026_PlannedMonthly.xlsx,2026-04-01,ed21ccd9a739fd8c3442a18912a6101eba2f8858d84b7946a0ba61f89fb7133b,93380,200,90
+https://www.ercot.com/files/docs/2026/06/03/Capacity-Changes-by-Fuel-Type-Charts_May_2026.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2026.xlsx,2026-05-01,d7d034177097ba2a93d605848715356b51d3bb4b579a60dda9322a199f1c334f,115811,455,139
+https://www.ercot.com/files/docs/2026/06/03/Capacity-Changes-by-Fuel-Type-Charts_May_2026_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_May_2026_PlannedMonthly.xlsx,2026-05-01,ebbe1e8f47c14dca90317fa4892b937831d5e8ae08316fd9d2a4c41f64bb2d0d,94166,205,90
+https://www.ercot.com/files/docs/2026/07/07/Capacity-Changes-by-Fuel-Type-Charts_June_2026.xlsx,Capacity-Changes-by-Fuel-Type-Charts_June_2026.xlsx,2026-06-01,9dd545e9c3552cfec9d4525988c25bd4b9b367fbeff4d08061a549c500ae7178,115734,459,139
+https://www.ercot.com/files/docs/2026/07/07/Capacity-Changes-by-Fuel-Type-Charts_June_2026_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_June_2026_PlannedMonthly.xlsx,2026-06-01,f4a56b90342a77879febc05b1353b958358f6f406bbc0d0fbf90aa67c8a6a023,93562,201,90
+https://www.ercot.com/files/docs/2026/08/07/Capacity-Changes-by-Fuel-Type-Charts_July_2026.xlsx,Capacity-Changes-by-Fuel-Type-Charts_July_2026.xlsx,2026-07-01,c393be4ba1a753ad4d7cd1b97e7d543f98a9d7dce2a8a156def5bd5f7a928ff1,115980,454,142
+https://www.ercot.com/files/docs/2026/08/07/Capacity-Changes-by-Fuel-Type-Charts_July_2026_PlannedMonthly.xlsx,Capacity-Changes-by-Fuel-Type-Charts_July_2026_PlannedMonthly.xlsx,2026-07-01,47dc9675ba749d15d9834ebc1964da93a81e482e80c07bbe80404032b49a25a1,95498,227,90
diff --git a/tools/inputs/public-daily-4cp-evidence.json b/tools/inputs/public-daily-4cp-evidence.json
new file mode 100644
index 00000000..f1cbf1d0
--- /dev/null
+++ b/tools/inputs/public-daily-4cp-evidence.json
@@ -0,0 +1,27 @@
+{
+ "url": "https://www.ercot.com/files/docs/2018/01/23/4CP_Daily_Posting_2017-11-27.xlsx",
+ "title": "2017 Four Coincident Peak (4CP) Source Data",
+ "bytes": 30842343,
+ "sha256": "71908df8110a874d0ac4de652be061ddc201d123f0428b36966fe57ec87126df",
+ "fixture": "coincident-peaks/daily-2017.xlsx",
+ "coverage": {
+ "from": "2017-06-01",
+ "through": "2017-09-30",
+ "entities": 135,
+ "settlements": [
+ "INITIAL",
+ "FINAL"
+ ],
+ "rowsPerSettlement": 16445,
+ "rows": 32890,
+ "numericMWh": 3157440,
+ "blankMWh": 0
+ },
+ "limits": [
+ "135 source entities include ERCOT; rows must not be blindly added together.",
+ "FARMERS ELECTRIC CO OP INC PRTN RC (TDSP) has only 97 of 122 dates in each settlement.",
+ "INITIAL and FINAL have distinct source channels and values. Neither sheet nor file URL establishes public availability time.",
+ "Energy is MWh. Clock labels, including 24:00, do not establish timezone or UTC timestamps."
+ ],
+ "verification": "Regression compares every daily interval, entity, date, channel and source header to a direct openpyxl read of the complete original workbook; no expected-value SDK helpers."
+}
diff --git a/tools/inputs/public-distribution-coefficients-evidence.json b/tools/inputs/public-distribution-coefficients-evidence.json
new file mode 100644
index 00000000..69f5cb2f
--- /dev/null
+++ b/tools/inputs/public-distribution-coefficients-evidence.json
@@ -0,0 +1,23 @@
+{
+ "source": "https://www.ercot.com/mktinfo/metering/dlfmethodology",
+ "files": 28,
+ "years": [
+ 2001,
+ 2026
+ ],
+ "totals": {
+ "numericParameters": 1398,
+ "rows": 466,
+ "modernRows": 352,
+ "legacyRows": 114
+ },
+ "defaultProtectedOriginals": 17,
+ "verification": "All parameters, baseline values, dates, formula families and source identity compared with direct xlrd/openpyxl reads of original summary workbooks; protected copies decoded separately using msoffcrypto-tool and the built-in Excel workbook-protection key. The same decryption library is used by the SDK.",
+ "fixtures": "All 28 complete summary workbooks retained byte-for-byte, including original protection, plus the complete discovery HTML. Provider methodology attachments remain available through download().",
+ "limits": [
+ "Filename year is not an effective or publication date.",
+ "Baseline periods describe load inputs, not coefficient applicability.",
+ "The 2026 workbook Start heading says 2025; both labels are retained.",
+ "Example curve outputs are not measured market data and are not emitted."
+ ]
+}
diff --git a/tools/inputs/public-distribution-coefficients-sources.csv b/tools/inputs/public-distribution-coefficients-sources.csv
new file mode 100644
index 00000000..176990ed
--- /dev/null
+++ b/tools/inputs/public-distribution-coefficients-sources.csv
@@ -0,0 +1,29 @@
+url,title,member,originalSha256,defaultProtection,rows,numericParameters,archiveSha256
+https://www.ercot.com/files/docs/2025/12/31/2026-TDSP-Distribution-Loss-Factors-Methodology.zip,2026 TDSP Distribution Loss Factors - Methodology,2026 TDSP Distribution Loss Factors - Methodology/ERCOT_DLF_Summary_2026.xlsx,cb1884670c350ad25045a881e08d2815eb7e449d5019d13c00ae5b7385d51f8e,False,17,51,3419c47b2dca269f1a472c8e62663078218b2f64e4515f8f063771d032286d7e
+https://www.ercot.com/files/docs/2024/12/12/2025-tdsp-distribution-loss-factors-methodology.zip,2025 TDSP Distribution Loss Factors - Methodology,2025 TDSP Distribution Loss Factors - Methodology/ERCOT_DLF_Summary_2025.xlsx,87d7439dc028b4946ec086e54584887dd4ab72bdab314a542493a97436068049,False,17,51,040c1ed36b118419adba3d700b82290d133d777932ab14e64721443eab97f611
+https://www.ercot.com/files/docs/2024/01/19/2024%20(Mar%20-%20Dec)%20TDSP%20Distribution%20Loss%20Factors%20-%20Methodology.zip,2024 (Mar - Dec) TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2024 (Mar - Dec).xlsx,7f681b462c4603ba3d0f61fa01828b1dc78310659d6306bc296b2af83790707d,False,17,51,ace3d66fb19744849f65d806c450bb5500373a1d6e45a123200ac86c5eac0011
+https://www.ercot.com/files/docs/2024/01/22/2024%20(Jan%20-%20Feb)%20TDSP%20Distribution%20Loss%20Factors%20-%20Methodology.zip,2024 (Jan - Feb) TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2024 (Jan - Feb).xlsx,7c577a7ae312e38110d3b1402ae6137f12a4f6f70f2f1c1a4d4df2770999dc6e,False,15,45,4bb584066e6883aeab3a0550986f88b1b6f8bb4b58dcc8883a8d23abb274c101
+https://www.ercot.com/files/docs/2022/12/15/2023%20TDSP%20Distribution%20Loss%20Factors%20-%20Methodology.zip,2023 TDSP Distribution Lost Factors - Methodology,ERCOT_DLF_Summary_2023.xlsx,0556c6b70d02085e23b77a10d547997aadc7dfd9d0000fffba5c2cb10b8bb82e,False,15,45,4207ec55d5a29cb0f6ede65f2b735abe13db8f9c46a3c057cb912fde93ca95cc
+https://www.ercot.com/files/docs/2021/12/22/2022_TDSP_Distribution_Loss_Factors_Methodology.zip,2022 TDSP Distribution Loss Factors Methodology,ERCOT_DLF_Summary_2022.xls,f254588da336cd7f0f96f7a25bc3405fe62b8cb6e29d5a1a9f485c2c77cfafe3,False,15,45,3f5906c48d6f3a85f392ff6ad79e6403fa6cfbe9b8afda2f12a618a3b9f4c11a
+https://www.ercot.com/files/docs/2020/12/17/2021_TDSP_Distribution_Loss_Factors_Methodology.zip,2021 TDSP Distribution Loss Factors Methodology,ERCOT_DLF_Summary_2021.xls,e323c86f568be12096c0575dc03af5a99518420a60e6d3626be74902164a1a9b,True,15,45,9958093652bd49b0cc693c204b81c9a89d29f132406ca3f173fea38e69f8be32
+https://www.ercot.com/files/docs/2019/12/05/2020_TDSP_Distribution_Loss_Factors_-_Methodology.zip,2020 TDSP Distribution Loss Factors Methodology,ERCOT_DLF_Summary_2020.xls,32eb62c39fa4d715569dc6c6ad03395e59352e348bc7746011eb4383f1b3114e,True,15,45,40c13647c506e00e405eba056a2fcf841a3916fc4742e419e35745944c5dd62e
+https://www.ercot.com/files/docs/2018/12/19/2019_TDSP_Distribution_Loss_Factors_-_Methodology.zip,2019 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2019.xls,07914383669ce5d3290597744e7900d1b7f5fce85053f783801f721137993197,True,15,45,5e7b40b73625f5aba6c7ad92492a5b6142c3f6887170c36c06002f5be4713fff
+https://www.ercot.com/files/docs/2017/12/19/2018_TDSP_Distribution_Loss_Factors_-_Methodology.zip,2018 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2018.xls,c2bb32b53e244b375e02b6b743c672f036176f374be8ebf02e67621ab6ad902b,True,21,63,ffc5da45188bfd5cec9f6c789dd6a19a9f7c43c1361135e244cbd6d961b4af26
+https://www.ercot.com/files/docs/2016/12/22/2017_TDSP_Distribution_Loss_Factors_-_Methodology.zip,2017 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2017.xls,0a83770da5c800e3f0c972fbe980ca96afaab6a6027eed16351853a337f0e06c,True,21,63,69a4d74381b394724173e69169db0d2ab19443bc3b3aa8b0c7136235635d8823
+https://www.ercot.com/files/docs/2015/12/21/2016_tdsp_distribution_loss_factors___methodology.zip,2016 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2016.xls,97b23b6fe244c465b78488cf524b6d289a5abc587ced6a88fe30d06bd136cd13,True,19,57,b32fd1c032312eb221a20a3d19c1826d956a32c2f4026463dc2b5e53d92de1d4
+https://www.ercot.com/files/docs/2014/11/19/2015_tdsp_distribution_loss_factors___methodology.zip,2015 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2015.xls,9065d2314666be468992645b9d1fe82b7bc99937bb45a6214c70723cd6923f27,True,19,57,9f826796a3f5ce8c0d9ced69321454348fb26920d26c5a130e87947dbc576122
+https://www.ercot.com/files/docs/2013/12/26/2014_tdsp_distribution_loss_factors___methodology.zip,2014 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2014.xls,7c9b3ec487c617eca4a7860835729694875cbe056a4bd129342851542ecaa7d9,True,19,57,68070532690e0b29e3fd7237739d0e60da20d92e1b567d20567917536d459fbf
+https://www.ercot.com/files/docs/2012/12/19/2013_tdsp_distribution_loss_factors___methodology.zip,2013 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2013.xls,a3bb5a684585f9ae9b6ad41d3d56754dd8b959fbb92ff0b77c4cfa87152306d9,True,16,48,901a4cb1b9ea269463dfc842573e532d2930b81b2f2a132f4c069291701f402f
+https://www.ercot.com/files/docs/2012/02/21/2012_tdsp_distribution_loss_factors___methodology.zip,2012 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2012.xls,386680cc842dd19d1cfb064fe2b7fbc0ccef9f671b8e0512166f280857305d29,True,16,48,65bab9dcc0ab23a8610163157f8c552f4f05e3fe17f39209909a67bea0c2a384
+https://www.ercot.com/files/docs/2010/11/12/2011_tdsp_distribution_loss_factors___methodology.zip,2011 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2011.xls,ce5ef92930acee19dec0213f0a9c3fd9846c28e331d7cf0f3d0d8c98b248637f,True,16,48,0aac784f1c046d014a40fc0d8762e1da9bf491dcfad79cfd8dda24d7ff96b6aa
+https://www.ercot.com/files/docs/2009/11/17/ercot_dlf_posting_for_2010.zip,2010 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2010.xls,99d7feccea1e571941bf2d7c2ccc5be70622f3980b9bf0ec4ae3b23bfcad9345,False,16,48,767906128c18abbc6b4fcb6abaf18ad5d14897ff3ac595027a3b8287511fce9f
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2009.zip,2009 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2009.xls,eb5fa5149d031c898f4366f621641f2f5953ebcd28822de0a076b1589d5864a3,True,16,48,bee58dde1809c96fc13e2387c3b84f04974493285a039d5749e64980377f1787
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2008.zip,2008 TDSP Distribution Loss Factors - Methodology,ERCOT DLF Posting for 2008/ERCOT_DLF_Summary_2008.xls,61bddbeedfb551ce567de106933c8cc3d3ed9af7a190c5273c30220e26093007,True,16,48,59aa78b149d57b8de03d6e964f629cac88aec18fcbc601bd3e81c964bd50e3bd
+https://www.ercot.com/files/docs/2009/10/21/ercot_dlf_posting_for_2007_may_dec.zip,2007 TDSP Distribution Loss Factors - Methodology (May - Dec),DLF's for 2007 May-Dec/ERCOT/ERCOT_DLF_Summary_2007.xls,e96916e230b0488c84b42a7c64491cb1ba9933fdbd662953e4646212b92ca163,False,16,48,5c9bc024fa98898eac3076d76335170f9be41b73a1b8af10b14d57c54645c865
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2007.zip,2007 TDSP Distribution Loss Factors - Methodology (Jan - Apr),DLF 2007 posting 12-11-06/ERCOT_DLF_Summary_2007.xls,99ea14f9a9f672502a8aef4002d8fe2630bcf2d04f56d3d4e3112dc261d96130,True,18,54,92205a78dd43a5a0d97840eaed0fc7c088f046977b2101d9f1e02c47efbf99de
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2006.zip,2006 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2006.xls,28baef1af49c91abb0c76d0437e2ec8404fd24a36c79bc539b081cc3bc874cae,True,18,54,461b2ea75e0b79304f798bc9ef7a02dfb71db14cbd83524833dddaf123799dc8
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2005.zip,2005 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2005.xls,01d03b43150b954abfaa7a2e1e02f936cc6143780ae53280a863cda02479be3a,True,18,54,67ad45f65f942142b1b90c48896adb88450a7d065ebf1bd281d11c7c1ddb59ad
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2004.zip,2004 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2004.xls,4e2709c949713f6da57318b65a9304051b32c4e16343e0b14affe59f4b6a390b,True,16,48,cd5a36e71ce45a8761a433e65e811fe3b8c55f4cc3f1c947c96bd696adb098fd
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2003.zip,2003 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2003 .xls,098b2df6dd29f21447e07ddaca98ee3c9cfda7fbd0f120e4f320a7731b987fe8,False,15,45,d14e8e5fc5d6bcc8de0152ccf0e4156630bc1b9c9314f63e607a30168772f79e
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2002.zip,2002 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2002.xls,3b2e6dda7ac01b13323ef27e18e3dc96ccf5cd629d6c8f535f47de1abae1276b,False,15,45,d78ace036a36abc09cd744a00e187cf15b9552adca941006cd9acbde8bcc886f
+https://www.ercot.com/files/docs/2009/10/19/ercot_dlf_posting_for_2001.zip,2001 TDSP Distribution Loss Factors - Methodology,ERCOT_DLF_Summary_2001.xls,1ac334cf5d72254b72b87243e3d77e3a01b50ce54dcdaced57f9615d70cafcff,False,14,42,ed10cedcb7ca44291837032c0c616d0616023b2e1b97c1e1916f9193d773e7e5
diff --git a/tools/inputs/public-four-cp-evidence.json b/tools/inputs/public-four-cp-evidence.json
new file mode 100644
index 00000000..bf465ff5
--- /dev/null
+++ b/tools/inputs/public-four-cp-evidence.json
@@ -0,0 +1,1010 @@
+{
+ "checkedAt": "2026-09-08T07:35:39.651408+00:00",
+ "indexUrl": "https://www.ercot.com/mktinfo/data_agg/4cp",
+ "indexSha256": "7cebdf2c95372d7a8d49549ddc0cdb46270eb52e5c81270c60fc2c5ba73b6a0e",
+ "archiveUrl": "https://www.ercot.com/files/docs/2022/01/13/1996-2020_FourCoincidentPeakCalculations.zip",
+ "comparison": {
+ "archiveSha256": "2583f723df58a5cc90a9fb7270bf02346003c4642d541d32cbd0bb837fcd4f03",
+ "rows": 4345,
+ "numericFieldsCompared": 27290,
+ "years": [
+ 1996,
+ 1997,
+ 1998,
+ 1999,
+ 2000,
+ 2001,
+ 2002,
+ 2003,
+ 2004,
+ 2005,
+ 2006,
+ 2007,
+ 2008,
+ 2009,
+ 2010,
+ 2011,
+ 2012,
+ 2013,
+ 2014,
+ 2015,
+ 2016,
+ 2017,
+ 2018,
+ 2019,
+ 2020
+ ],
+ "peakClockFieldsCompared": 17284,
+ "identifierFieldsCompared": 13035,
+ "tables": 43,
+ "scope": "All selected annual allocation tables compared against independent original workbook extraction; monthly submitted/preliminary loads and supporting calculation sheets are not covered by this reader."
+ },
+ "liveClientDownload": {
+ "bytes": 2428522,
+ "matchesComparedArchiveSha256": true,
+ "decodedRows": 4345,
+ "credentialsUsed": false
+ },
+ "rowsByYear": {
+ "1996": 24,
+ "1997": 24,
+ "1998": 26,
+ "1999": 144,
+ "2000": 36,
+ "2001": 393,
+ "2002": 626,
+ "2003": 250,
+ "2004": 126,
+ "2005": 250,
+ "2006": 125,
+ "2007": 249,
+ "2008": 252,
+ "2009": 248,
+ "2010": 125,
+ "2011": 126,
+ "2012": 127,
+ "2013": 128,
+ "2014": 258,
+ "2015": 131,
+ "2016": 134,
+ "2017": 135,
+ "2018": 131,
+ "2019": 142,
+ "2020": 135
+ },
+ "rowsByKind": {
+ "allocation": 4212,
+ "comparison": 124,
+ "revision_detail": 9
+ },
+ "units": {
+ "kW": 647,
+ "MW": 3698
+ },
+ "fixture": {
+ "path": "four-cp/allocations.zip",
+ "sha256": "0d66af4f38d72405fbafe5ef0458bbee7100e38a16c46d0cefbd9b8eb1c3730e",
+ "bytes": 454832,
+ "method": "All annual worksheets retained from 40 original workbooks, including the mixed monthly/annual 1997 sheet; unrelated sheets omitted. XLS rewritten with xlwt and XLSX with openpyxl using original cached values, headers and notes. Original member/sheet names retained.",
+ "workbooks": [
+ {
+ "member": "LOSSADJF.XLS",
+ "sourceSha256": "e8a0efa578473f492032021378f7bb8610e46f5ada3ada5bd4e9163dc1343f24",
+ "sheets": [
+ {
+ "name": "1996 Load Responsibility",
+ "rows": 36
+ }
+ ]
+ },
+ {
+ "member": "974cpcal.xls",
+ "sourceSha256": "f13481134c17f69f842881983052ddd7f5f7fc3c4f4ca6a6272c2456edecaf34",
+ "sheets": [
+ {
+ "name": "97 FOUR CP",
+ "rows": 155
+ }
+ ]
+ },
+ {
+ "member": "984CPCAL.xls",
+ "sourceSha256": "ca60410e61ed0c223a32cf0a2dab81c29a5436027b6aa85e4c903120616ce1a7",
+ "sheets": [
+ {
+ "name": "1998 FOUR CP CALCULATION",
+ "rows": 30
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/1999/994CPCAL1.xls",
+ "sourceSha256": "6d369b38b3413fb4b56cea708aa9372825684d697922533c063cc192f358d0c7",
+ "sheets": [
+ {
+ "name": "1999 FOUR CP CALCULATION",
+ "rows": 40
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/1999/994CPCAL2.xls",
+ "sourceSha256": "840dab6316e875008e565e10281b622b2d6493364737e15943c018bdb199c7a8",
+ "sheets": [
+ {
+ "name": "1999 FOUR CP CALCULATION",
+ "rows": 40
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/1999/994CPCALFiled.xls",
+ "sourceSha256": "3c9a33a3014232c85d9a55f85af07debaabf964625b36f8e50c04464c879b59d",
+ "sheets": [
+ {
+ "name": "1999 FOUR CP CALCULATION",
+ "rows": 40
+ }
+ ]
+ },
+ {
+ "member": "CSWcorrections-r1.xls",
+ "sourceSha256": "d935da4e7066eeda835d4a219fb223601f0c0d10d217dbcc426f9f0daf6ac89b",
+ "sheets": [
+ {
+ "name": "1999 FOUR CP CALCULATION",
+ "rows": 40
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2000/4CPCAL200003262001.xls",
+ "sourceSha256": "f8f7032e0704063c88c0ac47e92a3e189284ddcc5f79dd1ed2c394ab6cbcc353",
+ "sheets": [
+ {
+ "name": "2000 FOUR CP CALCULATION",
+ "rows": 40
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/2001_4CP_Attachment_A_Revised_11.04.02.xls",
+ "sourceSha256": "fdb11c6ebe4f70d4f6c16ee404ede48f67fb6e3884d7c89e7a6a055d04883608",
+ "sheets": [
+ {
+ "name": "2001FOUR CP CALCULATION",
+ "rows": 82
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCAL-12012001.xls",
+ "sourceSha256": "38ff478cc12c349b5a38062501e2cf8dfc10709a46b83c65966ac39061ed6823",
+ "sheets": [
+ {
+ "name": "2001FOUR CP CALCULATION",
+ "rows": 81
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCAL-12202001.xls",
+ "sourceSha256": "b5a58bf7cbe517499ae2dd911c335b48b6b71f3b5d263934f02693049fc7888e",
+ "sheets": [
+ {
+ "name": "2001FOUR CP CALCULATION",
+ "rows": 81
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCalc-rev03252002.xls",
+ "sourceSha256": "395c32de965b142df05fa12f9b63a13c32d783b223f6cead820a2cd7808b45b2",
+ "sheets": [
+ {
+ "name": "2001FOUR CP CALCULATION",
+ "rows": 82
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCalc-rev10112002.xls",
+ "sourceSha256": "d5a93315d6715003100d5eddefc1465bd8c8dd32a3484abc205f3ffc79746e93",
+ "sheets": [
+ {
+ "name": "2001FOUR CP CALCULATION",
+ "rows": 82
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2002/2002_4CP.xls",
+ "sourceSha256": "80c7f0d8b02976663121f116b5c8e2f39d35b0519c4defb64a05f7175eff1af8",
+ "sheets": [
+ {
+ "name": "2002FOUR CP CALCULATION",
+ "rows": 131
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2002/2002_4CP_Filing_Comparison.xls",
+ "sourceSha256": "7caed5d81d114cc2d73c564494281c985705dc78b4874557a1b84ac4c0a3926a",
+ "sheets": [
+ {
+ "name": "4CP - Finals",
+ "rows": 131
+ },
+ {
+ "name": "4CP - True-ups",
+ "rows": 130
+ },
+ {
+ "name": "Comparison",
+ "rows": 127
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2002/2002_4CP_revised.xls",
+ "sourceSha256": "5a1a51454d6eae408186df6317f0b671b8cfb4094139a532f854e6801c9a272b",
+ "sheets": [
+ {
+ "name": "2002FOUR CP CALCULATION",
+ "rows": 130
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2003/20034CP2.xls",
+ "sourceSha256": "a6cf30982cc3be43d6e521cbce097cab33a29dcc59c60e155b0263007dc57e12",
+ "sheets": [
+ {
+ "name": "2003FOUR CP CALCULATION",
+ "rows": 130
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2003/20034CP3.xls",
+ "sourceSha256": "4bd077814f9d23f87606a44096feaecba21342c3256b5809926b881d9b42489d",
+ "sheets": [
+ {
+ "name": "2003FOUR CP CALCULATION",
+ "rows": 130
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2004/20044CP.xls",
+ "sourceSha256": "dbf459d310538ea82f492e6388cae8cc9e835ea6ce1888489da0b7de6f97ef7d",
+ "sheets": [
+ {
+ "name": "2004 FOUR CP CALCULATION",
+ "rows": 131
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2005/20054CP3.xls",
+ "sourceSha256": "cd831f2cd1bfcffc5aabd72b699d5fcef2e64638562257e11412cd8766b387b6",
+ "sheets": [
+ {
+ "name": "2005 FOUR CP CALCULATION",
+ "rows": 130
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2005/Attch_A_2005_4CP_REVISED.xls",
+ "sourceSha256": "b1a49cda47ef87898a92932fda07a91ef6dd8d1f3ea82492c11591e926745837",
+ "sheets": [
+ {
+ "name": "2005 FOUR CP CALCULATION",
+ "rows": 132
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2006/FILING_20064CP.xls",
+ "sourceSha256": "25a94c0960f9ac063f1c6c1a026f127a7b72f8921ef9621765363d31647f0d25",
+ "sheets": [
+ {
+ "name": "2006 FOUR CP CALCULATION",
+ "rows": 130
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2007/FILING_20074CP.xls",
+ "sourceSha256": "fe44f24029a63e9379cf5b715c5680e9ceb343f761f052285f5a920bbb0c805c",
+ "sheets": [
+ {
+ "name": "2007 4CP CALCULATION",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2007/FILING_20074CP_revised_February_2008.xls",
+ "sourceSha256": "89ee47a2fb8e9227b48f5e84b9d1f6cb786a380f613c687320e64821e9d89ced",
+ "sheets": [
+ {
+ "name": "2007 FOUR CP CALCULATION",
+ "rows": 130
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2008/FILING_20084CP.xls",
+ "sourceSha256": "7a0df41acdebdadfe9c0c4c86ed186d2d60392cb03361527cf71bc70db388caa",
+ "sheets": [
+ {
+ "name": "2008 4CP CALCULATION",
+ "rows": 132
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2008/FILING_20084CP_revised_January_2009.xls",
+ "sourceSha256": "0e8471c469df9e94bb8d07e60cbbde70f158688cf45a3906d1009c9a322b2efa",
+ "sheets": [
+ {
+ "name": "2008 4CP CALCULATION",
+ "rows": 132
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2009/FILING_20094CP.xls",
+ "sourceSha256": "0ed1dd42ea4b4a23ac4e31a1bfb79129faccb53f82d1a5ebd9f7914572bb842a",
+ "sheets": [
+ {
+ "name": "2009 4CP CALCULATION",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2009/FILING_20094CP_revised_January_2009.xls",
+ "sourceSha256": "1da145ec5845f332b0114f52fabf6f864e9b94c2a06fc5b62ef55266cd4b346c",
+ "sheets": [
+ {
+ "name": "2009 4CP CALCULATION Rev1",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2010/Filing_2010_4CP_revised__January_2011.xls",
+ "sourceSha256": "1cc66a79c44e7d3129c5247090b155b7ea9531dc601de113850090bd3094062c",
+ "sheets": [
+ {
+ "name": "2010 4CP CALCULATION",
+ "rows": 130
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2011/rpt.00013037.0000000000000000.20111129.090457.4CP20111129.xls",
+ "sourceSha256": "d8fda5a39d701e5a17831103943ac7898b59a28e273bf467b42390f4234ea8e3",
+ "sheets": [
+ {
+ "name": "2011 4CP CALCULATION",
+ "rows": 131
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2012/rpt.00013037.0000000000000000.20121127.095944000.4CP20121126.xls",
+ "sourceSha256": "2c270370fc1fd52188bbb928815bbda8d16cfa711dbe7b1351d2a69acf98936c",
+ "sheets": [
+ {
+ "name": "2012 4CP CALCULATION",
+ "rows": 132
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2013/ERCOT_Four_Coincident_Peak_Calculations_2013.xls",
+ "sourceSha256": "2ef405283b735b818bb9d94bae9249ab8473e327c3bbda3b4e9e2ca27d0ee160",
+ "sheets": [
+ {
+ "name": "2013 4CP CALCULATION",
+ "rows": 133
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2014/ERCOT__FourCoincidentPeakLoadCalculation2014.xls",
+ "sourceSha256": "6d405355a7772da766b1a740cfc3c1e15a4c2727691e5965cf34c30cd69bc291",
+ "sheets": [
+ {
+ "name": "2014 4CP CALCULATION",
+ "rows": 134
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2014/ERCOT__FourCoincidentPeakLoadCalculation2014Amendment.xls",
+ "sourceSha256": "849362f0e60b68fb83483207ed5edb1c46d28d55ec0d26d0b9f4cc20346b50ac",
+ "sheets": [
+ {
+ "name": "2014 4CP CALCULATION",
+ "rows": 134
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2015/ERCOTFourCoincidentPeakLoadCalculation2015.xls",
+ "sourceSha256": "662f4272c87d16a20de384f2734781e6a286ca874a1ff57acf3f7164b1c7bc76",
+ "sheets": [
+ {
+ "name": "2015 4CP CALCULATION",
+ "rows": 136
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2016/ERCOTFourCoincidentPeakLoadCalculation2016.xls",
+ "sourceSha256": "a0b76df57d4659633751c7b396fd4d6b81514659cf90761cddd0132aa3ea61a5",
+ "sheets": [
+ {
+ "name": "2016 4CP CALCULATION",
+ "rows": 140
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2017/ERCOTFourCoincidentPeakLoadCalculation2017.xlsx",
+ "sourceSha256": "a7dff7bcae1498deef821b018e7ed803d5d1ee1ec7ec441c503a5d311e81add9",
+ "sheets": [
+ {
+ "name": "2017 4CP CALCULATION",
+ "rows": 140
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2018/ERCOTFourCoincidentPeakLoadCalculation2018.xlsx",
+ "sourceSha256": "1b07527afd661e339801291c2e3d562824f681fcc62690c13ecb97e079d90dbd",
+ "sheets": [
+ {
+ "name": "2018 4CP CALCULATION",
+ "rows": 139
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2019/ERCOTFourCoincidentPeakLoadCalculation2019.xlsx",
+ "sourceSha256": "550b1dfb776252b19b2e7ac1af3287ed983f9961c43ab722c6f1dcaad8ce37ae",
+ "sheets": [
+ {
+ "name": "2019 4CP CALCULATION",
+ "rows": 139
+ },
+ {
+ "name": "Revision_Details",
+ "rows": 35
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2020/ERCOTFourCoincidentPeakLoadCalculation2020.xlsx",
+ "sourceSha256": "493f0aa5e2e6f10b708ab1ba1893d54560ed41f5d5139bd4e245df9e2c90fea0",
+ "sheets": [
+ {
+ "name": "2020 4CP CALCULATION",
+ "rows": 143
+ }
+ ]
+ }
+ ]
+ },
+ "currentProduct": {
+ "id": "NP9-83-M",
+ "url": "https://www.ercot.com/mp/data-products/data-product-details?id=NP9-83-M",
+ "htmlSha256": "ba7a2ec95e80c6e90c1434abd43fc2842e46086e166056748b2d04db917ae771",
+ "reportTypeId": 13037,
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "status": "Excluded MIS routes; page inspected, MIS not called."
+ },
+ "monthlyComparison": {
+ "archiveSha256": "2583f723df58a5cc90a9fb7270bf02346003c4642d541d32cbd0bb837fcd4f03",
+ "rows": 7633,
+ "tables": 86,
+ "numericFieldsCompared": 22950,
+ "peakTimestampsCompared": 7633,
+ "settlementMetadataRowsCompared": 5249,
+ "identifierFieldsCompared": 30532,
+ "years": [
+ 1997,
+ 1998,
+ 1999,
+ 2000,
+ 2001,
+ 2002,
+ 2003,
+ 2004,
+ 2005,
+ 2006,
+ 2007
+ ],
+ "countsByYear": {
+ "1997": 100,
+ "1998": 108,
+ "1999": 444,
+ "2000": 148,
+ "2001": 1584,
+ "2002": 1004,
+ "2003": 1000,
+ "2004": 504,
+ "2005": 1375,
+ "2006": 994,
+ "2007": 372
+ },
+ "scope": "All 86 published monthly peak/submitted-load tables in the original historical ZIP independently compared by source cell, including totals, revisions, loss components, MW/MWh quantities, peak clocks and settlement-run metadata. Supporting generation/loss calculation matrices are outside this reader."
+ },
+ "monthlyFixture": {
+ "path": "four-cp/monthly.zip",
+ "sha256": "3bb3bdb97eb2c94397f0e484f7018a49ba9c1da07e92bdf77c749c77a5aaf9a1",
+ "bytes": 290437,
+ "method": "All 68 monthly worksheets retained from 29 source workbooks, rewritten with original cached values and notes. Original member/sheet names and row positions retained.",
+ "workbooks": [
+ {
+ "member": "974cpcal.xls",
+ "sourceSha256": "f13481134c17f69f842881983052ddd7f5f7fc3c4f4ca6a6272c2456edecaf34",
+ "sheets": [
+ {
+ "name": "97 FOUR CP",
+ "rows": 155
+ }
+ ]
+ },
+ {
+ "member": "984CPCAL.xls",
+ "sourceSha256": "ca60410e61ed0c223a32cf0a2dab81c29a5436027b6aa85e4c903120616ce1a7",
+ "sheets": [
+ {
+ "name": "ISO DATA REVIEW",
+ "rows": 127
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/1999/994CPCAL1.xls",
+ "sourceSha256": "6d369b38b3413fb4b56cea708aa9372825684d697922533c063cc192f358d0c7",
+ "sheets": [
+ {
+ "name": "ISO DATA REVIEW",
+ "rows": 169
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/1999/994CPCAL2.xls",
+ "sourceSha256": "840dab6316e875008e565e10281b622b2d6493364737e15943c018bdb199c7a8",
+ "sheets": [
+ {
+ "name": "ISO DATA REVIEW",
+ "rows": 169
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/1999/994CPCALFiled.xls",
+ "sourceSha256": "3c9a33a3014232c85d9a55f85af07debaabf964625b36f8e50c04464c879b59d",
+ "sheets": [
+ {
+ "name": "ISO DATA REVIEW",
+ "rows": 169
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2000/4CPCAL200003262001.xls",
+ "sourceSha256": "f8f7032e0704063c88c0ac47e92a3e189284ddcc5f79dd1ed2c394ab6cbcc353",
+ "sheets": [
+ {
+ "name": "ISO DATA REVIEW",
+ "rows": 169
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/2001_4CP_Attachment_A_Revised_11.04.02.xls",
+ "sourceSha256": "fdb11c6ebe4f70d4f6c16ee404ede48f67fb6e3884d7c89e7a6a055d04883608",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 82
+ },
+ {
+ "name": "July",
+ "rows": 82
+ },
+ {
+ "name": "August",
+ "rows": 83
+ },
+ {
+ "name": "September",
+ "rows": 83
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCAL-12012001.xls",
+ "sourceSha256": "38ff478cc12c349b5a38062501e2cf8dfc10709a46b83c65966ac39061ed6823",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 80
+ },
+ {
+ "name": "July",
+ "rows": 80
+ },
+ {
+ "name": "August",
+ "rows": 81
+ },
+ {
+ "name": "September",
+ "rows": 81
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCAL-12202001.xls",
+ "sourceSha256": "b5a58bf7cbe517499ae2dd911c335b48b6b71f3b5d263934f02693049fc7888e",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 80
+ },
+ {
+ "name": "July",
+ "rows": 80
+ },
+ {
+ "name": "August",
+ "rows": 81
+ },
+ {
+ "name": "September",
+ "rows": 81
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCalc-rev03252002.xls",
+ "sourceSha256": "395c32de965b142df05fa12f9b63a13c32d783b223f6cead820a2cd7808b45b2",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 82
+ },
+ {
+ "name": "July",
+ "rows": 82
+ },
+ {
+ "name": "August",
+ "rows": 83
+ },
+ {
+ "name": "September",
+ "rows": 83
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2001/4CPCalc-rev10112002.xls",
+ "sourceSha256": "d5a93315d6715003100d5eddefc1465bd8c8dd32a3484abc205f3ffc79746e93",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 82
+ },
+ {
+ "name": "July",
+ "rows": 82
+ },
+ {
+ "name": "August",
+ "rows": 83
+ },
+ {
+ "name": "September",
+ "rows": 83
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2002/2002_4CP.xls",
+ "sourceSha256": "80c7f0d8b02976663121f116b5c8e2f39d35b0519c4defb64a05f7175eff1af8",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 128
+ },
+ {
+ "name": "July",
+ "rows": 128
+ },
+ {
+ "name": "August",
+ "rows": 128
+ },
+ {
+ "name": "September",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2002/2002_4CP_revised.xls",
+ "sourceSha256": "5a1a51454d6eae408186df6317f0b671b8cfb4094139a532f854e6801c9a272b",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 127
+ },
+ {
+ "name": "July",
+ "rows": 127
+ },
+ {
+ "name": "August",
+ "rows": 127
+ },
+ {
+ "name": "September",
+ "rows": 127
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2003/20034CP2.xls",
+ "sourceSha256": "a6cf30982cc3be43d6e521cbce097cab33a29dcc59c60e155b0263007dc57e12",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 128
+ },
+ {
+ "name": "July",
+ "rows": 128
+ },
+ {
+ "name": "August",
+ "rows": 128
+ },
+ {
+ "name": "September",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2003/20034CP3.xls",
+ "sourceSha256": "4bd077814f9d23f87606a44096feaecba21342c3256b5809926b881d9b42489d",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 128
+ },
+ {
+ "name": "July",
+ "rows": 128
+ },
+ {
+ "name": "August",
+ "rows": 128
+ },
+ {
+ "name": "September",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2004/20044CP.xls",
+ "sourceSha256": "dbf459d310538ea82f492e6388cae8cc9e835ea6ce1888489da0b7de6f97ef7d",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 129
+ },
+ {
+ "name": "July",
+ "rows": 129
+ },
+ {
+ "name": "August",
+ "rows": 129
+ },
+ {
+ "name": "September",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2005/2005-08CP.xls",
+ "sourceSha256": "e7450d6971cec87822b0d97876ada10ed31cf561d8bc9ce53f1e02e11d8a18f5",
+ "sheets": [
+ {
+ "name": "July",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2005/20054CP.xls",
+ "sourceSha256": "39447266ed27866e9b1a06ca6a8670845720756b8e322387ffaae2a21d088b71",
+ "sheets": [
+ {
+ "name": "July",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2005/20054CP2.xls",
+ "sourceSha256": "b648544547376d179ff6e5079350b8ef868d32d0e6b5eb10f2a011cfd7714ef4",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2005/20054CP3.xls",
+ "sourceSha256": "cd831f2cd1bfcffc5aabd72b699d5fcef2e64638562257e11412cd8766b387b6",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 128
+ },
+ {
+ "name": "July",
+ "rows": 128
+ },
+ {
+ "name": "August",
+ "rows": 128
+ },
+ {
+ "name": "September",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2005/Attch_A_2005_4CP_REVISED.xls",
+ "sourceSha256": "b1a49cda47ef87898a92932fda07a91ef6dd8d1f3ea82492c11591e926745837",
+ "sheets": [
+ {
+ "name": "June",
+ "rows": 128
+ },
+ {
+ "name": "July",
+ "rows": 128
+ },
+ {
+ "name": "August",
+ "rows": 128
+ },
+ {
+ "name": "September",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2006/2006-06CP-PRELIMINARY.xls",
+ "sourceSha256": "bf00ff61276de2af8c059f0881727218a6b1e364b115657b92afc029503f76fa",
+ "sheets": [
+ {
+ "name": "Sheet1",
+ "rows": 129
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2006/2006-07CP-PRELIMINARY.xls",
+ "sourceSha256": "76fd1692983c26170c8951a6a202a5a58fdb87f685844c850af7158c629796bb",
+ "sheets": [
+ {
+ "name": "Sheet1",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2006/2006-08CP-PRELIMINARY.xls",
+ "sourceSha256": "f29247c8198a5f8de79d583c133405d6b1efee47472b43a4271ca2bd988353e0",
+ "sheets": [
+ {
+ "name": "Sheet1",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2006/2006-09CP-PRELIMINARY.xls",
+ "sourceSha256": "919a4fa1447b2c429397f0a8571b7e91d60b0613a24dbfeee2d6a82cfc853087",
+ "sheets": [
+ {
+ "name": "Sheet1",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2006/FILING_20064CP.xls",
+ "sourceSha256": "25a94c0960f9ac063f1c6c1a026f127a7b72f8921ef9621765363d31647f0d25",
+ "sheets": [
+ {
+ "name": "JUNE",
+ "rows": 129
+ },
+ {
+ "name": "JULY",
+ "rows": 128
+ },
+ {
+ "name": "AUGUST",
+ "rows": 128
+ },
+ {
+ "name": "SEPTEMBER",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2007/2007-06CP-Preliminary.xls",
+ "sourceSha256": "fbd0fa13ebedd8efab5ec6e8fb0bc25f87aa3fa789814d3f6588f133c5ed7f5d",
+ "sheets": [
+ {
+ "name": "June 07 4CP Filing",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2007/2007-07CP-Preliminary.xls",
+ "sourceSha256": "5e9bc1911911be0851257111b79f3a6639a12c4ab49b0948961bf14dd974fb66",
+ "sheets": [
+ {
+ "name": "July 07 4CP Filing",
+ "rows": 128
+ }
+ ]
+ },
+ {
+ "member": "1996-2020_FourCoincidentPeakCalculations/2007/2007-08CP-Preliminary.xls",
+ "sourceSha256": "639829e135886623ec2cbadfc2b5fcf47756c295d4d2c337976f2d4382ea59be",
+ "sheets": [
+ {
+ "name": "Sheet1",
+ "rows": 128
+ }
+ ]
+ }
+ ]
+ },
+ "ufePage": {
+ "url": "https://www.ercot.com/mktinfo/data_agg/ufe",
+ "htmlSha256": "0d480df4bb1c55dcff4458c1bde863a6743b5695989a6c68351e4502ec3cd586",
+ "sourceFormat": "Annual PPT/PPTX analysis reports",
+ "decision": "No slide extraction: outside the agreed operational and market time-series focus."
+ },
+ "decoderSha256": "58e5b78ac17a7b352d06ee8787b8592333d219343c6ab7dc9b751d15c9afe2bf"
+}
diff --git a/tools/inputs/public-fuel-mix-evidence.json b/tools/inputs/public-fuel-mix-evidence.json
new file mode 100644
index 00000000..d3f53742
--- /dev/null
+++ b/tools/inputs/public-fuel-mix-evidence.json
@@ -0,0 +1,527 @@
+{
+ "checkedAt": "2026-09-07T23:39:44.801362+00:00",
+ "sources": [
+ {
+ "file": "IntGenByFuel2007.xls",
+ "sha256": "c03342fd3870ef5c79945d3c7ad0d69d6c0d5a1b5519848e488001124f709fdc",
+ "dailyRows": 2190,
+ "intervalCells": 210240,
+ "nullIntervalCells": 0,
+ "populatedDstCells": 0,
+ "fuels": {
+ "Coal": 365,
+ "Gas": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Oth": 365,
+ "Wnd": 365
+ },
+ "firstDate": "2007-01-01",
+ "lastDate": "2007-12-31",
+ "publishedTotals": 6,
+ "dailyRowsSha256": "7bbaad204512729e6efa571fc72a64b0e00faf1c5aa94650dacf50e72d49e2db"
+ },
+ {
+ "file": "IntGenByFuel2008.xls",
+ "sha256": "a411e0e8a611807321620dbb8be3848857f23823f88f6ecf1fea4fb8602cf7db",
+ "dailyRows": 2227,
+ "intervalCells": 213792,
+ "nullIntervalCells": 0,
+ "populatedDstCells": 0,
+ "fuels": {
+ "Coal": 366,
+ "Gas_CC": 31,
+ "Gas_GT": 31,
+ "Hydro": 366,
+ "Nuclear": 366,
+ "Oth": 366,
+ "Wnd": 366,
+ "Gas": 335
+ },
+ "firstDate": "2008-01-01",
+ "lastDate": "2008-12-31",
+ "publishedTotals": 92,
+ "dailyRowsSha256": "80fa09d8bc7cea77926b4841e4781505a9ab1150fc8e0d9332a8129d10ff933d"
+ },
+ {
+ "file": "IntGenByFuel2009.xls",
+ "sha256": "cf3d87bfa369462cc1fc9a155f74b6251356d128ab90ad6af3901f0daa28863a",
+ "dailyRows": 2555,
+ "intervalCells": 246120,
+ "nullIntervalCells": 840,
+ "populatedDstCells": 0,
+ "fuels": {
+ "Coal": 365,
+ "Gas_CC": 365,
+ "Gas_GT": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Oth": 365,
+ "Wnd": 365
+ },
+ "firstDate": "2009-01-01",
+ "lastDate": "2009-12-31",
+ "publishedTotals": 91,
+ "dailyRowsSha256": "14e31578d0e6a131d9cc9b2965fed200f28f275f01c5c92635633a76e7bcca0f"
+ },
+ {
+ "file": "IntGenByFuel2010.xls",
+ "sha256": "1166e111cd0bdbe3eaeb3591516cd035837b35937a25daf1f6f8453b21e008ae",
+ "dailyRows": 2555,
+ "intervalCells": 246120,
+ "nullIntervalCells": 210,
+ "populatedDstCells": 637,
+ "fuels": {
+ "Coal": 365,
+ "Gas_CC": 365,
+ "Gas_GT": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Oth": 365,
+ "Wnd": 365
+ },
+ "firstDate": "2010-01-01",
+ "lastDate": "2010-12-31",
+ "publishedTotals": 91,
+ "dailyRowsSha256": "3e81f7c3f82aeb038840ee46061d39b7d008ae6c8b1ea8b440ed3f8429258d5e"
+ },
+ {
+ "file": "IntGenByFuel2011.xls",
+ "sha256": "2735e58daaf8006e8642319d88702fa988b7eb7ee82d341406827687c6bd3c42",
+ "dailyRows": 2931,
+ "intervalCells": 283604,
+ "nullIntervalCells": 2,
+ "populatedDstCells": 1112,
+ "fuels": {
+ "Biomass": 184,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas_CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Sun": 184,
+ "Wind": 365,
+ "Solar": 8
+ },
+ "firstDate": "2011-01-01",
+ "lastDate": "2011-12-31",
+ "publishedTotals": 91,
+ "dailyRowsSha256": "d99b1cb74ac60d4a20533f05c85cd48a067ac3c05833cd207084a9fd712c7d7f"
+ },
+ {
+ "file": "IntGenByFuel2012.xls",
+ "sha256": "218a7e1121e5f87694c35fc8230e62480569057ef3892c72d8eaca801a4a91ef",
+ "dailyRows": 3300,
+ "intervalCells": 320112,
+ "nullIntervalCells": 0,
+ "populatedDstCells": 2196,
+ "fuels": {
+ "Biomass": 366,
+ "Coal": 366,
+ "Gas": 366,
+ "Gas-CC": 215,
+ "Hydro": 366,
+ "Nuclear": 366,
+ "Other": 366,
+ "Solar": 281,
+ "Wind": 366,
+ "Gas_CC": 151,
+ "Sun": 91
+ },
+ "firstDate": "2012-01-01",
+ "lastDate": "2012-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "3d2b168e196b7afb62873aa0082fbb45c3e718647a2a40dc70bf470e71d73ebe"
+ },
+ {
+ "file": "IntGenByFuel2013.xls",
+ "sha256": "0727c90f3297a100f187bd9542996b463d3cc80a195eef4d1cfc469115108f09",
+ "dailyRows": 3285,
+ "intervalCells": 317520,
+ "nullIntervalCells": 2160,
+ "populatedDstCells": 0,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "Wind": 365
+ },
+ "firstDate": "2013-01-01",
+ "lastDate": "2013-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "f6a13e24c4820562f9a9304ca3a3baf3b2a710a2bb128e61ca3c0191305a52f9"
+ },
+ {
+ "file": "IntGenByFuel2014.xls",
+ "sha256": "356f5824f8460a35ec2af442f0174c4b3d6fce0906de67cc05938e6f14e90f8f",
+ "dailyRows": 3285,
+ "intervalCells": 317520,
+ "nullIntervalCells": 2196,
+ "populatedDstCells": 0,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "Wind": 365
+ },
+ "firstDate": "2014-01-01",
+ "lastDate": "2014-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "1041f72b71edd579c2bf5b5dd92af1e09cde965ecfb92d7ead2ec69fdb5d8ac0"
+ },
+ {
+ "file": "IntGenByFuel2015.xls",
+ "sha256": "463e4a1bf85bfe982477e940f357514379b715b8eb307563dc7ea40ccad3d0bb",
+ "dailyRows": 3285,
+ "intervalCells": 317520,
+ "nullIntervalCells": 2160,
+ "populatedDstCells": 36,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "Wind": 365
+ },
+ "firstDate": "2015-01-01",
+ "lastDate": "2015-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "bcaaf6adb5ac224d78dd139ba5eda2a81f60551d1e111c89303e23579c37464f"
+ },
+ {
+ "file": "IntGenByFuel2016.xlsx",
+ "sha256": "dc0e50ccb62044e881d695ec7a22d4e831dcf240c7a8644d2b53046db1a9aca0",
+ "dailyRows": 3294,
+ "intervalCells": 318384,
+ "nullIntervalCells": 2160,
+ "populatedDstCells": 36,
+ "fuels": {
+ "Biomass": 366,
+ "Coal": 366,
+ "Gas": 366,
+ "Gas-CC": 366,
+ "Hydro": 366,
+ "Nuclear": 366,
+ "Other": 366,
+ "Solar": 366,
+ "Wind": 366
+ },
+ "firstDate": "2016-01-01",
+ "lastDate": "2016-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "5fbe59548f70848368bf0a0328d383067add26a7cb97510f6b04289ea59feb6f"
+ },
+ {
+ "file": "IntGenbyFuel2017.xlsx",
+ "sha256": "2321911cc04c64eadcdc7d0ef33f3424f682b957bed9de7165e77090314fca78",
+ "dailyRows": 3285,
+ "intervalCells": 316440,
+ "nullIntervalCells": 1080,
+ "populatedDstCells": 36,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "Wind": 365
+ },
+ "firstDate": "2017-01-01",
+ "lastDate": "2017-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "259da6faac9dbcf7a459f2cacf4c8e90dcb90f490cb0c5767a87b82714e1a1fe"
+ },
+ {
+ "file": "IntGenbyFuel2018.xlsx",
+ "sha256": "5e92f54bd893d9317091a3f75dc13b4d15330ee33035c9569b59c5378f41c6a0",
+ "dailyRows": 3285,
+ "intervalCells": 316440,
+ "nullIntervalCells": 1080,
+ "populatedDstCells": 36,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "Wind": 365
+ },
+ "firstDate": "2018-01-01",
+ "lastDate": "2018-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "45f64f98353f450fb314e0e6bb54b9555e359b31ebb9b86b1ed280f8484ab044"
+ },
+ {
+ "file": "IntGenbyFuel2019.xlsx",
+ "sha256": "40b319543fecfe3ef412173f3db00b9794829802e3acc23d9018ac3f39c32c62",
+ "dailyRows": 3285,
+ "intervalCells": 316440,
+ "nullIntervalCells": 1080,
+ "populatedDstCells": 36,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "Wind": 365
+ },
+ "firstDate": "2019-01-01",
+ "lastDate": "2019-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "8ffbf7802dc0c264255602a4517512ab4b61d9a7a198cdfa42a59e9c9e767c08"
+ },
+ {
+ "file": "IntGenbyFuel2020.xlsx",
+ "sha256": "9091acf360c60cc38573e3d33d64239facdd778a335ec6386ad909a46e3192de",
+ "dailyRows": 3294,
+ "intervalCells": 317304,
+ "nullIntervalCells": 1080,
+ "populatedDstCells": 36,
+ "fuels": {
+ "Biomass": 366,
+ "Coal": 366,
+ "Gas": 366,
+ "Gas-CC": 366,
+ "Hydro": 366,
+ "Nuclear": 366,
+ "Other": 366,
+ "Solar": 366,
+ "Wind": 366
+ },
+ "firstDate": "2020-01-01",
+ "lastDate": "2020-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "e20a8349080dd35cd581b0a9bf0ef7e6c48458a924832b4afe10a8fcc41c83a6"
+ },
+ {
+ "file": "IntGenbyFuel2021.xlsx",
+ "sha256": "4490666a3f8bd94867f5f66e681acb3ebfbe9f61f770ae36ee05c22fdaf4a5c1",
+ "dailyRows": 3285,
+ "intervalCells": 316440,
+ "nullIntervalCells": 1080,
+ "populatedDstCells": 36,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "Wind": 365
+ },
+ "firstDate": "2021-01-01",
+ "lastDate": "2021-12-31",
+ "publishedTotals": 130,
+ "dailyRowsSha256": "8759af83691093a6311dbe3f15440e5471e2fbf2881d8a7a78e424d8768dac0b"
+ },
+ {
+ "file": "IntGenbyFuel2022.xlsx",
+ "sha256": "63f1faccafa855ae90be0f4a2a6f3aa5f657eac1e745b83ec221c591e1159bd8",
+ "dailyRows": 3650,
+ "intervalCells": 351600,
+ "nullIntervalCells": 1200,
+ "populatedDstCells": 40,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "WSL": 365,
+ "Wind": 365
+ },
+ "firstDate": "2022-01-01",
+ "lastDate": "2022-12-31",
+ "publishedTotals": 143,
+ "dailyRowsSha256": "430df7b48aa701dc5f028fb78c3533d6ce97338b6d933cbb6661f3068ff252e1"
+ },
+ {
+ "file": "IntGenbyFuel2023.xlsx",
+ "sha256": "29d00f5445eca8952085bc817a3c45583e1fff3b9ce62f83f300108a10e279a7",
+ "dailyRows": 3650,
+ "intervalCells": 351600,
+ "nullIntervalCells": 1200,
+ "populatedDstCells": 40,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "WSL": 365,
+ "Wind": 365
+ },
+ "firstDate": "2023-01-01",
+ "lastDate": "2023-12-31",
+ "publishedTotals": 143,
+ "dailyRowsSha256": "c0f7f0d0bc5fdc05be9deafbe7cb6af967d0d62694d4a69a9add67344b3f38db"
+ },
+ {
+ "file": "IntGenbyFuel2024.xlsx",
+ "sha256": "a133270fe2ae7f72513b20feec7dd32646fa1c5f44653aaddef37e5ed6c71af9",
+ "dailyRows": 3660,
+ "intervalCells": 352560,
+ "nullIntervalCells": 1200,
+ "populatedDstCells": 40,
+ "fuels": {
+ "Biomass": 366,
+ "Coal": 366,
+ "Gas": 366,
+ "Gas-CC": 366,
+ "Hydro": 366,
+ "Nuclear": 366,
+ "Other": 366,
+ "Solar": 366,
+ "WSL": 366,
+ "Wind": 366
+ },
+ "firstDate": "2024-01-01",
+ "lastDate": "2024-12-31",
+ "publishedTotals": 143,
+ "dailyRowsSha256": "296c4bd149fd68a325f2d5df03a8141f8869ae65abb4522e3c8ef5911662e812"
+ },
+ {
+ "file": "IntGenbyFuel2025.xlsx",
+ "sha256": "bb534618700ff3500eee36b62fa2a9ab07b0923ed536f6d049868101189cfc54",
+ "dailyRows": 3650,
+ "intervalCells": 351600,
+ "nullIntervalCells": 1200,
+ "populatedDstCells": 40,
+ "fuels": {
+ "Biomass": 365,
+ "Coal": 365,
+ "Gas": 365,
+ "Gas-CC": 365,
+ "Hydro": 365,
+ "Nuclear": 365,
+ "Other": 365,
+ "Solar": 365,
+ "WSL": 365,
+ "Wind": 365
+ },
+ "firstDate": "2025-01-01",
+ "lastDate": "2025-12-31",
+ "publishedTotals": 143,
+ "dailyRowsSha256": "c4f44e603e9da2a2ea5b4d5ead4316ccd2b6737e2e461273781bf69cef1de9eb"
+ },
+ {
+ "file": "IntGenbyFuel2026.xlsx",
+ "sha256": "289c15b4a1c761195b71bc188a12544239edd66b1adb20e8f7c4306648462742",
+ "dailyRows": 2120,
+ "intervalCells": 203520,
+ "nullIntervalCells": 40,
+ "populatedDstCells": 0,
+ "fuels": {
+ "Biomass": 212,
+ "Coal": 212,
+ "Gas": 212,
+ "Gas-CC": 212,
+ "Hydro": 212,
+ "Nuclear": 212,
+ "Other": 212,
+ "Solar": 212,
+ "WSL": 212,
+ "Wind": 212
+ },
+ "firstDate": "2026-01-01",
+ "lastDate": "2026-07-31",
+ "publishedTotals": 143,
+ "dailyRowsSha256": "bdf88253df33e41a0a16ac96eb7d8d5015d41b8caf28dee2a828242079ee0604"
+ }
+ ],
+ "scope": "Every daily total, interval cell (including blanks and source errors), and published monthly/annual summary value matched an independent direct workbook read across all 20 annual files. Includes the unlabelled April 2008 subtotal and unlabelled August 2011 columns. Chart-support worksheets are outside this reader.",
+ "indexUrl": "https://www.ercot.com/gridinfo/generation",
+ "downloads": [
+ {
+ "title": "Fuel Mix Report: 2026",
+ "url": "https://www.ercot.com/files/docs/2026/02/09/IntGenbyFuel2026.xlsx",
+ "file": "IntGenbyFuel2026.xlsx",
+ "bytes": 1789222,
+ "sha256": "289c15b4a1c761195b71bc188a12544239edd66b1adb20e8f7c4306648462742"
+ },
+ {
+ "title": "Fuel Mix Report: 2025",
+ "url": "https://www.ercot.com/files/docs/2025/02/07/IntGenbyFuel2025.xlsx",
+ "file": "IntGenbyFuel2025.xlsx",
+ "bytes": 3048958,
+ "sha256": "bb534618700ff3500eee36b62fa2a9ab07b0923ed536f6d049868101189cfc54"
+ },
+ {
+ "title": "Fuel Mix Report: 2007 - 2024",
+ "url": "https://www.ercot.com/files/docs/2021/03/10/FuelMixReport_PreviousYears.zip",
+ "file": "FuelMixReport_PreviousYears.zip",
+ "bytes": 50971482,
+ "sha256": "51a933f745d1a8a8e87cc74f8807adf193f349127fa86715671880e0705aeb30"
+ }
+ ],
+ "anonymousWorkflow": {
+ "checkedAt": "2026-09-07T23:37:31.218065+00:00",
+ "method": "Client().fuel_mix.rows(date_from=date(2007,1,1), date_to=date(2007,1,1))",
+ "credentials": "none",
+ "archives": [
+ {
+ "yearFrom": 2007,
+ "yearTo": 2024,
+ "title": "Fuel Mix Report: 2007 - 2024",
+ "url": "https://www.ercot.com/files/docs/2021/03/10/FuelMixReport_PreviousYears.zip"
+ },
+ {
+ "yearFrom": 2025,
+ "yearTo": 2025,
+ "title": "Fuel Mix Report: 2025",
+ "url": "https://www.ercot.com/files/docs/2025/02/07/IntGenbyFuel2025.xlsx"
+ },
+ {
+ "yearFrom": 2026,
+ "yearTo": 2026,
+ "title": "Fuel Mix Report: 2026",
+ "url": "https://www.ercot.com/files/docs/2026/02/09/IntGenbyFuel2026.xlsx"
+ }
+ ],
+ "dailyRows": 6,
+ "intervalCells": 576,
+ "firstCoalIntervalMWh": "3376.329577"
+ },
+ "notes": [
+ "Fuel labels are preserved verbatim. In older years, some annual-summary categories group fuels that the daily worksheets separate; summaries are returned as published, without reaggregation.",
+ "Daily and interval quantities remain in MWh. Early daily headings explicitly label MWH; modern monthly sums divided by 1000 reconcile to the published GWh summaries. Summary quantities retain their source MWh or GWh scale.",
+ "2010 contains literal 1/0/1900 0:00 strings; 2011 contains 1.00E and 6.00E. These yield energyMWh=None with sourceError preserving the text. Numeric zero and absent source cells remain distinct.",
+ "2011 August includes four unlabelled zero columns per daily fuel row. They retain their one-based sourceColumn, blank sourceHeader and ending=None. DST1/dst1-style headers also have no inferred clock time.",
+ "2017-2019 workbook dimensions understate their data. The shared workbook loader resets XLSX dimensions before streaming cells.",
+ "The 2026 workbook currently has data through July 31. Future-month headers and blank summary cells do not establish future generation data.",
+ "Nine original regression workbooks are retained unmodified inside fuel-mix-originals.zip. This fixture is included only in source distributions, not the installed wheel."
+ ]
+}
diff --git a/tools/inputs/public-hourly-load-evidence.json b/tools/inputs/public-hourly-load-evidence.json
new file mode 100644
index 00000000..90ba8844
--- /dev/null
+++ b/tools/inputs/public-hourly-load-evidence.json
@@ -0,0 +1,872 @@
+{
+ "checkedAt": "2026-09-07T22:33:14.543626+00:00",
+ "scope": "All 25 directly linked 2002-2026 weather-zone archives downloaded. All load cells independently compared for each decoded workbook. The 2026 ZIP has stale central-directory CRC/sizes; recovery verifies the local header CRC/size and workbook contents as recorded below. Earlier hourly formats are checked separately in public-legacy-hourly-load-evidence.json; companion forecasts remain outside these hourly readers.",
+ "archives": [
+ {
+ "url": "https://www.ercot.com/files/docs/2026/02/10/Native_Load_2026.zip",
+ "title": "2026 ERCOT Hourly Load Data",
+ "file": "Native_Load_2026.zip",
+ "bytes": 722951,
+ "sha256": "3a642883ab3889c23650cde4cf6bade371c62999ee4c54bfdda6f8063422aef0",
+ "year": 2026,
+ "standardZipError": "BadZipFile: Bad CRC-32 for file 'Native_Load_2026.xlsx'",
+ "rows": 5087,
+ "firstOperatingDay": "2026-01-01",
+ "lastOperatingDay": "2026-07-31",
+ "sourceLoadValuesCompared": 45783,
+ "recoveredUsingVerifiedLocalHeader": true
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2025/02/11/Native_Load_2025.zip",
+ "title": "2025 ERCOT Hourly Load Data",
+ "file": "Native_Load_2025.zip",
+ "bytes": 1085085,
+ "sha256": "20f6699f4d1f577561e9581ce370a39b0b7af339c2c263c99c7b7fd605580854",
+ "year": 2025,
+ "rows": 8760,
+ "firstOperatingDay": "2025-01-01",
+ "lastOperatingDay": "2025-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2025-03-09": 23,
+ "2025-11-02": 25
+ },
+ "rowDigest": "1b9d24007d989715659cac5b051ab3cd41b951a89b390e68a225545ec2953bd0"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/02/06/Native_Load_2024.zip",
+ "title": "2024 ERCOT Hourly Load Data",
+ "file": "Native_Load_2024.zip",
+ "bytes": 1088476,
+ "sha256": "fe6dacd721ae66bdef63f9d755c4219ab6bc06361ef2044627fb45424c427198",
+ "year": 2024,
+ "rows": 8784,
+ "firstOperatingDay": "2024-01-01",
+ "lastOperatingDay": "2024-12-31",
+ "sourceLoadValuesCompared": 79056,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2024-03-10": 23,
+ "2024-11-03": 25
+ },
+ "rowDigest": "10c54288824a5956ea27213234edf4d163c95f15cff26a38a45db00ebdaf8f97"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2023/02/09/Native_Load_2023.zip",
+ "title": "2023 ERCOT Hourly Load Data",
+ "file": "Native_Load_2023.zip",
+ "bytes": 1091030,
+ "sha256": "34e7067d3273f56be42ce469e23747cff0db736d668519070ad63674c3ddecd4",
+ "year": 2023,
+ "rows": 8760,
+ "firstOperatingDay": "2023-01-01",
+ "lastOperatingDay": "2023-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2023-03-12": 23,
+ "2023-11-05": 25
+ },
+ "rowDigest": "2b9bfe2cb07d584bed41fd9b6bfcf695c6b66e9e37cdb2d4a7b7056049bfe112"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/02/08/Native_Load_2022.zip",
+ "title": "2022 ERCOT Hourly Load Data ",
+ "file": "Native_Load_2022.zip",
+ "bytes": 1093481,
+ "sha256": "a90335ab621a5ad719bc885b27d7fd7ed0c90de0ad3f72736c30c26ada89a2ce",
+ "year": 2022,
+ "rows": 8760,
+ "firstOperatingDay": "2022-01-01",
+ "lastOperatingDay": "2022-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2022-03-13": 23,
+ "2022-11-06": 25
+ },
+ "rowDigest": "104a3a563a0f98796a3bf2e6b1b2944c045abe19d811386f6ac7ec982cece332"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2021/11/12/Native_Load_2021.zip",
+ "title": "2021 ERCOT Hourly Load Data",
+ "file": "Native_Load_2021.zip",
+ "bytes": 1094567,
+ "sha256": "63d77e711fbcf838aff1666df475cd86a1fa939ad8aecd60a1bfe5039c4e5b91",
+ "year": 2021,
+ "rows": 8760,
+ "firstOperatingDay": "2021-01-01",
+ "lastOperatingDay": "2021-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2021-03-14": 23,
+ "2021-11-07": 25
+ },
+ "rowDigest": "e04750938504469604a1ec06a087bca59f3d342ee6d688eca1fff91fb72275c8"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2021/01/12/Native_Load_2020.zip",
+ "title": "2020 ERCOT Hourly Load Data",
+ "file": "Native_Load_2020.zip",
+ "bytes": 1099986,
+ "sha256": "a02195b9a8b79540d78362039cca30c95922e485828908dcd25c50c2dae4489a",
+ "year": 2020,
+ "rows": 8784,
+ "firstOperatingDay": "2020-01-01",
+ "lastOperatingDay": "2020-12-31",
+ "sourceLoadValuesCompared": 79056,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2020-03-08": 23,
+ "2020-11-01": 25
+ },
+ "rowDigest": "b8f716163759d3a18cec368d2c1349a51954331033cf470980130fb8ef3d77b9"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2020/01/09/Native_Load_2019.zip",
+ "title": "2019 ERCOT Hourly Load Data",
+ "file": "Native_Load_2019.zip",
+ "bytes": 1092646,
+ "sha256": "f99a5a9ed299523c23935487761f5e446ec4dddf0be0e1da931487be09681654",
+ "year": 2019,
+ "rows": 8760,
+ "firstOperatingDay": "2019-01-01",
+ "lastOperatingDay": "2019-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2019-03-10": 23,
+ "2019-11-03": 25
+ },
+ "rowDigest": "17c48b114b397c2529a5062a6f92763e7241197ed6b4e16fb902f4687e0fe29e"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2019/01/07/native_load_2018.zip",
+ "title": "2018 ERCOT Hourly Load Data ",
+ "file": "native_load_2018.zip",
+ "bytes": 1093121,
+ "sha256": "c57da4b5927a920eb8e160cf8927ec0e8f6a11f5e02962f4c9850787f13e2474",
+ "year": 2018,
+ "rows": 8760,
+ "firstOperatingDay": "2018-01-01",
+ "lastOperatingDay": "2018-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2018-03-11": 23,
+ "2018-11-04": 25
+ },
+ "rowDigest": "e1bc32be954cc3a6e0374fd9029b37ca9bd26c5367c8c9b6865639b71a41349a"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2018/01/09/native_load_2017.zip",
+ "title": "2017 ERCOT Hourly Load Data",
+ "file": "native_load_2017.zip",
+ "bytes": 1119759,
+ "sha256": "6daf8e47e8145a1bce2ad41aecbfcadf59b2d0441f51e1b23c252e19d1e7bd28",
+ "year": 2017,
+ "rows": 8760,
+ "firstOperatingDay": "2017-01-01",
+ "lastOperatingDay": "2017-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 1,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2017-03-12": 23,
+ "2017-11-05": 25
+ },
+ "rowDigest": "feb3632eb1573ede27912f61da55584ab0d06a9c381c7842417f96809673034a"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/01/10/native_Load_2016.zip",
+ "title": "2016 ERCOT Hourly Load Data",
+ "file": "native_Load_2016.zip",
+ "bytes": 1122112,
+ "sha256": "419bfd7ddb8a496273febab70e8958c0e6c51fbd638cc300e109d4e9c470d5e3",
+ "year": 2016,
+ "rows": 8784,
+ "firstOperatingDay": "2016-01-01",
+ "lastOperatingDay": "2016-12-31",
+ "sourceLoadValuesCompared": 79056,
+ "dstLabels": 0,
+ "nullLoadCells": 9,
+ "non24HourDays": {
+ "2016-03-13": 23,
+ "2016-11-06": 25
+ },
+ "rowDigest": "515af9acf76b4284b8952c25761bb5342e92964453229822f4ba761361848407"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/01/07/native_load_2015.xls",
+ "title": "2015 ERCOT Hourly Load Data",
+ "file": "native_load_2015.xls",
+ "bytes": 1799680,
+ "sha256": "d1ceb649236e02bc7ca08a3934c1a5f39bfc1df9c007e4d5288038e753d4dcc3",
+ "year": 2015,
+ "rows": 8760,
+ "firstOperatingDay": "2015-01-01",
+ "lastOperatingDay": "2015-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2015-03-08": 23,
+ "2015-11-01": 25
+ },
+ "rowDigest": "acf49d1b97133c73acb7302f246de07391dc83ec57d2af5be2cab24b71dbfaf6"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2014_ercot_hourly_load_data.xls",
+ "title": "2014 ERCOT Hourly Load Data",
+ "file": "2014_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "e695f6e739c4dd83e48cb61941d4818ee6b0d90ff9183c8c152ba27a688fd94f",
+ "year": 2014,
+ "rows": 8760,
+ "firstOperatingDay": "2014-01-01",
+ "lastOperatingDay": "2014-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2014-03-09": 23,
+ "2014-11-02": 25
+ },
+ "rowDigest": "e2b512679239185cab1cdebeb994dad7225efac412c196ea0bcfcadea8c11b1f"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2013_ercot_hourly_load_data.xls",
+ "title": "2013 ERCOT Hourly Load Data",
+ "file": "2013_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "d160bb43ae815a040198d172bdaa65aae155eb426d20565aed7f822a9c32ed20",
+ "year": 2013,
+ "rows": 8760,
+ "firstOperatingDay": "2013-01-01",
+ "lastOperatingDay": "2013-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2013-03-10": 23,
+ "2013-11-03": 25
+ },
+ "rowDigest": "378d8ac06f7534f261f2e107884a82dfaa3a2426a63f5948a42bc191ef640c4f"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2012_ercot_hourly_load_data.xls",
+ "title": "2012 ERCOT Hourly Load Data",
+ "file": "2012_ercot_hourly_load_data.xls",
+ "bytes": 1804288,
+ "sha256": "4fa9078ed7427345eba5e505ae7fd1c2977c15726a4feb58204f035b00af7793",
+ "year": 2012,
+ "rows": 8784,
+ "firstOperatingDay": "2012-01-01",
+ "lastOperatingDay": "2012-12-31",
+ "sourceLoadValuesCompared": 79056,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2012-03-11": 23,
+ "2012-11-04": 25
+ },
+ "rowDigest": "adadde4159b03216a731dc2ae3b0f8ab806233e931fc3b837c562b23327285e2"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2011_ercot_hourly_load_data.xls",
+ "title": "2011 ERCOT Hourly Load Data",
+ "file": "2011_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "ee695df2ef4cd3dc4204e183413a96287ff4d6b8dbb167be110c51ae7d761d8d",
+ "year": 2011,
+ "rows": 8760,
+ "firstOperatingDay": "2011-01-01",
+ "lastOperatingDay": "2011-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2011-03-13": 23,
+ "2011-11-06": 25
+ },
+ "rowDigest": "b11c605c41848b1fa002ad1eaec1f4e36e3b05bd82e7ecd0fadf398f146f05b4"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2010_ercot_hourly_load_data.xls",
+ "title": "2010 ERCOT Hourly Load Data",
+ "file": "2010_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "b7f4cacc203ac1e8416a06c0f6ad47a584412c2d4d4ff3b52462147393ccde81",
+ "year": 2010,
+ "rows": 8760,
+ "firstOperatingDay": "2010-01-01",
+ "lastOperatingDay": "2010-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2010-03-14": 23,
+ "2010-11-07": 25
+ },
+ "rowDigest": "550f247a05615d8c54008e1ec7e164e43219f0145d398f517a048a87b513f796"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2009_ercot_hourly_load_data.xls",
+ "title": "2009 ERCOT Hourly Load Data",
+ "file": "2009_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "2680fbf227bedc1adf9ee3501d1d1d2415a596d9d6e3fd78c87458244a443ad1",
+ "year": 2009,
+ "rows": 8760,
+ "firstOperatingDay": "2009-01-01",
+ "lastOperatingDay": "2009-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2009-03-08": 23,
+ "2009-11-01": 25
+ },
+ "rowDigest": "8773093bfdf8b08e706b44fddfc4c222b005a310a2dc7bc68830cd5d1707f423"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2008_ercot_hourly_load_data.xls",
+ "title": "2008 ERCOT Hourly Load Data",
+ "file": "2008_ercot_hourly_load_data.xls",
+ "bytes": 1804288,
+ "sha256": "ed0269f32cec9e32e48a104c5d0840b75e250696b9bd3f938b2c35e48bb7fb79",
+ "year": 2008,
+ "rows": 8784,
+ "firstOperatingDay": "2008-01-01",
+ "lastOperatingDay": "2008-12-31",
+ "sourceLoadValuesCompared": 79056,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2008-03-09": 23,
+ "2008-11-02": 25
+ },
+ "rowDigest": "2f9e3dc522399713ac65a0d138d3e3e7b10b6f696049a5cd272a8d96f3ecc7f4"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2007_ercot_hourly_load_data.xls",
+ "title": "2007 ERCOT Hourly Load Data",
+ "file": "2007_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "56b5697005446df62334dea97aef3753ab2f7019ad1f4cd21bbcce87fd0e2fc9",
+ "year": 2007,
+ "rows": 8760,
+ "firstOperatingDay": "2007-01-01",
+ "lastOperatingDay": "2007-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2007-03-11": 23,
+ "2007-11-04": 25
+ },
+ "rowDigest": "9fd44f5d952679a2c226873639e71a21d7271f63df5433bbd48047d9babee628"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2006_ercot_hourly_load_data.xls",
+ "title": "2006 ERCOT Hourly Load Data",
+ "file": "2006_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "f8ce4d21738105ee930e0fe8dc51b0d4d28b8e9fb839bc2a9127f08e064a3fee",
+ "year": 2006,
+ "rows": 8760,
+ "firstOperatingDay": "2006-01-01",
+ "lastOperatingDay": "2006-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2006-04-02": 23,
+ "2006-10-29": 25
+ },
+ "rowDigest": "4d9b5dd451fa4424b8b71cb9b3b568d203d0e15333ec6ff94bf906d5517cd73e"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2005_ercot_hourly_load_data.xls",
+ "title": "2005 ERCOT Hourly Load Data",
+ "file": "2005_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "82bd7d426592de3386e0bba7cc8383dd63c9dce0893b253577d3c6a65427898c",
+ "year": 2005,
+ "rows": 8760,
+ "firstOperatingDay": "2005-01-01",
+ "lastOperatingDay": "2005-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2005-04-03": 23,
+ "2005-10-30": 25
+ },
+ "rowDigest": "be5a80850b9b6e69b6543f246e1d04f2728c1e7f5444068dc4b0af377d93e0aa"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2004_ercot_hourly_load_data.xls",
+ "title": "2004 ERCOT Hourly Load Data",
+ "file": "2004_ercot_hourly_load_data.xls",
+ "bytes": 1804288,
+ "sha256": "aa3f4f0bb0255452a2dd8aa2af0e1925160054674a590e502b1f4b706c97b2ce",
+ "year": 2004,
+ "rows": 8784,
+ "firstOperatingDay": "2004-01-01",
+ "lastOperatingDay": "2004-12-31",
+ "sourceLoadValuesCompared": 79056,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2004-04-04": 23,
+ "2004-10-31": 25
+ },
+ "rowDigest": "e9237e0406446ddf6c0a50f7ca358bd8fab7418fb478e43e82b5dc2935bebf86"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2003_ercot_hourly_load_data.xls",
+ "title": "2003 ERCOT Hourly Load Data",
+ "file": "2003_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "8db2d51ae30acbbddebd8409e1c8ac5c0ed53a271c60cdc3905ea30f4823bd8d",
+ "year": 2003,
+ "rows": 8760,
+ "firstOperatingDay": "2003-01-01",
+ "lastOperatingDay": "2003-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2003-04-06": 23,
+ "2003-10-26": 25
+ },
+ "rowDigest": "96b23ee11cfd4102da68bdb1d07566cfff47448dfdb8da1355b9bde7d147f390"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2002_ercot_hourly_load_data.xls",
+ "title": "2002 ERCOT Hourly Load Data",
+ "file": "2002_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "c0aad42d4418b2341ed4b66d277dff8913afc77b16d71eb7eb95e59853ebd403",
+ "year": 2002,
+ "rows": 8760,
+ "firstOperatingDay": "2002-01-01",
+ "lastOperatingDay": "2002-12-31",
+ "sourceLoadValuesCompared": 78840,
+ "dstLabels": 0,
+ "nullLoadCells": 0,
+ "non24HourDays": {
+ "2002-04-07": 23,
+ "2002-10-27": 25
+ },
+ "rowDigest": "b126209b161010f8b8feabf4cc70b64e1458e3f026f32bf1f86870c04458b371"
+ }
+ ],
+ "indexUrl": "https://www.ercot.com/gridinfo/load/load_hist",
+ "indexSha256": "0c877610c38db54f85a35c11f7efffd5a1387892b60285b7cbc1e1d983bde442",
+ "allLinkedFiles": [
+ {
+ "url": "https://www.ercot.com/files/docs/2026/02/10/Native_Load_2026.zip",
+ "title": "2026 ERCOT Hourly Load Data",
+ "file": "Native_Load_2026.zip",
+ "bytes": 722951,
+ "sha256": "3a642883ab3889c23650cde4cf6bade371c62999ee4c54bfdda6f8063422aef0"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2025/02/11/Native_Load_2025.zip",
+ "title": "2025 ERCOT Hourly Load Data",
+ "file": "Native_Load_2025.zip",
+ "bytes": 1085085,
+ "sha256": "20f6699f4d1f577561e9581ce370a39b0b7af339c2c263c99c7b7fd605580854"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/02/06/Native_Load_2024.zip",
+ "title": "2024 ERCOT Hourly Load Data",
+ "file": "Native_Load_2024.zip",
+ "bytes": 1088476,
+ "sha256": "fe6dacd721ae66bdef63f9d755c4219ab6bc06361ef2044627fb45424c427198"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2023/02/09/Native_Load_2023.zip",
+ "title": "2023 ERCOT Hourly Load Data",
+ "file": "Native_Load_2023.zip",
+ "bytes": 1091030,
+ "sha256": "34e7067d3273f56be42ce469e23747cff0db736d668519070ad63674c3ddecd4"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/02/08/Native_Load_2022.zip",
+ "title": "2022 ERCOT Hourly Load Data ",
+ "file": "Native_Load_2022.zip",
+ "bytes": 1093481,
+ "sha256": "a90335ab621a5ad719bc885b27d7fd7ed0c90de0ad3f72736c30c26ada89a2ce"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2021/11/12/Native_Load_2021.zip",
+ "title": "2021 ERCOT Hourly Load Data",
+ "file": "Native_Load_2021.zip",
+ "bytes": 1094567,
+ "sha256": "63d77e711fbcf838aff1666df475cd86a1fa939ad8aecd60a1bfe5039c4e5b91"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2021/01/12/Native_Load_2020.zip",
+ "title": "2020 ERCOT Hourly Load Data",
+ "file": "Native_Load_2020.zip",
+ "bytes": 1099986,
+ "sha256": "a02195b9a8b79540d78362039cca30c95922e485828908dcd25c50c2dae4489a"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2020/01/09/Native_Load_2019.zip",
+ "title": "2019 ERCOT Hourly Load Data",
+ "file": "Native_Load_2019.zip",
+ "bytes": 1092646,
+ "sha256": "f99a5a9ed299523c23935487761f5e446ec4dddf0be0e1da931487be09681654"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2019/01/07/native_load_2018.zip",
+ "title": "2018 ERCOT Hourly Load Data ",
+ "file": "native_load_2018.zip",
+ "bytes": 1093121,
+ "sha256": "c57da4b5927a920eb8e160cf8927ec0e8f6a11f5e02962f4c9850787f13e2474"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2018/01/09/native_load_2017.zip",
+ "title": "2017 ERCOT Hourly Load Data",
+ "file": "native_load_2017.zip",
+ "bytes": 1119759,
+ "sha256": "6daf8e47e8145a1bce2ad41aecbfcadf59b2d0441f51e1b23c252e19d1e7bd28"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/01/10/native_Load_2016.zip",
+ "title": "2016 ERCOT Hourly Load Data",
+ "file": "native_Load_2016.zip",
+ "bytes": 1122112,
+ "sha256": "419bfd7ddb8a496273febab70e8958c0e6c51fbd638cc300e109d4e9c470d5e3"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/01/07/native_load_2015.xls",
+ "title": "2015 ERCOT Hourly Load Data",
+ "file": "native_load_2015.xls",
+ "bytes": 1799680,
+ "sha256": "d1ceb649236e02bc7ca08a3934c1a5f39bfc1df9c007e4d5288038e753d4dcc3"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2014_ercot_hourly_load_data.xls",
+ "title": "2014 ERCOT Hourly Load Data",
+ "file": "2014_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "e695f6e739c4dd83e48cb61941d4818ee6b0d90ff9183c8c152ba27a688fd94f"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2013_ercot_hourly_load_data.xls",
+ "title": "2013 ERCOT Hourly Load Data",
+ "file": "2013_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "d160bb43ae815a040198d172bdaa65aae155eb426d20565aed7f822a9c32ed20"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2012_ercot_hourly_load_data.xls",
+ "title": "2012 ERCOT Hourly Load Data",
+ "file": "2012_ercot_hourly_load_data.xls",
+ "bytes": 1804288,
+ "sha256": "4fa9078ed7427345eba5e505ae7fd1c2977c15726a4feb58204f035b00af7793"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2011_ercot_hourly_load_data.xls",
+ "title": "2011 ERCOT Hourly Load Data",
+ "file": "2011_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "ee695df2ef4cd3dc4204e183413a96287ff4d6b8dbb167be110c51ae7d761d8d"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2010_ercot_hourly_load_data.xls",
+ "title": "2010 ERCOT Hourly Load Data",
+ "file": "2010_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "b7f4cacc203ac1e8416a06c0f6ad47a584412c2d4d4ff3b52462147393ccde81"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2009_ercot_hourly_load_data.xls",
+ "title": "2009 ERCOT Hourly Load Data",
+ "file": "2009_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "2680fbf227bedc1adf9ee3501d1d1d2415a596d9d6e3fd78c87458244a443ad1"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2008_ercot_hourly_load_data.xls",
+ "title": "2008 ERCOT Hourly Load Data",
+ "file": "2008_ercot_hourly_load_data.xls",
+ "bytes": 1804288,
+ "sha256": "ed0269f32cec9e32e48a104c5d0840b75e250696b9bd3f938b2c35e48bb7fb79"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2007_ercot_hourly_load_data.xls",
+ "title": "2007 ERCOT Hourly Load Data",
+ "file": "2007_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "56b5697005446df62334dea97aef3753ab2f7019ad1f4cd21bbcce87fd0e2fc9"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2006_ercot_hourly_load_data.xls",
+ "title": "2006 ERCOT Hourly Load Data",
+ "file": "2006_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "f8ce4d21738105ee930e0fe8dc51b0d4d28b8e9fb839bc2a9127f08e064a3fee"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2005_ercot_hourly_load_data.xls",
+ "title": "2005 ERCOT Hourly Load Data",
+ "file": "2005_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "82bd7d426592de3386e0bba7cc8383dd63c9dce0893b253577d3c6a65427898c"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2004_ercot_hourly_load_data.xls",
+ "title": "2004 ERCOT Hourly Load Data",
+ "file": "2004_ercot_hourly_load_data.xls",
+ "bytes": 1804288,
+ "sha256": "aa3f4f0bb0255452a2dd8aa2af0e1925160054674a590e502b1f4b706c97b2ce"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2003_ercot_hourly_load_data.xls",
+ "title": "2003 ERCOT Hourly Load Data",
+ "file": "2003_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "8db2d51ae30acbbddebd8409e1c8ac5c0ed53a271c60cdc3905ea30f4823bd8d"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2002_ercot_hourly_load_data.xls",
+ "title": "2002 ERCOT Hourly Load Data",
+ "file": "2002_ercot_hourly_load_data.xls",
+ "bytes": 1799680,
+ "sha256": "c0aad42d4418b2341ed4b66d277dff8913afc77b16d71eb7eb95e59853ebd403"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2005/11/10/2000ferc714.zip",
+ "title": "2000 ERCOT Hourly Load Data",
+ "file": "2000ferc714.zip",
+ "bytes": 381423,
+ "sha256": "52ab74e4f82b630c05152f781088eaca1a60f111dae2bf674a7380f62b6fb8b7"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2002/12/11/1999ferc714.zip",
+ "title": "1999 ERCOT Hourly Load Data",
+ "file": "1999ferc714.zip",
+ "bytes": 380990,
+ "sha256": "33462ad69c7c85298f67cf248024285f86c2776cd9c5c711f70bc6d3c2dfdfa5"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2002/12/11/ferc714.zip",
+ "title": "1998 ERCOT Hourly Load Data",
+ "file": "ferc714.zip",
+ "bytes": 1090738,
+ "sha256": "54cb33600a6f46fafbc9992afe74efb22394ecc85d733b41859b182acc8a5b79"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2002/12/11/97frc714.zip",
+ "title": "1997 ERCOT Hourly Load Data",
+ "file": "97frc714.zip",
+ "bytes": 211568,
+ "sha256": "0ccbbfea1c52b25156e071a28b96e63631fe7e94c677885698e4901fd8a15f7a"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei97.xls",
+ "title": "1997 ERCOT Hourly Load Data",
+ "file": "erceei97.xls",
+ "bytes": 109056,
+ "sha256": "4c163bfc487661e9c7041c19be5f0fb6607114612bfab469799342479ff359c0"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei97.txt",
+ "title": "1997 ERCOT Hourly Load Data (Raw)",
+ "file": "erceei97.txt",
+ "bytes": 59860,
+ "sha256": "268fe421e99cf55a3551dc2f63cca12791f5201baa8f18a6af9c5918a7ab9b8d"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/96load.txt",
+ "title": "1996 ERCOT Hourly Load Data",
+ "file": "96load.txt",
+ "bytes": 213966,
+ "sha256": "4eb15e58662c8b94ac8d402ee4b378524ad1ef62eb65af70dc1be979bd6554ae"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei95.txt",
+ "title": "1995 ERCOT Hourly Load Data",
+ "file": "erceei95.txt",
+ "bytes": 59860,
+ "sha256": "e388c19653b9cfd36c64fbd826e5255b7ce071944322250a456d250031ef7703"
+ }
+ ],
+ "liveWorkflow": {
+ "checkedAt": "2026-09-07T22:35:39.571687+00:00",
+ "links": 33,
+ "requests": [
+ {
+ "url": "https://www.ercot.com/gridinfo/load/load_hist",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/gridinfo/load/load_hist",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2015/10/22/2002_ercot_hourly_load_data.xls",
+ "status": 200
+ }
+ ],
+ "rowCount": 24,
+ "firstRow": {
+ "operatingDay": "2002-01-01",
+ "hourEnding": 1,
+ "dstLabel": null,
+ "sourceHourEnding": "2002-01-01 01:00:00.003000",
+ "sourceMember": "workbook.xls",
+ "sourceSheet": "native_Load_2002",
+ "coast": "8331.469266026934",
+ "east": "1111.0965494424045",
+ "farWest": "1094.045495798935",
+ "north": "995.2983921124664",
+ "northC": "10336.304899346236",
+ "southern": "2165.0075712469265",
+ "southC": "4793.193560266372",
+ "west": "843.747177253755",
+ "total": "29670.162911494022"
+ },
+ "lastRow": {
+ "operatingDay": "2002-01-01",
+ "hourEnding": 24,
+ "dstLabel": null,
+ "sourceHourEnding": "2002-01-02 00:00:00",
+ "sourceMember": "workbook.xls",
+ "sourceSheet": "native_Load_2002",
+ "coast": "8848.8733",
+ "east": "1152.81051",
+ "farWest": "1128.06221",
+ "north": "988.38027",
+ "northC": "10704.9127",
+ "southern": "2372.1155",
+ "southC": "5184.816289999999",
+ "west": "881.2104899999998",
+ "total": "31261.18127000001"
+ },
+ "authenticationHeadersSent": false
+ },
+ "sourceCaveats": [
+ "The index says 2001 is unavailable. No 2001 file is linked.",
+ "The republished 2002 and 2003 workbooks already contain the eight weather-zone columns, despite the older index description of a 2003 transition.",
+ "The source-labelled 1997 ZIP 97frc714.zip actually contains 1996 EEI load files and companion forecasts. Do not infer operating dates from index year labels.",
+ "The 1998 workbook contains load-serving-entity columns plus control-area mappings; it reports kW, not the same weather-zone table shape.",
+ "The 2026 ZIP repeatedly fails standard central-directory CRC validation. Its complete local member has valid sizes/CRC; the workbook reader now recovers it using those checked local fields, as documented in localHeaderRecovery.",
+ "Native Load 2016 contains a timestamp for November 6 hour 24 with all nine load values absent. These are None, not zero."
+ ],
+ "fixtures": [
+ {
+ "path": "tools/inputs/history/hourly-load-2002.zip",
+ "sha256": "168b17ca1ea260068301123726ad8f68ca7a1cd31d0bfe7402c5cc01a0917113",
+ "note": "Original source bytes; the directly published XLS for 2002 is wrapped in a ZIP for storage."
+ },
+ {
+ "path": "tools/inputs/history/hourly-load-2016.zip",
+ "sha256": "419bfd7ddb8a496273febab70e8958c0e6c51fbd638cc300e109d4e9c470d5e3",
+ "note": "Original source bytes; the directly published XLS for 2002 is wrapped in a ZIP for storage."
+ },
+ {
+ "path": "tools/inputs/history/hourly-load-2022.zip",
+ "sha256": "a90335ab621a5ad719bc885b27d7fd7ed0c90de0ad3f72736c30c26ada89a2ce",
+ "note": "Original source bytes; the directly published XLS for 2002 is wrapped in a ZIP for storage."
+ }
+ ],
+ "legacyReaderEvidence": "public-legacy-hourly-load-evidence.json",
+ "apiArchiveComparison": {
+ "scope": "January 2018 API archive publications compared against January rows in the annual Native Load 2018 workbook. Joined on operating day and hour ending; January avoids DST ambiguity. This comparison tests source equivalence, not parser correctness.",
+ "apiRows": 744,
+ "matchedHours": 720,
+ "cellsCompared": 6480,
+ "exactEqualCells": 0,
+ "equalAfterAnnualRoundedToHundredth": 0,
+ "differentValueExamples": [
+ {
+ "day": "2018-01-01",
+ "hour": 1,
+ "zone": "coast",
+ "api": "10964.93",
+ "annual": "11425.979115"
+ },
+ {
+ "day": "2018-01-01",
+ "hour": 1,
+ "zone": "east",
+ "api": "2076.80",
+ "annual": "1852.663959"
+ },
+ {
+ "day": "2018-01-01",
+ "hour": 1,
+ "zone": "farWest",
+ "api": "2738.81",
+ "annual": "2823.409245"
+ },
+ {
+ "day": "2018-01-01",
+ "hour": 1,
+ "zone": "north",
+ "api": "1410.78",
+ "annual": "1135.360907"
+ }
+ ],
+ "checkedAt": "2026-09-08T04:12:32.836046+00:00",
+ "sources": [
+ {
+ "kind": "API archive publications posted during January 2018",
+ "product": "NP6-345-CD",
+ "sha256": "9e69d1a0cc530f667eae86334b0a375f44ee343c8f0c7c4c6144d929ca84a317"
+ },
+ {
+ "kind": "Annual hourly load workbook",
+ "url": "https://www.ercot.com/files/docs/2019/01/07/native_load_2018.zip",
+ "sha256": "c57da4b5927a920eb8e160cf8927ec0e8f6a11f5e02962f4c9850787f13e2474"
+ }
+ ],
+ "conclusion": "These published series are not numerically interchangeable for the compared intervals; no cause for the differences is inferred and no automatic substitution is performed.",
+ "apiFirstOperatingDay": "2017-12-31",
+ "apiLastOperatingDay": "2018-01-30",
+ "independentRawComparison": "The same 720-hour/6480-cell result was reproduced directly from CSV dictionaries and openpyxl worksheet cells, without SDK models or readers."
+ },
+ "localHeaderRecovery": {
+ "checkedAt": "2026-09-08T04:31:16.239096+00:00",
+ "url": "https://www.ercot.com/files/docs/2026/02/10/Native_Load_2026.zip",
+ "originalBytes": 722951,
+ "originalSha256": "3a642883ab3889c23650cde4cf6bade371c62999ee4c54bfdda6f8063422aef0",
+ "centralDirectory": {
+ "crc": "0x9e502d59",
+ "compressedBytes": 722755,
+ "uncompressedBytes": 731861
+ },
+ "localHeader": {
+ "crc": "0x46e4b781",
+ "compressedBytes": 632827,
+ "uncompressedBytes": 641533
+ },
+ "localCrcAndSizeVerified": true,
+ "innerMembersWithValidCrc": 11,
+ "rows": 5087,
+ "loadCellsCompared": 45783,
+ "firstOperatingDay": "2026-01-01",
+ "lastOperatingDay": "2026-07-31",
+ "firstTotal": "46299.897428",
+ "lastTotal": "71506.161665",
+ "allRowsMatchIndependentSource": true,
+ "scope": "Live anonymous weather_zones retrieval; every emitted date/hour/DST/provenance field and all nine load cells compared to openpyxl source values after independent local-header decompression. Local sizes/CRC and every inner XLSX member CRC verified; source bytes remain unchanged. No API substitution or inferred values."
+ }
+}
diff --git a/tools/inputs/public-indicative-ordc-evidence.json b/tools/inputs/public-indicative-ordc-evidence.json
new file mode 100644
index 00000000..722d7195
--- /dev/null
+++ b/tools/inputs/public-indicative-ordc-evidence.json
@@ -0,0 +1,41 @@
+{
+ "checkedAt": "2026-09-08T09:16:37.584205+00:00",
+ "indexUrl": "https://www.ercot.com/mktinfo/rtm",
+ "files": [
+ {
+ "title": "Indicative Real-Time Reserve ORDC Price Adder",
+ "url": "https://www.ercot.com/files/docs/2018/04/20/Indicative_Real-Time_Reserve_ORDC_Price_Adder__1_.zip"
+ }
+ ],
+ "sourceBytes": 141743,
+ "sha256": "82fe413373a2c854af45c0cc546b30c9c007adad9d0776346f93887f5b0c505f",
+ "comparison": {
+ "records": 9826,
+ "numericFields": 49130,
+ "firstTimestamp": "2013-10-17 00:00:16",
+ "lastTimestamp": "2013-11-19 23:55:08",
+ "dates": 34,
+ "repeatHourFlags": {
+ "N": 9814,
+ "Y": 12
+ },
+ "nonzeroFields": {
+ "SYSTEM_LAMBDA": 9804,
+ "RTOLCAP": 9826,
+ "RTOFFCAP": 9826,
+ "RTORPA": 4292,
+ "RTOFFPA": 2540
+ },
+ "scope": "Every original timestamp, repeat-hour flag, numeric field and member identity independently compared in tests/test_indicative_ordc.py; manual clock conversion for expected dates does not use SDK parsing helpers."
+ },
+ "fixture": {
+ "path": "tools/inputs/public-tables/indicative-ordc.zip",
+ "selection": "Entire original ZIP, byte-for-byte, including all 34 CSVs."
+ },
+ "decoderSha256": "2e85e74acb859a670b3cc9f5bba87bdeec55690f8930a26f96a516c01c7d9d3f",
+ "limitations": [
+ "Interim indicative results before June 1, 2014; not realized settlement prices.",
+ "The page description ends November 20 but actual files end November 19, 2013.",
+ "Original 00:xx AM timestamp text and repeat-hour flags retained; no inferred timezone or resampling."
+ ]
+}
diff --git a/tools/inputs/public-legacy-hourly-load-evidence.json b/tools/inputs/public-legacy-hourly-load-evidence.json
new file mode 100644
index 00000000..db30f80d
--- /dev/null
+++ b/tools/inputs/public-legacy-hourly-load-evidence.json
@@ -0,0 +1,283 @@
+{
+ "checkedAt": "2026-09-07T22:49:00.979596+00:00",
+ "scope": "Every hourly measurement in all eight linked pre-2002 source files decoded and compared with an independent direct source read. The 1997 raw EEI and XLS files match at every one of 8760 hour/value pairs. Forecast companions and workbook summary/forecast tables are outside the hourly reader.",
+ "archives": [
+ {
+ "file": "erceei95.txt",
+ "sha256": "e388c19653b9cfd36c64fbd826e5255b7ce071944322250a456d250031ef7703",
+ "rows": 8760,
+ "firstOperatingDay": "1995-01-01",
+ "lastOperatingDay": "1995-12-31",
+ "entities": {
+ "ERCOT": 8760
+ },
+ "units": {
+ "MW": 8760
+ },
+ "sourceErrors": 0,
+ "decodedRowsSha256": "be9db60b6a8c3aad33833f69aa34cf6864e7f145f5bce070ecf7ca17d8259a79",
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei95.txt",
+ "indexTitle": "1995 ERCOT Hourly Load Data"
+ },
+ {
+ "file": "96load.txt",
+ "sha256": "4eb15e58662c8b94ac8d402ee4b378524ad1ef62eb65af70dc1be979bd6554ae",
+ "rows": 9685,
+ "firstOperatingDay": "1996-01-01",
+ "lastOperatingDay": "1997-02-07",
+ "entities": {
+ "ERCOT": 9685
+ },
+ "units": {
+ "None": 9685
+ },
+ "sourceErrors": 0,
+ "decodedRowsSha256": "0f5d269f7424d3ee573167eaf935249150ba07c3d802a032b8ae39f7dd5a5c4a",
+ "url": "https://www.ercot.com/files/docs/2004/07/26/96load.txt",
+ "indexTitle": "1996 ERCOT Hourly Load Data"
+ },
+ {
+ "file": "erceei97.txt",
+ "sha256": "268fe421e99cf55a3551dc2f63cca12791f5201baa8f18a6af9c5918a7ab9b8d",
+ "rows": 8760,
+ "firstOperatingDay": "1997-01-01",
+ "lastOperatingDay": "1997-12-31",
+ "entities": {
+ "ERCOT": 8760
+ },
+ "units": {
+ "MW": 8760
+ },
+ "sourceErrors": 0,
+ "decodedRowsSha256": "2324feb570336e14649760f3c93293aef9f24fa693ba9194eb96a251416b9926",
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei97.txt",
+ "indexTitle": "1997 ERCOT Hourly Load Data (Raw)"
+ },
+ {
+ "file": "erceei97.xls",
+ "sha256": "4c163bfc487661e9c7041c19be5f0fb6607114612bfab469799342479ff359c0",
+ "rows": 8760,
+ "firstOperatingDay": "1997-01-01",
+ "lastOperatingDay": "1997-12-31",
+ "entities": {
+ "ERCOT": 8760
+ },
+ "units": {
+ "MW": 8760
+ },
+ "sourceErrors": 0,
+ "decodedRowsSha256": "6d716e4043dcf1678e4cecf06636b56686acaea7e2d1484132bebcb5e8595900",
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei97.xls",
+ "indexTitle": "1997 ERCOT Hourly Load Data"
+ },
+ {
+ "file": "97frc714.zip",
+ "sha256": "0ccbbfea1c52b25156e071a28b96e63631fe7e94c677885698e4901fd8a15f7a",
+ "rows": 96624,
+ "firstOperatingDay": "1996-01-01",
+ "lastOperatingDay": "1996-12-31",
+ "entities": {
+ "COA": 8784,
+ "CPL": 8784,
+ "CPS": 8784,
+ "HLP": 8784,
+ "LCRA": 8784,
+ "PUB": 8784,
+ "STM": 8784,
+ "TMPA": 8784,
+ "TNP": 8784,
+ "TUE": 8784,
+ "WTU": 8784
+ },
+ "units": {
+ "MW": 96624
+ },
+ "sourceErrors": 0,
+ "decodedRowsSha256": "d062eec84b409690e3d088de60cb6100cdc272c7fa947e2c6937740190a7c5ed",
+ "url": "https://www.ercot.com/files/docs/2002/12/11/97frc714.zip",
+ "indexTitle": "1997 ERCOT Hourly Load Data"
+ },
+ {
+ "file": "ferc714.zip",
+ "sha256": "54cb33600a6f46fafbc9992afe74efb22394ecc85d733b41859b182acc8a5b79",
+ "rows": 236520,
+ "firstOperatingDay": "1998-01-01",
+ "lastOperatingDay": "1998-12-31",
+ "entities": {
+ "AENX": 8760,
+ "BEPC": 8760,
+ "BOWX": 8760,
+ "BPMX": 8760,
+ "BRDX": 8760,
+ "BRYN": 8760,
+ "CODX": 8760,
+ "COGX": 8760,
+ "CPLC": 8760,
+ "CPSB": 8760,
+ "GEUS": 8760,
+ "GRBX": 8760,
+ "HERN": 8760,
+ "HLPC": 8760,
+ "HUCO & COFV": 8760,
+ "LCRA": 8760,
+ "MECX": 8760,
+ "PUBX": 8760,
+ "RCEC": 8760,
+ "SESC": 8760,
+ "STEC": 8760,
+ "TNMP": 8760,
+ "TUEC": 8760,
+ "TXLA": 8760,
+ "WEAT": 8760,
+ "WTUC": 8760,
+ "TOTAL": 8760
+ },
+ "units": {
+ "kW": 236520
+ },
+ "sourceErrors": 0,
+ "decodedRowsSha256": "2918cc07be398fd542bc072cef7474520b5d2f0a65f9bdd55730fc30a7332e97",
+ "url": "https://www.ercot.com/files/docs/2002/12/11/ferc714.zip",
+ "indexTitle": "1998 ERCOT Hourly Load Data"
+ },
+ {
+ "file": "1999ferc714.zip",
+ "sha256": "33462ad69c7c85298f67cf248024285f86c2776cd9c5c711f70bc6d3c2dfdfa5",
+ "rows": 96371,
+ "firstOperatingDay": "1999-01-01",
+ "lastOperatingDay": "1999-12-31",
+ "entities": {
+ "AENX": 8761,
+ "CPST": 8761,
+ "CSWS": 8761,
+ "LCRA": 8761,
+ "PUBX": 8761,
+ "REIT": 8761,
+ "STEC": 8761,
+ "TMPP": 8761,
+ "TNMP": 8761,
+ "TUET": 8761,
+ "ERCOT TOTAL": 8761
+ },
+ "units": {
+ "None": 96371
+ },
+ "sourceErrors": 4,
+ "decodedRowsSha256": "b1eb2539e5287ca3284345ee386093ce187628ed07be7548355dd0d53b230a0d",
+ "url": "https://www.ercot.com/files/docs/2002/12/11/1999ferc714.zip",
+ "indexTitle": "1999 ERCOT Hourly Load Data"
+ },
+ {
+ "file": "2000ferc714.zip",
+ "sha256": "52ab74e4f82b630c05152f781088eaca1a60f111dae2bf674a7380f62b6fb8b7",
+ "rows": 96635,
+ "firstOperatingDay": "2000-01-01",
+ "lastOperatingDay": "2000-12-31",
+ "entities": {
+ "AENX": 8785,
+ "AEPX": 8785,
+ "CPST": 8785,
+ "LCRA": 8785,
+ "BPUB": 8785,
+ "REIT": 8785,
+ "STEC": 8785,
+ "TMPP": 8785,
+ "TNMP": 8785,
+ "TUET": 8785,
+ "ERCOT TOTAL": 8785
+ },
+ "units": {
+ "None": 96635
+ },
+ "sourceErrors": 0,
+ "decodedRowsSha256": "f3c244ab82d734c786c68c3200efce4086764ad864ddbff0ba9d0f6c347c17db",
+ "url": "https://www.ercot.com/files/docs/2005/11/10/2000ferc714.zip",
+ "indexTitle": "2000 ERCOT Hourly Load Data"
+ }
+ ],
+ "eeiFormatSource": "https://www.canr.msu.edu/ipu/uploads/migration/2016/12/Profozich-Czamanski-Electric-Time-Use-Colorado-81-4-Aug-81.pdf",
+ "unitHandling": "EEI loads use MWh/hr, equivalent to MW; 1997 XLS explicitly states mw; 1998 XLS explicitly states kW. Unlabelled 1996/1999/2000 text retains unit=None with original numeric magnitude.",
+ "liveWorkflow": {
+ "checkedAt": "2026-09-07T22:52:05.611260+00:00",
+ "requests": [
+ {
+ "url": "https://www.ercot.com/gridinfo/load/load_hist",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei95.txt",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/96load.txt",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2002/12/11/97frc714.zip",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei97.txt",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2004/07/26/erceei97.xls",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2002/12/11/ferc714.zip",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2002/12/11/1999ferc714.zip",
+ "status": 200
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2005/11/10/2000ferc714.zip",
+ "status": 200
+ }
+ ],
+ "rowCount": 24,
+ "firstRow": {
+ "operatingDay": "1995-01-01",
+ "hourEnding": 1,
+ "entity": "ERCOT",
+ "entityType": "system",
+ "controlArea": null,
+ "demand": "19732",
+ "unit": "MW",
+ "sourceMember": "erceei95.txt",
+ "sourceError": null,
+ "sourceSheet": null,
+ "sourceCardHeader": " 1 195196505386 "
+ },
+ "lastRow": {
+ "operatingDay": "1995-01-01",
+ "hourEnding": 24,
+ "entity": "ERCOT",
+ "entityType": "system",
+ "controlArea": null,
+ "demand": "24101",
+ "unit": "MW",
+ "sourceMember": "erceei95.txt",
+ "sourceError": null,
+ "sourceSheet": null,
+ "sourceCardHeader": " 1 1952965 "
+ },
+ "authenticationHeadersSent": false
+ },
+ "indexUrl": "https://www.ercot.com/gridinfo/load/load_hist",
+ "fixture": {
+ "path": "tools/inputs/history/legacy-hourly-load.zip",
+ "sha256": "9d7bf99b2e47ef8752c719dc0ff56667be35ef898c31b1f49aef5707ef1158ba",
+ "scope": "Unmodified bytes of all eight original pre-2002 linked files, wrapped together in a ZIP."
+ },
+ "sourceCaveats": [
+ "96load.txt runs from January 1,1996 through February7,1997 hour13. The index label does not bound its contents.",
+ "97frc714.zip is labelled1997 but contains 1996 EEI measurements.",
+ "1999 has four #VALUE! cells. Their demand is None and sourceError retains the published error.",
+ "1999 repeats hour2 on October31; 2000 repeats hour3 on October29, yielding8761 and8785 source hour rows respectively. No UTC offsets or deduplication are inferred.",
+ "1996,1999 and2000 text files do not state their unit. Values retain their published magnitude and unit=None.",
+ "Companion forecasts, workbook peak/energy summaries and miscellaneous EEI header metadata are not decoded as separate data products; original card header text is retained."
+ ]
+}
diff --git a/tools/inputs/public-load-profiles-evidence.json b/tools/inputs/public-load-profiles-evidence.json
new file mode 100644
index 00000000..1d08780d
--- /dev/null
+++ b/tools/inputs/public-load-profiles-evidence.json
@@ -0,0 +1,1642 @@
+{
+ "checkedAt": "2026-09-08T06:41:35.058714+00:00",
+ "indexUrl": "https://www.ercot.com/mktinfo/loadprofile/alp",
+ "indexSha256": "f8081d3e65e541657932045fe411637bf7a62f7d4cf299df9920e37302186c51",
+ "scope": "All 30 linked annual archive headers inspected. Five complete annual archives independently compared against original worksheet cells. Other years have header evidence only, not complete row-by-row verification. No MIS or credentials used.",
+ "layoutSpecification": {
+ "url": "https://www.ercot.com/files/docs/2011/08/29/fileformatsloadprofiles.xls",
+ "sha256": "75feaf01709f1b30aa1fe525d146efb79a7c09dde52ee49608621136f81d2730"
+ },
+ "formats": [
+ {
+ "id": 1,
+ "profileHeader": "PType_WZ",
+ "dateHeader": "Date",
+ "intervalHeaders": "int_kWh1..int_kWh100",
+ "hasAddTime": true
+ },
+ {
+ "id": 2,
+ "profileHeader": "PType_WZ",
+ "dateHeader": "Date",
+ "intervalHeaders": "INT001..INT100",
+ "hasAddTime": false
+ },
+ {
+ "id": 3,
+ "profileHeader": "PType_WZ",
+ "dateHeader": "Date",
+ "intervalHeaders": "int_kWh1..int_kWh100",
+ "hasAddTime": false
+ },
+ {
+ "id": 4,
+ "profileHeader": "Profile Type & Weather Zone",
+ "dateHeader": "ERC_TRADE_DATE",
+ "intervalHeaders": "INT001..INT100",
+ "hasAddTime": false
+ },
+ {
+ "id": 5,
+ "profileHeader": null,
+ "dateHeader": "Date",
+ "intervalHeaders": "INT1..INT96",
+ "hasAddTime": false
+ },
+ {
+ "id": 6,
+ "profileHeader": "PType_WZ",
+ "dateHeader": "DATE",
+ "intervalHeaders": "INT1..INT96",
+ "hasAddTime": false
+ },
+ {
+ "id": 7,
+ "profileHeader": "Profile Type and Weather Zone",
+ "dateHeader": "ERC_TRADE_DATE",
+ "intervalHeaders": "INT001..INT100",
+ "hasAddTime": false
+ }
+ ],
+ "archives": [
+ {
+ "year": 2026,
+ "title": "2026 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2026/02/03/ERCOT-Backcasted-Load-Profiles-2026.zip",
+ "sha256": "c2abc91bd2ef8505d94c44c6b52d2a4da31c05a46e8e08bc8b88d51c5409a7c7",
+ "bytes": 18716254,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "Jan",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "Feb",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "Mar",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "APR",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "JUL",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "AUG",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2025,
+ "title": "2025 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2025/02/04/ERCOT-Backcasted-Load-Profiles-2025.zip",
+ "sha256": "fe2b962f9d88bb813f2dc11cc5006d9b36fc883f30138a540d7ddc33053c577d",
+ "bytes": 34838908,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "January",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "February",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "March",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "April",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "August",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "September",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "Sep",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "Oct",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "Nov",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2025.xlsx",
+ "sheet": "Dec",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2024,
+ "title": "2024 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2024/02/06/ERCOT_Backcasted_Load_Profiles_2024.zip",
+ "sha256": "07cf7f8c49b9996d1bcab1e1445f594dea6fb86161aa6e725019881095dc9e6f",
+ "bytes": 32305533,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "January",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "February",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "March",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "April",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "August",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "September",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "October",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "November",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2024.xlsx",
+ "sheet": "December",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2023,
+ "title": "2023 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2023/02/06/ERCOT-Backcasted-Load-Profiles-2023.zip",
+ "sha256": "742d599de7ddc8fc3dfb07e59810a84840f89495b470f1e28cda1ac5eb56f99b",
+ "bytes": 32963364,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "January",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "February",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "March",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "April",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "August",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "September",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "October",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "November",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2023.xlsx",
+ "sheet": "December",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2022,
+ "title": "2022 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2022/04/04/ERCOT%20Backcasted%20Load%20Profiles%202022%20-%20Updated%20v2.zip",
+ "sha256": "f953999c1c1d6e6dfd5bf9c5ea7df3418fec4a9d8dbc72eb37c388c22c7a5d5c",
+ "bytes": 48931802,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "January",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "February",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "March",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "April",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "August",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "September",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "October",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "November",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2022 - Updated v2.xlsx",
+ "sheet": "December",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2021,
+ "title": "2021 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2021/11/05/ERCOT_Backcasted_Load_Profiles_2021.zip",
+ "sha256": "d5e933f8fa9d4f28e4fe1c2c8a948cdd64258ebf4683914e31f54e49022d0573",
+ "bytes": 47304765,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "January",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "February",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "March",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "April",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "August",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "SEPTEMBER",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "OCTOBER",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "NOVEMBER",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2021.xlsx",
+ "sheet": "DECEMBER",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2020,
+ "title": "2020 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2021/01/07/ERCOT_Backcasted_Load_Profiles_2020.zip",
+ "sha256": "be64a5a1a6d64e68ab166acde3b366dc52be97e1b2582932361145d8c645923c",
+ "bytes": 47550211,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "January",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "February",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "March",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "April",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "August",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "September",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "October",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "November",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2020.xlsx",
+ "sheet": "December",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2019,
+ "title": "2019 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2020/01/03/ERCOT_Backcasted_Load_Profiles_2019.zip",
+ "sha256": "5344bd3cca88952a6700575def46fb9f59b99161c6fd8261655617e3c235c81c",
+ "bytes": 47414466,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "Jan",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "FEB",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "MAR",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "APR",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "August",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "September",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "October",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "November",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2019.xlsx",
+ "sheet": "December",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2018,
+ "title": "2018 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2019/01/09/ERCOT_Backcasted_Load_Profiles_2018.zip",
+ "sha256": "98d86cae8a373c57ad19b20605f9b53dc0aab0c1424cb5234119df1ead69a777",
+ "bytes": 32204813,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "Jan",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "Feb",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "Mar",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "Apr",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "May",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "June",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "July",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "Aug",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "SEP",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "OCT",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "NOV",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2018.xlsx",
+ "sheet": "DEC",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2017,
+ "title": "2017 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2018/01/09/ERCOT_Backcasted_Load_Profiles_2017.zip",
+ "sha256": "1e32bbba226e54218dc85ea310d6a477c386f42cb54b8718af8632b403250c11",
+ "bytes": 35434010,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2017.xlsx",
+ "sheet": "Q1_2017",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2017.xlsx",
+ "sheet": "Q2_2017",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2017.xlsx",
+ "sheet": "Q3_2017",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2017.xlsx",
+ "sheet": "Q4_2017",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2016,
+ "title": "2016 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2017/01/05/ERCOT_Backcasted_Load_Profiles_2016.zip",
+ "sha256": "c193c92af31e593f9f76705504b0d9b0c8d64f8b80f83101ce9b8fa30352f615",
+ "bytes": 36755178,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2016.xls",
+ "sheet": "Q1_2016",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2016.xls",
+ "sheet": "Q2_2016",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2016.xls",
+ "sheet": "Q3_2016",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2016.xls",
+ "sheet": "Q4_2016",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2015,
+ "title": "2015 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2016/01/05/ercot_backcasted_load_profiles_2015.zip",
+ "sha256": "1d51628130d64d55e88df2b73f1e305c3f1fde061887a3cb67c3e7d8b3cead8a",
+ "bytes": 48466878,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2015.xlsx",
+ "sheet": "Q1_2015",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2015.xlsx",
+ "sheet": "Q2_2015",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2015.xlsx",
+ "sheet": "Q3_2015",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2015.xlsx",
+ "sheet": "Q4_2015",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2014,
+ "title": "2014 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2015/02/17/ercot_backcasted_load_profiles_2014.zip",
+ "sha256": "f55f359de53622912b1a6464ea27ad709e2cc1c67b079b1b0a73499649cd7d76",
+ "bytes": 51016643,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2014.xlsx",
+ "sheet": "Q1_2014",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2014.xlsx",
+ "sheet": "Q2_2014",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2014.xlsx",
+ "sheet": "Q3_2014",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2014.xlsx",
+ "sheet": "Q4_2014",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2013,
+ "title": "2013 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2014/03/11/ercot_backcasted_loadprofiles201303.zip",
+ "sha256": "86b873c22ff72abc4550a29fc089bc1e422e21358d396fd37fa2c72493413e5b",
+ "bytes": 50365047,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q1_2013",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q2_2013",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q3_2013",
+ "format": 1
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q4_2013",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2012,
+ "title": "2012 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2013/02/25/ercot_backcasted_load_profiles_01_01_2012_thru_12_31_2012.zip",
+ "sha256": "175e3157e2d78fab32ab64c1c67e600e7a9f73e8384ae706e3021f6bcae89521",
+ "bytes": 24763215,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2012 thru 12-31-2012.xls",
+ "sheet": "Q1 Q2 2012",
+ "format": 2
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2012 thru 12-31-2012.xls",
+ "sheet": "Q3 2012",
+ "format": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2012 thru 12-31-2012.xls",
+ "sheet": "Q4 2012",
+ "format": 1
+ }
+ ]
+ },
+ {
+ "year": 2011,
+ "title": "2011 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2012/01/03/ercot_backcasted_load_profiles_01_01_2011_12_31_2011.zip",
+ "sha256": "7db52115be397b8b28e483c3e3cc3090c5f848e4f5a76ee00675d3673dda26c7",
+ "bytes": 23461697,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2011 12-31-2011.xls",
+ "sheet": "Q1 Q2 Q3 2011",
+ "format": 4
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2011 12-31-2011.xls",
+ "sheet": "Q4 2011",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2010,
+ "title": "2010 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2011/01/03/ercot_backcasted_load_profiles_01_01_2010_12_31_2010.zip",
+ "sha256": "cd3fd611f736275673525b6a82b3cc84980d734645eee60d7aee887d58503c0b",
+ "bytes": 18297639,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2010 12-31-2010.xls",
+ "sheet": "2010 Q1 Q2 Q3",
+ "format": 4
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2010 12-31-2010.xls",
+ "sheet": "2010 Q4",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2009,
+ "title": "2009 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2010/01/04/ercot_backcasted_load_profiles_01_01_2009_12_31_2009.zip",
+ "sha256": "5f521b252ac266466a180ff04067a7485d5622f4ffc28ff240d1b1d757eb31ed",
+ "bytes": 16275470,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2009 12-31-2009.xls",
+ "sheet": "2009 Q1 Q2 Q3",
+ "format": 4
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2009 12-31-2009.xls",
+ "sheet": "2009 Q4",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2008,
+ "title": "2008 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2010/04/22/ercot_backcasted_load_profiles_01_01_2008_12_31_2008.zip",
+ "sha256": "aa073c940e0836f498947bb38a4fd816b772ba2ef7166e8e0413a8a46311ad8a",
+ "bytes": 7090721,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2008 12-31-2008.xls",
+ "sheet": "2008",
+ "format": 4
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2008 12-31-2008.xls",
+ "sheet": "DRG 60 days",
+ "format": 4
+ },
+ {
+ "member": "Hurricane Ike Adj Factors for COAST WZone.xls",
+ "sheet": "Adjustment Factors",
+ "format": 5
+ },
+ {
+ "member": "Hurricane Ike Adj Factors for COAST WZone.xls",
+ "sheet": "Orig Backcasted Profiles",
+ "format": 6
+ }
+ ]
+ },
+ {
+ "year": 2007,
+ "title": "2007 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2010/07/21/ercot_backcasted__including_auxiliary__load_profiles_010107_.zip",
+ "sha256": "c3be36c375e888a9c38b1278d17c958eada4ecb75a33d0f5d5f6bd3f51731613",
+ "bytes": 6184502,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-07 thru 12-31-07.xls",
+ "sheet": "2007",
+ "format": 4
+ },
+ {
+ "member": "ERCOT Auxiliary Backcasted Load Profiles 010107 thru 111407.xls",
+ "sheet": "2007",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2006,
+ "title": "2006 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2007/01/05/ercot_backcasted_load_profiles__01_01_06_thru_12_31_06.zip",
+ "sha256": "4d7c358482932127292eb943ec95919b2ff9bb841d4c06c3437fe8f1090b1799",
+ "bytes": 3374374,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-06 thru 12-31-06.xls",
+ "sheet": "2006",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2005,
+ "title": "2005 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2006/01/20/ercot_backcasted_load_profiles__01_01_05_thru_12_31_05.zip",
+ "sha256": "54c25b0f322fcd85c3017e338970ca37d279a560f195d6569474a2df13016dae",
+ "bytes": 3343363,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-05 thru 12-31-05.xls",
+ "sheet": "2005",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2004,
+ "title": "2004 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2005/01/14/ercot_backcasted_load_profiles__01_01_04_thru_12_31_04.zip",
+ "sha256": "f658c022e14708cf989bc7449ab50b276eba3d3ffedd48a923a35054dc1a94a0",
+ "bytes": 3351708,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-04 thru 12-31-04.xls",
+ "sheet": "2004",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2003,
+ "title": "2003 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2004/03/01/ercot_backcasted_load_profiles__01_01_03_thru_12_31_03.zip",
+ "sha256": "709e90903d20c8de4beb432d890c963fac6eb4535c4f83bcec0785c8c50d4e38",
+ "bytes": 3311309,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-03 thru 12-31-03.xls",
+ "sheet": "2003",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2002,
+ "title": "2002 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2004/03/01/ercot_backcasted_load_profiles__01_01_02_thru_12_31_02.zip",
+ "sha256": "0d0c865768c7fcfffdab7a6f13cd7d5b210565ffa5d06404c11b55f1c11a0776",
+ "bytes": 3376173,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-02 thru 12-31-02.xls",
+ "sheet": "2002",
+ "format": 4
+ }
+ ]
+ },
+ {
+ "year": 2001,
+ "title": "2001 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2002/08/23/ercot_backcasted_load_profiles__01_01_01_thru_12_31_01.zip",
+ "sha256": "14df51336c03ef59a352d3a385da51f0f1678b86e72c2fe9609c324c131aae94",
+ "bytes": 2970690,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-01 thru 12-31-01.xls",
+ "sheet": "2001",
+ "format": 7
+ }
+ ]
+ },
+ {
+ "year": 2000,
+ "title": "2000 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2002/08/23/ercot_backcasted_load_profiles__01_01_00_thru_12_31_00.zip",
+ "sha256": "43e481d196ca0086722a2484ad86de53a9923c69901559fec8713e6dfff6c410",
+ "bytes": 2998666,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-00 thru 12-31-00.xls",
+ "sheet": "2000",
+ "format": 7
+ }
+ ]
+ },
+ {
+ "year": 1999,
+ "title": "1999 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2002/08/23/ercot_backcasted_load_profiles__01_01_99_thru_12_31_99.zip",
+ "sha256": "087068e591cff66ae393fce20dae8c93711b8559bb40ed22cd61dbe9a7ffdc1e",
+ "bytes": 2967243,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-99 thru 12-31-99.xls",
+ "sheet": "1999",
+ "format": 7
+ }
+ ]
+ },
+ {
+ "year": 1998,
+ "title": "1998 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2002/08/23/ercot_backcasted_load_profiles__01_01_98_thru_12_31_98.zip",
+ "sha256": "e0677ae94c53c089afe02b44151621248da42ccb2fd0e40fc1f73ffd3e44433a",
+ "bytes": 2977126,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-98 thru 12-31-98.xls",
+ "sheet": "1998",
+ "format": 7
+ }
+ ]
+ },
+ {
+ "year": 1997,
+ "title": "1997 Actual Load Profiles",
+ "url": "https://www.ercot.com/files/docs/2002/08/23/ercot_backcasted_load_profiles__01_03_97_thru_12_31_97.zip",
+ "sha256": "c241aa62deff86859a39f33f89b17b635d73ad4dc4c06cc7661fb95baf0c8fba",
+ "bytes": 2955150,
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-03-97 thru 12-31-97.xls",
+ "sheet": "1997",
+ "format": 7
+ }
+ ]
+ }
+ ],
+ "fixtures": [
+ {
+ "year": 1997,
+ "path": "load-profiles/1997.zip",
+ "sha256": "2e81f69333a43d0251ba9a5ed407ed4410f6d782b80fa4330bd94a3a0f71ca07",
+ "sourceSha256": "c241aa62deff86859a39f33f89b17b635d73ad4dc4c06cc7661fb95baf0c8fba",
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-03-97 thru 12-31-97.xls",
+ "sheet": "1997",
+ "rowsIncludingHeaderNotes": 10
+ }
+ ]
+ },
+ {
+ "year": 2007,
+ "path": "load-profiles/2007.zip",
+ "sha256": "de4ef8ad29f1a5d8808f6168a93ff4b300cd396d39f7a035fe93b911c46ba789",
+ "sourceSha256": "c3be36c375e888a9c38b1278d17c958eada4ecb75a33d0f5d5f6bd3f51731613",
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-07 thru 12-31-07.xls",
+ "sheet": "2007",
+ "rowsIncludingHeaderNotes": 4
+ },
+ {
+ "member": "ERCOT Auxiliary Backcasted Load Profiles 010107 thru 111407.xls",
+ "sheet": "2007",
+ "rowsIncludingHeaderNotes": 5
+ }
+ ]
+ },
+ {
+ "year": 2012,
+ "path": "load-profiles/2012.zip",
+ "sha256": "3c46a1ba5dc9034cfa2182154854c6211f7ab543a9176f282d083dbf24165993",
+ "sourceSha256": "175e3157e2d78fab32ab64c1c67e600e7a9f73e8384ae706e3021f6bcae89521",
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2012 thru 12-31-2012.xls",
+ "sheet": "Q1 Q2 2012",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2012 thru 12-31-2012.xls",
+ "sheet": "Q3 2012",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2012 thru 12-31-2012.xls",
+ "sheet": "Q4 2012",
+ "rowsIncludingHeaderNotes": 5
+ }
+ ]
+ },
+ {
+ "year": 2013,
+ "path": "load-profiles/2013.zip",
+ "sha256": "7736b9bd04dbb8d4701026aef8eb9f1bdf7587ec97912192a2c7e85174d9f47b",
+ "sourceSha256": "86b873c22ff72abc4550a29fc089bc1e422e21358d396fd37fa2c72493413e5b",
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q1_2013",
+ "rowsIncludingHeaderNotes": 5
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q2_2013",
+ "rowsIncludingHeaderNotes": 4
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q3_2013",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2013.xlsx",
+ "sheet": "Q4_2013",
+ "rowsIncludingHeaderNotes": 5
+ }
+ ]
+ },
+ {
+ "year": 2026,
+ "path": "load-profiles/2026.zip",
+ "sha256": "921293a8cdf90ba5d86ed07fdd860f12366c8ed1a2fd7264f4577ecf97714619",
+ "sourceSha256": "c2abc91bd2ef8505d94c44c6b52d2a4da31c05a46e8e08bc8b88d51c5409a7c7",
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "Jan",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "Feb",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "Mar",
+ "rowsIncludingHeaderNotes": 5
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "APR",
+ "rowsIncludingHeaderNotes": 4
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "June",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "JUL",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 2026.xlsx",
+ "sheet": "AUG",
+ "rowsIncludingHeaderNotes": 3
+ }
+ ]
+ },
+ {
+ "year": 2008,
+ "path": "load-profiles/2008.zip",
+ "sha256": "2003ba97cfbc15af2f2a9f086d1f3c65f2108037e6b84543a0a9606aca3825df",
+ "sourceSha256": "aa073c940e0836f498947bb38a4fd816b772ba2ef7166e8e0413a8a46311ad8a",
+ "sheets": [
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2008 12-31-2008.xls",
+ "sheet": "2008",
+ "rowsIncludingHeaderNotes": 3
+ },
+ {
+ "member": "ERCOT Backcasted Load Profiles 01-01-2008 12-31-2008.xls",
+ "sheet": "DRG 60 days",
+ "rowsIncludingHeaderNotes": 5
+ },
+ {
+ "member": "Hurricane Ike Adj Factors for COAST WZone.xls",
+ "sheet": "Adjustment Factors",
+ "rowsIncludingHeaderNotes": 17
+ },
+ {
+ "member": "Hurricane Ike Adj Factors for COAST WZone.xls",
+ "sheet": "Orig Backcasted Profiles",
+ "rowsIncludingHeaderNotes": 161
+ }
+ ]
+ }
+ ],
+ "fixtureMethod": "Source-derived subsets: original notes and headers, first two data rows and selected transition-date rows for the first profile in each worksheet. XLS rewritten with xlwt, XLSX with openpyxl, retaining dates and source values. Outer ZIP member names unchanged. Index fixture retains all 30 original links only.",
+ "completeFileChecks": [
+ {
+ "year": 1997,
+ "url": "https://www.ercot.com/files/docs/2002/08/23/ercot_backcasted_load_profiles__01_03_97_thru_12_31_97.zip",
+ "sha256": "c241aa62deff86859a39f33f89b17b635d73ad4dc4c06cc7661fb95baf0c8fba",
+ "rows": 26136,
+ "intervalCells": 2613600,
+ "nonemptyIntervalCells": 2509055,
+ "profiles": 72,
+ "dates": 363,
+ "dateFrom": "1997-01-03",
+ "dateTo": "1997-12-31",
+ "missingDates": [],
+ "rowsByKind": {
+ "backcast": 26136
+ },
+ "scope": "Complete annual archive; independently compared every field and numbered interval cell to xlrd source values."
+ },
+ {
+ "year": 2007,
+ "url": "https://www.ercot.com/files/docs/2010/07/21/ercot_backcasted__including_auxiliary__load_profiles_010107_.zip",
+ "sha256": "c3be36c375e888a9c38b1278d17c958eada4ecb75a33d0f5d5f6bd3f51731613",
+ "rows": 50016,
+ "intervalCells": 5001600,
+ "nonemptyIntervalCells": 4801568,
+ "profiles": 80,
+ "dates": 365,
+ "dateFrom": "2007-01-01",
+ "dateTo": "2007-12-31",
+ "missingDates": [],
+ "rowsByKind": {
+ "backcast": 27120,
+ "auxiliary": 22896
+ },
+ "scope": "Complete annual archive; independently compared every field and numbered interval cell to xlrd source values."
+ },
+ {
+ "year": 2008,
+ "url": "https://www.ercot.com/files/docs/2010/04/22/ercot_backcasted_load_profiles_01_01_2008_12_31_2008.zip",
+ "sha256": "aa073c940e0836f498947bb38a4fd816b772ba2ef7166e8e0413a8a46311ad8a",
+ "rows": 36160,
+ "intervalCells": 3615360,
+ "nonemptyIntervalCells": 3471808,
+ "profiles": 192,
+ "dates": 366,
+ "dateFrom": "2008-01-01",
+ "dateTo": "2008-12-31",
+ "missingDates": [],
+ "rowsByKind": {
+ "backcast": 36000,
+ "original": 160
+ },
+ "scope": "Complete annual archive; independently compared every field and numbered interval cell to xlrd source values."
+ },
+ {
+ "year": 2012,
+ "url": "https://www.ercot.com/files/docs/2013/02/25/ercot_backcasted_load_profiles_01_01_2012_thru_12_31_2012.zip",
+ "sha256": "175e3157e2d78fab32ab64c1c67e600e7a9f73e8384ae706e3021f6bcae89521",
+ "rows": 90768,
+ "intervalCells": 9076800,
+ "nonemptyIntervalCells": 8713728,
+ "profiles": 248,
+ "dates": 366,
+ "dateFrom": "2012-01-01",
+ "dateTo": "2012-12-31",
+ "missingDates": [],
+ "rowsByKind": {
+ "backcast": 90768
+ },
+ "scope": "Complete annual archive; independently compared every field and numbered interval cell to xlrd source values."
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2026/02/03/ERCOT-Backcasted-Load-Profiles-2026.zip",
+ "sha256": "c2abc91bd2ef8505d94c44c6b52d2a4da31c05a46e8e08bc8b88d51c5409a7c7",
+ "rows": 52328,
+ "intervalCells": 5232800,
+ "nonemptyIntervalCells": 5022496,
+ "profiles": 248,
+ "dates": 211,
+ "dateFrom": "2026-01-01",
+ "dateTo": "2026-08-30",
+ "missingDates": [
+ "2026-05-01",
+ "2026-05-02",
+ "2026-05-03",
+ "2026-05-04",
+ "2026-05-05",
+ "2026-05-06",
+ "2026-05-07",
+ "2026-05-08",
+ "2026-05-09",
+ "2026-05-10",
+ "2026-05-11",
+ "2026-05-12",
+ "2026-05-13",
+ "2026-05-14",
+ "2026-05-15",
+ "2026-05-16",
+ "2026-05-17",
+ "2026-05-18",
+ "2026-05-19",
+ "2026-05-20",
+ "2026-05-21",
+ "2026-05-22",
+ "2026-05-23",
+ "2026-05-24",
+ "2026-05-25",
+ "2026-05-26",
+ "2026-05-27",
+ "2026-05-28",
+ "2026-05-29",
+ "2026-05-30",
+ "2026-05-31"
+ ],
+ "rowsBySheet": {
+ "Jan": 7688,
+ "Feb": 6944,
+ "Mar": 7688,
+ "APR": 7440,
+ "June": 7440,
+ "JUL": 7688,
+ "AUG": 7440
+ },
+ "scope": "Complete 2026 annual archive, independently compared every typed field and all 100 numbered interval cells against openpyxl source rows; no inferred gap filling or publication timestamp."
+ }
+ ],
+ "adjustmentCheck": {
+ "url": "https://www.ercot.com/files/docs/2010/04/22/ercot_backcasted_load_profiles_01_01_2008_12_31_2008.zip",
+ "sourceSha256": "aa073c940e0836f498947bb38a4fd816b772ba2ef7166e8e0413a8a46311ad8a",
+ "member": "Hurricane Ike Adj Factors for COAST WZone.xls",
+ "rows": 1536,
+ "scope": "Every interval/date/factor compared against the complete original Adjustment Factors worksheet with independent xlrd extraction. Factors not applied to kWh."
+ },
+ "liveDiscovery": {
+ "indexUrl": "https://www.ercot.com/mktinfo/loadprofile/alp",
+ "archiveCount": 30,
+ "years": [
+ 1997,
+ 1998,
+ 1999,
+ 2000,
+ 2001,
+ 2002,
+ 2003,
+ 2004,
+ 2005,
+ 2006,
+ 2007,
+ 2008,
+ 2009,
+ 2010,
+ 2011,
+ 2012,
+ 2013,
+ 2014,
+ 2015,
+ 2016,
+ 2017,
+ 2018,
+ 2019,
+ 2020,
+ 2021,
+ 2022,
+ 2023,
+ 2024,
+ 2025,
+ 2026
+ ],
+ "directAdjustmentUrl": "https://www.ercot.com/files/docs/2008/10/03/hurricane_ike_adj_factors_for_coast_wzone.xls",
+ "adjustmentSha256": "e9d45965921cbb31f63768e0ce19d92626c4dd69938d35dd57242916900d29f0",
+ "directAdjustmentBytesMatchAnnualCompanion": true
+ },
+ "decoderSha256": {
+ "_load.py": "f4df5148e668487c70ade3a3de8285f8b42e44ea08cb8bc159465efc6c7caa1f",
+ "_load_profiles.py": "15713605c1f17ff10699fa6eb5fef2ec02346cdcfcbd8be54969379a4101ab8b"
+ },
+ "profileCounts": {
+ "checkedAt": "2026-09-08T07:49:40.464489+00:00",
+ "comparison": {
+ "archiveUrl": "https://www.ercot.com/files/docs/2021/10/21/Profile_Type_Counts.zip",
+ "archiveSha256": "a09f2d6f7907c0fc6b4e099b65b5004f9f6b58fd04b3d1e57b8cb97867479d8d",
+ "bytes": 8242657,
+ "workbooks": 141,
+ "rows": 97924,
+ "countValuesCompared": 97924,
+ "dimensionValuesCompared": 391696,
+ "datedSnapshots": 138,
+ "firstSnapshot": "2013-04-09",
+ "lastSnapshot": "2026-08-06",
+ "undatedRows": 1382,
+ "undatedMembers": [
+ "Profile_Type_Counts/Profile Type Counts 201500803.xlsx",
+ "Profile_Type_Counts/Profile Type Counts 201605614.xlsx"
+ ],
+ "meterTypes": [
+ "IDR",
+ "NIDR"
+ ],
+ "weatherZones": [
+ "COAST",
+ "EAST",
+ "FWEST",
+ "NCENT",
+ "NORTH",
+ "SCENT",
+ "SOUTH",
+ "WEST"
+ ],
+ "missingWeatherZoneRows": 5,
+ "scope": "All underlying Data records in all 141 original workbooks independently compared, including every count and four dimensions. Snapshot dates retain filename labels; two malformed filename dates remain unknown. Pivot tables are filtered aggregations over the same Data table."
+ },
+ "fixture": {
+ "path": "load-profiles/counts.zip",
+ "bytes": 81242,
+ "sha256": "739919a17d1108c0ed2653e7a37bf00f73ed522c928122eda74fcc14e46571fb",
+ "method": "Source Data header, first three records and last seven rows from eleven representative workbooks, including all four header layouts, both malformed dates, missing weather zones, original/corrected and space-suffixed names and the latest snapshot. Original pivot views retained; cell values unchanged.",
+ "workbooks": [
+ {
+ "member": "Profile Type Counts 20260806.xlsx",
+ "sourceSha256": "a323af2b0436e24b0fde28c0d1e4312eaf8530f041eeddfa2caa69586585103c",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 750,
+ 751
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20130409.xlsx",
+ "sourceSha256": "b6b447a673a790ccd8fe380ba425a6c6e7a3e9a41116b94c844e9886b816eac8",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 650,
+ 651,
+ 652,
+ 653,
+ 654,
+ 655,
+ 656
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 201500803.xlsx",
+ "sourceSha256": "f41d93da1f318fcd7fcb570e4cfb8e83c5b757578c99210c25f875056c436938",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 682,
+ 683,
+ 684,
+ 685,
+ 686,
+ 687,
+ 688
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 201605614.xlsx",
+ "sourceSha256": "eb2b15debfe6c199e3bc6387e636cf98083e78f6f9b148cfa84de11736af4c68",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 690,
+ 691,
+ 692,
+ 693,
+ 694,
+ 695,
+ 696
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20160812.xlsx",
+ "sourceSha256": "ff39c7aed926432fd6137a074cee46ae785355d01218e986b130c77b4e0859d9",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 695,
+ 696,
+ 697,
+ 698,
+ 699,
+ 700,
+ 701
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20180312.xlsx",
+ "sourceSha256": "f934b842c955bb0b3d7365442659187faaed85dc314c3d848729c0a7caac0132",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 701,
+ 702,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20180312_corrected.xlsx",
+ "sourceSha256": "443135b06ff413ffed716d90648849b47c9e9d6ff3416d6ff11e0f0c18fe4ddc",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 666,
+ 667,
+ 668,
+ 669,
+ 670,
+ 671,
+ 672
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20190708.xlsx",
+ "sourceSha256": "93ede402765805d7e766be560cd5d181550f4ad21ffc7e1249275e118cc7bfe0",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 656,
+ 657,
+ 658,
+ 659,
+ 660,
+ 661,
+ 662
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20190807.xlsx",
+ "sourceSha256": "667ece4f8f48319803705da64179d4ec501de3f41bd8d46b1653a7bb32053f85",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 662,
+ 663,
+ 664,
+ 665,
+ 666,
+ 667,
+ 668
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20220103 .xlsx",
+ "sourceSha256": "cddf4b286799798a0b2303f280d818958bbeb738ec6dbb1697d063f17032f508",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 676,
+ 677,
+ 678,
+ 679,
+ 680,
+ 681,
+ 682
+ ]
+ },
+ {
+ "member": "Profile_Type_Counts/Profile Type Counts 20240502.xlsx",
+ "sourceSha256": "72fab6cb540d61db3f0467a5a80e1fd1aa841db28f694391c84c0f3aea792b75",
+ "selectedSourceRows": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728
+ ]
+ }
+ ]
+ },
+ "decoderSha256": "2c3aa36047cc5dd9da803e9493eae5950f435a89204ca081f18f06ce32af100e"
+ }
+}
diff --git a/tools/inputs/public-loss-factors-evidence.json b/tools/inputs/public-loss-factors-evidence.json
new file mode 100644
index 00000000..ccf8da58
--- /dev/null
+++ b/tools/inputs/public-loss-factors-evidence.json
@@ -0,0 +1,51 @@
+{
+ "checkedAt": "2026-09-08T08:42:07.982284+00:00",
+ "indexUrl": "https://www.ercot.com/mktinfo/data_agg",
+ "indexSha256": "fa87d35c9450ce02a452b037c82a09dd38848861fc1de7f82b37ce15e9f85e72",
+ "archives": [
+ {
+ "year": 2026,
+ "title": "Historical Loss Factors_2026-01-01_thru_2026-07-31_20260706",
+ "url": "https://www.ercot.com/files/docs/2025/02/14/Historical-Loss-Factors_2026-01-01_thru_2026-07-31_20260805.xlsx"
+ }
+ ],
+ "comparison": {
+ "source": "Historical-Loss-Factors_2026-01-01_thru_2026-07-31_20260805.xlsx",
+ "sha256": "699b6352cfc89f21350f1ada55093e6f195de0135545c9e9fff9e12dc68c3eb6",
+ "bytes": 6399890,
+ "rows": 7632,
+ "sheets": {
+ "ACTUAL_TLF": 212,
+ "FORECASTED_TLF": 212,
+ "ACTUAL_DLF": 3604,
+ "FORECASTED_DLF": 3604
+ },
+ "intervalCells": 763200,
+ "numericCells": 732528,
+ "blankCells": 30672,
+ "firstDay": "2026-01-01",
+ "lastDay": "2026-07-31",
+ "uniqueDays": 212,
+ "series": 36,
+ "comparison": "Every source row, identifier, timestamp and interval cell independently compared with original openpyxl values; no SDK parsing helpers used for expected values."
+ },
+ "fixture": {
+ "path": "tools/inputs/loss-factors/historical.xlsx",
+ "sha256": "4ec56bf01a10130a5cad39cee981d9f896374f4601e7a06d8339fb71f683c57d",
+ "bytes": 135150,
+ "sheets": {
+ "ACTUAL_TLF": 4,
+ "FORECASTED_TLF": 4,
+ "ACTUAL_DLF": 68,
+ "FORECASTED_DLF": 68
+ },
+ "rows": 144,
+ "selection": "All series on January 1, March 8 (short day), March 9, and July 31, 2026. Original cell XML retained, rows removed and coordinates renumbered; source dimension preserved."
+ },
+ "decoderSha256": "67dd1cada25a6dfeaed5d8f8974b07ec6b1bf9a540c975f790e4d24b0ea2e1b4",
+ "limitations": [
+ "Direct workbook only; MIS feeds not queried. No older history inferred from URL dates.",
+ "STARTTIME and LSTIME retain source values, with no inferred timezone or proof of public availability.",
+ "100 original interval positions retained. Numeric factors are unscaled and never applied implicitly."
+ ]
+}
diff --git a/tools/inputs/public-loss-history-evidence.json b/tools/inputs/public-loss-history-evidence.json
new file mode 100644
index 00000000..4c00d660
--- /dev/null
+++ b/tools/inputs/public-loss-history-evidence.json
@@ -0,0 +1,114 @@
+{
+ "sourceIndexes": "https://www.ercot.com/mktinfo/data_agg and all 25 linked year indexes",
+ "indexFixture": {
+ "path": "tools/inputs/loss-factors/indexes.zip",
+ "sha256": "d9f4e2d2a9dbd71961d2fd82b731b1208f0655d9ec20c755809a9360b5cca5a8",
+ "pages": 26
+ },
+ "sourceManifest": "tools/inputs/public-loss-history-sources.csv",
+ "files": 72,
+ "bytes": 215272347,
+ "rows": 301829,
+ "numericCells": 28975512,
+ "blankCells": 478576,
+ "firstDay": "2001-07-31",
+ "lastDay": "2026-07-31",
+ "comparison": "All 72 original files: every dated row, interval value, timestamp, identifier, column count, interval label, source marker and archive identity compared independently with xlrd/openpyxl; no SDK parsing helpers used for expected values.",
+ "fixture": {
+ "path": "tools/inputs/loss-factors/legacy.zip",
+ "sha256": "94d30baa365f1face74f6224f2916423c45ea86d935e9a873b9d5aad691b5ebc",
+ "bytes": 20023018,
+ "selection": "Nine complete original workbooks extracted unchanged from source ZIPs, spanning legacy header variants, DST layouts, timestamps and missing identifiers.",
+ "workbooks": [
+ {
+ "member": "2001_historical_actual_losses/TLF for 2001.xls",
+ "title": "2001 TDSP Transmission Loss Factors - Actual",
+ "url": "https://www.ercot.com/files/docs/2004/05/20/2001_historical_actual_losses.zip",
+ "sourceArchiveSha256": "d625b829068458d96450877841fad46f5a92e087bc85ce348ff5e3b01e611de6",
+ "sha256": "93ce53d48a54b648763fc05f18ac5a28106719f199b6a2eb05c87d525512337b",
+ "bytes": 429568,
+ "rows": 154
+ },
+ {
+ "member": "2001_historical_distribution_loss_factors/DLF for 2001.xls",
+ "title": "2001 TDSP Distribution Loss Factors - Forecasted",
+ "url": "https://www.ercot.com/files/docs/2004/05/20/2001_historical_distribution_loss_factors.zip",
+ "sourceArchiveSha256": "67d1431f611fd8dbe00eb3132327699de0c063fc32d60cb60d76f45879a7b085",
+ "sha256": "4e5d5f35a22d0662cf30ca6ba8657772916567d944c3b611340e29ee10394be7",
+ "bytes": 7943680,
+ "rows": 2156
+ },
+ {
+ "member": "2001_historical_forecasted_losses/TLF forecasted for 2001.xls",
+ "title": "2001 TDSP Transmission Loss Factors - Forecasted",
+ "url": "https://www.ercot.com/files/docs/2004/05/20/2001_historical_forecasted_losses.zip",
+ "sourceArchiveSha256": "3e2428ff77f7874ba514fc357ead36c51212572143c39d37426d2cfbb3cc5db6",
+ "sha256": "99d12459906fb8614f686aefc84a36cbaa1b80e98f607327c80d485c6a2b98d8",
+ "bytes": 429056,
+ "rows": 154
+ },
+ {
+ "member": "2003_historical_distribution_loss_factors/DLF for 2003.xls",
+ "title": "2003 TDSP Distribution Loss Factors - Forecasted",
+ "url": "https://www.ercot.com/files/docs/2004/05/20/2003_historical_distribution_loss_factors.zip",
+ "sourceArchiveSha256": "8e1aaf7141614da1628748203fb989c7bdca31cae0e3c63ab7b31656c997be2e",
+ "sha256": "293f34121b5218d7270f8a5cf654787e915cd14a7a828ce178984808e1e5cb42",
+ "bytes": 20133888,
+ "rows": 5475
+ },
+ {
+ "member": "2004_historical_distribution_loss_factors/DLF for 2004.xls",
+ "title": "2004 TDSP Distribution Loss Factors - Forecasted",
+ "url": "https://www.ercot.com/files/docs/2005/02/01/2004_historical_distribution_loss_factors.zip",
+ "sourceArchiveSha256": "3a8e97b4476be1ec792ecbc32074fe832cadfc380f59739aeefb4b013730a39f",
+ "sha256": "c36c5231713426a2aba2dbb766ec541d336fab709d29ae3728429c632dce686c",
+ "bytes": 20635136,
+ "rows": 5612
+ },
+ {
+ "member": "dlf_actual_for_2006/DLF ACTUAL for 2006.xls",
+ "title": "2006 TDSP Distribution Loss Factors - Actual",
+ "url": "https://www.ercot.com/files/docs/2007/02/02/dlf_actual_for_2006.zip",
+ "sourceArchiveSha256": "c9214c6a6a3357ada6f4bf3f8efdbe4fd8267c5195ec02d23edcf0e695ec2acc",
+ "sha256": "8bb4bc9bdd0d14eaf37ecb9b33aa5810e925c2b2fa99420a751b56c12da47fec",
+ "bytes": 1676800,
+ "rows": 450
+ },
+ {
+ "member": "tlf_actual_for_2013/TLF actual for 2013.xls",
+ "title": "TLF actual for 2013",
+ "url": "https://www.ercot.com/files/docs/2014/01/07/tlf_actual_for_2013.zip",
+ "sourceArchiveSha256": "7f0803aa3ac75147b7675512f16aa43bd085fdf60d23040888f7255bd0ffc9cd",
+ "sha256": "7fce3737fbc96a2d3cf8bae79ba39505e2c4bbc71444e93714d60ddf70fe1809",
+ "bytes": 766464,
+ "rows": 366
+ },
+ {
+ "member": "dlf_forecasted_for_2014/DLF forecasted for 2014.xlsx",
+ "title": "DLF forecasted for 2014",
+ "url": "https://www.ercot.com/files/docs/2015/01/05/dlf_forecasted_for_2014.zip",
+ "sourceArchiveSha256": "48fd1d49f4731b5679176094ca6d959bdb90ce95b42f5196d0cf8585d8ea6dd3",
+ "sha256": "0b52e67dd1514f90e4f75857e0919ad8c5a41efe9bf0dcffc0990b48ce2072e2",
+ "bytes": 4462578,
+ "rows": 6935
+ },
+ {
+ "member": "DLF_forecasted_for_2015/DLF forecasted for 2015.xlsx",
+ "title": "DLF Forecasted for 2015",
+ "url": "https://www.ercot.com/files/docs/2016/03/09/DLF_forecasted_for_2015.zip",
+ "sourceArchiveSha256": "6cd4d3fa2b7c5e7dd841639d6e50c1c0610d92035cf47b69f5a17c4a77f50153",
+ "sha256": "e7f3912bcbfbc5a24e07f566fa1c344559d15ad074af6d85063b7ccbe2f59e02",
+ "bytes": 4327460,
+ "rows": 6935
+ }
+ ]
+ },
+ "limitations": [
+ "Year and sheet labels do not guarantee full-year coverage. Actual distribution history first appears in December 2006; per-file ranges are in the CSV manifest.",
+ "2003 DST sheet contains trailing orphan loss-code labels without dates or values; these are not observations.",
+ "2013 actual TLF workbook has a 100-interval row beneath a 96-interval header. All 100 values and its true trailing timestamp are retained; interval labels are None for that row.",
+ "2014 forecast DLF DST records use DISTLOSSFACT recorder IDs and an unlabeled numeric secondary identifier; no TDSP or loss code is inferred from that identifier.",
+ "Early distribution workbooks have no actual/forecast label internally: index metadata supplies it during live queries, otherwise kind is None.",
+ "Source timestamps have no inferred timezone and do not prove public availability; repeated clock columns and blank values remain distinct."
+ ]
+}
diff --git a/tools/inputs/public-loss-history-sources.csv b/tools/inputs/public-loss-history-sources.csv
new file mode 100644
index 00000000..3e3af574
--- /dev/null
+++ b/tools/inputs/public-loss-history-sources.csv
@@ -0,0 +1,73 @@
+indexUrl,title,url,sha256,bytes,rows,numericCells,blankCells,firstDay,lastDay,uniqueDays
+https://www.ercot.com/mktinfo/data_agg,Historical Loss Factors_2026-01-01_thru_2026-07-31_20260706,https://www.ercot.com/files/docs/2025/02/14/Historical-Loss-Factors_2026-01-01_thru_2026-07-31_20260805.xlsx,699b6352cfc89f21350f1ada55093e6f195de0135545c9e9fff9e12dc68c3eb6,6399890,7632,732528,30672,2026-01-01,2026-07-31,212
+https://www.ercot.com/mktinfo/data_agg/2001,2001 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2004/05/20/2001_historical_actual_losses.zip,d625b829068458d96450877841fad46f5a92e087bc85ce348ff5e3b01e611de6,143290,154,14788,0,2001-07-31,2001-12-31,154
+https://www.ercot.com/mktinfo/data_agg/2001,2001 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2004/05/20/2001_historical_distribution_loss_factors.zip,67d1431f611fd8dbe00eb3132327699de0c063fc32d60cb60d76f45879a7b085,1713214,2156,207032,0,2001-07-31,2001-12-31,154
+https://www.ercot.com/mktinfo/data_agg/2001,2001 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2004/05/20/2001_historical_forecasted_losses.zip,3e2428ff77f7874ba514fc357ead36c51212572143c39d37426d2cfbb3cc5db6,87285,154,14788,0,2001-07-31,2001-12-31,154
+https://www.ercot.com/mktinfo/data_agg/2002,2002 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2004/05/20/2002_historical_actual_losses.zip,1568469678565a81978bab7a5c98f931e3ab847d0065b9172c7c5d4305391eca,248841,365,35040,4,2002-01-01,2002-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2002,2002 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2004/05/20/2002_historical_distribution_loss_factors.zip,40b0ff91fb13e7ce367be436ea38f47d01beaa374753a577c90e47c36545f7b4,4372419,5475,525600,60,2002-01-01,2002-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2002,2002 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2004/05/20/2002_historical_forecasted_losses.zip,9413f6c280aa39df69537c8f33c9346479d140e0d973ab4b1cd334b3e00f023a,146545,365,35040,4,2002-01-01,2002-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2003,2003 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2004/05/20/2003_historical_actual_losses.zip,d120bfb796cc8d7c6f277e4baa1148b383653da91cc623fe6cf0b786fd6ee968,286549,365,35040,4,2003-01-01,2003-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2003,2003 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2004/05/20/2003_historical_distribution_loss_factors.zip,8e1aaf7141614da1628748203fb989c7bdca31cae0e3c63ab7b31656c997be2e,4377476,5475,525600,60,2003-01-01,2003-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2003,2003 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2004/05/20/2003_historical_forecasted_losses.zip,4c221de23161c31dbe8bb2d43cede786245d1bd7ebc54a92aa29066fd39d818c,152576,365,35040,4,2003-01-01,2003-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2004,2004 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2005/02/01/2004_historical_actual_losses.zip,ac338eb24388a8ac2b7f3519f1a0c9d4af9ffd96c1884256d9e73a941a33be12,275605,366,35136,4,2004-01-01,2004-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2004,2004 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2005/02/01/2004_historical_distribution_loss_factors.zip,3a8e97b4476be1ec792ecbc32074fe832cadfc380f59739aeefb4b013730a39f,4527627,5612,538756,60,2004-01-01,2004-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2004,2004 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2005/02/01/2004_historical_forecasted_losses.zip,907a0bc471ec429ca6404d5aa2a002171965a8641d9c9e4f921042bea43aaaaa,155830,366,35136,4,2004-01-01,2004-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2005,2005 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2006/02/07/dlf_for_2005.zip,d252659b980303e5ec241ed5fe76d5ae203ee1c1e9fc3965315729f014e72d61,5251957,6341,608740,68,2005-01-01,2005-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2005,2005 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2006/02/07/tlf_actual_for_2005.zip,815d4760c97bc86c9581dce6a49831c0478eb8f299f67bcdad4a91f34e8a9290,278847,365,35040,4,2005-01-01,2005-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2005,2005 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2006/02/07/tlf_forecasted_for_2005.zip,79ed85c0c32e83ffd06ecc8e7c2b93e9220b16a776a9eea7c30f62c22fbdf5ab,156356,365,35040,4,2005-01-01,2005-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2006,2006 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2007/01/05/dlf_forecasted_for_2006.zip,7b65975a969d7baca0f7f3e9f63cdafa14aae628a215f755584b699a0f274d58,5445717,6570,630720,72,2006-01-01,2006-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2006,2006 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2007/01/05/tlf_for_2006.zip,fa440af9cffb6a29da2efd760a310f024ffffaa61e3ba9c8c909f5af18a2be64,287404,365,35040,4,2006-01-01,2006-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2006,2006 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2007/01/05/tlf_forecasted_for_2006.zip,ea423bc672063cc2b39a7351d5020b1e2bfad7150f753018534d3b097aa34cab,155919,365,35040,4,2006-01-01,2006-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2006,2006 TDSP Distribution Loss Factors - Actual,https://www.ercot.com/files/docs/2007/02/02/dlf_actual_for_2006.zip,c9214c6a6a3357ada6f4bf3f8efdbe4fd8267c5195ec02d23edcf0e695ec2acc,754332,450,43200,0,2006-12-07,2006-12-31,25
+https://www.ercot.com/mktinfo/data_agg/2007,2007 TDSP Distribution Loss Factors - Actual,https://www.ercot.com/files/docs/2008/01/03/dlf_actual_for_2007.zip,172d71f214eab3d1717fa65081343b2a68c62506956aa6f04f43f9658a0fb1fc,5185661,6080,583672,72,2007-01-01,2007-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2007,2007 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2008/01/03/dlf_forecasted_for_2007.zip,ffc10bca1d9c6dcc6d45b389750bfca7c7fae212ec456236475bbc300ae49bd8,2483381,6086,584248,72,2007-01-01,2007-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2007,2007 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2008/01/03/tlf_actual_for_2007.zip,fe42217fa02c5665fb1f1c6a4f9fd1b23a3db2937ef1f6a18baecdf9b9050f55,332662,365,35040,4,2007-01-01,2007-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2007,2007 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2008/01/03/tlf_forecasted_for_2007.zip,89e7d7f5a9ee77b3d46bd6801d0e9c8f65db520d75ff4984309110af8225589e,578498,365,35040,4,2007-01-01,2007-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2008,2008 TDSP Distribution Loss Factors - Actual,https://www.ercot.com/files/docs/2009/01/05/dlf_actual_for_2008.zip,ed2628fee99689a5a918005c1aad8ceaacfa0ffe88e7e399a78341bab58f1eca,4793480,5856,562176,64,2008-01-01,2008-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2008,2008 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2009/01/05/dlf_forecasted_for_2008.zip,97c7734bfb5ff23ed1ffae0a098495c21286939d7209883e5ac6ef5d0434c775,2340094,5856,562176,64,2008-01-01,2008-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2008,2008 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2009/01/05/tlf_actual_for_2008.zip,bebd1024e013fa0fb673eb4defb4fad7bbeb5de053aef9338632ad1671361e8b,329026,366,35136,4,2008-01-01,2008-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2008,2008 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2009/01/05/tlf_forecasted_for_2008.zip,2b31954e25ea7be238f2c6a01b02b32c4b6bb9ba1621cb56df8ddb8a74533b6f,572223,366,35136,4,2008-01-01,2008-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2009,2009 TDSP Distribution Loss Factors - Actual,https://www.ercot.com/files/docs/2011/03/15/dlf_actual_for_2009.zip,13b28e79ba261db31c843b03d934ea85e42b633663e6ff84d39450e802e33f25,4832364,5840,560640,64,2009-01-01,2009-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2009,2009 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2011/03/15/dlf_forecasted_for_2009.zip,03d837c877c8ed3b582a7f380f569a0d5d5247cfb4c235e20d2b5390202c2003,2360781,5840,560640,64,2009-01-01,2009-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2009,2009 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2011/03/15/tlf_actual_for_2009.zip,77e3b0777c60d973e368c7b15485345618a970e8ea947a59b9d133acda92228e,334648,365,35040,4,2009-01-01,2009-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2009,2009 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2011/03/15/tlf_forecasted_for_2009.zip,9d650f9318bde1954e24a48518f31e83c2d56d41af048bd0ce325bd537c2d249,582126,365,35040,4,2009-01-01,2009-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2010,2010 TDSP Distribution Loss Factors - Actual,https://www.ercot.com/files/docs/2011/03/15/dlf_actual_for_2010.zip,b2d2dda67fa0a9cc3d947560ead66efbfcf381706083aa4b9dea83a572f1d0c8,4833595,5840,560640,64,2010-01-01,2010-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2010,2010 TDSP Distribution Loss Factors - Forecasted,https://www.ercot.com/files/docs/2011/03/15/dlf_forecasted_for_2010.zip,9fc39fe0dab258d7d98720e3972f4710b69ce485a32a7aaf340a72d9235d0612,2359028,5840,560640,64,2010-01-01,2010-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2010,2010 TDSP Transmission Loss Factors - Actual,https://www.ercot.com/files/docs/2011/03/15/tlf_actual_for_2010.zip,58fbda277d04ce8170042d2e9167be13cc3ee0073b60925e8b724043047a7266,340071,365,35040,4,2010-01-01,2010-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2010,2010 TDSP Transmission Loss Factors - Forecasted,https://www.ercot.com/files/docs/2011/03/15/tlf_forecasted_for_2010.zip,32db0b70be58140931d2356fa25dd77d7182e4bd17ffd9953589edf3d0cfab45,585242,366,35136,4,2010-01-01,2010-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2011,DLF forecasted for 2011,https://www.ercot.com/files/docs/2012/01/09/dlf_forecasted_for_2011.zip,8a3d1469b7074a2b7941ed6eb5d03e217e645b372e5fcc19d7b25f56679cb79a,2349790,5840,560640,64,2011-01-01,2011-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2011,TLF actual for 2011,https://www.ercot.com/files/docs/2012/01/09/tlf_actual_for_2011.zip,6e15ba73009548b182d95e1fcbfb89c9987c9f4be023f7ef63f1781fa194ccd5,351870,365,35040,4,2011-01-01,2011-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2011,TLF forecasted for 2011,https://www.ercot.com/files/docs/2012/01/09/tlf_forecasted_for_2011.zip,75cb9eca7b98a7267efdfb06546af6996ad30eeb0c2105052ad3753d0a66f005,558867,365,35040,4,2011-01-01,2011-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2011,DLF actual for 2011,https://www.ercot.com/files/docs/2012/01/13/dlf_actual_for_2011.zip,402291c82efc9fc381f52daf0930fa70c1cd604a4ab6740a69d1ce3897164f18,4816204,5840,560640,64,2011-01-01,2011-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2012,DLF actual for 2012,https://www.ercot.com/files/docs/2013/01/08/dlf_actual_for_2012.zip,30c4a9516b98f0b708e071f32121e1a69cbca7398ccc7af62caeec87a77a2e00,4822731,5856,562176,64,2012-01-01,2012-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2012,DLF forecasted for 2012,https://www.ercot.com/files/docs/2013/01/08/dlf_forecasted_for_2012.zip,e5b9861f4553ff0c6cbd041cfc894785d2854a342a6beb9911a01f1bef224317,2328550,5856,562176,64,2012-01-01,2012-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2012,TLF actual for 2012,https://www.ercot.com/files/docs/2013/01/08/tlf_actual_for_2012.zip,d634698351b9091746d9fe6e8e010569a7bf314fdc4cddd91897c20f4550f77b,352004,366,35136,4,2012-01-01,2012-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2012,TLF forecasted for 2012,https://www.ercot.com/files/docs/2013/01/08/tlf_forecasted_for_2012.zip,a6a8c28c16d0ce3b518a85123eade8abb9dbd5de78b39201a6d39c49105f71a8,167826,366,35136,4,2012-01-01,2012-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2013,DLF forecasted for 2013,https://www.ercot.com/files/docs/2014/01/07/dlf_forecasted_for_2013.zip,687312a1ec32c07aa2315efec3cd0c583638a7e8c3fded34054dc04f92f4395e,2318554,5840,560640,64,2013-01-01,2013-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2013,TLF actual for 2013,https://www.ercot.com/files/docs/2014/01/07/tlf_actual_for_2013.zip,7f0803aa3ac75147b7675512f16aa43bd085fdf60d23040888f7255bd0ffc9cd,330571,366,35140,4,2013-01-01,2013-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2013,TLF forecasted for 2013,https://www.ercot.com/files/docs/2014/01/07/tlf_forecasted_for_2013.zip,71a6359a2b1bf915d9c28f71ec22f6c8f09f18e27b89746b51b3df1f01f66e0d,164946,365,35040,4,2013-01-01,2013-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2013,DLF actual for 2013,https://www.ercot.com/files/docs/2014/05/23/dlf_actual_for_2013.zip,62787736deafe1a3d64ea8c04aea29fdab9bca7928b11cacf14620830db6d286,4802349,5840,560640,64,2013-01-01,2013-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2014,DLF actual for 2014,https://www.ercot.com/files/docs/2015/01/05/dlf_actual_for_2014.zip,447b41a21675c2a130bbb9435d1b4b1ab8dd0f907893a2f8790e71b6f2371406,5352356,6935,665760,76,2014-01-01,2014-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2014,DLF forecasted for 2014,https://www.ercot.com/files/docs/2015/01/05/dlf_forecasted_for_2014.zip,48fd1d49f4731b5679176094ca6d959bdb90ce95b42f5196d0cf8585d8ea6dd3,4132593,6935,665760,76,2014-01-01,2014-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2014,TLF actual for 2014,https://www.ercot.com/files/docs/2015/01/05/tlf_actual_for_2014.zip,dccb3ff17a5a4bdfbea48b3bf67e848a4164dc18fb872944378c9bdee74abc69,350191,365,35040,4,2014-01-01,2014-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2014,TLF forecasted for 2014,https://www.ercot.com/files/docs/2015/01/05/tlf_forecasted_for_2014.zip,ecbc52c178037e2c99b4690dafd5749d66dbce346f16ecb468bb94c19ee9591c,165367,365,35040,4,2014-01-01,2014-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2015,DLF Actual for 2015,https://www.ercot.com/files/docs/2016/03/09/DLF_actual_for_2015.zip,d850e14d686be28ae40f66ee0942850a093bfce8ce55e05c5a297358517b30b4,5351968,6935,665760,76,2015-01-01,2015-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2015,DLF Forecasted for 2015,https://www.ercot.com/files/docs/2016/03/09/DLF_forecasted_for_2015.zip,6cd4d3fa2b7c5e7dd841639d6e50c1c0610d92035cf47b69f5a17c4a77f50153,4038009,6935,665760,76,2015-01-01,2015-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2015,TLF Actual for 2015,https://www.ercot.com/files/docs/2016/03/09/TLF_actual_for_2015.zip,1c36d8816b7aeb21c64c55c07d57c5df117e9e97e6ddd6fece8b1546be6f3b3a,346066,365,35040,4,2015-01-01,2015-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2015,TLF Forecasted for 2015,https://www.ercot.com/files/docs/2016/03/09/TLF_forecasted_for_2015.zip,5b5d927ecb992178c3824d2bf8b0249339af1ede9950cc7eb2726e6c4468a596,164597,365,35040,4,2015-01-01,2015-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2016,DLF Actual for 2016,https://www.ercot.com/files/docs/2017/01/05/DLF_actual_for_2016.zip,2ddde794deb849e89d55bf2bd517d3c8fd7e9f4f87ede574d0144281e0a74470,5366006,6954,667584,76,2016-01-01,2016-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2016,DLF Forecasted for 2016,https://www.ercot.com/files/docs/2017/01/05/DLF_forecasted_for_2016.zip,0f97d3da98b78e99f8d4d6d16b8a99a843c382809114ee97e3d3736df6c466c4,4047556,6954,667584,76,2016-01-01,2016-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2016,TLF Actual for 2016,https://www.ercot.com/files/docs/2017/01/05/TLF_actual_for_2016.zip,fcf290c586da36806ca81158406f1bcfff8b0fd26af8cf2f089a530ebdf943d0,351300,366,35136,4,2016-01-01,2016-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2016,TLF Forecasted for 2016,https://www.ercot.com/files/docs/2017/01/05/TLF_forecasted_for_2016.zip,8381b42e8c2c9291332a50145f5f611845fa181b068817de3ef19fa19494346d,165692,366,35136,4,2016-01-01,2016-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2017,DLF actual for 2017,https://www.ercot.com/files/docs/2018/01/08/DLF_actual_for_2017.zip,bea521f930f356e4e969e9f4d0142b72d32a38c6b08b1f68e6644e79f363f194,5620996,7665,735840,84,2017-01-01,2017-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2017,DLF forecasted for 2017,https://www.ercot.com/files/docs/2018/01/08/DLF_forecasted_for_2017.zip,afc6dee6c51a3ef32491ebb573835ba20412ea83f76b2a5f95187b132c883633,2671849,7014,673344,84,2017-01-01,2017-11-30,334
+https://www.ercot.com/mktinfo/data_agg/2017,TLF actual for 2017,https://www.ercot.com/files/docs/2018/01/08/TLF_actual_for_2017.zip,84dcdaddd1cdfebbf6ef50152429af483fe9481d11a60564ef01da5a21dc09fb,347925,365,35040,4,2017-01-01,2017-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2017,TLF forecasted for 2017,https://www.ercot.com/files/docs/2018/01/08/TLF_forecasted_for_2017.zip,1db4fb778e5e7e9e678e1c1ed408bd14a832b18d26b4538c4a02e264af2f3f88,163127,365,35040,4,2017-01-01,2017-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2018,Historical Loss Factors 2018 01 01 thru 2018 12 31 20190107,https://www.ercot.com/files/docs/2019/01/07/Historical_Loss_Factors_2018-01-01_thru_2018-12-31_20190107.xlsx,990e1f70b665a1374d978a89f1b8c463a669c78e90e41878c18d323101bbb590,11290308,16060,1541760,64240,2018-01-01,2018-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2019,Historical Loss Factors_2019-01-01_thru_2019-12-31,https://www.ercot.com/files/docs/2020/01/06/Historical_Loss_Factors_2019-01-01_thru_2019-12-31_20200106.xlsx,b38456f0237314921a3733c4ed639197f8f2d4ed0dd19898d40506c2ac9f5dd5,11312947,16060,1541760,64240,2019-01-01,2019-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2020,Historical Loss Factors 2020 01 01 thru 2020 12 31 20210105,https://www.ercot.com/files/docs/2021/01/05/Historical_Loss_Factors_2020-01-01_thru_2020-12-31_20210105.xlsx,254f200e31f0f1c83158fcf652840932e41a631e6b6e021dded81bc9facbacd6,11346338,16104,1545984,64416,2020-01-01,2020-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2021,Historical Loss Factors 2021-01-01 thru 2021-12-31,https://www.ercot.com/files/docs/2022/01/05/Historical_Loss_Factors.xlsx,5487d038276413fcca0ac491d366a17a4f9dc7c4acaf99386bde366436c44e37,8889898,11680,1121280,46720,2021-01-01,2021-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2022,Historical Loss Factors_2022-01-01_thru_2022-12-31_20230105.xlsx,https://www.ercot.com/files/docs/2022/04/05/Historical%20Loss%20Factors_2022-01-01_thru_2022-12-31_20230105.xlsx,f95602ca127c726c90fb06657563da35de9ba98a429e23b27e17f6310a70af55,9766259,11680,1121280,46720,2022-01-01,2022-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2023,Historical Loss Factors_2023-01-01_thru_2023-12-31_20240105.xlsx,https://www.ercot.com/files/docs/2023/01/05/Historical%20Loss%20Factors_2023-01-01_thru_2023-12-31_20240105.xlsx,0d8749c3293a3071f1fcd7109db0cd9dba6bcfd8e08160c746c9a4c86a2590ea,9769183,11680,1121280,46720,2023-01-01,2023-12-31,365
+https://www.ercot.com/mktinfo/data_agg/2024,Historical Loss Factors_2024-01-01_thru_2024-12-31_20250106.xlsx,https://www.ercot.com/files/docs/2024/07/05/Historical%20Loss%20Factors_2024-01-01_thru_2024-12-31_20250106.xlsx,47563eebfd9ffa4a9698b77c7abf9de7dcdb25d7e26c8788a8f92a58ebdf7fb0,11850650,15079,1447596,60304,2024-01-01,2024-12-31,366
+https://www.ercot.com/mktinfo/data_agg/2025,Historical-Loss-Factors_2025-01-01_thru_2025-12-31_20260105,https://www.ercot.com/files/docs/2026/02/19/Historical-Loss-Factors_2025-01-01_thru_2025-12-31_20260105.xlsx,b99f44bd03b6f79799e224bac8eda486be2d6a7dde59269b4c4e71b89d8f7664,10986345,13140,1261440,52560,2025-01-01,2025-12-31,365
diff --git a/tools/inputs/public-market-access-evidence.json b/tools/inputs/public-market-access-evidence.json
new file mode 100644
index 00000000..057edf82
--- /dev/null
+++ b/tools/inputs/public-market-access-evidence.json
@@ -0,0 +1,93 @@
+{
+ "checkedAt": "2026-09-08",
+ "scope": "Public website source inspection, not a claim that no alternative source can exist. Annual price products are absent from the captured Public Reports catalog. Search found no direct annual price-file links; do not infer their availability or coverage from daily API retention.",
+ "products": [
+ {
+ "product": "NP4-180-ER",
+ "title": "Annual DAM hub/load-zone settlement prices",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=NP4-180-ER",
+ "htmlSha256": "a48f7c339f8259e4951b27447507194989d4b86b14b7c48ad76066f75ebd1b55",
+ "reportTypeId": "13060",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "The published page uses MIS listing/download routes. Those routes were inspected in HTML but not called; MIS is excluded from this SDK release."
+ },
+ {
+ "product": "NP6-785-ER",
+ "title": "Annual RTM hub/load-zone settlement prices",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=NP6-785-ER",
+ "htmlSha256": "b963ddf5dafe7c50f601f454019ed9e7d2a8fe26f10486b4b305aff15cf55543",
+ "reportTypeId": "13061",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "The published page uses MIS listing/download routes. Those routes were inspected in HTML but not called; MIS is excluded from this SDK release."
+ },
+ {
+ "product": "NP4-181-ER",
+ "title": "Annual DAM ancillary-service clearing prices",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=NP4-181-ER",
+ "htmlSha256": "c4fe2e7cd38b1ac559239a71e59e225f4c2e209bcdd7a2b4719fe73b90de3eb1",
+ "reportTypeId": "13091",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "The published page uses MIS listing/download routes. Those routes were inspected in HTML but not called; MIS is excluded from this SDK release."
+ },
+ {
+ "product": "NP9-83-M",
+ "title": "Recent four-coincident-peak calculations",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=NP9-83-M",
+ "htmlSha256": "4312c0a18b8ca8bb46879586a6ea784853f1509f6b826bab683e2fc229ddc730",
+ "reportTypeId": "13037",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "The published page uses MIS listing/download routes. Those routes were inspected in HTML but not called; MIS is excluded from this SDK release."
+ },
+ {
+ "product": "NP4-160-SG",
+ "title": "Settlement Points List and Electrical Buses Mapping",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=NP4-160-SG",
+ "htmlSha256": "9a1798d9521cfbbd4680cf5bdb8109411e6ae67f01011fd6c5ef9e6bd58b01b7",
+ "reportTypeId": "10008",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "Linked from the public market/grid index but absent from the API catalog and generated histories. The page uses MIS listing/download routes and contains no direct CSV/ZIP/workbook links. MIS routes were inspected in HTML, not called."
+ },
+ {
+ "product": "NP4-106-M",
+ "title": "Percent Change in Load-Provided Responsive Reserve",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=NP4-106-M",
+ "htmlSha256": "1e536c78ac1c7fadc7a566f50e62290dd32f27573ea33d2d1f0e18b89798f425",
+ "reportTypeId": "10040",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "Linked from the public market/grid index but absent from the API catalog and generated histories. The page uses MIS listing/download routes and contains no direct CSV/ZIP/workbook links. MIS routes were inspected in HTML, not called."
+ },
+ {
+ "product": "OPG-103-ER",
+ "title": "DC Tie Outage Report",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=OPG-103-ER",
+ "htmlSha256": "d8df01ab96840340de844865f3b1f72ef80b9ef6fab4af08894506f4fb2d456c",
+ "reportTypeId": "13112",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "Linked from the public market/grid index but absent from the API catalog and generated histories. The page uses MIS listing/download routes and contains no direct CSV/ZIP/workbook links. MIS routes were inspected in HTML, not called."
+ },
+ {
+ "product": "NP3-220-SG",
+ "title": "Electrical Bus to Hub List",
+ "page": "https://www.ercot.com/mp/data-products/data-product-details?id=NP3-220-SG",
+ "htmlSha256": "4198a1836514aff2e1663e828957a7e8c996777fc3f8b8be9222ce6cd3e469ad",
+ "reportTypeId": "10011",
+ "listingRoute": "https://www.ercot.com/misapp/servlets/IceDocListJsonWS?reportTypeId=",
+ "downloadRoute": "https://www.ercot.com/misdownload/servlets/mirDownload?doclookupId=",
+ "conclusion": "Linked from the public market/grid index but absent from the API catalog and generated histories. The page uses MIS listing/download routes and contains no direct CSV/ZIP/workbook links. MIS routes were inspected in HTML, not called."
+ }
+ ],
+ "fourCpDirectArchive": {
+ "index": "https://www.ercot.com/mktinfo/data_agg/4cp",
+ "url": "https://www.ercot.com/files/docs/2022/01/13/1996-2020_FourCoincidentPeakCalculations.zip",
+ "bytes": 2428522,
+ "sha256": "2583f723df58a5cc90a9fb7270bf02346003c4642d541d32cbd0bb837fcd4f03",
+ "finding": "Direct archive contains 1996-2020 annual allocation calculations and supporting workpapers. No four-CP reader was added; document-specific calculation extraction remains outside the current time-series implementation."
+ }
+}
diff --git a/tools/inputs/public-market-tables-evidence.json b/tools/inputs/public-market-tables-evidence.json
new file mode 100644
index 00000000..5f346054
--- /dev/null
+++ b/tools/inputs/public-market-tables-evidence.json
@@ -0,0 +1,51 @@
+{
+ "checkedAt": "2026-09-08T08:53:26.553074+00:00",
+ "sources": [
+ {
+ "service": "crr_hours",
+ "files": [
+ {
+ "title": "CRR Time of Use Hours",
+ "url": "https://www.ercot.com/files/docs/2021/04/16/CRR-Time-of-Use-Hours_2026-2029_UPD.xlsx"
+ }
+ ],
+ "fixture": "tools/inputs/public-tables/crr-hours.xlsx",
+ "sourceBytes": 20518,
+ "sha256": "73134f3d15808c36eb03f53a71b5212a5d25280e0b89acfd9392e65ee7c6ae5e",
+ "fixtureSelection": "Complete original source workbook, byte-for-byte.",
+ "records": 48,
+ "numericCells": 192,
+ "firstMonth": "2026-01-01",
+ "lastMonth": "2029-12-01",
+ "comparison": "Every source delivery month and all four original hour-count cells matched; source sheet/member and DST/leap-month totals verified."
+ },
+ {
+ "service": "polr",
+ "files": [
+ {
+ "title": "POLR Counts Energy 2026 Report Final",
+ "url": "https://www.ercot.com/files/docs/2020/06/03/POLR_Counts_Energy_2026_Reporting.xlsx"
+ }
+ ],
+ "fixture": "tools/inputs/public-tables/polr.xlsx",
+ "sourceBytes": 26522,
+ "sha256": "fb3c1338f7667e20b1fcd09c1bc0a516379ac17c7543f15e05107a907c6e63c6",
+ "fixtureSelection": "Complete original source workbook, byte-for-byte.",
+ "records": 24,
+ "numericCells": 48,
+ "territories": 6,
+ "premiseTypes": 4,
+ "snapshotDate": "2026-03-31",
+ "energyPeriodStart": "2025-04-01",
+ "energyPeriodEnd": "2026-03-31",
+ "comparison": "Every source territory, premise class, active-ESIID count and annual-kWh total matched, with reporting periods, source sheet/member and all cover notes verified."
+ }
+ ],
+ "decoderSha256": "0bf200790dfe817d099b09719a9edbdbf11b6cec540b22cf4dbde416d86f33b9",
+ "verification": "tests/test_public_tables.py compares all original data using independent openpyxl reads, without SDK parsing helpers for expected values.",
+ "limitations": [
+ "Observed direct downloads only; URL years do not establish earlier history.",
+ "CRR hour counts describe delivery calendars, not realized future trading activity.",
+ "POLR count and energy populations differ; no per-customer usage ratio is inferred."
+ ]
+}
diff --git a/tools/inputs/public-mora-percentiles-evidence.json b/tools/inputs/public-mora-percentiles-evidence.json
new file mode 100644
index 00000000..d206fd1d
--- /dev/null
+++ b/tools/inputs/public-mora-percentiles-evidence.json
@@ -0,0 +1,402 @@
+{
+ "checkedAt": "2026-09-08T09:37:37.675615+00:00",
+ "indexUrl": "https://www.ercot.com/gridinfo/resource",
+ "discovery": "All current and 26 linked historical-year index pages inspected; SDK discovers all 37 workbook URLs.",
+ "comparison": {
+ "files": [
+ {
+ "file": "MORA_Apr2024.xlsx",
+ "reportMonth": "2024-04-01",
+ "records": 693,
+ "url": "https://www.ercot.com/files/docs/2024/02/02/MORA_Apr2024.xlsx",
+ "sha256": "d7f946ec8dfe60a0e3e693332359ee2d0cdfdf1bc9c9dcf5a346fe2e071e0ba2",
+ "bytes": 290777
+ },
+ {
+ "file": "MORA_April2025.xlsx",
+ "reportMonth": "2025-04-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/02/06/MORA_April2025.xlsx",
+ "sha256": "a6d686843c9e82e3b26d1d77948a2f1b8f53ce11d1dbc04586a04e8a027cb10e",
+ "bytes": 313831
+ },
+ {
+ "file": "MORA_April2026.xlsx",
+ "reportMonth": "2026-04-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/02/06/MORA_April2026.xlsx",
+ "sha256": "ceede0527fa894ed2cc1f84ea2269ab3f2408a13c45a894e5f83d7fc7a6d9ea5",
+ "bytes": 318495
+ },
+ {
+ "file": "MORA_August2024.xlsx",
+ "reportMonth": "2024-08-01",
+ "records": 704,
+ "url": "https://www.ercot.com/files/docs/2024/06/07/MORA_August2024.xlsx",
+ "sha256": "7220ed1ce0a99f367fd0ffb2af007c087a0c9a0134ccfe71c30cc2b4f66abb3c",
+ "bytes": 305567
+ },
+ {
+ "file": "MORA_August2025.xlsx",
+ "reportMonth": "2025-08-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/06/05/MORA_August2025.xlsx",
+ "sha256": "8828d0e39933acffcf85c0ce4869a98009dfade35694f6ff7f9c581d7ae354ca",
+ "bytes": 312239
+ },
+ {
+ "file": "MORA_August2026.xlsx",
+ "reportMonth": "2026-08-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/06/05/MORA_August2026.xlsx",
+ "sha256": "4385cb7a9b0306855d7838ca10b41da47e15b940ce9f7761c2577446f3fcccd0",
+ "bytes": 315638
+ },
+ {
+ "file": "MORA_December2023.xlsx",
+ "reportMonth": "2023-12-01",
+ "records": 308,
+ "url": "https://www.ercot.com/files/docs/2023/10/02/MORA_December2023.xlsx",
+ "sha256": "c51d068752de8d710574bd0ad803a5ef96a36e8dfe2e16da5d31638578a56c5d",
+ "bytes": 275209
+ },
+ {
+ "file": "MORA_December2023_v2.xlsx",
+ "reportMonth": "2023-12-01",
+ "records": 308,
+ "url": "https://www.ercot.com/files/docs/2023/10/10/MORA_December2023_v2.xlsx",
+ "sha256": "c09eee27ab862eb388613dfb51d83a0fcc81f783b549639cfd7ec52209884fa8",
+ "bytes": 267385
+ },
+ {
+ "file": "MORA_December2024.xlsx",
+ "reportMonth": "2024-12-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2024/10/04/MORA_December2024.xlsx",
+ "sha256": "6dcbc33f2996efee9a49a863b76234876410b8b97a3099433b0aa618dc03b5c3",
+ "bytes": 330467
+ },
+ {
+ "file": "MORA_December2025.xlsx",
+ "reportMonth": "2025-12-01",
+ "records": 814,
+ "url": "https://www.ercot.com/files/docs/2025/10/03/MORA_December2025.xlsx",
+ "sha256": "747e6143310d18277698587d5d36e65e5d078141b41101294ea15f2ebae2fcbf",
+ "bytes": 412512
+ },
+ {
+ "file": "MORA_February2024.xlsx",
+ "reportMonth": "2024-02-01",
+ "records": 671,
+ "url": "https://www.ercot.com/files/docs/2023/11/30/MORA_February2024.xlsx",
+ "sha256": "27438c0ef50a25d6fcfd610213043ed93c70f928fdce490f2d6a7108b5d8177c",
+ "bytes": 287220
+ },
+ {
+ "file": "MORA_February2026.xlsx",
+ "reportMonth": "2026-02-01",
+ "records": 814,
+ "url": "https://www.ercot.com/files/docs/2025/12/05/MORA_February2026.xlsx",
+ "sha256": "6d77b784cfac49ee55671dfacd037720fc8452eef0527a87328daa95189cf6b1",
+ "bytes": 408969
+ },
+ {
+ "file": "MORA_January2024.xlsx",
+ "reportMonth": "2024-01-01",
+ "records": 660,
+ "url": "https://www.ercot.com/files/docs/2023/11/01/MORA_January2024.xlsx",
+ "sha256": "72be33b6341553a9e18b5a8e5340bdda37ec499ab38588213d8f401f4cf0b016",
+ "bytes": 276981
+ },
+ {
+ "file": "MORA_January2025.xlsx",
+ "reportMonth": "2025-01-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2024/11/01/MORA_January2025.xlsx",
+ "sha256": "102fa1b7f8b90723fe9e1c7355147f41fee2209bd769f16c181c52cd033094e4",
+ "bytes": 335732
+ },
+ {
+ "file": "MORA_January2026.xlsx",
+ "reportMonth": "2026-01-01",
+ "records": 814,
+ "url": "https://www.ercot.com/files/docs/2025/11/07/MORA_January2026.xlsx",
+ "sha256": "17faffa3b926100c242336bb4c2b72922e83f4bfa000f778847802c0fc0b6125",
+ "bytes": 405030
+ },
+ {
+ "file": "MORA_July2024.xlsx",
+ "reportMonth": "2024-07-01",
+ "records": 704,
+ "url": "https://www.ercot.com/files/docs/2024/05/03/MORA_July2024.xlsx",
+ "sha256": "40dc306a5bd647f434334fddef75f7ce5f87bcc6496ab92bae2b1b689afa2b75",
+ "bytes": 287332
+ },
+ {
+ "file": "MORA_July2025.xlsx",
+ "reportMonth": "2025-07-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/05/02/MORA_July2025.xlsx",
+ "sha256": "1096b3386aa55c55857b4846e775e28b009175b54fa05deffcd7380f687e9d67",
+ "bytes": 317211
+ },
+ {
+ "file": "MORA_July2026.xlsx",
+ "reportMonth": "2026-07-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/05/01/MORA_July2026.xlsx",
+ "sha256": "5bbac07bb05360bb755aa66777aff30da772f0a0e3c51cd99296c02c012e7328",
+ "bytes": 341711
+ },
+ {
+ "file": "MORA_June2024.xlsx",
+ "reportMonth": "2024-06-01",
+ "records": 704,
+ "url": "https://www.ercot.com/files/docs/2024/04/04/MORA_June2024.xlsx",
+ "sha256": "eab706971b4853602f71760d5d01108003c9bccdf63eafa3d5e458c4ef66922d",
+ "bytes": 291529
+ },
+ {
+ "file": "MORA_June2025.xlsx",
+ "reportMonth": "2025-06-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/04/04/MORA_June2025.xlsx",
+ "sha256": "0017de75216f284bcdf1d98c58be2275fb25e0514ec215ff5b179bd9a7e47b38",
+ "bytes": 315062
+ },
+ {
+ "file": "MORA_June2026.xlsx",
+ "reportMonth": "2026-06-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/04/02/MORA_June2026.xlsx",
+ "sha256": "c7932aaa846dbad76f5fbab8d7cf7ff9846d6fc4e7b717ac04edd4df2e023622",
+ "bytes": 264102
+ },
+ {
+ "file": "MORA_March2024.xlsx",
+ "reportMonth": "2024-03-01",
+ "records": 693,
+ "url": "https://www.ercot.com/files/docs/2024/01/04/MORA_March2024.xlsx",
+ "sha256": "cb034be04a07b31c2d71660419a335916b66cb9c976c50f04242db4e7d79f80c",
+ "bytes": 287785
+ },
+ {
+ "file": "MORA_March2025.xlsx",
+ "reportMonth": "2025-03-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/01/03/MORA_March2025.xlsx",
+ "sha256": "09e5c728158d48f5bcc7ca59428da8a3983cf4d4f9eab9c12ee475037ec45f5c",
+ "bytes": 389694
+ },
+ {
+ "file": "MORA_March2026.xlsx",
+ "reportMonth": "2026-03-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/01/02/MORA_March2026.xlsx",
+ "sha256": "8e2ea66027e8feb80e6f29f05e72a5d6626ada616c953c50785b4e3cba261e61",
+ "bytes": 480412
+ },
+ {
+ "file": "MORA_May2024.xlsx",
+ "reportMonth": "2024-05-01",
+ "records": 704,
+ "url": "https://www.ercot.com/files/docs/2024/03/01/MORA_May2024.xlsx",
+ "sha256": "9ebdf7954d35759902c6c7a6ff78bf84526f7157b1532a1a994a0796a8a51985",
+ "bytes": 283230
+ },
+ {
+ "file": "MORA_May2025.xlsx",
+ "reportMonth": "2025-05-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/03/07/MORA_May2025.xlsx",
+ "sha256": "cf78cfe488c09b4ec856868d6a8b7e43558dddc91bfa91aa4650aadebcaecde7",
+ "bytes": 299157
+ },
+ {
+ "file": "MORA_May2026.xlsx",
+ "reportMonth": "2026-05-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/03/06/MORA_May2026.xlsx",
+ "sha256": "2935c5ef1050c85f7ce0345aec9b045f21a560b0dc9200907d7e3a0daeb5deec",
+ "bytes": 329239
+ },
+ {
+ "file": "MORA_November2024.xlsx",
+ "reportMonth": "2024-11-01",
+ "records": 671,
+ "url": "https://www.ercot.com/files/docs/2024/09/06/MORA_November2024.xlsx",
+ "sha256": "a25b8f0c32e243f08c2f82f610bc1cdb8d581530db9fe3970c4ee788aa766779",
+ "bytes": 306980
+ },
+ {
+ "file": "MORA_November2025.xlsx",
+ "reportMonth": "2025-11-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/09/05/MORA_November2025.xlsx",
+ "sha256": "3454fca0408809b2cd53e1444852b723f3230d6ae3173833a6353fe733b915ed",
+ "bytes": 349489
+ },
+ {
+ "file": "MORA_November2026.xlsx",
+ "reportMonth": "2026-11-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/09/03/MORA_November2026.xlsx",
+ "sha256": "c219e33a65adc4f568ef8f85f7f072322cba81d1cf64fa0bda3f0c7b78391c7d",
+ "bytes": 250703
+ },
+ {
+ "file": "MORA_October2024.xlsx",
+ "reportMonth": "2024-10-01",
+ "records": 671,
+ "url": "https://www.ercot.com/files/docs/2024/08/02/MORA_October2024.xlsx",
+ "sha256": "cd1cb141a3509e55e8e96c657efece688149c0febccb21f2b6eea942caeb3fcb",
+ "bytes": 314105
+ },
+ {
+ "file": "MORA_October2025.xlsx",
+ "reportMonth": "2025-10-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/08/01/MORA_October2025.xlsx",
+ "sha256": "63179a2b73169028586a602326ec9a4a40b3c6c1534bc76d6c2aa00b6bce749e",
+ "bytes": 344999
+ },
+ {
+ "file": "MORA_October2026.xlsx",
+ "reportMonth": "2026-10-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/08/07/MORA_October2026.xlsx",
+ "sha256": "feb81bc87e9ef62bf4c3156f9e34dd13f126edd7564320cf8c2831037109c4d3",
+ "bytes": 253207
+ },
+ {
+ "file": "MORA_September2024.xlsx",
+ "reportMonth": "2024-09-01",
+ "records": 704,
+ "url": "https://www.ercot.com/files/docs/2024/07/05/MORA_September2024.xlsx",
+ "sha256": "2a35f32c62b6526b9b42edcd99c1bb43f2206752c77e370c95032c606d1ccdf9",
+ "bytes": 306726
+ },
+ {
+ "file": "MORA_September2025.xlsx",
+ "reportMonth": "2025-09-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2025/07/07/MORA_September2025.xlsx",
+ "sha256": "38fd590902826a3731c6c3fa1887b541e9090de843ebde25b7d5138c0fcdd844",
+ "bytes": 311568
+ },
+ {
+ "file": "MORA_September2026.xlsx",
+ "reportMonth": "2026-09-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2026/07/02/MORA_September2026.xlsx",
+ "sha256": "de004e9e58ab4826ac74858ffb117568a68c06a82cbd353611def84d321574fb",
+ "bytes": 333037
+ },
+ {
+ "file": "mora_february2025.xlsx",
+ "reportMonth": "2025-02-01",
+ "records": 803,
+ "url": "https://www.ercot.com/files/docs/2024/12/05/mora_february2025.xlsx",
+ "sha256": "4775ab159650c637f27db0de9b5f43eec82f1182a1d1242ff448d217ffa71fff",
+ "bytes": 331879
+ }
+ ],
+ "records": 27500,
+ "metricCounts": {
+ "gross_demand": 9240,
+ "solar_generation": 8228,
+ "wind_generation": 9592,
+ "thermal_outages": 374,
+ "non_extreme_weather_outages": 33,
+ "extreme_weather_outages": 33
+ },
+ "sourceUnits": {
+ "MW": 27478,
+ "None": 22
+ },
+ "firstMonth": "2023-12-01",
+ "lastMonth": "2026-11-01",
+ "uniqueMonths": 36,
+ "labels": [
+ "Gross Demand by Hour, MW (Accounts for rooftop solar, electric vehicle, and Large Load electricity consumption adjustments; excludes demand response program deployments)",
+ "Gross Demand by Hour, MW (Prior to any Load Resource deployments)",
+ "Solar Generation by Hour, MW",
+ "Thermal Unplanned Outages",
+ "Unplanned Thermal Outages Due to Extreme Weather - Daily, MW *",
+ "Unplanned Thermal Outages Not Due to Extreme Weather - Daily, MW",
+ "Unplanned Thermal Outages-Daily, MW",
+ "Wind Generation by Hour, MW"
+ ],
+ "comparison": "Every original percentile value, quantile, hour/daily label, metric heading, report month, footnote and source identity independently compared with original openpyxl cells; no SDK parsing helpers used for expected values."
+ },
+ "fixture": {
+ "path": "tools/inputs/public-tables/mora-percentiles.zip",
+ "bytes": 2442503,
+ "sha256": "f0c2eee30523f27477a8fe55a18a111931bc1e0a687a40e3dc9e2a925ce029c4",
+ "files": [
+ {
+ "member": "MORA_December2023.xlsx",
+ "bytes": 275209,
+ "sha256": "c51d068752de8d710574bd0ad803a5ef96a36e8dfe2e16da5d31638578a56c5d"
+ },
+ {
+ "member": "MORA_December2023_v2.xlsx",
+ "bytes": 267385,
+ "sha256": "c09eee27ab862eb388613dfb51d83a0fcc81f783b549639cfd7ec52209884fa8"
+ },
+ {
+ "member": "MORA_February2024.xlsx",
+ "bytes": 287220,
+ "sha256": "27438c0ef50a25d6fcfd610213043ed93c70f928fdce490f2d6a7108b5d8177c"
+ },
+ {
+ "member": "MORA_Apr2024.xlsx",
+ "bytes": 290777,
+ "sha256": "d7f946ec8dfe60a0e3e693332359ee2d0cdfdf1bc9c9dcf5a346fe2e071e0ba2"
+ },
+ {
+ "member": "MORA_January2025.xlsx",
+ "bytes": 335732,
+ "sha256": "102fa1b7f8b90723fe9e1c7355147f41fee2209bd769f16c181c52cd033094e4"
+ },
+ {
+ "member": "MORA_March2025.xlsx",
+ "bytes": 389694,
+ "sha256": "09e5c728158d48f5bcc7ca59428da8a3983cf4d4f9eab9c12ee475037ec45f5c"
+ },
+ {
+ "member": "MORA_February2026.xlsx",
+ "bytes": 408969,
+ "sha256": "6d77b784cfac49ee55671dfacd037720fc8452eef0527a87328daa95189cf6b1"
+ },
+ {
+ "member": "MORA_August2026.xlsx",
+ "bytes": 315638,
+ "sha256": "4385cb7a9b0306855d7838ca10b41da47e15b940ce9f7761c2577446f3fcccd0"
+ },
+ {
+ "member": "MORA_November2026.xlsx",
+ "bytes": 250703,
+ "sha256": "c219e33a65adc4f568ef8f85f7f072322cba81d1cf64fa0bda3f0c7b78391c7d"
+ }
+ ],
+ "records": 6006,
+ "metrics": {
+ "solar_generation": 1848,
+ "wind_generation": 2200,
+ "thermal_outages": 88,
+ "gross_demand": 1848,
+ "non_extreme_weather_outages": 11,
+ "extreme_weather_outages": 11
+ },
+ "missingValues": 0,
+ "selection": "Nine complete original workbooks, byte-for-byte, preserving both December 2023 revisions, partial-hour tables, daily outage labels, weather-specific regimes, both demand definitions and revised cover labels."
+ },
+ "decoderSha256": "f04346e24ec83f121b409d454ad23f3fb0ad80c36c9ee2b4cbb968d74b2488bb",
+ "limitations": [
+ "Percentile tables only; other MORA tables are not counted as supported.",
+ "Assessment-month forecast distributions, not realized observations or joint scenarios.",
+ "Published hours only. Daily outages have no hour; 22 early values have no stated source unit.",
+ "Revisions retained; URL dates and report labels do not prove public availability."
+ ]
+}
diff --git a/tools/inputs/public-mora-resources-evidence.json b/tools/inputs/public-mora-resources-evidence.json
new file mode 100644
index 00000000..ba6ecaa7
--- /dev/null
+++ b/tools/inputs/public-mora-resources-evidence.json
@@ -0,0 +1,446 @@
+{
+ "checkedAt": "2026-09-08T10:01:00.444902+00:00",
+ "indexUrl": "https://www.ercot.com/gridinfo/resource",
+ "sourceManifest": "public-mora-percentiles-evidence.json (same 37 original workbook URLs, byte sizes and SHA-256 hashes)",
+ "comparison": {
+ "files": [
+ {
+ "file": "MORA_Apr2024.xlsx",
+ "sha256": "d7f946ec8dfe60a0e3e693332359ee2d0cdfdf1bc9c9dcf5a346fe2e071e0ba2",
+ "reportMonth": "2024-04-01",
+ "records": 1520,
+ "kinds": {
+ "unit": 1487,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_April2025.xlsx",
+ "sha256": "a6d686843c9e82e3b26d1d77948a2f1b8f53ce11d1dbc04586a04e8a027cb10e",
+ "reportMonth": "2025-04-01",
+ "records": 1620,
+ "kinds": {
+ "unit": 1588,
+ "summary": 32
+ }
+ },
+ {
+ "file": "MORA_April2026.xlsx",
+ "sha256": "ceede0527fa894ed2cc1f84ea2269ab3f2408a13c45a894e5f83d7fc7a6d9ea5",
+ "reportMonth": "2026-04-01",
+ "records": 1820,
+ "kinds": {
+ "unit": 1790,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_August2024.xlsx",
+ "sha256": "7220ed1ce0a99f367fd0ffb2af007c087a0c9a0134ccfe71c30cc2b4f66abb3c",
+ "reportMonth": "2024-08-01",
+ "records": 1591,
+ "kinds": {
+ "unit": 1558,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_August2025.xlsx",
+ "sha256": "8828d0e39933acffcf85c0ce4869a98009dfade35694f6ff7f9c581d7ae354ca",
+ "reportMonth": "2025-08-01",
+ "records": 1665,
+ "kinds": {
+ "unit": 1634,
+ "summary": 31
+ }
+ },
+ {
+ "file": "MORA_August2026.xlsx",
+ "sha256": "4385cb7a9b0306855d7838ca10b41da47e15b940ce9f7761c2577446f3fcccd0",
+ "reportMonth": "2026-08-01",
+ "records": 1881,
+ "kinds": {
+ "unit": 1851,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_December2023.xlsx",
+ "sha256": "c51d068752de8d710574bd0ad803a5ef96a36e8dfe2e16da5d31638578a56c5d",
+ "reportMonth": "2023-12-01",
+ "records": 1432,
+ "kinds": {
+ "unit": 1390,
+ "summary": 42
+ }
+ },
+ {
+ "file": "MORA_December2023_v2.xlsx",
+ "sha256": "c09eee27ab862eb388613dfb51d83a0fcc81f783b549639cfd7ec52209884fa8",
+ "reportMonth": "2023-12-01",
+ "records": 1432,
+ "kinds": {
+ "unit": 1390,
+ "summary": 42
+ }
+ },
+ {
+ "file": "MORA_December2024.xlsx",
+ "sha256": "6dcbc33f2996efee9a49a863b76234876410b8b97a3099433b0aa618dc03b5c3",
+ "reportMonth": "2024-12-01",
+ "records": 1669,
+ "kinds": {
+ "unit": 1636,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_December2025.xlsx",
+ "sha256": "747e6143310d18277698587d5d36e65e5d078141b41101294ea15f2ebae2fcbf",
+ "reportMonth": "2025-12-01",
+ "records": 1788,
+ "kinds": {
+ "unit": 1758,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_February2024.xlsx",
+ "sha256": "27438c0ef50a25d6fcfd610213043ed93c70f928fdce490f2d6a7108b5d8177c",
+ "reportMonth": "2024-02-01",
+ "records": 1468,
+ "kinds": {
+ "unit": 1435,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_February2026.xlsx",
+ "sha256": "6d77b784cfac49ee55671dfacd037720fc8452eef0527a87328daa95189cf6b1",
+ "reportMonth": "2026-02-01",
+ "records": 1798,
+ "kinds": {
+ "unit": 1768,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_January2024.xlsx",
+ "sha256": "72be33b6341553a9e18b5a8e5340bdda37ec499ab38588213d8f401f4cf0b016",
+ "reportMonth": "2024-01-01",
+ "records": 1439,
+ "kinds": {
+ "unit": 1406,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_January2025.xlsx",
+ "sha256": "102fa1b7f8b90723fe9e1c7355147f41fee2209bd769f16c181c52cd033094e4",
+ "reportMonth": "2025-01-01",
+ "records": 1683,
+ "kinds": {
+ "unit": 1650,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_January2026.xlsx",
+ "sha256": "17faffa3b926100c242336bb4c2b72922e83f4bfa000f778847802c0fc0b6125",
+ "reportMonth": "2026-01-01",
+ "records": 1797,
+ "kinds": {
+ "unit": 1767,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_July2024.xlsx",
+ "sha256": "40dc306a5bd647f434334fddef75f7ce5f87bcc6496ab92bae2b1b689afa2b75",
+ "reportMonth": "2024-07-01",
+ "records": 1550,
+ "kinds": {
+ "unit": 1517,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_July2025.xlsx",
+ "sha256": "1096b3386aa55c55857b4846e775e28b009175b54fa05deffcd7380f687e9d67",
+ "reportMonth": "2025-07-01",
+ "records": 1656,
+ "kinds": {
+ "unit": 1625,
+ "summary": 31
+ }
+ },
+ {
+ "file": "MORA_July2026.xlsx",
+ "sha256": "5bbac07bb05360bb755aa66777aff30da772f0a0e3c51cd99296c02c012e7328",
+ "reportMonth": "2026-07-01",
+ "records": 1863,
+ "kinds": {
+ "unit": 1833,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_June2024.xlsx",
+ "sha256": "eab706971b4853602f71760d5d01108003c9bccdf63eafa3d5e458c4ef66922d",
+ "reportMonth": "2024-06-01",
+ "records": 1536,
+ "kinds": {
+ "unit": 1503,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_June2025.xlsx",
+ "sha256": "0017de75216f284bcdf1d98c58be2275fb25e0514ec215ff5b179bd9a7e47b38",
+ "reportMonth": "2025-06-01",
+ "records": 1643,
+ "kinds": {
+ "unit": 1613,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_June2026.xlsx",
+ "sha256": "c7932aaa846dbad76f5fbab8d7cf7ff9846d6fc4e7b717ac04edd4df2e023622",
+ "reportMonth": "2026-06-01",
+ "records": 1848,
+ "kinds": {
+ "unit": 1818,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_March2024.xlsx",
+ "sha256": "cb034be04a07b31c2d71660419a335916b66cb9c976c50f04242db4e7d79f80c",
+ "reportMonth": "2024-03-01",
+ "records": 1506,
+ "kinds": {
+ "unit": 1473,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_March2025.xlsx",
+ "sha256": "09e5c728158d48f5bcc7ca59428da8a3983cf4d4f9eab9c12ee475037ec45f5c",
+ "reportMonth": "2025-03-01",
+ "records": 1621,
+ "kinds": {
+ "unit": 1590,
+ "summary": 31
+ }
+ },
+ {
+ "file": "MORA_March2026.xlsx",
+ "sha256": "8e2ea66027e8feb80e6f29f05e72a5d6626ada616c953c50785b4e3cba261e61",
+ "reportMonth": "2026-03-01",
+ "records": 1805,
+ "kinds": {
+ "unit": 1775,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_May2024.xlsx",
+ "sha256": "9ebdf7954d35759902c6c7a6ff78bf84526f7157b1532a1a994a0796a8a51985",
+ "reportMonth": "2024-05-01",
+ "records": 1526,
+ "kinds": {
+ "unit": 1493,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_May2025.xlsx",
+ "sha256": "cf78cfe488c09b4ec856868d6a8b7e43558dddc91bfa91aa4650aadebcaecde7",
+ "reportMonth": "2025-05-01",
+ "records": 1623,
+ "kinds": {
+ "unit": 1591,
+ "summary": 32
+ }
+ },
+ {
+ "file": "MORA_May2026.xlsx",
+ "sha256": "2935c5ef1050c85f7ce0345aec9b045f21a560b0dc9200907d7e3a0daeb5deec",
+ "reportMonth": "2026-05-01",
+ "records": 1833,
+ "kinds": {
+ "unit": 1803,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_November2024.xlsx",
+ "sha256": "a25b8f0c32e243f08c2f82f610bc1cdb8d581530db9fe3970c4ee788aa766779",
+ "reportMonth": "2024-11-01",
+ "records": 1648,
+ "kinds": {
+ "unit": 1615,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_November2025.xlsx",
+ "sha256": "3454fca0408809b2cd53e1444852b723f3230d6ae3173833a6353fe733b915ed",
+ "reportMonth": "2025-11-01",
+ "records": 1766,
+ "kinds": {
+ "unit": 1736,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_November2026.xlsx",
+ "sha256": "c219e33a65adc4f568ef8f85f7f072322cba81d1cf64fa0bda3f0c7b78391c7d",
+ "reportMonth": "2026-11-01",
+ "records": 1900,
+ "kinds": {
+ "unit": 1870,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_October2024.xlsx",
+ "sha256": "cd1cb141a3509e55e8e96c657efece688149c0febccb21f2b6eea942caeb3fcb",
+ "reportMonth": "2024-10-01",
+ "records": 1626,
+ "kinds": {
+ "unit": 1593,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_October2025.xlsx",
+ "sha256": "63179a2b73169028586a602326ec9a4a40b3c6c1534bc76d6c2aa00b6bce749e",
+ "reportMonth": "2025-10-01",
+ "records": 1717,
+ "kinds": {
+ "unit": 1687,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_October2026.xlsx",
+ "sha256": "feb81bc87e9ef62bf4c3156f9e34dd13f126edd7564320cf8c2831037109c4d3",
+ "reportMonth": "2026-10-01",
+ "records": 1889,
+ "kinds": {
+ "unit": 1859,
+ "summary": 30
+ }
+ },
+ {
+ "file": "MORA_September2024.xlsx",
+ "sha256": "2a35f32c62b6526b9b42edcd99c1bb43f2206752c77e370c95032c606d1ccdf9",
+ "reportMonth": "2024-09-01",
+ "records": 1607,
+ "kinds": {
+ "unit": 1574,
+ "summary": 33
+ }
+ },
+ {
+ "file": "MORA_September2025.xlsx",
+ "sha256": "38fd590902826a3731c6c3fa1887b541e9090de843ebde25b7d5138c0fcdd844",
+ "reportMonth": "2025-09-01",
+ "records": 1701,
+ "kinds": {
+ "unit": 1670,
+ "summary": 31
+ }
+ },
+ {
+ "file": "MORA_September2026.xlsx",
+ "sha256": "de004e9e58ab4826ac74858ffb117568a68c06a82cbd353611def84d321574fb",
+ "reportMonth": "2026-09-01",
+ "records": 1884,
+ "kinds": {
+ "unit": 1854,
+ "summary": 30
+ }
+ },
+ {
+ "file": "mora_february2025.xlsx",
+ "sha256": "4775ab159650c637f27db0de9b5f43eec82f1182a1d1242ff448d217ffa71fff",
+ "reportMonth": "2025-02-01",
+ "records": 1598,
+ "kinds": {
+ "unit": 1566,
+ "summary": 32
+ }
+ }
+ ],
+ "records": 61949,
+ "kinds": {
+ "unit": 60766,
+ "summary": 1183
+ },
+ "inServiceTypes": {
+ "int": 60331,
+ "NoneType": 1335,
+ "str": 3,
+ "date": 280
+ },
+ "missingCapacityValues": {
+ "installedCapacityMW": 87,
+ "reportedCapacityMW": 14
+ },
+ "missingCategory": {
+ "MORA_October2025.xlsx": 402
+ },
+ "firstMonth": "2023-12-01",
+ "lastMonth": "2026-11-01",
+ "uniqueMonths": 36,
+ "comparison": "Every B:J resource field, source row, category, report month, rating label and footer note compared against original openpyxl cells. Source row selection and expected values do not use SDK parsing helpers. Unheaded K+ helper cells are outside the published table."
+ },
+ "fixtures": [
+ {
+ "path": "tools/inputs/public-tables/mora-percentiles.zip",
+ "usage": "Reuse the nine complete original workbooks already retained for percentile tests."
+ },
+ {
+ "path": "tools/inputs/public-tables/mora-resources.zip",
+ "bytes": 900290,
+ "sha256": "7e94dadd5f2e53a93aa401bb241287053fbc6bd73a9f4c238a9160cf1a04381a",
+ "files": [
+ {
+ "member": "MORA_July2025.xlsx",
+ "bytes": 317211,
+ "sha256": "1096b3386aa55c55857b4846e775e28b009175b54fa05deffcd7380f687e9d67"
+ },
+ {
+ "member": "MORA_October2025.xlsx",
+ "bytes": 344999,
+ "sha256": "63179a2b73169028586a602326ec9a4a40b3c6c1534bc76d6c2aa00b6bce749e"
+ },
+ {
+ "member": "MORA_January2026.xlsx",
+ "bytes": 405030,
+ "sha256": "17faffa3b926100c242336bb4c2b72922e83f4bfa000f778847802c0fc0b6125"
+ }
+ ],
+ "records": 5170,
+ "kinds": {
+ "unit": 5079,
+ "summary": 91
+ },
+ "selection": "Three complete original workbooks, byte-for-byte, covering service dates, a missing initial category heading and unheaded helper columns. Other resource tests reuse the complete originals in mora-percentiles.zip."
+ }
+ ],
+ "decoder": {
+ "path": "tinyercot/_mora.py",
+ "sha256": "90bc83dd6246e14bcfd25fc6adc9f555a8a71ed7c009d8b241c25b9f988b888a"
+ },
+ "limitations": [
+ "Counts are report rows, not unique units; repeated monthly records and both December 2023 versions remain separate.",
+ "Resource Details B:J only. Other MORA monthly-outlook and category-summary tables remain outside this reader.",
+ "Summary classification includes coded totals, contributions and adjustments. The original summary rows lack INR, county, zone and service fields.",
+ "Forecast capacity and service fields do not prove actual availability. Category and source rating labels retain their original meaning.",
+ "Report labels and URL dates do not establish point-in-time public availability."
+ ]
+}
diff --git a/tools/inputs/public-mora-risk-evidence.json b/tools/inputs/public-mora-risk-evidence.json
new file mode 100644
index 00000000..97aa9769
--- /dev/null
+++ b/tools/inputs/public-mora-risk-evidence.json
@@ -0,0 +1,46 @@
+{
+ "files": [
+ {
+ "url": "https://www.ercot.com/files/docs/2026/04/02/MORA_June2026.xlsx",
+ "title": "Monthly Outlook for Resource Adequacy (MORA) June 2026",
+ "sha256": "c7932aaa846dbad76f5fbab8d7cf7ff9846d6fc4e7b717ac04edd4df2e023622",
+ "member": "MORA_June2026.xlsx",
+ "fixture": "public-tables/mora-risk.zip"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2026/08/07/MORA_October2026.xlsx",
+ "title": "Monthly Outlook for Resource Adequacy (MORA) October 2026",
+ "sha256": "feb81bc87e9ef62bf4c3156f9e34dd13f126edd7564320cf8c2831037109c4d3",
+ "member": "MORA_October2026.xlsx",
+ "fixture": "public-tables/mora-risk.zip"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2026/09/03/MORA_November2026.xlsx",
+ "title": "Monthly Outlook for Resource Adequacy (MORA) November 2026",
+ "sha256": "c219e33a65adc4f568ef8f85f7f072322cba81d1cf64fa0bda3f0c7b78391c7d",
+ "member": "MORA_November2026.xlsx",
+ "fixture": "public-tables/mora-percentiles.zip"
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/01/04/MORA_March2024.xlsx",
+ "title": "Monthly Outlook for Resource Adequacy (MORA) March 2024",
+ "sha256": "cb034be04a07b31c2d71660419a335916b66cb9c976c50f04242db4e7d79f80c",
+ "member": "MORA_March2024.xlsx",
+ "fixture": "public-tables/mora-summaries.zip"
+ }
+ ],
+ "verification": {
+ "originalWorkbooksChecked": 37,
+ "workbooksWithNumericCurves": 3,
+ "pointRecords": 72,
+ "numericCoordinates": 144,
+ "comparison": "All original chart cache coordinates compared as Decimal with the standalone source XML inventory; chart and scenario hours, fixed BESS inputs and original context retained."
+ },
+ "limits": [
+ "Curves are conditional PRRM simulations, not realized outcomes or an unconditional market forecast.",
+ "All three scenario notes specify 10000 runs.",
+ "November chart hour 20:00 conflicts with scenario hour 19:00; both are retained.",
+ "Reports with raster-only risk profiles have no numeric curve records.",
+ "The reporting month and file link do not establish public availability."
+ ]
+}
diff --git a/tools/inputs/public-mora-summaries-evidence.json b/tools/inputs/public-mora-summaries-evidence.json
new file mode 100644
index 00000000..cf662421
--- /dev/null
+++ b/tools/inputs/public-mora-summaries-evidence.json
@@ -0,0 +1,463 @@
+{
+ "checkedAt": "2026-09-08T10:18:49.064319+00:00",
+ "indexUrl": "https://www.ercot.com/gridinfo/resource",
+ "sourceManifest": "public-mora-percentiles-evidence.json (same 37 original workbook URLs, byte sizes and SHA-256 hashes)",
+ "comparison": {
+ "files": [
+ {
+ "file": "MORA_Apr2024.xlsx",
+ "sha256": "d7f946ec8dfe60a0e3e693332359ee2d0cdfdf1bc9c9dcf5a346fe2e071e0ba2",
+ "reportMonth": "2024-04-01",
+ "capacityRows": 39,
+ "installedCapacityValues": 39,
+ "availableCapacityValues": 78,
+ "balanceRows": 27,
+ "balanceValues": 54
+ },
+ {
+ "file": "MORA_April2025.xlsx",
+ "sha256": "a6d686843c9e82e3b26d1d77948a2f1b8f53ce11d1dbc04586a04e8a027cb10e",
+ "reportMonth": "2025-04-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_April2026.xlsx",
+ "sha256": "ceede0527fa894ed2cc1f84ea2269ab3f2408a13c45a894e5f83d7fc7a6d9ea5",
+ "reportMonth": "2026-04-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_August2024.xlsx",
+ "sha256": "7220ed1ce0a99f367fd0ffb2af007c087a0c9a0134ccfe71c30cc2b4f66abb3c",
+ "reportMonth": "2024-08-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_August2025.xlsx",
+ "sha256": "8828d0e39933acffcf85c0ce4869a98009dfade35694f6ff7f9c581d7ae354ca",
+ "reportMonth": "2025-08-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 26,
+ "balanceValues": 26
+ },
+ {
+ "file": "MORA_August2026.xlsx",
+ "sha256": "4385cb7a9b0306855d7838ca10b41da47e15b940ce9f7761c2577446f3fcccd0",
+ "reportMonth": "2026-08-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_December2023.xlsx",
+ "sha256": "c51d068752de8d710574bd0ad803a5ef96a36e8dfe2e16da5d31638578a56c5d",
+ "reportMonth": "2023-12-01",
+ "capacityRows": 42,
+ "installedCapacityValues": 42,
+ "availableCapacityValues": 84,
+ "balanceRows": 21,
+ "balanceValues": 42
+ },
+ {
+ "file": "MORA_December2023_v2.xlsx",
+ "sha256": "c09eee27ab862eb388613dfb51d83a0fcc81f783b549639cfd7ec52209884fa8",
+ "reportMonth": "2023-12-01",
+ "capacityRows": 42,
+ "installedCapacityValues": 42,
+ "availableCapacityValues": 84,
+ "balanceRows": 21,
+ "balanceValues": 42
+ },
+ {
+ "file": "MORA_December2024.xlsx",
+ "sha256": "6dcbc33f2996efee9a49a863b76234876410b8b97a3099433b0aa618dc03b5c3",
+ "reportMonth": "2024-12-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_December2025.xlsx",
+ "sha256": "747e6143310d18277698587d5d36e65e5d078141b41101294ea15f2ebae2fcbf",
+ "reportMonth": "2025-12-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_February2024.xlsx",
+ "sha256": "27438c0ef50a25d6fcfd610213043ed93c70f928fdce490f2d6a7108b5d8177c",
+ "reportMonth": "2024-02-01",
+ "capacityRows": 39,
+ "installedCapacityValues": 39,
+ "availableCapacityValues": 78,
+ "balanceRows": 27,
+ "balanceValues": 54
+ },
+ {
+ "file": "MORA_February2026.xlsx",
+ "sha256": "6d77b784cfac49ee55671dfacd037720fc8452eef0527a87328daa95189cf6b1",
+ "reportMonth": "2026-02-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_January2024.xlsx",
+ "sha256": "72be33b6341553a9e18b5a8e5340bdda37ec499ab38588213d8f401f4cf0b016",
+ "reportMonth": "2024-01-01",
+ "capacityRows": 42,
+ "installedCapacityValues": 42,
+ "availableCapacityValues": 84,
+ "balanceRows": 27,
+ "balanceValues": 54
+ },
+ {
+ "file": "MORA_January2025.xlsx",
+ "sha256": "102fa1b7f8b90723fe9e1c7355147f41fee2209bd769f16c181c52cd033094e4",
+ "reportMonth": "2025-01-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_January2026.xlsx",
+ "sha256": "17faffa3b926100c242336bb4c2b72922e83f4bfa000f778847802c0fc0b6125",
+ "reportMonth": "2026-01-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_July2024.xlsx",
+ "sha256": "40dc306a5bd647f434334fddef75f7ce5f87bcc6496ab92bae2b1b689afa2b75",
+ "reportMonth": "2024-07-01",
+ "capacityRows": 39,
+ "installedCapacityValues": 39,
+ "availableCapacityValues": 78,
+ "balanceRows": 27,
+ "balanceValues": 54
+ },
+ {
+ "file": "MORA_July2025.xlsx",
+ "sha256": "1096b3386aa55c55857b4846e775e28b009175b54fa05deffcd7380f687e9d67",
+ "reportMonth": "2025-07-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 26,
+ "balanceValues": 26
+ },
+ {
+ "file": "MORA_July2026.xlsx",
+ "sha256": "5bbac07bb05360bb755aa66777aff30da772f0a0e3c51cd99296c02c012e7328",
+ "reportMonth": "2026-07-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_June2024.xlsx",
+ "sha256": "eab706971b4853602f71760d5d01108003c9bccdf63eafa3d5e458c4ef66922d",
+ "reportMonth": "2024-06-01",
+ "capacityRows": 39,
+ "installedCapacityValues": 39,
+ "availableCapacityValues": 78,
+ "balanceRows": 27,
+ "balanceValues": 54
+ },
+ {
+ "file": "MORA_June2025.xlsx",
+ "sha256": "0017de75216f284bcdf1d98c58be2275fb25e0514ec215ff5b179bd9a7e47b38",
+ "reportMonth": "2025-06-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_June2026.xlsx",
+ "sha256": "c7932aaa846dbad76f5fbab8d7cf7ff9846d6fc4e7b717ac04edd4df2e023622",
+ "reportMonth": "2026-06-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_March2024.xlsx",
+ "sha256": "cb034be04a07b31c2d71660419a335916b66cb9c976c50f04242db4e7d79f80c",
+ "reportMonth": "2024-03-01",
+ "capacityRows": 39,
+ "installedCapacityValues": 39,
+ "availableCapacityValues": 78,
+ "balanceRows": 27,
+ "balanceValues": 54
+ },
+ {
+ "file": "MORA_March2025.xlsx",
+ "sha256": "09e5c728158d48f5bcc7ca59428da8a3983cf4d4f9eab9c12ee475037ec45f5c",
+ "reportMonth": "2025-03-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_March2026.xlsx",
+ "sha256": "8e2ea66027e8feb80e6f29f05e72a5d6626ada616c953c50785b4e3cba261e61",
+ "reportMonth": "2026-03-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_May2024.xlsx",
+ "sha256": "9ebdf7954d35759902c6c7a6ff78bf84526f7157b1532a1a994a0796a8a51985",
+ "reportMonth": "2024-05-01",
+ "capacityRows": 39,
+ "installedCapacityValues": 39,
+ "availableCapacityValues": 78,
+ "balanceRows": 27,
+ "balanceValues": 54
+ },
+ {
+ "file": "MORA_May2025.xlsx",
+ "sha256": "cf78cfe488c09b4ec856868d6a8b7e43558dddc91bfa91aa4650aadebcaecde7",
+ "reportMonth": "2025-05-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_May2026.xlsx",
+ "sha256": "2935c5ef1050c85f7ce0345aec9b045f21a560b0dc9200907d7e3a0daeb5deec",
+ "reportMonth": "2026-05-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_November2024.xlsx",
+ "sha256": "a25b8f0c32e243f08c2f82f610bc1cdb8d581530db9fe3970c4ee788aa766779",
+ "reportMonth": "2024-11-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_November2025.xlsx",
+ "sha256": "3454fca0408809b2cd53e1444852b723f3230d6ae3173833a6353fe733b915ed",
+ "reportMonth": "2025-11-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 27,
+ "balanceValues": 27
+ },
+ {
+ "file": "MORA_November2026.xlsx",
+ "sha256": "c219e33a65adc4f568ef8f85f7f072322cba81d1cf64fa0bda3f0c7b78391c7d",
+ "reportMonth": "2026-11-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 26,
+ "balanceValues": 26
+ },
+ {
+ "file": "MORA_October2024.xlsx",
+ "sha256": "cd1cb141a3509e55e8e96c657efece688149c0febccb21f2b6eea942caeb3fcb",
+ "reportMonth": "2024-10-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_October2025.xlsx",
+ "sha256": "63179a2b73169028586a602326ec9a4a40b3c6c1534bc76d6c2aa00b6bce749e",
+ "reportMonth": "2025-10-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 26,
+ "balanceValues": 26
+ },
+ {
+ "file": "MORA_October2026.xlsx",
+ "sha256": "feb81bc87e9ef62bf4c3156f9e34dd13f126edd7564320cf8c2831037109c4d3",
+ "reportMonth": "2026-10-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 26,
+ "balanceValues": 26
+ },
+ {
+ "file": "MORA_September2024.xlsx",
+ "sha256": "2a35f32c62b6526b9b42edcd99c1bb43f2206752c77e370c95032c606d1ccdf9",
+ "reportMonth": "2024-09-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ },
+ {
+ "file": "MORA_September2025.xlsx",
+ "sha256": "38fd590902826a3731c6c3fa1887b541e9090de843ebde25b7d5138c0fcdd844",
+ "reportMonth": "2025-09-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 26,
+ "balanceValues": 26
+ },
+ {
+ "file": "MORA_September2026.xlsx",
+ "sha256": "de004e9e58ab4826ac74858ffb117568a68c06a82cbd353611def84d321574fb",
+ "reportMonth": "2026-09-01",
+ "capacityRows": 41,
+ "installedCapacityValues": 41,
+ "availableCapacityValues": 41,
+ "balanceRows": 26,
+ "balanceValues": 26
+ },
+ {
+ "file": "mora_february2025.xlsx",
+ "sha256": "4775ab159650c637f27db0de9b5f43eec82f1182a1d1242ff448d217ffa71fff",
+ "reportMonth": "2025-02-01",
+ "capacityRows": 40,
+ "installedCapacityValues": 40,
+ "availableCapacityValues": 40,
+ "balanceRows": 28,
+ "balanceValues": 28
+ }
+ ],
+ "counts": {
+ "capacityRows": 1494,
+ "installedCapacityValues": 1494,
+ "availableCapacityValues": 1854,
+ "balanceRows": 990,
+ "balanceValues": 1221
+ },
+ "metricRows": {
+ "average_weather_load": 37,
+ "large_load_adjustment": 10,
+ "total_load": 20,
+ "dispatchable_capacity": 37,
+ "thermal_capacity": 24,
+ "storage_capacity": 37,
+ "hydro_capacity": 37,
+ "thermal_outages": 37,
+ "planned_thermal_outages": 37,
+ "unplanned_thermal_outages": 37,
+ "available_dispatchable_capacity": 37,
+ "wind_capacity": 37,
+ "solar_capacity": 37,
+ "available_non_dispatchable_capacity": 37,
+ "dc_tie_net_imports": 37,
+ "available_resources": 37,
+ "emergency_response_service": 35,
+ "distribution_voltage_reduction": 35,
+ "large_load_curtailment": 25,
+ "emergency_resources_before_eea": 37,
+ "responsive_reserve_load_resources": 35,
+ "non_spin_load_resources": 35,
+ "ecrs_load_resources": 35,
+ "emergency_resources_during_eea": 37,
+ "total_emergency_resources": 37,
+ "normal_condition_reserves": 37,
+ "emergency_condition_reserves": 37,
+ "large_flexible_load_adjustment": 10,
+ "tdsp_load_management": 27,
+ "thermal_capacity_excluding_emergency_agreements": 13,
+ "rmr_and_other_agreement_capacity": 13,
+ "crypto_demand_response": 4,
+ "large_flexible_load_curtailment": 3
+ },
+ "scenarioTimeZones": {
+ "None": 840,
+ "CDT": 1692,
+ "CST": 543
+ },
+ "comparison": "Every numeric source cell in both sheets compared to the typed reader, with source-row completeness, source labels, report dates, notes, scenario columns, clocks/time-zone labels and resource hierarchy checked independently against original openpyxl cells. No SDK parsing helpers used for expected values."
+ },
+ "fixtures": {
+ "reused": [
+ "tools/inputs/public-tables/mora-percentiles.zip",
+ "tools/inputs/public-tables/mora-resources.zip"
+ ],
+ "added": {
+ "path": "tools/inputs/public-tables/mora-summaries.zip",
+ "bytes": 255089,
+ "sha256": "7747b972b83e9e9548213eccc4eea2e6090d8727bcb6573a548730ee8ce1848b",
+ "files": [
+ {
+ "member": "MORA_March2024.xlsx",
+ "bytes": 287785,
+ "sha256": "cb034be04a07b31c2d71660419a335916b66cb9c976c50f04242db4e7d79f80c"
+ }
+ ],
+ "selection": "Complete original March 2024 workbook; captures a missing expected-capacity heading and distinct early/late March scenarios. Other summary tests reuse originals already retained in mora-percentiles.zip and mora-resources.zip."
+ },
+ "totalWorkbooks": 13,
+ "capacityRows": 526,
+ "availableCapacityValues": 727,
+ "balanceRows": 338,
+ "balanceValues": 461,
+ "distinctBalanceMetrics": 33
+ },
+ "decoder": {
+ "path": "tinyercot/_mora.py",
+ "sha256": "93343786c43ff1d00c6bac1938dcd85aa8b0e0b0b6f0e9bba376e282a765a9af"
+ },
+ "limitations": [
+ "Category capacities and the numeric Loads and Resources table only; embedded risk-chart and probability-image contents are not covered.",
+ "Scenario columns may represent different hours or different conditions at the same hour. Original labels stay separate.",
+ "Original category indentation defines overlapping parent/child rows; installed capacity is not repeated for each scenario.",
+ "These are forecasts and scenario assumptions, not measured demand, generation or reserves. Changes in metric definitions and footnotes remain explicit.",
+ "Missing zone labels remain None. Reporting months and original file names do not prove point-in-time public availability."
+ ]
+}
diff --git a/tools/inputs/public-retail-transactions-evidence.json b/tools/inputs/public-retail-transactions-evidence.json
new file mode 100644
index 00000000..60b57b43
--- /dev/null
+++ b/tools/inputs/public-retail-transactions-evidence.json
@@ -0,0 +1,118 @@
+{
+ "checkedAt": "2026-09-08T09:02:36.579568+00:00",
+ "indexUrl": "https://www.ercot.com/mktinfo/retail",
+ "files": [
+ {
+ "title": "Retail Monthly Transaction Totals",
+ "url": "https://www.ercot.com/files/docs/2025/01/02/August-2026-Retail-Monthly-Transaction-Totals.zip"
+ }
+ ],
+ "comparison": {
+ "source": "August-2026-Retail-Monthly-Transaction-Totals.zip",
+ "bytes": 2050726,
+ "sha256": "ba854c65782b91ae5f75c25d18329d04c656ce765caa127866bcc98c3821d8df",
+ "counts": {
+ "workbooks": 20,
+ "sheets": 444,
+ "records": 9126,
+ "dailyCounts": 277433,
+ "reportedTotals": 9126,
+ "reportedAverages": 9126,
+ "grandTotalRows": 444,
+ "unnamedCategoryRows": 8
+ },
+ "firstDay": "2025-01-01",
+ "lastDay": "2026-08-31",
+ "uniqueDays": 608,
+ "months": 20,
+ "categories": 24,
+ "transactionCodes": 30,
+ "comparison": "Every original daily count, reported total/average, header date, transaction code and member/sheet identity independently compared using openpyxl without SDK helpers for expected values."
+ },
+ "sourceSummaryChecks": {
+ "stats": {
+ "dailyCells": 277433,
+ "totalCells": 9126,
+ "averageCells": 9126,
+ "averageRounded": 8848
+ },
+ "anomalies": [],
+ "totalMismatchExamples": []
+ },
+ "fixture": {
+ "path": "tools/inputs/public-tables/retail-transactions.zip",
+ "bytes": 507708,
+ "sha256": "270ff805ad1372d722ba7c334ac365f2e8a66fcb6aec9e53065dcd59eacada76",
+ "members": [
+ {
+ "member": "2025 Retail Monthly Total Reports/1_2025 Monthly Retail Totals.xlsx",
+ "bytes": 111445,
+ "sha256": "2bb6f375f8756be49fd8c49fefeffbc4d55b2e15ab3916e1d21e536aa3f38a93"
+ },
+ {
+ "member": "2025 Retail Monthly Total Reports/4_2025 Monthly Retail Totals.xlsx",
+ "bytes": 111712,
+ "sha256": "3defc7d324fac9189fc089ff98bd8b1716d1cb37b71d388c32ce1146372861ee"
+ },
+ {
+ "member": "2025 Retail Monthly Total Reports/2_2025 Monthly Retail Totals.xlsx",
+ "bytes": 102693,
+ "sha256": "710cb9933cb3f33bf64a99444c4784bee9622d29ba370ebe8d5b26de072ff07b"
+ },
+ {
+ "member": "8_2026 Monthly Retail Totals.xlsx",
+ "bytes": 113735,
+ "sha256": "9728174c72ea5ebc82a21a4e30445f098540558abcfac4c06891ec99e5ac9ac1"
+ },
+ {
+ "member": "1_2026 Monthly Retail Totals.xlsx",
+ "bytes": 113100,
+ "sha256": "78924451c1ba9abf1b66c60073678832561b43ac77cdba397ff03d2dfceb867e"
+ }
+ ],
+ "records": 2280,
+ "sheets": 114,
+ "dailyCounts": 68864,
+ "unnamedCategoryRows": 8,
+ "transactionCodes": [
+ "814_01",
+ "814_02",
+ "814_03",
+ "814_04",
+ "814_05",
+ "814_06_MVI",
+ "814_06_SW",
+ "814_08",
+ "814_09",
+ "814_10",
+ "814_11",
+ "814_12",
+ "814_13",
+ "814_16",
+ "814_17",
+ "814_18",
+ "814_19",
+ "814_20",
+ "814_21",
+ "814_22",
+ "814_24",
+ "814_25",
+ "814_26",
+ "814_27",
+ "814_28",
+ "814_29",
+ "824_02",
+ "867_02",
+ "867_03F",
+ "867_04"
+ ],
+ "selection": "Five complete original workbooks, byte-for-byte, preserving member names: first/latest months, February, 30-day April, and both months with unnamed categories."
+ },
+ "decoderSha256": "57ef57266a352b2d69f0bfb3a5368494b5271dc8086e2a06b36b5d1e015bb285",
+ "limitations": [
+ "Aggregate transaction counts; no inferred transaction-code semantics or individual customer activity.",
+ "Source categories overlap. Four unnamed category sheets retain their exact labels.",
+ "Reported averages retain the source rounding; missing cells remain None.",
+ "Observed archive dates only; no older coverage inferred from URL dates."
+ ]
+}
diff --git a/tools/inputs/public-seasonal-tables-evidence.json b/tools/inputs/public-seasonal-tables-evidence.json
new file mode 100644
index 00000000..8be5b738
--- /dev/null
+++ b/tools/inputs/public-seasonal-tables-evidence.json
@@ -0,0 +1,42 @@
+{
+ "sourceManifest": "tools/inputs/public-seasonal-tables-sources.csv",
+ "fixtures": [
+ {
+ "path": "tools/inputs/public-tables/transmission-loss-coefficients.zip",
+ "files": 26,
+ "bytes": 584965,
+ "sha256": "e5c8dbebdcce18ea20a93e73b8e630869f90a9b09580eef19ccc228d737ca7b1"
+ },
+ {
+ "path": "tools/inputs/public-tables/load-shed.zip",
+ "files": 2,
+ "bytes": 18643,
+ "sha256": "e0cda8859c76b1806b1778e4e739ec01162ff0fe64ee4ff5e63cf794c32d3c60"
+ }
+ ],
+ "selection": "All 26 original annual coefficient workbooks and both original seasonal load-share workbooks, compressed without changing source bytes.",
+ "coefficients": {
+ "numericCells": 5682,
+ "validPeriods": 581,
+ "rows": 948,
+ "reversedPeriods": 19,
+ "missingPeriods": 348,
+ "blankCells": 6
+ },
+ "loadShares": {
+ "rows": 42,
+ "summerEffectiveFrom": "2026-04-01",
+ "winterEffectiveFrom": "2026-09-01"
+ },
+ "comparison": "Every coefficient, input load/loss factor, period, source group label, year/as-of label and missing value across all 26 original XLS/XLSX workbooks was compared independently with xlrd/openpyxl. Every operator share, effective date, heading and note in both load-shed originals was also compared.",
+ "units": "NOIE SSC * published on/off-peak load + SIC matches SONLF/SOFFLF * 100 in every populated source case. Final coefficients return percent; source loss-factor input cells retain their fractional values. ERCOT input and final correction bases remain separately labeled.",
+ "limitations": [
+ "2001-2010 workbooks omit effective-date tables; no dates are inferred from season or year.",
+ "2020 and 2026 winter ranges are reversed in the sources. Raw labels are retained; effectiveFrom/effectiveThrough are None.",
+ "LPL spring 2021 has six blank numeric cells; its area/season row is retained with None values.",
+ "The 2002 COCS coefficient columns are offset from the input columns; tables are joined by published area labels. PUB and BPUB, Rayburn, TEXLA and other original area names remain distinct.",
+ "Internal base-case and For Testing Only calculation tables remain in the downloadable originals; the reader exposes published final coefficients and their input basis.",
+ "Operator shares are published load percentages, not shed MW or outage probabilities. Tables remain effective until replaced; no end date is inferred.",
+ "As-of labels are not proof of public availability; originals and revisions are not deduplicated by year or season."
+ ]
+}
diff --git a/tools/inputs/public-seasonal-tables-sources.csv b/tools/inputs/public-seasonal-tables-sources.csv
new file mode 100644
index 00000000..4494abc6
--- /dev/null
+++ b/tools/inputs/public-seasonal-tables-sources.csv
@@ -0,0 +1,29 @@
+kind,file,url,title,sha256,bytes,rows,numericCells,blankCells
+coefficients,2026_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2026/03/06/2026_Transmission_Loss_Factors_Final.xlsx,2026 TDSP Transmission Loss Factors - Methodology,7aa9ea5c9c54fa41b47d13d3e6368fc41724163ff6510afd095d4ee7d24d1d62,32461,40,240,0
+coefficients,final2001transmissionlossfactors060101.xls,https://www.ercot.com/files/docs/2001/06/06/final2001transmissionlossfactors060101.xls,2001 TDSP Transmission Loss Factors - Methodology,32a9cf3b8ddc354b1ba626401237173436e53006a6708a6a0f965dad241c6f3d,61952,20,120,0
+coefficients,2002transmissionlossfactors.xls,https://www.ercot.com/files/docs/2002/03/19/2002transmissionlossfactors.xls,2002 TDSP Transmission Loss Factors - Methodology,58ebf126c4bf6960f88709af6a939575e7c8034d9e6ccb6141170a4598486c61,95744,40,240,0
+coefficients,2003_transmission_loss_factors.xls,https://www.ercot.com/files/docs/2002/12/27/2003_transmission_loss_factors.xls,2003 TDSP Transmission Loss Factors - Methodology,b8b510582bd72487a9c82c9337a4d9d2d70111a486339e5f21ac28333a16b4fb,88576,36,216,0
+coefficients,2004transmissionlossfactors.xls,https://www.ercot.com/files/docs/2004/01/15/2004transmissionlossfactors.xls,2004 TDSP Transmission Loss Factors - Methodology,b82ed7ea08c4431c753b1e18a1993cdb05fcff054bdd97239f7ab3cc7e9a9fa5,47616,36,216,0
+coefficients,2005transmissionlossfactors.xls,https://www.ercot.com/files/docs/2004/09/30/2005transmissionlossfactors.xls,2005 TDSP Transmission Loss Factors - Methodology,cfd353d3a4aecb07dc12b30d9ff63cbb0fe73b9f2109a36128b587545b1026db,46080,36,216,0
+coefficients,2006transmissionlossfactors.xls,https://www.ercot.com/files/docs/2006/10/26/2006transmissionlossfactors.xls,2006 TDSP Transmission Loss Factors - Methodology,9c90d2cd1b5d5d486d8cbe118e5441a66b991e81b3f519f9a9547174c5343a45,46080,36,216,0
+coefficients,2007transmissionlossfactors.xls,https://www.ercot.com/files/docs/2006/12/07/2007transmissionlossfactors.xls,2007 TDSP Transmission Loss Factors - Methodology,f6b4f4aac0eceb63929ac415e960872d4eda008a1e7a9b77c08ce41c5329ccfb,51200,36,216,0
+coefficients,2008transmissionlossfactors.xls,https://www.ercot.com/files/docs/2007/10/23/2008transmissionlossfactors.xls,2008 TDSP Transmission Loss Factors - Methodology,7481961c760345b9e972b961a1c4b35dd8759b1506260e8ad49360abdff0df07,53760,36,216,0
+coefficients,2009transmissionlossfactors.xls,https://www.ercot.com/files/docs/2008/12/10/2009transmissionlossfactors.xls,2009 TDSP Transmission Loss Factors - Methodology,3171d4ca94b650ed595194c1e412c867192eea279a89f7f9efef0c63d0728569,52224,36,216,0
+coefficients,2010transmissionlossfactors.xls,https://www.ercot.com/files/docs/2009/11/13/2010transmissionlossfactors.xls,2010 TDSP Transmission Loss Factors - Methodology,cdcd097896b4853c93ed6adc56461391cb1c0fa7f572cb26458a5fc9e3cd01d5,50176,36,216,0
+coefficients,2011TransmissionLossFactors.xls,https://www.ercot.com/files/docs/2017/01/26/2011TransmissionLossFactors.xls,2011 TDSP Transmission Loss Factors - Methodology,fe86363d12250ab9cb4ddd21c398ace767a79b600c3243db0b432cb80f23427f,58880,36,216,0
+coefficients,2012_TransmissionLossFactors.xls,https://www.ercot.com/files/docs/2017/01/26/2012_TransmissionLossFactors.xls,2012 TDSP Transmission Loss Factors - Methodology,174eb98de52a89915847cf32b757410cc867a398dd148852aabe1c88fde6a729,59392,36,216,0
+coefficients,2013_transmission_loss_factors.xls,https://www.ercot.com/files/docs/2013/12/31/2013_transmission_loss_factors.xls,2013 TDSP Transmission Loss Factors - Methodology,dcf7ef78e5598c2a144a39d4f69828c6a4956da71583010117586e946d778e45,61952,36,216,0
+coefficients,2014_transmission_loss_factors.xls,https://www.ercot.com/files/docs/2013/12/31/2014_transmission_loss_factors.xls,2014 TDSP Transmission Loss Factors - Methodology,2d86b67dee1616eaa2e2c0de489a9b5ef9db8da471c2cce77b419761dd2db835,67584,36,216,0
+coefficients,2015_Transmission_Loss_Factors.xls,https://www.ercot.com/files/docs/2017/01/26/2015_Transmission_Loss_Factors.xls,2015 TDSP Transmission Loss Factors - Methodology,386f6fd52edb92b3a01abab4dc7a5fc3cc23c4c2f9e8da434ccea142f85332f0,67584,36,216,0
+coefficients,2016_Transmission_Loss_Factors.xls,https://www.ercot.com/files/docs/2017/01/26/2016_Transmission_Loss_Factors.xls,2016 TDSP Transmission Loss Factors - Methodology,ed3e012ac93ed555be131897d3cc1faa36a90e76e4e3daacfb50814a4c67af4e,68096,36,216,0
+coefficients,2017_Transmission_Loss_Factors.xlsx,https://www.ercot.com/files/docs/2017/01/26/2017_Transmission_Loss_Factors.xlsx,2017 TDSP Transmission Loss Factors - Methodology,3ad47d3de305adcf29d6ddcede3a49171cd5b8af90fbce08563af7e17fbd9729,31512,36,216,0
+coefficients,2018_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2018/01/08/2018_Transmission_Loss_Factors_Final.xlsx,2018 TDSP Transmission Loss Factors - Methodology,db07bbf51b30c4791fb888c7fbc9d1dc829f63ccb048ce8072a51a0883f9931d,31548,36,216,0
+coefficients,2019_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2019/02/06/2019_Transmission_Loss_Factors_Final.xlsx,2019 TDSP Transmission Loss Factors - Methodology,353fd86bdd5ae08d662a41c774a385a1c69b3d8a2dd09785d19d896706875d2c,31459,36,216,0
+coefficients,2020_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2020/01/06/2020_Transmission_Loss_Factors_Final.xlsx,2020 TDSP Transmission Loss Factors - Methodology,6e0fa7df4ec37a32b6ee81ce778c37dd96bc26065fe6867c79ecbff608b27af5,31559,36,216,0
+coefficients,2021_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2021/05/25/2021_Transmission_Loss_Factors_Final.xlsx,2021 TDSP Transmission Loss Factors - Methodology,50ad559b94da4bae5086d197a87a3000cbb43531f40eff1a78d04225220c7cdf,31426,40,234,6
+coefficients,2022_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2021/12/13/2022_Transmission_Loss_Factors_Final.xlsx,2022 TDSP Transmission Loss Factors - Methodology,c98e9dca5218e06f0aae548c60de68ac140f7acb51d7abc4302a62dd009049cd,32768,40,240,0
+coefficients,2023_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2022/12/01/2023_Transmission_Loss_Factors_Final.xlsx,2023 TDSP Transmission Loss Factors – Methodology,19071fb190320e8c81787a38ae83c6a466bc068b53bc326aadd330aed84db77c,32458,40,240,0
+coefficients,2024_transmission_loss_factors_final.xlsx,https://www.ercot.com/files/docs/2025/02/17/2024_transmission_loss_factors_final.xlsx,2024 TDSP Transmission Loss Factors - Methodology,77a5b1d099bd32c4b2890b4a000f73517ea51b9609537615dfe2b6789dc9d764,32500,40,240,0
+coefficients,2025_Transmission_Loss_Factors_Final.xlsx,https://www.ercot.com/files/docs/2024/01/24/2025_Transmission_Loss_Factors_Final.xlsx,2025 TDSP Transmission Loss Factors - Methodology,1fa23b04f27990630d6c4acbf6828389de11e3ebbffab38918d2950a8d9c37e9,32584,40,240,0
+loadShares,Preliminary-Summer-Load-Shed-Table.xlsx,https://www.ercot.com/files/docs/2026/03/20/Preliminary-Summer-Load-Shed-Table.xlsx,Summer Load Shed Table,ac65200cef74f0e1c161dc06ab3fc7087a5bc9c4db58bc43c2867f067898e15c,11956,21,21,0
+loadShares,Preliminary-Winter-Load-Shed-Table.xlsx,https://www.ercot.com/files/docs/2026/08/12/Preliminary-Winter-Load-Shed-Table.xlsx,Winter Load Shed Table,0fb9e5d8ccce0e28077abd93977df675ff0650f7cd651c7783ad6d9022019c99,12535,21,21,0
diff --git a/tools/inputs/public-tables/capacity-changes.zip b/tools/inputs/public-tables/capacity-changes.zip
new file mode 100644
index 00000000..317d6eeb
Binary files /dev/null and b/tools/inputs/public-tables/capacity-changes.zip differ
diff --git a/tools/inputs/public-tables/crr-hours.xlsx b/tools/inputs/public-tables/crr-hours.xlsx
new file mode 100644
index 00000000..dc99e07c
Binary files /dev/null and b/tools/inputs/public-tables/crr-hours.xlsx differ
diff --git a/tools/inputs/public-tables/distribution-loss-coefficients.zip b/tools/inputs/public-tables/distribution-loss-coefficients.zip
new file mode 100644
index 00000000..6ce6c91f
Binary files /dev/null and b/tools/inputs/public-tables/distribution-loss-coefficients.zip differ
diff --git a/tools/inputs/public-tables/distribution-loss-index.html b/tools/inputs/public-tables/distribution-loss-index.html
new file mode 100644
index 00000000..6ffab948
--- /dev/null
+++ b/tools/inputs/public-tables/distribution-loss-index.html
@@ -0,0 +1,1674 @@
+
+
+
+
+
+
+
+
+ TDSP Distribution Loss Factors - Methodology
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
TDSP Distribution Loss Factors - Methodology
+
+
View current and historical TDSP Distribution Loss Factors - Methodology.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 31, 2025 - zip - 2.6 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 13, 2024 - zip - 3.3 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Jan 19, 2024 - zip - 2.8 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Jan 22, 2024 - zip - 2.3 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 15, 2022 - zip - 3 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 22, 2021 - zip - 2.8 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 17, 2020 - zip - 991.5 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 5, 2019 - zip - 996.9 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 19, 2018 - zip - 998.4 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 19, 2017 - zip - 6.4 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 22, 2016 - zip - 6.1 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 21, 2015 - zip - 1.6 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nov 19, 2014 - zip - 1.6 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 26, 2013 - zip - 1.5 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dec 19, 2012 - zip - 1.1 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Feb 21, 2012 - zip - 1023 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nov 12, 2010 - zip - 1016.5 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nov 17, 2009 - zip - 953.8 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 1 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 7.1 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 21, 2009 - zip - 6.1 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 6.3 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 6.3 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 6.3 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 6.3 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 6.2 MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 202.2 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oct 19, 2009 - zip - 171.6 KB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ERCOT-Lockup-white
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ © 1996-2026 Electric Reliability Council of Texas, Inc. All rights reserved.
+
+
+
+
+
+
+
+
diff --git a/tools/inputs/public-tables/indicative-ordc.zip b/tools/inputs/public-tables/indicative-ordc.zip
new file mode 100644
index 00000000..9d061328
Binary files /dev/null and b/tools/inputs/public-tables/indicative-ordc.zip differ
diff --git a/tools/inputs/public-tables/load-shed.zip b/tools/inputs/public-tables/load-shed.zip
new file mode 100644
index 00000000..550e3368
Binary files /dev/null and b/tools/inputs/public-tables/load-shed.zip differ
diff --git a/tools/inputs/public-tables/mora-percentiles.zip b/tools/inputs/public-tables/mora-percentiles.zip
new file mode 100644
index 00000000..6a7ac4f6
Binary files /dev/null and b/tools/inputs/public-tables/mora-percentiles.zip differ
diff --git a/tools/inputs/public-tables/mora-resources.zip b/tools/inputs/public-tables/mora-resources.zip
new file mode 100644
index 00000000..697deb6c
Binary files /dev/null and b/tools/inputs/public-tables/mora-resources.zip differ
diff --git a/tools/inputs/public-tables/mora-risk.zip b/tools/inputs/public-tables/mora-risk.zip
new file mode 100644
index 00000000..41790743
Binary files /dev/null and b/tools/inputs/public-tables/mora-risk.zip differ
diff --git a/tools/inputs/public-tables/mora-summaries.zip b/tools/inputs/public-tables/mora-summaries.zip
new file mode 100644
index 00000000..c3748a4b
Binary files /dev/null and b/tools/inputs/public-tables/mora-summaries.zip differ
diff --git a/tools/inputs/public-tables/polr.xlsx b/tools/inputs/public-tables/polr.xlsx
new file mode 100644
index 00000000..00c9f726
Binary files /dev/null and b/tools/inputs/public-tables/polr.xlsx differ
diff --git a/tools/inputs/public-tables/retail-transactions.zip b/tools/inputs/public-tables/retail-transactions.zip
new file mode 100644
index 00000000..591b56c0
Binary files /dev/null and b/tools/inputs/public-tables/retail-transactions.zip differ
diff --git a/tools/inputs/public-tables/transmission-loss-coefficients.zip b/tools/inputs/public-tables/transmission-loss-coefficients.zip
new file mode 100644
index 00000000..499974a9
Binary files /dev/null and b/tools/inputs/public-tables/transmission-loss-coefficients.zip differ
diff --git a/tools/inputs/public-tables/zonal-energy.zip b/tools/inputs/public-tables/zonal-energy.zip
new file mode 100644
index 00000000..ae3926ff
Binary files /dev/null and b/tools/inputs/public-tables/zonal-energy.zip differ
diff --git a/tools/inputs/public-weather-evidence.json b/tools/inputs/public-weather-evidence.json
new file mode 100644
index 00000000..5b66fe97
--- /dev/null
+++ b/tools/inputs/public-weather-evidence.json
@@ -0,0 +1,129 @@
+{
+ "checkedAt": "2026-09-08T08:00:26.411601+00:00",
+ "comparison": {
+ "archiveUrl": "https://www.ercot.com/files/docs/2002/12/11/weather1996_2000.zip",
+ "archiveSha256": "fb3ba4b632043f5239ce3da9e55ac83b9f74804ca56aeb9e50cdede67429afc1",
+ "bytes": 2301804,
+ "dayVariableRows": 58784,
+ "numericCellsCompared": 1410816,
+ "firstDate": "1996-01-01",
+ "lastDate": "2001-01-10",
+ "rowsByZone": {
+ "COAST": 7348,
+ "EAST": 7348,
+ "FWEST": 7348,
+ "NCENT": 7348,
+ "NORTH": 7348,
+ "SCENT": 7348,
+ "SOUTH": 7348,
+ "WEST": 7348
+ },
+ "rowsByVariable": {
+ "CLOUDCOVER": 14696,
+ "WINDSPEED": 14696,
+ "DEWPOINT": 14696,
+ "DRYBULB TEMP": 14696
+ },
+ "daysPerZoneAndVariable": 1837,
+ "sourceDatesConsecutive": true,
+ "sourceUnits": "Not stated in workbook headings or notes; no units inferred.",
+ "scope": "All 32 original worksheets across eight weather zones independently compared by source date, variable, zone, hour-column number, every numeric cell, and source notes. All four variables retain 24 hourly columns per published date, without timezone/DST interpretation."
+ },
+ "fixture": {
+ "path": "weather/historical.zip",
+ "sha256": "405d824d1587411933a3b0d4e1a2e6f97556bfa2e4ed2658bcfe48c9aeaaa74e",
+ "bytes": 18440,
+ "method": "Original introductory notes and hour headers plus six selected dates from all 32 worksheets; cached values, filenames and worksheet names preserved with xlwt. Dates include leap day, both DST transition dates, year end and the final January 2001 date.",
+ "workbooks": [
+ {
+ "member": "Weather '96-'00 Coast.xls",
+ "sourceSha256": "311d1dc0b6ea97fb409078de82d7ee491fad6736836a709c46f7b2d3734138c2",
+ "sheets": [
+ "CLOUDCOVER",
+ "WINDSPEED",
+ "DEWPOINT",
+ "DRYBULB TEMP"
+ ]
+ },
+ {
+ "member": "Weather '96-'00 East.xls",
+ "sourceSha256": "9a9b9be0314c2b277875bfd32b4991718aea0be3911a8483f5fefe1eedf53ae7",
+ "sheets": [
+ "CLOUDCOVER",
+ "DEWPOINT",
+ "DRYBULB TEMP",
+ "WINDSPEED"
+ ]
+ },
+ {
+ "member": "Weather '96-'00 FarWest.xls",
+ "sourceSha256": "6438e5f5001d6ba79b3edeb5e0e98ee2750c6ada308c37c3b1e1271d6b234cdf",
+ "sheets": [
+ "CLOUDCOVER",
+ "DEWPOINT",
+ "WINDSPEED",
+ "DRYBULB TEMP"
+ ]
+ },
+ {
+ "member": "Weather '96-'00 North Central.xls",
+ "sourceSha256": "ca62de0b6c1f5a8996313e5a65222bc8529b7da7345f7add61fb3f2b37577df5",
+ "sheets": [
+ "CLOUDCOVER",
+ "WINDSPEED",
+ "DEWPOINT",
+ "DRYBULB TEMP"
+ ]
+ },
+ {
+ "member": "Weather '96-'00 North.xls",
+ "sourceSha256": "6c37008378e1115bbd3d74f2f6c74532a6e33122647805750caff6c9e7f7ce9c",
+ "sheets": [
+ "CLOUDCOVER",
+ "DEWPOINT",
+ "WINDSPEED",
+ "DRYBULB TEMP"
+ ]
+ },
+ {
+ "member": "Weather '96-'00 South Central.xls",
+ "sourceSha256": "e5f3a15b57a6c157249eeacb2bdc75d5f3093c449a6a45c358750756e5d552ec",
+ "sheets": [
+ "CLOUDCOVER",
+ "WINDSPEED",
+ "DEWPOINT",
+ "DRYBULB TEMP"
+ ]
+ },
+ {
+ "member": "Weather '96-'00 South.xls",
+ "sourceSha256": "1425e8cfbef09f8b454a82b32c7d3e7453dafa5565e2da86d003e359d031d9cf",
+ "sheets": [
+ "CLOUDCOVER",
+ "WINDSPEED",
+ "DEWPOINT",
+ "DRYBULB TEMP"
+ ]
+ },
+ {
+ "member": "Weather '96-'00 West.xls",
+ "sourceSha256": "5739594417e9e0c65b820fc54e64faaf02c2a571e16dc7a552455416507c38d8",
+ "sheets": [
+ "CLOUDCOVER",
+ "WINDSPEED",
+ "DEWPOINT",
+ "DRYBULB TEMP"
+ ]
+ }
+ ],
+ "selectedDates": [
+ "1996-01-01",
+ "1996-02-29",
+ "1996-04-07",
+ "1996-10-27",
+ "2000-12-31",
+ "2001-01-10"
+ ]
+ },
+ "decoderSha256": "d9d2b229ea5dd32ddbdc93a8ca13c2003f8d34dd991eb75c6b73c82a30b703d8"
+}
diff --git a/tools/inputs/public-zonal-energy-evidence.json b/tools/inputs/public-zonal-energy-evidence.json
new file mode 100644
index 00000000..bc4e3f41
--- /dev/null
+++ b/tools/inputs/public-zonal-energy-evidence.json
@@ -0,0 +1,31 @@
+{
+ "source": "https://www.ercot.com/mktinfo/data_agg",
+ "files": 10,
+ "fileYears": [
+ 2001,
+ 2005
+ ],
+ "counts": {
+ "days": 13886,
+ "intervalCells": 1361260,
+ "numericIntervals": 1332244,
+ "sourceNumbers": 1170,
+ "unlabelledIntervalRows": 9,
+ "totals": 88,
+ "summaryTotals": 52,
+ "totalIntervalCells": 96,
+ "totalSourceNumbers": 1
+ },
+ "fixtures": "All ten complete original workbooks, unchanged, including summaries and duplicate raw sheets. Discovery reuses the 26 original aggregation index fixtures.",
+ "limits": [
+ "2001 generation starts July 31; load starts August 1.",
+ "2005 generation is missing June 22 through July 28 in all five zones.",
+ "Raw generation sheets for 2001-2004 duplicate the reported daily interval values; only the reported daily tables are emitted.",
+ "Nine load rows have 100 values under 96 interval headers; all values remain, with unknown clock labels.",
+ "805 additional generation numbers are not treated as interval energy.",
+ "2003 W03 uses an ORIGIN header over numeric values; they remain sourceNumbers, not silently relabeled totals.",
+ "Source cached totals and shares are not recalculated or reconciled.",
+ "Numeric energy cells with accidental Excel date formats remain their original numbers.",
+ "Vintage zone codes, clock positions and source timestamps do not establish modern-zone mappings or public availability."
+ ]
+}
diff --git a/tools/inputs/public-zonal-energy-sources.csv b/tools/inputs/public-zonal-energy-sources.csv
new file mode 100644
index 00000000..750d8854
--- /dev/null
+++ b/tools/inputs/public-zonal-energy-sources.csv
@@ -0,0 +1,11 @@
+url,title,bytes,sha256,member,days,intervalCells,numericIntervals,sourceNumbers,unlabelledIntervalRows,totals,summaryTotals,totalIntervalCells,totalSourceNumbers
+https://www.ercot.com/files/docs/2005/09/23/2001_generation_mwh_by_cmzone.xls,2001 Generation MWh by CM Zone,1696768,209aaf34d622f1bc3b5060066b4abf1077d44ac90033df2d23151a3e3527cca2,2001_generation_mwh_by_cmzone.xls,462,46200,44352,0,0,5,4,0,0
+https://www.ercot.com/files/docs/2006/06/27/2001_load_mwh_by_cmzone.xls,2001 Load MWh by CMZone,844288,d7c09adf37b34e245307c89ea3368247fc9fa15a19044a7401859ed5c17df020,2001_load_mwh_by_cmzone.xls,459,44064,44064,0,0,10,4,96,0
+https://www.ercot.com/files/docs/2005/09/23/2002_generation_mwh_by_cmzone.xls,2002 Generation MWh by CM Zone,5319680,f0bde840a519c45c304115edc8fdda9e763fc05b34897379eb1a11c77c9c51dd,2002_generation_mwh_by_cmzone.xls,1460,146000,140144,0,0,6,5,0,0
+https://www.ercot.com/files/docs/2006/06/27/2002_load_mwh_by_cmzone.xls,2002 Load MWh by CMZone,2644480,d064bd5301da74cdc5fd763ed8954cd2806918443b0dc913d31cf2b03f858c3e,2002_load_mwh_by_cmzone.xls,1460,140160,140160,0,0,10,5,0,0
+https://www.ercot.com/files/docs/2005/09/23/2003_generation_mwh_by_cmzone.xls,2003 Generation MWh by CM Zone,5319680,c4af4a79562502dcbe7a782874480aa29fbf101748331d8d9f1c1340605e47be,2003_generation_mwh_by_cmzone.xls,1460,146000,140144,0,0,6,5,0,0
+https://www.ercot.com/files/docs/2005/10/03/2003_load_mwh_by_cmzone.xls,2003 Load MWh by CM Zone,5425664,22ce81b8d4ec23663261316b3b0db2f064663c5b1f5fb4056db3481a01d2ceeb,2003_load_mwh_by_cmzone.xls,1460,140176,140160,365,4,9,5,0,1
+https://www.ercot.com/files/docs/2005/09/23/2004_generation_mwh_by_cmzone.xls,2004 Generation MWh by CM Zone,6661632,76681ca1c8a89ba06bd6bfe9071cb6a34772cf9f98c875c60449970ecf305fff,2004_generation_mwh_by_cmzone.xls,1830,183000,175680,0,0,7,6,0,0
+https://www.ercot.com/files/docs/2006/06/26/2004_load_mwh_by_cmzone.xls,2004 Load MWh by CM Zone,3390464,aab581efd543797ffb3c4ca7bb42f2d779670dc1291836687719173b04a1f609,2004_load_mwh_by_cmzone.xls,1830,183000,175680,0,0,11,6,0,0
+https://www.ercot.com/files/docs/2006/06/26/2005_generation_mwh_by_cmzone.xls,2005 Generation MWh by CMZone,6071296,0ac4396b724cf7f1cecd8a7275d0651fd5a728d29d782af7297478db16abafd7,2005_generation_mwh_by_cmzone.xls,1640,157440,156655,805,0,12,6,0,0
+https://www.ercot.com/files/docs/2006/06/26/2005_load_mwh_by_cmzone.xls,2005 Load MWh by CMZone,6808064,b5e2ff1b5e27081230df891455087bd0e3e3b0dcf56325f6cce1ce262e1abfab,2005_load_mwh_by_cmzone.xls,1825,175220,175205,0,5,12,6,0,0
diff --git a/tools/inputs/public-zonal-generation-evidence.json b/tools/inputs/public-zonal-generation-evidence.json
new file mode 100644
index 00000000..fd140b3b
--- /dev/null
+++ b/tools/inputs/public-zonal-generation-evidence.json
@@ -0,0 +1,177 @@
+{
+ "checkedAt": "2026-09-07T23:51:56.256903+00:00",
+ "sources": [
+ {
+ "file": "2007.txt",
+ "sha256": "dc04e9c9cec947110369b45723d77e5dbc817ae52a5f00007a0ca801d4bd6d81",
+ "rows": 38768,
+ "zones": {
+ "240": 9692,
+ "242": 9692,
+ "244": 9692,
+ "246": 9692
+ },
+ "firstPeriodEnding": "2007-01-01 00:15:00",
+ "lastPeriodEnding": "2007-04-12 00:00:00",
+ "firstOperatingDay": "2007-01-01",
+ "lastOperatingDay": "2007-04-11",
+ "minMW": "641",
+ "maxMW": "21864",
+ "duplicatePeriodZoneRows": 0,
+ "missingWholeOperatingDays": [],
+ "decodedRowsSha256": "7b89f1b79f1052613b84d2278c6e3623abb2897abbaa9a2321af5640c033f7b5"
+ },
+ {
+ "file": "2006.txt",
+ "sha256": "ae946bc3906d2d613a72494fef3cbd9b165ee033783b2e7de950d5342fb5b8bf",
+ "rows": 175180,
+ "zones": {
+ "230": 35036,
+ "232": 35036,
+ "234": 35036,
+ "236": 35036,
+ "238": 35036
+ },
+ "firstPeriodEnding": "2006-01-01 00:15:00",
+ "lastPeriodEnding": "2007-01-01 00:00:00",
+ "firstOperatingDay": "2006-01-01",
+ "lastOperatingDay": "2006-12-31",
+ "minMW": "399",
+ "maxMW": "22395",
+ "duplicatePeriodZoneRows": 0,
+ "missingWholeOperatingDays": [],
+ "decodedRowsSha256": "68ff7e108ce17c19ac1ad9214af9c351f44740af4c2feba407eb3447378d2d25"
+ },
+ {
+ "file": "2005.txt",
+ "sha256": "e2512f991c290db0b7c1272e83c7a50ba8cae7ccfc4b06c00b566a79b9f61f7c",
+ "rows": 175180,
+ "zones": {
+ "220": 35036,
+ "222": 35036,
+ "224": 35036,
+ "226": 35036,
+ "228": 35036
+ },
+ "firstPeriodEnding": "2005-01-01 00:15:00",
+ "lastPeriodEnding": "2006-01-01 00:00:00",
+ "firstOperatingDay": "2005-01-01",
+ "lastOperatingDay": "2005-12-31",
+ "minMW": "423",
+ "maxMW": "19653",
+ "duplicatePeriodZoneRows": 0,
+ "missingWholeOperatingDays": [],
+ "decodedRowsSha256": "aea0cf1af635f8bf72de92c9bcde73b30b1056930d6cff646bb790d1ebb3f19f"
+ },
+ {
+ "file": "2004.txt",
+ "sha256": "88d2611aecb685e1dc1e33d116faca3b143395f136c07b9693d65f9c2ffffd96",
+ "rows": 175660,
+ "zones": {
+ "130": 35132,
+ "132": 35132,
+ "134": 35132,
+ "136": 35132,
+ "138": 35132
+ },
+ "firstPeriodEnding": "2004-01-01 00:15:00",
+ "lastPeriodEnding": "2005-01-01 00:00:00",
+ "firstOperatingDay": "2004-01-01",
+ "lastOperatingDay": "2004-12-31",
+ "minMW": "512",
+ "maxMW": "21582",
+ "duplicatePeriodZoneRows": 0,
+ "missingWholeOperatingDays": [],
+ "decodedRowsSha256": "b578462e118bf0bbd3dce6b0fa414c9b04f4baecc8371b5940c667422c50a04d"
+ },
+ {
+ "file": "2003.txt",
+ "sha256": "ff991ebba3f7ce7f46f79719f01134124c83e34895032ed56174d34ae26ae209",
+ "rows": 140144,
+ "zones": {
+ "106": 35036,
+ "108": 35036,
+ "110": 35036,
+ "112": 35036
+ },
+ "firstPeriodEnding": "2003-01-01 00:15:00",
+ "lastPeriodEnding": "2004-01-01 00:00:00",
+ "firstOperatingDay": "2003-01-01",
+ "lastOperatingDay": "2003-12-31",
+ "minMW": "522",
+ "maxMW": "30726",
+ "duplicatePeriodZoneRows": 0,
+ "missingWholeOperatingDays": [],
+ "decodedRowsSha256": "89c1c14df3314058450a7c144aebcbfca790542144acf5bc3738a8a0ac974e4b"
+ },
+ {
+ "file": "2002.txt",
+ "sha256": "d91884655a375b886e6204475957025d24100a614f7e6475ca46f18cd30233f5",
+ "rows": 140144,
+ "zones": {
+ "96": 35036,
+ "98": 35036,
+ "100": 35036,
+ "102": 35036
+ },
+ "firstPeriodEnding": "2002-01-01 00:15:00",
+ "lastPeriodEnding": "2003-01-01 00:00:00",
+ "firstOperatingDay": "2002-01-01",
+ "lastOperatingDay": "2002-12-31",
+ "minMW": "1011",
+ "maxMW": "23559",
+ "duplicatePeriodZoneRows": 0,
+ "missingWholeOperatingDays": [],
+ "decodedRowsSha256": "587fd356376b851e9ea58404428d941d7d9375fe67ade4bd41cc1da37b64fb07"
+ },
+ {
+ "file": "2001.txt",
+ "sha256": "c1d8ff5b1c74d8d1e144930a9ac394df3e2876bc0c3b88fd61aac5257d4571ed",
+ "rows": 44064,
+ "zones": {
+ "24": 14688,
+ "26": 14688,
+ "28": 14688
+ },
+ "firstPeriodEnding": "2001-07-31 00:15:00",
+ "lastPeriodEnding": "2002-01-01 00:00:00",
+ "firstOperatingDay": "2001-07-31",
+ "lastOperatingDay": "2001-12-31",
+ "minMW": "676",
+ "maxMW": "47060",
+ "duplicatePeriodZoneRows": 0,
+ "missingWholeOperatingDays": [
+ "2001-08-09"
+ ],
+ "decodedRowsSha256": "24ab205a22aa2730c9ea72f184117dace69f92c289c718f1f94fbbf71981266f"
+ }
+ ],
+ "download": {
+ "url": "https://www.ercot.com/files/docs/2007/04/23/historical_generation_scheduled_by_zone.zip",
+ "bytes": 4027506,
+ "sha256": "230da4f06c764dcfb8548b0dcba13b4fb67650b7785de5632c7c7196ddb72bd5"
+ },
+ "scope": "Every period-ending timestamp, zone ID and scheduled MW value matched an independent direct source read for all seven yearly reports. No zone-name mapping, timezone conversion or gap filling.",
+ "totalRows": 889140,
+ "anonymousWorkflow": {
+ "checkedAt": "2026-09-07T23:54:32.765633+00:00",
+ "method": "Client().zonal_generation.rows(date_from=date(2001,7,31),date_to=date(2001,7,31))",
+ "credentials": "none",
+ "rows": 288,
+ "zones": [
+ 24,
+ 26,
+ 28
+ ],
+ "firstPeriodEnding": "2001-07-31T00:15:00",
+ "lastPeriodEnding": "2001-08-01T00:00:00",
+ "firstScheduledMW": "3490"
+ },
+ "indexUrl": "https://www.ercot.com/gridinfo/generation",
+ "notes": [
+ "This is a fixed public historical snapshot of schedules, not actual generation. The source provides local CPT period endings without timezone offsets or zone names.",
+ "Historical zone IDs change between annual files and are not mapped to current zones. Date filtering uses the start date of each 15-minute interval, retaining midnight period endings in the previous operating day.",
+ "August 9, 2001 is missing entirely. Source records and gaps remain unchanged; no duplicate rows are removed and no missing intervals are synthesized.",
+ "The original outer ZIP and its seven nested annual ZIPs are retained as the regression fixture. Every decoded timestamp, zone ID and MW value matched an independent source read."
+ ]
+}
diff --git a/tools/inputs/weather/historical.zip b/tools/inputs/weather/historical.zip
new file mode 100644
index 00000000..0977c8db
Binary files /dev/null and b/tools/inputs/weather/historical.zip differ
diff --git a/tools/inputs/zonal-peaks/evidence.json b/tools/inputs/zonal-peaks/evidence.json
new file mode 100644
index 00000000..1efcc5c0
--- /dev/null
+++ b/tools/inputs/zonal-peaks/evidence.json
@@ -0,0 +1,43 @@
+{
+ "checkedAt": "2026-09-08T15:56:45.572484+00:00",
+ "sourceIndex": "https://www.ercot.com/gridinfo/load/forecast",
+ "decoderSha256": "3ad680410da795bb74d8ed38408a903ab4e591b17968019dd9e37c7c2aa08a2d",
+ "families": {
+ "seasonal": {
+ "linkedWorkbooks": 22,
+ "liveDiscoveryMatchesSources": true,
+ "rows": 615,
+ "numericalPeakValues": 5535,
+ "rowKinds": {
+ "forecast": 352,
+ "historical": 263
+ },
+ "historicalYearBounds": [
+ 2002,
+ 2022
+ ],
+ "forecastYearBounds": [
+ 2014,
+ 2033
+ ]
+ },
+ "weekly": {
+ "linkedWorkbooks": 2,
+ "liveDiscoveryMatchesSources": true,
+ "rows": 263,
+ "numericalPeakValues": 2367,
+ "rowKinds": {
+ "forecast": 263
+ },
+ "beginDateBounds": [
+ "2024-08-18",
+ "2027-08-08"
+ ],
+ "endDateBounds": [
+ "2024-08-24",
+ "2027-08-14"
+ ]
+ }
+ },
+ "scope": "All year/period or date/hour fields and eight weather-zone values plus published totals compared against independently addressed original source cells in complete 24 XLS/XLSX files. Historical sections remain distinct even where their column header says Forecast Year. Gross/net/PV, coincident/non-coincident, winter periods, source notes and provider scenarios remain separate. No totals are recomputed. Unit fields are populated only from explicit MW table titles. In rows(), actual download-title P90 labels enrich forecast rows before filtering; no filename-based percentile is invented for read(), and historical rows are never assigned a forecast percentile. Source counts retain overlapping vintages and are not unique observations."
+}
diff --git a/tools/inputs/zonal-peaks/sources.json b/tools/inputs/zonal-peaks/sources.json
new file mode 100644
index 00000000..f6ef1057
--- /dev/null
+++ b/tools/inputs/zonal-peaks/sources.json
@@ -0,0 +1,848 @@
+[
+ {
+ "url": "https://www.ercot.com/files/docs/2025/02/05/p90_peaks_may.xlsx",
+ "title": "2025 Weekly P90 Peaks",
+ "sha256": "12f93c0b81a44ea185aeac8f27f58fbb7408a6be2a8d06758440a275d87e7cac",
+ "bytes": 20492,
+ "file": "569dc5a8427a-p90_peaks_may.xlsx",
+ "kind": "weekly",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 2,
+ "lastRow": 105,
+ "headerRow": 1
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2025/04/08/Summer-and-Winter-Peaks.xlsx",
+ "title": "Summer and Winter Peaks",
+ "sha256": "34543ad92d7905a85d9edf262fd38e3e7492c52bd08e257778b3645576803369",
+ "bytes": 18193,
+ "file": "d505e9f1ef60-Summer-and-Winter-Peaks.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Summer",
+ "firstRow": 3,
+ "lastRow": 9,
+ "headerRow": 2,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Net Coincident Peak Forecast 2025-2031 TSP Provided Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Summer",
+ "firstRow": 3,
+ "lastRow": 9,
+ "headerRow": 2,
+ "column": 16,
+ "titleRow": 1,
+ "title": "Summer Net Non-Coincident Peak Forecast 2025-2031 TSP Provided Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Summer",
+ "firstRow": 16,
+ "lastRow": 22,
+ "headerRow": 15,
+ "column": 1,
+ "titleRow": 14,
+ "title": "Summer Net Coincident Peak Forecast 2025-2031 ERCOT Adjusted Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Summer",
+ "firstRow": 16,
+ "lastRow": 22,
+ "headerRow": 15,
+ "column": 16,
+ "titleRow": 14,
+ "title": "Summer Net Non-Coincident Peak Forecast 2025-2031 ERCOT Adjusted Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Winter",
+ "firstRow": 3,
+ "lastRow": 9,
+ "headerRow": 2,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Winter Net Coincident Peak Forecast 2025-2031 TSP Provided Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Winter",
+ "firstRow": 3,
+ "lastRow": 9,
+ "headerRow": 2,
+ "column": 16,
+ "titleRow": 1,
+ "title": "Winter Net Non-Coincident Peak Forecast 2025-2031 TSP Provided Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Winter",
+ "firstRow": 16,
+ "lastRow": 22,
+ "headerRow": 15,
+ "column": 1,
+ "titleRow": 14,
+ "title": "Winter Net Coincident Peak Forecast 2025-2031 ERCOT Adjusted Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Winter",
+ "firstRow": 16,
+ "lastRow": 22,
+ "headerRow": 15,
+ "column": 16,
+ "titleRow": 14,
+ "title": "Winter Net Non-Coincident Peak Forecast 2025-2031 ERCOT Adjusted Forecast",
+ "kind": "forecast",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2014/09/16/summer_ncp_forecast_by_weather_zone_090514.xls",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "d6c85293dab5302e864702bf1b51b6a99efd44cbd77e38ee28797b337f20832a",
+ "bytes": 36864,
+ "file": "9f452d580001-summer_ncp_forecast_by_weather_zone_090514.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone CP",
+ "firstRow": 4,
+ "lastRow": 14,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2014 - 2024",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Weather Zone CP",
+ "firstRow": 22,
+ "lastRow": 33,
+ "headerRow": 21,
+ "column": 1,
+ "titleRow": 19,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2014/06/25/90th_percentile_summer_ncp_by_weather_zone_06252014.xls",
+ "title": "90th percentile Summer NCP by weather zone",
+ "sha256": "61a020cc7761d5781b1fd42abf82235da5e87815885b0d826dcf15150fa33182",
+ "bytes": 37376,
+ "file": "ab61680af2ec-90th_percentile_summer_ncp_by_weather_zone_06252014.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 5,
+ "lastRow": 20,
+ "headerRow": 4,
+ "column": 1,
+ "titleRow": 2,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2014 - 2029",
+ "kind": "forecast",
+ "percentileLabel": "90th percentile"
+ },
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 28,
+ "lastRow": 39,
+ "headerRow": 27,
+ "column": 1,
+ "titleRow": 25,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/01/04/summer_ncp_forecast_by_weather_zone_2016.xls",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "2547f8fe7c19c57cfad67ac41c87f2b2a27f1f43c785a48b2e4d2999c000e63f",
+ "bytes": 37376,
+ "file": "03b8677ea7e0-summer_ncp_forecast_by_weather_zone_2016.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2016 - 2025",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 21,
+ "lastRow": 34,
+ "headerRow": 20,
+ "column": 1,
+ "titleRow": 18,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/01/04/90th_percentile_summer_ncp_by_weather_zone_2016.xls",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "d860eae1200281c4c16a30dc70cd29eb946bf47a774364e63cb8039d68eda08c",
+ "bytes": 37888,
+ "file": "1061b46362a3-90th_percentile_summer_ncp_by_weather_zone_2016.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 5,
+ "lastRow": 14,
+ "headerRow": 4,
+ "column": 1,
+ "titleRow": 2,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2016 - 2025",
+ "kind": "forecast",
+ "percentileLabel": "90th percentile"
+ },
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 22,
+ "lastRow": 35,
+ "headerRow": 21,
+ "column": 1,
+ "titleRow": 19,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/12/12/90th_percentile_Summer_NCP_by_weather_zone_2017.xls",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "1fab09937ca685c78dbf9d265d08b2441972a540d907d0059ce3e31bcc9cfde7",
+ "bytes": 37376,
+ "file": "62956164d403-90th_percentile_Summer_NCP_by_weather_zone_2017.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 5,
+ "lastRow": 14,
+ "headerRow": 4,
+ "column": 1,
+ "titleRow": 2,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2017 - 2026",
+ "kind": "forecast",
+ "percentileLabel": "90th percentile"
+ },
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 22,
+ "lastRow": 36,
+ "headerRow": 21,
+ "column": 1,
+ "titleRow": 19,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2016/12/12/Summer_NCP_forecast_by_weather_zone_2017.xls",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "4e9362ca43a148652535013e0f05065f3e3cada33b4e28e999fa05c400bfaa3e",
+ "bytes": 37376,
+ "file": "47a97d9771dd-Summer_NCP_forecast_by_weather_zone_2017.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2017 - 2026",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 21,
+ "lastRow": 35,
+ "headerRow": 20,
+ "column": 1,
+ "titleRow": 18,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/12/13/90th_percentile_Summer_NCP_by_weather_zone_2018_2027.xls",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "2db8e1ee828acea8c087d9a9210c85fa199bd5ecfcf1bd53198ceaf090f49050",
+ "bytes": 30720,
+ "file": "dacbeb74b38e-90th_percentile_Summer_NCP_by_weather_zone_2018_2027.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 5,
+ "lastRow": 14,
+ "headerRow": 4,
+ "column": 1,
+ "titleRow": 2,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2018 - 2027",
+ "kind": "forecast",
+ "percentileLabel": "90th percentile"
+ },
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 22,
+ "lastRow": 37,
+ "headerRow": 21,
+ "column": 1,
+ "titleRow": 19,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2017/12/13/Summer_NCP_forecast_by_weather_zone_2018_2027.xls",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "9e3d9a117a9868b45031342031b12ba3f80cb0f2af82e8ba8bc2d4bfd20e8d33",
+ "bytes": 37888,
+ "file": "da56e1b49811-Summer_NCP_forecast_by_weather_zone_2018_2027.xls",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2018 - 2027",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Weather Zone NCP",
+ "firstRow": 21,
+ "lastRow": 36,
+ "headerRow": 20,
+ "column": 1,
+ "titleRow": 18,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2018/12/11/90th_Percentile_Summer_NCP_by_weather_zone_2019_2028.xlsx",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "ece1014d24bc0380850abbdae7b9091368cffeba45422b438eab463b4dec866e",
+ "bytes": 16802,
+ "file": "f9a835b98f03-90th_Percentile_Summer_NCP_by_weather_zone_2019_2028.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 5,
+ "lastRow": 14,
+ "headerRow": 4,
+ "column": 1,
+ "titleRow": 2,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2019 - 2028",
+ "kind": "forecast",
+ "percentileLabel": "90th percentile"
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 22,
+ "lastRow": 38,
+ "headerRow": 21,
+ "column": 1,
+ "titleRow": 19,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2019/09/10/Summer_NCP_forecast_by_weather_zone_2019_2028.xlsx",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "cfc92824d46630488409392b7d31415aa3fcc0d1923711fa5ce02288bef1fd31",
+ "bytes": 13993,
+ "file": "3908ee0aae9e-Summer_NCP_forecast_by_weather_zone_2019_2028.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2019 - 2028",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 21,
+ "lastRow": 37,
+ "headerRow": 20,
+ "column": 1,
+ "titleRow": 18,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2019/12/10/90th_Percentile_Summer_NCP_by_weather_zone_2020_2029.xlsx",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "c0bd993c1cc38409418ab7d762a30419732afa1216ace5040fb743b6b6e3306d",
+ "bytes": 16154,
+ "file": "a6e117ef4227-90th_Percentile_Summer_NCP_by_weather_zone_2020_2029.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 5,
+ "lastRow": 14,
+ "headerRow": 4,
+ "column": 1,
+ "titleRow": 2,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2020 - 2029",
+ "kind": "forecast",
+ "percentileLabel": "90th percentile"
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 22,
+ "lastRow": 39,
+ "headerRow": 21,
+ "column": 1,
+ "titleRow": 19,
+ "title": "Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2019/12/10/Summer_NCP_forecast_by_weather_zone_2020_2029.xlsx",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "4bddd8ade45ab523285ff3708b9eb9fae37b76fd87a50e523c93f59fe8245311",
+ "bytes": 15533,
+ "file": "1ecb5aa445d3-Summer_NCP_forecast_by_weather_zone_2020_2029.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Non-Coincident Peak Demand Forecast for 2020-2029",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 21,
+ "lastRow": 38,
+ "headerRow": 20,
+ "column": 1,
+ "titleRow": 18,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2020/12/28/90th_Percentile_Summer_NCP_by_weather_zone_2021_2030.xlsx",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "ef3b6b91b3ae98471615f3cd3467418356f15f59a96832ede7315172fa942e36",
+ "bytes": 16539,
+ "file": "61af1eb92cc5-90th_Percentile_Summer_NCP_by_weather_zone_2021_2030.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 5,
+ "lastRow": 14,
+ "headerRow": 4,
+ "column": 1,
+ "titleRow": 2,
+ "title": "Summer Gross Non-Coincident Peak Demand Forecast for 2021 - 2030",
+ "kind": "forecast",
+ "percentileLabel": "90th percentile"
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 22,
+ "lastRow": 40,
+ "headerRow": 21,
+ "column": 1,
+ "titleRow": 19,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2020/12/28/Summer_NCP_forecast_by_weather_zone_2021_2030.xlsx",
+ "title": "Weather Zone Non-Coincident Peak Forecast.",
+ "sha256": "71d70f17fbf796bca432e9001c33a9129b674490fae0d3eeff7b0388ba2256b4",
+ "bytes": 14822,
+ "file": "b180a941a376-Summer_NCP_forecast_by_weather_zone_2021_2030.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Gross Non-Coincident Peak Demand Forecast for 2021-2030",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 21,
+ "lastRow": 39,
+ "headerRow": 20,
+ "column": 1,
+ "titleRow": 18,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/02/24/90th_Percentile_Summer_NCP_by_weather_zone_2022_2031.xlsx",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "8d876d9ed2bc7ed5b772ea173a9971858a93ec0d240f3020d1314297278ab108",
+ "bytes": 15946,
+ "file": "743a8aa17b06-90th_Percentile_Summer_NCP_by_weather_zone_2022_2031.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Gross Non-Coincident Peak Demand Forecast for 2022-2031",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 19,
+ "lastRow": 28,
+ "headerRow": 18,
+ "column": 1,
+ "titleRow": 16,
+ "title": "Summer Net Non-Coincident Peak Demand Forecast for 2022-2031",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 34,
+ "lastRow": 43,
+ "headerRow": 33,
+ "column": 1,
+ "titleRow": 31,
+ "title": "Rooftop PV Impact on Summer Peak Demand Forecast (MW) ",
+ "kind": "forecast",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2022/02/24/Summer_NCP_forecast_by_weather_zone_2022_2031.xlsx",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "2033380a68e9b1917e74694089859042ec8107dc5dffd71de003de98c32bbb44",
+ "bytes": 18658,
+ "file": "7ad77e9edab1-Summer_NCP_forecast_by_weather_zone_2022_2031.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Gross Non-Coincident Peak Demand Forecast for 2022-2031",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 19,
+ "lastRow": 28,
+ "headerRow": 18,
+ "column": 1,
+ "titleRow": 16,
+ "title": "Summer Net Non-Coincident Peak Demand Forecast for 2022-2031",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 34,
+ "lastRow": 43,
+ "headerRow": 33,
+ "column": 1,
+ "titleRow": 31,
+ "title": "Rooftop PV Impact on Summer Peak Demand Forecast (MW) ",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 50,
+ "lastRow": 69,
+ "headerRow": 49,
+ "column": 1,
+ "titleRow": 47,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2023/01/18/Summer-NCP-forecast-by-weather-zone-2023-2032-90th-percentile-values.xlsx",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "8b793fcd58022fc3e3a0f520e97560b016b8004890fe512d96cc0cd2a60fc55b",
+ "bytes": 17738,
+ "file": "b7ec0c0c99f4-Summer-NCP-forecast-by-weather-zone-2023-2032-90th-percentile-values.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Gross 90th Percentile Non-Coincident Peak Demand Forecast for 2023-2032",
+ "kind": "forecast",
+ "percentileLabel": "Summer Gross 90th Percentile Non-Coincident Peak Demand Forecast for 2023-2032"
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 19,
+ "lastRow": 28,
+ "headerRow": 18,
+ "column": 1,
+ "titleRow": 16,
+ "title": "Summer Net 90th Percentile Non-Coincident Peak Demand Forecast for 2023-2032",
+ "kind": "forecast",
+ "percentileLabel": "Summer Net 90th Percentile Non-Coincident Peak Demand Forecast for 2023-2032"
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 34,
+ "lastRow": 43,
+ "headerRow": 33,
+ "column": 1,
+ "titleRow": 31,
+ "title": "Rooftop PV Impact on 90th Percentile Summer Peak Demand Forecast (MW) ",
+ "kind": "forecast",
+ "percentileLabel": "Rooftop PV Impact on 90th Percentile Summer Peak Demand Forecast (MW) "
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2023/01/18/Summer-NCP-forecast-by-weather-zone-2023-2032.xlsx",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "a5898b5fdb3b73959166b0da662bde917460ff5571e7ff61078a5b21d70b7c3e",
+ "bytes": 20020,
+ "file": "63241f5968a7-Summer-NCP-forecast-by-weather-zone-2023-2032.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Gross Non-Coincident Peak Demand Forecast for 2023-2032",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 18,
+ "lastRow": 27,
+ "headerRow": 17,
+ "column": 1,
+ "titleRow": 15,
+ "title": "Summer Net Non-Coincident Peak Demand Forecast for 2023-2032",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 33,
+ "lastRow": 42,
+ "headerRow": 32,
+ "column": 1,
+ "titleRow": 30,
+ "title": "Rooftop PV Impact on Summer Peak Demand Forecast (MW) ",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 49,
+ "lastRow": 69,
+ "headerRow": 48,
+ "column": 1,
+ "titleRow": 46,
+ "title": "Summer Non-Coincident Peak Demand (MW)",
+ "kind": "historical",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/07/18/90th-Percentile-Summer-Non-Coincident-Peak-by-Weather-Zone.xlsx",
+ "title": "90th Percentile Summer Non-Coincident Peak by Weather Zone",
+ "sha256": "2168d109d514387f3ec8b118a3192ac742df6799db633d81c2b357d41eb08f55",
+ "bytes": 13053,
+ "file": "a9d43620868a-90th-Percentile-Summer-Non-Coincident-Peak-by-Weather-Zone.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 4,
+ "lastRow": 13,
+ "headerRow": 3,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Net 90th Percentile Non-Coincident Peak Demand Forecast for 2024-2033",
+ "kind": "forecast",
+ "percentileLabel": "Summer Net 90th Percentile Non-Coincident Peak Demand Forecast for 2024-2033"
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/07/18/Weather-Zone-Non-Coincident-Peak-Forecast.xlsx",
+ "title": "Weather Zone Non-Coincident Peak Forecast",
+ "sha256": "dfa01b81495f7200ae038738de86515dadddc6d75a24aa4a316a677d5aea5130",
+ "bytes": 11727,
+ "file": "affc5e7ea0c9-Weather-Zone-Non-Coincident-Peak-Forecast.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 3,
+ "lastRow": 9,
+ "headerRow": 2,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Summer Net Non-Coincident Peak Forecast 2024-2030",
+ "kind": "forecast",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/01/18/Winter-Peak-Loads.xlsx",
+ "title": "Winter Peak Loads",
+ "sha256": "cdcdf3d9be2e5dc9415a6aff738632c93bace945bfc141098219401e6a1af2ee",
+ "bytes": 13547,
+ "file": "a2663a3e3ef0-Winter-Peak-Loads.xlsx",
+ "kind": "seasonal",
+ "tables": [
+ {
+ "sheet": "Sheet1",
+ "firstRow": 3,
+ "lastRow": 8,
+ "headerRow": 2,
+ "column": 1,
+ "titleRow": 1,
+ "title": "Winter Non Coincident Peak Demand Forecast for 2024-2030",
+ "kind": "forecast",
+ "percentileLabel": null
+ },
+ {
+ "sheet": "Sheet1",
+ "firstRow": 16,
+ "lastRow": 21,
+ "headerRow": 15,
+ "column": 1,
+ "titleRow": 14,
+ "title": "Winter Coincident Peak Demand Forecast 2024-2030",
+ "kind": "forecast",
+ "percentileLabel": null
+ }
+ ]
+ },
+ {
+ "url": "https://www.ercot.com/files/docs/2024/03/08/2024-Weekly-P90-Peaks.xlsx",
+ "title": "2024 Weekly P90 Peaks",
+ "sha256": "762859453b189cf61b6729d5d381c5d3851f99e9fe0045e9b56801556409319c",
+ "bytes": 24135,
+ "file": "e59dcfd30ed9-2024-Weekly-P90-Peaks.xlsx",
+ "kind": "weekly",
+ "tables": [
+ {
+ "sheet": "p902425",
+ "firstRow": 2,
+ "lastRow": 160,
+ "headerRow": 1
+ }
+ ]
+ }
+]
diff --git a/tools/inputs/zonal-peaks/workbooks.zip b/tools/inputs/zonal-peaks/workbooks.zip
new file mode 100644
index 00000000..947ca179
Binary files /dev/null and b/tools/inputs/zonal-peaks/workbooks.zip differ
diff --git a/uv.lock b/uv.lock
index 20cc8965..ce26a2eb 100644
--- a/uv.lock
+++ b/uv.lock
@@ -102,6 +102,104 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" },
]
+[[package]]
+name = "cffi"
+version = "2.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" },
+ { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" },
+ { url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" },
+ { url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" },
+ { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" },
+ { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" },
+ { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" },
+ { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" },
+ { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" },
+ { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" },
+ { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" },
+ { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" },
+ { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" },
+ { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" },
+ { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" },
+ { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" },
+ { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" },
+ { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" },
+ { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" },
+ { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" },
+ { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" },
+ { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" },
+ { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" },
+ { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" },
+ { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" },
+ { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" },
+ { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" },
+ { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" },
+ { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" },
+ { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" },
+ { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" },
+ { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" },
+ { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" },
+ { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" },
+]
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -111,6 +209,71 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
+[[package]]
+name = "cryptography"
+version = "50.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", size = 4010153, upload-time = "2026-08-25T19:44:03.155Z" },
+ { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" },
+ { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" },
+ { url = "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", size = 5353524, upload-time = "2026-08-25T19:44:11.96Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" },
+ { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" },
+ { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", size = 5308405, upload-time = "2026-08-25T19:44:20.197Z" },
+ { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" },
+ { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" },
+ { url = "https://files.pythonhosted.org/packages/42/8b/cb12b1b60c91b074ca6bf0fdd59aa8f10d8bc5f73af8faece86ef0421b37/cryptography-50.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648", size = 3842826, upload-time = "2026-08-25T19:44:28.784Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/f0/424cb557d99aa86ac55da5e2add02e2882e44047b6264f93ade1b975a993/cryptography-50.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f", size = 3973525, upload-time = "2026-08-25T19:44:30.7Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" },
+ { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/6e/1cf405c5c8e8df7545378048e954792f00b7f2367af8863ce8b8f3e10607/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9", size = 5332388, upload-time = "2026-08-25T19:44:39.16Z" },
+ { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" },
+ { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" },
+ { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/1b/ec3ebd31741d0e963612c4fe43caa39341b9b1e031e469820e42e4c83918/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6", size = 5287201, upload-time = "2026-08-25T19:44:47.297Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/56/bc4f2b209e766c93372cfcd59b781a0b2b59700f62a969580415b699c2b2/cryptography-50.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf", size = 3825806, upload-time = "2026-08-25T19:44:56.209Z" },
+ { url = "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", size = 4035307, upload-time = "2026-08-25T19:44:58.305Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" },
+ { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", size = 5375862, upload-time = "2026-08-25T19:45:07.163Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" },
+ { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", size = 5332955, upload-time = "2026-08-25T19:45:16.193Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" },
+ { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" },
+ { url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/27/8d207af749c453ee17ea087340b3f2b4adef75aadd1d277b1b129bdda84e/cryptography-50.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9cb3cb952cf5a8abd50c782a98a89d71699715e802fe349704b47f2425b42a94", size = 3974350, upload-time = "2026-08-25T19:45:26.551Z" },
+ { url = "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", size = 4698675, upload-time = "2026-08-25T19:45:28.658Z" },
+ { url = "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", size = 4707410, upload-time = "2026-08-25T19:45:30.816Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", size = 4698378, upload-time = "2026-08-25T19:45:33.043Z" },
+ { url = "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", size = 4706889, upload-time = "2026-08-25T19:45:35.086Z" },
+ { url = "https://files.pythonhosted.org/packages/71/44/711e61f7d014be825ef79b285b047292d1bf893732ac1bc030a351fb517f/cryptography-50.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:693c99b49bd37d0d096e4334c10232c77248c415b98d35236094cdf96d57258b", size = 3824006, upload-time = "2026-08-25T19:45:37.281Z" },
+]
+
+[[package]]
+name = "et-xmlfile"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" },
+]
+
[[package]]
name = "h11"
version = "0.16.0"
@@ -294,6 +457,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/38/a6/800800bfed7b1fb10fc3f3d557785c3854e80d3f7a9800d784b176a1fc2d/librt-0.15.0-cp315-cp315t-win_arm64.whl", hash = "sha256:84d244b00604d17df3fc7736c327892d6bba66181254aa4087be807b6c342bdc", size = 110700, upload-time = "2026-08-07T10:49:15.499Z" },
]
+[[package]]
+name = "msoffcrypto-tool"
+version = "6.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cryptography" },
+ { name = "olefile" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a6/34/6250bdddaeaae24098e45449ea362fb3555a65fba30cad0ad5630ea48d1a/msoffcrypto_tool-6.0.0.tar.gz", hash = "sha256:9a5ebc4c0096b42e5d7ebc2350afdc92dc511061e935ca188468094fdd032bbe", size = 40593, upload-time = "2026-01-12T08:59:56.73Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3c/85/9e359fa9279e1d6861faaf9b6f037a3226374deb20a054c3937be6992013/msoffcrypto_tool-6.0.0-py3-none-any.whl", hash = "sha256:46c394ed5d9641e802fc79bf3fb0666a53748b23fa8c4aa634ae9d30d46fe397", size = 48791, upload-time = "2026-01-12T08:59:55.394Z" },
+]
+
[[package]]
name = "mypy"
version = "2.3.1"
@@ -363,6 +539,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
]
+[[package]]
+name = "olefile"
+version = "0.47"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/69/1b/077b508e3e500e1629d366249c3ccb32f95e50258b231705c09e3c7a4366/olefile-0.47.zip", hash = "sha256:599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c", size = 112240, upload-time = "2023-12-01T16:22:53.025Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/17/d3/b64c356a907242d719fc668b71befd73324e47ab46c8ebbbede252c154b2/olefile-0.47-py2.py3-none-any.whl", hash = "sha256:543c7da2a7adadf21214938bb79c83ea12b473a4b6ee4ad4bf854e7715e13d1f", size = 114565, upload-time = "2023-12-01T16:22:51.518Z" },
+]
+
+[[package]]
+name = "openpyxl"
+version = "3.1.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "et-xmlfile" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" },
+]
+
[[package]]
name = "packaging"
version = "26.3"
@@ -390,6 +587,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
+[[package]]
+name = "pycparser"
+version = "3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
+]
+
[[package]]
name = "pydantic"
version = "2.12.5"
@@ -511,6 +717,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
]
+[[package]]
+name = "pypdf"
+version = "6.18.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c2/c3/9fa0666f280552bd3833562d985b785fce1ddb3804937edd2fd6a3f2bdb3/pypdf-6.18.0.tar.gz", hash = "sha256:ae58b7d93c22c169ffb02c3b06321c45c4f223b4916536568adb57d789d95d01", size = 7024871, upload-time = "2026-09-07T16:48:16.444Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/a5/d5922a078c9a612327681d4793404f82998f4d66213add6fdc0659245856/pypdf-6.18.0-py3-none-any.whl", hash = "sha256:05b762b77bcb9dcb4a7c91fcf5dded585b25bee7269ab3d3001d7c55fa1b324b", size = 393848, upload-time = "2026-09-07T16:48:14.254Z" },
+]
+
[[package]]
name = "pytest"
version = "9.1.1"
@@ -527,6 +742,92 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
]
+[[package]]
+name = "python-calamine"
+version = "0.8.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/10/36/473a55063a6af3739cdf4b879869d3067e677f3dfb52ec8fadac23941a33/python_calamine-0.8.2.tar.gz", hash = "sha256:b2000c085722afd01d973af3d58325d26cfd798b3665bb0924e3a658351ebfad", size = 227187, upload-time = "2026-07-13T13:58:26.909Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/a0/33beab8ace41d872de57da04d06ab001e31b42d283defd42a81f5653526b/python_calamine-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:29b2ee38dfa98e430ae4f32849fb46bd47befd8adbed0a08c290326371d195fe", size = 860315, upload-time = "2026-07-13T13:56:08.143Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/e6/cbd088173589d7f78b5aaab821721a790e8d621a653512de3c412f92ac0a/python_calamine-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e44f54daa383a64704b8f975e0ee793c429bcc0de67bd231b1762179a539475", size = 853168, upload-time = "2026-07-13T13:56:09.83Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/4a/612f005c24ead4ca1dc844371a443a6b74a8b53e66f506d0cf8edf9097bb/python_calamine-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd67cf7806e2b29b04d32453a1c6c4b304b2e86120813f3a96696245a8ed461", size = 927629, upload-time = "2026-07-13T13:56:11.519Z" },
+ { url = "https://files.pythonhosted.org/packages/74/7b/03a261f4489eb04df88d770d317e021858e37d70a958188dabab19a9fe58/python_calamine-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:28ceb21f80bd251e48265a7742235c87488a4cac9ff91f523fb3fdc1e56195dc", size = 920851, upload-time = "2026-07-13T13:56:13.209Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/30/f84cdb77a2d1034703ec5f2c9a7bee469c7d99f1e54374b247ed319a3164/python_calamine-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22434c553f4f6b945f63caa271351ec9f4d6fd11bdb97cafc094c474f13aabc0", size = 1090840, upload-time = "2026-07-13T13:56:14.743Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/b4/531f2878776b601e3e2895a7f8a3b41729ca7447fc6d6e59cf90d55cb03a/python_calamine-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca82ceef14d9194caf0a62e02749b8449d92430b11523c99c9670b7a763fa5e", size = 989963, upload-time = "2026-07-13T13:56:16.484Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/9e/f8879a6c1334997825d6f5cfba1552f7fe9b1dd650e3b03e8bc0b1f5e875/python_calamine-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:819c86fbfc638eca46b7c06134632959a2ce8ae20aeb580d89b4b6f6cfc5fb94", size = 924123, upload-time = "2026-07-13T13:56:18.099Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/88/de03268656a12fd9a73974cd836558f113db152202c93160e57fe0dc10e5/python_calamine-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccccafe6767027eae0ab5493b0afcbc35da38aa64a9b85657bbe8660cb60dd98", size = 1003606, upload-time = "2026-07-13T13:56:19.772Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/d8/7ec6aa10bea0d2f4c535d6b7685a58f7e4ba24f7323dfb05aaa789f5baba/python_calamine-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:43648db3d6773d4e56b23d405fa3e91ed3398e3b05b9244d50dbb61ffb67d34a", size = 1103990, upload-time = "2026-07-13T13:56:21.582Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/aa/969ca12f2412ae4b1c6830b42cc6c5a419704b76ddabbb5e7fec803275aa/python_calamine-0.8.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:ebf7a362249f80ff1519e6f568f3046266cbb3157fda262cd725013e17b18d9f", size = 1195526, upload-time = "2026-07-13T13:56:23.407Z" },
+ { url = "https://files.pythonhosted.org/packages/20/81/23d9f1ca602a194a57aa7bced4a554ec57532377fbe3955dcfcd227fefff/python_calamine-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:71d5ffc0d81bf9d6b8c5051a256fd4e6d0f0bcaf65700ad7d6fb35e35712d932", size = 1139854, upload-time = "2026-07-13T13:56:24.875Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/9c/b3e73e321c2fa78cf7f64720801fc5e74e8be722129293a1c5fe0c3d7e71/python_calamine-0.8.2-cp311-cp311-win32.whl", hash = "sha256:ac23687b41bbe4a6964a69420051cc59e81d4fcf32e5e82342fd3c970d141f24", size = 738563, upload-time = "2026-07-13T13:56:26.429Z" },
+ { url = "https://files.pythonhosted.org/packages/05/e3/d13fc340b0a0b0010d3c5799ed6c578e13cbc6501d629ee301e7e37468dd/python_calamine-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:c94abc66f8b544e5fc126dfaa6b41b77a394adfe09dac95e20679823e41e38be", size = 777797, upload-time = "2026-07-13T13:56:28.112Z" },
+ { url = "https://files.pythonhosted.org/packages/53/30/b00a62b6c910d83511454f1474896432c839ccf53183f184ef5cbf822fa5/python_calamine-0.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:0288fa6488f6ced089d3848d572fc41098e4e7c9e09976d269043957ca432b7b", size = 749055, upload-time = "2026-07-13T13:56:29.749Z" },
+ { url = "https://files.pythonhosted.org/packages/13/18/adfb951c33dedf37c3c9f5804af04eb8a18ba12dc0d3901c98563462f565/python_calamine-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0efea8e1fc617d43351abe7c9f8ce7585b3a546d08e5c26d87d1629369a4b6e5", size = 864109, upload-time = "2026-07-13T13:56:31.591Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5e/d9b2cee430feb7eeee2d84b19e61266cda0e2880d126441a7f19b31772c7/python_calamine-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a99eb1a74f9a93af4c5a5586e9fa72de1879721c47fd21aa9e042deb6832e30a", size = 846205, upload-time = "2026-07-13T13:56:33.282Z" },
+ { url = "https://files.pythonhosted.org/packages/de/a5/4cbd1a01279372a20319629ddc832806914827bd1edc8801ee7956c275fe/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96daed873be1f70d22795fbf197d3d833655aad6a149c15154651b7773d3a1ad", size = 923414, upload-time = "2026-07-13T13:56:34.952Z" },
+ { url = "https://files.pythonhosted.org/packages/45/1b/9d646373c241082ce4488a0a297f8834a2513e17c6ce098506f91bb0f4c4/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:17314a59fe01bb1bb7010240a578bf85e49b47af955622ae5f06f286d6d6954f", size = 918317, upload-time = "2026-07-13T13:56:36.467Z" },
+ { url = "https://files.pythonhosted.org/packages/34/0d/73f4bcba43fc7a89ec48cbe1459d0436d6205a85ce720af54682bd14116e/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1396287f66a54ec2e68c6448f0c782173dbb3e8c2aca4089195d8c9a52b46c72", size = 1087802, upload-time = "2026-07-13T13:56:38.113Z" },
+ { url = "https://files.pythonhosted.org/packages/47/54/b71763efd1c868d096fbad6f080de39ac83d832b456bc0ff285e74237723/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da1b26061783d2bc1d7aabc83cce63706cdacb6b03c6c6a37d3ea33ad34b7b4b", size = 986451, upload-time = "2026-07-13T13:56:39.743Z" },
+ { url = "https://files.pythonhosted.org/packages/27/61/deb1b368933ddedeedbd7bef8aa71185eaff66dc058b44ca9f4a419925d5/python_calamine-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a148bf41efabb39ee99eac2552223c3605d29beaed6bd7a14a2990e07022e3b", size = 920176, upload-time = "2026-07-13T13:56:41.308Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/df/7645e4d3ea983cac1bfe2643661fd03b92db2736cd97ba1bda367d86a61e/python_calamine-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:21afb508d71f83c12c1c01fef21d9285f91820d052998e44706571bebd835cf6", size = 996879, upload-time = "2026-07-13T13:56:42.951Z" },
+ { url = "https://files.pythonhosted.org/packages/af/b1/a88e1c7bc883f2767cc09247d395ce530c903a6bd2cc40e1f2000e6eaf85/python_calamine-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0cd1c5592b4a2cc7b0a92c5289f0eeef74e8ce3c5af9cc12361ae75625b14926", size = 1098763, upload-time = "2026-07-13T13:56:44.708Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/59/de0fb08a1745d30d85cbef6b474e975a92bb7c6daf6aa37fc63960ae4674/python_calamine-0.8.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:70e6e7aa5e74234254cae87e60a7ccb525e6962f73741f2b1927536aa7cb0093", size = 1192807, upload-time = "2026-07-13T13:56:46.379Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/f5/d6956857490924ab9945d3be6624dadee1918d8630288009a2b7ef7700e1/python_calamine-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2c2d65dd0cff571ad9463fc964194507e31295387bc1bbc76c2604959d694c0f", size = 1136033, upload-time = "2026-07-13T13:56:48.346Z" },
+ { url = "https://files.pythonhosted.org/packages/12/06/1992fa129dde6f7c5feed07d3b74df37a231782922af2ca6ff89917cc676/python_calamine-0.8.2-cp312-cp312-win32.whl", hash = "sha256:8938f66e6797d9d778504e0f827641d5067784dc68f18d2c2307abe615fcb85e", size = 734193, upload-time = "2026-07-13T13:56:50.546Z" },
+ { url = "https://files.pythonhosted.org/packages/63/31/aed4b50630ba23bb3372b4cebe930a92201dfd2c1c072e2d1570a042542e/python_calamine-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:7a64237cc6b3d56b478686adff16502aecaf356543204bd6c70d754023a3d6aa", size = 774599, upload-time = "2026-07-13T13:56:52.278Z" },
+ { url = "https://files.pythonhosted.org/packages/84/c0/23b910999d2d9e1b9145fc3be645add1e1cbc90cba4a39a9ca9d23ebe678/python_calamine-0.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:24607bde04b76f8329dae4963d22830a78f1eaa0622325217e53c5377143384c", size = 731385, upload-time = "2026-07-13T13:56:54.041Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/31/134e7b2ecdde486ec4e5fae763f84973fac6a097971aeb9648c0031ee365/python_calamine-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:923825ea049f7a16bfa0333e237909dfd109c7a44ad156c6d83921a768382020", size = 863158, upload-time = "2026-07-13T13:56:55.91Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/aa/36ec3c85c50b08c8f4df4adfb762a6978ef0da08264d5813ff3b55518137/python_calamine-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed9a48c892aed565e6250a9a38222806db49334868e174b30e6670caa4231c4a", size = 845854, upload-time = "2026-07-13T13:56:57.584Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/61/4ef12d9c4d3774410eec3a1b377542523ee18b606b91b0281f8db5ac8819/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f28ebfaa0ca306ec25df2cf6d5cef4838769ebd5536edd1eb0aa9a77935189fa", size = 923463, upload-time = "2026-07-13T13:56:59.411Z" },
+ { url = "https://files.pythonhosted.org/packages/df/a1/41db6b31011ac5c4ad3c05f4f8078a7d24d81f4288c756829cbdc941cbcc/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0a229632dde778a03d3c1ff159da4762e04d8b5e69be94edbf005da152de944", size = 916869, upload-time = "2026-07-13T13:57:01.063Z" },
+ { url = "https://files.pythonhosted.org/packages/72/70/b582691901b90b52884b8f525d4be7e27e423040b17ec4f50d0f8ac8f4e5/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b67798d130fe8c89891c3e75f9334e0e18c2c8e6527d276954c31c9dc426d39b", size = 1086769, upload-time = "2026-07-13T13:57:02.761Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/5c/a05493fdcbf8aede4362150edd0dfde4e87db53c23f1668cc6aa4d4b40a3/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eebc266e7c40d337112a9cfc82f9c9d7587121fa4e86673da1e97f8855039c", size = 986561, upload-time = "2026-07-13T13:57:04.346Z" },
+ { url = "https://files.pythonhosted.org/packages/db/c6/8c12291275f63d314723d1480be017f0c32d5fd4dea76b66205ebd05dee2/python_calamine-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe476889191a80b05a514b37f89a7d364e1ad19783918e93b0a053e2e2e9f08", size = 919538, upload-time = "2026-07-13T13:57:06.049Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/5d/dc12ce14a748b180cfa22d6a9e5dc372808050466666ab9776623f437c61/python_calamine-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:220b1a2962f5394edc0f5918d91e4dd3e9f3c6c521d0f2a4ccaf3d3ace980a28", size = 995727, upload-time = "2026-07-13T13:57:08.315Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/da/72986560b082a005d88e5b74cc89686fa8f767a5173436b9dd3d0f43a33a/python_calamine-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:02d52d6d7792f82d97f1b8e15001fc08f9ab75a57a62fd849313c0a6b64d38af", size = 1098601, upload-time = "2026-07-13T13:57:10.071Z" },
+ { url = "https://files.pythonhosted.org/packages/00/9e/e5ca987e17e043079a391a1fff7c13f2b5ed6908a25b54baac2e41d2db84/python_calamine-0.8.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c55112b2b0f65f7e6757629e89d0b063689d8fa821736d9b81a1468db08d0085", size = 1191819, upload-time = "2026-07-13T13:57:11.758Z" },
+ { url = "https://files.pythonhosted.org/packages/78/23/4cc7cc53d342ad7b74e3780aefd60a6af0e132f3e5d964a1847ccfe32ea5/python_calamine-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2e8f0753f1ec064704e256a2d5793f42f0cb256710501cf060f5f3a47e5dabc8", size = 1135376, upload-time = "2026-07-13T13:57:13.391Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/8e/1a9649ffba117731b44ea57cd6c0b7925cc5a04b9d6f7858031cd9987f01/python_calamine-0.8.2-cp313-cp313-win32.whl", hash = "sha256:f276aa353f5be38e15968f861f7102abf53d1fe261638846e7e9c9913a124d7c", size = 733696, upload-time = "2026-07-13T13:57:15.028Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/d0/55b921a2459e4b1cba914a2ed94d5ad0d711c2015e33ab201038f4b1627e/python_calamine-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:62b7e41046056bfba7d2957a8a1566fc22a010a2929f0c8174c7a911555d0cf9", size = 774314, upload-time = "2026-07-13T13:57:16.753Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/ea/11d2d984d71673c6070a23d9a5fdd9bf174f83eb7e7c8909e27a4f9af740/python_calamine-0.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:024a367c90a61c02743f674025bcdd686a1cbe6466bb8fc67398ef5fbbfac4a2", size = 731178, upload-time = "2026-07-13T13:57:18.459Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/51/982cd7edc5e8886090adcc3b436e87a8ff8932a748269fba30ac6151551f/python_calamine-0.8.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:612904f321fa1c399f03efab0f4a557914d7b8a155d25f244cb816a051eec82e", size = 866292, upload-time = "2026-07-13T13:57:20.229Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/30/816181f86ec744c142e8efc6fdac49ab61221a1387fbd13798424a72995b/python_calamine-0.8.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5dd0d8934c5b65392b7fe6f149c5b2eec0ce422ec50f35a389b579f53a3ad94c", size = 847675, upload-time = "2026-07-13T13:57:22.034Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/be/2c82689a076e438fa310fa8119e5e1d1166e2419a122f6137808a1a70a64/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccd41bed56ae3a7ff0de6f71860cd13edcf3ebc42eefb58eab201b5cc6ec7660", size = 923867, upload-time = "2026-07-13T13:57:23.739Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/3d/8e5da593780efb767f0d0fcaccec9f4bcc6f9beba9281969b2c51fee05f8/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:19c8d87444fe83ca0cebd95e01cb7166f1844455120319de4ef8581e03f63b22", size = 917529, upload-time = "2026-07-13T13:57:25.83Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/2f/56334bdb7c1bbdb2474ff927afeff72ebb558a301e2dfbb1691e6969e0e1/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5be7dca31f391cc2bc3d86a9e1ef88d51240565e9849b23642b3b95bd7ce29ad", size = 1089145, upload-time = "2026-07-13T13:57:27.658Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/99/908da083c1faa6ee215be079238f7d25022eaa577dd9fa3e88814f39dfec/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40f1c657eaa988a50638fc584226391e6897ba676ec3e35aaed0db7d8b02e3ed", size = 987785, upload-time = "2026-07-13T13:57:29.57Z" },
+ { url = "https://files.pythonhosted.org/packages/52/90/f7a71c8991911a431ed31f83cd9f3a49bf0e0e3395a27d3a47f60dd55826/python_calamine-0.8.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3cfce465ce82eb9100e5e90673a5844fd46eb7b8148c5404c70f941fd8280b", size = 921563, upload-time = "2026-07-13T13:57:31.268Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/2e/768d8686fa4d87d6bcdee21959845d767e4913066e562cddd048516f9edd/python_calamine-0.8.2-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3655c08901562d7c44853ba966a62104637f216a67aa5ba5628115067811b3f2", size = 998078, upload-time = "2026-07-13T13:57:33.483Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/b3/12273f5ea9df335eeb896e8f8d54dfd888b52d57f03d0e6163c86be28ac1/python_calamine-0.8.2-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c72d5310e28a517cbb14812cd60a41c264d65b2424e6413c08f5f7160eebafd4", size = 1099253, upload-time = "2026-07-13T13:57:35.404Z" },
+ { url = "https://files.pythonhosted.org/packages/02/64/3f222cc693eb6bbae0cf1bfa3c45300d6024cb515a8380779ca46ea096db/python_calamine-0.8.2-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:2e88eef40b2f39aa9c32cf6d2d7e6bf0c8669547f8a196883bae6d202458b358", size = 1193093, upload-time = "2026-07-13T13:57:37.147Z" },
+ { url = "https://files.pythonhosted.org/packages/56/a0/91d06d24caa01cbb7d020155a0ba565d5acb15b873705c72c69dc36351fc/python_calamine-0.8.2-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8e9b57dc1553bf86e2793d86e0b9268855f5382391f01be78c9c06aa30bad3a7", size = 1138084, upload-time = "2026-07-13T13:57:39.059Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/ba/279277863792e26982c6a9c9b9700c36b4319e7ad3424fc4e8164b6db5a7/python_calamine-0.8.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:74f5038df6c40316e7f1d20c7d478baf6a6bd227e91f17aae2723014156a895f", size = 515427, upload-time = "2026-07-13T13:57:40.66Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/39/29677d6a4b5bffc78b35bb6a30e904ec0af71dc0bfc105a342150fdce70c/python_calamine-0.8.2-cp314-cp314-win32.whl", hash = "sha256:853e6789c781184998bc13c9a1affde29ef76d07112e339e379c45f4ffe0d911", size = 722761, upload-time = "2026-07-13T13:57:42.399Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/71/bd69ce8cc651d1db6a6c2051c1d34fa22fc6ea6bbfb3cbf1feb49fb2b25a/python_calamine-0.8.2-cp314-cp314-win_amd64.whl", hash = "sha256:408c60e8c5671c87dec3fda2268475bafcd05dfc7684c72ad15adb050ae5dc45", size = 776909, upload-time = "2026-07-13T13:57:44.451Z" },
+ { url = "https://files.pythonhosted.org/packages/97/00/1da6c1d4a9a83be80273e2136b10a665da53012a86388895e9554d65a7e5/python_calamine-0.8.2-cp314-cp314-win_arm64.whl", hash = "sha256:16630004b39bf4a0dcce09653fd28390781a2db07e9d8bcb0f85d8e5d1814707", size = 746538, upload-time = "2026-07-13T13:57:46.195Z" },
+ { url = "https://files.pythonhosted.org/packages/33/ce/a089dee93f684398101a807177cc9fd5c0f04ea98dbf1c6b12d761a3e0b1/python_calamine-0.8.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:1d1db66f7043d13fd6f6c5d77c7b34598864ad14e613d02cc538ec3e9b46d296", size = 861568, upload-time = "2026-07-13T13:57:48.146Z" },
+ { url = "https://files.pythonhosted.org/packages/64/ab/6f5a02a28d06070bcaefaa60f980097ea10ce1302912822e9cad976afc83/python_calamine-0.8.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3478b5f950e9722d284271b3cf7a7e83c43a0f93cb665474f8a158e12699a52e", size = 844446, upload-time = "2026-07-13T13:57:49.849Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/9b/01bccf504edeb5419c4a138302004c7a3b14db537554f0da8b4b217c94d1/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c307f6e5f5c55a58a3a64b96dd3a7ca437570efea8e1b8515108b1cfd9adf46", size = 920817, upload-time = "2026-07-13T13:57:51.816Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/65/c555639d38376908a2258ad7c06e8f12ffb774343531dddd5acce1a7be9f/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7dc9d63b44b0681a3ff4be1810bf63042d3492bba3e4dbf0273318170fb82e59", size = 915360, upload-time = "2026-07-13T13:57:53.576Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/a2/ba37bc638ecf4dbf651cb0e9db4fac495881739434c7eb106653bc686f8f/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd903b60575bf8ec45c5797a64d1960e46cafe0d5ae479131d739aba6f094775", size = 1086101, upload-time = "2026-07-13T13:57:55.575Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/41/732501f6a965284dc429c56d90f56328ad5c9ec57ccc6404b6bd5a07605a/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5770e6fb816792ff329505d4a6a0eb3439b0b5e5c05f601268fb3bae26a52844", size = 985151, upload-time = "2026-07-13T13:57:57.357Z" },
+ { url = "https://files.pythonhosted.org/packages/71/4a/90f3646da7c8546153229b9df2f97cd3dcb644d747bc28e0ae7773e6f3fa/python_calamine-0.8.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7351f2e8833ff6d6e2e6bf7bf1327a69527513f5e8cfb8d51f13ea32d2bcfb16", size = 921694, upload-time = "2026-07-13T13:57:59.071Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/7b/96aedc02df1cb762578b44af05413d51cae9b041319c0c200ddfc4aa36c3/python_calamine-0.8.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1804917c652b674e9456419f4c80add237b2edc94e192e9b6b7ccd7b2a7c4105", size = 996333, upload-time = "2026-07-13T13:58:00.856Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/9a/b152b3d25f778cf5b90b60df9fec57ddb2f3d5c2c16ed08e751421a64d30/python_calamine-0.8.2-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:4ae30729fa4032f7a5d3fdca6968f4b5774967ea67bb62d7e5d198350419adc4", size = 1096283, upload-time = "2026-07-13T13:58:02.669Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/25/9c8c877f1632e70681437471a63e4d0ec150f72219665e1bcc0d2ba9d14b/python_calamine-0.8.2-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:67dad173dce245859eeb8335e8808835b53245bab75bf5a5b9f20435357c5156", size = 1191124, upload-time = "2026-07-13T13:58:04.747Z" },
+ { url = "https://files.pythonhosted.org/packages/32/36/035b56decd6c0855203a21235c501c9d1c0965a0cd80f5299a561f05228b/python_calamine-0.8.2-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3013f0872b6e4f52173d98fa0a6dbb83f1858440c1b858690893339e7d813c38", size = 1137036, upload-time = "2026-07-13T13:58:06.457Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/ff/8bda87f105165a4535615d07f923f8490c2daa2a0bc2489549e9b182fe56/python_calamine-0.8.2-cp314-cp314t-win_amd64.whl", hash = "sha256:288a8f4556ae8df3c813c61da2749eb627b1cfb97222118f5413bb8c7a0c7f02", size = 775005, upload-time = "2026-07-13T13:58:08.221Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/4c/f39b08d79e452bd3c7edb15285e096fc8b1fe67a76ad10c4622d4baacfb1/python_calamine-0.8.2-cp314-cp314t-win_arm64.whl", hash = "sha256:f57c2cfc7854fac87fb0c8e4fba5eb25184f75f7bf340847deac6726d2c3b601", size = 744119, upload-time = "2026-07-13T13:58:10.018Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/76/7c558e6eb904fd05cf9c3e59464df5d03f507d87ce564df0452f15d848cf/python_calamine-0.8.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1d13023efd46b242c7ade9ea043bee11184bd8cb4f1da76832ebc18282eda858", size = 866176, upload-time = "2026-07-13T13:58:11.928Z" },
+ { url = "https://files.pythonhosted.org/packages/56/4f/047d131bdea829e147d62526fce45c0ce1abb385ef3a1b8dfc135f5b0016/python_calamine-0.8.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd2fe069bd3a7894eb78259252493b1272be5ed82edcc35131565daff8e74758", size = 855816, upload-time = "2026-07-13T13:58:13.785Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/23/ae50c3d6bfe8d0e0d2c9fbcc242fa23a0847217bb8316cc7e59f5425fe09/python_calamine-0.8.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d5ab4a3e6e710d8c77c314a70b0c89e6ccbe934e10fb97f1d5970416ababf5d", size = 929717, upload-time = "2026-07-13T13:58:15.746Z" },
+ { url = "https://files.pythonhosted.org/packages/43/fe/0fc0f06d82e8743c8f95cdaada31d7c54b114b787e9577fe319cd6f81c4a/python_calamine-0.8.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a9fd05a000d4e28ad6cc87f258ea46681c24568c2738cda24ec44fae9aa20a3", size = 928256, upload-time = "2026-07-13T13:58:17.578Z" },
+ { url = "https://files.pythonhosted.org/packages/59/e0/db2a1b9fc7d2bdd8300a376c16f45edb16049eeb151a59bf04ac6cc80ad7/python_calamine-0.8.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4f4323d0f05be5f729fa8c165bdc6f19c89114f538ab994f0de5da90adc05302", size = 1006762, upload-time = "2026-07-13T13:58:19.55Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/f6/7e1b30dad9a0bb18d71bb4ebffab46fc835711e07450b40c987825315d7c/python_calamine-0.8.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e38b7285af2e7e7628173754671feffecdc9705f007fd3b01b6a899be61a4be8", size = 1106333, upload-time = "2026-07-13T13:58:21.384Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/a8/7a3ad60bff627d81f74ba9e552c86d8821fcdd4f24b67511487c1e578eb5/python_calamine-0.8.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c5cfc20448c5fcfee42d26e70bb9416892b1b26aad9fd7126de31cceb13826a3", size = 1199755, upload-time = "2026-07-13T13:58:23.35Z" },
+ { url = "https://files.pythonhosted.org/packages/80/a2/7d953a413905314ef2d03f9b6d552f7f8685fb28a175905b0de51d03b94c/python_calamine-0.8.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:9b5fc52cc2fb496c038781ad6ca86d5017a615075ae04a45c7de6160bfe4beb9", size = 1145928, upload-time = "2026-07-13T13:58:25.242Z" },
+]
+
[[package]]
name = "ruff"
version = "0.16.6"
@@ -562,25 +863,74 @@ dependencies = [
{ name = "pydantic" },
]
+[package.optional-dependencies]
+files = [
+ { name = "msoffcrypto-tool" },
+ { name = "openpyxl" },
+ { name = "python-calamine" },
+ { name = "xlrd" },
+]
+pdf = [
+ { name = "pypdf" },
+]
+
[package.dev-dependencies]
dev = [
+ { name = "msoffcrypto-tool" },
{ name = "mypy" },
+ { name = "openpyxl" },
+ { name = "pypdf" },
{ name = "pytest" },
+ { name = "python-calamine" },
{ name = "ruff" },
+ { name = "types-openpyxl" },
+ { name = "types-xlrd" },
+ { name = "xlrd" },
]
[package.metadata]
requires-dist = [
{ name = "httpx", specifier = ">=0.28.1" },
{ name = "httpx-retries", specifier = ">=0.4.5" },
+ { name = "msoffcrypto-tool", marker = "extra == 'files'", specifier = ">=6.0.0" },
+ { name = "openpyxl", marker = "extra == 'files'", specifier = ">=3.1.5" },
{ name = "pydantic", specifier = ">=2.10.0" },
+ { name = "pypdf", marker = "extra == 'pdf'", specifier = ">=6.12.0" },
+ { name = "python-calamine", marker = "extra == 'files'", specifier = ">=0.8.2" },
+ { name = "xlrd", marker = "extra == 'files'", specifier = ">=2.0.2" },
]
+provides-extras = ["files", "pdf"]
[package.metadata.requires-dev]
dev = [
+ { name = "msoffcrypto-tool", specifier = ">=6.0.0" },
{ name = "mypy", specifier = ">=2.3.1" },
+ { name = "openpyxl", specifier = ">=3.1.5" },
+ { name = "pypdf", specifier = ">=6.12.0" },
{ name = "pytest", specifier = ">=9.1.1" },
+ { name = "python-calamine", specifier = ">=0.8.2" },
{ name = "ruff", specifier = ">=0.16.6" },
+ { name = "types-openpyxl", specifier = ">=3.1.5" },
+ { name = "types-xlrd", specifier = ">=2.0.0.20260518" },
+ { name = "xlrd", specifier = ">=2.0.2" },
+]
+
+[[package]]
+name = "types-openpyxl"
+version = "3.1.5.20260827"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8e/6b/ce650ce7754a2bce3ca1dfbce7f7441df092e2dc6047d00e04f840c2b56e/types_openpyxl-3.1.5.20260827.tar.gz", hash = "sha256:be8b605fb99cfd7d5f5576d4a508e8ec44be2dd15b85157c559080de6384be34", size = 101985, upload-time = "2026-08-27T12:06:18.927Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/12/23/9708c0895d237205ab2b31c06f97d72294f69789ff9923ff7f4aa2126d6b/types_openpyxl-3.1.5.20260827-py3-none-any.whl", hash = "sha256:94e176d871d12e3cbc34f8fb03dc14db2a4245a6690791daf16fc7b08fd67869", size = 165885, upload-time = "2026-08-27T12:06:17.88Z" },
+]
+
+[[package]]
+name = "types-xlrd"
+version = "2.0.0.20260518"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2e/a8/2e0cff3a842f4f32dc5b1bec6e29fd13fc64124f7ea92368c2997e62738d/types_xlrd-2.0.0.20260518.tar.gz", hash = "sha256:238031699230d0bc3dbcf3b67fc440e6c3b56cccae82a512ad1b748e1a2eaf91", size = 14017, upload-time = "2026-05-18T06:04:27.086Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/61/f4/927ae5a8ba20f996ab26e83166207176ef19cf029d9a6b50150713725a42/types_xlrd-2.0.0.20260518-py3-none-any.whl", hash = "sha256:710c97c0a2dae288504a7c7037397b7a639563681b53890529c2342dd5194b42", size = 16891, upload-time = "2026-05-18T06:04:26.259Z" },
]
[[package]]
@@ -603,3 +953,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac
wheels = [
{ url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" },
]
+
+[[package]]
+name = "xlrd"
+version = "2.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload-time = "2025-06-14T08:46:39.039Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" },
+]