diff --git a/docs/release_notes.rst b/docs/release_notes.rst index ec0fbcfbc1..cad88c6274 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -9,6 +9,10 @@ v2024.XX.x (2024-MM-DD) New Data Coverage ^^^^^^^^^^^^^^^^^ +EIA 860 +~~~~~~~ +* Added EIA 860 Multifuel data. See :issue:`3438` and :pr:`3946`. + EIA 176 ~~~~~~~ * Add a couple of semi-transformed interim EIA-176 (natural gas sources and diff --git a/docs/templates/eia860_child.rst.jinja b/docs/templates/eia860_child.rst.jinja index 420863de16..c93fa4f94a 100644 --- a/docs/templates/eia860_child.rst.jinja +++ b/docs/templates/eia860_child.rst.jinja @@ -42,7 +42,6 @@ Each quarter, PUDL also combines data from the most recent EIA-860M filing with relevant EIA-860 tables. These records are marked with the ``monthly_update`` tag in the ``data_maturity`` field. -PUDL does not yet include the EIA-860 table for multi-fuel generators (Schedule 3.5). {% endblock %} diff --git a/migrations/versions/3b65c445d4b4_add_multifuel_table.py b/migrations/versions/3b65c445d4b4_add_multifuel_table.py new file mode 100644 index 0000000000..6ec4aca933 --- /dev/null +++ b/migrations/versions/3b65c445d4b4_add_multifuel_table.py @@ -0,0 +1,152 @@ +"""Add multifuel table + +Revision ID: 3b65c445d4b4 +Revises: 450d100cd30b +Create Date: 2025-01-28 18:38:52.927885 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '3b65c445d4b4' +down_revision = '450d100cd30b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('core_eia860__scd_generators_multifuel', + sa.Column('report_date', sa.Date(), nullable=False, comment='Date reported.'), + sa.Column('utility_id_eia', sa.Integer(), nullable=False, comment='The EIA Utility Identification number.'), + sa.Column('utility_name_eia', sa.Text(), nullable=True, comment='The name of the utility.'), + sa.Column('plant_id_eia', sa.Integer(), nullable=False, comment='The unique six-digit facility identification number, also called an ORISPL, assigned by the Energy Information Administration.'), + sa.Column('plant_name_eia', sa.Text(), nullable=True, comment='Plant name.'), + sa.Column('state', sa.Text(), nullable=True, comment='Two letter US state abbreviation.'), + sa.Column('county', sa.Text(), nullable=True, comment='County name.'), + sa.Column('generator_id', sa.Text(), nullable=False, comment='Generator ID is usually numeric, but sometimes includes letters. Make sure you treat it as a string!'), + sa.Column('operational_status_code', sa.Text(), nullable=True, comment='The operating status of the asset.'), + sa.Column('technology_description', sa.Text(), nullable=True, comment='High level description of the technology used by the generator to produce electricity.'), + sa.Column('prime_mover_code', sa.Text(), nullable=True, comment='Code for the type of prime mover (e.g. CT, CG)'), + sa.Column('sector_name_eia', sa.Text(), nullable=True, comment='EIA assigned sector name, corresponding to high level NAICS sector, designated by the primary purpose, regulatory status and plant-level combined heat and power status'), + sa.Column('sector_id_eia', sa.Integer(), nullable=True, comment='EIA assigned sector ID, corresponding to high level NAICS sector, designated by the primary purpose, regulatory status and plant-level combined heat and power status'), + sa.Column('capacity_mw', sa.Float(), nullable=True, comment='Total installed (nameplate) capacity, in megawatts.'), + sa.Column('summer_capacity_mw', sa.Float(), nullable=True, comment='The net summer capacity.'), + sa.Column('winter_capacity_mw', sa.Float(), nullable=True, comment='The net winter capacity.'), + sa.Column('current_planned_generator_operating_date', sa.Date(), nullable=True, comment='The most recently updated effective date on which the generator is scheduled to start operation'), + sa.Column('energy_source_code_1', sa.Text(), nullable=True, comment='The code representing the most predominant type of energy that fuels the generator.'), + sa.Column('energy_source_code_2', sa.Text(), nullable=True, comment='The code representing the second most predominant type of energy that fuels the generator'), + sa.Column('can_burn_multiple_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can burn multiple fuels.'), + sa.Column('can_cofire_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can co-fire fuels.'), + sa.Column('cofire_energy_source_1', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be co-fired.'), + sa.Column('cofire_energy_source_2', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be co-fired.'), + sa.Column('cofire_energy_source_3', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be co-fired.'), + sa.Column('cofire_energy_source_4', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be co-fired.'), + sa.Column('cofire_energy_source_5', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be co-fired.'), + sa.Column('cofire_energy_source_6', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be co-fired.'), + sa.Column('can_switch_oil_gas', sa.Boolean(), nullable=True, comment='Whether the generator can switch between oil and natural gas.'), + sa.Column('time_to_switch_oil_to_gas', sa.Text(), nullable=True, comment='The time required to switch the generator from running 100 percent oil to running 100 percent natural gas.'), + sa.Column('time_to_switch_gas_to_oil', sa.Text(), nullable=True, comment='The time required to switch the generator from running 100 percent natural gas to running 100 percent oil.'), + sa.Column('can_switch_when_operating', sa.Boolean(), nullable=True, comment='Whether the generator can switch fuel while operating.'), + sa.Column('net_summer_capacity_natural_gas_mw', sa.Float(), nullable=True, comment='The maximum net summer output achievable when running on natural gas.'), + sa.Column('net_summer_capacity_oil_mw', sa.Float(), nullable=True, comment='The maximum net summer output achievable when running on oil.'), + sa.Column('net_winter_capacity_natural_gas_mw', sa.Float(), nullable=True, comment='The maximum net winter output achievable when running on natural gas.'), + sa.Column('net_winter_capacity_oil_mw', sa.Float(), nullable=True, comment='The maximum net summer output achievable when running on oil.'), + sa.Column('has_factors_that_limit_switching', sa.Boolean(), nullable=True, comment="Whether there are factors that limit the generator's ability to switch between oil and natural gas."), + sa.Column('has_storage_limits', sa.Boolean(), nullable=True, comment="Whether limited on-site fuel storage is a factor that limits the generator's ability to switch between oil and natural gas."), + sa.Column('has_air_permit_limits', sa.Boolean(), nullable=True, comment='Whether air permit limits are a factor that limits the operation of the generator when running on 100 percent oil.'), + sa.Column('has_other_factors_that_limit_switching', sa.Boolean(), nullable=True, comment="Whether there are factors other than air permit limits and storage that limit the generator's ability to switch between oil and natural gas."), + sa.Column('can_cofire_oil_and_gas', sa.Boolean(), nullable=True, comment='Whether the generator can co-fire oil and gas.'), + sa.Column('can_cofire_100_oil', sa.Boolean(), nullable=True, comment='Whether the generator can co-fire 100 oil.'), + sa.Column('max_oil_heat_input', sa.Float(), nullable=True, comment='The maximum oil heat input (percent of MMBtus) expected for proposed unit when co-firing with natural gas'), + sa.Column('max_oil_output_mw', sa.Float(), nullable=True, comment='The maximum output (net MW) expected for proposed unit, when making the maximum use of oil and co-firing natural gas.'), + sa.Column('can_fuel_switch', sa.Boolean(), nullable=True, comment='Whether a unit is able to switch fuels.'), + sa.Column('has_regulatory_limits', sa.Boolean(), nullable=True, comment='Whether there are factors that limit the operation of the generator when running on 100 percent oil'), + sa.Column('fuel_switch_energy_source_1', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.'), + sa.Column('fuel_switch_energy_source_2', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.'), + sa.Column('fuel_switch_energy_source_3', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.'), + sa.Column('fuel_switch_energy_source_4', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.'), + sa.Column('fuel_switch_energy_source_5', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.'), + sa.Column('fuel_switch_energy_source_6', sa.Text(), nullable=True, comment='The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.'), + sa.ForeignKeyConstraint(['energy_source_code_1'], ['core_eia__codes_energy_sources.code'], name=op.f('fk_core_eia860__scd_generators_multifuel_energy_source_code_1_core_eia__codes_energy_sources')), + sa.ForeignKeyConstraint(['energy_source_code_2'], ['core_eia__codes_energy_sources.code'], name=op.f('fk_core_eia860__scd_generators_multifuel_energy_source_code_2_core_eia__codes_energy_sources')), + sa.ForeignKeyConstraint(['operational_status_code'], ['core_eia__codes_operational_status.code'], name=op.f('fk_core_eia860__scd_generators_multifuel_operational_status_code_core_eia__codes_operational_status')), + sa.ForeignKeyConstraint(['plant_id_eia', 'generator_id', 'report_date'], ['core_eia860__scd_generators.plant_id_eia', 'core_eia860__scd_generators.generator_id', 'core_eia860__scd_generators.report_date'], name=op.f('fk_core_eia860__scd_generators_multifuel_plant_id_eia_core_eia860__scd_generators')), + sa.ForeignKeyConstraint(['prime_mover_code'], ['core_eia__codes_prime_movers.code'], name=op.f('fk_core_eia860__scd_generators_multifuel_prime_mover_code_core_eia__codes_prime_movers')), + sa.ForeignKeyConstraint(['sector_id_eia'], ['core_eia__codes_sector_consolidated.code'], name=op.f('fk_core_eia860__scd_generators_multifuel_sector_id_eia_core_eia__codes_sector_consolidated')), + sa.ForeignKeyConstraint(['utility_id_eia', 'report_date'], ['core_eia860__scd_utilities.utility_id_eia', 'core_eia860__scd_utilities.report_date'], name=op.f('fk_core_eia860__scd_generators_multifuel_utility_id_eia_core_eia860__scd_utilities')), + sa.PrimaryKeyConstraint('report_date', 'utility_id_eia', 'generator_id', 'plant_id_eia', name=op.f('pk_core_eia860__scd_generators_multifuel')) + ) + with op.batch_alter_table('_out_eia__yearly_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('can_cofire_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can co-fire fuels.')) + batch_op.add_column(sa.Column('can_burn_multiple_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can burn multiple fuels.')) + batch_op.add_column(sa.Column('can_switch_oil_gas', sa.Boolean(), nullable=True, comment='Whether the generator can switch between oil and natural gas.')) + batch_op.drop_column('multiple_fuels') + batch_op.drop_column('cofire_fuels') + batch_op.drop_column('switch_oil_gas') + + with op.batch_alter_table('core_eia860__scd_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('can_burn_multiple_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can burn multiple fuels.')) + batch_op.add_column(sa.Column('can_cofire_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can co-fire fuels.')) + batch_op.add_column(sa.Column('can_switch_oil_gas', sa.Boolean(), nullable=True, comment='Whether the generator can switch between oil and natural gas.')) + batch_op.drop_column('multiple_fuels') + batch_op.drop_column('cofire_fuels') + batch_op.drop_column('switch_oil_gas') + + with op.batch_alter_table('out_eia__monthly_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('can_cofire_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can co-fire fuels.')) + batch_op.add_column(sa.Column('can_burn_multiple_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can burn multiple fuels.')) + batch_op.add_column(sa.Column('can_switch_oil_gas', sa.Boolean(), nullable=True, comment='Whether the generator can switch between oil and natural gas.')) + batch_op.drop_column('multiple_fuels') + batch_op.drop_column('cofire_fuels') + batch_op.drop_column('switch_oil_gas') + + with op.batch_alter_table('out_eia__yearly_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('can_cofire_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can co-fire fuels.')) + batch_op.add_column(sa.Column('can_burn_multiple_fuels', sa.Boolean(), nullable=True, comment='Whether the generator can burn multiple fuels.')) + batch_op.add_column(sa.Column('can_switch_oil_gas', sa.Boolean(), nullable=True, comment='Whether the generator can switch between oil and natural gas.')) + batch_op.drop_column('multiple_fuels') + batch_op.drop_column('cofire_fuels') + batch_op.drop_column('switch_oil_gas') + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('out_eia__yearly_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('switch_oil_gas', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('cofire_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('multiple_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.drop_column('can_switch_oil_gas') + batch_op.drop_column('can_burn_multiple_fuels') + batch_op.drop_column('can_cofire_fuels') + + with op.batch_alter_table('out_eia__monthly_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('switch_oil_gas', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('cofire_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('multiple_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.drop_column('can_switch_oil_gas') + batch_op.drop_column('can_burn_multiple_fuels') + batch_op.drop_column('can_cofire_fuels') + + with op.batch_alter_table('core_eia860__scd_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('switch_oil_gas', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('cofire_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('multiple_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.drop_column('can_switch_oil_gas') + batch_op.drop_column('can_cofire_fuels') + batch_op.drop_column('can_burn_multiple_fuels') + + with op.batch_alter_table('_out_eia__yearly_generators', schema=None) as batch_op: + batch_op.add_column(sa.Column('switch_oil_gas', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('cofire_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.add_column(sa.Column('multiple_fuels', sa.BOOLEAN(), nullable=True)) + batch_op.drop_column('can_switch_oil_gas') + batch_op.drop_column('can_burn_multiple_fuels') + batch_op.drop_column('can_cofire_fuels') + + op.drop_table('core_eia860__scd_generators_multifuel') + # ### end Alembic commands ### diff --git a/src/pudl/extract/eia860.py b/src/pudl/extract/eia860.py index f3da31eb05..15a7d4c83c 100644 --- a/src/pudl/extract/eia860.py +++ b/src/pudl/extract/eia860.py @@ -85,6 +85,7 @@ def get_dtypes(page, **partition): "raw_eia860__generator_wind_existing", "raw_eia860__generator_wind_retired", "raw_eia860__multifuel_existing", + "raw_eia860__multifuel_proposed", "raw_eia860__multifuel_retired", "raw_eia860__ownership", "raw_eia860__plant", diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index 6f1554b40d..7547cc810c 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -449,6 +449,22 @@ ), "unit": "min", }, + "can_cofire_100_oil": { + "type": "boolean", + "description": "Whether the generator can co-fire 100 oil.", + }, + "can_cofire_oil_and_gas": { + "type": "boolean", + "description": "Whether the generator can co-fire oil and gas.", + }, + "can_fuel_switch": { + "type": "boolean", + "description": "Whether a unit is able to switch fuels.", + }, + "can_switch_when_operating": { + "type": "boolean", + "description": "Whether the generator can switch fuel while operating.", + }, "capacity_eoy_mw": { "type": "number", "description": "Total end of year installed (nameplate) capacity for a plant part, in megawatts.", @@ -729,9 +745,33 @@ "type": "string", "description": "Originally reported short code.", }, - "cofire_fuels": { + "can_cofire_fuels": { "type": "boolean", - "description": "Can the generator co-fire fuels?.", + "description": "Whether the generator can co-fire fuels.", + }, + "cofire_energy_source_1": { + "type": "string", + "description": "The codes representing the type of fuel that will be co-fired.", + }, + "cofire_energy_source_2": { + "type": "string", + "description": "The codes representing the type of fuel that will be co-fired.", + }, + "cofire_energy_source_3": { + "type": "string", + "description": "The codes representing the type of fuel that will be co-fired.", + }, + "cofire_energy_source_4": { + "type": "string", + "description": "The codes representing the type of fuel that will be co-fired.", + }, + "cofire_energy_source_5": { + "type": "string", + "description": "The codes representing the type of fuel that will be co-fired.", + }, + "cofire_energy_source_6": { + "type": "string", + "description": "The codes representing the type of fuel that will be co-fired.", }, "coincident_peak_demand_mw": { "type": "number", @@ -1071,10 +1111,26 @@ "description": "Annual demand per km2 of a given service territory.", "unit": "MWh/km2", }, + "has_air_permit_limits": { + "type": "boolean", + "description": "Whether air permit limits are a factor that limits the generator's ability to switch between oil and natural gas.", + }, "has_demand_side_management": { "type": "boolean", "description": "Whether there were strategies or measures used to control electricity demand by customers", }, + "has_factors_that_limit_switching": { + "type": "boolean", + "description": "Whether there are factors that limit the generator's ability to switch between oil and natural gas.", + }, + "has_other_factors_that_limit_switching": { + "type": "boolean", + "description": "Whether there are factors other than air permit limits and storage that limit the generator's ability to switch between oil and natural gas.", + }, + "has_storage_limits": { + "type": "boolean", + "description": "Whether limited on-site fuel storage is a factor that limits the generator's ability to switch between oil and natural gas.", + }, "depreciation_type": { "type": "string", "description": ( @@ -1859,6 +1915,30 @@ "type": "number", "description": "Quanity of fuel received in tons, barrel, or Mcf.", }, + "fuel_switch_energy_source_1": { + "type": "string", + "description": "The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.", + }, + "fuel_switch_energy_source_2": { + "type": "string", + "description": "The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.", + }, + "fuel_switch_energy_source_3": { + "type": "string", + "description": "The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.", + }, + "fuel_switch_energy_source_4": { + "type": "string", + "description": "The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.", + }, + "fuel_switch_energy_source_5": { + "type": "string", + "description": "The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.", + }, + "fuel_switch_energy_source_6": { + "type": "string", + "description": "The codes representing the type of fuel that will be able to be used as a sole source of fuel for this unit.", + }, "fuel_type": { "type": "string", "description": "Type of fuel.", @@ -2491,6 +2571,16 @@ "description": "Maximum heat content per physical unit of fuel in MMBtu.", "unit": "MMBtu", }, + "max_oil_heat_input": { + "type": "number", + "description": "The maximum oil heat input (percent of MMBtus) expected for proposed unit when co-firing with natural gas", + "unit": "% MMBtu", + }, + "max_oil_output_mw": { + "type": "number", + "description": "The maximum output (net MW) expected for proposed unit, when making the maximum use of oil and co-firing natural gas.", + "unit": "MW", + }, "max_steam_flow_1000_lbs_per_hour": { "type": "number", "unit": "1000_lbs_per_hour", @@ -2684,9 +2774,9 @@ "type": "number", "unit": "gal", }, - "multiple_fuels": { + "can_burn_multiple_fuels": { "type": "boolean", - "description": "Can the generator burn multiple fuels?", + "description": "Whether the generator can burn multiple fuels.", }, "nameplate_power_factor": { "type": "number", @@ -2816,6 +2906,26 @@ ), "unit": "MWh", }, + "net_summer_capacity_natural_gas_mw": { + "type": "number", + "description": "The maximum net summer output achievable when running on natural gas.", + "unit": "MW", + }, + "net_summer_capacity_oil_mw": { + "type": "number", + "description": "The maximum net summer output achievable when running on oil.", + "unit": "MW", + }, + "net_winter_capacity_natural_gas_mw": { + "type": "number", + "description": "The maximum net winter output achievable when running on natural gas.", + "unit": "MW", + }, + "net_winter_capacity_oil_mw": { + "type": "number", + "description": "The maximum net summer output achievable when running on oil.", + "unit": "MW", + }, "net_wheeled_power_mwh": { "type": "number", "description": ( @@ -3684,6 +3794,10 @@ "type": "string", "description": "Human-readable name of a US Census region.", }, + "has_regulatory_limits": { + "type": "boolean", + "description": "Whether there are factors that limit the operation of the generator when running on 100 percent oil", + }, "regulation_mercury": { "type": "string", "description": "Most stringent type of statute or regulation code under which the boiler is operating for mercury control standards.", @@ -4398,9 +4512,9 @@ "type": "string", "description": "Supporting structure of the transmission line.", }, - "switch_oil_gas": { + "can_switch_oil_gas": { "type": "boolean", - "description": "Indicates whether the generator switch between oil and natural gas.", + "description": "Whether the generator can switch between oil and natural gas.", }, "syncronized_transmission_grid": { "type": "boolean", @@ -4463,6 +4577,14 @@ "and predefined, based on season, day of week, and time of day." ), }, + "time_to_switch_gas_to_oil": { + "type": "string", + "description": "The time required to switch the generator from running 100 percent natural gas to running 100 percent oil.", + }, + "time_to_switch_oil_to_gas": { + "type": "string", + "description": "The time required to switch the generator from running 100 percent oil to running 100 percent natural gas.", + }, "has_time_responsive_programs": { "type": "boolean", "description": ( diff --git a/src/pudl/metadata/resources/__init__.py b/src/pudl/metadata/resources/__init__.py index 1055536da3..2295be56c8 100644 --- a/src/pudl/metadata/resources/__init__.py +++ b/src/pudl/metadata/resources/__init__.py @@ -152,7 +152,7 @@ "other_modifications_date", "planned_generator_retirement_date", "carbon_capture", - "cofire_fuels", + "can_cofire_fuels", "switch_oil_gas", "turbines_inverters_hydrokinetics", "nameplate_power_factor", diff --git a/src/pudl/metadata/resources/eia.py b/src/pudl/metadata/resources/eia.py index 2cf4a6290e..4bc6973aaa 100644 --- a/src/pudl/metadata/resources/eia.py +++ b/src/pudl/metadata/resources/eia.py @@ -1040,7 +1040,7 @@ "capacity_mw", "carbon_capture", "city", - "cofire_fuels", + "can_cofire_fuels", "county", "current_planned_generator_operating_date", "data_maturity", @@ -1069,7 +1069,7 @@ "latitude", "longitude", "minimum_load_mw", - "multiple_fuels", + "can_burn_multiple_fuels", "nameplate_power_factor", "net_capacity_mwdc", "operating_switch", @@ -1112,7 +1112,7 @@ "summer_capacity_mw", "summer_estimated_capability_mw", "supercritical_tech", - "switch_oil_gas", + "can_switch_oil_gas", "syncronized_transmission_grid", "technology_description", "time_cold_shutdown_full_load_code", diff --git a/src/pudl/metadata/resources/eia860.py b/src/pudl/metadata/resources/eia860.py index 47dd591aea..4c5585bf9f 100644 --- a/src/pudl/metadata/resources/eia860.py +++ b/src/pudl/metadata/resources/eia860.py @@ -179,7 +179,7 @@ "energy_source_2_transport_2", "energy_source_2_transport_3", "fuel_type_code_pudl", - "multiple_fuels", + "can_burn_multiple_fuels", "deliver_power_transgrid", "distributed_generation", "syncronized_transmission_grid", @@ -206,8 +206,8 @@ "turbines_inverters_hydrokinetics", "time_cold_shutdown_full_load_code", "planned_new_capacity_mw", - "cofire_fuels", - "switch_oil_gas", + "can_cofire_fuels", + "can_switch_oil_gas", "nameplate_power_factor", "minimum_load_mw", "uprate_derate_during_year", @@ -906,6 +906,76 @@ "sources": ["eia860"], "etl_group": "eia860", }, + "core_eia860__scd_generators_multifuel": { + "description": ( + "Annually reported information from EIA-860 Schedule 3 that contains information about " + "fuel-switching and the use of multiple fuels by surveyed generators." + ), + "schema": { + "fields": [ + "report_date", + "utility_id_eia", + "utility_name_eia", + "plant_id_eia", + "plant_name_eia", + "state", + "county", + "generator_id", + "operational_status_code", + "technology_description", + "prime_mover_code", + "sector_name_eia", + "sector_id_eia", + "capacity_mw", + "summer_capacity_mw", + "winter_capacity_mw", + "current_planned_generator_operating_date", + "energy_source_code_1", + "energy_source_code_2", + "can_burn_multiple_fuels", + "can_cofire_fuels", + "cofire_energy_source_1", + "cofire_energy_source_2", + "cofire_energy_source_3", + "cofire_energy_source_4", + "cofire_energy_source_5", + "cofire_energy_source_6", + "can_switch_oil_gas", + "time_to_switch_oil_to_gas", + "time_to_switch_gas_to_oil", + "can_switch_when_operating", + "net_summer_capacity_natural_gas_mw", + "net_summer_capacity_oil_mw", + "net_winter_capacity_natural_gas_mw", + "net_winter_capacity_oil_mw", + "has_factors_that_limit_switching", + "has_storage_limits", + "has_air_permit_limits", + "has_other_factors_that_limit_switching", + "can_cofire_oil_and_gas", + "can_cofire_100_oil", + "max_oil_heat_input", + "max_oil_output_mw", + "can_fuel_switch", + "has_regulatory_limits", + "fuel_switch_energy_source_1", + "fuel_switch_energy_source_2", + "fuel_switch_energy_source_3", + "fuel_switch_energy_source_4", + "fuel_switch_energy_source_5", + "fuel_switch_energy_source_6", + ], + "primary_key": [ + "report_date", + "utility_id_eia", + "generator_id", + "plant_id_eia", + ], + }, + "field_namespace": "eia", + "sources": ["eia860"], + "etl_group": "eia860", + }, } """EIA-860 resource attributes organized by PUDL identifier (``resource.name``). diff --git a/src/pudl/metadata/resources/mcoe.py b/src/pudl/metadata/resources/mcoe.py index 9a2340da71..e7c2cdaa80 100644 --- a/src/pudl/metadata/resources/mcoe.py +++ b/src/pudl/metadata/resources/mcoe.py @@ -222,7 +222,7 @@ "bypass_heat_recovery", "carbon_capture", "city", - "cofire_fuels", + "can_cofire_fuels", "county", "current_planned_generator_operating_date", "data_maturity", @@ -247,7 +247,7 @@ "latitude", "longitude", "minimum_load_mw", - "multiple_fuels", + "can_burn_multiple_fuels", "nameplate_power_factor", "net_capacity_mwdc", "operating_switch", @@ -287,7 +287,7 @@ "summer_capacity_mw", "summer_estimated_capability_mw", "supercritical_tech", - "switch_oil_gas", + "can_switch_oil_gas", "syncronized_transmission_grid", "time_cold_shutdown_full_load_code", "timezone", diff --git a/src/pudl/package_data/eia860/column_maps/generator.csv b/src/pudl/package_data/eia860/column_maps/generator.csv index 6c50ab6e41..9c5f2118b9 100644 --- a/src/pudl/package_data/eia860/column_maps/generator.csv +++ b/src/pudl/package_data/eia860/column_maps/generator.csv @@ -41,7 +41,7 @@ energy_source_2_transport_1,transmode2,transmode2,transmode2,es2trans_1,es2trans energy_source_2_transport_2,,,,es2trans_2,es2trans_2,es2trans_2,, energy_source_2_transport_3,,,,es2trans_3,es2trans_3,es2trans_3,, turbines_num,wind,wind,wind,windturbines,windturbines,windturbines,turbines,turbines -multiple_fuels,,,,,,multifuels,multiple_fuels,multiple_fuels +can_burn_multiple_fuels,,,,,,multifuels,multiple_fuels,multiple_fuels planned_modifications,,,,,,,planned_modifications,planned_modifications planned_net_summer_capacity_uprate_mw,,,,,,,planned_uprates_net_summer_cap,planned_uprates_net_summer_cap planned_net_winter_capacity_uprate_mw,,,,,,,planned_uprates_net_winter_cap,planned_uprates_net_winter_cap diff --git a/src/pudl/package_data/eia860/column_maps/generator_existing.csv b/src/pudl/package_data/eia860/column_maps/generator_existing.csv index c92064de56..731505a421 100644 --- a/src/pudl/package_data/eia860/column_maps/generator_existing.csv +++ b/src/pudl/package_data/eia860/column_maps/generator_existing.csv @@ -22,7 +22,7 @@ energy_source_code_3,energy_source_3,energy_source_3,energy_source_3,energy_sour energy_source_code_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4 energy_source_code_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5 energy_source_code_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6 -multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels +can_burn_multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels deliver_power_transgrid,deliver_power_transgrid,deliver_power_transgrid,deliver_power_transgrid,deliver_power_to_transmission_grid,,,,,,,,,,, syncronized_transmission_grid,synchronized_grid,synchronized_grid,synchronized_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid turbines_num,turbines,turbines,turbines,turbines,,,,,,,,,,, @@ -65,7 +65,7 @@ time_cold_shutdown_full_load_code,,,,,time_from_cold_shutdown_to_full_load,time_ stoker_tech,,,,,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology other_combustion_tech,,,,,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology planned_new_capacity_mw,,,,,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw,planned_new_nameplate_capacity_mw -cofire_fuels,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels +can_cofire_fuels,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels switch_oil_gas,,,,,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas bypass_heat_recovery,,,,,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator,can_bypass_heat_recovery_steam_generator rto_iso_lmp_node_id,,,,,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation,rto_iso_lmp_node_designation diff --git a/src/pudl/package_data/eia860/column_maps/generator_proposed.csv b/src/pudl/package_data/eia860/column_maps/generator_proposed.csv index f20c4b9e6e..7c56f89360 100644 --- a/src/pudl/package_data/eia860/column_maps/generator_proposed.csv +++ b/src/pudl/package_data/eia860/column_maps/generator_proposed.csv @@ -29,7 +29,7 @@ energy_source_1_transport_3,,,,proposed_transportation_1c,proposed_transportatio energy_source_2_transport_1,transmode2,transmode2,transmode2,proposed_transportation_2a,proposed_transportation_2a,proposed_transportation_2a,,,,,,,,,,,,,,,,, energy_source_2_transport_2,,,,proposed_transportation_2b,proposed_transportation_2b,proposed_transportation_2b,,,,,,,,,,,,,,,,, energy_source_2_transport_3,,,,proposed_transportation_2c,proposed_transportation_2c,proposed_transportation_2c,,,,,,,,,,,,,,,,, -multiple_fuels,,,,,,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels +can_burn_multiple_fuels,,,,,,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels ownership_code,owner,owner,owner,owner,owner,owner,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership,ownership turbines_num,propwind,propwind,propwind,proposed_turbines,proposed_turbines,proposed_turbines,turbines,turbines,turbines,turbines,turbines,turbines,,,,,,,,,,, associated_combined_heat_power,cogen,cogen,cogen,proposed_cogenerator,proposed_cogenerator,proposed_cogenerator,cogenerator,cogenerator,cogenerator,cogenerator,cogenerator,cogenerator,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system,associated_with_combined_heat_and_power_system @@ -59,5 +59,5 @@ turbines_inverters_hydrokinetics,,,,,,,,,,,,,turbines_inverters_or_hydrokinetic_ stoker_tech,,,,,,,,,,,,,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology other_combustion_tech,,,,,,,,,,,,,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology switch_oil_gas,,,,,,,,,,,,,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas -cofire_fuels,,,,,,,,,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels +can_cofire_fuels,,,,,,,,,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels previously_canceled,,,,,,,,,,,,,previously_canceled,previously_canceled,previously_canceled,previously_canceled,previously_canceled,previously_canceled,previously_canceled,previously_canceled,previously_canceled,previously_canceled,previously_canceled diff --git a/src/pudl/package_data/eia860/column_maps/generator_retired.csv b/src/pudl/package_data/eia860/column_maps/generator_retired.csv index c03aac8216..076221ad48 100644 --- a/src/pudl/package_data/eia860/column_maps/generator_retired.csv +++ b/src/pudl/package_data/eia860/column_maps/generator_retired.csv @@ -24,7 +24,7 @@ energy_source_code_3,energy_source_3,energy_source_3,energy_source_3,energy_sour energy_source_code_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4,energy_source_4 energy_source_code_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5,energy_source_5 energy_source_code_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6,energy_source_6 -multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels +can_burn_multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels deliver_power_transgrid,deliver_power_transgrid,deliver_power_transgrid,deliver_power_transgrid,deliver_power_to_transmission_grid,,,,,,,,,,, syncronized_transmission_grid,synchronized_grid,synchronized_grid,synchronized_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid,synchronized_to_transmission_grid turbines_num,turbines,turbines,turbines,turbines,,,,,,,,,,, @@ -72,7 +72,7 @@ turbines_inverters_hydrokinetics,,,,,turbines_inverters_or_hydrokinetic_buoys,tu time_cold_shutdown_full_load_code,,,,,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load,time_from_cold_shutdown_to_full_load stoker_tech,,,,,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology,stoker_technology other_combustion_tech,,,,,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology,other_combustion_technology -cofire_fuels,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels +can_cofire_fuels,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels switch_oil_gas,,,,,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas energy_storage_capacity_mwh,,,,,,,,,,,,,,, net_capacity_mwdc,,,,,,,,,,,,,,, diff --git a/src/pudl/package_data/eia860/column_maps/multifuel_existing.csv b/src/pudl/package_data/eia860/column_maps/multifuel_existing.csv index 2d7f719606..d2f1635efb 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_existing.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_existing.csv @@ -18,33 +18,32 @@ generator_operating_month,,,,,,,,,,,,,,operating_month,operating_month,operating generator_operating_year,,,,,,,,,,,,,,operating_year,operating_year,operating_year,operating_year,operating_year,operating_year,operating_year energy_source_code_1,,,,,,,,,,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1 energy_source_code_2,,,,,,,,,,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2 -multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels -cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels +can_burn_multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels +can_cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1 cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2 cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3 cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4 cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5 cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6 -switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas -switch_when_operating,,,,,,operating_switch,operating_switch,operating_switch,operating_switch,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating -net_summer_capacity_with_natural_gas_mw,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw -net_winter_capacity_with_natural_gas_mw,,,,,,,,,,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw -net_summer_capacity_with_oil_mw,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw -net_winter_capacity_with_oil_mw,,,,,,,,,,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw -time_to_switch_from_gas_to_oil,,,,,,,,,,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil -time_to_switch_from_oil_to_gas,,,,,,,,,,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas -factors_that_limit_switching,,,,factors_that_limit,factors_that_limit,,,,,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching -storage_limits,,,,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits -air_permit_limits,,,,airpermit_limits,airpermit_limits,airpermit_limits,airpermit_limits,airpermit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits -other_limits,,,,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits -cofire_oil_and_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_and_gas,,,,,,,,,,, -cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,,,,,,,,,,, +can_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas +can_switch_when_operating,,,,,,operating_switch,operating_switch,operating_switch,operating_switch,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating +net_summer_capacity_natural_gas_mw,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw +net_winter_capacity_natural_gas_mw,,,,,,,,,,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw +net_summer_capacity_oil_mw,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw +net_winter_capacity_oil_mw,,,,,,,,,,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw +time_to_switch_gas_to_oil,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil +time_to_switch_oil_to_gas,,,,,,,,,,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas +has_factors_that_limit_switching,,,,factors_that_limit,factors_that_limit,,,,,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching +has_storage_limits,,,,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits +has_air_permit_limits,,,,airpermit_limits,airpermit_limits,airpermit_limits,airpermit_limits,airpermit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits +has_other_factors_that_limit_switching,,,,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits +can_cofire_oil_and_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_and_gas,,,,,,,,,,, +can_cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,,,,,,,,,,, max_oil_heat_input,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat_input,,,,,,,,,,, max_oil_output_mw,max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output_mw,,,,,,,,,,, -fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,,,,,,,,,,, -time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,,,,,,,,,,, -regulatory_limits,regulatory_limits,regulatory_limits,regulatory_limits,,,regulatory_limits,regulatory_limits,regulatory_limits,regulatory_limits,,,,,,,,,,, +can_fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,,,,,,,,,,, +has_regulatory_limits,regulatory_limits,regulatory_limits,regulatory_limits,,,regulatory_limits,regulatory_limits,regulatory_limits,regulatory_limits,,,,,,,,,,, fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,,,,,,,,,,, fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,,,,,,,,,,, fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,,,,,,,,,,, diff --git a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv new file mode 100644 index 0000000000..69d4676856 --- /dev/null +++ b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv @@ -0,0 +1,49 @@ +year_index,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023 +utility_id_eia,utilcode,utilcode,utilcode,utilcode,utilcode,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id,utility_id +utility_name_eia,utilname,utilname,utilname,utilname,utilname,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name,utility_name +plant_id_eia,plntcode,plntcode,plntcode,plntcode,plntcode,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code,plant_code +plant_name_eia,plntname,plntname,plntname,plntname,plntname,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name,plant_name +state,state,state,state,state,state,state,state,state,state,state,state,state,state,state,state,state,state,state,state,state +county,,,,,,county,county,county,county,county,county,county,county,county,county,county,county,county,county,county +generator_id,gencode,gencode,gencode,gencode,gencode,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id,generator_id +operational_status_code,,,,,,,,status,status,status,status,status,status,status,status,status,status,status,status,status +technology_description,,,,,,,,,,,technology,technology,technology,technology,technology,technology,technology,technology,technology,technology +prime_mover_code,primemover,primemover,primemover,primemover,primemover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover,prime_mover +sector_name_eia,,,,,,,,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name,sector_name +sector_id_eia,,,,,,,,sector,sector,sector,sector,sector,sector,sector,sector,sector,sector,sector,sector,sector +capacity_mw,,,,,,,,,,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw,nameplate_capacity_mw +summer_capacity_mw,,,,,,,,,,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw,summer_capacity_mw +winter_capacity_mw,,,,,,,,,,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw,winter_capacity_mw +current_planned_generator_operating_month,,,,,,,,,,,,,,current_month,current_month,current_month,current_month,current_month,current_month,current_month +current_planned_generator_operating_year,,,,,,,,,,,,,,current_year,current_year,current_year,current_year,current_year,current_year,current_year +energy_source_code_1,,,,,,,,,,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1 +energy_source_code_2,,,,,,,,,,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2 +can_burn_multiple_fuels,pro_multiple_fuels,pro_multiple_fuels,pro_multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels +can_cofire_fuels,pro_cofire_fuels,pro_cofire_fuels,pro_cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels +cofire_energy_source_1,prop_cofire_energy_source_1,prop_cofire_energy_source_1,prop_cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1 +cofire_energy_source_2,prop_cofire_energy_source_2,prop_cofire_energy_source_2,prop_cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2 +cofire_energy_source_3,prop_cofire_energy_source_3,prop_cofire_energy_source_3,prop_cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3 +cofire_energy_source_4,prop_cofire_energy_source_4,prop_cofire_energy_source_4,prop_cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4 +cofire_energy_source_5,prop_cofire_energy_source_5,prop_cofire_energy_source_5,prop_cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5 +cofire_energy_source_6,prop_cofire_energy_source_6,prop_cofire_energy_source_6,prop_cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6 +can_switch_oil_gas,prop_fuel_switch_oil_gas,prop_fuel_switch_oil_gas,prop_fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas +can_switch_when_operating,,,,,,operating_switch,operating_switch,operating_switch,operating_switch,,,,,,,,,,, +net_summer_capacity_with_natural_gas_mw,prop_net_summer_capacity_ng,prop_net_summer_capacity_ng,prop_net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_with_natural_gas_mw,,,,,,,,,,, +net_summer_capacity_with_oil_mw,prop_net_summer_capacity_oil,prop_net_summer_capacity_oil,prop_net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_with_oil_mw,,,,,,,,,,, +has_factors_that_limit_switching,,,,factors_that_limit,factors_that_limit,,,,,,,,,,,,,,, +has_storage_limits,,,,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,,,,,,,,,,, +has_air_permit_limits,,,,airpermit_limits,airpermit_limits,airpermit_limits,airpermit_limits,airpermit_limits,air_permit_limits,,,,,,,,,,, +has_other_limits,,,,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,,,,,,,,,,, +can_cofire_oil_and_gas,prop_cofire_oil_gas,prop_cofire_oil_gas,prop_cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_and_gas,,,,,,,,,,, +can_cofire_100_oil,prop_cofire_100_oil,prop_cofire_100_oil,prop_cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,,,,,,,,,,, +max_oil_heat_input,prop_max_oil_heat,prop_max_oil_heat,prop_max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat_input,,,,,,,,,,, +max_oil_output_mw,prop_max_oil_output,prop_max_oil_output,prop_max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output,max_oil_output_mw,,,,,,,,,,, +can_fuel_switch,prop_fuel_switch,prop_fuel_switch,prop_fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,,,,,,,,,,, +time_to_switch,prop_time_to_switch,prop_time_to_switch,prop_time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,time_to_switch,,,,,,,,,,, +regulatory_limits,prop_regulatory_limits,prop_regulatory_limits,prop_regulatory_limits,,,regulatory_limits,regulatory_limits,regulatory_limits,regulatory_limits,,,,,,,,,,, +fuel_switch_energy_source_1,prop_fuel_switch_es1,prop_fuel_switch_es1,prop_fuel_switch_es1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,,,,,,,,,,, +fuel_switch_energy_source_2,prop_fuel_switch_es2,prop_fuel_switch_es2,prop_fuel_switch_es2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,fuel_switch_energy_source_2,,,,,,,,,,, +fuel_switch_energy_source_3,prop_fuel_switch_es3,prop_fuel_switch_es3,prop_fuel_switch_es3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,fuel_switch_energy_source_3,,,,,,,,,,, +fuel_switch_energy_source_4,prop_fuel_switch_es4,prop_fuel_switch_es4,prop_fuel_switch_es4,fuel_switch_energy_source_4,fuel_switch_energy_source_4,fuel_switch_energy_source_4,fuel_switch_energy_source_4,fuel_switch_energy_source_4,fuel_switch_energy_source_4,,,,,,,,,,, +fuel_switch_energy_source_5,prop_fuel_switch_es5,prop_fuel_switch_es5,prop_fuel_switch_es5,fuel_switch_energy_source_5,fuel_switch_energy_source_5,fuel_switch_energy_source_5,fuel_switch_energy_source_5,fuel_switch_energy_source_5,fuel_switch_energy_source_5,,,,,,,,,,, +fuel_switch_energy_source_6,prop_fuel_switch_es6,prop_fuel_switch_es6,prop_fuel_switch_es6,fuel_switch_energy_source_6,fuel_switch_energy_source_6,fuel_switch_energy_source_6,fuel_switch_energy_source_6,fuel_switch_energy_source_6,fuel_switch_energy_source_6,,,,,,,,,,, diff --git a/src/pudl/package_data/eia860/column_maps/multifuel_retired.csv b/src/pudl/package_data/eia860/column_maps/multifuel_retired.csv index 5e4304355c..24e6e4bd54 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_retired.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_retired.csv @@ -20,31 +20,31 @@ generator_retirement_month,,,,,,,,,,,,,,retirement_month,retirement_month,retire generator_retirement_year,,,,,,,,,,,,,,retirement_year,retirement_year,retirement_year,retirement_year,retirement_year,retirement_year,retirement_year energy_source_code_1,,,,,,,,,,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1,energy_source_1 energy_source_code_2,,,,,,,,,,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2,energy_source_2 -multiple_fuels,,,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels -cofire_fuels,,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels +can_burn_multiple_fuels,,,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,,,,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels,multiple_fuels +can_cofire_fuels,,,,,,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels,cofire_fuels cofire_energy_source_1,,,,,,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1,cofire_energy_source_1 cofire_energy_source_2,,,,,,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2,cofire_energy_source_2 cofire_energy_source_3,,,,,,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3,cofire_energy_source_3 cofire_energy_source_4,,,,,,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4 cofire_energy_source_5,,,,,,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5,cofire_energy_source_5 cofire_energy_source_6,,,,,,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6,cofire_energy_source_6 -switch_oil_gas,,,,,,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas -switch_when_operating,,,,,,operating_switch,operating_switch,operating_switch,operating_switch,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating +can_switch_oil_gas,,,,,,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,fuel_switch_oil_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas,switch_between_oil_and_natural_gas +can_switch_when_operating,,,,,,operating_switch,operating_switch,operating_switch,operating_switch,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating,switch_when_operating net_summer_capacity_with_natural_gas_mw,,,,,,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_ng,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw,net_summer_capacity_with_natural_gas_mw net_winter_capacity_with_natural_gas_mw,,,,,,,,,,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw,net_winter_capacity_with_natural_gas_mw net_summer_capacity_with_oil_mw,,,,,,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_oil,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw,net_summer_capacity_with_oil_mw net_winter_capacity_with_oil_mw,,,,,,,,,,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw,net_winter_capacity_with_oil_mw time_to_switch_from_gas_to_oil,,,,,,,,,,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil,time_to_switch_from_gas_to_oil time_to_switch_from_oil_to_gas,,,,,,,,,,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas,time_to_switch_from_oil_to_gas -factors_that_limit_switching,,,,,,,,,,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching -storage_limits,,,,,,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits -air_permit_limits,,,,,,airpermit_limits,airpermit_limits,airpermit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits -other_limits,,,,,,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits -cofire_oil_and_gas,,,,,,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_and_gas,,,,,,,,,,, -cofire_100_oil,,,,,,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,,,,,,,,,,, +has_factors_that_limit_switching,,,,,,,,,,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching,factors_that_limit_switching +has_storage_limits,,,,,,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits,storage_limits +has_air_permit_limits,,,,,,airpermit_limits,airpermit_limits,airpermit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits,air_permit_limits +has_other_limits,,,,,,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits +can_cofire_oil_and_gas,,,,,,cofire_oil_gas,cofire_oil_gas,cofire_oil_gas,cofire_oil_and_gas,,,,,,,,,,, +can_cofire_100_oil,,,,,,cofire_100_oil,cofire_100_oil,cofire_100_oil,cofire_100_oil,,,,,,,,,,, max_oil_heat_input,,,,,,max_oil_heat,max_oil_heat,max_oil_heat,max_oil_heat_input,,,,,,,,,,, max_oil_output_mw,,,,,,max_oil_output,max_oil_output,max_oil_output,max_oil_output_mw,,,,,,,,,,, -fuel_switch,,,,,,fuel_switch,fuel_switch,fuel_switch,fuel_switch,,,,,,,,,,, +can_fuel_switch,,,,,,fuel_switch,fuel_switch,fuel_switch,fuel_switch,,,,,,,,,,, time_to_switch,,,,,,time_to_switch,time_to_switch,time_to_switch,time_to_switch,,,,,,,,,,, regulatory_limits,,,,,,regulatory_limits,regulatory_limits,regulatory_limits,regulatory_limits,,,,,,,,,,, fuel_switch_energy_source_1,,,,,,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,fuel_switch_energy_source_1,,,,,,,,,,, diff --git a/src/pudl/transform/eia.py b/src/pudl/transform/eia.py index 4acbe38209..266a8afac1 100644 --- a/src/pudl/transform/eia.py +++ b/src/pudl/transform/eia.py @@ -1244,6 +1244,7 @@ def harvested_entity_asset_factory( "_core_eia860__generators_energy_storage", "_core_eia860__generators_wind", "_core_eia860__generators_solar", + "_core_eia860__generators_multifuel", "_core_eia860__ownership", "_core_eia860__plants", "_core_eia860__utilities", @@ -1346,5 +1347,6 @@ def finished_eia_asset(**kwargs) -> pd.DataFrame: "core_eia860__scd_generators_wind": "_core_eia860__generators_wind", "core_eia860__scd_generators_solar": "_core_eia860__generators_solar", "core_eia860__scd_generators_energy_storage": "_core_eia860__generators_energy_storage", + "core_eia860__scd_generators_multifuel": "_core_eia860__generators_multifuel", }.items() ] diff --git a/src/pudl/transform/eia860.py b/src/pudl/transform/eia860.py index f8a27e2bf4..9e64bcee6e 100644 --- a/src/pudl/transform/eia860.py +++ b/src/pudl/transform/eia860.py @@ -246,7 +246,7 @@ def _core_eia860__generators( } boolean_columns_to_fix = [ "duct_burners", - "multiple_fuels", + "can_burn_multiple_fuels", "deliver_power_transgrid", "syncronized_transmission_grid", "solid_fuel_gasification", @@ -258,8 +258,8 @@ def _core_eia860__generators( "carbon_capture", "stoker_tech", "other_combustion_tech", - "cofire_fuels", - "switch_oil_gas", + "can_cofire_fuels", + "can_switch_oil_gas", "bypass_heat_recovery", "associated_combined_heat_power", "planned_modifications", @@ -468,6 +468,86 @@ def _core_eia860__generators_wind( return wind_df +@asset +def _core_eia860__generators_multifuel( + raw_eia860__multifuel_existing: pd.DataFrame, + raw_eia860__multifuel_proposed: pd.DataFrame, + raw_eia860__multifuel_retired: pd.DataFrame, +) -> pd.DataFrame: + """Transform the multifuel generators table.""" + multifuel_ex = raw_eia860__multifuel_existing + multifuel_pr = raw_eia860__multifuel_proposed + multifuel_re = raw_eia860__multifuel_retired + + boolean_columns_to_fix = [ + "has_air_permit_limits", + "can_cofire_100_oil", + "can_cofire_fuels", + "has_factors_that_limit_switching", + "can_burn_multiple_fuels", + "has_other_factors_that_limit_switching", + "has_storage_limits", + "can_switch_oil_gas", + "can_switch_when_operating", + ] + + # A subset of the columns have zero values, where NA is appropriate: + nulls_replace_cols = { + col: {" ": np.nan, 0: np.nan} + for col in [ + "winter_capacity_mw", + "summer_capacity_mw", + ] + } + + multifuel_df = ( + pd.concat([multifuel_ex, multifuel_pr, multifuel_re], sort=True) + .dropna(subset=["generator_id", "plant_id_eia"]) + .pipe(pudl.helpers.fix_eia_na) + .pipe( + pudl.helpers.fix_boolean_columns, + boolean_columns_to_fix=boolean_columns_to_fix, + ) + .replace(to_replace=nulls_replace_cols) + .pipe(pudl.helpers.month_year_to_date) + .pipe(pudl.helpers.convert_to_date) + .pipe(PUDL_PACKAGE.encode) + ) + + multifuel_df["fuel_type_code_pudl"] = ( + multifuel_df.energy_source_code_1.str.upper().map( + pudl.helpers.label_map( + CODE_METADATA["core_eia__codes_energy_sources"]["df"], + from_col="code", + to_col="fuel_type_code_pudl", + null_value=pd.NA, + ) + ) + ) + + multifuel_df["operational_status"] = ( + multifuel_df.operational_status_code.str.upper().map( + pudl.helpers.label_map( + CODE_METADATA["core_eia__codes_operational_status"]["df"], + from_col="code", + to_col="operational_status", + null_value=pd.NA, + ) + ) + ) + + # There are some pesky duplicate rows from the plant_id 56032 gen_id 1 + # The rows are almost identical, so this gets rid of the duplicates. + # It only drops known duplicates from 56032 so we can spot any other + # irregularities in the future. + dupe_pk_rows_to_drop = multifuel_df[ + multifuel_df[["report_date", "plant_id_eia", "generator_id"]].duplicated() + & (multifuel_df["plant_id_eia"] == 56032) + ] + multifuel_df = multifuel_df.drop(dupe_pk_rows_to_drop.index) + return multifuel_df + + @asset def _core_eia860__plants(raw_eia860__plant: pd.DataFrame) -> pd.DataFrame: """Pull and transform the plants table.