| import streamlit as st | |
| st.markdown( | |
| """ | |
| # LTE Capacity Analysis Documentation | |
| This documentation provides a technical and practical reference for the LTE Capacity Analysis application, detailing input/output columns, processing workflow, and key metrics as implemented in: | |
| - apps/kpi_analysis/lte_capacity.py | |
| - process_kpi/process_lte_capacity.py | |
| - utils/kpi_analysis_utils.py | |
| --- | |
| ## 1. Input Files and Expected Columns | |
| ### a. Dump File (XLSB) | |
| - Contains network configuration and site data. | |
| - Expected columns (see `LTE_DATABASE_COLUMNS` in `process_lte_capacity.py`): | |
| - code: Unique site identifier | |
| - Region: Geographical region of the site | |
| - site_config_band: Configured frequency bands at the site | |
| - final_name: Formatted site name | |
| ### b. Busy Hour (BH) KPI Report (CSV) | |
| - Contains performance metrics for LTE cells during busy hours. | |
| - Key columns (see `KPI_COLUMNS` in `process_lte_capacity.py`): | |
| - date: Timestamp of the measurement | |
| - LNCEL_name: Cell identifier (format: SiteName_LBand_CellID) | |
| - Cell_Avail_excl_BLU: Cell availability percentage excluding BLU | |
| - E_UTRAN_Avg_PRB_usage_per_TTI_DL: Average Physical Resource Block usage in downlink | |
| --- | |
| ## 2. Output Columns and Their Meaning | |
| ### a. LTE Analysis Output (`LTE_ANALYSIS_COLUMNS`): | |
| - **Site Information**: | |
| - code: Site identifier | |
| - Region: Geographical region | |
| - site_config_band: Configured frequency bands | |
| - **Cell Configuration**: | |
| - LNCEL_name_l800: Cell name for 800MHz band | |
| - LNCEL_name_l1800: Cell name for 1800MHz band | |
| - LNCEL_name_l2300: Cell name for 2300MHz band | |
| - LNCEL_name_l2600: Cell name for 2600MHz band | |
| - LNCEL_name_l1800s: Cell name for 1800MHz supplementary band | |
| - **PRB Usage Metrics**: | |
| - avg_prb_usage_bh_l800: Average PRB usage for 800MHz band | |
| - avg_prb_usage_bh_l1800: Average PRB usage for 1800MHz band | |
| - avg_prb_usage_bh_l2300: Average PRB usage for 2300MHz band | |
| - avg_prb_usage_bh_l2600: Average PRB usage for 2600MHz band | |
| - avg_prb_usage_bh_l1800s: Average PRB usage for 1800s band | |
| - **Cell Status**: | |
| - num_congested_cells: Number of cells exceeding PRB usage threshold | |
| - num_cells: Total number of cells at the site | |
| - num_cell_with_kpi: Number of cells with valid KPI data | |
| - num_down_or_no_kpi_cells: Number of down or non-reporting cells | |
| - prb_diff_between_cells: Maximum PRB usage difference between cells at the site | |
| - load_balance_required: Flag indicating if load balancing is needed | |
| - **Analysis Results**: | |
| - congestion_comment: Comments on cell congestion status | |
| - final_comments: Summary of site status and recommendations | |
| --- | |
| ## 3. Processing Workflow | |
| 1. **Data Loading and Validation**: | |
| - Load and validate the dump file and BH report | |
| - Check for required columns and data integrity | |
| 2. **Data Processing**: | |
| - Parse site and cell information from the dump file | |
| - Process KPI data from the BH report | |
| - Calculate average PRB usage per cell and band | |
| 3. **Analysis**: | |
| - Identify congested cells based on PRB usage threshold | |
| - Calculate load balancing requirements | |
| - Determine site-level congestion status | |
| - Generate recommendations for capacity expansion | |
| 4. **Reporting**: | |
| - Combine all analysis results into a comprehensive DataFrame | |
| - Generate final comments and recommendations | |
| - Prepare data for visualization and export | |
| --- | |
| ## 4. Key Functions | |
| ### a. `process_lte_bh_report` (in `process_lte_capacity.py`) | |
| - Main function that orchestrates the LTE capacity analysis | |
| - Parameters: | |
| - dump_path: Path to the site dump file | |
| - bh_report_path: Path to the Busy Hour KPI report | |
| - num_last_days: Number of days to analyze | |
| - num_threshold_days: Number of days for threshold calculations | |
| - availability_threshold: Minimum required cell availability (%) | |
| - prb_usage_threshold: Threshold for PRB usage (%) | |
| - prb_diff_between_cells_threshold: Maximum allowed PRB difference between cells (%) | |
| ### b. `lte_analysis_logic` (in `process_lte_capacity.py`) | |
| - Core logic for analyzing LTE capacity | |
| - Identifies congested cells and calculates load balancing requirements | |
| - Generates comments and recommendations | |
| ### c. analyze_prb_usage (in kpi_analysis_utils.py) | |
| - Analyzes PRB usage patterns | |
| - Identifies cells with high PRB utilization | |
| - Generates comments on congestion status | |
| ### d. cell_availability_analysis (in kpi_analysis_utils.py) | |
| - Analyzes cell availability metrics | |
| - Identifies cells with availability issues | |
| - Generates availability-related comments | |
| --- | |
| ## 5. Configuration Parameters | |
| ### a. Band Mapping (from LteCapacity class): | |
| - Defines the recommended next band for capacity expansion | |
| - Example: L1800 β L800, L800 β L1800, etc. | |
| ### b. Thresholds (configurable via UI/parameters): | |
| - Availability Threshold: Default 95% | |
| - PRB Usage Threshold: Default 80% | |
| - PRB Difference Threshold: Default 20% | |
| - Analysis Period: Default 7 days | |
| - Threshold Days: Default 3 days | |
| --- | |
| ## 6. Example Usage and Output Analysis | |
| ### Basic Usage | |
| ```python | |
| from process_kpi.process_lte_capacity import process_lte_bh_report | |
| import pandas as pd | |
| # Process LTE capacity analysis | |
| results = process_lte_bh_report( | |
| dump_path="network_dump_202305.xlsb", | |
| bh_report_path="lte_bh_report_20230501_20230507.csv", | |
| num_last_days=7, # Analyze last 7 days | |
| num_threshold_days=3, # Consider threshold violations if seen on β₯3 days | |
| availability_threshold=95.0, # Minimum acceptable cell availability (%) | |
| prb_usage_threshold=80.0, # PRB usage threshold for congestion (%) | |
| prb_diff_between_cells_threshold=20.0 # Max allowed PRB difference between cells (%) | |
| ) | |
| # Unpack results | |
| bh_report_df, lte_analysis_df = results | |
| # Example: Display sites with congestion | |
| congested_sites = lte_analysis_df[lte_analysis_df['num_congested_cells'] > 0] | |
| print(f"Found {len(congested_sites)} sites with congestion") | |
| # Example: Export results to Excel | |
| with pd.ExcelWriter('lte_capacity_analysis.xlsx') as writer: | |
| lte_analysis_df.to_excel(writer, sheet_name='LTE_Analysis', index=False) | |
| bh_report_df.to_excel(writer, sheet_name='BH_Report', index=False) | |
| ``` | |
| ### Understanding the Output | |
| - `lte_analysis_df`: Contains per-site analysis with capacity recommendations | |
| - `bh_report_df`: Raw busy hour metrics for detailed investigation | |
| ## 7. Column Reference Table | |
| ### Site Information | |
| | Column | Type | Description | Example | | |
| |--------|------|-------------|---------| | |
| | code | str | Unique site identifier | SITE123 | | |
| | Region | str | Mali Geographical region | CENTRAL | | |
| | site_config_band | str | Configured frequency bands | L1800/L800 | | |
| ### Cell Configuration | |
| | Column | Type | Description | Example | | |
| |--------|------|-------------|---------| | |
| | LNCEL_name_l800 | str | 800MHz cell name | SITE123_L800_1 | | |
| | LNCEL_name_l1800 | str | 1800MHz cell name | SITE123_L1800_1 | | |
| | LNCEL_name_l2300 | str | 2300MHz cell name | SITE123_L2300_1 | | |
| | LNCEL_name_l2600 | str | 2600MHz cell name | SITE123_L2600_1 | | |
| | LNCEL_name_l1800s | str | 1800s cell name | SITE123_L1800S_1 | | |
| ### PRB Usage Metrics | |
| | Column | Type | Description | Range | | |
| |--------|------|-------------|-------| | |
| | avg_prb_usage_bh_l800 | float | Avg PRB usage 800MHz | 0-100% | | |
| | avg_prb_usage_bh_l1800 | float | Avg PRB usage 1800MHz | 0-100% | | |
| | avg_prb_usage_bh_l2300 | float | Avg PRB usage 2300MHz | 0-100% | | |
| | avg_prb_usage_bh_l2600 | float | Avg PRB usage 2600MHz | 0-100% | | |
| | avg_prb_usage_bh_l1800s | float | Avg PRB usage 1800s | 0-100% | | |
| ### Cell Status | |
| | Column | Type | Description | | |
| |--------|------|-------------| | |
| | num_cells | int | Total cells at site | | |
| | num_cell_with_kpi | int | Cells with valid KPI data | | |
| | num_down_or_no_kpi_cells | int | Non-reporting cells | | |
| | num_congested_cells | int | Cells exceeding PRB threshold | | |
| | prb_diff_between_cells | float | Max PRB difference between cells | | |
| | load_balance_required | bool | If load balancing is needed | | |
| ### Analysis Results | |
| | Column | Type | Description | | |
| |--------|------|-------------| | |
| | congestion_comment | str | Analysis of congestion status | | |
| | final_comments | str | Summary and recommendations | | |
| | recommended_action | str | Suggested capacity actions | | |
| | next_band | str | Recommended band for expansion | | |
| """ | |
| ) | |