Repository: WenjieDu/PyGrinder (language: python)

Issue:
Rename the project as PyGrinder



Discussion / hints:

Fix patch:
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index d5ccc59..26fd8b9 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -1,52 +1,52 @@
 name: "🐞 Bug Report"
 description: Submit a bug report to help us improve .
-labels: ["bug"]
+labels: [ "bug" ]
 
 body:
-  - type: textarea
-    id: system-info
-    attributes:
-      label: 1. System Info
-      description: Please share information about your operating environment with us.
-      placeholder: PyCorruptor version, Python version, platform and your OS version, and versions of other libraries existing in the error message...
-    validations:
-      required: true
-
-  - type: checkboxes
-    id: information-scripts-examples
-    attributes:
-      label: 2. Information
-      description: 'The problem happens when running:'
-      options:
-        - label: "The official example scripts"
-        - label: "My own created scripts"
-
-  - type: textarea
-    id: reproduction
-    validations:
-      required: true
-    attributes:
-      label: 3. Reproduction
-      description: |
-        Please provide a code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet.
-        If you have code snippets, error messages, stack traces please provide them here as well.
-        Important! Use code tags to correctly format your code. See https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting
-        Do not use screenshots, as they are hard to read and (more importantly) don't allow others to copy-and-paste your code.
-
-      placeholder: |
-        Steps to reproduce the behavior:
-
-          1.
-          2.
-          3.
-
-          ……
-
-
-  - type: textarea
-    id: expected-behavior
-    validations:
-      required: true
-    attributes:
-      label: 4. Expected behavior
-      description: "A clear and concise description of what error you would expect to happen."
+    -   type: textarea
+        id: system-info
+        attributes:
+            label: 1. System Info
+            description: Please share information about your operating environment with us.
+            placeholder: PyGrinder version, Python version, platform and your OS version, and versions of other libraries existing in the error message...
+        validations:
+            required: true
+
+    -   type: checkboxes
+        id: information-scripts-examples
+        attributes:
+            label: 2. Information
+            description: 'The problem happens when running:'
+            options:
+                -   label: "The official example scripts"
+                -   label: "My own created scripts"
+
+    -   type: textarea
+        id: reproduction
+        validations:
+            required: true
+        attributes:
+            label: 3. Reproduction
+            description: |
+                Please provide a code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet.
+                If you have code snippets, error messages, stack traces please provide them here as well.
+                Important! Use code tags to correctly format your code. See https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting
+                Do not use screenshots, as they are hard to read and (more importantly) don't allow others to copy-and-paste your code.
+
+            placeholder: |
+                Steps to reproduce the behavior:
+
+                  1.
+                  2.
+                  3.
+
+                  ……
+
+
+    -   type: textarea
+        id: expected-behavior
+        validations:
+            required: true
+        attributes:
+            label: 4. Expected behavior
+            description: "A clear and concise description of what error you would expect to happen."
diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml
index 7dc40a6..a986d49 100644
--- a/.github/workflows/greetings.yml
+++ b/.github/workflows/greetings.yml
@@ -22,7 +22,7 @@ jobs:
                     issue-message: |
                         Hi there 👋,
 
-                        Thank you so much for your attention to PyCorruptor and PyPOTS! You can follow me on GitHub to receive the latest news of PyCorruptor and PyPOTS. If you find PyCorruptor helpful to your work, please star⭐️ this repository. Your star is your recognition, which can help more people notice PyPOTS and grow PyPOTS community. It matters and is definitely a kind of contribution to the community.
+                        Thank you so much for your attention to PyGrinder and PyPOTS! You can follow me on GitHub to receive the latest news of PyGrinder and PyPOTS. If you find PyGrinder helpful to your work, please star⭐️ this repository. Your star is your recognition, which can help more people notice PyPOTS and grow PyPOTS community. It matters and is definitely a kind of contribution to the community.
 
                         I have received your message and will respond ASAP. Thank you for your patience! 😃
 
@@ -31,7 +31,7 @@ jobs:
                     pr-message: |
                         Hi there 👋,
 
