Improve databases with fatima request
Browse files- queries/process_lte.py +15 -0
- queries/process_mrbts.py +37 -4
- queries/process_small_bts.py +11 -1
- queries/process_trx.py +34 -2
- queries/process_wcdma.py +13 -0
queries/process_lte.py
CHANGED
|
@@ -198,12 +198,27 @@ def process_lte_data(file_path: str):
|
|
| 198 |
df_lncel_lnbts, df_physical_db, on="Code_Sector", how="left"
|
| 199 |
)
|
| 200 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 201 |
# Process LNCEL_FDD and LNCEL_TDD data
|
| 202 |
df_lncel_fdd = dfs["LNCEL_FDD"]
|
| 203 |
df_lncel_fdd.columns = df_lncel_fdd.columns.str.replace(r"[ ]", "", regex=True)
|
| 204 |
df_lncel_fdd["ID_LNCEL"] = (
|
| 205 |
df_lncel_fdd[["MRBTS", "LNBTS", "LNCEL"]].astype(str).apply("_".join, axis=1)
|
| 206 |
)
|
|
|
|
| 207 |
df_lncel_fdd = df_lncel_fdd[LNCEL_FDD_COLUMNS]
|
| 208 |
|
| 209 |
df_lncel_tdd = dfs["LNCEL_TDD"]
|
|
|
|
| 198 |
df_lncel_lnbts, df_physical_db, on="Code_Sector", how="left"
|
| 199 |
)
|
| 200 |
|
| 201 |
+
# Add Number of cells per band on MRBTS
|
| 202 |
+
df_id_mrbts_band = df_lncel_lnbts[["MRBTS", "band"]]
|
| 203 |
+
df_id_mrbts_band_grouped = (
|
| 204 |
+
df_id_mrbts_band.groupby(["MRBTS", "band"])
|
| 205 |
+
.size()
|
| 206 |
+
.unstack(fill_value=0)
|
| 207 |
+
.rename(columns=lambda x: f"Number of {x} cells on MRBTS")
|
| 208 |
+
.reset_index()
|
| 209 |
+
)
|
| 210 |
+
|
| 211 |
+
df_lncel_lnbts = pd.merge(
|
| 212 |
+
df_lncel_lnbts, df_id_mrbts_band_grouped, on="MRBTS", how="left"
|
| 213 |
+
)
|
| 214 |
+
|
| 215 |
# Process LNCEL_FDD and LNCEL_TDD data
|
| 216 |
df_lncel_fdd = dfs["LNCEL_FDD"]
|
| 217 |
df_lncel_fdd.columns = df_lncel_fdd.columns.str.replace(r"[ ]", "", regex=True)
|
| 218 |
df_lncel_fdd["ID_LNCEL"] = (
|
| 219 |
df_lncel_fdd[["MRBTS", "LNBTS", "LNCEL"]].astype(str).apply("_".join, axis=1)
|
| 220 |
)
|
| 221 |
+
|
| 222 |
df_lncel_fdd = df_lncel_fdd[LNCEL_FDD_COLUMNS]
|
| 223 |
|
| 224 |
df_lncel_tdd = dfs["LNCEL_TDD"]
|
queries/process_mrbts.py
CHANGED
|
@@ -66,16 +66,49 @@ def process_mrbts_data(
|
|
| 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[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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[
|
| 78 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|
|
|
|
| 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[
|
| 70 |
+
[
|
| 71 |
+
"ID_BCF",
|
| 72 |
+
"site_name",
|
| 73 |
+
"number_trx_per_bcf",
|
| 74 |
+
"bcf_config_band",
|
| 75 |
+
"G1800 TRX Per BCF",
|
| 76 |
+
"G900 TRX Per BCF",
|
| 77 |
+
]
|
| 78 |
+
]
|
| 79 |
gsm_df = gsm_df.drop_duplicates(subset=["ID_BCF"], keep="first")
|
| 80 |
gsm_df = gsm_df.rename(columns={"site_name": "gsm_name"})
|
| 81 |
|
| 82 |
+
wcdma_df = wcdma_df[
|
| 83 |
+
[
|
| 84 |
+
"WBTS",
|
| 85 |
+
"site_name",
|
| 86 |
+
"wbts_config_band",
|
| 87 |
+
"Number of U2100 cells on WBTS",
|
| 88 |
+
"Number of U900 cells on WBTS",
|
| 89 |
+
]
|
| 90 |
+
]
|
| 91 |
wcdma_df = wcdma_df.drop_duplicates(subset=["WBTS"], keep="first")
|
| 92 |
wcdma_df = wcdma_df.rename(columns={"site_name": "wcdma_name"})
|
| 93 |
|
| 94 |
+
lte_fdd_df = lte_fdd_df[
|
| 95 |
+
[
|
| 96 |
+
"MRBTS",
|
| 97 |
+
"lnbts_name",
|
| 98 |
+
"lte_config_band",
|
| 99 |
+
"Number of L1800 cells on MRBTS",
|
| 100 |
+
"Number of L2600 cells on MRBTS",
|
| 101 |
+
"Number of L800 cells on MRBTS",
|
| 102 |
+
]
|
| 103 |
+
]
|
| 104 |
+
lte_tdd_df = lte_tdd_df[
|
| 105 |
+
[
|
| 106 |
+
"MRBTS",
|
| 107 |
+
"lnbts_name",
|
| 108 |
+
"lte_config_band",
|
| 109 |
+
"Number of L2300 cells on MRBTS",
|
| 110 |
+
]
|
| 111 |
+
]
|
| 112 |
lte_df = pd.concat([lte_fdd_df, lte_tdd_df], ignore_index=True)
|
| 113 |
lte_df = lte_df.drop_duplicates(subset=["MRBTS"], keep="first")
|
| 114 |
|
queries/process_small_bts.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
| 1 |
import pandas as pd
|
| 2 |
|
|
|
|
|
|
|
| 3 |
|
| 4 |
def process_small_bts_data(file_path: str):
|
| 5 |
dfs = pd.read_excel(
|
|
@@ -15,7 +17,15 @@ def process_small_bts_data(file_path: str):
|
|
| 15 |
pd.to_numeric(df_bts["code"], errors="coerce").fillna(0).astype(int)
|
| 16 |
)
|
| 17 |
df_bts["ID_BTS"] = df_bts[["BSC", "BCF", "BTS"]].astype(str).apply("_".join, axis=1)
|
|
|
|
| 18 |
df_bts["ID_MAL"] = df_bts[["BSC", "BTS"]].astype(str).apply("_".join, axis=1)
|
| 19 |
-
df_bts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
return df_bts
|
|
|
|
| 1 |
import pandas as pd
|
| 2 |
|
| 3 |
+
from utils.utils_vars import UtilsVars
|
| 4 |
+
|
| 5 |
|
| 6 |
def process_small_bts_data(file_path: str):
|
| 7 |
dfs = pd.read_excel(
|
|
|
|
| 17 |
pd.to_numeric(df_bts["code"], errors="coerce").fillna(0).astype(int)
|
| 18 |
)
|
| 19 |
df_bts["ID_BTS"] = df_bts[["BSC", "BCF", "BTS"]].astype(str).apply("_".join, axis=1)
|
| 20 |
+
df_bts["ID_BCF"] = df_bts[["BSC", "BCF"]].astype(str).apply("_".join, axis=1)
|
| 21 |
df_bts["ID_MAL"] = df_bts[["BSC", "BTS"]].astype(str).apply("_".join, axis=1)
|
| 22 |
+
df_bts["SectorId2"] = (
|
| 23 |
+
df_bts["sectorId"].map(UtilsVars.sector_mapping).fillna(df_bts["sectorId"])
|
| 24 |
+
)
|
| 25 |
+
df_bts["band"] = (
|
| 26 |
+
df_bts["frequencyBandInUse"].map(UtilsVars.gsm_band).fillna("not found")
|
| 27 |
+
)
|
| 28 |
+
df_bts = df_bts[["ID_BTS", "ID_MAL", "code", "name", "SectorId2", "band"]]
|
| 29 |
+
# print(df_bts.head())
|
| 30 |
|
| 31 |
return df_bts
|
queries/process_trx.py
CHANGED
|
@@ -12,6 +12,8 @@ TRX_COLUMNS = [
|
|
| 12 |
"number_trx_per_cell",
|
| 13 |
"number_trx_per_bcf",
|
| 14 |
"number_trx_per_site",
|
|
|
|
|
|
|
| 15 |
]
|
| 16 |
|
| 17 |
|
|
@@ -21,11 +23,16 @@ TRX_BTS_COLUMNS = [
|
|
| 21 |
"BTS",
|
| 22 |
"TRX",
|
| 23 |
"ID_BTS",
|
|
|
|
| 24 |
"number_trx_per_cell",
|
| 25 |
"number_trx_per_bcf",
|
| 26 |
"number_trx_per_site",
|
|
|
|
|
|
|
| 27 |
"code",
|
| 28 |
"name",
|
|
|
|
|
|
|
| 29 |
"adminState",
|
| 30 |
"bbUnitSupportsEdge",
|
| 31 |
"channel0Maio",
|
|
@@ -182,10 +189,35 @@ def process_trx_with_bts_name(file_path: str):
|
|
| 182 |
"Signal"
|
| 183 |
].transform("sum")
|
| 184 |
|
| 185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
|
| 187 |
-
#
|
|
|
|
|
|
|
|
|
|
| 188 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
return df_trx_bts_name
|
| 190 |
|
| 191 |
|
|
|
|
| 12 |
"number_trx_per_cell",
|
| 13 |
"number_trx_per_bcf",
|
| 14 |
"number_trx_per_site",
|
| 15 |
+
"G1800 TRX Per BCF",
|
| 16 |
+
"G900 TRX Per BCF",
|
| 17 |
]
|
| 18 |
|
| 19 |
|
|
|
|
| 23 |
"BTS",
|
| 24 |
"TRX",
|
| 25 |
"ID_BTS",
|
| 26 |
+
"ID_BCF",
|
| 27 |
"number_trx_per_cell",
|
| 28 |
"number_trx_per_bcf",
|
| 29 |
"number_trx_per_site",
|
| 30 |
+
"G1800 TRX Per BCF",
|
| 31 |
+
"G900 TRX Per BCF",
|
| 32 |
"code",
|
| 33 |
"name",
|
| 34 |
+
"SectorId2",
|
| 35 |
+
"band",
|
| 36 |
"adminState",
|
| 37 |
"bbUnitSupportsEdge",
|
| 38 |
"channel0Maio",
|
|
|
|
| 189 |
"Signal"
|
| 190 |
].transform("sum")
|
| 191 |
|
| 192 |
+
# Avoir les TRX par bande et par secteur et BCF sous forme concaténée comme 5/3/3
|
| 193 |
+
|
| 194 |
+
trx_band_bcfid = (
|
| 195 |
+
df_trx_bts_name.groupby(["ID_BCF", "band", "SectorId2"])
|
| 196 |
+
.size()
|
| 197 |
+
.reset_index(name="count")
|
| 198 |
+
)
|
| 199 |
+
|
| 200 |
+
# Étape 2 : pivot avec valeurs manquantes = 0
|
| 201 |
+
pivot_df = trx_band_bcfid.pivot_table(
|
| 202 |
+
index=["ID_BCF", "band"], columns="SectorId2", values="count", fill_value=0
|
| 203 |
+
)
|
| 204 |
|
| 205 |
+
# Étape 3 : s’assurer que toutes les colonnes de secteur (1, 2, 3) existent
|
| 206 |
+
for s in [1, 2, 3]:
|
| 207 |
+
if s not in pivot_df.columns:
|
| 208 |
+
pivot_df[s] = 0
|
| 209 |
|
| 210 |
+
# 🟢 Conversion en entier AVANT concaténation
|
| 211 |
+
pivot_df[[1, 2, 3]] = pivot_df[[1, 2, 3]].astype(int)
|
| 212 |
+
|
| 213 |
+
pivot_df["concat"] = pivot_df[[1, 2, 3]].astype(str).agg("/".join, axis=1)
|
| 214 |
+
|
| 215 |
+
final = pivot_df["concat"].unstack().reset_index().rename_axis(None, axis=1)
|
| 216 |
+
final.columns = ["ID_BCF", "G1800 TRX Per BCF", "G900 TRX Per BCF"]
|
| 217 |
+
|
| 218 |
+
df_trx_bts_name = pd.merge(df_trx_bts_name, final, on="ID_BCF", how="left")
|
| 219 |
+
|
| 220 |
+
df_trx_bts_name = df_trx_bts_name[TRX_BTS_COLUMNS]
|
| 221 |
return df_trx_bts_name
|
| 222 |
|
| 223 |
|
queries/process_wcdma.py
CHANGED
|
@@ -161,7 +161,19 @@ def process_wcdma_data(file_path: str):
|
|
| 161 |
df_wncel["code_wcel"] = (
|
| 162 |
df_wncel[["CODE", "WNCEL"]].astype(str).apply("_".join, axis=1)
|
| 163 |
)
|
|
|
|
| 164 |
df_wncel = df_wncel[WNCEL_COLUMNS]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
|
| 166 |
# Merge dataframes
|
| 167 |
df_wcel_bcf = pd.merge(df_wcel, df_wbts, on="ID_WBTS", how="left")
|
|
@@ -169,6 +181,7 @@ def process_wcdma_data(file_path: str):
|
|
| 169 |
df_3g = pd.merge(df_wcel_bcf, df_wncel, on="code_wcel", how="left")
|
| 170 |
|
| 171 |
df_3g = df_3g[WCEL_COLUMNS]
|
|
|
|
| 172 |
|
| 173 |
df_physical_db = get_physical_db()
|
| 174 |
df_3g = pd.merge(df_3g, df_band, on="code", how="left")
|
|
|
|
| 161 |
df_wncel["code_wcel"] = (
|
| 162 |
df_wncel[["CODE", "WNCEL"]].astype(str).apply("_".join, axis=1)
|
| 163 |
)
|
| 164 |
+
|
| 165 |
df_wncel = df_wncel[WNCEL_COLUMNS]
|
| 166 |
+
# Number of cell per Band per WBTS
|
| 167 |
+
|
| 168 |
+
df_id_wbts_band = df_wcel[["ID_WBTS", "band"]]
|
| 169 |
+
df_id_wbts_band_grouped = (
|
| 170 |
+
df_id_wbts_band.groupby(["ID_WBTS", "band"])
|
| 171 |
+
.size()
|
| 172 |
+
.unstack(fill_value=0)
|
| 173 |
+
.rename(columns=lambda x: f"Number of {x} cells on WBTS")
|
| 174 |
+
.reset_index()
|
| 175 |
+
)
|
| 176 |
+
print(df_id_wbts_band_grouped.head())
|
| 177 |
|
| 178 |
# Merge dataframes
|
| 179 |
df_wcel_bcf = pd.merge(df_wcel, df_wbts, on="ID_WBTS", how="left")
|
|
|
|
| 181 |
df_3g = pd.merge(df_wcel_bcf, df_wncel, on="code_wcel", how="left")
|
| 182 |
|
| 183 |
df_3g = df_3g[WCEL_COLUMNS]
|
| 184 |
+
df_3g = pd.merge(df_3g, df_id_wbts_band_grouped, on="ID_WBTS", how="left")
|
| 185 |
|
| 186 |
df_physical_db = get_physical_db()
|
| 187 |
df_3g = pd.merge(df_3g, df_band, on="code", how="left")
|