Source code for pudl.metadata.resources.mcoe

"""Resource metadata for the generator table with derived attributes."""

from typing import Any

[docs] AGG_FREQS = ["yearly", "monthly"]
[docs] FILTERING_WARNING = ( "Note that the values in this table are unfiltered and we " "expect some of the values are unreasonable and out of bounds." "This table should not be used without filtering values to within " "logical boundaries." )
[docs] RESOURCE_METADATA: dict[str, dict[str, Any]] = ( { f"_out_eia__{freq}_heat_rate_by_unit": { "description": ( f"{freq.title()} heat rate estimates by generation unit. Generation " "units are identified by ``unit_id_pudl`` and are composed of a set of " f"interconnected boilers and generators. {FILTERING_WARNING}" ), "schema": { "fields": [ "report_date", "plant_id_eia", "unit_id_pudl", "net_generation_mwh", "fuel_consumed_for_electricity_mmbtu", "unit_heat_rate_mmbtu_per_mwh", ], "primary_key": [ "report_date", "plant_id_eia", "unit_id_pudl", ], }, "field_namespace": "eia", "sources": ["eia923", "eia860"], "etl_group": "outputs", } for freq in AGG_FREQS } | { f"_out_eia__{freq}_heat_rate_by_generator": { "description": ( f"{freq.title()} heat rate estimates by generator. These are actually " "just generation unit level heat rates, which have been broadcast " "across all constituent generator IDs, since heat rates really only " "have a well-defined meaning in the context of a generation unit." f"{FILTERING_WARNING}" ), "schema": { "fields": [ "report_date", "plant_id_eia", "unit_id_pudl", "generator_id", "unit_heat_rate_mmbtu_per_mwh", "fuel_type_code_pudl", "fuel_type_count", "prime_mover_code", ], "primary_key": [ "report_date", "plant_id_eia", "generator_id", ], }, "field_namespace": "eia", "sources": ["eia923", "eia860"], "etl_group": "outputs", } for freq in AGG_FREQS } | { f"_out_eia__{freq}_capacity_factor_by_generator": { "description": ( f"{freq.title()} estimates of generator capacity factor. Capacity " "factor is calculated based on reported generator capacity and the " "allocated net generation reported in the generation and generation " f"fuel tables. {FILTERING_WARNING}" ), "schema": { "fields": [ "report_date", "plant_id_eia", "generator_id", "net_generation_mwh", "capacity_mw", "capacity_factor", ], "primary_key": [ "report_date", "plant_id_eia", "generator_id", ], }, "field_namespace": "eia", "sources": ["eia923", "eia860"], "etl_group": "outputs", } for freq in AGG_FREQS } | { f"_out_eia__{freq}_fuel_cost_by_generator": { "description": ( f"{freq.title()} estimate of per-generator fuel costs both per MMBTU " "and per MWh. These calculations are based on the allocation of net " "generation and fuel consumption as well as plant-level delivered fuel prices " "reported in the fuel receipts and cost table. The intermediary heat rate " "calculation depends on having the unit ID filled in, which means fuel cost " "coverage is low. The fuel costs are also currently aggregated to coarse fuel " "categories rather than using the more detailed energy source codes." f"{FILTERING_WARNING}" ), "schema": { "fields": [ "report_date", "plant_id_eia", "generator_id", "unit_id_pudl", "plant_name_eia", "plant_id_pudl", "utility_id_eia", "utility_name_eia", "utility_id_pudl", "fuel_type_count", "fuel_type_code_pudl", "fuel_cost_from_eiaapi", "fuel_cost_per_mmbtu", "unit_heat_rate_mmbtu_per_mwh", "fuel_cost_per_mwh", ], "primary_key": [ "report_date", "plant_id_eia", "generator_id", ], }, "field_namespace": "eia", "sources": ["eia923", "eia860"], "etl_group": "outputs", } for freq in AGG_FREQS } | { f"_out_eia__{freq}_derived_generator_attributes": { "description": ( f"{freq.title()} generator capacity factor, heat rate, fuel cost per MMBTU and fuel cost " "per MWh. These calculations are based on the allocation of net generation reported on " "the basis of plant, prime mover and energy source to individual generators. Heat rates " "by generator-month are estimated by using allocated estimates for per-generator net " "generation and fuel consumption as well as the :ref:`core_eia923__monthly_boiler_fuel` table, which " "reports fuel consumed by boiler. Heat rates are necessary to estimate the amount of fuel " "consumed by a generation unit, and thus the fuel cost per MWh generated. Plant specific " "fuel prices are taken from the :ref:`core_eia923__monthly_fuel_receipts_costs` table, which only has " "~70% coverage, leading to some generators with heat rate estimates still lacking fuel " "cost estimates." ), "schema": { "fields": [ "plant_id_eia", "generator_id", "unit_id_pudl", "report_date", "capacity_factor", "fuel_cost_from_eiaapi", "fuel_cost_per_mmbtu", "fuel_cost_per_mwh", "unit_heat_rate_mmbtu_per_mwh", "net_generation_mwh", "total_fuel_cost", "total_mmbtu", ], "primary_key": [ "report_date", "plant_id_eia", "generator_id", ], }, "field_namespace": "eia", "sources": ["eia923", "eia860"], "etl_group": "outputs", } for freq in AGG_FREQS } | { f"out_eia__{freq}_generators": { "description": ( f"{freq.title()} all generator attributes including calculated capacity factor, " "heat rate, fuel cost per MMBTU and fuel cost." ), "schema": { "fields": [ "plant_id_eia", "generator_id", "report_date", "unit_id_pudl", "plant_id_pudl", "plant_name_eia", "utility_id_eia", "utility_id_pudl", "utility_name_eia", "technology_description", "energy_source_code_1", "prime_mover_code", "generator_operating_date", "generator_retirement_date", "operational_status", "capacity_mw", "fuel_type_code_pudl", "planned_generator_retirement_date", "capacity_factor", "fuel_cost_from_eiaapi", "fuel_cost_per_mmbtu", "fuel_cost_per_mwh", "unit_heat_rate_mmbtu_per_mwh", "net_generation_mwh", "total_fuel_cost", "total_mmbtu", "associated_combined_heat_power", "bga_source", "bypass_heat_recovery", "carbon_capture", "city", "cofire_fuels", "county", "current_planned_generator_operating_date", "data_maturity", "deliver_power_transgrid", "distributed_generation", "duct_burners", "energy_source_1_transport_1", "energy_source_1_transport_2", "energy_source_1_transport_3", "energy_source_2_transport_1", "energy_source_2_transport_2", "energy_source_2_transport_3", "energy_source_code_2", "energy_source_code_3", "energy_source_code_4", "energy_source_code_5", "energy_source_code_6", "energy_storage_capacity_mwh", "ferc_qualifying_facility", "fluidized_bed_tech", "fuel_type_count", "latitude", "longitude", "minimum_load_mw", "multiple_fuels", "nameplate_power_factor", "net_capacity_mwdc", "operating_switch", "operational_status_code", "original_planned_generator_operating_date", "other_combustion_tech", "other_modifications_date", "other_planned_modifications", "owned_by_non_utility", "ownership_code", "planned_derate_date", "planned_energy_source_code_1", "planned_modifications", "planned_net_summer_capacity_derate_mw", "planned_net_summer_capacity_uprate_mw", "planned_net_winter_capacity_derate_mw", "planned_net_winter_capacity_uprate_mw", "planned_new_capacity_mw", "planned_new_prime_mover_code", "planned_repower_date", "planned_uprate_date", "previously_canceled", "pulverized_coal_tech", "reactive_power_output_mvar", "rto_iso_lmp_node_id", "rto_iso_location_wholesale_reporting_id", "solid_fuel_gasification", "startup_source_code_1", "startup_source_code_2", "startup_source_code_3", "startup_source_code_4", "state", "stoker_tech", "street_address", "subcritical_tech", "summer_capacity_estimate", "summer_capacity_mw", "summer_estimated_capability_mw", "supercritical_tech", "switch_oil_gas", "syncronized_transmission_grid", "time_cold_shutdown_full_load_code", "timezone", "topping_bottoming_code", "turbines_inverters_hydrokinetics", "turbines_num", "ultrasupercritical_tech", "uprate_derate_completed_date", "uprate_derate_during_year", "winter_capacity_estimate", "winter_capacity_mw", "winter_estimated_capability_mw", "zip_code", ], "primary_key": [ "report_date", "plant_id_eia", "generator_id", ], }, "field_namespace": "eia", "sources": ["eia923", "eia860"], "etl_group": "outputs", } for freq in AGG_FREQS } )