Ercot 60d Utils
====================================

.. py:module:: gridstatus.ercot_60d_utils


Module Contents
---------------

Classes Summary
~~~~~~~~~~~~~~~

.. autoapisummary::

   gridstatus.ercot_60d_utils.CurveOutputFormat




Functions
~~~~~~~~~

.. autoapisummary::
   :nosignatures:

   gridstatus.ercot_60d_utils.extract_curve
   gridstatus.ercot_60d_utils.extract_curve_as_pg_string
   gridstatus.ercot_60d_utils.make_storage_resources
   gridstatus.ercot_60d_utils.match_gen_load_names
   gridstatus.ercot_60d_utils.process_as_offer_curves
   gridstatus.ercot_60d_utils.process_dam_energy_bid_awards
   gridstatus.ercot_60d_utils.process_dam_energy_bids
   gridstatus.ercot_60d_utils.process_dam_energy_only_offer_awards
   gridstatus.ercot_60d_utils.process_dam_energy_only_offers
   gridstatus.ercot_60d_utils.process_dam_esr
   gridstatus.ercot_60d_utils.process_dam_esr_as_offers
   gridstatus.ercot_60d_utils.process_dam_gen
   gridstatus.ercot_60d_utils.process_dam_load
   gridstatus.ercot_60d_utils.process_dam_or_gen_load_as_offers
   gridstatus.ercot_60d_utils.process_dam_ptp_obligation_bid_awards
   gridstatus.ercot_60d_utils.process_dam_ptp_obligation_bids
   gridstatus.ercot_60d_utils.process_dam_ptp_obligation_option
   gridstatus.ercot_60d_utils.process_dam_ptp_obligation_option_awards
   gridstatus.ercot_60d_utils.process_sced_as_offer_updates_in_op_hour
   gridstatus.ercot_60d_utils.process_sced_esr
   gridstatus.ercot_60d_utils.process_sced_gen
   gridstatus.ercot_60d_utils.process_sced_load
   gridstatus.ercot_60d_utils.process_sced_resource_as_offers



Attributes Summary
~~~~~~~~~~~~~~~~~~~

.. autoapisummary::

   gridstatus.ercot_60d_utils.DAM_ENERGY_BID_AWARDS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_ENERGY_BID_AWARDS_KEY
   gridstatus.ercot_60d_utils.DAM_ENERGY_BIDS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_ENERGY_BIDS_KEY
   gridstatus.ercot_60d_utils.DAM_ENERGY_ONLY_OFFER_AWARDS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_ENERGY_ONLY_OFFER_AWARDS_KEY
   gridstatus.ercot_60d_utils.DAM_ENERGY_ONLY_OFFERS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_ENERGY_ONLY_OFFERS_KEY
   gridstatus.ercot_60d_utils.DAM_ESR_AS_OFFERS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_ESR_AS_OFFERS_KEY
   gridstatus.ercot_60d_utils.DAM_ESR_COLUMNS
   gridstatus.ercot_60d_utils.DAM_ESR_KEY
   gridstatus.ercot_60d_utils.DAM_GEN_RESOURCE_AS_OFFERS_KEY
   gridstatus.ercot_60d_utils.DAM_GEN_RESOURCE_COLUMNS
   gridstatus.ercot_60d_utils.DAM_GEN_RESOURCE_KEY
   gridstatus.ercot_60d_utils.DAM_LOAD_RESOURCE_AS_OFFERS_KEY
   gridstatus.ercot_60d_utils.DAM_LOAD_RESOURCE_COLUMNS
   gridstatus.ercot_60d_utils.DAM_LOAD_RESOURCE_KEY
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_BID_AWARDS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_BID_AWARDS_KEY
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_BIDS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_BIDS_KEY
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_OPTION_AWARDS_COLUMNS
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_OPTION_AWARDS_KEY
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_OPTION_COLUMNS
   gridstatus.ercot_60d_utils.DAM_PTP_OBLIGATION_OPTION_KEY
   gridstatus.ercot_60d_utils.DAM_RESOURCE_AS_OFFERS_COLUMNS
   gridstatus.ercot_60d_utils.logger
   gridstatus.ercot_60d_utils.SCED_AS_OFFER_UPDATES_IN_OP_HOUR_COLUMNS
   gridstatus.ercot_60d_utils.SCED_AS_OFFER_UPDATES_IN_OP_HOUR_KEY
   gridstatus.ercot_60d_utils.SCED_ESR_COLUMNS
   gridstatus.ercot_60d_utils.SCED_ESR_KEY
   gridstatus.ercot_60d_utils.SCED_GEN_RESOURCE_COLUMNS
   gridstatus.ercot_60d_utils.SCED_GEN_RESOURCE_KEY
   gridstatus.ercot_60d_utils.SCED_LOAD_RESOURCE_COLUMNS
   gridstatus.ercot_60d_utils.SCED_LOAD_RESOURCE_KEY
   gridstatus.ercot_60d_utils.SCED_RESOURCE_AS_OFFERS_COLUMNS
   gridstatus.ercot_60d_utils.SCED_RESOURCE_AS_OFFERS_KEY
   gridstatus.ercot_60d_utils.SCED_SMNE_COLUMNS
   gridstatus.ercot_60d_utils.SCED_SMNE_KEY


