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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BI-RADSIdadeFormaMargemDensidadeSeveridade
05.067.03.05.03.01
14.043.01.01.0NaN1
25.058.04.05.03.01
34.028.01.01.03.00
45.074.01.05.0NaN1
\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 + +![funcaoSemRefatoracao.png](images/funcaoSemRefatoracao.png) + +## Teste sem refatoração + +![testeSemRefatoracao.png](images/testeSemRefatoracao.png) + +## 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. + +![extractVariable.png](images/extractVariable.png) + +## 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. + +![extractFunction.png](images/extractFunction.png) + +## Use Internalizar variável (Inline Variable) para se livrar da variável que você acabou de criar. + +![inlineVariable.png](images/inlineVariable.png) + +## Aplique Internalizar função (Inline Function) na função original. + +![inlineFunction.png](images/inlineFunction.png) + +## Renomeie a nova função dando-lhe o nome da função original. + +![renomear.png](images/renomear.png) + +## Realização do Teste + +![testeComRefatoracao.png](images/testeComRefatoracao.png) \ 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BI-RADSIdadeFormaMargemDensidadeSeveridade
05.067.03.05.03.01
14.043.01.01.0NaN1
25.058.04.05.03.01
34.028.01.01.03.00
45.074.01.05.0NaN1
\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 + + + +