% % time |
''' |
v1.3更新每PRB平均吞吐率 |
v1.4更新区县,吉利纳入孟津,新增“新区”,GSM侧同理更新;请注意GSM数据为小区级GSM数据(如果按区县,将少10%的数据) |
v1.5: |
(1)修复部分python部分版本merge函数执行报错:merge(df2,df1_gr_average.to_frame()),“.to_frame()”强制将series格式转换为dataframe格式; |
(2)在全网指标的基础上,添加输出地铁指标; |
v1.6:修复GSM全网话务量流量不准问题; |
''' |
import pandas as pd |
import numpy as np |
import warnings |
warnings.filterwarnings( 'ignore' ) |
import os |
os.chdir(r "D:\KPI\meiritongbao" ) |
df = pd.read_csv( '4G每日通报_查询结果.zip' ,skiprows = 6 ,encoding = "utf-8" ,low_memory = False ) |
gsm = pd.read_csv( 'gsm.zip' ,encoding = "gbk" ,usecols = [ '开始时间' , '区县' , '语音总话务量' , 'RLC层上行GPRS流量(不含重传)' , 'RLC层下行GPRS流量(不含重传)' , 'RLC层上行EGPRS流量(不含重传)' , 'RLC层下行EGPRS流量(不含重传)' ]) |
#区县规整。 |
def quxian(x): |
if x[ '区县1' ] = = '西工' : |
return '西工' |
elif x[ '区县1' ] = = '市涧' : |
return '涧西' |
elif x[ '区县1' ] = = '涧西' : |
return '涧西' |
elif x[ '区县1' ] = = '新区' : |
return '新区' |
elif x[ '区县1' ] = = '河南' : |
return '新区' |
elif x[ '区县1' ] = = 'TX' : |
return '新区' |
elif x[ '区县1' ] = = '吉利' : |
return '孟津' |
elif x[ '区县1' ] = = '孟津' : |
return '孟津' |
elif x[ '区县1' ] = = '栾川' : |
return '栾川' |
elif x[ '区县1' ] = = '洛宁' : |
return '洛宁' |
elif x[ '区县1' ] = = '汝阳' : |
return '汝阳' |
elif x[ '区县1' ] = = '市嵩' : |
return '嵩县' |
elif x[ '区县1' ] = = '嵩县' : |
return '嵩县' |
elif x[ '区县1' ] = = '新安' : |
return '新安' |
elif x[ '区县1' ] = = '偃师' : |
return '偃师' |
elif x[ '区县1' ] = = '伊川' : |
return '伊川' |
elif x[ '区县1' ] = = '宜阳' : |
return '宜阳' |
else : |
return '新区' |
|
#gsm报表处理。2022年10月8日更新。 |
def gsmquxian(x): |
if (x[ '区县' ] = = '瀍河回族区' ) or (x[ '区县' ] = = '老城区' ) or (x[ '区县' ] = = '西工区' ) or (x[ '区县' ] = = '西工' ): |
return '西工' |
elif x[ '区县' ] = = '涧西区' or x[ '区县' ] = = '涧西' : |
return '涧西' |
elif x[ '区县' ] = = '洛龙区' or x[ '区县' ] = = '洛龙' or x[ '区县' ] = = '新区' or x[ '区县' ] = = '武陟' : |
return '新区' |
elif x[ '区县' ] = = '吉利区' or x[ '区县' ] = = '吉利' or x[ '区县' ] = = '济源' : |
return '孟津' |
elif x[ '区县' ] = = '栾川县' or x[ '区县' ] = = '栾川' : |
return '栾川' |
elif x[ '区县' ] = = '洛宁县' or x[ '区县' ] = = '洛宁' : |
return '洛宁' |
elif x[ '区县' ] = = '孟津县' or x[ '区县' ] = = '孟津' : |
return '孟津' |
elif x[ '区县' ] = = '汝阳县' or x[ '区县' ] = = '汝阳' : |
return '汝阳' |
elif x[ '区县' ] = = '嵩县' : |
return '嵩县' |
elif x[ '区县' ] = = '新安县' or x[ '区县' ] = = '新安' : |
return '新安' |
elif x[ '区县' ] = = '偃师市' or x[ '区县' ] = = '偃师' : |
return '偃师' |
elif x[ '区县' ] = = '伊川县' or x[ '区县' ] = = '伊川' : |
return '伊川' |
elif x[ '区县' ] = = '宜阳县' or x[ '区县' ] = = '宜阳' : |
return '宜阳' |
else : |
return '新区' |
def g_r110(x): |
if int (x[ '系统上行每个PRB上检测到的干扰噪声的平均值(毫瓦分贝)' ]) > - 110 : |
return 1 |
return 0 |
def g_r120(x): |
if int (x[ '系统上行每个PRB上检测到的干扰噪声的平均值(毫瓦分贝)' ]) > - 120 : |
return 1 |
return 0 |
def sl(x): |
return 1 |
date = df.iloc[ 0 , 0 ] |
df[ '基站名称' ]. map ( str ) |
df = df[df[ '基站名称' ]. str .contains( '济源' ) = = False ] |
df = df[df[ '基站名称' ]. str .contains( '济煤' ) = = False ] |
df[ '地市' ] = df[ '基站名称' ]. str [: 2 ] |
df[ '区县1' ] = df[ '基站名称' ]. str [ 2 : 4 ] |
df[ '区县' ] = df. apply (quxian, axis = 1 ) |
def quxian_file(df,gsm): |
#各县区业务量跟踪表 |
df_quxian = df.groupby( '区县' ).agg({ '小区PDCP层所接收到的上行数据的总吞吐量(比特)' : 'sum' , '小区PDCP层所发送的下行数据的总吞吐量(比特)' : 'sum' }) |
df_quxian.loc[ '全网' ] = df_quxian. apply ( lambda x: np. sum (x)) |
df_quxian[ '上下行总流量(GB)' ] = round ((df_quxian[ '小区PDCP层所接收到的上行数据的总吞吐量(比特)' ] + df_quxian[ '小区PDCP层所发送的下行数据的总吞吐量(比特)' ]) / 8 / 1000 / 1000 / 1000 , 2 ) |
df_quxian[ '上行总流量(GB)' ] = round (df_quxian[ '小区PDCP层所接收到的上行数据的总吞吐量(比特)' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df_quxian[ '下行总流量(GB)' ] = round (df_quxian[ '小区PDCP层所发送的下行数据的总吞吐量(比特)' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df_quxian = df_quxian[[ '上下行总流量(GB)' , '上行总流量(GB)' , '下行总流量(GB)' ]] |
#重置索引指定顺序 |
df_quxian.reset_index(inplace = True ) |
list_sorted = [ '新区' , '栾川' , '洛宁' , '孟津' , '汝阳' , '嵩县' , '新安' , '偃师' , '伊川' , '宜阳' , '涧西' , '西工' , '全网' ] |
df_quxian[ '区县' ] = df_quxian[ '区县' ].astype( 'category' ).cat.set_categories(list_sorted) |
df_quxian_sortes = df_quxian.sort_values(by = [ '区县' ], ascending = True ) |
#各县区TDD/FDD流量和话务量跟踪表 |
df_quxian_tf = df.groupby([ '区县' , '小区双工模式' ]).agg({ '小区PDCP层所接收到的上行数据的总吞吐量(比特)' : 'sum' , '小区PDCP层所发送的下行数据的总吞吐量(比特)' : 'sum' , 'QCI为1的DRB的个数' : 'sum' }) |
#unstack把二级索引变成列 |
df_quxian_tf1 = df_quxian_tf.unstack() |
gsm[ '区县1' ] = gsm. apply (gsmquxian, axis = 1 ) |
gsm = gsm.groupby( '区县1' ).agg( 'sum' ) |
gsm[ 'GSM数据流量()' ] = gsm[ 'RLC层上行GPRS流量(不含重传)' ] + gsm[ 'RLC层下行GPRS流量(不含重传)' ] + gsm[ 'RLC层上行EGPRS流量(不含重传)' ] + gsm[ 'RLC层下行EGPRS流量(不含重传)' ] |
gsm[ 'GSM数据流量(GB)' ] = gsm[ 'GSM数据流量()' ] / 1024 |
gsm.rename(columns = { '语音总话务量' : 'GSM话务量(ERL)' },inplace = True ) |
df0 = pd.merge(df_quxian_tf1,gsm,how = 'left' ,right_index = True ,left_index = True ) |
#二级索引重命名 |
df0.rename(columns = {( '小区PDCP层所接收到的上行数据的总吞吐量(比特)' , 'CELL_FDD' ): '上行数据流量(bit)-FDD' },inplace = True ) |
df0.rename(columns = {( '小区PDCP层所接收到的上行数据的总吞吐量(比特)' , 'CELL_TDD' ): '上行数据流量(bit)-TDD' },inplace = True ) |
df0.rename(columns = {( '小区PDCP层所发送的下行数据的总吞吐量(比特)' , 'CELL_FDD' ): '下行数据流量(bit)-FDD' },inplace = True ) |
df0.rename(columns = {( '小区PDCP层所发送的下行数据的总吞吐量(比特)' , 'CELL_TDD' ): '下行数据流量(bit)-TDD' },inplace = True ) |
df0.rename(columns = {( 'QCI为1的DRB的个数' , 'CELL_FDD' ): 'volte话务量(ERL)-FDD-PRS' },inplace = True ) |
df0.rename(columns = {( 'QCI为1的DRB的个数' , 'CELL_TDD' ): 'volte话务量(ERL)-TDD-PRS' },inplace = True ) |
df0[ '上行数据流量(GB)-FDD' ] = round (df0[ '上行数据流量(bit)-FDD' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df0[ '上行数据流量(GB)-TDD' ] = round (df0[ '上行数据流量(bit)-TDD' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df0[ '下行数据流量(GB)-FDD' ] = round (df0[ '下行数据流量(bit)-FDD' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df0[ '下行数据流量(GB)-TDD' ] = round (df0[ '下行数据流量(bit)-TDD' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df0[ '上行数据总流量(GB)' ] = df0[ '上行数据流量(GB)-FDD' ] + df0[ '上行数据流量(GB)-TDD' ] |
df0[ '下行数据总流量(GB)' ] = df0[ '下行数据流量(GB)-FDD' ] + df0[ '下行数据流量(GB)-TDD' ] |
df0[ '上下行数据总流量(GB)' ] = df0[ '上行数据总流量(GB)' ] + df0[ '下行数据总流量(GB)' ] |
df0[ 'volte话务量(ERL)-FDD' ] = df0[ 'volte话务量(ERL)-FDD-PRS' ] * 24 |
df0[ 'volte话务量(ERL)-TDD' ] = df0[ 'volte话务量(ERL)-TDD-PRS' ] * 24 |
df0[ 'VOLTE总话务量(ERL)' ] = df0[ 'volte话务量(ERL)-FDD' ] + df0[ 'volte话务量(ERL)-TDD' ] |
df0.loc[ '全网' ] = df0. apply ( lambda x: np. sum (x)) |
df0[ '日期' ] = date |
df0 = df0[[ '日期' , '上行数据流量(GB)-FDD' , '上行数据流量(GB)-TDD' , '上行数据总流量(GB)' , '下行数据流量(GB)-FDD' , '下行数据流量(GB)-TDD' , '下行数据总流量(GB)' , |
'volte话务量(ERL)-TDD' , 'volte话务量(ERL)-FDD' , '上下行数据总流量(GB)' , 'VOLTE总话务量(ERL)' , 'GSM话务量(ERL)' , 'GSM数据流量(GB)' ]] |
df0.reset_index(inplace = True ) |
df0[ '区县' ] = df0[ '区县' ].astype( 'category' ).cat.set_categories(list_sorted) |
df0_sortes = df0.sort_values(by = [ '区县' ], ascending = True ) |
#输出"各县区流量和话务量跟踪表.csv" |
df0_sortes.to_csv( '各县区流量和话务量跟踪表' + date + '.csv' ,encoding = "gbk" ,index = False ) |
df0.set_index( '区县' , inplace = True ) |
return df0 |
def lte_file(df,df0,x): |
#输出洛阳LTE指标跟踪表 |
df[ '系统上行每个PRB上检测到的干扰噪声的平均值(毫瓦分贝)' ].replace( 'NIL' , '-121' ,inplace = True ) |
# 避免链式赋值 |
df1 = df.loc[df[ '地市' ] = = '洛阳' ].copy() |
df1.replace( 'NIL' , '0' ,inplace = True ) |
#干扰处理 |
df1 = df1. apply (pd.to_numeric,errors = 'ignore' ) |
df1[ 'ganrao>-110dBm' ] = df1. apply (g_r110, axis = 1 ) |
df1[ 'ganrao>-120dBm' ] = df1. apply (g_r120, axis = 1 ) |
df1[ 'xqsl' ] = df1. apply (sl, axis = 1 ) |
#分组 |
df1 = df1. apply (pd.to_numeric,errors = 'ignore' ) |
#干扰列为平均值 |
df1_gr_average = df1.groupby( '小区双工模式' )[ '系统上行每个PRB上检测到的干扰噪声的平均值(毫瓦分贝)' ].agg( 'mean' ) |
df1_gr_quanwang = df1.groupby( '地市' )[ '系统上行每个PRB上检测到的干扰噪声的平均值(毫瓦分贝)' ].agg( 'mean' ) |
#按TDD/FDD分组 |
df2 = df1.groupby( '小区双工模式' ).agg( 'sum' ) |
#合并、目标指标计算 |
df2.loc[ '全网' ] = df2. apply ( lambda x: np. sum (x)) |
df2_1 = pd.merge(df2,df1_gr_average,how = 'left' ,left_on = '小区双工模式' ,right_on = '小区双工模式' ) |
df3 = pd.merge(df2_1,df0,how = 'left' ,right_index = True ,left_index = True ) |
df3[ '上行数据流量(GB)' ] = round (df3[ '小区PDCP层所接收到的上行数据的总吞吐量(比特)' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df3[ '下行数据流量(GB)' ] = round (df3[ '小区PDCP层所发送的下行数据的总吞吐量(比特)' ] / 8 / 1000 / 1000 / 1000 , 2 ) |
df3[ '上下行总流量(GB)' ] = round ((df3[ '小区PDCP层所发送的下行数据的总吞吐量(比特)' ] + df3[ '小区PDCP层所接收到的上行数据的总吞吐量(比特)' ]) / 8 / 1000 / 1000 / 1000 , 2 ) |
df3[ 'volte话务量' ] = df3[ 'QCI为1的DRB的个数' ] * 24 |
df3[ 'RRC连接请求次数' ] = df3[ 'RRC连接请求次数(包括重发)' ] |
df3[ 'RRC连接建立完成次数' ] = df3[ 'RRC连接建立完成次数' ] |
df3[ 'RRC成功率' ] = (df3[ 'RRC连接建立完成次数' ] / df3[ 'RRC连接请求次数(包括重发)' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'E-RAB建立尝试总次数' ] = df3[ 'E-RAB建立尝试总次数' ] |
df3[ 'E-RAB建立成功总次数' ] = df3[ 'E-RAB建立成功总次数' ] |
df3[ 'E-RAB建立成功率' ] = (df3[ 'E-RAB建立成功总次数' ] / df3[ 'E-RAB建立尝试总次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'LTE接通率' ] = (df3[ 'RRC连接建立完成次数' ] / df3[ 'RRC连接请求次数(包括重发)' ] * df3[ 'E-RAB建立成功总次数' ] / df3[ 'E-RAB建立尝试总次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '掉线次数 ' ] = df3[ 'UE Context异常释放次数' ] + df3[ 'eNodeB发起的S1 RESET导致的UE Context释放次数' ] - df3[ 'eNodeB等待初始上下文建立请求超时触发的UE Context释放次数' ] |
df3[ '无线掉线率' ] = ((df3[ 'UE Context异常释放次数' ] + df3[ 'eNodeB发起的S1 RESET导致的UE Context释放次数' ] - df3[ 'eNodeB等待初始上下文建立请求超时触发的UE Context释放次数' ]) / (df3[ 'UE Context建立成功总次数' ] + df3[ '小区遗留UE Context个数' ])). apply ( lambda x: format (x, '.2%' )) |
#df3['无线掉线率'] = ((df3['UE Context异常释放次数'] + df3['eNodeB发起的S1 RESET导致的UE Context释放次数'] - df3['eNodeB等待初始上下文建立请求超时触发的UE Context释放次数']) / (df3['UE Context建立成功总次数'])).apply(lambda x:format(x,'.2%')) |
df3[ 'RRC连接重建比率' ] = (df3[ 'RRC重建请求次数' ] / (df3[ 'RRC连接请求次数(包括重发)' ] + df3[ 'RRC重建请求次数' ])). apply ( lambda x: format (x, '.2%' )) |
df3[ 'eNB间异频切换成功率' ] = ((df3[ 'eNodeB间异频切换出成功次数' ] - df3[ '通过重建回源小区的eNodeB间异频切换出执行成功次数' ]) / df3[ 'eNodeB间异频切换出尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'eNB间同频切换成功率' ] = ((df3[ 'eNodeB间同频切换出成功次数' ] - df3[ '通过重建回源小区的eNodeB间同频切换出执行成功次数' ]) / df3[ 'eNodeB间同频切换出尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'eNB内异频切换成功率' ] = ((df3[ 'eNodeB内异频切换出成功次数' ] - df3[ '通过重建回源小区的eNodeB内异频切换出执行成功次数' ]) / df3[ 'eNodeB内异频切换出尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'eNB内同频切换成功率' ] = ((df3[ 'eNodeB内同频切换出成功次数' ] - df3[ '通过重建回源小区的eNodeB内同频切换出执行成功次数' ]) / df3[ 'eNodeB内同频切换出尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '切换成功率' ] = ((df3[ 'eNodeB内同频切换出成功次数' ] + df3[ 'eNodeB内异频切换出成功次数' ] + df3[ 'eNodeB间同频切换出成功次数' ] + df3[ 'eNodeB间异频切换出成功次数' ] + df3[ '小区eNodeB内FDD/TDD模式间切换出成功次数' ] + df3[ '小区eNodeB间FDD/TDD模式间切换出成功次数' ] - df3[ '通过重建回源小区的eNodeB内异模式切换出执行成功次数' ] - df3[ '通过重建回源小区的eNodeB间异模式切换出执行成功次数' ] - df3[ '通过重建回源小区的eNodeB内同频切换出执行成功次数' ] - df3[ '通过重建回源小区的eNodeB内异频切换出执行成功次数' ] - df3[ '通过重建回源小区的eNodeB间同频切换出执行成功次数' ] - df3[ '通过重建回源小区的eNodeB间异频切换出执行成功次数' ]) / (df3[ 'eNodeB内异频切换出尝试次数' ] + df3[ 'eNodeB内同频切换出尝试次数' ] + df3[ 'eNodeB间同频切换出尝试次数' ] + df3[ 'eNodeB间异频切换出尝试次数' ] + df3[ '小区eNodeB内FDD/TDD模式间切换出尝试次数' ] + df3[ '小区eNodeB间FDD/TDD模式间切换出尝试次数' ])). apply ( lambda x: format (x, '.2%' )) |
df3[ 'CSFB准备成功率' ] = (df3[ 'eNodeB成功响应CSFB的次数' ] / df3[ 'eNodeB收到的CSFB触发次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '小区用户面上行丢包率' ] = ((df3[ '小区QCI为1的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为2的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为3的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为4的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为5的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为6的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为7的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为8的DRB业务PDCP SDU上行丢弃的总包数(包)' ] + df3[ '小区QCI为9的DRB业务PDCP SDU上行丢弃的总包数(包)' ]) / (df3[ '小区QCI为1的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为2的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为3的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为4的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为5的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为6的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为7的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为8的DRB业务PDCP SDU上行期望收到的总包数(包)' ] + df3[ '小区QCI为9的DRB业务PDCP SDU上行期望收到的总包数(包)' ])). apply ( lambda x: format (x, '.2%' )) |
df3[ '小区用户面下行丢包率' ] = ((df3[ '小区QCI为1的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为2的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为3的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为4的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为5的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为6的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为7的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为8的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ] + df3[ '小区QCI为9的DRB业务PDCP SDU下行空口丢弃的总包数(包)' ]) / (df3[ '小区QCI为1的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为2的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为3的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为4的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为5的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为6的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为7的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为8的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为9的DRB业务PDCP SDU下行空口发送的总包数(包)' ])). apply ( lambda x: format (x, '.2%' )) |
df3[ '小区用户面下行弃包率' ] = ((df3[ 'QCI为1的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为2的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为3的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为4的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为5的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为6的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为7的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为8的业务PDCP层下行丢弃的业务SDU数(包)' ] + df3[ 'QCI为9的业务PDCP层下行丢弃的业务SDU数(包)' ]) / (df3[ '小区QCI为1的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为2的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为3的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为4的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为5的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为6的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为7的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为8的DRB业务PDCP SDU下行空口发送的总包数(包)' ] + df3[ '小区QCI为9的DRB业务PDCP SDU下行空口发送的总包数(包)' ])). apply ( lambda x: format (x, '.2%' )) |
df3[ '系统上行每PRB子载波平均干扰噪声>-110dBm的小区比例' ] = (df3[ 'ganrao>-110dBm' ] / df3[ 'xqsl' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '系统上行每PRB子载波平均干扰噪声>-120dBm的小区比例' ] = (df3[ 'ganrao>-120dBm' ] / df3[ 'xqsl' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '系统上行每PRB子载波平均干扰噪声' ] = df3[ '系统上行每个PRB上检测到的干扰噪声的平均值(毫瓦分贝)_y' ] |
df3[ '小区用户面下行平均时延(ms)' ] = round ((df3[ '小区QCI为1的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为2的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为3的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为4的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为5的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为6的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为7的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为8的DRB业务下行数据包处理总时延(毫秒)' ] + df3[ '小区QCI为9的DRB业务下行数据包处理总时延(毫秒)' ]) / (df3[ '小区QCI为1的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为2的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为3的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为4的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为5的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为6的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为7的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为8的DRB业务下行发送的PDCP SDU的包数(包)' ] + df3[ '小区QCI为9的DRB业务下行发送的PDCP SDU的包数(包)' ]), 2 ) |
df3[ '上行PRB平均利用率' ] = (df3[ '上行PUSCH的Physical Resource Block被使用的平均个数' ] / df3[ 'PUSCH可用PRB平均个数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '下行PRB平均利用率' ] = (df3[ '下行Physical Resource Block被使用的平均个数' ] / df3[ '下行可用的PRB个数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '无线利用率' ] = ((df3[ '上行PUSCH的Physical Resource Block被使用的平均个数' ] * 720000 + df3[ '下行Physical Resource Block被使用的平均个数' ] * 2880000 ) / (df3[ 'PUSCH可用PRB平均个数' ] * 720000 + df3[ '下行可用的PRB个数' ] * 2880000 )). apply ( lambda x: format (x, '.2%' )) |
df3[ 'eNodeB寻呼拥塞率' ] = ((df3[ '小区丢弃的MME对用户的寻呼消息的次数' ] + df3[ '小区PCH拥塞丢弃的寻呼消息次数' ]) / df3[ '小区S1接口接收寻呼消息次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '上行每PRB平均吞吐率(bits/RB)' ] = round (df3[ '小区PDCP层所接收到的上行数据的总吞吐量(比特)' ] / 24 / df3[ '上行PUSCH DRB的Physical Resource Block被使用的平均个数' ] / 720000 , 2 ) |
df3[ '下行每PRB平均吞吐率(bits/RB)' ] = round (df3[ '小区PDCP层所发送的下行数据的总吞吐量(比特)' ] / 24 / df3[ '下行Physical Resource Block被使用的平均个数' ] / 2880000 , 2 ) |
df3[ 'E-RAB建立成功率(QCI1)' ] = (df3[ 'QCI为1的业务E-RAB建立成功次数' ] / df3[ 'QCI为1的业务E-RAB建立尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'E-RAB建立成功率(QCI2)' ] = (df3[ 'QCI为2的业务E-RAB建立成功次数' ] / df3[ 'QCI为2的业务E-RAB建立尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '无线接通率(QCI1)' ] = (df3[ 'RRC连接建立完成次数' ] / df3[ 'RRC连接请求次数(包括重发)' ] * df3[ 'QCI为1的业务E-RAB建立成功次数' ] / df3[ 'QCI为1的业务E-RAB建立尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ '无线接通率(QCI2)' ] = (df3[ 'RRC连接建立完成次数' ] / df3[ 'RRC连接请求次数(包括重发)' ] * df3[ 'QCI为2的业务E-RAB建立成功次数' ] / df3[ 'QCI为2的业务E-RAB建立尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'VoLTE掉话率' ] = ((df3[ 'eNodeB触发的QCI为1的业务E-RAB异常释放次数' ] + df3[ '切换出QCI为1的E-RAB异常释放次数' ] + df3[ 'eNodeB发起的S1 RESET导致的QCI为1的E-RAB异常释放次数' ]) / (df3[ 'QCI为1的业务E-RAB建立尝试次数' ] + df3[ 'QCI为1的遗留E-RAB个数' ] + df3[ 'QCI为1的切换入E-RAB成功建立次数' ])). apply ( lambda x: format (x, '.2%' )) |
df3[ 'eSRVCC切换成功率' ] = (df3[ 'E-UTRAN向GERAN系统切换切出成功次数' ] / df3[ 'E-UTRAN向GERAN系统切换切出尝试次数' ]). apply ( lambda x: format (x, '.2%' )) |
df3[ 'CQI平均值' ] = round ((df3[ '空口上报全带宽CQI为1的次数' ] * 1 + df3[ '空口上报全带宽CQI为2的次数' ] * 2 + df3[ '空口上报全带宽CQI为3的次数' ] * 3 + df3[ '空口上报全带宽CQI为4的次数' ] * 4 + df3[ '空口上报全带宽CQI为5的次数' ] * 5 + df3[ '空口上报全带宽CQI为6的次数' ] * 6 + df3[ '空口上报全带宽CQI为7的次数' ] * 7 + df3[ '空口上报全带宽CQI为8的次数' ] * 8 + df3[ '空口上报全带宽CQI为9的次数' ] * 9 + df3[ '空口上报全带宽CQI为10的次数' ] * 10 + df3[ '空口上报全带宽CQI为11的次数' ] * 11 + df3[ '空口上报全带宽CQI为12的次数' ] * 12 + df3[ '空口上报全带宽CQI为13的次数' ] * 13 + df3[ '空口上报全带宽CQI为14的次数' ] * 14 + df3[ '空口上报全带宽CQI为15的次数' ] * 15 ) / (df3[ '空口上报全带宽CQI为0的次数' ] + df3[ '空口上报全带宽CQI为1的次数' ] + df3[ '空口上报全带宽CQI为2的次数' ] + df3[ '空口上报全带宽CQI为3的次数' ] + df3[ '空口上报全带宽CQI为4的次数' ] + df3[ '空口上报全带宽CQI为5的次数' ] + df3[ '空口上报全带宽CQI为6的次数' ] + df3[ '空口上报全带宽CQI为7的次数' ] + df3[ '空口上报全带宽CQI为8的次数' ] + df3[ '空口上报全带宽CQI为9的次数' ] + df3[ '空口上报全带宽CQI为10的次数' ] + df3[ '空口上报全带宽CQI为11的次数' ] + df3[ '空口上报全带宽CQI为12的次数' ] + df3[ '空口上报全带宽CQI为13的次数' ] + df3[ '空口上报全带宽CQI为14的次数' ] + df3[ '空口上报全带宽CQI为15的次数' ]), 2 ) |
df3[ '下行感知速率' ] = round ((df3[ '小区PDCP层所发送的下行数据的总吞吐量(比特)' ] - df3[ '使缓存为空的最后一个TTI所传的下行PDCP吞吐量(比特)' ]) / df3[ '扣除使下行缓存为空的最后一个TTI之后的数传时长(毫秒)' ] / 1000 , 2 ) |
df3[ '低CQI占比' ] = ((df3[ '空口上报全带宽CQI为0的次数' ] + df3[ '空口上报全带宽CQI为1的次数' ] + df3[ '空口上报全带宽CQI为2的次数' ] + df3[ '空口上报全带宽CQI为3的次数' ] + df3[ '空口上报全带宽CQI为4的次数' ] + df3[ '空口上报全带宽CQI为5的次数' ] + df3[ '空口上报全带宽CQI为6的次数' ]) / (df3[ '空口上报全带宽CQI为0的次数' ] + df3[ '空口上报全带宽CQI为1的次数' ] + df3[ '空口上报全带宽CQI为2的次数' ] + df3[ '空口上报全带宽CQI为3的次数' ] + df3[ '空口上报全带宽CQI为4的次数' ] + df3[ '空口上报全带宽CQI为5的次数' ] + df3[ '空口上报全带宽CQI为6的次数' ] + df3[ '空口上报全带宽CQI为7的次数' ] + df3[ '空口上报全带宽CQI为8的次数' ] + df3[ '空口上报全带宽CQI为9的次数' ] + df3[ '空口上报全带宽CQI为10的次数' ] + df3[ '空口上报全带宽CQI为11的次数' ] + df3[ '空口上报全带宽CQI为12的次数' ] + df3[ '空口上报全带宽CQI为13的次数' ] + df3[ '空口上报全带宽CQI为14的次数' ] + df3[ '空口上报全带宽CQI为15的次数' ])). apply ( lambda x: format (x, '.2%' )) |
df3[ '日期' ] = date |
df3 = df3[[ '日期' , '上行数据流量(GB)' , '下行数据流量(GB)' , '上下行总流量(GB)' , 'volte话务量' , 'RRC连接请求次数' , 'RRC连接建立完成次数' , 'RRC成功率' , 'E-RAB建立尝试总次数' , |
'E-RAB建立成功总次数' , 'E-RAB建立成功率' , 'LTE接通率' , '掉线次数 ' , '无线掉线率' , 'RRC连接重建比率' , 'eNB间异频切换成功率' , 'eNB间同频切换成功率' , 'eNB内异频切换成功率' , |
'eNB内同频切换成功率' , '切换成功率' , 'CSFB准备成功率' , '小区用户面上行丢包率' , '小区用户面下行丢包率' , '小区用户面下行弃包率' , '系统上行每PRB子载波平均干扰噪声>-110dBm的小区比例' , '系统上行每PRB子载波平均干扰噪声>-120dBm的小区比例' , |
'系统上行每PRB子载波平均干扰噪声' , '小区用户面下行平均时延(ms)' , '上行PRB平均利用率' , '下行PRB平均利用率' , '无线利用率' , 'eNodeB寻呼拥塞率' , '上行每PRB平均吞吐率(bits/RB)' , '下行每PRB平均吞吐率(bits/RB)' , |
'E-RAB建立成功率(QCI1)' , 'E-RAB建立成功率(QCI2)' , '无线接通率(QCI1)' , '无线接通率(QCI2)' , 'VoLTE掉话率' , 'eSRVCC切换成功率' , 'GSM话务量(ERL)' , |
'GSM数据流量(GB)' , 'CQI平均值' , '下行感知速率' , '低CQI占比' ]] |
#df1_gr_quanwang[0] 为series的第一行数据 |
df3.loc[ '全网' , '系统上行每PRB子载波平均干扰噪声' ] = df1_gr_quanwang[ 0 ] |
df3.to_csv( '洛阳LTE指标跟踪表' + x + date + '.csv' ,encoding = 'gbk' ,index = True ) |
return df3 |
#输出结果 |
quxian_export = quxian_file(df,gsm) |
x = '-全网' |
lte_file_export = lte_file(df,quxian_export,x) |
#输出地铁指标 |
df_metro = df[df[ 'eNodeB名称' ]. str .contains( 'HLD' ) = = True ] |
x = '-地铁' |
Metro_lte_file_export = lte_file(df_metro,quxian_export,x) |