Usiłuję sklasyfikować zestaw danych punktowych zakodowanych w czasie GPS na zachowania oparte na różnych atrybutach.
Stworzyłem atrybut, który wynosi 0 dla domu i 1 dla wyjazdu na podstawie lokalizacji, a teraz chcę numerować wyjazdy poza domem (zestaw punktów 01111111111110
to jedna podróż, ponieważ zaczynała się i kończyła w domu). Dodałem pole atrybutu, które będzie miało numery podróży, ale nie wiem, jak obliczyć pole, więc jest ono oparte na polu domu / wyjazdu.
Oto przykład danych GPS (użycie „*” do wskazania nieistotnych informacji i po prostu indeksowanie czasów jako 1, 2 itd.), Opisanego powyżej wskaźnika „Home / Away” oraz pożądanego wskaźnika podróży „Trip”, które muszę obliczyć:
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
....
Mój zestaw danych jest zbyt duży, aby ręcznie przejść i numerować każdą podróż w tabeli atrybutów, więc jest jakiś sposób, aby obliczyć pole na podstawie tego, w jaki sposób uporządkowano atrybut home / away, a każda „grupa” punktów away jest oznaczana jako wyjazd?
Są to gołe kości tego, jak mógłby wyglądać kod Pythona (nie mam doświadczenia z kodem).
Wyrażenie:
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
Po użyciu skryptu Matta Wilkiego dokonałem pewnych zmian, dzięki czemu moja pierwsza podróż to numer 1, moja druga to 2 itd.
Oto kod zmodyfikowany z 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
Następnie wybieram dla domu = 0 i przeliczam pole podróży z powrotem na 0. Starannie uporządkowane wycieczki.
trip
zmienną można ponownie zainicjalizować dowolną liczbę razy.row.TRIP = trip
wiersz w każdym z dwóch bloków, które obsługują początek i koniec podróży. (irows.updateRow(row)
Pomoc ArcGIS 10 w sekcji „Oblicz przykłady pól” pokazuje, jak „Oblicz wartość skumulowaną pola numerycznego”. To załatwi sprawę, pod warunkiem, że dane są fizycznie w zamierzonym porządku czasowym.
Aby zastosować go bezpośrednio, odwróć wskaźnik [Home / Away] (odejmij go od 1), aby „0” oznaczało „away”, a „1” oznacza „home”. Nazywam to [Poza domem / Domem] w poniższym przykładzie.
Oblicz jego wartość skumulowaną - [Skumulowana] w przykładzie.
Dodaj jeden i podziel przez dwa - [Trip] w przykładzie (prawie).
Na koniec ustaw [Trip] na zero dla wszystkich rekordów „home”. Teraz wyniki są zgodne z przykładem:
Dla przypomnienia, oto kod pobrany z pomocy ArcGIS 10. Zmodyfikowałem go nieco, aby działał na każdym kroku naraz: teraz wystarczy go uruchomić. Powinno być jasne, gdzie [Home / Away] zostaje odwrócony i gdzie występuje krok „dodaj 1, podziel przez 2”.
Wyrażenie:
Typ wyrażenia:
Blok kodu:
źródło
t
zostanie zresetowany do zera w pozornie losowych miejscach.