吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2075|回复: 21
收起左侧

[Python 原创] 写了个网优小工具实现邻区规划,想与大家交流提升运行速度,欢迎大神指导优化

  [复制链接]
五散人 发表于 2024-5-20 21:18


[Python] 纯文本查看 复制代码
import pandas as pd
import numpy as np
from geopy.distance import geodesic
from tqdm import tqdm  # Import tqdm
import swifter  # Import swifter
def calculate_azimuth(lat1, lon1, lat2, lon2):
    """计算从点1到点2的方位角"""
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])
    dlon = lon2 - lon1
    x = np.sin(dlon) * np.cos(lat2)
    y = np.cos(lat1) * np.sin(lat2) - np.sin(lat1) * np.cos(lat2) * np.cos(dlon)
    initial_bearing = np.arctan2(x, y)
    initial_bearing = np.degrees(initial_bearing)
    compass_bearing = (initial_bearing + 360) % 360
    return compass_bearing
def calculate_distance(row1, row2):
    """计算两个点之间的地理位置距离(千米)"""
    return geodesic((row1['Latitude'], row1['Longitude']), (row2['Latitude'], row2['Longitude'])).kilometers
def is_neighbor(row1, row2, distance, azi1, azi2, alpha_s, alpha_n):
    """根据距离和夹角判断是否为邻区"""
    if distance <= 2:
        return True
    elif 2 < distance <= 3.5 and alpha_s <= 120 and alpha_n <= 120:
        return True
    elif 3.5 < distance <= 4.5 and alpha_s <= 90 and alpha_n <= 90:
        return True
    return False
def calculate_interference(planned_df, full_df):
    """计算每个小区到其他小区的邻区关系"""
    results = []
    for _, row1 in tqdm(planned_df.iterrows(), total=len(planned_df)):
        lat1, lon1, azimuth1 = row1['Latitude'], row1['Longitude'], row1['Azimuth']
        for _, row2 in full_df.iterrows():
            if row1['CellName'] != row2['CellName']:
                lat2, lon2 = row2['Latitude'], row2['Longitude']
                azi1 = calculate_azimuth(lat1, lon1, lat2, lon2)
                azi2 = calculate_azimuth(lat2, lon2, lat1, lon1)
                alpha_s = min(abs(azi1 - azimuth1), 360 - abs(azi1 - azimuth1))
                alpha_n = min(abs(azi2 - row2['Azimuth']), 360 - abs(azi2 - row2['Azimuth']))
                distance = calculate_distance(row1, row2)
                if is_neighbor(row1, row2, distance, azi1, azi2, alpha_s, alpha_n):
                    results.append({
                        '需规划小区名': row1['CellName'],
                        '需规划 eNodeB-ID': row1['eNodeB-ID'],
                        '需规划 小区本地ID': row1['本地ID'],
                        '全量小区名': row2['CellName'],
                        '全量 eNodeB-ID': row2['eNodeB-ID'],
                        '全量 CellID': row2['CellID'],
                        '全量 PCI': row2['PCI'],
                        '全量 频点号': row2['Earfcn'],
                        '全量 TAC': row2['TAC'],
                        '距离': round(distance, 2),
                        '方位角1': round(azi1, 2),
                        '方位角2': round(azi2, 2),
                        '夹角1': round(alpha_s, 2),
                        '夹角2': round(alpha_n, 2)
                    })
    return pd.DataFrame(results)
# 读取Excel数据
planned_path = 'C:/Users/Desktop/邻区规划/需规划小区工参.xlsx'
full_path = 'C:/Users/Desktop/邻区规划/全量工参.xlsx'
planned_df = pd.read_excel(planned_path)
full_df = pd.read_excel(full_path)
# 计算干扰
interference_results = calculate_interference(planned_df, full_df)
# print(interference_results)
# 保存结果到新的Excel文件
interference_results.to_excel('C:/Users/Desktop/邻区规划/邻区规划结果.xlsx', index=False)

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
angelabebe + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Love0912 发表于 2024-5-21 08:55
18702770531 发表于 2024-5-21 08:48
我去,52遇到同行了,简直了

在这里遇到同行岂不是很正常。。这里本来就是同行精英聚集地~
qiuyan521 发表于 2024-7-19 14:30
您的代码中使用了tqdm来显示进度条,这是一个很好的做法,可以提高用户体验。但是,tqdm在这里可能不会显示进度,因为iterrows()方法不支持迭代器的进度条。您可以考虑使用swifter库的apply()方法来加速循环,并且可以结合tqdm使用。
另外,您的calculate_distance函数在每次循环时都会调用geodesic,这可能会导致不必要的重复计算。如果row1和row2的Latitude和Longitude在循环中不会改变,可以考虑将这部分计算移到循环外部。
考虑将硬编码的文件路径和参数(如距离阈值)移动到配置文件或命令行参数中,这样可以使代码更易于维护和适应不同的环境。
如果calculate_azimuth函数在其他地方也会用到,可以考虑将其提取到一个单独的模块中,以便于重用。
爱飞的猫 发表于 2024-5-21 01:55

代码运行缺少这两个文件哦:

  • 需规划小区工参.xlsx
  • 全量工参.xlsx

另外如果可以,请同时提交你的 requirements.txt 依赖文件(官方文档 (英文))。

EssenceA1 发表于 2024-5-21 06:43
刚安装完Anaconda,表示看不懂,先留作学习
HarckerG 发表于 2024-5-21 08:48
我去,52遇到同行了,简直了
 楼主| 五散人 发表于 2024-5-21 09:36
18702770531 发表于 2024-5-21 08:48
我去,52遇到同行了,简直了

哈哈,干通信的多才多艺
Marken888 发表于 2024-5-21 09:41
Love0912 发表于 2024-5-21 08:55
在这里遇到同行岂不是很正常。。这里本来就是同行精英聚集地~

我也是同行
 楼主| 五散人 发表于 2024-5-21 09:41
爱飞的猫 发表于 2024-5-21 01:55
[md]代码运行缺少这两个文件哦:

- `需规划小区工参.xlsx`

两个文件涉及到运营商工参,属于涉密信息;需规划和全量工参都包含如下表头即可 eNodeB-ID        本地ID        CellName        PCI        CellID        Longitude        Latitude        TAC        Earfcn        带宽        Azimuth
Marken888 发表于 2024-5-21 09:43
请把模板放出来吧,应该还需要对应字段名才能读取
andyliuyang555 发表于 2024-5-21 10:00
上算法啊,这样循环肯定慢,同行路过
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表