├── Pandas.ipynb
├── Python.ipynb
├── README.md
└── mlb.csv
/Pandas.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 2,
4 | "metadata": {
5 | "colab": {
6 | "name": "Introdução_ao_Pandas.ipynb",
7 | "provenance": [],
8 | "collapsed_sections": [
9 | "pEPSVhlmMc2M",
10 | "IGFV_VXSSaQP",
11 | "LyIHm4IkpTK2",
12 | "4Osy-L2YyFiY",
13 | "hvAtDIcO5GLK",
14 | "rPQDjya2DUxJ",
15 | "w8L3kQz9pibd",
16 | "4d3jHHUlKyVv",
17 | "owwjr5-hyYSv"
18 | ]
19 | },
20 | "kernelspec": {
21 | "name": "python3",
22 | "display_name": "Python 3.9.5 64-bit"
23 | },
24 | "language_info": {
25 | "name": "python",
26 | "version": "3.9.5",
27 | "mimetype": "text/x-python",
28 | "codemirror_mode": {
29 | "name": "ipython",
30 | "version": 3
31 | },
32 | "pygments_lexer": "ipython3",
33 | "nbconvert_exporter": "python",
34 | "file_extension": ".py"
35 | },
36 | "interpreter": {
37 | "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1"
38 | }
39 | },
40 | "cells": [
41 | {
42 | "cell_type": "markdown",
43 | "source": [
44 | "# Introdução ao Pandas"
45 | ],
46 | "metadata": {
47 | "id": "pEPSVhlmMc2M"
48 | }
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "source": [
53 | "Este notebook vai introduzir você à biblioteca [`Pandas`](https://pandas.pydata.org/) e mostrar como examinar, ordenar, agrupar e agregar uma base de dados. Usaremos dados da [Liga de Baseboll dos Estados Unidos](https://databases.usatoday.com/mlb-salaries/).\n",
54 | "\n",
55 | "Se você é iniciante no Python ou precisa reforçar conhecimentos básicos sobre a sintaxe, pode ser interessante [começar com esse notebook](Python.ipynb) \n",
56 | "\n",
57 | "O notebook irá cobrir as seguintes etapas:\n",
58 | "\n",
59 | "* Importar o Pandas\n",
60 | "* Carregar dados dentro de um dataframe\n",
61 | "* Examinar os dados\n",
62 | "* Ordenação\n",
63 | "* Filtragem de dados\n",
64 | "* Agrupar e agregar os dados\n",
65 | "* Exportar como CSV\n",
66 | "\n"
67 | ],
68 | "metadata": {
69 | "id": "N0rlqAn3Mgpr"
70 | }
71 | },
72 | {
73 | "cell_type": "markdown",
74 | "source": [
75 | "# Importar o Pandas"
76 | ],
77 | "metadata": {
78 | "id": "LyIHm4IkpTK2"
79 | }
80 | },
81 | {
82 | "cell_type": "markdown",
83 | "source": [
84 | "Antes de usar as funcionalidades do `Pandas` ou outras bibliotecas de terceiros que não estão inclusas no Python, você precisa importa-las, usando o `import`. É comum colocarmos uma abreviação, um nome mais curto para facilitar sua utilização no restante de nosso código. No caso do `pandas` por convenção é usado `pd`.\n",
85 | "\n",
86 | "Então, vamos começar rodando esta célula:"
87 | ],
88 | "metadata": {
89 | "id": "H6GWVozZpZ_W"
90 | }
91 | },
92 | {
93 | "cell_type": "code",
94 | "execution_count": null,
95 | "source": [
96 | "import pandas as pd"
97 | ],
98 | "outputs": [],
99 | "metadata": {
100 | "id": "RUEELruRvtrq"
101 | }
102 | },
103 | {
104 | "cell_type": "markdown",
105 | "source": [
106 | "Se você não tem o Pandas instalado na sua máquina, irá receber um erro. Para instalar a bibloteca, podemos usar o gerenciador de pacotes do Python (PIP), rodando o comando `!pip install pandas` antes de importá-la."
107 | ],
108 | "metadata": {}
109 | },
110 | {
111 | "cell_type": "markdown",
112 | "source": [
113 | "**Mude os formatos de exibição**"
114 | ],
115 | "metadata": {
116 | "id": "2ev4yuHDwKMl"
117 | }
118 | },
119 | {
120 | "cell_type": "markdown",
121 | "source": [
122 | "O passo seguinte é opcional, mas é muito comum em notebooks de análise de dados usando Pandas. \n",
123 | "\n",
124 | "A próxima célula altera o formato de exibição para números, que são escritos em notação científica por padrão. Se ler números nesse formato for confortável para você, você não precisa executá-la. "
125 | ],
126 | "metadata": {
127 | "id": "XlCpJYT7wv_M"
128 | }
129 | },
130 | {
131 | "cell_type": "code",
132 | "execution_count": null,
133 | "source": [
134 | "pd.options.display.float_format = '{:20,.2f}'.format"
135 | ],
136 | "outputs": [],
137 | "metadata": {
138 | "id": "jZVEODL7wRdL"
139 | }
140 | },
141 | {
142 | "cell_type": "markdown",
143 | "source": [
144 | "Para saber mais sobre essa mudança de formato, [consulte a documentação](https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html)."
145 | ],
146 | "metadata": {}
147 | },
148 | {
149 | "cell_type": "markdown",
150 | "source": [
151 | "# Carregar dados em uma tabela (DataFrame)"
152 | ],
153 | "metadata": {
154 | "id": "4Osy-L2YyFiY"
155 | }
156 | },
157 | {
158 | "cell_type": "markdown",
159 | "source": [
160 | "Antes de começar a manipular os dados, é preciso carregá-los dentro de uma tabela (DataFrame) do Pandas. Um dataframe é como se fosse uma tabela, como a do Excel, com linhas e colunas."
161 | ],
162 | "metadata": {
163 | "id": "rar6gExByZM6"
164 | }
165 | },
166 | {
167 | "cell_type": "markdown",
168 | "source": [
169 | "Você pode carregar diferentes tipos de dados como de um DataFrame incluindo CSVs, arquivos do Excel (xlsx), JSON, [entre outros](https://www.cbtnuggets.com/blog/technology/programming/14-file-types-you-can-import-into-pandas). Confira esse outro notebook com [exemplos de importações de acordo com o tipo de arquivo](https://github.com/ireapps/cfj-2018/blob/master/reference/Importing%20data%20into%20pandas.ipynb).\n",
170 | "\n",
171 | "O foco aqui será importar os dados sobre a Liga de Basebol usando o método `read_csv`. Há várias opções que você pode incluir quando estiver lendo uma base de dados, porém a maneira mais simples é indicar o caminho do arquivo entre aspas. Neste caso, vamos usar a própria URL do arquivo CSV presente no [repositório do Github](https://github.com/escola-de-dados/notebooks-python-pandas/) deste tutorial."
172 | ],
173 | "metadata": {
174 | "id": "h0cLLXA7yNl3"
175 | }
176 | },
177 | {
178 | "cell_type": "code",
179 | "execution_count": null,
180 | "source": [
181 | "df = pd.read_csv('https://github.com/escola-de-dados/notebooks-python-pandas/raw/master/mlb.csv')"
182 | ],
183 | "outputs": [],
184 | "metadata": {
185 | "id": "tb-ARfjE3Hmw"
186 | }
187 | },
188 | {
189 | "cell_type": "markdown",
190 | "source": [
191 | "Além de importar os dados, vamos salvar essas informações dentro de uma variável chamada `df` (nome curto para DataFrame - facilita a leitura e a busca por ajuda no Google, por ser algo padronizado).\n",
192 | "\n",
193 | "Resumindo: Importamos a biblioteca `pandas` e chamamos ela de `pd`, usamos o método `read_csv` para importar os dados do aquivo `mlb.csv` dentro de um `dataframe`, depois salvamos esta tabela na variável `df`."
194 | ],
195 | "metadata": {
196 | "id": "UW17_O3z2YM3"
197 | }
198 | },
199 | {
200 | "cell_type": "markdown",
201 | "source": [
202 | "# Examinando os dados"
203 | ],
204 | "metadata": {
205 | "id": "hvAtDIcO5GLK"
206 | }
207 | },
208 | {
209 | "cell_type": "markdown",
210 | "source": [
211 | "Vamos dar uma olhada mais detalhada nos dados que temos usando alguns métodos e atributos de um DataFrame Pandas:\n"
212 | ],
213 | "metadata": {
214 | "id": "5T6HK-fa_u2i"
215 | }
216 | },
217 | {
218 | "cell_type": "markdown",
219 | "source": [
220 | "- `df.head()`: Mostra as cinco primeiras linhas do dataframe por padrão, mas você pode especificar a quantidade que preferir entre parênteses. Ex: `df.head(10)`"
221 | ],
222 | "metadata": {
223 | "id": "1Kc7KJyeAFx8"
224 | }
225 | },
226 | {
227 | "cell_type": "code",
228 | "execution_count": null,
229 | "source": [
230 | "df.head()"
231 | ],
232 | "outputs": [],
233 | "metadata": {
234 | "colab": {
235 | "base_uri": "https://localhost:8080/",
236 | "height": 203
237 | },
238 | "id": "-tsuamgn5hq9",
239 | "outputId": "78adde9d-7e91-4b8b-ae10-0a050d005dff"
240 | }
241 | },
242 | {
243 | "cell_type": "markdown",
244 | "source": [
245 | "- `df.tail()`: Mostra as últimas cinco linhas do DataFrame, mas você pode especificar a quantidade que preferir entre parênteses. Ex. `df.tail(10)`\n",
246 | "\n"
247 | ],
248 | "metadata": {
249 | "id": "Z1SCFu2aAoRR"
250 | }
251 | },
252 | {
253 | "cell_type": "code",
254 | "execution_count": null,
255 | "source": [
256 | "df.tail()"
257 | ],
258 | "outputs": [],
259 | "metadata": {
260 | "colab": {
261 | "base_uri": "https://localhost:8080/",
262 | "height": 203
263 | },
264 | "id": "xy9gZTqdA-0c",
265 | "outputId": "ca34647e-ba7a-461c-b293-7bd2250f3cf9"
266 | }
267 | },
268 | {
269 | "cell_type": "markdown",
270 | "source": [
271 | "- `df.describe()`: Apresenta um resumo estatístico apenas das colunas que contém conteudo numérico."
272 | ],
273 | "metadata": {
274 | "id": "TdE3TyufBBwg"
275 | }
276 | },
277 | {
278 | "cell_type": "code",
279 | "execution_count": null,
280 | "source": [
281 | "df.describe()"
282 | ],
283 | "outputs": [],
284 | "metadata": {
285 | "colab": {
286 | "base_uri": "https://localhost:8080/",
287 | "height": 295
288 | },
289 | "id": "rjxk0nQnBSDk",
290 | "outputId": "47399184-5228-4517-db34-0cfd55ca0694"
291 | }
292 | },
293 | {
294 | "cell_type": "markdown",
295 | "source": [
296 | "- `df.sample()`: Mostra uma linha aleatória do DataFrame, mas você pode especificar quantas linhas aleatórias deseja visualizar. Ex: `df.sample(5)`"
297 | ],
298 | "metadata": {
299 | "id": "6fNh1xZBBbM8"
300 | }
301 | },
302 | {
303 | "cell_type": "code",
304 | "execution_count": null,
305 | "source": [
306 | "df.sample()"
307 | ],
308 | "outputs": [],
309 | "metadata": {
310 | "colab": {
311 | "base_uri": "https://localhost:8080/",
312 | "height": 80
313 | },
314 | "id": "JubDqQyABT8w",
315 | "outputId": "de4a972a-d1f3-4397-d8e8-14402e7dd6fc"
316 | }
317 | },
318 | {
319 | "cell_type": "markdown",
320 | "source": [
321 | "- `df.shape`: Informa quantas colunas e linhas o DataFrame tem."
322 | ],
323 | "metadata": {
324 | "id": "zYaN8-EoCSDx"
325 | }
326 | },
327 | {
328 | "cell_type": "code",
329 | "execution_count": null,
330 | "source": [
331 | "df.shape"
332 | ],
333 | "outputs": [],
334 | "metadata": {
335 | "colab": {
336 | "base_uri": "https://localhost:8080/"
337 | },
338 | "id": "0sgFAo1nB25K",
339 | "outputId": "082b1af2-429c-43e3-fba4-38b10de97816"
340 | }
341 | },
342 | {
343 | "cell_type": "markdown",
344 | "source": [
345 | "- `df.dtypes`: Lista o nome das colunas e o tipo de dados que contém em cada uma."
346 | ],
347 | "metadata": {
348 | "id": "7n8dcFVKCqC1"
349 | }
350 | },
351 | {
352 | "cell_type": "code",
353 | "execution_count": null,
354 | "source": [
355 | "df.dtypes"
356 | ],
357 | "outputs": [],
358 | "metadata": {
359 | "colab": {
360 | "base_uri": "https://localhost:8080/"
361 | },
362 | "id": "a-P-ffGlC9fT",
363 | "outputId": "26e2acc4-616e-4bce-dbc4-614dbeebdf0c"
364 | }
365 | },
366 | {
367 | "cell_type": "markdown",
368 | "source": [
369 | "# Ordenando os dados"
370 | ],
371 | "metadata": {
372 | "id": "rPQDjya2DUxJ"
373 | }
374 | },
375 | {
376 | "cell_type": "markdown",
377 | "source": [
378 | "Para ordenar um DataFrame, use o método `sort_values()`. A maneira mais simples de uso é passando o nome de uma coluna entre parênteses."
379 | ],
380 | "metadata": {
381 | "id": "R4X7UWiwDfS_"
382 | }
383 | },
384 | {
385 | "cell_type": "code",
386 | "execution_count": null,
387 | "source": [
388 | "df.sort_values('SALARY')"
389 | ],
390 | "outputs": [],
391 | "metadata": {
392 | "colab": {
393 | "base_uri": "https://localhost:8080/",
394 | "height": 417
395 | },
396 | "id": "6zrpde4fEgH5",
397 | "outputId": "0825f294-0bf0-47d9-fdd6-a7ec04e8243e"
398 | }
399 | },
400 | {
401 | "cell_type": "markdown",
402 | "source": [
403 | "Como padrão esse método ordena de forma crescente. Se desejar que seja decrescente, coloque `ascending=False`. \n",
404 | "\n",
405 | "Observe que o valor boleano não é uma string, por isso não está entre aspas e tem a letra inicial em maiúscula. Alguns métodos ou funções possuem diversos argumentos que podem ser passados entre parênteses, para saber quais são consulte a [documentação do Pandas](https://pandas.pydata.org/docs/). Se desejar passar mais de um argumento, basta separar eles com vírgulas."
406 | ],
407 | "metadata": {
408 | "id": "5y4OKcr0HBIY"
409 | }
410 | },
411 | {
412 | "cell_type": "code",
413 | "execution_count": null,
414 | "source": [
415 | "df.sort_values('SALARY', ascending=False)"
416 | ],
417 | "outputs": [],
418 | "metadata": {
419 | "colab": {
420 | "base_uri": "https://localhost:8080/",
421 | "height": 417
422 | },
423 | "id": "_bi1Q_UpG8WY",
424 | "outputId": "8cbce0f3-4102-425c-f6ce-346638675d7d"
425 | }
426 | },
427 | {
428 | "cell_type": "markdown",
429 | "source": [
430 | "Você pode encadear vários métodos em uma linha. Por exemplo, se quisessemos ordenar os dados de maneira descendente e mostrar apenas as cinco primeiras linhas, poderíamos fazer dessa forma:"
431 | ],
432 | "metadata": {
433 | "id": "iVb_Sl8WKObE"
434 | }
435 | },
436 | {
437 | "cell_type": "code",
438 | "execution_count": null,
439 | "source": [
440 | "df.sort_values('SALARY', ascending=False).head()"
441 | ],
442 | "outputs": [],
443 | "metadata": {
444 | "colab": {
445 | "base_uri": "https://localhost:8080/",
446 | "height": 203
447 | },
448 | "id": "FyrCNZpnKJpI",
449 | "outputId": "fcf61fc5-2af7-4b70-e86b-5e39b6a63343"
450 | }
451 | },
452 | {
453 | "cell_type": "markdown",
454 | "source": [
455 | "Você pode ordenar várias colunas de uma vez, passando uma lista com nome de colunas ao invés de uma única coluna. Uma lista é um conjunto de itens separado por vírgulas, entre colchetes `[]`.
\n",
456 | "Para ordenar primeiro `SALARY` e depois `TEAM`: "
457 | ],
458 | "metadata": {
459 | "id": "ZkoYGO3ALGQg"
460 | }
461 | },
462 | {
463 | "cell_type": "code",
464 | "execution_count": null,
465 | "source": [
466 | "df.sort_values(['SALARY','TEAM']).head()"
467 | ],
468 | "outputs": [],
469 | "metadata": {
470 | "colab": {
471 | "base_uri": "https://localhost:8080/",
472 | "height": 203
473 | },
474 | "id": "nBQDaab7LAoZ",
475 | "outputId": "0da8720b-e928-472a-8859-2c24dcc29aa9"
476 | }
477 | },
478 | {
479 | "cell_type": "markdown",
480 | "source": [
481 | "Você pode especificar o ordenamento (ascendente ou descendente) para cada coluna listada, passando um outra lista para o `ascending` com `True` e `False`, na ordem das colunas a serem ordenadas. Por exemplo, para ordenar a coluna `SALARY` como descendente e `TEAM` como `ascendente`, seria:"
482 | ],
483 | "metadata": {
484 | "id": "MkH5MGHfNVAv"
485 | }
486 | },
487 | {
488 | "cell_type": "code",
489 | "execution_count": null,
490 | "source": [
491 | "df.sort_values(['SALARY', 'TEAM'], ascending=[False,True]).head()"
492 | ],
493 | "outputs": [],
494 | "metadata": {
495 | "colab": {
496 | "base_uri": "https://localhost:8080/",
497 | "height": 203
498 | },
499 | "id": "tkny4hbgMs8I",
500 | "outputId": "89b6ce7c-3e08-464b-98ba-cf22bdefff82"
501 | }
502 | },
503 | {
504 | "cell_type": "markdown",
505 | "source": [
506 | "O `False` foi para coluna `SALARY` e o `True` para coluna `TEAM` porque estes operadores.\n",
507 | "ooleanos estão na mesma posição que as colunas foram passadas na lista.operadores.\n",
508 | "\n",
509 | "**Observação:** Apesar de terem sido feitas essas ordenações, nenhuma alteração foi aplicada ao dataframe original.\n"
510 | ],
511 | "metadata": {
512 | "id": "fD3oXjCQkryH"
513 | }
514 | },
515 | {
516 | "cell_type": "code",
517 | "execution_count": null,
518 | "source": [
519 | "df.head()"
520 | ],
521 | "outputs": [],
522 | "metadata": {
523 | "colab": {
524 | "base_uri": "https://localhost:8080/",
525 | "height": 203
526 | },
527 | "id": "yBZbyr0vkmnt",
528 | "outputId": "bbd9bce6-fcb3-4b2b-92e1-ff963cf7da7b"
529 | }
530 | },
531 | {
532 | "cell_type": "markdown",
533 | "source": [
534 | "Isso acontece porque não salvamos os resultados do ordenamento em uma variável. Se você quiser manter o ordenamento que você fez (ou qualquer outro tipo de manipulação), recomenda-se guardar os resultados em uma variável."
535 | ],
536 | "metadata": {
537 | "id": "a0N1gOfNmpkK"
538 | }
539 | },
540 | {
541 | "cell_type": "code",
542 | "execution_count": null,
543 | "source": [
544 | "ordenar_por_team = df.sort_values('TEAM')\n"
545 | ],
546 | "outputs": [],
547 | "metadata": {
548 | "id": "5aj_SefOlgYr"
549 | }
550 | },
551 | {
552 | "cell_type": "code",
553 | "execution_count": null,
554 | "source": [
555 | "ordenar_por_team.head()"
556 | ],
557 | "outputs": [],
558 | "metadata": {
559 | "colab": {
560 | "base_uri": "https://localhost:8080/",
561 | "height": 203
562 | },
563 | "id": "FI5aBh0InQ-w",
564 | "outputId": "30a7cf36-160b-4d47-fb04-5a70269d705a"
565 | }
566 | },
567 | {
568 | "cell_type": "markdown",
569 | "source": [
570 | "✍️ **Sua vez!**
\n", 571 | "Nas próximas células, ordene o DataFrame `df`:\n", 572 | "\n", 573 | "\n", 574 | "\n", 575 | "* Pela coluna `NAME`\n", 576 | "\n", 577 | "\n" 578 | ], 579 | "metadata": { 580 | "id": "_ZJVNLrnneSQ" 581 | } 582 | }, 583 | { 584 | "cell_type": "code", 585 | "execution_count": null, 586 | "source": [], 587 | "outputs": [], 588 | "metadata": { 589 | "id": "jbk3eGUbnWT-" 590 | } 591 | }, 592 | { 593 | "cell_type": "markdown", 594 | "source": [ 595 | "* Pela coluna `POS` de modo descendente\n" 596 | ], 597 | "metadata": { 598 | "id": "HUML7v0uKbtr" 599 | } 600 | }, 601 | { 602 | "cell_type": "code", 603 | "execution_count": null, 604 | "source": [], 605 | "outputs": [], 606 | "metadata": { 607 | "id": "5JPFWItKpULe" 608 | } 609 | }, 610 | { 611 | "cell_type": "markdown", 612 | "source": [ 613 | "* Pela coluna `SALARY` de modo descendente, `POS` de modo ascendente, e salve os resultados em uma variável chamada `ordene_por_salary_e_pos`" 614 | ], 615 | "metadata": { 616 | "id": "HOh_KemCKdrQ" 617 | } 618 | }, 619 | { 620 | "cell_type": "code", 621 | "execution_count": null, 622 | "source": [], 623 | "outputs": [], 624 | "metadata": { 625 | "id": "tGo3aP1WpUBy" 626 | } 627 | }, 628 | { 629 | "cell_type": "markdown", 630 | "source": [ 631 | "# Filtrar os dados" 632 | ], 633 | "metadata": { 634 | "id": "w8L3kQz9pibd" 635 | } 636 | }, 637 | { 638 | "cell_type": "markdown", 639 | "source": [ 640 | "Vamos ver dois tipos diferentes de filtro:\n", 641 | "\n", 642 | "\n", 643 | "* **Filtro de coluna:** Retorna uma ou mais colunas de dados especificadas, semelhante a passar nome de colunas no `SELECT` em uma consulta SQL.\n", 644 | " \n", 645 | "* **Filtro de linha:** Retorna um recorte dos seus dados que atenda aos critérios que foram especificados, semelhante a uma consulta SQL usando `WHERE`. Por exemplo: Mostre todos os dados no DataFrame onde os valores da coluna `TEAM` sejam igual a `ARI`. \n", 646 | "\n" 647 | ], 648 | "metadata": { 649 | "id": "k1PpSFuHpl-d" 650 | } 651 | }, 652 | { 653 | "cell_type": "markdown", 654 | "source": [ 655 | "**Filtro de coluna**
\n", 656 | "Para acessar os valores em uma única coluna de dados, você pode usar um ponto e o nome da coluna, desde que o nome da coluna não tenha espaços ou caracteres especiais." 657 | ], 658 | "metadata": { 659 | "id": "BYiNMfDPsBrO" 660 | } 661 | }, 662 | { 663 | "cell_type": "code", 664 | "execution_count": null, 665 | "source": [ 666 | "df.TEAM" 667 | ], 668 | "outputs": [], 669 | "metadata": { 670 | "colab": { 671 | "base_uri": "https://localhost:8080/" 672 | }, 673 | "id": "aBT8OJ-LsbXX", 674 | "outputId": "2c28ac02-d5f7-4935-9004-03307d661ff3" 675 | } 676 | }, 677 | { 678 | "cell_type": "markdown", 679 | "source": [ 680 | "Outro jeito é usando os colchetes com o nome da coluna entre aspas. Este modo é bastante útil quando o nome das colunas possuem espaços, por exemplo." 681 | ], 682 | "metadata": { 683 | "id": "-UddmFC4sfSu" 684 | } 685 | }, 686 | { 687 | "cell_type": "code", 688 | "execution_count": null, 689 | "source": [ 690 | "df['TEAM']" 691 | ], 692 | "outputs": [], 693 | "metadata": { 694 | "colab": { 695 | "base_uri": "https://localhost:8080/" 696 | }, 697 | "id": "HWq66WXmsc1z", 698 | "outputId": "ff090ffc-e490-4022-8306-b15dc4924803" 699 | } 700 | }, 701 | { 702 | "cell_type": "markdown", 703 | "source": [ 704 | "Quando você acessa uma única coluna no seu DataFrame, você está pegando uma parte dele, que é chamada de `Series`.\n", 705 | "\n", 706 | "Um dos métodos que podem ser chamados para série (Series) é o `unique()`, que mostra apenas valores únicos da coluna. Vamos fazer isso com a coluna `TEAM`:" 707 | ], 708 | "metadata": { 709 | "id": "jNLWExK8tMOZ" 710 | } 711 | }, 712 | { 713 | "cell_type": "code", 714 | "execution_count": null, 715 | "source": [ 716 | "df.TEAM.unique()" 717 | ], 718 | "outputs": [], 719 | "metadata": { 720 | "colab": { 721 | "base_uri": "https://localhost:8080/" 722 | }, 723 | "id": "m-SIbWontKEg", 724 | "outputId": "e24e81d2-e324-4133-aa44-746ea2ef4c47" 725 | } 726 | }, 727 | { 728 | "cell_type": "markdown", 729 | "source": [ 730 | "Você pode contar o total de linhas para cada valor usando o método `values_counts()`:" 731 | ], 732 | "metadata": { 733 | "id": "ZYa23NKhvKey" 734 | } 735 | }, 736 | { 737 | "cell_type": "code", 738 | "execution_count": null, 739 | "source": [ 740 | "df.TEAM.value_counts()" 741 | ], 742 | "outputs": [], 743 | "metadata": { 744 | "colab": { 745 | "base_uri": "https://localhost:8080/" 746 | }, 747 | "id": "Kw3fjiYUuh2a", 748 | "outputId": "3a922c2e-c41d-4b66-b31c-7d924384dbb4" 749 | } 750 | }, 751 | { 752 | "cell_type": "markdown", 753 | "source": [ 754 | "Para colunas numéricas, você pode chamar métodos básicos de estatística na coluna:\n", 755 | "\n", 756 | "\n", 757 | "* `min()` pega o menor valor\n", 758 | "* `max()` pega o maior valor\n", 759 | "* `median()` pega a mediana\n", 760 | "* `mean()` pega a média\n", 761 | "* `mode()` pega o valor mais comum\n", 762 | "\n", 763 | "Vamos checar esses métodos, aplicando-os na coluna `SALARY`: " 764 | ], 765 | "metadata": { 766 | "id": "v7RrplsrwC54" 767 | } 768 | }, 769 | { 770 | "cell_type": "code", 771 | "execution_count": null, 772 | "source": [ 773 | "df.SALARY.min()" 774 | ], 775 | "outputs": [], 776 | "metadata": { 777 | "colab": { 778 | "base_uri": "https://localhost:8080/" 779 | }, 780 | "id": "rnNickwEv_Oi", 781 | "outputId": "912606fb-6314-4d12-d930-92196b001bbf" 782 | } 783 | }, 784 | { 785 | "cell_type": "code", 786 | "execution_count": null, 787 | "source": [ 788 | "df.SALARY.max()" 789 | ], 790 | "outputs": [], 791 | "metadata": { 792 | "colab": { 793 | "base_uri": "https://localhost:8080/" 794 | }, 795 | "id": "NmdyBH__xX_R", 796 | "outputId": "63f49458-9126-4c7e-86f6-77002d143903" 797 | } 798 | }, 799 | { 800 | "cell_type": "code", 801 | "execution_count": null, 802 | "source": [ 803 | "df.SALARY.median()" 804 | ], 805 | "outputs": [], 806 | "metadata": { 807 | "colab": { 808 | "base_uri": "https://localhost:8080/" 809 | }, 810 | "id": "ZEwp--CwxcYY", 811 | "outputId": "13b782eb-c570-44d4-d726-cffbe040b85c" 812 | } 813 | }, 814 | { 815 | "cell_type": "code", 816 | "execution_count": null, 817 | "source": [ 818 | "df.SALARY.mean()" 819 | ], 820 | "outputs": [], 821 | "metadata": { 822 | "colab": { 823 | "base_uri": "https://localhost:8080/" 824 | }, 825 | "id": "GMRFNNWVxfww", 826 | "outputId": "e48ff705-b908-48a4-ee52-04f040574e05" 827 | } 828 | }, 829 | { 830 | "cell_type": "code", 831 | "execution_count": null, 832 | "source": [ 833 | "df.SALARY.mode()" 834 | ], 835 | "outputs": [], 836 | "metadata": { 837 | "colab": { 838 | "base_uri": "https://localhost:8080/" 839 | }, 840 | "id": "f40BKlKexjdg", 841 | "outputId": "fc7242e5-716b-4feb-ab8e-2ec1396404d6" 842 | } 843 | }, 844 | { 845 | "cell_type": "markdown", 846 | "source": [ 847 | "Para selecionar várias colunas do DataFrame, passamos uma lista com os nomes das colunas entre colchetes, ao invés de apenas uma. Uma maneira de ficar legível é executando esse procedimento em duas etapas." 848 | ], 849 | "metadata": { 850 | "id": "3ULROXxxxq9g" 851 | } 852 | }, 853 | { 854 | "cell_type": "code", 855 | "execution_count": null, 856 | "source": [ 857 | "# Salva em uma variável as colunas que desejamos filtrar\n", 858 | "colunas_filtradas = ['TEAM','SALARY']\n", 859 | "\n", 860 | "# Passa a variável entre colchetes, junto ao nome do DataFrame\n", 861 | "df[colunas_filtradas]" 862 | ], 863 | "outputs": [], 864 | "metadata": { 865 | "colab": { 866 | "base_uri": "https://localhost:8080/", 867 | "height": 417 868 | }, 869 | "id": "bZu-Jsg3xmDm", 870 | "outputId": "6a58a6b3-54a2-4053-bad5-7c9e15aa17d9" 871 | } 872 | }, 873 | { 874 | "cell_type": "markdown", 875 | "source": [ 876 | "**Filtrando linhas**\n", 877 | "\n", 878 | "O colchetes também é usado para filtrar linhas. Neste caso, ao invés do nome da coluna (ou uma lista de nomes), colocamos dentro do colchetes uma condição.\n", 879 | "\n", 880 | "Vamos filtrar nossos dados para ver qual jogador tem salário maior que 1000000, ou seja, o filtro deve retornar as linhas onde o valor da coluna `SALARY` seja maior que $1.000.000." 881 | ], 882 | "metadata": { 883 | "id": "9jzwToOUy2Nc" 884 | } 885 | }, 886 | { 887 | "cell_type": "code", 888 | "execution_count": null, 889 | "source": [ 890 | "df[df.SALARY > 1000000]" 891 | ], 892 | "outputs": [], 893 | "metadata": { 894 | "colab": { 895 | "base_uri": "https://localhost:8080/", 896 | "height": 417 897 | }, 898 | "id": "_-QDt1lpyw05", 899 | "outputId": "bac1fa1c-1ce1-4cd3-ddfb-58cec8bb7192" 900 | } 901 | }, 902 | { 903 | "cell_type": "markdown", 904 | "source": [ 905 | "Esse filtro em SQL seria:\n", 906 | "\n", 907 | "```sql\n", 908 | "SELECT *\n", 909 | "FROM mlb\n", 910 | "WHERE SALARY > 1000000\n", 911 | "```" 912 | ], 913 | "metadata": { 914 | "id": "dIvS8zDLzWDb" 915 | } 916 | }, 917 | { 918 | "cell_type": "markdown", 919 | "source": [ 920 | "É possível usar os operadores de comparação do Python:\n", 921 | "\n", 922 | "\n", 923 | "* `>` maior que\n", 924 | "* `>=` maior ou igual a\n", 925 | "* `<` menor que\n", 926 | "* `<=` menor ou igual a\n", 927 | "* `==` igual a\n", 928 | "* `!=` diferente de\n", 929 | "\n", 930 | "\n" 931 | ], 932 | "metadata": { 933 | "id": "E0_c82Dt2knF" 934 | } 935 | }, 936 | { 937 | "cell_type": "markdown", 938 | "source": [ 939 | "**Filtro com muitas condições**\n", 940 | "\n", 941 | "O que fazer quando se quer usar um filtro com mais de uma condição? Podemos salvar os resultados de cada filtro em uma variável e depois filtrar novamente a partir do DataFrame original.\n", 942 | "\n", 943 | "Por exemplo, se você quiser saber quais jogadores do Colorado Rockies tem salários acima de $1 milhão, você pode fazer assim:" 944 | ], 945 | "metadata": { 946 | "id": "fXqu247FDQpe" 947 | } 948 | }, 949 | { 950 | "cell_type": "code", 951 | "execution_count": null, 952 | "source": [ 953 | "#Filtrando primeiro só quem joga no Colorado Rockies\n", 954 | "rockies = df[df.TEAM == 'COL']\n", 955 | "\n", 956 | "#Filtrando os salários maiores que $1 milhão, utilizando o filtro anterior para sinalizar em qual time o filtro deve acontecer \n", 957 | "rockies_maior_1m = rockies[rockies.SALARY > 1000000]\n", 958 | "\n", 959 | "rockies_maior_1m" 960 | ], 961 | "outputs": [], 962 | "metadata": { 963 | "colab": { 964 | "base_uri": "https://localhost:8080/", 965 | "height": 511 966 | }, 967 | "id": "iX5lETbyFfbR", 968 | "outputId": "4709dfc0-5309-4c11-f7e2-9d697ab88d07" 969 | } 970 | }, 971 | { 972 | "cell_type": "markdown", 973 | "source": [ 974 | "✍️ **Sua vez!**\n", 975 | "\n", 976 | "Nas celulas seguintes, faça os seguintes filtros: \n", 977 | "\n", 978 | "\n", 979 | "* **Filtro de coluna:** Selecione a coluna `NAME`\n", 980 | "\n", 981 | "\n" 982 | ], 983 | "metadata": { 984 | "id": "WYDjKl9lG1Iq" 985 | } 986 | }, 987 | { 988 | "cell_type": "code", 989 | "execution_count": null, 990 | "source": [], 991 | "outputs": [], 992 | "metadata": { 993 | "id": "WQTndVNEGpZn" 994 | } 995 | }, 996 | { 997 | "cell_type": "markdown", 998 | "source": [ 999 | "* **Filtro de coluna:** Selecione as colunas `NAME` e `TEAM`\n", 1000 | " " 1001 | ], 1002 | "metadata": { 1003 | "id": "UgX8yYTBJ-9w" 1004 | } 1005 | }, 1006 | { 1007 | "cell_type": "code", 1008 | "execution_count": null, 1009 | "source": [], 1010 | "outputs": [], 1011 | "metadata": { 1012 | "id": "JUDmXaXkJ3Sc" 1013 | } 1014 | }, 1015 | { 1016 | "cell_type": "markdown", 1017 | "source": [ 1018 | "* **Filtro de linha:** Filtre as linhas e traga como resultado apenas os Catchers (C, na coluna `POS`) que tem salários a partir de $750000\n" 1019 | ], 1020 | "metadata": { 1021 | "id": "fZvAHAcxKN6L" 1022 | } 1023 | }, 1024 | { 1025 | "cell_type": "code", 1026 | "execution_count": null, 1027 | "source": [], 1028 | "outputs": [], 1029 | "metadata": { 1030 | "id": "UxXO5R24J4Zn" 1031 | } 1032 | }, 1033 | { 1034 | "cell_type": "markdown", 1035 | "source": [ 1036 | "* **BÔNUS:** Filtre as linhas e traga apenas os jogadores do Chicago Cubs (CHC), depois ordene de maneira descendente a coluna `SALARY`" 1037 | ], 1038 | "metadata": { 1039 | "id": "1xZr1ECBKQNr" 1040 | } 1041 | }, 1042 | { 1043 | "cell_type": "code", 1044 | "execution_count": null, 1045 | "source": [], 1046 | "outputs": [], 1047 | "metadata": { 1048 | "id": "rCgL7iYtJ4Ev" 1049 | } 1050 | }, 1051 | { 1052 | "cell_type": "markdown", 1053 | "source": [ 1054 | "# Agupar e agregar os dados" 1055 | ], 1056 | "metadata": { 1057 | "id": "4d3jHHUlKyVv" 1058 | } 1059 | }, 1060 | { 1061 | "cell_type": "markdown", 1062 | "source": [ 1063 | "O método `groupby` é usado para agrupar e agregar os dados, semelhante ao que é feito em uma tabela dinâmica ou uma consulta SQL. O Pandas também tem um método para tabela dinâmica, caso te interesse [você pode conferir na documentação](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html).\n", 1064 | "\n", 1065 | "\n", 1066 | "Digamos que queremos ver o top 10 dos times por folha de pagamento. Em outras palavras nós queremos:\n", 1067 | "\n", 1068 | "* Agrupar os dados pela coluna `TEAM`: `groupby()`\n", 1069 | "* Somar os resultados de cada grupo: `sum()`\n", 1070 | "* Ordenas os resultados pela coluna `SALARY` de forma descendente: `sort_values()`\n", 1071 | "* Mostrar apenas o top 10: `head(10)`\n", 1072 | " \n", 1073 | "Chamar o método `groupby()` sem dizer o que ele faz com os resultados agrupados não ajuda muito:" 1074 | ], 1075 | "metadata": { 1076 | "id": "k4Y-FJ_kK_ZY" 1077 | } 1078 | }, 1079 | { 1080 | "cell_type": "code", 1081 | "execution_count": null, 1082 | "source": [ 1083 | "df.groupby('TEAM')" 1084 | ], 1085 | "outputs": [], 1086 | "metadata": { 1087 | "colab": { 1088 | "base_uri": "https://localhost:8080/" 1089 | }, 1090 | "id": "u5YG42W0Nuvf", 1091 | "outputId": "cbd318bb-55d4-42a1-f870-97e33709a937" 1092 | } 1093 | }, 1094 | { 1095 | "cell_type": "markdown", 1096 | "source": [ 1097 | "Basicamente o Pandas só nos diz que o agrupamento foi bem sucedido. O que fazemos agora? Usando métodos encadeados, descrevemos o que gostariamos de fazer com as colunas numéricas depois que elas estão agrupadas.
Vamos começar com `sum()`:" 1098 | ], 1099 | "metadata": { 1100 | "id": "mECWVmtjN4GJ" 1101 | } 1102 | }, 1103 | { 1104 | "cell_type": "code", 1105 | "execution_count": null, 1106 | "source": [ 1107 | "df.groupby('TEAM').sum()" 1108 | ], 1109 | "outputs": [], 1110 | "metadata": { 1111 | "colab": { 1112 | "base_uri": "https://localhost:8080/", 1113 | "height": 1000 1114 | }, 1115 | "id": "b1LhHNfWNzKy", 1116 | "outputId": "2caf81fd-9c24-4abb-d2e8-f19708046933" 1117 | } 1118 | }, 1119 | { 1120 | "cell_type": "markdown", 1121 | "source": [ 1122 | "Perfeito! Exceto pelo fato que o Pandas somou todas as colunas numéricas e não apenas a coluna `SALARY`. Para ajustar isso, filtraremos as duas colunas que estamos interessados - agrupando pela coluna `TEAM` e então somaremos os valores. Como nesse filtro a única coluna numérica é `SALARY`, o Pandas vai entender que é apenas essa que deve ser somada.\n", 1123 | "\n", 1124 | "**Lembre-se:** Para selecionar as colunas de um DataFrame, use colchetes e liste o nome das colunas, separando com vírgula.\n", 1125 | "\n", 1126 | "\n", 1127 | "\n" 1128 | ], 1129 | "metadata": { 1130 | "id": "2wpGQvFdUVhm" 1131 | } 1132 | }, 1133 | { 1134 | "cell_type": "code", 1135 | "execution_count": null, 1136 | "source": [ 1137 | "df[['TEAM', 'SALARY']].groupby('TEAM').sum()" 1138 | ], 1139 | "outputs": [], 1140 | "metadata": { 1141 | "id": "4wR6tQClUR_y" 1142 | } 1143 | }, 1144 | { 1145 | "cell_type": "markdown", 1146 | "source": [ 1147 | "Ótimo! Agora encadeando os métodos vamos ordenar a coluna `SALARY` de maneira descendente, trazendo como resultado apenas o top 10:" 1148 | ], 1149 | "metadata": { 1150 | "id": "Kca5rzsQv4Dc" 1151 | } 1152 | }, 1153 | { 1154 | "cell_type": "code", 1155 | "execution_count": null, 1156 | "source": [ 1157 | "df[['TEAM','SALARY']].groupby('TEAM').sum().sort_values('SALARY', ascending=False).head(10)" 1158 | ], 1159 | "outputs": [], 1160 | "metadata": { 1161 | "id": "1niPvLhjvaHO" 1162 | } 1163 | }, 1164 | { 1165 | "cell_type": "markdown", 1166 | "source": [ 1167 | "Você pode agregar outros métodos além do `sum()`, como `mean()` e `median()`, usando o método `agg()` para aplicar mais de uma operação." 1168 | ], 1169 | "metadata": { 1170 | "id": "LQmL-m02wdwx" 1171 | } 1172 | }, 1173 | { 1174 | "cell_type": "code", 1175 | "execution_count": null, 1176 | "source": [ 1177 | "df[['TEAM','SALARY']].groupby('TEAM').median()" 1178 | ], 1179 | "outputs": [], 1180 | "metadata": { 1181 | "id": "JqZQjuoLwYlM" 1182 | } 1183 | }, 1184 | { 1185 | "cell_type": "code", 1186 | "execution_count": null, 1187 | "source": [ 1188 | "df[['TEAM','SALARY']].groupby('TEAM').mean()" 1189 | ], 1190 | "outputs": [], 1191 | "metadata": { 1192 | "id": "7Wl-uU6ExITT" 1193 | } 1194 | }, 1195 | { 1196 | "cell_type": "code", 1197 | "execution_count": null, 1198 | "source": [ 1199 | "df[['TEAM','SALARY']].groupby('TEAM').agg(['sum','mean','median'])" 1200 | ], 1201 | "outputs": [], 1202 | "metadata": { 1203 | "id": "gzrQal7bxK6_" 1204 | } 1205 | }, 1206 | { 1207 | "cell_type": "markdown", 1208 | "source": [ 1209 | "\n", 1210 | "✍️ **Sua vez!**
\n", 1211 | "Nas próximas células, faça os seguintes agrupamentos:\n", 1212 | "\n", 1213 | "\n", 1214 | "* Qual a média salarial de cada posição? Agrupe os dados por `POS` e descubra a mediana (`median()`), depois agrupe a coluna `SALARY` de maneira descendente.\n", 1215 | "\n", 1216 | "\n" 1217 | ], 1218 | "metadata": { 1219 | "id": "Mgp85vxtxdlu" 1220 | } 1221 | }, 1222 | { 1223 | "cell_type": "code", 1224 | "execution_count": null, 1225 | "source": [], 1226 | "outputs": [], 1227 | "metadata": { 1228 | "id": "42NIatLnxWUU" 1229 | } 1230 | }, 1231 | { 1232 | "cell_type": "markdown", 1233 | "source": [ 1234 | "* Qual a média salarial de cada time? Agrupe os dados pela coluna `TEAM` e some (`sum()`), depois ordene pela coluna `SALARY` de maneira descendente.\n", 1235 | "\n" 1236 | ], 1237 | "metadata": { 1238 | "id": "QcR5nfjNyFS0" 1239 | } 1240 | }, 1241 | { 1242 | "cell_type": "code", 1243 | "execution_count": null, 1244 | "source": [], 1245 | "outputs": [], 1246 | "metadata": { 1247 | "id": "fnRM7z-_yZPE" 1248 | } 1249 | }, 1250 | { 1251 | "cell_type": "markdown", 1252 | "source": [ 1253 | "# Exportar como CSV" 1254 | ], 1255 | "metadata": { 1256 | "id": "owwjr5-hyYSv" 1257 | } 1258 | }, 1259 | { 1260 | "cell_type": "markdown", 1261 | "source": [ 1262 | "Para exportar o DataFrame como um arquivo CSV, use o método `to_csv`, indicando o caminho onde deseja que seu arquivo seja salvo. Se você não quiser incluir o índice do DataFrame, especifique usando `index=False`." 1263 | ], 1264 | "metadata": { 1265 | "id": "8ECmyhcgyfJw" 1266 | } 1267 | }, 1268 | { 1269 | "cell_type": "code", 1270 | "execution_count": null, 1271 | "source": [ 1272 | "df.to_csv('meu_arquivo.csv', index=False)" 1273 | ], 1274 | "outputs": [], 1275 | "metadata": { 1276 | "id": "iGlKt3-dy_Fn" 1277 | } 1278 | } 1279 | ] 1280 | } -------------------------------------------------------------------------------- /Python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 5, 4 | "metadata": { 5 | "kernelspec": { 6 | "name": "python3", 7 | "display_name": "Python 3.9.5 64-bit" 8 | }, 9 | "language_info": { 10 | "codemirror_mode": { 11 | "name": "ipython", 12 | "version": 3 13 | }, 14 | "file_extension": ".py", 15 | "mimetype": "text/x-python", 16 | "name": "python", 17 | "nbconvert_exporter": "python", 18 | "pygments_lexer": "ipython3", 19 | "version": "3.9.5" 20 | }, 21 | "colab": { 22 | "name": "Dicas de sintaxe do Python.ipynb", 23 | "provenance": [] 24 | }, 25 | "interpreter": { 26 | "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 27 | } 28 | }, 29 | "cells": [ 30 | { 31 | "cell_type": "markdown", 32 | "source": [ 33 | "# Dicas de sintaxe do Python" 34 | ], 35 | "metadata": { 36 | "id": "incMEzozpiMc" 37 | } 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "Quer aprender Python, mas não sabe por onde começar? Esse tutorial foi feito para você. Ele é baseado em uma tradução do notebook [Python syntax cheat sheet](https://github.com/ireapps/teaching-guide-intro-to-pandas/blob/master/Python%20syntax%20cheat%20sheet.ipynb), que foi revisada e expandida pela Escola de Dados.\n", 43 | "\n", 44 | "Aqui, focaremos em conhecimentos básicos sobre a linguagem.\n", 45 | "\n", 46 | "Seguiremos as seguintes etapas:\n", 47 | "\n", 48 | "- Usando notebooks\n", 49 | "- Tipos embutidos\n", 50 | " - Strings\n", 51 | " - Números e operações matemáticas\n", 52 | " - Booleanos\n", 53 | "- Atribuição de variável\n", 54 | "- Métodos de string\n", 55 | "- Comentários\n", 56 | "- A função `print()`\n", 57 | "- Coleções de dados\n", 58 | " - Listas\n", 59 | " - Dicionários\n", 60 | "- Estrutura de repetição `for`\n", 61 | "- Declarações `if`\n", 62 | "\n", 63 | "Pronto? Vamos lá!" 64 | ], 65 | "metadata": { 66 | "id": "24c0378a" 67 | } 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "source": [ 72 | "# Usando notebooks" 73 | ], 74 | "metadata": { 75 | "id": "8bgiQd0goQOA" 76 | } 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "source": [ 81 | "Há muitas maneiras de escrever e rodar um código Python no seu computador. Uma delas - o método que estamos usando aqui - é usar os notebooks, que nada mais são do que documentos interativos que permitem escrever códigos, executá-los e ver os resultados. Tudo no mesmo lugar. \n", 82 | "\n", 83 | "Notebooks podem ser utilizados online. É o caso, por exemplo, do [Google Colab](https://colab.research.google.com/) ou do site do [Jupyter](https://jupyter.org/try). Também é possível trabalhar com eles de forma offline, mas diretamente do seu navegador, com o [Jupyter Notebook](https://jupyter.org/). Outra opção ainda é usar algum outro programa que tenha suporte a notebooks, como o [Visual Studio Code](https://code.visualstudio.com/).\n", 84 | "\n", 85 | "Os notebooks são muito úteis para análise de dados, pois permitem deixar seu código bem documentado, com explicações sobre o que acontece em cada etapa do processo. Além de códigos, você pode incluir textos (como este que você está lendo) no formato \"markdown\". Você pode encontrar exemplos de notebook em alguns de nossos [tutoriais da Escola de Dados](https://escoladedados.org/tutoriais/), como este sobre [cruzar dados de desmatamento e agropecuária usando Python](https://escoladedados.org/tutoriais/dados-de-desmatamento-e-agropecuaria-python/)." 86 | ], 87 | "metadata": { 88 | "id": "RVJeLciMoRV4" 89 | } 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "source": [ 94 | "Basicamente, o funcionamento de um notebook consiste em incluir novas células e executá-las.\n", 95 | "\n", 96 | "* **Para adicionar uma nova célula**: \n", 97 | " * Jupyter Notebook: Clique no ícone `+` embaixo do menu `File` e escolha se quer texto (markdown) ou código (Code) no menu suspenso embaixo do menu `Widgets`.\n", 98 | " * Google Colab: Clique em `+ Código` ou `+ Texto`, embaixo do menu `Arquivo`.\n", 99 | "\n", 100 | "* **Para executar uma célula de código:** Pressione `Shift` + `Enter`.\n", 101 | "\n", 102 | "## Erros comuns\n", 103 | "\n", 104 | "**Não executar as células**: O notebook não \"sabe\" o código que está na célula até que ele seja executado. Por exemplo, se você definir uma variável chamada `meu_nome` em uma célula e depois tentar acessar essa mesma variável em outra célula sem executar a célula que contém a variável antes, você receberá um erro: `NameError: name 'meu_nome' is not defined`. \n", 105 | "\n", 106 | "A solução é simplesmente rodar a célula onde está a variável. Repare que ao lado de cada notebook há um número, que indica a ordem de execução das células.\n", 107 | "\n", 108 | "**A célula \"congela\" em alguma execução**: Se ao executar uma célula, ela fica rodando \"para sempre\", com um sinal de `*` no lugar do número que indica a ordem de execução, então, provavelmente aconteceu alguma destas possibilidades: o código de fato leva muito tempo para ser executado, entrou em um loop infinito ou o \"kernel\" (que é como o \"cérebro\" do notebook, que de fato interpreta e executado os comandos) travou e será preciso reiniciá-lo. Neste caso, você pode clicar no botão com o símbolo quadrado de \"stop\" ou reiniciar o kernel.\n" 109 | ], 110 | "metadata": { 111 | "id": "D8kcyrqjo0xk" 112 | } 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "source": [ 117 | "# Tipos embutidos" 118 | ], 119 | "metadata": { 120 | "id": "6ca6b073" 121 | } 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "source": [ 126 | "Assim como Excel e outros softwares de processamento de dados, Python reconhece uma gama de diferentes tipos de dados, sendo que três deles receberão mais ênfase aqui:\n", 127 | "\n", 128 | "- Strings (texto)\n", 129 | "- Números (inteiros ou `int`, números com casas decimais ou `float`, por exemplo)\n", 130 | "- Booleanos (`True`(verdadeiro) e `False`(falso)).\n", 131 | "\n", 132 | "Você pode usar a função embutida [`type()`](https://docs.python.org/pt-br/3/library/functions.html#type) para verificar o tipo de dado de um valor qualquer. Rode a célula abaixo para visualizar um exemplo:" 133 | ], 134 | "metadata": { 135 | "id": "0ibIOohzqH-9" 136 | } 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": null, 141 | "source": [ 142 | "type(45)" 143 | ], 144 | "outputs": [], 145 | "metadata": { 146 | "colab": { 147 | "base_uri": "https://localhost:8080/" 148 | }, 149 | "id": "af15c560", 150 | "outputId": "427d2562-b495-4bd7-bf66-d4f15837e63e" 151 | } 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "source": [ 156 | "# Strings\n", 157 | "\n" 158 | ], 159 | "metadata": { 160 | "id": "ea34572a" 161 | } 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "source": [ 166 | "Uma string é um conjunto de caracteres - letras, números, acentos ou o que quer que seja - acompanhado de aspas simples ou duplas, não importando qual, contanto que as aspas de início e fim sejam iguais. O código nesse notebook usa aspas simples. O guia de estilo do Python não recomenda alternar entre aspas, [\"escolha uma e vá com ela até o fim.\"](https://www.python.org/dev/peps/pep-0008/#string-quotes).\n", 167 | "\n", 168 | "Rode a célula abaixo para ver um exemplo:" 169 | ], 170 | "metadata": { 171 | "id": "pi6oT35ar9kL" 172 | } 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": null, 177 | "source": [ 178 | "'Olá Mundo!'" 179 | ], 180 | "outputs": [], 181 | "metadata": { 182 | "colab": { 183 | "base_uri": "https://localhost:8080/", 184 | "height": 35 185 | }, 186 | "id": "zVj-rkDRBqIg", 187 | "outputId": "14a21c8f-3a26-4ccc-d22a-9d2506759293" 188 | } 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": null, 193 | "source": [ 194 | "\"Python é uma linguagem de programação\"" 195 | ], 196 | "outputs": [], 197 | "metadata": { 198 | "colab": { 199 | "base_uri": "https://localhost:8080/", 200 | "height": 35 201 | }, 202 | "id": "ymRKW58mCTs5", 203 | "outputId": "67fbc987-2d30-4ff6-f79b-367550ee5029" 204 | } 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "source": [ 209 | "Se a sua string possuir apostrófos ou citações, você tem duas opções para fazer o sinal. Execute as células para conferir: \n", 210 | "\n", 211 | "1. \"Escapar\" o caractere, colocando uma barra invertida (`\\`) antes dele:" 212 | ], 213 | "metadata": { 214 | "id": "oR5KnsYjBo6L" 215 | } 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": null, 220 | "source": [ 221 | "\"Já tomou um copo d\\'água hoje?\"" 222 | ], 223 | "outputs": [], 224 | "metadata": { 225 | "colab": { 226 | "base_uri": "https://localhost:8080/", 227 | "height": 35 228 | }, 229 | "id": "P_nuh4Ao8RMQ", 230 | "outputId": "a9b37807-4d04-4b7f-d23c-1d8192a42707" 231 | } 232 | }, 233 | { 234 | "cell_type": "markdown", 235 | "source": [ 236 | "2. Mudar as aspas simples para aspas duplas:" 237 | ], 238 | "metadata": { 239 | "id": "ncz8qSCP8q1M" 240 | } 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": null, 245 | "source": [ 246 | "\"Já tomou um copo d'água hoje?\"" 247 | ], 248 | "outputs": [], 249 | "metadata": { 250 | "colab": { 251 | "base_uri": "https://localhost:8080/", 252 | "height": 35 253 | }, 254 | "id": "a0hBLAQM8wug", 255 | "outputId": "4277e7dc-2e0f-490f-874b-9e69004cccfb" 256 | } 257 | }, 258 | { 259 | "cell_type": "markdown", 260 | "source": [ 261 | "Na prática, as duas alternativas funcionam da mesma forma. Mas a segunda opção é mais recomendada." 262 | ], 263 | "metadata": {} 264 | }, 265 | { 266 | "cell_type": "markdown", 267 | "source": [ 268 | "Quando você chama a funcão `type()` em uma string, o Python irá lhe retornar `str`." 269 | ], 270 | "metadata": { 271 | "id": "NdryWjbA81Ir" 272 | } 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": null, 277 | "source": [ 278 | "type('Olá!')" 279 | ], 280 | "outputs": [], 281 | "metadata": { 282 | "colab": { 283 | "base_uri": "https://localhost:8080/" 284 | }, 285 | "id": "56ebdf96", 286 | "outputId": "c5b94b7c-1757-41e6-fd7d-9d98d3e822d8" 287 | } 288 | }, 289 | { 290 | "cell_type": "markdown", 291 | "source": [ 292 | "Chamando a [função `str()`](https://docs.python.org/pt-br/3/library/stdtypes.html#str) em um valor qualquer, irá lhe retornar aquele mesmo valor convertido em string. Pode parecer que não muda nada, mas lembre-se que não é possível fazer operações matemáticas como substração, soma ou média com strings. É um erro comum na análise de dados tentar - sem sucesso - realizar operações do tipo em alguma coluna de uma base de dados, pois a variável apesar de ter números é interpretada como uma string." 293 | ], 294 | "metadata": { 295 | "id": "iNIBsmUY-Dn7" 296 | } 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": null, 301 | "source": [ 302 | "str(45)" 303 | ], 304 | "outputs": [], 305 | "metadata": { 306 | "colab": { 307 | "base_uri": "https://localhost:8080/", 308 | "height": 35 309 | }, 310 | "id": "cbbcd41d", 311 | "outputId": "2f8bc9a5-2bde-4043-8f1a-1911e86e36f1" 312 | } 313 | }, 314 | { 315 | "cell_type": "markdown", 316 | "source": [ 317 | "Você pode utilizar uma função dentro de outra função:" 318 | ], 319 | "metadata": { 320 | "id": "FJYOyHQ8_yuT" 321 | } 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": null, 326 | "source": [ 327 | "type(str(45))" 328 | ], 329 | "outputs": [], 330 | "metadata": { 331 | "id": "92f686f6" 332 | } 333 | }, 334 | { 335 | "cell_type": "markdown", 336 | "source": [ 337 | "Também pode passar um valor boleano e a função identificará como string:" 338 | ], 339 | "metadata": { 340 | "id": "DcGISO_o_8DR" 341 | } 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": null, 346 | "source": [ 347 | "str(True)" 348 | ], 349 | "outputs": [], 350 | "metadata": { 351 | "id": "3d4d3cfd" 352 | } 353 | }, 354 | { 355 | "cell_type": "markdown", 356 | "source": [ 357 | "Se você \"adicionar\" strings com um sinal de mais `+`, elas serão concatenadas:" 358 | ], 359 | "metadata": { 360 | "id": "fa70968e" 361 | } 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": null, 366 | "source": [ 367 | "'SEXTA' + '-' + 'FEIRA'" 368 | ], 369 | "outputs": [], 370 | "metadata": { 371 | "colab": { 372 | "base_uri": "https://localhost:8080/", 373 | "height": 35 374 | }, 375 | "id": "ca9c4c1d", 376 | "outputId": "a7ecb586-01c4-4b15-af2f-50078c822066" 377 | } 378 | }, 379 | { 380 | "cell_type": "markdown", 381 | "source": [ 382 | "Agora que você já sabe disso, qual a diferença entre as duas células abaixo? E por que elas produzem resultados diferentes?" 383 | ], 384 | "metadata": {} 385 | }, 386 | { 387 | "cell_type": "code", 388 | "execution_count": null, 389 | "source": [ 390 | "5+5" 391 | ], 392 | "outputs": [], 393 | "metadata": {} 394 | }, 395 | { 396 | "cell_type": "code", 397 | "execution_count": null, 398 | "source": [ 399 | "\"5\"+\"5\"" 400 | ], 401 | "outputs": [], 402 | "metadata": {} 403 | }, 404 | { 405 | "cell_type": "markdown", 406 | "source": [ 407 | "# Números e operações matemáticas\n" 408 | ], 409 | "metadata": { 410 | "id": "341b5053" 411 | } 412 | }, 413 | { 414 | "cell_type": "markdown", 415 | "source": [ 416 | "O Python reconhece diversos tipos de dados numéricos. Os dois mais comuns são: \n", 417 | "\n", 418 | "* integers (números inteiros)" 419 | ], 420 | "metadata": { 421 | "id": "pq1ZlP8-AwMf" 422 | } 423 | }, 424 | { 425 | "cell_type": "code", 426 | "execution_count": null, 427 | "source": [ 428 | "type(12)" 429 | ], 430 | "outputs": [], 431 | "metadata": { 432 | "id": "4db1e575" 433 | } 434 | }, 435 | { 436 | "cell_type": "markdown", 437 | "source": [ 438 | "* floats (números com casas decimais)." 439 | ], 440 | "metadata": { 441 | "id": "6Ygo-jylC9FL" 442 | } 443 | }, 444 | { 445 | "cell_type": "code", 446 | "execution_count": null, 447 | "source": [ 448 | "type(12.4)" 449 | ], 450 | "outputs": [], 451 | "metadata": { 452 | "colab": { 453 | "base_uri": "https://localhost:8080/" 454 | }, 455 | "id": "dba37e48", 456 | "outputId": "5b28ebc2-389a-4daf-cbc9-a28481d55d7a" 457 | } 458 | }, 459 | { 460 | "cell_type": "markdown", 461 | "source": [ 462 | "Assim como a função `str()` converte qualquer valor em string, chamar a função `int()` em um tipo de dado númerico (mesmo que este esteja no formato string) tentará forçá-lo a ser um inteiro." 463 | ], 464 | "metadata": { 465 | "id": "zLgVTnQWC2HN" 466 | } 467 | }, 468 | { 469 | "cell_type": "code", 470 | "execution_count": null, 471 | "source": [ 472 | "int(35.6)" 473 | ], 474 | "outputs": [], 475 | "metadata": { 476 | "id": "373c06c3" 477 | } 478 | }, 479 | { 480 | "cell_type": "code", 481 | "execution_count": null, 482 | "source": [ 483 | "int('45')" 484 | ], 485 | "outputs": [], 486 | "metadata": { 487 | "id": "0246bae3" 488 | } 489 | }, 490 | { 491 | "cell_type": "markdown", 492 | "source": [ 493 | "O mesmo acontece quando utilizamos a função `float()`." 494 | ], 495 | "metadata": { 496 | "id": "A4eqjDqHDRju" 497 | } 498 | }, 499 | { 500 | "cell_type": "code", 501 | "execution_count": null, 502 | "source": [ 503 | "float(46)" 504 | ], 505 | "outputs": [], 506 | "metadata": { 507 | "id": "207484ed" 508 | } 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": null, 513 | "source": [ 514 | "float('45')" 515 | ], 516 | "outputs": [], 517 | "metadata": { 518 | "id": "eb2e4da7" 519 | } 520 | }, 521 | { 522 | "cell_type": "markdown", 523 | "source": [ 524 | "O Python permite realizar operações matemáticas das mais [básicas](https://www.digitalocean.com/community/tutorials/how-to-do-math-in-python-3-with-operators) até as mais [avançadas](https://docs.python.org/pt-br/3/library/math.html). Vejamos abaixo as quatro operações elementares em ação." 525 | ], 526 | "metadata": { 527 | "id": "92a7ec20" 528 | } 529 | }, 530 | { 531 | "cell_type": "code", 532 | "execution_count": null, 533 | "source": [ 534 | "4+2" 535 | ], 536 | "outputs": [], 537 | "metadata": { 538 | "id": "407000af" 539 | } 540 | }, 541 | { 542 | "cell_type": "code", 543 | "execution_count": null, 544 | "source": [ 545 | "10-9" 546 | ], 547 | "outputs": [], 548 | "metadata": { 549 | "id": "80df518e" 550 | } 551 | }, 552 | { 553 | "cell_type": "code", 554 | "execution_count": null, 555 | "source": [ 556 | "5*10" 557 | ], 558 | "outputs": [], 559 | "metadata": { 560 | "id": "029b0ade" 561 | } 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": null, 566 | "source": [ 567 | "1000/10" 568 | ], 569 | "outputs": [], 570 | "metadata": { 571 | "id": "d2fa900e" 572 | } 573 | }, 574 | { 575 | "cell_type": "markdown", 576 | "source": [ 577 | "Para elevar um número à potência de outro número, utilize dois asterísticos `**`." 578 | ], 579 | "metadata": { 580 | "id": "yBPhCF0cELKo" 581 | } 582 | }, 583 | { 584 | "cell_type": "code", 585 | "execution_count": null, 586 | "source": [ 587 | "5**2" 588 | ], 589 | "outputs": [], 590 | "metadata": { 591 | "colab": { 592 | "base_uri": "https://localhost:8080/" 593 | }, 594 | "id": "c6aaa9d8", 595 | "outputId": "246ede1d-ce85-439d-d8be-118e2666a5b8" 596 | } 597 | }, 598 | { 599 | "cell_type": "markdown", 600 | "source": [ 601 | "# Booleanos" 602 | ], 603 | "metadata": { 604 | "id": "edwadkzyEmlw" 605 | } 606 | }, 607 | { 608 | "cell_type": "markdown", 609 | "source": [ 610 | "Assim como o Excel, que possui os tipos `VERDADEIRO` e `FALSO`, Python possui tipos booleanos. Eles são `True` e `False` -- perceba que eles não devem vir acompanhados de aspas e que apenas as iniciais devem ser maiúsculas.\n", 611 | "\n", 612 | "Normalmente valores booleanos são retornados quando você está trabalhando com algum tipo de declaração condicional - comparando valores, verificando se uma string está dentro de outra string, se um valor está contido em uma lista, etc. " 613 | ], 614 | "metadata": { 615 | "id": "74c8ca31" 616 | } 617 | }, 618 | { 619 | "cell_type": "code", 620 | "execution_count": null, 621 | "source": [ 622 | "type(False)" 623 | ], 624 | "outputs": [], 625 | "metadata": { 626 | "id": "37acbfee" 627 | } 628 | }, 629 | { 630 | "cell_type": "code", 631 | "execution_count": null, 632 | "source": [ 633 | "type(True)" 634 | ], 635 | "outputs": [], 636 | "metadata": { 637 | "id": "280394e0" 638 | } 639 | }, 640 | { 641 | "cell_type": "markdown", 642 | "source": [ 643 | "Os [operadores lógicos do Python](https://docs.python.org/pt-br/3/reference/expressions.html#comparisons) são:\n", 644 | "\n", 645 | "- `>` maior que\n", 646 | "- `<` menor que\n", 647 | "- `>=` maior que ou igual a\n", 648 | "- `<=` menor que ou igual a\n", 649 | "- `==` igual a\n", 650 | "- `!=` diferente de" 651 | ], 652 | "metadata": { 653 | "id": "Zi33OvbsE9VD" 654 | } 655 | }, 656 | { 657 | "cell_type": "markdown", 658 | "source": [ 659 | "Repare que o símbolo de igual (`=`) é utilizado para declarar algum valor. Por exemplo. `ano = 2021` declara o número 2021 a uma variável (falaremos mais sobre elas em breve) chamada *ano*.\n", 660 | "\n", 661 | "Mas quando utilizamos `==` é como se estivéssemos fazendo uma pergunta: isto é igual a aquilo?\n", 662 | "\n", 663 | "Vejamos um exemplo abaixo. Primeiro, vamos declarar a variável `ano`, visualizá-la e depois usar o operador lógico `==`." 664 | ], 665 | "metadata": {} 666 | }, 667 | { 668 | "cell_type": "code", 669 | "execution_count": null, 670 | "source": [ 671 | "ano = 2021" 672 | ], 673 | "outputs": [], 674 | "metadata": {} 675 | }, 676 | { 677 | "cell_type": "code", 678 | "execution_count": null, 679 | "source": [ 680 | "ano" 681 | ], 682 | "outputs": [], 683 | "metadata": {} 684 | }, 685 | { 686 | "cell_type": "code", 687 | "execution_count": null, 688 | "source": [ 689 | "ano == 1900" 690 | ], 691 | "outputs": [], 692 | "metadata": {} 693 | }, 694 | { 695 | "cell_type": "code", 696 | "execution_count": null, 697 | "source": [ 698 | "ano == 2021" 699 | ], 700 | "outputs": [], 701 | "metadata": {} 702 | }, 703 | { 704 | "cell_type": "markdown", 705 | "source": [ 706 | "Se a célula `ano == 1900` fosse executada com apenas um símbolo igual, ao invés de \"perguntar\" se a variável `ano` é igual 2021, estaríamos sobreescrevendo este número e atribuindo um novo valor (1900) a ela.\n", 707 | "\n", 708 | "Abaixo, você encontra outros exemplos de operadores lógicos." 709 | ], 710 | "metadata": {} 711 | }, 712 | { 713 | "cell_type": "code", 714 | "execution_count": null, 715 | "source": [ 716 | "4 > 6" 717 | ], 718 | "outputs": [], 719 | "metadata": { 720 | "id": "294936f3" 721 | } 722 | }, 723 | { 724 | "cell_type": "code", 725 | "execution_count": null, 726 | "source": [ 727 | "4 < 6" 728 | ], 729 | "outputs": [], 730 | "metadata": { 731 | "id": "d8b39e75" 732 | } 733 | }, 734 | { 735 | "cell_type": "markdown", 736 | "source": [ 737 | "Python é uma linguagem case sensitive, ou seja, a mesma palavra pode ser entendida como uma palavra diferente simplesmente porque uma letra está maiuscula ou minúscula. " 738 | ], 739 | "metadata": { 740 | "id": "mBJLggCjFBoz" 741 | } 742 | }, 743 | { 744 | "cell_type": "code", 745 | "execution_count": null, 746 | "source": [ 747 | "'Python' == 'python'" 748 | ], 749 | "outputs": [], 750 | "metadata": { 751 | "colab": { 752 | "base_uri": "https://localhost:8080/" 753 | }, 754 | "id": "8c47a09a", 755 | "outputId": "b1d3e049-7a23-4a39-f144-a04e505794ed" 756 | } 757 | }, 758 | { 759 | "cell_type": "markdown", 760 | "source": [ 761 | "# Atribuição de variável" 762 | ], 763 | "metadata": { 764 | "id": "BmCR_H-qFjmK" 765 | } 766 | }, 767 | { 768 | "cell_type": "markdown", 769 | "source": [ 770 | "O sinal de igual (`=`) atribui um valor a uma variável. Pense em uma variável simplesmente como algo que... pode variar ou cujo valor poder mudar. Ou como uma etiqueta que tem algum valor atribuído a ela.\n", 771 | "\n", 772 | "Por exemplo, eu posso declarar `nome = 'Maria Carolina Sousa Silva Santos Albuquerque'` e, se eu precisar utilizar este nome no futuro, ao invés de digitá-lo novamente, posso simplesmente chamar minha variável `nome`.\n", 773 | "\n", 774 | "Nomes de variáveis podem ser qualquer coisa que nós quiseremos, mas existem algumas regras e convenções para serem seguidas:\n", 775 | "\n", 776 | "- Eles devem começar apenas com letras ou traço baixo (underscore: `_`) e podem conter letras, *underscore* ou números;\n", 777 | "- Os nomes são `case sensitives`. Ou seja, `Ano` é diferente de `ano`. Em geral, em Python, usamos os nomes das variáveis todos em minúsculas e com underscore para separar palavras quando necessário.\n", 778 | "- Use nomes de variáveis que sejam descritivos e sigam estas convenções do mundo Python. Por exemplo, é melhor usar `ano_nascimento` do que `AnoNascimento` ou `AnNasc`.\n", 779 | "\n", 780 | "Para saber mais sobre o assunto, você pode conferir este texto do [site The Hello World Program](https://thehelloworldprogram.com/python/python-variable-assignment-statements-rules-conventions-naming/) ou [esta explicação do Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-use-variables-in-python-3)." 781 | ], 782 | "metadata": { 783 | "id": "d6f4ec68" 784 | } 785 | }, 786 | { 787 | "cell_type": "code", 788 | "execution_count": null, 789 | "source": [ 790 | "meu_nome = 'Francisco'" 791 | ], 792 | "outputs": [], 793 | "metadata": { 794 | "id": "b8cb8f06" 795 | } 796 | }, 797 | { 798 | "cell_type": "code", 799 | "execution_count": null, 800 | "source": [ 801 | "meu_nome" 802 | ], 803 | "outputs": [], 804 | "metadata": { 805 | "id": "b85454aa" 806 | } 807 | }, 808 | { 809 | "cell_type": "code", 810 | "execution_count": null, 811 | "source": [ 812 | "meu_numero_preferido = 10 + 3" 813 | ], 814 | "outputs": [], 815 | "metadata": { 816 | "id": "a1f8bfb3" 817 | } 818 | }, 819 | { 820 | "cell_type": "code", 821 | "execution_count": null, 822 | "source": [ 823 | "meu_numero_preferido" 824 | ], 825 | "outputs": [], 826 | "metadata": { 827 | "colab": { 828 | "base_uri": "https://localhost:8080/" 829 | }, 830 | "id": "5fde36f0", 831 | "outputId": "4aef2332-3a3f-4018-8a00-ad5e83c82b0d" 832 | } 833 | }, 834 | { 835 | "cell_type": "markdown", 836 | "source": [ 837 | "Também é possível fazer operações com variáveis:" 838 | ], 839 | "metadata": { 840 | "id": "8ccb217e" 841 | } 842 | }, 843 | { 844 | "cell_type": "code", 845 | "execution_count": null, 846 | "source": [ 847 | "times_da_nfl = 32\n", 848 | "times_da_mlb = 30\n", 849 | "times_da_nba = 30\n", 850 | "times_da_nhl = 31\n", 851 | "\n", 852 | "quantidade_de_times_profissionais = times_da_nfl + times_da_mlb + times_da_nba + times_da_nhl" 853 | ], 854 | "outputs": [], 855 | "metadata": { 856 | "id": "7a705ddc" 857 | } 858 | }, 859 | { 860 | "cell_type": "code", 861 | "execution_count": null, 862 | "source": [ 863 | "quantidade_de_times_profissionais" 864 | ], 865 | "outputs": [], 866 | "metadata": { 867 | "colab": { 868 | "base_uri": "https://localhost:8080/" 869 | }, 870 | "id": "be48074a", 871 | "outputId": "9df337df-5fe1-40ac-ed31-3d8bd9c7667a" 872 | } 873 | }, 874 | { 875 | "cell_type": "markdown", 876 | "source": [ 877 | "# Métodos de string\n" 878 | ], 879 | "metadata": { 880 | "id": "5bfd93a1" 881 | } 882 | }, 883 | { 884 | "cell_type": "markdown", 885 | "source": [ 886 | "Voltando a falar de strings, é importante ressaltar que esses objetos possuem uma série de [métodos](https://docs.python.org/pt-br/3/library/stdtypes.html#string-methods) muito úteis.\n", 887 | "\n", 888 | "Vamos usar uma string como exemplo para ilustrar os mais comuns." 889 | ], 890 | "metadata": { 891 | "id": "YmNxdkqJKpYv" 892 | } 893 | }, 894 | { 895 | "cell_type": "code", 896 | "execution_count": null, 897 | "source": [ 898 | "minha_string = ' Oi, amigos!'\n", 899 | "minha_string" 900 | ], 901 | "outputs": [], 902 | "metadata": { 903 | "colab": { 904 | "base_uri": "https://localhost:8080/", 905 | "height": 35 906 | }, 907 | "id": "44dd516a", 908 | "outputId": "0ad2bbca-7a48-44ae-8c76-9abd2d48c6ed" 909 | } 910 | }, 911 | { 912 | "cell_type": "markdown", 913 | "source": [ 914 | "Podemos usar um ponto após a variável e chamar uma função, que irá operar sobre ela. Veja o exemplo do `upper()`, que deixa todos os caracteres de uma string em caixa alta:" 915 | ], 916 | "metadata": { 917 | "id": "1c2a8a8e" 918 | } 919 | }, 920 | { 921 | "cell_type": "code", 922 | "execution_count": null, 923 | "source": [ 924 | "minha_string.upper()" 925 | ], 926 | "outputs": [], 927 | "metadata": { 928 | "colab": { 929 | "base_uri": "https://localhost:8080/", 930 | "height": 35 931 | }, 932 | "id": "934e513c", 933 | "outputId": "87e228a2-cc95-4fb5-a8cc-30d03696c690" 934 | } 935 | }, 936 | { 937 | "cell_type": "markdown", 938 | "source": [ 939 | "`lower()` converte para minúsculos:" 940 | ], 941 | "metadata": { 942 | "id": "86a4d772" 943 | } 944 | }, 945 | { 946 | "cell_type": "code", 947 | "execution_count": null, 948 | "source": [ 949 | "minha_string.lower()" 950 | ], 951 | "outputs": [], 952 | "metadata": { 953 | "colab": { 954 | "base_uri": "https://localhost:8080/", 955 | "height": 35 956 | }, 957 | "id": "7d1a06f4", 958 | "outputId": "4ef2f353-954b-43ae-c722-8092242f831a" 959 | } 960 | }, 961 | { 962 | "cell_type": "markdown", 963 | "source": [ 964 | "`replace()` irá substituir um trecho de texto com outro trecho a ser especificado por você:" 965 | ], 966 | "metadata": { 967 | "id": "ad42608d" 968 | } 969 | }, 970 | { 971 | "cell_type": "code", 972 | "execution_count": null, 973 | "source": [ 974 | "minha_string.replace('amigos', 'inimigos')" 975 | ], 976 | "outputs": [], 977 | "metadata": { 978 | "colab": { 979 | "base_uri": "https://localhost:8080/", 980 | "height": 35 981 | }, 982 | "id": "914cf5e3", 983 | "outputId": "a97c20ee-5bf9-478c-e6bd-54b5a05dfdd7" 984 | } 985 | }, 986 | { 987 | "cell_type": "markdown", 988 | "source": [ 989 | "`count()` irá contar a quantidade de vezes que um caractere ou grupo de caracteres aparece na sua string:" 990 | ], 991 | "metadata": { 992 | "id": "6e4669ea" 993 | } 994 | }, 995 | { 996 | "cell_type": "code", 997 | "execution_count": null, 998 | "source": [ 999 | "minha_string.count('o')" 1000 | ], 1001 | "outputs": [], 1002 | "metadata": { 1003 | "colab": { 1004 | "base_uri": "https://localhost:8080/" 1005 | }, 1006 | "id": "642ed865", 1007 | "outputId": "49df237b-d956-4ce2-a302-394818ca7088" 1008 | } 1009 | }, 1010 | { 1011 | "cell_type": "markdown", 1012 | "source": [ 1013 | "`split()` irá fatiar a string e armazená-la em uma [lista](#Listas) (iremos falar mais sobre elas já já) baseado em um delimitador. Caso você não defina um delimitador, o delimitador definido por padrão é um espaço em branco:" 1014 | ], 1015 | "metadata": { 1016 | "id": "dc146a55" 1017 | } 1018 | }, 1019 | { 1020 | "cell_type": "code", 1021 | "execution_count": null, 1022 | "source": [ 1023 | "minha_string.split()" 1024 | ], 1025 | "outputs": [], 1026 | "metadata": { 1027 | "colab": { 1028 | "base_uri": "https://localhost:8080/" 1029 | }, 1030 | "id": "8663e077", 1031 | "outputId": "41adb8ab-a7bb-4783-f535-85485045712c" 1032 | } 1033 | }, 1034 | { 1035 | "cell_type": "code", 1036 | "execution_count": null, 1037 | "source": [ 1038 | "minha_string.split(',')" 1039 | ], 1040 | "outputs": [], 1041 | "metadata": { 1042 | "colab": { 1043 | "base_uri": "https://localhost:8080/" 1044 | }, 1045 | "id": "bbacea47", 1046 | "outputId": "c943fb47-8ec1-46f2-ac5b-687a14e4ce88" 1047 | } 1048 | }, 1049 | { 1050 | "cell_type": "markdown", 1051 | "source": [ 1052 | "Veja como a vírgula mudou de lugar no resultado da célula acima." 1053 | ], 1054 | "metadata": {} 1055 | }, 1056 | { 1057 | "cell_type": "code", 1058 | "execution_count": null, 1059 | "source": [ 1060 | "minha_string.split('texto_inexistente_na_string')" 1061 | ], 1062 | "outputs": [], 1063 | "metadata": { 1064 | "colab": { 1065 | "base_uri": "https://localhost:8080/" 1066 | }, 1067 | "id": "7b7438ec", 1068 | "outputId": "54319059-d28c-48fd-a88a-c96e1ba8020d" 1069 | } 1070 | }, 1071 | { 1072 | "cell_type": "markdown", 1073 | "source": [ 1074 | "A função `strip()` remove espaços em branco das extremidade da sua string (mas não os espaços em branco internos):" 1075 | ], 1076 | "metadata": { 1077 | "id": "1f1b0a96" 1078 | } 1079 | }, 1080 | { 1081 | "cell_type": "code", 1082 | "execution_count": null, 1083 | "source": [ 1084 | "minha_string.strip()" 1085 | ], 1086 | "outputs": [], 1087 | "metadata": { 1088 | "colab": { 1089 | "base_uri": "https://localhost:8080/", 1090 | "height": 35 1091 | }, 1092 | "id": "d4432f08", 1093 | "outputId": "abc56b46-d6e9-447d-bf6c-83a090f6bf4f" 1094 | } 1095 | }, 1096 | { 1097 | "cell_type": "markdown", 1098 | "source": [ 1099 | "Tem uma coisa muito incrível chamada \"encadeamento de método\" que te permite combinar métodos - é só adicioná-los um ao final do outro, com um ponto entre eles. Digamos que nós quiséssemos remover um espaço em branco da nossa string _e_ colocá-la em maiúsculo:" 1100 | ], 1101 | "metadata": { 1102 | "id": "6a712332" 1103 | } 1104 | }, 1105 | { 1106 | "cell_type": "code", 1107 | "execution_count": null, 1108 | "source": [ 1109 | "minha_string.strip().upper()" 1110 | ], 1111 | "outputs": [], 1112 | "metadata": { 1113 | "colab": { 1114 | "base_uri": "https://localhost:8080/", 1115 | "height": 35 1116 | }, 1117 | "id": "19938073", 1118 | "outputId": "9e0430ec-b8fb-4fa6-e5fd-d8baac7fa820" 1119 | } 1120 | }, 1121 | { 1122 | "cell_type": "markdown", 1123 | "source": [ 1124 | "Perceba que `count()` diferencia entre minúsculas e maiúsculas. Se o que você deseja é contar todas as letras 'o', você deve converter sua string original para maiúscula ou minúscula anteriormente. " 1125 | ], 1126 | "metadata": { 1127 | "id": "85a6ec19" 1128 | } 1129 | }, 1130 | { 1131 | "cell_type": "code", 1132 | "execution_count": null, 1133 | "source": [ 1134 | "minha_string.upper().count('O')" 1135 | ], 1136 | "outputs": [], 1137 | "metadata": { 1138 | "colab": { 1139 | "base_uri": "https://localhost:8080/" 1140 | }, 1141 | "id": "01bc0e8b", 1142 | "outputId": "2bf9b904-84f4-4351-e2e7-2b17817b4429" 1143 | } 1144 | }, 1145 | { 1146 | "cell_type": "markdown", 1147 | "source": [ 1148 | "Veja que nossa string original permanece inalterada:" 1149 | ], 1150 | "metadata": { 1151 | "id": "37046553" 1152 | } 1153 | }, 1154 | { 1155 | "cell_type": "code", 1156 | "execution_count": null, 1157 | "source": [ 1158 | "minha_string" 1159 | ], 1160 | "outputs": [], 1161 | "metadata": { 1162 | "colab": { 1163 | "base_uri": "https://localhost:8080/", 1164 | "height": 35 1165 | }, 1166 | "id": "8a8e9add", 1167 | "outputId": "1f09adf4-5cb8-42dc-ffaf-43acdd054681" 1168 | } 1169 | }, 1170 | { 1171 | "cell_type": "markdown", 1172 | "source": [ 1173 | "Mas por que isso? É que a gente não atribuiu os resultados dessas operações a nenhuma variável. Uma prática muito comum, especialmente quando estamos limpando dados, é atribuir os resultados a uma nova variável:" 1174 | ], 1175 | "metadata": { 1176 | "id": "fe7ffaba" 1177 | } 1178 | }, 1179 | { 1180 | "cell_type": "code", 1181 | "execution_count": null, 1182 | "source": [ 1183 | "minha_string_limpa = minha_string.strip().upper()" 1184 | ], 1185 | "outputs": [], 1186 | "metadata": { 1187 | "id": "ed59b96a" 1188 | } 1189 | }, 1190 | { 1191 | "cell_type": "code", 1192 | "execution_count": null, 1193 | "source": [ 1194 | "minha_string_limpa" 1195 | ], 1196 | "outputs": [], 1197 | "metadata": { 1198 | "colab": { 1199 | "base_uri": "https://localhost:8080/", 1200 | "height": 35 1201 | }, 1202 | "id": "58f3f9b5", 1203 | "outputId": "cb0f281b-9aae-48ec-f4aa-98eb65b95650" 1204 | } 1205 | }, 1206 | { 1207 | "cell_type": "markdown", 1208 | "source": [ 1209 | "# Comentários\n", 1210 | "\n" 1211 | ], 1212 | "metadata": { 1213 | "id": "53eadf31" 1214 | } 1215 | }, 1216 | { 1217 | "cell_type": "markdown", 1218 | "source": [ 1219 | "Uma linha comentada - uma nota que você não quer que seja interpretada como código pelo Python - começa com um sinal de `#`. Esse recurso é utilizado para que você e outros colaboradores entendam o que está acontecendo naquele ponto do seu código e o porquê de estar acontecendo.\n", 1220 | "\n", 1221 | "É recomendável usar esse recurso logo acima da linha de código que você deseja comentar:" 1222 | ], 1223 | "metadata": { 1224 | "id": "gJRkGJq2MIY1" 1225 | } 1226 | }, 1227 | { 1228 | "cell_type": "code", 1229 | "execution_count": null, 1230 | "source": [ 1231 | "salario = 1021.34\n", 1232 | "\n", 1233 | "# convertendo este valor para inteiro para eliminar as casas decimais\n", 1234 | "int(salario)" 1235 | ], 1236 | "outputs": [], 1237 | "metadata": { 1238 | "id": "8763975a" 1239 | } 1240 | }, 1241 | { 1242 | "cell_type": "markdown", 1243 | "source": [ 1244 | "# A função `print()`\n", 1245 | "\n" 1246 | ], 1247 | "metadata": { 1248 | "id": "f2bd2ec4" 1249 | } 1250 | }, 1251 | { 1252 | "cell_type": "markdown", 1253 | "source": [ 1254 | "Até então, nós executamos as células deste notebook para pegar o último valor retornado pelo código que escrevemos. Usar a função [`print()`](https://docs.python.org/pt-br/3/library/functions.html#print) é uma forma de imprimir na tela coisas específicas do seu código. Esta é também uma ferramenta bem útil para depuração de código.\n", 1255 | "\n", 1256 | "Para exibir múltiplos elementos na mesma linha, separe-os com uma vírgula." 1257 | ], 1258 | "metadata": { 1259 | "id": "-nUExbJ8MqiT" 1260 | } 1261 | }, 1262 | { 1263 | "cell_type": "code", 1264 | "execution_count": null, 1265 | "source": [ 1266 | "print('Olá!')" 1267 | ], 1268 | "outputs": [], 1269 | "metadata": { 1270 | "id": "034fd283" 1271 | } 1272 | }, 1273 | { 1274 | "cell_type": "code", 1275 | "execution_count": null, 1276 | "source": [ 1277 | "print(meu_nome)" 1278 | ], 1279 | "outputs": [], 1280 | "metadata": { 1281 | "id": "c39bc6bb" 1282 | } 1283 | }, 1284 | { 1285 | "cell_type": "code", 1286 | "execution_count": null, 1287 | "source": [ 1288 | "print('Olá,', meu_nome)" 1289 | ], 1290 | "outputs": [], 1291 | "metadata": { 1292 | "id": "af4fd086" 1293 | } 1294 | }, 1295 | { 1296 | "cell_type": "markdown", 1297 | "source": [ 1298 | "# Coleções de dados\n", 1299 | "\n", 1300 | "Agora iremos abordar duas maneiras que você pode usar Python para agrupar dados em uma coleção: listas e dicionários." 1301 | ], 1302 | "metadata": { 1303 | "id": "bff733fa" 1304 | } 1305 | }, 1306 | { 1307 | "cell_type": "markdown", 1308 | "source": [ 1309 | "**Listas**\n", 1310 | "\n", 1311 | "Uma _lista_ é um conjunto de itens separados por vírgulas dentro de colchetes: `[]`.\n", 1312 | "\n", 1313 | "Aqui vai uma lista de ingredientes, cada um sendo uma string, que combinados formam a receita de um molho." 1314 | ], 1315 | "metadata": { 1316 | "id": "0feb98c3" 1317 | } 1318 | }, 1319 | { 1320 | "cell_type": "code", 1321 | "execution_count": null, 1322 | "source": [ 1323 | "ingredientes_para_o_molho = ['tomate', 'cebola', 'pimenta', 'limão', 'coentro']" 1324 | ], 1325 | "outputs": [], 1326 | "metadata": { 1327 | "id": "9c3f8761" 1328 | } 1329 | }, 1330 | { 1331 | "cell_type": "markdown", 1332 | "source": [ 1333 | "Para acessar um item de uma lista você deve informar sua posição numérica na lista - o seu _índice_ (1, 2, 3, etc.) - dentro de colchetes imediatamente após o nome da variável da lista. Assim como em muitas outras linguagens de programação, em Python a contagem começa em 0. Isso significa que o primeiro item de uma lista é o item `0`." 1334 | ], 1335 | "metadata": { 1336 | "id": "1ec1bb5c" 1337 | } 1338 | }, 1339 | { 1340 | "cell_type": "code", 1341 | "execution_count": null, 1342 | "source": [ 1343 | "ingredientes_para_o_molho[0]" 1344 | ], 1345 | "outputs": [], 1346 | "metadata": { 1347 | "colab": { 1348 | "base_uri": "https://localhost:8080/", 1349 | "height": 35 1350 | }, 1351 | "id": "ea20bc26", 1352 | "outputId": "cd5df48a-5fe3-45ed-b9e5-da74ffc47527" 1353 | } 1354 | }, 1355 | { 1356 | "cell_type": "code", 1357 | "execution_count": null, 1358 | "source": [ 1359 | "ingredientes_para_o_molho[1]" 1360 | ], 1361 | "outputs": [], 1362 | "metadata": { 1363 | "colab": { 1364 | "base_uri": "https://localhost:8080/", 1365 | "height": 35 1366 | }, 1367 | "id": "8c70b25a", 1368 | "outputId": "649b2344-3104-4acd-bf40-60b7866e259e" 1369 | } 1370 | }, 1371 | { 1372 | "cell_type": "markdown", 1373 | "source": [ 1374 | "Você pode usar _índices negativos_ para acessar itens do lado direito da lista - e, na verdade, `[-1]` é um termo comum para acessar \"o último item da lista\"." 1375 | ], 1376 | "metadata": { 1377 | "id": "7094472f" 1378 | } 1379 | }, 1380 | { 1381 | "cell_type": "code", 1382 | "execution_count": null, 1383 | "source": [ 1384 | "ingredientes_para_o_molho[-1]" 1385 | ], 1386 | "outputs": [], 1387 | "metadata": { 1388 | "id": "7dbd7432" 1389 | } 1390 | }, 1391 | { 1392 | "cell_type": "markdown", 1393 | "source": [ 1394 | "Se o que você precisa é pegar um trecho com alguns itens da sua lista, você só precisa usar dois pontos e definir o intervalo em questão. \n", 1395 | "\n", 1396 | "Se quer acessar os primeiros três itens, por exemplo, é só fazer assim:" 1397 | ], 1398 | "metadata": { 1399 | "id": "a905075b" 1400 | } 1401 | }, 1402 | { 1403 | "cell_type": "code", 1404 | "execution_count": null, 1405 | "source": [ 1406 | "ingredientes_para_o_molho[0:3]" 1407 | ], 1408 | "outputs": [], 1409 | "metadata": { 1410 | "colab": { 1411 | "base_uri": "https://localhost:8080/" 1412 | }, 1413 | "id": "a8e48c2a", 1414 | "outputId": "d3f91a09-6ecd-4cb9-9a05-bdfca7428926" 1415 | } 1416 | }, 1417 | { 1418 | "cell_type": "markdown", 1419 | "source": [ 1420 | "Você poderia ter deixado de fora o 0 do começo - quando você não informa o primeiro número, o Python por padrão define para \"o primeiro item na lista.\" Da mesma forma, se você deixar de fora o último número, o padrão definido pelo Python é \"o último item da lista.\"" 1421 | ], 1422 | "metadata": { 1423 | "id": "a2f2eb3e" 1424 | } 1425 | }, 1426 | { 1427 | "cell_type": "code", 1428 | "execution_count": null, 1429 | "source": [ 1430 | "ingredientes_para_o_molho[:3]" 1431 | ], 1432 | "outputs": [], 1433 | "metadata": { 1434 | "colab": { 1435 | "base_uri": "https://localhost:8080/" 1436 | }, 1437 | "id": "20b53847", 1438 | "outputId": "d524bde7-a009-4884-89a3-9c001d5b3378" 1439 | } 1440 | }, 1441 | { 1442 | "cell_type": "markdown", 1443 | "source": [ 1444 | "Observe que essa fatia nos devolve os itens 0, 1 e 2. O item 3 no nosso conjunto é o primeiro item que nós _não_ queremos. Isso pode parecer confuso em um primeiro momento. Vamos observar mais alguns exemplos:" 1445 | ], 1446 | "metadata": { 1447 | "id": "ab641bcd" 1448 | } 1449 | }, 1450 | { 1451 | "cell_type": "code", 1452 | "execution_count": null, 1453 | "source": [ 1454 | "# tudo na lista, exceto o item de número 0, ou seja, o primeiro\n", 1455 | "ingredientes_para_o_molho[1:]" 1456 | ], 1457 | "outputs": [], 1458 | "metadata": { 1459 | "colab": { 1460 | "base_uri": "https://localhost:8080/" 1461 | }, 1462 | "id": "84be4755", 1463 | "outputId": "2b7c8d7d-3258-4143-e113-95537f1785da" 1464 | } 1465 | }, 1466 | { 1467 | "cell_type": "code", 1468 | "execution_count": null, 1469 | "source": [ 1470 | "# o segundo, terceiro e quarto itens\n", 1471 | "ingredientes_para_o_molho[1:4]" 1472 | ], 1473 | "outputs": [], 1474 | "metadata": { 1475 | "colab": { 1476 | "base_uri": "https://localhost:8080/" 1477 | }, 1478 | "id": "bf9966f9", 1479 | "outputId": "7137ba08-c5a2-4595-c112-4ed2a632afb6" 1480 | } 1481 | }, 1482 | { 1483 | "cell_type": "code", 1484 | "execution_count": null, 1485 | "source": [ 1486 | "# os dois últimos itens\n", 1487 | "ingredientes_para_o_molho[-2:]" 1488 | ], 1489 | "outputs": [], 1490 | "metadata": { 1491 | "colab": { 1492 | "base_uri": "https://localhost:8080/" 1493 | }, 1494 | "id": "85e36c79", 1495 | "outputId": "cfb28a60-7ee0-4fba-f4ac-718f65a2428a" 1496 | } 1497 | }, 1498 | { 1499 | "cell_type": "markdown", 1500 | "source": [ 1501 | "Para saber quantos itens uma lista tem é só usar a funcão `len()`" 1502 | ], 1503 | "metadata": { 1504 | "id": "ede9c332" 1505 | } 1506 | }, 1507 | { 1508 | "cell_type": "code", 1509 | "execution_count": null, 1510 | "source": [ 1511 | "len(ingredientes_para_o_molho)" 1512 | ], 1513 | "outputs": [], 1514 | "metadata": { 1515 | "colab": { 1516 | "base_uri": "https://localhost:8080/" 1517 | }, 1518 | "id": "8bc4b704", 1519 | "outputId": "6f402806-688c-42d8-898a-891e6f151954" 1520 | } 1521 | }, 1522 | { 1523 | "cell_type": "markdown", 1524 | "source": [ 1525 | "Para adicionar itens a uma lista, use o método `append()`:" 1526 | ], 1527 | "metadata": { 1528 | "id": "5e0af166" 1529 | } 1530 | }, 1531 | { 1532 | "cell_type": "code", 1533 | "execution_count": null, 1534 | "source": [ 1535 | "ingredientes_para_o_molho" 1536 | ], 1537 | "outputs": [], 1538 | "metadata": { 1539 | "colab": { 1540 | "base_uri": "https://localhost:8080/" 1541 | }, 1542 | "id": "1639a921", 1543 | "outputId": "d3112c32-3c96-452c-c162-8b307e0c5457" 1544 | } 1545 | }, 1546 | { 1547 | "cell_type": "code", 1548 | "execution_count": null, 1549 | "source": [ 1550 | "ingredientes_para_o_molho.append('areia')" 1551 | ], 1552 | "outputs": [], 1553 | "metadata": { 1554 | "id": "6590a531" 1555 | } 1556 | }, 1557 | { 1558 | "cell_type": "code", 1559 | "execution_count": null, 1560 | "source": [ 1561 | "ingredientes_para_o_molho" 1562 | ], 1563 | "outputs": [], 1564 | "metadata": { 1565 | "colab": { 1566 | "base_uri": "https://localhost:8080/" 1567 | }, 1568 | "id": "19d2ceee", 1569 | "outputId": "b74b8fb8-6b76-4844-99b2-5dd8b8fe78d6" 1570 | } 1571 | }, 1572 | { 1573 | "cell_type": "markdown", 1574 | "source": [ 1575 | "O único problema aqui é que nosso molho ficou meio nojento. \n", 1576 | "\n", 1577 | "Para remover um item de uma lista, use o método `pop()`. Se você não informar o índice númerico do item específico que você quer remover, o valor padrão do método é o último item da lista." 1578 | ], 1579 | "metadata": { 1580 | "id": "98bfec10" 1581 | } 1582 | }, 1583 | { 1584 | "cell_type": "code", 1585 | "execution_count": null, 1586 | "source": [ 1587 | "ingredientes_para_o_molho.pop()" 1588 | ], 1589 | "outputs": [], 1590 | "metadata": { 1591 | "colab": { 1592 | "base_uri": "https://localhost:8080/", 1593 | "height": 35 1594 | }, 1595 | "id": "7423f2cc", 1596 | "outputId": "a64a7a1d-fc42-48bc-d8bb-8aa144b899bb" 1597 | } 1598 | }, 1599 | { 1600 | "cell_type": "code", 1601 | "execution_count": null, 1602 | "source": [ 1603 | "ingredientes_para_o_molho" 1604 | ], 1605 | "outputs": [], 1606 | "metadata": { 1607 | "colab": { 1608 | "base_uri": "https://localhost:8080/" 1609 | }, 1610 | "id": "2c88e9ea", 1611 | "outputId": "f192eaca-fc46-4c36-dfb7-d26df937321d" 1612 | } 1613 | }, 1614 | { 1615 | "cell_type": "markdown", 1616 | "source": [ 1617 | "Você pode usar as expressões [`in` e `not in`](https://docs.python.org/pt-br/3/reference/expressions.html#membership-test-operations) para verificar se um item pertence àquela lista (e irá lhe retornar um booleano):" 1618 | ], 1619 | "metadata": { 1620 | "id": "44d04901" 1621 | } 1622 | }, 1623 | { 1624 | "cell_type": "code", 1625 | "execution_count": null, 1626 | "source": [ 1627 | "'limão' in ingredientes_para_o_molho" 1628 | ], 1629 | "outputs": [], 1630 | "metadata": { 1631 | "colab": { 1632 | "base_uri": "https://localhost:8080/" 1633 | }, 1634 | "id": "22a25cfd", 1635 | "outputId": "c765cfde-2022-4b3d-dab0-f900032ffd4a" 1636 | } 1637 | }, 1638 | { 1639 | "cell_type": "code", 1640 | "execution_count": null, 1641 | "source": [ 1642 | "'coentro' not in ingredientes_para_o_molho" 1643 | ], 1644 | "outputs": [], 1645 | "metadata": { 1646 | "colab": { 1647 | "base_uri": "https://localhost:8080/" 1648 | }, 1649 | "id": "a6011786", 1650 | "outputId": "d52af40e-22fc-4bd0-ebca-35d1e991b88b" 1651 | } 1652 | }, 1653 | { 1654 | "cell_type": "markdown", 1655 | "source": [ 1656 | "# Dicionários\n" 1657 | ], 1658 | "metadata": { 1659 | "id": "ea0514be" 1660 | } 1661 | }, 1662 | { 1663 | "cell_type": "markdown", 1664 | "source": [ 1665 | "Um dicionário é um conjunto de pares de chave/valor, separados por vírgula, dentro de chaves: `{}`. Vamos fazer uma receita inteira de molho:" 1666 | ], 1667 | "metadata": { 1668 | "id": "rGOF-5d6OdEV" 1669 | } 1670 | }, 1671 | { 1672 | "cell_type": "code", 1673 | "execution_count": null, 1674 | "source": [ 1675 | "molho = {\n", 1676 | " 'ingredientes': ingredientes_para_o_molho,\n", 1677 | " 'instrucoes': 'Corte todos os ingredientes e cozinhe eles por um tempinho.',\n", 1678 | " 'porcoes': 12\n", 1679 | "}" 1680 | ], 1681 | "outputs": [], 1682 | "metadata": { 1683 | "id": "70c8eb17" 1684 | } 1685 | }, 1686 | { 1687 | "cell_type": "markdown", 1688 | "source": [ 1689 | "Para retornar um valor de um dicionário, você deve chamar o nome da sua respectiva chave dentro de colchetes `[]` imediatamente após o nome da variável do dicionário em questão. " 1690 | ], 1691 | "metadata": { 1692 | "id": "7a3a1493" 1693 | } 1694 | }, 1695 | { 1696 | "cell_type": "code", 1697 | "execution_count": null, 1698 | "source": [ 1699 | "molho['porcoes']" 1700 | ], 1701 | "outputs": [], 1702 | "metadata": { 1703 | "colab": { 1704 | "base_uri": "https://localhost:8080/" 1705 | }, 1706 | "id": "31a2135d", 1707 | "outputId": "20cbca86-4983-4ac4-c067-4162707719b0" 1708 | } 1709 | }, 1710 | { 1711 | "cell_type": "code", 1712 | "execution_count": null, 1713 | "source": [ 1714 | "molho['ingredientes']" 1715 | ], 1716 | "outputs": [], 1717 | "metadata": { 1718 | "colab": { 1719 | "base_uri": "https://localhost:8080/" 1720 | }, 1721 | "id": "eeea99f0", 1722 | "outputId": "b29ae5db-4589-40b9-9336-be99484799ce" 1723 | } 1724 | }, 1725 | { 1726 | "cell_type": "markdown", 1727 | "source": [ 1728 | "Para adicionar um novo conjunto de chave/valor a um dicionário, atribua uma nova chave dentro de colchetes ao dicionário desejado e defina o valor logo após o `=`: " 1729 | ], 1730 | "metadata": { 1731 | "id": "5b4713da" 1732 | } 1733 | }, 1734 | { 1735 | "cell_type": "code", 1736 | "execution_count": null, 1737 | "source": [ 1738 | "molho['esta_uma_delicia'] = True" 1739 | ], 1740 | "outputs": [], 1741 | "metadata": { 1742 | "id": "421d3adb" 1743 | } 1744 | }, 1745 | { 1746 | "cell_type": "code", 1747 | "execution_count": null, 1748 | "source": [ 1749 | "molho" 1750 | ], 1751 | "outputs": [], 1752 | "metadata": { 1753 | "colab": { 1754 | "base_uri": "https://localhost:8080/" 1755 | }, 1756 | "id": "733399a2", 1757 | "outputId": "79fa5b8d-334a-455b-9ea8-1229ed74ee25" 1758 | } 1759 | }, 1760 | { 1761 | "cell_type": "markdown", 1762 | "source": [ 1763 | "Para excluir um par chave/valor de um dicionário, utilize o comando `del` antes o nome do dicionário acompanhado da chave específica:" 1764 | ], 1765 | "metadata": { 1766 | "id": "f8bd71d8" 1767 | } 1768 | }, 1769 | { 1770 | "cell_type": "code", 1771 | "execution_count": null, 1772 | "source": [ 1773 | "del molho['esta_uma_delicia']" 1774 | ], 1775 | "outputs": [], 1776 | "metadata": { 1777 | "id": "0f84017e" 1778 | } 1779 | }, 1780 | { 1781 | "cell_type": "code", 1782 | "execution_count": null, 1783 | "source": [ 1784 | "molho" 1785 | ], 1786 | "outputs": [], 1787 | "metadata": { 1788 | "colab": { 1789 | "base_uri": "https://localhost:8080/" 1790 | }, 1791 | "id": "43e69c4a", 1792 | "outputId": "d033818b-c143-494e-e28a-07ecda27716d" 1793 | } 1794 | }, 1795 | { 1796 | "cell_type": "markdown", 1797 | "source": [ 1798 | "# Indentação" 1799 | ], 1800 | "metadata": { 1801 | "id": "f5d7aee6" 1802 | } 1803 | }, 1804 | { 1805 | "cell_type": "markdown", 1806 | "source": [ 1807 | "Espaços em branco fazem MUITA diferença para o Python. Às vezes você precisará indentar pedaços de código para que as coisas funcionem. Isso pode ser confuso! `IndentationError` é um tipo muito comum de erro, até mesmo para programadores mais experientes. Inclusive, alguns editores de notebook podem ser prestativos e te dar uma mãozinha inserindo espaços em branco para você em alguns casos.\n", 1808 | "\n", 1809 | "Você pode usar tabs ou espaços, só não misture os dois. [O guia de estilo do Python](https://www.python.org/dev/peps/pep-0008/) recomenda que você indente seu código com quatro espaços, então será isso o que nós usaremos." 1810 | ], 1811 | "metadata": { 1812 | "id": "aCL3SgaQO4iW" 1813 | } 1814 | }, 1815 | { 1816 | "cell_type": "markdown", 1817 | "source": [ 1818 | "# Estrutura de repetição `for`\n", 1819 | "\n" 1820 | ], 1821 | "metadata": { 1822 | "id": "3e3902f3" 1823 | } 1824 | }, 1825 | { 1826 | "cell_type": "markdown", 1827 | "source": [ 1828 | "Você deve usar um `for` para iterar sobre uma coleção de coisas. \n", 1829 | "\n", 1830 | "Abaixo, nossa declaração começa com a palavra-chave `for` (em minúsculas), e então uma variável chamada `numero`. Você pode chamar essa variável como quiser. Então, insira a palavra-chave `in` e em seguida a coleção que você está percorrendo (ou o nome da sua variável), e então dois pontos. Após isso vamos colocar um bloco indentado de código com instruções sobre o que fazer com cada item na coleção.\n", 1831 | "\n", 1832 | "Digamos que temos uma lista de números chamada `lista_de_numeros`." 1833 | ], 1834 | "metadata": { 1835 | "id": "lDlQwUw4PKSD" 1836 | } 1837 | }, 1838 | { 1839 | "cell_type": "code", 1840 | "execution_count": null, 1841 | "source": [ 1842 | "lista_de_numeros = [1, 2, 3, 4, 5, 6]" 1843 | ], 1844 | "outputs": [], 1845 | "metadata": { 1846 | "id": "f31b896b" 1847 | } 1848 | }, 1849 | { 1850 | "cell_type": "markdown", 1851 | "source": [ 1852 | "É possível percorer os elementos da lista e imprimir cada um deles na tela:" 1853 | ], 1854 | "metadata": { 1855 | "id": "83bac500" 1856 | } 1857 | }, 1858 | { 1859 | "cell_type": "code", 1860 | "execution_count": null, 1861 | "source": [ 1862 | "for numero in lista_de_numeros:\n", 1863 | " print(numero)" 1864 | ], 1865 | "outputs": [], 1866 | "metadata": { 1867 | "colab": { 1868 | "base_uri": "https://localhost:8080/" 1869 | }, 1870 | "id": "32066469", 1871 | "outputId": "a8a40e4f-edfb-4bcf-c3a5-bb8f7e942ecc" 1872 | } 1873 | }, 1874 | { 1875 | "cell_type": "markdown", 1876 | "source": [ 1877 | "Podemos também exibir na tela cada número da lista _multiplicado_ por 6:" 1878 | ], 1879 | "metadata": { 1880 | "id": "8e51a4cb" 1881 | } 1882 | }, 1883 | { 1884 | "cell_type": "code", 1885 | "execution_count": null, 1886 | "source": [ 1887 | "for numero in lista_de_numeros:\n", 1888 | " print(numero*6)" 1889 | ], 1890 | "outputs": [], 1891 | "metadata": { 1892 | "colab": { 1893 | "base_uri": "https://localhost:8080/" 1894 | }, 1895 | "id": "beacc1fe", 1896 | "outputId": "076c93c0-32f3-4e51-a5d8-22c23423bcfe" 1897 | } 1898 | }, 1899 | { 1900 | "cell_type": "markdown", 1901 | "source": [ 1902 | " Observe que a escolha de nome da variável chamada de `numero` na sua repetição é totalmente aleatória. Muitas vezes, você irá ver uma expressão como `for i in alguma_lista`, por exemplo, mas qualquer coisa funcionaria no lugar do `i`. Veja:" 1903 | ], 1904 | "metadata": { 1905 | "id": "9de59d01" 1906 | } 1907 | }, 1908 | { 1909 | "cell_type": "code", 1910 | "execution_count": null, 1911 | "source": [ 1912 | "for banana in lista_de_numeros:\n", 1913 | " print(banana)" 1914 | ], 1915 | "outputs": [], 1916 | "metadata": { 1917 | "colab": { 1918 | "base_uri": "https://localhost:8080/" 1919 | }, 1920 | "id": "30739123", 1921 | "outputId": "5276f547-e691-4ebe-9811-9336c973486f" 1922 | } 1923 | }, 1924 | { 1925 | "cell_type": "markdown", 1926 | "source": [ 1927 | "Talvez seja desafiador, em um primeiro momento, diferenciar o que é uma \"palavra reservada do Python\" e o que é o nome de uma variável que você pode definir. Isso, no entanto, vem com a prática." 1928 | ], 1929 | "metadata": { 1930 | "id": "3ab46599" 1931 | } 1932 | }, 1933 | { 1934 | "cell_type": "markdown", 1935 | "source": [ 1936 | "Também dá pra iterar sobre os elementos de uma string. Vamos percorrer sobre as letras nesta sentença:" 1937 | ], 1938 | "metadata": { 1939 | "id": "15331646" 1940 | } 1941 | }, 1942 | { 1943 | "cell_type": "code", 1944 | "execution_count": null, 1945 | "source": [ 1946 | "sentenca = 'Olá, Sexta-Feira'\n", 1947 | "\n", 1948 | "for letra in sentenca:\n", 1949 | " print(letra)" 1950 | ], 1951 | "outputs": [], 1952 | "metadata": { 1953 | "colab": { 1954 | "base_uri": "https://localhost:8080/" 1955 | }, 1956 | "id": "9f1ab92a", 1957 | "outputId": "beb2729f-02a2-49fe-f65b-435d753d9f93" 1958 | } 1959 | }, 1960 | { 1961 | "cell_type": "markdown", 1962 | "source": [ 1963 | "Ou seja, strings são iteráveis, assim como listas, logo, você pode utilizar os mesmos métodos:" 1964 | ], 1965 | "metadata": { 1966 | "id": "908e8c98" 1967 | } 1968 | }, 1969 | { 1970 | "cell_type": "code", 1971 | "execution_count": null, 1972 | "source": [ 1973 | "# pegue os primeiros cinco caracteres\n", 1974 | "sentenca[:5]" 1975 | ], 1976 | "outputs": [], 1977 | "metadata": { 1978 | "colab": { 1979 | "base_uri": "https://localhost:8080/", 1980 | "height": 35 1981 | }, 1982 | "id": "9154bde2", 1983 | "outputId": "772a13aa-f34c-453c-9477-f6a5d7e19f66" 1984 | } 1985 | }, 1986 | { 1987 | "cell_type": "code", 1988 | "execution_count": null, 1989 | "source": [ 1990 | "# descubra o tamanho da sentenca\n", 1991 | "len(sentenca)" 1992 | ], 1993 | "outputs": [], 1994 | "metadata": { 1995 | "colab": { 1996 | "base_uri": "https://localhost:8080/" 1997 | }, 1998 | "id": "d6eed1ec", 1999 | "outputId": "1a3e8121-1694-4287-c42d-ca1b0044cf08" 2000 | } 2001 | }, 2002 | { 2003 | "cell_type": "code", 2004 | "execution_count": null, 2005 | "source": [ 2006 | "'Olá' in sentenca" 2007 | ], 2008 | "outputs": [], 2009 | "metadata": { 2010 | "colab": { 2011 | "base_uri": "https://localhost:8080/" 2012 | }, 2013 | "id": "c0f66494", 2014 | "outputId": "a5ab3db5-51bb-46bb-a569-a46a2b48327f" 2015 | } 2016 | }, 2017 | { 2018 | "cell_type": "markdown", 2019 | "source": [ 2020 | "Você pode percorrer os elementos de um dicionário também - só tenha em mente que dicionários _não registram a ordem que os itens foram adicionados nele_.\n", 2021 | "\n", 2022 | "Quando você está iterando sobre um dicionário, a variável que você colocou após o `for` irá remeter às chaves. Vamos percorrer sobre nosso dicionário `molho` ali de cima:" 2023 | ], 2024 | "metadata": { 2025 | "id": "ae8f1c22" 2026 | } 2027 | }, 2028 | { 2029 | "cell_type": "code", 2030 | "execution_count": null, 2031 | "source": [ 2032 | "for chave in molho:\n", 2033 | " print(chave)" 2034 | ], 2035 | "outputs": [], 2036 | "metadata": { 2037 | "colab": { 2038 | "base_uri": "https://localhost:8080/" 2039 | }, 2040 | "id": "e103fb2a", 2041 | "outputId": "c86d1802-814e-433b-9b7c-fe71007afdbf" 2042 | } 2043 | }, 2044 | { 2045 | "cell_type": "markdown", 2046 | "source": [ 2047 | "Para pegar o _valor_ do item de um dicionário em uma iteração você deve usar a chave:" 2048 | ], 2049 | "metadata": { 2050 | "id": "5557ca4f" 2051 | } 2052 | }, 2053 | { 2054 | "cell_type": "code", 2055 | "execution_count": null, 2056 | "source": [ 2057 | "for chave in molho:\n", 2058 | " print(molho[chave])" 2059 | ], 2060 | "outputs": [], 2061 | "metadata": { 2062 | "colab": { 2063 | "base_uri": "https://localhost:8080/" 2064 | }, 2065 | "id": "2c50475b", 2066 | "outputId": "596f8ff2-5d2a-4227-9a16-4d262cefe3fa" 2067 | } 2068 | }, 2069 | { 2070 | "cell_type": "markdown", 2071 | "source": [ 2072 | "# Declarações `if`\n" 2073 | ], 2074 | "metadata": { 2075 | "id": "6e08b9f3" 2076 | } 2077 | }, 2078 | { 2079 | "cell_type": "markdown", 2080 | "source": [ 2081 | "Assim como no Excel, você pode lançar mão da estrutura \"SE\" para lidar com lógica condicional.\n", 2082 | "\n", 2083 | "No Python, essas declarações começam com a palavra-chave `if` (em minúsculas), a condição a ser avaliada, seguida de dois pontos, e então uma nova linha de bloco de código indentado para então executar o código, se a condição encontrada for `True` (verdadeira)." 2084 | ], 2085 | "metadata": { 2086 | "id": "IJTXacHSQSdZ" 2087 | } 2088 | }, 2089 | { 2090 | "cell_type": "code", 2091 | "execution_count": null, 2092 | "source": [ 2093 | "if 4 < 6:\n", 2094 | " print('4 é menor do que 6')" 2095 | ], 2096 | "outputs": [], 2097 | "metadata": { 2098 | "colab": { 2099 | "base_uri": "https://localhost:8080/" 2100 | }, 2101 | "id": "24495580", 2102 | "outputId": "babe518a-b31b-4367-a2bf-51ecd3b16e4e" 2103 | } 2104 | }, 2105 | { 2106 | "cell_type": "markdown", 2107 | "source": [ 2108 | "Você também pode adicionar um `else` com um bloco de código indentado caso a condição encontrada for `False` (falsa)." 2109 | ], 2110 | "metadata": { 2111 | "id": "aa41acfb" 2112 | } 2113 | }, 2114 | { 2115 | "cell_type": "code", 2116 | "execution_count": null, 2117 | "source": [ 2118 | "if 4 > 6:\n", 2119 | " print('4 é maior do que 6?!')\n", 2120 | "else:\n", 2121 | " print('4 não é maior do que 6.')" 2122 | ], 2123 | "outputs": [], 2124 | "metadata": { 2125 | "colab": { 2126 | "base_uri": "https://localhost:8080/" 2127 | }, 2128 | "id": "320f0a96", 2129 | "outputId": "ec086ddc-b88f-4506-d770-6a6fb0de4bc7" 2130 | } 2131 | }, 2132 | { 2133 | "cell_type": "markdown", 2134 | "source": [ 2135 | "Se você precisar, você pode adicionar múltiplas condições com `elif`. Experimente alterar os resultados do placar e executar a célular para ver o código em funcionamento." 2136 | ], 2137 | "metadata": { 2138 | "id": "c5bb999d" 2139 | } 2140 | }, 2141 | { 2142 | "cell_type": "code", 2143 | "execution_count": null, 2144 | "source": [ 2145 | "NOSSO_PLACAR = 6\n", 2146 | "PLACAR_DO_OUTRO_TIME = 8\n", 2147 | "\n", 2148 | "if NOSSO_PLACAR > PLACAR_DO_OUTRO_TIME:\n", 2149 | " print('Ganhamos!')\n", 2150 | "elif PLACAR_DO_OUTRO_TIME < NOSSO_PLACAR:\n", 2151 | " print('Empatamos!')\n", 2152 | "else:\n", 2153 | " print('Perdemos!')" 2154 | ], 2155 | "outputs": [], 2156 | "metadata": { 2157 | "colab": { 2158 | "base_uri": "https://localhost:8080/" 2159 | }, 2160 | "id": "9df8bffa", 2161 | "outputId": "f752e36e-95d8-42d9-f5c2-105a14f89173" 2162 | } 2163 | }, 2164 | { 2165 | "cell_type": "markdown", 2166 | "source": [ 2167 | "Agora que você entendeu como funciona a linguagem Python, já pode dar seus primeiros passos [aprendendo a biblioteca Pandas usando este notebook](Pandas.ipynb)" 2168 | ], 2169 | "metadata": { 2170 | "id": "lvyCtQGbQpj1" 2171 | } 2172 | } 2173 | ] 2174 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Primeiros passos com Python e Pandas 2 | 3 | Este repositório é baseado em uma tradução e expansão dos notebooks do workshop ["Python: Intro to data analysis using pandas"](https://github.com/ireapps/teaching-guide-intro-to-pandas), realizado IRE/NICAR de 2019. 4 | 5 | Os materiais foram traduzidos por Anicely Santos e Kaio Cunha. -------------------------------------------------------------------------------- /mlb.csv: -------------------------------------------------------------------------------- 1 | NAME,TEAM,POS,SALARY,START_YEAR,END_YEAR,YEARS 2 | Clayton Kershaw,LAD,SP,33000000,2014,2020,7 3 | Zack Greinke,ARI,SP,31876966,2016,2021,6 4 | David Price,BOS,SP,30000000,2016,2022,7 5 | Miguel Cabrera,DET,1B,28000000,2014,2023,10 6 | Justin Verlander,DET,SP,28000000,2013,2019,7 7 | Jason Heyward,CHC,RF,26055288,2016,2023,8 8 | Albert Pujols,LAA,1B,26000000,2012,2021,10 9 | Felix Hernandez,SEA,SP,25857143,2013,2019,7 10 | Jon Lester,CHC,SP,25000000,2015,2020,6 11 | CC Sabathia,NYY,SP,25000000,2012,2016,5 12 | Robinson Cano,SEA,2B,24000000,2014,2023,10 13 | Prince Fielder,TEX,DH,24000000,2017,2017,1 14 | Johnny Cueto,SF,SP,23500000,2016,2021,6 15 | Joe Mauer,MIN,1B,23000000,2011,2018,8 16 | Hanley Ramirez,BOS,1B,22750000,2015,2018,4 17 | Cole Hamels,TEX,SP,22500000,2013,2018,6 18 | Yoenis Cespedes,NYM,CF,22500000,2017,2020,4 19 | Adrian Gonzalez,LAD,1B,22357142,2012,2018,7 20 | Buster Posey,SF,C,22177778,2013,2021,9 21 | Max Scherzer,WSH,SP,22142857,2015,2021,7 22 | Justin Upton,DET,LF,22125000,2016,2021,6 23 | Joey Votto,CIN,1B,22000000,2014,2023,10 24 | Masahiro Tanaka,NYY,SP,22000000,2014,2020,7 25 | Jose Reyes,NYM,3B,22000000,2017,2017,1 26 | Jayson Werth,WSH,LF,21571429,2011,2017,7 27 | Matt Kemp,ATL,RF,21500000,2012,2019,8 28 | Chris Davis,BAL,1B,21233006,2016,2022,7 29 | Jacoby Ellsbury,NYY,CF,21142857,2014,2020,7 30 | James Shields,CWS,SP,21000000,2015,2018,4 31 | Freddie Freeman,ATL,1B,20859375,2014,2021,8 32 | Matt Cain,SF,SP,20833333,2012,2017,6 33 | Carlos Gonzalez,COL,RF,20428571,2011,2017,7 34 | Rick Porcello,BOS,SP,20125000,2016,2019,4 35 | Mike Trout,LAA,CF,20083333,2015,2020,6 36 | Troy Tulowitzki,TOR,SS,20000000,2011,2020,10 37 | Shin-Soo Choo,TEX,RF,20000000,2014,2020,7 38 | Russell Martin,TOR,C,20000000,2015,2019,5 39 | Jeff Samardzija,SF,SP,19800000,2016,2020,5 40 | Adam Wainwright,STL,SP,19500000,2014,2018,5 41 | David Wright,NYM,3B,19382219,2013,2020,8 42 | Ryan Braun,MIL,OF,19199365,2008,2020,13 43 | Homer Bailey,CIN,SP,19000000,2014,2019,6 44 | Hunter Pence,SF,RF,18700000,2014,2018,5 45 | Jordan Zimmermann,DET,SP,18000000,2016,2020,5 46 | Victor Martinez,DET,DH,18000000,2015,2018,4 47 | Adrian Beltre,TEX,3B,18000000,2017,2018,2 48 | Jose Bautista,TOR,RF,18000000,2017,2017,1 49 | Pablo Sandoval,BOS,3B,17600000,2015,2019,5 50 | Andre Ethier,LAD,LF,17500000,2013,2017,5 51 | Aroldis Chapman,NYY,RP,17200000,2017,2021,5 52 | Jeremy Hellickson,PHI,SP,17200000,2017,2017,1 53 | Neil Walker,NYM,2B,17200000,2017,2017,1 54 | Brian McCann,HOU,C,17000000,2014,2018,5 55 | Josh Donaldson,TOR,3B,17000000,2016,2017,2 56 | Anibal Sanchez,DET,SP,16800000,2013,2017,5 57 | Dexter Fowler,STL,CF,16500000,2017,2021,5 58 | Ben Zobrist,CHC,2B,16500000,2016,2019,4 59 | Stephen Strasburg,WSH,SP,16428571,2017,2023,7 60 | Adam Jones,BAL,OF,16352417,2013,2018,6 61 | Alex Gordon,KC,LF,16000000,2016,2019,4 62 | John Lackey,CHC,SP,16000000,2016,2017,2 63 | Carlos Beltran,HOU,RF,16000000,2017,2017,1 64 | Jake Arrieta,CHC,SP,15637500,2017,2017,1 65 | Wei-Yin Chen,MIA,SP,15500000,2016,2020,5 66 | Elvis Andrus,TEX,SS,15333333,2015,2022,8 67 | Mike Leake,STL,SP,15000000,2016,2020,5 68 | Curtis Granderson,NYM,CF,15000000,2014,2017,4 69 | Melky Cabrera,CWS,LF,15000000,2015,2017,3 70 | Scott Kazmir,LAD,SP,14985384,2016,2018,3 71 | Edwin Encarnacion,CLE,DH,14666666,2017,2019,3 72 | Dustin Pedroia,BOS,2B,14642348,2014,2021,8 73 | Giancarlo Stanton,MIA,RF,14500000,2015,2027,13 74 | Marco Estrada,TOR,SP,14500000,2016,2017,2 75 | Nelson Cruz,SEA,DH,14250000,2015,2018,4 76 | Andrew McCutchen,PIT,RF,14208333,2012,2017,6 77 | Yadier Molina,STL,C,14200000,2013,2017,5 78 | Ryan Zimmerman,WSH,1B,14000000,2014,2019,6 79 | Miguel Montero,CHC,C,14000000,2013,2017,5 80 | Yulieski Gurriel,HOU,1B,14000000,2016,2020,5 81 | Hisashi Iwakuma,SEA,SP,14000000,2016,2017,2 82 | Brandon Phillips,ATL,2B,13968236,2012,2017,6 83 | Francisco Liriano,TOR,SP,13666667,2015,2017,3 84 | J.J. Hardy,BAL,SS,13636781,2015,2017,3 85 | Bryce Harper,WSH,RF,13625000,2017,2017,1 86 | Ian Kennedy,KC,SP,13500000,2016,2020,5 87 | Ervin Santana,MIN,SP,13500000,2015,2018,4 88 | Phil Hughes,MIN,SP,13200000,2015,2019,5 89 | Ubaldo Jimenez,BAL,P,13173102,2014,2017,4 90 | Evan Longoria,TB,3B,13119486,2013,2022,10 91 | Justin Turner,LAD,3B,13000000,2017,2020,4 92 | Chase Headley,NYY,3B,13000000,2015,2018,4 93 | Josh Reddick,HOU,RF,13000000,2017,2020,4 94 | Jay Bruce,NYM,OF,13000000,2011,2016,6 95 | Craig Kimbrel,BOS,RP,13000000,2014,2017,4 96 | J.A. Happ,TOR,SP,13000000,2016,2018,3 97 | Clay Buchholz,PHI,SP,13000000,2012,2015,4 98 | Matt Holliday,NYY,LF,13000000,2017,2017,1 99 | Rich Hill,LAD,SP,12666667,2017,2019,3 100 | Brett Gardner,NYY,LF,12500000,2015,2018,4 101 | Bartolo Colon,ATL,SP,12500000,2017,2017,1 102 | Eric Hosmer,KC,1B,12250000,2017,2017,1 103 | Matt Garza,MIL,SP,12209424,2014,2017,4 104 | Jose Abreu,CWS,1B,12166667,2014,2019,6 105 | Ricky Nolasco,LAA,SP,12000000,2014,2017,4 106 | David Robertson,CWS,RP,12000000,2015,2018,4 107 | Gio Gonzalez,WSH,SP,12000000,2012,2016,5 108 | Daniel Murphy,WSH,2B,12000000,2016,2018,3 109 | Chris Sale,BOS,SP,12000000,2013,2017,5 110 | Carlos Santana,CLE,C,12000000,2012,2016,5 111 | Jaime Garcia,ATL,P,12000000,2017,2017,1 112 | Todd Frazier,CWS,3B,12000000,2017,2017,1 113 | Nolan Arenado,COL,3B,11750000,2017,2018,2 114 | J.D. Martinez,DET,RF,11750000,2016,2017,2 115 | Madison Bumgarner,SF,SP,11666667,2013,2017,5 116 | Brandon McCarthy,LAD,SP,11500000,2015,2018,4 117 | Martin Prado,MIA,3B,11500000,2017,2019,3 118 | Mark Trumbo,BAL,RF,11500000,2017,2019,3 119 | Carlos Gomez,TEX,CF,11500000,2017,2017,1 120 | Manny Machado,BAL,3B,11500000,2017,2017,1 121 | Zach Britton,BAL,RP,11400000,2017,2017,1 122 | Kyle Seager,SEA,3B,11000000,2015,2021,7 123 | Ian Kinsler,DET,2B,11000000,2013,2017,5 124 | Yu Darvish,TEX,SP,11000000,2012,2017,6 125 | Nick Markakis,ATL,RF,11000000,2015,2018,4 126 | Denard Span,SF,CF,11000000,2016,2018,3 127 | Lorenzo Cain,KC,CF,11000000,2016,2017,2 128 | Kendrys Morales,TOR,DH,11000000,2015,2016,2 129 | Yovani Gallardo,SEA,SP,10888877,2016,2017,2 130 | Kenley Jansen,LAD,RP,10800000,2017,2021,5 131 | Matt Wieters,WSH,C,10500000,2017,2017,1 132 | Chris Tillman,BAL,SP,10050000,2017,2017,1 133 | Jhonny Peralta,STL,SS,10000000,2014,2017,4 134 | Matt Carpenter,STL,3B,10000000,2014,2019,6 135 | Andrew Cashner,TEX,SP,10000000,2017,2017,1 136 | Wade Davis,CHC,P,10000000,2017,2017,1 137 | Starlin Castro,NYY,2B,9857142,2013,2019,7 138 | Howie Kendrick,PHI,2B,9540378,2016,2017,2 139 | Yasmany Tomas,ARI,OF,9500000,2015,2020,6 140 | Michael Brantley,CLE,OF,9375000,2014,2017,4 141 | Jason Kipnis,CLE,2B,9166667,2014,2019,6 142 | Dallas Keuchel,HOU,SP,9150000,2017,2017,1 143 | Mark Melancon,SF,RP,9000000,2017,2020,4 144 | Andrew Miller,CLE,RP,9000000,2015,2018,4 145 | Francisco Cervelli,PIT,C,9000000,2017,2019,3 146 | Edinson Volquez,MIA,SP,9000000,2017,2018,2 147 | Huston Street,LAA,RP,9000000,2016,2017,2 148 | Cameron Maybin,LAA,CF,9000000,2017,2017,1 149 | Michael Saunders,PHI,LF,9000000,2017,2017,1 150 | Wade Miley,BAL,SP,8916667,2015,2017,3 151 | Paul Goldschmidt,ARI,1B,8833333,2014,2018,5 152 | Mike Moustakas,KC,3B,8700000,2016,2017,2 153 | Jason Castro,MIN,C,8500000,2017,2019,3 154 | Asdrubal Cabrera,NYM,SS,8250000,2016,2017,2 155 | Yasiel Puig,LAD,RF,8214285,2012,2018,7 156 | Brandon Crawford,SF,SS,8200000,2016,2021,6 157 | Ian Desmond,COL,1B,8000000,2017,2021,5 158 | Andrelton Simmons,LAA,SS,8000000,2014,2020,7 159 | Jason Vargas,KC,SP,8000000,2014,2017,4 160 | Gerardo Parra,COL,LF,8000000,2016,2018,3 161 | Joakim Soria,KC,RP,8000000,2016,2018,3 162 | Hector Santiago,MIN,SP,8000000,2017,2017,1 163 | Jon Jay,CHC,CF,8000000,2017,2017,1 164 | Hyun-Jin Ryu,LAD,SP,7833333,2013,2018,6 165 | Brett Cecil,STL,RP,7750000,2017,2020,4 166 | Josh Harrison,PIT,2B,7750000,2015,2018,4 167 | Addison Reed,NYM,RP,7750000,2017,2017,1 168 | Dee Gordon,MIA,2B,7742202,2016,2020,5 169 | Corey Kluber,CLE,SP,7700000,2015,2019,5 170 | Ivan Nova,PIT,SP,7666667,2017,2019,3 171 | Ryan Madson,OAK,RP,7666667,2016,2018,3 172 | Lance Lynn,STL,SP,7500000,2015,2017,3 173 | Joaquin Benoit,PHI,RP,7500000,2017,2017,1 174 | R.A. Dickey,ATL,SP,7500000,2017,2017,1 175 | Jeurys Familia,NYM,RP,7425000,2017,2017,1 176 | Michael Pineda,NYY,SP,7400000,2017,2017,1 177 | Cody Allen,CLE,RP,7350000,2017,2017,1 178 | Devin Mesoraco,CIN,C,7325000,2015,2018,4 179 | Charlie Blackmon,COL,CF,7300000,2017,2017,1 180 | Anthony Rizzo,CHC,1B,7285714,2013,2019,7 181 | Lucas Duda,NYM,1B,7250000,2017,2017,1 182 | Jose Quintana,CWS,SP,7000000,2014,2018,5 183 | Brad Ziegler,MIA,RP,7000000,2017,2018,2 184 | Charlie Morton,HOU,P,7000000,2017,2018,2 185 | Matt Moore,SF,SP,7000000,2012,2016,5 186 | Seth Smith,BAL,RF,7000000,2015,2016,2 187 | Yunel Escobar,LAA,3B,7000000,2015,2016,2 188 | Logan Forsythe,LAD,2B,7000000,2016,2017,2 189 | Darren O'Day,BAL,RP,6854712,2016,2019,4 190 | Drew Smyly,SEA,SP,6850000,2017,2017,1 191 | Garrett Richards,LAA,SP,6850000,2017,2017,1 192 | A.J. Pollock,ARI,CF,6750000,2016,2017,2 193 | Antonio Bastardo,PIT,P,6625000,2017,2017,1 194 | A.J. Ramos,MIA,RP,6550000,2017,2017,1 195 | Jed Lowrie,OAK,2B,6500000,2015,2017,3 196 | Glen Perkins,MIN,RP,6500000,2014,2017,4 197 | Carlos Carrasco,CLE,SP,6500000,2015,2018,4 198 | Luis Valbuena,LAA,3B,6500000,2017,2018,2 199 | Chris Young,BOS,LF,6500000,2016,2017,2 200 | Jerry Blevins,NYM,RP,6500000,2017,2017,1 201 | Pat Neshek,PHI,RP,6500000,2017,2017,1 202 | Alcides Escobar,KC,SS,6500000,2016,2016,1 203 | Julio Teheran,ATL,P,6466666,2014,2019,6 204 | Trevor Rosenthal,STL,RP,6400000,2017,2017,1 205 | Luke Gregerson,HOU,RP,6250000,2015,2017,3 206 | Steve Pearce,TOR,1B,6250000,2017,2018,2 207 | David Freese,PIT,3B,6250000,2017,2018,2 208 | Jean Segura,SEA,SS,6200000,2017,2017,1 209 | Tyler Clippard,NYY,RP,6150000,2016,2017,2 210 | Jedd Gyorko,STL,3B,6000000,2014,2019,6 211 | Kole Calhoun,LAA,RF,6000000,2017,2019,3 212 | Brian Dozier,MIN,2B,6000000,2015,2018,4 213 | Tony Sipp,HOU,RP,6000000,2016,2018,3 214 | Francisco Rodriguez,DET,RP,6000000,2015,2016,2 215 | Steve Cishek,SEA,RP,6000000,2016,2017,2 216 | Derek Holland,CWS,SP,6000000,2017,2017,1 217 | Greg Holland,COL,RP,6000000,2017,2017,1 218 | Koji Uehara,CHC,RP,6000000,2017,2017,1 219 | Mike Napoli,TEX,1B,6000000,2017,2017,1 220 | Rajai Davis,OAK,CF,6000000,2017,2017,1 221 | Tyson Ross,TEX,SP,6000000,2017,2017,1 222 | Welington Castillo,BAL,C,6000000,2017,2017,1 223 | Jake McGee,COL,RP,5900000,2017,2017,1 224 | Miguel Gonzalez,CWS,SP,5900000,2017,2017,1 225 | Anthony Rendon,WSH,3B,5800000,2017,2017,1 226 | Hector Rondon,CHC,RP,5800000,2017,2017,1 227 | Chris Young,KC,SP,5750000,2016,2017,2 228 | Sean Rodriguez,ATL,1B,5750000,2017,2018,2 229 | Jesse Chavez,LAA,SP,5750000,2017,2017,1 230 | Tom Koehler,MIA,SP,5750000,2017,2017,1 231 | Tony Watson,PIT,RP,5600000,2017,2017,1 232 | Danny Valencia,SEA,3B,5550000,2017,2017,1 233 | Shawn Kelley,WSH,RP,5500000,2016,2018,3 234 | Zach Duke,STL,RP,5500000,2015,2017,3 235 | Pedro Strop,CHC,RP,5500000,2017,2018,2 236 | Daniel Hudson,PIT,RP,5500000,2017,2018,2 237 | Marc Rzepczynski,SEA,RP,5500000,2017,2018,2 238 | Santiago Casilla,OAK,RP,5500000,2017,2018,2 239 | John Axford,OAK,RP,5500000,2016,2017,2 240 | Boone Logan,CLE,RP,5500000,2017,2017,1 241 | Mitch Moreland,BOS,1B,5500000,2017,2017,1 242 | Norichika Aoki,HOU,LF,5500000,2017,2017,1 243 | Yasmani Grandal,LAD,C,5500000,2017,2017,1 244 | Danny Espinosa,LAA,SS,5425000,2017,2017,1 245 | Neftali Feliz,MIL,RP,5350000,2017,2017,1 246 | Starling Marte,PIT,LF,5333333,2014,2019,6 247 | Kelvin Herrera,KC,RP,5325000,2017,2017,1 248 | Zack Cozart,CIN,SS,5325000,2017,2017,1 249 | Jonathan Lucroy,TEX,C,5250000,2012,2016,5 250 | Trevor Plouffe,OAK,3B,5250000,2017,2017,1 251 | Evan Gattis,HOU,C,5200000,2017,2017,1 252 | Matt Harvey,NYM,SP,5125000,2017,2017,1 253 | Didi Gregorius,NYY,SS,5100000,2017,2017,1 254 | Danny Duffy,KC,SP,5000000,2017,2021,5 255 | Jason Hammel,KC,P,5000000,2017,2018,2 256 | Junichi Tazawa,MIA,RP,5000000,2017,2018,2 257 | Jim Johnson,ATL,RP,5000000,2017,2018,2 258 | Colby Rasmus,TB,LF,5000000,2017,2017,1 259 | Khris Davis,OAK,LF,5000000,2017,2017,1 260 | Matt Joyce,OAK,RF,5000000,2017,2017,1 261 | Chris Archer,TB,SP,4916667,2014,2019,6 262 | Leonys Martin,SEA,CF,4850000,2017,2017,1 263 | DJ LeMahieu,COL,2B,4800000,2016,2017,2 264 | Shelby Miller,ARI,SP,4700000,2017,2017,1 265 | Jose Altuve,HOU,2B,4687500,2014,2017,4 266 | Martin Perez,TEX,SP,4650000,2014,2017,4 267 | Bryan Shaw,CLE,RP,4600000,2017,2017,1 268 | David Phelps,MIA,RP,4600000,2017,2017,1 269 | Yan Gomes,CLE,C,4583333,2014,2019,6 270 | Wil Myers,SD,1B,4500000,2017,2022,6 271 | Carlos Ruiz,SEA,C,4500000,2014,2016,3 272 | Juan Lagares,NYM,CF,4500000,2015,2019,5 273 | Xander Bogaerts,BOS,SS,4500000,2017,2017,1 274 | Drew Pomeranz,BOS,SP,4450000,2017,2017,1 275 | Tyler Chatwood,COL,SP,4400000,2017,2017,1 276 | Adeiny Hechavarria,MIA,SS,4350000,2017,2017,1 277 | Freddy Galvis,PHI,SS,4350000,2017,2017,1 278 | Jordy Mercer,PIT,SS,4325000,2017,2017,1 279 | Tanner Roark,WSH,SP,4315000,2017,2017,1 280 | Lonnie Chisenhall,CLE,RF,4300000,2017,2017,1 281 | Wily Peralta,MIL,SP,4275000,2017,2017,1 282 | Raisel Iglesias,CIN,SP,4214285,2014,2020,7 283 | Salvador Perez,KC,C,4200000,2016,2021,6 284 | Hyun-soo Kim,BAL,LF,4200000,2016,2017,2 285 | Alex Cobb,TB,SP,4200000,2017,2017,1 286 | Eduardo Nunez,SF,SS,4200000,2017,2017,1 287 | Jeanmar Gomez,PHI,RP,4200000,2017,2017,1 288 | Justin Smoak,TOR,1B,4125000,2017,2017,1 289 | Jake Odorizzi,TB,SP,4100000,2017,2017,1 290 | Jose Iglesias,DET,SS,4100000,2017,2017,1 291 | Jacob deGrom,NYM,SP,4050000,2017,2017,1 292 | Brandon Belt,SF,1B,4000000,2017,2021,5 293 | Adam Eaton,WSH,CF,4000000,2015,2019,5 294 | Mike Dunn,COL,RP,4000000,2017,2019,3 295 | Wilson Ramos,TB,C,4000000,2017,2018,2 296 | Travis Wood,KC,SP,4000000,2017,2018,2 297 | John Jaso,PIT,1B,4000000,2016,2017,2 298 | Mike Minor,KC,SP,4000000,2016,2017,2 299 | Oliver Perez,WSH,RP,4000000,2016,2017,2 300 | Ben Revere,LAA,CF,4000000,2017,2017,1 301 | Chris Carter,NYY,1B,4000000,2017,2017,1 302 | Eric Thames,MIL,1B,4000000,2017,2017,1 303 | Joe Blanton,WSH,RP,4000000,2017,2017,1 304 | Yonder Alonso,OAK,1B,4000000,2017,2017,1 305 | Patrick Corbin,ARI,RP,3950000,2017,2017,1 306 | George Springer,HOU,RF,3900000,2017,2017,1 307 | Collin McHugh,HOU,SP,3850000,2017,2017,1 308 | Brandon Moss,KC,LF,3750000,2017,2018,2 309 | Jonathan Broxton,STL,RP,3750000,2016,2017,2 310 | Chad Qualls,COL,RP,3750000,2016,2017,2 311 | Gerrit Cole,PIT,SP,3750000,2017,2017,1 312 | Marwin Gonzalez,HOU,SS,3725000,2017,2017,1 313 | Carlos Martinez,STL,SP,3700000,2017,2021,5 314 | Jorge Soler,KC,RF,3666666,2012,2020,9 315 | Juan Nicasio,PIT,RP,3650000,2017,2017,1 316 | Jackie Bradley Jr.,BOS,CF,3600000,2017,2017,1 317 | Brad Miller,TB,SS,3575000,2017,2017,1 318 | Sonny Gray,OAK,SP,3575000,2017,2017,1 319 | Trevor Bauer,CLE,SP,3550000,2017,2017,1 320 | Sam Dyson,TEX,RP,3520000,2017,2017,1 321 | Christian Yelich,MIA,LF,3500000,2015,2021,7 322 | Brett Anderson,CHC,SP,3500000,2017,2017,1 323 | Marcell Ozuna,MIA,CF,3500000,2017,2017,1 324 | Stephen Drew,WSH,2B,3500000,2017,2017,1 325 | Jonathan Schoop,BAL,2B,3475000,2017,2017,1 326 | Kevin Gausman,BAL,SP,3450000,2017,2017,1 327 | Mike Fiers,HOU,SP,3450000,2017,2017,1 328 | Danny Salazar,CLE,SP,3400000,2017,2017,1 329 | Marcus Stroman,TOR,SP,3400000,2017,2017,1 330 | Matt Shoemaker,LAA,SP,3325000,2017,2017,1 331 | Erasmo Ramirez,TB,RP,3210000,2017,2017,1 332 | Jordan Lyles,COL,RP,3175000,2017,2017,1 333 | Kevin Kiermaier,TB,CF,3166667,2017,2022,6 334 | Kenta Maeda,LAD,SP,3125000,2016,2023,8 335 | Brad Brach,BAL,RP,3050000,2017,2017,1 336 | Corey Dickerson,TB,LF,3025000,2017,2017,1 337 | Jeff Locke,MIA,RP,3025000,2017,2017,1 338 | Tyler Flowers,ATL,C,3000000,2016,2017,2 339 | Andres Blanco,PHI,2B,3000000,2017,2017,1 340 | Avisail Garcia,CWS,DH,3000000,2017,2017,1 341 | Dellin Betances,NYY,RP,3000000,2017,2017,1 342 | Drew Storen,CIN,RP,3000000,2017,2017,1 343 | Fernando Salas,NYM,RP,3000000,2017,2017,1 344 | J.P. Howell,TOR,RP,3000000,2017,2017,1 345 | Jason Grilli,TOR,RP,3000000,2017,2017,1 346 | Jered Weaver,SD,SP,3000000,2017,2017,1 347 | Joe Smith,TOR,RP,3000000,2017,2017,1 348 | Nick Castellanos,DET,3B,3000000,2017,2017,1 349 | Sergio Romo,LAD,RP,3000000,2017,2017,1 350 | Stephen Vogt,OAK,C,2965000,2017,2017,1 351 | Brandon Kintzler,MIN,RP,2925000,2017,2017,1 352 | Kyle Gibson,MIN,SP,2900000,2017,2017,1 353 | Darwin Barney,TOR,2B,2887500,2017,2017,1 354 | Alex Wood,LAD,RP,2800000,2017,2017,1 355 | Jarrod Dyson,SEA,RF,2800000,2017,2017,1 356 | Joe Kelly,BOS,RP,2800000,2017,2017,1 357 | Matt Adams,STL,1B,2800000,2017,2017,1 358 | Michael Wacha,STL,SP,2775000,2017,2017,1 359 | Seung Hwan Oh,STL,RP,2750000,2017,2017,1 360 | Ender Inciarte,ATL,RF,2700000,2017,2021,5 361 | Justin Wilson,DET,RP,2700000,2017,2017,1 362 | Sean Doolittle,OAK,RP,2630000,2014,2018,5 363 | Yangervis Solarte,SD,3B,2625000,2017,2018,2 364 | Billy Hamilton,CIN,CF,2625000,2017,2017,1 365 | Eduardo Escobar,MIN,SS,2600000,2017,2017,1 366 | Franklin Gutierrez,LAD,LF,2600000,2017,2017,1 367 | Cesar Hernandez,PHI,2B,2550000,2017,2017,1 368 | Jake Diekman,TEX,RP,2550000,2017,2017,1 369 | Scooter Gennett,CIN,2B,2525000,2017,2017,1 370 | Josh Tomlin,CLE,SP,2500000,2016,2017,2 371 | A.J. Ellis,MIA,C,2500000,2017,2017,1 372 | Aledmys Diaz,STL,SS,2500000,2017,2017,1 373 | Fernando Rodney,ARI,RP,2500000,2017,2017,1 374 | Logan Morrison,TB,1B,2500000,2017,2017,1 375 | Will Smith,SF,RP,2500000,2017,2017,1 376 | Chase Anderson,MIL,SP,2450000,2017,2017,1 377 | James Paxton,SEA,SP,2350000,2017,2017,1 378 | Chris Owings,ARI,SS,2300000,2017,2017,1 379 | Scott Feldman,CIN,RP,2300000,2017,2017,1 380 | Adam Warren,NYY,RP,2290000,2017,2017,1 381 | Jung-ho Kang,PIT,3B,2275000,2015,2018,4 382 | Kolten Wong,STL,2B,2250000,2016,2020,5 383 | Cliff Pennington,LAA,2B,2250000,2016,2017,2 384 | Jorge De La Rosa,ARI,SP,2250000,2017,2017,1 385 | Taijuan Walker,ARI,SP,2250000,2017,2017,1 386 | Yusmeiro Petit,LAA,SP,2250000,2017,2017,1 387 | Will Harris,HOU,RP,2200000,2017,2018,2 388 | Wilmer Flores,NYM,SS,2200000,2017,2017,1 389 | Carlos Torres,MIL,RP,2175000,2017,2017,1 390 | Adam Ottavino,COL,RP,2100000,2016,2018,3 391 | Jeremy Jeffress,TEX,RP,2100000,2017,2017,1 392 | Matt Belisle,MIN,RP,2050000,2017,2017,1 393 | Tyler Thornburg,BOS,RP,2050000,2017,2017,1 394 | Brandon Guyer,CLE,LF,2000000,2017,2018,2 395 | Jeff Mathis,ARI,C,2000000,2017,2018,2 396 | A.J. Griffin,TEX,SP,2000000,2017,2017,1 397 | Aaron Hill,SF,2B,2000000,2017,2017,1 398 | Adam Lind,WSH,1B,2000000,2017,2017,1 399 | Alex Avila,DET,C,2000000,2017,2017,1 400 | Brian Duensing,CHC,RP,2000000,2017,2017,1 401 | Chase Utley,LAD,2B,2000000,2017,2017,1 402 | Fernando Abad,BOS,RP,2000000,2017,2017,1 403 | Geovany Soto,CWS,C,2000000,2017,2017,1 404 | Ichiro Suzuki,MIA,CF,2000000,2017,2017,1 405 | Nate Eovaldi,TB,SP,2000000,2017,2017,1 406 | Nick Hundley,SF,C,2000000,2017,2017,1 407 | Robinson Chirinos,TEX,C,1950000,2017,2018,2 408 | Brock Holt,BOS,LF,1950000,2017,2017,1 409 | Nate Jones,CWS,RP,1900000,2016,2018,3 410 | Brandon Maurer,SD,RP,1900000,2017,2017,1 411 | Travis d'Arnaud,NYM,C,1875000,2017,2017,1 412 | Justin Grimm,CHC,RP,1825000,2017,2017,1 413 | Robbie Ross Jr.,BOS,RP,1825000,2017,2017,1 414 | Tony Cingrani,CIN,RP,1825000,2017,2017,1 415 | Zach McAllister,CLE,RP,1825000,2017,2017,1 416 | Ryan Flaherty,BAL,2B,1800000,2017,2017,1 417 | Christian Friedrich,SD,SP,1790000,2017,2017,1 418 | Randall Delgado,ARI,RP,1775000,2017,2017,1 419 | Tony Barnette,TEX,RP,1750000,2016,2017,2 420 | Bud Norris,LAA,RP,1750000,2017,2017,1 421 | Clayton Richard,SD,SP,1750000,2017,2017,1 422 | Dustin McGowan,MIA,RP,1750000,2017,2017,1 423 | Erick Aybar,SD,SS,1750000,2017,2017,1 424 | George Kontos,SF,RP,1750000,2017,2017,1 425 | Jhoulys Chacin,SD,SP,1750000,2017,2017,1 426 | Rene Rivera,NYM,C,1750000,2017,2017,1 427 | Trevor Cahill,SD,SP,1750000,2017,2017,1 428 | Martin Maldonado,LAA,C,1725000,2017,2017,1 429 | Derek Dietrich,MIA,3B,1700000,2017,2017,1 430 | Dylan Bundy,BAL,SP,1640000,2017,2017,1 431 | Kevin Siegrist,STL,RP,1637500,2017,2017,1 432 | Gregory Polanco,PIT,RF,1600000,2017,2021,5 433 | Odubel Herrera,PHI,CF,1600000,2017,2021,5 434 | Brad Boxberger,TB,RP,1600000,2017,2017,1 435 | Jose Lobaton,WSH,C,1575000,2017,2017,1 436 | Arodys Vizcaino,ATL,RP,1550000,2017,2017,1 437 | Drew Butera,KC,C,1500000,2017,2018,2 438 | Austin Jackson,CLE,CF,1500000,2017,2017,1 439 | Chris Iannetta,ARI,C,1500000,2017,2017,1 440 | Kurt Suzuki,ATL,C,1500000,2017,2017,1 441 | Luis Avilan,LAD,RP,1500000,2017,2017,1 442 | Mark Reynolds,COL,1B,1500000,2017,2017,1 443 | Rickie Weeks Jr.,TB,LF,1500000,2017,2017,1 444 | Chris Stewart,PIT,C,1400000,2016,2017,2 445 | Chris Heisey,WSH,LF,1400000,2017,2017,1 446 | Conor Gillaspie,SF,3B,1400000,2017,2017,1 447 | Dan Jennings,CWS,RP,1400000,2017,2017,1 448 | Tommy Hunter,TB,SP,1400000,2017,2017,1 449 | Brad Hand,SD,RP,1375000,2017,2017,1 450 | Aaron Hicks,NYY,CF,1350000,2017,2017,1 451 | Daniel Descalso,ARI,1B,1350000,2017,2017,1 452 | Daniel Nava,PHI,LF,1350000,2017,2017,1 453 | Peter Bourjos,TB,CF,1350000,2017,2017,1 454 | Rougned Odor,TEX,2B,1333333,2017,2022,6 455 | Nick Vincent,SEA,RP,1325000,2017,2017,1 456 | Scott Van Slyke,LAD,LF,1325000,2017,2017,1 457 | Andrew Romine,DET,3B,1300000,2017,2017,1 458 | Sandy Leon,BOS,C,1300000,2017,2017,1 459 | Xavier Cedeno,TB,RP,1300000,2017,2017,1 460 | Blake Wood,CIN,RP,1275000,2017,2017,1 461 | Adam Rosales,OAK,3B,1250000,2017,2017,1 462 | Alexi Amarista,COL,2B,1250000,2017,2017,1 463 | Chris Hatcher,LAD,RP,1250000,2017,2017,1 464 | Craig Breslow,MIN,RP,1250000,2017,2017,1 465 | Emilio Bonifacio,ATL,OF,1250000,2017,2017,1 466 | Eric O'Flaherty,ATL,RP,1250000,2017,2017,1 467 | Jacob Lindgren,ATL,RP,1250000,2017,2017,1 468 | Jarrod Saltalamacchia,TOR,C,1250000,2017,2017,1 469 | Tom Milone,MIL,SP,1250000,2017,2017,1 470 | Tom Wilhelmsen,ARI,RP,1250000,2017,2017,1 471 | Derek Norris,TB,C,1200000,2017,2017,1 472 | Josh Collmenter,ATL,SP,1200000,2017,2017,1 473 | Alex Wilson,DET,RP,1175000,2017,2017,1 474 | Ryan Pressly,MIN,RP,1175000,2017,2017,1 475 | Ezequiel Carrera,TOR,LF,1162500,2017,2017,1 476 | Aaron Loup,TOR,RP,1125000,2017,2017,1 477 | Vidal Nuno,BAL,RP,1125000,2017,2017,1 478 | Zach Putnam,CWS,RP,1117500,2017,2017,1 479 | Casey Fien,SEA,RP,1100000,2017,2017,1 480 | Jake Marisnick,HOU,CF,1100000,2017,2017,1 481 | Liam Hendriks,OAK,RP,1100000,2017,2017,1 482 | Tommy Layne,NYY,RP,1075000,2017,2017,1 483 | Dan Otero,CLE,RP,1055000,2017,2017,1 484 | Cory Gearrin,SF,RP,1050000,2017,2017,1 485 | Kris Bryant,CHC,3B,1050000,2017,2017,1 486 | Jurickson Profar,TEX,2B,1005000,2017,2017,1 487 | Andrew Bailey,LAA,RP,1000000,2017,2017,1 488 | Peter Moylan,KC,RP,1000000,2017,2017,1 489 | Shawn Tolleson,TB,RP,1000000,2017,2017,1 490 | Tyler Moore,MIA,1B,1000000,2017,2017,1 491 | Carter Capps,SD,RP,987500,2017,2017,1 492 | Tanner Scheppers,TEX,RP,975000,2017,2017,1 493 | Jose Ramirez,CLE,3B,971400,2017,2021,5 494 | Chris Gimenez,MIN,C,950000,2017,2017,1 495 | Mookie Betts,BOS,RF,950000,2017,2017,1 496 | Chris Herrmann,ARI,C,937500,2017,2017,1 497 | Evan Scribner,SEA,RP,907500,2017,2017,1 498 | Anthony Swarzak,CWS,RP,900000,2017,2017,1 499 | Craig Stammen,SD,RP,900000,2017,2017,1 500 | Danny Farquhar,TB,RP,900000,2017,2017,1 501 | Ian Krol,ATL,RP,900000,2017,2017,1 502 | J.J. Hoover,ARI,RP,900000,2017,2017,1 503 | Kirk Nieuwenhuis,MIL,CF,900000,2017,2017,1 504 | Tim Beckham,TB,2B,855000,2017,2017,1 505 | Tim Anderson,CWS,SS,850000,2017,2022,6 506 | Bruce Rondon,DET,RP,850000,2017,2017,1 507 | Craig Gentry,BAL,LF,850000,2017,2017,1 508 | Jake Petricka,CWS,RP,825000,2017,2017,1 509 | Austin Romine,NYY,C,805000,2017,2017,1 510 | Zack Wheeler,NYM,SP,800000,2017,2017,1 511 | Guillermo Heredia,SEA,CF,782000,2017,2017,1 512 | Kyle Hendricks,CHC,SP,760500,2017,2017,1 513 | Hector Sanchez,SD,C,750000,2017,2017,1 514 | Neil Ramirez,SF,RP,750000,2017,2017,1 515 | Wade LeBlanc,PIT,RP,750000,2017,2017,1 516 | Chaz Roe,ATL,RP,720000,2017,2017,1 517 | Caleb Joseph,BAL,C,700000,2017,2017,1 518 | Eric Fryer,STL,C,675000,2017,2017,1 519 | Josh Edgin,NYM,RP,675000,2017,2017,1 520 | Addison Russell,CHC,SS,644000,2017,2017,1 521 | Jesus Sucre,TB,C,630000,2017,2017,1 522 | Chris Marrero,SF,1B,610000,2017,2017,1 523 | Javier Baez,CHC,SS,609000,2017,2017,1 524 | Noah Syndergaard,NYM,SP,605500,2017,2017,1 525 | Carlos Rodon,CWS,SP,600000,2017,2017,1 526 | Chase d'Arnaud,ATL,2B,600000,2017,2017,1 527 | Ehire Adrianza,MIN,SS,600000,2017,2017,1 528 | Joe Panik,SF,2B,600000,2017,2017,1 529 | Josh Rutledge,BOS,2B,600000,2017,2017,1 530 | Michael Martinez,CLE,OF,600000,2017,2017,1 531 | Eugenio Suarez,CIN,3B,595000,2017,2017,1 532 | Steven Wright,BOS,SP,593500,2017,2017,1 533 | Anthony DeSclafani,CIN,SP,585000,2017,2017,1 534 | Eduardo Rodriguez,BOS,SP,584500,2017,2017,1 535 | Roenis Elias,BOS,SP,582500,2017,2017,1 536 | Francisco Lindor,CLE,SS,579300,2017,2017,1 537 | Adam Duvall,CIN,LF,577500,2017,2017,1 538 | Corey Seager,LAD,SS,575500,2017,2017,1 539 | Jake Smolinksi,OAK,OF,575000,2017,2017,1 540 | Pete Kozma,NYY,SS,575000,2017,2017,1 541 | Tucker Barnhart,CIN,C,575000,2017,2017,1 542 | Tommy La Stella,CHC,2B,573500,2017,2017,1 543 | Jake Lamb,ARI,3B,573300,2017,2017,1 544 | Miguel Sano,MIN,3B,572500,2017,2017,1 545 | David Peralta,ARI,RF,572200,2017,2017,1 546 | Nathan Karns,KC,SP,571000,2017,2017,1 547 | Mike Montgomery,CHC,SP,570500,2017,2017,1 548 | Robbie Ray,ARI,SP,570400,2017,2017,1 549 | Mike Zunino,SEA,C,570000,2017,2017,1 550 | Brandon Finnegan,CIN,SP,567000,2017,2017,1 551 | Jarred Cosart,SD,SP,566300,2017,2017,1 552 | Nick Ahmed,ARI,SS,566000,2017,2017,1 553 | Kyle Schwarber,CHC,LF,565500,2017,2017,1 554 | C.J. Cron,LAA,1B,565000,2017,2017,1 555 | Cameron Rupp,PHI,C,565000,2017,2017,1 556 | Tyler Naquin,CLE,CF,564800,2017,2017,1 557 | Felipe Rivero,PIT,RP,564500,2017,2017,1 558 | Christian Colon,KC,2B,564000,2017,2017,1 559 | Blake Treinen,WSH,RP,563700,2017,2017,1 560 | Matt Barnes,BOS,RP,563500,2017,2017,1 561 | J.T. Realmuto,MIA,C,562500,2017,2017,1 562 | Steven Matz,NYM,SP,562250,2017,2017,1 563 | Ronald Torreyes,NYY,SS,561900,2017,2017,1 564 | Christian Vazquez,BOS,C,561000,2017,2017,1 565 | Stephen Piscotty,STL,RF,560400,2017,2017,1 566 | Blake Parker,LAA,RP,560000,2017,2017,1 567 | Maikel Franco,PHI,3B,560000,2017,2017,1 568 | Phil Gosselin,PIT,2B,559500,2017,2017,1 569 | Andrew Chafin,ARI,RP,559300,2017,2017,1 570 | Paulo Orlando,KC,RF,558250,2017,2017,1 571 | Gary Sanchez,NYY,C,557900,2017,2017,1 572 | Michael Taylor,WSH,CF,557900,2017,2017,1 573 | Hector Neris,PHI,RP,557500,2017,2017,1 574 | Jose Alvarez,LAA,RP,557500,2017,2017,1 575 | Jumbo Diaz,TB,RP,557500,2017,2017,1 576 | Randal Grichuk,STL,CF,557200,2017,2017,1 577 | Carson Smith,BOS,RP,556750,2017,2017,1 578 | Brian Flynn,KC,RP,556000,2017,2017,1 579 | Carl Edwards Jr.,CHC,RP,556000,2017,2017,1 580 | Jameson Taillon,PIT,SP,555500,2017,2017,1 581 | Cam Bedrosian,LAA,RP,555000,2017,2017,1 582 | Enrique Hernandez,LAD,LF,555000,2017,2017,1 583 | Hunter Strickland,SF,RP,555000,2017,2017,1 584 | Jace Peterson,ATL,2B,555000,2017,2017,1 585 | Joc Pederson,LAD,CF,555000,2017,2017,1 586 | Kevin Pillar,TOR,CF,555000,2017,2017,1 587 | Michael Lorenzen,CIN,RP,555000,2017,2017,1 588 | Trevor May,MIN,RP,555000,2017,2017,1 589 | Tyler Skaggs,LAA,SP,555000,2017,2017,1 590 | Yimi Garcia,LAD,RP,555000,2017,2017,1 591 | Michael Conforto,NYM,LF,554904,2017,2017,1 592 | Trea Turner,WSH,CF,554900,2017,2017,1 593 | Chris Devenski,HOU,RP,554500,2017,2017,1 594 | Jonathan Villar,MIL,SS,554500,2017,2017,1 595 | Willson Contreras,CHC,C,554500,2017,2017,1 596 | Brandon Drury,ARI,3B,553900,2017,2017,1 597 | Hansel Robles,NYM,RP,553125,2017,2017,1 598 | Eddie Rosario,MIN,LF,552500,2017,2017,1 599 | Justin Bour,MIA,1B,552500,2017,2017,1 600 | Robbie Grossman,MIN,LF,552500,2017,2017,1 601 | Chasen Shreve,NYY,RP,552425,2017,2017,1 602 | Roberto Osuna,TOR,RP,552400,2017,2017,1 603 | Cheslor Cuthbert,KC,3B,552250,2017,2017,1 604 | Dan Straily,MIA,SP,552100,2017,2017,1 605 | James McCann,DET,C,552100,2017,2017,1 606 | Albert Almora Jr.,CHC,CF,552000,2017,2017,1 607 | Jerad Eickhoff,PHI,SP,552000,2017,2017,1 608 | Michael Fulmer,DET,SP,551900,2017,2017,1 609 | Enny Romero,WSH,RP,551000,2017,2017,1 610 | Luis Severino,NYY,SP,550975,2017,2017,1 611 | Bryan Mitchell,NYY,SP,550625,2017,2017,1 612 | Shane Greene,DET,RP,550600,2017,2017,1 613 | Ken Giles,HOU,RP,550100,2017,2017,1 614 | Chad Kuhl,PIT,SP,550000,2017,2017,1 615 | JC Ramirez,LAA,RP,550000,2017,2017,1 616 | Pedro Baez,LAD,RP,550000,2017,2017,1 617 | Roberto Perez,CLE,C,550000,2017,2017,1 618 | Tyler Lyons,STL,RP,549800,2017,2017,1 619 | Adam Frazier,PIT,LF,549500,2017,2017,1 620 | Matt Szczur,CHC,CF,549500,2017,2017,1 621 | Andrew Benintendi,BOS,LF,549000,2017,2017,1 622 | Josh Bell,PIT,1B,549000,2017,2017,1 623 | Jake Barrett,ARI,RP,548300,2017,2017,1 624 | Dominic Leone,TOR,RP,548200,2017,2017,1 625 | Ryan Goins,TOR,2B,548200,2017,2017,1 626 | Lance McCullers Jr.,HOU,SP,548000,2017,2017,1 627 | Alex Colome,TB,RP,547900,2017,2017,1 628 | Greg Garcia,STL,2B,547900,2017,2017,1 629 | Adonis Garcia,ATL,3B,547500,2017,2017,1 630 | Carlos Perez,LAA,C,547500,2017,2017,1 631 | Matt Andriese,TB,SP,547500,2017,2017,1 632 | Max Kepler,MIN,CF,547500,2017,2017,1 633 | Heath Hembree,BOS,RP,547000,2017,2017,1 634 | Jefry Marte,LAA,3B,547000,2017,2017,1 635 | Jimmy Nelson,MIL,SP,547000,2017,2017,1 636 | Tyler Saladino,CWS,3B,547000,2017,2017,1 637 | Vince Velasquez,PHI,SP,547000,2017,2017,1 638 | Steven Souza Jr.,TB,RF,546700,2017,2017,1 639 | Matt Bowman,STL,RP,546600,2017,2017,1 640 | Leury Garcia,CWS,CF,546500,2017,2017,1 641 | Nomar Mazara,TEX,RF,546450,2017,2017,1 642 | Kyle Ryan,DET,RP,546400,2017,2017,1 643 | Junior Guerra,MIL,SP,546200,2017,2017,1 644 | Michael Feliz,HOU,RP,546200,2017,2017,1 645 | Ryan Schimpf,SD,2B,546200,2017,2017,1 646 | Zach Davies,MIL,SP,546200,2017,2017,1 647 | Mychal Givens,BAL,RP,546000,2017,2017,1 648 | Yolmer Sanchez,CWS,2B,546000,2017,2017,1 649 | Colin Rea,SD,SP,545800,2017,2017,1 650 | Hernan Perez,MIL,3B,545700,2017,2017,1 651 | Sammy Solis,WSH,RP,545700,2017,2017,1 652 | Daniel Norris,DET,SP,545500,2017,2017,1 653 | Robbie Erlin,SD,SP,545500,2017,2017,1 654 | Matt Duffy,TB,3B,545300,2017,2017,1 655 | Devon Travis,TOR,2B,545200,2017,2017,1 656 | Alex Claudio,TEX,RP,545050,2017,2017,1 657 | Blake Snell,TB,SP,545000,2017,2017,1 658 | Chad Bettis,COL,SP,545000,2017,2017,1 659 | Chris Rusin,COL,RP,545000,2017,2017,1 660 | Danny Santana,MIN,CF,545000,2017,2017,1 661 | Danny Winkler,ATL,RP,545000,2017,2017,1 662 | Derek Law,SF,RP,545000,2017,2017,1 663 | Edwin Diaz,SEA,RP,545000,2017,2017,1 664 | Greg Bird,NYY,1B,545000,2017,2017,1 665 | Josh Phegley,OAK,C,545000,2017,2017,1 666 | Josh Ravin,LAD,RP,545000,2017,2017,1 667 | Kendall Graveman,OAK,SP,545000,2017,2017,1 668 | Marcus Semien,OAK,SS,545000,2017,2017,1 669 | Mark Canha,OAK,OF,545000,2017,2017,1 670 | Tyler Wilson,BAL,RP,545000,2017,2017,1 671 | Matt Bush,TEX,RP,544920,2017,2017,1 672 | Ryan Rua,TEX,RF,544740,2017,2017,1 673 | Ryan Buchter,SD,RP,544700,2017,2017,1 674 | Tyler Collins,DET,LF,544700,2017,2017,1 675 | Aaron Judge,NYY,RF,544500,2017,2017,1 676 | Travis Shaw,MIL,3B,544400,2017,2017,1 677 | Luis Perdomo,SD,SP,544300,2017,2017,1 678 | Travis Jankowski,SD,CF,544300,2017,2017,1 679 | Abraham Almonte,CLE,CF,544200,2017,2017,1 680 | Matt Boyd,DET,SP,544200,2017,2017,1 681 | Archie Bradley,ARI,SP,544100,2017,2017,1 682 | Aaron Nola,PHI,SP,544000,2017,2017,1 683 | Mike Foltynewicz,ATL,SP,544000,2017,2017,1 684 | Shawn O'Malley,SEA,SS,544000,2017,2017,1 685 | Trevor Williams,PIT,SP,544000,2017,2017,1 686 | Tyler Austin,NYY,1B,544000,2017,2017,1 687 | Seth Lugo,NYM,SP,543500,2017,2017,1 688 | Joe Musgrove,HOU,SP,543400,2017,2017,1 689 | Andrew Heaney,LAA,SP,543000,2017,2017,1 690 | Bo Schultz,TOR,RP,543000,2017,2017,1 691 | Joe Biagini,TOR,RP,543000,2017,2017,1 692 | Tommy Joseph,PHI,1B,543000,2017,2017,1 693 | Ryan Tepera,TOR,RP,542700,2017,2017,1 694 | Jeremy Hazelbaker,ARI,LF,542500,2017,2017,1 695 | Michael Tonkin,MIN,RP,542500,2017,2017,1 696 | Nick Tropeano,LAA,SP,542500,2017,2017,1 697 | Taylor Rogers,MIN,RP,542500,2017,2017,1 698 | Tyler Duffey,MIN,SP,542500,2017,2017,1 699 | Domingo Santana,MIL,RF,542200,2017,2017,1 700 | Trevor Brown,SF,C,542000,2017,2017,1 701 | Christian Bethancourt,SD,C,541800,2017,2017,1 702 | Luis Sardinas,SD,2B,541800,2017,2017,1 703 | Robert Gsellman,NYM,SP,541750,2017,2017,1 704 | Alen Hanson,PIT,SS,541500,2017,2017,1 705 | Alex Dickerson,SD,RF,541500,2017,2017,1 706 | Brad Peacock,HOU,SP,541500,2017,2017,1 707 | Rafael Montero,NYM,RP,541400,2017,2017,1 708 | Mikie Mahtook,DET,CF,541300,2017,2017,1 709 | Keon Broxton,MIL,CF,541200,2017,2017,1 710 | Tyler Glasnow,PIT,SP,541000,2017,2017,1 711 | Ariel Miranda,SEA,SP,540500,2017,2017,1 712 | Delino DeShields,TEX,CF,540300,2017,2017,1 713 | Jhan Marinez,MIL,RP,540200,2017,2017,1 714 | Andrew Toles,LAD,CF,540000,2017,2017,1 715 | Austin Barnes,LAD,C,540000,2017,2017,1 716 | Chris Bassitt,OAK,SP,540000,2017,2017,1 717 | Cristhian Adames,COL,SS,540000,2017,2017,1 718 | Dansby Swanson,ATL,SS,540000,2017,2017,1 719 | Edubray Ramos,PHI,RP,540000,2017,2017,1 720 | Grant Dayton,LAD,RP,540000,2017,2017,1 721 | Jairo Diaz,COL,RP,540000,2017,2017,1 722 | Jon Gray,COL,SP,540000,2017,2017,1 723 | Jorge Polanco,MIN,SS,540000,2017,2017,1 724 | Jose Peraza,CIN,SS,540000,2017,2017,1 725 | Michael Ynoa,CWS,RP,540000,2017,2017,1 726 | Omar Narvaez,CWS,C,540000,2017,2017,1 727 | Ross Stripling,LAD,RP,540000,2017,2017,1 728 | Ryan Dull,OAK,RP,540000,2017,2017,1 729 | Ryan O'Rourke,MIN,RP,540000,2017,2017,1 730 | Scott Oberg,COL,RP,540000,2017,2017,1 731 | Scott Schebler,CIN,LF,540000,2017,2017,1 732 | Tony Wolters,COL,C,540000,2017,2017,1 733 | Trevor Story,COL,SS,540000,2017,2017,1 734 | Tyler Anderson,COL,SP,540000,2017,2017,1 735 | T.J. Rivera,NYM,SS,539958,2017,2017,1 736 | Jett Bandy,MIL,C,539800,2017,2017,1 737 | Mallex Smith,TB,CF,539800,2017,2017,1 738 | Tony Zych,SEA,RP,539600,2017,2017,1 739 | Socrates Brito,ARI,CF,539500,2017,2017,1 740 | Alex Bregman,HOU,3B,539400,2017,2017,1 741 | Cody Anderson,CLE,SP,539100,2017,2017,1 742 | Adam Morgan,PHI,SP,539000,2017,2017,1 743 | Dalton Pompey,TOR,CF,539000,2017,2017,1 744 | Jarrett Parker,SF,RF,539000,2017,2017,1 745 | Joey Rickard,BAL,CF,539000,2017,2017,1 746 | Mac Williamson,SF,RF,539000,2017,2017,1 747 | Corey Knebel,MIL,RP,538900,2017,2017,1 748 | Matt Strahm,KC,SP,538900,2017,2017,1 749 | Dario Alvarez,TEX,RP,538790,2017,2017,1 750 | Aaron Altherr,PHI,CF,538500,2017,2017,1 751 | Donnie Hart,BAL,RP,538500,2017,2017,1 752 | Koda Glover,WSH,RP,538300,2017,2017,1 753 | Manny Pina,MIL,C,538200,2017,2017,1 754 | Steve Hathaway,ARI,RP,538200,2017,2017,1 755 | Orlando Arcia,MIL,SS,538100,2017,2017,1 756 | Arismendy Alcantara,CIN,CF,538000,2017,2017,1 757 | Mitch Haniger,SEA,LF,538000,2017,2017,1 758 | Oliver Drake,BAL,RP,538000,2017,2017,1 759 | Dixon Machado,DET,SS,537800,2017,2017,1 760 | Wilmer Difo,WSH,SS,537800,2017,2017,1 761 | Jacob Barnes,MIL,RP,537700,2017,2017,1 762 | Taylor Jungmann,MIL,RP,537600,2017,2017,1 763 | Adam Conley,MIA,SP,537500,2017,2017,1 764 | Andrew Triggs,OAK,SP,537500,2017,2017,1 765 | Brock Stewart,LAD,RP,537500,2017,2017,1 766 | Daniel Coulombe,OAK,RP,537500,2017,2017,1 767 | Daniel Mengden,OAK,SP,537500,2017,2017,1 768 | Frankie Montas,OAK,RP,537500,2017,2017,1 769 | Mauricio Cabrera,ATL,RP,537500,2017,2017,1 770 | Miguel Socolovich,STL,RP,537500,2017,2017,1 771 | Rob Whalen,SEA,SP,537500,2017,2017,1 772 | Ryon Healy,OAK,3B,537500,2017,2017,1 773 | Sean Manaea,OAK,SP,537500,2017,2017,1 774 | Andrew Susac,MIL,C,537400,2017,2017,1 775 | Hanser Alberto,TEX,SS,537360,2017,2017,1 776 | Raul Mondesi,KC,SS,537250,2017,2017,1 777 | Ty Kelly,NYM,LF,537208,2017,2017,1 778 | Jandel Gustave,HOU,RP,537200,2017,2017,1 779 | Taylor Motter,SEA,SS,537200,2017,2017,1 780 | Joey Gallo,TEX,3B,537120,2017,2017,1 781 | Austin Hedges,SD,C,537100,2017,2017,1 782 | Brett Nicholas,TEX,C,537000,2017,2017,1 783 | Carlos Estevez,COL,RP,537000,2017,2017,1 784 | Chi Chi Gonzalez,TEX,SP,537000,2017,2017,1 785 | Cody Reed,CIN,RP,537000,2017,2017,1 786 | David Dahl,COL,CF,537000,2017,2017,1 787 | Dustin Garneau,COL,C,537000,2017,2017,1 788 | German Marquez,COL,SP,537000,2017,2017,1 789 | Gorkys Hernandez,SF,CF,537000,2017,2017,1 790 | Nefi Ogando,CIN,RP,537000,2017,2017,1 791 | Robby Scott,BOS,RP,537000,2017,2017,1 792 | Tom Murphy,COL,C,537000,2017,2017,1 793 | Zach Eflin,PHI,SP,537000,2017,2017,1 794 | Jonathan Holder,NYY,RP,536875,2017,2017,1 795 | Josh Smoker,NYM,RP,536625,2017,2017,1 796 | Dillon Overton,SEA,SP,536600,2017,2017,1 797 | John Gant,STL,RP,536600,2017,2017,1 798 | James Pazos,SEA,RP,536500,2017,2017,1 799 | Kyle Barraclough,MIA,RP,536500,2017,2017,1 800 | Matt Davidson,CWS,3B,536500,2017,2017,1 801 | Sam Tuivailala,STL,RP,536500,2017,2017,1 802 | Terrance Gore,KC,OF,536500,2017,2017,1 803 | Ty Blach,SF,SP,536500,2017,2017,1 804 | Jose A. Ramirez,ATL,RP,536250,2017,2017,1 805 | Brandon Nimmo,NYM,CF,536240,2017,2017,1 806 | Shae Simmons,SEA,RP,536200,2017,2017,1 807 | Dan Altavilla,SEA,RP,536100,2017,2017,1 808 | David Paulino,HOU,SP,536100,2017,2017,1 809 | Hunter Dozier,KC,3B,536100,2017,2017,1 810 | JaCoby Jones,DET,CF,536100,2017,2017,1 811 | Charlie Tilson,CWS,CF,536000,2017,2017,1 812 | Jesus Aguilar,MIL,1B,536000,2017,2017,1 813 | Jose Leclerc,TEX,RP,536000,2017,2017,1 814 | Trey Mancini,BAL,DH,536000,2017,2017,1 815 | Hunter Renfroe,SD,RF,535900,2017,2017,1 816 | Buddy Baumann,SD,RP,535700,2017,2017,1 817 | Shawn Armstrong,CLE,RP,535700,2017,2017,1 818 | Manuel Margot,SD,CF,535600,2017,2017,1 819 | Jose Torres,SD,RP,535400,2017,2017,1 820 | Aaron Sanchez,TOR,SP,535000,2017,2017,1 821 | Adalberto Mejia,MIN,SP,535000,2017,2017,1 822 | Alex Reyes,STL,SP,535000,2017,2017,1 823 | Allen Cordoba,SD,SS,535000,2017,2017,1 824 | Amir Garrett,CIN,RP,535000,2017,2017,1 825 | Andrew Knapp,PHI,C,535000,2017,2017,1 826 | Anthony Santander,BAL,OF,535000,2017,2017,1 827 | Antonio Senzatela,COL,SP,535000,2017,2017,1 828 | Armando Rivero,ATL,RP,535000,2017,2017,1 829 | Austin Brice,CIN,RP,535000,2017,2017,1 830 | Austin Pruitt,TB,RP,535000,2017,2017,1 831 | Barrett Astin,CIN,SP,535000,2017,2017,1 832 | Ben Taylor,BOS,RP,535000,2017,2017,1 833 | Brock Stassi,PHI,1B,535000,2017,2017,1 834 | Byron Buxton,MIN,CF,535000,2017,2017,1 835 | Carlos Correa,HOU,SS,535000,2017,2017,1 836 | Cody Asche,CWS,LF,535000,2017,2017,1 837 | Daniel R. Robertson,TB,SS,535000,2017,2017,1 838 | Drew Robinson,TEX,OF,535000,2017,2017,1 839 | Dylan Covey,CWS,RP,535000,2017,2017,1 840 | Glenn Sparkman,TOR,RP,535000,2017,2017,1 841 | Jacob May,CWS,CF,535000,2017,2017,1 842 | Jharel Cotton,OAK,SP,535000,2017,2017,1 843 | Joely Rodriguez,PHI,RP,535000,2017,2017,1 844 | Joey Wendle,OAK,2B,535000,2017,2017,1 845 | Jose Marmolejos,WSH,1B,535000,2017,2017,1 846 | Jose Martinez,STL,LF,535000,2017,2017,1 847 | Jose Urena,MIA,SP,535000,2017,2017,1 848 | Juan Minaya,CWS,RP,535000,2017,2017,1 849 | Justin Haley,MIN,RP,535000,2017,2017,1 850 | Kevin Gadea,TB,RP,535000,2017,2017,1 851 | Kyle Freeland,COL,RP,535000,2017,2017,1 852 | Luis Torrens,SD,C,535000,2017,2017,1 853 | Micah Johnson,ATL,2B,535000,2017,2017,1 854 | Miguel Diaz,SD,RP,535000,2017,2017,1 855 | Miguel Rojas,MIA,SS,535000,2017,2017,1 856 | Mike Hauschild,TEX,SP,535000,2017,2017,1 857 | Nick Travieso,CIN,RP,535000,2017,2017,1 858 | Nick Wittgren,MIA,RP,535000,2017,2017,1 859 | Odrisamer Despaigne,MIA,RP,535000,2017,2017,1 860 | Patrick Kivlehan,CIN,RF,535000,2017,2017,1 861 | Raul Alcantara,OAK,SP,535000,2017,2017,1 862 | Robert Stephenson,CIN,SP,535000,2017,2017,1 863 | Rookie Davis,CIN,SP,535000,2017,2017,1 864 | Stephen Cardullo,COL,1B,535000,2017,2017,1 865 | Steve Selsky,BOS,RF,535000,2017,2017,1 866 | Stuart Turner,CIN,C,535000,2017,2017,1 867 | Vicente Campos,LAA,RP,535000,2017,2017,1 868 | Wandy Peralta,CIN,RP,535000,2017,2017,1 869 | Yandy Diaz,CLE,3B,535000,2017,2017,1 --------------------------------------------------------------------------------