百度迁徙数据是一种常用的互联网数据,它通常被用于分析城市联系度、城市网络结构等研究中。在公众号之前的文章【数据获取】百度迁徙数据里,我们详细介绍了该数据,并在文末贴出了获取百度迁徙数据的方法。但是,用该方法获取的数据并不便于我们使用。
那么今天小编就以文章【可视化图表】和弦图——以百度迁徙数据制作人口流动图为例作为案例,来给大家仔细讲解一下百度迁徙数据是如何处理的吧!
有需要数据处理代码和示例数据的小伙伴可以在后台回复"迁徙"领取哦!
一.原始数据样式
我们需要的原始数据分为俩种,一种是各个城市的迁入迁出数据,我们以北京市迁入来源地的数据为例,该数据第一列为城市代码,第二列为北京市人口迁徙的来源地,第三列往后则是每个城市每天迁入北京市人口占北京市总迁入人口的比值。理论上来说,从第三列开始,每列的和都为100,但由于城市数目的不完全统计或者数据存在误差,最终只是接近值,不过这里我们可以不用去管它。
这个数据对应的就是百度迁徙的右侧栏数据,如下图:
那么,我们拿到的第二种数据就是城市迁入迁出规模指数,该数据代表着一天内城市迁入迁出的规模总数,不同城市间可以横向对比。该数据的数据结构其实与上面的表格数据近似,但是从第三列起,每个单元格的值都是迁入迁出规模总数而不是比值。
该数据对应了百度迁徙数据下侧栏数据,如下图:
那么,我们了解了这俩个数据之后,该如何处理呢?让我们继续往下看吧!
二.数据如何处理
在【可视化图表】和弦图——以百度迁徙数据制作人口流动图为例里面我们其实提到了数据如何处理这个问题,让我们一起再来看一下:
简单地说,如果想用北京市的迁入来源地数据,我们需要将北京市迁入来源地每日的比值都乘以当日北京市的迁入规模总数,如下图:
那么,知道了要处理成什么样子之后,具体该如何处理呢?这里我们需要的是大湾区的数据,那么大湾区包括了11个城市,首先需要我们选取出这11个城市的表格,而后把每个表里的这11个城市提取出来,进行乘法运算。再然后,还要将春节前一周的数据提取出来,做一个聚合,最后只要各城市一周总的迁入值就好了。这个过程用excel去操作无疑十分困难,所以我们接下来开始用python去处理。
1.首先,引入我们需要使用的python包与文件,path1下放置了全国各城市的迁入迁出数据。
import os
import pandas as pd
path1=r".前100排行榜数据 2021年春运市级"
path2=r".百度迁徙规模指数城市迁入规模指数.xlsx"
2.创建一个大湾区城市名称的列表。
city_list=['香港特别行政区','澳门特别行政区','广州市','深圳市','珠海市','佛山市','惠州市','东莞市','中山市','江门市','肇庆市']
3.我们希望写一个代码就可以既处理迁入数据也可以处理迁出数据,所以我们在这里设置一个变量type_name='迁入来源地',后续更改它就可以处理迁出数据了。
4.遍历path1文件夹,通过循环和判断将大湾区各城市的迁入数据筛选出来,并用pandas读取。
for filename in os.listdir(path1):
for city in city_list:
if city in filename and type_name in filename:
df=pd.read_excel(path1+'/'+filename)
5.创建一个指定长度的日期索引,并格式化成数据表头相同的格式,方便从横跨俩年的数据中选取我们所需要的日期。
dates = pd.date_range(start='2021-02-05', end='2021-02-11')
dates = dates.strftime('%Y%m%d')
6.创建一个空的Dataframe表ds,按时间列表进行循环,将每日的数据计算后保存空表中,最后从370个城市中筛选出大湾区的11个城市的值。
ds=pd.Dataframe()
ds[[type_name]] = df[[type_name]]
for i in dates:
i=int(i)
ds[i]=df[i]*float(dv[dv['城市']==city][i])*1000
ds=ds[ds[type_name].apply(lambda x:x in city_list)]
7.将计算后的数据行列转换,首行为该城市迁入来源的各个城市名称,首列为截取的日期。
df1 = ds.stack()
df2 = df1.unstack(0)
df2.columns = df2.iloc[0]
df2=df2.reset_index()
df2=df2.drop(0)
8.将该城市的一周的数据聚合,并按行添加到空的DF表中,循环城市名称,将11个城市的数据均添加到DF中。
df2['index']=city
df3=df2.groupby(by=['index']).sum().reset_index()
DF=DF.append(df3)
9.结束循环后,将DF表的的行重命名、排序、储存。
DF.rename(columns={'index':type_name+"城市列"},inplace=True)
DF=DF.sort_values(type_name+"城市列")
DF.to_excel('20210205-20210211大湾区'+type_name+'.xlsx',index=0)
10.最后得到的数据如下图所示,是一个矩阵。如果我们想用迁出的数据去做,只需要更改type_name就可以了。
那么到这一步,数据就初步处理完成了。
但是一般来说,矩阵数据不便于使用,我们需要将它转为一维表格。这里我们可以继续用python去做,也可以使用之前文章【可视化图表】桑基图——以土地利用转移矩阵的可视化表达为例里教过的方法,利用逆透视表去操作。
最后得到部分数据如下:
我们再用迁出数据对比一下:
可以发现数据除了涉及香港澳门地区的数据迁出都为0外,其它城市之间的数据大致相似,因为一个城市A从城市B迁入的人数本就应该等于城市B迁出城市A的人数,不完全相等可能是误差以及一些其它因素。那么,数据处理到该格式的时候就可以直接使用了,用它做OD、和弦图等联系图表都十分容易。
在这里得提醒大家一句,之前推文【可视化图表】和弦图——以百度迁徙数据制作人口流动图为例里和弦图所给的样例数据是不正确的,我们这里用正确的数据做俩张图看一看。
可以看到除了个别城市数据有误外,和弦图的形状大体一致,说明数据处理过程是没有问题的。
那么本文到这里就结束了,有需要数据处理完整代码和示例数据的小伙伴可以在后台回复"迁徙"领取哦!
END>
公众号后台回复关键词
迁徙
可直接获取代码
想加数据交流群的小伙伴可以
扫描下方二维码
加小黄鸭为好友后拉入微信群哦



