DavMelchi commited on
Commit
fbf7879
·
1 Parent(s): 6d5dd85

Add Analitic dashboards for each database (Count of NE)

Browse files
README.md CHANGED
@@ -43,6 +43,7 @@ You can access the hosted version of the app at [https://davmelchi-db-query.hf.s
43
  - [x] Add TRX database
44
  - [x] Add MRBTS with code
45
  - [x] Check TCH from MAL sheet
46
- - [ ] Add dashboards for each database (Count of NE)
 
47
  - [ ] Add the ability to select columns
48
  - [ ] Error handling
 
43
  - [x] Add TRX database
44
  - [x] Add MRBTS with code
45
  - [x] Check TCH from MAL sheet
46
+ - [x] Add Analitic dashboards for each database (Count of NE)
47
+ - [ ] Improve Dashboard
48
  - [ ] Add the ability to select columns
49
  - [ ] Error handling
apps/database_page.py CHANGED
@@ -3,7 +3,8 @@ from datetime import datetime
3
 
4
  import streamlit as st
5
 
6
- from queries.process_all_db import process_all_tech_db
 
7
  from queries.process_gsm import process_gsm_data_to_excel
8
  from queries.process_lte import process_lte_data_to_excel
9
 
@@ -13,8 +14,8 @@ from queries.process_neighbors import process_neighbors_data_to_excel
13
 
14
  # from queries.process_trx import process_trx_with_bts_name_data_to_excel
15
  from queries.process_wcdma import process_wcdma_data_to_excel
16
- from utils.check_sheet_exist import Technology, execute_checks_sheets_exist
17
- from utils.utils_vars import UtilsVars
18
 
19
  st.title("Database processing")
20
 
@@ -77,6 +78,17 @@ def execute_process_all_tech_db(uploaded_file):
77
  download_button("All")
78
 
79
 
 
 
 
 
 
 
 
 
 
 
 
80
  col1, col2, col3, col4 = st.columns(4)
81
  col5, col6, col7, col8 = st.columns(4)
82
  if uploaded_file is not None:
@@ -112,6 +124,7 @@ if uploaded_file is not None:
112
  and Technology.mrbts == True
113
  and Technology.mal == True
114
  ):
 
115
  with col1:
116
  st.button(
117
  "Generate All DBs",
@@ -170,3 +183,12 @@ if uploaded_file is not None:
170
  )
171
  except Exception as e:
172
  st.error(f"Error: {e}")
 
 
 
 
 
 
 
 
 
 
3
 
4
  import streamlit as st
5
 
6
+ from apps.dump_analysis import dump_analysis_space
7
+ from queries.process_all_db import process_all_tech_db, process_all_tech_db_with_stats
8
  from queries.process_gsm import process_gsm_data_to_excel
9
  from queries.process_lte import process_lte_data_to_excel
10
 
 
14
 
15
  # from queries.process_trx import process_trx_with_bts_name_data_to_excel
16
  from queries.process_wcdma import process_wcdma_data_to_excel
17
+ from utils.check_sheet_exist import DumpType, Technology, execute_checks_sheets_exist
18
+ from utils.utils_vars import GsmAnalysisData, UtilsVars, WcdmaAnalysisData
19
 
20
  st.title("Database processing")
21
 
 
78
  download_button("All")
79
 
80
 
81
+ def execute_process_all_tech_db_with_stats(uploaded_file):
82
+ if uploaded_file is not None:
83
+ start_time = time.time()
84
+ process_all_tech_db_with_stats(uploaded_file)
85
+ execution_time = time.time() - start_time
86
+ st.write(
87
+ f"All databases are generated. Execution time: {execution_time:.2f} seconds"
88
+ )
89
+ download_button("All")
90
+
91
+
92
  col1, col2, col3, col4 = st.columns(4)
93
  col5, col6, col7, col8 = st.columns(4)
94
  if uploaded_file is not None:
 
124
  and Technology.mrbts == True
125
  and Technology.mal == True
126
  ):
127
+ DumpType.full_dump = True
128
  with col1:
129
  st.button(
130
  "Generate All DBs",
 
183
  )
184
  except Exception as e:
185
  st.error(f"Error: {e}")
