Metadata-Version: 2.4
Name: pyxccd
Version: 0.1.2
Summary: A PYthon library for basic and eXtended COntinuous Change Detection algorithms
Home-page: https://github.com/Remote-Sensing-of-Land-Resource-Lab/pyxccd
Author: Su Ye
Author-email: remotesensingsuy@gmail.com
License: Apache 2
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Utilities
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.8
Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: numpy>=2.1.0; python_version < "4.0" and python_version >= "3.13"
Requires-Dist: numpy>=1.26.2; python_version < "3.13" and python_version >= "3.11"
Requires-Dist: numpy>=1.26.2; python_version < "3.11" and python_version >= "3.10"
Requires-Dist: numpy>=1.26.2; python_version < "3.10" and python_version >= "3.9"
Requires-Dist: numpy>=1.24.4; python_version < "3.9" and python_version >= "3.8"
Requires-Dist: joblib>=1.2.0
Requires-Dist: pyyaml<7,>=6.0.2; python_version < "4.0 " and python_version >= "3.10"
Requires-Dist: pyyaml<7,>=6.0.2; python_version < "3.10" and python_version >= "3.8"
Requires-Dist: fiona>=1.10.1; python_version < "4.0" and python_version >= "3.11"
Requires-Dist: fiona>=1.10.1; python_version < "3.11"
Requires-Dist: scikit_learn>=1.6.0; python_version < "4.0" and python_version >= "3.13"
Requires-Dist: scikit_learn>=1.4.0; python_version < "3.13" and python_version >= "3.12"
Requires-Dist: scikit_learn>=1.1.3; python_version < "3.12" and python_version >= "3.11"
Requires-Dist: scikit_learn>=1.1.1; python_version < "3.11" and python_version >= "3.10"
Requires-Dist: scikit-learn>=0.24.2; python_version < "3.10" and python_version >= "3.9"
Requires-Dist: scikit-learn>=0.24.2; python_version < "3.9" and python_version >= "3.8"
Requires-Dist: scikit_image>=0.22.0; python_version < "4.0" and python_version >= "3.12"
Requires-Dist: scikit_image>=0.20.0; python_version < "3.12" and python_version >= "3.11"
Requires-Dist: scikit_image>=0.19.3; python_version < "3.11" and python_version >= "3.10"
Requires-Dist: scikit_image>=0.18.1; python_version < "3.10"
Requires-Dist: pandas>=2.2.3; python_version < "4.0" and python_version >= "3.12"
Requires-Dist: pandas>=1.5.0; python_version < "3.12" and python_version >= "3.11"
Requires-Dist: pandas>=1.4.0; python_version < "3.11" and python_version >= "3.10"
Requires-Dist: pandas>=1.4.0; python_version < "3.10" and python_version >= "3.9"
Requires-Dist: pandas>=1.4.0; python_version < "3.9" and python_version >= "3.8"
Requires-Dist: rasterio>=1.4; python_version >= "3.9"
Requires-Dist: rasterio>=1.3; python_version < "3.9" and python_version >= "3.8"
Provides-Extra: all
Requires-Dist: numpy>=2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
Requires-Dist: numpy>=1.26.2; (python_version < "3.13" and python_version >= "3.11") and extra == "all"
Requires-Dist: numpy>=1.26.2; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
Requires-Dist: numpy>=1.26.2; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
Requires-Dist: numpy>=1.24.4; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
Requires-Dist: joblib>=1.2.0; extra == "all"
Requires-Dist: pyyaml<7,>=6.0.2; (python_version < "4.0 " and python_version >= "3.10") and extra == "all"
Requires-Dist: pyyaml<7,>=6.0.2; (python_version < "3.10" and python_version >= "3.8") and extra == "all"
Requires-Dist: fiona>=1.10.1; (python_version < "4.0" and python_version >= "3.11") and extra == "all"
Requires-Dist: fiona>=1.10.1; python_version < "3.11" and extra == "all"
Requires-Dist: scikit_learn>=1.6.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
Requires-Dist: scikit_learn>=1.4.0; (python_version < "3.13" and python_version >= "3.12") and extra == "all"
Requires-Dist: scikit_learn>=1.1.3; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
Requires-Dist: scikit_learn>=1.1.1; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
Requires-Dist: scikit-learn>=0.24.2; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
Requires-Dist: scikit-learn>=0.24.2; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
Requires-Dist: scikit_image>=0.22.0; (python_version < "4.0" and python_version >= "3.12") and extra == "all"
Requires-Dist: scikit_image>=0.20.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
Requires-Dist: scikit_image>=0.19.3; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
Requires-Dist: scikit_image>=0.18.1; python_version < "3.10" and extra == "all"
Requires-Dist: pandas>=2.2.3; (python_version < "4.0" and python_version >= "3.12") and extra == "all"
Requires-Dist: pandas>=1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
Requires-Dist: pandas>=1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
Requires-Dist: pandas>=1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
Requires-Dist: pandas>=1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
Requires-Dist: rasterio>=1.4; python_version >= "3.9" and extra == "all"
Requires-Dist: rasterio>=1.3; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
Requires-Dist: xdoctest>=1.0.2; extra == "all"
Requires-Dist: ubelt>=1.2.1; extra == "all"
Requires-Dist: setuptools>=76.0; python_version >= "3.12" and extra == "all"
Requires-Dist: pytest>=6.2.5; python_version >= "3.10.0" and extra == "all"
Requires-Dist: pytest>=4.6.0; (python_version < "3.10.0" and python_version >= "3.7.0") and extra == "all"
Requires-Dist: pytest>=4.6.0; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "all"
Requires-Dist: pytest-cov>=3.0.0; python_version >= "3.6.0" and extra == "all"
Requires-Dist: pytest-timeout>=1.4.2; extra == "all"
Requires-Dist: coverage>=6.1.1; python_version >= "3.10" and extra == "all"
Requires-Dist: coverage>=5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
Requires-Dist: coverage>=6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
Requires-Dist: coverage>=6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "all"
Requires-Dist: coverage>=6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "all"
Requires-Dist: requests>=2.25.1; extra == "all"
Requires-Dist: matplotlib>=3.3.4; extra == "all"
Requires-Dist: Seaborn>=0.9.0; extra == "all"
Requires-Dist: click>=7.1.1; extra == "all"
Requires-Dist: scikit-build>=0.11.1; extra == "all"
Requires-Dist: cmake>=3.21.2; extra == "all"
Requires-Dist: cython>=0.29.32; extra == "all"
Requires-Dist: setuptools_scm>=8.2.0; extra == "all"
Provides-Extra: tests
Requires-Dist: xdoctest>=1.0.2; extra == "tests"
Requires-Dist: ubelt>=1.2.1; extra == "tests"
Requires-Dist: setuptools>=76.0; python_version >= "3.12" and extra == "tests"
Requires-Dist: pytest>=6.2.5; python_version >= "3.10.0" and extra == "tests"
Requires-Dist: pytest>=4.6.0; (python_version < "3.10.0" and python_version >= "3.7.0") and extra == "tests"
Requires-Dist: pytest>=4.6.0; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "tests"
Requires-Dist: pytest-cov>=3.0.0; python_version >= "3.6.0" and extra == "tests"
Requires-Dist: pytest-timeout>=1.4.2; extra == "tests"
Requires-Dist: coverage>=6.1.1; python_version >= "3.10" and extra == "tests"
Requires-Dist: coverage>=5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "tests"
Requires-Dist: coverage>=6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "tests"
Requires-Dist: coverage>=6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "tests"
Requires-Dist: coverage>=6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "tests"
Requires-Dist: requests>=2.25.1; extra == "tests"
Provides-Extra: optional
Requires-Dist: matplotlib>=3.3.4; extra == "optional"
Requires-Dist: Seaborn>=0.9.0; extra == "optional"
Requires-Dist: click>=7.1.1; extra == "optional"
Provides-Extra: headless
Provides-Extra: graphics
Provides-Extra: headless-strict
Provides-Extra: graphics-strict
Provides-Extra: all-strict
Requires-Dist: numpy==2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
Requires-Dist: numpy==1.26.2; (python_version < "3.13" and python_version >= "3.11") and extra == "all-strict"
Requires-Dist: numpy==1.26.2; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
Requires-Dist: numpy==1.26.2; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
Requires-Dist: numpy==1.24.4; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
Requires-Dist: joblib==1.2.0; extra == "all-strict"
Requires-Dist: pyyaml<7,==6.0.2; (python_version < "4.0 " and python_version >= "3.10") and extra == "all-strict"
Requires-Dist: pyyaml<7,==6.0.2; (python_version < "3.10" and python_version >= "3.8") and extra == "all-strict"
Requires-Dist: fiona==1.10.1; (python_version < "4.0" and python_version >= "3.11") and extra == "all-strict"
Requires-Dist: fiona==1.10.1; python_version < "3.11" and extra == "all-strict"
Requires-Dist: scikit_learn==1.6.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
Requires-Dist: scikit_learn==1.4.0; (python_version < "3.13" and python_version >= "3.12") and extra == "all-strict"
Requires-Dist: scikit_learn==1.1.3; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
Requires-Dist: scikit_learn==1.1.1; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
Requires-Dist: scikit-learn==0.24.2; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
Requires-Dist: scikit-learn==0.24.2; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
Requires-Dist: scikit_image==0.22.0; (python_version < "4.0" and python_version >= "3.12") and extra == "all-strict"
Requires-Dist: scikit_image==0.20.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
Requires-Dist: scikit_image==0.19.3; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
Requires-Dist: scikit_image==0.18.1; python_version < "3.10" and extra == "all-strict"
Requires-Dist: pandas==2.2.3; (python_version < "4.0" and python_version >= "3.12") and extra == "all-strict"
Requires-Dist: pandas==1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
Requires-Dist: pandas==1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
Requires-Dist: pandas==1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
Requires-Dist: pandas==1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
Requires-Dist: rasterio==1.4; python_version >= "3.9" and extra == "all-strict"
Requires-Dist: rasterio==1.3; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
Requires-Dist: xdoctest==1.0.2; extra == "all-strict"
Requires-Dist: ubelt==1.2.1; extra == "all-strict"
Requires-Dist: setuptools==76.0; python_version >= "3.12" and extra == "all-strict"
Requires-Dist: pytest==6.2.5; python_version >= "3.10.0" and extra == "all-strict"
Requires-Dist: pytest==4.6.0; (python_version < "3.10.0" and python_version >= "3.7.0") and extra == "all-strict"
Requires-Dist: pytest==4.6.0; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "all-strict"
Requires-Dist: pytest-cov==3.0.0; python_version >= "3.6.0" and extra == "all-strict"
Requires-Dist: pytest-timeout==1.4.2; extra == "all-strict"
Requires-Dist: coverage==6.1.1; python_version >= "3.10" and extra == "all-strict"
Requires-Dist: coverage==5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
Requires-Dist: coverage==6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
Requires-Dist: coverage==6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "all-strict"
Requires-Dist: coverage==6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "all-strict"
Requires-Dist: requests==2.25.1; extra == "all-strict"
Requires-Dist: matplotlib==3.3.4; extra == "all-strict"
Requires-Dist: Seaborn==0.9.0; extra == "all-strict"
Requires-Dist: click==7.1.1; extra == "all-strict"
Requires-Dist: scikit-build==0.11.1; extra == "all-strict"
Requires-Dist: cmake==3.21.2; extra == "all-strict"
Requires-Dist: cython==0.29.32; extra == "all-strict"
Requires-Dist: setuptools_scm==8.2.0; extra == "all-strict"
Provides-Extra: runtime-strict
Requires-Dist: numpy==2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime-strict"
Requires-Dist: numpy==1.26.2; (python_version < "3.13" and python_version >= "3.11") and extra == "runtime-strict"
Requires-Dist: numpy==1.26.2; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
Requires-Dist: numpy==1.26.2; (python_version < "3.10" and python_version >= "3.9") and extra == "runtime-strict"
Requires-Dist: numpy==1.24.4; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime-strict"
Requires-Dist: joblib==1.2.0; extra == "runtime-strict"
Requires-Dist: pyyaml<7,==6.0.2; (python_version < "4.0 " and python_version >= "3.10") and extra == "runtime-strict"
Requires-Dist: pyyaml<7,==6.0.2; (python_version < "3.10" and python_version >= "3.8") and extra == "runtime-strict"
Requires-Dist: fiona==1.10.1; (python_version < "4.0" and python_version >= "3.11") and extra == "runtime-strict"
Requires-Dist: fiona==1.10.1; python_version < "3.11" and extra == "runtime-strict"
Requires-Dist: scikit_learn==1.6.0; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime-strict"
Requires-Dist: scikit_learn==1.4.0; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime-strict"
Requires-Dist: scikit_learn==1.1.3; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime-strict"
Requires-Dist: scikit_learn==1.1.1; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
Requires-Dist: scikit-learn==0.24.2; (python_version < "3.10" and python_version >= "3.9") and extra == "runtime-strict"
Requires-Dist: scikit-learn==0.24.2; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime-strict"
Requires-Dist: scikit_image==0.22.0; (python_version < "4.0" and python_version >= "3.12") and extra == "runtime-strict"
Requires-Dist: scikit_image==0.20.0; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime-strict"
Requires-Dist: scikit_image==0.19.3; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
Requires-Dist: scikit_image==0.18.1; python_version < "3.10" and extra == "runtime-strict"
Requires-Dist: pandas==2.2.3; (python_version < "4.0" and python_version >= "3.12") and extra == "runtime-strict"
Requires-Dist: pandas==1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime-strict"
Requires-Dist: pandas==1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
Requires-Dist: pandas==1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "runtime-strict"
Requires-Dist: pandas==1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime-strict"
Requires-Dist: rasterio==1.4; python_version >= "3.9" and extra == "runtime-strict"
Requires-Dist: rasterio==1.3; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime-strict"
Provides-Extra: tests-strict
Requires-Dist: xdoctest==1.0.2; extra == "tests-strict"
Requires-Dist: ubelt==1.2.1; extra == "tests-strict"
Requires-Dist: setuptools==76.0; python_version >= "3.12" and extra == "tests-strict"
Requires-Dist: pytest==6.2.5; python_version >= "3.10.0" and extra == "tests-strict"
Requires-Dist: pytest==4.6.0; (python_version < "3.10.0" and python_version >= "3.7.0") and extra == "tests-strict"
Requires-Dist: pytest==4.6.0; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "tests-strict"
Requires-Dist: pytest-cov==3.0.0; python_version >= "3.6.0" and extra == "tests-strict"
Requires-Dist: pytest-timeout==1.4.2; extra == "tests-strict"
Requires-Dist: coverage==6.1.1; python_version >= "3.10" and extra == "tests-strict"
Requires-Dist: coverage==5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "tests-strict"
Requires-Dist: coverage==6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "tests-strict"
Requires-Dist: coverage==6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "tests-strict"
Requires-Dist: coverage==6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "tests-strict"
Requires-Dist: requests==2.25.1; extra == "tests-strict"
Provides-Extra: optional-strict
Requires-Dist: matplotlib==3.3.4; extra == "optional-strict"
Requires-Dist: Seaborn==0.9.0; extra == "optional-strict"
Requires-Dist: click==7.1.1; extra == "optional-strict"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

