Ho un dataframe con coordinate pixel consecutive in righe e colonne 'xpos', 'ypos' e voglio calcolare l'angolo in gradi di ogni percorso tra pixel consecutivi. Attualmente ho la soluzione presentata di seguito, che funziona bene e per la dimensione del mio file è abbastanza veloce, ma l'iterazione attraverso tutte le righe sembra non essere il modo per farlo. So come applicare una funzione a colonne diverse e come applicare le funzioni a diverse righe di colonne, ma non riesco a capire come combinarle entrambe.i panda applicano la funzione a più colonne e più righe
ecco il mio codice:
fix_df = pd.read_csv('fixations_out.csv')
# wyliczanie kąta sakady
temp_list=[]
for count, row in df.iterrows():
x1 = row['xpos']
y1 = row['ypos']
try:
x2 = df['xpos'].ix[count-1]
y2 = df['ypos'].ix[count-1]
a = abs(180/math.pi * math.atan((y2-y1)/(x2-x1)))
temp_list.append(a)
except KeyError:
temp_list.append(np.nan)
e poi inserire la lista di temperatura in df
EDIT: dopo aver implementato la punta dal commento che ho:
df['diff_x'] = df['xpos'].shift() - df['xpos']
df['diff_y'] = df['ypos'].shift() - df['ypos']
def calc_angle(x):
try:
a = abs(180/math.pi * math.atan((x.diff_y)/(x.diff_x)))
return a
except ZeroDivisionError:
return 0
df['angle_degrees'] = df.apply(calc_angle, axis=1)
ho confrontato i il tempo di tre soluzioni per il mio df (la dimensione del df è di circa 6k di righe), l'iterazione è quasi 9 volte più lenta di quella applicata, e circa 1500 volte più lenta di allora enza applica:
tempo di esecuzione della soluzione di iterazione, compresa inserimento di una nuova colonna ritorna df: 1,51s
tempo di esecuzione della soluzione senza iterazione, con diffusa: 0.17s
tempoesecuzione di risposta accettata da EdChum utilizzando diff(), senza iterazione e senza applicare: 0.001s
suggerimento: nON utilizzare iterazione o applicare e alwa cercate di utilizzare il calcolo vettoriale;) non solo è più veloce, ma anche più leggibile.
Per iniziare è possibile calcolare la differenza come 'df ['xpos'].shift() - df ['xpos'] 'invece di fare questa riga, allora puoi calcolare l'angolo usando la tua funzione sull'intera colonna – EdChum
Ho aggiornato la mia risposta ottengo meno di 1ms di performance che è molti ordini di magnitudine più veloce – EdChum