Note: After version 4.12.1 this changelog is deprecated. Releases will in future be documented in Github's releases page.
All notable changes to the project will be documented in this file, with format based on Keep a Changelog.
We apply the "major.minor.micro" versioning scheme defined in PEP 440.
Click link to see all unreleased changes to the master branch of the repository. For comparison to specific branches, use the GitHub compare page.
4.12.1 (29.11.2023)
This release includes pull request #109.
qats.signal.find_maxima()
: parameter up
is deprecated (had no impact on output with the updated procedure).
qats.signal.find_maxima()
:consistent handling of half-cycles at beginning/end of time series and avoid that end-point is included. This fixes issue #106.- [dev] testing: added a test for
qats.signal.find_maxima()
that would have caught this issue.
- [dev] testing: added a test for
- [GUI] On unix, GUI settings are now fetched from/stored to
~/.config/qats.settings
. This fixes issue #108
4.11.1 (03.01.2023)
[dev] Fix documentation build on Read the Docs by adding build configuration file (.readthedocs.yaml
).
4.11.0 (03.01.2023)
This release includes pull requests #98, #99, #101, #103 and #104.
- Python version support [PR #101]
- Added support for Python 3.10
- Removed support for Python 3.6
- Documentation (https://qats.readthedocs.io)
qats.signal
: functionfind_maxima()
now always returns indices of maxima and optional parameterretind
is removed. [PR #104]
- Command line interface (CLI) improvements. [PR #98]
- Added Hook enabling
python -m qats app
as an equivalent toqats app
(the entry point executable). - Added
config
option--link-app-no-exe
that generates Windows Start menu shortcut utilizing the new CLI hook (instead of entry point executable).
- Added Hook enabling
qats.stats.weibull
: added Weibull distribution tail-fitting using least squares (qats.stats.weibull.lse()
). [PR #104]
- Support for reading wind turbine key-files (
key_<>_witurb.txt
) exported from SIMA/RIFLEX version >=4.20 (where wind turbine name is included in a column to the left of time series name). [issue #97] TimeSeries.minima()
threshold error. [issue #95]
4.10.0 (25.05.2022)
Time series can now be exported to SIMA HDF5 format. Errors are no longer raised when having timeseries from different drives in the same time series database.
4.9.2 (03.12.2020)
Corrected npTDMS
version requirement in setup.py
.
4.9.1 (03.12.2020)
Updated setup.py
and requirements.txt
to latest versions of dependencies.
4.9.0 (18.11.2020)
This release contains pull request #79.
- [GUI] Statistics table may is now sorted in ascending/descending order when column header is clicked. The sorting order is reset when 'Display' is invoked.
- [GUI] Added setting that controls number of decimals in time window for data processing.
TsDB.stats_dataframe()
: new method that returns statistics in a Pandas dataframe with same structure and behaviour as the dict returned fromTsDB.stats()
.qats.readers.sima
: Added support for wind turbine output from SIMA/RIFLEX, i.e. reading of<prefix>_witurb.bin
and<prefix>_blresp.bin
.
TsDB.stats()
: default value of parameterstatsdur
is set to 10800 [s] instead ofNone
. Previously failed if this parameter was not passed, since the underlying functionTimeSeries.stats()
did not accept/handleNone
.qats.readers.tdms
: Changed how tdms-files are opened and avoid number of obsolete iterations when inferring the time array to improve the performance of the tdms-reader.
4.8.1 (08.06.2020)
This release contains the following pull requests: #74, #76, #77.
qats.readers.sima_h5
: Time step of generated time array is now checked towards the specified time step with a (very small) tolerance. Previously, the generated time step was required to exactly match the specified one, but in certain cases this failed due to numpy precision.qats.readers.tdms
: Removes dependencies on deprecated features in thenptdms
library.qats.TimeSeries
: Now handles time as an array ofnumpy.datetime64
objects.requirements.txt
: Sphinx updated from 2.2.1 to 3.0.4 (security update, relevant for maintainers only).
4.8.0 (10.04.2020)
This release contains the two following pull requests: #67, #72.
- New reader for .tdms files (Technical Data Management Streaming - file format used by LabVIEW), based on the
npTDMS
module. - New dependency to
npTDMS
; https://pypi.org/project/npTDMS/.
- Improved compatibility with special characters, such as accents etc. when reading data from CSV files; ref. #69.
- Improved compatibility for various data types (integer, numpy.int64 etc.) when initiating
TimeSeries
instance; ref. #71. - Fixed bug causing time series names to vanish when exporting single time series to file; ref. #70.
4.7.0 (15.01.2020)
Three functions have been added to submodule qats.signal
:
qats.signal.csd()
: Estimate cross power spectral density of discrete-time signals X and Y using Welch’s method.qats.signal.coherence()
: Estimate the magnitude squared coherence estimate of discrete-time signals X and Y using Welch’s method.qats.signal.tfe()
: Estimate the transfer function between two discrete-time signals X and Y using Welch’s method.
For details, see the API documentation. Note that these new functions are all wrappers for relevant functions available from scipy.signal
.
There are significant changes to subpackage qats.fatigue
, and in particular for the qats.fatigue.rainflow
module. Most changes are related to performance for large cycle distributions, and the output type is changed from list
to numpy.ndarray
for several of the functions. This allows for adjusted syntax, however; the changes are backwards compatible in the sense that the old syntax will still work. For function qats.fatigue.rainflow.mesh()
, the mesh returned deviates from the mesh calculated for version <= 4.6.1 (mesh calculated for these versions was not correct).
Main changes are as follows:
-
qats.fatigue.sn
:SNCurve.n()
now accepts float or array as input, and returns the same type as the input (float or array).minersum()
is updated to utilize this, performing array operation instead of time consuming list comprehension (with multiple calls toSNCurve.n()
). -
qats.fatigue.sn.minersum()
is now more flexible wrt. thesn
input parameter. Three different data types are accepted: 1) a dict; in this case the dict is used to initiate anSNCurve
instance (as before), 2) a class instance; in this case the object is expected to have a callable methodn()
(as before, but more flexible wrt. type of class instance), 3) a callable (a function); the function must accept stress ranges as the first positional argument. Parametersargs
andkwds
are introduced to enable forwarding of arguments to the callable - this is relevant for alt. 2) (when instance passed is notSNCurve
) and alt. 3). -
qats.fatigue.rainflow.count_cycles()
now returns a numpy array with shape(n, 3)
, whereas previously it return a list of 3-tuples.n
is here the number of cycles and half cycles. Unpacking may now be done asr, m, c = count_cycles(series).T
, which is much faster for largen
than the old syntaxr, m, c = zip(*count_cycles(series)
. The latter may still be used however, hence this change is backwards compatible. A minor change from qats version <= 4.6.1 is that the count is now always either 1.0 (full cycles) or 0.5 (half cycles). Matching cycles (same range and mean) are no longer matched with increased count, but rather included as individual cycles. This is of no importance at all, except that the return array may be longer in some few cases (however; sum of the counts, i.e. the sum of the 3rd column, is unchanged). -
qats.fatigue.rainflow.rebin()
now returns a numpy array similar to that returned fromcount_cycles()
. Rebinning is now done by use ofnp.histogram()
, which significantly increases the speed. A minor change from qats version <= 4.6.1 is that cycles ranges (or means) that end up on the edge of a bin is placed in the highest bin. This is more conservative, and in most cases there will be no difference at all (since very few cycles will normally coincide with bin edges). -
qats.fatigue.rainflow.mesh()
: mesh established for qats version <= 4.6.1 is not correct. The function is now re-written, usingnp.histogram2d()
andnp.meshgrid()
. For further details about the properties of the mesh established, see the function docstring or the API documentation. -
qats.fatigue.corrections.goodman_haigh()
now accepts (and returns) np.ndarray, and utilizes this for efficiency. See docstring or API documentation for details and an example.
4.6.1 (26.11.2019)
- Catch and log KeyError occuring when trying to load the same time series file twice.
- Make the displayed time series names uneditable
4.6.0 (14.11.2019)
New reader for SINTEF Ocean data exchange format based on Matlab .mat files. It now supports all .mat file format versions <=7.3.
TsDB
has a new attribute uuid
with a universally unique identifier.
TsDB
now supports length, membership and equality operations like:
from qats import TsDB
db = TsDB.fromfile('data.csv')
db_two = TsDB()
len(db)
# output: 14
'ts_a_name' in db
# output: True
db_two == db
# output: False
The file format previously referred to as Matlab files is now more precisely described as the data exchange format used by SINTEF Ocean. The submodule qats.readers.matlab
has been renamed to qats.readers.sintef_mat
. Note: for backwards compatibilty, the submodule is still available as qats.readers.matlab
due to aliased import at qats.readers
level.
The __repr__
and __str__
methods on the TsDB
class are improved to better serve their indented purposes, respectively: unambiguous and readable.
Previously iteration of a TsDB
instance would return None
for those time series which data was not loaded from file. Now iteration return TimeSeries
instances for those time series which data has been loaded from file and skip the other.
Updated the package and environment requirements.
Prevent error raised when the env. variable APPDATA
does not exist.
4.5.0 (05.11.2019)
File menu action that clears the logger widget. Hot key Ctrl+Shift+Del
.
A bug that caused the time series tooltip to only display the time series' relative path, not the absolute path.
4.4.0 (04.11.2019)
qats.fatigue.rainflow
module:
- Introduced a new optional parameter
endpoints
(bool) to functionsreversals()
,cycles()
andcycle_counting()
. If set to True, first and last points in series passed are included as cycle start/end points. This is convenient if the series passed is already an array of reversal points, but should in general not be used otherwise. Default isendpoints=False
, which gives the same behavior as before.
.plot_*()
methods of TimeSeries
and TsDB
classes (for background and more details, see issue #55):
- Introduced optional parameter
num
, to controlmatplotlib.pyplot
figure number. - Introduced optional parameter
show
(bool), to control whetherpyplot.show()
is invoked or not. .plot_cycle_range()
: introduced optional parameterbw
, to control bar width.
TimeSeries.stats()
:np.nan
is inserted for statistical values that cannot be calculated (e.g. Weibull parameters if fit fails).- Desktop application (GUI), statistics tab: fixed issues related to clearing the table, updating when Weibull fit fails and mismatch between values and table heading. For details, see issue #58.
4.3.0 (30.10.2019)
The desktop application now:
- Has a separate tab with tabulated time series statistics. The statistics can be copied to clipboard.
- Enable user configuration of certain settings. The settings are saved between sessions.
The library now uses Scipy IIR filters instead of the self-made filters. Mainly to improve handling of edge effects and to simplify maintenance.
Restructured the functions for calculating power spectral density. Note: The desktop application now apply a default segment length of 1000 points when estimating power spectral density using Welch's method. This can be adjusted in the application settings dialog. Previously the default segment length was 1/4 of the signal length.
4.2.0 (23.09.2019)
Replaced hard dependency on PyQt5
with QtPy
, due to PyQt5
's strong copyleft GPL license. QtPy
is a shim over various Qt bindings such as: PyQt4
, PyQt5
, Pyside
and Pyside2
. The user must now install the preferred binding himself/herself, in order to use the GUI.
Note: If several qt bindings are installed (e.g. PyQt5
and Pyside2
), the environmental variable QT_API
may be used to control which binding is used. See https://pypi.org/project/QtPy/ for details.
4.1.1 (17.09.2019)
qats.signal.psd()
: sampling frequencyfs
in the welch function call corrected tofs=1./dt
(instead offs=dt
which was wrong). This error appeared between versions 4.0.1 and 4.1.0, and also affectedTimeSeries.psd()
and the "Power Spectrum" plot tab in the GUI.TimeSeries.plot*()
methods: plot label is now set to time series name, to avoid warning when legends are invoked.
Four new tests on qats.signal.psd()
that would have caught the bug described above.
4.1.0 (28.08.2019)
qats.signal.psd()
: power spectral density calculation (now available as detached function, was previously available only throughTimeSeries.psd()
).test_readers.py
: new test module for loading (reading) all supported file formats.test_signal.py
: added more tests forqats.signal
functions.
4.0.1 (23.08.2019)
- SIMA .h5 reader bug that occured if numpy 1.16 is used.
qats.cli.launch_app()
did not connectsys.excepthook
with custom error traceback dialogue.
4.0.0 (22.08.2019)
This release is not backwards compatible. Main updates are related to fatigue calculation capabilities.
- New sub-package
qats.fatigue
for fatigue-related modules. Modules in this sub-package:corrections
(new),rainflow
(moved),sncalc
(new) - New sub-package
qats.stats
for modules with statistical distributions. Modules in this sub-package:empirical
(moved + new name),gumbel
(moved),gumbelmin
(moved),weibull
(moved) - Rainflow counting algorithm now also extracts mean value of cycles (see
qats.fatigue.rainflow.cycles()
and.count_cycles()
). - Class method
TsDB.getl()
("get list"). - New module
motions.py
, for transformations and operations related to motion time series. - Changelog (this file)
- Sub-module
rainflow
moved into sub-packageqats.fatigue
=>qats.fatigue.rainflow
- Sub-modules
gumbel
,gumbelmin
andweibull
moved into sub-packageqats.stats
=>qats.fatigue.
- Sub-module
stats
renamed toempirical
and moved into sub-packageqats.stats
=>qats.stats.empirical
- Documentation updated with new API reference structure.
- Changed
TsDB.getd()
method ("get dict") to return dict ofTimeSeries
objects, which is identical toTsDB.getm()
. For previous functionality of.getd()
, useTsDB.getda()
("get dict of arrays").
- Wildcard prepending to names specified to
TsDB.list()
andTsDB.get*()
methods. See this summary for details.
3.0.6 (27.06.2019)
- Issues related to proper deployment to PyPI and Read the Docs.
- Bug when using band-stop filter in GUI.
3.0.5 (26.06.2019)
First proper release to PyPI.