Saya mencoba untuk mengklasifikasikan seperangkat data titik yang dikodekan waktu menjadi perilaku berdasarkan atribut yang berbeda.
Saya telah membuat atribut yang 0 untuk rumah dan 1 untuk jauh berdasarkan lokasi, dan sekarang ingin menghitung perjalanan jauh dari rumah (satu set poin 01111111111110
akan menjadi satu perjalanan karena dimulai dan berakhir di rumah). Saya telah menambahkan bidang atribut yang akan memiliki nomor perjalanan, tetapi tidak tahu cara menghitung bidang sehingga didasarkan pada bidang home / away.
Berikut adalah contoh data GPS (menggunakan "*" untuk menunjukkan informasi yang tidak relevan dan hanya mengindeks waktu 1, 2, dll.), Indikator "Home / Away" yang dijelaskan di atas, dan indikator perjalanan yang diinginkan, "Perjalanan", yang perlu saya hitung:
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
....
Kumpulan data saya terlalu besar untuk dilalui secara manual dan nomor setiap perjalanan dalam tabel atribut, jadi apakah ada cara untuk menghitung bidang berdasarkan pada bagaimana atribut home / away dipesan dan setiap "rumpun" dari poin jauh ditetapkan sebagai perjalanan?
Ini adalah tulang telanjang dari apa yang tampak seperti kode Python (Saya tidak berpengalaman dengan kode).
Ekspresi:
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
Setelah menggunakan skrip yang direkomendasikan matt wilkie saya telah membuat beberapa perubahan sehingga perjalanan pertama saya adalah nomor 1, yang kedua adalah 2, dll.
Berikut adalah kode yang dimodifikasi dari matt:
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
Kemudian saya tinggal pilih home = 0 dan hitung field perjalanan saya kembali ke 0. Perjalanan yang tertata rapi.
trip
variabel dapat diinisialisasi ulang setiap kali sewenang-wenang.row.TRIP = trip
baris di masing-masing dari dua blok yang menangani awal dan akhir perjalanan. (dan, kalau dipikir-pikir itu,rows.updateRow(row)
yang mengikuti, karena tidak ada yang menyelamatkan di sana lagi.)Bantuan ArcGIS 10 dalam "menghitung contoh bidang" menunjukkan kepada Anda cara "Menghitung nilai akumulatif dari bidang numerik." Ini akan melakukan trik, asalkan data secara fisik dalam urutan temporal yang dimaksud.
Untuk menerapkannya secara langsung, balikkan indikator [Home / Away] Anda (kurangi dari 1) sehingga "0" berarti "jauh" dan "1" berarti "rumah". Saya menyebutnya [Jauh / Rumah] dalam contoh di bawah ini.
Hitung nilai kumulatifnya - [Kumulatif] dalam contoh.
Tambahkan satu dan bagi dua - [Perjalanan] dalam contoh (hampir).
Terakhir, atur [Trip] ke nol untuk semua catatan "rumah". Sekarang hasilnya setuju dengan contoh:
Sebagai catatan, inilah kode yang diambil dari bantuan ArcGIS 10. Saya memodifikasinya sedikit sehingga akan melakukan setiap langkah sekaligus: sekarang Anda hanya perlu menjalankannya. Seharusnya jelas di mana [Home / Away] terbalik dan di mana langkah "tambah 1, bagi 2" terjadi.
Ekspresi:
Jenis Ekspresi:
Blok Kode:
sumber
t
akan diatur ulang ke 0 di tempat-tempat yang tampaknya acak.