-                        We really really appreciate that you have taken the time to make this PR on PyCorruptor!
+                        We really really appreciate that you have taken the time to make this PR on PyGrinder!
 
                         If you are trying to fix a bug, please reference the issue number in the description or give your details about the bug.
                         If you are implementing a feature request, please check with the maintainers that the feature will be accepted first.
diff --git a/README.md b/README.md
index a37351d..daedc81 100644
--- a/README.md
+++ b/README.md
@@ -1,56 +1,57 @@
-<a href='https://github.com/WenjieDu/PyCorruptor'><img src='https://pypots.com/figs/pypots_logos/PyCorruptor_logo_FFBG.svg?sanitize=true' width='375' align='right' /></a>
+<a href='https://github.com/WenjieDu/PyGrinder'><img src='https://pypots.com/figs/pypots_logos/PyGrinder_logo_FFBG.svg?sanitize=true' width='200' align='right' /></a>
 
-<h2 align="center">Welcome to PyCorruptor</h2>
+<h2 align="center">Welcome to PyGrinder</h2>
 
-**<p align='center'>A Python Toolbox for Data Corruption</p>**
+*<p align='center'>a Python toolkit for grinding data beans into the incomplete</p>*
 
 <p align='center'>
-    <a href='https://github.com/WenjieDu/PyCorruptor'>
+    <a href='https://github.com/WenjieDu/PyGrinder'>
         <img alt='Python version' src='https://img.shields.io/badge/python-v3-E97040?logo=python&logoColor=white'>
     </a>
-    <a href="https://github.com/WenjieDu/PyCorruptor/releases">
-        <img alt="the latest release version" src="https://img.shields.io/github/v/release/wenjiedu/PyCorruptor?color=EE781F&include_prereleases&label=Release&logo=github&logoColor=white">
+    <a href="https://github.com/WenjieDu/PyGrinder/releases">
+        <img alt="the latest release version" src="https://img.shields.io/github/v/release/wenjiedu/PyGrinder?color=EE781F&include_prereleases&label=Release&logo=github&logoColor=white">
     </a>
-    <a href="https://github.com/WenjieDu/PyCorruptor/blob/main/LICENSE">
+    <a href="https://github.com/WenjieDu/PyGrinder/blob/main/LICENSE">
         <img alt="GPL-v3 license" src="https://img.shields.io/badge/License-GPL--v3-E9BB41?logo=opensourceinitiative&logoColor=white">
     </a>
-    <a  href='https://github.com/WenjieDu/PyCorruptor/actions/workflows/testing_ci.yml'>
-        <img alt='GitHub Testing' src='https://img.shields.io/github/actions/workflow/status/wenjiedu/PyCorruptor/testing_ci.yml?logo=github&color=C8D8E1&label=CI'>
+    <a  href='https://github.com/WenjieDu/PyGrinder/actions/workflows/testing_ci.yml'>
+        <img alt='GitHub Testing' src='https://img.shields.io/github/actions/workflow/status/wenjiedu/PyGrinder/testing_ci.yml?logo=github&color=C8D8E1&label=CI'>
     </a>
-    <a href="https://codeclimate.com/github/WenjieDu/PyCorruptor">
-        <img alt="Code Climate maintainability" src="https://img.shields.io/codeclimate/maintainability-percentage/WenjieDu/PyCorruptor?color=3C7699&label=Maintainability&logo=codeclimate">
+    <a href="https://codeclimate.com/github/WenjieDu/PyGrinder">
+        <img alt="Code Climate maintainability" src="https://img.shields.io/codeclimate/maintainability-percentage/WenjieDu/PyGrinder?color=3C7699&label=Maintainability&logo=codeclimate">
     </a>
-    <a href='https://coveralls.io/github/WenjieDu/PyCorruptor'>
-        <img alt='Coveralls report' src='https://img.shields.io/coverallsCoverage/github/WenjieDu/PyCorruptor?branch=main&logo=coveralls&color=75C1C4&label=Coverage'>
+    <a href='https://coveralls.io/github/WenjieDu/PyGrinder'>
+        <img alt='Coveralls report' src='https://img.shields.io/coverallsCoverage/github/WenjieDu/PyGrinder?branch=main&logo=coveralls&color=75C1C4&label=Coverage'>
     </a>
