2

首先让我说,除了 stata .do 文件和 R 中的一些 MCMC 之外,自从 VB 中的 AOLwarez 组应用程序以来,我就没有编码过;所以我很抱歉在这里和你们一起混日子。

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

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

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

在[52]中:w.histogram Out[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(或者老实说,如果我在某处复制/粘贴它,任何事情都会做),它通过 FIPS 枚举每个块组(这应该是 ACS shapefile 用于 ID 的内容)及其邻居列表。

如果我能拿到清单,我可以把它移到我更舒服的环境中。昨晚我坐在那里玩了几个小时,并且可以在 numpy.savetext 上得到一些破解来工作,但它只有一列,并且数字以科学计数法存储,因为 FIPS 代码是 12 位数字。有一次它告诉我元组超出范围,我认为这是我得到的最接近的

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

谢谢你,戴夫

4

1 回答 1

1

您可以使用 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 是第二个多边形,以此类推。

如果您想将偏移量链接到 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()
于 2016-04-19T19:31:43.450 回答