1212from prereise .gather .griddata .hifld .data_access .load import (
1313 get_hifld_electric_power_transmission_lines ,
1414 get_hifld_electric_substations ,
15+ get_transformer_number_overrides ,
1516 get_transformer_parameters ,
1617 get_zone ,
1718)
@@ -539,7 +540,9 @@ def create_buses(lines):
539540 return buses
540541
541542
542- def create_transformers (bus , lines , transformer_designs ):
543+ def create_transformers (
544+ bus , lines , transformer_designs , transformer_number_assumptions = None
545+ ):
543546 """Add transformers between buses within the same substation. The assumed topology
544547 is that the highest-voltage bus in each substation is connected via a tansformer to
545548 every other voltage.
@@ -549,21 +552,37 @@ def create_transformers(bus, lines, transformer_designs):
549552 :param pandas.DataFrame transformer_designs: representative transformer data. Index
550553 is (low_kV, high_kV), columns are 'x', 'r', and 'MVA'. 'x' and 'r' values are
551554 per-unit, 'MVA' is in megawatts.
555+ :param pandas.Series transformer_number_assumptions: assumptions about the number
556+ of transformers between any two buses. The index should be a MultiIndex of
557+ (sub_id, low_kV, high_kV), and values are integer. If None, this parameter will
558+ not be used.
552559 :return: (*pandas.DataFrame*) -- each row is one transformer, columns are
553560 ["from_bus_id", "to_bus_id", "x", "r", and "rateA"].
554561 """
555- bus_pairs = [
556- (b , volt_series .sort_values ().index [i + 1 ])
562+ bus_pair_data = [
563+ {
564+ "sub_id" : sub ,
565+ "from_bus_id" : b ,
566+ "to_bus_id" : volt_series .sort_values ().index [i + 1 ],
567+ "from_kV" : bus .loc [b , "baseKV" ],
568+ "to_kV" : bus .loc [volt_series .sort_values ().index [i + 1 ], "baseKV" ],
569+ }
557570 for sub , volt_series in bus .groupby ("sub_id" )["baseKV" ]
558571 for i , b in enumerate (volt_series .sort_values ().index [:- 1 ])
559572 if len (volt_series ) > 1
560573 ]
561- bus_pairs_df = pd .DataFrame (bus_pairs , columns = [ "from_bus_id" , "to_bus_id" ] )
562- transformer_details = bus_pairs_df .apply (
574+ bus_pairs_df = pd .DataFrame (bus_pair_data )
575+ transformer_details = bus_pairs_df [[ "from_bus_id" , "to_bus_id" ]] .apply (
563576 lambda x : estimate_transformers (x , lines , bus ["baseKV" ], transformer_designs ),
564577 axis = 1 ,
565578 )
566579 single_transformers = pd .concat ([bus_pairs_df , transformer_details ], axis = 1 )
580+ if transformer_number_assumptions is not None :
581+ single_transformers ["number" ].update (
582+ single_transformers [["sub_id" , "from_kV" , "to_kV" ]]
583+ .apply (tuple , axis = 1 )
584+ .map (transformer_number_assumptions )
585+ )
567586 repeated_transformers = single_transformers .drop (columns = "number" ).reindex (
568587 single_transformers .index .repeat (single_transformers ["number" ])
569588 )
@@ -831,6 +850,9 @@ def build_transmission(method="line2sub", **kwargs):
831850 hifld_data_dir = os .path .join (os .path .dirname (__file__ ), ".." , "data" )
832851 hifld_zones = get_zone (os .path .join (hifld_data_dir , "zone.csv" )) # noqa: F841
833852 transformer_designs = get_transformer_parameters (hifld_data_dir )
853+ transformer_number_assumptions = get_transformer_number_overrides (
854+ os .path .join (hifld_data_dir , "transformer_number_assumptions.csv" )
855+ )
834856
835857 # Filter substations based on their `LINES` attribute, check for location dupes
836858 hifld_substations .loc [const .substations_lines_filter_override , "LINES" ] = None
@@ -908,7 +930,9 @@ def build_transmission(method="line2sub", **kwargs):
908930 add_substation_info_to_buses (bus , substations , hifld_zones )
909931
910932 # Add transformers, and calculate rating and impedance for all branches
911- transformers = create_transformers (bus , ac_lines , transformer_designs )
933+ transformers = create_transformers (
934+ bus , ac_lines , transformer_designs , transformer_number_assumptions
935+ )
912936 transformers ["type" ] = "Transformer"
913937 transformers ["interconnect" ] = transformers ["from_bus_id" ].map (bus ["interconnect" ])
914938 first_new_id = ac_lines .index .max () + 1
0 commit comments