Я пытаюсь классифицировать набор данных точек, закодированных по времени в gps, в поведение на основе различных атрибутов.
Я создал атрибут, который равен 0 для дома и 1 для выезда, в зависимости от местоположения, и теперь хочу подсчитать количество поездок вне дома (набор точек 01111111111110
будет одной поездкой, потому что она началась и закончилась дома). Я добавил поле атрибута, в котором будут номера поездок, но не знаю, как рассчитать поле, поэтому оно основано на поле дома / на выезде.
Ниже приведен пример данных GPS (с использованием «*» для обозначения нерелевантной информации и простого индексации времени как 1, 2 и т. Д.), Индикатора «Home / Away», описанного выше, и индикатора требуемой поездки «Поездка», который мне нужно вычислить:
Time Lat Lon Home/Away Trip
1 * * 0 0
2 * * 1 1
3 * * 1 1
....
12 * * 1 1
13 * * 0 0
14 * * 0 0
15 * * 1 2
16 * * 1 2
....
34 * * 1 2
35 * * 0 0
36 * * 0 0
37 * * 1 3
....
Мой набор данных слишком велик для того, чтобы вручную проходить и пронумеровывать каждую поездку в таблице атрибутов, поэтому есть ли способ рассчитать поле на основе того, как упорядочен атрибут home / away, и каждый «скопление» точек выезда обозначается как поездка?
Это голая основа того, как может выглядеть код Python (я не разбираюсь в коде).
Выражение:
trip = Reclass(!home!)
кодоблок:
def Reclass(home):
if (home = 0):
return 0
elif (home = 1 and lastValue = 0):
return _(incremental numbering?)_
elif (home = 1 and lastValue = 1):
return lastValue
После использования рекомендованного сценария Мэтта Уилки я внес некоторые изменения, так что моя первая поездка - номер 1, моя вторая - 2, и т. Д. И т. Д.
Вот код, модифицированный из Matt's:
import arcpy
rows = arcpy.UpdateCursor("test2")
trip = 0
for row in rows:
if row.home == 0:
prev = row.home
row.TRIP = trip
rows.updateRow(row)
elif row.home == 1 and prev == 0:
trip += 1
prev = row.home
row.TRIP = trip
rows.updateRow(row)
rows.next()
elif row.home == 1 and prev == 1:
prev = row.home
row.TRIP = trip
rows.updateRow(row)
rows.next()
row.TRIP = trip
rows.updateRow(row)
del row, rows
Затем я просто выбираю home = 0 и вычисляю поле моего путешествия обратно до 0. Точно упорядоченные поездки.
trip
переменная может быть повторно инициализирована любое произвольное количество раз.row.TRIP = trip
строку в каждом из двух блоков, которые обрабатывают начало и конец поездки. (и, если подумать, то,rows.updateRow(row)
что следует, так как больше там нечего спасать.)Справка ArcGIS 10 в разделе «Рассчитать примеры полей» показывает, как «Рассчитать накопительное значение числового поля». Это поможет, если данные физически находятся в заданном временном порядке.
Чтобы применить его напрямую, инвертируйте индикатор [Home / Away] (вычтите его из 1), чтобы «0» означало «отсутствующий», а «1» означало «домашний». Я называю это [Away / Home] в примере ниже.
Вычислите его совокупную стоимость - [Накопительная] в примере.
Добавьте один и разделите на два - [Trip] в примере (почти).
Наконец, установите [Trip] на ноль для всех «домашних» записей. Теперь результаты согласуются с примером:
Для справки вот код, взятый из справки ArcGIS 10. Я немного изменил его, чтобы он выполнял каждый шаг сразу: теперь вам нужно всего лишь запустить его. Должно быть ясно, где инвертируется [Home / Away] и где происходит шаг «добавить 1, разделить на 2».
Выражение:
Тип выражения:
Блок кода:
источник
t
он сбрасывается до 0 в, казалось бы, случайных местах.