百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

“可视化”的数据分析落伍了

toyiye 2024-06-21 12:20 9 浏览 0 评论

作为一名程序员兼职业余空间数据分析师,空间数据的处理一直是一抹挥之不去的乌云。虽然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)微专业学员,喜欢用数据挖掘生活中的小秘密。对数据研究有着敏锐的洞察力,善于把复杂的问题简单化,简单的问题流程化。希望大家通过数据感受生活的魅力。

声明:本文为作者投稿,版权归其个人所有。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码