“可视化”的数据分析落伍了?
作为一名程序员兼职业余空间数据分析师,空间数据的处理一直是一抹挥之不去的乌云。虽然GIS软件可视化的操作界面、包罗万象的功能,已经能解决日常工作中几乎所有问题,但对于身为程序员的我来说,一切不能用键盘上26个字母解决的问题,都是不科学的~所以这些年我一直致力于思考一个问题,如何把Arcgis的功能,用代码的方式实现。
我了解到,Geopandas是一个极好的工具,今天我们就以一个案例来管窥一二。
数据准备&任务明确
我有一张上海的街镇地图,一份上海的房源数据和一份上海餐厅数据。
今天,我们需要制作每一个房源的1KM缓冲区,计算缓冲区内有多少家餐厅,并且计算上海每个街镇内有多少家餐厅,然后绘制在地图上展示。
这是一个理论上简单但操作繁琐的过程,有些同学可能已经知道GIS的操作:
导入地图数据——导入两份EXCEL——并关联经纬度——获得点数据——并保存点数据图层——然后对房源点数据进行缓冲区制作——保存缓冲区图层——分别使用空间关联把餐厅数据关联到上海街镇和房源缓冲区图层中——并分别保存图层……
好了好了,我已经说不下去了,我们来看看代码怎么解决吧~
导入数据
先导入各种包
import pandas as pd
import geopandas as gpd
from shapely import geos
from shapely.geometry import Point
import fiona
import matplotlib.pyplot as plt
from fiona.crs import from_epsg,from_string
我们来观察下python中用到的地理处理工具包的名字:Geopandas. 顾名思义,这个包可以让我们像使用pandas一样处理地理数据,大家可以想象一下这过程,一定如丝般顺滑!
Geopandas其实是各种地理数据分析包的集大成者,包括shapely,Fiona等,当然还有数据分析相关的包numpy,pandas,所以,在这些提及的包中的功能,都可以混合使用,切换不留痕迹。这里就一并导入了。
导入地图shp
shanghai_map = gpd.GeoDataFrame.from_file('./上海街镇/上海街镇.shp') #读取shapfile数据为geodataframe格式
Geopandas提供了一种数据格式叫GeoDataFrame,用直白的话概括就是DataFrame加了一列数据,表达地理信息。导入功能Geopandas底层调用的是Fiona包,所以,一些基本参数和可以导入的数据格式,可以参考Fiona的说明文档。
查看导入后的数据
和DataFrame如出一辙,但多了一列Geometry来存放地理信息,绘图看一下:
嗯!是长这样!
接下来,导入房源和餐厅数据
*这两份数据是CSV格式,导入成DataFrame,我们发现数据中含有经纬度字段,我们可以根据这两个字段,也把数据转换成GeoDataFrame格式
通过经纬度转换点数据:
def point_to_geo(df,lon,lat):
df['geometry'] = gpd.GeoSeries(list(zip(df[lon],df[lat]))).apply(Point) #识别经纬度,转换点数据
df = gpd.GeoDataFrame(df) #转换Geodataframe格式
df.crs = {'init':'epsg:4326'} #定义坐标系WGS84
del df[lon]
del df[lat]
return df
house_data = point_to_geo(house_data,'lon_WGS','lat_WGS') #转换Geodataframe格式
restaurant_data = point_to_geo(restaurant_data,'lon_WGS','lat_WGS') #转换Geodataframe格式
*官方文档请看这里:
绘图,看看成功与否——以上海街镇为底图,两份点数据叠加在底图上
base = shanghai_map.plot(color='lightyellow',edgecolor='black',figsize=(15, 15)) #画底图
restaurant_data.plot(ax=base,marker='o', color='green', markersize=5) #在底图上叠加餐厅点数据
house_data.plot(ax=base,marker='o', color='red', markersize=5) #在底图上叠加房源点数据
plt.gca().xaxis.set_major_locator(plt.NullLocator())#去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator())#去掉y轴刻度
plt.savefig('./map.png',dpi=400) #保存图片
*这里设置下图形的基本参数,画图功能是基于matplotlib,所以它的一些写法和功能是通用的。
显示OK,那么就进入核心环节~
分析过程
在制作缓冲区和空间关联之前,先需要对图形进行投影变换,这里仍然写一个函数:
def wgs84_to_CGCS2000(df,code):
result = df.to_crs(from_epsg(code))
return result
shanghai_map_pcs = wgs84_to_CGCS2000(shanghai_map,4549)
house_data_pcs = wgs84_to_CGCS2000(house_data,4549)
restaurant_data_pcs = wgs84_to_CGCS2000(restaurant_data,4549)
*只要知道投影坐标系的ESPG代码,就可以任意转换,我们使用GSC2000坐标系。
接着,构建缓冲区图层,使用buffer()方法,参数为缓冲区的半径。
house_data_buffer = house_data_pcs.buffer(1000) #建立一公里缓冲区
base = shanghai_map_pcs.plot(color='lightyellow',edgecolor='black',figsize=(15, 15))
house_data_buffer.plot(ax=base,color='gray', markersize=5,alpha=0.5)
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y轴刻度
plt.savefig('./map2.png',dpi=400) #保存图片
构建完成,同样输出成地图查看效果:
增加了透明度,我们可以看到市中心的房源密度较高。生成的数据为GeoSeries,数据为缓冲区的地理信息。这里需要使用任意方法把地理信息和其他字段匹配在一起。
buffer_temp = house_data_pcs[['name','geometry']]
buffer_temp['geometry'] = house_data_buffer
house_data_buffer = buffer_temp
下面,我们使用空间关联,连接餐厅点数据,并获取餐厅的个数。
spacial_join_restaurant = gpd.sjoin(house_data_buffer,restaurant_data_pcs,how='left',op='contains') #空间连接
spacial_join_restaurant = spacial_join_restaurant.groupby(['name']).count()['title'].to_frame().reset_index() #聚合计算个数
spacial_join_restaurant.columns = ['name','restaurant_count'] #更改列名,方便操作
buffer_result = pd.merge(house_data_pcs,spacial_join_restaurant,left_on='name',right_on='name',how='left') #字段匹配
*方法是sjoin(),功能和GIS相同,分相交,包含和被包含三种。我们使用包含进行连接,并使用pandas的groupby()方法分组计数。
这样我们就完成了空间关联和计算,我们可以使用地图显示,并添加图例:
base = shanghai_result.plot(column='restaurant_count', cmap='Oranges',scheme = 'fisher_jenks'
,legend=True,edgecolor='black',figsize=(15, 15)) #按个数多少叠加底色
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y轴刻度
plt.savefig('./map3.png',dpi=400) #保存图片
这样就可以绘制出以街镇为单位的点密度图:
最后,我们需要把数据导出保存。我们可以保存为shapfile格式,这里推荐大家直接保存为csv格式,方便分享。也可以根据需要,转成任意格式。
shanghai_result = wgs84_to_CGCS2000(shanghai_result,4326) #转换成地理坐标系
shanghai_result.columns = ['town','region','geometry','restaurant_count'] #更改列名为英文,因为数据保存对中文支持不佳
buffer_result = wgs84_to_CGCS2000(buffer_result,4326) #转换成地理坐标系
shanghai_result.to_csv('./result/shanghai_result.csv') #保存成csv
shanghai_result.to_file('./result/shanghai_result.shp') #保存成shapfile
buffer_result.to_csv('./result/buffer_result.csv') #保存成csv
buffer_result.to_file('./result/buffer_result.shp') #保存成shapfile
结果检查
我们把保存的数据导入Arcgis,可以正常使用~太棒了!
是不是很实用呢?所以,对于空间数据分析中一些重复操作,工程化的作业,建议大家可以考虑用代码实现,高效,便捷。
作者简介:本文作者数据侠倪家禹,城市数据团特约撰稿人,数据分析师(Python)微专业学员,喜欢用数据挖掘生活中的小秘密。对数据研究有着敏锐的洞察力,善于把复杂的问题简单化,简单的问题流程化。希望大家通过数据感受生活的魅力。
声明:本文为作者投稿,版权归其个人所有。
热 文 推 荐
☞ 「傻瓜」才能写出好代码!
☞ 漫画 | 从搬家到容器技术 Docker 应用场景解析
☞ Hacker News 12 月招聘趋势:React 已连续霸榜 19 个月
☞ 从倾家荡产到身价百亿,这个85后只用了8年
☞ 难逃寒冬裁员的“大追杀”,30 岁女码农该何去何从?
☞ OpenStack 2018 年终盘点
拼多多黄峥给陆奇“兼职”,欲挖掘这类AI人才
☞ 老程序员肺腑忠告:千万别一辈子靠技术生存!
print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
喜欢就点击“好看”吧!
“可视化”的数据分析落伍了?相关推荐
- python如何读取mat文件可视化_python 数据分析--数据可视化工具matplotlib
说明: 数据可视化中的数据集下载地址:(数据来源:从零开始学python数据分析和挖掘) 链接:https://pan.baidu.com/s/1zrNpzSNVHd8v1rGFRzKipQ 提取码: ...
- 《Microsoft Power BI数据可视化与数据分析》之超市运营数据分析
14.3.1 各省份销售额柱形图 在"字段"窗格中,将"销售额"字段拖到画布上的空白区域,然后将"省/自治区"字段拖动到"可视化 ...
- 可视化大数据分析系统
可视化大数据分析系统有很多,如果系统级都是收费的,如果大家想要了解可视化大数据分析系统,私信我就行.下面聊下5个常用的大数据可视化分析工具. 1.FineReport FineReport是一款纯Ja ...
- c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...
Dexplot:建议准备学matplotlib和seaborn的数据可视化新手或者数据可视化爱好者食用 适用于长数据 比如网站用户留言的统计 特色是不用matplotlib 而用pandas导入数据( ...
- python分析股票数据_Python数据可视化——股票数据分析
1.背景 GAFATA,它表示的是GOOGLE,AMAZON,FACEBOOK,APPLE,TENCENT,ALIBABA这六家互联网巨头的首字母缩写.本文主要分析GAFATA这六家公司股票近一年的的 ...
- python数据分析与可视化-Python数据分析与数据可视化
数据分析.数据挖掘与数据可视化是一个古老的话题,并非什么新生事物.近些年来,借助于计算机软硬件的飞速发展,数据分析.挖掘.可视化相关理论和技术在各领域的应用更是有了质的飞跃.饭店选址.公交路线与站牌规 ...
- python从mongodb里取出数据进行可视化_Python数据分析及可视化实例之MongoDB增删改查...
1.MongoDB安装 有时候度娘还是给力的,相反一些博客的安装方法则显得凌乱: 最初使用Win7安装经常会出现意料不到的错误, 比如开机启动服务,服务器日志等. 上面链接安装步骤简单,没有炫技的成分 ...
- 应用Tableau、Vertica的可视化大数据分析框架
大数据分析.企业BI.数据可视化等话题在坛子里日趋火热,新的技术,架构也层出不穷,今天借此文跟大家分享一款大数据下的联机分析(ROLAP)解决方案,它应用了当前主流的数据可视化工具Tableau及列存 ...
- python数据生成可视化_Python数据分析:手把手教你用Pandas生成可视化图表
大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂,想要搞明白并非易事.但自从Python进入3.0时代以后, ...
最新文章
- Citrix XenServer@cloudstack基本功能测试报告2
- win10分辨率不能调整_图文介绍win10系统使用hdmi连接电视的处理方法
- 向io设备发出中断请求_人们常说的计算机设备管理是什么,深入解读计算机设备管理...
- CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
- 关于realarm210 realarmTest.apk不能直接安装问题解决方法
- pixhawk position_estimator_inav.cpp思路整理及数据流
- OpenGL.Tutorial15_Lightmaps
- 如何在博客中插入背景音乐
- JQuery Datatables 动态配置参数异步加载数据
- Python小白的数学建模课-07.选址问题
- 大一计算机在线考试,大一计算机考试题(含答案).pdf
- 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
- java位图去重_Redis系列(3) Bloom/BitMap/Geo
- android 缩放组件,Android控件之ZoomControls缩放控件
- android进阶(一)Activity加载模式
- webpack5学习与实战-(九)-区分开发和生产环境的配置
- 【C++】error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]
- STM32固件库点灯
- 回顾2017、展望2018
- linux鼠标切换窗口的快捷键设置,Xshell中如何设置鼠标快捷键
热门文章
- Eigen3卸载与重装
- 统计xml文件中的标签出现框数及出现过的图片数
- leetcode python3 简单题232. Implement Queue using Stacks
- linux系统安装自主分区,Linux系统的安装(自动引导安装、网络安装、分区选择)...
- leetcode 合并数组
- Gnome 3.x 安装悬浮菜单栏
- 2021年中国仪表阀市场趋势报告、技术动态创新及2027年市场预测
- 为什么 MapReduce 再次流行起来了?
- 大场面试必问:秒杀90%Java面试者,后悔没有早点知道!
- 小米集团国际总部落地深圳;国美电器创始人黄光裕出狱;TiKV 4.0 发布 | 极客头条...