将完整的 QUEEN 邻居数组保存到 Pysal 中的 CSV(人口普查块组)

Saving full QUEEN neighbor array to CSV in Pysal (Census Block Groups)

首先让我说,除了 stata .do 文件和 R 中的一些 MCMC,自从 VB 中的 AOL warez group 应用程序以来我还没有编码;所以我很抱歉一开始就在这里惹你们。

我正在写一篇环境正义论文,涉及人口普查区块组级别的人口统计和暴露数据。由于街区组的规模可能相对较小,因此污染源和居住在一个街区组中的人们很容易影响至少一阶邻居。我本来打算成为一个笨蛋,只是通过 FIPS 代码汇总备份,但那只是糟糕的数学。

获得了我想要的 ACS 年的形状文件,首先尝试了 arcGIS,但我没有得到任何结果。然后我阅读了 Pysal 并安装了它

导入的形状文件 运行 所有 216,000 个区块组的(12 小时)皇后邻居分析

在 [52] 中:w.histogram 输出[52]:

[(0, 87), (1, 709), (2, 3634), (3, 16627), (4, 48736), (5, 56952), (6, 42848), (7, 24878), (8, 12646), (9, 6294), (10, 3040), (11, 1515), (12, 759), (13, 432), (14, 233), (15, 128), (16, 85), (17, 44), (18, 34), (19, 20), (20, 21), (21, 13), (22, 8), (23, 7), (24, 6), (25, 1), (26, 3), (27, 1), (28, 2), (29, 1), (30, 2), (31, 1), (32, 0), (33, 2), (34, 0), (35, 1), (36, 1), (37, 1), (38, 0), (39, 0), (40, 0), (41, 0), (42, 0), (43, 0), (44, 0), (45, 0), (46, 1), (47, 0), (48, 0), (49, 0), (50, 0), (51, 0), (52, 0), (53, 0), (54, 0), (55, 0), (56, 0), (57, 0), (58, 0), (59, 0), (60, 0), (61, 1)]

我需要的是一个 .csv(或者老实说,如果我 copy/paste 它在某个地方,任何东西都会做)它通过 FIPS(这应该是 ACS shapefile 用于 ID 的)枚举每个块组及其列表邻居。

如果我能得到这份清单,我可以将它移到我更舒服的环境中。昨晚我坐在那里玩了几个小时,可以在 numpy.savetext 处找到几个裂缝来工作,但它只是一个列,数字以科学计数法存储,因为 FIPS 代码是 12 位数字。有一次它告诉我元组超出了 运行ge,我认为那是我得到的最接近的

我事先相当广泛地搜索了数据本身,否则我保证我不会在这里浪费你的时间。

谢谢, 戴夫

你可以用pysal把W写成一个txt文件。 有许多不同的格式,但 "GAL" 文件是最简单的。

这是一个txt文件,第一行是形状的数量。 那么每条记录就是2行,

id n
id0, id1, ... 

where:
  id is the id of the polygon,
  n is the number of neighbors
  id0 is the id of the first neighbor
  ... and so on

例如:

 3
 0 1
 1
 1 2
 0 2
 2 1
 1

...描述图0-1-2,0有1个邻居(1),1有2个邻居(0, 2),依此类推。

要将您的 W 写入 gal 文件...

>>> W = pysal.queen_from_shapefile("/path/to/shapefile.shp")
>>> out = pysal.open("output.gal", 'w')
>>> out.write(W)
>>> out.close()

注意:id 是偏移量。 0 是第一个多边形,1 是第二个,依此类推。

如果您想 link FIPS 代码的偏移量,您需要自己完成。但是,您可以使用 pysal 以正确的顺序提取 FIPS 代码..

>>> dbf = pysal.open("/path/to/shapefile.dbf", "r")
>>> print dbf.header
[column names, ... ]
>>> FIPS = dbf.by_col("name_of_fips_code_column")
>>> FIPS = map(str, FIPS) #make sure we're writing strings
>>> out = open('fips.txt','w')
>>> out.write('\n'.join(FIPS))
>>> out.close()