Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix some issues #1

Merged
merged 6 commits into from
May 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/black.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: Lint

on: [push, pull_request]

jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: psf/black@stable
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,7 @@ $RECYCLE.BIN/
# Windows shortcuts
*.lnk

# End of https://www.gitignore.io/api/macos,linux,python,windows,jupyternotebook,visualstudiocode
# End of https://www.gitignore.io/api/macos,linux,python,windows,jupyternotebook,visualstudiocode

.idea
.vscode
2 changes: 0 additions & 2 deletions .vscode/settings.json

This file was deleted.

2 changes: 1 addition & 1 deletion jointly/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .abstract_extractor import *
from .segment_selector import *
from .shake_extractor import *
from .segment_selector import *
from .synchronizer import *
17 changes: 8 additions & 9 deletions jointly/abstract_extractor.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@


class AbstractExtractor(metaclass=abc.ABCMeta):

def __init__(self):
self.segments = {}

Expand All @@ -12,7 +11,7 @@ def get_segments(self, signals):
return dictionary with start and end timestamps for each signal.

Format of dictionary:
>>> {
>>> {
>>> 'column_name': {
>>> 'first': {
>>> 'start': timestamp,
Expand All @@ -25,21 +24,21 @@ def get_segments(self, signals):
>>> },
>>> ...
>>> }

"""

def _init_segments(self, columns):
self.segments = {}
for column_name in columns:
self.segments[column_name] = {
'first': {},
'second': {},
"first": {},
"second": {},
}

def _set_first_segment(self, column_name, start, end):
self.segments[column_name]['first']['start'] = start
self.segments[column_name]['first']['end'] = end
self.segments[column_name]["first"]["start"] = start
self.segments[column_name]["first"]["end"] = end

def _set_second_segment(self, column_name, start, end):
self.segments[column_name]['second']['start'] = start
self.segments[column_name]['second']['end'] = end
self.segments[column_name]["second"]["start"] = start
self.segments[column_name]["second"]["end"] = end
53 changes: 35 additions & 18 deletions jointly/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

### Signal processing


def normalize(x):
"""Normalizes signal to interval [-1, 1] with mean 0."""
xn = x - np.mean(x)
Expand All @@ -17,32 +18,39 @@ def get_equidistant_signals(signals, frequency):
"""Returns copy of dataframe with signals
sampled equidistantly at the specified frequency.
"""
freq = '{}us'.format(int(1e6 / frequency))
df = pd.DataFrame(index=pd.date_range(start=pd.to_datetime(signals.index.min(), unit='s'),
end=pd.to_datetime(signals.index.max(), unit='s'),
freq=freq))
df = df.join(signals.copy(), how='outer')
df = df.interpolate(method='time', limit_area='inside').asfreq(freq)
freq = "{}N".format(int(1e9 / frequency))
df = pd.DataFrame(
{
name: signals[name].dropna().resample(freq).nearest()
for name in signals.columns
},
index=pd.date_range(
start=pd.to_datetime(signals.index.min(), unit="s"),
end=pd.to_datetime(signals.index.max(), unit="s"),
freq=freq,
),
)
return df


### Plotting


def plot_signals(df, cols=None, title=None, tags=None):
cmap = matplotlib.cm.get_cmap('tab10')
cmap = matplotlib.cm.get_cmap("tab10")
fig, ax = pyplot.subplots(figsize=(15, 6))
if cols is None:
cols = df.columns
if title is not None:
ax.set_title(title)
if tags is not None:
for tag in tags:
timestamp = pd.to_datetime(tag, unit='s')
timestamp = pd.to_datetime(tag, unit="s")
if timestamp > df.index.min() and timestamp < df.index.max():
ax.axvline(timestamp, color='grey')
ax.axvline(timestamp, color="grey")
for index, col in enumerate(cols):
ax.plot(df.index, df[col], color=cmap(index), label=col)
ax.set_xlabel('Time')
ax.set_xlabel("Time")
fig.tight_layout()
pyplot.legend()
pyplot.show()
Expand All @@ -58,25 +66,34 @@ def plot_segments(dataframe, segments, together=True, seperate=True):
nrows = len(segment_names)
fig, axes = pyplot.subplots(nrows, ncols, figsize=(15, 4 * nrows))
for index, segment_name in enumerate(segment_names):
axes[index].set_title('{} segment'.format(segment_name))
signals_with_segment = list(filter(lambda x: segment_name in segments[x], signal_names))
start = np.amin([segments[x][segment_name]['start'] for x in signals_with_segment])
end = np.amax([segments[x][segment_name]['end'] for x in signals_with_segment])
axes[index].set_title("{} segment".format(segment_name))
signals_with_segment = list(
filter(lambda x: segment_name in segments[x], signal_names)
)
start = np.amin(
[segments[x][segment_name]["start"] for x in signals_with_segment]
)
end = np.amax(
[segments[x][segment_name]["end"] for x in signals_with_segment]
)
dataframe[start:end].plot(ax=axes[index])
fig.tight_layout()

if seperate is True:
# plot signals seperately
ncols = len(segment_names)
nrows = len(segments.keys())
cmap = matplotlib.cm.get_cmap('tab10')
cmap = matplotlib.cm.get_cmap("tab10")
fig, axes = pyplot.subplots(nrows, ncols, figsize=(15, 4 * nrows))
for index, signal_name in enumerate(segments.keys()):
for index_seg, segment_name in enumerate(segment_names):
if segment_name not in segments[signal_name]:
continue
axes[index, index_seg].set_title('{} segment of {}'.format(segment_name, signal_name))
axes[index, index_seg].set_title(
"{} segment of {}".format(segment_name, signal_name)
)
segment = segments[signal_name][segment_name]
dataframe[signal_name][segment['start']:segment['end']] \
.plot(ax=axes[index, index_seg], color=cmap(index))
dataframe[signal_name][segment["start"] : segment["end"]].plot(
ax=axes[index, index_seg], color=cmap(index)
)
fig.tight_layout()
2 changes: 1 addition & 1 deletion jointly/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

FORMAT = "[%(lineno)3s - %(funcName)20s() ] %(message)s"
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('jointly')
logger = logging.getLogger("jointly")
logger.setLevel(logging.CRITICAL)
17 changes: 9 additions & 8 deletions jointly/segment_selector.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ def __init__(self, signals, segments=None):
if segments is None:
self.segments = {
signal: {
'first': {},
'second': {},
} for signal in signals.columns
"first": {},
"second": {},
}
for signal in signals.columns
}
self._display_plots()

Expand All @@ -23,13 +24,13 @@ def _display_plots(self):

for index, name in enumerate(self.signals.columns):
axes[index].set_title(name)
axes[index].plot(self.signals[name].interpolate(method='time').values)
axes[index].plot(self.signals[name].interpolate(method="time").values)
fig.tight_layout()

bp_id = fig.canvas.mpl_connect('button_press_event', self._on_click)
bp_id = fig.canvas.mpl_connect("button_press_event", self._on_click)

def _display_segments(self):
print('Do')
print("Do")

def _on_click(self, event):
# if not event.dblclick:
Expand All @@ -40,8 +41,8 @@ def _on_click(self, event):
title = event.inaxes.title.get_text()
index = int(event.xdata)

for segment in ['first', 'second']:
for time in ['start', 'end']:
for segment in ["first", "second"]:
for time in ["start", "end"]:
if time not in self.segments[title][segment]:
self.segments[title][segment][time] = self.signals.index[index]
break
Expand Down
Loading