diff --git a/.ipynb_checkpoints/notebookApp-checkpoint.ipynb b/.ipynb_checkpoints/notebookApp-checkpoint.ipynb
new file mode 100644
index 0000000..71535ce
--- /dev/null
+++ b/.ipynb_checkpoints/notebookApp-checkpoint.ipynb
@@ -0,0 +1,1026 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# Replace Query with Parameter\n",
+ "🎓 College: [Faculdade Metodista Granbery](http://granbery.edu.br/)\n",
+ "\n",
+ "👨🏫 Teacher: [Marco Antônio - Github](https://github.com/marcoaparaujo) | [Linkedin](https://www.linkedin.com/in/marco-ant%C3%B4nio-ara%C3%BAjo/)\n",
+ "\n",
+ "📗 Book: [Refatoração - Aperfeiçoando o design de códigos existentes - Martin Fowler](https://www.amazon.com/-/pt/dp/B087N8LKYB/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=M4T29CCKD30E&keywords=refatora%C3%A7%C3%A3o&qid=1651322207&sprefix=refatora%C3%A7%C3%A3o%2Caps%2C203&sr=8-1)\n",
+ "\n",
+ "> FOWLER, Martin. “Replace Query with Parameter” no código. *In*: REFATORAÇÃO: Aperfeiçoando o design de códigos existentes. 2. ed. [*S. l.*: *s. n.*], 2019. cap. 8.\n",
+ ">\n",
+ "\n",
+ "## Objetivo\n",
+ "\n",
+ "Objetivo desse método e trazer uma função que traga sempre o mesmo resultado que se chama transparência referencial. A função que foi criada, não acessar um referencial transparente, a função não possuir transparência."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Código\n",
+ "O código que escolhi foi uma atividade dado em aula pelo Professor Ricardo. Essa função recebe um parâmetro de nomes de coluna do dataset, os dados são verificados pela sua severidade e depois ocorre sua substituição dos valores ausentes de acordo com o seu tipo.\n",
+ "\n",
+ "O código pode ser encontrado na plataforma [Kaggle](https://www.kaggle.com/code/edmilsoneddi/data-mining-discipline-exercise)\n",
+ "\n",
+ "## Ferramentas\n",
+ "### pytest\n",
+ "```sh\n",
+ " pip install ipytest\n",
+ "```\n",
+ "### testbook\n",
+ "```sh\n",
+ " pip install testbook\n",
+ "```\n",
+ "### jupyter notebook\n",
+ "```sh\n",
+ " pip install jupyter\n",
+ "```\n",
+ "### pandas\n",
+ "```sh\n",
+ " pip install pandas\n",
+ "```\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Código sem refatoração"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "dataset = pd.read_csv('mamografia.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " BI-RADS | \n",
+ " Idade | \n",
+ " Forma | \n",
+ " Margem | \n",
+ " Densidade | \n",
+ " Severidade | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 5.0 | \n",
+ " 67.0 | \n",
+ " 3.0 | \n",
+ " 5.0 | \n",
+ " 3.0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 4.0 | \n",
+ " 43.0 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 5.0 | \n",
+ " 58.0 | \n",
+ " 4.0 | \n",
+ " 5.0 | \n",
+ " 3.0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 4.0 | \n",
+ " 28.0 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ " 3.0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 5.0 | \n",
+ " 74.0 | \n",
+ " 1.0 | \n",
+ " 5.0 | \n",
+ " NaN | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " BI-RADS Idade Forma Margem Densidade Severidade\n",
+ "0 5.0 67.0 3.0 5.0 3.0 1\n",
+ "1 4.0 43.0 1.0 1.0 NaN 1\n",
+ "2 5.0 58.0 4.0 5.0 3.0 1\n",
+ "3 4.0 28.0 1.0 1.0 3.0 0\n",
+ "4 5.0 74.0 1.0 5.0 NaN 1"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia = dataset.copy()\n",
+ "mamografia.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS float64\n",
+ "Idade float64\n",
+ "Forma float64\n",
+ " Margem float64\n",
+ " Densidade float64\n",
+ "Severidade int64\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia.dtypes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# Análise de Valores Ausentes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Valores ausentes \n",
+ "\n",
+ "Valores Benigno: \n",
+ "BI-RADS 1\n",
+ "Idade 0\n",
+ "Forma 19\n",
+ " Margem 37\n",
+ " Densidade 54\n",
+ "Severidade 0\n",
+ "dtype: int64\n",
+ "\n",
+ "Valores Maligno: \n",
+ "BI-RADS 1\n",
+ "Idade 5\n",
+ "Forma 12\n",
+ " Margem 11\n",
+ " Densidade 22\n",
+ "Severidade 0\n",
+ "dtype: int64\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "benigno = mamografia[mamografia['Severidade'] == 0].isnull().sum()\n",
+ "print(' Valores ausentes ')\n",
+ "print()\n",
+ "print('Valores Benigno: ')\n",
+ "print(benigno)\n",
+ "print()\n",
+ "maligno = mamografia[mamografia['Severidade'] == 1].isnull().sum()\n",
+ "print('Valores Maligno: ')\n",
+ "print(maligno)\n",
+ "print()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes():\n",
+ " for lista in mamografia.columns:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = mamografia[(mamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = mamografia[(mamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " \n",
+ " else:\n",
+ " media_benigno = mamografia[(mamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = mamografia[(mamografia['Severidade'] == 1)][lista].mean()\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['BI-RADS', 'Idade', 'Forma', ' Margem', ' Densidade', 'Severidade'], dtype='object')"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Objetivo da atividade\n",
+ "\n",
+ "1. Elabore ou escolha um código que a refatoração possa ser aplicada.\n",
+ "2. Identifique o mau cheiro associado.\n",
+ "3. Escreva os casos de teste e execute\n",
+ "4. Aplique a refatoração\n",
+ "5. Execute os casos de teste novamente\n",
+ "6. Documente cada etapa para a apresentação\n",
+ "\n",
+ "## Mau Cheiro\n",
+ "\n",
+ "### Lista longa de parâmetros\n",
+ "\n",
+ "O mau cheiro que encontrei dentro do código abaixo foi o lista longa de parâmetros, por possuir consultas longas e não claras. Esse mal cheiro, pode trazer dificuldades ou erros no código."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Procedimento"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refatoraMamografia = dataset.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Use Extrair variável (Extract Variable) no código da consulta para separá-lo do restante do corpo da função."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes():\n",
+ " colunas = refatoraMamografia.columns\n",
+ " for lista in colunas:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Aplique Extrair função (Extract Function) no código do corpo que não seja a chamada da consulta."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Dê à nova função um nome fácil de pesquisar, para poder renomeá-la depois."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ },
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def XXXNEWtratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes_refatora(): # tratar_ausentes_refatora() está escrito refatora, para não chamar a outra função tratar_ausentes()\n",
+ " colunas = refatoraMamografia.columns\n",
+ " return XXXNEWtratar_ausentes_refatora(colunas)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes_refatora()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Use Internalizar variável (Inline Variable) para se livrar da variável que você acabou de criar."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def XXXNEWtratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes_refatora(): # tratar_ausentes_refatora() está escrito refatora, para não chamar a outra função tratar_ausentes()\n",
+ " return XXXNEWtratar_ausentes_refatora(refatoraMamografia.columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tratar_ausentes_refatora()\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Aplique Internalizar função (Inline Function) na função original."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def XXXNEWtratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "#def tratar_ausentes_refatora():\n",
+ " # tratar_ausentes_refatora() está escrito refatora, para não chamar a outra função tratar_ausentes()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "XXXNEWtratar_ausentes_refatora(refatoraMamografia.columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Renomeie a nova função dando-lhe o nome da função original."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes_refatora(refatoraMamografia.columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..81d8d93
--- /dev/null
+++ b/README.md
@@ -0,0 +1,91 @@
+# Replace Query with Parameter
+
+🎓 College: [Faculdade Metodista Granbery](http://granbery.edu.br/)
+
+👨🏫 Teacher: [Marco Antônio - Github](https://github.com/marcoaparaujo) | [Linkedin](https://www.linkedin.com/in/marco-ant%C3%B4nio-ara%C3%BAjo/)
+
+📗 Book: [Refatoração - Aperfeiçoando o design de códigos existentes - Martin Fowler](https://www.amazon.com/-/pt/dp/B087N8LKYB/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=M4T29CCKD30E&keywords=refatora%C3%A7%C3%A3o&qid=1651322207&sprefix=refatora%C3%A7%C3%A3o%2Caps%2C203&sr=8-1)
+
+> FOWLER, Martin. “Replace Query with Parameter” no código. *In*: REFATORAÇÃO: Aperfeiçoando o design de códigos existentes. 2. ed. [*S. l.*: *s. n.*], 2019. cap. 11.
+>
+
+## Método
+
+Objetivo desse método e retirar a consulta dentro função que está em uma dependência indesejada e trazer uma função que traga sempre o mesmo resultado que se chama transparência referencial.
+
+## Código
+
+O código que escolhi foi uma atividade dado em aula pelo Professor Ricardo. Essa função recebe um parâmetro de nomes de coluna do dataset, os dados são verificados pela sua severidade e depois ocorre sua substituição dos valores ausentes de acordo com o seu tipo.
+
+O código pode ser encontrado na plataforma [Kaggle](https://www.kaggle.com/code/edmilsoneddi/data-mining-discipline-exercise)
+
+## Ferramentas
+
+```bash
+ pip install ipytest
+```
+
+```bash
+ pip install testbook
+```
+
+```bash
+ pip install pandas
+```
+
+```bash
+ pip install jupyter
+```
+
+## Objetivo da atividade
+
+1. Elabore ou escolha um código que a refatoração possa ser aplicada.
+2. Identifique o mau cheiro associado.
+3. Escreva os casos de teste e execute
+4. Aplique a refatoração
+5. Execute os casos de teste novamente
+6. Documente cada etapa para a apresentação
+
+## Mau Cheiro
+
+### Lista longa de parâmetros
+
+O mau cheiro que encontrei dentro do código abaixo foi o lista longa de parâmetros, sendo que esse mal cheiro é para método ‘Replace Parameter with Query’, mas esse método e o inverso do ‘Replace Query with Paramater’, sendo assim o seu mal cheiro será o inverso. O mal cheiro será de **consultas longas** que trazem **confusão** para realizar a **compreensão do código**.
+
+## Procedimento
+
+## Código sem refatoração
+
+
+
+## Teste sem refatoração
+
+
+
+## Código novo aplicando a refatoração
+
+## Use Extrair variável (Extract Variable) no código da consulta para separá-lo do restante do corpo da função.
+
+
+
+## Aplique Extrair função (Extract Function) no código do corpo que não seja a chamada da consulta.
+
+## Dê à nova função um nome fácil de pesquisar, para poder renomeá-la depois.
+
+
+
+## Use Internalizar variável (Inline Variable) para se livrar da variável que você acabou de criar.
+
+
+
+## Aplique Internalizar função (Inline Function) na função original.
+
+
+
+## Renomeie a nova função dando-lhe o nome da função original.
+
+
+
+## Realização do Teste
+
+
\ No newline at end of file
diff --git a/Replace_Query_with_Parameter.pdf b/Replace_Query_with_Parameter.pdf
new file mode 100644
index 0000000..dfde722
Binary files /dev/null and b/Replace_Query_with_Parameter.pdf differ
diff --git a/images/extractFunction.png b/images/extractFunction.png
new file mode 100644
index 0000000..db091f1
Binary files /dev/null and b/images/extractFunction.png differ
diff --git a/images/extractVariable.png b/images/extractVariable.png
new file mode 100644
index 0000000..b7b30e3
Binary files /dev/null and b/images/extractVariable.png differ
diff --git a/images/funcaoSemRefatoracao.png b/images/funcaoSemRefatoracao.png
new file mode 100644
index 0000000..d9161b0
Binary files /dev/null and b/images/funcaoSemRefatoracao.png differ
diff --git a/images/inlineFunction.png b/images/inlineFunction.png
new file mode 100644
index 0000000..b8cd86f
Binary files /dev/null and b/images/inlineFunction.png differ
diff --git a/images/inlineVariable.png b/images/inlineVariable.png
new file mode 100644
index 0000000..ee2cc5f
Binary files /dev/null and b/images/inlineVariable.png differ
diff --git a/images/renomear.png b/images/renomear.png
new file mode 100644
index 0000000..85574aa
Binary files /dev/null and b/images/renomear.png differ
diff --git a/images/testeComRefatoracao.png b/images/testeComRefatoracao.png
new file mode 100644
index 0000000..ae7239c
Binary files /dev/null and b/images/testeComRefatoracao.png differ
diff --git a/images/testeSemRefatoracao.png b/images/testeSemRefatoracao.png
new file mode 100644
index 0000000..90caa1f
Binary files /dev/null and b/images/testeSemRefatoracao.png differ
diff --git a/mamografia.csv b/mamografia.csv
new file mode 100644
index 0000000..f1cdc51
--- /dev/null
+++ b/mamografia.csv
@@ -0,0 +1,962 @@
+BI-RADS,Idade,Forma, Margem, Densidade,Severidade
+5,67,3,5,3,1
+4,43,1,1,,1
+5,58,4,5,3,1
+4,28,1,1,3,0
+5,74,1,5,,1
+4,65,1,,3,0
+4,70,,,3,0
+5,42,1,,3,0
+5,57,1,5,3,1
+5,60,,5,1,1
+5,76,1,4,3,1
+3,42,2,1,3,1
+4,64,1,,3,0
+4,36,3,1,2,0
+4,60,2,1,2,0
+4,54,1,1,3,0
+3,52,3,4,3,0
+4,59,2,1,3,1
+4,54,1,1,3,1
+4,40,1,,,0
+,66,,,1,1
+5,56,4,3,1,1
+4,43,1,,,0
+5,42,4,4,3,1
+4,59,2,4,3,1
+5,75,4,5,3,1
+2,66,1,1,,0
+5,63,3,,3,0
+5,45,4,5,3,1
+5,55,4,4,3,0
+4,46,1,5,2,0
+5,54,4,4,3,1
+5,57,4,4,3,1
+4,39,1,1,2,0
+4,81,1,1,3,0
+4,77,3,,,0
+4,60,2,1,3,0
+5,67,3,4,2,1
+4,48,4,5,,1
+4,55,3,4,2,0
+4,59,2,1,,0
+4,78,1,1,1,0
+4,50,1,1,3,0
+4,61,2,1,,0
+5,62,3,5,2,1
+5,44,2,4,,1
+5,64,4,5,3,1
+4,23,1,1,,0
+2,42,,,4,0
+5,67,4,5,3,1
+4,74,2,1,2,0
+5,80,3,5,3,1
+4,23,1,1,,0
+4,63,2,1,,0
+4,53,,5,3,1
+4,43,3,4,,0
+4,49,2,1,1,0
+5,51,2,4,,0
+4,45,2,1,,0
+5,59,2,,,1
+5,52,4,3,3,1
+5,60,4,3,3,1
+4,57,2,5,3,0
+3,57,2,1,,0
+5,74,4,4,3,1
+4,25,2,1,,0
+4,49,1,1,3,0
+5,72,4,3,,1
+4,45,2,1,3,0
+4,64,2,1,3,0
+4,73,2,1,2,0
+5,68,4,3,3,1
+5,52,4,5,3,0
+5,66,4,4,3,1
+5,70,,4,,1
+4,25,1,1,3,0
+5,74,1,1,2,1
+4,64,1,1,3,0
+5,60,4,3,2,1
+5,67,2,4,1,0
+4,67,4,5,3,0
+5,44,4,4,2,1
+3,68,1,1,3,1
+4,57,,4,1,0
+5,51,4,,,1
+4,33,1,,,0
+5,58,4,4,3,1
+5,36,1,,,0
+4,63,1,1,,0
+5,62,1,5,3,1
+4,73,3,4,3,1
+4,80,4,4,3,1
+4,67,1,1,,0
+5,59,2,1,3,1
+5,60,1,,3,0
+5,54,4,4,3,1
+4,40,1,1,,0
+4,47,2,1,,0
+5,62,4,4,3,0
+4,33,2,1,3,0
+5,59,2,,,0
+4,65,2,,,0
+4,58,4,4,,0
+4,29,2,,,0
+4,58,1,1,,0
+4,54,1,1,,0
+4,44,1,1,,1
+3,34,2,1,,0
+4,57,1,1,3,0
+5,33,4,4,,1
+4,45,4,4,3,0
+5,71,4,4,3,1
+5,59,4,4,2,0
+4,56,2,1,,0
+4,40,3,4,,0
+4,56,1,1,3,0
+4,45,2,1,,0
+4,57,2,1,2,0
+5,55,3,4,3,1
+5,84,4,5,3,0
+5,51,4,4,3,1
+4,43,1,1,,0
+4,24,2,1,2,0
+4,66,1,1,3,0
+5,33,4,4,3,0
+4,59,4,3,2,0
+4,76,2,3,,0
+4,40,1,1,,0
+4,52,,4,,0
+5,40,4,5,3,1
+5,67,4,4,3,1
+5,75,4,3,3,1
+5,86,4,4,3,0
+4,60,2,,,0
+5,66,4,4,3,1
+5,46,4,5,3,1
+4,59,4,4,3,1
+5,65,4,4,3,1
+4,53,1,1,3,0
+5,67,3,5,3,1
+5,80,4,5,3,1
+4,55,2,1,3,0
+4,48,1,1,,0
+4,47,1,1,2,0
+4,50,2,1,,0
+5,62,4,5,3,1
+5,63,4,4,3,1
+4,63,4,,3,1
+4,71,4,4,3,1
+4,41,1,1,3,0
+5,57,4,4,4,1
+5,71,4,4,4,1
+4,66,1,1,3,0
+4,47,2,4,2,0
+3,34,4,4,3,0
+4,59,3,4,3,0
+5,55,2,,,1
+4,51,,,3,0
+4,62,2,1,,0
+4,58,4,,3,1
+5,67,4,4,3,1
+4,41,2,1,3,0
+4,23,3,1,3,0
+4,53,,4,3,0
+4,42,2,1,3,0
+5,87,4,5,3,1
+4,68,1,1,3,1
+4,64,1,1,3,0
+5,54,3,5,3,1
+5,86,4,5,3,1
+4,21,2,1,3,0
+4,39,1,1,,0
+4,53,4,4,3,0
+4,44,4,4,3,0
+4,54,1,1,3,0
+5,63,4,5,3,1
+4,62,2,1,,0
+4,45,2,1,2,0
+5,71,4,5,3,0
+5,49,4,4,3,1
+4,49,4,4,3,0
+5,66,4,4,4,0
+4,19,1,1,3,0
+4,35,1,1,2,0
+4,71,3,3,,1
+5,74,4,5,3,1
+5,37,4,4,3,1
+4,67,1,,3,0
+5,81,3,4,3,1
+5,59,4,4,3,1
+4,34,1,1,3,0
+5,79,4,3,3,1
+5,60,3,1,3,0
+4,41,1,1,3,1
+4,50,1,1,3,0
+5,85,4,4,3,1
+4,46,1,1,3,0
+5,66,4,4,3,1
+4,73,3,1,2,0
+4,55,1,1,3,0
+4,49,2,1,3,0
+3,49,4,4,3,0
+4,51,4,5,3,1
+2,48,4,4,3,0
+4,58,4,5,3,0
+5,72,4,5,3,1
+4,46,2,3,3,0
+4,43,4,3,3,1
+,52,4,4,3,0
+4,66,2,1,,0
+4,46,1,1,1,0
+4,69,3,1,3,0
+2,59,1,1,,1
+5,43,2,1,3,1
+5,76,4,5,3,1
+4,46,1,1,3,0
+4,59,2,4,3,0
+4,57,1,1,3,0
+5,43,4,5,,0
+3,45,2,1,3,0
+3,43,2,1,3,0
+4,45,2,1,3,0
+5,57,4,5,3,1
+5,79,4,4,3,1
+5,54,2,1,3,1
+4,40,3,4,3,0
+5,63,4,4,3,1
+2,55,1,,1,0
+4,52,2,1,3,0
+4,38,1,1,3,0
+3,72,4,3,3,0
+5,80,4,3,3,1
+5,76,4,3,3,1
+4,62,3,1,3,0
+5,64,4,5,3,1
+5,42,4,5,3,0
+3,60,,3,1,0
+4,64,4,5,3,0
+4,63,4,4,3,1
+4,24,2,1,2,0
+5,72,4,4,3,1
+4,63,2,1,3,0
+4,46,1,1,3,0
+3,33,1,1,3,0
+5,76,4,4,3,1
+4,36,2,3,3,0
+4,40,2,1,3,0
+5,58,1,5,3,1
+4,43,2,1,3,0
+3,42,1,1,3,0
+4,32,1,1,3,0
+5,57,4,4,2,1
+4,37,1,1,3,0
+4,70,4,4,3,1
+5,56,4,2,3,1
+3,76,,3,2,0
+5,73,4,4,3,1
+5,77,4,5,3,1
+5,67,4,4,1,1
+5,71,4,3,3,1
+5,65,4,4,3,1
+4,43,1,1,3,0
+4,40,2,1,,0
+4,49,2,1,3,0
+5,76,4,2,3,1
+4,55,4,4,3,0
+5,72,4,5,3,1
+3,53,4,3,3,0
+5,75,4,4,3,1
+5,61,4,5,3,1
+5,67,4,4,3,1
+5,55,4,2,3,1
+5,66,4,4,3,1
+2,76,1,1,2,0
+4,57,4,4,3,1
+5,71,3,1,3,0
+5,70,4,5,3,1
+4,35,4,2,,0
+5,79,1,,3,1
+4,63,2,1,3,0
+5,40,1,4,3,1
+4,41,1,1,3,0
+4,47,2,1,2,0
+4,68,1,1,3,1
+4,64,4,3,3,1
+4,65,4,4,,1
+4,73,4,3,3,0
+4,39,4,3,3,0
+5,55,4,5,4,1
+5,53,3,4,4,0
+5,66,4,4,3,1
+4,43,3,1,2,0
+5,44,4,5,3,1
+4,77,4,4,3,1
+4,62,2,4,3,0
+5,80,4,4,3,1
+4,33,4,4,3,0
+4,50,4,5,3,1
+4,71,1,,3,0
+5,46,4,4,3,1
+5,49,4,5,3,1
+4,53,1,1,3,0
+3,46,2,1,2,0
+4,57,1,1,3,0
+4,54,3,1,3,0
+4,54,1,,,0
+2,49,2,1,2,0
+4,47,3,1,3,0
+4,40,1,1,3,0
+4,45,1,1,3,0
+4,50,4,5,3,1
+5,54,4,4,3,1
+4,67,4,1,3,1
+4,77,4,4,3,1
+4,66,4,3,3,0
+4,71,2,,3,1
+4,36,2,3,3,0
+4,69,4,4,3,0
+4,48,1,1,3,0
+4,64,4,4,3,1
+4,71,4,2,3,1
+5,60,4,3,3,1
+4,24,1,1,3,0
+5,34,4,5,2,1
+4,79,1,1,2,0
+4,45,1,1,3,0
+4,37,2,1,2,0
+4,42,1,1,2,0
+4,72,4,4,3,1
+5,60,4,5,3,1
+5,85,3,5,3,1
+4,51,1,1,3,0
+5,54,4,5,3,1
+5,55,4,3,3,1
+4,64,4,4,3,0
+5,67,4,5,3,1
+5,75,4,3,3,1
+5,87,4,4,3,1
+4,46,4,4,3,1
+4,59,2,1,,0
+55,46,4,3,3,1
+5,61,1,1,3,1
+4,44,1,4,3,0
+4,32,1,1,3,0
+4,62,1,1,3,0
+5,59,4,5,3,1
+4,61,4,1,3,0
+5,78,4,4,3,1
+5,42,4,5,3,0
+4,45,1,2,3,0
+5,34,2,1,3,1
+5,39,4,3,,1
+4,27,3,1,3,0
+4,43,1,1,3,0
+5,83,4,4,3,1
+4,36,2,1,3,0
+4,37,2,1,3,0
+4,56,3,1,3,1
+5,55,4,4,3,1
+5,46,3,,3,0
+4,88,4,4,3,1
+5,71,4,4,3,1
+4,41,2,1,3,0
+5,49,4,4,3,1
+3,51,1,1,4,0
+4,39,1,3,3,0
+4,46,2,1,3,0
+5,52,4,4,3,1
+5,58,4,4,3,1
+4,67,4,5,3,1
+5,80,4,4,3,1
+3,46,1,,,0
+3,43,1,,,0
+4,45,1,1,3,0
+5,68,4,4,3,1
+4,54,4,4,,1
+4,44,2,3,3,0
+5,74,4,3,3,1
+5,55,4,5,3,0
+4,49,4,4,3,1
+4,49,1,1,3,0
+5,50,4,3,3,1
+5,52,3,5,3,1
+4,45,1,1,3,0
+4,66,1,1,3,0
+4,68,4,4,3,1
+4,72,2,1,3,0
+5,64,,,3,0
+2,49,,3,3,0
+3,44,,4,3,0
+5,74,4,4,3,1
+5,58,4,4,3,1
+4,77,2,3,3,0
+4,49,3,1,3,0
+4,34,,,4,0
+5,60,4,3,3,1
+5,69,4,3,3,1
+4,53,2,1,3,0
+3,46,3,4,3,0
+5,74,4,4,3,1
+4,58,1,1,3,0
+5,68,4,4,3,1
+5,46,4,3,3,0
+5,61,2,4,3,1
+5,70,4,3,3,1
+5,37,4,4,3,1
+3,65,4,5,3,1
+4,67,4,4,3,0
+5,69,3,4,3,0
+5,76,4,4,3,1
+4,65,4,3,3,0
+5,72,4,2,3,1
+4,62,4,2,3,0
+5,42,4,4,3,1
+5,66,4,3,3,1
+5,48,4,4,3,1
+4,35,1,1,3,0
+5,60,4,4,3,1
+5,67,4,2,3,1
+5,78,4,4,3,1
+4,66,1,1,3,1
+4,26,1,1,,0
+4,48,1,1,3,0
+4,31,1,1,3,0
+5,43,4,3,3,1
+5,72,2,4,3,0
+5,66,1,1,3,1
+4,56,4,4,3,0
+5,58,4,5,3,1
+5,33,2,4,3,1
+4,37,1,1,3,0
+5,36,4,3,3,1
+4,39,2,3,3,0
+4,39,4,4,3,1
+5,83,4,4,3,1
+4,68,4,5,3,1
+5,63,3,4,3,1
+5,78,4,4,3,1
+4,38,2,3,3,0
+5,46,4,3,3,1
+5,60,4,4,3,1
+5,56,2,3,3,1
+4,33,1,1,3,0
+4,,4,5,3,1
+4,69,1,5,3,1
+5,66,1,4,3,1
+4,72,1,3,3,0
+4,29,1,1,3,0
+5,54,4,5,3,1
+5,80,4,4,3,1
+5,68,4,3,3,1
+4,35,2,1,3,0
+4,57,3,,3,0
+5,,4,4,3,1
+4,50,1,1,3,0
+4,32,4,3,3,0
+0,69,4,5,3,1
+4,71,4,5,3,1
+5,87,4,5,3,1
+3,40,2,,3,0
+4,31,1,1,,0
+4,64,1,1,3,0
+5,55,4,5,3,1
+4,18,1,1,3,0
+3,50,2,1,,0
+4,53,1,1,3,0
+5,84,4,5,3,1
+5,80,4,3,3,1
+4,32,1,1,3,0
+5,77,3,4,3,1
+4,38,1,1,3,0
+5,54,4,5,3,1
+4,63,1,1,3,0
+4,61,1,1,3,0
+4,52,1,1,3,0
+4,36,1,1,3,0
+4,41,,,3,0
+4,59,1,1,3,0
+5,51,4,4,2,1
+4,36,1,1,3,0
+5,40,4,3,3,1
+4,49,1,1,3,0
+4,37,2,3,3,0
+4,46,1,1,3,0
+4,63,1,1,3,0
+4,28,2,1,3,0
+4,47,2,1,3,0
+4,42,2,1,3,1
+5,44,4,5,3,1
+4,49,4,4,3,0
+5,47,4,5,3,1
+5,52,4,5,3,1
+4,53,1,1,3,1
+5,83,3,3,3,1
+4,50,4,4,,1
+5,63,4,4,3,1
+4,82,,5,3,1
+4,54,1,1,3,0
+4,50,4,4,3,0
+5,80,4,5,3,1
+5,45,2,4,3,0
+5,59,4,4,,1
+4,28,2,1,3,0
+4,31,1,1,3,0
+4,41,2,1,3,0
+4,21,3,1,3,0
+5,44,3,4,3,1
+5,49,4,4,3,1
+5,71,4,5,3,1
+5,75,4,5,3,1
+4,38,2,1,3,0
+4,60,1,3,3,0
+5,87,4,5,3,1
+4,70,4,4,3,1
+5,55,4,5,3,1
+3,21,1,1,3,0
+4,50,1,1,3,0
+5,76,4,5,3,1
+4,23,1,1,3,0
+3,68,,,3,0
+4,62,4,,3,1
+5,65,1,,3,1
+5,73,4,5,3,1
+4,38,2,3,3,0
+2,57,1,1,3,0
+5,65,4,5,3,1
+5,67,2,4,3,1
+5,61,2,4,3,1
+5,56,4,4,3,0
+5,71,2,4,3,1
+4,49,2,2,3,0
+4,55,,,3,0
+4,44,2,1,3,0
+0,58,4,4,3,0
+4,27,2,1,3,0
+5,73,4,5,3,1
+4,34,2,1,3,0
+5,63,,4,3,1
+4,50,2,1,3,1
+4,62,2,1,3,0
+3,21,3,1,3,0
+4,49,2,,3,0
+4,36,3,1,3,0
+4,45,2,1,3,1
+5,67,4,5,3,1
+4,21,1,1,3,0
+4,57,2,1,3,0
+5,66,4,5,3,1
+4,71,4,4,3,1
+5,69,3,4,3,1
+6,80,4,5,3,1
+3,27,2,1,3,0
+4,38,2,1,3,0
+4,23,2,1,3,0
+5,70,,5,3,1
+4,46,4,3,3,0
+4,61,2,3,3,0
+5,65,4,5,3,1
+4,60,4,3,3,0
+5,83,4,5,3,1
+5,40,4,4,3,1
+2,59,,4,3,0
+4,53,3,4,3,0
+4,76,4,4,3,0
+5,79,1,4,3,1
+5,38,2,4,3,1
+4,61,3,4,3,0
+4,56,2,1,3,0
+4,44,2,1,3,0
+4,64,3,4,,1
+4,66,3,3,3,0
+4,50,3,3,3,0
+4,46,1,1,3,0
+4,39,1,1,3,0
+4,60,3,,,0
+5,55,4,5,3,1
+4,40,2,1,3,0
+4,26,1,1,3,0
+5,84,3,2,3,1
+4,41,2,2,3,0
+4,63,1,1,3,0
+2,65,,1,2,0
+4,49,1,1,3,0
+4,56,2,2,3,1
+5,65,4,4,3,0
+4,54,1,1,3,0
+4,36,1,1,3,0
+5,49,4,4,3,0
+4,59,4,4,3,1
+5,75,4,4,3,1
+5,59,4,2,3,0
+5,59,4,4,3,1
+4,28,4,4,3,1
+5,53,4,5,3,0
+5,57,4,4,3,0
+5,77,4,3,4,0
+5,85,4,3,3,1
+4,59,4,4,3,0
+5,59,1,5,3,1
+4,65,3,3,3,1
+4,54,2,1,3,0
+5,46,4,5,3,1
+4,63,4,4,3,1
+4,53,1,1,3,1
+4,56,1,1,3,0
+5,66,4,4,3,1
+5,66,4,5,3,1
+4,55,1,1,3,0
+4,44,1,1,3,0
+5,86,3,4,3,1
+5,47,4,5,3,1
+5,59,4,5,3,1
+5,66,4,5,3,0
+5,61,4,3,3,1
+3,46,,5,,1
+4,69,1,1,3,0
+5,93,1,5,3,1
+4,39,1,3,3,0
+5,44,4,5,3,1
+4,45,2,2,3,0
+4,51,3,4,3,0
+4,56,2,4,3,0
+4,66,4,4,3,0
+5,61,4,5,3,1
+4,64,3,3,3,1
+5,57,2,4,3,0
+5,79,4,4,3,1
+4,57,2,1,,0
+4,44,4,1,1,0
+4,31,2,1,3,0
+4,63,4,4,3,0
+4,64,1,1,3,0
+5,47,4,5,3,0
+5,68,4,5,3,1
+4,30,1,1,3,0
+5,43,4,5,3,1
+4,56,1,1,3,0
+4,46,2,1,3,0
+4,67,2,1,3,0
+5,52,4,5,3,1
+4,67,4,4,3,1
+4,47,2,1,3,0
+5,58,4,5,3,1
+4,28,2,1,3,0
+4,43,1,1,3,0
+4,57,2,4,3,0
+5,68,4,5,3,1
+4,64,2,4,3,0
+4,64,2,4,3,0
+5,62,4,4,3,1
+4,38,4,1,3,0
+5,68,4,4,3,1
+4,41,2,1,3,0
+4,35,2,1,3,1
+4,68,2,1,3,0
+5,55,4,4,3,1
+5,67,4,4,3,1
+4,51,4,3,3,0
+2,40,1,1,3,0
+5,73,4,4,3,1
+4,58,,4,3,1
+4,51,,4,3,0
+3,50,,,3,1
+5,59,4,3,3,1
+6,60,3,5,3,1
+4,27,2,1,,0
+5,54,4,3,3,0
+4,56,1,1,3,0
+5,53,4,5,3,1
+4,54,2,4,3,0
+5,79,1,4,3,1
+5,67,4,3,3,1
+5,64,3,3,3,1
+4,70,1,2,3,1
+5,55,4,3,3,1
+5,65,3,3,3,1
+5,45,4,2,3,1
+4,57,4,4,,1
+5,49,1,1,3,1
+4,24,2,1,3,0
+4,52,1,1,3,0
+4,50,2,1,3,0
+4,35,1,1,3,0
+5,,3,3,3,1
+5,64,4,3,3,1
+5,40,4,1,1,1
+5,66,4,4,3,1
+4,64,4,4,3,1
+5,52,4,3,3,1
+5,43,1,4,3,1
+4,56,4,4,3,0
+4,72,3,,3,0
+6,51,4,4,3,1
+4,79,4,4,3,1
+4,22,2,1,3,0
+4,73,2,1,3,0
+4,53,3,4,3,0
+4,59,2,1,3,1
+4,46,4,4,2,0
+5,66,4,4,3,1
+4,50,4,3,3,1
+4,58,1,1,3,1
+4,55,1,1,3,0
+4,62,2,4,3,1
+4,60,1,1,3,0
+5,57,4,3,3,1
+4,57,1,1,3,0
+6,41,2,1,3,0
+4,71,2,1,3,1
+4,32,2,1,3,0
+4,57,2,1,3,0
+4,19,1,1,3,0
+4,62,2,4,3,1
+5,67,4,5,3,1
+4,50,4,5,3,0
+4,65,2,3,2,0
+4,40,2,4,2,0
+6,71,4,4,3,1
+6,68,4,3,3,1
+4,68,1,1,3,0
+4,29,1,1,3,0
+4,53,2,1,3,0
+5,66,4,4,3,1
+4,60,3,,4,0
+5,76,4,4,3,1
+4,58,2,1,2,0
+5,96,3,4,3,1
+5,70,4,4,3,1
+4,34,2,1,3,0
+4,59,2,1,3,0
+4,45,3,1,3,1
+5,65,4,4,3,1
+4,59,1,1,3,0
+4,21,2,1,3,0
+3,43,2,1,3,0
+4,53,1,1,3,0
+4,65,2,1,3,0
+4,64,2,4,3,1
+4,53,4,4,3,0
+4,51,1,1,3,0
+4,59,2,4,3,0
+4,56,2,1,3,0
+4,60,2,1,3,0
+4,22,1,1,3,0
+4,25,2,1,3,0
+6,76,3,,3,0
+5,69,4,4,3,1
+4,58,2,1,3,0
+5,62,4,3,3,1
+4,56,4,4,3,0
+4,64,1,1,3,0
+4,32,2,1,3,0
+5,48,,4,,1
+5,59,4,4,2,1
+4,52,1,1,3,0
+4,63,4,4,3,0
+5,67,4,4,3,1
+5,61,4,4,3,1
+5,59,4,5,3,1
+5,52,4,3,3,1
+4,35,4,4,3,0
+5,77,3,3,3,1
+5,71,4,3,3,1
+5,63,4,3,3,1
+4,38,2,1,2,0
+5,72,4,3,3,1
+4,76,4,3,3,1
+4,53,3,3,3,0
+4,67,4,5,3,0
+5,69,2,4,3,1
+4,54,1,1,3,0
+2,35,2,1,2,0
+5,68,4,3,3,1
+4,68,4,4,3,0
+4,67,2,4,3,1
+3,39,1,1,3,0
+4,44,2,1,3,0
+4,33,1,1,3,0
+4,60,,4,3,0
+4,58,1,1,3,0
+4,31,1,1,3,0
+3,23,1,1,3,0
+5,56,4,5,3,1
+4,69,2,1,3,1
+6,63,1,1,3,0
+4,65,1,1,3,1
+4,44,2,1,2,0
+4,62,3,3,3,1
+4,67,4,4,3,1
+4,56,2,1,3,0
+4,52,3,4,3,0
+4,43,1,1,3,1
+4,41,4,3,2,1
+4,42,3,4,2,0
+3,46,1,1,3,0
+5,55,4,4,3,1
+5,58,4,4,2,1
+5,87,4,4,3,1
+4,66,2,1,3,0
+0,72,4,3,3,1
+5,60,4,3,3,1
+5,83,4,4,2,1
+4,31,2,1,3,0
+4,53,2,1,3,0
+4,64,2,3,3,0
+5,31,4,4,2,1
+5,62,4,4,2,1
+4,56,2,1,3,0
+5,58,4,4,3,1
+4,67,1,4,3,0
+5,75,4,5,3,1
+5,65,3,4,3,1
+5,74,3,2,3,1
+4,59,2,1,3,0
+4,57,4,4,4,1
+4,76,3,2,3,0
+4,63,1,4,3,0
+4,44,1,1,3,0
+4,42,3,1,2,0
+4,35,3,,2,0
+5,65,4,3,3,1
+4,70,2,1,3,0
+4,48,1,1,3,0
+4,74,1,1,1,1
+6,40,,3,4,1
+4,63,1,1,3,0
+5,60,4,4,3,1
+5,86,4,3,3,1
+4,27,1,1,3,0
+4,71,4,5,2,1
+5,85,4,4,3,1
+4,51,3,3,3,0
+6,72,4,3,3,1
+5,52,4,4,3,1
+4,66,2,1,3,0
+5,71,4,5,3,1
+4,42,2,1,3,0
+4,64,4,4,2,1
+4,41,2,2,3,0
+4,50,2,1,3,0
+4,30,1,1,3,0
+4,67,1,1,3,0
+5,62,4,4,3,1
+4,46,2,1,2,0
+4,35,1,1,3,0
+4,53,1,1,2,0
+4,59,2,1,3,0
+4,19,3,1,3,0
+5,86,2,1,3,1
+4,72,2,1,3,0
+4,37,2,1,2,0
+4,46,3,1,3,1
+4,45,1,1,3,0
+4,48,4,5,3,0
+4,58,4,4,3,1
+4,42,1,1,3,0
+4,56,2,4,3,1
+4,47,2,1,3,0
+4,49,4,4,3,1
+5,76,2,5,3,1
+5,62,4,5,3,1
+5,64,4,4,3,1
+5,53,4,3,3,1
+4,70,4,2,2,1
+5,55,4,4,3,1
+4,34,4,4,3,0
+5,76,4,4,3,1
+4,39,1,1,3,0
+2,23,1,1,3,0
+4,19,1,1,3,0
+5,65,4,5,3,1
+4,57,2,1,3,0
+5,41,4,4,3,1
+4,36,4,5,3,1
+4,62,3,3,3,0
+4,69,2,1,3,0
+4,41,3,1,3,0
+3,51,2,4,3,0
+5,50,3,2,3,1
+4,47,4,4,3,0
+4,54,4,5,3,1
+5,52,4,4,3,1
+4,30,1,1,3,0
+3,48,4,4,3,1
+5,,4,4,3,1
+4,65,2,4,3,1
+4,50,1,1,3,0
+5,65,4,5,3,1
+5,66,4,3,3,1
+6,41,3,3,2,1
+5,72,3,2,3,1
+4,42,1,1,1,1
+4,80,4,4,3,1
+0,45,2,4,3,0
+4,41,1,1,3,0
+4,72,3,3,3,1
+4,60,4,5,3,0
+5,67,4,3,3,1
+4,55,2,1,3,0
+4,61,3,4,3,1
+4,55,3,4,3,1
+4,52,4,4,3,1
+4,42,1,1,3,0
+5,63,4,4,3,1
+4,62,4,5,3,1
+4,46,1,1,3,0
+4,65,2,1,3,0
+4,57,3,3,3,1
+4,66,4,5,3,1
+4,45,1,1,3,0
+4,77,4,5,3,1
+4,35,1,1,3,0
+4,50,4,5,3,1
+4,57,4,4,3,0
+4,74,3,1,3,1
+4,59,4,5,3,0
+4,51,1,1,3,0
+4,42,3,4,3,1
+4,35,2,4,3,0
+4,42,1,1,3,0
+4,43,2,1,3,0
+4,62,4,4,3,1
+4,27,2,1,3,0
+5,,4,3,3,1
+4,57,4,4,3,1
+4,59,2,1,3,0
+5,40,3,2,3,1
+4,20,1,1,3,0
+5,74,4,3,3,1
+4,22,1,1,3,0
+4,57,4,3,3,0
+4,57,4,3,3,1
+4,55,2,1,2,0
+4,62,2,1,3,0
+4,54,1,1,3,0
+4,71,1,1,3,1
+4,65,3,3,3,0
+4,68,4,4,3,0
+4,64,1,1,3,0
+4,54,2,4,3,0
+4,48,4,4,3,1
+4,58,4,3,3,0
+5,58,3,4,3,1
+4,70,1,1,1,0
+5,70,1,4,3,1
+4,59,2,1,3,0
+4,57,2,4,3,0
+4,53,4,5,3,0
+4,54,4,4,3,1
+4,53,2,1,3,0
+0,71,4,4,3,1
+5,67,4,5,3,1
+4,68,4,4,3,1
+4,56,2,4,3,0
+4,35,2,1,3,0
+4,52,4,4,3,1
+4,47,2,1,3,0
+4,56,4,5,3,1
+4,64,4,5,3,0
+5,66,4,5,3,1
+4,62,3,3,3,0
\ No newline at end of file
diff --git a/notebookApp.ipynb b/notebookApp.ipynb
new file mode 100644
index 0000000..c88f055
--- /dev/null
+++ b/notebookApp.ipynb
@@ -0,0 +1,946 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# Replace Query with Parameter\n",
+ "🎓 College: [Faculdade Metodista Granbery](http://granbery.edu.br/)\n",
+ "\n",
+ "👨🏫 Teacher: [Marco Antônio - Github](https://github.com/marcoaparaujo) | [Linkedin](https://www.linkedin.com/in/marco-ant%C3%B4nio-ara%C3%BAjo/)\n",
+ "\n",
+ "📗 Book: [Refatoração - Aperfeiçoando o design de códigos existentes - Martin Fowler](https://www.amazon.com/-/pt/dp/B087N8LKYB/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=M4T29CCKD30E&keywords=refatora%C3%A7%C3%A3o&qid=1651322207&sprefix=refatora%C3%A7%C3%A3o%2Caps%2C203&sr=8-1)\n",
+ "\n",
+ "> FOWLER, Martin. “Replace Query with Parameter” no código. *In*: REFATORAÇÃO: Aperfeiçoando o design de códigos existentes. 2. ed. [*S. l.*: *s. n.*], 2019. cap. 8.\n",
+ ">\n",
+ "\n",
+ "## Objetivo\n",
+ "\n",
+ "Objetivo desse método e trazer uma função que traga sempre o mesmo resultado que se chama transparência referencial. A função que foi criada, não acessar um referencial transparente, a função não possuir transparência."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Código\n",
+ "O código que escolhi foi uma atividade dado em aula pelo Professor Ricardo. Essa função recebe um parâmetro de nomes de coluna do dataset, os dados são verificados pela sua severidade e depois ocorre sua substituição dos valores ausentes de acordo com o seu tipo.\n",
+ "\n",
+ "O código pode ser encontrado na plataforma [Kaggle](https://www.kaggle.com/code/edmilsoneddi/data-mining-discipline-exercise)\n",
+ "\n",
+ "## Ferramentas\n",
+ "### pytest\n",
+ "```sh\n",
+ " pip install ipytest\n",
+ "```\n",
+ "### testbook\n",
+ "```sh\n",
+ " pip install testbook\n",
+ "```\n",
+ "### jupyter notebook\n",
+ "```sh\n",
+ " pip install jupyter\n",
+ "```\n",
+ "### pandas\n",
+ "```sh\n",
+ " pip install pandas\n",
+ "```\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Código sem refatoração"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "dataset = pd.read_csv('mamografia.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " BI-RADS | \n",
+ " Idade | \n",
+ " Forma | \n",
+ " Margem | \n",
+ " Densidade | \n",
+ " Severidade | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 5.0 | \n",
+ " 67.0 | \n",
+ " 3.0 | \n",
+ " 5.0 | \n",
+ " 3.0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 4.0 | \n",
+ " 43.0 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ " NaN | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 5.0 | \n",
+ " 58.0 | \n",
+ " 4.0 | \n",
+ " 5.0 | \n",
+ " 3.0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 4.0 | \n",
+ " 28.0 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ " 3.0 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 5.0 | \n",
+ " 74.0 | \n",
+ " 1.0 | \n",
+ " 5.0 | \n",
+ " NaN | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " BI-RADS Idade Forma Margem Densidade Severidade\n",
+ "0 5.0 67.0 3.0 5.0 3.0 1\n",
+ "1 4.0 43.0 1.0 1.0 NaN 1\n",
+ "2 5.0 58.0 4.0 5.0 3.0 1\n",
+ "3 4.0 28.0 1.0 1.0 3.0 0\n",
+ "4 5.0 74.0 1.0 5.0 NaN 1"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia = dataset.copy()\n",
+ "mamografia.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS float64\n",
+ "Idade float64\n",
+ "Forma float64\n",
+ " Margem float64\n",
+ " Densidade float64\n",
+ "Severidade int64\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia.dtypes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# Análise de Valores Ausentes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "benigno = mamografia[mamografia['Severidade'] == 0].isnull().sum()\n",
+ "print(' Valores ausentes ')\n",
+ "print()\n",
+ "print('Valores Benigno: ')\n",
+ "print(benigno)\n",
+ "print()\n",
+ "maligno = mamografia[mamografia['Severidade'] == 1].isnull().sum()\n",
+ "print('Valores Maligno: ')\n",
+ "print(maligno)\n",
+ "print()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes():\n",
+ " for lista in mamografia.columns:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = mamografia[(mamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = mamografia[(mamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " \n",
+ " else:\n",
+ " media_benigno = mamografia[(mamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = mamografia[(mamografia['Severidade'] == 1)][lista].mean()\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " mamografia.loc[(mamografia[lista].isnull())&(mamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['BI-RADS', 'Idade', 'Forma', ' Margem', ' Densidade', 'Severidade'], dtype='object')"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Objetivo da atividade\n",
+ "\n",
+ "1. Elabore ou escolha um código que a refatoração possa ser aplicada.\n",
+ "2. Identifique o mau cheiro associado.\n",
+ "3. Escreva os casos de teste e execute\n",
+ "4. Aplique a refatoração\n",
+ "5. Execute os casos de teste novamente\n",
+ "6. Documente cada etapa para a apresentação\n",
+ "\n",
+ "## Mau Cheiro\n",
+ "\n",
+ "### Lista longa de parâmetros\n",
+ "\n",
+ "O mau cheiro que encontrei dentro do código abaixo foi o lista longa de parâmetros, por possuir consultas longas e não claras. Esse mal cheiro, pode trazer dificuldades ou erros no código."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Procedimento"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refatoraMamografia = dataset.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Use Extrair variável (Extract Variable) no código da consulta para separá-lo do restante do corpo da função."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes():\n",
+ " colunas = refatoraMamografia.columns\n",
+ " for lista in colunas:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Aplique Extrair função (Extract Function) no código do corpo que não seja a chamada da consulta."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Dê à nova função um nome fácil de pesquisar, para poder renomeá-la depois."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def XXXNEWtratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes_refatora(): # tratar_ausentes_refatora() está escrito refatora, para não chamar a outra função tratar_ausentes()\n",
+ " colunas = refatoraMamografia.columns\n",
+ " return XXXNEWtratar_ausentes_refatora(colunas)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes_refatora()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Use Internalizar variável (Inline Variable) para se livrar da variável que você acabou de criar."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 2\n",
+ "Idade 5\n",
+ "Forma 31\n",
+ " Margem 48\n",
+ " Densidade 76\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def XXXNEWtratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes_refatora(): # tratar_ausentes_refatora() está escrito refatora, para não chamar a outra função tratar_ausentes()\n",
+ " return XXXNEWtratar_ausentes_refatora(refatoraMamografia.columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "BI-RADS 0\n",
+ "Idade 0\n",
+ "Forma 0\n",
+ " Margem 0\n",
+ " Densidade 0\n",
+ "Severidade 0\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tratar_ausentes_refatora()\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Aplique Internalizar função (Inline Function) na função original."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def XXXNEWtratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "#def tratar_ausentes_refatora():\n",
+ " # tratar_ausentes_refatora() está escrito refatora, para não chamar a outra função tratar_ausentes()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "XXXNEWtratar_ausentes_refatora(refatoraMamografia.columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "### Renomeie a nova função dando-lhe o nome da função original."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refatoraMamografia = dataset.copy() #Apenas usei novamente para retorna o valor do dataset com os ausentes\n",
+ "refatoraMamografia.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tratar_ausentes_refatora(listaColuna):\n",
+ " for lista in listaColuna:\n",
+ " if lista != 'Idade':\n",
+ " moda_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mode()[0]\n",
+ " moda_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mode()[0]\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = moda_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = moda_maligno\n",
+ " else:\n",
+ " media_benigno = refatoraMamografia[(refatoraMamografia['Severidade'] == 0)][lista].mean()\n",
+ " media_maligno = refatoraMamografia[(refatoraMamografia['Severidade'] == 1)][lista].mean()\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 0), lista] = media_benigno\n",
+ " refatoraMamografia.loc[(refatoraMamografia[lista].isnull())&(refatoraMamografia['Severidade'] == 1), lista] = media_maligno"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "tratar_ausentes_refatora(refatoraMamografia.columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refatoraMamografia.isnull().sum()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/replace_query_with_parameter_atividade_edmilson_silva_7_periodo_FMG.zip b/replace_query_with_parameter_atividade_edmilson_silva_7_periodo_FMG.zip
new file mode 100644
index 0000000..689cbff
Binary files /dev/null and b/replace_query_with_parameter_atividade_edmilson_silva_7_periodo_FMG.zip differ
diff --git a/testComRefatoracao.py b/testComRefatoracao.py
new file mode 100644
index 0000000..2ee4813
--- /dev/null
+++ b/testComRefatoracao.py
@@ -0,0 +1,10 @@
+import pytest
+from testbook import testbook
+
+@testbook('./notebookApp.ipynb', execute=True)
+def test_tratar_ausentes(tb):
+ tratar_ausentes = tb.ref("tratar_ausentes")
+ lista = ['BI-RADS', 'Idade', 'Forma', ' Margem', ' Densidade', 'Severidade']
+ assert tratar_ausentes() == None
+
+
diff --git a/testSemRefatoracao.py b/testSemRefatoracao.py
new file mode 100644
index 0000000..3d03559
--- /dev/null
+++ b/testSemRefatoracao.py
@@ -0,0 +1,12 @@
+import pytest
+from testbook import testbook
+
+@testbook('./notebookApp.ipynb', execute=True)
+def test_tratar_ausentes_refatora(tb):
+ tratar_ausentes = tb.ref("tratar_ausentes_refatora")
+ lista = ['BI-RADS', 'Idade', 'Forma', ' Margem', ' Densidade', 'Severidade']
+ assert tratar_ausentes(lista) == None
+
+
+
+