PYXCCD
======

|GithubActions| |Pypi| |Downloads| |ReadTheDocs|


A PYthon library for basic and eXtended COntinuous Change Detection
=============================================================================================================================
**Author: Su Ye (remotesensingsuy@gmail.com)**

The Continuous Change Detection and Classification (CCDC) algorithm has been popular for processing satellite-based time series datasets, particularly for Landsat-based datasets. As a CCDC user, you may already be familiar with the existing CCDC tools such as `pyccd <https://github.com/repository-preservation/lcmap-pyccd>`_ and `gee ccdc <https://developers.google.com/earth-engine/apidocs/ee-algorithms-temporalsegmentation-ccdc>`_.

**Wait.. so why does the pyxccd package still exist?**

We developed pyxccd mainly for the below purposes:
   
1. **Near real-time monitoring**: This package provides the unique S-CCD algorithm to recursively update model coefficients and detect changes;

2. **The latest version of CCDC (COLD)**: The COLD algorithm has the highest breakpoint detection accuracy than the ever, and has been verified with `Zhe's MATLAB version <https://github.com/Remote-Sensing-of-Land-Resource-Lab/COLD>`_;

3. **Large-scale time-series processing in the desktop environment**: the core of pyxccd was coded in C language with the superior computing efficiency and small memory usage;

