简介:《云瞰平台基础操作指导书》是一份面向通信网络优化工程师、无线技术人员与数据分析人员的实操性文档,系统讲解平台登录、指标查询、多窗口对比、自定义图层绘制与导入、数据导出及栅格级指标分析等核心功能。文档重点演示如何按业务专题、行政区、运营商和LTE/NR制式查询RSRP、SINR、MR质差、重叠覆盖等基础覆盖指标,以及VoLTE接通率、掉话率、语音质量等体验类指标,并可通过多边形自定义区域完成考场、楼宇等专项场景的精细化洞察和问题规整,辅助网络优化决策;同时覆盖整体、室内、室外、道路等业务专题及天/周/月时间粒度选择。资源包共1个docx文档,约8.44MB,读者可按章节索引快速定位查询、图层与导出模块,适合结合真实项目逐步练习,也可作为日常KPI监控、跨运营商对比及汇报报表制作的方法参考。目前已有415人学习下载,内容结构清晰、步骤完整,能帮助读者较快上手云瞰平台,提升栅格级分析与自定义图层操作的效率。
1. 栅格级指标分析为什么是网优的“显微镜”:云瞰平台解决什么
通信网络优化的日常,一半时间在找问题,另一半时间在证明问题不是玄学。小区级KPI只能告诉你某个基站“平均还行”,但一片区域的差到底差在哪个路口、哪个楼栋,平均值根本说不清。云瞰平台的栅格级指标分析,就是把海量MR测量报告、扫频数据和路测打点按50米×50米的网格切分,再通过自定义图层操作把RSRP、SINR、CQI、上行干扰叠加到真实地图上,让弱覆盖区、高干扰区、容量受限区从“看不见的黑匣子”变成“一眼能圈出来的多边形”。这套方法适合三类人:每天要处理用户投诉的网优工程师、做路测数据二次开发的优化主管、以及要给运营商交付专题报告的数据分析人员。它解决的核心问题不是“哪里差”,而是“差在哪里、差到什么程度、和什么相关”,并且让结果能导出、能复现、能进报告。这篇笔记,我就按自己做这类平台落地的路径,把栅格化、图层操作、指标评估和数据导出设计一条线讲透。
2. 栅格化与指标口径:把千万元素话单变成一张能决策的网格图
栅格级分析的第一步不是画图,而是把原始测量数据“切”成网格。这一步做得不扎实,后面所有图层和报告都是在给错误数据化妆。本节先说清楚栅格尺寸和聚合算法怎么选,再给出云瞰平台上的任务配置方式,最后讲三个最容易在指标口径上翻车的点。
2.1 栅格尺寸与聚合算法的选型逻辑
栅格尺寸的选择是所有参数里最早定、也是最难改的一个。常见做法是城区用50米,郊区用100米,密集商圈或室内外结合分析时用20米到25米。这里有个容易误解的地方:栅格越小不代表越准。MR定位的精度本身受限于TA量化步长与AOA测量误差,典型误差在50米到150米之间,如果你强行切20米栅格,一个采样点只是被随机甩到了周边某一个格子里,反而让空间分布看起来更“碎”。所以我的经验是:先确认源数据的定位精度,再定栅格尺寸,栅格边长至少大于定位精度的1/2。
聚合算法决定了每个格子里几十条甚至几百条采样点如何变成一个数。最常用的是均值法,适合表达整体水平;但如果你的目标是找“最差区域”,均值会把坏点稀释掉,这时候用“最差法”或“占比法”更合适。比如RSRP弱覆盖评估,我一般同时算两个值:该栅格RSRP均值,以及RSRP低于-110dBm的采样点占比。占比比均值更能暴露问题,因为一个栅格可能90%的采样都达标,但另外10%的点恰好都在某个楼栋背面,均值看着没问题,投诉却集中在这里。
| 参数 | 推荐取值 | 适用场景 | 备注 |
|---|---|---|---|
| 栅格尺寸 | 50m(城区)/100m(郊区)/25m(室内外) | 按场景切换 | 需与定位精度匹配 |
| 聚合算法 | 均值/加权均值/占比/最差 | 均值看整体,占比找短板 | 建议双指标输出 |
| 采样点阈值 | ≥5 点/栅格 | 保证统计稳定性 | 低于阈值标记“无数据” |
| 时间粒度 | 1小时/忙时/全天 | 按分析目标切换 | 对比时必须固定 |
采样点阈值是栅格化里最容易被忽略的参数。全城每天几千万条MR,分布极不均匀,主干道栅格可能有几百个点,城中村深处可能就一两点。没有阈值过滤,一两个异常采样点就能让整个栅格变成红色,这种假弱覆盖在报告里极难解释。我一般把它设为5,低于5个采样点的栅格直接算无数据,图层上用灰色表示,而不是强行给值。
2.2 用云瞰平台配置栅格统计任务的完整流程
云瞰平台这类GIS网优平台,通常把栅格统计配置成“数据源-过滤-聚合-输出”四段式任务。我用一个JSON配置来演示最典型的栅格统计任务,这是我在多个同类平台之间迁移后形成的通用写法:
{ "gridTask": { "name": "某城区_LTE_忙时栅格统计", "source": { "type": "mr", "table": "mr_raw_current", "timeField": "timestamp", "timeRange": ["2025-06-10 09:00:00", "2025-06-10 21:00:00"] }, "gridSize": 50, "aggregateBy": ["RAT", "BAND", "CELL_ID"], "aggregates": [ { "field": "RSRP", "func": "avg", "alias": "rsrp_avg" }, { "field": "RSRP", "func": "pct_lt", "threshold": -110, "alias": "rsrp_lt110_pct" }, { "field": "SINR", "func": "avg", "alias": "sinr_avg" }, { "field": "CQI", "func": "pct_lt", "threshold": 7, "alias": "cqi_lt7_pct" } ], "filters": { "insidePolygon": true, "minSamplingCount": 5 }, "output": { "type": "grid_layer", "style": { "palette": "blues_reds", "opacity": 0.7 } } } }这份配置做的事情是:把6月10日忙时9点到21点的MR原始表,按50米栅格切分,并以RAT、频段、小区三个维度分组,每个栅格输出RSRP均值、RSRP低于-110dBm的采样占比、SINR均值、CQI低于7的采样占比。逻辑上要注意两个关键点。
第一,aggregateBy里放CELL_ID是为了后续能下钻到小区维度。如果不放,同一个栅格内多个小区的采样会全部混在一起,后面做“栅格-小区交叉分析”时就少了一条通路。第二,minSamplingCount放在filter而不是aggregate里,含义是先过滤再聚合,这与先聚合再过滤的效果完全不同。先聚合再过滤会保留“基于一两个点算出来的极端值”,而先过滤能保证每个栅格的结果都有统计基础,这也是我在平台脚本里坚持的写法。
2.3 指标口径统一:三个最容易算错的维度
栅格化配置本身不难,难在让两个人在不同时间跑出来的指标能对上。我踩过太多口径不一致的坑,这里挑三个最常见的。
第一个是RSRP的过滤口径。有些统计会先剔除“服务小区RSRP为0或无效值”的采样,有些不剔除;还有一些统计对异频测量报告单独处理。同一个栅格,用不同过滤规则跑出来可能差5dB以上。统一做法是:只保留“服务小区RSRP有效且服务小区与栅格所属小区一致”的采样,其他一律过滤掉。
第二个是上行干扰的统计方式。上行干扰不能直接拿MR里某字段平均数,因为不同厂商的上行干扰定义不一致,有的用RTWP(接收总宽带功率),有的用NI(噪声干扰),数值基准也不一样。跨厂区对比时,必须先做基准归一化:把RTWP/NI统一转换为相对于底噪的抬升量,比如“底噪+3dB为强干扰门限”。不归一化就画图层,看起来是全网高干扰,实际上只是厂商字段口径没对齐。
第三个是时间窗口的对齐。忙时定义在各地差异很大,有的取9点到11点加19点到21点,有的直接取10点到20点。栅格统计任务如果每次都手动修改时间范围,历史对比基本没法做。正确做法是在平台里预置“忙时”时间模板,所有任务引用同一个模板,而不是手写时间字符串。这样后续换季度,只需要改模板一处。
3. 自定义图层操作:把栅格数据变成网优能读得懂的专题图
栅格统计跑完,数据还是一张宽表,不直观。自定义图层操作是这个环节的核心:把不同指标渲染成带颜色、粒度可调的专题图层,并叠加基站、道路、行政区等参考图层,让分析从“查数字”变成“看地图”。本节讲图层体系设计、渲染方案,以及一个可以自动操作图层的Python脚本。
3.1 图层体系与渲染方案设计
我通常把一个网优分析工程拆成四类图层:底图、栅格专题图层、点线参考图层、标注图层。底图只承担地理参考功能,渲染成灰白色,避免抢戏;栅格专题层放在底图之上半透明显示;基站扇区、天线方向角、道路边界放在第三层;最后是标注层,放重点区域、投诉点、测试路线。
图层顺序看起来是个小问题,但实际操作中让不少人翻了车。云瞰平台的图层按“下-上”叠加顺序渲染,如果你把灰度底图放在栅格层之上,整个栅格专题图会被盖住,只有调透明度才能看到一点点。我一般会用“下到上:底图→栅格专题层→基站/扇区层→投诉标注层→区域框选层”的顺序。其中栅格专题层的透明度设置在0.6到0.8之间,既能透出底图道路走向,又不影响颜色辨识。
栅格专题层的渲染关键是分级设色。RSRP层次色一般用绿色(≥-95dBm)、黄色(-105到-95dBm)、橙色(-115到-105dBm)、红色(小于-115dBm)。SINR用蓝黄红:大于15dB蓝色,5到15dB黄色,小于5dB红色。CQI低于7的占比超过20%时标紫。色阶要固定成平台级模板,这样不同时间生成的图层颜色含义一致,出报告时才不需要反复解释图例。
| 指标 | 第一档 | 第二档 | 第三档 | 第四档 |
|---|---|---|---|---|
| RSRP | ≥-95dBm,绿 | -105~-95,黄 | -115~-105,橙 | <-115,红 |
| SINR | ≥15dB,蓝 | 5~15,黄 | 0~5,橙 | <0,红 |
| CQI<7占比 | <5%,绿 | 5%~15%,黄 | 15%~30%,橙 | >30%,红 |
| 上行干扰抬升 | <3dB,绿 | 3~6dB,黄 | 6~10dB,橙 | >10dB,红 |
3.2 图层叠加与联动分析:多维度交叉定位弱覆盖
单看RSRP栅格图,你能找到弱覆盖区域,但不知道它为什么弱。自定义图层的价值就在于把多个维度叠到同一画布上做交叉定位。一个典型的联动分析流程是:先在RSRP格图上框选出低于-110dBm的栅格集合,然后叠加SINR图层,如果这些栅格同时SINR低于0,说明不只是覆盖不足,还存在强干扰,问题很可能是越区覆盖。
我会进一步叠加基站扇区图层和天线方位角。某城区一个连续弱覆盖带,小区平均RSRP只有-102dBm,看似由距离导致,但栅格图上发现弱栅格集中在两个扇区交叠的夹角区域,叠加方位角后确认是天线朝向与街道方向不一致,导致阻挡反射薄弱区。这种结论在小区级KPI上根本看不出来,只有图层叠加才能定位到“具体是哪一面天线对着哪条街”。
联动分析在云瞰平台里一般靠空间筛选实现:选中图层A的区域,反向关联图层B中与该区域相交的栅格或小区。操作上要注意筛选条件是用“与区域相交”还是“完全位于区域内”。栅格中心点恰好在边界上的情况非常多,如果平台支持,优先用“中心点落在区域内”而不是“相交”,后者会把外圈大量无关栅格也带进来,造成统计范围虚大。
3.3 图层操作的自动化脚本示例
图层操作如果全靠鼠标点,一次两次可以,全城几十个栅格任务根本点不过来。云瞰平台一般提供图层服务接口,我用一个Python脚本演示自动创建栅格图层并叠加参考图层的过程:
import requests from datetime import datetime BASE_URL = "http://<yunkan-server>/api/v1" HEADERS = {"Authorization": "Bearer <token>"} def create_rsrp_layer(grid_size=50, task_date="2025-06-10"): payload = { "name": f"RSRP_Grid_{task_date}", "layerType": "grid", "gridSize": grid_size, "metric": "RSRP", "aggregation": "avg", "colorRamp": [ {"min": -115, "color": "#FF0000"}, {"min": -105, "color": "#FF8800"}, {"min": -95, "color": "#FFFF00"}, {"min": -95, "color": "#00FF00", "toMax": True} ], "opacity": 0.7, "timeRange": [f"{task_date} 09:00:00", f"{task_date} 21:00:00"] } resp = requests.post(f"{BASE_URL}/layers", json=payload, headers=HEADERS) layer_id = resp.json()["layerId"] # 创建扇区参考层,用于交叉分析 sector_payload = { "name": f"Sector_{task_date}", "layerType": "sector", "field": "azimuth", "showLabel": False } resp2 = requests.post(f"{BASE_URL}/layers", json=sector_payload, headers=HEADERS) sector_id = resp2.json()["layerId"] # 设置图层顺序:底图在下,栅格层在上,扇区层在上 requests.put(f"{BASE_URL}/layers/order", json={"order": ["base_map", layer_id, sector_id]}, headers=HEADERS) return layer_id, sector_id if __name__ == "__main__": gid, sid = create_rsrp_layer() print(f"created grid layer {gid}, sector layer {sid}")脚本的逻辑是先用POST创建栅格专题图层,传四段色阶和透明度;再创建扇区参考层;最后一次性调整图层顺序。注意colorRamp里我用了“到最大值”的写法,如果不加toMax标记,最亮的一档只会覆盖恰好等于-95dBm的栅格,其余高于-95的所有栅格都会被漏掉,这是常见的渲染边界问题。
参数上最值得调的是colorRamp断点。断点的设置应该与平台图例表格保持一致,并且修改后要重建旧图层,不能只改当前图层,否则新旧图层的颜色含义会不一致。这也是为什么我会把色阶模板通过配置中心下发,而不是直接在脚本里硬编码。
4. 网络性能洞察与数据导出系统设计:从“看图”到“交报告”
栅格图能看,但优化动作要落到报告和工单上。这一章解决两件事:一是怎么用多维度评估模型把栅格数据变成优化建议,二是怎么设计一套能稳定导出、能进报告的数据导出系统。后者往往是项目验收时被卡得最久的环节。
4.1 多维度评估模型:覆盖、干扰、容量、质量四象限
只看RSRP一个维度,会把很多“覆盖不差但体验差”的区域漏掉。我把栅格级评估拆成四个维度,每个栅格都要能回答四个问题:覆盖够不够、干扰大不大、容量紧不紧张、质量达不达标。
| 维度 | 核心指标 | 常用门限 | 对应用户体验 |
|---|---|---|---|
| 覆盖 | RSRP均值、RSRP<-110占比 | 占比>20%判定弱覆盖 | 掉话、无法接入 |
| 干扰 | SINR均值、上行干扰抬升 | SINR<0或抬升>6dB | 速率低、时延大 |
| 容量 | PRB利用率、激活用户数 | PRB>60%判定拥塞 | 感知速率下降 |
| 质量 | CQI<7占比、掉线率 | 占比>20%判定质差 | 视频卡顿、语音断续 |
实际操作时,我给每个栅格打标签:良好区、弱覆盖区、干扰区、容量受限区、质差区。如果一个栅格同时命中多个维度,就按优先级归入最严重的那一类。优先级顺序我一般设为:容量受限>干扰>质差>弱覆盖,因为在城区网络里,容量拥塞会引发干扰和质差,只做覆盖优化根本无效。
栅格评估结果还要和小KPI做交叉验证。某个栅格被标记为干扰区,如果它覆盖的小区同时出现切换成功率下降,就能互相印证;如果KPI完全正常,则可能是栅格统计口径有误,先回头检查采样点过滤条件再做决策。这个交叉验证步骤能筛掉至少三成的假问题,避免把报告里的“红图”全部当成优化工单下发。
4.2 数据导出系统的核心流程与格式设计
数据导出是整个系统里最容易被低估的部分。栅格图在平台里看着很好,但运营商的日报、月报要的是能放进PPT的图片和能二次统计的表格。一套实用的导出系统至少要支持四种产物:栅格矢量数据(GeoJSON/Shapefile)、栅格指标统计表(Excel/CSV)、渲染后专题图(PNG)、以及按模板生成的分析Word/PDF报告。
| 产物 | 推荐格式 | 适用场景 | 关键点 |
|---|---|---|---|
| 栅格矢量 | GeoJSON(默认),Shapefile(需打包) | GIS二次分析与平台间迁移 | 坐标系写进元数据 |
| 统计表 | Excel分sheet / CSV | 报告附表、筛选排序 | 单sheet不超过5万行 |
| 专题图 | PNG,300dpi | 插入报告 | 带图例、比例尺、指北针 |
| 分析报告 | Word/PDF | 交付客户 | 图表与结论联动 |
导出流程我建议做成“查询条件→栅格聚合→样式渲染→导出”四段式。查询条件是区域多边形、时间范围、栅格尺寸、指标组合;聚合阶段在服务端完成,不能把原始MR拉到前端再聚,否则性能和内存都扛不住;渲染阶段决定专题图的配色和标注;导出阶段将矢量数据与统计表一并打包。
我见过最多的问题是“全城导出”式操作:用户直接选全市范围,导出所有栅格,结果是几个G的数据文件,Excel打不开,地图服务也卡死。血泪经验告诉我,导出系统一定要加两个约束:一是按行政区或网格单元分批,二是强制过滤无效栅格(采样点数少于5的栅格直接不导出)。前者保证文件规模可控,后者保证导出数据有统计意义。
4.3 导出模块的代码骨架与关键参数
我用一个Python函数演示导出栅格统计表到Excel的骨架,这套写法同样适用于其他平台,只要把接口换成对应的即可:
import pandas as pd from openpyxl import Workbook def export_grid_stats(bounds, grid_size, time_range, sampling_threshold=5): # bounds: [minLon, minLat, maxLon, maxLat] params = { "bounds": bounds, "gridSize": grid_size, "timeRange": time_range, "minSamplingCount": sampling_threshold, "coordinateSystem": "EPSG:4326" } # 这里调用云瞰平台查询接口,返回栅格聚合结果 rows = query_grid_stats(params) # 返回list[dict] df = pd.DataFrame(rows) # 过滤无效采样点较少的栅格 df = df[df["samplingCount"] >= sampling_threshold] # 分sheet,避免单sheet过载 with pd.ExcelWriter("grid_stats.xlsx", engine="openpyxl") as writer: stats_sheet = df.drop(columns=["polygon"]).copy() stats_sheet.to_excel(writer, sheet_name="栅格指标", index=False) geom_sheet = df[["grid_id", "polygon"]].copy() geom_sheet.to_excel(writer, sheet_name="栅格边界", index=False) summary = { "总栅格数": len(df), "有效栅格数": int((df["samplingCount"] >= sampling_threshold).sum()), "弱覆盖栅格数": int((df["rsrp_lt110_pct"] > 0.2).sum()) } pd.DataFrame(summary.items(), columns=["指标", "数值"]).to_excel( writer, sheet_name="汇总", index=False) return "grid_stats.xlsx"这段代码的关键在于把“栅格指标”和“栅格边界”拆成两个sheet。如果合在一起,几何对象会让Excel体积暴涨,而分开后指标sheet保持为纯数值表,边界sheet可以进一步转GeoJSON。coordinateSystem参数必须显式传递,否则导出到其他GIS工具时,图层位置会整体偏移。
参数调整上,coordinateSystem建议统一用EPSG:4326存储,展示用EPSG:3857投影。栅格尺寸、时间范围和minSamplingCount这三个参数必须在任务创建时锁定并写入元数据,导出时不允许临时改动。这样才能保证不同批次导出的数据在设计上具备可比性,后续做趋势分析时不用重新计算。
5. 栅格级指标分析与图层导出避坑:现象、原因、解决
这一章把我在栅格分析和图层交付里遇到的具体问题集中写出来,每一条都按“现象→原因→解决”记录,希望能帮你少走几段弯路。
5.1 栅格边界漂移与采样点抖动的处理
现象:同一个位置,在6月栅格图里属于“良好区”,到了7月突然变成“弱覆盖区”,但实际网络没有改造,基站参数也没动。 原因:MR采样点的定位结果本身就是概率分布,同一个终端在不同时刻解算出的经纬度会有几十到上百米的抖动。栅格边界是硬切的,一个采样点只要抖动跨过边界,就会改变相邻两个栅格的统计结果,边界栅格的指标因此很不稳定。 解决:先确认栅格尺寸是否过小,小于定位精度一半的栅格直接放弃;然后用空间平滑替代硬边界:每个栅格输出时,把周围相邻3×3栅格的采样点按距离权重一并纳入统计,相当于给栅格图做了一次低通滤波。我一般在平台后处理阶段加一步平滑,能明显减少边界上的突变点。注意平滑会降低峰值,纯弱覆盖定位场景要保留原始栅格副本对比。
5.2 坐标系与图层顺序造成的“看起来不对”
现象:栅格专题层和基站扇区层叠在底图上,栅格整体偏移向东几十米,或者栅格层时隐时现,让不同图层的点状信息无法对应。 原因:最常见的是栅格数据用了EPSG:4326,而底图和基站图层用了EPSG:3857,或者反过来。GIS平台会自动做投影转换,但某些导入接口要求预先指定几何字段的坐标系,一旦没指定,平台默认按WGS84读取,平面坐标就被错误地当作经纬度渲染。 解决:所有图层创建前先明确坐标系,并在脚本里对栅格几何对象统一转换为EPSG:4326存储。验证方法很简单:叠加一个已知精确经纬度的地标点,缩放后看偏移是否小于一个栅格边长。图层顺序问题同理,在自动化脚本里显式设置order,不要依赖底图默认置底。每次新建工程后,先用一个已知小区位置做几何对齐检查,再开始正式分析。
5.3 导出大数据量时的内存与编码问题
现象:按全市范围导出栅格统计表,脚本跑到一半内存爆炸,或者生成的Excel打开要十几分钟,更严重的是导出后经纬度列里的中文和正负号乱码。 原因:按天按栅格按小区三者的笛卡尔积导出行数会非常恐怖。一个中等城市,50米栅格约80万个,按天导出就是几十万行,如果再把小区维度展开,行数直接到千万级。Excel本身的单sheet行数限制是1048576行,并不适合承载这种量级。 解决:导出时强制三个条件:一是按行政区范围拆分导出,单次不超过5万个有效栅格;二是只导出通过采样点阈值的栅格,无效栅格不占体积;三是用Parquet作为中间格式做数据落地,最后再按报告需要转成Excel分sheet或GeoJSON。编码问题统一在导出层用UTF-8处理,Excel模板里保持对UTF-8 CSV的兼容导入,不要直接手写Excel存中文。
5.4 时间口径不一致导致指标对不上
现象:同一栅格,日报计算结果和月报计算结果相差超过3dB,但明明用的是同一版本算法。 原因:日报用的是“昨日全天”,月报用的是“昨日忙时”,或者日报统计到当日凌晨2点,而MR原始表里还有一部分时延数据在凌晨3点才入库,导致日报少统计了一段数据。另外,如果时间字段存的是UTC,而平台展示用的是本地时间,跨时区查询会进一步放大偏差。 解决:统一时间口径为“采集时间入库时间戳对齐到正点”,忙时模板固定为9:00-11:00加上19:00-21:00,禁止在单次任务里手改时间范围。导出时在文件名里自动拼上时间模板ID,例如grid_stats_taskA_20250610.xlsx,让报表使用者一眼看到时间口径来源。
5.5 栅格统计周期切换后的历史数据对比失真
现象:把某区域栅格统计的聚合周期从“按小时”改成“按天”后,与上周数据对比,出现600多个栅格指标突变,现场勘察没有任何变化。 原因:统计周期变化会影响采样点数量,也会改变栅格的聚合结果。例如按小时统计时,忙时和非忙时各自输出独立栅格值;按天统计时,所有时段的采样被混在一起平均,弱覆盖时段被稀释,指标自然对不上。 解决:历史对比必须锁定“同一个统计周期+同一组参数”。我习惯每次导出前先检查任务版本号,如果版本不一致,宁可重新计算旧周期数据,也不要直接拿新旧两期做对比。在报告里,我还会附上一屏“参数指纹”表格,包含栅格尺寸、统计周期、采样阈值、忙时模板、坐标系五个字段,参数一变,结论自动失效。
6. 进阶:把栅格级分析接入日常优化闭环的一个小技巧
栅格分析如果只是用来出一张大图,价值有限。我建议做一个“周级栅格变化检测”:把每周的栅格指标与基线图层自动做差值,只输出变化超过阈值的栅格,再把这些栅格自动汇总成重点核查清单,直接对接工单系统。
具体做法分三步。第一步,每周自动生成当期栅格图层,指标固定为RSRP均值、SINR均值、采样数;第二步,与上月同周基线做差,筛选Delta_RSRP小于-3dB且连续两周出现的栅格;第三步,把这些栅格按行政区域聚类,输出到Excel,每行带栅格ID、中心经纬度、当前值、基线值、差值、覆盖小区列表。这样做的好处是,优化工程师每周不用再从头看全城栅格图,只需要处理变化清单,效率高很多。
def weekly_delta_report(current_df, baseline_df, rsrp_delta=-3.0): merged = current_df.merge( baseline_df[["grid_id", "rsrp_avg", "sinr_avg"]], on="grid_id", suffixes=("_curr", "_base") ) merged["rsrp_delta"] = merged["rsrp_avg_curr"] - merged["rsrp_avg_base"] merged["sinr_delta"] = merged["sinr_avg_curr"] - merged["sinr_avg_base"] flagged = merged[ (merged["rsrp_delta"] < rsrp_delta) & (merged["sinr_delta"] < 0) ].copy() flagged["level"] = pd.cut( flagged["rsrp_delta"], bins=[-999, -10, -5, 0], labels=["严重恶化", "明显恶化", "轻度恶化"] ) flagged.sort_values("rsrp_delta").to_excel( "weekly_grid_delta.xlsx", sheet_name="变化栅格", index=False ) return flagged这段脚本的关键是把“绝对差”和“相对变化”结合使用,只筛掉绝对指标本身正常的栅格。通过pd.cut把变化量分档,报告里就能按严重程度排序处理,不用再人工翻图层判断优先级。
做这个功能时我学到的教训是:变化检测最容易翻车的地方不是算法,而是基线的清洁度。基线图层必须用同一统计周期、同一忙时模板生成,我第一版直接拿历史月报栅格当基线,结果月报的时间口径与周报不一致,全城一半栅格都显示恶化,把所有人都吓了一跳。后来改成重新计算基线,才恢复正常。这个坑给所有想加自动化分析的人提个醒:参数口径永远比算法本身更容易出问题,跑通之后先做三个栅格的本地比对,再放开到全量。希望这套栅格级分析、自定义图层和数据导出的方法能帮到你,让每一张栅格图都能真正推动一次优化动作落地。
本文还有配套的精品资源,点击获取