用Power BI来进行移动网络质量可视化分析

2023-10-31

如果我们有一些按照时间顺序发生的无线网络测量数据,每个测量数据有一个对应的坐标点,那么我们如何利用Power BI来进行可视化分析呢。这里记录一下我的作法。

我的原始数据如下:

Datetime Latitude Longitude CellID Operator NetworkType RSSI RxLevel RSRQ RSRP
2020-11-08 12:12:10
23.120296
113.34134
100910615
CU
LTE
25
-97
-16
-97

 

 

 

 

从数据可以看到,这些测量数据发生在不同的时间点,分布在不同的地点,我们可以利用Power BI来进行可视化的分析,例如在地图上显示不同区域的网络测量值,分析网络测量值的分布,分析在每天不同时间段的测量值的分布等等。

这里我用到了Google的S2地理数据库来进行地理区域的聚合,用时序数据库来进行时间段的聚合。

地理区域的聚合

我打算按照网格来进行聚合,例如把地图切分为200*200米的方格,把每个测量点归属到这个方格里面。

首先我们需要把地图切分为网格,在我之前的博客有介绍,可以利用Turf这个开源的JavaScript来完成。这里给出代码:

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
	<style type="text/css">
		body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
	</style>
    <script src='https://unpkg.com/@turf/turf/turf.min.js'></script>
	<title>turf</title>
</head>
<body>
    <script type="text/javascript">
        var bbox = [113.2078, 23.0797, 113.3766, 23.1591];
        var cellSide = 0.2;
        var options = {units: 'kilometers'};
        var squareGrid = turf.squareGrid(bbox, cellSide, options);
        console.log(squareGrid.features.length);
        console.log(JSON.stringify(squareGrid));
    </script>
</body>

把这个HTML文件放到Web服务器上,然后访问这个文件,在控制台上可以看到网格数据的输出,把这些输出数据拷贝到一个文本文件中,例如guangzhou.geojson

有了网格数据之后,我们处理这个文件,给每个网格赋予一个ID,并稍微修改一下,然后上传到Mapbox网站生成tileset,代码如下:

with open('guangzhou_grids_200m.geojson', 'r') as f:
    grids_content = json.loads(f.read())

i = 0
for feature in grids_content['features']:
    i += 1
    feature['geometry']['type'] = 'MultiPolygon'
    feature['geometry']['coordinates'] = [feature['geometry']['coordinates']]
    feature['properties']['gridid'] = 'grid_'+str(i)

with open('guangzhou_grids_mapbox_200m.geojson', 'w') as f:
    f.write(json.dumps(grids_content))

之后我们用S2来为每个网格生成一个S2Loop的对象,代码如下:

with open('guangzhou_grids_mapbox_200m.geojson', 'r') as f:
    grids_content = json.loads(f.read())

grids_loop = {}
for feature in grids_content['features']:
    coordinates = feature['geometry']['coordinates'][0][0]
    s2points = []
    for point in coordinates[:-1]:
        s2points.append(s2.S2LatLng.FromDegrees(point[1], point[0]).Normalized().ToPoint())
    s2loop = s2.S2Loop(s2points)
    s2loop.Normalize()
    grids_loop[feature['properties']['gridid']] = s2loop

在PG数据库安装TimeScaleDB插件,具体可见官网介绍https://docs.timescale.com/, 在PG上创建一个数据库和数据表,如下:


create database nir;
\c nir
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
CREATE TABLE "nir" (ts TIMESTAMPTZ, lat decimal(9,6), lng decimal(9,6), cellid text, operator text, networktype text, rssi int, rxlevel int, rsrq int, rsrp int, gridid text);

下一步就是把原始测量数据的坐标读出来,用S2来判断是否落在某个网格中,把网格ID也关联的测量数据中,然后把数据写入PG。代码如下:

with open('nir_processed.csv', 'r') as f:
    nir = f.readlines()

newfields = []
for record in tqdm(nir[1:], total=len(nir[1:])):
    fields = record.strip().split(',')
    s2point = s2.S2LatLng.FromDegrees(float(fields[1]), float(fields[2])).ToPoint()
    for gridid in grids_loop:
        if grids_loop[gridid].Contains(s2point):
            fields.append(gridid)
            newfields.append(fields)
            break

conn = psycopg2.connect("dbname=nir user=abc password=123456")
cursor=conn.cursor()

for record in newfields:
    record[1] = float(record[1])
    record[2] = float(record[2])
    record[6] = int(record[6])
    record[7] = int(record[7])
    record[8] = int(record[8])
    record[9] = int(record[9])
    testsql = "insert into nir values('%s', '%f', '%f', '%s', '%s', '%s', '%d', '%d', '%d', '%d', '%s')" \
        %(record[0], record[1], record[2], record[3], record[4], record[5], record[6], record[7], record[8], record[9], record[10])
    cursor.execute(testsql)

conn.commit()
conn.close()