4. **Using dataset other than Landsat**: pyxccd supports the use of any band combination from any sensor (such as Sentinel-2, modis);

5. **Decomposing time-series signals to unveil inter-annual variation**: S-CCD allows continuously outputting trend and seasonal signal components as "states", allowing detecting inter-segment variations such as yearly phenological shifts


1. Installation
---------------
.. code:: console

   pip install pyxccd

Note: it only supports windows and linux system so far. Please contact the author if you wish to install it in the macOS system.

2. Using pyxccd for pixel-based processing (more see `jupyter examples <tool/notebook/pyxccd_example.ipynb>`_)
----------------------------------------------------------------------------------------------------------------

COLD:

.. code:: python

   from pyxccd import cold_detect
   cold_result = cold_detect(dates, blues, greens, reds, nirs, swir1s, swir2s, thermals, qas)

COLD algorithm for any combination of band inputs from any sensor:

.. code:: python

   from pyxccd import cold_detect_flex
   # input a user-defined array instead of multiple lists
   cold_result = cold_detect_flex(dates, np.stack((band1, band2, band3), axis=1), qas, lambda=20,tmask_b1_index=1, tmask_b2_index=2)

S-CCD:

.. code:: python

   # require offline processing for the first time 
   from pyxccd import sccd_detect, sccd_update
   sccd_pack = sccd_detect(dates, blues, greens, reds, nirs, swir1s, swir2s, qas)

   # then use sccd_pack to do recursive and short-memory NRT update
   sccd_pack_new = sccd_update(sccd_pack, dates, blues, greens, reds, nirs, swir1s, swir2s, qas)