186
+
187
+
188
+ ######################## ANALYTICS AND STATS ####################################
189
+
190
+ if uploaded_file is not None:
191
+ if DumpType.full_dump == True:
192
+ if st.button("Generate All DBs and Show Stats"):
193
+ execute_process_all_tech_db_with_stats(uploaded_file)
194
+ dump_analysis_space()
apps/dump_analysis.py ADDED
@@ -0,0 +1,311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ from utils.utils_vars import (
4
+ GsmAnalysisData,
5
+ LteFddAnalysisData,
6
+ LteTddAnalysisData,
7
+ WcdmaAnalysisData,
8
+ )
9
+
10
+ ":red[**L2300 Parameters:**]"
11
+
12
+
13
+ def dump_analysis_space():
14
+
15
+ st.title("ANALYTICS DATA")
16
+
17
+ ####################### GSM ANALYTICS DATA #######################################
18
+ st.subheader(":blue[GSM ANALYTICS DATA]")
19
+
20
+ (
21
+ number_of_bsc_col,
22
+ number_of_cell_col,
23
+ number_of_site_col,
24
+ number_of_empty_bts_name_col,
25
+ number_of_empty_bcf_name_col,
26
+ number_of_cell_with_empty_bcch_col,
27
+ ) = st.columns((1, 1, 1, 1, 1, 1))
28
+
29
+ with number_of_bsc_col:
30
+ st.metric("Number of BSC", GsmAnalysisData.total_number_of_bsc)
31
+ with number_of_cell_col:
32
+ st.metric("Number of Cell", GsmAnalysisData.total_number_of_cell)
33
+ with number_of_site_col:
34
+ st.metric("Number of Site", GsmAnalysisData.number_of_site)
35
+ with number_of_empty_bts_name_col:
36
+ st.metric("Empty BTS name", GsmAnalysisData.number_of_bts_name_empty)
37
+ with number_of_empty_bcf_name_col:
38
+ st.metric("Empty BCF name", GsmAnalysisData.number_of_bcf_name_empty)
39
+ with number_of_cell_with_empty_bcch_col:
40
+ st.metric("Empty BCCH", GsmAnalysisData.number_of_bcch_empty)
41
+
42
+ st.markdown("***")
43
+ st.markdown(":blue[**Number of TRX per BSC**]")
44
+ number_of_trx_per_bsc_data_col, number_of_trx_per_bsc_plot_col = st.columns(2)
45
+ with number_of_trx_per_bsc_data_col:
46
+ st.write(GsmAnalysisData.number_of_trx_per_bsc)
47
+ with number_of_trx_per_bsc_plot_col:
48
+ st.bar_chart(GsmAnalysisData.number_of_trx_per_bsc)
49
+
50
+ st.markdown("***")
51
+ st.markdown(":blue[**Number of Site per BSC**]")
52
+ number_of_site_per_bsc_data_col, number_of_site_per_bsc_plot_col = st.columns(2)
53
+ with number_of_site_per_bsc_data_col:
54
+ st.write(GsmAnalysisData.number_of_site_per_bsc)
55
+ with number_of_site_per_bsc_plot_col:
56
+ st.bar_chart(GsmAnalysisData.number_of_site_per_bsc)
57
+
58
+ st.markdown("***")
59
+ st.markdown(":blue[**Number of Cell per BSC**]")
60
+ number_of_cell_per_bsc_data_col, number_of_cell_per_bsc_plot_col = st.columns(2)
61
+ with number_of_cell_per_bsc_data_col:
62
+ st.write(GsmAnalysisData.number_of_cell_per_bsc)
63
+ with number_of_cell_per_bsc_plot_col:
64
+ st.bar_chart(GsmAnalysisData.number_of_cell_per_bsc)
65
+
66
+ st.markdown("***")
67
+ st.markdown(":blue[**BTS AdminState Distribution**]")
68
+ bts_administate_distribution_data_col, bts_administate_distribution_plot_col = (
69
+ st.columns(2)
70
+ )
71
+ with bts_administate_distribution_data_col:
72
+ st.write(GsmAnalysisData.bts_administate_distribution)
73
+ with bts_administate_distribution_plot_col:
74
+ st.bar_chart(GsmAnalysisData.bts_administate_distribution)
75
+
76
+ st.markdown("***")
77
+ st.markdown(":blue[**Number of Cell per LAC**]")
78
+ number_of_cell_per_lac_data_col, number_of_cell_per_lac_plot_col = st.columns(2)
79
+ with number_of_cell_per_lac_data_col:
80
+ st.write(GsmAnalysisData.number_of_cell_per_lac)
81
+ with number_of_cell_per_lac_plot_col:
82
+ st.bar_chart(GsmAnalysisData.number_of_cell_per_lac)
83
+
84
+ st.markdown("***")
85
+ st.markdown(":blue[**TRX AdminState Distribution**]")
86
+ trx_administate_distribution_data_col, trx_administate_distribution_plot_col = (
87
+ st.columns(2)
88
+ )
89
+ with trx_administate_distribution_data_col:
90
+ st.write(GsmAnalysisData.trx_administate_distribution)
91
+ with trx_administate_distribution_plot_col:
92
+ st.bar_chart(GsmAnalysisData.trx_administate_distribution)
93
+
94
+ ####################### WCDMA ANALYTICS DATA #######################################
95
+ st.subheader(":green[WCDMA ANALYTICS DATA]")
96
+
97
+ (
98
+ number_of_rnc_col,
99
+ number_of_cell_col,
100
+ number_of_site_col,
101
+ empty_wbts_name_col,
102
+ empty_wcel_name_col,
103
+ ) = st.columns(5)
104
+
105
+ with number_of_rnc_col:
106
+ st.metric("Number of RNC", WcdmaAnalysisData.total_number_of_rnc)
107
+ with number_of_cell_col:
108
+ st.metric("Number of Cell", WcdmaAnalysisData.total_number_of_wcel)
109
+ with number_of_site_col:
110
+ st.metric("Number of Site", WcdmaAnalysisData.number_of_site)
111
+ with empty_wbts_name_col:
112
+ st.metric("Empty WBTS name", WcdmaAnalysisData.number_of_empty_wbts_name)
113
+ with empty_wcel_name_col:
114
+ st.metric("Empty WCEL name", WcdmaAnalysisData.number_of_empty_wcel_name)
115
+
116
+ st.markdown("***")
117
+
118
+ st.markdown(":green[**Number of Cell per RNC**]")
119
+ number_of_cell_per_rnc_data_col, number_of_cell_per_rnc_plot_col = st.columns(2)
120
+ with number_of_cell_per_rnc_data_col:
121
+ st.write(WcdmaAnalysisData.number_of_cell_per_rnc)
122
+ with number_of_cell_per_rnc_plot_col:
123
+ st.bar_chart(WcdmaAnalysisData.number_of_cell_per_rnc)
124
+
125
+ st.markdown("***")
126
+
127
+ st.markdown(":green[**Number of Site per RNC**]")
128
+ number_of_site_per_rnc_data_col, number_of_site_per_rnc_plot_col = st.columns(2)
129
+ with number_of_site_per_rnc_data_col:
130
+ st.write(WcdmaAnalysisData.number_of_site_per_rnc)
131
+ with number_of_site_per_rnc_plot_col:
132
+ st.bar_chart(WcdmaAnalysisData.number_of_site_per_rnc)
133
+
134
+ st.markdown("***")
135
+
136
+ st.markdown(":green[**Number of Cell per LAC**]")
137
+ number_of_cell_per_lac_data_col, number_of_cell_per_lac_plot_col = st.columns(2)
138
+ with number_of_cell_per_lac_data_col:
139
+ st.write(WcdmaAnalysisData.number_of_cell_per_lac)
140
+ with number_of_cell_per_lac_plot_col:
141
+ st.bar_chart(WcdmaAnalysisData.number_of_cell_per_lac)
142
+
143
+ st.markdown("***")
144
+ st.markdown(":green[**WCEL AdminState Distribution**]")
145
+ wcel_administate_distribution_data_col, wcel_administate_distribution_plot_col = (
146
+ st.columns(2)
147
+ )
148
+ with wcel_administate_distribution_data_col:
149
+ st.write(WcdmaAnalysisData.wcel_administate_distribution)
150
+ with wcel_administate_distribution_plot_col:
151
+ st.bar_chart(WcdmaAnalysisData.wcel_administate_distribution)
152
+
153
+ ####################### LTE FDD ANALYTICS DATA #######################################
154
+ st.subheader(":red[LTE FDD ANALYTICS DATA]")
155
+
156
+ (
157
+ fdd_total_number_of_lncel_col,
158
+ fdd_total_number_of_site_col,
159
+ fdd_number_of_empty_lncel_name_col,
160
+ fdd_number_of_empty_lncel_cellname_col,
161
+ fdd_number_of_empty_lnbts_name_col,
162
+ ) = st.columns(5)
163
+
164
+ with fdd_total_number_of_lncel_col:
165
+ st.metric("Nbr of Lncel", LteFddAnalysisData.total_number_of_lncel)
166
+ with fdd_total_number_of_site_col:
167
+ st.metric("Nbr of Site", LteFddAnalysisData.total_number_of_site)
168
+ with fdd_number_of_empty_lncel_name_col:
169
+ st.metric("Empty name", LteFddAnalysisData.number_of_empty_lncel_name)
170
+ with fdd_number_of_empty_lncel_cellname_col:
171
+ st.metric("Empty Cellname", LteFddAnalysisData.number_of_empty_lncel_cellname)
172
+ with fdd_number_of_empty_lnbts_name_col:
173
+ st.metric("Empty LNBTS name", LteFddAnalysisData.number_of_empty_lnbts_name)
174
+
175
+ st.markdown("***")
176
+
177
+ st.markdown(":red[**Number of Cell per Band**]")
178
+ fdd_number_of_cell_per_band_data_col, fdd_number_of_cell_per_band_plot_col = (
179
+ st.columns(2)
180
+ )
181
+
182
+ with fdd_number_of_cell_per_band_data_col:
183
+ st.write(LteFddAnalysisData.number_of_cell_per_band)
184
+ with fdd_number_of_cell_per_band_plot_col:
185
+ st.bar_chart(LteFddAnalysisData.number_of_cell_per_band)
186
+
187
+ st.markdown("***")
188
+
189
+ st.markdown(":red[**PhyCellId Distribution**]")
190
+ fdd_phycellid_distribution_data_col, fdd_phycellid_distribution_plot_col = (
191
+ st.columns(2)
192
+ )
193
+ with fdd_phycellid_distribution_data_col:
194
+ st.write(LteFddAnalysisData.phycellid_distribution)
195
+ with fdd_phycellid_distribution_plot_col:
196
+ st.bar_chart(LteFddAnalysisData.phycellid_distribution)
197
+
198
+ st.markdown("***")
199
+
200
+ st.markdown(":red[**Root Sequence Index Distribution**]")
201
+ (
202
+ fdd_rootsequenceindex_distribution_data_col,
203
+ fdd_rootsequenceindex_distribution_plot_col,
204
+ ) = st.columns(2)
205
+ with fdd_rootsequenceindex_distribution_data_col:
206
+ st.write(LteFddAnalysisData.rootsequenceindex_distribution)
207
+ with fdd_rootsequenceindex_distribution_plot_col:
208
+ st.bar_chart(LteFddAnalysisData.rootsequenceindex_distribution)
209
+
210
+ st.markdown("***")
211
+
212
+ st.markdown(":red[**LNCel Administate Distribution**]")
213
+ (
214
+ fdd_lncel_administate_distribution_data_col,
215
+ fdd_lncel_administate_distribution_plot_col,
216
+ ) = st.columns(2)
217
+ with fdd_lncel_administate_distribution_data_col:
218
+ st.write(LteFddAnalysisData.lncel_administate_distribution)
219
+ with fdd_lncel_administate_distribution_plot_col:
220
+ st.bar_chart(LteFddAnalysisData.lncel_administate_distribution)
221
+
222
+ st.markdown("***")
223
+
224
+ st.markdown(":red[**Number of Cell per TAC**]")
225
+ fdd_number_of_cell_per_tac_data_col, fdd_number_of_cell_per_tac_plot_col = (
226
+ st.columns(2)
227
+ )
228
+ with fdd_number_of_cell_per_tac_data_col:
229
+ st.write(LteFddAnalysisData.number_of_cell_per_tac)
230
+ with fdd_number_of_cell_per_tac_plot_col:
231
+ st.bar_chart(LteFddAnalysisData.number_of_cell_per_tac)
232
+
233
+ ####################### LTE TDD ANALYTICS DATA #######################################
234
+ st.subheader(":orange[LTE TDD ANALYTICS DATA]")
235
+
236
+ (
237
+ tdd_total_number_of_lncel_col,
238
+ tdd_total_number_of_site_col,
239
+ tdd_number_of_empty_lncel_name_col,
240
+ tdd_number_of_empty_lncel_cellname_col,
241
+ tdd_number_of_empty_lnbts_name_col,
242
+ ) = st.columns(5)
243
+
244
+ with tdd_total_number_of_lncel_col:
245
+ st.metric("Nbr of Lncel", LteTddAnalysisData.total_number_of_lncel)
246
+ with tdd_total_number_of_site_col:
247
+ st.metric("Nbr of Site", LteTddAnalysisData.total_number_of_site)
248
+ with tdd_number_of_empty_lncel_name_col:
249
+ st.metric("Empty name", LteTddAnalysisData.number_of_empty_lncel_name)
250
+ with tdd_number_of_empty_lncel_cellname_col:
251
+ st.metric("Empty Cellname", LteTddAnalysisData.number_of_empty_lncel_cellname)
252
+ with tdd_number_of_empty_lnbts_name_col:
253
+ st.metric("Empty LNBTS name", LteTddAnalysisData.number_of_empty_lnbts_name)
254
+
255
+ st.markdown("***")
256
+
257
+ st.markdown(":orange[**Number of Cell per Band**]")
258
+ tdd_number_of_cell_per_band_data_col, tdd_number_of_cell_per_band_plot_col = (
259
+ st.columns(2)
260
+ )
261
+
262
+ with tdd_number_of_cell_per_band_data_col:
263
+ st.write(LteTddAnalysisData.number_of_cell_per_band)
264
+ with tdd_number_of_cell_per_band_plot_col:
265
+ st.bar_chart(LteTddAnalysisData.number_of_cell_per_band)
266
+
267
+ st.markdown("***")
268
+
269
+ st.markdown(":orange[**PhyCellId Distribution**]")
270
+ tdd_phycellid_distribution_data_col, tdd_phycellid_distribution_plot_col = (
271
+ st.columns(2)
272
+ )
273
+ with tdd_phycellid_distribution_data_col:
274
+ st.write(LteTddAnalysisData.phycellid_distribution)
275
+ with tdd_phycellid_distribution_plot_col:
276
+ st.bar_chart(LteTddAnalysisData.phycellid_distribution)
277
+
278
+ st.markdown("***")
279
+
280
+ st.markdown(":orange[**Root Sequence Index Distribution**]")
281
+ (
282
+ tdd_rootsequenceindex_distribution_data_col,
283
+ tdd_rootsequenceindex_distribution_plot_col,
284
+ ) = st.columns(2)
285
+ with tdd_rootsequenceindex_distribution_data_col:
286
+ st.write(LteTddAnalysisData.rootsequenceindex_distribution)
287
+ with tdd_rootsequenceindex_distribution_plot_col:
288
+ st.bar_chart(LteTddAnalysisData.rootsequenceindex_distribution)
289
+
290
+ st.markdown("***")
291
+
292
+ st.markdown(":orange[**LNCel Administate Distribution**]")
293
+ (
294
+ tdd_lncel_administate_distribution_data_col,
295
+ tdd_lncel_administate_distribution_plot_col,
296
+ ) = st.columns(2)
297
+ with tdd_lncel_administate_distribution_data_col:
298
+ st.write(LteTddAnalysisData.lncel_administate_distribution)
299
+ with tdd_lncel_administate_distribution_plot_col:
300
+ st.bar_chart(LteTddAnalysisData.lncel_administate_distribution)
301
+
302
+ st.markdown("***")
303
+
304
+ st.markdown(":orange[**Number of Cell per TAC**]")
305
+ tdd_number_of_cell_per_tac_data_col, tdd_number_of_cell_per_tac_plot_col = (
306
+ st.columns(2)
307
+ )
308
+ with tdd_number_of_cell_per_tac_data_col:
309
+ st.write(LteTddAnalysisData.number_of_cell_per_tac)
310
+ with tdd_number_of_cell_per_tac_plot_col:
311
+ st.bar_chart(LteTddAnalysisData.number_of_cell_per_tac)
queries/process_all_db.py CHANGED
@@ -1,18 +1,34 @@
1
- from queries.process_gsm import combined_gsm_database
2
- from queries.process_lte import process_lte_data
3
  from queries.process_mrbts import process_mrbts_data
