利用python進(jìn)行擾碼分析.rar
文章中附件刪掉就沒附件了,再添加上附件就累加多個(gè)附件上去了,可以直接復(fù)制文章中源碼,或者威望多的也可以下載其中一個(gè)附件就可以了,完全一樣的。
看到有壇友發(fā)的python使用pyspark大數(shù)據(jù)技術(shù)解決大量數(shù)據(jù)迭代分組取TOPN的問題 的帖子。
我也來分享一下用python進(jìn)行擾碼復(fù)用分析和新站擾碼規(guī)劃的源碼。
相信網(wǎng)優(yōu)老鳥都知道3G擾碼復(fù)用距離過近對(duì)網(wǎng)絡(luò)KPI的影響,而我們通常檢查擾碼沖突的方法是根據(jù)鄰區(qū)關(guān)系,看主鄰有沒有擾碼沖突(一級(jí)),鄰區(qū)與鄰區(qū)之間有沒有擾碼沖突(二級(jí)),但對(duì)于全網(wǎng)擾碼復(fù)用的距離有沒有方法檢查呢。
思路如下:將現(xiàn)網(wǎng)所有相同擾碼的小區(qū)進(jìn)行兩兩配對(duì),組成相同擾碼小區(qū)的復(fù)用距離檢查組,然后將配好對(duì)的兩個(gè)小區(qū)的經(jīng)緯度信息添加上,再用excel公式或者小工具計(jì)算出每對(duì)之間的距離,篩選距離,是不是很簡(jiǎn)單。
但第一個(gè)問題是:找出所有擾碼相同的小區(qū)后,相同擾碼的小區(qū)怎么進(jìn)行兩兩配對(duì)呢,比如我有100個(gè)擾碼為66的小區(qū),用excel怎么能讓100個(gè)小區(qū)兩兩組對(duì)又不重復(fù)呢?這個(gè)問題用excel怎么處理還真沒研究過,相信強(qiáng)大的excel應(yīng)該會(huì)有方法做出來。
但用python就簡(jiǎn)單了。
來正式開始,用剛才的思路將實(shí)現(xiàn)過程分解下來。
1:相同擾碼小區(qū)兩兩配對(duì)
2:配對(duì)好的兩列小區(qū)的經(jīng)緯度vlookup(excel中的做法)到后面
3:根據(jù)兩組經(jīng)緯度計(jì)算距離
4:然后就可以得到所有同擾碼小區(qū)的復(fù)用距離了。
好,原理思路搞清楚,開干:
安裝一個(gè)anoconda3 ,我用的官網(wǎng)最新python3.7版本,怎么裝的自行百度
先把工參整成下面模樣

圖片咋不顯示呢?
發(fā)個(gè)首行吧。
cell | name | PSC | 下行頻點(diǎn) | 小區(qū)覆蓋類型 | long | lati |
(注意我這里小區(qū)覆蓋類型是indoor,OUTDOOR,至于為啥一個(gè)用小寫一個(gè)用大寫,要問工參負(fù)責(zé)周大神了,我也是寫完才注意到,不過代碼中分析復(fù)用距離時(shí)把室分排除了,但這個(gè)區(qū)分還是要的)
cmd cd 進(jìn)整好的工參所在目錄,注意最好用英文文件命名。
比如我這里命名是:psc20190215.csv
在 cmd 里 打 jupyter notebook 回車就進(jìn)入python的交互式筆記本模式了,py3文件。
導(dǎo)入模塊和工參。圖片能不能正常顯示,太影響心情了。

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): # 經(jīng)度1,緯度1,經(jīng)度2,緯度2 (十進(jìn)制度數(shù))
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 將十進(jìn)制度數(shù)轉(zhuǎn)化為弧度
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['下行頻點(diǎn)']==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['小區(qū)覆蓋類型_x']== 'OUTDOOR') & (result_cell['小區(qū)覆蓋類型_y']== 'OUTDOOR')]
return result_final
5:

檢查頻點(diǎn)為10663,復(fù)用距離3000米之內(nèi)的同擾碼小區(qū),這個(gè)10663和3000是可以自己修改的,保存成本地csv
psc_check(frequency=10663,distance=3000)
psc_check(frequency=10663,distance=3000).to_csv('擾碼復(fù)用距離小于3000米.csv',encoding = 'gbk')
6:
接下來是擾碼規(guī)劃的,
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,
比如輸入以下指令表示 規(guī)劃 ‘站名’ 指定經(jīng)緯度,在距離 4000米內(nèi)無同擾碼,規(guī)劃數(shù)量 = 3 默認(rèn)是規(guī)劃一個(gè)站的三個(gè)小區(qū),按隔 8 連續(xù)排列的三個(gè)擾碼(如195,203,211),也可以輸入其它數(shù)量,輸入其它數(shù)量的話就輸出所有可選擾碼列表。
psc_plan('站名' , long = 10.03771 , lati = 3.59746 , distance = 4000, plan_nums = 3 )
如果找不到連續(xù)隔8的三個(gè)擾碼的話,可能是距離設(shè)置要求過大,可以改plan_nums數(shù)字 = 3 以外的數(shù)就行了。
論壇對(duì)代碼的顯示不太友好,圖片可以正常顯示就又編輯了一下,代碼都貼出來了,可以直接復(fù)制,附件jupyter 文件也是一樣的代碼。
利用python進(jìn)行擾碼分析.rar