Gsm capacity improvement with columns naming, alignment and colors
Browse files- apps/kpi_analysis/gsm_capacity.py +16 -3
- documentations/gsm_capacity_docs.py +1 -1
- process_kpi/process_gsm_capacity.py +103 -11
- utils/convert_to_excel.py +52 -10
- utils/kpi_analysis_utils.py +39 -0
apps/kpi_analysis/gsm_capacity.py
CHANGED
|
@@ -112,12 +112,13 @@ if (
|
|
| 112 |
daily_kpi_df: pd.DataFrame = dfs[2]
|
| 113 |
distance_df: pd.DataFrame = dfs[3]
|
| 114 |
GsmCapacity.final_results = convert_gsm_dfs(
|
| 115 |
-
[gsm_analysis_df, bh_kpi_df, daily_kpi_df
|
| 116 |
-
["GSM_Analysis", "
|
| 117 |
)
|
| 118 |
|
| 119 |
# GsmCapacity.final_results = convert_gsm_dfs(
|
| 120 |
-
# [gsm_analysis_df
|
|
|
|
| 121 |
# )
|
| 122 |
|
| 123 |
if GsmCapacity.final_results is not None:
|
|
@@ -142,6 +143,18 @@ if (
|
|
| 142 |
st.plotly_chart(fig, use_container_width=True)
|
| 143 |
st.write(final_comments_df)
|
| 144 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
# Add dataframe and ploty bar chart with "BH Congestion status" distribution in gsm_analysis_df in 2 columns
|
| 146 |
bh_congestion_status_df = (
|
| 147 |
gsm_analysis_df.groupby("BH Congestion status")
|
|
|
|
| 112 |
daily_kpi_df: pd.DataFrame = dfs[2]
|
| 113 |
distance_df: pd.DataFrame = dfs[3]
|
| 114 |
GsmCapacity.final_results = convert_gsm_dfs(
|
| 115 |
+
[gsm_analysis_df, distance_df, bh_kpi_df, daily_kpi_df],
|
| 116 |
+
["GSM_Analysis", "Distance", "BH_KPI_Analysis", "Daily_KPI_Analysis"],
|
| 117 |
)
|
| 118 |
|
| 119 |
# GsmCapacity.final_results = convert_gsm_dfs(
|
| 120 |
+
# [gsm_analysis_df, bh_kpi_df, daily_kpi_df],
|
| 121 |
+
# ["GSM_Analysis", "BH_KPI_Analysis", "Daily_KPI_Analysis"],
|
| 122 |
# )
|
| 123 |
|
| 124 |
if GsmCapacity.final_results is not None:
|
|
|
|
| 143 |
st.plotly_chart(fig, use_container_width=True)
|
| 144 |
st.write(final_comments_df)
|
| 145 |
|
| 146 |
+
# Add dataframe and ploty bar chart with "Final comment summary" distribution in gsm_analysis_df in 2 columns
|
| 147 |
+
final_comments_summary_df = (
|
| 148 |
+
gsm_analysis_df.groupby("Final comment summary")
|
| 149 |
+
.size()
|
| 150 |
+
.reset_index(name="count")
|
| 151 |
+
)
|
| 152 |
+
fig = px.bar(final_comments_summary_df, x="Final comment summary", y="count")
|
| 153 |
+
fig.update_layout(height=1000)
|
| 154 |
+
fig.update_traces(texttemplate="%{value}", textposition="outside")
|
| 155 |
+
st.plotly_chart(fig, use_container_width=True)
|
| 156 |
+
st.write(final_comments_summary_df)
|
| 157 |
+
|
| 158 |
# Add dataframe and ploty bar chart with "BH Congestion status" distribution in gsm_analysis_df in 2 columns
|
| 159 |
bh_congestion_status_df = (
|
| 160 |
gsm_analysis_df.groupby("BH Congestion status")
|
documentations/gsm_capacity_docs.py
CHANGED
|
@@ -144,7 +144,7 @@ results = analyze_gsm_data(
|
|
| 144 |
| Target HR CHs | Calculated target number of Half Rate channels needed. |
|
| 145 |
| Target TCHs | Total target Traffic Channels (FR + HR) required for desired performance. |
|
| 146 |
| Target TRXs | Target number of TRXs required, based on channel requirements and configuration. |
|
| 147 |
-
|
|
| 148 |
| operational_comment | Generated operational comment based on analysis (e.g., upgrade needed, OK, etc.). |
|
| 149 |
| Final comment | Final summary comment combining all relevant flags, operational status, and recommendations. |
|
| 150 |
|
|
|
|
| 144 |
| Target HR CHs | Calculated target number of Half Rate channels needed. |
|
| 145 |
| Target TCHs | Total target Traffic Channels (FR + HR) required for desired performance. |
|
| 146 |
| Target TRXs | Target number of TRXs required, based on channel requirements and configuration. |
|
| 147 |
+
| Number of required TRXs | Final computed number of TRXs required to meet traffic and blocking targets. |
|
| 148 |
| operational_comment | Generated operational comment based on analysis (e.g., upgrade needed, OK, etc.). |
|
| 149 |
| Final comment | Final summary comment combining all relevant flags, operational status, and recommendations. |
|
| 150 |
|
process_kpi/process_gsm_capacity.py
CHANGED
|
@@ -7,6 +7,7 @@ from utils.check_sheet_exist import execute_checks_sheets_exist
|
|
| 7 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
| 8 |
from utils.kpi_analysis_utils import (
|
| 9 |
GsmAnalysis,
|
|
|
|
| 10 |
analyze_sdcch_call_blocking,
|
| 11 |
analyze_tch_abis_fails,
|
| 12 |
analyze_tch_call_blocking,
|
|
@@ -18,11 +19,80 @@ from utils.kpi_analysis_utils import (
|
|
| 18 |
kpi_naming_cleaning,
|
| 19 |
)
|
| 20 |
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
OPERATIONAL_NEIGHBOURS_COLUMNS = [
|
| 28 |
"ID_BTS",
|
|
@@ -461,11 +531,27 @@ def get_operational_neighbours(distance: int) -> pd.DataFrame:
|
|
| 461 |
distances_df = distances_dfs[0]
|
| 462 |
df1 = distances_df[distances_df["Distance_km"] <= distance]
|
| 463 |
|
| 464 |
-
#
|
| 465 |
-
|
| 466 |
-
|
| 467 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 468 |
|
|
|
|
|
|
|
| 469 |
return df1
|
| 470 |
|
| 471 |
|
|
@@ -560,8 +646,8 @@ def analyze_gsm_data(
|
|
| 560 |
gsm_analysis_df["Target TCHs"] / 8
|
| 561 |
) # df["Target TCHs"] / 8
|
| 562 |
|
| 563 |
-
# "
|
| 564 |
-
gsm_analysis_df["
|
| 565 |
gsm_analysis_df["Target TRXs"] - gsm_analysis_df["number_trx_per_cell"]
|
| 566 |
)
|
| 567 |
|
|
@@ -602,6 +688,11 @@ def analyze_gsm_data(
|
|
| 602 |
"operational_comment",
|
| 603 |
new_column="Final comment",
|
| 604 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 605 |
|
| 606 |
GsmCapacity.operational_neighbours_df = gsm_analysis_df[
|
| 607 |
OPERATIONAL_NEIGHBOURS_COLUMNS
|
|
@@ -609,3 +700,4 @@ def analyze_gsm_data(
|
|
| 609 |
distance_df = get_operational_neighbours(operational_neighbours_distance)
|
| 610 |
|
| 611 |
return [gsm_analysis_df, bh_kpi_full_df, daily_kpi_full_df, distance_df]
|
|
|
|
|
|
| 7 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
| 8 |
from utils.kpi_analysis_utils import (
|
| 9 |
GsmAnalysis,
|
| 10 |
+
GsmCapacity,
|
| 11 |
analyze_sdcch_call_blocking,
|
| 12 |
analyze_tch_abis_fails,
|
| 13 |
analyze_tch_call_blocking,
|
|
|
|
| 19 |
kpi_naming_cleaning,
|
| 20 |
)
|
| 21 |
|
| 22 |
+
GSM_ANALYSIS_COLUMNS = [
|
| 23 |
+
"ID_BTS",
|
| 24 |
+
"site_name",
|
| 25 |
+
"name",
|
| 26 |
+
"BSC",
|
| 27 |
+
"BCF",
|
| 28 |
+
"BTS",
|
| 29 |
+
"code",
|
| 30 |
+
"Region",
|
| 31 |
+
"adminState",
|
| 32 |
+
"frequencyBandInUse",
|
| 33 |
+
"cellId",
|
| 34 |
+
"band",
|
| 35 |
+
"site_config_band",
|
| 36 |
+
"trxRfPower",
|
| 37 |
+
"BCCH",
|
| 38 |
+
"Longitude",
|
| 39 |
+
"Latitude",
|
| 40 |
+
"TRX_TCH",
|
| 41 |
+
"MAL_TCH",
|
| 42 |
+
"amrSegLoadDepTchRateLower",
|
| 43 |
+
"amrSegLoadDepTchRateUpper",
|
| 44 |
+
"dedicatedGPRScapacity",
|
| 45 |
+
"defaultGPRScapacity",
|
| 46 |
+
"number_trx_per_cell",
|
| 47 |
+
"number_trx_per_bcf",
|
| 48 |
+
"number_tch_per_cell",
|
| 49 |
+
"number_sd_per_cell",
|
| 50 |
+
"number_bcch_per_cell",
|
| 51 |
+
"number_ccch_per_cell",
|
| 52 |
+
"number_cbc_per_cell",
|
| 53 |
+
"number_total_channels_per_cell",
|
| 54 |
+
"number_signals_per_cell",
|
| 55 |
+
"hf_rate_coef",
|
| 56 |
+
"GPRS",
|
| 57 |
+
"TCH Actual HR%",
|
| 58 |
+
"Offered Traffic BH",
|
| 59 |
+
"Max_Traffic BH",
|
| 60 |
+
"Avg_Traffic BH",
|
| 61 |
+
"TCH UTILIZATION (@Max Traffic)",
|
| 62 |
+
"Tch utilization comments",
|
| 63 |
+
"ErlabngB_value",
|
| 64 |
+
"Target FR CHs",
|
| 65 |
+
"Target HR CHs",
|
| 66 |
+
"Target TCHs",
|
| 67 |
+
"Target TRXs",
|
| 68 |
+
"Number of required TRXs",
|
| 69 |
+
"max_tch_call_blocking_bh",
|
| 70 |
+
"avg_tch_call_blocking_bh",
|
| 71 |
+
"number_of_days_with_tch_blocking_exceeded_bh",
|
| 72 |
+
"tch_call_blocking_bh_comment",
|
| 73 |
+
"max_sdcch_real_blocking_bh",
|
| 74 |
+
"avg_sdcch_real_blocking_bh",
|
| 75 |
+
"number_of_days_with_sdcch_blocking_exceeded_bh",
|
| 76 |
+
"sdcch_real_blocking_bh_comment",
|
| 77 |
+
"Average_cell_availability_bh",
|
| 78 |
+
"number_of_days_exceeding_availability_threshold_bh",
|
| 79 |
+
"availability_comment_bh",
|
| 80 |
+
"max_tch_abis_fail_bh",
|
| 81 |
+
"avg_tch_abis_fail_bh",
|
| 82 |
+
"number_of_days_with_tch_abis_fail_exceeded_bh",
|
| 83 |
+
"tch_abis_fail_bh_comment",
|
| 84 |
+
"Average_cell_availability_daily",
|
| 85 |
+
"number_of_days_exceeding_availability_threshold_daily",
|
| 86 |
+
"availability_comment_daily",
|
| 87 |
+
"max_tch_abis_fail_daily",
|
| 88 |
+
"avg_tch_abis_fail_daily",
|
| 89 |
+
"number_of_days_with_tch_abis_fail_exceeded_daily",
|
| 90 |
+
"tch_abis_fail_daily_comment",
|
| 91 |
+
"BH Congestion status",
|
| 92 |
+
"operational_comment",
|
| 93 |
+
"Final comment",
|
| 94 |
+
"Final comment summary",
|
| 95 |
+
]
|
| 96 |
|
| 97 |
OPERATIONAL_NEIGHBOURS_COLUMNS = [
|
| 98 |
"ID_BTS",
|
|
|
|
| 531 |
distances_df = distances_dfs[0]
|
| 532 |
df1 = distances_df[distances_df["Distance_km"] <= distance]
|
| 533 |
|
| 534 |
+
# Rename all columns in df1
|
| 535 |
+
df1 = df1.rename(
|
| 536 |
+
columns={
|
| 537 |
+
"Dataset1_ID_BTS": "Source_ID_BTS",
|
| 538 |
+
"Dataset1_name": "Source_name",
|
| 539 |
+
"Dataset1_BH Congestion status": "Source_BH Congestion status",
|
| 540 |
+
"Dataset1_Longitude": "Source_Longitude",
|
| 541 |
+
"Dataset1_Latitude": "Source_Latitude",
|
| 542 |
+
"Dataset2_ID_BTS_Dataset2": "Neighbour_ID_BTS",
|
| 543 |
+
"Dataset2_name_Dataset2": "Neighbour_name",
|
| 544 |
+
"Dataset2_operational_comment_Dataset2": "Neighbour_operational_comment",
|
| 545 |
+
"Dataset2_Longitude_Dataset2": "Neighbour_Longitude",
|
| 546 |
+
"Dataset2_Latitude_Dataset2": "Neighbour_Latitude",
|
| 547 |
+
}
|
| 548 |
+
)
|
| 549 |
+
|
| 550 |
+
# Remove rows if Source_name = Neighbour_name
|
| 551 |
+
df1 = df1[df1["Source_name"] != df1["Neighbour_name"]]
|
| 552 |
|
| 553 |
+
# Reset index
|
| 554 |
+
df1 = df1.reset_index(drop=True)
|
| 555 |
return df1
|
| 556 |
|
| 557 |
|
|
|
|
| 646 |
gsm_analysis_df["Target TCHs"] / 8
|
| 647 |
) # df["Target TCHs"] / 8
|
| 648 |
|
| 649 |
+
# "Number of required TRXs" equal to difference between "Target TRXs" and "number_trx_per_cell"
|
| 650 |
+
gsm_analysis_df["Number of required TRXs"] = (
|
| 651 |
gsm_analysis_df["Target TRXs"] - gsm_analysis_df["number_trx_per_cell"]
|
| 652 |
)
|
| 653 |
|
|
|
|
| 688 |
"operational_comment",
|
| 689 |
new_column="Final comment",
|
| 690 |
)
|
| 691 |
+
# Map the final comment using final_comment_mapping
|
| 692 |
+
gsm_analysis_df["Final comment summary"] = gsm_analysis_df["Final comment"].map(
|
| 693 |
+
GsmCapacity.final_comment_mapping
|
| 694 |
+
)
|
| 695 |
+
gsm_analysis_df = gsm_analysis_df[GSM_ANALYSIS_COLUMNS]
|
| 696 |
|
| 697 |
GsmCapacity.operational_neighbours_df = gsm_analysis_df[
|
| 698 |
OPERATIONAL_NEIGHBOURS_COLUMNS
|
|
|
|
| 700 |
distance_df = get_operational_neighbours(operational_neighbours_distance)
|
| 701 |
|
| 702 |
return [gsm_analysis_df, bh_kpi_full_df, daily_kpi_full_df, distance_df]
|
| 703 |
+
# return [gsm_analysis_df, bh_kpi_full_df, daily_kpi_full_df]
|
utils/convert_to_excel.py
CHANGED
|
@@ -30,6 +30,9 @@ def get_formats(workbook):
|
|
| 30 |
"green": workbook.add_format(
|
| 31 |
{"bg_color": "#37CC73", "bold": True, "border": 1}
|
| 32 |
),
|
|
|
|
|
|
|
|
|
|
| 33 |
"blue": workbook.add_format({"bg_color": "#1A64FF", "bold": True, "border": 1}),
|
| 34 |
"blue_light": workbook.add_format(
|
| 35 |
{"bg_color": "#00B0F0", "bold": True, "border": 1}
|
|
@@ -48,6 +51,9 @@ def get_formats(workbook):
|
|
| 48 |
),
|
| 49 |
"gray": workbook.add_format({"bg_color": "#D9D9D9", "bold": True, "border": 1}),
|
| 50 |
"red": workbook.add_format({"bg_color": "#FF0000", "bold": True, "border": 1}),
|
|
|
|
|
|
|
|
|
|
| 51 |
}
|
| 52 |
|
| 53 |
|
|
@@ -59,8 +65,8 @@ def get_format_map_by_format_type(formats: dict, format_type: str) -> dict:
|
|
| 59 |
"amrSegLoadDepTchRateUpper": formats["beurre"],
|
| 60 |
"dedicatedGPRScapacity": formats["beurre"],
|
| 61 |
"defaultGPRScapacity": formats["beurre"],
|
| 62 |
-
"number_trx_per_cell": formats["
|
| 63 |
-
"number_trx_per_bcf": formats["
|
| 64 |
"number_tch_per_cell": formats["blue"],
|
| 65 |
"number_sd_per_cell": formats["blue"],
|
| 66 |
"number_bcch_per_cell": formats["blue"],
|
|
@@ -74,18 +80,54 @@ def get_format_map_by_format_type(formats: dict, format_type: str) -> dict:
|
|
| 74 |
"Offered Traffic BH": formats["green"],
|
| 75 |
"Max_Traffic BH": formats["green"],
|
| 76 |
"Avg_Traffic BH": formats["green"],
|
| 77 |
-
"
|
| 78 |
-
"
|
| 79 |
-
"
|
| 80 |
-
"Max_sdcch_real_blocking BH": formats["green"],
|
| 81 |
-
"Avg_sdcch_real_blocking BH": formats["green"],
|
| 82 |
-
"number_of_days_with_sdcch_blocking_exceeded": formats["green"],
|
| 83 |
-
"TCH UTILIZATION (@Max Traffic)": formats["orange"],
|
| 84 |
"Target FR CHs": formats["purple6"],
|
| 85 |
"Target HR CHs": formats["purple6"],
|
| 86 |
"Target TCHs": formats["purple6"],
|
| 87 |
"Target TRXs": formats["purple6"],
|
| 88 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
}
|
| 90 |
elif format_type == "database":
|
| 91 |
return {
|
|
|
|
| 30 |
"green": workbook.add_format(
|
| 31 |
{"bg_color": "#37CC73", "bold": True, "border": 1}
|
| 32 |
),
|
| 33 |
+
"green_light": workbook.add_format(
|
| 34 |
+
{"bg_color": "#87E0AB", "bold": True, "border": 1}
|
| 35 |
+
),
|
| 36 |
"blue": workbook.add_format({"bg_color": "#1A64FF", "bold": True, "border": 1}),
|
| 37 |
"blue_light": workbook.add_format(
|
| 38 |
{"bg_color": "#00B0F0", "bold": True, "border": 1}
|
|
|
|
| 51 |
),
|
| 52 |
"gray": workbook.add_format({"bg_color": "#D9D9D9", "bold": True, "border": 1}),
|
| 53 |
"red": workbook.add_format({"bg_color": "#FF0000", "bold": True, "border": 1}),
|
| 54 |
+
"yellow": workbook.add_format(
|
| 55 |
+
{"bg_color": "#FFFF00", "bold": True, "border": 1}
|
| 56 |
+
),
|
| 57 |
}
|
| 58 |
|
| 59 |
|
|
|
|
| 65 |
"amrSegLoadDepTchRateUpper": formats["beurre"],
|
| 66 |
"dedicatedGPRScapacity": formats["beurre"],
|
| 67 |
"defaultGPRScapacity": formats["beurre"],
|
| 68 |
+
"number_trx_per_cell": formats["blue"],
|
| 69 |
+
"number_trx_per_bcf": formats["blue"],
|
| 70 |
"number_tch_per_cell": formats["blue"],
|
| 71 |
"number_sd_per_cell": formats["blue"],
|
| 72 |
"number_bcch_per_cell": formats["blue"],
|
|
|
|
| 80 |
"Offered Traffic BH": formats["green"],
|
| 81 |
"Max_Traffic BH": formats["green"],
|
| 82 |
"Avg_Traffic BH": formats["green"],
|
| 83 |
+
"TCH UTILIZATION (@Max Traffic)": formats["red"],
|
| 84 |
+
"Tch utilization comments": formats["orange"],
|
| 85 |
+
"ErlabngB_value": formats["purple6"],
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
"Target FR CHs": formats["purple6"],
|
| 87 |
"Target HR CHs": formats["purple6"],
|
| 88 |
"Target TCHs": formats["purple6"],
|
| 89 |
"Target TRXs": formats["purple6"],
|
| 90 |
+
"Number of required TRXs": formats["purple6"],
|
| 91 |
+
"max_tch_call_blocking_bh": formats["yellow"],
|
| 92 |
+
"avg_tch_call_blocking_bh": formats["yellow"],
|
| 93 |
+
"number_of_days_with_tch_blocking_exceeded_bh": formats["yellow"],
|
| 94 |
+
"tch_call_blocking_bh_comment": formats["orange"],
|
| 95 |
+
"max_sdcch_real_blocking_bh": formats["yellow"],
|
| 96 |
+
"avg_sdcch_real_blocking_bh": formats["yellow"],
|
| 97 |
+
"number_of_days_with_sdcch_blocking_exceeded_bh": formats["yellow"],
|
| 98 |
+
"sdcch_real_blocking_bh_comment": formats["orange"],
|
| 99 |
+
"Average_cell_availability_bh": formats["yellow"],
|
| 100 |
+
"number_of_days_exceeding_availability_threshold_bh": formats["yellow"],
|
| 101 |
+
"availability_comment_bh": formats["orange"],
|
| 102 |
+
"max_tch_abis_fail_bh": formats["yellow"],
|
| 103 |
+
"avg_tch_abis_fail_bh": formats["yellow"],
|
| 104 |
+
"number_of_days_with_tch_abis_fail_exceeded_bh": formats["yellow"],
|
| 105 |
+
"tch_abis_fail_bh_comment": formats["orange"],
|
| 106 |
+
"Average_cell_availability_daily": formats["green_light"],
|
| 107 |
+
"number_of_days_exceeding_availability_threshold_daily": formats[
|
| 108 |
+
"green_light"
|
| 109 |
+
],
|
| 110 |
+
"availability_comment_daily": formats["green_light"],
|
| 111 |
+
"max_tch_abis_fail_daily": formats["green_light"],
|
| 112 |
+
"avg_tch_abis_fail_daily": formats["green_light"],
|
| 113 |
+
"number_of_days_with_tch_abis_fail_exceeded_daily": formats["green_light"],
|
| 114 |
+
"tch_abis_fail_daily_comment": formats["orange"],
|
| 115 |
+
"BH Congestion status": formats["gray"],
|
| 116 |
+
"operational_comment": formats["gray"],
|
| 117 |
+
"Final comment": formats["gray"],
|
| 118 |
+
"Final comment summary": formats["gray"],
|
| 119 |
+
# Operational Neighbours Distance Sheet
|
| 120 |
+
"Source_ID_BTS": formats["blue"],
|
| 121 |
+
"Source_name": formats["blue"],
|
| 122 |
+
"Source_BH Congestion status": formats["blue"],
|
| 123 |
+
"Source_Longitude": formats["blue"],
|
| 124 |
+
"Source_Latitude": formats["blue"],
|
| 125 |
+
"Neighbour_ID_BTS": formats["green_light"],
|
| 126 |
+
"Neighbour_name": formats["green_light"],
|
| 127 |
+
"Neighbour_operational_comment": formats["green_light"],
|
| 128 |
+
"Neighbour_Longitude": formats["green_light"],
|
| 129 |
+
"Neighbour_Latitude": formats["green_light"],
|
| 130 |
+
"Distance_km": formats["beurre"],
|
| 131 |
}
|
| 132 |
elif format_type == "database":
|
| 133 |
return {
|
utils/kpi_analysis_utils.py
CHANGED
|
@@ -217,6 +217,45 @@ class GsmAnalysis:
|
|
| 217 |
}
|
| 218 |
|
| 219 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 220 |
def combine_comments(df: pd.DataFrame, *columns: str, new_column: str) -> pd.DataFrame:
|
| 221 |
"""
|
| 222 |
Combine comments from multiple columns into one column.
|
|
|
|
| 217 |
}
|
| 218 |
|
| 219 |
|
| 220 |
+
class GsmCapacity:
|
| 221 |
+
final_results = None
|
| 222 |
+
operational_neighbours_df = None
|
| 223 |
+
final_comment_mapping = {
|
| 224 |
+
"Availability and TX issues": "Operational issues with no congestion",
|
| 225 |
+
"Availability issues": "Operational issues with no congestion",
|
| 226 |
+
"TX issues": "Operational issues with no congestion",
|
| 227 |
+
"Operational is OK": "Operational is OK with no congestion",
|
| 228 |
+
"Tch utilization exceeded threshold, Availability and TX issues": "High utilization with Operational issues",
|
| 229 |
+
"Tch utilization exceeded threshold, Availability issues": "High utilization with Operational issues",
|
| 230 |
+
"Tch utilization exceeded threshold, TX issues": "High utilization with Operational issues",
|
| 231 |
+
"Tch utilization exceeded threshold, SDCCH blocking exceeded threshold, Operational is OK": "High Utilization with Congestion without Operational issues",
|
| 232 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, Operational is OK": "High Utilization with Congestion without Operational issues",
|
| 233 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, Operational is OK": "High Utilization with Congestion without Operational issues",
|
| 234 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, TX issues": "High Utilization with Congestion without Operational issues",
|
| 235 |
+
"Tch utilization exceeded threshold, SDCCH blocking exceeded threshold, Availability and TX issues": "High utilization with Congestion and operational issues",
|
| 236 |
+
"Tch utilization exceeded threshold, SDCCH blocking exceeded threshold, TX issues": "High utilization with Congestion and operational issues",
|
| 237 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, Availability and TX issues": "High utilization with Congestion and operational issues",
|
| 238 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, Availability issues": "High utilization with Congestion and operational issues",
|
| 239 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, Availability and TX issues": "High utilization with Congestion and operational issues",
|
| 240 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, Availability issues": "High utilization with Congestion and operational issues",
|
| 241 |
+
"Tch utilization exceeded threshold, TCH blocking exceeded threshold, TX issues": "High utilization with Congestion and operational issues",
|
| 242 |
+
"Down Site": "Down Cell",
|
| 243 |
+
"SDCCH blocking exceeded threshold, Operational is OK": "Congestion without Operational issues",
|
| 244 |
+
"TCH blocking exceeded threshold, Operational is OK": "Congestion without Operational issues",
|
| 245 |
+
"TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, Operational is OK": "Congestion without Operational issues",
|
| 246 |
+
"Tch utilization exceeded threshold, Operational is OK": "High utilization without Congestion and Operational issues",
|
| 247 |
+
"SDCCH blocking exceeded threshold, Availability and TX issues": "Congestion with Operational issues",
|
| 248 |
+
"SDCCH blocking exceeded threshold, Availability issues": "Congestion with Operational issues",
|
| 249 |
+
"SDCCH blocking exceeded threshold, TX issues": "Congestion with Operational issues",
|
| 250 |
+
"TCH blocking exceeded threshold, Availability and TX issues": "Congestion with Operational issues",
|
| 251 |
+
"TCH blocking exceeded threshold, Availability issues": "Congestion with Operational issues",
|
| 252 |
+
"TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, Availability and TX issues": "Congestion with Operational issues",
|
| 253 |
+
"TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, Availability issues": "Congestion with Operational issues",
|
| 254 |
+
"TCH blocking exceeded threshold, SDCCH blocking exceeded threshold, TX issues": "Congestion with Operational issues",
|
| 255 |
+
"TCH blocking exceeded threshold, TX issues": "Congestion with Operational issues",
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
|
| 259 |
def combine_comments(df: pd.DataFrame, *columns: str, new_column: str) -> pd.DataFrame:
|
| 260 |
"""
|
| 261 |
Combine comments from multiple columns into one column.
|