diff --git a/docs/release_notes.rst b/docs/release_notes.rst index f48883681b..1e36041b4d 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`. + Bug Fixes ^^^^^^^^^ 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..5a74e314b6 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": "Can the generator co-fire 100 oil?", + }, + "can_cofire_oil_and_gas": { + "type": "boolean", + "description": "Can the generator co-fire oil and gas?", + }, + "can_fuel_switch": { + "type": "boolean", + "description": "TK", + }, + "can_switch_when_operating": { + "type": "boolean", + "description": "Indicates whether the generator switches fuel while operating.", + }, "capacity_eoy_mw": { "type": "number", "description": "Total end of year installed (nameplate) capacity for a plant part, in megawatts.", @@ -731,7 +747,31 @@ }, "cofire_fuels": { "type": "boolean", - "description": "Can the generator co-fire fuels?.", + "description": "Can the generator co-fire fuels?", + }, + "cofire_energy_source_1": { + "type": "string", + "description": "Type of fuel.", + }, + "cofire_energy_source_2": { + "type": "string", + "description": "Type of fuel.", + }, + "cofire_energy_source_3": { + "type": "string", + "description": "Type of fuel.", + }, + "cofire_energy_source_4": { + "type": "string", + "description": "Type of fuel.", + }, + "cofire_energy_source_5": { + "type": "string", + "description": "Type of fuel.", + }, + "cofire_energy_source_6": { + "type": "string", + "description": "Type of fuel.", }, "coincident_peak_demand_mw": { "type": "number", @@ -927,6 +967,14 @@ "type": "date", "description": "The most recently updated effective date on which the generator is scheduled to start operation", }, + "current_planned_generator_operating_month": { + "type": "integer", + "description": "The most recently updated effective month on which the generator is scheduled to start operation", + }, + "current_planned_generator_operating_year": { + "type": "integer", + "description": "The most recently updated effective year on which the generator is scheduled to start operation", + }, "customer_class": { "type": "string", "description": f"High level categorization of customer type: {CUSTOMER_CLASSES}.", @@ -1071,10 +1119,26 @@ "description": "Annual demand per km2 of a given service territory.", "unit": "MWh/km2", }, + "has_air_permit_limits": { + "type": "boolean", + "description": "True if there are air permit limits", + }, "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": "True if there are factors that limit switching.", + }, + "has_other_limits": { + "type": "boolean", + "description": "True if there are other limits on the generator.", + }, + "has_storage_limits": { + "type": "boolean", + "description": "True if there are storage limits", + }, "depreciation_type": { "type": "string", "description": ( @@ -1859,6 +1923,30 @@ "type": "number", "description": "Quanity of fuel received in tons, barrel, or Mcf.", }, + "fuel_switch_energy_source_1": { + "type": "string", + "description": "TK", + }, + "fuel_switch_energy_source_2": { + "type": "string", + "description": "TK", + }, + "fuel_switch_energy_source_3": { + "type": "string", + "description": "TK", + }, + "fuel_switch_energy_source_4": { + "type": "string", + "description": "TK", + }, + "fuel_switch_energy_source_5": { + "type": "string", + "description": "TK", + }, + "fuel_switch_energy_source_6": { + "type": "string", + "description": "TK", + }, "fuel_type": { "type": "string", "description": "Type of fuel.", @@ -2491,6 +2579,14 @@ "description": "Maximum heat content per physical unit of fuel in MMBtu.", "unit": "MMBtu", }, + "max_oil_heat_input": { + "type": "number", + "description": "TK", + }, + "max_oil_output_mw": { + "type": "number", + "description": "MW", + }, "max_steam_flow_1000_lbs_per_hour": { "type": "number", "unit": "1000_lbs_per_hour", @@ -2816,6 +2912,26 @@ ), "unit": "MWh", }, + "net_summer_capacity_with_natural_gas_mw": { + "type": "number", + "description": "Summer capacity with natural gas.", + "unit": "MWh", + }, + "net_summer_capacity_with_oil_mw": { + "type": "number", + "description": "Summer capacity with oil.", + "unit": "MWh", + }, + "net_winter_capacity_with_natural_gas_mw": { + "type": "number", + "description": "Winter capacity with natural gas.", + "unit": "MWh", + }, + "net_winter_capacity_with_oil_mw": { + "type": "number", + "description": "Winter capacity with oil", + "unit": "MWh", + }, "net_wheeled_power_mwh": { "type": "number", "description": ( @@ -3684,6 +3800,7 @@ "type": "string", "description": "Human-readable name of a US Census region.", }, + "regulatory_limits": {"type": "string", "description": "TK"}, "regulation_mercury": { "type": "string", "description": "Most stringent type of statute or regulation code under which the boiler is operating for mercury control standards.", @@ -4478,6 +4595,10 @@ "rate programs." ), }, + "time_to_switch": { + "type": "string", + "description": "Time needed to switch between fuel sources", + }, "timezone": { "type": "string", "description": "IANA timezone name", diff --git a/src/pudl/metadata/resources/eia860.py b/src/pudl/metadata/resources/eia860.py index 47dd591aea..5d1de8f9a4 100644 --- a/src/pudl/metadata/resources/eia860.py +++ b/src/pudl/metadata/resources/eia860.py @@ -906,6 +906,74 @@ "sources": ["eia860"], "etl_group": "eia860", }, + "core_eia860__scd_generators_multifuel": { + "description": ( + "Annually reported information about energy storage from EIA-860 Schedule 3. " + "Contains data on fuel-switching and the use of multiple fuels by surveyed generators." + ), + "schema": { + "fields": [ + "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_month", + "current_planned_generator_operating_year", + "energy_source_code_1", + "energy_source_code_2", + "multiple_fuels", + "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", + "switch_oil_gas", + "can_switch_when_operating", + "net_summer_capacity_with_natural_gas_mw", + "net_summer_capacity_with_oil_mw", + "net_winter_capacity_with_natural_gas_mw", + "net_winter_capacity_with_oil_mw", + "has_factors_that_limit_switching", + "has_storage_limits", + "has_air_permit_limits", + "has_other_limits", + "can_cofire_oil_and_gas", + "can_cofire_100_oil", + "max_oil_heat_input", + "max_oil_output_mw", + "can_fuel_switch", + "time_to_switch", + "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": [ + "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/package_data/eia860/column_maps/multifuel_existing.csv b/src/pudl/package_data/eia860/column_maps/multifuel_existing.csv index 2d7f719606..e75e5ea143 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_existing.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_existing.csv @@ -27,22 +27,22 @@ cofire_energy_source_4,cofire_energy_source_4,cofire_energy_source_4,cofire_ener 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 +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_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,,,,,,,,,,, +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_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 +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,,,,,,,,,,, +can_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,,,,,,,,,,, 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,,,,,,,,,,, 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..c5e5a5d52b --- /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 +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 +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 +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..7269b23a05 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_retired.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_retired.csv @@ -29,22 +29,22 @@ cofire_energy_source_4,,,,,,cofire_energy_source_4,cofire_energy_source_4,cofire 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_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..8fddf553a4 100644 --- a/src/pudl/transform/eia860.py +++ b/src/pudl/transform/eia860.py @@ -468,6 +468,76 @@ 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", + "multiple_fuels", + "has_other_limits", + "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_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, + ) + ) + ) + + return multifuel_df + + @asset def _core_eia860__plants(raw_eia860__plant: pd.DataFrame) -> pd.DataFrame: """Pull and transform the plants table.