用于重新划分数据的地理空间工具包

maup的Python项目详细描述


maup

构建状态codecovpypiconda forge package

maup是用于重新划分数据的地理空间工具包。一揽子计划精简了 处理块、区域和 地区,如

该项目的优先事项是通过在任何时候使用空间索引来提高效率 有可能与周围现有的生态系统很好地结合 熊猫熊猫有型地。包裹已分发 在麻省理工学院的许可下。

安装

我们建议从conda forge安装maup 使用conda

conda install -c conda-forge maup

你可以通过安装 miniconda,一个免费的python 专门为数据科学和科学计算制作的发行版。你 也可以考虑水蟒 包括许多您可能会发现有用的数据科学软件包。

要从pypi安装maup,请从终端运行pip install maup。

示例

下面是一些基本情况,您可能会发现maup有帮助。为了这些 例如,我们使用罗德岛州普罗维登斯的测试数据,您可以在 我们的 罗德岛Shapefiles回购协议,或 在本回购协议的示例文件夹中。

>>>importgeopandas>>>importpandas>>>>>>blocks=geopandas.read_file("zip://./examples/blocks.zip")>>>precincts=geopandas.read_file("zip://./examples/precincts.zip")>>>districts=geopandas.read_file("zip://./examples/districts.zip")

将辖区分配给地区

maup中的assign函数接受两组称为源的几何图形 并返回一个pandas系列。该系列将每个几何图形映射到 到覆盖它的目标中的几何体。(这里,几何a如果a的每个点及其边界位于b或 边界)如果源几何体不被一个目标覆盖几何,它 分配给覆盖其最大部分区域的目标几何体。

>>>importmaup>>>>>>assignment=maup.assign(precincts,districts)>>># Add the assigned districts as a column of the `precincts` GeoDataFrame:>>>precincts["DISTRICT"]=assignment>>>assignment.head()07152133641dtype:int64

另外,还可以使用赋值对象创建 gerrychain分区 代表这个地区计划。

将块数据聚合到区域

选区形状文件通常带有选举数据,而不是人口统计数据。 为了研究他们的人口统计学,我们需要从 人口普查一直到辖区一级。我们可以通过将块分配给 然后用一只熊猫收集数据 groupby 操作:

>>>variables=["TOTPOP","NH_BLACK","NH_WHITE"]>>>>>>assignment=maup.assign(blocks,precincts)>>>precincts[variables]=blocks[variables].groupby(assignment).sum()>>>precincts[variables].head()TOTPOPNH_BLACKNH_WHITE05907886380156369241301265495844699360094351053449621563713

如果要将数据从一组几何图形移动到另一组几何图形,但要移动源 并且目标几何图形嵌套不整齐(即有重叠),请参见 单元嵌套不整齐时按比例分配数据

将数据从区域分解为块

通常情况下,数据的比例较粗,需要附加到 更精细的缩放几何体。通常情况下,当某个 选举只在县级报告,我们想附上这些数据 到区域几何。

假设我们要按比例分配"pres16d"列中的投票总数, "pres16r"从我们的区域到我们的块。 第一个关键的步骤是决定我们要如何分发辖区的数据 去里面的街区。既然我们按比例分配选举数据 使用块的总人口或投票年龄人口。我们可以这样做 按人口比例分配("totpop"):

>>>election_columns=["PRES16D","PRES16R"]>>>assignment=maup.assign(blocks,precincts)>>>>>># We prorate the vote totals according to each block's share of the overall>>># precinct population:>>>weights=blocks.TOTPOP/assignment.map(precincts.TOTPOP)>>>prorated=maup.prorate(assignment,precincts[election_columns],weights)>>>>>># Add the prorated vote totals as columns on the `blocks` GeoDataFrame:>>>blocks[election_columns]=prorated>>># We'll call .round(2) to round the values for display purposes.>>>blocks[election_columns].round(2).head()PRES16DPRES16R00.000.00112.261.70215.202.62315.502.6743.280.45

关于面积插值的警告

我们强烈建议您不要按区域按比例分配!人口普查区的面积是 不是一个很好的人口预测因子。事实上,两者之间的关系 另一个方向:较大的人口普查区块比较小的人口区块要少。

单元嵌套不整齐时按比例分配数据

