In [6]:
%matplotlib inline
from IPython.lib.pretty import pprint
import logging
logger = logging.getLogger('gutils')
logger.handlers = [logging.StreamHandler()]
logger.setLevel(logging.DEBUG)
def plot_profiles(default_df):
import matplotlib.dates as mpd
import matplotlib.pyplot as plt
df = default_df.copy()
df['z'] = df.z.values * -1
df['t'] = mpd.date2num(df.t.dt.to_pydatetime())
df.plot.scatter(x='t', y='z', c='profile', cmap='tab20')
plt.show()
In [7]:
from pathlib import Path
from gutils.slocum import SlocumReader
ascii_folder = Path('.').absolute().parent.parent / 'gutils' / 'tests' / 'resources' / 'slocum'
ascii_file = ascii_folder / 'usf_bass_2016_252_1_12_sbd.dat'
slocum_data = SlocumReader(str(ascii_file))
standard = slocum_data.standardize()
standard.head((20))[[
't',
'y',
'x',
'pressure'
]]
Out[7]:
In [8]:
from gutils.yo import assign_profiles
# Defaults to a time interval of 2
profiled_1 = assign_profiles(standard, tsint=20)
# Adds a 'profile' column
profiled_1.head((20))[[
't',
'y',
'x',
'pressure',
'profile'
]]
Out[8]:
In [9]:
print('Profiles : ', len(profiled_1.profile.unique()))
plot_profiles(profiled_1)
In [10]:
# Shorten the time window for a profile to 2 seconds
profiled_2 = assign_profiles(standard, tsint=2)
print('Profiles : ', len(profiled_2.profile.unique()))
plot_profiles(profiled_2)
In [11]:
from gutils.filters import default_filter
# Assign default profiles
profiled_def = assign_profiles(standard)
# Default filter
filtered_def, count = default_filter(profiled_def)
print("Filtered out {} profiles".format(count))
print('Profiles : ', len(filtered_def.profile.unique()))
plot_profiles(filtered_def)
In [12]:
from gutils.filters import (
filter_profile_depth,
filter_profile_timeperiod,
filter_profile_distance,
filter_profile_number_of_points,
)
profiled_spec = assign_profiles(standard)
original_profiles = len(profiled_spec.profile.unique())
# Filter by Minimum Depth (meters)
below_depth = 2
filtered_spec, rm_depth = filter_profile_depth(profiled_spec, below=below_depth)
# Filter by Numer of Points
num_points = 20
filtered_spec, rm_points = filter_profile_number_of_points(filtered_spec, points_condition=num_points)
# Filter by Lengh of Profile (seconds)
seconds = 20
filtered_spec, rm_time = filter_profile_timeperiod(filtered_spec, timespan_condition=seconds)
# Filter by Vertical Distance
distance = 18
filtered_spec, rm_distance = filter_profile_distance(filtered_spec, distance_condition=distance)
total_filtered = rm_depth + rm_points + rm_time + rm_distance
pprint([
'Filtered {}/{} profiles'.format(total_filtered, original_profiles),
'Depth ({}m): {}'.format(below_depth, rm_depth),
'Points ({}): {}'.format(num_points, rm_points),
'Time ({}s): {}'.format(seconds, rm_time),
'Distance ({}m): {}'.format(distance, rm_distance),
])
print('Profiles : ', len(filtered_spec.profile.unique()))
plot_profiles(filtered_spec)
In [13]:
# Assign default profiles
profiled_play = assign_profiles(standard)
# Default filter
play, count = default_filter(profiled_play)
In [14]:
import numpy as np
profs = play.groupby('profile')
profs.agg({'temperature': [np.mean, np.max, np.min]})
Out[14]:
In [15]:
from shapely.geometry import LineString
LineString(zip(play.x, play.y))
Out[15]:
In [16]:
import matplotlib.dates as mpd
import matplotlib.pyplot as plt
df = play.copy()
df['z'] = df.z.values * -1
df['t'] = mpd.date2num(df.t.dt.to_pydatetime())
df.plot.scatter(x='t', y='z', c='temperature', cmap='viridis', title='Temperature')
df.plot.scatter(x='t', y='z', c='salinity', cmap='viridis', title='Salinity')
plt.show()
In [ ]: