diff --git a/.gitignore b/.gitignore
index 2cc0161..c21bb40 100644
--- a/.gitignore
+++ b/.gitignore
@@ -63,3 +63,4 @@ setuptools-*.zip
 .vscode/
 result_images/
 docs/source/_dynamic/*.rst
+**/.ipynb_checkpoints
\ No newline at end of file
diff --git a/docs/source/tutorial/extend.ipynb b/docs/source/tutorial/extend.ipynb
index 4a3042a..ef57727 100644
--- a/docs/source/tutorial/extend.ipynb
+++ b/docs/source/tutorial/extend.ipynb
@@ -9,7 +9,7 @@
     "\n",
     "This tutorial serves as a guide for utilizing the extension tools for aggregation and transformer functions in Scikit-Criteria. After going through this tutorial, you will be able to implement your own multi-criteria decision models compatible with the data types and tools provided by the library.\n",
     "\n",
-    "## Introduction\n",
+    "## 1. Introduction\n",
     "\n",
     "In Scikit-Criteria, leveraging the provided decorators (`@extend.mkagg` and `@extend.mktransformer`) for extending aggregation and transformation functions provides a powerful means to customize decision-making models allowing the creation of custom functions, enabling domain-specific logic implementation for diverse use cases. \n",
     "\n",
@@ -55,7 +55,9 @@
     "\n",
     "To create a custom aggregation model, follow these steps:\n",
     "\n",
-    "1. Declare a function with the name of your model using the [`CapWords`/`UpperCamelCase`/`PascalCase`](https://en.wikipedia.org/wiki/Camel_case) convention. While this is not mandatory, not adhering to this convention will trigger a warning message from scikit-criteria, notifying that the model name does not follow the Scikit-Criteria standard.\n"
+    "1. Declare a function with the name of your model using the [CapWords/UpperCamelCase/PascalCase](https://en.wikipedia.org/wiki/Camel_case) convention. While this is not mandatory, not adhering to this convention will trigger a warning message from scikit-criteria, notifying that the model name does not follow the Scikit-Criteria standard.\n",
+    "\n",
+    "\n"
    ]
   },
   {
@@ -97,18 +99,16 @@
     "\n",
     "\n",
     "- `hparams`: Model Hyperparameters.\n",
-    "- `matrix`: Alternatives matrix as pandas DataFrame.\n",
-    "- `objectives`: Objectives for criteria as integers: $maximize = 1$ and $minimize = -1$\n",
-    "- `weights`: Weights of the criteria.\n",
-    "- `dtypes`: Dtypes of the criteria.\n",
-    "- `alternatives`: Names of the alternatives.\n",
-    "- `criteria`: Names of the criteria.\n",
-    "\n",
-    "Additionally, if you do not want to use any of those parts of the matrix, you can declare the function with [Variable Keyword Arguments (`**kwargs`)](https://www.w3schools.com/python/gloss_python_function_arbitrary_keyword_arguments.asp).\n",
-    "\n",
+    "- `matrix`: Alternatives matrix as numpy array.\n",
+    "- `objectives`: numpy array of objectives for criteria as integers: $maximize = 1$ and $minimize = -1$.\n",
+    "- `weights`: Weights of the criteria as numpy array.\n",
+    "- `dtypes`: Data types of the criteria as numpy array.\n",
+    "- `alternatives`: Names of the alternatives as numpy array.\n",
+    "- `criteria`: Names of the criteria as numpy array.\n",
     "\n",
-    "**If any parameter is forgotten and `**kwargs` is not present, a [`TypeError`](https://docs.python.org/3/library/exceptions.html#TypeError) is raised.**\n",
+    "Additionally, if you do not want to use any of those parameters of the matrix, you can declare the function with [Variable Keyword Arguments (**kwargs)](https://www.w3schools.com/python/gloss_python_function_arbitrary_keyword_arguments.asp).\n",
     "\n",
+    "If any parameter is forgotten and `**kwargs` is not present, a [TypeError](https://docs.python.org/3/library/exceptions.html#TypeError) is raised.\n",
     "\n",
     "So this next two functions are a valid Aggregation functions"
    ]