Contents
~~~~~~~~~~~~~~~~~~~
.. py:class:: CurveOutputFormat

   Bases: :py:obj:`enum.StrEnum`

   Output format for extracted offer curves.

   LIST: Returns Python list-of-lists per cell (default).
   PG_ARRAY_AS_STRING: Returns PostgreSQL array strings like '{{mw,price},{mw,price}}'
       directly, using ~3x less peak memory.

   Initialize self.  See help(type(self)) for accurate signature.


   **Attributes**

   .. list-table::
      :widths: 15 85
      :header-rows: 0

      * - **LIST**
        - 'list'
      * - **PG_ARRAY_AS_STRING**
        - 'pg_array_as_string'



.. py:data:: DAM_ENERGY_BID_AWARDS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'Settlement Point Name', 'QSE', 'Bid ID', 'Energy Only Bid...


.. py:data:: DAM_ENERGY_BID_AWARDS_KEY
   :value: 'dam_energy_bid_awards'


.. py:data:: DAM_ENERGY_BIDS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'Settlement Point Name', 'QSE', 'Energy Only Bid ID', 'Energy...


.. py:data:: DAM_ENERGY_BIDS_KEY
   :value: 'dam_energy_bids'


.. py:data:: DAM_ENERGY_ONLY_OFFER_AWARDS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'Settlement Point Name', 'QSE', 'Offer ID', 'Energy Only...


.. py:data:: DAM_ENERGY_ONLY_OFFER_AWARDS_KEY
   :value: 'dam_energy_only_offer_awards'


.. py:data:: DAM_ENERGY_ONLY_OFFERS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'Settlement Point Name', 'QSE', 'Energy Only Offer ID',...


.. py:data:: DAM_ENERGY_ONLY_OFFERS_KEY
   :value: 'dam_energy_only_offers'


.. py:data:: DAM_ESR_AS_OFFERS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'DME', 'Resource Name', 'Multi-Hour Block Flag',...


.. py:data:: DAM_ESR_AS_OFFERS_KEY
   :value: 'dam_esr_as_offers'


.. py:data:: DAM_ESR_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'DME', 'Resource Name', 'Resource Type', 'Settlement...


.. py:data:: DAM_ESR_KEY
   :value: 'dam_esr'


.. py:data:: DAM_GEN_RESOURCE_AS_OFFERS_KEY
   :value: 'dam_gen_resource_as_offers'


.. py:data:: DAM_GEN_RESOURCE_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'DME', 'Resource Name', 'Resource Type', 'Settlement...


.. py:data:: DAM_GEN_RESOURCE_KEY
   :value: 'dam_gen_resource'


.. py:data:: DAM_LOAD_RESOURCE_AS_OFFERS_KEY
   :value: 'dam_load_resource_as_offers'


