张春成
2023/04/28阅读:19主题:默认主题
细粒度的中国地理数据分析(二)
细粒度的中国地理数据分析(二)
本文对数据进行进一步分析,通过引入另一个地理包,能够提升地图数据的观感。
另外,本文还将涉及 Pandas 和 GeoPandas 的一些细节。
本系列的开源代码可见我的 Github 仓库
https://github.com/listenzcc/China-geometry-landmark[1]
-
细粒度的中国地理数据分析(二)[2] -
Pandas 数据表的 Group 和 Stack[3] -
城市的地块比例图[4] -
城市的聚类分析[5]
-
Pandas 数据表的 Group 和 Stack
本系列的数据表如下图所示,我们关心的是用红框标示出的列,它们分别代表地块面积、城市代码、第一级和第二级的地块名称。接下来,我们将各个城市中不同地块的总面积比例进行统计,统计的方法使用 Pandas 的 Group 和 Stack 方法获得,这两种方法实现方便,语义明确,可以说十分优雅。其核心代码如下,其要点简述如下
-
首先,对 Pandas 的数据表进行 groupby 操作可以实现多级标签,其第一级是城市,第二级是地块种类; -
其次,对 group 再进行 groupby(level=0).sum() 操作是保持第一级标签的前提下,对其余标签进行求和,这样可以得到该城市全部地块的总面积。有了总面积就可以方便地求得各个地块所占的比例; -
最后,按照 Pandas 的语义逻辑来讲,它认为多级标签是 stack 在一起的,因此使用 unstack 方法可以将它“还原”成多列的形式,最后的 .fillna(0) 操作的目的是为了防止有些城市缺乏某种地块里出现 NaN 值。
# Compute land types' ratio in every city for the euluc_table
# It uses the group and upstack method.
# Group into 2-levels index
group = euluc_table.groupby(['City_CODE', 'Level2'])
table = group['F_AREA'].sum()
sum_by_city = table.groupby(level=0).sum()
# Compute the ratios
for c in tqdm(sum_by_city.index, 'Compute every cities'):
v = sum_by_city[c]
table[c] /= v
# Convert the grouped table into matrix format
matrix_formated_dataFrame = table_level2.unstack().fillna(0)

euluc_table

Grouped table

Matrix-formated grouped table
剩下的工作就是从城市代码获取城市边界的地理信息,各个城市的边界信息从以下开源工程处取得,同时我通过合适的查询方法给它构造一个高效的查询方法,形成 GeoPandas 数据。
WaketZheng/adcode[6]
城市的地块比例图
由于我们已经获取了大量城市不同地块的比例,现将它们绘制如下,其中白色区域代表没有数据的区域。另外要提醒的是图中的颜色代表地块面积比例的相对值,而不是绝对值,因此颜色越亮代表该地区更倾向于这种功能,这一点要极其注意。

城市的聚类分析
接下来,我根据每个城市的地块分布,对全国有数据的城市进行聚类分析,聚类结果用彩色表示,白色依旧表示没有数据的城市。聚类结果表明,各个省份的地块倾向具有较强的地域相似性。至于这些地块倾向代表什么意义,我暂时也还没有弄清楚。

参考资料
https://github.com/listenzcc/China-geometry-landmark: https://github.com/listenzcc/China-geometry-landmark
[2]细粒度的中国地理数据分析(二): #细粒度的中国地理数据分析二
[3]Pandas 数据表的 Group 和 Stack: #pandas-数据表的-group-和-stack
[4]城市的地块比例图: #城市的地块比例图
[5]城市的聚类分析: #城市的聚类分析
[6]WaketZheng/adcode: https://gitee.com/waketzheng/adcode/tree/master
作者介绍