@@ -330,27 +330,27 @@
        "<div class='skcresult-rank skcresult'>\n",
        "<style type=\"text/css\">\n",
        "</style>\n",
-       "<table id=\"T_136a8\">\n",
+       "<table id=\"T_48893\">\n",
        "  <thead>\n",
        "    <tr>\n",
        "      <th class=\"index_name level0\" >Alternatives</th>\n",
-       "      <th id=\"T_136a8_level0_col0\" class=\"col_heading level0 col0\" >PE</th>\n",
-       "      <th id=\"T_136a8_level0_col1\" class=\"col_heading level0 col1\" >JN</th>\n",
-       "      <th id=\"T_136a8_level0_col2\" class=\"col_heading level0 col2\" >AA</th>\n",
-       "      <th id=\"T_136a8_level0_col3\" class=\"col_heading level0 col3\" >FX</th>\n",
-       "      <th id=\"T_136a8_level0_col4\" class=\"col_heading level0 col4\" >MM</th>\n",
-       "      <th id=\"T_136a8_level0_col5\" class=\"col_heading level0 col5\" >GN</th>\n",
+       "      <th id=\"T_48893_level0_col0\" class=\"col_heading level0 col0\" >PE</th>\n",
+       "      <th id=\"T_48893_level0_col1\" class=\"col_heading level0 col1\" >JN</th>\n",
+       "      <th id=\"T_48893_level0_col2\" class=\"col_heading level0 col2\" >AA</th>\n",
+       "      <th id=\"T_48893_level0_col3\" class=\"col_heading level0 col3\" >FX</th>\n",
+       "      <th id=\"T_48893_level0_col4\" class=\"col_heading level0 col4\" >MM</th>\n",
+       "      <th id=\"T_48893_level0_col5\" class=\"col_heading level0 col5\" >GN</th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
-       "      <th id=\"T_136a8_level0_row0\" class=\"row_heading level0 row0\" >Rank</th>\n",
-       "      <td id=\"T_136a8_row0_col0\" class=\"data row0 col0\" >1</td>\n",
-       "      <td id=\"T_136a8_row0_col1\" class=\"data row0 col1\" >1</td>\n",
-       "      <td id=\"T_136a8_row0_col2\" class=\"data row0 col2\" >1</td>\n",
-       "      <td id=\"T_136a8_row0_col3\" class=\"data row0 col3\" >1</td>\n",
-       "      <td id=\"T_136a8_row0_col4\" class=\"data row0 col4\" >1</td>\n",
-       "      <td id=\"T_136a8_row0_col5\" class=\"data row0 col5\" >1</td>\n",
+       "      <th id=\"T_48893_level0_row0\" class=\"row_heading level0 row0\" >Rank</th>\n",
+       "      <td id=\"T_48893_row0_col0\" class=\"data row0 col0\" >1</td>\n",
+       "      <td id=\"T_48893_row0_col1\" class=\"data row0 col1\" >1</td>\n",
+       "      <td id=\"T_48893_row0_col2\" class=\"data row0 col2\" >1</td>\n",
+       "      <td id=\"T_48893_row0_col3\" class=\"data row0 col3\" >1</td>\n",
+       "      <td id=\"T_48893_row0_col4\" class=\"data row0 col4\" >1</td>\n",
+       "      <td id=\"T_48893_row0_col5\" class=\"data row0 col5\" >1</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
@@ -615,27 +615,27 @@
        "<div class='skcresult-rank skcresult'>\n",
        "<style type=\"text/css\">\n",
        "</style>\n",
-       "<table id=\"T_db6c9\">\n",
+       "<table id=\"T_ddb8b\">\n",
        "  <thead>\n",
        "    <tr>\n",
        "      <th class=\"index_name level0\" >Alternatives</th>\n",
