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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签