利用python进行扰码分析.rar
文章中附件删掉就没附件了,再添加上附件就累加多个附件上去了,可以直接复制文章中源码,或者威望多的也可以下载其中一个附件就可以了,完全一样的。
看到有坛友发的python使用pyspark大数据技术解决大量数据迭代分组取TOPN的问题 的帖子。
我也来分享一下用python进行扰码复用分析和新站扰码规划的源码。
相信网优老鸟都知道3G扰码复用距离过近对网络KPI的影响,而我们通常检查扰码冲突的方法是根据邻区关系,看主邻有没有扰码冲突(一级),邻区与邻区之间有没有扰码冲突(二级),但对于全网扰码复用的距离有没有方法检查呢。
思路如下:将现网所有相同扰码的小区进行两两配对,组成相同扰码小区的复用距离检查组,然后将配好对的两个小区的经纬度信息添加上,再用excel公式或者小工具计算出每对之间的距离,筛选距离,是不是很简单。
但第一个问题是:找出所有扰码相同的小区后,相同扰码的小区怎么进行两两配对呢,比如我有100个扰码为66的小区,用excel怎么能让100个小区两两组对又不重复呢?这个问题用excel怎么处理还真没研究过,相信强大的excel应该会有方法做出来。
但用python就简单了。
来正式开始,用刚才的思路将实现过程分解下来。
1:相同扰码小区两两配对
2:配对好的两列小区的经纬度vlookup(excel中的做法)到后面
3:根据两组经纬度计算距离
4:然后就可以得到所有同扰码小区的复用距离了。
好,原理思路搞清楚,开干:
安装一个anoconda3 ,我用的官网最新python3.7版本,怎么装的自行百度
先把工参整成下面模样

图片咋不显示呢?
发个首行吧。
cell | name | PSC | 下行频点 | 小区覆盖类型 | long | lati |
(注意我这里小区覆盖类型是indoor,OUTDOOR,至于为啥一个用小写一个用大写,要问工参负责周大神了,我也是写完才注意到,不过代码中分析复用距离时把室分排除了,但这个区分还是要的)
cmd cd 进整好的工参所在目录,注意最好用英文文件命名。
比如我这里命名是:psc20190215.csv
在 cmd 里 打 jupyter notebook 回车就进入python的交互式笔记本模式了,py3文件。
导入模块和工参。图片能不能正常显示,太影响心情了。

1:
import itertools as its
import pandas as pd
from math import radians, cos, sin, asin, sqrt
2:
psc0215 = pd.DataFrame(pd.read_csv('psc20190215.csv',encoding='GBK'))
psc0215.head()
3:

def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径,单位为公里
return c * r * 1000
4:

def psc_check(frequency=10663,distance=5000):
pscs = psc0215[(psc0215['下行频点']==frequency)].set_index('cell')
temp = pscs[(pscs['PSC'] == 1)]
cell1 = list()
cell2 = list()
result = pd.DataFrame()
for i in range(1,512):
temp = pscs[(pscs['PSC'] == i)]
items = list(temp.index)
if len(items) < 2:
continue
else:
for item in its.combinations(items, 2):
cell1.append(item[0])
cell2.append(item[1])
result['cell'] = cell1
result['cell2'] = cell2
result_cell = pd.merge(result,pscs,how='left',on = 'cell')
result_cell = result_cell.rename(columns={'cell': 'cell1','cell2': 'cell'})
result_cell = pd.merge(result_cell,pscs,how='left',on = 'cell')
result_cell['距离'] = result_cell.apply(lambda result_cell : haversine(result_cell.long_x,result_cell.lati_x,result_cell.long_y,result_cell.lati_y), axis = 1)
result_final = result_cell[(result_cell['距离']<distance) & (result_cell['小区覆盖类型_x']== 'OUTDOOR') & (result_cell['小区覆盖类型_y']== 'OUTDOOR')]
return result_final
5:

检查频点为10663,复用距离3000米之内的同扰码小区,这个10663和3000是可以自己修改的,保存成本地csv
psc_check(frequency=10663,distance=3000)
psc_check(frequency=10663,distance=3000).to_csv('扰码复用距离小于3000米.csv',encoding = 'gbk')
6:
接下来是扰码规划的,
def psc_plan(cell , long = 0 , lati = 0 , distance = 3500 , plan_nums = 1):
choice = []
best_choice = []
pscs = psc0215.copy()
pscs['plan_cell'] = cell
pscs['plan_long'] = long
pscs['plan_lati'] = lati
pscs['距离'] = pscs.apply(lambda pscs : haversine(pscs.long,pscs.lati,pscs.plan_long,pscs.plan_lati), axis = 1)
pscs = pscs[(pscs['距离']<distance)]
used_psc = set(list(pscs.PSC))
for i in range(1,400):
if i not in used_psc:
choice.append(i)
else:
continue
if plan_nums != 3:
return (choice)
else:
plan_nums = 3
for i in choice:
if (i + 8) in choice and (i + 16) in choice:
best_choice.append((i,i+8,i+16))
return (best_choice)
7,
比如输入以下指令表示 规划 ‘站名’ 指定经纬度,在距离 4000米内无同扰码,规划数量 = 3 默认是规划一个站的三个小区,按隔 8 连续排列的三个扰码(如195,203,211),也可以输入其它数量,输入其它数量的话就输出所有可选扰码列表。
psc_plan('站名' , long = 10.03771 , lati = 3.59746 , distance = 4000, plan_nums = 3 )
如果找不到连续隔8的三个扰码的话,可能是距离设置要求过大,可以改plan_nums数字 = 3 以外的数就行了。
论坛对代码的显示不太友好,图片可以正常显示就又编辑了一下,代码都贴出来了,可以直接复制,附件jupyter 文件也是一样的代码。
利用python进行扰码分析.rar