5. Filtering data in 1D#

[ ]:
# %load_ext autoreload
# %autoreload 2

import cmocean
import pandas as pd
import verde as vd

import airbornegeo
[ ]:
data_df = pd.read_csv("data/AGAP_gravity_survey_processed.csv")
data_df = data_df[
    [
        "easting",
        "northing",
        "line",
        "unixtime",
        "grav_disturbance",
        "distance_along_line",
    ]
]
data_df = data_df.sort_values(["line", "unixtime"]).reset_index(drop=True)
data_df.head()
easting northing line unixtime grav_disturbance distance_along_line
0 1.000024e+06 226237.330771 1 1.229507e+09 1186.4 0.000000
1 1.000083e+06 226246.631269 1 1.229507e+09 342.1 59.842447
2 1.000142e+06 226255.809132 1 1.229507e+09 -1965.9 119.693401
3 1.000201e+06 226264.969079 1 1.229507e+09 820.0 179.545645
4 1.000260e+06 226274.156809 1 1.229507e+09 3198.0 239.285174

5.1. Filter a line#

[7]:
# extract a single line from the survey
line_df = data_df[data_df.line == 4]

5.1.1. Spatial filtering#

We can perform 1D filtering based on the distance along the flight line.

[10]:
line_df["grav_disturbance_filtered_spatial"] = airbornegeo.filter_line(
    line_df,
    filter_type="g19000+l",  # 19 km low pass gaussian filter
    data_column="grav_disturbance",
    filter_by_column="distance_along_line",
    pad_width_percentage=10,
)
[17]:
ylim = vd.minmax(line_df.grav_disturbance, min_percentile=2, max_percentile=98)
ax = line_df.plot.line(
    "distance_along_line",
    "grav_disturbance",
    style="bp",
    ms=0.6,
    ylim=ylim,
)
ax = line_df.plot.line(
    "distance_along_line",
    "grav_disturbance_filtered_spatial",
    style="rp",
    ms=0.6,
    ax=ax,
    ylim=ylim,
)
ax.set_ylabel("mGal")
[17]:
Text(0, 0.5, 'mGal')
_images/filtering_data_in_1D_7_1.png
[18]:
line_df = line_df.sort_values("unixtime")

line_df["grav_disturbance_filtered_temporal"] = airbornegeo.filter_line(
    line_df,
    filter_type="g400+l",  # 400 sec low pass gaussian filter
    data_column="grav_disturbance",
    filter_by_column="unixtime",
    pad_width_percentage=10,
)
[19]:
ylim = vd.minmax(line_df.grav_disturbance, min_percentile=2, max_percentile=98)
ax = line_df.plot.line(
    "distance_along_line",
    "grav_disturbance",
    style="bp",
    ms=0.6,
    ylim=ylim,
)
ax = line_df.plot.line(
    "distance_along_line",
    "grav_disturbance_filtered_temporal",
    style="rp",
    ms=0.6,
    ax=ax,
    ylim=ylim,
)
ax.set_ylabel("mGal")
[19]:
Text(0, 0.5, 'mGal')
_images/filtering_data_in_1D_9_1.png
[27]:
ylim = vd.minmax(
    line_df[
        ["grav_disturbance_filtered_spatial", "grav_disturbance_filtered_temporal"]
    ],
)
ax = line_df.plot.line(
    "distance_along_line",
    "grav_disturbance_filtered_spatial",
    style="bp",
    ms=0.6,
    ylim=ylim,
)
ax = line_df.plot.line(
    "distance_along_line",
    "grav_disturbance_filtered_temporal",
    style="rp",
    ms=0.6,
    ax=ax,
    ylim=ylim,
)
ax.set_ylabel("mGal")
[27]:
Text(0, 0.5, 'mGal')
_images/filtering_data_in_1D_10_1.png

5.2. Filter all lines in a survey#

5.2.1. Spatial filtering#

[33]:
# plot the unfiltered gravity disturbance data
max_abs = vd.maxabs(line_df.grav_disturbance, percentile=95)
ax = data_df.plot.scatter(
    "easting",
    "northing",
    c="grav_disturbance",
    s=0.1,
    cmap=cmocean.cm.balance,
    vmin=-max_abs,
    vmax=max_abs,
)
ax.set_aspect("equal")
_images/filtering_data_in_1D_13_0.png
[34]:
data_df["grav_disturbance_filtered_spatial"] = airbornegeo.filter_line(
    data_df,
    filter_type="g19000+l",  # 19 km low pass gaussian filter
    data_column="grav_disturbance",
    filter_by_column="distance_along_line",
    groupby_column="line",
    pad_width_percentage=10,
)
Segments: 100%|██████████| 100/100 [00:03<00:00, 31.87it/s]
[35]:
# plot the filtered gravity disturbance data
max_abs = vd.maxabs(line_df.grav_disturbance_filtered_spatial, percentile=95)
ax = data_df.plot.scatter(
    "easting",
    "northing",
    c="grav_disturbance_filtered_spatial",
    s=0.1,
    cmap=cmocean.cm.balance,
    vmin=-max_abs,
    vmax=max_abs,
)
ax.set_aspect("equal")
_images/filtering_data_in_1D_15_0.png

5.2.2. Temporal filtering#

[36]:
data_df["grav_disturbance_filtered_temporal"] = airbornegeo.filter_line(
    data_df,
    filter_type="g500+l",  # 500 sec low pass gaussian filter
    data_column="grav_disturbance",
    filter_by_column="unixtime",
    groupby_column="line",
    pad_width_percentage=10,
)
Segments: 100%|██████████| 100/100 [00:04<00:00, 23.94it/s]
[37]:
# plot the filtered gravity disturbance data
max_abs = vd.maxabs(line_df.grav_disturbance_filtered_temporal, percentile=95)
ax = data_df.plot.scatter(
    "easting",
    "northing",
    c="grav_disturbance_filtered_temporal",
    s=0.1,
    cmap=cmocean.cm.balance,
    vmin=-max_abs,
    vmax=max_abs,
)
ax.set_aspect("equal")
_images/filtering_data_in_1D_18_0.png