S-CCD for outputting continuous seasonal and trend states:

.. code:: python
   
   # open state output (state_ensemble) by setting state_intervaldays as a non-zero value
   sccd_result, state_ensemble = sccd_detect(dates, blues, greens, reds, nirs, swir1s, swir2s, qas, state_intervaldays=1)

3. Documentation
----------------
API documents: `readthedocs <https://pyxccd.readthedocs.io/en/latest>`_

Tutorial: under development

4. Citations
------------

If you make use of the algorithms in this repo (or to read more about them),
please cite (/see) the relevant publications from the following list:

`[S-CCD] <https://www.sciencedirect.com/science/article/pii/S003442572030540X>`_
Ye, S., Rogan, J., Zhu, Z., & Eastman, J. R. (2021). A near-real-time
approach for monitoring forest disturbance using Landsat time series:
Stochastic continuous change detection. *Remote Sensing of Environment*,
*252*, 112167.

`[COLD] <https://www.sciencedirect.com/science/article/am/pii/S0034425719301002>`_ 
Zhu, Z., Zhang, J., Yang, Z., Aljaddani, A. H., Cohen, W. B., Qiu, S., &
Zhou, C. (2020). Continuous monitoring of land disturbance based on
Landsat time series. *Remote Sensing of Environment*, *238*, 111116.