假设您有一个选区的形状文件,其中包含一些选举结果数据和 您希望将该数据加入到另一个更新的区域形状文件中。 两组区域将重叠,并且不会像 在上面的例子中,街区和地区是这样做的。(不是那些街区和地区 总是整齐地嵌套…

我们可以使用maup.intersections将这两组区域分割成碎片 两套都很整齐。然后我们就可以从旧的区域中分离出来 在这些碎片上,从这些碎片聚集到新的区域。这个 move有点复杂,所以maup提供了一个称为prorate的函数 就这么做。

我们将使用相同的geodataframe来估计 按比例分配的零件。

对于我们的"新选区"形状文件,我们将使用罗德岛的VTD形状文件 美国人口普查局在2018年为 2020年人口普查。

>>>old_precincts=precincts>>>new_precincts=geopandas.read_file("zip://./examples/new_precincts.zip")>>>>>>columns=["SEN18D","SEN18R"]>>>>>># Include area_cutoff=0 to ignore any intersections with no area,>>># like boundary intersections, which we do not want to include in>>># our proration.>>>pieces=maup.intersections(old_precincts,new_precincts,area_cutoff=0)>>>>>># Weight by prorated population from blocks>>>weights=blocks["TOTPOP"].groupby(maup.assign(blocks,pieces)).sum()>>># Normalize the weights so that votes are allocated according to their>>># share of population in the old_precincts>>>weights=maup.normalize(weights,level=0)>>>>>># Use blocks to estimate population of each piece>>>new_precincts[columns]=maup.prorate(...pieces,...old_precincts[columns],...weights=weights...)>>>new_precincts[columns].head()SEN18DSEN18R0752.051.01370.021.0297.017.03585.074.04246.020.0

固定重叠和间隙

区域形状文件通常是通过将 不同县或不同年份的区域几何结构。作为一个 结果,shapefile在 不同的来源对界限有不同的看法。这些间隙和重叠的姿势 当您对使用 选区,不仅仅是在绘制选区地图。这个相邻信息是 尤其是在研究再划分时,因为地区几乎是 总是希望是连续的。

maup提供功能用于在 几何图形集合。例如,我们将两个函数都应用于 具有重叠和间隙的几何图形:

有间隙和一些重叠的四个多边形

通常实际形状文件中的间隙和重叠很小,很容易丢失,但是 这个夸张的例子将有助于说明功能。

首先,我们将使用shapely从头开始创建多边形:

>>>fromshapely.geometryimportPolygon>>>geometries=geopandas.GeoSeries([...Polygon([(0,0),(2,0),(2,1),(1,1),(1,2),(0,2)]),...Polygon([(2,0),(4,0),(4,2),(2,2)]),...Polygon([(0,2),(2,2),(2,4),(0,4)]),...Polygon([(2,1),(4,1),(4,4),(2,4)]),...])

现在我们将缩小差距:

>>>without_gaps=maup.close_gaps(geometries)>>>without_gaps0POLYGON((00,20,21,11,12,02,00))1POLYGON((20,40,42,22,20))2POLYGON((02,22,24,04,02))3POLYGON((21,41,44,24,21))dtype:object

没有间隙的几何图形如下:

四个多边形,两个重叠

然后解决重叠:

>>>without_overlaps_or_gaps=maup.resolve_overlaps(without_gaps)>>>without_overlaps_or_gaps0POLYGON((00,20,21,11,12,02,00))1POLYGON((20,40,42,22,20))2POLYGON((02,22,24,04,02))3POLYGON((21,41,44,24,21))dtype:object

不带U重叠或U间隙的几何图形如下:

four squares

两个函数resolve_overlapsclose_gaps都接受 相对阈值参数。此阈值控制间隙或 重叠函数将尝试修复。的默认值 相对阈值0.1,这意味着函数将保持独立 面积大于几何图形面积10%的任何间隙/重叠 可能会吸收这种差距/重叠。在上面的例子中,我们设置 相对阈值=无以确保不忽略间隙或重叠。

可修改的面积单位问题

此包的名称来自 可修改的区域单元问题(maup): 相同的空间数据看起来会有所不同,这取决于您如何划分 空间。因为maup都是关于改变数据聚合的方式 分区后,我们以maup命名它,以鼓励用户使用 认真负责的工具包。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java从arraylist元素调用方法   开关案例中的java错误。。。代码不返回任何内容   在TeamCity:Task:app:processDebugResources上使用Gradle进行构建时java失败   Android Studio的java Gradle同步(SDK)问题   小程序中的java Tic Tack Toe游戏:图像不工作   火柴ABC12;10;250.3使用regexjava   java如何在任务栏的系统托盘中隐藏JFrame   java ListProperty<T>与ObjectProperty<ObservableList<T>>   java如何将resultset数据转换为我的对象。以下是数据的格式   JavaJSF2和oracle   java Junit和EasyMock意外失败   使用java从生成的xml文档中删除xml声明   使用high ResultSet时某些表的java ArrayIndexOutOfBoundsException。fetchSize()   java检测点击按钮   while循环不会结束(Java)   java如何通过JUNIT将数据与文件进行比较?   hadoop Hive Java API寄存器JAR