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

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签