| 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 | |
| |
| |
| """ |
| ) |
|
|