4
- from queries.process_wcdma import process_wcdma_data
5
  from utils.convert_to_excel import convert_dfs
6
  from utils.utils_vars import UtilsVars
7
 
8
 
9
- def process_all_tech_db(filepath: str):
10
  UtilsVars.all_db_dfs.clear()
11
- combined_gsm_database(filepath) # for gsm,mal,trx
12
  process_wcdma_data(filepath)
13
- process_lte_data(filepath), # for LTE_FDD, LTE_TDD
14
  process_mrbts_data(filepath)
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  UtilsVars.final_all_database = convert_dfs(
17
  UtilsVars.all_db_dfs,
18
  ["GSM", "MAL", "TRX", "WCDMA", "LTE_FDD", "LTE_TDD", "MRBTS"],
 
1
+ from queries.process_gsm import combined_gsm_database, gsm_analaysis
2
+ from queries.process_lte import lte_fdd_analaysis, lte_tdd_analaysis, process_lte_data
3
  from queries.process_mrbts import process_mrbts_data
4
+ from queries.process_wcdma import process_wcdma_data, wcdma_analaysis
5
  from utils.convert_to_excel import convert_dfs
6
  from utils.utils_vars import UtilsVars
7
 
8
 
9
+ def all_dbs(filepath: str):
10
  UtilsVars.all_db_dfs.clear()
11
+ combined_gsm_database(filepath)
12
  process_wcdma_data(filepath)
13
+ process_lte_data(filepath),
14
  process_mrbts_data(filepath)
15
 
16
+
17
+ def process_all_tech_db(filepath: str):
18
+ all_dbs(filepath)
19
+
20
+ UtilsVars.final_all_database = convert_dfs(
21
+ UtilsVars.all_db_dfs,
22
+ ["GSM", "MAL", "TRX", "WCDMA", "LTE_FDD", "LTE_TDD", "MRBTS"],
23
+ )
24
+
25
+
26
+ def process_all_tech_db_with_stats(filepath: str):
27
+ all_dbs(filepath)
28
+ gsm_analaysis(filepath)
29
+ wcdma_analaysis(filepath)
30
+ lte_fdd_analaysis(filepath)
31
+ lte_tdd_analaysis(filepath)
32
  UtilsVars.final_all_database = convert_dfs(
33
  UtilsVars.all_db_dfs,
34
  ["GSM", "MAL", "TRX", "WCDMA", "LTE_FDD", "LTE_TDD", "MRBTS"],
queries/process_gsm.py CHANGED
@@ -4,7 +4,7 @@ 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.utils_vars import UtilsVars
8
 
9
  BTS_COLUMNS = [
10
  "ID_BCF",
@@ -82,7 +82,10 @@ def process_gsm_data(file_path: str):
82
  # Process BTS data
83
  df_bts = dfs["BTS"]
84
  df_bts.columns = df_bts.columns.str.replace(r"[ ]", "", regex=True)
85
- df_bts["code"] = df_bts["name"].str.split("_").str[0].astype(int)
 
 
 
86
  df_bts["Region"] = df_bts["name"].str.split("_").str[1]
87
  df_bts["ID_BTS"] = df_bts[["BSC", "BCF", "BTS"]].astype(str).apply("_".join, axis=1)
88
  df_bts["ID_MAL"] = (
@@ -178,3 +181,31 @@ def process_gsm_data_to_excel(file_path: str):
178
  """
179
  gsm_dfs = combined_gsm_database(file_path)
180
  UtilsVars.final_gsm_database = convert_dfs(gsm_dfs, ["GSM", "MAL", "TRX"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.utils_vars import GsmAnalysisData, UtilsVars
8
 
9
  BTS_COLUMNS = [
10
  "ID_BCF",
 
82
  # Process BTS data
83
  df_bts = dfs["BTS"]
84
  df_bts.columns = df_bts.columns.str.replace(r"[ ]", "", regex=True)
85
+ df_bts["code"] = df_bts["name"].str.split("_").str[0]
86
+ df_bts["code"] = (
87
+ pd.to_numeric(df_bts["code"], errors="coerce").fillna(0).astype(int)
88
+ )
89
  df_bts["Region"] = df_bts["name"].str.split("_").str[1]
90
  df_bts["ID_BTS"] = df_bts[["BSC", "BCF", "BTS"]].astype(str).apply("_".join, axis=1)
91
  df_bts["ID_MAL"] = (
 
181
  """
182
  gsm_dfs = combined_gsm_database(file_path)
183
  UtilsVars.final_gsm_database = convert_dfs(gsm_dfs, ["GSM", "MAL", "TRX"])
184
+
185
+
186
+ #############################GSM ANALYSIS#################################
187
+
188
+
189
+ def gsm_analaysis(file_path: str):
190
+ gsm_df = process_gsm_data(file_path)
191
+ trx_df = process_trx_with_bts_name(file_path)
192
+
193
+ # df to count number of site per bsc
194
+ df_site_per_bsc = gsm_df[["BSC", "code"]]
195
+ df_site_per_bsc = df_site_per_bsc.drop_duplicates(subset=["code"], keep="first")
196
+
197
+ GsmAnalysisData.total_number_of_bsc = len(gsm_df["BSC"].unique())
198
+ GsmAnalysisData.total_number_of_cell = len(gsm_df["ID_BTS"].unique())
199
+ GsmAnalysisData.number_of_site = len(gsm_df["site_name"].unique())
200
+ GsmAnalysisData.number_of_cell_per_bsc = gsm_df["BSC"].value_counts()
201
+ GsmAnalysisData.number_of_site_per_bsc = df_site_per_bsc["BSC"].value_counts()
202
+ GsmAnalysisData.number_of_bts_name_empty = gsm_df["name"].isna().sum()
203
+ GsmAnalysisData.number_of_bcf_name_empty = gsm_df["site_name"].isna().sum()
204
+ GsmAnalysisData.number_of_bcch_empty = gsm_df["BCCH"].isna().sum()
205
+ GsmAnalysisData.bts_administate_distribution = gsm_df["adminState"].value_counts()
206
+ GsmAnalysisData.trx_administate_distribution = trx_df["adminState"].value_counts()
207
+ GsmAnalysisData.number_of_trx_per_bsc = trx_df["BSC"].value_counts()
208
+ # .rename(columns={"index": "BSC2", "BSC": "count2"})
209
+ # )
210
+
211
+ GsmAnalysisData.number_of_cell_per_lac = gsm_df["locationAreaIdLAC"].value_counts()
queries/process_lte.py CHANGED
@@ -3,7 +3,7 @@ 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.utils_vars import UtilsVars, get_band
7
 
8
  LNCEL_COLUMNS = [
9
  "ID_LNBTS",
@@ -215,4 +215,42 @@ def process_lte_data_to_excel(file_path: str):
215
  UtilsVars.final_lte_database = convert_dfs(lte_dfs, ["LTE_FDD", "LTE_TDD"])
216
 
217
 
218
- # process_lte_data(r"data2\20240805_5810_05082024_Dump.xml.gz.xlsb")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  from utils.config_band import config_band
5
  from utils.convert_to_excel import convert_dfs, save_dataframe
6
+ from utils.utils_vars import LteFddAnalysisData, LteTddAnalysisData, UtilsVars, get_band
7
 
8
  LNCEL_COLUMNS = [
9
  "ID_LNBTS",
 
215
  UtilsVars.final_lte_database = convert_dfs(lte_dfs, ["LTE_FDD", "LTE_TDD"])
216
 
217
 
218
+ #############################LTE ANALYSIS#################################
219
+
220
+
221
+ def lte_fdd_analaysis(file_path: str):
222
+ df_fdd = process_lte_data(file_path)[0]
223
+
224
+ LteFddAnalysisData.total_number_of_lncel = len(df_fdd["ID_LNCEL"].unique())
225
+ LteFddAnalysisData.total_number_of_site = len(df_fdd["code"].unique())
226
+ LteFddAnalysisData.number_of_empty_lncel_name = df_fdd["name"].isna().sum()
227
+ LteFddAnalysisData.number_of_empty_lncel_cellname = df_fdd["cellName"].isna().sum()
228
+ LteFddAnalysisData.number_of_empty_lnbts_name = df_fdd["lnbts_name"].isna().sum()
229
+ LteFddAnalysisData.number_of_cell_per_band = df_fdd["band"].value_counts()
230
+ LteFddAnalysisData.phycellid_distribution = df_fdd["phyCellId"].value_counts()
231
+ LteFddAnalysisData.rootsequenceindex_distribution = df_fdd[
232
+ "rootSeqIndex"
233
+ ].value_counts()
234
+ LteFddAnalysisData.lncel_administate_distribution = df_fdd[
235
+ "administrativeState"
236
+ ].value_counts()
237
+ LteFddAnalysisData.number_of_cell_per_tac = df_fdd["tac"].value_counts()
238
+
239
+
240
+ def lte_tdd_analaysis(file_path: str):
241
+ df_tdd = process_lte_data(file_path)[1]
242
+
243
+ LteTddAnalysisData.total_number_of_lncel = len(df_tdd["ID_LNCEL"].unique())
244
+ LteTddAnalysisData.total_number_of_site = len(df_tdd["code"].unique())
245
+ LteTddAnalysisData.number_of_empty_lncel_name = df_tdd["name"].isna().sum()
246
+ LteTddAnalysisData.number_of_empty_lncel_cellname = df_tdd["cellName"].isna().sum()
247
+ LteTddAnalysisData.number_of_empty_lnbts_name = df_tdd["lnbts_name"].isna().sum()
248
+ LteTddAnalysisData.number_of_cell_per_band = df_tdd["band"].value_counts()
249
+ LteTddAnalysisData.phycellid_distribution = df_tdd["phyCellId"].value_counts()
250
+ LteTddAnalysisData.rootsequenceindex_distribution = df_tdd[
251
+ "rootSeqIndex"
252
+ ].value_counts()
253
+ LteTddAnalysisData.lncel_administate_distribution = df_tdd[
254
+ "administrativeState"
255
+ ].value_counts()
256
+ LteTddAnalysisData.number_of_cell_per_tac = df_tdd["tac"].value_counts()
queries/process_small_bts.py CHANGED
@@ -10,7 +10,10 @@ def process_small_bts_data(file_path: str):
10
  )
11
  df_bts = dfs["BTS"]
12
  df_bts.columns = df_bts.columns.str.replace(r"[ ]", "", regex=True)
13
- df_bts["code"] = df_bts["name"].str.split("_").str[0].astype(int)
 
 
 
14
  df_bts["ID_BTS"] = df_bts[["BSC", "BCF", "BTS"]].astype(str).apply("_".join, axis=1)
15
  df_bts["ID_MAL"] = df_bts[["BSC", "BTS"]].astype(str).apply("_".join, axis=1)
16
  df_bts = df_bts[["ID_BTS", "ID_MAL", "code", "name"]]
 
10
  )
11
  df_bts = dfs["BTS"]
12
  df_bts.columns = df_bts.columns.str.replace(r"[ ]", "", regex=True)
13
+ df_bts["code"] = df_bts["name"].str.split("_").str[0]
14
+ df_bts["code"] = (
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 = df_bts[["ID_BTS", "ID_MAL", "code", "name"]]
queries/process_wcdma.py CHANGED
@@ -3,7 +3,7 @@ import pandas as pd
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.utils_vars import UtilsVars
7
 
8
  WCEL_COLUMNS = [
9
  "ID_WBTS",
@@ -84,7 +84,10 @@ def process_wcdma_data(file_path: str):
84
  # Process BTS data
85
  df_wcel = dfs["WCEL"]
86
  df_wcel.columns = df_wcel.columns.str.replace(r"[ ]", "", regex=True)
87
- df_wcel["code"] = df_wcel["name"].str.split("_").str[0].astype(int)
 
 
 
88
  df_wcel["Region"] = df_wcel["name"].str.split("_").str[1]
89
  df_wcel["ID_WCEL"] = (
90
  df_wcel[["RNC", "WBTS", "WCEL"]].astype(str).apply("_".join, axis=1)
@@ -155,3 +158,32 @@ def process_wcdma_data_to_excel(file_path: str):
155
  """
156
  wcdma_dfs = process_wcdma_data(file_path)
157
  UtilsVars.final_wcdma_database = convert_dfs([wcdma_dfs], ["WCDMA"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.utils_vars import UtilsVars, WcdmaAnalysisData
7
 
8
  WCEL_COLUMNS = [
9
  "ID_WBTS",
 
84
  # Process BTS data
85
  df_wcel = dfs["WCEL"]
86
  df_wcel.columns = df_wcel.columns.str.replace(r"[ ]", "", regex=True)
87
+ df_wcel["code"] = df_wcel["name"].str.split("_").str[0]
88
+ df_wcel["code"] = (
89
+ pd.to_numeric(df_wcel["code"], errors="coerce").fillna(0).astype(int)
90
+ )
91
  df_wcel["Region"] = df_wcel["name"].str.split("_").str[1]
92
  df_wcel["ID_WCEL"] = (
93
  df_wcel[["RNC", "WBTS", "WCEL"]].astype(str).apply("_".join, axis=1)
 
158
  """
159
  wcdma_dfs = process_wcdma_data(file_path)
160
  UtilsVars.final_wcdma_database = convert_dfs([wcdma_dfs], ["WCDMA"])
161
+
162
+
163
+ ############################ANALYTICSS AND STATISTICS############################
164
+
165
+
166
+ def wcdma_analaysis(filepath: str):
167
+ """
168
+ Process WCDMA data from the specified file path and convert it to Excel format
169
+
170
+ Args:
171
+ filepath (str): The path to the file.
172
+ """
173
+ wcdma_df = process_wcdma_data(filepath)
174
+
175
+ # df to count number of site per rnc
176
+ df_site_per_rnc = wcdma_df[["RNC", "code"]]
177
+ df_site_per_rnc = df_site_per_rnc.drop_duplicates(subset=["code"], keep="first")
178
+
179
+ WcdmaAnalysisData.total_number_of_rnc = wcdma_df["RNC"].nunique()
180
+ WcdmaAnalysisData.total_number_of_wcel = wcdma_df["ID_WCEL"].nunique()
181
+ WcdmaAnalysisData.number_of_site = len(wcdma_df["site_name"].unique())
182
+ WcdmaAnalysisData.number_of_site_per_rnc = df_site_per_rnc["RNC"].value_counts()
183
+ WcdmaAnalysisData.number_of_cell_per_rnc = wcdma_df["RNC"].value_counts()
184
+ WcdmaAnalysisData.number_of_empty_wbts_name = wcdma_df["site_name"].isnull().sum()
185
+ WcdmaAnalysisData.number_of_empty_wcel_name = wcdma_df["name"].isnull().sum()
186
+ WcdmaAnalysisData.wcel_administate_distribution = wcdma_df[
187
+ "AdminCellState"
188
+ ].value_counts()
189
+ WcdmaAnalysisData.number_of_cell_per_lac = wcdma_df["LAC"].value_counts()
utils/check_sheet_exist.py CHANGED
@@ -1,6 +1,10 @@
1
  import pandas as pd
2
 
3
 
 
 
 
 
4
  class Technology:
5
  gsm = False
6
  wcdma = False
 
1
  import pandas as pd
2
 
3
 
4
+ class DumpType:
5
+ full_dump = False
6
+
7
+
8
  class Technology:
9
  gsm = False
10
  wcdma = False
utils/utils_vars.py CHANGED
@@ -76,3 +76,59 @@ def get_band(text):
76
  elif "L800" in text:
77
  return "L800"
78
  return np.nan # or return None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  elif "L800" in text:
77
  return "L800"
78
  return np.nan # or return None
79
+
80
+
81
+ ##############################STATISTICS############################
82
+
83
+
84
+ class GsmAnalysisData:
85
+ total_number_of_bsc = 0
86
+ total_number_of_cell = 0
87
+ number_of_site = 0
88
+ number_of_cell_per_bsc = pd.DataFrame()
89
+ number_of_site_per_bsc = pd.DataFrame()
90
+ number_of_bts_name_empty = 0
91
+ number_of_bcf_name_empty = 0
92
+ number_of_bcch_empty = 0
93
+ bts_administate_distribution = pd.DataFrame()
94
+ trx_administate_distribution = pd.DataFrame()
95
+ number_of_trx_per_bsc = pd.DataFrame()
96
+ number_of_cell_per_lac = pd.DataFrame()
97
+
98
+
99
+ class WcdmaAnalysisData:
100
+ total_number_of_rnc = 0
101
+ total_number_of_wcel = 0
102
+ number_of_site = 0
103
+ number_of_site_per_rnc = 0
104
+ number_of_cell_per_rnc = pd.DataFrame()
105
+ number_of_empty_wbts_name = 0
106
+ number_of_empty_wcel_name = 0
107
+ wcel_administate_distribution = pd.DataFrame()
108
+ number_of_cell_per_lac = pd.DataFrame()
109
+
110
+
111
+ class LteFddAnalysisData:
112
+ total_number_of_lncel = 0
113
+ total_number_of_site = 0
114
+ number_of_empty_lncel_name = 0
115
+ number_of_empty_lncel_cellname = 0
116
+ number_of_empty_lnbts_name = 0
117
+ number_of_cell_per_band = pd.DataFrame()
118
+ phycellid_distribution = pd.DataFrame()
119
+ rootsequenceindex_distribution = pd.DataFrame()
120
+ lncel_administate_distribution = pd.DataFrame()
121
+ number_of_cell_per_tac = pd.DataFrame()
122
+
123
+
124
+ class LteTddAnalysisData:
125
+ total_number_of_lncel = 0
126
+ total_number_of_site = 0
127
+ number_of_empty_lncel_name = 0
128
+ number_of_empty_lncel_cellname = 0
129
+ number_of_empty_lnbts_name = 0
130
+ number_of_cell_per_band = pd.DataFrame()
131
+ phycellid_distribution = pd.DataFrame()
132
+ rootsequenceindex_distribution = pd.DataFrame()
133
+ lncel_administate_distribution = pd.DataFrame()
134
+ number_of_cell_per_tac = pd.DataFrame()