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

智能推荐

王斌老师的博客_王斌 github-程序员宅基地

文章浏览阅读480次。http://blog.sina.com.cn/s/blog_736d0b9101018cgc.html_王斌 github

ACM OJ Collection_htt//acm.wydtang.top/-程序员宅基地

文章浏览阅读737次。原文来自:http://blog.csdn.net/hncqp/article/details/4455263 ACM OJ Collection(排名不分先后):中国:浙江大学(ZJU):http://acm.zju.edu.cn/北京大学(PKU):htt_htt//acm.wydtang.top/

ios 自己服务器 苹果支付_修复苹果IOS支付-程序员宅基地

文章浏览阅读467次。更新记录1.0.0(2019-07-01)插件简介专门用来修复苹果IOS支付时出现"您已购买此App内购买项目。此项目将免费恢复"。问题描述首先在IOS平台里面创建“APP内购买项目”,选择的是“消耗型项目”,然后用uni-app官方的支付api进行支付,多支付几次,有时候就会出现提示“您已购买此App内购买项目。此项目将免费恢复”,特别是在沙盒测试里面支付很大几率出现,我明明选的是消耗型项目,应..._ios开发苹果支付恢复权益

spring MVC mock类单元测试(controller)_mvcmock-程序员宅基地

文章浏览阅读5.6k次。Spring从J2EE的Web端为每个关键接口提供了一个mock实现:MockHttpServletRequest几乎每个单元测试中都要使用这个类,它是J2EE Web应用程序最常用的接口HttpServletRequest的mock实现。MockHttpServletResponse此对象用于HttpServletRespons_mvcmock

【我的世界Minecraft-MC】常见及各种指令大杂烩【2022.8版】_summon生成掉落物-程序员宅基地

文章浏览阅读8.5k次,点赞7次,收藏22次。execute as @a at @s run clear @s minecraft:dark_oak_planks{display:{Name:“{“text”:“第三关[阴森古堡]”,“color”:“red”,“italic”:false}”,color:“16711680”},Enchantments:[{id:“protection”,lvl:1}],Unbreakable:1b} 1。Lore:[“{“text”:“免费”,“color”:“blue”,“italic”:false}”]..._summon生成掉落物

CentOS 7安装教程(图文详解)_centos 安装-程序员宅基地

文章浏览阅读10w+次,点赞487次,收藏2.1k次。CentOS 7安装教程: 准备: 软件:VMware Workstation 镜像文件:CentOS-7-x86_64-bin-DVD1.iso (附:教程较为详细,注释较多,故将操作的选项进行了加粗字体显示。) 1、文件--新建虚拟机--自定义 2、..._centos 安装

随便推点

Github项目分享——免费的画图工具drow,前端插件化面试_draw github画图-程序员宅基地

文章浏览阅读333次,点赞3次,收藏3次。项目介绍一款很好用的免费画图软件,支持ER图、时序图、流程图等等在项目的releases就可以下载最新版本同时支持在线编辑。_draw github画图

如何开始学习人工智能?入门的学习路径和资源是什么?_人工智能学习路径-程序员宅基地

文章浏览阅读930次。嗨,大家好!如果你对人工智能充满了好奇,并且想要入门这个领域,那么你来对地方了。本文将向你介绍如何从零基础开始学习人工智能,并逐步掌握核心概念和技能。无论你是大学生、职场新人还是对人工智能感兴趣的任何人,都可以按照以下学习路径逐步提升自己。_人工智能学习路径

Unity3D 导入资源_unity怎么导入压缩包-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏8次。打开Unity3D的:window-asset store就会出来这样的界面:我们选择一个天空纹理,注意这里的标签只有一个,如果有多个就会显示所有标签的内容:找个比较小的免费的下载一下试试,比如这个:下载以后:点击import就会出现该窗口:然后再点击最底下的import:就导入到我们这里来了。从上面可以切换场景:..._unity怎么导入压缩包

jqgrid 服务器端验证,javascript – jqgrid服务器端错误消息/验证处理-程序员宅基地

文章浏览阅读254次。在你以前的问题的the answer的最后一部分,我试着给出你当前的问题的答案.也许我表示不够清楚.您不应该将错误信息放在标准成功响应中.您应该遵循用于服务器和客户端之间通信的HTTP协议的主要规则.根据HTTP协议实现网格中的加载数据,编辑行和与服务器的所有Ajax通信.每个HTTP响应都有响应第一行的状态代码.了解这个意义非常重要.典型的JSON数据成功请求如下HTTP/1.1 200 OK...._decode message error

白山头讲PV: 用calibre进行layout之间的比对-程序员宅基地

文章浏览阅读4k次,点赞8次,收藏29次。我们在流片之后,通常还是有机会对layout进行局部小的修改。例如metal change eco或者一些层次的局部修改。当我们修改之后,需要进行与之前gds的对比,以便确认没有因为某些..._calibre dbdiff

java exit方法_Java:如何测试调用System.exit()的方法?-程序员宅基地

文章浏览阅读694次。问题我有一些方法应该在某些输入上调用567779278。不幸的是,测试这些情况会导致JUnit终止!将方法调用放在新线程中似乎没有帮助,因为System.exit()终止了JVM,而不仅仅是当前线程。是否有任何常见的处理方式?例如,我可以将存根替换为System.exit()吗?[编辑]有问题的类实际上是一个命令行工具,我试图在JUnit中测试。也许JUnit根本不适合这份工作?建议使用互补回归测..._检查system.exit