Estou tentando classificar um conjunto de dados de ponto codificado em tempo de gps em comportamentos com base em diferentes atributos.
Criei um atributo que é 0 para casa e 1 para fora com base na localização e agora quero numerar as viagens fora de casa (um conjunto de pontos 01111111111110
seria uma viagem porque começou e terminou em casa). Eu adicionei o campo de atributo que terá os números de viagem, mas não sei como calcular o campo para que ele se baseie no campo de casa / fora.
Aqui está um exemplo dos dados do GPS (usando "*" para indicar informações irrelevantes e simplesmente indexar os tempos como 1, 2 etc.), o indicador "Casa / Fora" descrito acima e o indicador de viagem desejado, "Viagem", que eu preciso calcular:
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
....
Meu conjunto de dados é muito grande para percorrer manualmente e numerar cada viagem na tabela de atributos; portanto, existe alguma maneira de calcular o campo com base em como o atributo home / away é solicitado e cada "grupo" de pontos ausentes é designado como um viagem?
Estes são os ossos básicos da aparência do código Python (não tenho experiência com código).
Expressão:
trip = Reclass(!home!)
Codeblock:
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
Depois de usar o script recomendado de matt wilkie, fiz algumas alterações para que minha primeira viagem seja o número 1, a segunda seja 2, etc.
Aqui está o código modificado de 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
Depois, basta selecionar para casa = 0 e calcular meu campo de viagem de volta a 0. Viagens ordenadas ordenadamente.
trip
variável pode ser reinicializada qualquer número arbitrário de vezes.row.TRIP = trip
linha em cada um dos dois blocos que lidam com o início e o fim da viagem. (e, venha para pensar sobre isso, orows.updateRow(row)
que se seguem, como não há nada para salvar mais lá.)A ajuda do ArcGIS 10 em "calcular exemplos de campo" mostra como "Calcular o valor acumulativo de um campo numérico". Isso funcionará, desde que os dados estejam fisicamente na ordem temporal pretendida.
Para aplicá-lo diretamente, inverta o indicador [Casa / Fora] (subtraia-o de 1) para que "0" signifique "ausente" e "1" signifique "casa". Eu chamo isso de [Fora / Casa] no exemplo abaixo.
Calcule seu valor cumulativo - [Cumulativo] no exemplo.
Adicione um e divida por dois - [Trip] no exemplo (quase).
Por fim, defina [Trip] para zero para todos os registros "residenciais". Agora os resultados concordam com o exemplo:
Para o registro, aqui está o código retirado da ajuda do ArcGIS 10. Eu o modifiquei um pouco para executar cada etapa de uma só vez: agora você só precisa executá-lo. Deve ficar claro onde [Casa / Fora] fica invertido e onde ocorre a etapa "adicionar 1, dividir por 2".
Expressão:
Tipo de expressão:
Bloco de código:
fonte
t
, sendo redefinido para 0 em locais aparentemente aleatórios.