| Conditions | 14 | 
| Total Lines | 118 | 
| Code Lines | 67 | 
| Lines | 0 | 
| Ratio | 0 % | 
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Complex classes like data.datasets.calculate_dlr.dlr() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
| 1 | """  | 
            ||
| 54 | def dlr():  | 
            ||
| 55 | """Calculate DLR and assign values to each line in the db  | 
            ||
| 56 | |||
| 57 | Parameters  | 
            ||
| 58 | ----------  | 
            ||
| 59 | *No parameters required  | 
            ||
| 60 | |||
| 61 | """  | 
            ||
| 62 | cfg = config.datasets()["dlr"]  | 
            ||
| 63 | for scn in set(config.settings()["egon-data"]["--scenarios"]):  | 
            ||
| 64 |         weather_year = get_sector_parameters("global", scn)["weather_year"] | 
            ||
| 65 | |||
| 66 | regions_shape_path = (  | 
            ||
| 67 |             Path(".") | 
            ||
| 68 | / "data_bundle_egon_data"  | 
            ||
| 69 | / "regions_dynamic_line_rating"  | 
            ||
| 70 | / "Germany_regions.shp"  | 
            ||
| 71 | )  | 
            ||
| 72 | |||
| 73 | # Calculate hourly DLR per region  | 
            ||
| 74 | dlr_hourly_dic, dlr_hourly = DLR_Regions(  | 
            ||
| 75 | weather_year, regions_shape_path  | 
            ||
| 76 | )  | 
            ||
| 77 | |||
| 78 | regions = gpd.read_file(regions_shape_path)  | 
            ||
| 79 | regions = regions.sort_values(by=["Region"])  | 
            ||
| 80 | |||
| 81 | # Connect to the data base  | 
            ||
| 82 | con = db.engine()  | 
            ||
| 83 | |||
| 84 | sql = f"""  | 
            ||
| 85 | SELECT scn_name, line_id, topo, s_nom FROM  | 
            ||
| 86 |         {cfg['sources']['trans_lines']['schema']}. | 
            ||
| 87 |         {cfg['sources']['trans_lines']['table']} | 
            ||
| 88 | """  | 
            ||
| 89 | df = gpd.GeoDataFrame.from_postgis(  | 
            ||
| 90 | sql, con, crs="EPSG:4326", geom_col="topo"  | 
            ||
| 91 | )  | 
            ||
| 92 | |||
| 93 |         trans_lines_R = {} | 
            ||
| 94 | for i in regions.Region:  | 
            ||
| 95 | shape_area = regions[regions["Region"] == i]  | 
            ||
| 96 | trans_lines_R[i] = gpd.clip(df, shape_area)  | 
            ||
| 97 | trans_lines = df[["s_nom"]]  | 
            ||
| 98 | trans_lines["in_regions"] = [[] for i in range(len(df))]  | 
            ||
| 99 | |||
| 100 | trans_lines[["line_id", "geometry", "scn_name"]] = df[  | 
            ||
| 101 | ["line_id", "topo", "scn_name"]  | 
            ||
| 102 | ]  | 
            ||
| 103 | trans_lines = gpd.GeoDataFrame(trans_lines)  | 
            ||
| 104 | # Assign to each transmission line the region to which it belongs  | 
            ||
| 105 | for i in trans_lines_R:  | 
            ||
| 106 | for j in trans_lines_R[i].index:  | 
            ||
| 107 | trans_lines.loc[j][1] = trans_lines.loc[j][1].append(i)  | 
            ||
| 108 | trans_lines["crossborder"] = ~trans_lines.within(regions.unary_union)  | 
            ||
| 109 | |||
| 110 | DLR = []  | 
            ||
| 111 | |||
| 112 | # Assign to each transmision line the final values of DLR based on location  | 
            ||
| 113 | # and type of line (overhead or underground)  | 
            ||
| 114 | for i in trans_lines.index:  | 
            ||
| 115 | # The concept of DLR does not apply to crossborder lines  | 
            ||
| 116 | if trans_lines.loc[i, "crossborder"] == True:  | 
            ||
| 117 | DLR.append([1] * 8760)  | 
            ||
| 118 | continue  | 
            ||
| 119 | # Underground lines have DLR = 1  | 
            ||
| 120 | if (  | 
            ||
| 121 | trans_lines.loc[i][0] % 280 == 0  | 
            ||
| 122 | or trans_lines.loc[i][0] % 550 == 0  | 
            ||
| 123 | or trans_lines.loc[i][0] % 925 == 0  | 
            ||
| 124 | ):  | 
            ||
| 125 | DLR.append([1] * 8760)  | 
            ||
| 126 | continue  | 
            ||
| 127 | # Lines completely in one of the regions, have the DLR of the region  | 
            ||
| 128 | if len(trans_lines.loc[i][1]) == 1:  | 
            ||
| 129 | region = int(trans_lines.loc[i][1][0])  | 
            ||
| 130 | DLR.append(dlr_hourly_dic["R" + str(region) + "-DLR"])  | 
            ||
| 131 | continue  | 
            ||
| 132 | # For lines crossing 2 or more regions, the lowest DLR between the  | 
            ||
| 133 | # different regions per hour is assigned.  | 
            ||
| 134 | if len(trans_lines.loc[i][1]) > 1:  | 
            ||
| 135 | reg = []  | 
            ||
| 136 | for j in trans_lines.loc[i][1]:  | 
            ||
| 137 |                     reg.append("Reg_" + str(j)) | 
            ||
| 138 | min_DLR_reg = dlr_hourly[reg].min(axis=1)  | 
            ||
| 139 | DLR.append(list(min_DLR_reg))  | 
            ||
| 140 | |||
| 141 | trans_lines["s_max_pu"] = DLR  | 
            ||
| 142 | |||
| 143 | # delete unnecessary columns  | 
            ||
| 144 | trans_lines.drop(  | 
            ||
| 145 | columns=["in_regions", "s_nom", "geometry", "crossborder"],  | 
            ||
| 146 | inplace=True,  | 
            ||
| 147 | )  | 
            ||
| 148 | |||
| 149 | # Modify column "s_max_pu" to fit the requirement of the table  | 
            ||
| 150 | trans_lines["s_max_pu"] = trans_lines.apply(  | 
            ||
| 151 | lambda x: list(x["s_max_pu"]), axis=1  | 
            ||
| 152 | )  | 
            ||
| 153 | trans_lines["temp_id"] = 1  | 
            ||
| 154 | |||
| 155 | # Delete existing data  | 
            ||
| 156 | db.execute_sql(  | 
            ||
| 157 | f"""  | 
            ||
| 158 |             DELETE FROM {cfg['sources']['line_timeseries']['schema']}. | 
            ||
| 159 |             {cfg['sources']['line_timeseries']['table']}; | 
            ||
| 160 | """  | 
            ||
| 161 | )  | 
            ||
| 162 | |||
| 163 | # Insert into database  | 
            ||
| 164 | trans_lines.to_sql(  | 
            ||
| 165 |             f"{cfg['targets']['line_timeseries']['table']}", | 
            ||
| 166 |             schema=f"{cfg['targets']['line_timeseries']['schema']}", | 
            ||
| 167 | con=db.engine(),  | 
            ||
| 168 | if_exists="append",  | 
            ||
| 169 | index=False,  | 
            ||
| 170 | )  | 
            ||
| 171 | return 0  | 
            ||
| 172 | |||
| 360 |