(数据科学学习手札150)基于dask对geopandas进行并行加速
本文示例代码已上传至我的
Github仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,geopandas作为我们非常熟悉的Python GIS利器,兼顾着高性能和易用性,特别是在其0.12.0版本开始使用全新的shapely2.0矢量计算后端后,性能表现更是一路狂飙。
而我们作为使用者,当然是希望geopandas处理分析矢量数据越快越好。在今天的文章中,我将为大家简要介绍如何基于dask对geopandas进一步提速,从而更从容的应对更大规模的GIS分析计算任务。

2 dask-geopandas的使用
很多朋友应该听说过dask,它是Python生态里非常知名的高性能计算框架,可以针对大型数组、数据框及机器学习模型进行并行计算调度优化,而dask-geopandas就是由geopandas团队研发的,基于dask对GeoDataFrame进行并行计算优化的框架,本质上是对dask和geopandas的封装整合。
dask-geopandas的安装非常简单,在已经安装了geopandas的虚拟环境中,执行下列命令即可:
conda install dask-geopandas -c conda-forge -y
2.1 基础使用
dask-geopandas与geopandas的常用计算API是相通的,但调用方式略有不同,举一个实际例子,其中示例文件demo_points.gdb由以下代码随机生成并写出:
import numpy as np
import geopandas as gpd
from shapely import Point, Polygon
# 生成示例用矢量数据
demo_points = gpd.GeoDataFrame(
{
'id': range(1000000),
'geometry': [
Point(np.random.uniform(0, 90),
np.random.uniform(0, 90))
for i in range(1000000)
]
}
)
# 写出到本地gdb
demo_points.to_file('./demo_points.gdb', driver='OpenFileGDB')
在使用dask-geopandas时,我们首先还是需要用geopandas进行目标数据的读入,再使用from_geopandas()将其转换为dask-geopandas中可以直接操作的数据框对象,其中参数npartitions用于将原始数据集划分为n个数据块,理论上分区越多并行运算速度越快,但受限于机器的CPU瓶颈,通常建议设置npartitions为机器可调度的CPU核心数:
demo_points = gpd.read_file('./demo_points.gdb', driver='OpenFileGDB')
demo_points_ddf = dgpd.from_geopandas(demo_points, npartitions=4)
demo_points_ddf

在此基础上,后续执行各种运算都需要在代码末尾衔接.compute(),从而真正执行前面编排好的运算逻辑,以非矢量和矢量运算分别为例:

2.2 性能比较
既然使用了dask-geopandas就是奔着其针对大型数据集的计算优化而去的,我们来比较一下其与原生geopandas在常见GIS计算任务下的性能表现,可以看到,在与geopandas的计算比较中,dask-geopandas取得了约3倍的计算性能提升,且这种提升幅度会随着数据集规模的增加而愈发明显,因为dask可以很好的处理内存紧张时的计算优化:

当然,这并不代表我们可以在任何场景下用dask-geopandas代替geopandas,在常规的中小型数据集上dask-geopandas反而要慢一些,因为徒增了额外的分块调度消耗。
除了上述的内容外,dask-geopandas还有一些实验性质的功能,如基于地理空间分布的spatial_partitions数据分块策略优化等,待它们稳定之后我会另外发文为大家介绍。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札150)基于dask对geopandas进行并行加速的更多相关文章
- (数据科学学习手札140)详解geopandas中基于pyogrio的矢量读写引擎
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,前不久我在一篇文章中给大家分享 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇
本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...
- (数据科学学习手札44)在Keras中训练多层感知机
一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...
- (数据科学学习手札42)folium进阶内容介绍
一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg
*从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...
- (数据科学学习手札61)xpath进阶用法
一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...
随机推荐
- 逆向学习物联网-网关ESP8266-03软件编程实现
1.技术原理及流程 1) MQTT数据通讯原理 2).网关协议运行状态机 3). 主程序流程 2.关键程序代码实现 MDK集成开发环境的搭建,大家可以百度搜索,或者参考感知层的软件设计部分. 1) ...
- Java-token生成
1. 引入jar包 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt< ...
- 网络IO模型_01
4种情况: 1.输入操作:等待数据到达套接字接收缓冲区: 2.输出操作:等待套接字发送缓冲区有足够的空间容纳将要发送的数据: 3.服务器接收连接请求:等待新的客户端连接请求的到来: 4.客户端发送连接 ...
- noi 1.1 5 输出保留12位小数的浮点数
描述 读入一个双精度浮点数,保留12位小数,输出这个浮点数. 输入 只有一行,一个双精度浮点数. 输出 也只有一行,保留12位小数的浮点数. 样例输入 3.1415926535798932 样例输出 ...
- NOIP2015 pj
达成成就!--尝试不看题解的情况下用cpp打完了一套NOIP pj 题目全部在luogu上-- P2669 金币 题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第 ...
- go理论知识总结
基于const常量理解个中类型的内存分配引入参考 官方:Constant expressions may contain only constant operands and are evaluate ...
- 廖雪峰JS知识点整理——快速入门
基本语法 1.每个语句以:结尾. 2.单行注释://... 3.多行注释:/*... ...*/ 数据类型和变量 运算 1.==自动转换数据类型在比较,不推荐使用 2.===不会转换数据类型,推荐使用 ...
- 字符流---->字符过滤流 缓冲流 : -----> printWrite用法:和BufferedReader用法
printWrite用法:1.创建字符节点流FileWriter fw = new FileWriter("Files\\bufchar.txt");2创建字符过滤流 PrintW ...
- 十大经典排序之基数排序(C++实现)
基数排序 也是采用分桶的思想,但是加入了按位比较的思想(可以理解为每位进行一次计数排序) 思路: 计算数列中最大位数 按位数循环处理每位的排序 代码实现: #include<iterator&g ...
- Unity 转小游戏
填写appid 和游戏资源位置 在导出的项目里可以修改游戏资源位置 两个目录 minigame 是小程序打开的目录 webgl 是要下载的的资源 下载一个http 服务器就有了 和JS交互 大部分js ...