-       "      <th id=\"T_db6c9_level0_col0\" class=\"col_heading level0 col0\" >PE</th>\n",
-       "      <th id=\"T_db6c9_level0_col1\" class=\"col_heading level0 col1\" >JN</th>\n",
-       "      <th id=\"T_db6c9_level0_col2\" class=\"col_heading level0 col2\" >AA</th>\n",
-       "      <th id=\"T_db6c9_level0_col3\" class=\"col_heading level0 col3\" >FX</th>\n",
-       "      <th id=\"T_db6c9_level0_col4\" class=\"col_heading level0 col4\" >MM</th>\n",
-       "      <th id=\"T_db6c9_level0_col5\" class=\"col_heading level0 col5\" >GN</th>\n",
+       "      <th id=\"T_ddb8b_level0_col0\" class=\"col_heading level0 col0\" >PE</th>\n",
+       "      <th id=\"T_ddb8b_level0_col1\" class=\"col_heading level0 col1\" >JN</th>\n",
+       "      <th id=\"T_ddb8b_level0_col2\" class=\"col_heading level0 col2\" >AA</th>\n",
+       "      <th id=\"T_ddb8b_level0_col3\" class=\"col_heading level0 col3\" >FX</th>\n",
+       "      <th id=\"T_ddb8b_level0_col4\" class=\"col_heading level0 col4\" >MM</th>\n",
+       "      <th id=\"T_ddb8b_level0_col5\" class=\"col_heading level0 col5\" >GN</th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
-       "      <th id=\"T_db6c9_level0_row0\" class=\"row_heading level0 row0\" >Rank</th>\n",
-       "      <td id=\"T_db6c9_row0_col0\" class=\"data row0 col0\" >3</td>\n",
-       "      <td id=\"T_db6c9_row0_col1\" class=\"data row0 col1\" >5</td>\n",
-       "      <td id=\"T_db6c9_row0_col2\" class=\"data row0 col2\" >2</td>\n",
-       "      <td id=\"T_db6c9_row0_col3\" class=\"data row0 col3\" >6</td>\n",
-       "      <td id=\"T_db6c9_row0_col4\" class=\"data row0 col4\" >4</td>\n",
-       "      <td id=\"T_db6c9_row0_col5\" class=\"data row0 col5\" >1</td>\n",
+       "      <th id=\"T_ddb8b_level0_row0\" class=\"row_heading level0 row0\" >Rank</th>\n",
+       "      <td id=\"T_ddb8b_row0_col0\" class=\"data row0 col0\" >3</td>\n",
+       "      <td id=\"T_ddb8b_row0_col1\" class=\"data row0 col1\" >5</td>\n",
+       "      <td id=\"T_ddb8b_row0_col2\" class=\"data row0 col2\" >2</td>\n",
+       "      <td id=\"T_ddb8b_row0_col3\" class=\"data row0 col3\" >6</td>\n",
+       "      <td id=\"T_ddb8b_row0_col4\" class=\"data row0 col4\" >4</td>\n",
+       "      <td id=\"T_ddb8b_row0_col5\" class=\"data row0 col5\" >1</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
@@ -697,27 +697,27 @@
        "<div class='skcresult-rank skcresult'>\n",
        "<style type=\"text/css\">\n",
        "</style>\n",
-       "<table id=\"T_ccf83\">\n",
+       "<table id=\"T_ed8cf\">\n",
        "  <thead>\n",
        "    <tr>\n",
        "      <th class=\"index_name level0\" >Alternatives</th>\n",
