diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e20f5b7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +## Under development: + +- do **NOT** normalize wav on read +- rename all `fs` (frequency sample) to `sr` (sample rate) + +## v0.1.1: + +- migration from [python-acoustics](https://github.com/python-acoustics/python-acoustics) \ No newline at end of file diff --git a/acoustic_toolbox/_signal.py b/acoustic_toolbox/_signal.py index 50dc723..230ca53 100644 --- a/acoustic_toolbox/_signal.py +++ b/acoustic_toolbox/_signal.py @@ -22,11 +22,11 @@ class Signal(np.ndarray): - """A signal consisting of samples (array) and a sample frequency (float).""" + """A signal consisting of samples (array) and a sample rate (float).""" - def __new__(cls, data, fs): + def __new__(cls, data, sr): obj = np.asarray(data).view(cls) - obj.fs = fs + obj.sr = sr return obj def __array_prepare__(self, array, context=None): @@ -36,8 +36,8 @@ def __array_prepare__(self, array, context=None): except IndexError: return array - if hasattr(a, "fs") and hasattr(b, "fs"): - if a.fs == b.fs: + if hasattr(a, "sr") and hasattr(b, "sr"): + if a.sr == b.sr: return array else: raise ValueError("Sample frequencies do not match.") @@ -52,18 +52,18 @@ def __array_finalize__(self, obj): if obj is None: return - self.fs = getattr(obj, "fs", None) + self.sr = getattr(obj, "sr", None) def __reduce__(self): # Get the parent's __reduce__ tuple pickled_state = super(Signal, self).__reduce__() # Create our own tuple to pass to __setstate__ - new_state = pickled_state[2] + (self.fs,) + new_state = pickled_state[2] + (self.sr,) # Return a tuple that replaces the parent's __setstate__ tuple with our own return (pickled_state[0], pickled_state[1], new_state) def __setstate__(self, state): - self.fs = state[-1] # Set the info attribute + self.sr = state[-1] # Set the info attribute # Call the parent's __setstate__ with the other tuple elements. super(Signal, self).__setstate__(state[0:-1]) @@ -72,7 +72,7 @@ def __repr__(self): def _construct(self, x): """Construct signal like x.""" - return Signal(x, self.fs) + return Signal(x, self.sr) @property def samples(self): @@ -90,7 +90,7 @@ def channels(self): @property def duration(self): """Duration of signal in seconds.""" - return float(self.samples / self.fs) + return float(self.samples / self.sr) @property def values(self): @@ -121,7 +121,7 @@ def calibrate_with(self, other, decibel, inplace=False): :rtype: :class:`Signal` """ if not isinstance(other, Signal): - other = Signal(other, self.fs) + other = Signal(other, self.sr) gain = decibel - other.leq() return self.gain(gain, inplace=inplace) @@ -143,7 +143,7 @@ def decimate(self, factor, zero_phase=False, ftype="iir", order=None): acoustic_toolbox.signal.decimate( x=self, q=factor, n=order, ftype=ftype, zero_phase=zero_phase ), - self.fs / factor, + self.sr / factor, ) def resample(self, nsamples, times=None, axis=-1, window=None): @@ -162,7 +162,7 @@ def resample(self, nsamples, times=None, axis=-1, window=None): """ return Signal( resample(self, nsamples, times, axis, window), - nsamples / self.samples * self.fs, + nsamples / self.samples * self.sr, ) def upsample(self, factor, axis=-1): @@ -202,9 +202,9 @@ def pick(self, start=0.0, stop=None): """ if start is not None: - start = int(np.floor(start * self.fs)) + start = int(np.floor(start * self.sr)) if stop is not None: - stop = int(np.floor(stop * self.fs)) + stop = int(np.floor(stop * self.sr)) return self[..., start:stop] def times(self): @@ -214,7 +214,7 @@ def times(self): :rtype: :class:`np.ndarray` """ - return np.arange(0, self.samples) / self.fs + return np.arange(0, self.samples) / self.sr def energy(self): """Signal energy. @@ -266,7 +266,7 @@ def weigh(self, weighting="A", zero_phase=False): """ num, den = WEIGHTING_SYSTEMS[weighting]() - b, a = bilinear(num, den, self.fs) + b, a = bilinear(num, den, self.sr) func = filtfilt if zero_phase else lfilter return self._construct(func(b, a, self)) @@ -282,7 +282,7 @@ def correlate(self, other=None, mode="full"): """ if other is None: other = self - if self.fs != other.fs: + if self.sr != other.sr: raise ValueError("Cannot correlate. Sample frequencies are not the same.") if self.channels > 1 or other.channels > 1: raise ValueError( @@ -300,7 +300,7 @@ def amplitude_envelope(self): """ return self._construct( - acoustic_toolbox.signal.amplitude_envelope(self, self.fs) + acoustic_toolbox.signal.amplitude_envelope(self, self.sr) ) def instantaneous_frequency(self): @@ -313,7 +313,7 @@ def instantaneous_frequency(self): """ return self._construct( - acoustic_toolbox.signal.instantaneous_frequency(self, self.fs) + acoustic_toolbox.signal.instantaneous_frequency(self, self.sr) ) def instantaneous_phase(self): @@ -326,7 +326,7 @@ def instantaneous_phase(self): """ return self._construct( - acoustic_toolbox.signal.instantaneous_phase(self, self.fs) + acoustic_toolbox.signal.instantaneous_phase(self, self.sr) ) def detrend(self, **kwargs): @@ -390,7 +390,7 @@ def power_spectrum(self, N=None): .. seealso:: :func:`acoustic_toolbox.signal.power_spectrum` """ - return acoustic_toolbox.signal.power_spectrum(self, self.fs, N=N) + return acoustic_toolbox.signal.power_spectrum(self, self.sr, N=N) def angle_spectrum(self, N=None): """Phase angle spectrum. Wrapped. @@ -403,7 +403,7 @@ def angle_spectrum(self, N=None): and :meth:`phase_spectrum`. """ - return acoustic_toolbox.signal.angle_spectrum(self, self.fs, N=N) + return acoustic_toolbox.signal.angle_spectrum(self, self.sr, N=N) def phase_spectrum(self, N=None): """Phase spectrum. Unwrapped. @@ -416,7 +416,7 @@ def phase_spectrum(self, N=None): and :meth:`angle_spectrum`. """ - return acoustic_toolbox.signal.phase_spectrum(self, self.fs, N=N) + return acoustic_toolbox.signal.phase_spectrum(self, self.sr, N=N) def peak(self, axis=-1): """Peak sound pressure. @@ -481,7 +481,7 @@ def sound_exposure(self, axis=-1): """ return acoustic_toolbox.standards.iso_tr_25417_2007.sound_exposure( - self, self.fs, axis=axis + self, self.sr, axis=axis ) def sound_exposure_level(self, axis=-1): @@ -493,7 +493,7 @@ def sound_exposure_level(self, axis=-1): """ return acoustic_toolbox.standards.iso_tr_25417_2007.sound_exposure_level( - self, self.fs, axis=axis + self, self.sr, axis=axis ) def plot_complex_cepstrum(self, N=None, **kwargs): @@ -649,7 +649,7 @@ def spectrogram(self, **kwargs): } params.update(kwargs) - t, s, P = spectrogram(self, fs=self.fs, **params) + t, s, P = spectrogram(self, fs=self.sr, **params) return t, s, P @@ -693,7 +693,7 @@ def plot_spectrogram(self, **kwargs): try: _, _, _, im = ax0.specgram( data, - Fs=self.fs, + Fs=self.sr, noverlap=params["noverlap"], NFFT=params["NFFT"], mode="magnitude", @@ -731,13 +731,13 @@ def levels(self, time=0.125, method="average"): if method == "average": return ( acoustic_toolbox.standards.iec_61672_1_2013.time_averaged_sound_level( - self.values, self.fs, time + self.values, self.sr, time ) ) elif method == "weighting": return ( acoustic_toolbox.standards.iec_61672_1_2013.time_weighted_sound_level( - self.values, self.fs, time + self.values, self.sr, time ) ) else: @@ -780,7 +780,7 @@ def plot_levels(self, **kwargs): # .. seealso:: :func:`acoustic_toolbox.signal.fractional_octaves` # """ - # return acoustic_toolbox.signal.fractional_octaves(self, self.fs, frequency, + # return acoustic_toolbox.signal.fractional_octaves(self, self.sr, frequency, # frequency, fraction, False)[1] def bandpass(self, lowcut, highcut, order=8, zero_phase=False): @@ -798,9 +798,9 @@ def bandpass(self, lowcut, highcut, order=8, zero_phase=False): """ return type(self)( acoustic_toolbox.signal.bandpass( - self, lowcut, highcut, self.fs, order=order, zero_phase=zero_phase + self, lowcut, highcut, self.sr, order=order, zero_phase=zero_phase ), - self.fs, + self.sr, ) def bandstop(self, lowcut, highcut, order=8, zero_phase=False): @@ -818,9 +818,9 @@ def bandstop(self, lowcut, highcut, order=8, zero_phase=False): """ return type(self)( acoustic_toolbox.signal.bandstop( - self, lowcut, highcut, self.fs, order=order, zero_phase=zero_phase + self, lowcut, highcut, self.sr, order=order, zero_phase=zero_phase ), - self.fs, + self.sr, ) def highpass(self, cutoff, order=4, zero_phase=False): @@ -836,9 +836,9 @@ def highpass(self, cutoff, order=4, zero_phase=False): """ return type(self)( acoustic_toolbox.signal.highpass( - self, cutoff, self.fs, order=order, zero_phase=zero_phase + self, cutoff, self.sr, order=order, zero_phase=zero_phase ), - self.fs, + self.sr, ) def lowpass(self, cutoff, order=4, zero_phase=False): @@ -854,9 +854,9 @@ def lowpass(self, cutoff, order=4, zero_phase=False): """ return type(self)( acoustic_toolbox.signal.lowpass( - self, cutoff, self.fs, order=order, zero_phase=zero_phase + self, cutoff, self.sr, order=order, zero_phase=zero_phase ), - self.fs, + self.sr, ) def octavepass(self, center, fraction, order=8, zero_phase=False): @@ -875,12 +875,12 @@ def octavepass(self, center, fraction, order=8, zero_phase=False): acoustic_toolbox.signal.octavepass( self, center, - self.fs, + self.sr, fraction=fraction, order=order, zero_phase=zero_phase, ), - self.fs, + self.sr, ) def bandpass_frequencies(self, frequencies, order=8, purge=True, zero_phase=False): @@ -896,9 +896,9 @@ def bandpass_frequencies(self, frequencies, order=8, purge=True, zero_phase=Fals .. seealso:: :func:`acoustic_toolbox.signal.bandpass_frequencies` """ frequencies, filtered = acoustic_toolbox.signal.bandpass_frequencies( - self, self.fs, frequencies, order, purge, zero_phase=zero_phase + self, self.sr, frequencies, order, purge, zero_phase=zero_phase ) - return frequencies, type(self)(filtered, self.fs) + return frequencies, type(self)(filtered, self.sr) def octaves( self, @@ -919,9 +919,9 @@ def octaves( .. seealso:: :func:`acoustic_toolbox.signal.bandpass_octaves` """ frequencies, octaves = acoustic_toolbox.signal.bandpass_octaves( - self, self.fs, frequencies, order, purge, zero_phase=zero_phase + self, self.sr, frequencies, order, purge, zero_phase=zero_phase ) - return frequencies, type(self)(octaves, self.fs) + return frequencies, type(self)(octaves, self.sr) def third_octaves( self, @@ -942,9 +942,9 @@ def third_octaves( .. seealso:: :func:`acoustic_toolbox.signal.bandpass_third_octaves` """ frequencies, octaves = acoustic_toolbox.signal.bandpass_third_octaves( - self, self.fs, frequencies, order, purge, zero_phase=zero_phase + self, self.sr, frequencies, order, purge, zero_phase=zero_phase ) - return frequencies, type(self)(octaves, self.fs) + return frequencies, type(self)(octaves, self.sr) def fractional_octaves( self, frequencies=None, fraction=1, order=8, purge=True, zero_phase=False @@ -964,13 +964,13 @@ def fractional_octaves( if frequencies is None: frequencies = acoustic_toolbox.signal.OctaveBand( fstart=NOMINAL_THIRD_OCTAVE_CENTER_FREQUENCIES[0], - fstop=self.fs / 2.0, + fstop=self.sr / 2.0, fraction=fraction, ) frequencies, octaves = acoustic_toolbox.signal.bandpass_fractional_octaves( - self, self.fs, frequencies, fraction, order, purge, zero_phase=zero_phase + self, self.sr, frequencies, fraction, order, purge, zero_phase=zero_phase ) - return frequencies, type(self)(octaves, self.fs) + return frequencies, type(self)(octaves, self.sr) def plot_octaves(self, **kwargs): """Plot octaves. @@ -1074,11 +1074,11 @@ def plot(self, **kwargs): # fig = plt.figure() # ax = fig.add_subplot(111) # ax.set_title('Scaleogram') - ##ax.set_xticks(np.arange(0, x.shape[1])*self.fs) + ##ax.set_xticks(np.arange(0, x.shape[1])*self.sr) ##ax.xaxis.set_major_locator(majorLocator) ##ax.imshow(10.0 * np.log10(x**2.0), interpolation=interpolation, aspect='auto', origin='lower')#, extent=[0, 1, 0, len(x)]) - # ax.pcolormesh(np.arange(0.0, x.shape[1])/self.fs, widths, 10.0*np.log(x**2.0)) + # ax.pcolormesh(np.arange(0.0, x.shape[1])/self.sr, widths, 10.0*np.log(x**2.0)) # if filename: # fig.savefig(filename) # else: @@ -1141,24 +1141,24 @@ def to_wav(self, filename, depth=16): dtype = data.dtype if not depth else "int" + str(depth) if depth: data = (data * 2 ** (depth - 1) - 1).astype(dtype) - wavfile.write(filename, int(self.fs), data.T) - # wavfile.write(filename, int(self.fs), self._data/np.abs(self._data).max() * 0.5) - # wavfile.write(filename, int(self.fs), np.int16(self._data/(np.abs(self._data).max()) * 32767) ) + wavfile.write(filename, int(self.sr), data.T) + # wavfile.write(filename, int(self.sr), self._data/np.abs(self._data).max() * 0.5) + # wavfile.write(filename, int(self.sr), np.int16(self._data/(np.abs(self._data).max()) * 32767) ) @classmethod - def from_wav(cls, filename, normalize=True): + def from_wav(cls, filename, normalize=False): """ Create an instance of `Signal` from a WAV file. :param filename: Filename - :param normalize: Whether to normalize the signal. + :param normalize: Whether to normalize the signal, default is False """ - fs, data = wavfile.read(filename) + sample_rate, data = wavfile.read(filename) data = data.astype(np.float32, copy=False).T if normalize: data /= np.max(np.abs(data)) - return cls(data, fs=fs) + return cls(data, sr=sample_rate) _PLOTTING_PARAMS = { diff --git a/acoustic_toolbox/atmosphere.py b/acoustic_toolbox/atmosphere.py index 85e86ac..ea06c9a 100644 --- a/acoustic_toolbox/atmosphere.py +++ b/acoustic_toolbox/atmosphere.py @@ -222,12 +222,12 @@ def frequency_response(self, distance, frequencies, inverse=False): inverse, ) - def impulse_response(self, distance, fs, ntaps=None, inverse=False): - """Impulse response of sound travelling through `atmosphere` for a given `distance` sampled at `fs`. + def impulse_response(self, distance, sr, ntaps=None, inverse=False): + """Impulse response of sound travelling through `atmosphere` for a given `distance` sampled at `sr`. :param atmosphere: Atmosphere. :param distance: Distance between source and receiver. - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param ntaps: Amount of taps. :param inverse: Whether the attenuation should be undone. @@ -236,7 +236,7 @@ def impulse_response(self, distance, fs, ntaps=None, inverse=False): return impulse_response( self, distance, - fs, + sr, ntaps, inverse, ) @@ -278,12 +278,12 @@ def frequency_response(atmosphere, distance, frequencies, inverse=False): return tf -def impulse_response(atmosphere, distance, fs, ntaps, inverse=False): - """Impulse response of sound travelling through `atmosphere` for a given `distance` sampled at `fs`. +def impulse_response(atmosphere, distance, sr, ntaps, inverse=False): + """Impulse response of sound travelling through `atmosphere` for a given `distance` sampled at `sr`. :param atmosphere: Atmosphere. :param distance: Distance between source and receiver. - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param ntaps: Amount of taps. :param inverse: Whether the attenuation should be undone. @@ -299,7 +299,7 @@ def impulse_response(atmosphere, distance, fs, ntaps, inverse=False): real, even frequency response. """ # Frequencies vector with positive frequencies only. - frequencies = np.fft.rfftfreq(ntaps, 1.0 / fs) + frequencies = np.fft.rfftfreq(ntaps, 1.0 / sr) # Single-sided spectrum. Negative frequencies have the same values. tf = frequency_response(atmosphere, distance, frequencies, inverse) # Impulse response. We design a zero-phase filter (linear-phase with zero slope). diff --git a/acoustic_toolbox/room.py b/acoustic_toolbox/room.py index 65762dd..c3b413d 100644 --- a/acoustic_toolbox/room.py +++ b/acoustic_toolbox/room.py @@ -171,7 +171,7 @@ def t60_impulse(file_name, bands, rt="t30"): # pylint: disable=too-many-locals :returns: Reverberation time :math:`T_{60}` """ - fs, raw_signal = wavfile.read(file_name) + sr, raw_signal = wavfile.read(file_name) band_type = _check_band_type(bands) if band_type == "octave": @@ -203,7 +203,7 @@ def t60_impulse(file_name, bands, rt="t30"): # pylint: disable=too-many-locals for band in range(bands.size): # Filtering signal - filtered_signal = bandpass(raw_signal, low[band], high[band], fs, order=8) + filtered_signal = bandpass(raw_signal, low[band], high[band], sr, order=8) abs_signal = np.abs(filtered_signal) / np.max(np.abs(filtered_signal)) # Schroeder integration @@ -215,7 +215,7 @@ def t60_impulse(file_name, bands, rt="t30"): # pylint: disable=too-many-locals sch_end = sch_db[np.abs(sch_db - end).argmin()] init_sample = np.where(sch_db == sch_init)[0][0] end_sample = np.where(sch_db == sch_end)[0][0] - x = np.arange(init_sample, end_sample + 1) / fs + x = np.arange(init_sample, end_sample + 1) / sr y = sch_db[init_sample : end_sample + 1] slope, intercept = stats.linregress(x, y)[0:2] @@ -226,14 +226,14 @@ def t60_impulse(file_name, bands, rt="t30"): # pylint: disable=too-many-locals return t60 -def clarity(time, signal, fs, bands=None): +def clarity(time, signal, sr, bands=None): """ Clarity :math:`C_i` determined from an impulse response. :param time: Time in miliseconds (e.g.: 50, 80). :param signal: Impulse response. :type signal: :class:`np.ndarray` - :param fs: Sample frequency. + :param sr: Sample rate, in hertz. :param bands: Bands of calculation (optional). Only support standard octave and third-octave bands. :type bands: :class:`np.ndarray` @@ -249,9 +249,9 @@ def clarity(time, signal, fs, bands=None): c = np.zeros(bands.size) for band in range(bands.size): - filtered_signal = bandpass(signal, low[band], high[band], fs, order=8) + filtered_signal = bandpass(signal, low[band], high[band], sr, order=8) h2 = filtered_signal**2.0 - t = int((time / 1000.0) * fs + 1) + t = int((time / 1000.0) * sr + 1) c[band] = 10.0 * np.log10((np.sum(h2[:t]) / np.sum(h2[t:]))) return c @@ -266,8 +266,8 @@ def c50_from_file(file_name, bands=None): :type bands: :class:`np.ndarray` """ - fs, signal = wavfile.read(file_name) - return clarity(50.0, signal, fs, bands) + sr, signal = wavfile.read(file_name) + return clarity(50.0, signal, sr, bands) def c80_from_file(file_name, bands=None): @@ -280,5 +280,5 @@ def c80_from_file(file_name, bands=None): :type bands: :class:`np.ndarray` """ - fs, signal = wavfile.read(file_name) - return clarity(80.0, signal, fs, bands) + sr, signal = wavfile.read(file_name) + return clarity(80.0, signal, sr, bands) diff --git a/acoustic_toolbox/signal.py b/acoustic_toolbox/signal.py index 1a6c5ce..86128b9 100644 --- a/acoustic_toolbox/signal.py +++ b/acoustic_toolbox/signal.py @@ -99,12 +99,12 @@ from numpy.fft import rfft -def bandpass_filter(lowcut, highcut, fs, order=8, output="sos"): +def bandpass_filter(lowcut, highcut, sr, order=8, output="sos"): """Band-pass filter. :param lowcut: Lower cut-off frequency :param highcut: Upper cut-off frequency - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param order: Filter order :param output: Output type. {'ba', 'zpk', 'sos'}. Default is 'sos'. See also :func:`scipy.signal.butter`. :returns: Returned value depends on `output`. @@ -114,20 +114,20 @@ def bandpass_filter(lowcut, highcut, fs, order=8, output="sos"): .. seealso:: :func:`scipy.signal.butter`. """ - nyq = 0.5 * fs + nyq = 0.5 * sr low = lowcut / nyq high = highcut / nyq output = butter(order / 2, [low, high], btype="band", output=output) return output -def bandpass(signal, lowcut, highcut, fs, order=8, zero_phase=False): +def bandpass(signal, lowcut, highcut, sr, order=8, zero_phase=False): """Filter signal with band-pass filter. :param signal: Signal :param lowcut: Lower cut-off frequency :param highcut: Upper cut-off frequency - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param order: Filter order :param zero_phase: Prevent phase error by filtering in both directions (filtfilt) @@ -136,34 +136,34 @@ def bandpass(signal, lowcut, highcut, fs, order=8, zero_phase=False): .. seealso:: :func:`bandpass_filter` for the filter that is used. """ - sos = bandpass_filter(lowcut, highcut, fs, order, output="sos") + sos = bandpass_filter(lowcut, highcut, sr, order, output="sos") if zero_phase: return _sosfiltfilt(sos, signal) else: return sosfilt(sos, signal) -def bandstop(signal, lowcut, highcut, fs, order=8, zero_phase=False): +def bandstop(signal, lowcut, highcut, sr, order=8, zero_phase=False): """Filter signal with band-stop filter. :param signal: Signal :param lowcut: Lower cut-off frequency :param highcut: Upper cut-off frequency - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param order: Filter order :param zero_phase: Prevent phase error by filtering in both directions (filtfilt) """ return lowpass( - signal, lowcut, fs, order=(order // 2), zero_phase=zero_phase - ) + highpass(signal, highcut, fs, order=(order // 2), zero_phase=zero_phase) + signal, lowcut, sr, order=(order // 2), zero_phase=zero_phase + ) + highpass(signal, highcut, sr, order=(order // 2), zero_phase=zero_phase) -def lowpass(signal, cutoff, fs, order=4, zero_phase=False): +def lowpass(signal, cutoff, sr, order=4, zero_phase=False): """Filter signal with low-pass filter. :param signal: Signal - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param cutoff: Cut-off frequency :param order: Filter order :param zero_phase: Prevent phase error by filtering in both directions (filtfilt) @@ -173,18 +173,18 @@ def lowpass(signal, cutoff, fs, order=4, zero_phase=False): .. seealso:: :func:`scipy.signal.butter`. """ - sos = butter(order, cutoff / (fs / 2.0), btype="low", output="sos") + sos = butter(order, cutoff / (sr / 2.0), btype="low", output="sos") if zero_phase: return _sosfiltfilt(sos, signal) else: return sosfilt(sos, signal) -def highpass(signal, cutoff, fs, order=4, zero_phase=False): +def highpass(signal, cutoff, sr, order=4, zero_phase=False): """Filter signal with low-pass filter. :param signal: Signal - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param cutoff: Cut-off frequency :param order: Filter order :param zero_phase: Prevent phase error by filtering in both directions (filtfilt) @@ -194,18 +194,18 @@ def highpass(signal, cutoff, fs, order=4, zero_phase=False): .. seealso:: :func:`scipy.signal.butter`. """ - sos = butter(order, cutoff / (fs / 2.0), btype="high", output="sos") + sos = butter(order, cutoff / (sr / 2.0), btype="high", output="sos") if zero_phase: return _sosfiltfilt(sos, signal) else: return sosfilt(sos, signal) -def octave_filter(center, fs, fraction, order=8, output="sos"): +def octave_filter(center, sr, fraction, order=8, output="sos"): """Fractional-octave band-pass filter. :param center: Centerfrequency of fractional-octave band. - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param fraction: Fraction of fractional-octave band. :param order: Filter order :param output: Output type. {'ba', 'zpk', 'sos'}. Default is 'sos'. See also :func:`scipy.signal.butter`. @@ -216,15 +216,15 @@ def octave_filter(center, fs, fraction, order=8, output="sos"): """ ob = OctaveBand(center=center, fraction=fraction) - return bandpass_filter(ob.lower[0], ob.upper[0], fs, order, output=output) + return bandpass_filter(ob.lower[0], ob.upper[0], sr, order, output=output) -def octavepass(signal, center, fs, fraction, order=8, zero_phase=True): +def octavepass(signal, center, sr, fraction, order=8, zero_phase=True): """Filter signal with fractional-octave bandpass filter. :param signal: Signal :param center: Centerfrequency of fractional-octave band. - :param fs: Sample frequency + :param sr: Sample rate (Hz) :param fraction: Fraction of fractional-octave band. :param order: Filter order :param zero_phase: Prevent phase error by filtering in both directions (filtfilt) @@ -234,7 +234,7 @@ def octavepass(signal, center, fs, fraction, order=8, zero_phase=True): .. seealso:: :func:`octave_filter` """ - sos = octave_filter(center, fs, fraction, order) + sos = octave_filter(center, sr, fraction, order) if zero_phase: return _sosfiltfilt(sos, signal) else: @@ -288,12 +288,12 @@ def convolve(signal, ltv, mode="full"): return out[start:stop] -def ir2fr(ir, fs, N=None): +def ir2fr(ir, sr, N=None): """ Convert impulse response into frequency response. Returns single-sided RMS spectrum. - :param ir: Impulser response - :param fs: Sample frequency + :param ir: Impulse response + :param sr: Sample rate (Hz) :param N: Blocks Calculates the positive frequencies using :func:`np.fft.rfft`. @@ -306,14 +306,14 @@ def ir2fr(ir, fs, N=None): N = N if N else ir.shape[-1] fr = rfft(ir, n=N) / N - f = np.fft.rfftfreq(N, 1.0 / fs) # / 2.0 + f = np.fft.rfftfreq(N, 1.0 / sr) # / 2.0 fr *= 2.0 fr[..., 0] /= 2.0 # DC component should not be doubled. if not N % 2: # if not uneven - fr[..., -1] /= 2.0 # And neither should fs/2 be. + fr[..., -1] /= 2.0 # And neither should sr/2 be. - # f = np.arange(0, N/2+1)*(fs/N) + # f = np.arange(0, N/2+1)*(sr/N) return f, fr @@ -615,12 +615,12 @@ def apply_window(x, window): return x * y / s -def amplitude_spectrum(x, fs, N=None): +def amplitude_spectrum(x, sr, N=None): """ Amplitude spectrum of instantaneous signal :math:`x(t)`. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency :math:`f_s`. + :param sr: Sample rate (Hz) :math:`sr`. :param N: Amount of FFT bins. The amplitude spectrum gives the amplitudes of the sinusoidal the signal is built @@ -632,16 +632,16 @@ def amplitude_spectrum(x, fs, N=None): """ N = N if N else x.shape[-1] fr = np.fft.fft(x, n=N) / N - f = np.fft.fftfreq(N, 1.0 / fs) + f = np.fft.fftfreq(N, 1.0 / sr) return np.fft.fftshift(f), np.fft.fftshift(fr, axes=[-1]) -def auto_spectrum(x, fs, N=None): +def auto_spectrum(x, sr, N=None): """ Auto-spectrum of instantaneous signal :math:`x(t)`. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency :math:`f_s`. + :param sr: Sample rate (Hz) :math:`sr`. :param N: Amount of FFT bins. The auto-spectrum contains the squared amplitudes of the signal. Squared amplitudes @@ -652,16 +652,16 @@ def auto_spectrum(x, fs, N=None): The auto-spectrum is double-sided. """ - f, a = amplitude_spectrum(x, fs, N=N) + f, a = amplitude_spectrum(x, sr, N=N) return f, (a * a.conj()).real -def power_spectrum(x, fs, N=None): +def power_spectrum(x, sr, N=None): """ Power spectrum of instantaneous signal :math:`x(t)`. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency :math:`f_s`. + :param sr: Sample rate (Hz) :math:`sr`. :param N: Amount of FFT bins. The power spectrum, or single-sided autospectrum, contains the squared RMS amplitudes of the signal. @@ -675,22 +675,22 @@ def power_spectrum(x, fs, N=None): """ N = N if N else x.shape[-1] - f, a = auto_spectrum(x, fs, N=N) + f, a = auto_spectrum(x, sr, N=N) a = a[..., N // 2 :] f = f[..., N // 2 :] a *= 2.0 a[..., 0] /= 2.0 # DC component should not be doubled. if not N % 2: # if not uneven - a[..., -1] /= 2.0 # And neither should fs/2 be. + a[..., -1] /= 2.0 # And neither should sr/2 be. return f, a -def angle_spectrum(x, fs, N=None): +def angle_spectrum(x, sr, N=None): """ Phase angle spectrum of instantaneous signal :math:`x(t)`. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency :math:`f_s`. + :param sr: Sample rate (Hz) :math:`sr`. :param N: Amount of FFT bins. This function returns a single-sided wrapped phase angle spectrum. @@ -699,19 +699,19 @@ def angle_spectrum(x, fs, N=None): """ N = N if N else x.shape[-1] - f, a = amplitude_spectrum(x, fs, N) + f, a = amplitude_spectrum(x, sr, N) a = np.angle(a) a = a[..., N // 2 :] f = f[..., N // 2 :] return f, a -def phase_spectrum(x, fs, N=None): +def phase_spectrum(x, sr, N=None): """ Phase spectrum of instantaneous signal :math:`x(t)`. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency :math:`f_s`. + :param sr: Sample rate (Hz) :math:`sr`. :param N: Amount of FFT bins. This function returns a single-sided unwrapped phase spectrum. @@ -719,16 +719,16 @@ def phase_spectrum(x, fs, N=None): .. seealso:: :func:`angle_spectrum` for wrapped phase angle. """ - f, a = angle_spectrum(x, fs, N=None) + f, a = angle_spectrum(x, sr, N=None) return f, np.unwrap(a) -def density_spectrum(x, fs, N=None): +def density_spectrum(x, sr, N=None): """ Density spectrum of instantaneous signal :math:`x(t)`. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency :math:`f_s`. + :param sr: Sample rate (Hz) :math:`sr`. :param N: Amount of FFT bins. A density spectrum considers the amplitudes per unit frequency. @@ -738,8 +738,8 @@ def density_spectrum(x, fs, N=None): """ N = N if N else x.shape[-1] - fr = np.fft.fft(x, n=N) / fs - f = np.fft.fftfreq(N, 1.0 / fs) + fr = np.fft.fft(x, n=N) / sr + f = np.fft.fftfreq(N, 1.0 / sr) return np.fft.fftshift(f), np.fft.fftshift(fr) @@ -770,11 +770,11 @@ def integrate_bands(data, a, b): return ((lower < center) * (center <= upper) * data[..., None]).sum(axis=-2) -def bandpass_frequencies(x, fs, frequencies, order=8, purge=False, zero_phase=False): +def bandpass_frequencies(x, sr, frequencies, order=8, purge=False, zero_phase=False): """ "Apply bandpass filters for frequencies :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency. + :param sr: Sample rate (Hz) :math:`sr`. :param frequencies: Frequencies. Instance of :class:`Frequencies`. :param order: Filter order. :param purge: Discard bands of which the upper corner frequency is above the Nyquist frequency. @@ -782,10 +782,10 @@ def bandpass_frequencies(x, fs, frequencies, order=8, purge=False, zero_phase=Fa :returns: Tuple. First element is an instance of :class:`OctaveBand`. The second element an array. """ if purge: - frequencies = frequencies[frequencies.upper < fs / 2.0] + frequencies = frequencies[frequencies.upper < sr / 2.0] return frequencies, np.array( [ - bandpass(x, band.lower, band.upper, fs, order, zero_phase=zero_phase) + bandpass(x, band.lower, band.upper, sr, order, zero_phase=zero_phase) for band in frequencies ] ) @@ -793,7 +793,7 @@ def bandpass_frequencies(x, fs, frequencies, order=8, purge=False, zero_phase=Fa def bandpass_octaves( x, - fs, + sr, frequencies=NOMINAL_OCTAVE_CENTER_FREQUENCIES, order=8, purge=False, @@ -802,7 +802,7 @@ def bandpass_octaves( """Apply 1/1-octave bandpass filters. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency. + :param sr: Sample rate (Hz) :math:`sr`. :param frequencies: Frequencies. :param order: Filter order. :param purge: Discard bands of which the upper corner frequency is above the Nyquist frequency. @@ -812,13 +812,13 @@ def bandpass_octaves( .. seealso:: :func:`octavepass` """ return bandpass_fractional_octaves( - x, fs, frequencies, fraction=1, order=order, purge=purge, zero_phase=zero_phase + x, sr, frequencies, fraction=1, order=order, purge=purge, zero_phase=zero_phase ) def bandpass_third_octaves( x, - fs, + sr, frequencies=NOMINAL_THIRD_OCTAVE_CENTER_FREQUENCIES, order=8, purge=False, @@ -827,7 +827,7 @@ def bandpass_third_octaves( """Apply 1/3-octave bandpass filters. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency. + :param sr: Sample rate (Hz) :math:`sr`. :param frequencies: Frequencies. :param order: Filter order. :param purge: Discard bands of which the upper corner frequency is above the Nyquist frequency. @@ -837,18 +837,18 @@ def bandpass_third_octaves( .. seealso:: :func:`octavepass` """ return bandpass_fractional_octaves( - x, fs, frequencies, fraction=3, order=order, purge=purge, zero_phase=zero_phase + x, sr, frequencies, fraction=3, order=order, purge=purge, zero_phase=zero_phase ) def bandpass_fractional_octaves( - x, fs, frequencies, fraction=None, order=8, purge=False, zero_phase=False + x, sr, frequencies, fraction=None, order=8, purge=False, zero_phase=False ): """Apply 1/N-octave bandpass filters. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency. - :param frequencies: Frequencies. Either instance of :class:`OctaveBand`, or array along with fs. + :param sr: Sample rate (Hz) :math:`sr`. + :param frequencies: Frequencies. Either instance of :class:`OctaveBand`, or array along with sr. :param order: Filter order. :param purge: Discard bands of which the upper corner frequency is above the Nyquist frequency. :param zero_phase: Prevent phase error by filtering in both directions (filtfilt) @@ -859,13 +859,13 @@ def bandpass_fractional_octaves( if not isinstance(frequencies, Frequencies): frequencies = OctaveBand(center=frequencies, fraction=fraction) return bandpass_frequencies( - x, fs, frequencies, order=order, purge=purge, zero_phase=zero_phase + x, sr, frequencies, order=order, purge=purge, zero_phase=zero_phase ) def third_octaves( p, - fs, + sr, density=False, frequencies=NOMINAL_THIRD_OCTAVE_CENTER_FREQUENCIES, ref=REFERENCE_PRESSURE, @@ -873,7 +873,7 @@ def third_octaves( """Calculate level per 1/3-octave in frequency domain using the FFT. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency. + :param sr: Sample rate (Hz) :math:`sr`. :param density: Power density instead of power. :returns: Tuple. First element is an instance of :class:`OctaveBand`. The second element an array. @@ -885,7 +885,7 @@ def third_octaves( """ fob = OctaveBand(center=frequencies, fraction=3) - f, p = power_spectrum(p, fs) + f, p = power_spectrum(p, sr) fnb = EqualBand(f) power = integrate_bands(p, fnb, fob) if density: @@ -896,7 +896,7 @@ def third_octaves( def octaves( p, - fs, + sr, density=False, frequencies=NOMINAL_OCTAVE_CENTER_FREQUENCIES, ref=REFERENCE_PRESSURE, @@ -904,7 +904,7 @@ def octaves( """Calculate level per 1/1-octave in frequency domain using the FFT. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency. + :param sr: Sample rate (Hz) :math:`sr`. :param density: Power density instead of power. :param frequencies: Frequencies. :param ref: Reference value. @@ -918,7 +918,7 @@ def octaves( """ fob = OctaveBand(center=frequencies, fraction=1) - f, p = power_spectrum(p, fs) + f, p = power_spectrum(p, sr) fnb = EqualBand(f) power = integrate_bands(p, fnb, fob) if density: @@ -928,12 +928,12 @@ def octaves( def fractional_octaves( - p, fs, start=5.0, stop=16000.0, fraction=3, density=False, ref=REFERENCE_PRESSURE + p, sr, start=5.0, stop=16000.0, fraction=3, density=False, ref=REFERENCE_PRESSURE ): """Calculate level per 1/N-octave in frequency domain using the FFT. N is `fraction`. :param x: Instantaneous signal :math:`x(t)`. - :param fs: Sample frequency. + :param sr: Sample rate (Hz) :math:`sr`. :param density: Power density instead of power. :returns: Tuple. First element is an instance of :class:`OctaveBand`. The second element an array. @@ -944,7 +944,7 @@ def fractional_octaves( .. note:: Exact center frequencies are always calculated. """ fob = OctaveBand(fstart=start, fstop=stop, fraction=fraction) - f, p = power_spectrum(p, fs) + f, p = power_spectrum(p, sr) fnb = EqualBand(f) power = integrate_bands(p, fnb, fob) if density: @@ -952,7 +952,7 @@ def fractional_octaves( level = 10.0 * np.log10(power / ref**2.0) return fob, level - +# FIXME : rename sample_frequency to sample_rate class Filterbank: """ Fractional-Octave filter bank. @@ -1001,9 +1001,9 @@ def filters(self): """ Filters this filterbank consists of. """ - fs = self.sample_frequency + sr = self.sample_frequency return ( - bandpass_filter(lower, upper, fs, order=self.order, output="sos") + bandpass_filter(lower, upper, sr, order=self.order, output="sos") for lower, upper in zip(self.frequencies.lower, self.frequencies.upper) ) @@ -1048,16 +1048,16 @@ def plot_response(self): .. note:: The follow phase response is obtained in case :meth:`lfilter` is used. The method :meth:`filtfilt` results in a zero-phase response. """ - fs = self.sample_frequency + sr = self.sample_frequency fig = plt.figure() ax1 = fig.add_subplot(211) ax2 = fig.add_subplot(212) for f, fc in zip(self.filters, self.frequencies.center): - w, h = freqz(f[0], f[1], int(fs / 2)) # np.arange(fs/2.0)) + w, h = freqz(f[0], f[1], int(sr / 2)) # np.arange(sr/2.0)) ax1.semilogx( - w / (2.0 * np.pi) * fs, 20.0 * np.log10(np.abs(h)), label=str(int(fc)) + w / (2.0 * np.pi) * sr, 20.0 * np.log10(np.abs(h)), label=str(int(fc)) ) - ax2.semilogx(w / (2.0 * np.pi) * fs, np.angle(h), label=str(int(fc))) + ax2.semilogx(w / (2.0 * np.pi) * sr, np.angle(h), label=str(int(fc))) ax1.set_xlabel(r"$f$ in Hz") ax1.set_ylabel(r"$|H|$ in dB re. 1") ax2.set_xlabel(r"$f$ in Hz") @@ -1115,13 +1115,13 @@ def zero_crossings(data): return ((pos[:-1] & npos[1:]) | (npos[:-1] & pos[1:])).nonzero()[0] -def amplitude_envelope(signal, fs, axis=-1): +def amplitude_envelope(signal, sr, axis=-1): """Instantaneous amplitude of tone. The instantaneous amplitude is the magnitude of the analytic signal. :param signal: Signal. - :param fs: Sample frequency. + :param sr: Sample rate (Hz). :param axis: Axis. :returns: Amplitude envelope of `signal`. @@ -1131,11 +1131,11 @@ def amplitude_envelope(signal, fs, axis=-1): return np.abs(hilbert(signal, axis=axis)) -def instantaneous_phase(signal, fs, axis=-1): +def instantaneous_phase(signal, sr, axis=-1): """Instantaneous phase of tone. :param signal: Signal. - :param fs: Sample frequency. + :param sr: Sample rate (Hz). :param axis: Axis. :returns: Instantaneous phase of `signal`. @@ -1148,11 +1148,11 @@ def instantaneous_phase(signal, fs, axis=-1): return np.angle(hilbert(signal, axis=axis)) -def instantaneous_frequency(signal, fs, axis=-1): +def instantaneous_frequency(signal, sr, axis=-1): """Determine instantaneous frequency of tone. :param signal: Signal. - :param fs: Sample frequency. + :param sr: Sample rate (Hz). :param axis: Axis. :returns: Instantaneous frequency of `signal`. @@ -1163,18 +1163,18 @@ def instantaneous_frequency(signal, fs, axis=-1): """ return ( np.diff( - np.unwrap(instantaneous_phase(signal, fs, axis=axis), axis=axis), axis=axis + np.unwrap(instantaneous_phase(signal, sr, axis=axis), axis=axis), axis=axis ) / (2.0 * np.pi) - * fs + * sr ) -def wvd(signal, fs, analytic=True): +def wvd(signal, sr, analytic=True): """Wigner-Ville Distribution :param signal: Signal - :param fs: Sample frequency + :param sr: Sample rate (Hz). :param analytic: Use the analytic signal, calculated using Hilbert transform. .. math:: W_z(n, \\omega) = 2 \\sum_k z^*[n-k]z[n+k] e^{-j\\omega 2kT} @@ -1202,12 +1202,12 @@ def wvd(signal, fs, analytic=True): i = length_time for t in range(length_time): - R[t, tau1] = s[i + tau] * s[i - tau].conj() # In one direction + R[t, tau] = s[i + tau] * s[i - tau].conj() # In one direction R[t, N - (tau + 1)] = R[t, tau + 1].conj() # And the other direction i += 1 W = np.fft.fft(R, length_FFT) / (2 * length_FFT) - f = np.fft.fftfreq(N, 1.0 / fs) + f = np.fft.fftfreq(N, 1.0 / sr) return f, W.T @@ -1216,7 +1216,7 @@ def _sosfiltfilt(sos, x, axis=-1, padtype="odd", padlen=None, method="pad", irle Note that broadcasting does not work. """ from scipy.signal import sosfilt_zi - from scipy.signal._arraytools import odd_ext, axis_slice, axis_reverse + from scipy.signal._arraytools import odd_ext, even_ext, const_ext, axis_slice, axis_reverse x = np.asarray(x) diff --git a/pyproject.toml b/pyproject.toml index f01bc87..a746c01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,6 @@ dependencies = [ "six>=1.16.0", "pandas>=2.2.2", "tabulate>=0.9.0", - "pysoundfile>=0.9.0.post1", ] [project.license] diff --git a/requirements-dev.lock b/requirements-dev.lock index d977247..67f89f4 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -6,132 +6,138 @@ # features: [] # all-features: true # with-sources: false +# generate-hashes: false +# universal: true -e file:. -alabaster==0.7.16 +alabaster==0.7.16 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -anyio==4.4.0 +anyio==4.4.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpx # via jupyter-server -appnope==0.1.4 +appnope==0.1.4 ; platform_system == 'Darwin' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via ipykernel -argon2-cffi==23.1.0 +argon2-cffi==23.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -argon2-cffi-bindings==21.2.0 +argon2-cffi-bindings==21.2.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via argon2-cffi -arrow==1.3.0 +arrow==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via isoduration -asttokens==2.4.1 +asttokens==2.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via stack-data -async-lru==2.0.4 +async-lru==2.0.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -attrs==23.2.0 +attrs==23.2.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via referencing -babel==2.15.0 +babel==2.15.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab-server # via sphinx -beautifulsoup4==4.12.3 +beautifulsoup4==4.12.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -bleach==6.1.0 +bleach==6.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -certifi==2024.7.4 +certifi==2024.7.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpcore # via httpx # via requests -cffi==1.16.0 +cffi==1.16.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') or (python_version < '3.12' and python_version > '3.11' and implementation_name == 'pypy') # via argon2-cffi-bindings - # via pysoundfile -charset-normalizer==3.3.2 + # via pyzmq +charset-normalizer==3.3.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via requests -comm==0.2.2 +colorama==0.4.6 ; sys_platform == 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) + # via ipython + # via pytest + # via sphinx +comm==0.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via ipywidgets -contourpy==1.2.1 +contourpy==1.2.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -coverage==7.6.0 -cycler==0.12.1 +coverage==7.6.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') +cycler==0.12.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -debugpy==1.8.2 +debugpy==1.8.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel -decorator==5.1.1 +decorator==5.1.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython -defusedxml==0.7.1 +defusedxml==0.7.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -docutils==0.18.1 +docutils==0.18.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbsphinx # via sphinx # via sphinx-rtd-theme -exceptiongroup==1.2.2 +exceptiongroup==1.2.2 ; python_version < '3.11' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via anyio # via ipython # via pytest -executing==2.0.1 +executing==2.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via stack-data -fastjsonschema==2.20.0 +fastjsonschema==2.20.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbformat -fonttools==4.53.1 +fonttools==4.53.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -fqdn==1.5.1 +fqdn==1.5.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -h11==0.14.0 +h11==0.14.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpcore -httpcore==1.0.5 +httpcore==1.0.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpx -httpx==0.27.0 +httpx==0.27.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -idna==3.7 +idna==3.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via anyio # via httpx # via jsonschema # via requests -imagesize==1.4.1 +imagesize==1.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -iniconfig==2.0.0 +iniconfig==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via pytest -ipykernel==6.29.5 +ipykernel==6.29.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter # via jupyter-console # via jupyterlab # via qtconsole -ipython==8.26.0 +ipython==8.26.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via ipywidgets # via jupyter-console -ipywidgets==8.1.3 +ipywidgets==8.1.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -isoduration==20.11.0 +isoduration==20.11.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -jedi==0.19.1 +jedi==0.19.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython -jinja2==3.1.4 +jinja2==3.1.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server # via jupyterlab # via jupyterlab-server # via nbconvert # via nbsphinx # via sphinx -json5==0.9.25 +json5==0.9.25 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab-server -jsonpointer==3.0.0 +jsonpointer==3.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -jsonschema==4.23.0 +jsonschema==4.23.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-events # via jupyterlab-server # via nbformat -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2023.12.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -jupyter==1.0.0 +jupyter==1.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -jupyter-client==8.6.2 +jupyter-client==8.6.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-console # via jupyter-server # via nbclient # via qtconsole -jupyter-console==6.6.3 +jupyter-console==6.6.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -jupyter-core==5.7.2 +jupyter-core==5.7.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-client # via jupyter-console @@ -141,71 +147,71 @@ jupyter-core==5.7.2 # via nbconvert # via nbformat # via qtconsole -jupyter-events==0.10.0 +jupyter-events==0.10.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -jupyter-lsp==2.2.5 +jupyter-lsp==2.2.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -jupyter-server==2.14.2 +jupyter-server==2.14.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-lsp # via jupyterlab # via jupyterlab-server # via notebook # via notebook-shim -jupyter-server-terminals==0.5.3 +jupyter-server-terminals==0.5.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -jupyterlab==4.2.4 +jupyterlab==4.2.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via notebook -jupyterlab-pygments==0.3.0 +jupyterlab-pygments==0.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -jupyterlab-server==2.27.3 +jupyterlab-server==2.27.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab # via notebook -jupyterlab-widgets==3.0.11 +jupyterlab-widgets==3.0.11 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipywidgets -kiwisolver==1.4.5 +kiwisolver==1.4.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -markupsafe==2.1.5 +markupsafe==2.1.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jinja2 # via nbconvert -matplotlib==3.9.1 +matplotlib==3.9.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -matplotlib-inline==0.1.7 +matplotlib-inline==0.1.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via ipython -mistune==3.0.2 +mistune==3.0.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -nbclient==0.10.0 +nbclient==0.10.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -nbconvert==7.16.4 +nbconvert==7.16.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter # via jupyter-server # via nbsphinx -nbformat==5.10.4 +nbformat==5.10.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server # via nbclient # via nbconvert # via nbsphinx -nbsphinx==0.9.4 +nbsphinx==0.9.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via nbsphinx-link -nbsphinx-link==1.3.0 +nbsphinx-link==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -nest-asyncio==1.6.0 +nest-asyncio==1.6.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel -notebook==7.2.1 +notebook==7.2.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -notebook-shim==0.2.4 +notebook-shim==0.2.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab # via notebook -numpy==2.0.1 +numpy==2.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via contourpy # via matplotlib # via pandas # via scipy -overrides==7.7.0 +overrides==7.7.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -packaging==24.1 +packaging==24.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-server # via jupyterlab @@ -216,145 +222,149 @@ packaging==24.1 # via qtconsole # via qtpy # via sphinx -pandas==2.2.2 +pandas==2.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -pandocfilters==1.5.1 +pandocfilters==1.5.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -parso==0.8.4 +parso==0.8.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jedi -pexpect==4.9.0 +pexpect==4.9.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via ipython -pillow==10.4.0 +pillow==10.4.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -platformdirs==4.2.2 +platformdirs==4.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-core -pluggy==1.5.0 +pluggy==1.5.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via pytest -prometheus-client==0.20.0 +prometheus-client==0.20.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -prompt-toolkit==3.0.47 +prompt-toolkit==3.0.47 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython # via jupyter-console -psutil==6.0.0 +psutil==6.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel -ptyprocess==0.7.0 +ptyprocess==0.7.0 ; (os_name != 'nt' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11'))) or (sys_platform != 'emscripten' and sys_platform != 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11'))) # via pexpect # via terminado -pure-eval==0.2.3 +pure-eval==0.2.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via stack-data -pycparser==2.22 +pycparser==2.22 ; (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') or (python_version < '3.12' and python_version > '3.11' and implementation_name == 'pypy')) # via cffi -pygments==2.18.0 +pygments==2.18.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython # via jupyter-console # via nbconvert # via qtconsole # via sphinx -pyparsing==3.1.2 +pyparsing==3.1.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -pysoundfile==0.9.0.post1 - # via acoustic-toolbox -pytest==8.3.2 -python-dateutil==2.9.0.post0 +pytest==8.3.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') +python-dateutil==2.9.0.post0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via arrow # via jupyter-client # via matplotlib # via pandas -python-json-logger==2.0.7 +python-json-logger==2.0.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-events -pytz==2024.1 +pytz==2024.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via pandas -pyyaml==6.0.1 +pywin32==306 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) + # via jupyter-core +pywinpty==2.0.13 ; os_name == 'nt' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) + # via jupyter-server + # via jupyter-server-terminals + # via terminado +pyyaml==6.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-events -pyzmq==26.0.3 +pyzmq==26.0.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-client # via jupyter-console # via jupyter-server # via qtconsole -qtconsole==5.5.2 +qtconsole==5.5.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -qtpy==2.4.1 +qtpy==2.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via qtconsole -referencing==0.35.1 +referencing==0.35.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via jsonschema-specifications # via jupyter-events -requests==2.32.3 +requests==2.32.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab-server # via sphinx -rfc3339-validator==0.1.4 +rfc3339-validator==0.1.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via jupyter-events -rfc3986-validator==0.1.1 +rfc3986-validator==0.1.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via jupyter-events -rpds-py==0.19.1 +rpds-py==0.19.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via referencing -ruff==0.5.5 -scipy==1.14.0 +ruff==0.5.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') +scipy==1.14.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -send2trash==1.8.3 +send2trash==1.8.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -setuptools==72.1.0 +setuptools==72.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -six==1.16.0 +six==1.16.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via asttokens # via bleach # via python-dateutil # via rfc3339-validator -sniffio==1.3.1 +sniffio==1.3.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via anyio # via httpx -snowballstemmer==2.2.0 +snowballstemmer==2.2.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -soupsieve==2.5 +soupsieve==2.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via beautifulsoup4 -sphinx==7.3.7 +sphinx==7.3.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via nbsphinx # via nbsphinx-link # via sphinx-rtd-theme # via sphinxcontrib-jquery -sphinx-rtd-theme==1.3.0rc1 +sphinx-rtd-theme==1.3.0rc1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -sphinxcontrib-applehelp==2.0.0 +sphinxcontrib-applehelp==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-devhelp==2.0.0 +sphinxcontrib-devhelp==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-htmlhelp==2.1.0 +sphinxcontrib-htmlhelp==2.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-jquery==4.1 +sphinxcontrib-jquery==4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx-rtd-theme -sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-jsmath==1.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-qthelp==2.0.0 +sphinxcontrib-qthelp==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-serializinghtml==2.0.0 +sphinxcontrib-serializinghtml==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -stack-data==0.6.3 +stack-data==0.6.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython -tabulate==0.9.0 +tabulate==0.9.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -terminado==0.18.1 +terminado==0.18.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server # via jupyter-server-terminals -tinycss2==1.3.0 +tinycss2==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -tomli==2.0.1 +tomli==2.0.1 ; python_version < '3.11' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via jupyterlab # via pytest # via sphinx -tornado==6.4.1 +tornado==6.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-client # via jupyter-server # via jupyterlab # via notebook # via terminado -traitlets==5.14.3 +traitlets==5.14.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via comm # via ipykernel # via ipython @@ -371,26 +381,26 @@ traitlets==5.14.3 # via nbformat # via nbsphinx # via qtconsole -types-python-dateutil==2.9.0.20240316 +types-python-dateutil==2.9.0.20240316 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via arrow -typing-extensions==4.12.2 +typing-extensions==4.12.2 ; python_version < '3.12' or (python_version < '3.11' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11'))) # via anyio # via async-lru # via ipython -tzdata==2024.1 +tzdata==2024.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via pandas -uri-template==1.3.0 +uri-template==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -urllib3==2.2.2 +urllib3==2.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via requests -wcwidth==0.2.13 +wcwidth==0.2.13 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via prompt-toolkit -webcolors==24.6.0 +webcolors==24.6.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -webencodings==0.5.1 +webencodings==0.5.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via bleach # via tinycss2 -websocket-client==1.8.0 +websocket-client==1.8.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -widgetsnbextension==4.0.11 +widgetsnbextension==4.0.11 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipywidgets diff --git a/requirements.lock b/requirements.lock index 8325dae..c7bcdd2 100644 --- a/requirements.lock +++ b/requirements.lock @@ -6,128 +6,133 @@ # features: [] # all-features: true # with-sources: false +# generate-hashes: false +# universal: true -e file:. -alabaster==0.7.16 +alabaster==0.7.16 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -anyio==4.4.0 +anyio==4.4.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpx # via jupyter-server -appnope==0.1.4 +appnope==0.1.4 ; platform_system == 'Darwin' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via ipykernel -argon2-cffi==23.1.0 +argon2-cffi==23.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -argon2-cffi-bindings==21.2.0 +argon2-cffi-bindings==21.2.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via argon2-cffi -arrow==1.3.0 +arrow==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via isoduration -asttokens==2.4.1 +asttokens==2.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via stack-data -async-lru==2.0.4 +async-lru==2.0.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -attrs==23.2.0 +attrs==23.2.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via referencing -babel==2.15.0 +babel==2.15.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab-server # via sphinx -beautifulsoup4==4.12.3 +beautifulsoup4==4.12.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -bleach==6.1.0 +bleach==6.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -certifi==2024.7.4 +certifi==2024.7.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpcore # via httpx # via requests -cffi==1.16.0 +cffi==1.16.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') or (python_version < '3.12' and python_version > '3.11' and implementation_name == 'pypy') # via argon2-cffi-bindings - # via pysoundfile -charset-normalizer==3.3.2 + # via pyzmq +charset-normalizer==3.3.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via requests -comm==0.2.2 +colorama==0.4.6 ; sys_platform == 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) + # via ipython + # via sphinx +comm==0.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via ipywidgets -contourpy==1.2.1 +contourpy==1.2.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -cycler==0.12.1 +cycler==0.12.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -debugpy==1.8.2 +debugpy==1.8.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel -decorator==5.1.1 +decorator==5.1.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython -defusedxml==0.7.1 +defusedxml==0.7.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -docutils==0.18.1 +docutils==0.18.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbsphinx # via sphinx # via sphinx-rtd-theme -exceptiongroup==1.2.2 +exceptiongroup==1.2.2 ; python_version < '3.11' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via anyio # via ipython -executing==2.0.1 +executing==2.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via stack-data -fastjsonschema==2.20.0 +fastjsonschema==2.20.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbformat -fonttools==4.53.1 +fonttools==4.53.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -fqdn==1.5.1 +fqdn==1.5.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -h11==0.14.0 +h11==0.14.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpcore -httpcore==1.0.5 +httpcore==1.0.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via httpx -httpx==0.27.0 +httpx==0.27.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -idna==3.7 +idna==3.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via anyio # via httpx # via jsonschema # via requests -imagesize==1.4.1 +imagesize==1.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -ipykernel==6.29.5 +ipykernel==6.29.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter # via jupyter-console # via jupyterlab # via qtconsole -ipython==8.26.0 +ipython==8.26.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via ipywidgets # via jupyter-console -ipywidgets==8.1.3 +ipywidgets==8.1.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -isoduration==20.11.0 +isoduration==20.11.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -jedi==0.19.1 +jedi==0.19.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython -jinja2==3.1.4 +jinja2==3.1.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server # via jupyterlab # via jupyterlab-server # via nbconvert # via nbsphinx # via sphinx -json5==0.9.25 +json5==0.9.25 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab-server -jsonpointer==3.0.0 +jsonpointer==3.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -jsonschema==4.23.0 +jsonschema==4.23.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-events # via jupyterlab-server # via nbformat -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2023.12.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -jupyter==1.0.0 +jupyter==1.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -jupyter-client==8.6.2 +jupyter-client==8.6.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-console # via jupyter-server # via nbclient # via qtconsole -jupyter-console==6.6.3 +jupyter-console==6.6.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -jupyter-core==5.7.2 +jupyter-core==5.7.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-client # via jupyter-console @@ -137,71 +142,71 @@ jupyter-core==5.7.2 # via nbconvert # via nbformat # via qtconsole -jupyter-events==0.10.0 +jupyter-events==0.10.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -jupyter-lsp==2.2.5 +jupyter-lsp==2.2.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -jupyter-server==2.14.2 +jupyter-server==2.14.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-lsp # via jupyterlab # via jupyterlab-server # via notebook # via notebook-shim -jupyter-server-terminals==0.5.3 +jupyter-server-terminals==0.5.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -jupyterlab==4.2.4 +jupyterlab==4.2.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via notebook -jupyterlab-pygments==0.3.0 +jupyterlab-pygments==0.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -jupyterlab-server==2.27.3 +jupyterlab-server==2.27.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab # via notebook -jupyterlab-widgets==3.0.11 +jupyterlab-widgets==3.0.11 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipywidgets -kiwisolver==1.4.5 +kiwisolver==1.4.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -markupsafe==2.1.5 +markupsafe==2.1.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jinja2 # via nbconvert -matplotlib==3.9.1 +matplotlib==3.9.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -matplotlib-inline==0.1.7 +matplotlib-inline==0.1.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via ipython -mistune==3.0.2 +mistune==3.0.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -nbclient==0.10.0 +nbclient==0.10.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -nbconvert==7.16.4 +nbconvert==7.16.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter # via jupyter-server # via nbsphinx -nbformat==5.10.4 +nbformat==5.10.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server # via nbclient # via nbconvert # via nbsphinx -nbsphinx==0.9.4 +nbsphinx==0.9.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via nbsphinx-link -nbsphinx-link==1.3.0 +nbsphinx-link==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -nest-asyncio==1.6.0 +nest-asyncio==1.6.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel -notebook==7.2.1 +notebook==7.2.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -notebook-shim==0.2.4 +notebook-shim==0.2.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab # via notebook -numpy==2.0.1 +numpy==2.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via contourpy # via matplotlib # via pandas # via scipy -overrides==7.7.0 +overrides==7.7.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -packaging==24.1 +packaging==24.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-server # via jupyterlab @@ -211,140 +216,144 @@ packaging==24.1 # via qtconsole # via qtpy # via sphinx -pandas==2.2.2 +pandas==2.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -pandocfilters==1.5.1 +pandocfilters==1.5.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -parso==0.8.4 +parso==0.8.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jedi -pexpect==4.9.0 +pexpect==4.9.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via ipython -pillow==10.4.0 +pillow==10.4.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -platformdirs==4.2.2 +platformdirs==4.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-core -prometheus-client==0.20.0 +prometheus-client==0.20.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -prompt-toolkit==3.0.47 +prompt-toolkit==3.0.47 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython # via jupyter-console -psutil==6.0.0 +psutil==6.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel -ptyprocess==0.7.0 +ptyprocess==0.7.0 ; (os_name != 'nt' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11'))) or (sys_platform != 'emscripten' and sys_platform != 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11'))) # via pexpect # via terminado -pure-eval==0.2.3 +pure-eval==0.2.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via stack-data -pycparser==2.22 +pycparser==2.22 ; (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') or (python_version < '3.12' and python_version > '3.11' and implementation_name == 'pypy')) # via cffi -pygments==2.18.0 +pygments==2.18.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython # via jupyter-console # via nbconvert # via qtconsole # via sphinx -pyparsing==3.1.2 +pyparsing==3.1.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via matplotlib -pysoundfile==0.9.0.post1 - # via acoustic-toolbox -python-dateutil==2.9.0.post0 +python-dateutil==2.9.0.post0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via arrow # via jupyter-client # via matplotlib # via pandas -python-json-logger==2.0.7 +python-json-logger==2.0.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-events -pytz==2024.1 +pytz==2024.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via pandas -pyyaml==6.0.1 +pywin32==306 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) + # via jupyter-core +pywinpty==2.0.13 ; os_name == 'nt' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) + # via jupyter-server + # via jupyter-server-terminals + # via terminado +pyyaml==6.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-events -pyzmq==26.0.3 +pyzmq==26.0.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-client # via jupyter-console # via jupyter-server # via qtconsole -qtconsole==5.5.2 +qtconsole==5.5.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter -qtpy==2.4.1 +qtpy==2.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via qtconsole -referencing==0.35.1 +referencing==0.35.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via jsonschema-specifications # via jupyter-events -requests==2.32.3 +requests==2.32.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab-server # via sphinx -rfc3339-validator==0.1.4 +rfc3339-validator==0.1.4 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via jupyter-events -rfc3986-validator==0.1.1 +rfc3986-validator==0.1.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via jupyter-events -rpds-py==0.19.1 +rpds-py==0.19.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema # via referencing -scipy==1.14.0 +scipy==1.14.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -send2trash==1.8.3 +send2trash==1.8.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -setuptools==72.1.0 +setuptools==72.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyterlab -six==1.16.0 +six==1.16.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via asttokens # via bleach # via python-dateutil # via rfc3339-validator -sniffio==1.3.1 +sniffio==1.3.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via anyio # via httpx -snowballstemmer==2.2.0 +snowballstemmer==2.2.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -soupsieve==2.5 +soupsieve==2.5 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via beautifulsoup4 -sphinx==7.3.7 +sphinx==7.3.7 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox # via nbsphinx # via nbsphinx-link # via sphinx-rtd-theme # via sphinxcontrib-jquery -sphinx-rtd-theme==1.3.0rc1 +sphinx-rtd-theme==1.3.0rc1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -sphinxcontrib-applehelp==2.0.0 +sphinxcontrib-applehelp==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-devhelp==2.0.0 +sphinxcontrib-devhelp==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-htmlhelp==2.1.0 +sphinxcontrib-htmlhelp==2.1.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-jquery==4.1 +sphinxcontrib-jquery==4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx-rtd-theme -sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-jsmath==1.0.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-qthelp==2.0.0 +sphinxcontrib-qthelp==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -sphinxcontrib-serializinghtml==2.0.0 +sphinxcontrib-serializinghtml==2.0.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via sphinx -stack-data==0.6.3 +stack-data==0.6.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipython -tabulate==0.9.0 +tabulate==0.9.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via acoustic-toolbox -terminado==0.18.1 +terminado==0.18.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server # via jupyter-server-terminals -tinycss2==1.3.0 +tinycss2==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via nbconvert -tomli==2.0.1 +tomli==2.0.1 ; python_version < '3.11' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11')) # via jupyterlab # via sphinx -tornado==6.4.1 +tornado==6.4.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipykernel # via jupyter-client # via jupyter-server # via jupyterlab # via notebook # via terminado -traitlets==5.14.3 +traitlets==5.14.3 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via comm # via ipykernel # via ipython @@ -361,26 +370,26 @@ traitlets==5.14.3 # via nbformat # via nbsphinx # via qtconsole -types-python-dateutil==2.9.0.20240316 +types-python-dateutil==2.9.0.20240316 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via arrow -typing-extensions==4.12.2 +typing-extensions==4.12.2 ; python_version < '3.12' or (python_version < '3.11' and (python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11'))) # via anyio # via async-lru # via ipython -tzdata==2024.1 +tzdata==2024.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via pandas -uri-template==1.3.0 +uri-template==1.3.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -urllib3==2.2.2 +urllib3==2.2.2 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via requests -wcwidth==0.2.13 +wcwidth==0.2.13 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via prompt-toolkit -webcolors==24.6.0 +webcolors==24.6.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jsonschema -webencodings==0.5.1 +webencodings==0.5.1 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via bleach # via tinycss2 -websocket-client==1.8.0 +websocket-client==1.8.0 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via jupyter-server -widgetsnbextension==4.0.11 +widgetsnbextension==4.0.11 ; python_version <= '3.11' or python_version >= '3.12' or (python_version < '3.12' and python_version > '3.11') # via ipywidgets