Сохранение полного массива соседей QUEEN в CSV в Pysal (группы блоков переписи)

Позвольте мне начать с того, что, кроме файла stata .do и некоторого MCMC в R, я не кодировал со времен группового приложения AOL warez в VB; поэтому я извиняюсь за то, что с самого начала возился со всеми вами.

Я пишу документ по экологической справедливости, работая с демографическими данными и данными о воздействии на уровне переписных блоков. Поскольку группы блоков могут быть относительно небольшими по размеру, источник загрязнения и люди, живущие в одной группе блоков, могут легко воздействовать, ПО КРАЙНЕЙ МЕРЕ, на соседей первого порядка. Я собирался быть тупицей и просто выполнить резервное копирование с помощью кода FIPS, но это просто плохая математика.

Получил файл формы для года ACS, который я хочу, сначала попробовал arcGIS, но ничего не добился. Затем я прочитал о Pysal и установил его

импортированный шейп-файл провел (12 часов) анализ соседей ферзя для всех 216 000 групп блоков.

В [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 использует для идентификатора) и это список соседей.

Если я получу список, я смогу перенести его в более удобную среду. Прошлой ночью я сидел и играл с ним часами и смог заставить работать пару трещин в numpy.savetext, но это был только один столбец, а числа хранились в экспоненциальном представлении, потому что коды FIPS состоят из 12 цифр. Однажды он сказал мне, что кортеж находится вне досягаемости, и я думаю, что это было самое близкое, что я получил.

Я заранее тщательно искал только сами данные, иначе обещаю, что не буду здесь тратить ваше время.

Спасибо, Дэйв


person Dave O'Donnell    schedule 19.04.2016    source источник


Ответы (1)


Вы можете записать W в текстовый файл с помощью pysal. Существует множество различных форматов, но файл «GAL» является самым простым.

Это текстовый файл, первая строка — количество фигур. Каждая запись состоит из 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 в гал файл...

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

Примечание. Идентификаторы являются смещениями. 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()
person Charles    schedule 19.04.2016
comment
О, чувак, ты мой чертов герой. Получил W в .gal, вставил в excel и просто подавил четные, а затем шансы, чтобы все выровнять, вставив коды FIPS в том же порядке прямо сейчас. Я действительно не могу отблагодарить вас достаточно. - person Dave O'Donnell; 20.04.2016
comment
я только что исправил пример кода... не забудьте вызвать out.close() в файле fips.txt, иначе он может быть усечен. - person Charles; 20.04.2016
comment
Я заставил его работать так же, как это было. Я просто взял .gal и поместил его в Excel, затем подавил каждую вторую строку, вставил в новый лист, сделал то же самое с альтернативной строкой, затем вставил оба столбца напротив столбца fips (цифра 12 на самом деле была GEOID в .dbf). Они оба были одним и тем же nRow, так что, думаю, я прав. Я просто использую команду =INDEX в excel, чтобы сопоставить перечисление соседей со столбцом fips. Когда я закончу, я возьму пару случайных образцов и проверю карту, чтобы убедиться, что все выстроено правильно. - person Dave O'Donnell; 22.04.2016
comment
Хотя у меня есть один вопрос. Если бы мне пришлось вернуться назад и выполнить расчет соседей по ладье, есть ли способ получить соседей и какой-то тип веса, связанный с длиной границы, которую они разделяют? Еще раз большое спасибо. Я вышел из зоны комфорта, пытаясь извлечь эти данные. Тем не менее, общепризнано, что геопространственная регрессия — лучший способ попытаться добиться справедливости в отношении окружающей среды. Это казалось хорошим способом окунуться в детский бассейн. Очень признателен. Дэйв - person Dave O'Donnell; 22.04.2016
comment
Да, общие_периметрические_веса PySAL поддерживаются через модуль contrib, что означает, что требуются дополнительные зависимости (в данном случае стройные). github.com/pysal/pysal/blob/master/pysal/ contrib/, для запуска install shapely и в вашем скрипте Python: from pysal.contrib.shared_perimeter_weights import spw_from_shapefile и так далее. Вы захотите сохранить их как .gwt, чтобы сохранить значение веса. - person Charles; 22.04.2016
comment
Потрясающий. Я поиграл с этим и нахожусь в процессе привязки некоторых демографических переменных и переменных SES к информации, содержащейся в .dbf (путем взятия соседей ладьи после добавления кодов FIPS, добавления данных, а затем обращения по идентификатору полигона) я собираюсь попытаться сохранить измененный файл как .dbf - я смотрел параметр Spatial Lag в документации pysal. Надеясь получить вес для населения, один для % меньшинства и один для % низкого дохода. Хотелось бы иметь возможность умножать их на вес параметра. Будет возиться с этим. Спасибо еще раз - person Dave O'Donnell; 23.04.2016