├── .gitattributes ├── .github └── workflows │ └── greetings.yml ├── .gitignore ├── License ├── README.md ├── parte_1_introducao_python ├── README.md ├── condicional_e_lacos │ ├── README.md │ └── res_exercicios_condicional.py ├── dicionarios │ └── README.md ├── funcoes │ └── README.md ├── lacos │ ├── README.md │ └── res_exercicios.py ├── parte_1_projeto_1 │ ├── helper.py │ └── projeto_01.ipynb ├── parte_1_projeto_2 │ ├── AppleStore.csv │ ├── Projeto02.ipynb │ └── googleplaystore.csv └── variaveis.md ├── parte_2_analise_dados ├── README.md ├── exemplo01.ipynb ├── exemplo02.ipynb ├── exempĺo03.ipynb ├── functions_numpy.ipynb ├── matplotlib.md ├── numpy.md ├── pandas.md ├── projeto_02 │ ├── README.md │ ├── autos.csv │ └── projeto2.ipynb ├── projeto_3 │ ├── Metro_Interstate_Traffic_Volume.csv │ ├── README.md │ └── projeto3.ipynb └── pyploy.ipynb └── parte_3_machine_learning ├── Aula06_Machine_Learning.ipynb ├── README.md ├── figuras ├── fig1.png └── fig2.png ├── hypothyroid.csv └── projeto_04 ├── README.md ├── imports-85.data └── projeto04.ipynb /.gitattributes: -------------------------------------------------------------------------------- 1 | *.ipynb linguist-language=Python -------------------------------------------------------------------------------- /.github/workflows/greetings.yml: -------------------------------------------------------------------------------- 1 | name: Greetings 2 | 3 | on: [pull_request_target, issues] 4 | 5 | jobs: 6 | greeting: 7 | runs-on: ubuntu-latest 8 | permissions: 9 | issues: write 10 | pull-requests: write 11 | steps: 12 | - uses: actions/first-interaction@v1 13 | with: 14 | repo-token: ${{ secrets.GITHUB_TOKEN }} 15 | issue-message: "Issue opened. Thanks!" 16 | pr-message: "Pull request opened. Thanks!" 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore all files with the specified extension. 2 | # Scope is all repo folders. 3 | *.json 4 | *.ini 5 | 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | .__pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | __pypackages__/ 12 | 13 | # Jupyter Notebook 14 | .ipynb_checkpoints 15 | 16 | 17 | # Distribution / packaging 18 | .Python 19 | build/ 20 | develop-eggs/ 21 | dist/ 22 | downloads/ 23 | eggs/ 24 | .eggs/ 25 | lib/ 26 | lib64/ 27 | parts/ 28 | sdist/ 29 | var/ 30 | wheels/ 31 | share/python-wheels/ 32 | *.egg-info/ 33 | .installed.cfg 34 | *.egg 35 | MANIFEST 36 | 37 | 38 | # IPython 39 | profile_default/ 40 | ipython_config.py 41 | 42 | # Environments 43 | .env 44 | .venv 45 | env/ 46 | venv/ 47 | ENV/ 48 | env.bak/ 49 | venv.bak/ 50 | cilab/ 51 | 52 | 53 | ### VisualStudioCode ### 54 | .vscode/* 55 | .vscode/settings.json 56 | .vscode/tasks.json 57 | .vscode/launch.json 58 | .vscode/extensions.json 59 | *.code-workspace 60 | 61 | ### VisualStudioCode Patch ### 62 | # Ignore all local history of files 63 | .history -------------------------------------------------------------------------------- /License: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 CILab 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introdução a _machine learning_ com Python 3 🤖 2 | 3 | --- 4 | 5 | 6 | ### [Parte 1: Introdução a Python](https://github.com/cilab-ufersa/introduction_machine_learning/tree/main/parte_1_introducao_python) 💻 7 | 8 | ### [Parte 2: Análise e visualização de dados](https://github.com/cilab-ufersa/introduction_machine_learning/tree/main/parte_2_analise_dados) 📈 9 | 10 | ### [Parte 3: Introdução a _machine learning_](https://github.com/cilab-ufersa/introduction_machine_learning/tree/main/parte_3_machine_learning) 🧠 11 | 12 | ### Visite nossa Wiki 📚 13 | 14 | - [Wiki - Primeiros passos com Python](https://github.com/cilab-ufersa/introduction_machine_learning/wiki/Primeiros-passos-com-Python) 15 | - [Google Colab](https://github.com/cilab-ufersa/introduction_machine_learning/wiki/Google-Colab) - Ambiente para desenvolvimento 16 | 17 | ### Sites de _datasets_ 📊 18 | 19 | - [Kaggle](https://www.kaggle.com/) 20 | - [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/index.php) 21 | - [Google Dataset Search](https://datasetsearch.research.google.com/) 22 | 23 | ### Livros 📚 24 | 25 | - [Python para análise de dados](https://www.amazon.com.br/Python-An%C3%A1lise-Dados-Wes-McKinney/dp/8575224028) 26 | - [Python para ciência de dados](https://www.amazon.com.br/Python-Ci%C3%AAncia-Dados-Wes-McKinney/dp/8575224620) 27 | - [Python para análise de dados: manipulação, visualização e aprendizado de máquina](https://www.amazon.com.br/Python-An%C3%A1lise-Dados-Manipula%C3%A7%C3%A3o-Aprendizado/dp/8575225032) 28 | - [Machine Learning: uma abordagem de aprendizado de máquina](https://www.amazon.com.br/Machine-Learning-Aprendizado-Abordagem-Portuguese/dp/8575224736) 29 | 30 | 31 | 32 | --- 33 | 34 |
35 | 36 |
37 | UFERSA - Campus Pau dos Ferros 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /parte_1_introducao_python/README.md: -------------------------------------------------------------------------------- 1 | # Introdução a linguagem Python 2 | --- 3 | Python é uma linguagem de programação de alto nível, interpretada, de script, imperativa, orientada a objetos, funcional, de tipagem dinâmica e forte. Foi lançada por Guido van Rossum em 1991. 4 | 5 | Python é uma linguagem de programação interpretada, ou seja, não é necessário compilar o código fonte para que ele possa ser executado. O interpretador Python é capaz de interpretar e executar o código fonte em tempo de execução. 6 | 7 | Python é uma linguagem de programação orientada a objetos, ou seja, permite a criação de classes e objetos, além de utilizar herança múltipla. 8 | 9 | Python é uma linguagem de programação funcional, ou seja, permite a utilização de funções de primeira classe, funções anônimas e funções de alta ordem. 10 | 11 | 12 | --- 13 | ### 1. [Variáveis e tipos de dados](https://github.com/cilab-ufersa/introduction_machine_learning/blob/main/parte_1_introducao_python/variaveis.md) 14 | ### 2. [Condições](https://github.com/cilab-ufersa/introduction_machine_learning/tree/main/parte_1_introducao_python/condicional_e_lacos) 15 | ### 3. [Laços de Repetição](https://github.com/cilab-ufersa/introduction_machine_learning/tree/develop/parte_1_introducao_python/lacos) 16 | ### 4. [Dicionários](https://github.com/cilab-ufersa/introduction_machine_learning/tree/develop/parte_1_introducao_python/dicionarios) 17 | ### 5. [Funções](https://github.com/cilab-ufersa/introduction_machine_learning/tree/develop/parte_1_introducao_python/funcoes) 18 | 19 | ### 6. [Projeto 01 - Fuga das prisões ](https://github.com/cilab-ufersa/introduction_machine_learning/blob/main/parte_1_introducao_python/parte_1_projeto_1/projeto_01.ipynb) 20 | -------------------------------------------------------------------------------- /parte_1_introducao_python/condicional_e_lacos/README.md: -------------------------------------------------------------------------------- 1 | # Condicional em Python 2 | 3 | Condicional é uma estrutura de controle que permite executar um bloco de código caso uma condição seja verdadeira. 4 | 5 | ## if 6 | 7 | O if é uma estrutura de controle que permite executar um bloco de código caso uma condição seja verdadeira. 8 | 9 | ```python 10 | if condicao: 11 | # bloco de código 12 | ``` 13 | 14 | O bloco de código é executado caso a condição seja verdadeira. Caso contrário, o bloco de código não é executado. 15 | 16 | ```python 17 | if 2 > 1: 18 | print('2 é maior que 1') 19 | ``` 20 | 21 | ## else 22 | 23 | O else é uma estrutura de controle que permite executar um bloco de código caso uma condição seja falsa. 24 | 25 | ```python 26 | if condicao: 27 | # bloco de código 28 | else: 29 | # bloco de código 30 | ``` 31 | 32 | O bloco de código do else é executado caso a condição seja falsa. Caso contrário, o bloco de código do else não é executado. 33 | 34 | ```python 35 | 36 | if 2 < 1: 37 | print('2 é menor que 1') 38 | else: 39 | print('2 é maior que 1') 40 | ``` 41 | 42 | ## elif 43 | 44 | O elif é uma estrutura de controle que permite executar um bloco de código caso uma condição seja verdadeira. O elif é uma abreviação de else if. 45 | 46 | ```python 47 | 48 | if condicao: 49 | # bloco de código 50 | elif condicao: 51 | # bloco de código 52 | else: 53 | # bloco de código 54 | ``` 55 | 56 | O bloco de código do elif é executado caso a condição seja verdadeira. Caso contrário, o bloco de código do elif não é executado. 57 | 58 | ```python 59 | if 2 < 1: 60 | print('2 é menor que 1') 61 | elif 2 > 1: 62 | print('2 é maior que 1') 63 | else: 64 | print('2 é igual a 1') 65 | ``` 66 | 67 | ## Operadores de comparação 68 | 69 | Os operadores de comparação são utilizados para comparar valores. Os operadores de comparação são: 70 | 71 | | Operador | Descrição | 72 | |----------|-----------| 73 | | == | Igual a | 74 | | != | Diferente de | 75 | | > | Maior que | 76 | | < | Menor que | 77 | | >= | Maior ou igual a | 78 | | <= | Menor ou igual a | 79 | 80 | ```python 81 | print(2 == 2) # True 82 | print(2 != 2) # False 83 | print(2 > 2) # False 84 | print(2 < 2) # False 85 | print(2 >= 2) # True 86 | print(2 <= 2) # True 87 | ``` 88 | 89 | ## Operadores lógicos 90 | 91 | Os operadores lógicos são utilizados para combinar condições. Os operadores lógicos são: 92 | 93 | | Operador | Descrição | 94 | |----------|-----------| 95 | | and | E | 96 | | or | Ou | 97 | | not | Não | 98 | 99 | ```python 100 | print(2 == 2 and 2 > 1) # True 101 | print(2 == 2 or 2 > 1) # True 102 | print(not 2 == 2) # False 103 | ``` 104 | 105 | ## Operadores de identidade 106 | 107 | Os operadores de identidade são utilizados para comparar objetos. Os operadores de identidade são: 108 | 109 | | Operador | Descrição | 110 | |----------|-----------| 111 | | is | É | 112 | | is not | Não é | 113 | 114 | ```python 115 | print(2 is 2) # True 116 | print(2 is not 2) # False 117 | ``` 118 | 119 | ## Operadores de associação 120 | 121 | Os operadores de associação são utilizados para verificar se um valor faz parte de um objeto. Os operadores de associação são: 122 | 123 | | Operador | Descrição | 124 | |----------|-----------| 125 | | in | Está em | 126 | | not in | Não está em | 127 | 128 | ```python 129 | lista = [1, 2, 3] 130 | print(1 in lista) # True 131 | print(1 not in lista) # False 132 | ``` 133 | 134 | ## Exercícios 135 | 136 | 1. Escreva um programa que leia um número inteiro e mostre na tela se ele é par ou ímpar. 137 | 138 | 2. Escreva um programa que leia um número inteiro e mostre na tela se ele é positivo ou negativo. 139 | 140 | 3. Escreva um programa que leia um número inteiro e mostre na tela se ele é par ou ímpar e se é positivo ou negativo. 141 | 142 | [Resposta dos exercícios ](https://github.com/cilab-ufersa/introduction_machine_learning/blob/main/parte_1_introducao_python/condicional_e_lacos/res_exercicios_condicional.py) 143 | -------------------------------------------------------------------------------- /parte_1_introducao_python/condicional_e_lacos/res_exercicios_condicional.py: -------------------------------------------------------------------------------- 1 | # Escreva um programa que leia um número inteiro e mostre na tela se ele é par ou ímpar 2 | 3 | numero = int(input('Digite um número: ')) 4 | if numero % 2 == 0: 5 | print('O número {} é par'.format(numero)) 6 | else: 7 | print('O número {} é ímpar'.format(numero)) 8 | 9 | 10 | # Escreva um programa que leia um número inteiro e mostre na tela se ele é positivo ou negativo. 11 | 12 | numero = int(input('Digite um número: ')) 13 | if numero > 0: 14 | print('O número {} é positivo'.format(numero)) 15 | else: 16 | print('O número {} é negativo'.format(numero)) 17 | 18 | 19 | # Escreva um programa que leia um número inteiro e mostre na tela se ele é par ou ímpar e se é positivo ou negativo. 20 | 21 | 22 | numero = int(input('Digite um número: ')) 23 | if numero % 2 == 0: 24 | print('O número {} é par'.format(numero)) 25 | else: 26 | print('O número {} é ímpar'.format(numero)) 27 | -------------------------------------------------------------------------------- /parte_1_introducao_python/dicionarios/README.md: -------------------------------------------------------------------------------- 1 | # Dicionários em Python 2 | 3 | Dicionários são estruturas de dados que permitem armazenar pares de chave e valor. 4 | 5 | ```python 6 | dicionario = { 7 | 'chave1': 'valor1', 8 | 'chave2': 'valor2', 9 | 'chave3': 'valor3', 10 | } 11 | ``` 12 | 13 | O dicionário acima possui três pares de chave e valor. A chave é uma string e o valor pode ser qualquer tipo de dado. 14 | 15 | ```python 16 | dicionario = { 17 | 'chave1': 'valor1', 18 | 'chave2': 2, 19 | 'chave3': 3.0, 20 | } 21 | ``` 22 | 23 | ## Acessando valores 24 | 25 | Para acessar um valor de um dicionário, basta informar a chave do valor desejado. 26 | 27 | ```python 28 | dicionario = { 29 | 'chave1': 'valor1', 30 | 'chave2': 2, 31 | 'chave3': 3.0, 32 | } 33 | 34 | print(dicionario['chave1']) 35 | print(dicionario['chave2']) 36 | print(dicionario['chave3']) 37 | ``` 38 | 39 | ## Adicionando valores 40 | 41 | Para adicionar um valor a um dicionário, basta informar a chave e o valor desejado. 42 | 43 | ```python 44 | dicionario = { 45 | 'chave1': 'valor1', 46 | 'chave2': 2, 47 | 'chave3': 3.0, 48 | } 49 | 50 | dicionario['chave4'] = 'valor4' 51 | dicionario['chave5'] = 5 52 | dicionario['chave6'] = 6.0 53 | 54 | print(dicionario) 55 | ``` 56 | 57 | ## Removendo valores 58 | 59 | Para remover um valor de um dicionário, basta utilizar a função `pop()`. 60 | 61 | ```python 62 | dicionario = { 63 | 'chave1': 'valor1', 64 | 'chave2': 2, 65 | 'chave3': 3.0, 66 | } 67 | 68 | dicionario.pop('chave1') 69 | 70 | print(dicionario) 71 | ``` 72 | 73 | ## Métodos 74 | 75 | ### keys() 76 | 77 | O método `keys()` retorna uma lista com as chaves de um dicionário. 78 | 79 | ```python 80 | dicionario = { 81 | 'chave1': 'valor1', 82 | 'chave2': 2, 83 | 'chave3': 3.0, 84 | } 85 | 86 | print(dicionario.keys()) 87 | ``` 88 | 89 | ### values() 90 | 91 | O método `values()` retorna uma lista com os valores de um dicionário. 92 | 93 | ```python 94 | dicionario = { 95 | 'chave1': 'valor1', 96 | 'chave2': 2, 97 | 'chave3': 3.0, 98 | } 99 | 100 | print(dicionario.values()) 101 | ``` 102 | 103 | ### items() 104 | 105 | O método `items()` retorna uma lista com os pares de chave e valor de um dicionário. 106 | 107 | ```python 108 | dicionario = { 109 | 'chave1': 'valor1', 110 | 'chave2': 2, 111 | 'chave3': 3.0, 112 | } 113 | 114 | print(dicionario.items()) 115 | ``` 116 | 117 | ### clear() 118 | 119 | O método `clear()` remove todos os pares de chave e valor de um dicionário. 120 | 121 | ```python 122 | dicionario = { 123 | 'chave1': 'valor1', 124 | 'chave2': 2, 125 | 'chave3': 3.0, 126 | } 127 | 128 | dicionario.clear() 129 | 130 | print(dicionario) 131 | ``` 132 | 133 | ### copy() 134 | 135 | O método `copy()` retorna uma cópia de um dicionário. 136 | 137 | ```python 138 | dicionario = { 139 | 'chave1': 'valor1', 140 | 'chave2': 2, 141 | 'chave3': 3.0, 142 | } 143 | 144 | dicionario_copia = dicionario.copy() 145 | 146 | print(dicionario_copia) 147 | ``` 148 | 149 | ### fromkeys() 150 | 151 | O método `fromkeys()` cria um dicionário com as chaves informadas e o valor informado. 152 | 153 | ```python 154 | chaves = ['chave1', 'chave2', 'chave3'] 155 | 156 | dicionario = dict.fromkeys(chaves, 'valor') 157 | 158 | print(dicionario) 159 | ``` 160 | 161 | ### get() 162 | 163 | O método `get()` retorna o valor de uma chave informada. 164 | 165 | ```python 166 | dicionario = { 167 | 'chave1': 'valor1', 168 | 'chave2': 2, 169 | 'chave3': 3.0, 170 | } 171 | 172 | print(dicionario.get('chave1')) 173 | ``` 174 | 175 | ### popitem() 176 | 177 | O método `popitem()` remove o último par de chave e valor de um dicionário. 178 | 179 | ```python 180 | dicionario = { 181 | 'chave1': 'valor1', 182 | 'chave2': 2, 183 | 'chave3': 3.0, 184 | } 185 | 186 | dicionario.popitem() 187 | 188 | print(dicionario) 189 | ``` 190 | 191 | ### setdefault() 192 | 193 | O método `setdefault()` retorna o valor de uma chave informada. Caso a chave não exista, o valor informado é adicionado ao dicionário. 194 | 195 | ```python 196 | dicionario = { 197 | 'chave1': 'valor1', 198 | 'chave2': 2, 199 | 'chave3': 3.0, 200 | } 201 | 202 | print(dicionario.setdefault('chave1', 'valor')) 203 | print(dicionario.setdefault('chave4', 'valor')) 204 | ``` 205 | 206 | ### update() 207 | 208 | O método `update()` atualiza um dicionário com os pares de chave e valor de outro dicionário. 209 | 210 | ```python 211 | 212 | dicionario1 = { 213 | 'chave1': 'valor1', 214 | 'chave2': 2, 215 | 'chave3': 3.0, 216 | } 217 | 218 | dicionario2 = { 219 | 'chave4': 'valor4', 220 | 'chave5': 5, 221 | 'chave6': 6.0, 222 | } 223 | 224 | dicionario1.update(dicionario2) 225 | 226 | print(dicionario1) 227 | ``` 228 | 229 | ## Exercícios 230 | 231 | 1. Crie um dicionário com 5 pares de chave e valor. Utilize o método `keys()` para exibir as chaves do dicionário. Utilize o método `values()` para exibir os valores do dicionário. Utilize o método `items()` para exibir os pares de chave e valor do dicionário. Utilize o método `clear()` para remover todos os pares de chave e valor do dicionário. Utilize o método `copy()` para criar uma cópia do dicionário. Utilize o método `fromkeys()` para criar um dicionário com as chaves informadas e o valor informado. Utilize o método `get()` para exibir o valor de uma chave informada. Utilize o método `popitem()` para remover o último par de chave e valor do dicionário. Utilize o método `setdefault()` para exibir o valor de uma chave informada. Caso a chave não exista, o valor informado é adicionado ao dicionário. Utilize o método `update()` para atualizar o dicionário com os pares de chave e valor de outro dicionário. 232 | 233 | 2. Crie um dicionário com 5 pares de chave e valor. Utilize o método `popitem()` para remover um par de chave e valor do dicionário. 234 | -------------------------------------------------------------------------------- /parte_1_introducao_python/funcoes/README.md: -------------------------------------------------------------------------------- 1 | # Definição de Funções com Python 3 2 | 3 | ## Definição de Funções 4 | 5 | Uma função é um bloco de código que executa uma tarefa específica. Uma função é definida usando a palavra-chave def. A sintaxe é a seguinte: 6 | 7 | ```python 8 | def nome_da_funcao(): 9 | # código da função 10 | ``` 11 | 12 | As funções são importantes para a reutilização de código. Por exemplo, se você precisar executar a mesma tarefa várias vezes, você pode definir uma função para executar essa tarefa e, em seguida, chamar a função sempre que você precisar executar a tarefa. 13 | 14 | ## Chamando uma Função 15 | 16 | Para chamar uma função, digite o nome da função seguido de parênteses: 17 | 18 | ```python 19 | nome_da_funcao() 20 | ``` 21 | 22 | ## Argumentos 23 | 24 | As funções podem receber argumentos. Os argumentos são especificados após o nome da função, dentro dos parênteses. Você pode adicionar quantos argumentos quiser, basta separá-los com uma vírgula. 25 | 26 | Os argumentos são frequentemente abreviados como args. 27 | 28 | O exemplo abaixo tem uma função com um argumento (fname). Quando a função é chamada, passamos um argumento, ou valor, que é usado dentro da função para imprimir o nome completo: 29 | 30 | ```python 31 | def nome_completo(fname): 32 | print(fname + " Santos") 33 | 34 | nome_completo("João") 35 | nome_completo("Maria") 36 | nome_completo("José") 37 | ``` 38 | 39 | ## Número Arbitrário de Argumentos 40 | 41 | Se você não souber quantos argumentos que serão passados para sua função, adicione um * antes do nome do parâmetro na definição da função. 42 | 43 | Isso fará com que o parâmetro receba uma tupla de argumentos e você pode acessar os itens de acordo com a necessidade. 44 | 45 | ```python 46 | def nome_completo(*nomes): 47 | print("O nome completo é: " + nomes[0] + " " + nomes[1]) 48 | 49 | nome_completo("João", "Santos") 50 | nome_completo("Maria", "Santos") 51 | nome_completo("José", "Santos") 52 | ``` 53 | 54 | ## Parâmetros de Palavra-chave 55 | 56 | Se você quiser que uma função receba um número fixo de argumentos, adicione dois pontos (:) após o parâmetro e, em seguida, defina os valores padrão para os parâmetros. Isso fará com que o parâmetro seja opcional. 57 | 58 | ```python 59 | def nome_completo(nome, sobrenome = "Santos"): 60 | print(nome + " " + sobrenome) 61 | 62 | nome_completo("João") 63 | nome_completo("Maria") 64 | nome_completo("José") 65 | ``` 66 | 67 | ## Retornando Valores 68 | 69 | Para deixar uma função retornar um valor, use a instrução return: 70 | 71 | ```python 72 | def soma(x, y): 73 | return x + y 74 | 75 | print(soma(5, 3)) 76 | ``` 77 | 78 | ## Recursão 79 | 80 | Uma função pode chamar a si mesma. Isso é chamado de recursão. 81 | 82 | A função abaixo imprime uma sequência de números, começando em 0, e terminando em 10: 83 | 84 | ```python 85 | def recursao(i): 86 | if (i < 10): 87 | print(i) 88 | recursao(i + 1) 89 | 90 | recursao(0) 91 | ``` 92 | 93 | ## Exemplo: Resolvendo o Fatorial com recursão 94 | 95 | O fatorial de um número é o produto de todos os inteiros inferiores a e incluindo ele mesmo. O fatorial de 5 é escrito como 5! e é igual a 1 * 2 * 3 * 4 * 5 = 120. Escreva uma função que calcule o fatorial de um número. 96 | 97 | ```python 98 | def fatorial(n): 99 | if n == 1: 100 | return 1 101 | else: 102 | return n * fatorial(n - 1) 103 | 104 | print(fatorial(5)) 105 | ``` 106 | 107 | ## Exemplo: Resolvendo o Fibonacci com recursão 108 | 109 | O número de Fibonacci é uma sequência de números inteiros, começando normalmente por 0 e 1, na qual, cada termo subsequente corresponde à soma dos dois anteriores. Escreva uma função que calcule o n-ésimo número de Fibonacci. 110 | 111 | ```python 112 | 113 | def fibonacci(n): 114 | if n <= 1: 115 | return n 116 | else: 117 | return(fibonacci(n-1) + fibonacci(n-2)) 118 | 119 | print(fibonacci(9)) 120 | 121 | ``` 122 | 123 | ## Função Lambda 124 | 125 | Uma função lambda é uma pequena função anônima. 126 | 127 | Uma função lambda pode receber qualquer número de argumentos, mas pode ter apenas uma expressão. 128 | 129 | ```python 130 | 131 | x = lambda a : a + 10 132 | print(x(5)) 133 | 134 | ``` 135 | 136 | ## Função Map 137 | 138 | A função map() aplica uma função a todos os itens de um iterável. 139 | 140 | ```python 141 | 142 | def dobro(x): 143 | return x * 2 144 | 145 | valores = [1, 2, 3, 4, 5] 146 | 147 | valores_dobrados = map(dobro, valores) 148 | 149 | print(list(valores_dobrados)) 150 | 151 | ``` 152 | 153 | ## Função Filter 154 | 155 | A função filter() cria uma lista de elementos para os quais uma função retorna True. 156 | 157 | ```python 158 | 159 | def maior_que_5(x): 160 | if x > 5: 161 | return True 162 | else: 163 | return False 164 | 165 | valores = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 166 | 167 | valores_maiores_que_5 = filter(maior_que_5, valores) 168 | 169 | print(list(valores_maiores_que_5)) 170 | 171 | ``` 172 | 173 | 174 | 175 | -------------------------------------------------------------------------------- /parte_1_introducao_python/lacos/README.md: -------------------------------------------------------------------------------- 1 | # Laços de repetição em Python 2 | 3 | Laços de repetição são estruturas de controle que permitem executar um bloco de código várias vezes. Existe dois tipos de laços de repetição em Python: **for** e **while**. 4 | 5 | ## while 6 | 7 | O while é uma estrutura de controle que permite executar um bloco de código enquanto uma condição for verdadeira. Sua sintaxe é: 8 | 9 | 10 | ```python 11 | while condicao: 12 | # bloco de código 13 | ``` 14 | 15 | O bloco de código é executado enquanto a condição for verdadeira. Caso contrário, o bloco de código não é executado. 16 | 17 | Exemplo: 18 | 19 | ```python 20 | contador = 0 21 | while contador < 10: 22 | print(contador) 23 | contador += 1 24 | ``` 25 | 26 | No exemplo acima, o bloco de código é executado enquanto o contador for menor que 10. A cada iteração, o contador é incrementado em 1. 27 | 28 | ## for 29 | 30 | O for é uma estrutura de controle que permite executar um bloco de código varias vezes. No exemplo a seguir, o laço for é executado para cada elemento de uma sequência. 31 | 32 | ```python 33 | for elemento in sequencia: 34 | # bloco de código 35 | ``` 36 | 37 | O bloco de código é executado para cada elemento da sequência. Caso contrário, o bloco de código não é executado. 38 | 39 | Exemplo: 40 | 41 | ```python 42 | for numero in range(10): 43 | print(numero) 44 | ``` 45 | 46 | No exemplo acima, o bloco de código é executado para cada elemento da sequência. A sequência é gerada pelo método range(). O método range() gera uma sequência de números inteiros. O método range() recebe como parâmetro a quantidade de numeros sequência. Portanto, range(10) gera os números de 0 a 9. Assim, o bloco de código é executado 10 vezes, em que cada iteração a variavel numero recebe um valor diferente, iniciando em 0 e terminando em 9. 47 | 48 | ## break 49 | 50 | O break é uma palavra-chave que permite interromper um laço de repetição. 51 | 52 | ```python 53 | while True: 54 | # bloco de código 55 | break 56 | ``` 57 | 58 | O bloco de código é executado até que o break seja executado. 59 | 60 | ```python 61 | contador = 0 62 | while True: 63 | print(contador) 64 | contador += 1 65 | if contador == 10: 66 | break 67 | ``` 68 | 69 | ## continue 70 | 71 | O continue é uma palavra-chave que permite interromper a execução do laço de repetição atual e continuar a execução do próximo laço de repetição. 72 | 73 | ```python 74 | while True: 75 | # bloco de código 76 | continue 77 | ``` 78 | 79 | O bloco de código é executado até que o continue seja executado. 80 | 81 | ```python 82 | contador = 0 83 | while True: 84 | contador += 1 85 | if contador == 10: 86 | continue 87 | print(contador) 88 | if contador == 20: 89 | break 90 | ``` 91 | 92 | ## else 93 | 94 | O else é uma estrutura de controle que permite executar um bloco de código caso um laço de repetição seja executado até o fim. 95 | 96 | ```python 97 | while condicao: 98 | # bloco de código 99 | else: 100 | # bloco de código 101 | ``` 102 | 103 | O bloco de código do else é executado caso o laço de repetição seja executado até o fim. Caso contrário, o bloco de código do else não é executado. 104 | 105 | ```python 106 | contador = 0 107 | while contador < 10: 108 | print(contador) 109 | contador += 1 110 | else: 111 | print('Fim do laço de repetição') 112 | ``` 113 | 114 | ## Exercícios 115 | 116 | 1. Escreva um programa que imprima os números de 1 a 10. 117 | 118 | 2. Escreva um programa que imprima os números de 10 a 1. 119 | 120 | 3. Escreva um programa que imprima os números pares de 1 a 10. 121 | 122 | 4. Escreva um programa que imprima os números ímpares de 1 a 10. 123 | -------------------------------------------------------------------------------- /parte_1_introducao_python/lacos/res_exercicios.py: -------------------------------------------------------------------------------- 1 | # Escreva um programa que imprima os números de 1 a 10. 2 | 3 | numeros = range(1, 11) 4 | 5 | for numero in numeros: 6 | print(numero) 7 | 8 | 9 | # Escreva um programa que imprima os números de 10 a 1. 10 | 11 | numeros = range(10, 0, -1) 12 | 13 | for numero in numeros: 14 | print(numero) 15 | 16 | 17 | # Escreva um programa que imprima os números pares de 1 a 10. 18 | 19 | numeros = range(1, 11) 20 | 21 | for numero in numeros: 22 | if numero % 2 == 0: 23 | print(numero) 24 | 25 | 26 | # Escreva um programa que imprima os números ímpares de 1 a 10. 27 | 28 | numeros = range(1, 11) 29 | 30 | for numero in numeros: 31 | if numero % 2 != 0: 32 | print(numero) 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /parte_1_introducao_python/parte_1_projeto_1/helper.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import re 3 | import matplotlib.pyplot as plt 4 | from IPython.core.display import display, HTML 5 | 6 | def data_from_url(url): 7 | df = pd.read_html(url)[1] 8 | lol = df.to_numpy().tolist() 9 | return lol 10 | 11 | def fetch_year(date_string): 12 | return int(re.findall("\d{4}", date_string)[0]) 13 | 14 | def barplot(list_of_2_element_list): 15 | d = {ya[0]:ya[1] for ya in list_of_2_element_list} 16 | plt.figure(figsize=(9,15)) 17 | axes = plt.axes() 18 | axes.get_xaxis().set_visible(False) 19 | 20 | spines = axes.spines 21 | spines['top'].set_visible(False) 22 | spines['right'].set_visible(False) 23 | spines['bottom'].set_visible(False) 24 | spines['left'].set_visible(False) 25 | ax = plt.barh(*zip(*d.items()), height=.5) 26 | plt.yticks(list(d.keys()), list(d.keys())) 27 | plt.xticks(range(4), range(4)) 28 | rectangles = ax.patches 29 | for rectangle in rectangles: 30 | x_value = rectangle.get_width() 31 | y_value = rectangle.get_y() + rectangle.get_height() / 2 32 | space = 5 33 | ha = 'left' 34 | label = "{}".format(x_value) 35 | if x_value > 0: 36 | plt.annotate( 37 | label, 38 | (x_value, y_value), 39 | xytext=(space, 0), 40 | textcoords="offset points", 41 | va='center', 42 | ha=ha) 43 | 44 | axes.tick_params(tick1On=False) 45 | plt.show() 46 | 47 | def unique_countries(countries): 48 | s = pd.Series(countries) 49 | return list(s.unique()) 50 | 51 | def display_no_index(df): 52 | display(HTML(df.to_html(index=False))) 53 | 54 | def print_pretty_table(countries_frequency): 55 | countries = df.Country.value_counts().index 56 | occurrences = df.Country.value_counts().values 57 | d = {"Country": countries, "Number of Occurrences": occurrences} 58 | display_no_index(pd.DataFrame(d)) 59 | 60 | df = pd.read_html("https://en.wikipedia.org/wiki/List_of_helicopter_prison_escapes")[1] 61 | df = df[["Date", "Prison name", "Country", "Succeeded", "Escapee(s)"]] -------------------------------------------------------------------------------- /parte_1_introducao_python/parte_1_projeto_1/projeto_01.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "ZHJEPvzxaXDI" 7 | }, 8 | "source": [ 9 | "# Projeto 01: Fuga da Prisão\n", 10 | "\n", 11 | "Vamos trabalhar com um conjunto de dados de fugas de prisões de helicóptero!" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "id": "xeuKMUX_aXDL" 18 | }, 19 | "source": [ 20 | "Começamos importando algumas funções auxiliares." 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": null, 26 | "metadata": { 27 | "id": "vMJVoMPpaXDR" 28 | }, 29 | "outputs": [], 30 | "source": [ 31 | "from helper import *" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": { 37 | "id": "WaS4LybdaXDT" 38 | }, 39 | "source": [ 40 | "## Parte 01: Obtendo os dados" 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": { 46 | "id": "BgCX9h-KaXDU" 47 | }, 48 | "source": [ 49 | "\n", 50 | "Agora, vamos obter os dados da Lista de fugas de helicópteros da Wikipédia. [List of helicopter prison escapes](https://en.wikipedia.org/wiki/List_of_helicopter_prison_escapes) " 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": null, 56 | "metadata": { 57 | "id": "1mIAmtQwaXDW" 58 | }, 59 | "outputs": [], 60 | "source": [ 61 | "url = \"https://en.wikipedia.org/wiki/List_of_helicopter_prison_escapes\"\n", 62 | "data = data_from_url(url)" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": { 68 | "id": "6b4wRbnUaXDX" 69 | }, 70 | "source": [ 71 | "Vamos imprimir as três primeiras linhas." 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": null, 77 | "metadata": { 78 | "tags": [], 79 | "colab": { 80 | "base_uri": "https://localhost:8080/" 81 | }, 82 | "id": "FQD2-El4aXDZ", 83 | "outputId": "1d5dbd1e-c29f-4dba-91c6-cc4da4acb1b2" 84 | }, 85 | "outputs": [ 86 | { 87 | "output_type": "stream", 88 | "name": "stdout", 89 | "text": [ 90 | "['August 19, 1971', 'Santa Martha Acatitla', 'Mexico', 'Yes', 'Joel David Kaplan Carlos Antonio Contreras Castro', \"Joel David Kaplan was a New York businessman who had been arrested for murder in 1962 in Mexico City and was incarcerated at the Santa Martha Acatitla prison in the Iztapalapa borough of Mexico City. Joel's sister, Judy Kaplan, arranged the means to help Kaplan escape, and on August 19, 1971, a helicopter landed in the prison yard. The guards mistakenly thought this was an official visit. In two minutes, Kaplan and his cellmate Carlos Antonio Contreras, a Venezuelan counterfeiter, were able to board the craft and were piloted away, before any shots were fired.[9] Both men were flown to Texas and then different planes flew Kaplan to California and Castro to Guatemala.[3] The Mexican government never initiated extradition proceedings against Kaplan.[9] The escape is told in a book, The 10-Second Jailbreak: The Helicopter Escape of Joel David Kaplan.[4] It also inspired the 1975 action movie Breakout, which starred Charles Bronson and Robert Duvall.[9]\"]\n", 91 | "['October 31, 1973', 'Mountjoy Jail', 'Ireland', 'Yes', \"JB O'Hagan Seamus TwomeyKevin Mallon\", 'On October 31, 1973 an IRA member hijacked a helicopter and forced the pilot to land in the exercise yard of Dublin\\'s Mountjoy Jail\\'s D Wing at 3:40\\xa0p.m., October 31, 1973. Three members of the IRA were able to escape: JB O\\'Hagan, Seamus Twomey and Kevin Mallon. Another prisoner who also was in the prison was quoted as saying, \"One shamefaced screw apologised to the governor and said he thought it was the new Minister for Defence (Paddy Donegan) arriving. I told him it was our Minister of Defence leaving.\" The Mountjoy helicopter escape became Republican lore and was immortalized by \"The Helicopter Song\", which contains the lines \"It\\'s up like a bird and over the city. There\\'s three men a\\'missing I heard the warder say\".[1]']\n", 92 | "['May 24, 1978', 'United States Penitentiary, Marion', 'United States', 'No', 'Garrett Brock TrapnellMartin Joseph McNallyJames Kenneth Johnson', \"43-year-old Barbara Ann Oswald hijacked a Saint Louis-based charter helicopter and forced the pilot to land in the yard at USP Marion. While landing the aircraft, the pilot, Allen Barklage, who was a Vietnam War veteran, struggled with Oswald and managed to wrestle the gun away from her. Barklage then shot and killed Oswald, thwarting the escape.[10] A few months later Oswald's daughter hijacked TWA Flight 541 in an effort to free Trapnell.\"]\n" 93 | ] 94 | } 95 | ], 96 | "source": [ 97 | "for row in data[:3]:\n", 98 | " print(row)" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "metadata": { 104 | "id": "mEwv2lmTaXDc" 105 | }, 106 | "source": [ 107 | "## Parte 02: Tratar os dados\n", 108 | "\n", 109 | "### Removendo os detalhes" 110 | ] 111 | }, 112 | { 113 | "cell_type": "markdown", 114 | "metadata": { 115 | "id": "cY95FnFRaXDd" 116 | }, 117 | "source": [ 118 | "Inicializamos uma variável `index` com o valor de `0`. O objetivo dessa variável é nos ajudar a rastrear qual linha estamos modificando." 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": null, 124 | "metadata": { 125 | "id": "pqlE7euUaXDf" 126 | }, 127 | "outputs": [], 128 | "source": [ 129 | "index = 0\n", 130 | "for row in data:\n", 131 | " data[index] = row[:-1]\n", 132 | " index += 1" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": { 139 | "colab": { 140 | "base_uri": "https://localhost:8080/" 141 | }, 142 | "id": "WUcqaBTOaXDi", 143 | "outputId": "6a6c2bb4-6499-48db-d3e9-758e88852746" 144 | }, 145 | "outputs": [ 146 | { 147 | "output_type": "stream", 148 | "name": "stdout", 149 | "text": [ 150 | "[['August 19, 1971', 'Santa Martha Acatitla', 'Mexico', 'Yes', 'Joel David Kaplan Carlos Antonio Contreras Castro'], ['October 31, 1973', 'Mountjoy Jail', 'Ireland', 'Yes', \"JB O'Hagan Seamus TwomeyKevin Mallon\"], ['May 24, 1978', 'United States Penitentiary, Marion', 'United States', 'No', 'Garrett Brock TrapnellMartin Joseph McNallyJames Kenneth Johnson']]\n" 151 | ] 152 | } 153 | ], 154 | "source": [ 155 | "print(data[:3])" 156 | ] 157 | }, 158 | { 159 | "cell_type": "markdown", 160 | "metadata": { 161 | "id": "IZjKKSxfaXDk" 162 | }, 163 | "source": [ 164 | "### Extraindo o ano" 165 | ] 166 | }, 167 | { 168 | "cell_type": "markdown", 169 | "metadata": { 170 | "id": "RreCkvoeaXDl" 171 | }, 172 | "source": [ 173 | "Na célula de código abaixo, iteramos sobre `data` usando a variável iterável `row` e:\n", 174 | "\n", 175 | "- Com cada ocorrência de `row[0]`, nos referimos à primeira entrada de `row`, ou seja, a data (date).\n", 176 | "- Assim, com `date = fetch_year(row[0])`, estamos extraindo o ano da data em `row[0]` e atribuindo-o à variável `date`.\n", 177 | "- Em seguida, substituímos o valor de `row[0]` pelo ano que acabamos de extrair." 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": null, 183 | "metadata": { 184 | "tags": [], 185 | "id": "nkdcnc9RaXDl" 186 | }, 187 | "outputs": [], 188 | "source": [ 189 | "for row in data:\n", 190 | " date = fetch_year(row[0])\n", 191 | " row[0] = date" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": null, 197 | "metadata": { 198 | "colab": { 199 | "base_uri": "https://localhost:8080/" 200 | }, 201 | "id": "JEEdI7raaXDn", 202 | "outputId": "812bd18c-34d6-461e-c9f5-f70a3d2ee8b9" 203 | }, 204 | "outputs": [ 205 | { 206 | "output_type": "stream", 207 | "name": "stdout", 208 | "text": [ 209 | "[[1971, 'Santa Martha Acatitla', 'Mexico', 'Yes', 'Joel David Kaplan Carlos Antonio Contreras Castro'], [1973, 'Mountjoy Jail', 'Ireland', 'Yes', \"JB O'Hagan Seamus TwomeyKevin Mallon\"], [1978, 'United States Penitentiary, Marion', 'United States', 'No', 'Garrett Brock TrapnellMartin Joseph McNallyJames Kenneth Johnson']]\n" 210 | ] 211 | } 212 | ], 213 | "source": [ 214 | "print(data[:3])" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": { 220 | "id": "csNvx5u9aXDp" 221 | }, 222 | "source": [ 223 | "### Tentativas por ano" 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": null, 229 | "metadata": { 230 | "id": "tBvk6oSqaXDp" 231 | }, 232 | "outputs": [], 233 | "source": [ 234 | "min_year = min(data, key=lambda x: x[0])[0]\n", 235 | "max_year = max(data, key=lambda x: x[0])[0]" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": { 241 | "id": "PDPQoNExaXDq" 242 | }, 243 | "source": [ 244 | "Antes de prosseguirmos, vamos verificar quais são as datas mais antigas e mais recentes que temos em nosso conjunto de dados." 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "execution_count": null, 250 | "metadata": { 251 | "colab": { 252 | "base_uri": "https://localhost:8080/" 253 | }, 254 | "id": "aqTNss4HaXDq", 255 | "outputId": "42d8b01b-61f6-49ee-82b1-8287c2dc89d8" 256 | }, 257 | "outputs": [ 258 | { 259 | "output_type": "stream", 260 | "name": "stdout", 261 | "text": [ 262 | "1971\n", 263 | "2020\n" 264 | ] 265 | } 266 | ], 267 | "source": [ 268 | "print(min_year)\n", 269 | "print(max_year)" 270 | ] 271 | }, 272 | { 273 | "cell_type": "markdown", 274 | "metadata": { 275 | "id": "79XqeHLMaXDr" 276 | }, 277 | "source": [ 278 | "Agora vamos criar uma lista de todos os anos variando de `min_year` a `max_year`. Nosso objetivo é então determinar quantas tentativas de fuga da prisão ocorreram em cada ano. Como os anos em que não houve fugas de prisão não estão presentes no conjunto de dados, isso garantirá que os capturemos." 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": null, 284 | "metadata": { 285 | "id": "GUAskRcEaXDs" 286 | }, 287 | "outputs": [], 288 | "source": [ 289 | "years = []\n", 290 | "for y in range(min_year, max_year + 1):\n", 291 | " years.append(y)" 292 | ] 293 | }, 294 | { 295 | "cell_type": "markdown", 296 | "metadata": { 297 | "id": "Jyqwn5e6aXDt" 298 | }, 299 | "source": [ 300 | "Vamos dar uma olhada em `years` para ver se parece com o que esperávamos." 301 | ] 302 | }, 303 | { 304 | "cell_type": "code", 305 | "execution_count": null, 306 | "metadata": { 307 | "colab": { 308 | "base_uri": "https://localhost:8080/" 309 | }, 310 | "id": "MWLbAq2JaXDt", 311 | "outputId": "b1e902eb-b7d2-421c-ec7b-15161b620c25" 312 | }, 313 | "outputs": [ 314 | { 315 | "output_type": "stream", 316 | "name": "stdout", 317 | "text": [ 318 | "[1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]\n" 319 | ] 320 | } 321 | ], 322 | "source": [ 323 | "print(years)" 324 | ] 325 | }, 326 | { 327 | "cell_type": "markdown", 328 | "metadata": { 329 | "id": "nJI44zIDaXDv" 330 | }, 331 | "source": [ 332 | "Ótimo!" 333 | ] 334 | }, 335 | { 336 | "cell_type": "markdown", 337 | "metadata": { 338 | "id": "uwUnmQLbaXDw" 339 | }, 340 | "source": [ 341 | "Agora criamos uma lista onde cada elemento será`[, 0]`." 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": null, 347 | "metadata": { 348 | "id": "r5kUSh-zaXDx" 349 | }, 350 | "outputs": [], 351 | "source": [ 352 | "attempts_per_year = []\n", 353 | "for y in years:\n", 354 | " attempts_per_year.append([y, 0])" 355 | ] 356 | }, 357 | { 358 | "cell_type": "markdown", 359 | "metadata": { 360 | "id": "CQyYJQ23aXDy" 361 | }, 362 | "source": [ 363 | "E finalmente incrementamos a segunda entrada (a do índice `1` que começa como sendo `0`) em `1` cada vez que um ano aparece nos dados." 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": null, 369 | "metadata": { 370 | "colab": { 371 | "base_uri": "https://localhost:8080/" 372 | }, 373 | "id": "RzY-_qEmaXDy", 374 | "outputId": "ddb8028f-112e-4313-b676-798dcc6caa49" 375 | }, 376 | "outputs": [ 377 | { 378 | "output_type": "stream", 379 | "name": "stdout", 380 | "text": [ 381 | "[[1971, 1], [1972, 0], [1973, 1], [1974, 0], [1975, 0], [1976, 0], [1977, 0], [1978, 1], [1979, 0], [1980, 0], [1981, 2], [1982, 0], [1983, 1], [1984, 0], [1985, 2], [1986, 3], [1987, 1], [1988, 1], [1989, 2], [1990, 1], [1991, 1], [1992, 2], [1993, 1], [1994, 0], [1995, 0], [1996, 1], [1997, 1], [1998, 0], [1999, 1], [2000, 2], [2001, 3], [2002, 2], [2003, 1], [2004, 0], [2005, 2], [2006, 1], [2007, 3], [2008, 0], [2009, 3], [2010, 1], [2011, 0], [2012, 1], [2013, 2], [2014, 1], [2015, 0], [2016, 1], [2017, 0], [2018, 1], [2019, 0], [2020, 1]]\n" 382 | ] 383 | } 384 | ], 385 | "source": [ 386 | "for row in data:\n", 387 | " for ya in attempts_per_year:\n", 388 | " y = ya[0]\n", 389 | " if row[0] == y:\n", 390 | " ya[1] += 1\n", 391 | " \n", 392 | "print(attempts_per_year) " 393 | ] 394 | }, 395 | { 396 | "cell_type": "markdown", 397 | "source": [ 398 | "## Gráfico \n", 399 | "\n", 400 | "Para visualizar os resultados, vamos plotar um gráfico do tipo barra." 401 | ], 402 | "metadata": { 403 | "id": "CyTHTguJcC2Z" 404 | } 405 | }, 406 | { 407 | "cell_type": "code", 408 | "execution_count": null, 409 | "metadata": { 410 | "colab": { 411 | "base_uri": "https://localhost:8080/", 412 | "height": 846 413 | }, 414 | "id": "jkOkcHUiaXDy", 415 | "outputId": "9785c887-e6e9-42e8-a95c-fd7cdee9f510" 416 | }, 417 | "outputs": [ 418 | { 419 | "output_type": "display_data", 420 | "data": { 421 | "text/plain": [ 422 | "
" 423 | ], 424 | "image/png": "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\n" 425 | }, 426 | "metadata": { 427 | "needs_background": "light" 428 | } 429 | } 430 | ], 431 | "source": [ 432 | "%matplotlib inline\n", 433 | "barplot(attempts_per_year)" 434 | ] 435 | }, 436 | { 437 | "cell_type": "markdown", 438 | "metadata": { 439 | "id": "2_JpxLDvaXDz" 440 | }, 441 | "source": [ 442 | "De acordo com o gráfico, podemos visualizar que os anos em que ocorreram mais tentativas de fuga de helicóptero foram 1986, 2001, 2007 e 2009, com um total de três tentativas cada." 443 | ] 444 | }, 445 | { 446 | "cell_type": "markdown", 447 | "metadata": { 448 | "id": "uQdiWlR9aXD0" 449 | }, 450 | "source": [ 451 | "# Tentativas por país" 452 | ] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "execution_count": null, 457 | "metadata": { 458 | "colab": { 459 | "base_uri": "https://localhost:8080/", 460 | "height": 520 461 | }, 462 | "id": "yYJ2Z4f2aXD1", 463 | "outputId": "02a5074b-b9b7-43de-9ac5-f0ef5aa05c6b" 464 | }, 465 | "outputs": [ 466 | { 467 | "output_type": "display_data", 468 | "data": { 469 | "text/plain": [ 470 | "" 471 | ], 472 | "text/html": [ 473 | "\n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | "
CountryNumber of Occurrences
France15
United States8
Canada4
Greece4
Belgium4
Australia2
Brazil2
United Kingdom2
Mexico1
Ireland1
Italy1
Puerto Rico1
Chile1
Netherlands1
Russia1
" 543 | ] 544 | }, 545 | "metadata": {} 546 | } 547 | ], 548 | "source": [ 549 | "countries_frequency = df.groupby(\"Country\")\n", 550 | "print_pretty_table(countries_frequency)" 551 | ] 552 | }, 553 | { 554 | "cell_type": "markdown", 555 | "metadata": { 556 | "id": "3buyOQ_kaXD3" 557 | }, 558 | "source": [ 559 | "De longe, o país com mais tentativas de fuga de prisão por helicóptero é a França." 560 | ] 561 | } 562 | ], 563 | "metadata": { 564 | "kernelspec": { 565 | "display_name": "Python 3", 566 | "language": "python", 567 | "name": "python3" 568 | }, 569 | "language_info": { 570 | "codemirror_mode": { 571 | "name": "ipython", 572 | "version": 3 573 | }, 574 | "file_extension": ".py", 575 | "mimetype": "text/x-python", 576 | "name": "python", 577 | "nbconvert_exporter": "python", 578 | "pygments_lexer": "ipython3", 579 | "version": "3.8.2" 580 | }, 581 | "colab": { 582 | "provenance": [] 583 | } 584 | }, 585 | "nbformat": 4, 586 | "nbformat_minor": 0 587 | } -------------------------------------------------------------------------------- /parte_1_introducao_python/parte_1_projeto_2/Projeto02.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "source": [ 20 | "# Perfis de aplicativos lucrativos para a App Store e Google Play Markets\n", 21 | "\n", 22 | "\n", 23 | "Nosso objetivo neste projeto é encontrar perfis de aplicativos móveis que sejam rentáveis ​​para os mercados de App Store e Google Play. Estamos trabalhando como analistas de dados para uma empresa que cria aplicativos móveis para Android e iOS, e nosso trabalho é permitir que nossa equipe de desenvolvedores tome decisões baseadas em dados com relação ao tipo de aplicativo que eles criam.\n", 24 | "\n", 25 | "Em nossa empresa, criamos apenas aplicativos gratuitos para download e instalação, e nossa principal fonte de receita consiste em anúncios no aplicativo. Isso significa que nossa receita para qualquer aplicativo é influenciada principalmente pelo número de usuários que usam nosso aplicativo. Nosso objetivo para este projeto é analisar dados para ajudar nossos desenvolvedores a entender quais tipos de aplicativos provavelmente atrairão mais usuários.\n", 26 | "\n" 27 | ], 28 | "metadata": { 29 | "id": "ivrOZfFL-C-J" 30 | } 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "source": [ 35 | "## Abrindo e explorando os dados\n", 36 | "\n", 37 | "\n", 38 | "Em setembro de 2018, havia aproximadamente 2 milhões de aplicativos iOS disponíveis na App Store e 2,1 milhões de aplicativos Android no Google Play.\n", 39 | "\n", 40 | "![img](https://s3.amazonaws.com/dq-content/350/py1m8_statista.png) \n", 41 | "\n", 42 | "Fonte: [Statista](https://www.statista.com/statistics/276623/number-of-apps-available-in-leading-app-stores)\n", 43 | "\n", 44 | "A coleta de dados de mais de quatro milhões de aplicativos requer uma quantidade significativa de tempo e dinheiro, portanto, tentaremos analisar uma amostra de dados. Para evitar gastar recursos com a coleta de novos dados, devemos primeiro tentar ver se podemos encontrar dados existentes relevantes sem nenhum custo. Felizmente, estes são dois conjuntos de dados que parecem adequados para o nosso propósito:\n", 45 | "\n", 46 | "\n", 47 | "Um conjunto de dados contendo dados sobre aproximadamente dez mil aplicativos Android do Google Play. Você pode baixar o conjunto de dados diretamente deste [link](https://dq-content.s3.amazonaws.com/350/googleplaystore.csv).\n", 48 | "\n", 49 | "\n", 50 | "Um conjunto de dados contendo dados de aproximadamente sete mil aplicativos iOS da App Store. Você pode baixar o conjunto de dados diretamente deste [link](https://dq-content.s3.amazonaws.com/350/AppleStore.csv)." 51 | ], 52 | "metadata": { 53 | "id": "xf9Iqu4b_JRr" 54 | } 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "source": [ 59 | "### Vamos começar abrindo os dois conjuntos de dados e depois continuar explorando os dados." 60 | ], 61 | "metadata": { 62 | "id": "JTv66_B1--PO" 63 | } 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 2, 68 | "metadata": { 69 | "id": "pjMPg4Ic-BE1" 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "from csv import reader\n", 74 | "\n", 75 | "### The Google Play data set ###\n", 76 | "opened_file = open('googleplaystore.csv')\n", 77 | "read_file = reader(opened_file)\n", 78 | "android = list(read_file)\n", 79 | "android_header = android[0]\n", 80 | "android = android[1:]\n", 81 | "\n", 82 | "### The App Store data set ###\n", 83 | "opened_file = open('AppleStore.csv')\n", 84 | "read_file = reader(opened_file)\n", 85 | "ios = list(read_file)\n", 86 | "ios_header = ios[0]\n", 87 | "ios = ios[1:]" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "source": [ 93 | "Para facilitar a exploração dos dois conjuntos de dados, primeiro escreveremos uma função chamada `explore_data()` que podemos usar repetidamente para explorar linhas de maneira mais legível. Também adicionaremos uma opção para nossa função mostrar o número de linhas e colunas para qualquer conjunto de dados." 94 | ], 95 | "metadata": { 96 | "id": "W_c8HJqRFT20" 97 | } 98 | }, 99 | { 100 | "cell_type": "code", 101 | "source": [ 102 | "def explore_data(dataset, start, end, rows_and_columns=False):\n", 103 | " dataset_slice = dataset[start:end] \n", 104 | " for row in dataset_slice:\n", 105 | " print(row)\n", 106 | " print('\\n') # adds a new (empty) line between rows\n", 107 | " \n", 108 | " if rows_and_columns:\n", 109 | " print('Number of rows:', len(dataset))\n", 110 | " print('Number of columns:', len(dataset[0]))\n", 111 | "\n", 112 | "print(android_header)\n", 113 | "print('\\n')\n", 114 | "explore_data(android, 0, 3, True)" 115 | ], 116 | "metadata": { 117 | "colab": { 118 | "base_uri": "https://localhost:8080/" 119 | }, 120 | "id": "qmcuHjz9-8hx", 121 | "outputId": "1679ed57-e66c-4639-a186-e8d0c44e13f2" 122 | }, 123 | "execution_count": 3, 124 | "outputs": [ 125 | { 126 | "output_type": "stream", 127 | "name": "stdout", 128 | "text": [ 129 | "['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver']\n", 130 | "\n", 131 | "\n", 132 | "['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up']\n", 133 | "\n", 134 | "\n", 135 | "['Coloring book moana', 'ART_AND_DESIGN', '3.9', '967', '14M', '500,000+', 'Free', '0', 'Everyone', 'Art & Design;Pretend Play', 'January 15, 2018', '2.0.0', '4.0.3 and up']\n", 136 | "\n", 137 | "\n", 138 | "['U Launcher Lite – FREE Live Cool Themes, Hide Apps', 'ART_AND_DESIGN', '4.7', '87510', '8.7M', '5,000,000+', 'Free', '0', 'Everyone', 'Art & Design', 'August 1, 2018', '1.2.4', '4.0.3 and up']\n", 139 | "\n", 140 | "\n", 141 | "Number of rows: 10841\n", 142 | "Number of columns: 13\n" 143 | ] 144 | } 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "source": [ 150 | "print(ios_header)\n", 151 | "print('\\n')\n", 152 | "explore_data(ios, 0, 3, True)" 153 | ], 154 | "metadata": { 155 | "colab": { 156 | "base_uri": "https://localhost:8080/" 157 | }, 158 | "id": "q9mAl0vCFa2G", 159 | "outputId": "77214849-7490-4332-d092-c2018cf69098" 160 | }, 161 | "execution_count": 4, 162 | "outputs": [ 163 | { 164 | "output_type": "stream", 165 | "name": "stdout", 166 | "text": [ 167 | "['id', 'track_name', 'size_bytes', 'currency', 'price', 'rating_count_tot', 'rating_count_ver', 'user_rating', 'user_rating_ver', 'ver', 'cont_rating', 'prime_genre', 'sup_devices.num', 'ipadSc_urls.num', 'lang.num', 'vpp_lic']\n", 168 | "\n", 169 | "\n", 170 | "['284882215', 'Facebook', '389879808', 'USD', '0.0', '2974676', '212', '3.5', '3.5', '95.0', '4+', 'Social Networking', '37', '1', '29', '1']\n", 171 | "\n", 172 | "\n", 173 | "['389801252', 'Instagram', '113954816', 'USD', '0.0', '2161558', '1289', '4.5', '4.0', '10.23', '12+', 'Photo & Video', '37', '0', '29', '1']\n", 174 | "\n", 175 | "\n", 176 | "['529479190', 'Clash of Clans', '116476928', 'USD', '0.0', '2130805', '579', '4.5', '4.5', '9.24.12', '9+', 'Games', '38', '5', '18', '1']\n", 177 | "\n", 178 | "\n", 179 | "Number of rows: 7197\n", 180 | "Number of columns: 16\n" 181 | ] 182 | } 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "source": [ 188 | "Temos 7.197 aplicativos iOS neste conjunto de dados, e as colunas que parecem interessantes são: `'track_name', 'currency', 'price', 'rating_count_tot', 'rating_count_ver'` e `'prime_genre'`. Nem todos os nomes de coluna são autoexplicativos neste caso, mas os detalhes sobre cada coluna podem ser encontrados na documentação do conjunto de dados." 189 | ], 190 | "metadata": { 191 | "id": "xFbmV-B3FrEO" 192 | } 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "source": [ 197 | "## Excluindo dados errados\n", 198 | "\n", 199 | "O conjunto de dados do Google Play tem uma seção de discussão dedicada, e podemos ver que uma das discussões descreve um erro para a linha 10472. Vamos imprimir esta linha e compará-la com o cabeçalho e outra linha correta." 200 | ], 201 | "metadata": { 202 | "id": "8POzVo-oFzV_" 203 | } 204 | }, 205 | { 206 | "cell_type": "code", 207 | "source": [ 208 | "print(android[10472]) # incorrect row\n", 209 | "print('\\n')\n", 210 | "print(android_header) # header\n", 211 | "print('\\n')\n", 212 | "print(android[0]) # correct row" 213 | ], 214 | "metadata": { 215 | "colab": { 216 | "base_uri": "https://localhost:8080/" 217 | }, 218 | "id": "twxtmyTQFye2", 219 | "outputId": "faf15d1e-8032-49ca-f320-d2bbd1729eff" 220 | }, 221 | "execution_count": 5, 222 | "outputs": [ 223 | { 224 | "output_type": "stream", 225 | "name": "stdout", 226 | "text": [ 227 | "['Life Made WI-Fi Touchscreen Photo Frame', '1.9', '19', '3.0M', '1,000+', 'Free', '0', 'Everyone', '', 'February 11, 2018', '1.0.19', '4.0 and up']\n", 228 | "\n", 229 | "\n", 230 | "['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Content Rating', 'Genres', 'Last Updated', 'Current Ver', 'Android Ver']\n", 231 | "\n", 232 | "\n", 233 | "['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up']\n" 234 | ] 235 | } 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "source": [ 241 | "A linha 10472 corresponde ao aplicativo Life Made WI-Fi Touchscreen Photo Frame, e podemos ver que a classificação é 19. Isso está claramente desativado porque a classificação máxima para um aplicativo Google Play é 5 (como mencionado na seção de discussões, este problema é causado por um valor ausente na coluna 'Categoria'). Como consequência, excluiremos esta linha." 242 | ], 243 | "metadata": { 244 | "id": "k4uSQb29GsPN" 245 | } 246 | }, 247 | { 248 | "cell_type": "code", 249 | "source": [ 250 | "print(len(android))\n", 251 | "del android[10472] # don't run this more than once\n", 252 | "print(len(android))" 253 | ], 254 | "metadata": { 255 | "colab": { 256 | "base_uri": "https://localhost:8080/" 257 | }, 258 | "id": "dz368iTAGxXZ", 259 | "outputId": "9e99aa72-677b-4057-fd4b-7ca12531653e" 260 | }, 261 | "execution_count": 6, 262 | "outputs": [ 263 | { 264 | "output_type": "stream", 265 | "name": "stdout", 266 | "text": [ 267 | "10841\n", 268 | "10840\n" 269 | ] 270 | } 271 | ] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "source": [ 276 | "## Removendo entradas duplicadas\n", 277 | "### Parte 1:\n", 278 | "Se explorarmos o conjunto de dados do Google Play por tempo suficiente, descobriremos que alguns aplicativos têm mais de uma entrada. Por exemplo, o aplicativo Instagram tem quatro entradas:" 279 | ], 280 | "metadata": { 281 | "id": "_d6KM74UG1AD" 282 | } 283 | }, 284 | { 285 | "cell_type": "code", 286 | "source": [ 287 | "for app in android:\n", 288 | " name = app[0]\n", 289 | " if name == 'Instagram':\n", 290 | " print(app)" 291 | ], 292 | "metadata": { 293 | "colab": { 294 | "base_uri": "https://localhost:8080/" 295 | }, 296 | "id": "I3iGd7xtG4f3", 297 | "outputId": "34b1b987-9ced-45f5-e0c5-2c17066c86d1" 298 | }, 299 | "execution_count": 7, 300 | "outputs": [ 301 | { 302 | "output_type": "stream", 303 | "name": "stdout", 304 | "text": [ 305 | "['Instagram', 'SOCIAL', '4.5', '66577313', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']\n", 306 | "['Instagram', 'SOCIAL', '4.5', '66577446', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']\n", 307 | "['Instagram', 'SOCIAL', '4.5', '66577313', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']\n", 308 | "['Instagram', 'SOCIAL', '4.5', '66509917', 'Varies with device', '1,000,000,000+', 'Free', '0', 'Teen', 'Social', 'July 31, 2018', 'Varies with device', 'Varies with device']\n" 309 | ] 310 | } 311 | ] 312 | }, 313 | { 314 | "cell_type": "markdown", 315 | "source": [ 316 | "No total, há 1.181 casos em que um aplicativo ocorre mais de uma vez:" 317 | ], 318 | "metadata": { 319 | "id": "Eg54sXX8G7S7" 320 | } 321 | }, 322 | { 323 | "cell_type": "code", 324 | "source": [ 325 | "duplicate_apps = []\n", 326 | "unique_apps = []\n", 327 | "\n", 328 | "for app in android:\n", 329 | " name = app[0]\n", 330 | " if name in unique_apps:\n", 331 | " duplicate_apps.append(name)\n", 332 | " else:\n", 333 | " unique_apps.append(name)\n", 334 | " \n", 335 | "print('Number of duplicate apps:', len(duplicate_apps))\n", 336 | "print('\\n')\n", 337 | "print('Examples of duplicate apps:', duplicate_apps[:15])" 338 | ], 339 | "metadata": { 340 | "colab": { 341 | "base_uri": "https://localhost:8080/" 342 | }, 343 | "id": "1hFP6NDwG-NC", 344 | "outputId": "7b62bf66-ca1b-4858-d58d-439a4ef76e2f" 345 | }, 346 | "execution_count": 8, 347 | "outputs": [ 348 | { 349 | "output_type": "stream", 350 | "name": "stdout", 351 | "text": [ 352 | "Number of duplicate apps: 1181\n", 353 | "\n", 354 | "\n", 355 | "Examples of duplicate apps: ['Quick PDF Scanner + OCR FREE', 'Box', 'Google My Business', 'ZOOM Cloud Meetings', 'join.me - Simple Meetings', 'Box', 'Zenefits', 'Google Ads', 'Google My Business', 'Slack', 'FreshBooks Classic', 'Insightly CRM', 'QuickBooks Accounting: Invoicing & Expenses', 'HipChat - Chat Built for Teams', 'Xero Accounting Software']\n" 356 | ] 357 | } 358 | ] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "source": [ 363 | "Não queremos contar determinados aplicativos mais de uma vez ao analisar os dados, portanto, precisamos remover as entradas duplicadas e manter apenas uma entrada por aplicativo. Uma coisa que poderíamos fazer é remover as linhas duplicadas aleatoriamente, mas provavelmente poderíamos encontrar uma maneira melhor.\n", 364 | "\n", 365 | "Se você examinar as linhas que imprimimos duas células acima para o aplicativo Instagram, a principal diferença acontece na quarta posição de cada linha, que corresponde ao número de avaliações. Os diferentes números mostram que os dados foram coletados em momentos diferentes. Podemos usar isso para construir um critério para manter as linhas. Não removeremos linhas aleatoriamente, mas manteremos as linhas com o maior número de avaliações, pois quanto maior o número de avaliações, mais confiáveis ​​serão as classificações.\n", 366 | "\n", 367 | "Para isso, iremos:\n", 368 | "\n", 369 | "Crie um dicionário em que cada chave seja um nome de aplicativo exclusivo e o valor seja o maior número de avaliações desse aplicativo\n", 370 | "Use o dicionário para criar um novo conjunto de dados, que terá apenas uma entrada por aplicativo (e selecionamos apenas os aplicativos com maior número de avaliações)" 371 | ], 372 | "metadata": { 373 | "id": "_BYH93y4HPns" 374 | } 375 | }, 376 | { 377 | "cell_type": "markdown", 378 | "source": [ 379 | "### Parte dois\n", 380 | "\n", 381 | "Vamos começar construindo o dicionário." 382 | ], 383 | "metadata": { 384 | "id": "rW_btw0IHUGh" 385 | } 386 | }, 387 | { 388 | "cell_type": "code", 389 | "source": [ 390 | "reviews_max = {}\n", 391 | "\n", 392 | "for app in android:\n", 393 | " name = app[0]\n", 394 | " n_reviews = float(app[3])\n", 395 | " \n", 396 | " if name in reviews_max and reviews_max[name] < n_reviews:\n", 397 | " reviews_max[name] = n_reviews\n", 398 | " \n", 399 | " elif name not in reviews_max:\n", 400 | " reviews_max[name] = n_reviews" 401 | ], 402 | "metadata": { 403 | "id": "clhfRx3aG_xK" 404 | }, 405 | "execution_count": 9, 406 | "outputs": [] 407 | }, 408 | { 409 | "cell_type": "code", 410 | "source": [ 411 | "print('Expected length:', len(android) - 1181)\n", 412 | "print('Actual length:', len(reviews_max))" 413 | ], 414 | "metadata": { 415 | "colab": { 416 | "base_uri": "https://localhost:8080/" 417 | }, 418 | "id": "w8jcc-rTHYpE", 419 | "outputId": "16cf90b1-69ef-477a-96cb-18d32cc2e715" 420 | }, 421 | "execution_count": 10, 422 | "outputs": [ 423 | { 424 | "output_type": "stream", 425 | "name": "stdout", 426 | "text": [ 427 | "Expected length: 9659\n", 428 | "Actual length: 9659\n" 429 | ] 430 | } 431 | ] 432 | }, 433 | { 434 | "cell_type": "code", 435 | "source": [ 436 | "android_clean = []\n", 437 | "already_added = []\n", 438 | "\n", 439 | "for app in android:\n", 440 | " name = app[0]\n", 441 | " n_reviews = float(app[3])\n", 442 | " \n", 443 | " if (reviews_max[name] == n_reviews) and (name not in already_added):\n", 444 | " android_clean.append(app)\n", 445 | " already_added.append(name) # make sure this is inside the if block" 446 | ], 447 | "metadata": { 448 | "id": "f4p8utkxHao0" 449 | }, 450 | "execution_count": 11, 451 | "outputs": [] 452 | }, 453 | { 454 | "cell_type": "code", 455 | "source": [ 456 | "explore_data(android_clean, 0, 3, True)" 457 | ], 458 | "metadata": { 459 | "colab": { 460 | "base_uri": "https://localhost:8080/" 461 | }, 462 | "id": "2_KEfiCgHb-o", 463 | "outputId": "1e1b038e-4f79-4709-80a2-8a8031d310e8" 464 | }, 465 | "execution_count": 12, 466 | "outputs": [ 467 | { 468 | "output_type": "stream", 469 | "name": "stdout", 470 | "text": [ 471 | "['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up']\n", 472 | "\n", 473 | "\n", 474 | "['U Launcher Lite – FREE Live Cool Themes, Hide Apps', 'ART_AND_DESIGN', '4.7', '87510', '8.7M', '5,000,000+', 'Free', '0', 'Everyone', 'Art & Design', 'August 1, 2018', '1.2.4', '4.0.3 and up']\n", 475 | "\n", 476 | "\n", 477 | "['Sketch - Draw & Paint', 'ART_AND_DESIGN', '4.5', '215644', '25M', '50,000,000+', 'Free', '0', 'Teen', 'Art & Design', 'June 8, 2018', 'Varies with device', '4.2 and up']\n", 478 | "\n", 479 | "\n", 480 | "Number of rows: 9659\n", 481 | "Number of columns: 13\n" 482 | ] 483 | } 484 | ] 485 | }, 486 | { 487 | "cell_type": "markdown", 488 | "source": [ 489 | "## Removendo aplicativos que não estão em inglês\n", 490 | "### Parte um\n", 491 | "Se você explorar os conjuntos de dados o suficiente, notará que os nomes de alguns dos aplicativos sugerem que eles não são direcionados a um público que fala inglês. Abaixo, vemos alguns exemplos de ambos os conjuntos de dados:" 492 | ], 493 | "metadata": { 494 | "id": "di6_8AXMLIYM" 495 | } 496 | }, 497 | { 498 | "cell_type": "code", 499 | "source": [ 500 | "print(ios[813][1])\n", 501 | "print(ios[6731][1])\n", 502 | "\n", 503 | "print(android_clean[4412][0])\n", 504 | "print(android_clean[7940][0])" 505 | ], 506 | "metadata": { 507 | "colab": { 508 | "base_uri": "https://localhost:8080/" 509 | }, 510 | "id": "oh3XTWa1HdM3", 511 | "outputId": "d5902f3f-13a4-4a09-a336-a1478587afbb" 512 | }, 513 | "execution_count": 13, 514 | "outputs": [ 515 | { 516 | "output_type": "stream", 517 | "name": "stdout", 518 | "text": [ 519 | "爱奇艺PPS -《欢乐颂2》电视剧热播\n", 520 | "【脱出ゲーム】絶対に最後までプレイしないで 〜謎解き&ブロックパズル〜\n", 521 | "中国語 AQリスニング\n", 522 | "لعبة تقدر تربح DZ\n" 523 | ] 524 | } 525 | ] 526 | }, 527 | { 528 | "cell_type": "markdown", 529 | "source": [ 530 | "Não estamos interessados em manter esse tipo de aplicativo, então vamos removê-los. Uma maneira de fazer isso é remover cada aplicativo cujo nome contém um símbolo que não é comumente usado em texto em inglês – o texto em inglês geralmente inclui letras do alfabeto inglês, números compostos por dígitos de 0 a 9, sinais de pontuação (., ! , ?, ;, etc.) e outros símbolos (+, *, /, etc.).\n", 531 | "\n", 532 | "Todos esses caracteres específicos para textos em inglês são codificados usando o padrão ASCII. Cada caractere ASCII tem um número correspondente entre 0 e 127 associado a ele, e podemos aproveitar isso para construir uma função que verifica o nome de um aplicativo e nos informa se ele contém caracteres não ASCII.\n", 533 | "\n", 534 | "Construímos esta função abaixo e usamos a função ord() integrada para descobrir o número de codificação correspondente de cada caractere." 535 | ], 536 | "metadata": { 537 | "id": "CAups-ZsLSig" 538 | } 539 | }, 540 | { 541 | "cell_type": "code", 542 | "source": [ 543 | "def is_english(string):\n", 544 | " \n", 545 | " for character in string:\n", 546 | " if ord(character) > 127:\n", 547 | " return False\n", 548 | " \n", 549 | " return True\n", 550 | "\n", 551 | "print(is_english('Instagram'))\n", 552 | "print(is_english('爱奇艺PPS -《欢乐颂2》电视剧热播'))" 553 | ], 554 | "metadata": { 555 | "colab": { 556 | "base_uri": "https://localhost:8080/" 557 | }, 558 | "id": "agzLORklLQ_S", 559 | "outputId": "4ac987d5-83c8-4093-e9af-e51df691d088" 560 | }, 561 | "execution_count": 14, 562 | "outputs": [ 563 | { 564 | "output_type": "stream", 565 | "name": "stdout", 566 | "text": [ 567 | "True\n", 568 | "False\n" 569 | ] 570 | } 571 | ] 572 | }, 573 | { 574 | "cell_type": "code", 575 | "source": [ 576 | "print(is_english('Docs To Go™ Free Office Suite'))\n", 577 | "print(is_english('Instachat 😜'))\n", 578 | "\n", 579 | "print(ord('™'))\n", 580 | "print(ord('😜'))" 581 | ], 582 | "metadata": { 583 | "colab": { 584 | "base_uri": "https://localhost:8080/" 585 | }, 586 | "id": "SZP8FjTZLcVD", 587 | "outputId": "aa1b4237-e556-4b7b-ae42-d2f6b4ad0566" 588 | }, 589 | "execution_count": 15, 590 | "outputs": [ 591 | { 592 | "output_type": "stream", 593 | "name": "stdout", 594 | "text": [ 595 | "False\n", 596 | "False\n", 597 | "8482\n", 598 | "128540\n" 599 | ] 600 | } 601 | ] 602 | }, 603 | { 604 | "cell_type": "markdown", 605 | "source": [ 606 | "### Parte dois\n", 607 | "Para minimizar o impacto da perda de dados, só removeremos um aplicativo se seu nome tiver mais de três caracteres não ASCII:" 608 | ], 609 | "metadata": { 610 | "id": "uBG136k0LerR" 611 | } 612 | }, 613 | { 614 | "cell_type": "code", 615 | "source": [ 616 | "def is_english(string):\n", 617 | " non_ascii = 0\n", 618 | " \n", 619 | " for character in string:\n", 620 | " if ord(character) > 127:\n", 621 | " non_ascii += 1\n", 622 | " \n", 623 | " if non_ascii > 3:\n", 624 | " return False\n", 625 | " else:\n", 626 | " return True\n", 627 | "\n", 628 | "print(is_english('Docs To Go™ Free Office Suite'))\n", 629 | "print(is_english('Instachat 😜'))" 630 | ], 631 | "metadata": { 632 | "colab": { 633 | "base_uri": "https://localhost:8080/" 634 | }, 635 | "id": "kcztVHYfLd0u", 636 | "outputId": "46b65e39-92a9-4c35-e126-bf9f812515a2" 637 | }, 638 | "execution_count": 16, 639 | "outputs": [ 640 | { 641 | "output_type": "stream", 642 | "name": "stdout", 643 | "text": [ 644 | "True\n", 645 | "True\n" 646 | ] 647 | } 648 | ] 649 | }, 650 | { 651 | "cell_type": "code", 652 | "source": [ 653 | "android_english = []\n", 654 | "ios_english = []\n", 655 | "\n", 656 | "for app in android_clean:\n", 657 | " name = app[0]\n", 658 | " if is_english(name):\n", 659 | " android_english.append(app)\n", 660 | " \n", 661 | "for app in ios:\n", 662 | " name = app[1]\n", 663 | " if is_english(name):\n", 664 | " ios_english.append(app)\n", 665 | " \n", 666 | "explore_data(android_english, 0, 3, True)\n", 667 | "print('\\n')\n", 668 | "explore_data(ios_english, 0, 3, True)" 669 | ], 670 | "metadata": { 671 | "colab": { 672 | "base_uri": "https://localhost:8080/" 673 | }, 674 | "id": "ZFTxtK3kLj7H", 675 | "outputId": "140a37bd-1deb-475b-c4b3-897b44dd8f5d" 676 | }, 677 | "execution_count": 17, 678 | "outputs": [ 679 | { 680 | "output_type": "stream", 681 | "name": "stdout", 682 | "text": [ 683 | "['Photo Editor & Candy Camera & Grid & ScrapBook', 'ART_AND_DESIGN', '4.1', '159', '19M', '10,000+', 'Free', '0', 'Everyone', 'Art & Design', 'January 7, 2018', '1.0.0', '4.0.3 and up']\n", 684 | "\n", 685 | "\n", 686 | "['U Launcher Lite – FREE Live Cool Themes, Hide Apps', 'ART_AND_DESIGN', '4.7', '87510', '8.7M', '5,000,000+', 'Free', '0', 'Everyone', 'Art & Design', 'August 1, 2018', '1.2.4', '4.0.3 and up']\n", 687 | "\n", 688 | "\n", 689 | "['Sketch - Draw & Paint', 'ART_AND_DESIGN', '4.5', '215644', '25M', '50,000,000+', 'Free', '0', 'Teen', 'Art & Design', 'June 8, 2018', 'Varies with device', '4.2 and up']\n", 690 | "\n", 691 | "\n", 692 | "Number of rows: 9614\n", 693 | "Number of columns: 13\n", 694 | "\n", 695 | "\n", 696 | "['284882215', 'Facebook', '389879808', 'USD', '0.0', '2974676', '212', '3.5', '3.5', '95.0', '4+', 'Social Networking', '37', '1', '29', '1']\n", 697 | "\n", 698 | "\n", 699 | "['389801252', 'Instagram', '113954816', 'USD', '0.0', '2161558', '1289', '4.5', '4.0', '10.23', '12+', 'Photo & Video', '37', '0', '29', '1']\n", 700 | "\n", 701 | "\n", 702 | "['529479190', 'Clash of Clans', '116476928', 'USD', '0.0', '2130805', '579', '4.5', '4.5', '9.24.12', '9+', 'Games', '38', '5', '18', '1']\n", 703 | "\n", 704 | "\n", 705 | "Number of rows: 6183\n", 706 | "Number of columns: 16\n" 707 | ] 708 | } 709 | ] 710 | }, 711 | { 712 | "cell_type": "markdown", 713 | "source": [ 714 | "Podemos ver que ficamos com 9614 aplicativos Android e 6183 aplicativos iOS." 715 | ], 716 | "metadata": { 717 | "id": "FQG6nCnxO4-7" 718 | } 719 | }, 720 | { 721 | "cell_type": "markdown", 722 | "source": [ 723 | "## Isolando os aplicativos gratuitos\n", 724 | "\n", 725 | "Como mencionamos na introdução, criamos apenas aplicativos gratuitos para download e instalação, e nossa principal fonte de receita consiste em anúncios no aplicativo. Nossos conjuntos de dados contêm aplicativos gratuitos e não gratuitos, e precisaremos isolar apenas os aplicativos gratuitos para nossa análise. Abaixo, isolamos os aplicativos gratuitos para ambos os conjuntos de dados." 726 | ], 727 | "metadata": { 728 | "id": "uHUS_TIMO_9z" 729 | } 730 | }, 731 | { 732 | "cell_type": "code", 733 | "source": [ 734 | "android_final = []\n", 735 | "ios_final = []\n", 736 | "\n", 737 | "for app in android_english:\n", 738 | " price = app[7]\n", 739 | " if price == '0':\n", 740 | " android_final.append(app)\n", 741 | " \n", 742 | "for app in ios_english:\n", 743 | " price = app[4]\n", 744 | " if price == '0.0':\n", 745 | " ios_final.append(app)\n", 746 | " \n", 747 | "print(len(android_final))\n", 748 | "print(len(ios_final))" 749 | ], 750 | "metadata": { 751 | "colab": { 752 | "base_uri": "https://localhost:8080/" 753 | }, 754 | "id": "iOkxYEn6Oz7n", 755 | "outputId": "4cb74174-181f-4695-b0ce-0745c0d88faf" 756 | }, 757 | "execution_count": 18, 758 | "outputs": [ 759 | { 760 | "output_type": "stream", 761 | "name": "stdout", 762 | "text": [ 763 | "8864\n", 764 | "3222\n" 765 | ] 766 | } 767 | ] 768 | }, 769 | { 770 | "cell_type": "markdown", 771 | "source": [ 772 | "Ficamos com 8.864 aplicativos Android e 3.222 aplicativos iOS, o que deve ser suficiente para nossa análise.\n", 773 | "\n", 774 | "## Aplicativos mais comuns por gênero\n", 775 | "### Parte um\n", 776 | "Como mencionamos na introdução, nosso objetivo é determinar os tipos de aplicativos que provavelmente atrairão mais usuários, pois nossa receita é altamente influenciada pelo número de pessoas que usam nossos aplicativos.\n", 777 | "\n", 778 | "Para minimizar riscos e sobrecarga, nossa estratégia de validação para uma ideia de aplicativo é composta por três etapas:\n", 779 | "\n", 780 | "1. Crie uma versão mínima do aplicativo para Android e adicione-a ao Google Play.\n", 781 | "2. Se o aplicativo tiver uma boa resposta dos usuários, nós o desenvolvemos ainda mais.\n", 782 | "3. Se o aplicativo for lucrativo após seis meses, também criamos uma versão iOS do aplicativo e a adicionamos à App Store.\n", 783 | "\n", 784 | "Como nosso objetivo final é adicionar o aplicativo na App Store e no Google Play, precisamos encontrar perfis de aplicativos que sejam bem-sucedidos em ambos os mercados. Por exemplo, um perfil que pode funcionar bem para ambos os mercados pode ser um aplicativo de produtividade que faz uso de gamificação.\n", 785 | "\n", 786 | "Vamos começar a análise entendendo os gêneros mais comuns para cada mercado. Para isso, criaremos uma tabela de frequência para a coluna prime_genre do conjunto de dados da App Store e as colunas Gêneros e Categoria do conjunto de dados do Google Play.\n", 787 | "\n", 788 | "### Parte dois\n", 789 | "Construiremos duas funções que podemos usar para analisar as tabelas de frequência:\n", 790 | "\n", 791 | "Uma função para gerar tabelas de frequência que mostram porcentagens\n", 792 | "Outra função que podemos usar para exibir as porcentagens em ordem decrescente" 793 | ], 794 | "metadata": { 795 | "id": "B5frhmbsP8fP" 796 | } 797 | }, 798 | { 799 | "cell_type": "code", 800 | "source": [ 801 | "def freq_table(dataset, index):\n", 802 | " table = {}\n", 803 | " total = 0\n", 804 | " \n", 805 | " for row in dataset:\n", 806 | " total += 1\n", 807 | " value = row[index]\n", 808 | " if value in table:\n", 809 | " table[value] += 1\n", 810 | " else:\n", 811 | " table[value] = 1\n", 812 | " \n", 813 | " table_percentages = {}\n", 814 | " for key in table:\n", 815 | " percentage = (table[key] / total) * 100\n", 816 | " table_percentages[key] = percentage \n", 817 | " \n", 818 | " return table_percentages\n", 819 | "\n", 820 | "\n", 821 | "def display_table(dataset, index):\n", 822 | " table = freq_table(dataset, index)\n", 823 | " table_display = []\n", 824 | " for key in table:\n", 825 | " key_val_as_tuple = (table[key], key)\n", 826 | " table_display.append(key_val_as_tuple)\n", 827 | " \n", 828 | " table_sorted = sorted(table_display, reverse = True)\n", 829 | " for entry in table_sorted:\n", 830 | " print(entry[1], ':', entry[0])" 831 | ], 832 | "metadata": { 833 | "id": "Sb-tDeAuPFoy" 834 | }, 835 | "execution_count": 19, 836 | "outputs": [] 837 | }, 838 | { 839 | "cell_type": "markdown", 840 | "source": [ 841 | "### Parte TRÊS\n", 842 | "Começamos examinando a tabela de frequência da coluna `prime_genre` do conjunto de dados da App Store." 843 | ], 844 | "metadata": { 845 | "id": "kYH4nU8lbIqi" 846 | } 847 | }, 848 | { 849 | "cell_type": "code", 850 | "source": [ 851 | "display_table(ios_final, -5)" 852 | ], 853 | "metadata": { 854 | "colab": { 855 | "base_uri": "https://localhost:8080/" 856 | }, 857 | "id": "v2xyw1G1bB14", 858 | "outputId": "889d11c1-379d-4547-cddd-25bffc24d7a5" 859 | }, 860 | "execution_count": 20, 861 | "outputs": [ 862 | { 863 | "output_type": "stream", 864 | "name": "stdout", 865 | "text": [ 866 | "Games : 58.16263190564867\n", 867 | "Entertainment : 7.883302296710118\n", 868 | "Photo & Video : 4.9658597144630665\n", 869 | "Education : 3.662321539416512\n", 870 | "Social Networking : 3.2898820608317814\n", 871 | "Shopping : 2.60707635009311\n", 872 | "Utilities : 2.5139664804469275\n", 873 | "Sports : 2.1415270018621975\n", 874 | "Music : 2.0484171322160147\n", 875 | "Health & Fitness : 2.0173805090006205\n", 876 | "Productivity : 1.7380509000620732\n", 877 | "Lifestyle : 1.5828677839851024\n", 878 | "News : 1.3345747982619491\n", 879 | "Travel : 1.2414649286157666\n", 880 | "Finance : 1.1173184357541899\n", 881 | "Weather : 0.8690254500310366\n", 882 | "Food & Drink : 0.8069522036002483\n", 883 | "Reference : 0.5586592178770949\n", 884 | "Business : 0.5276225946617008\n", 885 | "Book : 0.4345127250155183\n", 886 | "Navigation : 0.186219739292365\n", 887 | "Medical : 0.186219739292365\n", 888 | "Catalogs : 0.12414649286157665\n" 889 | ] 890 | } 891 | ] 892 | }, 893 | { 894 | "cell_type": "markdown", 895 | "source": [ 896 | "Podemos ver que entre os aplicativos gratuitos em inglês, mais da metade (58,16%) são jogos. Os aplicativos de entretenimento estão perto de 8%, seguidos pelos aplicativos de foto e vídeo, que estão perto de 5%. Apenas 3,66% dos aplicativos são projetados para educação, seguidos por aplicativos de redes sociais que representam 3,29% dos aplicativos em nosso conjunto de dados.\n", 897 | "\n", 898 | "A impressão geral é que a App Store (pelo menos a parte que contém aplicativos gratuitos em inglês) é dominada por aplicativos que são projetados para diversão (jogos, entretenimento, foto e vídeo, redes sociais, esportes, música etc.), enquanto aplicativos com propósitos (educação, compras, serviços públicos, produtividade, estilo de vida, etc.) são mais raros. No entanto, o fato de os aplicativos divertidos serem os mais numerosos também não implica que eles também tenham o maior número de usuários – a demanda pode não ser a mesma da oferta.\n", 899 | "\n", 900 | "Vamos continuar examinando as colunas Gêneros e Categoria do conjunto de dados do Google Play (duas colunas que parecem estar relacionadas)." 901 | ], 902 | "metadata": { 903 | "id": "ReuAlgnbbScq" 904 | } 905 | }, 906 | { 907 | "cell_type": "code", 908 | "source": [ 909 | "display_table(android_final, 1) # Category" 910 | ], 911 | "metadata": { 912 | "colab": { 913 | "base_uri": "https://localhost:8080/" 914 | }, 915 | "id": "OMhvlKYHbTBF", 916 | "outputId": "b9df3441-2e19-4e2f-ed05-80bd1774f3d8" 917 | }, 918 | "execution_count": 21, 919 | "outputs": [ 920 | { 921 | "output_type": "stream", 922 | "name": "stdout", 923 | "text": [ 924 | "FAMILY : 18.907942238267147\n", 925 | "GAME : 9.724729241877256\n", 926 | "TOOLS : 8.461191335740072\n", 927 | "BUSINESS : 4.591606498194946\n", 928 | "LIFESTYLE : 3.9034296028880866\n", 929 | "PRODUCTIVITY : 3.892148014440433\n", 930 | "FINANCE : 3.7003610108303246\n", 931 | "MEDICAL : 3.531137184115524\n", 932 | "SPORTS : 3.395758122743682\n", 933 | "PERSONALIZATION : 3.3167870036101084\n", 934 | "COMMUNICATION : 3.2378158844765346\n", 935 | "HEALTH_AND_FITNESS : 3.0798736462093865\n", 936 | "PHOTOGRAPHY : 2.944494584837545\n", 937 | "NEWS_AND_MAGAZINES : 2.7978339350180503\n", 938 | "SOCIAL : 2.6624548736462095\n", 939 | "TRAVEL_AND_LOCAL : 2.33528880866426\n", 940 | "SHOPPING : 2.2450361010830324\n", 941 | "BOOKS_AND_REFERENCE : 2.1435018050541514\n", 942 | "DATING : 1.861462093862816\n", 943 | "VIDEO_PLAYERS : 1.7937725631768955\n", 944 | "MAPS_AND_NAVIGATION : 1.3989169675090252\n", 945 | "FOOD_AND_DRINK : 1.2409747292418771\n", 946 | "EDUCATION : 1.1620036101083033\n", 947 | "ENTERTAINMENT : 0.9589350180505415\n", 948 | "LIBRARIES_AND_DEMO : 0.9363718411552346\n", 949 | "AUTO_AND_VEHICLES : 0.9250902527075812\n", 950 | "HOUSE_AND_HOME : 0.8235559566787004\n", 951 | "WEATHER : 0.8009927797833934\n", 952 | "EVENTS : 0.7107400722021661\n", 953 | "PARENTING : 0.6543321299638989\n", 954 | "ART_AND_DESIGN : 0.6430505415162455\n", 955 | "COMICS : 0.6204873646209386\n", 956 | "BEAUTY : 0.5979241877256317\n" 957 | ] 958 | } 959 | ] 960 | }, 961 | { 962 | "cell_type": "code", 963 | "source": [ 964 | "display_table(android_final, -4)" 965 | ], 966 | "metadata": { 967 | "colab": { 968 | "base_uri": "https://localhost:8080/" 969 | }, 970 | "id": "R62KRi9VbUYv", 971 | "outputId": "a91eba98-95ac-4a08-b6f1-8d19865aaab2" 972 | }, 973 | "execution_count": 22, 974 | "outputs": [ 975 | { 976 | "output_type": "stream", 977 | "name": "stdout", 978 | "text": [ 979 | "Tools : 8.449909747292418\n", 980 | "Entertainment : 6.069494584837545\n", 981 | "Education : 5.347472924187725\n", 982 | "Business : 4.591606498194946\n", 983 | "Productivity : 3.892148014440433\n", 984 | "Lifestyle : 3.892148014440433\n", 985 | "Finance : 3.7003610108303246\n", 986 | "Medical : 3.531137184115524\n", 987 | "Sports : 3.463447653429603\n", 988 | "Personalization : 3.3167870036101084\n", 989 | "Communication : 3.2378158844765346\n", 990 | "Action : 3.1024368231046933\n", 991 | "Health & Fitness : 3.0798736462093865\n", 992 | "Photography : 2.944494584837545\n", 993 | "News & Magazines : 2.7978339350180503\n", 994 | "Social : 2.6624548736462095\n", 995 | "Travel & Local : 2.3240072202166067\n", 996 | "Shopping : 2.2450361010830324\n", 997 | "Books & Reference : 2.1435018050541514\n", 998 | "Simulation : 2.0419675090252705\n", 999 | "Dating : 1.861462093862816\n", 1000 | "Arcade : 1.8501805054151623\n", 1001 | "Video Players & Editors : 1.7712093862815883\n", 1002 | "Casual : 1.7599277978339352\n", 1003 | "Maps & Navigation : 1.3989169675090252\n", 1004 | "Food & Drink : 1.2409747292418771\n", 1005 | "Puzzle : 1.128158844765343\n", 1006 | "Racing : 0.9927797833935018\n", 1007 | "Role Playing : 0.9363718411552346\n", 1008 | "Libraries & Demo : 0.9363718411552346\n", 1009 | "Auto & Vehicles : 0.9250902527075812\n", 1010 | "Strategy : 0.9138086642599278\n", 1011 | "House & Home : 0.8235559566787004\n", 1012 | "Weather : 0.8009927797833934\n", 1013 | "Events : 0.7107400722021661\n", 1014 | "Adventure : 0.6768953068592057\n", 1015 | "Comics : 0.6092057761732852\n", 1016 | "Beauty : 0.5979241877256317\n", 1017 | "Art & Design : 0.5979241877256317\n", 1018 | "Parenting : 0.4963898916967509\n", 1019 | "Card : 0.45126353790613716\n", 1020 | "Casino : 0.42870036101083037\n", 1021 | "Trivia : 0.41741877256317694\n", 1022 | "Educational;Education : 0.39485559566787\n", 1023 | "Board : 0.3835740072202166\n", 1024 | "Educational : 0.3722924187725632\n", 1025 | "Education;Education : 0.33844765342960287\n", 1026 | "Word : 0.2594765342960289\n", 1027 | "Casual;Pretend Play : 0.236913357400722\n", 1028 | "Music : 0.2030685920577617\n", 1029 | "Racing;Action & Adventure : 0.16922382671480143\n", 1030 | "Puzzle;Brain Games : 0.16922382671480143\n", 1031 | "Entertainment;Music & Video : 0.16922382671480143\n", 1032 | "Casual;Brain Games : 0.13537906137184114\n", 1033 | "Casual;Action & Adventure : 0.13537906137184114\n", 1034 | "Arcade;Action & Adventure : 0.12409747292418773\n", 1035 | "Action;Action & Adventure : 0.10153429602888085\n", 1036 | "Educational;Pretend Play : 0.09025270758122744\n", 1037 | "Simulation;Action & Adventure : 0.078971119133574\n", 1038 | "Parenting;Education : 0.078971119133574\n", 1039 | "Entertainment;Brain Games : 0.078971119133574\n", 1040 | "Board;Brain Games : 0.078971119133574\n", 1041 | "Parenting;Music & Video : 0.06768953068592057\n", 1042 | "Educational;Brain Games : 0.06768953068592057\n", 1043 | "Casual;Creativity : 0.06768953068592057\n", 1044 | "Art & Design;Creativity : 0.06768953068592057\n", 1045 | "Education;Pretend Play : 0.056407942238267145\n", 1046 | "Role Playing;Pretend Play : 0.04512635379061372\n", 1047 | "Education;Creativity : 0.04512635379061372\n", 1048 | "Role Playing;Action & Adventure : 0.033844765342960284\n", 1049 | "Puzzle;Action & Adventure : 0.033844765342960284\n", 1050 | "Entertainment;Creativity : 0.033844765342960284\n", 1051 | "Entertainment;Action & Adventure : 0.033844765342960284\n", 1052 | "Educational;Creativity : 0.033844765342960284\n", 1053 | "Educational;Action & Adventure : 0.033844765342960284\n", 1054 | "Education;Music & Video : 0.033844765342960284\n", 1055 | "Education;Brain Games : 0.033844765342960284\n", 1056 | "Education;Action & Adventure : 0.033844765342960284\n", 1057 | "Adventure;Action & Adventure : 0.033844765342960284\n", 1058 | "Video Players & Editors;Music & Video : 0.02256317689530686\n", 1059 | "Sports;Action & Adventure : 0.02256317689530686\n", 1060 | "Simulation;Pretend Play : 0.02256317689530686\n", 1061 | "Puzzle;Creativity : 0.02256317689530686\n", 1062 | "Music;Music & Video : 0.02256317689530686\n", 1063 | "Entertainment;Pretend Play : 0.02256317689530686\n", 1064 | "Casual;Education : 0.02256317689530686\n", 1065 | "Board;Action & Adventure : 0.02256317689530686\n", 1066 | "Video Players & Editors;Creativity : 0.01128158844765343\n", 1067 | "Trivia;Education : 0.01128158844765343\n", 1068 | "Travel & Local;Action & Adventure : 0.01128158844765343\n", 1069 | "Tools;Education : 0.01128158844765343\n", 1070 | "Strategy;Education : 0.01128158844765343\n", 1071 | "Strategy;Creativity : 0.01128158844765343\n", 1072 | "Strategy;Action & Adventure : 0.01128158844765343\n", 1073 | "Simulation;Education : 0.01128158844765343\n", 1074 | "Role Playing;Brain Games : 0.01128158844765343\n", 1075 | "Racing;Pretend Play : 0.01128158844765343\n", 1076 | "Puzzle;Education : 0.01128158844765343\n", 1077 | "Parenting;Brain Games : 0.01128158844765343\n", 1078 | "Music & Audio;Music & Video : 0.01128158844765343\n", 1079 | "Lifestyle;Pretend Play : 0.01128158844765343\n", 1080 | "Lifestyle;Education : 0.01128158844765343\n", 1081 | "Health & Fitness;Education : 0.01128158844765343\n", 1082 | "Health & Fitness;Action & Adventure : 0.01128158844765343\n", 1083 | "Entertainment;Education : 0.01128158844765343\n", 1084 | "Communication;Creativity : 0.01128158844765343\n", 1085 | "Comics;Creativity : 0.01128158844765343\n", 1086 | "Casual;Music & Video : 0.01128158844765343\n", 1087 | "Card;Action & Adventure : 0.01128158844765343\n", 1088 | "Books & Reference;Education : 0.01128158844765343\n", 1089 | "Art & Design;Pretend Play : 0.01128158844765343\n", 1090 | "Art & Design;Action & Adventure : 0.01128158844765343\n", 1091 | "Arcade;Pretend Play : 0.01128158844765343\n", 1092 | "Adventure;Education : 0.01128158844765343\n" 1093 | ] 1094 | } 1095 | ] 1096 | } 1097 | ] 1098 | } -------------------------------------------------------------------------------- /parte_1_introducao_python/variaveis.md: -------------------------------------------------------------------------------- 1 | ## Variáveis 2 | 3 | Em Python, não é necessário declarar o tipo de uma variável, mas o interpretador irá verificar o tipo da variável em tempo de execução. 4 | 5 | Além disso, o interpretador não faz correções automáticas entre tipos incompatíveis. Para realizar a operação entre tipos não compatíveis, é necessário converter explicitamente o tipo da variável ou variáveis antes da operação. 6 | 7 | ### Declaração de variáveis 8 | 9 | Em Python, a declaração de variáveis é feita da seguinte forma: 10 | 11 | ```python 12 | nome_da_variavel = valor_da_variavel 13 | ``` 14 | 15 | ### Tipos de variáveis 16 | 17 | Em Python, existem os seguintes tipos de variáveis: 18 | 19 | * Inteiro (int) 20 | * Real (float) 21 | * String (str) 22 | * Booleano (bool) 23 | * Complexo (complex) 24 | * Lista (list) 25 | * Tupla (tuple) 26 | * Dicionário (dict) 27 | * Conjunto (set) 28 | 29 | #### Inteiro (int) 30 | 31 | O tipo inteiro é utilizado para representar números inteiros, ou seja, números sem casas decimais. Em Python, não existe limite para o tamanho de um número inteiro. 32 | 33 | ```python 34 | inteiro = 10 35 | ``` 36 | 37 | #### Real (float) 38 | 39 | O tipo real é utilizado para representar números reais, ou seja, números com casas decimais. Em Python, não existe limite para o tamanho de um número real. 40 | 41 | ```python 42 | 43 | real = 10.5 44 | ``` 45 | 46 | #### String (str) 47 | 48 | O tipo string é utilizado para representar textos. Em Python, não existe limite para o tamanho de uma string. 49 | 50 | ```python 51 | string = "Olá, mundo!" 52 | ``` 53 | 54 | #### Booleano (bool) 55 | 56 | O tipo booleano é utilizado para representar valores lógicos, ou seja, verdadeiro ou falso. Em Python, o valor verdadeiro é representado por True e o valor falso é representado por False. 57 | 58 | ```python 59 | booleano = True 60 | ``` 61 | 62 | #### Complexo (complex) 63 | 64 | O tipo complexo é utilizado para representar números complexos, ou seja, números que possuem parte real e parte imaginária. Em Python, não existe limite para o tamanho de um número complexo. 65 | 66 | ```python 67 | complexo = 10 + 5j 68 | ``` 69 | 70 | #### Lista (list) 71 | 72 | O tipo lista é utilizado para representar uma coleção de valores. Em Python, uma lista pode conter valores de tipos diferentes. 73 | 74 | ```python 75 | lista = [1, 2, 3, 4, 5] 76 | ``` 77 | 78 | Para remover um elemento de uma lista, basta utilizar o método remove(). 79 | 80 | ```python 81 | lista.remove(3) 82 | ``` 83 | 84 | Para adicionar um elemento em uma lista, basta utilizar o método append(). 85 | 86 | ```python 87 | lista.append(6) 88 | ``` 89 | 90 | #### Tupla (tuple) 91 | 92 | Assim como as listas, o tipo tupla é utilizado para representar uma coleção de valores. Porém, as tuplas são imutáveis, ou seja, não é possível adicionar, remover ou alterar valores de uma tupla. 93 | 94 | ```python 95 | tupla = (1, 2, 3, 4, 5) 96 | ``` 97 | 98 | Após a criação de uma tupla, não é possível alterar valores. 99 | 100 | 101 | 102 | #### Dicionário (dict) 103 | 104 | O tipo dicionário é utilizado para representar uma coleção de valores. Em Python, um dicionário é composto por pares de chave e valor. 105 | 106 | ```python 107 | dicionario = {"nome": "João", "idade": 20} 108 | ``` 109 | 110 | #### Conjunto (set) 111 | 112 | O tipo conjunto é utilizado para representar uma coleção de valores. Em Python, um conjunto não permite valores duplicados. 113 | 114 | ```python 115 | conjunto = {1, 2, 3, 4, 5} 116 | ``` 117 | 118 | ## Operadores 119 | 120 | Em Python, existem os seguintes operadores: 121 | 122 | * Aritméticos 123 | * Relacionais 124 | * Lógicos 125 | * Atribuição 126 | * Identidade 127 | * Membro 128 | * Bitwise 129 | 130 | ### Aritméticos 131 | 132 | Os operadores aritméticos são utilizados para realizar operações aritméticas. 133 | 134 | | Operador | Descrição | Exemplo | 135 | | --- | --- | --- | 136 | | + | Adição | 10 + 5 | 137 | | - | Subtração | 10 - 5 | 138 | | * | Multiplicação | 10 * 5 | 139 | | / | Divisão | 10 / 5 | 140 | | % | Módulo | 10 % 5 | 141 | | // | Divisão inteira | 10 // 5 | 142 | | ** | Exponenciação | 10 ** 5 | 143 | 144 | ### Relacionais 145 | 146 | Os operadores relacionais são utilizados para realizar comparações entre valores. 147 | 148 | | Operador | Descrição | Exemplo | 149 | | --- | --- | --- | 150 | | == | Igual | 10 == 5 | 151 | | != | Diferente | 10 != 5 | 152 | 153 | ### Lógicos 154 | 155 | Os operadores lógicos são utilizados para realizar operações lógicas. 156 | 157 | | Operador | Descrição | Exemplo | 158 | | --- | --- | --- | 159 | | and | E | 10 and 5 | 160 | | or | Ou | 10 or 5 | 161 | | not | Não | not 10 | 162 | 163 | ### Atribuição 164 | 165 | Os operadores de atribuição são utilizados para atribuir valores a variáveis. 166 | 167 | | Operador | Descrição | Exemplo | 168 | | --- | --- | --- | 169 | | = | Atribuição | x = 10 | 170 | | += | Atribuição de adição | x += 10 | 171 | | -= | Atribuição de subtração | x -= 10 | 172 | | *= | Atribuição de multiplicação | x *= 10 | 173 | 174 | ### Identidade 175 | 176 | Os operadores de identidade são utilizados para verificar se duas variáveis são iguais ou diferentes. 177 | 178 | | Operador | Descrição | Exemplo | 179 | | --- | --- | --- | 180 | | is | Igual | x is y | 181 | | is not | Diferente | x is not y | 182 | 183 | ### Membro 184 | 185 | Os operadores de membro são utilizados para verificar se um valor pertence a uma coleção. 186 | 187 | | Operador | Descrição | Exemplo | 188 | | --- | --- | --- | 189 | | in | Pertence | x in y | 190 | | not in | Não pertence | x not in y | 191 | 192 | ### Bitwise 193 | 194 | Os operadores bitwise são utilizados para realizar operações bitwise. 195 | 196 | | Operador | Descrição | Exemplo | 197 | | --- | --- | --- | 198 | | & | AND | 10 & 5 | 199 | | \| | OR | 10 \| 5 | 200 | | ^ | XOR | 10 ^ 5 | 201 | | ~ | NOT | ~10 | 202 | | << | Deslocamento à esquerda | 10 << 5 | 203 | | >> | Deslocamento à direita | 10 >> 5 | 204 | 205 | -------------------------------------------------------------------------------- /parte_2_analise_dados/README.md: -------------------------------------------------------------------------------- 1 | # Análise e visualização de dados machine learning 2 | 3 | 1. [NumPy](https://github.com/cilab-ufersa/introduction_machine_learning/blob/develop/parte_2_analise_dados/numpy.md) 4 | 2. [Pandas](https://github.com/cilab-ufersa/introduction_machine_learning/blob/develop/parte_2_analise_dados/pandas.md) 5 | 3. [Matplotlib](https://github.com/cilab-ufersa/introduction_machine_learning/blob/develop/parte_2_analise_dados/matplotlib.md) 6 | 7 | - [Projeto 02](https://github.com/cilab-ufersa/introduction_machine_learning/tree/develop/parte_2_analise_dados/projeto_02) 8 | 9 | - [Projeto 03](https://github.com/cilab-ufersa/introduction_machine_learning/tree/develop/parte_2_analise_dados/projeto_3) 10 | 11 | No processo de aprendizado de máquina, a análise e visualização de dados é uma das etapas mais importantes. É nessa etapa que você vai entender melhor os dados que você está trabalhando, e vai conseguir identificar possíveis problemas que podem atrapalhar o seu modelo de aprendizado de máquina. 12 | 13 | 14 | Existem algumas bibliotecas que podem te ajudar nessa etapa, como o Pandas, Matplotlib, Numpy e Seaborn. Nesse curso, vamos usar o Pandas, Numpy e Matplotlib para fazer a análise e visualização dos dados. 15 | 16 | Você pode consultar a documentação do Pandas [aqui](https://pandas.pydata.org/pandas-docs/stable/), do Numpy [aqui](https://numpy.org/doc/stable/) e do Matplotlib [aqui](https://matplotlib.org/contents.html). 17 | 18 | --- 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /parte_2_analise_dados/exemplo01.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "execution_count": null, 20 | "metadata": { 21 | "id": "vDypz-wxNnsj", 22 | "colab": { 23 | "base_uri": "https://localhost:8080/", 24 | "height": 143 25 | }, 26 | "outputId": "eb201604-689b-475b-b083-1b4c9b45f661" 27 | }, 28 | "outputs": [ 29 | { 30 | "output_type": "execute_result", 31 | "data": { 32 | "text/plain": [ 33 | " Name Age Sex maior_idade\n", 34 | "0 Pedro Henrique 22 male True\n", 35 | "1 Alan Malagueta 35 male True\n", 36 | "2 Maria Eunalia 58 female True" 37 | ], 38 | "text/html": [ 39 | "\n", 40 | "
\n", 41 | "
\n", 42 | "
\n", 43 | "\n", 56 | "\n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | "
NameAgeSexmaior_idade
0Pedro Henrique22maleTrue
1Alan Malagueta35maleTrue
2Maria Eunalia58femaleTrue
\n", 90 | "
\n", 91 | " \n", 101 | " \n", 102 | " \n", 139 | "\n", 140 | " \n", 164 | "
\n", 165 | "
\n", 166 | " " 167 | ] 168 | }, 169 | "metadata": {}, 170 | "execution_count": 28 171 | } 172 | ], 173 | "source": [ 174 | "# Minicurso Machine Learning - Aula Pandas\n", 175 | "## Prof. José Ferdinandy Silva Chagas\n", 176 | "\n", 177 | "import pandas as pd\n", 178 | "import numpy as np\n", 179 | "\n", 180 | "## Criando um DataFrame\n", 181 | "\n", 182 | "dados = pd.DataFrame(\n", 183 | " {\n", 184 | " \"Name\": [\n", 185 | " \"Pedro Henrique\",\n", 186 | " \"Alan Malagueta\",\n", 187 | " \"Maria Eunalia\",\n", 188 | " ],\n", 189 | " \"Age\": [22, 35, 58],\n", 190 | " \"Sex\": [\"male\", \"male\", \"female\"],\n", 191 | " }\n", 192 | ")\n", 193 | "\n", 194 | "# ## Series\n", 195 | "# dados['Age']\n", 196 | "\n", 197 | "# ## Maior valor\n", 198 | "# dados['Age'].max()\n", 199 | "\n", 200 | "# ## Atribuindo a uma variável\n", 201 | "# ages = dados['Age']\n", 202 | "\n", 203 | "# ages.max()\n", 204 | "\n", 205 | "# ## Média de Idades\n", 206 | "\n", 207 | "# ages.mean()\n", 208 | "\n", 209 | "# ## Mediana das Idades\n", 210 | "\n", 211 | "# ages.median()\n", 212 | "\n", 213 | "# ## Resumo das Estatísticas dos Dados\n", 214 | "\n", 215 | "# dados.describe()\n", 216 | "\n", 217 | "# ## Subconjunto de dados (Colunas)\n", 218 | "\n", 219 | "# dados[['Age','Sex']]\n", 220 | "\n", 221 | "\n", 222 | "# ## Subconjunto de dados (Linhas)\n", 223 | "\n", 224 | "# dados[dados['Sex']=='male']\n", 225 | "\n", 226 | "# ## Subconjunto de dados (Linhas e Colunas)\n", 227 | "# dados[dados['Age']<30]\n", 228 | "\n", 229 | "# dados.loc[dados['Age']<50, 'Name']\n", 230 | "\n", 231 | "# dados.iloc[0:2, 1:3]\n", 232 | "\n", 233 | "# ## Formato da tabela\n", 234 | "\n", 235 | "# dados.shape\n", 236 | "\n", 237 | "# # Gerando novos dados para a tabela\n", 238 | "\n", 239 | "# dados['maior_idade'] = dados['Age'] > 18\n", 240 | "\n", 241 | "# dados\n" 242 | ] 243 | } 244 | ] 245 | } -------------------------------------------------------------------------------- /parte_2_analise_dados/exemplo02.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "execution_count": null, 20 | "metadata": { 21 | "colab": { 22 | "base_uri": "https://localhost:8080/" 23 | }, 24 | "id": "rb9ShvKaU92g", 25 | "outputId": "a5298229-6a20-44e3-e9c3-0239ca987deb" 26 | }, 27 | "outputs": [ 28 | { 29 | "output_type": "execute_result", 30 | "data": { 31 | "text/plain": [ 32 | "5250.0" 33 | ] 34 | }, 35 | "metadata": {}, 36 | "execution_count": 38 37 | } 38 | ], 39 | "source": [ 40 | "import pandas as pd\n", 41 | "import matplotlib.pyplot as plt\n", 42 | "\n", 43 | "dados = {'Nome': ['Ana', 'Bruno', 'Carlos', 'Diego', 'Eduarda', 'Fabio', 'Giovana', 'Helena', 'Isabela', 'João'],\n", 44 | "'Cargo': ['Desenvolvedor', 'Analista de Dados', 'Gerente de Projetos', 'Analista de Sistemas', 'Desenvolvedor', 'Analista de Sistemas', 'Gerente de TI', 'Desenvolvedor', 'Analista de Sistemas', 'Analista de Dados'],\n", 45 | "'Data_Contrato': ['01/01/2018', '15/03/2019', '10/05/2016', '22/09/2017', '05/11/2018', '30/06/2019', '18/02/2015', '01/01/2020', '15/03/2018', '10/05/2019'],\n", 46 | "'Sexo': ['Feminino', 'Masculino', 'Masculino', 'Masculino', 'Feminino', 'Masculino', 'Feminino', 'Feminino', 'Feminino', 'Masculino'],\n", 47 | "'Idade': [25, 28, 35, 31, 27, 32, 29, 26, 30, 27],\n", 48 | "'Salario': [5000, 6000, 8000, 7000, 5500, 6500, 10000, 5500, 6500, 6000]}\n", 49 | "\n", 50 | "df = pd.DataFrame(dados)\n", 51 | "\n", 52 | "media_salario = df.loc[df['Idade'] < 27, 'Salario']\n", 53 | "\n", 54 | "media_salario.mean()\n", 55 | "\n" 56 | ] 57 | } 58 | ] 59 | } -------------------------------------------------------------------------------- /parte_2_analise_dados/exempĺo03.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "execution_count": null, 20 | "metadata": { 21 | "id": "QQZEO6V6p0wv", 22 | "colab": { 23 | "base_uri": "https://localhost:8080/", 24 | "height": 206 25 | }, 26 | "outputId": "94a06512-e76a-4063-8ee2-8fd7ed7c86f4" 27 | }, 28 | "outputs": [ 29 | { 30 | "output_type": "execute_result", 31 | "data": { 32 | "text/plain": [ 33 | " Matricula Nome Nota1 Nota2 Nota3 Media Faltas\n", 34 | "14 202315 Paulo Oliveira 5.5 5.5 5.0 5.3 7\n", 35 | "10 202311 Karla Oliveira 9.5 9.0 9.5 9.3 0\n", 36 | "20 202221 Adriana Santos 9.0 9.5 9.0 9.2 0\n", 37 | "24 201925 Eduarda Santos 9.5 9.0 9.5 9.3 0\n", 38 | "30 202031 Karina Oliveira 9.0 9.5 9.0 9.2 0" 39 | ], 40 | "text/html": [ 41 | "\n", 42 | "
\n", 43 | "
\n", 44 | "
\n", 45 | "\n", 58 | "\n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | "
MatriculaNomeNota1Nota2Nota3MediaFaltas
14202315Paulo Oliveira5.55.55.05.37
10202311Karla Oliveira9.59.09.59.30
20202221Adriana Santos9.09.59.09.20
24201925Eduarda Santos9.59.09.59.30
30202031Karina Oliveira9.09.59.09.20
\n", 124 | "
\n", 125 | " \n", 135 | " \n", 136 | " \n", 173 | "\n", 174 | " \n", 198 | "
\n", 199 | "
\n", 200 | " " 201 | ] 202 | }, 203 | "metadata": {}, 204 | "execution_count": 29 205 | } 206 | ], 207 | "source": [ 208 | "import pandas as pd\n", 209 | "import matplotlib.pyplot as plt\n", 210 | "\n", 211 | "dados = pd.read_csv('programacao2023.csv')\n", 212 | "\n", 213 | "subconjunto1 = dados.loc[dados['Media'] < 6]\n", 214 | "\n", 215 | "subconjunto2 = dados.loc[dados['Media'] > 9]\n", 216 | "\n", 217 | "subconjunto3 = pd.concat([subconjunto1, subconjunto2], axis=0)\n", 218 | "\n", 219 | "subconjunto3\n" 220 | ] 221 | } 222 | ] 223 | } -------------------------------------------------------------------------------- /parte_2_analise_dados/functions_numpy.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "source": [ 20 | "O NumPy é uma biblioteca de código aberto para a linguagem de programação Python, que é usada principalmente para computação científica e análise de dados. O NumPy é projetado para trabalhar com matrizes e vetores, tornando-o uma ferramenta poderosa para tarefas como processamento de imagens, aprendizado de máquina e outras áreas de ciência de dados." 21 | ], 22 | "metadata": { 23 | "id": "PWjUdXlM0xEx" 24 | } 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "source": [ 29 | "np.array(): A função np.array() é usada para criar arrays NumPy. Ela pode receber uma lista Python ou uma sequência como entrada e retorna um array NumPy." 30 | ], 31 | "metadata": { 32 | "id": "Mfi2fZr-1xy5" 33 | } 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": null, 38 | "metadata": { 39 | "colab": { 40 | "base_uri": "https://localhost:8080/" 41 | }, 42 | "id": "sTr7INXj0t0f", 43 | "outputId": "bb629333-3f09-46aa-847f-c8ec9c11c91f" 44 | }, 45 | "outputs": [ 46 | { 47 | "output_type": "stream", 48 | "name": "stdout", 49 | "text": [ 50 | "[1 2 3 4 5]\n" 51 | ] 52 | } 53 | ], 54 | "source": [ 55 | "import numpy as np\n", 56 | "\n", 57 | "a = np.array([1, 2, 3, 4, 5])\n", 58 | "print(a)\n" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "source": [ 64 | "Indexação e slicing:\n", 65 | "Você pode acessar elementos específicos de um array NumPy usando a indexação. Por exemplo, a[0] retorna o primeiro elemento do array a. Você também pode usar o slicing para acessar subconjuntos do array, por exemplo, a[1:3] retorna uma nova matriz contendo os elementos 2 e 3 de a." 66 | ], 67 | "metadata": { 68 | "id": "C-kuDOSj1Ebe" 69 | } 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "source": [ 74 | "np.arange(): A função np.arange() é usada para criar um array com valores espaçados uniformemente dentro de um intervalo especificado. Por exemplo, np.arange(0, 10, 2) cria um array com valores 0, 2, 4, 6 e 8." 75 | ], 76 | "metadata": { 77 | "id": "yM4c67yR157U" 78 | } 79 | }, 80 | { 81 | "cell_type": "code", 82 | "source": [ 83 | "# Criando um array com valores espaçados uniformemente\n", 84 | "c = np.arange(0, 10, 2)\n", 85 | "print(c) # output: [0 2 4 6 8]" 86 | ], 87 | "metadata": { 88 | "colab": { 89 | "base_uri": "https://localhost:8080/" 90 | }, 91 | "id": "7ve2kRFs13R3", 92 | "outputId": "b42e4c92-5b40-48cb-9625-a6c7f800678a" 93 | }, 94 | "execution_count": null, 95 | "outputs": [ 96 | { 97 | "output_type": "stream", 98 | "name": "stdout", 99 | "text": [ 100 | "[0 2 4 6 8]\n" 101 | ] 102 | } 103 | ] 104 | }, 105 | { 106 | "cell_type": "markdown", 107 | "source": [ 108 | "np.linspace(): A função np.linspace() é usada para criar um array com valores espaçados uniformemente entre dois limites. Por exemplo, np.linspace(0, 1, 5) cria um array com valores 0, 0.25, 0.5, 0.75 e 1." 109 | ], 110 | "metadata": { 111 | "id": "0VxpQi_V19j6" 112 | } 113 | }, 114 | { 115 | "cell_type": "code", 116 | "source": [ 117 | "# Criando um array com valores espaçados uniformemente entre dois limites\n", 118 | "d = np.linspace(0, 1, 5)\n", 119 | "print(d) # output: [0. 0.25 0.5 0.75 1. ]" 120 | ], 121 | "metadata": { 122 | "colab": { 123 | "base_uri": "https://localhost:8080/" 124 | }, 125 | "id": "55D7w9Vg2Acx", 126 | "outputId": "b8894289-dc29-4fe9-e4e5-b183eb5f290d" 127 | }, 128 | "execution_count": null, 129 | "outputs": [ 130 | { 131 | "output_type": "stream", 132 | "name": "stdout", 133 | "text": [ 134 | "[0. 0.25 0.5 0.75 1. ]\n" 135 | ] 136 | } 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "source": [ 142 | "np.zeros() e np.ones(): As funções np.zeros() e np.ones() são usadas para criar arrays de zeros e uns, respectivamente, com a forma especificada. Por exemplo, np.zeros((3, 4)) cria um array de zeros com a forma 3x4." 143 | ], 144 | "metadata": { 145 | "id": "MQvYHmyH2E3z" 146 | } 147 | }, 148 | { 149 | "cell_type": "code", 150 | "source": [ 151 | "# Criando um array de zeros com forma 3x4\n", 152 | "e = np.zeros((3, 4))\n", 153 | "print(e)\n", 154 | "\n", 155 | "# Criando um array de uns com forma 2x2x2\n", 156 | "f = np.ones((2, 2, 2))\n", 157 | "print(f)" 158 | ], 159 | "metadata": { 160 | "id": "s8jxMFbS2EdS" 161 | }, 162 | "execution_count": null, 163 | "outputs": [] 164 | }, 165 | { 166 | "cell_type": "markdown", 167 | "source": [ 168 | "np.random.rand(): A função np.random.rand() é usada para criar um array de números aleatórios uniformemente distribuídos entre 0 e 1 com a forma especificada. Por exemplo, np.random.rand(2, 3) cria um array de 2x3 com números aleatórios." 169 | ], 170 | "metadata": { 171 | "id": "RywWBUV22MhP" 172 | } 173 | }, 174 | { 175 | "cell_type": "code", 176 | "source": [ 177 | "# Criando um array de números aleatórios uniformemente distribuídos\n", 178 | "# entre 0 e 1 com forma 2x3\n", 179 | "g = np.random.rand(2, 3)\n", 180 | "print(g)" 181 | ], 182 | "metadata": { 183 | "colab": { 184 | "base_uri": "https://localhost:8080/" 185 | }, 186 | "id": "Wfrsnp5m2PVf", 187 | "outputId": "98597f16-fd88-4ae4-f254-3d178a01c9bd" 188 | }, 189 | "execution_count": null, 190 | "outputs": [ 191 | { 192 | "output_type": "stream", 193 | "name": "stdout", 194 | "text": [ 195 | "[[0.4876336 0.67037529 0.27268246]\n", 196 | " [0.37398026 0.18575964 0.42623253]]\n" 197 | ] 198 | } 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "source": [ 204 | "np.reshape(): A função np.reshape() é usada para reorganizar o formato de um array. Por exemplo, np.reshape(a, (2, 3)) reorganiza o array a em uma matriz de 2x3." 205 | ], 206 | "metadata": { 207 | "id": "QB9UUzwe2SYA" 208 | } 209 | }, 210 | { 211 | "cell_type": "code", 212 | "source": [ 213 | "# Reorganizando o formato de um array\n", 214 | "h = np.array([[1, 2, 3], [4, 5, 6]])\n", 215 | "i = np.reshape(h, (3, 2))\n", 216 | "print(i)" 217 | ], 218 | "metadata": { 219 | "colab": { 220 | "base_uri": "https://localhost:8080/" 221 | }, 222 | "id": "LxYjbX6c2VAd", 223 | "outputId": "391dbf46-71bf-49cd-a3a2-ac9e973655ae" 224 | }, 225 | "execution_count": null, 226 | "outputs": [ 227 | { 228 | "output_type": "stream", 229 | "name": "stdout", 230 | "text": [ 231 | "[[1 2]\n", 232 | " [3 4]\n", 233 | " [5 6]]\n" 234 | ] 235 | } 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "source": [ 241 | "np.max(), np.min(), np.mean() e np.std(): As funções np.max(), np.min(), np.mean() e np.std() são usadas para calcular o valor máximo, mínimo, média e desvio padrão de um array NumPy, respectivamente." 242 | ], 243 | "metadata": { 244 | "id": "PalE9xac2Wb8" 245 | } 246 | }, 247 | { 248 | "cell_type": "code", 249 | "source": [ 250 | "# Calculando o valor máximo, mínimo, média e desvio padrão de um array\n", 251 | "j = np.array([1, 2, 3, 4, 5])\n", 252 | "print(np.max(j)) # output: 5\n", 253 | "print(np.min(j)) # output: 1\n", 254 | "print(np.mean(j)) # output: 3.0\n", 255 | "print(np.std(j)) # output: 1.41421356" 256 | ], 257 | "metadata": { 258 | "colab": { 259 | "base_uri": "https://localhost:8080/" 260 | }, 261 | "id": "ZKk0xjwS2Y6-", 262 | "outputId": "73185eaf-beb4-45de-b63e-a4850464ee0c" 263 | }, 264 | "execution_count": null, 265 | "outputs": [ 266 | { 267 | "output_type": "stream", 268 | "name": "stdout", 269 | "text": [ 270 | "5\n", 271 | "1\n", 272 | "3.0\n", 273 | "1.4142135623730951\n" 274 | ] 275 | } 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "source": [ 281 | "np.dot(): A função np.dot() é usada para realizar a multiplicação de matrizes. Por exemplo, np.dot(a, b) realiza a multiplicação de matrizes entre os arrays a e b." 282 | ], 283 | "metadata": { 284 | "id": "_2RjZBt52fB8" 285 | } 286 | }, 287 | { 288 | "cell_type": "code", 289 | "source": [ 290 | "# Realizando a multiplicação de matrizes entre dois arrays\n", 291 | "k = np.array([[1, 2], [3, 4]])\n", 292 | "l = np.array([[5, 6], [7, 8]])\n", 293 | "m = np.dot(k, l)\n", 294 | "print(m)" 295 | ], 296 | "metadata": { 297 | "colab": { 298 | "base_uri": "https://localhost:8080/" 299 | }, 300 | "id": "yqy5s-0P2i-k", 301 | "outputId": "25b94baa-dddc-4639-e15c-8e7b0ed67ffc" 302 | }, 303 | "execution_count": null, 304 | "outputs": [ 305 | { 306 | "output_type": "stream", 307 | "name": "stdout", 308 | "text": [ 309 | "[[19 22]\n", 310 | " [43 50]]\n" 311 | ] 312 | } 313 | ] 314 | }, 315 | { 316 | "cell_type": "markdown", 317 | "source": [ 318 | "np.transpose(): A função np.transpose() é usada para transpor um array. Por exemplo, np.transpose(a) transpõe o array a." 319 | ], 320 | "metadata": { 321 | "id": "o5Vrlb_r2lKY" 322 | } 323 | }, 324 | { 325 | "cell_type": "code", 326 | "source": [ 327 | "# Transpondo um array\n", 328 | "n = np.array([[1, 2], [3, 4]])\n", 329 | "o = np.transpose(n)\n", 330 | "print(o)" 331 | ], 332 | "metadata": { 333 | "colab": { 334 | "base_uri": "https://localhost:8080/" 335 | }, 336 | "id": "oB0pzWH22mDs", 337 | "outputId": "d1bbd0ee-b855-46ca-e4fe-b0d202940130" 338 | }, 339 | "execution_count": null, 340 | "outputs": [ 341 | { 342 | "output_type": "stream", 343 | "name": "stdout", 344 | "text": [ 345 | "[[1 3]\n", 346 | " [2 4]]\n" 347 | ] 348 | } 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "source": [ 354 | "\n", 355 | "a = np.array([1, 2, 3]) # array de uma dimensão\n", 356 | "b = np.array([[1, 2, 3], [4, 5, 6]]) # array de duas dimensões\n", 357 | "c = np.zeros((3, 4)) # array de zeros de 3x4\n", 358 | "d = np.ones((2, 3)) # array de uns de 2x3\n", 359 | "e = np.random.rand(2, 3) # array de números aleatórios de 2x3\n" 360 | ], 361 | "metadata": { 362 | "id": "-TrFcMts02oK" 363 | }, 364 | "execution_count": null, 365 | "outputs": [] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "source": [ 370 | "\n", 371 | "a = np.array([1, 2, 3, 4, 5, 6])\n", 372 | "b = np.reshape(a, (2, 3)) # reshape para um array de 2x3\n" 373 | ], 374 | "metadata": { 375 | "id": "qNF7jSIp1GAB" 376 | }, 377 | "execution_count": null, 378 | "outputs": [] 379 | }, 380 | { 381 | "cell_type": "code", 382 | "source": [ 383 | "a = np.array([1, 2, 3])\n", 384 | "b = np.array([4, 5, 6])\n", 385 | "c = np.concatenate([a, b]) # combinar os arrays a e b\n", 386 | "d = np.stack([a, b]) # empilhar os arrays a e b verticalmente\n" 387 | ], 388 | "metadata": { 389 | "id": "4FeMxSuS1Iho" 390 | }, 391 | "execution_count": null, 392 | "outputs": [] 393 | }, 394 | { 395 | "cell_type": "code", 396 | "source": [], 397 | "metadata": { 398 | "id": "r3AuyAdm1Ldf" 399 | }, 400 | "execution_count": null, 401 | "outputs": [] 402 | } 403 | ] 404 | } 405 | -------------------------------------------------------------------------------- /parte_2_analise_dados/matplotlib.md: -------------------------------------------------------------------------------- 1 | # Biblioteca Matplotlib 2 | 3 | A biblioteca Matplotlib é uma biblioteca de visualização de dados em Python. Ela permite que você crie gráficos de linhas, gráficos de dispersão, histogramas, gráficos de barras, gráficos de pizza, etc. Com ela, você pode criar gráficos de alta qualidade com apenas algumas linhas de código. 4 | 5 | ## Instalação 6 | 7 | Para instalar a biblioteca Matplotlib, basta executar o seguinte comando no terminal: 8 | 9 | ```bash 10 | pip install matplotlib 11 | ``` 12 | 13 | ## Importando a biblioteca 14 | 15 | Para importar a biblioteca Matplotlib, basta executar o seguinte comando: 16 | 17 | ```python 18 | import matplotlib.pyplot as plt 19 | ``` 20 | 21 | ## Criando um gráfico de linha 22 | 23 | Para criar um gráfico de linha, basta executar o seguinte código: 24 | 25 | ```python 26 | import matplotlib.pyplot as plt 27 | 28 | x = [1, 2, 3, 4, 5] 29 | y = [1, 4, 9, 16, 25] 30 | 31 | plt.plot(x, y) 32 | 33 | plt.show() 34 | ``` 35 | 36 | ## Criando um gráfico de dispersão 37 | 38 | Para criar um gráfico de dispersão, basta executar o seguinte código: 39 | 40 | ```python 41 | import matplotlib.pyplot as plt 42 | 43 | x = [1, 2, 3, 4, 5] 44 | y = [1, 4, 9, 16, 25] 45 | 46 | plt.scatter(x, y) 47 | 48 | plt.show() 49 | ``` 50 | 51 | ## %matplotlib inline 52 | 53 | O comando `%matplotlib inline` é usado para mostrar os gráficos no Jupyter Notebook. 54 | 55 | Exemplo: 56 | 57 | ```python 58 | %matplotlib inline 59 | 60 | import matplotlib.pyplot as plt 61 | 62 | x = [1, 2, 3, 4, 5] 63 | y = [1, 4, 9, 16, 25] 64 | 65 | plt.plot(x, y) 66 | ``` 67 | -------------------------------------------------------------------------------- /parte_2_analise_dados/numpy.md: -------------------------------------------------------------------------------- 1 | # Biblioteca Numpy 2 | 3 | Numpy é uma biblioteca para computação científica em Python. Ela é utilizada para trabalhar com arrays multidimensionais, que são mais eficientes que as listas do Python. 4 | 5 | 6 | ## Importando a biblioteca Numpy 7 | 8 | Para importar a biblioteca Numpy, você pode utilizar o comando abaixo: 9 | 10 | ```python 11 | import numpy as np 12 | ``` 13 | 14 | ## Criando um array 15 | 16 | Para criar um array, você pode utilizar o comando abaixo: 17 | 18 | ```python 19 | array = np.array([1, 2, 3, 4, 5]) 20 | ``` 21 | 22 | ## Visualizando o array 23 | 24 | Para visualizar o array, você pode utilizar o comando abaixo: 25 | 26 | ```python 27 | array 28 | ``` 29 | 30 | Exemplo: 31 | 32 | ```python 33 | import numpy as np 34 | 35 | array = np.array([1, 2, 3, 4, 5]) 36 | 37 | array 38 | ``` 39 | 40 | ## Visualizando o tipo do array 41 | 42 | Para visualizar o tipo do array, você pode utilizar o comando abaixo: 43 | 44 | ```python 45 | array.dtype 46 | ``` 47 | 48 | Exemplo: 49 | 50 | ```python 51 | import numpy as np 52 | 53 | array = np.array([1, 2, 3, 4, 5]) 54 | 55 | array.dtype 56 | ``` 57 | 58 | ## Visualizando o formato do array 59 | 60 | Para visualizar o formato/tamanho do array, você pode utilizar o comando abaixo: 61 | 62 | ```python 63 | array.shape 64 | ``` 65 | 66 | Exemplo: 67 | 68 | ```python 69 | import numpy as np 70 | 71 | array = np.array([1, 2, 3, 4, 5]) 72 | 73 | array.shape 74 | ``` 75 | 76 | ## Criando um array multidimensional 77 | 78 | Para criar um array multidimensional, você pode utilizar o comando abaixo: 79 | 80 | ```python 81 | array = np.array([[1, 2, 3], [4, 5, 6]]) 82 | ``` 83 | 84 | ## Funções para criar arrays 85 | 86 | Para criar arrays, você pode utilizar as funções abaixo: 87 | 88 | ```python 89 | np.zeros((2, 3)) # Cria um array de zeros 90 | np.ones((2, 3)) # Cria um array de uns 91 | np.full((2, 3), 7) # Cria um array com o valor 7 92 | np.eye(3) # Cria uma matriz identidade 93 | np.random.random((2, 3)) # Cria um array com valores aleatórios 94 | ``` 95 | 96 | ## Criando um array com valores sequenciais 97 | 98 | Para criar um array com valores sequenciais, você pode utilizar o comando abaixo: 99 | 100 | ```python 101 | np.arange(0, 10, 2) # Cria um array com valores de 0 a 10, pulando de 2 em 2 102 | ``` 103 | 104 | ## Criando um array com valores espaçados uniformemente 105 | 106 | Para criar um array com valores espaçados uniformemente, você pode utilizar o comando abaixo: 107 | 108 | ```python 109 | np.linspace(0, 1, 5) # Cria um array com 5 valores de 0 a 1 110 | ``` 111 | 112 | ## Visualizando o tamanho do array 113 | 114 | Para visualizar o tamanho do array, você pode utilizar o comando abaixo: 115 | 116 | ```python 117 | array.size 118 | ``` 119 | 120 | ## Utilidade de arrays 121 | 122 | Arrays são muito utilizados para trabalhar com dados numéricos. Por exemplo, você pode utilizar arrays para representar uma imagem, onde cada pixel é um número que representa a intensidade de cor. Ou você pode utilizar arrays para representar um sinal de áudio, onde cada amostra é um número que representa a intensidade sonora. 123 | 124 | ## Visualizando o número de dimensões do array 125 | 126 | Para visualizar o número de dimensões do array, você pode utilizar o comando abaixo: 127 | 128 | ```python 129 | array.ndim 130 | ``` 131 | 132 | 133 | ## Ndarray 134 | 135 | Um ndarray é um array multidimensional, onde todos os elementos são do mesmo tipo. Os elementos de um ndarray são acessados por um índice, que é uma tupla de números inteiros não negativos. O número de índices é o número de dimensões do array. O ndarray possui os seguintes atributos: 136 | 137 | * ndim: número de dimensões do array 138 | * shape: tupla com o tamanho do array em cada dimensão 139 | * size: número total de elementos do array 140 | * dtype: tipo dos elementos do array 141 | 142 | ## Indexação de arrays 143 | 144 | Para acessar um elemento de um array, você pode utilizar o comando abaixo: 145 | 146 | ```python 147 | array[0, 0] 148 | ``` 149 | 150 | Exemplo: 151 | 152 | ```python 153 | import numpy as np 154 | 155 | array = np.array([[1, 2, 3], [4, 5, 6]]) 156 | 157 | array[0, 0] 158 | ``` 159 | 160 | ## Fatiamento de arrays 161 | 162 | Para acessar uma fatia de um array, você pode utilizar o comando abaixo: 163 | 164 | ```python 165 | array[0:2, 1] 166 | ``` 167 | 168 | Exemplo: 169 | 170 | ```python 171 | import numpy as np 172 | 173 | array = np.array([[1, 2, 3], [4, 5, 6]]) 174 | 175 | array[0:2, 1] 176 | ``` 177 | 178 | ## Indexação booleana 179 | 180 | Para acessar elementos de um array utilizando uma condição, você pode utilizar o comando abaixo: 181 | 182 | ```python 183 | array[array > 2] 184 | ``` 185 | 186 | -------------------------------------------------------------------------------- /parte_2_analise_dados/pandas.md: -------------------------------------------------------------------------------- 1 | ## Análise exploratória de dados com Python 2 | 3 | Para realizar a análise exploratória de dados, você pode utilizar a biblioteca Pandas. 4 | 5 | A biblioteca Pandas é uma biblioteca de código aberto, que fornece estruturas de dados e ferramentas de análise de dados para a linguagem de programação Python. Essa biblioteca é uma das mais utilizadas para análise de dados em Python. 6 | 7 | Na biblioteca Pandas, você pode manipular dados de forma muito simples. Você pode ler arquivos CSV, JSON, TXT, HTML, entre outros, e transformá-los em DataFrames, que são estruturas de dados muito utilizadas para análise de dados. 8 | 9 | ### import 10 | 11 | Os módulos Python podem obter acesso ao código de outro módulo importando o arquivo/função usando `import`. Dessa forma, para realizar a importação de qualquer biblioteca no python utilizamos o comando ` import`. 12 | 13 | Exemplo: 14 | 15 | ```python 16 | import nome_do_modulo 17 | ``` 18 | ou ainda 19 | 20 | ```python 21 | import nome_do_modulo as ndm 22 | ``` 23 | Nesse último exemplo parâmetro "as" serve para renomearmos o nome da biblioteca e esse parâmetro é opcional. Ele é muito útil caso o nome da biblioteca esteja dando conflito com o nome de alguma variável. 24 | 25 | ### Importando a biblioteca Pandas 26 | 27 | Para importar a biblioteca Pandas, você pode utilizar o comando abaixo: 28 | 29 | ```python 30 | import pandas as pd 31 | ``` 32 | 33 | ### Carregando os dados 34 | 35 | Para carregar os dados, você pode utilizar o comando abaixo: 36 | 37 | ```python 38 | df = pd.read_csv('caminho_do_arquivo') 39 | ``` 40 | 41 | ### Visualizando os dados 42 | 43 | Para visualizar os dados, você pode utilizar o comando abaixo: 44 | 45 | ```python 46 | df.head() 47 | ``` 48 | 49 | Exemplo: 50 | 51 | ```python 52 | import pandas as pd 53 | 54 | df = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/introducao-a-data-science/master/aula0/ml-latest-small/movies.csv') 55 | 56 | df.head() 57 | ``` 58 | 59 | 60 | ### Visualizando as informações dos dados 61 | 62 | Para visualizar as informações dos dados, você pode utilizar o comando abaixo: 63 | 64 | ```python 65 | df.info() 66 | ``` 67 | 68 | ### Visualizando as estatísticas dos dados 69 | 70 | Para visualizar as estatísticas dos dados, você pode utilizar o comando abaixo: 71 | 72 | ```python 73 | df.describe() 74 | ``` 75 | 76 | ### Visualizando a correlação dos dados 77 | 78 | Para visualizar a correlação dos dados, você pode utilizar o comando abaixo: 79 | 80 | ```python 81 | df.corr() 82 | ``` 83 | 84 | ### Visualizando a quantidade de valores únicos 85 | 86 | Para visualizar a quantidade de valores únicos, você pode utilizar o comando abaixo: 87 | 88 | ```python 89 | df['nome_da_coluna'].value_counts() 90 | ``` 91 | 92 | ## Criando dataframes 93 | 94 | Para criar dataframes, você pode utilizar o comando abaixo: 95 | 96 | ```python 97 | df = pd.DataFrame(dicionario) 98 | ``` 99 | 100 | Exemplo: 101 | 102 | ```python 103 | import pandas as pd 104 | 105 | dicionario = { 106 | 'nome': ['João', 'Maria', 'José'], 107 | 'idade': [20, 25, 30] 108 | } 109 | 110 | df = pd.DataFrame(dicionario) 111 | 112 | df.head() 113 | ``` 114 | -------------------------------------------------------------------------------- /parte_2_analise_dados/projeto_02/README.md: -------------------------------------------------------------------------------- 1 | # Projeto: Explorando dados de vendas de carros no eBay 2 | 3 | Neste projeto guiado, trabalharemos com um conjunto de dados de carros usados ​​do eBay Kleinanzeigen, uma seção de classificados do site alemão eBay. 4 | 5 | O conjunto de dados foi originalmente copiado e carregado no Kaggle pelo usuário orgesleka. 6 | 7 | Fizemos algumas modificações no conjunto de dados original: 8 | 9 | O dicionário de dados fornecido é o seguinte: 10 | 11 | 12 | --- 13 | dateCrawled- Quando este anúncio foi rastreado pela primeira vez. Todos os valores de campo são obtidos a partir desta data. 14 | 15 | name- Nome do carro. 16 | 17 | seller- Se o vendedor é particular ou comerciante. 18 | 19 | offerType- O tipo de listagem 20 | 21 | price- O preço no anúncio para vender o carro. 22 | 23 | abtest- Se a listagem está incluída em um teste A/B. 24 | 25 | vehicleType- O tipo de veículo. 26 | 27 | yearOfRegistration- O ano em que o carro foi matriculado pela primeira vez. 28 | gearbox- O tipo de transmissão. 29 | 30 | powerPS- A potência do carro em PS. 31 | 32 | model- O nome do modelo do carro. 33 | 34 | kilometer- Quantos quilômetros o carro percorreu. 35 | 36 | monthOfRegistration- O mês em que o carro foi matriculado pela primeira vez. 37 | 38 | fuelType- Que tipo de combustível o carro usa. 39 | 40 | brand- A marca do carro. 41 | 42 | notRepairedDamage- Se o carro tiver um dano que ainda não foi reparado. 43 | 44 | dateCreated- A data em que a listagem do eBay foi criada. 45 | 46 | nrOfPictures- O número de fotos no anúncio. 47 | 48 | postalCode- O código postal da localização do veículo. 49 | 50 | lastSeenOnline- Quando o rastreador viu este anúncio online pela última vez. 51 | 52 | --- 53 | 54 | O objetivo deste projeto é limpar os dados e analisar as listas de carros usados ​​incluídos. Você também se familiarizará com alguns dos benefícios exclusivos que o jupyter notebook oferece aos pandas. 55 | 56 | [Acesse o guia do projeto](https://github.com/cilab-ufersa/introduction_machine_learning/blob/main/parte_2_analise_dados/projeto_02/projeto2.ipynb) 57 | -------------------------------------------------------------------------------- /parte_2_analise_dados/projeto_02/autos.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cilab-ufersa/introduction_machine_learning/03bd2e50e8c7db62c4ca39997e827f1cbe047f27/parte_2_analise_dados/projeto_02/autos.csv -------------------------------------------------------------------------------- /parte_2_analise_dados/projeto_3/README.md: -------------------------------------------------------------------------------- 1 | # Projeto: Dados de tráfego da I-94 2 | 3 | No início do curso, vimos que existem dois tipos de visualização de dados: 4 | 5 | * Visualização exploratória de dados: criamos gráficos para nós mesmos explorarmos dados e encontrarmos padrões. 6 | 7 | * Visualização de dados explicativos: criamos gráficos para que outros se comuniquem e expliquem os padrões que encontramos através da exploração de dados. 8 | 9 | 10 | Ao longo deste curso, nos concentramos apenas na visualização exploratória de dados e aprendemos o seguinte: 11 | 12 | 1. Como visualizar dados de séries temporais com gráficos de linha. 13 | 14 | 2. Como visualizar correlações com gráficos de dispersão. 15 | 16 | 3. Como visualizar distribuições de frequência com gráficos de barras e histogramas. 17 | 18 | 4. Como acelerar nosso fluxo de trabalho de visualização de dados exploratórios com a biblioteca de pandas. 19 | 20 | 5. Como comparar gráficos usando gráficos de grade. 21 | 22 | Para tornar o aprendizado mais fácil e eficiente, aprendemos sobre cada um desses tópicos isoladamente. Neste projeto guiado, daremos um passo adiante e aprenderemos a combinar essas habilidades. 23 | 24 | 25 | Vamos analisar um conjunto de dados sobre o tráfego no sentido oeste na rodovia interestadual I-94. 26 | 27 | John Hogue disponibilizou o conjunto de dados e você pode baixá-lo no Repositório de Machine Learning da UCI. 28 | 29 | O objetivo de nossa análise é determinar alguns indicadores de tráfego intenso na I-94. Esses indicadores podem ser o tipo de clima, hora do dia, hora da semana, etc. Por exemplo, podemos descobrir que o tráfego costuma ser mais intenso no verão ou quando neva. 30 | 31 | [Acesse o projeto](https://github.com/cilab-ufersa/introduction_machine_learning/blob/main/parte_2_analise_dados/projeto_3/projeto3.ipynb) -------------------------------------------------------------------------------- /parte_3_machine_learning/README.md: -------------------------------------------------------------------------------- 1 | # Introdução a aprendizagem de máquina 2 | 3 | ## O que é aprendizagem de máquina? 4 | 5 | Aprendizagem de máquina é uma área de estudo que consiste em fazer com que as máquinas aprendam a partir da experiência. Essa experiência é representada por dados, e a partir desses dados, a máquina aprende a fazer previsões ou classificações. 6 | 7 | ![Figure](https://github.com/cilab-ufersa/introduction_machine_learning/blob/main/parte_3_machine_learning/figuras/fig1.png) 8 | 9 | ## Por que aprender sobre aprendizagem de máquina? 10 | 11 | Aprendizagem de máquina é uma área de estudo que está em constante crescimento e que está presente em diversas áreas do conhecimento. Por exemplo, a área de saúde utiliza aprendizagem de máquina para prever doenças, a área de finanças utiliza aprendizagem de máquina para prever o comportamento do mercado financeiro, a área de segurança utiliza aprendizagem de máquina para prever crimes, a área de marketing utiliza aprendizagem de máquina para prever o comportamento do consumidor, a área de engenharia utiliza aprendizagem de máquina para prever falhas em máquinas, a área de meteorologia utiliza aprendizagem de máquina para prever o tempo, a área de agronomia utiliza aprendizagem de máquina para prever a produtividade de culturas. 12 | 13 | ## O que é um algoritmo de aprendizagem de máquina? 14 | 15 | Um algoritmo de aprendizagem de máquina é um algoritmo que recebe dados e aprende a partir desses dados. A aprendizagem pode ser classificada em quatros tipos: 16 | 17 | * Aprendizagem supervisionada 18 | * Aprendizagem não supervisionada 19 | * Aprendizagem por reforço 20 | * Aprendizagem por semissupervisionada 21 | 22 | ## Aprendizagem supervisionada 23 | 24 | Aprendizagem supervisionada é um tipo de aprendizagem em que os dados de entrada são rotulados. Por exemplo, se temos um conjunto de dados com a altura e o peso de pessoas, e queremos prever o sexo dessas pessoas, então temos um conjunto de dados de entrada com altura e peso, e um conjunto de dados de saída com o sexo. 25 | 26 | 27 | 28 | ## Aprendizagem não supervisionada 29 | 30 | Aprendizagem não supervisionada é um tipo de aprendizagem em que os dados de entrada não são rotulados. Por exemplo, se temos um conjunto de dados com a altura e o peso de pessoas, e queremos agrupar essas pessoas em grupos, então temos um conjunto de dados de entrada com altura e peso, mas não temos um conjunto de dados de saída. 31 | 32 | ## Aprendizagem por reforço 33 | 34 | Aprendizagem por reforço é um tipo de aprendizagem em que o algoritmo de aprendizagem de máquina recebe uma recompensa ou uma punição a cada ação que ele toma. Por exemplo, se temos um robô que precisa aprender a andar, então o robô recebe uma recompensa a cada passo que ele dá, e uma punição a cada passo que ele dá errado. 35 | 36 | ## Aprendizagem por semissupervisionada 37 | 38 | Aprendizagem por semissupervisionada é um tipo de aprendizagem em que temos um conjunto de dados rotulados e um conjunto de dados não rotulados. Por exemplo, se temos um conjunto de dados com a altura e o peso de pessoas, e queremos prever o sexo dessas pessoas, e temos um conjunto de dados com a altura e o peso de outras pessoas, e queremos agrupar essas pessoas em grupos, então temos um conjunto de dados de entrada com altura e peso, e um conjunto de dados de saída com o sexo, e um conjunto de dados de entrada com altura e peso, mas não temos um conjunto de dados de saída. 39 | 40 | ## O que é um modelo de aprendizagem de máquina? 41 | 42 | Um modelo de aprendizagem de máquina é um modelo que representa o conhecimento que o algoritmo de aprendizagem de máquina aprendeu a partir dos dados. Por exemplo, se temos um conjunto de dados com a altura e o peso de pessoas, e queremos prever o sexo dessas pessoas, então o modelo de aprendizagem de máquina é uma função que recebe a altura e o peso de uma pessoa, e retorna o sexo dessa pessoa. 43 | 44 | 45 | ## O que veremos nessa parte do curso? 46 | 47 | Nessa parte do curso, veremos uma introdução a machine learning. Os topicos que veremos são: 48 | 49 | * Introdução a aprendizagem de máquina 50 | * Método KNN (K-Nearest Neighbors) 51 | * Avaliação de modelos de aprendizagem de máquina 52 | * Otimização de hiperparâmetros 53 | * Validação cruzada 54 | 55 | [Acesse o projeto](https://github.com/cilab-ufersa/introduction_machine_learning/tree/develop/parte_3_machine_learning/projeto_04) 56 | 57 | ## Referências Recomendadas 58 | 59 | * [Machine Learning Crash Course](https://developers.google.com/machine-learning/crash-course/ml-intro) 60 | 61 | * [Machine Learning: A Probabilistic Perspective](https://www.amazon.com/Machine-Learning-Probabilistic-Perspective-Computation/dp/0262018020) 62 | 63 | * [Pattern Recognition and Machine Learning](https://www.amazon.com/Pattern-Recognition-Learning-Information-Statistics/dp/0387310738) 64 | 65 | * [Machine Learning: An Algorithmic Perspective](https://www.amazon.com/Machine-Learning-Algorithmic-Perspective-Recognition/dp/1107003855) 66 | 67 | * [Machine larning algorithms](https://www.amazon.com/Machine-Learning-Algorithms-Andrew-Ng/dp/1783555130) 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /parte_3_machine_learning/figuras/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cilab-ufersa/introduction_machine_learning/03bd2e50e8c7db62c4ca39997e827f1cbe047f27/parte_3_machine_learning/figuras/fig1.png -------------------------------------------------------------------------------- /parte_3_machine_learning/figuras/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cilab-ufersa/introduction_machine_learning/03bd2e50e8c7db62c4ca39997e827f1cbe047f27/parte_3_machine_learning/figuras/fig2.png -------------------------------------------------------------------------------- /parte_3_machine_learning/projeto_04/README.md: -------------------------------------------------------------------------------- 1 | # Projeto: Previsão de preços de carros com KNN 2 | 3 | 4 | Neste curso, exploramos os fundamentos do aprendizado de máquina usando o algoritmo de k-vizinhos mais próximos. Neste projeto guiado, você praticará o fluxo de trabalho de aprendizado de máquina que aprendeu até agora para prever o preço de mercado de um carro usando seus atributos. 5 | 6 | 7 | O conjunto de dados com o qual trabalharemos contém informações sobre vários carros. Para cada carro, temos informações sobre os aspectos técnicos do veículo, como o deslocamento do motor, o peso do carro, as milhas por galão, a velocidade com que o carro acelera e muito mais. 8 | 9 | 10 | ## Processo de Machine Learning 11 | 12 | O processo de aprendizado de máquina é um processo iterativo e envolve as seguintes etapas: 13 | 14 | 1. Definir o problema 15 | 2. Obter os dados 16 | 3. Preparar os dados (Limpeza, transformação, etc.) 17 | 4. Analisar os dados (Extração de características, seleção de características, etc.) 18 | 5. Treinar o modelo 19 | 6. Avaliar o modelo 20 | 7. Ajustar o modelo 21 | 8. Deploy do modelo 22 | 23 | 24 | ![Figure](https://github.com/cilab-ufersa/introduction_machine_learning/blob/main/parte_3_machine_learning/figuras/fig2.png) -------------------------------------------------------------------------------- /parte_3_machine_learning/projeto_04/imports-85.data: -------------------------------------------------------------------------------- 1 | 3,?,alfa-romero,gas,std,two,convertible,rwd,front,88.60,168.80,64.10,48.80,2548,dohc,four,130,mpfi,3.47,2.68,9.00,111,5000,21,27,13495 2 | 3,?,alfa-romero,gas,std,two,convertible,rwd,front,88.60,168.80,64.10,48.80,2548,dohc,four,130,mpfi,3.47,2.68,9.00,111,5000,21,27,16500 3 | 1,?,alfa-romero,gas,std,two,hatchback,rwd,front,94.50,171.20,65.50,52.40,2823,ohcv,six,152,mpfi,2.68,3.47,9.00,154,5000,19,26,16500 4 | 2,164,audi,gas,std,four,sedan,fwd,front,99.80,176.60,66.20,54.30,2337,ohc,four,109,mpfi,3.19,3.40,10.00,102,5500,24,30,13950 5 | 2,164,audi,gas,std,four,sedan,4wd,front,99.40,176.60,66.40,54.30,2824,ohc,five,136,mpfi,3.19,3.40,8.00,115,5500,18,22,17450 6 | 2,?,audi,gas,std,two,sedan,fwd,front,99.80,177.30,66.30,53.10,2507,ohc,five,136,mpfi,3.19,3.40,8.50,110,5500,19,25,15250 7 | 1,158,audi,gas,std,four,sedan,fwd,front,105.80,192.70,71.40,55.70,2844,ohc,five,136,mpfi,3.19,3.40,8.50,110,5500,19,25,17710 8 | 1,?,audi,gas,std,four,wagon,fwd,front,105.80,192.70,71.40,55.70,2954,ohc,five,136,mpfi,3.19,3.40,8.50,110,5500,19,25,18920 9 | 1,158,audi,gas,turbo,four,sedan,fwd,front,105.80,192.70,71.40,55.90,3086,ohc,five,131,mpfi,3.13,3.40,8.30,140,5500,17,20,23875 10 | 0,?,audi,gas,turbo,two,hatchback,4wd,front,99.50,178.20,67.90,52.00,3053,ohc,five,131,mpfi,3.13,3.40,7.00,160,5500,16,22,? 11 | 2,192,bmw,gas,std,two,sedan,rwd,front,101.20,176.80,64.80,54.30,2395,ohc,four,108,mpfi,3.50,2.80,8.80,101,5800,23,29,16430 12 | 0,192,bmw,gas,std,four,sedan,rwd,front,101.20,176.80,64.80,54.30,2395,ohc,four,108,mpfi,3.50,2.80,8.80,101,5800,23,29,16925 13 | 0,188,bmw,gas,std,two,sedan,rwd,front,101.20,176.80,64.80,54.30,2710,ohc,six,164,mpfi,3.31,3.19,9.00,121,4250,21,28,20970 14 | 0,188,bmw,gas,std,four,sedan,rwd,front,101.20,176.80,64.80,54.30,2765,ohc,six,164,mpfi,3.31,3.19,9.00,121,4250,21,28,21105 15 | 1,?,bmw,gas,std,four,sedan,rwd,front,103.50,189.00,66.90,55.70,3055,ohc,six,164,mpfi,3.31,3.19,9.00,121,4250,20,25,24565 16 | 0,?,bmw,gas,std,four,sedan,rwd,front,103.50,189.00,66.90,55.70,3230,ohc,six,209,mpfi,3.62,3.39,8.00,182,5400,16,22,30760 17 | 0,?,bmw,gas,std,two,sedan,rwd,front,103.50,193.80,67.90,53.70,3380,ohc,six,209,mpfi,3.62,3.39,8.00,182,5400,16,22,41315 18 | 0,?,bmw,gas,std,four,sedan,rwd,front,110.00,197.00,70.90,56.30,3505,ohc,six,209,mpfi,3.62,3.39,8.00,182,5400,15,20,36880 19 | 2,121,chevrolet,gas,std,two,hatchback,fwd,front,88.40,141.10,60.30,53.20,1488,l,three,61,2bbl,2.91,3.03,9.50,48,5100,47,53,5151 20 | 1,98,chevrolet,gas,std,two,hatchback,fwd,front,94.50,155.90,63.60,52.00,1874,ohc,four,90,2bbl,3.03,3.11,9.60,70,5400,38,43,6295 21 | 0,81,chevrolet,gas,std,four,sedan,fwd,front,94.50,158.80,63.60,52.00,1909,ohc,four,90,2bbl,3.03,3.11,9.60,70,5400,38,43,6575 22 | 1,118,dodge,gas,std,two,hatchback,fwd,front,93.70,157.30,63.80,50.80,1876,ohc,four,90,2bbl,2.97,3.23,9.41,68,5500,37,41,5572 23 | 1,118,dodge,gas,std,two,hatchback,fwd,front,93.70,157.30,63.80,50.80,1876,ohc,four,90,2bbl,2.97,3.23,9.40,68,5500,31,38,6377 24 | 1,118,dodge,gas,turbo,two,hatchback,fwd,front,93.70,157.30,63.80,50.80,2128,ohc,four,98,mpfi,3.03,3.39,7.60,102,5500,24,30,7957 25 | 1,148,dodge,gas,std,four,hatchback,fwd,front,93.70,157.30,63.80,50.60,1967,ohc,four,90,2bbl,2.97,3.23,9.40,68,5500,31,38,6229 26 | 1,148,dodge,gas,std,four,sedan,fwd,front,93.70,157.30,63.80,50.60,1989,ohc,four,90,2bbl,2.97,3.23,9.40,68,5500,31,38,6692 27 | 1,148,dodge,gas,std,four,sedan,fwd,front,93.70,157.30,63.80,50.60,1989,ohc,four,90,2bbl,2.97,3.23,9.40,68,5500,31,38,7609 28 | 1,148,dodge,gas,turbo,?,sedan,fwd,front,93.70,157.30,63.80,50.60,2191,ohc,four,98,mpfi,3.03,3.39,7.60,102,5500,24,30,8558 29 | -1,110,dodge,gas,std,four,wagon,fwd,front,103.30,174.60,64.60,59.80,2535,ohc,four,122,2bbl,3.34,3.46,8.50,88,5000,24,30,8921 30 | 3,145,dodge,gas,turbo,two,hatchback,fwd,front,95.90,173.20,66.30,50.20,2811,ohc,four,156,mfi,3.60,3.90,7.00,145,5000,19,24,12964 31 | 2,137,honda,gas,std,two,hatchback,fwd,front,86.60,144.60,63.90,50.80,1713,ohc,four,92,1bbl,2.91,3.41,9.60,58,4800,49,54,6479 32 | 2,137,honda,gas,std,two,hatchback,fwd,front,86.60,144.60,63.90,50.80,1819,ohc,four,92,1bbl,2.91,3.41,9.20,76,6000,31,38,6855 33 | 1,101,honda,gas,std,two,hatchback,fwd,front,93.70,150.00,64.00,52.60,1837,ohc,four,79,1bbl,2.91,3.07,10.10,60,5500,38,42,5399 34 | 1,101,honda,gas,std,two,hatchback,fwd,front,93.70,150.00,64.00,52.60,1940,ohc,four,92,1bbl,2.91,3.41,9.20,76,6000,30,34,6529 35 | 1,101,honda,gas,std,two,hatchback,fwd,front,93.70,150.00,64.00,52.60,1956,ohc,four,92,1bbl,2.91,3.41,9.20,76,6000,30,34,7129 36 | 0,110,honda,gas,std,four,sedan,fwd,front,96.50,163.40,64.00,54.50,2010,ohc,four,92,1bbl,2.91,3.41,9.20,76,6000,30,34,7295 37 | 0,78,honda,gas,std,four,wagon,fwd,front,96.50,157.10,63.90,58.30,2024,ohc,four,92,1bbl,2.92,3.41,9.20,76,6000,30,34,7295 38 | 0,106,honda,gas,std,two,hatchback,fwd,front,96.50,167.50,65.20,53.30,2236,ohc,four,110,1bbl,3.15,3.58,9.00,86,5800,27,33,7895 39 | 0,106,honda,gas,std,two,hatchback,fwd,front,96.50,167.50,65.20,53.30,2289,ohc,four,110,1bbl,3.15,3.58,9.00,86,5800,27,33,9095 40 | 0,85,honda,gas,std,four,sedan,fwd,front,96.50,175.40,65.20,54.10,2304,ohc,four,110,1bbl,3.15,3.58,9.00,86,5800,27,33,8845 41 | 0,85,honda,gas,std,four,sedan,fwd,front,96.50,175.40,62.50,54.10,2372,ohc,four,110,1bbl,3.15,3.58,9.00,86,5800,27,33,10295 42 | 0,85,honda,gas,std,four,sedan,fwd,front,96.50,175.40,65.20,54.10,2465,ohc,four,110,mpfi,3.15,3.58,9.00,101,5800,24,28,12945 43 | 1,107,honda,gas,std,two,sedan,fwd,front,96.50,169.10,66.00,51.00,2293,ohc,four,110,2bbl,3.15,3.58,9.10,100,5500,25,31,10345 44 | 0,?,isuzu,gas,std,four,sedan,rwd,front,94.30,170.70,61.80,53.50,2337,ohc,four,111,2bbl,3.31,3.23,8.50,78,4800,24,29,6785 45 | 1,?,isuzu,gas,std,two,sedan,fwd,front,94.50,155.90,63.60,52.00,1874,ohc,four,90,2bbl,3.03,3.11,9.60,70,5400,38,43,? 46 | 0,?,isuzu,gas,std,four,sedan,fwd,front,94.50,155.90,63.60,52.00,1909,ohc,four,90,2bbl,3.03,3.11,9.60,70,5400,38,43,? 47 | 2,?,isuzu,gas,std,two,hatchback,rwd,front,96.00,172.60,65.20,51.40,2734,ohc,four,119,spfi,3.43,3.23,9.20,90,5000,24,29,11048 48 | 0,145,jaguar,gas,std,four,sedan,rwd,front,113.00,199.60,69.60,52.80,4066,dohc,six,258,mpfi,3.63,4.17,8.10,176,4750,15,19,32250 49 | 0,?,jaguar,gas,std,four,sedan,rwd,front,113.00,199.60,69.60,52.80,4066,dohc,six,258,mpfi,3.63,4.17,8.10,176,4750,15,19,35550 50 | 0,?,jaguar,gas,std,two,sedan,rwd,front,102.00,191.70,70.60,47.80,3950,ohcv,twelve,326,mpfi,3.54,2.76,11.50,262,5000,13,17,36000 51 | 1,104,mazda,gas,std,two,hatchback,fwd,front,93.10,159.10,64.20,54.10,1890,ohc,four,91,2bbl,3.03,3.15,9.00,68,5000,30,31,5195 52 | 1,104,mazda,gas,std,two,hatchback,fwd,front,93.10,159.10,64.20,54.10,1900,ohc,four,91,2bbl,3.03,3.15,9.00,68,5000,31,38,6095 53 | 1,104,mazda,gas,std,two,hatchback,fwd,front,93.10,159.10,64.20,54.10,1905,ohc,four,91,2bbl,3.03,3.15,9.00,68,5000,31,38,6795 54 | 1,113,mazda,gas,std,four,sedan,fwd,front,93.10,166.80,64.20,54.10,1945,ohc,four,91,2bbl,3.03,3.15,9.00,68,5000,31,38,6695 55 | 1,113,mazda,gas,std,four,sedan,fwd,front,93.10,166.80,64.20,54.10,1950,ohc,four,91,2bbl,3.08,3.15,9.00,68,5000,31,38,7395 56 | 3,150,mazda,gas,std,two,hatchback,rwd,front,95.30,169.00,65.70,49.60,2380,rotor,two,70,4bbl,?,?,9.40,101,6000,17,23,10945 57 | 3,150,mazda,gas,std,two,hatchback,rwd,front,95.30,169.00,65.70,49.60,2380,rotor,two,70,4bbl,?,?,9.40,101,6000,17,23,11845 58 | 3,150,mazda,gas,std,two,hatchback,rwd,front,95.30,169.00,65.70,49.60,2385,rotor,two,70,4bbl,?,?,9.40,101,6000,17,23,13645 59 | 3,150,mazda,gas,std,two,hatchback,rwd,front,95.30,169.00,65.70,49.60,2500,rotor,two,80,mpfi,?,?,9.40,135,6000,16,23,15645 60 | 1,129,mazda,gas,std,two,hatchback,fwd,front,98.80,177.80,66.50,53.70,2385,ohc,four,122,2bbl,3.39,3.39,8.60,84,4800,26,32,8845 61 | 0,115,mazda,gas,std,four,sedan,fwd,front,98.80,177.80,66.50,55.50,2410,ohc,four,122,2bbl,3.39,3.39,8.60,84,4800,26,32,8495 62 | 1,129,mazda,gas,std,two,hatchback,fwd,front,98.80,177.80,66.50,53.70,2385,ohc,four,122,2bbl,3.39,3.39,8.60,84,4800,26,32,10595 63 | 0,115,mazda,gas,std,four,sedan,fwd,front,98.80,177.80,66.50,55.50,2410,ohc,four,122,2bbl,3.39,3.39,8.60,84,4800,26,32,10245 64 | 0,?,mazda,diesel,std,?,sedan,fwd,front,98.80,177.80,66.50,55.50,2443,ohc,four,122,idi,3.39,3.39,22.70,64,4650,36,42,10795 65 | 0,115,mazda,gas,std,four,hatchback,fwd,front,98.80,177.80,66.50,55.50,2425,ohc,four,122,2bbl,3.39,3.39,8.60,84,4800,26,32,11245 66 | 0,118,mazda,gas,std,four,sedan,rwd,front,104.90,175.00,66.10,54.40,2670,ohc,four,140,mpfi,3.76,3.16,8.00,120,5000,19,27,18280 67 | 0,?,mazda,diesel,std,four,sedan,rwd,front,104.90,175.00,66.10,54.40,2700,ohc,four,134,idi,3.43,3.64,22.00,72,4200,31,39,18344 68 | -1,93,mercedes-benz,diesel,turbo,four,sedan,rwd,front,110.00,190.90,70.30,56.50,3515,ohc,five,183,idi,3.58,3.64,21.50,123,4350,22,25,25552 69 | -1,93,mercedes-benz,diesel,turbo,four,wagon,rwd,front,110.00,190.90,70.30,58.70,3750,ohc,five,183,idi,3.58,3.64,21.50,123,4350,22,25,28248 70 | 0,93,mercedes-benz,diesel,turbo,two,hardtop,rwd,front,106.70,187.50,70.30,54.90,3495,ohc,five,183,idi,3.58,3.64,21.50,123,4350,22,25,28176 71 | -1,93,mercedes-benz,diesel,turbo,four,sedan,rwd,front,115.60,202.60,71.70,56.30,3770,ohc,five,183,idi,3.58,3.64,21.50,123,4350,22,25,31600 72 | -1,?,mercedes-benz,gas,std,four,sedan,rwd,front,115.60,202.60,71.70,56.50,3740,ohcv,eight,234,mpfi,3.46,3.10,8.30,155,4750,16,18,34184 73 | 3,142,mercedes-benz,gas,std,two,convertible,rwd,front,96.60,180.30,70.50,50.80,3685,ohcv,eight,234,mpfi,3.46,3.10,8.30,155,4750,16,18,35056 74 | 0,?,mercedes-benz,gas,std,four,sedan,rwd,front,120.90,208.10,71.70,56.70,3900,ohcv,eight,308,mpfi,3.80,3.35,8.00,184,4500,14,16,40960 75 | 1,?,mercedes-benz,gas,std,two,hardtop,rwd,front,112.00,199.20,72.00,55.40,3715,ohcv,eight,304,mpfi,3.80,3.35,8.00,184,4500,14,16,45400 76 | 1,?,mercury,gas,turbo,two,hatchback,rwd,front,102.70,178.40,68.00,54.80,2910,ohc,four,140,mpfi,3.78,3.12,8.00,175,5000,19,24,16503 77 | 2,161,mitsubishi,gas,std,two,hatchback,fwd,front,93.70,157.30,64.40,50.80,1918,ohc,four,92,2bbl,2.97,3.23,9.40,68,5500,37,41,5389 78 | 2,161,mitsubishi,gas,std,two,hatchback,fwd,front,93.70,157.30,64.40,50.80,1944,ohc,four,92,2bbl,2.97,3.23,9.40,68,5500,31,38,6189 79 | 2,161,mitsubishi,gas,std,two,hatchback,fwd,front,93.70,157.30,64.40,50.80,2004,ohc,four,92,2bbl,2.97,3.23,9.40,68,5500,31,38,6669 80 | 1,161,mitsubishi,gas,turbo,two,hatchback,fwd,front,93,157.30,63.80,50.80,2145,ohc,four,98,spdi,3.03,3.39,7.60,102,5500,24,30,7689 81 | 3,153,mitsubishi,gas,turbo,two,hatchback,fwd,front,96.30,173.00,65.40,49.40,2370,ohc,four,110,spdi,3.17,3.46,7.50,116,5500,23,30,9959 82 | 3,153,mitsubishi,gas,std,two,hatchback,fwd,front,96.30,173.00,65.40,49.40,2328,ohc,four,122,2bbl,3.35,3.46,8.50,88,5000,25,32,8499 83 | 3,?,mitsubishi,gas,turbo,two,hatchback,fwd,front,95.90,173.20,66.30,50.20,2833,ohc,four,156,spdi,3.58,3.86,7.00,145,5000,19,24,12629 84 | 3,?,mitsubishi,gas,turbo,two,hatchback,fwd,front,95.90,173.20,66.30,50.20,2921,ohc,four,156,spdi,3.59,3.86,7.00,145,5000,19,24,14869 85 | 3,?,mitsubishi,gas,turbo,two,hatchback,fwd,front,95.90,173.20,66.30,50.20,2926,ohc,four,156,spdi,3.59,3.86,7.00,145,5000,19,24,14489 86 | 1,125,mitsubishi,gas,std,four,sedan,fwd,front,96.30,172.40,65.40,51.60,2365,ohc,four,122,2bbl,3.35,3.46,8.50,88,5000,25,32,6989 87 | 1,125,mitsubishi,gas,std,four,sedan,fwd,front,96.30,172.40,65.40,51.60,2405,ohc,four,122,2bbl,3.35,3.46,8.50,88,5000,25,32,8189 88 | 1,125,mitsubishi,gas,turbo,four,sedan,fwd,front,96.30,172.40,65.40,51.60,2403,ohc,four,110,spdi,3.17,3.46,7.50,116,5500,23,30,9279 89 | -1,137,mitsubishi,gas,std,four,sedan,fwd,front,96.30,172.40,65.40,51.60,2403,ohc,four,110,spdi,3.17,3.46,7.50,116,5500,23,30,9279 90 | 1,128,nissan,gas,std,two,sedan,fwd,front,94.50,165.30,63.80,54.50,1889,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,5499 91 | 1,128,nissan,diesel,std,two,sedan,fwd,front,94.50,165.30,63.80,54.50,2017,ohc,four,103,idi,2.99,3.47,21.90,55,4800,45,50,7099 92 | 1,128,nissan,gas,std,two,sedan,fwd,front,94.50,165.30,63.80,54.50,1918,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,6649 93 | 1,122,nissan,gas,std,four,sedan,fwd,front,94.50,165.30,63.80,54.50,1938,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,6849 94 | 1,103,nissan,gas,std,four,wagon,fwd,front,94.50,170.20,63.80,53.50,2024,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,7349 95 | 1,128,nissan,gas,std,two,sedan,fwd,front,94.50,165.30,63.80,54.50,1951,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,7299 96 | 1,128,nissan,gas,std,two,hatchback,fwd,front,94.50,165.60,63.80,53.30,2028,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,7799 97 | 1,122,nissan,gas,std,four,sedan,fwd,front,94.50,165.30,63.80,54.50,1971,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,7499 98 | 1,103,nissan,gas,std,four,wagon,fwd,front,94.50,170.20,63.80,53.50,2037,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,7999 99 | 2,168,nissan,gas,std,two,hardtop,fwd,front,95.10,162.40,63.80,53.30,2008,ohc,four,97,2bbl,3.15,3.29,9.40,69,5200,31,37,8249 100 | 0,106,nissan,gas,std,four,hatchback,fwd,front,97.20,173.40,65.20,54.70,2324,ohc,four,120,2bbl,3.33,3.47,8.50,97,5200,27,34,8949 101 | 0,106,nissan,gas,std,four,sedan,fwd,front,97.20,173.40,65.20,54.70,2302,ohc,four,120,2bbl,3.33,3.47,8.50,97,5200,27,34,9549 102 | 0,128,nissan,gas,std,four,sedan,fwd,front,100.40,181.70,66.50,55.10,3095,ohcv,six,181,mpfi,3.43,3.27,9.00,152,5200,17,22,13499 103 | 0,108,nissan,gas,std,four,wagon,fwd,front,100.40,184.60,66.50,56.10,3296,ohcv,six,181,mpfi,3.43,3.27,9.00,152,5200,17,22,14399 104 | 0,108,nissan,gas,std,four,sedan,fwd,front,100.40,184.60,66.50,55.10,3060,ohcv,six,181,mpfi,3.43,3.27,9.00,152,5200,19,25,13499 105 | 3,194,nissan,gas,std,two,hatchback,rwd,front,91.30,170.70,67.90,49.70,3071,ohcv,six,181,mpfi,3.43,3.27,9.00,160,5200,19,25,17199 106 | 3,194,nissan,gas,turbo,two,hatchback,rwd,front,91.30,170.70,67.90,49.70,3139,ohcv,six,181,mpfi,3.43,3.27,7.80,200,5200,17,23,19699 107 | 1,231,nissan,gas,std,two,hatchback,rwd,front,99.20,178.50,67.90,49.70,3139,ohcv,six,181,mpfi,3.43,3.27,9.00,160,5200,19,25,18399 108 | 0,161,peugot,gas,std,four,sedan,rwd,front,107.90,186.70,68.40,56.70,3020,l,four,120,mpfi,3.46,3.19,8.40,97,5000,19,24,11900 109 | 0,161,peugot,diesel,turbo,four,sedan,rwd,front,107.90,186.70,68.40,56.70,3197,l,four,152,idi,3.70,3.52,21.00,95,4150,28,33,13200 110 | 0,?,peugot,gas,std,four,wagon,rwd,front,114.20,198.90,68.40,58.70,3230,l,four,120,mpfi,3.46,3.19,8.40,97,5000,19,24,12440 111 | 0,?,peugot,diesel,turbo,four,wagon,rwd,front,114.20,198.90,68.40,58.70,3430,l,four,152,idi,3.70,3.52,21.00,95,4150,25,25,13860 112 | 0,161,peugot,gas,std,four,sedan,rwd,front,107.90,186.70,68.40,56.70,3075,l,four,120,mpfi,3.46,2.19,8.40,95,5000,19,24,15580 113 | 0,161,peugot,diesel,turbo,four,sedan,rwd,front,107.90,186.70,68.40,56.70,3252,l,four,152,idi,3.70,3.52,21.00,95,4150,28,33,16900 114 | 0,?,peugot,gas,std,four,wagon,rwd,front,114.20,198.90,68.40,56.70,3285,l,four,120,mpfi,3.46,2.19,8.40,95,5000,19,24,16695 115 | 0,?,peugot,diesel,turbo,four,wagon,rwd,front,114.20,198.90,68.40,58.70,3485,l,four,152,idi,3.70,3.52,21.00,95,4150,25,25,17075 116 | 0,161,peugot,gas,std,four,sedan,rwd,front,107.90,186.70,68.40,56.70,3075,l,four,120,mpfi,3.46,3.19,8.40,97,5000,19,24,16630 117 | 0,161,peugot,diesel,turbo,four,sedan,rwd,front,107.90,186.70,68.40,56.70,3252,l,four,152,idi,3.70,3.52,21.00,95,4150,28,33,17950 118 | 0,161,peugot,gas,turbo,four,sedan,rwd,front,108.00,186.70,68.30,56.00,3130,l,four,134,mpfi,3.61,3.21,7.00,142,5600,18,24,18150 119 | 1,119,plymouth,gas,std,two,hatchback,fwd,front,93.70,157.30,63.80,50.80,1918,ohc,four,90,2bbl,2.97,3.23,9.40,68,5500,37,41,5572 120 | 1,119,plymouth,gas,turbo,two,hatchback,fwd,front,93.70,157.30,63.80,50.80,2128,ohc,four,98,spdi,3.03,3.39,7.60,102,5500,24,30,7957 121 | 1,154,plymouth,gas,std,four,hatchback,fwd,front,93.70,157.30,63.80,50.60,1967,ohc,four,90,2bbl,2.97,3.23,9.40,68,5500,31,38,6229 122 | 1,154,plymouth,gas,std,four,sedan,fwd,front,93.70,167.30,63.80,50.80,1989,ohc,four,90,2bbl,2.97,3.23,9.40,68,5500,31,38,6692 123 | 1,154,plymouth,gas,std,four,sedan,fwd,front,93.70,167.30,63.80,50.80,2191,ohc,four,98,2bbl,2.97,3.23,9.40,68,5500,31,38,7609 124 | -1,74,plymouth,gas,std,four,wagon,fwd,front,103.30,174.60,64.60,59.80,2535,ohc,four,122,2bbl,3.35,3.46,8.50,88,5000,24,30,8921 125 | 3,?,plymouth,gas,turbo,two,hatchback,rwd,front,95.90,173.20,66.30,50.20,2818,ohc,four,156,spdi,3.59,3.86,7.00,145,5000,19,24,12764 126 | 3,186,porsche,gas,std,two,hatchback,rwd,front,94.50,168.90,68.30,50.20,2778,ohc,four,151,mpfi,3.94,3.11,9.50,143,5500,19,27,22018 127 | 3,?,porsche,gas,std,two,hardtop,rwd,rear,89.50,168.90,65.00,51.60,2756,ohcf,six,194,mpfi,3.74,2.90,9.50,207,5900,17,25,32528 128 | 3,?,porsche,gas,std,two,hardtop,rwd,rear,89.50,168.90,65.00,51.60,2756,ohcf,six,194,mpfi,3.74,2.90,9.50,207,5900,17,25,34028 129 | 3,?,porsche,gas,std,two,convertible,rwd,rear,89.50,168.90,65.00,51.60,2800,ohcf,six,194,mpfi,3.74,2.90,9.50,207,5900,17,25,37028 130 | 1,?,porsche,gas,std,two,hatchback,rwd,front,98.40,175.70,72.30,50.50,3366,dohcv,eight,203,mpfi,3.94,3.11,10.00,288,5750,17,28,? 131 | 0,?,renault,gas,std,four,wagon,fwd,front,96.10,181.50,66.50,55.20,2579,ohc,four,132,mpfi,3.46,3.90,8.70,?,?,23,31,9295 132 | 2,?,renault,gas,std,two,hatchback,fwd,front,96.10,176.80,66.60,50.50,2460,ohc,four,132,mpfi,3.46,3.90,8.70,?,?,23,31,9895 133 | 3,150,saab,gas,std,two,hatchback,fwd,front,99.10,186.60,66.50,56.10,2658,ohc,four,121,mpfi,3.54,3.07,9.31,110,5250,21,28,11850 134 | 2,104,saab,gas,std,four,sedan,fwd,front,99.10,186.60,66.50,56.10,2695,ohc,four,121,mpfi,3.54,3.07,9.30,110,5250,21,28,12170 135 | 3,150,saab,gas,std,two,hatchback,fwd,front,99.10,186.60,66.50,56.10,2707,ohc,four,121,mpfi,2.54,2.07,9.30,110,5250,21,28,15040 136 | 2,104,saab,gas,std,four,sedan,fwd,front,99.10,186.60,66.50,56.10,2758,ohc,four,121,mpfi,3.54,3.07,9.30,110,5250,21,28,15510 137 | 3,150,saab,gas,turbo,two,hatchback,fwd,front,99.10,186.60,66.50,56.10,2808,dohc,four,121,mpfi,3.54,3.07,9.00,160,5500,19,26,18150 138 | 2,104,saab,gas,turbo,four,sedan,fwd,front,99.10,186.60,66.50,56.10,2847,dohc,four,121,mpfi,3.54,3.07,9.00,160,5500,19,26,18620 139 | 2,83,subaru,gas,std,two,hatchback,fwd,front,93.70,156.90,63.40,53.70,2050,ohcf,four,97,2bbl,3.62,2.36,9.00,69,4900,31,36,5118 140 | 2,83,subaru,gas,std,two,hatchback,fwd,front,93.70,157.90,63.60,53.70,2120,ohcf,four,108,2bbl,3.62,2.64,8.70,73,4400,26,31,7053 141 | 2,83,subaru,gas,std,two,hatchback,4wd,front,93.30,157.30,63.80,55.70,2240,ohcf,four,108,2bbl,3.62,2.64,8.70,73,4400,26,31,7603 142 | 0,102,subaru,gas,std,four,sedan,fwd,front,97.20,172.00,65.40,52.50,2145,ohcf,four,108,2bbl,3.62,2.64,9.50,82,4800,32,37,7126 143 | 0,102,subaru,gas,std,four,sedan,fwd,front,97.20,172.00,65.40,52.50,2190,ohcf,four,108,2bbl,3.62,2.64,9.50,82,4400,28,33,7775 144 | 0,102,subaru,gas,std,four,sedan,fwd,front,97.20,172.00,65.40,52.50,2340,ohcf,four,108,mpfi,3.62,2.64,9.00,94,5200,26,32,9960 145 | 0,102,subaru,gas,std,four,sedan,4wd,front,97.00,172.00,65.40,54.30,2385,ohcf,four,108,2bbl,3.62,2.64,9.00,82,4800,24,25,9233 146 | 0,102,subaru,gas,turbo,four,sedan,4wd,front,97.00,172.00,65.40,54.30,2510,ohcf,four,108,mpfi,3.62,2.64,7.70,111,4800,24,29,11259 147 | 0,89,subaru,gas,std,four,wagon,fwd,front,97.00,173.50,65.40,53.00,2290,ohcf,four,108,2bbl,3.62,2.64,9.00,82,4800,28,32,7463 148 | 0,89,subaru,gas,std,four,wagon,fwd,front,97.00,173.50,65.40,53.00,2455,ohcf,four,108,mpfi,3.62,2.64,9.00,94,5200,25,31,10198 149 | 0,85,subaru,gas,std,four,wagon,4wd,front,96.90,173.60,65.40,54.90,2420,ohcf,four,108,2bbl,3.62,2.64,9.00,82,4800,23,29,8013 150 | 0,85,subaru,gas,turbo,four,wagon,4wd,front,96.90,173.60,65.40,54.90,2650,ohcf,four,108,mpfi,3.62,2.64,7.70,111,4800,23,23,11694 151 | 1,87,toyota,gas,std,two,hatchback,fwd,front,95.70,158.70,63.60,54.50,1985,ohc,four,92,2bbl,3.05,3.03,9.00,62,4800,35,39,5348 152 | 1,87,toyota,gas,std,two,hatchback,fwd,front,95.70,158.70,63.60,54.50,2040,ohc,four,92,2bbl,3.05,3.03,9.00,62,4800,31,38,6338 153 | 1,74,toyota,gas,std,four,hatchback,fwd,front,95.70,158.70,63.60,54.50,2015,ohc,four,92,2bbl,3.05,3.03,9.00,62,4800,31,38,6488 154 | 0,77,toyota,gas,std,four,wagon,fwd,front,95.70,169.70,63.60,59.10,2280,ohc,four,92,2bbl,3.05,3.03,9.00,62,4800,31,37,6918 155 | 0,81,toyota,gas,std,four,wagon,4wd,front,95.70,169.70,63.60,59.10,2290,ohc,four,92,2bbl,3.05,3.03,9.00,62,4800,27,32,7898 156 | 0,91,toyota,gas,std,four,wagon,4wd,front,95.70,169.70,63.60,59.10,3110,ohc,four,92,2bbl,3.05,3.03,9.00,62,4800,27,32,8778 157 | 0,91,toyota,gas,std,four,sedan,fwd,front,95.70,166.30,64.40,53.00,2081,ohc,four,98,2bbl,3.19,3.03,9.00,70,4800,30,37,6938 158 | 0,91,toyota,gas,std,four,hatchback,fwd,front,95.70,166.30,64.40,52.80,2109,ohc,four,98,2bbl,3.19,3.03,9.00,70,4800,30,37,7198 159 | 0,91,toyota,diesel,std,four,sedan,fwd,front,95.70,166.30,64.40,53.00,2275,ohc,four,110,idi,3.27,3.35,22.50,56,4500,34,36,7898 160 | 0,91,toyota,diesel,std,four,hatchback,fwd,front,95.70,166.30,64.40,52.80,2275,ohc,four,110,idi,3.27,3.35,22.50,56,4500,38,47,7788 161 | 0,91,toyota,gas,std,four,sedan,fwd,front,95.70,166.30,64.40,53.00,2094,ohc,four,98,2bbl,3.19,3.03,9.00,70,4800,38,47,7738 162 | 0,91,toyota,gas,std,four,hatchback,fwd,front,95.70,166.30,64.40,52.80,2122,ohc,four,98,2bbl,3.19,3.03,9.00,70,4800,28,34,8358 163 | 0,91,toyota,gas,std,four,sedan,fwd,front,95.70,166.30,64.40,52.80,2140,ohc,four,98,2bbl,3.19,3.03,9.00,70,4800,28,34,9258 164 | 1,168,toyota,gas,std,two,sedan,rwd,front,94.50,168.70,64.00,52.60,2169,ohc,four,98,2bbl,3.19,3.03,9.00,70,4800,29,34,8058 165 | 1,168,toyota,gas,std,two,hatchback,rwd,front,94.50,168.70,64.00,52.60,2204,ohc,four,98,2bbl,3.19,3.03,9.00,70,4800,29,34,8238 166 | 1,168,toyota,gas,std,two,sedan,rwd,front,94.50,168.70,64.00,52.60,2265,dohc,four,98,mpfi,3.24,3.08,9.40,112,6600,26,29,9298 167 | 1,168,toyota,gas,std,two,hatchback,rwd,front,94.50,168.70,64.00,52.60,2300,dohc,four,98,mpfi,3.24,3.08,9.40,112,6600,26,29,9538 168 | 2,134,toyota,gas,std,two,hardtop,rwd,front,98.40,176.20,65.60,52.00,2540,ohc,four,146,mpfi,3.62,3.50,9.30,116,4800,24,30,8449 169 | 2,134,toyota,gas,std,two,hardtop,rwd,front,98.40,176.20,65.60,52.00,2536,ohc,four,146,mpfi,3.62,3.50,9.30,116,4800,24,30,9639 170 | 2,134,toyota,gas,std,two,hatchback,rwd,front,98.40,176.20,65.60,52.00,2551,ohc,four,146,mpfi,3.62,3.50,9.30,116,4800,24,30,9989 171 | 2,134,toyota,gas,std,two,hardtop,rwd,front,98.40,176.20,65.60,52.00,2679,ohc,four,146,mpfi,3.62,3.50,9.30,116,4800,24,30,11199 172 | 2,134,toyota,gas,std,two,hatchback,rwd,front,98.40,176.20,65.60,52.00,2714,ohc,four,146,mpfi,3.62,3.50,9.30,116,4800,24,30,11549 173 | 2,134,toyota,gas,std,two,convertible,rwd,front,98.40,176.20,65.60,53.00,2975,ohc,four,146,mpfi,3.62,3.50,9.30,116,4800,24,30,17669 174 | -1,65,toyota,gas,std,four,sedan,fwd,front,102.40,175.60,66.50,54.90,2326,ohc,four,122,mpfi,3.31,3.54,8.70,92,4200,29,34,8948 175 | -1,65,toyota,diesel,turbo,four,sedan,fwd,front,102.40,175.60,66.50,54.90,2480,ohc,four,110,idi,3.27,3.35,22.50,73,4500,30,33,10698 176 | -1,65,toyota,gas,std,four,hatchback,fwd,front,102.40,175.60,66.50,53.90,2414,ohc,four,122,mpfi,3.31,3.54,8.70,92,4200,27,32,9988 177 | -1,65,toyota,gas,std,four,sedan,fwd,front,102.40,175.60,66.50,54.90,2414,ohc,four,122,mpfi,3.31,3.54,8.70,92,4200,27,32,10898 178 | -1,65,toyota,gas,std,four,hatchback,fwd,front,102.40,175.60,66.50,53.90,2458,ohc,four,122,mpfi,3.31,3.54,8.70,92,4200,27,32,11248 179 | 3,197,toyota,gas,std,two,hatchback,rwd,front,102.90,183.50,67.70,52.00,2976,dohc,six,171,mpfi,3.27,3.35,9.30,161,5200,20,24,16558 180 | 3,197,toyota,gas,std,two,hatchback,rwd,front,102.90,183.50,67.70,52.00,3016,dohc,six,171,mpfi,3.27,3.35,9.30,161,5200,19,24,15998 181 | -1,90,toyota,gas,std,four,sedan,rwd,front,104.50,187.80,66.50,54.10,3131,dohc,six,171,mpfi,3.27,3.35,9.20,156,5200,20,24,15690 182 | -1,?,toyota,gas,std,four,wagon,rwd,front,104.50,187.80,66.50,54.10,3151,dohc,six,161,mpfi,3.27,3.35,9.20,156,5200,19,24,15750 183 | 2,122,volkswagen,diesel,std,two,sedan,fwd,front,97.30,171.70,65.50,55.70,2261,ohc,four,97,idi,3.01,3.40,23.00,52,4800,37,46,7775 184 | 2,122,volkswagen,gas,std,two,sedan,fwd,front,97.30,171.70,65.50,55.70,2209,ohc,four,109,mpfi,3.19,3.40,9.00,85,5250,27,34,7975 185 | 2,94,volkswagen,diesel,std,four,sedan,fwd,front,97.30,171.70,65.50,55.70,2264,ohc,four,97,idi,3.01,3.40,23.00,52,4800,37,46,7995 186 | 2,94,volkswagen,gas,std,four,sedan,fwd,front,97.30,171.70,65.50,55.70,2212,ohc,four,109,mpfi,3.19,3.40,9.00,85,5250,27,34,8195 187 | 2,94,volkswagen,gas,std,four,sedan,fwd,front,97.30,171.70,65.50,55.70,2275,ohc,four,109,mpfi,3.19,3.40,9.00,85,5250,27,34,8495 188 | 2,94,volkswagen,diesel,turbo,four,sedan,fwd,front,97.30,171.70,65.50,55.70,2319,ohc,four,97,idi,3.01,3.40,23.00,68,4500,37,42,9495 189 | 2,94,volkswagen,gas,std,four,sedan,fwd,front,97.30,171.70,65.50,55.70,2300,ohc,four,109,mpfi,3.19,3.40,10.00,100,5500,26,32,9995 190 | 3,?,volkswagen,gas,std,two,convertible,fwd,front,94.50,159.30,64.20,55.60,2254,ohc,four,109,mpfi,3.19,3.40,8.50,90,5500,24,29,11595 191 | 3,256,volkswagen,gas,std,two,hatchback,fwd,front,94.50,165.70,64.00,51.40,2221,ohc,four,109,mpfi,3.19,3.40,8.50,90,5500,24,29,9980 192 | 0,?,volkswagen,gas,std,four,sedan,fwd,front,100.40,180.20,66.90,55.10,2661,ohc,five,136,mpfi,3.19,3.40,8.50,110,5500,19,24,13295 193 | 0,?,volkswagen,diesel,turbo,four,sedan,fwd,front,100.40,180.20,66.90,55.10,2579,ohc,four,97,idi,3.01,3.40,23.00,68,4500,33,38,13845 194 | 0,?,volkswagen,gas,std,four,wagon,fwd,front,100.40,183.10,66.90,55.10,2563,ohc,four,109,mpfi,3.19,3.40,9.00,88,5500,25,31,12290 195 | -2,103,volvo,gas,std,four,sedan,rwd,front,104.30,188.80,67.20,56.20,2912,ohc,four,141,mpfi,3.78,3.15,9.50,114,5400,23,28,12940 196 | -1,74,volvo,gas,std,four,wagon,rwd,front,104.30,188.80,67.20,57.50,3034,ohc,four,141,mpfi,3.78,3.15,9.50,114,5400,23,28,13415 197 | -2,103,volvo,gas,std,four,sedan,rwd,front,104.30,188.80,67.20,56.20,2935,ohc,four,141,mpfi,3.78,3.15,9.50,114,5400,24,28,15985 198 | -1,74,volvo,gas,std,four,wagon,rwd,front,104.30,188.80,67.20,57.50,3042,ohc,four,141,mpfi,3.78,3.15,9.50,114,5400,24,28,16515 199 | -2,103,volvo,gas,turbo,four,sedan,rwd,front,104.30,188.80,67.20,56.20,3045,ohc,four,130,mpfi,3.62,3.15,7.50,162,5100,17,22,18420 200 | -1,74,volvo,gas,turbo,four,wagon,rwd,front,104.30,188.80,67.20,57.50,3157,ohc,four,130,mpfi,3.62,3.15,7.50,162,5100,17,22,18950 201 | -1,95,volvo,gas,std,four,sedan,rwd,front,109.10,188.80,68.90,55.50,2952,ohc,four,141,mpfi,3.78,3.15,9.50,114,5400,23,28,16845 202 | -1,95,volvo,gas,turbo,four,sedan,rwd,front,109.10,188.80,68.80,55.50,3049,ohc,four,141,mpfi,3.78,3.15,8.70,160,5300,19,25,19045 203 | -1,95,volvo,gas,std,four,sedan,rwd,front,109.10,188.80,68.90,55.50,3012,ohcv,six,173,mpfi,3.58,2.87,8.80,134,5500,18,23,21485 204 | -1,95,volvo,diesel,turbo,four,sedan,rwd,front,109.10,188.80,68.90,55.50,3217,ohc,six,145,idi,3.01,3.40,23.00,106,4800,26,27,22470 205 | -1,95,volvo,gas,turbo,four,sedan,rwd,front,109.10,188.80,68.90,55.50,3062,ohc,four,141,mpfi,3.78,3.15,9.50,114,5400,19,25,22625 206 | --------------------------------------------------------------------------------