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_())
网优数据分析处理
于 2023-07-29 23:23:49 首次发布