利用python進行擾碼分析.rar
文章中附件刪掉就沒附件了,再添加上附件就累加多個附件上去了,可以直接復制文章中源碼,或者威望多的也可以下載其中一個附件就可以了,完全一樣的。
看到有壇友發(fā)的python使用pyspark大數(shù)據(jù)技術(shù)解決大量數(shù)據(jù)迭代分組取TOPN的問題 的帖子。
我也來分享一下用python進行擾碼復用分析和新站擾碼規(guī)劃的源碼。
相信網(wǎng)優(yōu)老鳥都知道3G擾碼復用距離過近對網(wǎng)絡KPI的影響,而我們通常檢查擾碼沖突的方法是根據(jù)鄰區(qū)關系,看主鄰有沒有擾碼沖突(一級),鄰區(qū)與鄰區(qū)之間有沒有擾碼沖突(二級),但對于全網(wǎng)擾碼復用的距離有沒有方法檢查呢。
思路如下:將現(xiàn)網(wǎng)所有相同擾碼的小區(qū)進行兩兩配對,組成相同擾碼小區(qū)的復用距離檢查組,然后將配好對的兩個小區(qū)的經(jīng)緯度信息添加上,再用excel公式或者小工具計算出每對之間的距離,篩選距離,是不是很簡單。
但第一個問題是:找出所有擾碼相同的小區(qū)后,相同擾碼的小區(qū)怎么進行兩兩配對呢,比如我有100個擾碼為66的小區(qū),用excel怎么能讓100個小區(qū)兩兩組對又不重復呢?這個問題用excel怎么處理還真沒研究過,相信強大的excel應該會有方法做出來。
但用python就簡單了。
來正式開始,用剛才的思路將實現(xiàn)過程分解下來。
1:相同擾碼小區(qū)兩兩配對
2:配對好的兩列小區(qū)的經(jīng)緯度vlookup(excel中的做法)到后面
3:根據(jù)兩組經(jīng)緯度計算距離
4:然后就可以得到所有同擾碼小區(qū)的復用距離了。
好,原理思路搞清楚,開干:
安裝一個anoconda3 ,我用的官網(wǎng)最新python3.7版本,怎么裝的自行百度
先把工參整成下面模樣
圖片咋不顯示呢?
發(fā)個首行吧。
cell | name | PSC | 下行頻點 | 小區(qū)覆蓋類型 | long | lati |
(注意我這里小區(qū)覆蓋類型是indoor,OUTDOOR,至于為啥一個用小寫一個用大寫,要問工參負責周大神了,我也是寫完才注意到,不過代碼中分析復用距離時把室分排除了,但這個區(qū)分還是要的)
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): # 經(jīng)度1,緯度1,經(jīng)度2,緯度2 (十進制度數(shù))
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 將十進制度數(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['下行頻點']==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:
檢查頻點為10663,復用距離3000米之內(nèi)的同擾碼小區(qū),這個10663和3000是可以自己修改的,保存成本地csv
psc_check(frequency=10663,distance=3000)
psc_check(frequency=10663,distance=3000).to_csv('擾碼復用距離小于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 默認是規(guī)劃一個站的三個小區(qū),按隔 8 連續(xù)排列的三個擾碼(如195,203,211),也可以輸入其它數(shù)量,輸入其它數(shù)量的話就輸出所有可選擾碼列表。
psc_plan('站名' , long = 10.03771 , lati = 3.59746 , distance = 4000, plan_nums = 3 )
如果找不到連續(xù)隔8的三個擾碼的話,可能是距離設置要求過大,可以改plan_nums數(shù)字 = 3 以外的數(shù)就行了。
論壇對代碼的顯示不太友好,圖片可以正常顯示就又編輯了一下,代碼都貼出來了,可以直接復制,附件jupyter 文件也是一樣的代碼。
利用python進行擾碼分析.rar