In [1]:
!pip install mass_ts
In [2]:
import datetime
import numpy as np
import pandas as pd
import altair as alt
import matplotlib.pyplot as plt
import mass_ts as mts # https://www.cs.unm.edu/~mueen/FastestSimilaritySearch.html
In [3]:
# Clone orc repo with rowind data
!git clone -l -s git://github.com/sebastianpsm/orc.git cloned-repo
%cd cloned-repo
!ls
%cd ..
In [4]:
data = pd.read_csv("cloned-repo/sample_data/20200517.CSV")
fs = 50 # sample freq. [Hz]
rec_data = "17.5.20 7:15"
In [5]:
# Add time column
data["time_delta"] = data["time_delta[ms]"].astype('timedelta64[ms]')
data["t"] = data["time_delta"].cumsum() + datetime.datetime.strptime(rec_data, "%d.%m.%y %H:%M")
In [6]:
# Filter
rolling_window = 25
data["accel_x_filter"] = data["accel_x[G]"].rolling(rolling_window).mean()
data["accel_y_filter"] = data["accel_y[G]"].rolling(rolling_window).mean()
data["accel_z_filter"] = data["accel_z[G]"].rolling(rolling_window).mean()
data["gyro_x_filter"] = data["gyro_x[deg/s]"].rolling(rolling_window).mean()
data["gyro_y_filter"] = data["gyro_x[deg/s]"].rolling(rolling_window).mean()
data["gyro_z_filter"] = data["gyro_x[deg/s]"].rolling(rolling_window).mean()
data = data.dropna()
In [7]:
start=10000
stop=start+5000
plot_data = data[start:stop]
plot_data = plot_data[["t", "accel_x_filter", "accel_y_filter", "accel_z_filter"]]
accel_x_plot = alt.Chart(plot_data).mark_line(color="red").encode(alt.X("t:T", title="seconds"), alt.Y("accel_x_filter", title="acceleration [G]"))
accel_y_plot = alt.Chart(plot_data).mark_line(color="green").encode(alt.X("t:T", title="seconds"), alt.Y("accel_y_filter", title="acceleration [G]"))
accel_z_plot = alt.Chart(plot_data).mark_line(color="blue").encode(alt.X("t:T", title="seconds"), alt.Y("accel_z_filter", title="acceleration [G]"))
(accel_x_plot + accel_y_plot + accel_z_plot).properties(width=800,title="Acceleration [G]").interactive(bind_y=False)
Out[7]:
In [8]:
start = 1095
stop = 1245
len = stop-start
q = np.array(plot_data["accel_z_filter"][start:stop])
ts = np.array(data["accel_z_filter"])
distances = mts.mass2(ts,q)
In [9]:
plt.plot(np.abs(distances)[10000:15000])
Out[9]:
In [12]:
k = 200
exclusion_zone = 25
top_motifs = mts.top_k_motifs(distances, k, exclusion_zone)
In [13]:
for idx, top_motif in enumerate(top_motifs):
motiv = data["accel_z_filter"][top_motif:top_motif+len]
plt.plot(range(0,len), motiv)