-    <a href="https://anaconda.org/conda-forge/PyCorruptor">
-        <img alt="Conda downloads" src="https://img.shields.io/endpoint?url=https://pypots.com/figs/downloads_badges/conda_pycorruptor_downloads.json">
+    <a href="https://anaconda.org/conda-forge/PyGrinder">
+        <img alt="Conda downloads" src="https://img.shields.io/endpoint?url=https://pypots.com/figs/downloads_badges/conda_pygrinder_downloads.json">
     </a>
-    <a href='https://pepy.tech/project/PyCorruptor'>
-        <img alt='PyPI downloads' src='https://img.shields.io/endpoint?url=https://pypots.com/figs/downloads_badges/pypi_pycorruptor_downloads.json'>
+    <a href='https://pepy.tech/project/PyGrinder'>
+        <img alt='PyPI downloads' src='https://img.shields.io/endpoint?url=https://pypots.com/figs/downloads_badges/pypi_pygrinder_downloads.json'>
     </a>
 </p>
 
 <a href='https://github.com/WenjieDu/PyPOTS'><img src='https://pypots.com/figs/pypots_logos/PyPOTS_logo_FFBG.svg?sanitize=true' width='160' align='left' /></a>
-PyCorruptor is a part of [PyPOTS project](https://github.com/WenjieDu/PyPOTS) (a Python toolbox for data mining on
+PyGrinder is a part of [PyPOTS project](https://github.com/WenjieDu/PyPOTS) (a Python toolbox for data mining on
 Partially-Observed Time Series), and was separated from PyPOTS for decoupling missingness-creating functionalities from
 learning algorithms.
 
 In data analysis and modeling, sometimes we may need to corrupt the original data to achieve our goal, for instance,
 evaluating models' ability to reconstruct corrupted data or assessing the model's performance on only partially-observed
-data. PyCorruptor is such a tool to help you corrupt your data, which provides several patterns to create missing values
+data. PyGrinder is such a tool to help you corrupt your data, which provides several patterns to create missing values
 in the given data.
 
-## ❖ Citing PyCorruptor
+## ❖ Citing PyGrinder/PyPOTS
 
 The paper introducing PyPOTS project is available on arXiv at [this URL](https://arxiv.org/abs/2305.18811),
 and we are pursuing to publish it in prestigious academic venues, e.g. JMLR (track for
-[Machine Learning Open Source Software](https://www.jmlr.org/mloss/)). If you use PyCorruptor in your work,
+[Machine Learning Open Source Software](https://www.jmlr.org/mloss/)). If you use PyGrinder in your work,
 please cite PyPOTS project as below and 🌟star this repository to make others notice this library. 🤗 Thank you!
 
+
 ``` bibtex
 @article{du2023PyPOTS,
-title={{PyPOTS: A Python Toolbox for Data Mining on Partially-Observed Time Series}},
+title={{PyPOTS: a Python toolbox for data mining on Partially-Observed Time Series}},
 author={Wenjie Du},
 year={2023},
 eprint={2305.18811},
@@ -61,11 +62,26 @@ doi={10.48550/arXiv.2305.18811},
 }
 ```
 
+> Wenjie Du. (2023).
+> PyPOTS: a Python toolbox for data mining on Partially-Observed Time Series.
+> arXiv, abs/2305.18811.https://arxiv.org/abs/2305.18811
+
 or
 
+``` bibtex
+@inproceedings{du2023PyPOTS,
+title={{PyPOTS: a Python toolbox for data mining on Partially-Observed Time Series}},
+booktitle={9th SIGKDD workshop on Mining and Learning from Time Series (MiLeTS'23)},
+author={Wenjie Du},
+year={2023},
+url={https://arxiv.org/abs/2305.18811},
+}
+```
+
 > Wenjie Du. (2023).
-> PyPOTS: A Python Toolbox for Data Mining on Partially-Observed Time Series.
-> arXiv, abs/2305.18811. https://doi.org/10.48550/arXiv.2305.18811
+> PyPOTS: a Python toolbox for data mining on Partially-Observed Time Series.
+> In *9th SIGKDD workshop on Mining and Learning from Time Series (MiLeTS'23)*. https://arxiv.org/abs/2305.18811
+
 
 <details>
 <summary>🏠 Visits</summary>
diff --git a/docs/conf.py b/docs/conf.py
index 9be2e0b..a348252 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -18,13 +18,13 @@
 except IndexError:
     pass
 
-from pycorruptor import __version__
+from pygrinder import __version__
 
-sys.path.insert(0, abspath("../pycorruptor"))
+sys.path.insert(0, abspath("../pygrinder"))
 
 # -- Project information -----------------------------------------------------
 
-project = "PyCorruptor"
+project = "PyGrinder"
 copyright = "2023, Wenjie Du"
 author = "Wenjie Du"
 
diff --git a/docs/index.rst b/docs/index.rst
index 33350cd..5c039c9 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,47 +1,47 @@
-.. PyCorruptor documentation master file, created by
+.. PyGrinder documentation master file, created by
 sphinx-quickstart on Wed Mar 15 18:14:27 2023.
 You can adapt this file completely to your liking, but it should at least
 contain the root `toctree` directive.
 
-Welcome to PyCorruptor's documentation!
+Welcome to PyGrinder's documentation!
 =======================================
-.. image:: https://raw.githubusercontent.com/WenjieDu/PyCorruptor/main/docs/figs/PyCorruptor.svg?sanitize=true
+.. image:: https://raw.githubusercontent.com/WenjieDu/PyGrinder/main/docs/figs/PyGrinder.svg?sanitize=true
    :height: 300
    :align: right
-   :target: https://github.com/WenjieDu/PyCorruptor
-   :alt: PyCorruptor logo
+   :target: https://github.com/WenjieDu/PyGrinder
+   :alt: PyGrinder logo
 
 **A Python Toolbox for Data Corruption**
 
 .. image:: https://img.shields.io/badge/python-v3-E97040?logo=python&logoColor=white
    :alt: Python version
-.. image:: https://img.shields.io/github/v/release/wenjiedu/pycorruptor?color=EE781F&include_prereleases&label=Release&logo=github&logoColor=white
+.. image:: https://img.shields.io/github/v/release/wenjiedu/pygrinder?color=EE781F&include_prereleases&label=Release&logo=github&logoColor=white
    :alt: the latest release version
-   :target: https://img.shields.io/github/v/release/wenjiedu/pycorruptor?color=EE781F&include_prereleases&label=Release&logo=github&logoColor=white
+   :target: https://img.shields.io/github/v/release/wenjiedu/pygrinder?color=EE781F&include_prereleases&label=Release&logo=github&logoColor=white
 .. image:: https://img.shields.io/badge/License-GPL--v3-E9BB41?logo=opensourceinitiative&logoColor=white
    :alt: License
-   :target: https://github.com/WenjieDu/PyCorruptor/blob/main/LICENSE
-.. image:: https://img.shields.io/github/actions/workflow/status/wenjiedu/pycorruptor/testing_ci.yml?logo=github&color=C8D8E1&label=CI
+   :target: https://github.com/WenjieDu/PyGrinder/blob/main/LICENSE
+.. image:: https://img.shields.io/github/actions/workflow/status/wenjiedu/pygrinder/testing_ci.yml?logo=github&color=C8D8E1&label=CI
    :alt: GitHub Testing
-   :target: https://github.com/WenjieDu/PyCorruptor/actions/workflows/testing_ci.yml
-.. image:: https://img.shields.io/codeclimate/maintainability-percentage/WenjieDu/PyCorruptor?color=3C7699&label=Maintainability&logo=codeclimate
+   :target: https://github.com/WenjieDu/PyGrinder/actions/workflows/testing_ci.yml
+.. image:: https://img.shields.io/codeclimate/maintainability-percentage/WenjieDu/PyGrinder?color=3C7699&label=Maintainability&logo=codeclimate
    :alt: Code Climate maintainability
-   :target: https://codeclimate.com/github/WenjieDu/PyCorruptor
-.. image:: https://img.shields.io/coverallsCoverage/github/WenjieDu/PyCorruptor?branch=main&logo=coveralls&color=75C1C4&label=Coverage
+   :target: https://codeclimate.com/github/WenjieDu/PyGrinder
+.. image:: https://img.shields.io/coverallsCoverage/github/WenjieDu/PyGrinder?branch=main&logo=coveralls&color=75C1C4&label=Coverage
    :alt: Coveralls report
-   :target: https://coveralls.io/github/WenjieDu/PyCorruptor
-.. image:: https://img.shields.io/conda/dn/conda-forge/pycorruptor?label=Conda%20Downloads&color=AED0ED&logo=anaconda&logoColor=white
+   :target: https://coveralls.io/github/WenjieDu/PyGrinder
+.. image:: https://img.shields.io/conda/dn/conda-forge/pygrinder?label=Conda%20Downloads&color=AED0ED&logo=anaconda&logoColor=white
    :alt: Conda downloads
    :target: https://anaconda.org/conda-forge/pypots
-.. image:: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FWenjieDu%2FWenjieDu%2Fmain%2Ffigs%2Fprojects%2Fpycorruptor_downloads.json
+.. image:: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FWenjieDu%2FWenjieDu%2Fmain%2Ffigs%2Fprojects%2Fpygrinder_downloads.json
    :alt: PyPI downloads
-   :target: https://pepy.tech/project/pycorruptor
+   :target: https://pepy.tech/project/pygrinder
 .. image:: https://img.shields.io/badge/Contributor%20Covenant-v2.1-4baaaa.svg
    :alt: CODE of CONDUCT
-.. image:: https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FWenjieDu%2FPyCorruptor&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=Visits+since+May+2022&edge_flat=false
+.. image:: https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FWenjieDu%2FPyGrinder&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=Visits+since+May+2022&edge_flat=false
    :alt: Visit num
 
-In data analysis and modeling, sometimes we may need to corrupt the original data to achieve our goal, for instance, evaluating models' ability to reconstruct corrupted data or assessing the model's performance on only partially-observed data. PyCorruptor is such a tool to help you corrupt your data, which provides several patterns to create missing values in the given data.
+In data analysis and modeling, sometimes we may need to corrupt the original data to achieve our goal, for instance, evaluating models' ability to reconstruct corrupted data or assessing the model's performance on only partially-observed data. PyGrinder is such a tool to help you corrupt your data, which provides several patterns to create missing values in the given data.
 
 .. toctree::
    :maxdepth: 2
@@ -55,7 +55,7 @@ In data analysis and modeling, sometimes we may need to corrupt the original dat
    :hidden:
    :caption: Code Documentation
 
-   pycorruptor
+   pygrinder
 
 .. toctree::
    :maxdepth: 2
@@ -68,4 +68,4 @@ In data analysis and modeling, sometimes we may need to corrupt the original dat
 
 References
 """"""""""
-.. bibliography::
\ No newline at end of file
+.. bibliography::
diff --git a/docs/pycorruptor.rst b/docs/pygrinder.rst
similarity index 70%
rename from docs/pycorruptor.rst
rename to docs/pygrinder.rst
index 95ded40..d4720f0 100644
--- a/docs/pycorruptor.rst
+++ b/docs/pygrinder.rst
@@ -1,4 +1,4 @@
-pycorruptor package
+pygrinder package
 ===================
 
 Subpackages
@@ -7,15 +7,15 @@ Subpackages
 .. toctree::
    :maxdepth: 4
 
-   pycorruptor.tests
+   pygrinder.tests
 
 Submodules
 ----------
 
-pycorruptor.corrupt module
+pygrinder.corrupt module
 --------------------------
 
-.. automodule:: pycorruptor.corrupt
+.. automodule:: pygrinder.corrupt
    :members:
    :undoc-members:
    :show-inheritance:
@@ -24,7 +24,7 @@ pycorruptor.corrupt module
 Module contents
 ---------------
 
-.. automodule:: pycorruptor
+.. automodule:: pygrinder
    :members:
    :undoc-members:
    :show-inheritance:
diff --git a/pycorruptor/__init__.py b/pygrinder/__init__.py
similarity index 85%
rename from pycorruptor/__init__.py
rename to pygrinder/__init__.py
index b7a6b29..1da305c 100644
--- a/pycorruptor/__init__.py
+++ b/pygrinder/__init__.py
@@ -1,11 +1,11 @@
 """
-PyCorruptor package.
+PyGrinder package.
 """
 
 # Created by Wenjie Du <wenjay.du@gmail.com>
 # License: GLP-v3
 
-# PyCorruptor version
+# PyGrinder version
 #
 # PEP0440 compatible formatted version, see:
 # https://www.python.org/dev/peps/pep-0440/
@@ -24,8 +24,8 @@
 __version__ = "0.0.4"
 
 try:
-    from pycorruptor.mcar import mcar
-    from pycorruptor.utils import (
+    from pygrinder.mcar import mcar
+    from pygrinder.utils import (
         cal_missing_rate,
         masked_fill,
     )
diff --git a/pycorruptor/mar.py b/pygrinder/mar.py
similarity index 100%
rename from pycorruptor/mar.py
rename to pygrinder/mar.py
diff --git a/pycorruptor/mcar.py b/pygrinder/mcar.py
similarity index 73%
rename from pycorruptor/mcar.py
rename to pygrinder/mcar.py
index 242daf4..46dfdc2 100644
--- a/pycorruptor/mcar.py
+++ b/pygrinder/mcar.py
@@ -22,14 +22,14 @@ def mcar(X, rate, nan=0):
         Data vector. If X has any missing values, they should be numpy.nan.
 
     rate : float, in (0,1),
-        Artificially missing rate, rate of the observed values which will be artificially masked as missing.
-
-        Note that,
-        `rate` = (number of artificially missing values) / np.sum(~np.isnan(self.data)),
-        not (number of artificially missing values) / np.product(self.data.shape),
-        considering that the given data may already contain missing values,
-        the latter way may be confusing because if the original missing rate >= `rate`,
-        the function will do nothing, i.e. it won't play the role it has to be.
+        Artificially missing rate, the probability that the values may be artificially masked as missing.
+        Note that the values are randomly selected no matter if they are originally missing or observed.
+        If the selected values are originally missing, they will be kept as missing.
+        If the selected values are originally observed, they will be masked as missing.
+        Therefore, if the given X already contains missing data, the final missing rate in the output X could be
+        in range [original_missing_rate, original_missing_rate+rate], but not strictly equal to
+        `original_missing_rate+rate`. Because the selected values to be artificially masked out may be originally
+        missing, and the masking operation on the values will do nothing.
 
     nan : int/float, optional, default=0
         Value used to fill NaN values.
@@ -50,19 +50,21 @@ def mcar(X, rate, nan=0):
 
     indicating_mask : array,
         The mask indicates the artificially-missing values in X, namely missing parts different from X_intact.
-        In it, 1 indicates artificially missing values, and other values are indicated as 0.
+        In it, 1 indicates artificially missing values,
+        and the other values (including originally observed/missing values) are indicated as 0.
     """
     if isinstance(X, list):
         X = np.asarray(X)
 
     if isinstance(X, np.ndarray):
-        return _mcar_numpy(X, rate, nan)
+        X_intact, X, missing_mask, indicating_mask = _mcar_numpy(X, rate, nan)
     elif isinstance(X, torch.Tensor):
-        return _mcar_torch(X, rate, nan)
+        X_intact, X, missing_mask, indicating_mask = _mcar_torch(X, rate, nan)
     else:
         raise TypeError(
             "X must be type of list/numpy.ndarray/torch.Tensor, " f"but got {type(X)}"
         )
+    return X_intact, X, missing_mask, indicating_mask
 
 
 def _mcar_numpy(X: np.ndarray, rate: float, nan: float = 0):
diff --git a/pycorruptor/mnar.py b/pygrinder/mnar.py
similarity index 100%
rename from pycorruptor/mnar.py
rename to pygrinder/mnar.py
diff --git a/pycorruptor/utils.py b/pygrinder/utils.py
similarity index 98%
rename from pycorruptor/utils.py
rename to pygrinder/utils.py
index 2ee5d48..ee6505d 100644
--- a/pycorruptor/utils.py
+++ b/pygrinder/utils.py
@@ -1,5 +1,5 @@
 """
-Utility functions for pycorruptor.
+Utility functions for pygrinder.
 """
 
 # Created by Wenjie Du <wenjay.du@gmail.com>
diff --git a/setup.cfg b/setup.cfg
index 6693757..e39b37d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,4 +1,4 @@
-# This file stores some meta configurations for project PyCorruptor.
+# This file stores some meta configurations for project PyGrinder.
 
 # Created by Wenjie Du <wenjay.du@gmail.com>
 # License: GLP-v3
diff --git a/setup.py b/setup.py
index ad14c0c..b2365d2 100644
--- a/setup.py
+++ b/setup.py
@@ -1,21 +1,21 @@
 from setuptools import setup, find_packages
 
-from pycorruptor import __version__
+from pygrinder import __version__
 
 with open("./README.md", encoding="utf-8") as f:
     README = f.read()
 
 setup(
-    name="pycorruptor",
+    name="pygrinder",
     version=__version__,
-    description="A Python Toolbox for Data Corruption",
+    description="A Python toolkit for introducing missing values into datasets",
     long_description=README,
     long_description_content_type="text/markdown",
     license="GPL-3.0",
     author="Wenjie Du",
     author_email="wenjay.du@gmail.com",
-    url="https://github.com/WenjieDu/PyCorruptor",
-    download_url="https://github.com/WenjieDu/PyCorruptor/archive/main.zip",
+    url="https://github.com/WenjieDu/PyGrinder",
+    download_url="https://github.com/WenjieDu/PyGrinder/archive/main.zip",
     keywords=[
         "missing data",
         "missing values",
@@ -23,6 +23,7 @@
         "incomplete data",
         "partial observation",
         "data mining",
+        "pypots",
         "missingness",
     ],
     packages=find_packages(exclude=["tests"]),


Test patch:
diff --git a/.github/workflows/testing_ci.yml b/.github/workflows/testing_ci.yml
index b0d7274..f35589a 100644
--- a/.github/workflows/testing_ci.yml
+++ b/.github/workflows/testing_ci.yml
@@ -35,7 +35,7 @@ jobs:
 
             -   name: Test with pytest
                 run: |
-                    coverage run --source=pycorruptor -m pytest
+                    coverage run --source=pygrinder -m pytest
 
             -   name: Write the LCOV report
                 run: |
@@ -45,4 +45,4 @@ jobs:
                 uses: coverallsapp/github-action@master
                 with:
                     github-token: ${{ secrets.GITHUB_TOKEN }}
-                    path-to-lcov: 'coverage.lcov'
\ No newline at end of file
+                    path-to-lcov: 'coverage.lcov'
diff --git a/tests/__init__.py b/tests/__init__.py
index 52a1b37..bb6e070 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,5 +1,5 @@
 """
-Test cases for PyCorruptor.
+Test cases for PyGrinder.
 """
 
 # Created by Wenjie Du <wenjay.du@gmail.com>
diff --git a/tests/test_pycorruptor.py b/tests/test_pycorruptor.py
index 84d23c5..e51e124 100644
--- a/tests/test_pycorruptor.py
+++ b/tests/test_pycorruptor.py
@@ -1,5 +1,5 @@
 """
-PyCorruptor test cases
+PyGrinder test cases
 """
 
 # Created by Wenjie Du <wenjay.du@gmail.com>
@@ -9,13 +9,13 @@
 
 import numpy as np
 
-from pycorruptor import mcar
+from pygrinder import mcar
 
 DEFAULT_MISSING_RATE = 0.1
 NAN = 1
 
 
-class TestPyCorruptor(unittest.TestCase):
+class TestPyGrinder(unittest.TestCase):
     def test_0_mcar(self):
         d = np.random.randn(128, 10, 36)
         d_intact, d_with_missing, missing_mask, indicating_mask = mcar(