-       "      <th id=\"T_ccf83_level0_col0\" class=\"col_heading level0 col0\" >PE</th>\n",
-       "      <th id=\"T_ccf83_level0_col1\" class=\"col_heading level0 col1\" >JN</th>\n",
-       "      <th id=\"T_ccf83_level0_col2\" class=\"col_heading level0 col2\" >AA</th>\n",
-       "      <th id=\"T_ccf83_level0_col3\" class=\"col_heading level0 col3\" >FX</th>\n",
-       "      <th id=\"T_ccf83_level0_col4\" class=\"col_heading level0 col4\" >MM</th>\n",
-       "      <th id=\"T_ccf83_level0_col5\" class=\"col_heading level0 col5\" >GN</th>\n",
+       "      <th id=\"T_ed8cf_level0_col0\" class=\"col_heading level0 col0\" >PE</th>\n",
+       "      <th id=\"T_ed8cf_level0_col1\" class=\"col_heading level0 col1\" >JN</th>\n",
+       "      <th id=\"T_ed8cf_level0_col2\" class=\"col_heading level0 col2\" >AA</th>\n",
+       "      <th id=\"T_ed8cf_level0_col3\" class=\"col_heading level0 col3\" >FX</th>\n",
+       "      <th id=\"T_ed8cf_level0_col4\" class=\"col_heading level0 col4\" >MM</th>\n",
+       "      <th id=\"T_ed8cf_level0_col5\" class=\"col_heading level0 col5\" >GN</th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
-       "      <th id=\"T_ccf83_level0_row0\" class=\"row_heading level0 row0\" >Rank</th>\n",
-       "      <td id=\"T_ccf83_row0_col0\" class=\"data row0 col0\" >2</td>\n",
-       "      <td id=\"T_ccf83_row0_col1\" class=\"data row0 col1\" >4</td>\n",
-       "      <td id=\"T_ccf83_row0_col2\" class=\"data row0 col2\" >3</td>\n",
-       "      <td id=\"T_ccf83_row0_col3\" class=\"data row0 col3\" >6</td>\n",
-       "      <td id=\"T_ccf83_row0_col4\" class=\"data row0 col4\" >5</td>\n",
-       "      <td id=\"T_ccf83_row0_col5\" class=\"data row0 col5\" >1</td>\n",
+       "      <th id=\"T_ed8cf_level0_row0\" class=\"row_heading level0 row0\" >Rank</th>\n",
+       "      <td id=\"T_ed8cf_row0_col0\" class=\"data row0 col0\" >2</td>\n",
+       "      <td id=\"T_ed8cf_row0_col1\" class=\"data row0 col1\" >4</td>\n",
+       "      <td id=\"T_ed8cf_row0_col2\" class=\"data row0 col2\" >3</td>\n",
+       "      <td id=\"T_ed8cf_row0_col3\" class=\"data row0 col3\" >6</td>\n",
+       "      <td id=\"T_ed8cf_row0_col4\" class=\"data row0 col4\" >5</td>\n",
+       "      <td id=\"T_ed8cf_row0_col5\" class=\"data row0 col5\" >1</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
@@ -776,7 +776,789 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## 3. A New Transformer"
+    "## 3. A New Transformer\n",
+    "\n",
+    "The only difference between creating a new aggregator and a transformer lies in the type of data returned by the decorated function. Everything else is exactly the same (received parameters, function names, and functionality of hyperparameters).\n",
+    "\n",
+    "The decorated function must return a dictionary that can have the same keys as the parameters received by the function except for `hparam`: `matrix`, `objectives`, `weights`, `dtypes`, `alternatives`, or `criteria`; and whose values must be the new values with which to replace the original ones in the transformation matrix.\n",
+    "\n",
+    "It is not necessary to return all values; only the ones that you want to change.\n",
+    "\n",
+    "\n",
+    "For example, if we want to create a transformer `StrFormat` that converts the text of the names of each criterion and alternative using the methods of `str`, and by default, it converts texts to lowercase.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<StrFormat [operation=<method 'lower' of 'str' objects>]>"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "@mktransformer(operation=str.lower)\n",
+    "def StrFormat(alternatives, criteria, hparams, **kwargs):\n",
+    "    \"\"\"Applies a string formatting operation (lowercasing by default) to alternatives and criteria.\"\"\"\n",
+    "    # Apply the string formatting operation to each alternative\n",
+    "    new_alternatives = [hparams.operation(a) for a in alternatives]\n",
+    "\n",
+    "    # Apply the string formatting operation to each criterion\n",
+    "    new_criteria = [hparams.operation(c) for c in criteria]\n",
+    "\n",
+    "    # Return the transformed alternatives and criteria in a dictionary\n",
+    "    return {\"alternatives\": new_alternatives, \"criteria\": new_criteria}\n",
+    "    \n",
+    "trans = StrFormat()\n",
+    "trans"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div class='decisionmatrix'>\n",
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>roe[▲ 2.0]</th>\n",
+       "      <th>cap[▲ 4.0]</th>\n",
+       "      <th>ri[▲ 1.0]</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>pe</th>\n",
+       "      <td>7</td>\n",
+       "      <td>5</td>\n",
+       "      <td>0.028571</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>jn</th>\n",
+       "      <td>5</td>\n",
+       "      <td>4</td>\n",
+       "      <td>0.038462</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>aa</th>\n",
+       "      <td>5</td>\n",
+       "      <td>6</td>\n",
+       "      <td>0.035714</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>fx</th>\n",
+       "      <td>3</td>\n",
+       "      <td>4</td>\n",
+       "      <td>0.027778</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>mm</th>\n",
+       "      <td>1</td>\n",
+       "      <td>7</td>\n",
+       "      <td>0.033333</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>gn</th>\n",
+       "      <td>5</td>\n",
+       "      <td>8</td>\n",
+       "      <td>0.033333</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div><em class='decisionmatrix-dim'>6 Alternatives x 3 Criteria</em>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    roe[▲ 2.0]  cap[▲ 4.0]  ri[▲ 1.0]\n",
+       "pe           7           5   0.028571\n",
+       "jn           5           4   0.038462\n",
+       "aa           5           6   0.035714\n",
+       "fx           3           4   0.027778\n",
+       "mm           1           7   0.033333\n",
+       "gn           5           8   0.033333\n",
+       "[6 Alternatives x 3 Criteria]"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans.transform(dm)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can use any function provided by `str`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<StrFormat [operation=<method 'capitalize' of 'str' objects>]>"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans = StrFormat(operation=str.capitalize)\n",
+    "trans"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div class='decisionmatrix'>\n",
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>Roe[▲ 2.0]</th>\n",
+       "      <th>Cap[▲ 4.0]</th>\n",
+       "      <th>Ri[▲ 1.0]</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>Pe</th>\n",
+       "      <td>7</td>\n",
+       "      <td>5</td>\n",
+       "      <td>0.028571</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Jn</th>\n",
+       "      <td>5</td>\n",
+       "      <td>4</td>\n",
+       "      <td>0.038462</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Aa</th>\n",
+       "      <td>5</td>\n",
+       "      <td>6</td>\n",
+       "      <td>0.035714</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Fx</th>\n",
+       "      <td>3</td>\n",
+       "      <td>4</td>\n",
+       "      <td>0.027778</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Mm</th>\n",
+       "      <td>1</td>\n",
+       "      <td>7</td>\n",
+       "      <td>0.033333</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Gn</th>\n",
+       "      <td>5</td>\n",
+       "      <td>8</td>\n",
+       "      <td>0.033333</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div><em class='decisionmatrix-dim'>6 Alternatives x 3 Criteria</em>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    Roe[▲ 2.0]  Cap[▲ 4.0]  Ri[▲ 1.0]\n",
+       "Pe           7           5   0.028571\n",
+       "Jn           5           4   0.038462\n",
+       "Aa           5           6   0.035714\n",
+       "Fx           3           4   0.027778\n",
+       "Mm           1           7   0.033333\n",
+       "Gn           5           8   0.033333\n",
+       "[6 Alternatives x 3 Criteria]"
+      ]
+     },
+     "execution_count": 23,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans.transform(dm)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In fact, given our implementation, any arbitrary function that converts text can be used. For example, if we want to create our own function that adds exclamation marks to the end of each criterion and alternative."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<StrFormat [operation=<function add_exclamation at 0x79a56af36f80>]>"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "def add_exclamation(text):\n",
+    "    return text + \" !! \"\n",
+    "\n",
+    "trans = StrFormat(operation=add_exclamation)\n",
+    "trans"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div class='decisionmatrix'>\n",
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>ROE !! [▲ 2.0]</th>\n",
+       "      <th>CAP !! [▲ 4.0]</th>\n",
+       "      <th>RI !! [▲ 1.0]</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>PE !!</th>\n",
+       "      <td>7</td>\n",
+       "      <td>5</td>\n",
+       "      <td>0.028571</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>JN !!</th>\n",
+       "      <td>5</td>\n",
+       "      <td>4</td>\n",
+       "      <td>0.038462</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>AA !!</th>\n",
+       "      <td>5</td>\n",
+       "      <td>6</td>\n",
+       "      <td>0.035714</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>FX !!</th>\n",
+       "      <td>3</td>\n",
+       "      <td>4</td>\n",
+       "      <td>0.027778</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>MM !!</th>\n",
+       "      <td>1</td>\n",
+       "      <td>7</td>\n",
+       "      <td>0.033333</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>GN !!</th>\n",
+       "      <td>5</td>\n",
+       "      <td>8</td>\n",
+       "      <td>0.033333</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div><em class='decisionmatrix-dim'>6 Alternatives x 3 Criteria</em>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "        ROE !! [▲ 2.0]  CAP !! [▲ 4.0]  RI !! [▲ 1.0]\n",
+       "PE !!                7               5       0.028571\n",
+       "JN !!                5               4       0.038462\n",
+       "AA !!                5               6       0.035714\n",
+       "FX !!                3               4       0.027778\n",
+       "MM !!                1               7       0.033333\n",
+       "GN !!                5               8       0.033333\n",
+       "[6 Alternatives x 3 Criteria]"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans.transform(dm)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 3.1 Special considerations regarding `dtypes`\n",
+    "\n",
+    "\n",
+    "By design decision, scikitcriteria always attempts to **always** preserve the original data types, unless it needs to infer them again.\n",
+    "\n",
+    "This may not seem important to a user at first glance, so let's use an example of a transformer affected by this characteristic.\n",
+    "\n",
+    "First, let's reload the original decision matrix, where the values of all criteria are `int`.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div class='decisionmatrix'>\n",
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>ROE[▲ 2.0]</th>\n",
+       "      <th>CAP[▲ 4.0]</th>\n",
+       "      <th>RI[▼ 1.0]</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>PE</th>\n",
+       "      <td>7</td>\n",
+       "      <td>5</td>\n",
+       "      <td>35</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>JN</th>\n",
+       "      <td>5</td>\n",
+       "      <td>4</td>\n",
+       "      <td>26</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>AA</th>\n",
+       "      <td>5</td>\n",
+       "      <td>6</td>\n",
+       "      <td>28</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>FX</th>\n",
+       "      <td>3</td>\n",
+       "      <td>4</td>\n",
+       "      <td>36</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>MM</th>\n",
+       "      <td>1</td>\n",
+       "      <td>7</td>\n",
+       "      <td>30</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>GN</th>\n",
+       "      <td>5</td>\n",
+       "      <td>8</td>\n",
+       "      <td>30</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div><em class='decisionmatrix-dim'>6 Alternatives x 3 Criteria</em>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    ROE[▲ 2.0]  CAP[▲ 4.0]  RI[▼ 1.0]\n",
+       "PE           7           5         35\n",
+       "JN           5           4         26\n",
+       "AA           5           6         28\n",
+       "FX           3           4         36\n",
+       "MM           1           7         30\n",
+       "GN           5           8         30\n",
+       "[6 Alternatives x 3 Criteria]"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "dm = skc.datasets.load_simple_stock_selection()\n",
+    "dm"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now, let's create a transformer that converts all criteria to the `float` type."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AsFloat []>"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "@mktransformer\n",
+    "def AsFloat(matrix, **kwargs):\n",
+    "    \"\"\"Converts the elements of a decision-matrix to floating-point numbers.\"\"\"\n",
+    "    # Convert the elements of the matrix to floating-point numbers\n",
+    "    new_matrix = matrix.astype(float)\n",
+    "    \n",
+    "    # Return the transformed matrix in a dictionary\n",
+    "    return {\"matrix\": new_matrix}\n",
+    "\n",
+    "trans = AsFloat()\n",
+    "trans\n",
+    "    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now, let's test its functionality.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div class='decisionmatrix'>\n",
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>ROE[▲ 2.0]</th>\n",
+       "      <th>CAP[▲ 4.0]</th>\n",
+       "      <th>RI[▼ 1.0]</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>PE</th>\n",
+       "      <td>7</td>\n",
+       "      <td>5</td>\n",
+       "      <td>35</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>JN</th>\n",
+       "      <td>5</td>\n",
+       "      <td>4</td>\n",
+       "      <td>26</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>AA</th>\n",
+       "      <td>5</td>\n",
+       "      <td>6</td>\n",
+       "      <td>28</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>FX</th>\n",
+       "      <td>3</td>\n",
+       "      <td>4</td>\n",
+       "      <td>36</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>MM</th>\n",
+       "      <td>1</td>\n",
+       "      <td>7</td>\n",
+       "      <td>30</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>GN</th>\n",
+       "      <td>5</td>\n",
+       "      <td>8</td>\n",
+       "      <td>30</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div><em class='decisionmatrix-dim'>6 Alternatives x 3 Criteria</em>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    ROE[▲ 2.0]  CAP[▲ 4.0]  RI[▼ 1.0]\n",
+       "PE           7           5         35\n",
+       "JN           5           4         26\n",
+       "AA           5           6         28\n",
+       "FX           3           4         36\n",
+       "MM           1           7         30\n",
+       "GN           5           8         30\n",
+       "[6 Alternatives x 3 Criteria]"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans.transform(dm)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "As can be seen, the numbers are still integers. This is because the `dtypes` parameter of the matrix indicates that those columns are indeed integers.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "ROE    int64\n",
+       "CAP    int64\n",
+       "RI     int64\n",
+       "dtype: object"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "dm.dtypes  # check the dtypes"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The simplest solution would be to ensure that the dtypes are inferred again based on the values of the new matrix. This is achieved by assigning the dtype values to None.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div class='decisionmatrix'>\n",
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>ROE[▲ 2.0]</th>\n",
+       "      <th>CAP[▲ 4.0]</th>\n",
+       "      <th>RI[▼ 1.0]</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>PE</th>\n",
+       "      <td>7.0</td>\n",
+       "      <td>5.0</td>\n",
+       "      <td>35.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>JN</th>\n",
+       "      <td>5.0</td>\n",
+       "      <td>4.0</td>\n",
+       "      <td>26.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>AA</th>\n",
+       "      <td>5.0</td>\n",
+       "      <td>6.0</td>\n",
+       "      <td>28.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>FX</th>\n",
+       "      <td>3.0</td>\n",
+       "      <td>4.0</td>\n",
+       "      <td>36.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>MM</th>\n",
+       "      <td>1.0</td>\n",
+       "      <td>7.0</td>\n",
+       "      <td>30.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>GN</th>\n",
+       "      <td>5.0</td>\n",
+       "      <td>8.0</td>\n",
+       "      <td>30.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div><em class='decisionmatrix-dim'>6 Alternatives x 3 Criteria</em>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    ROE[▲ 2.0]  CAP[▲ 4.0]  RI[▼ 1.0]\n",
+       "PE         7.0         5.0       35.0\n",
+       "JN         5.0         4.0       26.0\n",
+       "AA         5.0         6.0       28.0\n",
+       "FX         3.0         4.0       36.0\n",
+       "MM         1.0         7.0       30.0\n",
+       "GN         5.0         8.0       30.0\n",
+       "[6 Alternatives x 3 Criteria]"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "@mktransformer\n",
+    "def AsFloat(matrix, **kwargs):\n",
+    "    \"\"\"Converts the elements of a decision-matrix to floating-point numbers.\"\"\"\n",
+    "    # Convert the elements of the matrix to floating-point numbers\n",
+    "    new_matrix = matrix.astype(float)\n",
+    "    \n",
+    "    # Return the transformed matrix in a dictionary\n",
+    "    # and assign the dtypes as None\n",
+    "    return {\"matrix\": new_matrix, \"dtypes\": None}\n",
+    "\n",
+    "trans = AsFloat()\n",
+    "trans.transform(dm)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "While this may seem somewhat inconvenient, it gives the user complete control over the data types of the matrix without assuming default behaviors that may be undesirable.\n",
+    "\n",
+    "It's essential to consider that the original `dtypes` are also received by the transformer (in our case, they are inside `**kwargs`) and can be used to determine the new types."
    ]
   }
  ],
