From 8e972bb97825968292fd030f56941349d5d41b49 Mon Sep 17 00:00:00 2001 From: Christina Gosnell Date: Tue, 17 Mar 2026 12:45:36 -0400 Subject: [PATCH 1/4] early early transform new ferc1 depreciation table --- src/pudl/extract/ferc1.py | 4 +++ src/pudl/transform/ferc1.py | 16 +++++++++--- src/pudl/transform/params/ferc1.py | 42 ++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/pudl/extract/ferc1.py b/src/pudl/extract/ferc1.py index 8940c55547..d2c82ba614 100644 --- a/src/pudl/extract/ferc1.py +++ b/src/pudl/extract/ferc1.py @@ -171,6 +171,10 @@ "dbf": "f1_dacs_epda", "xbrl": "summary_of_depreciation_and_amortization_charges_section_a_336", }, + "core_ferc1__yearly_depreciation_changes_sched336": { + "dbf": "f1_edcfu_epda", + "xbrl": "factors_used_in_estimating_depreciation_charges_section_c_336", + }, "core_ferc1__yearly_depreciation_changes_sched219": { "dbf": "f1_accumdepr_prvsn", "xbrl": "accumulated_provision_for_depreciation_of_electric_utility_plant_changes_section_a_219", diff --git a/src/pudl/transform/ferc1.py b/src/pudl/transform/ferc1.py index 76cd3e0b03..3f95669666 100644 --- a/src/pudl/transform/ferc1.py +++ b/src/pudl/transform/ferc1.py @@ -147,10 +147,11 @@ class TableIdFerc1(enum.Enum): OPERATING_EXPENSES = "core_ferc1__yearly_operating_expenses_sched320" BALANCE_SHEET_LIABILITIES = "core_ferc1__yearly_balance_sheet_liabilities_sched110" DEPRECIATION_SUMMARY = "core_ferc1__yearly_depreciation_summary_sched336" + DEPRECIATION_CHANGES = "core_ferc1__yearly_depreciation_changes_sched336" BALANCE_SHEET_ASSETS = "core_ferc1__yearly_balance_sheet_assets_sched110" RETAINED_EARNINGS = "core_ferc1__yearly_retained_earnings_sched118" INCOME_STATEMENTS = "core_ferc1__yearly_income_statements_sched114" - DEPRECIATION_CHANGES = "core_ferc1__yearly_depreciation_changes_sched219" + ACCUMULATED_DEPRECIATION = "core_ferc1__yearly_depreciation_changes_sched219" OPERATING_REVENUES = "core_ferc1__yearly_operating_revenues_sched300" DEPRECIATION_BY_FUNCTION = "core_ferc1__yearly_depreciation_by_function_sched219" CASH_FLOWS = "core_ferc1__yearly_cash_flows_sched120" @@ -5564,10 +5565,17 @@ def process_xbrl_metadata( return meta -class DepreciationChangesTableTransformer(Ferc1AbstractTableTransformer): +class DepreciationChangesTransformer(Ferc1AbstractTableTransformer): + """Transformer class for :ref:`core_ferc1__yearly_depreciation_changes_sched336` table.""" + + table_id: TableIdFerc1 = TableIdFerc1.DEPRECIATION_SUMMARY + has_unique_record_ids: bool = False + + +class AccumulatedDepreciationTableTransformer(Ferc1AbstractTableTransformer): """Transformer class for :ref:`core_ferc1__yearly_depreciation_changes_sched219` table.""" - table_id: TableIdFerc1 = TableIdFerc1.DEPRECIATION_CHANGES + table_id: TableIdFerc1 = TableIdFerc1.ACCUMULATED_DEPRECIATION has_unique_record_ids: bool = False def convert_xbrl_metadata_json_to_df( @@ -6107,7 +6115,7 @@ class OtherRegulatoryLiabilitiesTableTransformer(Ferc1AbstractTableTransformer): "core_ferc1__yearly_depreciation_summary_sched336": DepreciationSummaryTableTransformer, "core_ferc1__yearly_balance_sheet_assets_sched110": BalanceSheetAssetsTableTransformer, "core_ferc1__yearly_income_statements_sched114": IncomeStatementsTableTransformer, - "core_ferc1__yearly_depreciation_changes_sched219": DepreciationChangesTableTransformer, + "core_ferc1__yearly_depreciation_changes_sched219": AccumulatedDepreciationTableTransformer, "core_ferc1__yearly_depreciation_by_function_sched219": DepreciationByFunctionTableTransformer, "core_ferc1__yearly_retained_earnings_sched118": RetainedEarningsTableTransformer, "core_ferc1__yearly_operating_revenues_sched300": OperatingRevenuesTableTransformer, diff --git a/src/pudl/transform/params/ferc1.py b/src/pudl/transform/params/ferc1.py index 42a7ce3edb..010a5f8831 100644 --- a/src/pudl/transform/params/ferc1.py +++ b/src/pudl/transform/params/ferc1.py @@ -3617,6 +3617,48 @@ }, }, }, + "core_ferc1__yearly_depreciation_changes_sched336": { + "rename_columns_ferc1": { + "dbf": { + "columns": { + "respondent_id": "utility_id_ferc1_dbf", + "report_year": "report_year", + "spplmnt_num": "spplmnt_num", + "row_number": "row_number", + "row_seq": "row_seq", + "row_prvlg": "row_prvlg", + "depr_plnt_base": "depreciable_plant_base", # $1000s + "est_avg_srvce_lf": "service_life_avg", # est + "net_salvage": "net_salvage", # pct + "apply_depr_rate": "applied_depreciation_rates", # pct + "mrtlty_crv_typ": "mortality_curve_type", + "avg_remaining_lf": "remaining_life_avg", + # "xbrl_factoid": "plant_function", # TODO: figure out... + "report_prd": "report_prd", + } + }, + "duration_xbrl": { + "columns": { + "entity_id": "utility_id_ferc1_xbrl", + "report_year": "report_year", + "estimated_depreciation_charges_factors_axis": "depreciation_charges", + "utility_plant_applied_depreciation_rate": "applied_depreciation_rates", + "utility_plant_estimated_average_service_life": "service_life_avg", + "utility_plant_weighted_average_remaining_life": "remaining_life_avg", + "order_number": "order_number", + "mortality_curve_type": "mortality_curve_type", + "account_number_factors_used_in_estimating_depreciation_charges": "account_num", + "depreciable_plant_base": "depreciable_plant_base", + "utility_plant_net_salvage_value_percentage": "net_salvage", + } + }, + }, + "align_row_numbers_dbf": {"dbf_table_names": ["f1_edcfu_epda"]}, + # "merge_xbrl_metadata": { + # "rename_columns": {"xbrl_factoid": "ferc_account_label"}, + # "on": "ferc_account_label", + # }, + }, "core_ferc1__yearly_operating_revenues_sched300": { "rename_columns_ferc1": { "duration_xbrl": { From fcaf50e589d8e9c2e209410acadd86f086b9bc8a Mon Sep 17 00:00:00 2001 From: Christina Gosnell Date: Thu, 19 Mar 2026 16:33:59 -0400 Subject: [PATCH 2/4] enable main transform --- src/pudl/transform/ferc1.py | 2 +- src/pudl/transform/params/ferc1.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pudl/transform/ferc1.py b/src/pudl/transform/ferc1.py index 3f95669666..b7199fa57f 100644 --- a/src/pudl/transform/ferc1.py +++ b/src/pudl/transform/ferc1.py @@ -5568,7 +5568,7 @@ def process_xbrl_metadata( class DepreciationChangesTransformer(Ferc1AbstractTableTransformer): """Transformer class for :ref:`core_ferc1__yearly_depreciation_changes_sched336` table.""" - table_id: TableIdFerc1 = TableIdFerc1.DEPRECIATION_SUMMARY + table_id: TableIdFerc1 = TableIdFerc1.DEPRECIATION_CHANGES has_unique_record_ids: bool = False diff --git a/src/pudl/transform/params/ferc1.py b/src/pudl/transform/params/ferc1.py index 010a5f8831..5e6c32809f 100644 --- a/src/pudl/transform/params/ferc1.py +++ b/src/pudl/transform/params/ferc1.py @@ -3633,11 +3633,12 @@ "apply_depr_rate": "applied_depreciation_rates", # pct "mrtlty_crv_typ": "mortality_curve_type", "avg_remaining_lf": "remaining_life_avg", + "acct_num": "account_num", # "xbrl_factoid": "plant_function", # TODO: figure out... "report_prd": "report_prd", } }, - "duration_xbrl": { + "xbrl": { "columns": { "entity_id": "utility_id_ferc1_xbrl", "report_year": "report_year", @@ -3653,7 +3654,7 @@ } }, }, - "align_row_numbers_dbf": {"dbf_table_names": ["f1_edcfu_epda"]}, + # "align_row_numbers_dbf": {"dbf_table_names": ["f1_edcfu_epda"]}, # "merge_xbrl_metadata": { # "rename_columns": {"xbrl_factoid": "ferc_account_label"}, # "on": "ferc_account_label", From b6597ff3c31015e27593e43463f564d4221aeb02 Mon Sep 17 00:00:00 2001 From: Christina Gosnell Date: Mon, 23 Mar 2026 14:30:24 -0400 Subject: [PATCH 3/4] add string normalization --- src/pudl/transform/params/ferc1.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/pudl/transform/params/ferc1.py b/src/pudl/transform/params/ferc1.py index e7d5981516..fce35e142c 100644 --- a/src/pudl/transform/params/ferc1.py +++ b/src/pudl/transform/params/ferc1.py @@ -1971,7 +1971,6 @@ "mrtlty_crv_typ": "mortality_curve_type", "avg_remaining_lf": "remaining_life_avg", "acct_num": "account_num", - # "xbrl_factoid": "plant_function", # TODO: figure out... "report_prd": "report_prd", } }, @@ -1991,11 +1990,11 @@ } }, }, - # "align_row_numbers_dbf": {"dbf_table_names": ["f1_edcfu_epda"]}, - # "merge_xbrl_metadata": { - # "rename_columns": {"xbrl_factoid": "ferc_account_label"}, - # "on": "ferc_account_label", - # }, + "normalize_strings": { + "account_num": FERC1_STRING_NORM, + "service_life_avg": FERC1_STRING_NORM, + "remaining_life_avg": FERC1_STRING_NORM, + }, }, "core_ferc1__yearly_operating_revenues_sched300": { "rename_columns_ferc1": { From 5862ab07d78b4061d694b1b0952743b970932faf Mon Sep 17 00:00:00 2001 From: Christina Gosnell Date: Sat, 28 Mar 2026 16:37:54 -0400 Subject: [PATCH 4/4] save video game --- src/pudl/metadata/fields.py | 25 +++++++++++++++++ src/pudl/metadata/resources/ferc1.py | 40 ++++++++++++++++++++++++++++ src/pudl/transform/ferc1.py | 10 +++++++ src/pudl/transform/params/ferc1.py | 6 ++--- 4 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/pudl/metadata/fields.py b/src/pudl/metadata/fields.py index 7dc1db9f5f..01d262af2e 100644 --- a/src/pudl/metadata/fields.py +++ b/src/pudl/metadata/fields.py @@ -9999,6 +9999,31 @@ "description": "The cost of materials and supplies used.", "unit": "USD", }, + "depreciable_plant_base": {"type": "number", "description": ""}, + "net_salvage": {"type": "number", "description": ""}, + "depreciation_rate": {"type": "string", "description": ""}, + "mortality_curve_type": {"type": "string", "description": ""}, + "depreciation_charges": {"type": "string", "description": ""}, + "order_num": { + "type": "number", + "description": ( + "This field is defined in FERC-XBRL documentation as a feild that is used or sequence a table." + "FERC-XBRL documentation notes: 'This field is added to a table to control ordering of the items on the table.'" + "FERC's documentation also notes that this field should always be an integer - although " + "there are many instances of floating point values which seem to increment by decimal points. " + "Nonetheless, this field can be used to help understand the orignal order of the table. " + "This field did not exist prior to FERC publishing Form 1 as XBRL and thus is always null prior to 2021." + ), + }, + "account_num": { + "type": "string", + "description": "Account number(s) in connection with factors used in estimating depreciation charges.", + }, + "service_life_avg": { + "type": "string", + "description": "Estimated average service life of utility plant.", + }, + "remaining_life_avg": {"type": "string", "description": ""}, } """Field attributes by PUDL identifier (`field.name`).""" diff --git a/src/pudl/metadata/resources/ferc1.py b/src/pudl/metadata/resources/ferc1.py index 436ad85d95..b0b89693ba 100644 --- a/src/pudl/metadata/resources/ferc1.py +++ b/src/pudl/metadata/resources/ferc1.py @@ -54,6 +54,17 @@ "amortization changes." ), }, + "yearly_depreciation_changes_sched336": { + "additional_summary_text": "factors used in estimating depreciation charges.", + "additional_source_text": "(Schedule 336 - Section C)", + "usage_warnings": ["aggregation_hazard"], + "additional_details_text": ( + "This table contains details at a variety of levels of granularity " + "the " + "This table only " + "contains information from Section C: Factors Used in Estimating Depreciation Charges." + ), + }, "yearly_energy_sources_sched401": { "additional_summary_text": "sources of electric energy generated or purchased, exchanged and wheeled.", "additional_source_text": "(Schedule 401a)", @@ -436,6 +447,35 @@ "etl_group": "ferc1", "field_namespace": "ferc1", }, + "core_ferc1__yearly_depreciation_changes_sched336": { + "description": TABLE_DESCRIPTIONS["yearly_depreciation_changes_sched336"], + "schema": { + "fields": [ + "record_id", + "report_year", + "utility_id_ferc1", + # belowww + "depreciable_plant_base", + "net_salvage", + "depreciation_rate", + "mortality_curve_type", + "depreciation_charges", + "order_num", + "account_num", + "service_life_avg", + "remaining_life_avg", + ], + # "primary_key": [ + # "utility_id_ferc1", + # "report_year", + # "plant_function", + # "ferc_account_label", + # ], + }, + "sources": ["ferc1"], + "etl_group": "ferc1", + "field_namespace": "ferc1", + }, "core_ferc1__yearly_energy_sources_sched401": { "description": TABLE_DESCRIPTIONS["yearly_energy_sources_sched401"], "schema": { diff --git a/src/pudl/transform/ferc1.py b/src/pudl/transform/ferc1.py index b7199fa57f..c2f052bc76 100644 --- a/src/pudl/transform/ferc1.py +++ b/src/pudl/transform/ferc1.py @@ -5571,6 +5571,15 @@ class DepreciationChangesTransformer(Ferc1AbstractTableTransformer): table_id: TableIdFerc1 = TableIdFerc1.DEPRECIATION_CHANGES has_unique_record_ids: bool = False + def transform_main(self, df): + """Convert $1000s to $s after standard transform_main.""" + df = ( + super() + .transform_main(df) + .assign(depreciable_plant_base=lambda x: x.depreciable_plant_base / 1000) + ) + return df + class AccumulatedDepreciationTableTransformer(Ferc1AbstractTableTransformer): """Transformer class for :ref:`core_ferc1__yearly_depreciation_changes_sched219` table.""" @@ -6113,6 +6122,7 @@ class OtherRegulatoryLiabilitiesTableTransformer(Ferc1AbstractTableTransformer): "core_ferc1__yearly_operating_expenses_sched320": OperatingExpensesTableTransformer, "core_ferc1__yearly_balance_sheet_liabilities_sched110": BalanceSheetLiabilitiesTableTransformer, "core_ferc1__yearly_depreciation_summary_sched336": DepreciationSummaryTableTransformer, + # "core_ferc1__yearly_depreciation_changes_sched336": DepreciationChangesTransformer, "core_ferc1__yearly_balance_sheet_assets_sched110": BalanceSheetAssetsTableTransformer, "core_ferc1__yearly_income_statements_sched114": IncomeStatementsTableTransformer, "core_ferc1__yearly_depreciation_changes_sched219": AccumulatedDepreciationTableTransformer, diff --git a/src/pudl/transform/params/ferc1.py b/src/pudl/transform/params/ferc1.py index fce35e142c..837e08a53e 100644 --- a/src/pudl/transform/params/ferc1.py +++ b/src/pudl/transform/params/ferc1.py @@ -1967,7 +1967,7 @@ "depr_plnt_base": "depreciable_plant_base", # $1000s "est_avg_srvce_lf": "service_life_avg", # est "net_salvage": "net_salvage", # pct - "apply_depr_rate": "applied_depreciation_rates", # pct + "apply_depr_rate": "depreciation_rate", # pct "mrtlty_crv_typ": "mortality_curve_type", "avg_remaining_lf": "remaining_life_avg", "acct_num": "account_num", @@ -1979,10 +1979,10 @@ "entity_id": "utility_id_ferc1_xbrl", "report_year": "report_year", "estimated_depreciation_charges_factors_axis": "depreciation_charges", - "utility_plant_applied_depreciation_rate": "applied_depreciation_rates", + "utility_plant_applied_depreciation_rate": "depreciation_rate", "utility_plant_estimated_average_service_life": "service_life_avg", "utility_plant_weighted_average_remaining_life": "remaining_life_avg", - "order_number": "order_number", + "order_number": "order_num", "mortality_curve_type": "mortality_curve_type", "account_number_factors_used_in_estimating_depreciation_charges": "account_num", "depreciable_plant_base": "depreciable_plant_base",