IMPROVE MRBTS INFOS
Browse files- queries/process_gsm.py +3 -1
- queries/process_lte.py +3 -1
- queries/process_mrbts.py +69 -6
- queries/process_site_db.py +1 -8
- queries/process_wcdma.py +3 -1
- utils/config_band.py +93 -0
- utils/utils_vars.py +7 -0
queries/process_gsm.py
CHANGED
@@ -2,7 +2,7 @@ import pandas as pd
|
|
2 |
|
3 |
from queries.process_mal import process_mal_data, process_mal_with_bts_name
|
4 |
from queries.process_trx import process_trx_data, process_trx_with_bts_name
|
5 |
-
from utils.config_band import config_band
|
6 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
7 |
from utils.kml_creator import generate_kml_from_df
|
8 |
from utils.utils_vars import GsmAnalysisData, UtilsVars, get_physical_db
|
@@ -159,11 +159,13 @@ def process_gsm_data(file_path: str):
|
|
159 |
|
160 |
# create band dataframe
|
161 |
df_band = config_band(df_bts)
|
|
|
162 |
|
163 |
# Merge dataframes
|
164 |
df_bts_bcf = pd.merge(df_bcf, df_bts, on="ID_BCF", how="left")
|
165 |
df_2g = pd.merge(df_bts_bcf, df_trx, on="ID_BTS", how="left")
|
166 |
df_2g = pd.merge(df_2g, df_band, on="code", how="left")
|
|
|
167 |
df_2g = pd.merge(df_2g, df_mal, on="ID_MAL", how="left")
|
168 |
df_2g["TRX_TCH_VS_MAL"] = df_2g.apply(
|
169 |
lambda row: compare_trx_tch_versus_mal(row["TRX_TCH"], row["MAL_TCH"]), axis=1
|
|
|
2 |
|
3 |
from queries.process_mal import process_mal_data, process_mal_with_bts_name
|
4 |
from queries.process_trx import process_trx_data, process_trx_with_bts_name
|
5 |
+
from utils.config_band import bcf_band, config_band
|
6 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
7 |
from utils.kml_creator import generate_kml_from_df
|
8 |
from utils.utils_vars import GsmAnalysisData, UtilsVars, get_physical_db
|
|
|
159 |
|
160 |
# create band dataframe
|
161 |
df_band = config_band(df_bts)
|
162 |
+
df_bcf_band = bcf_band(df_bts)
|
163 |
|
164 |
# Merge dataframes
|
165 |
df_bts_bcf = pd.merge(df_bcf, df_bts, on="ID_BCF", how="left")
|
166 |
df_2g = pd.merge(df_bts_bcf, df_trx, on="ID_BTS", how="left")
|
167 |
df_2g = pd.merge(df_2g, df_band, on="code", how="left")
|
168 |
+
df_2g = pd.merge(df_2g, df_bcf_band, on="ID_BCF", how="left")
|
169 |
df_2g = pd.merge(df_2g, df_mal, on="ID_MAL", how="left")
|
170 |
df_2g["TRX_TCH_VS_MAL"] = df_2g.apply(
|
171 |
lambda row: compare_trx_tch_versus_mal(row["TRX_TCH"], row["MAL_TCH"]), axis=1
|
queries/process_lte.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import numpy as np
|
2 |
import pandas as pd
|
3 |
|
4 |
-
from utils.config_band import config_band
|
5 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
6 |
from utils.kml_creator import generate_kml_from_df
|
7 |
from utils.utils_vars import (
|
@@ -177,6 +177,7 @@ def process_lte_data(file_path: str):
|
|
177 |
|
178 |
# create band dataframe
|
179 |
df_band = config_band(df_lncel)
|
|
|
180 |
|
181 |
# Process LNBTS data
|
182 |
df_lnbts = dfs["LNBTS"]
|
@@ -190,6 +191,7 @@ def process_lte_data(file_path: str):
|
|
190 |
# Merge dataframes
|
191 |
df_lncel_lnbts = pd.merge(df_lncel, df_lnbts, on="ID_LNBTS", how="left")
|
192 |
df_lncel_lnbts = pd.merge(df_lncel_lnbts, df_band, on="code", how="left")
|
|
|
193 |
|
194 |
df_physical_db = get_physical_db()
|
195 |
df_lncel_lnbts = pd.merge(
|
|
|
1 |
import numpy as np
|
2 |
import pandas as pd
|
3 |
|
4 |
+
from utils.config_band import config_band, lte_mrbts_band
|
5 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
6 |
from utils.kml_creator import generate_kml_from_df
|
7 |
from utils.utils_vars import (
|
|
|
177 |
|
178 |
# create band dataframe
|
179 |
df_band = config_band(df_lncel)
|
180 |
+
df_mrbts_band = lte_mrbts_band(df_lncel)
|
181 |
|
182 |
# Process LNBTS data
|
183 |
df_lnbts = dfs["LNBTS"]
|
|
|
191 |
# Merge dataframes
|
192 |
df_lncel_lnbts = pd.merge(df_lncel, df_lnbts, on="ID_LNBTS", how="left")
|
193 |
df_lncel_lnbts = pd.merge(df_lncel_lnbts, df_band, on="code", how="left")
|
194 |
+
df_lncel_lnbts = pd.merge(df_lncel_lnbts, df_mrbts_band, on="MRBTS", how="left")
|
195 |
|
196 |
df_physical_db = get_physical_db()
|
197 |
df_lncel_lnbts = pd.merge(
|
queries/process_mrbts.py
CHANGED
@@ -2,10 +2,12 @@ import pandas as pd
|
|
2 |
|
3 |
from utils.convert_to_excel import convert_dfs
|
4 |
from utils.extract_code import extract_code_from_mrbts
|
5 |
-
from utils.utils_vars import UtilsVars
|
6 |
|
7 |
|
8 |
-
def process_mrbts_data(
|
|
|
|
|
9 |
"""
|
10 |
Process data from the specified file path.
|
11 |
|
@@ -14,11 +16,12 @@ def process_mrbts_data(file_path: str) -> pd.DataFrame:
|
|
14 |
"""
|
15 |
dfs = pd.read_excel(
|
16 |
file_path,
|
17 |
-
sheet_name=["MRBTS"],
|
18 |
engine="calamine",
|
19 |
skiprows=[0],
|
20 |
)
|
21 |
|
|
|
22 |
df_mrbts = dfs["MRBTS"]
|
23 |
df_mrbts.columns = df_mrbts.columns.str.replace(r"[ ]", "", regex=True)
|
24 |
|
@@ -29,9 +32,67 @@ def process_mrbts_data(file_path: str) -> pd.DataFrame:
|
|
29 |
df_mrbts.loc[:, "code"] = df_mrbts["MRBTS"].apply(extract_code_from_mrbts)
|
30 |
df_mrbts = df_mrbts[["MRBTS", "code", "name", "btsName"]]
|
31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
UtilsVars.all_db_dfs.append(df_mrbts)
|
33 |
UtilsVars.all_db_dfs_names.append("MRBTS")
|
34 |
-
return df_mrbts
|
35 |
|
36 |
|
37 |
def process_mrbts_data_to_excel(file_path: str) -> None:
|
@@ -41,5 +102,7 @@ def process_mrbts_data_to_excel(file_path: str) -> None:
|
|
41 |
Args:
|
42 |
file_path (str): The path to the file.
|
43 |
"""
|
44 |
-
mrbts_df = process_mrbts_data(file_path)
|
45 |
-
UtilsVars.final_mrbts_database = convert_dfs(
|
|
|
|
|
|
2 |
|
3 |
from utils.convert_to_excel import convert_dfs
|
4 |
from utils.extract_code import extract_code_from_mrbts
|
5 |
+
from utils.utils_vars import UtilsVars, clean_bands
|
6 |
|
7 |
|
8 |
+
def process_mrbts_data(
|
9 |
+
file_path: str,
|
10 |
+
) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:
|
11 |
"""
|
12 |
Process data from the specified file path.
|
13 |
|
|
|
16 |
"""
|
17 |
dfs = pd.read_excel(
|
18 |
file_path,
|
19 |
+
sheet_name=["MRBTS", "GNBCF", "WNBTS", "ALD"],
|
20 |
engine="calamine",
|
21 |
skiprows=[0],
|
22 |
)
|
23 |
|
24 |
+
# MRBTS
|
25 |
df_mrbts = dfs["MRBTS"]
|
26 |
df_mrbts.columns = df_mrbts.columns.str.replace(r"[ ]", "", regex=True)
|
27 |
|
|
|
32 |
df_mrbts.loc[:, "code"] = df_mrbts["MRBTS"].apply(extract_code_from_mrbts)
|
33 |
df_mrbts = df_mrbts[["MRBTS", "code", "name", "btsName"]]
|
34 |
|
35 |
+
# GNBCF
|
36 |
+
df_gnbcf = dfs["GNBCF"]
|
37 |
+
df_gnbcf.columns = df_gnbcf.columns.str.replace(r"[ ]", "", regex=True)
|
38 |
+
df_gnbcf = df_gnbcf[["MRBTS", "bscId", "bcfId"]]
|
39 |
+
df_gnbcf["ID_BCF"] = (
|
40 |
+
(df_gnbcf[["bscId", "bcfId"]]).astype(str).apply("_".join, axis=1)
|
41 |
+
)
|
42 |
+
|
43 |
+
df_gnbcf = df_gnbcf[["MRBTS", "ID_BCF"]]
|
44 |
+
|
45 |
+
# WNBTS
|
46 |
+
df_wnbts = dfs["WNBTS"]
|
47 |
+
df_wnbts.columns = df_wnbts.columns.str.replace(r"[ ]", "", regex=True)
|
48 |
+
df_wnbts = df_wnbts[["MRBTS", "wbtsId"]]
|
49 |
+
df_wnbts = df_wnbts.rename(columns={"wbtsId": "WBTS"})
|
50 |
+
|
51 |
+
# ALD
|
52 |
+
df_ald = dfs["ALD"]
|
53 |
+
df_ald.columns = df_ald.columns.str.replace(r"[ ]", "", regex=True)
|
54 |
+
df_ald = df_ald[["MRBTS", "productCode"]]
|
55 |
+
df_ald = df_ald.drop_duplicates(subset=["MRBTS"], keep="first")
|
56 |
+
|
57 |
+
df_mrbts = pd.merge(df_mrbts, df_gnbcf, on="MRBTS", how="left")
|
58 |
+
df_mrbts = pd.merge(df_mrbts, df_wnbts, on="MRBTS", how="left")
|
59 |
+
df_mrbts = pd.merge(df_mrbts, df_ald, on="MRBTS", how="left")
|
60 |
+
|
61 |
+
##################################################################################"""
|
62 |
+
###################################################################################
|
63 |
+
|
64 |
+
gsm_df: pd.DataFrame = UtilsVars.all_db_dfs[0]
|
65 |
+
wcdma_df: pd.DataFrame = UtilsVars.all_db_dfs[3]
|
66 |
+
lte_fdd_df: pd.DataFrame = UtilsVars.all_db_dfs[4]
|
67 |
+
lte_tdd_df: pd.DataFrame = UtilsVars.all_db_dfs[5]
|
68 |
+
|
69 |
+
gsm_df = gsm_df[["ID_BCF", "site_name", "number_trx_per_bcf", "bcf_config_band"]]
|
70 |
+
gsm_df = gsm_df.drop_duplicates(subset=["ID_BCF"], keep="first")
|
71 |
+
gsm_df = gsm_df.rename(columns={"site_name": "gsm_name"})
|
72 |
+
|
73 |
+
wcdma_df = wcdma_df[["WBTS", "site_name", "wbts_config_band"]]
|
74 |
+
wcdma_df = wcdma_df.drop_duplicates(subset=["WBTS"], keep="first")
|
75 |
+
wcdma_df = wcdma_df.rename(columns={"site_name": "wcdma_name"})
|
76 |
+
|
77 |
+
lte_fdd_df = lte_fdd_df[["MRBTS", "lnbts_name", "lte_config_band"]]
|
78 |
+
lte_tdd_df = lte_tdd_df[["MRBTS", "lnbts_name", "lte_config_band"]]
|
79 |
+
lte_df = pd.concat([lte_fdd_df, lte_tdd_df], ignore_index=True)
|
80 |
+
lte_df = lte_df.drop_duplicates(subset=["MRBTS"], keep="first")
|
81 |
+
|
82 |
+
df_mrbts = pd.merge(df_mrbts, gsm_df, on="ID_BCF", how="left")
|
83 |
+
df_mrbts = pd.merge(df_mrbts, wcdma_df, on="WBTS", how="left")
|
84 |
+
df_mrbts = pd.merge(df_mrbts, lte_df, on="MRBTS", how="left")
|
85 |
+
|
86 |
+
df_mrbts["mrbts_config_band"] = (
|
87 |
+
df_mrbts[["bcf_config_band", "wbts_config_band", "lte_config_band"]]
|
88 |
+
.astype(str)
|
89 |
+
.apply("/".join, axis=1)
|
90 |
+
)
|
91 |
+
df_mrbts["mrbts_config_band"] = df_mrbts["mrbts_config_band"].apply(clean_bands)
|
92 |
+
|
93 |
UtilsVars.all_db_dfs.append(df_mrbts)
|
94 |
UtilsVars.all_db_dfs_names.append("MRBTS")
|
95 |
+
return df_mrbts, df_gnbcf, df_wnbts
|
96 |
|
97 |
|
98 |
def process_mrbts_data_to_excel(file_path: str) -> None:
|
|
|
102 |
Args:
|
103 |
file_path (str): The path to the file.
|
104 |
"""
|
105 |
+
mrbts_df, gnbcf_df, wnbts_df = process_mrbts_data(file_path)
|
106 |
+
UtilsVars.final_mrbts_database = convert_dfs(
|
107 |
+
[mrbts_df, gnbcf_df, wnbts_df], ["MRBTS", "GNBCF", "WNBTS"]
|
108 |
+
)
|
queries/process_site_db.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
import pandas as pd
|
2 |
|
3 |
-
from utils.utils_vars import SiteAnalysisData, UtilsVars
|
4 |
|
5 |
GSM_COLUMNS = [
|
6 |
"code",
|
@@ -57,13 +57,6 @@ CODE_COLUMNS = [
|
|
57 |
]
|
58 |
|
59 |
|
60 |
-
def clean_bands(bands):
|
61 |
-
if pd.isna(bands):
|
62 |
-
return None
|
63 |
-
parts = [p for p in bands.split("/") if p != "nan"]
|
64 |
-
return "/".join(parts) if parts else None
|
65 |
-
|
66 |
-
|
67 |
def site_db():
|
68 |
gsm_df: pd.DataFrame = UtilsVars.all_db_dfs[0]
|
69 |
wcdma_df: pd.DataFrame = UtilsVars.all_db_dfs[3]
|
|
|
1 |
import pandas as pd
|
2 |
|
3 |
+
from utils.utils_vars import SiteAnalysisData, UtilsVars, clean_bands
|
4 |
|
5 |
GSM_COLUMNS = [
|
6 |
"code",
|
|
|
57 |
]
|
58 |
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
def site_db():
|
61 |
gsm_df: pd.DataFrame = UtilsVars.all_db_dfs[0]
|
62 |
wcdma_df: pd.DataFrame = UtilsVars.all_db_dfs[3]
|
queries/process_wcdma.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
import pandas as pd
|
2 |
|
3 |
-
from utils.config_band import config_band
|
4 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
5 |
from utils.extract_code import extract_code_from_mrbts
|
6 |
from utils.kml_creator import generate_kml_from_df
|
@@ -145,6 +145,7 @@ def process_wcdma_data(file_path: str):
|
|
145 |
|
146 |
# create config_band dataframe
|
147 |
df_band = config_band(df_wcel)
|
|
|
148 |
|
149 |
# Process WBTS data
|
150 |
df_wbts = dfs["WBTS"]
|
@@ -171,6 +172,7 @@ def process_wcdma_data(file_path: str):
|
|
171 |
|
172 |
df_physical_db = get_physical_db()
|
173 |
df_3g = pd.merge(df_3g, df_band, on="code", how="left")
|
|
|
174 |
df_3g = pd.merge(df_3g, df_physical_db, on="Code_Sector", how="left")
|
175 |
# Save dataframes
|
176 |
# save_dataframe(df_wcel, "wcel")
|
|
|
1 |
import pandas as pd
|
2 |
|
3 |
+
from utils.config_band import config_band, wbts_band
|
4 |
from utils.convert_to_excel import convert_dfs, save_dataframe
|
5 |
from utils.extract_code import extract_code_from_mrbts
|
6 |
from utils.kml_creator import generate_kml_from_df
|
|
|
145 |
|
146 |
# create config_band dataframe
|
147 |
df_band = config_band(df_wcel)
|
148 |
+
df_wbts_band = wbts_band(df_wcel)
|
149 |
|
150 |
# Process WBTS data
|
151 |
df_wbts = dfs["WBTS"]
|
|
|
172 |
|
173 |
df_physical_db = get_physical_db()
|
174 |
df_3g = pd.merge(df_3g, df_band, on="code", how="left")
|
175 |
+
df_3g = pd.merge(df_3g, df_wbts_band, on="WBTS", how="left")
|
176 |
df_3g = pd.merge(df_3g, df_physical_db, on="Code_Sector", how="left")
|
177 |
# Save dataframes
|
178 |
# save_dataframe(df_wcel, "wcel")
|
utils/config_band.py
CHANGED
@@ -30,3 +30,96 @@ def config_band(df: pd.DataFrame) -> pd.DataFrame:
|
|
30 |
df_band.rename(columns={"band": "site_config_band"}, inplace=True)
|
31 |
|
32 |
return df_band
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
df_band.rename(columns={"band": "site_config_band"}, inplace=True)
|
31 |
|
32 |
return df_band
|
33 |
+
|
34 |
+
|
35 |
+
def bcf_band(df: pd.DataFrame) -> pd.DataFrame:
|
36 |
+
"""
|
37 |
+
Create a dataframe that contains the bcf configuration band for each bcf ID.
|
38 |
+
|
39 |
+
Parameters
|
40 |
+
----------
|
41 |
+
df : pd.DataFrame
|
42 |
+
The dataframe containing the bcf information, with columns "ID" and "band"
|
43 |
+
|
44 |
+
Returns
|
45 |
+
-------
|
46 |
+
pd.DataFrame
|
47 |
+
The dataframe containing the bcf configuration band for each bcf ID, with columns "ID" and "bcf_config_band"
|
48 |
+
"""
|
49 |
+
df_band = df[["ID_BCF", "band"]].copy()
|
50 |
+
df_band["ID"] = df_band[["ID_BCF", "band"]].astype(str).apply("_".join, axis=1)
|
51 |
+
# remove duplicates ID
|
52 |
+
df_band = df_band.drop_duplicates(subset=["ID"])
|
53 |
+
df_band = df_band[["ID_BCF", "band"]]
|
54 |
+
df_band["band"] = df_band["band"].fillna("empty")
|
55 |
+
df_band = (
|
56 |
+
df_band.groupby("ID_BCF")["band"]
|
57 |
+
.apply(lambda x: "/".join(sorted(x)))
|
58 |
+
.reset_index()
|
59 |
+
)
|
60 |
+
# rename band to config
|
61 |
+
df_band.rename(columns={"band": "bcf_config_band"}, inplace=True)
|
62 |
+
|
63 |
+
return df_band
|
64 |
+
|
65 |
+
|
66 |
+
def wbts_band(df: pd.DataFrame) -> pd.DataFrame:
|
67 |
+
"""
|
68 |
+
Create a dataframe that contains the wbts configuration band for each wbts ID.
|
69 |
+
|
70 |
+
Parameters
|
71 |
+
----------
|
72 |
+
df : pd.DataFrame
|
73 |
+
The dataframe containing the wbts information, with columns "ID" and "band"
|
74 |
+
|
75 |
+
Returns
|
76 |
+
-------
|
77 |
+
pd.DataFrame
|
78 |
+
The dataframe containing the wbts configuration band for each wbts ID, with columns "ID" and "wbts_config_band"
|
79 |
+
"""
|
80 |
+
df_band = df[["WBTS", "band"]].copy()
|
81 |
+
df_band["ID"] = df_band[["WBTS", "band"]].astype(str).apply("_".join, axis=1)
|
82 |
+
# remove duplicates ID
|
83 |
+
df_band = df_band.drop_duplicates(subset=["ID"])
|
84 |
+
df_band = df_band[["WBTS", "band"]]
|
85 |
+
df_band["band"] = df_band["band"].fillna("empty")
|
86 |
+
df_band = (
|
87 |
+
df_band.groupby("WBTS")["band"]
|
88 |
+
.apply(lambda x: "/".join(sorted(x)))
|
89 |
+
.reset_index()
|
90 |
+
)
|
91 |
+
# rename band to config
|
92 |
+
df_band.rename(columns={"band": "wbts_config_band"}, inplace=True)
|
93 |
+
|
94 |
+
return df_band
|
95 |
+
|
96 |
+
|
97 |
+
def lte_mrbts_band(df: pd.DataFrame) -> pd.DataFrame:
|
98 |
+
"""
|
99 |
+
Create a dataframe that contains the mrbts configuration band for each mrbts ID.
|
100 |
+
|
101 |
+
Parameters
|
102 |
+
----------
|
103 |
+
df : pd.DataFrame
|
104 |
+
The dataframe containing the mrbts information, with columns "ID" and "band"
|
105 |
+
|
106 |
+
Returns
|
107 |
+
-------
|
108 |
+
pd.DataFrame
|
109 |
+
The dataframe containing the mrbts configuration band for each mrbts ID, with columns "ID" and "mrbts_config_band"
|
110 |
+
"""
|
111 |
+
df_band = df[["MRBTS", "band"]].copy()
|
112 |
+
df_band["ID"] = df_band[["MRBTS", "band"]].astype(str).apply("_".join, axis=1)
|
113 |
+
# remove duplicates ID
|
114 |
+
df_band = df_band.drop_duplicates(subset=["ID"])
|
115 |
+
df_band = df_band[["MRBTS", "band"]]
|
116 |
+
df_band["band"] = df_band["band"].fillna("empty")
|
117 |
+
df_band = (
|
118 |
+
df_band.groupby("MRBTS")["band"]
|
119 |
+
.apply(lambda x: "/".join(sorted(x)))
|
120 |
+
.reset_index()
|
121 |
+
)
|
122 |
+
# rename band to config
|
123 |
+
df_band.rename(columns={"band": "lte_config_band"}, inplace=True)
|
124 |
+
|
125 |
+
return df_band
|
utils/utils_vars.py
CHANGED
@@ -139,6 +139,13 @@ def get_band(text):
|
|
139 |
return np.nan # or return None
|
140 |
|
141 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
142 |
class GsmAnalysisData:
|
143 |
total_number_of_bsc = 0
|
144 |
total_number_of_cell = 0
|
|
|
139 |
return np.nan # or return None
|
140 |
|
141 |
|
142 |
+
def clean_bands(bands):
|
143 |
+
if pd.isna(bands):
|
144 |
+
return None
|
145 |
+
parts = [p for p in bands.split("/") if p != "nan"]
|
146 |
+
return "/".join(parts) if parts else None
|
147 |
+
|
148 |
+
|
149 |
class GsmAnalysisData:
|
150 |
total_number_of_bsc = 0
|
151 |
total_number_of_cell = 0
|