From 28b0ccde27535d647de387392aa61083bdaf4ca0 Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:48:15 +0100 Subject: [PATCH 1/9] add typehints to zscore --- elephant/signal_processing.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index 9a901b41a..065146b91 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -38,7 +38,9 @@ ] -def zscore(signal, inplace=True): +def zscore(signal: neo.core.AnalogSignal | list[neo.core.AnalogSignal], + inplace: bool = True + ) -> neo.core.AnalogSignal | list[neo.core.AnalogSignal]: r""" Apply a z-score operation to one or several `neo.AnalogSignal` objects. From 88ccbc8a98f6bc4082faa4fa93aa49b18f223f5d Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:51:29 +0100 Subject: [PATCH 2/9] add type hints to cross_correlation_function --- elephant/signal_processing.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index 065146b91..c3a2259e1 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -38,9 +38,9 @@ ] -def zscore(signal: neo.core.AnalogSignal | list[neo.core.AnalogSignal], +def zscore(signal: neo.AnalogSignal | list[neo.AnalogSignal], inplace: bool = True - ) -> neo.core.AnalogSignal | list[neo.core.AnalogSignal]: + ) -> neo.AnalogSignal | list[neo.AnalogSignal]: r""" Apply a z-score operation to one or several `neo.AnalogSignal` objects. @@ -197,8 +197,11 @@ def zscore(signal: neo.core.AnalogSignal | list[neo.core.AnalogSignal], return signal_ztransformed -def cross_correlation_function(signal, channel_pairs, hilbert_envelope=False, - n_lags=None, scaleopt='unbiased'): +def cross_correlation_function(signal: neo.AnalogSignal, + channel_pairs: list | np.ndarray, + hilbert_envelope: bool = False, + n_lags: int | None = None, + scaleopt: str = 'unbiased') -> neo.AnalogSignal: r""" Computes an estimator of the cross-correlation function :cite:`signal-Stoica2005`. From ca12e522d81a3f7d4983e45d891aedb96634ad4a Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:53:59 +0100 Subject: [PATCH 3/9] add type hints to butter --- elephant/signal_processing.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index c3a2259e1..cb360cbdc 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -392,8 +392,13 @@ def cross_correlation_function(signal: neo.AnalogSignal, return cross_corr -def butter(signal, highpass_frequency=None, lowpass_frequency=None, order=4, - filter_function='filtfilt', sampling_frequency=1.0, axis=-1): +def butter(signal: neo.AnalogSignal | pq.Quantity | np.ndarray, + highpass_frequency: pq.Quantity | float | None = None, + lowpass_frequency: pq.Quantity | float | None = None, + order: int = 4, + filter_function: str = 'filtfilt', + sampling_frequency: pq.Quantity | float = 1.0, + axis: int = -1) -> neo.AnalogSignal | pq.Quantity | np.ndarray: """ Butterworth filtering function for `neo.AnalogSignal`. From 64cc1c2f114e2a3b47e0a9295d9050a3309f4b90 Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:57:22 +0100 Subject: [PATCH 4/9] add type hints to wavelet_transform --- elephant/signal_processing.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index cb360cbdc..32bdcd5b7 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -568,8 +568,12 @@ def butter(signal: neo.AnalogSignal | pq.Quantity | np.ndarray, return filtered_data -def wavelet_transform(signal, frequency, n_cycles=6.0, sampling_frequency=1.0, - zero_padding=True): +def wavelet_transform(signal: neo.AnalogSignal | np.ndarray | list, + frequency: float | list[float], + n_cycles: float = 6.0, + sampling_frequency: float | pq.Quantity = 1.0, + zero_padding: bool = True + ) -> np.ndarray: r""" Compute the wavelet transform of a given signal with Morlet mother wavelet. The parametrization of the wavelet is based on From 332e757aa3de35033f29ceacf38f79b3770b135f Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:24:33 +0100 Subject: [PATCH 5/9] add type hints to wavelet_transform --- elephant/signal_processing.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index 32bdcd5b7..be8c941ef 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -572,8 +572,7 @@ def wavelet_transform(signal: neo.AnalogSignal | np.ndarray | list, frequency: float | list[float], n_cycles: float = 6.0, sampling_frequency: float | pq.Quantity = 1.0, - zero_padding: bool = True - ) -> np.ndarray: + zero_padding: bool = True) -> np.ndarray: r""" Compute the wavelet transform of a given signal with Morlet mother wavelet. The parametrization of the wavelet is based on From 891a2fc23060b18777c92087d82bfc9bc1b382e2 Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:26:21 +0100 Subject: [PATCH 6/9] add type hints to hilbert --- elephant/signal_processing.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index be8c941ef..923d4b687 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -742,7 +742,8 @@ def _morlet_wavelet_ft(freq, n_cycles, fs, n): return signal_wt -def hilbert(signal, padding='nextpow'): +def hilbert(signal: neo.AnalogSignal, + padding: str | int | None = 'nextpow') -> neo.AnalogSignal: """ Apply a Hilbert transform to a `neo.AnalogSignal` object in order to obtain its (complex) analytic signal. From 08438a221da4873e0b35b6a2cf71341d3eb359b1 Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Fri, 28 Mar 2025 12:27:57 +0100 Subject: [PATCH 7/9] add type hints to rauc --- elephant/signal_processing.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index 923d4b687..8197904f7 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -851,7 +851,11 @@ def hilbert(signal: neo.AnalogSignal, return output / output.units -def rauc(signal, baseline=None, bin_duration=None, t_start=None, t_stop=None): +def rauc(signal: neo.AnalogSignal, + baseline: pq.Quantity | str | None = None, + bin_duration: pq.Quantity | None = None, + t_start: pq.Quantity | None = None, + t_stop: pq.Quantity | None = None) -> pq.Quantity | neo.AnalogSignal: """ Calculate the rectified area under the curve (RAUC) for a `neo.AnalogSignal`. From f3b02cf652f8f3c5ca85c5ee362d26d0443a9ce8 Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Mon, 31 Mar 2025 14:28:32 +0200 Subject: [PATCH 8/9] switch from pipe operator to Union for type hints --- elephant/signal_processing.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index 8197904f7..d0e341dd6 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -24,6 +24,7 @@ import numpy as np import quantities as pq import scipy.signal +from typing import Union from elephant.utils import check_same_units @@ -38,9 +39,9 @@ ] -def zscore(signal: neo.AnalogSignal | list[neo.AnalogSignal], +def zscore(signal: Union[neo.AnalogSignal, list[neo.AnalogSignal]], inplace: bool = True - ) -> neo.AnalogSignal | list[neo.AnalogSignal]: + ) -> Union[neo.AnalogSignal, list[neo.AnalogSignal]]: r""" Apply a z-score operation to one or several `neo.AnalogSignal` objects. @@ -198,9 +199,9 @@ def zscore(signal: neo.AnalogSignal | list[neo.AnalogSignal], def cross_correlation_function(signal: neo.AnalogSignal, - channel_pairs: list | np.ndarray, + channel_pairs: Union[list, np.ndarray], hilbert_envelope: bool = False, - n_lags: int | None = None, + n_lags: Union[int, None] = None, scaleopt: str = 'unbiased') -> neo.AnalogSignal: r""" Computes an estimator of the cross-correlation function @@ -392,13 +393,13 @@ def cross_correlation_function(signal: neo.AnalogSignal, return cross_corr -def butter(signal: neo.AnalogSignal | pq.Quantity | np.ndarray, - highpass_frequency: pq.Quantity | float | None = None, - lowpass_frequency: pq.Quantity | float | None = None, +def butter(signal: Union[neo.AnalogSignal, pq.Quantity, np.ndarray], + highpass_frequency: Union[pq.Quantity, float, None] = None, + lowpass_frequency: Union[pq.Quantity, float, None] = None, order: int = 4, filter_function: str = 'filtfilt', - sampling_frequency: pq.Quantity | float = 1.0, - axis: int = -1) -> neo.AnalogSignal | pq.Quantity | np.ndarray: + sampling_frequency: Union[pq.Quantity, float] = 1.0, + axis: int = -1) -> Union[neo.AnalogSignal, pq.Quantity, np.ndarray]: """ Butterworth filtering function for `neo.AnalogSignal`. @@ -568,10 +569,10 @@ def butter(signal: neo.AnalogSignal | pq.Quantity | np.ndarray, return filtered_data -def wavelet_transform(signal: neo.AnalogSignal | np.ndarray | list, - frequency: float | list[float], +def wavelet_transform(signal: Union[neo.AnalogSignal, np.ndarray, list], + frequency: Union[float, list[float]], n_cycles: float = 6.0, - sampling_frequency: float | pq.Quantity = 1.0, + sampling_frequency: Union[float, pq.Quantity] = 1.0, zero_padding: bool = True) -> np.ndarray: r""" Compute the wavelet transform of a given signal with Morlet mother @@ -743,7 +744,7 @@ def _morlet_wavelet_ft(freq, n_cycles, fs, n): def hilbert(signal: neo.AnalogSignal, - padding: str | int | None = 'nextpow') -> neo.AnalogSignal: + padding: Union[str, int, None] = 'nextpow') -> neo.AnalogSignal: """ Apply a Hilbert transform to a `neo.AnalogSignal` object in order to obtain its (complex) analytic signal. @@ -852,10 +853,10 @@ def hilbert(signal: neo.AnalogSignal, def rauc(signal: neo.AnalogSignal, - baseline: pq.Quantity | str | None = None, - bin_duration: pq.Quantity | None = None, - t_start: pq.Quantity | None = None, - t_stop: pq.Quantity | None = None) -> pq.Quantity | neo.AnalogSignal: + baseline: Union[pq.Quantity, str, None] = None, + bin_duration: Union[pq.Quantity, None] = None, + t_start: Union[pq.Quantity, None] = None, + t_stop: Union[pq.Quantity, None] = None) -> Union[pq.Quantity, neo.AnalogSignal]: """ Calculate the rectified area under the curve (RAUC) for a `neo.AnalogSignal`. From e5e045bca66835a6ee8e6c3dadd410ae19a540a8 Mon Sep 17 00:00:00 2001 From: Moritz Kern <92092328+Moritz-Alexander-Kern@users.noreply.github.com> Date: Mon, 31 Mar 2025 14:33:40 +0200 Subject: [PATCH 9/9] rename return to "out" in docstring --- elephant/signal_processing.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/elephant/signal_processing.py b/elephant/signal_processing.py index d0e341dd6..4153d97e1 100644 --- a/elephant/signal_processing.py +++ b/elephant/signal_processing.py @@ -75,7 +75,7 @@ def zscore(signal: Union[neo.AnalogSignal, list[neo.AnalogSignal]], Returns ------- - signal_ztransformed : neo.AnalogSignal or list of neo.AnalogSignal + out : neo.AnalogSignal or list of neo.AnalogSignal The output format matches the input format: for each input `neo.AnalogSignal`, a corresponding `neo.AnalogSignal` is returned, containing the z-transformed signal with dimensionless unit. @@ -274,7 +274,7 @@ def cross_correlation_function(signal: neo.AnalogSignal, Returns ------- - cross_corr : neo.AnalogSignal + out : neo.AnalogSignal Shape: `[2*n_lags+1, n]` Pairwise cross-correlation functions for channel pairs given by `channel_pairs`. If `hilbert_envelope` is True, the output is the @@ -396,7 +396,7 @@ def cross_correlation_function(signal: neo.AnalogSignal, def butter(signal: Union[neo.AnalogSignal, pq.Quantity, np.ndarray], highpass_frequency: Union[pq.Quantity, float, None] = None, lowpass_frequency: Union[pq.Quantity, float, None] = None, - order: int = 4, + order: int = 4, filter_function: str = 'filtfilt', sampling_frequency: Union[pq.Quantity, float] = 1.0, axis: int = -1) -> Union[neo.AnalogSignal, pq.Quantity, np.ndarray]: @@ -457,7 +457,7 @@ def butter(signal: Union[neo.AnalogSignal, pq.Quantity, np.ndarray], Returns ------- - filtered_signal : neo.AnalogSignal or pq.Quantity or np.ndarray + out : neo.AnalogSignal or pq.Quantity or np.ndarray Filtered input data. The shape and type is identical to those of the input `signal`. @@ -614,7 +614,7 @@ def wavelet_transform(signal: Union[neo.AnalogSignal, np.ndarray, list], Returns ------- - signal_wt : np.ndarray + out : np.ndarray Wavelet transform of the input data. When `frequency` was given as a list, the way how the wavelet transforms for different frequencies are returned depends on the input type: @@ -743,7 +743,7 @@ def _morlet_wavelet_ft(freq, n_cycles, fs, n): return signal_wt -def hilbert(signal: neo.AnalogSignal, +def hilbert(signal: neo.AnalogSignal, padding: Union[str, int, None] = 'nextpow') -> neo.AnalogSignal: """ Apply a Hilbert transform to a `neo.AnalogSignal` object in order to @@ -775,7 +775,7 @@ def hilbert(signal: neo.AnalogSignal, Returns ------- - neo.AnalogSignal + out : neo.AnalogSignal Contains the complex analytic signal(s) corresponding to the input `signal`. The unit of the returned `neo.AnalogSignal` is dimensionless. @@ -902,7 +902,7 @@ def rauc(signal: neo.AnalogSignal, Returns ------- - pq.Quantity or neo.AnalogSignal + out : pq.Quantity or neo.AnalogSignal If the number of bins is 1, the returned object is a scalar or vector `pq.Quantity` containing a single RAUC value for each channel. Otherwise, the returned object is a `neo.AnalogSignal` containing the @@ -996,7 +996,7 @@ def rauc(signal: neo.AnalogSignal, return rauc_sig -def derivative(signal): +def derivative(signal: neo.AnalogSignal) -> neo.AnalogSignal: """ Calculate the derivative of a `neo.AnalogSignal`. @@ -1008,7 +1008,7 @@ def derivative(signal): Returns ------- - derivative_sig : neo.AnalogSignal + out : neo.AnalogSignal The returned object is a `neo.AnalogSignal` containing the differences between each successive sample value of the input signal divided by the sampling period. Times are centered between the successive samples