
# find anomalies in a GPS track
# Markus Opitz 2026


import pandas as pd

df = pd.read_csv("coords.csv")

#neighborhood check after loading
df['alt_diff'] = df['alt'].diff().abs()
df['lon_diff'] = df['lon'].diff().abs()
df['lat_diff'] = df['lat'].diff().abs()

print("suspicious jumps: - - - - - - - - - - v")
print(df[df['alt_diff'] > 20][['lon','lat','alt','alt_diff']]) #jumps of >20m are listed
print(" ")

#Z-score
for col in ["lon", "lat", "alt"]:
    z = (df[col] - df[col].mean()) / df[col].std()
    df[col + "_outlier_z"] = z.abs() > 3

#IQR
for col in ["lon", "lat", "alt"]:
    q1 = df[col].quantile(0.25)
    q3 = df[col].quantile(0.75)
    iqr = q3 - q1
    lower = q1 - 1.5 * iqr
    upper = q3 + 1.5 * iqr
    df[col + "_outlier_iqr"] = (df[col] < lower) | (df[col] > upper)

print(df[df.filter(like="_outlier").any(axis=1)])