The recent applications of S-CCD could be found in `CONUS Land Watcher <https://gers.users.earthengine.app/view/nrt-conus>`_

Q&A
---

Q1: Has pyxccd been verified with original Matlab codes?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Re: yes, multiple rounds of verification have been done. Comparison
based on two testing tiles shows that pyxccd and Matlab version have
smaller than <2% differences for breakpoint detection and <2%
differences for harmonic coefficients; the accuracy of pyxccd was also
tested against the same reference dataset used in the original COLD
paper (Zhu et al., 2020), and pyxccd reached the same accuracy (27%
omission and 28% commission) showing that the discrepancy doesn't hurt
accuracy. The primary source for the discrepancy is mainly from the
rounding: MATLAB uses float64 precision, while pyxccd chose float32 to
save the run-time computing memory and boost efficiency.

Q2: how much time for production of a tile-based disturbance map (5000*5000 pixels) using pyxccd?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Re: I tested it in UCONN HPC environment (200 EPYC7452 cores): for
processing a 40-year Landsat ARD tile (1982-2021), the stacking
typically takes 15 mins; per-pixel COLD processing costs averagely 1
hour, per-pixel S-CCD processing costs averagely 0.5
hour; exporting maps needs 7 mins.


.. |Codecov| image:: https://codecov.io/github/Remote-Sensing-of-Land-Resource-Lab/pyxccd/badge.svg?branch=devel&service=github
   :target: https://codecov.io/github/Remote-Sensing-of-Land-Resource-Lab/pyxccd?branch=devel
.. |Pypi| image:: https://img.shields.io/pypi/v/pyxccd.svg
   :target: https://pypi.python.org/pypi/pyxccd
.. |Downloads| image:: https://img.shields.io/pypi/dm/pyxccd.svg
   :target: https://pypistats.org/packages/pyxccd
.. |ReadTheDocs| image:: https://readthedocs.org/projects/pyxccd/badge/?version=latest
    :target: http://pyxccd.readthedocs.io/en/latest/
.. |GithubActions| image:: https://github.com/Remote-Sensing-of-Land-Resource-Lab/pyxccd/actions/workflows/main.yml/badge.svg?branch=devel
    :target: https://github.com/Remote-Sensing-of-Land-Resource-Lab/pyxccd/actions?query=branch%3Adevel