时间段的聚合

数据保存在时序数据库之后,我们就可以按照时间段来聚合了,这里按照每15分钟来进行聚合,并且把RSRP,RSRQ的数值进行分组,把结果写入到一个新的表中,在PG里面输入以下的SQL语句:

create table nir_view as 
    select 
        extract(minute from time_bucket('15 minutes', ts)) as minute, 
        date(ts) as date, 
        cast(extract(hour from ts) as int) as hour, 
        rsrp, 
        rsrq, 
        operator, 
        gridid, 
        (CASE 
            WHEN rsrp<=-44 and rsrp>-65 THEN '(-65,-44]'
            WHEN rsrp<=-65 and rsrp>-75 THEN '(-75,-65]'
            WHEN rsrp<=-75 and rsrp>-85 THEN '(-85,-75]'
            WHEN rsrp<=-85 and rsrp>-95 THEN '(-95,-85]'
            WHEN rsrp<=-95 and rsrp>-105 THEN '(-105,-95]'
            ELSE '(-140,-105]' END
        ) as rsrp_range,
        (CASE 
            WHEN rsrp<=-44 and rsrp>-65 THEN '6'
            WHEN rsrp<=-65 and rsrp>-75 THEN '5'
            WHEN rsrp<=-75 and rsrp>-85 THEN '4'
            WHEN rsrp<=-85 and rsrp>-95 THEN '3'
            WHEN rsrp<=-95 and rsrp>-105 THEN '2'
            ELSE '1' END
        ) as rsrp_level,
        (CASE 
            WHEN rsrq<=-18 and rsrq>-20 THEN '(-20,-18]'
            WHEN rsrq<=-16 and rsrq>-18 THEN '(-18,-16]'
            WHEN rsrq<=-14 and rsrq>-16 THEN '(-16,-14]'
            WHEN rsrq<=-12 and rsrq>-14 THEN '(-14,-12]'
            WHEN rsrq<=-10 and rsrq>-12 THEN '(-12,-10]'
            WHEN rsrq<=-8 and rsrq>-10 THEN '(-10,-8]'
            WHEN rsrq<=-6 and rsrq>-8 THEN '(-8,-6]'
            WHEN rsrq<=-4 and rsrq>-6 THEN '(-6,-4]'
            ELSE '(-4,-2]' END
        ) as rsrq_range,
        (CASE 
            WHEN rsrq<=-18 and rsrq>-20 THEN '1'
            WHEN rsrq<=-16 and rsrq>-18 THEN '2'
            WHEN rsrq<=-14 and rsrq>-16 THEN '3'
            WHEN rsrq<=-12 and rsrq>-14 THEN '4'
            WHEN rsrq<=-10 and rsrq>-12 THEN '5'
            WHEN rsrq<=-8 and rsrq>-10 THEN '6'
            WHEN rsrq<=-6 and rsrq>-8 THEN '7'
            WHEN rsrq<=-4 and rsrq>-6 THEN '8'
            ELSE '9' END
        ) as rsrq_level
    from nir;

 

Power BI报表制作

设计两页报表,一页是分析RSRP的,另外一页是分析RSRQ的。两份报表的布局是一样的。

以RSRP报表为例,里面包括了3个子报表,一个是在地图上按照方格来展示不同区域的RSRP的平均值,一个是按照RSRP的分组来展示其分布,还有一个是按照不同的时间段来展示RSRP的分布。

其中地图报表需要用到Mapbox控件,具体过程和我上一个博客介绍的类似,这里就不再重复了。

最后的效果如下:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Power BI来进行移动网络质量可视化分析 的相关文章

  • OD华为机试 25

    按索引范围翻转文章片段 描述 输入一个英文文章片段 翻转指定区域的单词顺序 标点符号和普通字母一样处理 例如输入字符串 I am a developer 0 3 则输出 developer a am I 输入描述 使用换行隔开3个参数 第一