diff --git a/docs/source/tutorial/index.rst b/docs/source/tutorial/index.rst
index a279303..6ff3b13 100644
--- a/docs/source/tutorial/index.rst
+++ b/docs/source/tutorial/index.rst
@@ -67,4 +67,5 @@ to different scientific areas.
     Python quickly, we recommend `Dive Into Python <http://www.diveintopython3.net/>`_. If that's not quite your
     style, there are many other `books about Python <https://wiki.python.org/moin/PythonBooks>`_.
 
-    At last if you already know Python but check the `Scipy Lecture Notes <http://www.scipy-lectures.org/>`_
+    At last, if you're already familiar with Python and eager to explore the scientific stack further, be sure to check out 
+    the `Scipy Lecture Notes <http://www.scipy-lectures.org/>`_
diff --git a/skcriteria/agg/_agg_base.py b/skcriteria/agg/_agg_base.py
index efa70e2..7eeaf65 100644
--- a/skcriteria/agg/_agg_base.py
+++ b/skcriteria/agg/_agg_base.py
@@ -276,7 +276,6 @@ class RankResult(ResultABC):
 
     @doc_inherit(ResultABC._validate_result)
     def _validate_result(self, values):
-
         # the sorted unique values of the rank!
         # [1, 1, 1, 2, 3] >>> [1, 2, 3] <<< OK! this is consecutive
         # [1, 1, 4, 4, 3] >>> [1, 3, 4]  <<< BAD this is not consecutive
diff --git a/skcriteria/utils/bunch.py b/skcriteria/utils/bunch.py
index bf4e3be..3e1da1a 100644
--- a/skcriteria/utils/bunch.py
+++ b/skcriteria/utils/bunch.py
@@ -54,7 +54,7 @@ class Bunch(Mapping):
 
     def __init__(self, name, data):
         if not isinstance(data, Mapping):
-            raise TypeError(f"Data must be some kind of mapping")
+            raise TypeError("Data must be some kind of mapping")
         self._name = str(name)
         self._data = data
 
diff --git a/tests/utils/test_bunch.py b/tests/utils/test_bunch.py
index e9c570d..9e97286 100644
--- a/tests/utils/test_bunch.py
+++ b/tests/utils/test_bunch.py
@@ -86,3 +86,8 @@ def test_Bunch_copy():
     assert md is not md_c
     assert md._name == md_c._name
     assert md._data == md_c._data and md._data is md_c._data
+
+
+def test_Bunch_data_is_not_a_mapping():
+    with pytest.raises(TypeError, match="Data must be some kind of mapping"):
+        bunch.Bunch("foo", None)