[python]代码库
%%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)
[源代码打包下载]