2019FME博客大赛——为数据而生的FME - 腾讯人口迁徙数据爬取与分析-程序员宅基地

技术标签: 腾讯  FME博客大赛  互联网  博客大赛  大数据  

参赛单元:互联网、大数据及云计算

作者:刘啸

单位:上海垣观数据科技有限公司

 

随着信息技术的发展,大数据的概念越来越引发人们的关注,各种有关于城市的新数据类型也不断涌现,为客观认识城市系统并总结其发展规律提供了重要机遇。本文结合腾讯人口迁徙数据爬取与分析案例,不仅展示了如何利用FME进行支撑城市规划决策的数据分析,也展示了以FME为核心的从数据获取、数据清洗、数据分析、数据可视化等全生命周期的数据组织和管理流程。

各城市之间的人口迁入迁出热度数据分析是了解城市的发展布局,中心城市和城市群带动区域的发展情况,以及各个区域之间的互动情况的常用分析,也经常被应用于区域规划,城市战略规划以及总体规划中。而此类的分析如果用FME来做基本上可以做到零代码,用FME内置的一些转换器,拖拖拽拽就可以实现。

 

腾讯人口迁徙数据获取

在做数据分析之前首先要考虑的问题就是数据从何而来。对于人口迁徙数据一般来源有手机信令数据(移动,联通,电信),APP数据(百度,腾讯,TD等),但是这些数据一般都需要购买,而且价格高昂,如果只是想做一些小的研究,不愿意购买,可以自己动手去爬取腾讯位置大数据网站的人口迁徙数据(https://heat.qq.com/qianxi.php)。

当我们在日期栏中选择好日期,并在搜索框中输入想要查看的城市,比如上海,就可以看到指定的日期迁入迁出上海的数据。除了查看综合了飞机、火车和汽车三种不同交通方式的迁徙热度数据,还可以分别查看飞机、火车和汽车三种不同交通方式的迁徙热度。如果我们打开开发者工具,可以很容易的发现当我们搜索时所调用的接口,所以只要我们掌握了这个接口各个参数的含义,就可以通过FME的HTTPCaller转换器直接调用这个接口,从而得到我们想要的数据。

通过分析这个接口我们发现当我们在切换不同的交通方式,迁入迁出,日期还有城市的时候发现变化的只有三个部分(具体如下图所示)。第一个部分为日期,第二个部分为城市代码,第三个部分代表了不同的交通方式和迁入迁出数据。所以我们只要按照我们的需求替换掉相应的部分就可以了。

这三个参数中,最容易获取的应该就是日期还有不同交通方式的代码这两个参数了,那我们如何去获取城市代码呢。当然获取城市代码的途径有很多,直接百度的话都会出来很多结果,但是如果贸然采用其他来源的城市代码的话可能会发现与腾讯位置大数据网站的城市代码不一致,从而造成我们抓取的时候数据会有遗漏。所以我们最好能够采用腾讯位置大数据网站自身的城市代码。

在我们打开腾讯位置大数据网站的时候,服务器除了会传回我们需要的人口迁徙热度数据,还可发现一个叫做city.js的文件,而这个文件中就恰好包含了我们需要的城市代码,所以我们在去调用人口迁徙热度数据接口之前需要先把这个文件的城市代码解析出来。

同样的,我们可以直接用HTTPCaller就可以了。这里要注意的就是在Response Body Attribute一栏中要选择utf-8。因为在city.js的头文件中并没有标示编码信息。

解决了城市代码的问题接下来要解决的就是日期问题,腾讯位置大数据网站的数据是从2015年2月3日开始到现在的每天更新的数据,如果我们需要把它的数据全都抓取下来的话,我们需要获取从2015年2月3日到现在每一天的日期。首先需要用到的是DataTimeCalculator转换器来计算开始日期到终止日期之间的时间间隔,

然后用利用DataTimeCalculator的Add or Subtract Interval模式进行累加,依次得到从2015年2月3日到现在每一天的日期。这里用到了一个简单的循环。

最后就是第三个参数迁徙模式和迁入迁出的信息,基本可以总结为下表:

参数

含义

参数

含义

16

总的迁出

06

总的迁入

13

飞机迁出

03

飞机迁入

12

火车迁出

02

火车迁入

11

汽车迁出

01

汽车迁入

所有参数都搞清楚以后接下来就可以直接通过HTTPCaller调用接口就可以了。

https://lbs.gtimg.com/maplbs/qianxi/@Value(_result_datetime)/@Value(code)16.js?callback=JSON

这里还是建议用一个循环,这样可以保证在网络不是特别好,返回400的时候依然不会漏掉数据。

返回的结果中跟在城市后面的那一列就是联系热度值了

Tips:

1、迁徙量是腾讯修改后的数值,不是具体的人数,也无法确认真实性。

2、每个城市只有前十名城市的的迁徙数据,当然即使是这种情况,当我们把所有城市汇总在一起的时候,数据依然可以反映一些现象。

3、有些城市在某些日期不存在迁徙数据,当我们用相应的参数调用接口的时候,会返回空值。

数据预处理

当我们拿到数据之后,首先需要把一些返回空值的结果筛选掉,然后就是需要把我们下载到的数据解析出来,最后就需要把它空间化,也就是给数据添加坐标信息。

数据解析-永远学不会的正则

因为我们调用接口得到的数据并不是标准的json格式,所以在我们利用JSONFragmenter或者JSONFlattener之前需要把它转换成标准的json格式。因为FME提供了很多便利工具,所以方法还是很多的,这里推荐一个比较简便的方法就是通过StringSearcher把符合JSON格式的部分提取出来。然后再用JSONFragmenter把各个城市的信息分离。我这里为什么要强调永远学不会的正则呢,是因为正则确实很强大,但是也很繁琐,而恰恰FME提供了相当多的便利工具,让我们可以忘掉繁琐的正则表达式,比如StringReplacer,AttributeSplitter等等。根据我的实践经验,对于正则表达式,我们只要能够把“(.*)”最多再加上“?”和“/d”用好就基本上可以解决绝大多数问题了。

对于添加坐标信息的方法可以分为两种:

第一种就是利用腾讯位置大数据网站自身的数据,也就是我们之前从city.js这个文件中获取的数据。

这个数据中我们可以看到除了城市的名字,还有三列数据,其中第三列应该就是城市代码,而前两列应该就是X与Y坐标了。这里要注意的是我们如果直接把这两列数据作为XY坐标,会得到一个颠倒的结果。具体如下图所示。

所以如果我们希望能够把它翻转过来,只需要在Y坐标前面加一个“负号”就可以了。

最终我们得到了下面的结果。

但是这个坐标明显不是我们常用的wgs84,gcj02等,需要我们进行空间矫正才能使用。在city.js中我们可以得到374个城市点,首先我们需要选取一些点作为参考点,并找到这些参考点的wgs84坐标或者gcj02的坐标。比如下图所示的上海北京广州等城市。

这些城市的中心点坐标可以通过百度坐标拾取系统(http://api.map.baidu.com/lbsapi/getpoint/index.html)或者高德坐标拾取系统(https://lbs.amap.com/console/show/picker)或者干脆通过百度,高德或者腾讯地图来获取。

当然通过百度获取的坐标为bd09,通过高德或者腾讯地图获取的坐标为gcj02。选取的参考点尽量均匀分布,选取的点越多矫正的越准确。

然后通过AffineWarper进行仿射变换。

最终就可以得到我们所需坐标系下的城市中心点了。

第二种方法就是通过高德、百度API或者官方的全国行政区划信息查询平台(http://xzqh.mca.gov.cn/map)来获取每个城市的中心点。然后再利用FeatureMerger与腾讯位置大数据网站获取的city.js里的城市进行匹配,从而得到我们所需的城市点坐标信息。

Tips:

1、尽量采用第一种方法。

2、如果需要用第二种方法,建议用百度的API,因为百度的数据更新非常及时,而且位置准确。高德数据更新不是很及时,全国行政区划信息查询平台的数据更新及时,但是位置有偏差。

数据分析与建模

准备好数据之后,接下来就可以做分析了。针对于人口迁徙数据所做的分析比较常见的有两类,第一类依然是看各个城市之间的人口迁徙联系强度,但是我们可以选取不同的范围,比如单个城市的人口迁入迁出情况,分省份或者城市群的各城市之间的人口迁徙联系强度,选取典型城市比如一线城市,二线城市等之间的人口迁徙联系强度,或者全国各个城市之间的人口迁徙联系强度。

                                                                            上海迁出日均联系强度

                                                                            长三角各城市人口迁徙联系强度

                                                                                全国各城市人口迁徙联系强度

也可以选取不同的时间,比如选取春节期间的数据进行分析。

                                                                               全国春节期间人口迁徙联系强度

第二类的分析为城市的网络分析,比如城市空间网络的聚类。因为FME中并没有此类现成的算法,但是我们可以通过FME准备好数据再利用Gephi来做。本文中对于第二类分析就不再进行展开。

单个城市迁入迁出情况均值计算

这一类的分析最简单,在我们准备好数据之后只要利用Aggregator进行汇总计算就可以了。如果计算2018年各个城市迁入上海市的联系热度总量和均值(总的热度值除以天数),需要设置的参数主要有Group By设置为迁入城市的名称,Attribute to Sum设置为联系热度值,如果我们除了联系热度的总量和均值还想保留其他一些特征值,比如最大值,还可以在这里创建一个联系热度值列表,方便我们后面提取最大值。

当然我们还可以生成一个EXCEL表格,方便我们创建一些图表。如下图的上海市日均迁出联系热度图表。

 

区域城市人口迁徙联系热度总量和均值计算

我们有的时候需要看一下某个区域里哪些城市与其他城市联系热度值比较大,哪些城市联系热度值比较小。

与单个城市相比没有太大的本质区别,主要就是需要从全国的各个城市中把我们需要区域内的城市筛选出来。FME里的Tester转换器就可以非常方便的实现这个功能,比如下图中就是把长三角的上海市,江苏省,浙江省和安徽省的城市筛选出来。

当然除了筛选城市,也可以筛选时间。比如下图中就是我们筛选出春节假期前三天到后三天总共13天数据的Tester参数设置。

同样的,我们还是可以把额外输出一个EXCEL,方便做统计图表。如下图所示。

 

区域城市人口迁徙联系强度计算

区域城市人口迁徙联系热度总量和均值计算和单个城市比如果依然还是分别从迁入和迁出来看的话,无非就是范围变大了,但是从区域上来讲,我们可能更希望能够把迁入和迁出热度综合在一起,这样来反映各个城市之间的联系强度。那么我们最主要需要解决的问题就如何如何将A城市到B城市的人口迁徙热度和B城市到A城市的人口迁徙热度加到一起。这里的方法也并不唯一,一般情况下需要写一些脚本,这里主要介绍一个不需要写任何代码的方法。

主要思路为我们构造一个数列,然后分别为每一个城市赋一个数列中的值,这个数列必须满足让A+B=B+A,而且A+B的值还不能等于任何其他两个城市的值相加的和。也就是说这个数列里任何两个数相加都是唯一值。那真的有这么神奇的数列吗,有的。很多人首先想到的应该就是神奇兔子数列了(斐波那契数列),当然我们也可以用一个更简单一点的也就是2的n次方。

给每个行的迁入城市和迁出城市都赋值以后,让他们相加,然后再根据这个相加得到的值进行分组求和就可以了。当然这里注意在分组的时候要先加上日期。

数据可视化

很多用过FME的人都会说FME并不是很擅长做可视化,而我在这里把数据可视化单独也列出来,并不是反驳这个观点,只是想表达现在可以做数据可视化的工具很多,不管是图表的还是地图的。这些工具很方便,做出来的可视化结果也很漂亮,但是如果想用好这些现成的可视化工具,FME依然是不可或缺的。因为虽然这些现成的工具都很方便,但是他们也会给出很多限制条件。比如基本的字符编码,还有需要哪些字段等等。这些条件往往最让人头疼。而如果把数据可视化的数据准备工作交给FME来做的话,这项工作就会变得异常惬意。

本次文章里大部分的图纸都是用极海的平台来做的,接下来也以极海的平台为例。比如我们希望能够做一个OD图。

极海的平台中对于我们上传的点数据会有【OD线】这个选项,我们选中【OD线】以后还需要的字段有O点的XY坐标,D点的XY坐标,还有就是我们用来表示人口迁徙热度的字段。所以我们只要在FME中构建好这些字段就好了。

而且现在很多类似的数据平台也开放了各类API接口,比如极海就提供了数据,几何分析,可视化等一系列接口(https://geohey.com/site/dev/api/data)。

所以当数据发生变化,我们甚至都不用再重新上传数据,再重新做可视化了,直接利用FME调用这些接口,就可以做数据更新和维护了。相应的可视化结果也会得到更新。

FME Server的使用

近期我也向安图申请了一个FMEserver的试用权限,对于以上所提到的一些分析,我已经将他们标准化,并上传到我自己服务器里的FMEserver,可以支持计算任意范围,任意时间段的城市人口迁徙热度。下图所示为单个城市人口热度计算FMEserver的界面,用户登录后,只需要填写一个CITY NAME参数就可以计算指定城市的人口迁徙热度总量和均值,计算完成后结果会直接在浏览器中弹出下载链接,或者发送到用户所填写的邮箱中。

如果想试一下这些功能可以联系我所要账号密码,我的邮箱为[email protected]。因为我的FMEserver试用权限到4月底就到期了,所以此服务也只能在4月底之前可用。

后记

从接触FME到现在已经快5年的时间了,我的体会就如题目所示,FME就是为数据而生的。它已经深深的影响了我的生活,可以说让我从一位规划师正在转变成了一位数据分析师,我当然也希望FME可以给更多的人带来帮助。对于这篇文章的一些案例和知识,我也是经过一些考量的,我觉得它们并不会很难,所以真心希望这篇文章可以带领大家进入FME的怀抱。如果大家有什么关于FME使用的问题和心得,也欢迎跟我交流。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fmechina/article/details/88858286

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法