.. py:data:: DAM_LOAD_RESOURCE_COLUMNS
   :value: ['Time', 'Interval Start', 'Interval End', 'Resource Name', 'Max Power Consumption for Load...


.. py:data:: DAM_LOAD_RESOURCE_KEY
   :value: 'dam_load_resource'


.. py:data:: DAM_PTP_OBLIGATION_BID_AWARDS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'Settlement Point Source', 'Settlement Point Sink',...


.. py:data:: DAM_PTP_OBLIGATION_BID_AWARDS_KEY
   :value: 'dam_ptp_obligation_bid_awards'


.. py:data:: DAM_PTP_OBLIGATION_BIDS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'Settlement Point Source', 'Settlement Point Sink',...


.. py:data:: DAM_PTP_OBLIGATION_BIDS_KEY
   :value: 'dam_ptp_obligation_bids'


.. py:data:: DAM_PTP_OBLIGATION_OPTION_AWARDS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'Settlement Point Source', 'Settlement Point Sink',...


.. py:data:: DAM_PTP_OBLIGATION_OPTION_AWARDS_KEY
   :value: 'dam_ptp_obligation_option_awards'


.. py:data:: DAM_PTP_OBLIGATION_OPTION_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'Settlement Point Source', 'Settlement Point Sink',...


.. py:data:: DAM_PTP_OBLIGATION_OPTION_KEY
   :value: 'dam_ptp_obligation_option'


.. py:data:: DAM_RESOURCE_AS_OFFERS_COLUMNS
   :value: ['Interval Start', 'Interval End', 'QSE', 'DME', 'Resource Name', 'Multi-Hour Block Flag',...


.. py:function:: extract_curve(df, curve_name=None, mw_suffix='-MW', price_suffix='-Price', mw_cols=None, price_cols=None, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

   Extract offer curve from dataframe columns.

   Supports two modes:
   1. Auto-detect columns by curve_name prefix (default):
      Looks for columns like "{curve_name}-MW1", "{curve_name}-Price1"

   2. Explicit column lists:
      Pass mw_cols and price_cols directly for custom column patterns
      e.g., mw_cols=["QUANTITY_MW1", "QUANTITY_MW2"],
            price_cols=["PRICE1_URS", "PRICE2_URS"]

   :param df: DataFrame with curve data columns.
   :param curve_name: Prefix for auto-detecting MW/Price columns.
   :param mw_suffix: Suffix for MW columns in auto-detect mode.
   :param price_suffix: Suffix for price columns in auto-detect mode.
   :param mw_cols: Explicit list of MW column names.
   :param price_cols: Explicit list of price column names.
   :param output_format: CurveOutputFormat.LIST (default) returns Python list-of-lists
                         per cell. CurveOutputFormat.PG_ARRAY_AS_STRING returns PG array strings like
                         '{{mw,price},{mw,price}}' directly, using ~3x less peak memory.


.. py:function:: extract_curve_as_pg_string(df, mw_cols, price_cols)

   Like extract_curve() but returns PG array strings directly.

   Returns pd.Series of strings like '{{100.0,25.5},{200.0,60.0}}'
   instead of Python list-of-lists. ~3x less peak memory.


.. py:data:: logger

.. py:function:: make_storage_resources(data)

.. py:function:: match_gen_load_names(list1, list2)

   Match generator and load names


.. py:function:: process_as_offer_curves(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_dam_energy_bid_awards(df)

.. py:function:: process_dam_energy_bids(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_dam_energy_only_offer_awards(df)

.. py:function:: process_dam_energy_only_offers(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_dam_esr(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_dam_esr_as_offers(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_dam_gen(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_dam_load(df)

.. py:function:: process_dam_or_gen_load_as_offers(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_dam_ptp_obligation_bid_awards(df)

.. py:function:: process_dam_ptp_obligation_bids(df)

.. py:function:: process_dam_ptp_obligation_option(df)

.. py:function:: process_dam_ptp_obligation_option_awards(df)

.. py:function:: process_sced_as_offer_updates_in_op_hour(df)

   Process SCED AS Offer Updates in Operating Hour data.

   This data tracks the count of Ancillary Service offer updates
   made by resources during operating hours.

   Expects df to already have Interval Start/End from parse_doc().


.. py:function:: process_sced_esr(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_sced_gen(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_sced_load(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

.. py:function:: process_sced_resource_as_offers(df, output_format: CurveOutputFormat | str = CurveOutputFormat.LIST)

   Process SCED Resource AS Offers data.

   This data contains ancillary service offer curves at the SCED timestamp level.
   Each row has price/quantity pairs for each AS type across 6 blocks.

   Source columns: PRICEn_URS, PRICEn_DRS, PRICEn_RRSPF, PRICEn_RRSUF,
                  PRICEn_RRSFF, PRICEn_NS, PRICEn_ECRS, QUANTITY_MWn (n=1-6)

   Creates offer curves for each AS type. Format depends on output_format:
   list-of-lists like [[mw, price], ...] or PG array strings.

   :param df: DataFrame with raw SCED resource AS offers data.
   :param output_format: "list" (default) returns Python list-of-lists per cell.
                         "pg_array_as_string" returns PG array strings like '{{mw,price},{mw,price}}'
                         directly, using ~3x less peak memory.


.. py:data:: SCED_AS_OFFER_UPDATES_IN_OP_HOUR_COLUMNS
   :value: ['Interval Start', 'Interval End', 'Resource Name', 'AS Type', 'Count of Updates During...


.. py:data:: SCED_AS_OFFER_UPDATES_IN_OP_HOUR_KEY
   :value: 'sced_as_offer_updates_in_op_hour'


.. py:data:: SCED_ESR_COLUMNS
   :value: ['SCED Timestamp', 'QSE', 'DME', 'Resource Name', 'Resource Type', 'SCED1 Offer Curve', 'SCED2...


.. py:data:: SCED_ESR_KEY
   :value: 'sced_esr'


.. py:data:: SCED_GEN_RESOURCE_COLUMNS
   :value: ['SCED Timestamp', 'QSE', 'DME', 'Resource Name', 'Resource Type', 'Telemetered Resource...


.. py:data:: SCED_GEN_RESOURCE_KEY
   :value: 'sced_gen_resource'


.. py:data:: SCED_LOAD_RESOURCE_COLUMNS
   :value: ['SCED Timestamp', 'QSE', 'DME', 'Resource Name', 'Telemetered Resource Status', 'Max Power...


.. py:data:: SCED_LOAD_RESOURCE_KEY
   :value: 'sced_load_resource'


.. py:data:: SCED_RESOURCE_AS_OFFERS_COLUMNS
   :value: ['SCED Timestamp', 'Resource Name', 'Curve Type', 'URS Offer Curve', 'DRS Offer Curve', 'RRSPFR...


.. py:data:: SCED_RESOURCE_AS_OFFERS_KEY
   :value: 'sced_resource_as_offers'


.. py:data:: SCED_SMNE_COLUMNS
   :value: ['Interval Start', 'Interval End', 'Interval Time', 'Interval Number', 'Resource Name', 'Interval Value']


.. py:data:: SCED_SMNE_KEY
   :value: 'sced_smne'


