网优数据分析处理

import os
import pandas as pd
from PySide2 import QtCore, QtGui
from PySide2.QtCore import QEventLoop, QTimer, QObject, QThreadPool
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication, QFileDialog, QMessageBox
import sys
import time


# The EmittingStr class is used to redirect stdout to the QTextBrowser widget in the UI
class EmittingStr(QtCore.QObject):
    textWritten = QtCore.Signal(str)

    def write(self, text):
        self.textWritten.emit(str(text))
        loop = QEventLoop()
        QTimer.singleShot(100, loop.quit)
        loop.exec_()
        QApplication.processEvents()

    def flush(self):
        pass


# The Stats class contains the main functionality of the application
class Stats(QObject):
    def __init__(self):
        super(Stats, self).__init__()
        self.ui = None
        sys.stdout = EmittingStr()
        sys.stdout.textWritten.connect(self.outputWritten)
        self.threadpool = QThreadPool()

    def initialize_ui(self):
        self.ui = QUiLoader().load('ToBtarget-Tool-v2 .ui')
        self.ui.setWindowTitle('TOB网管指标处理工具-v2.0')
        self.ui.dzShuRu_Edit.setPlaceholderText('请输入要查询的CGI,多个CGI请用逗号隔开')
        self.ui.toolButton.clicked.connect(self.Choice_dir_input_1)
        self.ui.toolButton_2.clicked.connect(self.Choice_dir_output)
        self.ui.pushButton.clicked.connect(self.tob_cl)
        self.ui.pushButton_2.clicked.connect(self.tob_hz)
        self.ui.dz_15minBtn.clicked.connect(self.query_dz_15min)
        self.ui.clearBtn.clicked.connect(self.clearText)
        self.ui.QUITButton.clicked.connect(self.quit_app)

    def outputWritten(self, text):
        cursor = self.ui.textBrowser.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.ui.textBrowser.setTextCursor(cursor)
        self.ui.textBrowser.ensureCursorVisible()

    def Choice_dir_output(self):
        # Function to choose the output directory
        dir_path = QFileDialog.getExistingDirectory(self.ui, "请选择文件夹路径", "D:\\")
        self.ui.choice_2_Edit.setText(dir_path)

    def Choice_dir_input_1(self):
        # Function to choose the input directory
        dir_path = QFileDialog.getExistingDirectory(self.ui, "请选择文件夹路径", "D:\\")
        self.ui.choice_1_Edit.setText(dir_path)

    def clearText(self):
        # Function to clear the text in the QTextBrowser widget
        self.ui.textBrowser.clear()
        self.ui.choice_1_Edit.clear()
        self.ui.choice_2_Edit.clear()

    def quit_app(self):
        # Function to quit the application
        QtCore.QCoreApplication.quit()

    def process_data(self, data):
        # Data processing logic goes here
        # Process time formats, convert columns to proper data types, etc.
        data['NRCell.Ns'] = data['NRCell.Ns'].str.replace(',', '=')  # 将本列中的,替换成= 便于按=号分列本列数据
        # data.head()
        data_split = pd.DataFrame((x.split('=') for x in data['NRCell.Ns']),
                                  index=data.index,
                                  columns=['gNodeB名称1', 'gNodeB名称',
                                           'NR小区标识1', 'NR小区标识',
                                           '运营商标识1', '运营商标识',
                                           '切片业务类型1', '切片业务类型',
                                           '切片区分标识1', '切片区分标识',
                                           '移动国家码1', '移动国家码',
                                           '移动网络码1', '移动网络码'])  # 按=号进行分列,并且对分列出来的数据赋予列名
        # data_split.head()
        data = pd.merge(data, data_split, right_index=True, left_index=True)  # 将分列出来的列合并到原表中
        # data.head()
        data.drop(
            ['NRCell.Ns', 'gNodeB名称1', 'gNodeB名称', 'NR小区标识1', '运营商标识1', '运营商标识', '切片业务类型1', '切片区分标识1', '移动国家码1',
             '移动国家码',
             '移动网络码1', '移动网络码'], axis=1, inplace=True)  # 删除合并表(df1_merge)中不需要的列
        # ...
        data['切片业务类型'] = data['切片业务类型'].astype(str)
        data['切片区分标识'] = data['切片区分标识'].astype(str)
        data['NR小区标识'] = data['NR小区标识'].astype(str)
        data['切片ID'] = data['切片业务类型'] + '-' + data['切片区分标识']
        data['基站ID'] = data['网元名称'].str[1:9]
        data['基站ID'] = data['基站ID'].astype(str)
        data['基站+切片'] = data['基站ID'] + "-" + data['切片ID']

        # Additional data processing steps
        # ...
        data['切片业务类型'] = data['切片业务类型'].str.replace('128', 'TOB')  # (需先转换128,再转换1)
        data['切片业务类型'] = data['切片业务类型'].str.replace('1', 'TOC')  # 将数据表切片类型列中1转 换成TOC
        # result_merge
        data['NR小区名称'] = data['网元名称'] + '-' + data['NR小区标识']
        data['CGI'] = '460-00-' + data['基站ID'] + '-' + data['NR小区标识']
        numeric_columns = ['特定网络切片的PDU会话建立尝试次数 (无)', '特定网络切片的PDU会话建立成功次数 (无)',
                           '小区内网络切片QoS Flow建立尝试次数 (无)', '小区内网络切片QoS Flow建立成功次数 (无)',
                           '紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)',
                           'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)']

        # Convert selected columns to numeric with non-convertible values replaced by 0
        data[numeric_columns] = data[numeric_columns].apply(pd.to_numeric, errors='coerce', downcast='integer').fillna(
            0).astype(int)

        data['PDU会话建立失败次数'] = data['特定网络切片的PDU会话建立尝试次数 (无)'] - data[
            '特定网络切片的PDU会话建立成功次数 (无)']
        data['PDU会话建立成功率'] = data['特定网络切片的PDU会话建立成功次数 (无)'] / data['特定网络切片的PDU会话建立尝试次数 (无)']
        data['PDU会话建立成功率'] = data['PDU会话建立成功率'].apply(
            lambda x: format(x, '.2%'))  # 将计算列中需要输出百分比的数据转化为百分比
        try:
            data['QoS Flow建立失败次数'] = data['小区内网络切片QoS Flow建立尝试次数 (无)'] - data[
                '紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)'] - data['EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] - \
                                     data['小区内网络切片QoS Flow建立成功次数 (无)']
            data['QoS Flow建立成功率'] = (data['紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)'] + data[
                'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] + data['小区内网络切片QoS Flow建立成功次数 (无)']) / \
                                    data['小区内网络切片QoS Flow建立尝试次数 (无)']
            data['QoS Flow建立成功率'] = data['QoS Flow建立成功率'].apply(lambda x: format(x, '.2%'))
        except:
            data['QoS Flow建立失败次数'] = data['小区内网络切片QoS Flow建立尝试次数 (无)'] - data[
                'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] - data['小区内网络切片QoS Flow建立成功次数 (无)']
            data['QoS Flow建立成功率'] = (data['EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] +
                                     data['小区内网络切片QoS Flow建立成功次数 (无)']) / data[
                                        '小区内网络切片QoS Flow建立尝试次数 (无)']
            data['QoS Flow建立成功率'] = data['QoS Flow建立成功率'].apply(lambda x: format(x, '.2%'))
        data['QoS Flow掉线率'] = data['小区内网络切片QoS Flow异常释放次数 (无)'] / (
                data['小区内网络切片QoS Flow异常释放次数 (无)'] + data['小区内网络切片QoS Flow正常释放次数 (无)'])
        data['QoS Flow掉线率'] = data['QoS Flow掉线率'].apply(lambda x: format(x, '.2%'))
        try:
            data = data.replace('nan%', '#DIV/0!')
        except Exception as e:
            print('错误类型3是', e.__class__.__name__)
            print('错误明细3是', e)
        # data.head()
        try:
            data = data[['开始时间',
                         '基站+切片',
                         '切片业务类型',
                         '切片ID', 'CGI',
                         'NR小区名称',
                         '网元名称',
                         '周期(分钟)',
                         '特定网络切片的PDU会话建立尝试次数 (无)',
                         '特定网络切片的PDU会话建立成功次数 (无)',
                         'PDU会话建立失败次数', 'PDU会话建立成功率',
                         '特定网络切片因核心网侧语法错误导致PDU会话建立失败次数 (无)',
                         '特定网络切片因流程冲突导致PDU会话建立失败次数 (无)',
                         '小区内网络切片QoS Flow建立尝试次数 (无)',
                         '小区内网络切片QoS Flow建立成功次数 (无)',
                         '紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)',
                         'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)',
                         'QoS Flow建立失败次数',
                         'QoS Flow建立成功率',
                         '小区内网络切片因传输网络层原因导致QoS Flow建立失败次数 (无)',
                         '小区内网络切片因核心网侧语法错误导致QoS Flow建立失败次数 (无)',
                         '小区内网络切片因流程冲突导致QoS Flow建立失败次数 (无)',
                         '小区内网络切片QoS Flow异常释放次数 (无)',
                         '小区内网络切片QoS Flow正常释放次数 (无)',
                         'QoS Flow掉线率',
                         '小区内网络切片传输网络层原因导致QoS Flow异常释放的次数 (无)',
                         'EPS fallback触发的AMF发起网络切片QoS Flow修改尝试次数 (无)',
                         'AMF发起网络切片QoS Flow修改尝试次数 (无)',
                         'AMF发起网络切片QoS Flow修改成功次数 (无)',
                         '小区内网络切片初始QoS Flow建立尝试次数 (无)',
                         '小区内网络切片初始QoS Flow建立成功次数 (无)',
                         '小区内网络切片切换出QoS Flow释放次数 (无)',
                         '小区内AMF发起的网络切片的QoS Flow异常释放次数 (无)',
                         '小区内AMF发起的网络切片的QoS Flow正常释放次数 (无)',
                         '小区内网络切片平均QoS Flow个数 (无)',
                         '小区内网络切片最大QoS Flow个数 (无)']]
        except:
            data = data[['开始时间',
                         '基站+切片',
                         '切片业务类型',
                         '切片ID', 'CGI',
                         'NR小区名称',
                         '网元名称',
                         '周期(分钟)',
                         '特定网络切片的PDU会话建立尝试次数 (无)',
                         '特定网络切片的PDU会话建立成功次数 (无)',
                         'PDU会话建立失败次数', 'PDU会话建立成功率',
                         '特定网络切片因核心网侧语法错误导致PDU会话建立失败次数 (无)',
                         '特定网络切片因流程冲突导致PDU会话建立失败次数 (无)',
                         '小区内网络切片QoS Flow建立尝试次数 (无)',
                         '小区内网络切片QoS Flow建立成功次数 (无)',
                         'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)',
                         'QoS Flow建立失败次数',
                         'QoS Flow建立成功率',
                         '小区内网络切片因传输网络层原因导致QoS Flow建立失败次数 (无)',
                         '小区内网络切片因核心网侧语法错误导致QoS Flow建立失败次数 (无)',
                         '小区内网络切片因流程冲突导致QoS Flow建立失败次数 (无)',
                         '小区内网络切片QoS Flow异常释放次数 (无)',
                         '小区内网络切片QoS Flow正常释放次数 (无)',
                         'QoS Flow掉线率',
                         '小区内网络切片传输网络层原因导致QoS Flow异常释放的次数 (无)',
                         'EPS fallback触发的AMF发起网络切片QoS Flow修改尝试次数 (无)',
                         'AMF发起网络切片QoS Flow修改尝试次数 (无)',
                         'AMF发起网络切片QoS Flow修改成功次数 (无)',
                         '小区内网络切片初始QoS Flow建立尝试次数 (无)',
                         '小区内网络切片初始QoS Flow建立成功次数 (无)',
                         '小区内AMF发起的网络切片的QoS Flow异常释放次数 (无)',
                         '小区内AMF发起的网络切片的QoS Flow正常释放次数 (无)',
                         '小区内网络切片平均QoS Flow个数 (无)',
                         '小区内网络切片最大QoS Flow个数 (无)']]
        return data

    def query_dz_15min(self):
        try:
            starttime = time.time()
            network_elements_input = self.ui.dzShuRu_Edit.text()
            network_elements = network_elements_input.split(',')  # Sp
            df = pd.read_csv(f"{self.ui.choice_2_Edit.text()}" + '/tob网管指标(15min粒度).csv', encoding='gbk',low_memory=False)

            for network_element in network_elements:
                df_hb = df[df['CGI'] == network_element.strip()]  # Extract data for the current CGI

                df_hb.to_csv(f'{self.ui.choice_2_Edit.text()}/tob网管指标(15min粒度)-{network_element}.csv', encoding='gbk',
                             index=False)
                print('-' * 94)
                print(f"..处理完成。。。。。生成的文件在....{self.ui.choice_2_Edit.text()}文件夹内(tob网管指标(15min粒度)-{network_element}.csv)")
                print('-' * 94)
            endtime = time.time()
            cost_time = endtime - starttime
            print('累计运行时间: {}秒'.format(float('%.2f' % cost_time)))
            print('-' * 94)
            QMessageBox.about(self.ui,
                              '处理完成',
                              f"结果在{self.ui.choice_2_Edit.text()}文件夹内")
        except Exception as e:
            print('错误类型是', e.__class__.__name__)
            print('错误明细是', e)

    def tob_cl(self):
        try:
            starttime = time.time()
            os.chdir(self.ui.choice_1_Edit.text())  # Set the chosen input directory

            data_chunks = []
            for root, dirs, files in os.walk('.'):
                print('-' * 94)
                print('开始读取原始指标数据......')
                # Read each CSV file in chunks and process it
                for i in files:
                    chunk_size = 10000  # Set a suitable chunk size based on your available memory
                    for chunk in pd.read_csv('./' + i, chunksize=chunk_size, skiprows=7, encoding='gbk'):
                        data_chunks.append(chunk)

            # Concatenate all data chunks into a single DataFrame
            data = pd.concat(data_chunks, ignore_index=True)

            # Process the concatenated data
            data = self.process_data(data)

            data.to_csv(f"{self.ui.choice_2_Edit.text()}/tob网管指标(15min粒度).csv", encoding='gbk', index=False)

            print('-' * 94)
            print(f"..处理完成。。。。。生成的文件在....{self.ui.choice_2_Edit.text()}文件夹内(tob网管指标(15min粒度).csv)")
            print('-' * 94)
            endtime = time.time()
            cost_time = endtime - starttime
            print('累计运行时间: {}秒'.format(float('%.2f' % cost_time)))
            print('-' * 94)
            QMessageBox.about(self.ui,
                              '处理完成',
                              f"结果在{self.ui.choice_2_Edit.text()}文件夹内\n《tob网管指标(15min粒度).csv》")
        except Exception as e:
            print('错误类型2是', e.__class__.__name__)
            print('错误明细2是', e)

    def tob_hz(self):
        try:
            starttime = time.time()
            # 从文件夹内提取文件名称
            os.chdir(self.ui.choice_1_Edit.text())  # 选择文件夹
            # 从文件夹内提取文件名称
            for root, dirs, files in os.walk('.'):
                # files1
                print('-' * 94)
                print('开始读取原始指标数据......')
            # 循环读取文件夹下CSV文件并将他们保存在名为data的DataFrame中
            data = pd.DataFrame()
            for i in files:
                datai = pd.read_csv('./' + i, skiprows=7, encoding='gbk')  # 跳过CSV文件前7行
                datai_len = len(datai)
                data = pd.concat([data, datai], axis=0)
                print('文件%i列,读取%i行数据,名称:%s' % (len(datai.columns), datai_len, i))
            # data.head()
            print('数据读取完成')
            print('-' * 94)
            print('数据处理中.....请稍等....')
            # 处理时间格式
            data['开始时间'] = pd.to_datetime(data['开始时间'])
            data['开始时间'] = data['开始时间'].dt.strftime('%Y-%m-%d')
            data['开始时间'] = data['开始时间'].astype(str)
            # data.head()
            #  处理数据表中的
            try:
                data = data.replace('NIL', float(0))  # 将数据表中的所有NIL替换成浮点型数据0
                data = data.replace('nan', float(0))
            except Exception as e:
                print('错误类型1是', e.__class__.__name__)
                print('错误明细1是', e)
            data['小区内网络切片QoS Flow建立尝试次数 (无)'] = data['小区内网络切片QoS Flow建立尝试次数 (无)'].astype(
                float)  # 把数据列中的值当作浮点型数据,便于透视或分组求和
            data['小区内网络切片QoS Flow建立成功次数 (无)'] = data['小区内网络切片QoS Flow建立成功次数 (无)'].astype(float)
            data['AMF发起网络切片QoS Flow修改尝试次数 (无)'] = data['AMF发起网络切片QoS Flow修改尝试次数 (无)'].astype(float)
            data['AMF发起网络切片QoS Flow修改成功次数 (无)'] = data['AMF发起网络切片QoS Flow修改成功次数 (无)'].astype(float)
            data['小区内网络切片初始QoS Flow建立尝试次数 (无)'] = data['小区内网络切片初始QoS Flow建立尝试次数 (无)'].astype(float)
            data['小区内网络切片初始QoS Flow建立成功次数 (无)'] = data['小区内网络切片初始QoS Flow建立成功次数 (无)'].astype(float)
            data['小区内网络切片平均QoS Flow个数 (无)'] = data['小区内网络切片平均QoS Flow个数 (无)'].astype(float)
            data['小区内网络切片最大QoS Flow个数 (无)'] = data['小区内网络切片最大QoS Flow个数 (无)'].astype(float)
            data['EPS fallback触发的AMF发起网络切片QoS Flow修改尝试次数 (无)'] = data[
                'EPS fallback触发的AMF发起网络切片QoS Flow修改尝试次数 (无)'].astype(float)
            data['EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] = data['EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'].astype(
                float)
            try:
                data['紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)'] = data['紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)'].astype(float)
                data['小区内网络切片切换出QoS Flow释放次数 (无)'] = data['小区内网络切片切换出QoS Flow释放次数 (无)'].astype(float)
            except Exception as e:
                print('错误类型2是', e.__class__.__name__)
                print('错误明细2是', e)
            data['小区内AMF发起的网络切片的QoS Flow异常释放次数 (无)'] = data['小区内AMF发起的网络切片的QoS Flow异常释放次数 (无)'].astype(float)
            data['小区内AMF发起的网络切片的QoS Flow正常释放次数 (无)'] = data['小区内AMF发起的网络切片的QoS Flow正常释放次数 (无)'].astype(float)
            data['小区内网络切片QoS Flow异常释放次数 (无)'] = data['小区内网络切片QoS Flow异常释放次数 (无)'].astype(float)
            data['小区内网络切片QoS Flow正常释放次数 (无)'] = data['小区内网络切片QoS Flow正常释放次数 (无)'].astype(float)
            data['小区内网络切片传输网络层原因导致QoS Flow异常释放的次数 (无)'] = data['小区内网络切片传输网络层原因导致QoS Flow异常释放的次数 (无)'].astype(float)
            data['小区内网络切片因传输网络层原因导致QoS Flow建立失败次数 (无)'] = data['小区内网络切片因传输网络层原因导致QoS Flow建立失败次数 (无)'].astype(float)
            data['小区内网络切片因核心网侧语法错误导致QoS Flow建立失败次数 (无)'] = data['小区内网络切片因核心网侧语法错误导致QoS Flow建立失败次数 (无)'].astype(float)
            data['小区内网络切片因流程冲突导致QoS Flow建立失败次数 (无)'] = data['小区内网络切片因流程冲突导致QoS Flow建立失败次数 (无)'].astype(float)
            data['特定网络切片的PDU会话建立尝试次数 (无)'] = data['特定网络切片的PDU会话建立尝试次数 (无)'].astype(float)
            data['特定网络切片的PDU会话建立成功次数 (无)'] = data['特定网络切片的PDU会话建立成功次数 (无)'].astype(float)
            data['特定网络切片因核心网侧语法错误导致PDU会话建立失败次数 (无)'] = data['特定网络切片因核心网侧语法错误导致PDU会话建立失败次数 (无)'].astype(float)
            data['特定网络切片因流程冲突导致PDU会话建立失败次数 (无)'] = data['特定网络切片因流程冲突导致PDU会话建立失败次数 (无)'].astype(float)
            # data.head()
            # 对data数据表进行分组求和(15min转化为天),并赋值给result
            result = data.groupby(['开始时间', '网元名称', 'NRCell.Ns']).sum().reset_index()
            # result
            # 数据列NRCell.Ns分列出小区标识、切片类型、切片标识等,便于后面分组统计
            result['NRCell.Ns'] = result['NRCell.Ns'].str.replace(',', '=')  # 将本列中的,替换成= 便于按=号分列本列数据
            # result1.head()
            result_split = pd.DataFrame((x.split('=') for x in result['NRCell.Ns']),
                                        index=result.index,
                                        columns=['gNodeB名称1', 'gNodeB名称',
                                                 'NR小区标识1', 'NR小区标识',
                                                 '运营商标识1', '运营商标识',
                                                 '切片业务类型1', '切片业务类型',
                                                 '切片区分标识1', '切片区分标识',
                                                 '移动国家码1', '移动国家码',
                                                 '移动网络码1', '移动网络码'])  # 按=号进行分列,并且对分列出来的数据赋予列名
            # result_split.head()
            result_merge = pd.merge(result, result_split, right_index=True, left_index=True)  # 将分列出来的列合并到原表中
            # result_merge.head()
            result_merge.drop(
                ['NRCell.Ns', 'gNodeB名称1', 'gNodeB名称', 'NR小区标识1', '运营商标识1', '运营商标识', '切片业务类型1', '切片区分标识1', '移动国家码1',
                 '移动国家码',
                 '移动网络码1', '移动网络码'], axis=1, inplace=True)  # 删除合并表(df1_merge)中不需要的列
            result_merge['切片ID'] = result_merge['切片业务类型'] + '-' + result_merge['切片区分标识']
            result_merge['基站ID'] = result_merge['网元名称'].str[1:9]
            result_merge['基站ID'] = result_merge['基站ID'].astype(str)
            result_merge['基站+切片'] = result_merge['基站ID'] + "-" + result_merge['切片ID']
            # result_merge.head()
            result_merge['切片业务类型'] = result_merge['切片业务类型'].str.replace('128', 'TOB')  # (需先转换128,再转换1)
            result_merge['切片业务类型'] = result_merge['切片业务类型'].str.replace('1', 'TOC')  # 将数据表切片类型列中1转 换成TOC
            # result_merge
            result_merge['NR小区名称'] = result_merge['网元名称'] + '-' + result_merge['NR小区标识']
            result_merge['CGI'] = '460-00-' + result_merge['基站ID'] + '-' + result_merge['NR小区标识']
            result_merge['PDU会话建立失败次数'] = result_merge['特定网络切片的PDU会话建立尝试次数 (无)'] - result_merge[
                '特定网络切片的PDU会话建立成功次数 (无)']
            result_merge['PDU会话建立成功率'] = result_merge['特定网络切片的PDU会话建立成功次数 (无)'] / result_merge['特定网络切片的PDU会话建立尝试次数 (无)']
            result_merge['PDU会话建立成功率'] = result_merge['PDU会话建立成功率'].apply(
                lambda x: format(x, '.2%'))  # 将计算列中需要输出百分比的数据转化为百分比
            try:
                result_merge['QoS Flow建立失败次数'] = result_merge['小区内网络切片QoS Flow建立尝试次数 (无)'] - result_merge[
                    '紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)'] - result_merge['EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] - \
                                                 result_merge['小区内网络切片QoS Flow建立成功次数 (无)']
                result_merge['QoS Flow建立成功率'] = (result_merge['紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)'] + result_merge[
                    'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] + result_merge['小区内网络切片QoS Flow建立成功次数 (无)']) / \
                                                result_merge['小区内网络切片QoS Flow建立尝试次数 (无)']
                result_merge['QoS Flow建立成功率'] = result_merge['QoS Flow建立成功率'].apply(lambda x: format(x, '.2%'))
            except:
                result_merge['QoS Flow建立失败次数'] = result_merge['小区内网络切片QoS Flow建立尝试次数 (无)'] - result_merge[
                    'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] - result_merge['小区内网络切片QoS Flow建立成功次数 (无)']
                result_merge['QoS Flow建立成功率'] = (result_merge['EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)'] +
                                                 result_merge['小区内网络切片QoS Flow建立成功次数 (无)']) / result_merge[
                                                    '小区内网络切片QoS Flow建立尝试次数 (无)']
                result_merge['QoS Flow建立成功率'] = result_merge['QoS Flow建立成功率'].apply(lambda x: format(x, '.2%'))
            result_merge['QoS Flow掉线率'] = result_merge['小区内网络切片QoS Flow异常释放次数 (无)'] / (
                    result_merge['小区内网络切片QoS Flow异常释放次数 (无)'] + result_merge['小区内网络切片QoS Flow正常释放次数 (无)'])
            result_merge['QoS Flow掉线率'] = result_merge['QoS Flow掉线率'].apply(lambda x: format(x, '.2%'))
            try:
                result_merge = result_merge.replace('nan%', '#DIV/0!')
            except Exception as e:
                print('错误类型3是', e.__class__.__name__)
                print('错误明细3是', e)
            # result_merge.head()
            try:
                result_merge = result_merge[['开始时间',
                                             '基站+切片',
                                             '切片业务类型',
                                             '切片ID', 'CGI',
                                             'NR小区名称',
                                             '网元名称',
                                             '周期(分钟)',
                                             '特定网络切片的PDU会话建立尝试次数 (无)',
                                             '特定网络切片的PDU会话建立成功次数 (无)',
                                             'PDU会话建立失败次数', 'PDU会话建立成功率',
                                             '特定网络切片因核心网侧语法错误导致PDU会话建立失败次数 (无)',
                                             '特定网络切片因流程冲突导致PDU会话建立失败次数 (无)',
                                             '小区内网络切片QoS Flow建立尝试次数 (无)',
                                             '小区内网络切片QoS Flow建立成功次数 (无)',
                                             '紧急呼叫回落触发的小区内网络切片Qos Flow建立尝试次数 (无)',
                                             'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)',
                                             'QoS Flow建立失败次数',
                                             'QoS Flow建立成功率',
                                             '小区内网络切片因传输网络层原因导致QoS Flow建立失败次数 (无)',
                                             '小区内网络切片因核心网侧语法错误导致QoS Flow建立失败次数 (无)',
                                             '小区内网络切片因流程冲突导致QoS Flow建立失败次数 (无)',
                                             '小区内网络切片QoS Flow异常释放次数 (无)',
                                             '小区内网络切片QoS Flow正常释放次数 (无)',
                                             'QoS Flow掉线率',
                                             '小区内网络切片传输网络层原因导致QoS Flow异常释放的次数 (无)',
                                             'EPS fallback触发的AMF发起网络切片QoS Flow修改尝试次数 (无)',
                                             'AMF发起网络切片QoS Flow修改尝试次数 (无)',
                                             'AMF发起网络切片QoS Flow修改成功次数 (无)',
                                             '小区内网络切片初始QoS Flow建立尝试次数 (无)',
                                             '小区内网络切片初始QoS Flow建立成功次数 (无)',
                                             '小区内网络切片切换出QoS Flow释放次数 (无)',
                                             '小区内AMF发起的网络切片的QoS Flow异常释放次数 (无)',
                                             '小区内AMF发起的网络切片的QoS Flow正常释放次数 (无)',
                                             '小区内网络切片平均QoS Flow个数 (无)',
                                             '小区内网络切片最大QoS Flow个数 (无)']]
            except:
                result_merge = result_merge[['开始时间',
                                             '基站+切片',
                                             '切片业务类型',
                                             '切片ID', 'CGI',
                                             'NR小区名称',
                                             '网元名称',
                                             '周期(分钟)',
                                             '特定网络切片的PDU会话建立尝试次数 (无)',
                                             '特定网络切片的PDU会话建立成功次数 (无)',
                                             'PDU会话建立失败次数', 'PDU会话建立成功率',
                                             '特定网络切片因核心网侧语法错误导致PDU会话建立失败次数 (无)',
                                             '特定网络切片因流程冲突导致PDU会话建立失败次数 (无)',
                                             '小区内网络切片QoS Flow建立尝试次数 (无)',
                                             '小区内网络切片QoS Flow建立成功次数 (无)',
                                             'EPS fallback触发的小区内网络切片QoS Flow建立尝试次数 (无)',
                                             'QoS Flow建立失败次数',
                                             'QoS Flow建立成功率',
                                             '小区内网络切片因传输网络层原因导致QoS Flow建立失败次数 (无)',
                                             '小区内网络切片因核心网侧语法错误导致QoS Flow建立失败次数 (无)',
                                             '小区内网络切片因流程冲突导致QoS Flow建立失败次数 (无)',
                                             '小区内网络切片QoS Flow异常释放次数 (无)',
                                             '小区内网络切片QoS Flow正常释放次数 (无)',
                                             'QoS Flow掉线率',
                                             '小区内网络切片传输网络层原因导致QoS Flow异常释放的次数 (无)',
                                             'EPS fallback触发的AMF发起网络切片QoS Flow修改尝试次数 (无)',
                                             'AMF发起网络切片QoS Flow修改尝试次数 (无)',
                                             'AMF发起网络切片QoS Flow修改成功次数 (无)',
                                             '小区内网络切片初始QoS Flow建立尝试次数 (无)',
                                             '小区内网络切片初始QoS Flow建立成功次数 (无)',
                                             '小区内AMF发起的网络切片的QoS Flow异常释放次数 (无)',
                                             '小区内AMF发起的网络切片的QoS Flow正常释放次数 (无)',
                                             '小区内网络切片平均QoS Flow个数 (无)',
                                             '小区内网络切片最大QoS Flow个数 (无)']]
            # result_merge
            result_merge.to_csv(f"{self.ui.choice_2_Edit.text()}" + '/tob网管指标(天级).csv', encoding='gbk', index=False)
            print('-' * 94)
            print(f"..处理完成。。。。。生成的文件在....{self.ui.choice_2_Edit.text()}文件夹内(tob网管指标(天级).csv)")
            print('-' * 94)
            endtime = time.time()
            cost_time = endtime - starttime
            print('累计运行时间: {}秒'.format(float('%.2f' % cost_time)))
            print('-' * 94)
            QMessageBox.about(self.ui,
                              '处理完成',
                              f"结果在{self.ui.choice_2_Edit.text()}文件夹内\n《tob网管指标(天级).csv》")
        except Exception as e:
            print('错误类型2是', e.__class__.__name__)
            print('错误明细2是', e)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    stats = Stats()
    stats.initialize_ui()
    stats.ui.show()
    sys.exit(app.exec_())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5G接通率化 5G无线接通率排查提升思路 将参数“PDCCH公共空间EPRE相对于小区RE参考功率的偏移”增大,可以提升接通率,但负面影响是减少了PDCCH可用资源,当5G用户较多的时候,可能会导致资源不足。该参数管截图及路径如下: 第二个参数是“MSG3相对于PRACH的功率偏移”,可以针对MSG4没有携带“PO-PUSCH-Alphaset”,会导致概率性基站收不到UE建立完成消息,主要还是提升UE的发射功率,进而提升RRC连接建立成功率和QoS Flow建立成功率。 HW对该参数的命令是:LST NRDUCELLULPCCONFIG 协议对该参数的定义如下:(取值为-1到6,现是4,实际值是取值的2倍,也就是8).该参数设置的越小,Msg3的发射功率越低,Msg3被基站成功接收的概率越小,对邻区的干扰越小;该参数设置的越大,Msg3的发射功率越高,Msg3被基站成功接收的概率越大,对邻区的干扰越大。 (一)RRC连接建立成功率 中兴RRC建立失败目前分为三类,定时器超时、接纳失败和其他原因。 定时器超时这里不做过多分析,因为定时器参数设置都是集团管控,全统一设置,可化空间不大。 接纳失败的原因主要有参数设置异常、负荷过高等。 其他原因一般是5G基站内部处理异常,比如CPU利用率过高。 总体原因可以归纳如下: 1. 基站故障,处理告警; 2. 接入参数异常、最小接入电频等; 3. 有干扰; 4. 用户数过多,导致SR容量不足; 5. 弱场接入。这里有本身弱覆盖、邻区不完善导致切换不及时,包括缺少到4G的邻区,特别是到FDD900的邻区。 6. 基站CPU负荷过高。 (二)QoS Flow建立成功率 QoS Flow属于用户面流程,建立失败的原因有:参数错误、切换失败、无线原因和其他原因。 参数错误涉及的流程:Initial Context Setup Request、PDU session response setup request、PDU session response modify response,可能造成消息携带的QoS Flow Setup Request List中QoS Flow异常释放。 切换流程异常会导致PDU Session Resource Setup Response、PDU Session Resource Modify Resource造成QoS Flow Setup Request List某些QoS Flow异常释放。 无线原因是因为向AMF发送Initial Context Setup Failure、PDU Session Resource Failed to Setup List、Initial Context setup response携带了一个或多个PDU Session的QoS Flow Failed to setup List、PDU Session Resource Modify Response携带一个或多个QoS Flow Failed to add or Modify List。 主要的原因可以归纳如下: 1. 是否关联了E-RAB建立成功率,如果关联,那就和基站侧或无线侧关联较大; 2. 核查节能策略,是否由节能导致建立失败; 3. 干扰 4. 传输故障 5. 部分异常终端或SIM卡异常,加密算法或完整性算法不合理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值