From 56e72cc75a84c75d1fc9d5feb18c5cbd7d402a14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 20:45:40 +0000 Subject: [PATCH 01/48] Bump tensorflow from 2.9.1 to 2.9.3 Bumps [tensorflow](https://github.com/tensorflow/tensorflow) from 2.9.1 to 2.9.3. - [Release notes](https://github.com/tensorflow/tensorflow/releases) - [Changelog](https://github.com/tensorflow/tensorflow/blob/master/RELEASE.md) - [Commits](https://github.com/tensorflow/tensorflow/compare/v2.9.1...v2.9.3) --- updated-dependencies: - dependency-name: tensorflow dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- requirements_dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_dev.txt b/requirements_dev.txt index 2699bd5..94f5661 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -13,5 +13,5 @@ plotly==5.9.0 lmfit==1.0.3 statsmodels==0.13.2 scipy==1.8.1 -tensorflow==2.9.1 +tensorflow==2.9.3 deprecation==2.1.0 \ No newline at end of file From ff2ba970604c30d40d0ba66c4d92c396d598b589 Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Fri, 9 Dec 2022 15:44:41 -0500 Subject: [PATCH 02/48] put paper in its own directory --- paper.bib | 43 ------------- paper.md | 52 --------------- paper/figure1.png | Bin 0 -> 49665 bytes paper/paper.bib | 148 +++++++++++++++++++++++++++++++++++++++++++ paper/paper.md | 157 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 305 insertions(+), 95 deletions(-) delete mode 100644 paper.bib delete mode 100644 paper.md create mode 100644 paper/figure1.png create mode 100644 paper/paper.bib create mode 100644 paper/paper.md diff --git a/paper.bib b/paper.bib deleted file mode 100644 index 4e14304..0000000 --- a/paper.bib +++ /dev/null @@ -1,43 +0,0 @@ -@article{scheffer2009early, - title={Early-warning signals for critical transitions}, - author={Scheffer, Marten and Bascompte, Jordi and Brock, William A and Brovkin, Victor and Carpenter, Stephen R and Dakos, Vasilis and Held, Hermann and Van Nes, Egbert H and Rietkerk, Max and Sugihara, George}, - journal={Nature}, - volume={461}, - number={7260}, - pages={53--59}, - year={2009}, - publisher={Nature Publishing Group} -} - -@article{clements2018indicators, - title={Indicators of transitions in biological systems}, - author={Clements, Christopher F and Ozgul, Arpat}, - journal={Ecology letters}, - volume={21}, - number={6}, - pages={905--919}, - year={2018}, - publisher={Wiley Online Library} -} - -@article{bury2020detecting, - title={Detecting and distinguishing tipping points using spectral early warning signals}, - author={Bury, Thomas M and Bauch, Chris T and Anand, Madhur}, - journal={Journal of the Royal Society Interface}, - volume={17}, - number={170}, - pages={20200482}, - year={2020}, - publisher={The Royal Society} -} - -@article{bury2021deep, - title={Deep learning for early warning signals of tipping points}, - author={Bury, Thomas M and Sujith, RI and Pavithran, Induja and Scheffer, Marten and Lenton, Timothy M and Anand, Madhur and Bauch, Chris T}, - journal={Proceedings of the National Academy of Sciences}, - volume={118}, - number={39}, - pages={e2106140118}, - year={2021}, - publisher={National Acad Sciences} -} \ No newline at end of file diff --git a/paper.md b/paper.md deleted file mode 100644 index 548fd0f..0000000 --- a/paper.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: 'ewstools: A Python package for early warning signals of bifurcations in time series data.' -tags: - - Python - - time series - - early warning signal - - tipping point - - dynamical system - - bifurcation -authors: - - name: Thomas M. Bury - equal-contrib: false - orcid: 0000-0003-1595-9444 - affiliation: "1, 2" # (Multiple affiliations must be quoted) -affiliations: - - name: Department of Physiology, McGill University, Montréal, Canada - index: 1 - - name: Department of Applied Mathematics, University of Waterloo, Waterloo, Canada - index: 2 -date: 17 August 2022 -bibliography: paper.bib ---- - - -# Summary - -Many systems across nature and society have the capacity to undergo an abrupt and -profound change in their dynamics. From a dynamical systemes perspective, these events -are often associated with the crossing of a bifurcation. Early warning signals (EWS) -for bifurcations are therefore in high demand. Two commonly used EWS for bifurcations -are variance and lag-1 autocorrelation, that are expected to increase prior to many -bifurcations due to critical slowing down [@scheffer2009early]. There now exist a -wealth of other EWS based on changes in time series dynamics that are expected to occur -prior to bifurcations [@clements2018indicators]. More recently, deep learning -classifiers have been trained and applied to detect bifurcations, with promising -results [@bury2021deep] - - -``EWStools`` is a Python package for computing, analysing, and visualising -early warning signals in time series data. - - -# Acknowledgements - -TMB acknowledges contributions from Chris T. Bauch (University of Waterloo) -on code for training deep learning classifiers. This project is currently supported by the -Fonds de recherche du Québec (FRQ) -and has received funding in the past from the -Natural Sciences and Engineering Research Council of Canada (NSERC). - - -# References \ No newline at end of file diff --git a/paper/figure1.png b/paper/figure1.png new file mode 100644 index 0000000000000000000000000000000000000000..293caec6109b1b834211d73b97da0b38524c9349 GIT binary patch literal 49665 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

8$-Km<8+p7LiC+^HgNhKGi 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 literal 0 HcmV?d00001 diff --git a/paper/paper.bib b/paper/paper.bib new file mode 100644 index 0000000..82c675f --- /dev/null +++ b/paper/paper.bib @@ -0,0 +1,148 @@ +@article{scheffer2009early, + title={Early-warning signals for critical transitions}, + author={Scheffer, Marten and Bascompte, Jordi and Brock, William A and Brovkin, Victor and Carpenter, Stephen R and Dakos, Vasilis and Held, Hermann and Van Nes, Egbert H and Rietkerk, Max and Sugihara, George}, + journal={Nature}, + volume={461}, + number={7260}, + pages={53--59}, + year={2009}, + publisher={Nature Publishing Group} +} + +@article{clements2018indicators, + title={Indicators of transitions in biological systems}, + author={Clements, Christopher F and Ozgul, Arpat}, + journal={Ecology letters}, + volume={21}, + number={6}, + pages={905--919}, + year={2018}, + publisher={Wiley Online Library} +} + +@article{bury2020detecting, + title={Detecting and distinguishing tipping points using spectral early warning signals}, + author={Bury, Thomas M and Bauch, Chris T and Anand, Madhur}, + journal={Journal of the Royal Society Interface}, + volume={17}, + number={170}, + pages={20200482}, + year={2020}, + publisher={The Royal Society} +} + +@article{bury2021deep, + title={Deep learning for early warning signals of tipping points}, + author={Bury, Thomas M and Sujith, RI and Pavithran, Induja and Scheffer, Marten and Lenton, Timothy M and Anand, Madhur and Bauch, Chris T}, + journal={Proceedings of the National Academy of Sciences}, + volume={118}, + number={39}, + pages={e2106140118}, + year={2021}, + publisher={National Acad Sciences} +} + +@article{dakos2012methods, + title={Methods for detecting early warnings of critical transitions in time series illustrated using simulated ecological data}, + author={Dakos, Vasilis and Carpenter, Stephen R and Brock, William A and Ellison, Aaron M and Guttal, Vishwesha and Ives, Anthony R and K{\'e}fi, Sonia and Livina, Valerie and Seekell, David A and van Nes, Egbert H and others}, + journal={PloS one}, + volume={7}, + number={7}, + pages={e41010}, + year={2012}, + publisher={Public Library of Science San Francisco, USA} +} + +@article{genin2018monitoring, + title={Monitoring ecosystem degradation using spatial data and the R package spatialwarnings}, + author={G{\'e}nin, Alexandre and Majumder, Sabiha and Sankaran, Sumithra and Danet, Alain and Guttal, Vishwesha and Schneider, Florian D and K{\'e}fi, Sonia}, + journal={Methods in Ecology and Evolution}, + volume={9}, + number={10}, + pages={2067--2075}, + year={2018}, + publisher={Wiley Online Library} +} + + +@article{harris2020array, + title={Array programming with NumPy}, + author={Harris, Charles R and Millman, K Jarrod and Van Der Walt, St{\'e}fan J and Gommers, Ralf and Virtanen, Pauli and Cournapeau, David and Wieser, Eric and Taylor, Julian and Berg, Sebastian and Smith, Nathaniel J and others}, + journal={Nature}, + volume={585}, + number={7825}, + pages={357--362}, + year={2020}, + publisher={Nature Publishing Group} +} + +@article{newville2016lmfit, + title={LMFIT: Non-linear least-square minimization and curve-fitting for Python}, + author={Newville, Matthew and Stensitzki, Till and Allen, Daniel B and Rawlik, Michal and Ingargiola, Antonino and Nelson, Andrew}, + journal={Astrophysics Source Code Library}, + pages={ascl--1606}, + year={2016} +} + +@inproceedings{mckinney2010data, + title={Data structures for statistical computing in python}, + author={McKinney, Wes and others}, + booktitle={Proceedings of the 9th Python in Science Conference}, + volume={445}, + number={1}, + pages={51--56}, + year={2010}, + organization={Austin, TX} +} + +@online{plotly, + author = {Plotly Technologies Inc.}, + title = {Collaborative data science}, + publisher = {Plotly Technologies Inc.}, + address = {Montreal, QC}, + year = {2015}, + url = {https://plot.ly} } + + +@software{sheppard_2015_15681, + author = {Sheppard, Kevin}, + title = {ARCH Toolbox for Python}, + month = feb, + year = 2015, + note = {{GitHub repository: + https://github.com/bashtage/arch}}, + publisher = {Zenodo}, + doi = {10.5281/zenodo.15681}, + url = {https://doi.org/10.5281/zenodo.15681} +} + + +@inproceedings{seabold2010statsmodels, + title={statsmodels: Econometric and statistical modeling with python}, + author={Seabold, Skipper and Perktold, Josef}, + booktitle={9th Python in Science Conference}, + year={2010}, +} + + +@article{virtanen2020scipy, + title={SciPy 1.0: fundamental algorithms for scientific computing in Python}, + author={Virtanen, Pauli and Gommers, Ralf and Oliphant, Travis E and Haberland, Matt and Reddy, Tyler and Cournapeau, David and Burovski, Evgeni and Peterson, Pearu and Weckesser, Warren and Bright, Jonathan and others}, + journal={Nature methods}, + volume={17}, + number={3}, + pages={261--272}, + year={2020}, + publisher={Nature Publishing Group} +} + + +@inproceedings{abadi2016tensorflow, + title={$\{$TensorFlow$\}$: a system for $\{$Large-Scale$\}$ machine learning}, + author={Abadi, Mart{\'\i}n and Barham, Paul and Chen, Jianmin and Chen, Zhifeng and Davis, Andy and Dean, Jeffrey and Devin, Matthieu and Ghemawat, Sanjay and Irving, Geoffrey and Isard, Michael and others}, + booktitle={12th USENIX symposium on operating systems design and implementation (OSDI 16)}, + pages={265--283}, + year={2016} +} + + diff --git a/paper/paper.md b/paper/paper.md new file mode 100644 index 0000000..a0797d6 --- /dev/null +++ b/paper/paper.md @@ -0,0 +1,157 @@ +--- +title: 'ewstools: A Python package for early warning signals of bifurcations in time series data' +tags: + - Python + - time series + - early warning signal + - tipping point + - dynamical system + - bifurcation +authors: + - name: Thomas M. Bury + equal-contrib: false + orcid: 0000-0003-1595-9444 + affiliation: "1, 2" # (Multiple affiliations must be quoted) +affiliations: + - name: Department of Physiology, McGill University, Montréal, Canada + index: 1 + - name: Department of Applied Mathematics, University of Waterloo, Waterloo, Canada + index: 2 +date: 17 August 2022 +bibliography: paper.bib +--- + + +# Summary + +Many systems in nature and society have the capacity to undergo critical transitions-- +sudden and profound changes in their dynamics that are hard to reverse. +Consider for example the outbreak of disease, the collapse of an ecosystem, or the onset +of a cardiac arrhythmia. +From a mathematical perspective, these transitions are often understood as the +crossing of a bifurcation (tipping point) in an appropriate dynamical system model. +In 2009, Scheffer and colleagues proposed that features of bifurcations that are manifested +in time series data could provide an early warning signal (EWS) for their +arrival [@scheffer2009early]. +This created massive interest in the subject of EWS from a wide range scientific disciplines. +Now, there exist a multitude of different EWS and associated methods for +anticipating bifurcations [@clements2018indicators]. + + +The goal of `ewstools` is to provide an accessible toolbox for computing, analysing and +visualising EWS in Python. + + +`ewstools` is a Python package to compute, analyse and visualise early warning signals in time series data. +The package provides: + +- Python API and a command-line interface for wide accessibility +- Automatic dataset splitting and cross-validation +- Five models from various back-ends in a unified interface that cover a broad range of common use cases +- Solutions for very large datasets and heteroskedastic data +- Integrated plotting and evaluation functions to quickly check the validity of the model fit and results +- Comprehensive and interactive tutorials + + + +Earlier versions of `ewstools` were used in the following publications: +- @bury2020detecting +- @bury2021deep + + + + + + + +It complements a popular EWS package written in R [@dakos2012methods]. +My hope that having an EWS toolbox in Python will allow for additional testing, +and appeal to those who primarily work in Python. + + + + +To date, it includes methods to detrend time series + + + +More recently, deep learning +classifiers have been trained and applied to detect bifurcations, with promising +results [@bury2021deep] + + + +# Statement of need + + + + +`ewstools` makes use of several other Python packages, including +pandas [@mckinney2010data] for dataframe handling, +numpy [@harris2020array] for fast numerical computing, +plotly [@plotly] for visuliastion, +lmfit [@newville2016lmfit] for least-squares minimisation, +arch [@sheppard_2015_15681] for bootstrapping methods, +statsmodels [@seabold2010statsmodels] and scipy [@virtanen2020scipy] for detrending methods, +and TensorFlow [@abadi2016tensorflow] for deep learning. + + + +# Usage Example +``` +import ewstools + +# Load data and get time series as a pandas Series object +df = pd.read_csv(‘data.csv’) +series = df['x'] + +# Initialise ewstools TimeSeries object and define transition time +ts = ewstools.TimeSeries(data=series, transition=440) + +# Detrend time series +ts.detrend(method='Lowess', span=0.2) + +# Compute desired EWS +ts.compute_var(rolling_window=0.5) +ts.compute_auto(lag=1, rolling_window=0.5) +ts.compute_auto(lag=2, rolling_window=0.5) + +# Compute performance metrics +ts.compute_ktau() + +# Plot results - can be saved as an interactive html file or as a static image +fig = ts.make_plotly() + +``` + +![Output of built-in plotting function (static image version).\label{fig:Figure 1}](figure1.png) + + +# Documentation + +Documentation for `ewstools` is available at +[https://ewstools.readthedocs.io/en/latest/](https://ewstools.readthedocs.io/en/latest/). +Tutorials in the form of Jupyter notebooks are available at +[https://github.com/ThomasMBury/ewstools/tree/main/tutorials](https://github.com/ThomasMBury/ewstools/tree/main/tutorials). + + + +# Similar tools + +[earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) [@dakos2012methods] +is an R package that computes EWS from time series data. +[spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) [@genin2018monitoring] +is an R package that computes EWS from spatial data. + + + + +# Acknowledgements + +This work is currently supported by the +Fonds de Recherche du Québec Nature et technologies (FRQNT) +and Compute Canada. Earlier versions were supported by the +Natural Sciences and Engineering Research Council of Canada (NSERC). + + +# References \ No newline at end of file From 75416c39b1079c9f85bce0452fec88a449912804 Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Fri, 9 Dec 2022 15:51:11 -0500 Subject: [PATCH 03/48] update path to paper.md --- .github/workflows/draft-pdf.yml | 4 ++-- paper/paper.md | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/draft-pdf.yml b/.github/workflows/draft-pdf.yml index 61ae864..7631024 100644 --- a/.github/workflows/draft-pdf.yml +++ b/.github/workflows/draft-pdf.yml @@ -12,7 +12,7 @@ jobs: with: journal: joss # This should be the path to the paper within your repo. - paper-path: paper.md + paper-path: paper/paper.md - name: Upload uses: actions/upload-artifact@v1 with: @@ -20,4 +20,4 @@ jobs: # This is the output path where Pandoc will write the compiled # PDF. Note, this should be the same directory as the input # paper.md - path: paper.pdf \ No newline at end of file + path: paper/paper.pdf diff --git a/paper/paper.md b/paper/paper.md index a0797d6..67b1893 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -61,9 +61,6 @@ Earlier versions of `ewstools` were used in the following publications: - - - It complements a popular EWS package written in R [@dakos2012methods]. My hope that having an EWS toolbox in Python will allow for additional testing, and appeal to those who primarily work in Python. @@ -86,6 +83,7 @@ results [@bury2021deep] + `ewstools` makes use of several other Python packages, including pandas [@mckinney2010data] for dataframe handling, numpy [@harris2020array] for fast numerical computing, From 6c6e68466a8c04a5cd2d6e068fad188fa593dd72 Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Mon, 12 Dec 2022 11:36:27 -0500 Subject: [PATCH 04/48] use python syntax --- paper/paper.md | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/paper/paper.md b/paper/paper.md index 67b1893..62a440c 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -26,13 +26,12 @@ bibliography: paper.bib Many systems in nature and society have the capacity to undergo critical transitions-- sudden and profound changes in their dynamics that are hard to reverse. -Consider for example the outbreak of disease, the collapse of an ecosystem, or the onset +Examples include the outbreak of disease, the collapse of an ecosystem, or the onset of a cardiac arrhythmia. -From a mathematical perspective, these transitions are often understood as the +From a mathematical perspective, these transitions may be understood as the crossing of a bifurcation (tipping point) in an appropriate dynamical system model. -In 2009, Scheffer and colleagues proposed that features of bifurcations that are manifested -in time series data could provide an early warning signal (EWS) for their -arrival [@scheffer2009early]. +In 2009, Scheffer and colleagues proposed using statistical metrics to signal the +approach of a bifurcation in time series data [@scheffer2009early]. This created massive interest in the subject of EWS from a wide range scientific disciplines. Now, there exist a multitude of different EWS and associated methods for anticipating bifurcations [@clements2018indicators]. @@ -83,8 +82,7 @@ results [@bury2021deep] - -`ewstools` makes use of several other Python packages, including +`ewstools` makes use of several open-source Python packages, including pandas [@mckinney2010data] for dataframe handling, numpy [@harris2020array] for fast numerical computing, plotly [@plotly] for visuliastion, @@ -96,7 +94,8 @@ and TensorFlow [@abadi2016tensorflow] for deep learning. # Usage Example -``` + +```python import ewstools # Load data and get time series as a pandas Series object @@ -119,10 +118,9 @@ ts.compute_ktau() # Plot results - can be saved as an interactive html file or as a static image fig = ts.make_plotly() - ``` -![Output of built-in plotting function (static image version).\label{fig:Figure 1}](figure1.png) +![Output of code in usage example.\label{fig:Figure 1}](figure1.png) # Documentation @@ -133,20 +131,18 @@ Tutorials in the form of Jupyter notebooks are available at [https://github.com/ThomasMBury/ewstools/tree/main/tutorials](https://github.com/ThomasMBury/ewstools/tree/main/tutorials). - # Similar tools +The R package [earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) [@dakos2012methods] -is an R package that computes EWS from time series data. +computes EWS from time series data, and the R package [spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) [@genin2018monitoring] -is an R package that computes EWS from spatial data. - - +computes EWS from spatial data. # Acknowledgements -This work is currently supported by the +This work is supported by the Fonds de Recherche du Québec Nature et technologies (FRQNT) and Compute Canada. Earlier versions were supported by the Natural Sciences and Engineering Research Council of Canada (NSERC). From 45c3258e8e4e997f8cc2da9db60eca28698c13ee Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Mon, 12 Dec 2022 12:15:10 -0500 Subject: [PATCH 05/48] list features of ewstools --- paper/paper.md | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/paper/paper.md b/paper/paper.md index 62a440c..6f11d8b 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -37,22 +37,17 @@ Now, there exist a multitude of different EWS and associated methods for anticipating bifurcations [@clements2018indicators]. -The goal of `ewstools` is to provide an accessible toolbox for computing, analysing and -visualising EWS in Python. - - -`ewstools` is a Python package to compute, analyse and visualise early warning signals in time series data. -The package provides: - -- Python API and a command-line interface for wide accessibility -- Automatic dataset splitting and cross-validation -- Five models from various back-ends in a unified interface that cover a broad range of common use cases -- Solutions for very large datasets and heteroskedastic data -- Integrated plotting and evaluation functions to quickly check the validity of the model fit and results +`ewstools` provides an accessible toolbox for computing, analysing and +visualising EWS in time seires data. The package provides: + +- Time series detrending methods +- A suite of standard statistical metrics that can provide an EWS (e.g. variance, autocorrelation, skew) +- A suite of spectral EWS, which are based on the power spectrum [@bury2020detecting] +- Methods to apply deep learning classifiers for EWS [@bury2021deep] +- Integrated plotting and evaluation functions to quickly check the performance of EWS - Comprehensive and interactive tutorials - Earlier versions of `ewstools` were used in the following publications: - @bury2020detecting - @bury2021deep @@ -77,11 +72,6 @@ results [@bury2021deep] -# Statement of need - - - - `ewstools` makes use of several open-source Python packages, including pandas [@mckinney2010data] for dataframe handling, numpy [@harris2020array] for fast numerical computing, @@ -93,6 +83,12 @@ and TensorFlow [@abadi2016tensorflow] for deep learning. + + +# Statement of need + + + # Usage Example ```python @@ -120,7 +116,7 @@ ts.compute_ktau() fig = ts.make_plotly() ``` -![Output of code in usage example.\label{fig:Figure 1}](figure1.png) +![Output of plotting function in usage example.\label{fig:Figure 1}](figure1.png) # Documentation From 049abc522fe04de41554ed60fe018b6a4fe57b4b Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Mon, 12 Dec 2022 12:34:03 -0500 Subject: [PATCH 06/48] list of previous publications with ewstools --- paper/paper.md | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/paper/paper.md b/paper/paper.md index 6f11d8b..268d839 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -36,42 +36,31 @@ This created massive interest in the subject of EWS from a wide range scientific Now, there exist a multitude of different EWS and associated methods for anticipating bifurcations [@clements2018indicators]. +More recently, deep learning +classifiers have been trained and applied to detect bifurcations, with promising +results [@bury2021deep] + + `ewstools` provides an accessible toolbox for computing, analysing and visualising EWS in time seires data. The package provides: -- Time series detrending methods -- A suite of standard statistical metrics that can provide an EWS (e.g. variance, autocorrelation, skew) -- A suite of spectral EWS, which are based on the power spectrum [@bury2020detecting] -- Methods to apply deep learning classifiers for EWS [@bury2021deep] -- Integrated plotting and evaluation functions to quickly check the performance of EWS -- Comprehensive and interactive tutorials +- An intuitive, object-oriented framework to compute EWS in a given dataset +- Methods to detrend time series +- A suite of standard temporal EWS such as variance, autocorrelation, skew +- A suite of spectral EWS [@bury2020detecting] +- Methods to apply deep learning classifiers to detect and classify bifurcations [@bury2021deep] +- Integrated plotting and evaluation functions to quickly check performance of EWS +- Interactive tutorials in the form of Jupyter notebooks Earlier versions of `ewstools` were used in the following publications: + - @bury2020detecting - @bury2021deep - -It complements a popular EWS package written in R [@dakos2012methods]. -My hope that having an EWS toolbox in Python will allow for additional testing, -and appeal to those who primarily work in Python. - - - - -To date, it includes methods to detrend time series - - - -More recently, deep learning -classifiers have been trained and applied to detect bifurcations, with promising -results [@bury2021deep] - - - `ewstools` makes use of several open-source Python packages, including pandas [@mckinney2010data] for dataframe handling, numpy [@harris2020array] for fast numerical computing, @@ -87,6 +76,11 @@ and TensorFlow [@abadi2016tensorflow] for deep learning. # Statement of need +It complements a popular EWS package written in R [@dakos2012methods]. +My hope that having an EWS toolbox in Python will allow for additional testing, +and appeal to those who primarily work in Python. + + # Usage Example From de9878207deb36d19fe9146bca863ec2b88f1ef3 Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Mon, 12 Dec 2022 14:01:44 -0500 Subject: [PATCH 07/48] statement of need draft 1 --- paper/paper.bib | 18 ++++++++++++++ paper/paper.md | 62 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 63 insertions(+), 17 deletions(-) diff --git a/paper/paper.bib b/paper/paper.bib index 82c675f..885bfda 100644 --- a/paper/paper.bib +++ b/paper/paper.bib @@ -146,3 +146,21 @@ @inproceedings{abadi2016tensorflow } +@inproceedings{stanvcin2019overview, + title={An overview and comparison of free Python libraries for data mining and big data analysis}, + author={Stan{\v{c}}in, Igor and Jovi{\'c}, Alan}, + booktitle={2019 42nd International Convention on Information and Communication Technology, Electronics and Microelectronics (MIPRO)}, + pages={977--982}, + year={2019}, + organization={IEEE} +} + + + + + + + + + + diff --git a/paper/paper.md b/paper/paper.md index 268d839..792dfb3 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -54,12 +54,6 @@ visualising EWS in time seires data. The package provides: - Interactive tutorials in the form of Jupyter notebooks -Earlier versions of `ewstools` were used in the following publications: - -- @bury2020detecting -- @bury2021deep - - `ewstools` makes use of several open-source Python packages, including pandas [@mckinney2010data] for dataframe handling, @@ -73,14 +67,55 @@ and TensorFlow [@abadi2016tensorflow] for deep learning. - # Statement of need -It complements a popular EWS package written in R [@dakos2012methods]. -My hope that having an EWS toolbox in Python will allow for additional testing, -and appeal to those who primarily work in Python. +Critical transitions may occur in many disciplines, including ecology, medicine, +finance, and epidemiology, to name a few. As such, it is important that EWS are made +widely accessible. To my knowledge, there are two other software packages developed for +computing EWS ( +[earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) by Dakos et al. [dakos2012methods], +and +[spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) by Génin et al. [genin2018monitoring]), +both using the R programming language. +Given the recent surge in popularity of the Python programming language [@stanvcin2019overview], +it makes sense to have a package available for these users. +Moreover, ewstools implements recently developed methods (bury) that make use of deep learning +and packages therein that are native to Python. + + + + # Usage Example @@ -121,13 +156,6 @@ Tutorials in the form of Jupyter notebooks are available at [https://github.com/ThomasMBury/ewstools/tree/main/tutorials](https://github.com/ThomasMBury/ewstools/tree/main/tutorials). -# Similar tools - -The R package -[earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) [@dakos2012methods] -computes EWS from time series data, and the R package -[spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) [@genin2018monitoring] -computes EWS from spatial data. # Acknowledgements From 53421a314d0fa9fca874a764fdfa112e77774da1 Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Mon, 12 Dec 2022 14:12:42 -0500 Subject: [PATCH 08/48] update citations --- paper/paper.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/paper/paper.md b/paper/paper.md index 792dfb3..b5c2536 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -32,7 +32,7 @@ From a mathematical perspective, these transitions may be understood as the crossing of a bifurcation (tipping point) in an appropriate dynamical system model. In 2009, Scheffer and colleagues proposed using statistical metrics to signal the approach of a bifurcation in time series data [@scheffer2009early]. -This created massive interest in the subject of EWS from a wide range scientific disciplines. +This spurred massive interest in the subject of EWS from a wide range scientific disciplines. Now, there exist a multitude of different EWS and associated methods for anticipating bifurcations [@clements2018indicators]. @@ -73,13 +73,13 @@ Critical transitions may occur in many disciplines, including ecology, medicine, finance, and epidemiology, to name a few. As such, it is important that EWS are made widely accessible. To my knowledge, there are two other software packages developed for computing EWS ( -[earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) by Dakos et al. [dakos2012methods], +[earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) by Dakos et al. @dakos2012methods, and -[spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) by Génin et al. [genin2018monitoring]), +[spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) by Génin et al. @genin2018monitoring), both using the R programming language. Given the recent surge in popularity of the Python programming language [@stanvcin2019overview], it makes sense to have a package available for these users. -Moreover, ewstools implements recently developed methods (bury) that make use of deep learning +Moreover, `ewstools` implements recently developed methods [@bury2021deep] that make use of deep learning and packages therein that are native to Python. From ddcd2457944666ab0d77fabb56a48a80e627de14 Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Mon, 12 Dec 2022 14:39:48 -0500 Subject: [PATCH 09/48] update plotly cit --- paper/paper.bib | 5 ++--- paper/paper.md | 15 +++++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/paper/paper.bib b/paper/paper.bib index 885bfda..8d622d5 100644 --- a/paper/paper.bib +++ b/paper/paper.bib @@ -96,13 +96,12 @@ @inproceedings{mckinney2010data } @online{plotly, - author = {Plotly Technologies Inc.}, + author = {{Plotly Technologies Inc.}}, title = {Collaborative data science}, publisher = {Plotly Technologies Inc.}, address = {Montreal, QC}, year = {2015}, - url = {https://plot.ly} } - + url = {https://plotly.com} } @software{sheppard_2015_15681, author = {Sheppard, Kevin}, diff --git a/paper/paper.md b/paper/paper.md index b5c2536..e10abfc 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -25,7 +25,7 @@ bibliography: paper.bib # Summary Many systems in nature and society have the capacity to undergo critical transitions-- -sudden and profound changes in their dynamics that are hard to reverse. +sudden and profound changes in dynamics that are hard to reverse. Examples include the outbreak of disease, the collapse of an ecosystem, or the onset of a cardiac arrhythmia. From a mathematical perspective, these transitions may be understood as the @@ -57,11 +57,11 @@ visualising EWS in time seires data. The package provides: `ewstools` makes use of several open-source Python packages, including pandas [@mckinney2010data] for dataframe handling, -numpy [@harris2020array] for fast numerical computing, -plotly [@plotly] for visuliastion, +NumPy [@harris2020array] for fast numerical computing, +Plotly [@plotly] for visuliastion, lmfit [@newville2016lmfit] for least-squares minimisation, arch [@sheppard_2015_15681] for bootstrapping methods, -statsmodels [@seabold2010statsmodels] and scipy [@virtanen2020scipy] for detrending methods, +statsmodels [@seabold2010statsmodels] and SciPy [@virtanen2020scipy] for detrending methods, and TensorFlow [@abadi2016tensorflow] for deep learning. @@ -72,13 +72,12 @@ and TensorFlow [@abadi2016tensorflow] for deep learning. Critical transitions may occur in many disciplines, including ecology, medicine, finance, and epidemiology, to name a few. As such, it is important that EWS are made widely accessible. To my knowledge, there are two other software packages developed for -computing EWS ( -[earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) by Dakos et al. @dakos2012methods, +computing EWS ([earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) by @dakos2012methods, and -[spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) by Génin et al. @genin2018monitoring), +[spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) by @genin2018monitoring), both using the R programming language. Given the recent surge in popularity of the Python programming language [@stanvcin2019overview], -it makes sense to have a package available for these users. +there is need for a Python-based implementation of EWS. Moreover, `ewstools` implements recently developed methods [@bury2021deep] that make use of deep learning and packages therein that are native to Python. From 90c8f8f8de78053666e33f7bcc9ae5478f984ca8 Mon Sep 17 00:00:00 2001 From: Thomas Bury Date: Mon, 12 Dec 2022 16:43:43 -0500 Subject: [PATCH 10/48] update statement of need --- paper/paper.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/paper/paper.md b/paper/paper.md index e10abfc..c7f31eb 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -69,18 +69,20 @@ and TensorFlow [@abadi2016tensorflow] for deep learning. # Statement of need -Critical transitions may occur in many disciplines, including ecology, medicine, +Critical transitions are relevant to many disciplines, including ecology, medicine, finance, and epidemiology, to name a few. As such, it is important that EWS are made -widely accessible. To my knowledge, there are two other software packages developed for +widely accessible. +To my knowledge, there are two other software packages developed for computing EWS ([earlywarnings](https://cran.r-project.org/web/packages/earlywarnings/index.html) by @dakos2012methods, and [spatialwarnings](https://cran.r-project.org/web/packages/spatialwarnings/index.html) by @genin2018monitoring), both using the R programming language. Given the recent surge in popularity of the Python programming language [@stanvcin2019overview], there is need for a Python-based implementation of EWS. -Moreover, `ewstools` implements recently developed methods [@bury2021deep] that make use of deep learning -and packages therein that are native to Python. - +Moreover, `ewstools` implements recently developed methods that harness deep learning, +which have outperformed conventional EWS in several model and empirical systems [@bury2021deep]. +These new methods should tried and tested for a variety of systems and I hope that this package +facilitates this endeavour.