随机推荐

  • @Cacheable使用详解

    1 功能说明 Cacheable 注解在方法上 表示该方法的返回结果是可以缓存的 也就是说 该方法的返回结果会放在缓存中 以便于以后使用相同的参数调用该方法时 会返回缓存中的值 而不会实际执行该方法 注意 这里强调了一点 参数相同 这一点应
  • QT开发之QLineEdit

    1 设置输入限制 QLineEdit lineedit new QLineEdit this QRegExp rx a zA Z0 9 0 设置为只能输入数字和英文 QRegExpValidator pRevalidotor new QRe
  • vue使用echarts中tooltip自定义显示——使用值params参数详解

    tooltip trigger item formatter a br b c d formatter function params 在此处直接用 formatter 属性 console log params 打印数据 debugger
  • CAN接口芯片MCP2515的波特率和滤波器设置问题

    配置波特率代码 MCP2515ByteWrite CNF1 3 MCP2515ByteWrite CNF2 0x80 PHSEG1 3TQ PRSEG 1TQ MCP2515ByteWrite CNF3 PHSEG2 3TQ 功能 波特率的
  • opencv调用yolov7 yolov7 c++ yolov7转onnx opencv调用yolov7 onnx

    一 YOLOV7主要贡献 主要是现有的一些trick的集合以及模块重参化和动态标签分配策略 最终在 5 FPS 到 160 FPS 范围内的速度和准确度都超过了所有已知的目标检测器 当前目标检测主要的优化方向 更快更强的网络架构 更有效的特
  • 【零基础学QT】第一章 QT安装与工程创建

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • 详解数据库基本概念

    数据库 DataBase 简称 DB 是一个长期存储在计算机内的 有组织的 可共享的 统一管理的大量数据的集合 数据库管理系统 DataBase Management System 简称 DBMS 是一种操纵和管理数据库的大型软件 用于建立
  • C#基础详解

    Excerpt C 是微软公司发布的一种面向对象的 运行于 NET Framework和 NET Core 完全开源 跨平台 之上的高级程序设计语言 C 是一种安全的 稳定的 简单的 优雅的 由C和C 衍生出来的面向对象的编程语言 它在继承
  • 使用 Python 实现斐波那契数列

    介绍 斐波那契数列是一个非常经典的数列 其前两项为 1 从第三项开始 每一项都等于前两项之和 这个数列很有意思 因为它的每一项都是前两项的和 而且越往后 数列中的数字就越大 以至于数列中的第 100 项就是黄金分割比例的倒数 斐波那契数列的
  • 关键词共现分析_结巴分词5--关键词抽取

    1 简介 关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来 这个可以追溯到文献检索初期 当时还不支持全文搜索的时候 关键词就可以作为搜索这篇论文的词语 因此 目前依然可以在论文中看到关键词这一项 除了这些 关键词还可以在文本聚
  • 三分钟教你如何写代码,构建自己的“思维帝国”

    很多人都在抱怨科技行业的知识更新的太快 他们疯狂的追逐新技术 当掌握一门新技术后突然发现 又有更新的技术来了 于是就想逃离这个行业 逃离这些不堪重负的压力 互联网的世界使用代码构建起来的 从事互联网行业就免不了时刻与代码交流 但是 技术永远
  • linux查看端口对应的应用

    根据端口查看对应进程 lsof i 端口 根据进程号PID查看对应应用 ps axu grep 进程号 根据进程号PID查看对应端口 netstat anp grep 进程号
  • 配置maven指定的JDK版本

    配置maven指定的JDK版本 第一种 最省事 在我们安装maven环境的conf目录下修改settings xml文件 如下 在profiles中加入以下配置
  • debian终端tab键无法补全命令,apt install 无法补全

    debian终端无法补全命令 输入apt i 按tab键无法补全install 这很不方便 解决方法 1 安装bash completion 包 2 编辑 etc bash bashrc 3 编辑 etc profile 4 重新登录系统即
  • Mysql和Oracle的语法区别?

    Mysql和Oracle是两种不同的关系型数据库 MySQL通常在中小型应用程序 Web应用程序和小型企业中广泛使用 因为它易于学习和部署 而且成本较低 Oracle数据库通常用于大型企业和复杂的企业级应用程序 因为它提供了高度可扩展性 高
  • DDL数据定义语言

    文章目录 DDL Data Definition Language 数据定义语言 数据库的管理 表的管理 表的创建 表的删除 表的复制 表的修改 DDL Data Definition Language 数据定义语言 DDL其实是Data
  • epoll用法详解与编程实例

    1 epoll使用的三个函数 使用epoll时会用到三个函数 因此把这个三个函数弄明白了 也就明白了epoll的用法 要明白这个三个函数 最重要的就是要明白函数的参数 明白需要什么样的参数以及每一个参数的含义 1 1 epoll creat
  • 你知道花卉识别软件有哪些吗

    随着智能手机的普及 人们的生活越来越离不开这些便捷的小工具 而其中一种常见的应用就是花卉识别软件 花卉识别软件可以通过拍照 上传照片等方式 快速准确地识别出花卉的品种 方便人们了解花卉的名称 特点等信息 你知道花卉识别软件有哪些吗 软件一
  • 数据分析利器:pandas库的奥秘与代码示例

    pandas是Python中一款强大的数据分析库 它提供了数据清洗 数据操作 数据可视化等功能 使得数据分析与处理变得更加高效和便捷 本文将从基本概念 基础知识 高级特性 实战案例和总结五个方面 深入介绍pandas库的用法和技巧 一 基本
  • 用Power BI来进行移动网络质量可视化分析

    如果我们有一些按照时间顺序发生的无线网络测量数据 每个测量数据有一个对应的坐标点 那么我们如何利用Power BI来进行可视化分析呢 这里记录一下我的作法 我的原始数据如下 Datetime Latitude Longitude CellI