From 1f14f7be42d7307fb0233c10fe786118699524a8 Mon Sep 17 00:00:00 2001 From: Jennifer Melot Date: Sat, 7 Dec 2024 20:20:17 -0500 Subject: [PATCH 01/13] Add column mapping for proposed multifuel table --- src/pudl/extract/eia860.py | 1 + .../eia860/column_maps/multifuel_proposed.csv | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv 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/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..caadd0125b --- /dev/null +++ b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv @@ -0,0 +1,53 @@ +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_month,,,,,,,,,,,,,,current_month,current_month,current_month,current_month,current_month,current_month,current_month +current_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 +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_winter_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,,,,,,,,,,, +net_winter_capacity_with_oil_mw,,,,,,,,,,,,,,,,,,,, +time_to_switch_from_gas_to_oil,,,,,,,,,,,,,,,,,,,, +time_to_switch_from_oil_to_gas,,,,,,,,,,,,,,,,,,,, +factors_that_limit_switching,,,,factors_that_limit,factors_that_limit,,,,,,,,,,,,,,, +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,,,,,,,,,,, +other_limits,,,,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,,,,,,,,,,, +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,,,,,,,,,,, +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,,,,,,,,,,, +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,,,,,,,,,,, From fc617ba60b6f16753c0ad7d11a05bfc6bfe7a430 Mon Sep 17 00:00:00 2001 From: Jennifer Melot Date: Sun, 8 Dec 2024 21:58:10 -0500 Subject: [PATCH 02/13] Add multifuel transform --- .../eia860/column_maps/multifuel_proposed.csv | 4 +- src/pudl/transform/eia.py | 1 + src/pudl/transform/eia860.py | 62 +++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv index caadd0125b..2e29b5c011 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv @@ -14,8 +14,8 @@ sector_id_eia,,,,,,,,sector,sector,sector,sector,sector,sector,sector,sector,sec 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_month,,,,,,,,,,,,,,current_month,current_month,current_month,current_month,current_month,current_month,current_month -current_year,,,,,,,,,,,,,,current_year,current_year,current_year,current_year,current_year,current_year,current_year +generator_operating_month,,,,,,,,,,,,,,current_month,current_month,current_month,current_month,current_month,current_month,current_month +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 diff --git a/src/pudl/transform/eia.py b/src/pudl/transform/eia.py index 4acbe38209..492a68e215 100644 --- a/src/pudl/transform/eia.py +++ b/src/pudl/transform/eia.py @@ -1346,5 +1346,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__multifuel": "_core_eia860__multifuel", }.items() ] diff --git a/src/pudl/transform/eia860.py b/src/pudl/transform/eia860.py index f8a27e2bf4..18a7f6c729 100644 --- a/src/pudl/transform/eia860.py +++ b/src/pudl/transform/eia860.py @@ -468,6 +468,68 @@ def _core_eia860__generators_wind( return wind_df +# TODO: ask about generator_operating_month vs current_month and year +# also ask how the initial column mapping happens +@asset +def _core_eia860__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 = ["multiple_fuels", "cofire_fuels", "switch_oil_gas"] + + # 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="operational_status_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. From 7a05a86f85c3e5dd4f50a564c54b700229776f5c Mon Sep 17 00:00:00 2001 From: Jennifer Melot Date: Wed, 11 Dec 2024 09:02:39 -0500 Subject: [PATCH 03/13] Clean more boolean columns --- .../eia860/column_maps/multifuel_proposed.csv | 2 +- src/pudl/transform/eia860.py | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv index 2e29b5c011..72d18ffd6d 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv @@ -7,7 +7,7 @@ state,state,state,state,state,state,state,state,state,state,state,state,state,st 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 +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 diff --git a/src/pudl/transform/eia860.py b/src/pudl/transform/eia860.py index 18a7f6c729..786c4d3ca8 100644 --- a/src/pudl/transform/eia860.py +++ b/src/pudl/transform/eia860.py @@ -481,7 +481,16 @@ def _core_eia860__multifuel( multifuel_pr = raw_eia860__multifuel_proposed multifuel_re = raw_eia860__multifuel_retired - boolean_columns_to_fix = ["multiple_fuels", "cofire_fuels", "switch_oil_gas"] + boolean_columns_to_fix = [ + "air_permit_limits", + "cofire_fuels", + "factors_that_limit_switching", + "multiple_fuels", + "other_limits", + "storage_limits", + "switch_oil_gas", + "switch_when_operating", + ] # A subset of the columns have zero values, where NA is appropriate: nulls_replace_cols = { @@ -516,17 +525,6 @@ def _core_eia860__multifuel( ) ) - 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="operational_status_code", - to_col="operational_status", - null_value=pd.NA, - ) - ) - ) - return multifuel_df From 61908360857fed50f57e8950adcd1d625b3a7359 Mon Sep 17 00:00:00 2001 From: Jennifer Melot Date: Fri, 27 Dec 2024 10:37:39 -0500 Subject: [PATCH 04/13] Address most multifuel review feedback --- src/pudl/metadata/fields.py | 123 +++++++++++++++++- src/pudl/metadata/resources/eia860.py | 67 ++++++++++ .../eia860/column_maps/multifuel_proposed.csv | 8 +- src/pudl/transform/eia.py | 3 +- src/pudl/transform/eia860.py | 15 ++- 5 files changed, 205 insertions(+), 11 deletions(-) diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index 6f1554b40d..a4494b7ae6 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -87,6 +87,10 @@ "unit": "cfm", "description": "Total air flow including excess air at 100 percent load, reported at standard temperature and pressure (i.e. 68 F and one atmosphere pressure).", }, + "air_permit_limits": { + "type": "boolean", + "description": "True if there are air permit limits", + }, "alternative_fuel_vehicle_2_activity": { "type": "boolean", "description": "Whether the utility plants to operate alternative-fueled vehicles this coming year.", @@ -729,9 +733,41 @@ "type": "string", "description": "Originally reported short code.", }, + "cofire_100_oil": { + "type": "boolean", + "description": "Can the generator co-fire 100 oil?", + }, "cofire_fuels": { "type": "boolean", - "description": "Can the generator co-fire fuels?.", + "description": "Can the generator co-fire fuels?", + }, + "cofire_oil_and_gas": { + "type": "boolean", + "description": "Can the generator co-fire oil and gas?", + }, + "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 +963,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}.", @@ -1482,6 +1526,10 @@ "unit": "MWh", }, "expense_type": {"type": "string", "description": "The type of expense."}, + "factors_that_limit_switching": { + "type": "boolean", + "description": "True if there are factors that limit switching.", + }, "ferc1_generator_agg_id": { "type": "integer", "description": "ID dynamically assigned by PUDL to EIA records with multiple matches to a single FERC ID in the FERC-EIA manual matching process.", @@ -1859,6 +1907,34 @@ "type": "number", "description": "Quanity of fuel received in tons, barrel, or Mcf.", }, + "fuel_switch": { + "type": "boolean", + "description": "TK", + }, + "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 +2567,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 +2900,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": ( @@ -3226,6 +3330,10 @@ ), "unit": "USD", }, + "other_limits": { + "type": "boolean", + "description": "True if there are other limits on the generator.", + }, "other_modifications_date": { "type": "date", "description": "Planned effective date that the generator is scheduled to enter commercial operation after any other planned modification is complete.", @@ -3684,6 +3792,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.", @@ -4274,6 +4383,10 @@ "type": "string", "description": "A code representing the enclosure type that best describes where the generator is located.", }, + "storage_limits": { + "type": "boolean", + "description": "True if there are storage limits", + }, "storage_technology_code_1": { "type": "string", "description": "The electro-chemical storage technology used for this battery applications.", @@ -4402,6 +4515,10 @@ "type": "boolean", "description": "Indicates whether the generator switch between oil and natural gas.", }, + "switch_when_operating": { + "type": "boolean", + "description": "Indicates whether the generator switches fuel while operating.", + }, "syncronized_transmission_grid": { "type": "boolean", "description": "Indicates whether standby generators (SB status) can be synchronized to the grid.", @@ -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..229830120e 100644 --- a/src/pudl/metadata/resources/eia860.py +++ b/src/pudl/metadata/resources/eia860.py @@ -906,6 +906,73 @@ "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", + "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", + "factors_that_limit_switching", + "storage_limits", + "air_permit_limits", + "other_limits", + "cofire_oil_and_gas", + "cofire_100_oil", + "max_oil_heat_input", + "max_oil_output_mw", + "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", + ], + }, + "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_proposed.csv b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv index 72d18ffd6d..df859fccf0 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv @@ -14,8 +14,8 @@ sector_id_eia,,,,,,,,sector,sector,sector,sector,sector,sector,sector,sector,sec 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 -generator_operating_month,,,,,,,,,,,,,,current_month,current_month,current_month,current_month,current_month,current_month,current_month -generator_operating_year,,,,,,,,,,,,,,current_year,current_year,current_year,current_year,current_year,current_year,current_year +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 @@ -29,11 +29,7 @@ cofire_energy_source_6,prop_cofire_energy_source_6,prop_cofire_energy_source_6,p 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 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_winter_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,,,,,,,,,,, -net_winter_capacity_with_oil_mw,,,,,,,,,,,,,,,,,,,, -time_to_switch_from_gas_to_oil,,,,,,,,,,,,,,,,,,,, -time_to_switch_from_oil_to_gas,,,,,,,,,,,,,,,,,,,, factors_that_limit_switching,,,,factors_that_limit,factors_that_limit,,,,,,,,,,,,,,, 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,,,,,,,,,,, diff --git a/src/pudl/transform/eia.py b/src/pudl/transform/eia.py index 492a68e215..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,6 +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__multifuel": "_core_eia860__multifuel", + "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 786c4d3ca8..ad000f8138 100644 --- a/src/pudl/transform/eia860.py +++ b/src/pudl/transform/eia860.py @@ -468,10 +468,8 @@ def _core_eia860__generators_wind( return wind_df -# TODO: ask about generator_operating_month vs current_month and year -# also ask how the initial column mapping happens @asset -def _core_eia860__multifuel( +def _core_eia860__generators_multifuel( raw_eia860__multifuel_existing: pd.DataFrame, raw_eia860__multifuel_proposed: pd.DataFrame, raw_eia860__multifuel_retired: pd.DataFrame, @@ -525,6 +523,17 @@ def _core_eia860__multifuel( ) ) + 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 From 673ef594f43d21e36e7a77e7dabced0fd43cc8ca Mon Sep 17 00:00:00 2001 From: Jennifer Melot Date: Sat, 4 Jan 2025 16:16:46 -0500 Subject: [PATCH 05/13] Update primary key and boolean field names --- src/pudl/metadata/fields.py | 64 +++++++++---------- src/pudl/metadata/resources/eia860.py | 17 ++--- .../eia860/column_maps/multifuel_existing.csv | 16 ++--- .../eia860/column_maps/multifuel_proposed.csv | 16 ++--- .../eia860/column_maps/multifuel_retired.csv | 16 ++--- src/pudl/transform/eia860.py | 15 +++-- 6 files changed, 73 insertions(+), 71 deletions(-) diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index a4494b7ae6..5a74e314b6 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -87,10 +87,6 @@ "unit": "cfm", "description": "Total air flow including excess air at 100 percent load, reported at standard temperature and pressure (i.e. 68 F and one atmosphere pressure).", }, - "air_permit_limits": { - "type": "boolean", - "description": "True if there are air permit limits", - }, "alternative_fuel_vehicle_2_activity": { "type": "boolean", "description": "Whether the utility plants to operate alternative-fueled vehicles this coming year.", @@ -453,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.", @@ -733,18 +745,10 @@ "type": "string", "description": "Originally reported short code.", }, - "cofire_100_oil": { - "type": "boolean", - "description": "Can the generator co-fire 100 oil?", - }, "cofire_fuels": { "type": "boolean", "description": "Can the generator co-fire fuels?", }, - "cofire_oil_and_gas": { - "type": "boolean", - "description": "Can the generator co-fire oil and gas?", - }, "cofire_energy_source_1": { "type": "string", "description": "Type of fuel.", @@ -1115,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": ( @@ -1526,10 +1546,6 @@ "unit": "MWh", }, "expense_type": {"type": "string", "description": "The type of expense."}, - "factors_that_limit_switching": { - "type": "boolean", - "description": "True if there are factors that limit switching.", - }, "ferc1_generator_agg_id": { "type": "integer", "description": "ID dynamically assigned by PUDL to EIA records with multiple matches to a single FERC ID in the FERC-EIA manual matching process.", @@ -1907,10 +1923,6 @@ "type": "number", "description": "Quanity of fuel received in tons, barrel, or Mcf.", }, - "fuel_switch": { - "type": "boolean", - "description": "TK", - }, "fuel_switch_energy_source_1": { "type": "string", "description": "TK", @@ -3330,10 +3342,6 @@ ), "unit": "USD", }, - "other_limits": { - "type": "boolean", - "description": "True if there are other limits on the generator.", - }, "other_modifications_date": { "type": "date", "description": "Planned effective date that the generator is scheduled to enter commercial operation after any other planned modification is complete.", @@ -4383,10 +4391,6 @@ "type": "string", "description": "A code representing the enclosure type that best describes where the generator is located.", }, - "storage_limits": { - "type": "boolean", - "description": "True if there are storage limits", - }, "storage_technology_code_1": { "type": "string", "description": "The electro-chemical storage technology used for this battery applications.", @@ -4515,10 +4519,6 @@ "type": "boolean", "description": "Indicates whether the generator switch between oil and natural gas.", }, - "switch_when_operating": { - "type": "boolean", - "description": "Indicates whether the generator switches fuel while operating.", - }, "syncronized_transmission_grid": { "type": "boolean", "description": "Indicates whether standby generators (SB status) can be synchronized to the grid.", diff --git a/src/pudl/metadata/resources/eia860.py b/src/pudl/metadata/resources/eia860.py index 229830120e..5d1de8f9a4 100644 --- a/src/pudl/metadata/resources/eia860.py +++ b/src/pudl/metadata/resources/eia860.py @@ -941,20 +941,20 @@ "cofire_energy_source_5", "cofire_energy_source_6", "switch_oil_gas", - "switch_when_operating", + "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", - "factors_that_limit_switching", - "storage_limits", - "air_permit_limits", - "other_limits", - "cofire_oil_and_gas", - "cofire_100_oil", + "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", - "fuel_switch", + "can_fuel_switch", "time_to_switch", "regulatory_limits", "fuel_switch_energy_source_1", @@ -967,6 +967,7 @@ "primary_key": [ "utility_id_eia", "generator_id", + "plant_id_eia", ], }, "field_namespace": "eia", 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 index df859fccf0..c5e5a5d52b 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv @@ -27,18 +27,18 @@ cofire_energy_source_4,prop_cofire_energy_source_4,prop_cofire_energy_source_4,p 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 -switch_when_operating,,,,,,operating_switch,operating_switch,operating_switch,operating_switch,,,,,,,,,,, +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,,,,,,,,,,, -factors_that_limit_switching,,,,factors_that_limit,factors_that_limit,,,,,,,,,,,,,,, -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,,,,,,,,,,, -other_limits,,,,other_limits,other_limits,other_limits,other_limits,other_limits,other_limits,,,,,,,,,,, -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,,,,,,,,,,, -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,,,,,,,,,,, +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,,,,,,,,,,, -fuel_switch,prop_fuel_switch,prop_fuel_switch,prop_fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,fuel_switch,,,,,,,,,,, +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,,,,,,,,,,, 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/eia860.py b/src/pudl/transform/eia860.py index ad000f8138..8fddf553a4 100644 --- a/src/pudl/transform/eia860.py +++ b/src/pudl/transform/eia860.py @@ -480,14 +480,15 @@ def _core_eia860__generators_multifuel( multifuel_re = raw_eia860__multifuel_retired boolean_columns_to_fix = [ - "air_permit_limits", - "cofire_fuels", - "factors_that_limit_switching", + "has_air_permit_limits", + "can_cofire_100_oil", + "can_cofire_fuels", + "has_factors_that_limit_switching", "multiple_fuels", - "other_limits", - "storage_limits", - "switch_oil_gas", - "switch_when_operating", + "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: From f5c2f9fa115d2b877ff70cb3cb22d54b47c82351 Mon Sep 17 00:00:00 2001 From: Jennifer Melot Date: Sat, 4 Jan 2025 16:33:15 -0500 Subject: [PATCH 06/13] Add release note --- docs/release_notes.rst | 4 ++++ 1 file changed, 4 insertions(+) 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 ^^^^^^^^^ From cb6de892f3c2fecfb0b7d3a23d6edb329f084a74 Mon Sep 17 00:00:00 2001 From: Austen Sharpe Date: Fri, 17 Jan 2025 15:17:09 -0300 Subject: [PATCH 07/13] Add report_date and drop pk dupes --- src/pudl/metadata/fields.py | 8 -------- src/pudl/metadata/resources/eia860.py | 5 +++-- src/pudl/transform/eia860.py | 10 ++++++++++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index 5a74e314b6..fb4392dce1 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -967,14 +967,6 @@ "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}.", diff --git a/src/pudl/metadata/resources/eia860.py b/src/pudl/metadata/resources/eia860.py index 5d1de8f9a4..673ea954cb 100644 --- a/src/pudl/metadata/resources/eia860.py +++ b/src/pudl/metadata/resources/eia860.py @@ -913,6 +913,7 @@ ), "schema": { "fields": [ + "report_date", "utility_id_eia", "utility_name_eia", "plant_id_eia", @@ -928,8 +929,7 @@ "capacity_mw", "summer_capacity_mw", "winter_capacity_mw", - "current_planned_generator_operating_month", - "current_planned_generator_operating_year", + "current_planned_generator_operating_date", "energy_source_code_1", "energy_source_code_2", "multiple_fuels", @@ -965,6 +965,7 @@ "fuel_switch_energy_source_6", ], "primary_key": [ + "report_date", "utility_id_eia", "generator_id", "plant_id_eia", diff --git a/src/pudl/transform/eia860.py b/src/pudl/transform/eia860.py index 8fddf553a4..73c58e67be 100644 --- a/src/pudl/transform/eia860.py +++ b/src/pudl/transform/eia860.py @@ -510,6 +510,7 @@ def _core_eia860__generators_multifuel( ) .replace(to_replace=nulls_replace_cols) .pipe(pudl.helpers.month_year_to_date) + .pipe(pudl.helpers.convert_to_date) .pipe(PUDL_PACKAGE.encode) ) @@ -535,6 +536,15 @@ def _core_eia860__generators_multifuel( ) ) + # 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 From bd01ae72fdbd778c8339535875c61bb4b49a3dbf Mon Sep 17 00:00:00 2001 From: Austen Sharpe Date: Fri, 17 Jan 2025 15:20:09 -0300 Subject: [PATCH 08/13] Update alemic --- .../bbd829448c4b_add_multifuel_table.py | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 migrations/versions/bbd829448c4b_add_multifuel_table.py diff --git a/migrations/versions/bbd829448c4b_add_multifuel_table.py b/migrations/versions/bbd829448c4b_add_multifuel_table.py new file mode 100644 index 0000000000..442bb79501 --- /dev/null +++ b/migrations/versions/bbd829448c4b_add_multifuel_table.py @@ -0,0 +1,87 @@ +"""Add multifuel table + +Revision ID: bbd829448c4b +Revises: 450d100cd30b +Create Date: 2025-01-17 14:36:41.966480 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'bbd829448c4b' +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('multiple_fuels', sa.Boolean(), nullable=True, comment='Can the generator burn multiple fuels?'), + sa.Column('cofire_fuels', sa.Boolean(), nullable=True, comment='Can the generator co-fire fuels?'), + sa.Column('cofire_energy_source_1', sa.Text(), nullable=True, comment='Type of fuel.'), + sa.Column('cofire_energy_source_2', sa.Text(), nullable=True, comment='Type of fuel.'), + sa.Column('cofire_energy_source_3', sa.Text(), nullable=True, comment='Type of fuel.'), + sa.Column('cofire_energy_source_4', sa.Text(), nullable=True, comment='Type of fuel.'), + sa.Column('cofire_energy_source_5', sa.Text(), nullable=True, comment='Type of fuel.'), + sa.Column('cofire_energy_source_6', sa.Text(), nullable=True, comment='Type of fuel.'), + sa.Column('switch_oil_gas', sa.Boolean(), nullable=True, comment='Indicates whether the generator switch between oil and natural gas.'), + sa.Column('can_switch_when_operating', sa.Boolean(), nullable=True, comment='Indicates whether the generator switches fuel while operating.'), + sa.Column('net_summer_capacity_with_natural_gas_mw', sa.Float(), nullable=True, comment='Summer capacity with natural gas.'), + sa.Column('net_summer_capacity_with_oil_mw', sa.Float(), nullable=True, comment='Summer capacity with oil.'), + sa.Column('net_winter_capacity_with_natural_gas_mw', sa.Float(), nullable=True, comment='Winter capacity with natural gas.'), + sa.Column('net_winter_capacity_with_oil_mw', sa.Float(), nullable=True, comment='Winter capacity with oil'), + sa.Column('has_factors_that_limit_switching', sa.Boolean(), nullable=True, comment='True if there are factors that limit switching.'), + sa.Column('has_storage_limits', sa.Boolean(), nullable=True, comment='True if there are storage limits'), + sa.Column('has_air_permit_limits', sa.Boolean(), nullable=True, comment='True if there are air permit limits'), + sa.Column('has_other_limits', sa.Boolean(), nullable=True, comment='True if there are other limits on the generator.'), + sa.Column('can_cofire_oil_and_gas', sa.Boolean(), nullable=True, comment='Can the generator co-fire oil and gas?'), + sa.Column('can_cofire_100_oil', sa.Boolean(), nullable=True, comment='Can the generator co-fire 100 oil?'), + sa.Column('max_oil_heat_input', sa.Float(), nullable=True, comment='TK'), + sa.Column('max_oil_output_mw', sa.Float(), nullable=True, comment='MW'), + sa.Column('can_fuel_switch', sa.Boolean(), nullable=True, comment='TK'), + sa.Column('time_to_switch', sa.Text(), nullable=True, comment='Time needed to switch between fuel sources'), + sa.Column('regulatory_limits', sa.Text(), nullable=True, comment='TK'), + sa.Column('fuel_switch_energy_source_1', sa.Text(), nullable=True, comment='TK'), + sa.Column('fuel_switch_energy_source_2', sa.Text(), nullable=True, comment='TK'), + sa.Column('fuel_switch_energy_source_3', sa.Text(), nullable=True, comment='TK'), + sa.Column('fuel_switch_energy_source_4', sa.Text(), nullable=True, comment='TK'), + sa.Column('fuel_switch_energy_source_5', sa.Text(), nullable=True, comment='TK'), + sa.Column('fuel_switch_energy_source_6', sa.Text(), nullable=True, comment='TK'), + 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')) + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('core_eia860__scd_generators_multifuel') + # ### end Alembic commands ### From 941e6fc8e38c018009e7d35e15129b2c72377a44 Mon Sep 17 00:00:00 2001 From: Austen Sharpe <49878195+aesharpe@users.noreply.github.com> Date: Tue, 28 Jan 2025 12:57:10 -0300 Subject: [PATCH 09/13] Update src/pudl/metadata/resources/eia860.py --- src/pudl/metadata/resources/eia860.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pudl/metadata/resources/eia860.py b/src/pudl/metadata/resources/eia860.py index 673ea954cb..536c1df8c5 100644 --- a/src/pudl/metadata/resources/eia860.py +++ b/src/pudl/metadata/resources/eia860.py @@ -908,8 +908,8 @@ }, "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." + "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": [ From 4d6dfe39fe6cf27dd41007d6209e888f3a99d997 Mon Sep 17 00:00:00 2001 From: Austen Sharpe Date: Tue, 28 Jan 2025 17:36:47 -0300 Subject: [PATCH 10/13] Update field descriptions --- src/pudl/metadata/fields.py | 67 ++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index fb4392dce1..bb7d683e00 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -451,19 +451,19 @@ }, "can_cofire_100_oil": { "type": "boolean", - "description": "Can the generator co-fire 100 oil?", + "description": "Whether the generator can co-fire 100 oil.", }, "can_cofire_oil_and_gas": { "type": "boolean", - "description": "Can the generator co-fire oil and gas?", + "description": "Whether the generator can co-fire oil and gas.", }, "can_fuel_switch": { "type": "boolean", - "description": "TK", + "description": "Whether a unit is able to switch fuels.", }, "can_switch_when_operating": { "type": "boolean", - "description": "Indicates whether the generator switches fuel while operating.", + "description": "Whether the generator switches fuel while operating.", }, "capacity_eoy_mw": { "type": "number", @@ -751,27 +751,27 @@ }, "cofire_energy_source_1": { "type": "string", - "description": "Type of fuel.", + "description": "The codes representing the type of fuel that will be co-fired.", }, "cofire_energy_source_2": { "type": "string", - "description": "Type of fuel.", + "description": "The codes representing the type of fuel that will be co-fired.", }, "cofire_energy_source_3": { "type": "string", - "description": "Type of fuel.", + "description": "The codes representing the type of fuel that will be co-fired.", }, "cofire_energy_source_4": { "type": "string", - "description": "Type of fuel.", + "description": "The codes representing the type of fuel that will be co-fired.", }, "cofire_energy_source_5": { "type": "string", - "description": "Type of fuel.", + "description": "The codes representing the type of fuel that will be co-fired.", }, "cofire_energy_source_6": { "type": "string", - "description": "Type of fuel.", + "description": "The codes representing the type of fuel that will be co-fired.", }, "coincident_peak_demand_mw": { "type": "number", @@ -1113,7 +1113,7 @@ }, "has_air_permit_limits": { "type": "boolean", - "description": "True if there are air permit limits", + "description": "Whether air permit limits are a factor that limits the operation of the generator when running on 100 percent oil.", }, "has_demand_side_management": { "type": "boolean", @@ -1121,15 +1121,15 @@ }, "has_factors_that_limit_switching": { "type": "boolean", - "description": "True if there are factors that limit switching.", + "description": "Whether there are factors that limit the generator's ability to switch between oil and natural gas.", }, "has_other_limits": { "type": "boolean", - "description": "True if there are other limits on the generator.", + "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": "True if there are storage limits", + "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", @@ -1917,27 +1917,27 @@ }, "fuel_switch_energy_source_1": { "type": "string", - "description": "TK", + "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": "TK", + "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": "TK", + "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": "TK", + "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": "TK", + "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": "TK", + "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", @@ -2573,11 +2573,13 @@ }, "max_oil_heat_input": { "type": "number", - "description": "TK", + "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": "MW", + "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", @@ -2906,23 +2908,23 @@ }, "net_summer_capacity_with_natural_gas_mw": { "type": "number", - "description": "Summer capacity with natural gas.", - "unit": "MWh", + "description": "The maximum net summer output achievable when running on natural gas.", + "unit": "MW", }, "net_summer_capacity_with_oil_mw": { "type": "number", - "description": "Summer capacity with oil.", - "unit": "MWh", + "description": "The maximum net summer output achievable when running on oil.", + "unit": "MW", }, "net_winter_capacity_with_natural_gas_mw": { "type": "number", - "description": "Winter capacity with natural gas.", - "unit": "MWh", + "description": "The maximum net winter output achievable when running on natural gas.", + "unit": "MW", }, "net_winter_capacity_with_oil_mw": { "type": "number", - "description": "Winter capacity with oil", - "unit": "MWh", + "description": "The maximum net summer output achievable when running on oil.", + "unit": "MW", }, "net_wheeled_power_mwh": { "type": "number", @@ -3792,7 +3794,10 @@ "type": "string", "description": "Human-readable name of a US Census region.", }, - "regulatory_limits": {"type": "string", "description": "TK"}, + "regulatory_limits": { + "type": "string", + "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.", From ea7d397360f891d90705327a31b10995087f1398 Mon Sep 17 00:00:00 2001 From: Austen Sharpe Date: Tue, 28 Jan 2025 18:45:18 -0300 Subject: [PATCH 11/13] Update column names and alembic --- .../3b65c445d4b4_add_multifuel_table.py | 152 ++++++++++++++++++ .../bbd829448c4b_add_multifuel_table.py | 87 ---------- src/pudl/metadata/fields.py | 40 ++--- src/pudl/metadata/resources/__init__.py | 2 +- src/pudl/metadata/resources/eia.py | 6 +- src/pudl/metadata/resources/eia860.py | 27 ++-- src/pudl/metadata/resources/mcoe.py | 6 +- .../eia860/column_maps/generator.csv | 2 +- .../eia860/column_maps/generator_existing.csv | 4 +- .../eia860/column_maps/generator_proposed.csv | 4 +- .../eia860/column_maps/generator_retired.csv | 4 +- .../eia860/column_maps/multifuel_existing.csv | 23 ++- .../eia860/column_maps/multifuel_proposed.csv | 6 +- .../eia860/column_maps/multifuel_retired.csv | 6 +- src/pudl/transform/eia860.py | 10 +- 15 files changed, 224 insertions(+), 155 deletions(-) create mode 100644 migrations/versions/3b65c445d4b4_add_multifuel_table.py delete mode 100644 migrations/versions/bbd829448c4b_add_multifuel_table.py 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/migrations/versions/bbd829448c4b_add_multifuel_table.py b/migrations/versions/bbd829448c4b_add_multifuel_table.py deleted file mode 100644 index 442bb79501..0000000000 --- a/migrations/versions/bbd829448c4b_add_multifuel_table.py +++ /dev/null @@ -1,87 +0,0 @@ -"""Add multifuel table - -Revision ID: bbd829448c4b -Revises: 450d100cd30b -Create Date: 2025-01-17 14:36:41.966480 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = 'bbd829448c4b' -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('multiple_fuels', sa.Boolean(), nullable=True, comment='Can the generator burn multiple fuels?'), - sa.Column('cofire_fuels', sa.Boolean(), nullable=True, comment='Can the generator co-fire fuels?'), - sa.Column('cofire_energy_source_1', sa.Text(), nullable=True, comment='Type of fuel.'), - sa.Column('cofire_energy_source_2', sa.Text(), nullable=True, comment='Type of fuel.'), - sa.Column('cofire_energy_source_3', sa.Text(), nullable=True, comment='Type of fuel.'), - sa.Column('cofire_energy_source_4', sa.Text(), nullable=True, comment='Type of fuel.'), - sa.Column('cofire_energy_source_5', sa.Text(), nullable=True, comment='Type of fuel.'), - sa.Column('cofire_energy_source_6', sa.Text(), nullable=True, comment='Type of fuel.'), - sa.Column('switch_oil_gas', sa.Boolean(), nullable=True, comment='Indicates whether the generator switch between oil and natural gas.'), - sa.Column('can_switch_when_operating', sa.Boolean(), nullable=True, comment='Indicates whether the generator switches fuel while operating.'), - sa.Column('net_summer_capacity_with_natural_gas_mw', sa.Float(), nullable=True, comment='Summer capacity with natural gas.'), - sa.Column('net_summer_capacity_with_oil_mw', sa.Float(), nullable=True, comment='Summer capacity with oil.'), - sa.Column('net_winter_capacity_with_natural_gas_mw', sa.Float(), nullable=True, comment='Winter capacity with natural gas.'), - sa.Column('net_winter_capacity_with_oil_mw', sa.Float(), nullable=True, comment='Winter capacity with oil'), - sa.Column('has_factors_that_limit_switching', sa.Boolean(), nullable=True, comment='True if there are factors that limit switching.'), - sa.Column('has_storage_limits', sa.Boolean(), nullable=True, comment='True if there are storage limits'), - sa.Column('has_air_permit_limits', sa.Boolean(), nullable=True, comment='True if there are air permit limits'), - sa.Column('has_other_limits', sa.Boolean(), nullable=True, comment='True if there are other limits on the generator.'), - sa.Column('can_cofire_oil_and_gas', sa.Boolean(), nullable=True, comment='Can the generator co-fire oil and gas?'), - sa.Column('can_cofire_100_oil', sa.Boolean(), nullable=True, comment='Can the generator co-fire 100 oil?'), - sa.Column('max_oil_heat_input', sa.Float(), nullable=True, comment='TK'), - sa.Column('max_oil_output_mw', sa.Float(), nullable=True, comment='MW'), - sa.Column('can_fuel_switch', sa.Boolean(), nullable=True, comment='TK'), - sa.Column('time_to_switch', sa.Text(), nullable=True, comment='Time needed to switch between fuel sources'), - sa.Column('regulatory_limits', sa.Text(), nullable=True, comment='TK'), - sa.Column('fuel_switch_energy_source_1', sa.Text(), nullable=True, comment='TK'), - sa.Column('fuel_switch_energy_source_2', sa.Text(), nullable=True, comment='TK'), - sa.Column('fuel_switch_energy_source_3', sa.Text(), nullable=True, comment='TK'), - sa.Column('fuel_switch_energy_source_4', sa.Text(), nullable=True, comment='TK'), - sa.Column('fuel_switch_energy_source_5', sa.Text(), nullable=True, comment='TK'), - sa.Column('fuel_switch_energy_source_6', sa.Text(), nullable=True, comment='TK'), - 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')) - ) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('core_eia860__scd_generators_multifuel') - # ### end Alembic commands ### diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index bb7d683e00..1ad2e97a66 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -463,7 +463,7 @@ }, "can_switch_when_operating": { "type": "boolean", - "description": "Whether the generator switches fuel while operating.", + "description": "Whether the generator can switch fuel while operating.", }, "capacity_eoy_mw": { "type": "number", @@ -745,9 +745,9 @@ "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", @@ -1123,7 +1123,7 @@ "type": "boolean", "description": "Whether there are factors that limit the generator's ability to switch between oil and natural gas.", }, - "has_other_limits": { + "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.", }, @@ -2774,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", @@ -2906,22 +2906,22 @@ ), "unit": "MWh", }, - "net_summer_capacity_with_natural_gas_mw": { + "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_with_oil_mw": { + "net_summer_capacity_oil_mw": { "type": "number", "description": "The maximum net summer output achievable when running on oil.", "unit": "MW", }, - "net_winter_capacity_with_natural_gas_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_with_oil_mw": { + "net_winter_capacity_oil_mw": { "type": "number", "description": "The maximum net summer output achievable when running on oil.", "unit": "MW", @@ -3794,8 +3794,8 @@ "type": "string", "description": "Human-readable name of a US Census region.", }, - "regulatory_limits": { - "type": "string", + "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": { @@ -4512,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", @@ -4577,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": ( @@ -4592,10 +4600,6 @@ "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/__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 536c1df8c5..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", @@ -932,31 +932,32 @@ "current_planned_generator_operating_date", "energy_source_code_1", "energy_source_code_2", - "multiple_fuels", - "cofire_fuels", + "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", - "switch_oil_gas", + "can_switch_oil_gas", + "time_to_switch_oil_to_gas", + "time_to_switch_gas_to_oil", "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", + "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_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", - "time_to_switch", - "regulatory_limits", + "has_regulatory_limits", "fuel_switch_energy_source_1", "fuel_switch_energy_source_2", "fuel_switch_energy_source_3", 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 e75e5ea143..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 +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_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 +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_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 +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,,,,,,,,,,, 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,,,,,,,,,,, +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 index c5e5a5d52b..69d4676856 100644 --- a/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv +++ b/src/pudl/package_data/eia860/column_maps/multifuel_proposed.csv @@ -18,15 +18,15 @@ current_planned_generator_operating_month,,,,,,,,,,,,,,current_month,current_mon 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 +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 -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_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,,,,,,,,,,, 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 7269b23a05..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,15 +20,15 @@ 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 +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 diff --git a/src/pudl/transform/eia860.py b/src/pudl/transform/eia860.py index 73c58e67be..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", @@ -484,8 +484,8 @@ def _core_eia860__generators_multifuel( "can_cofire_100_oil", "can_cofire_fuels", "has_factors_that_limit_switching", - "multiple_fuels", - "has_other_limits", + "can_burn_multiple_fuels", + "has_other_factors_that_limit_switching", "has_storage_limits", "can_switch_oil_gas", "can_switch_when_operating", From 180e6cf16f5ce3ed38aaa8fcb65a0a072fc07b9d Mon Sep 17 00:00:00 2001 From: Austen Sharpe Date: Wed, 29 Jan 2025 16:04:05 -0300 Subject: [PATCH 12/13] Quick update to limit column descriptions --- src/pudl/metadata/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index 1ad2e97a66..7547cc810c 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -1113,7 +1113,7 @@ }, "has_air_permit_limits": { "type": "boolean", - "description": "Whether air permit limits are a factor that limits the operation of the generator when running on 100 percent oil.", + "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", From 38880864ee31897ec0dc343395b2e74506ad6e07 Mon Sep 17 00:00:00 2001 From: Austen Sharpe Date: Wed, 29 Jan 2025 16:08:25 -0300 Subject: [PATCH 13/13] Update 860 docs --- docs/templates/eia860_child.rst.jinja | 1 - 1 file changed, 1 deletion(-) 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 %}