Capítulo 6.2

Índice

  1. 1. O que é Ciência de Dados?
  2. 2. Causalidade e Experimentos
  3. 3. Progamando em Python
  4. 4. Tipos de Dados
  5. 5. Sequências
  6. 6. Tabelas
  7. 7. Visualização
  8. 8. Funções e Tabelas
  9. 9. Aleatoriedade
  10. 10. Amostragem e Distribuições Empíricas
  11. 11. Testando Hipóteses
  12. 12. Comparando Duas Amostras
  13. 13. Estimação
  14. 14. Por que a Média é Importante
  15. 15. Previsão

from datascience import *
import numpy as np
path_data = '../../../assets/data/'
np.set_printoptions(threshold=50)
nba_salaries = Table.read_table(path_data + 'nba_salaries.csv')
nba = nba_salaries.relabeled("'15-'16 SALARY", 'SALARY')

Selecionando Linhas

Frequentemente, gostaríamos de extrair apenas aquelas linhas que correspondem a entradas com uma característica específica. Por exemplo, podemos querer apenas as linhas correspondentes aos Warriors, ou aos jogadores que ganharam mais de $10 milhões. Ou podemos querer apenas os cinco principais ganhadores.

Linhas Específicas

O método da Tabela take faz exatamente isso – ele pega um conjunto especificado de linhas. Seu argumento é um índice de linha ou uma matriz de índices, e ele cria uma nova tabela consistindo apenas dessas linhas.

Por exemplo, se quisermos apenas a primeira linha de nba, poderíamos usar take da seguinte forma.

nba
PLAYER POSITION TEAM SALARY
Paul Millsap PF Atlanta Hawks 18.6717
Al Horford C Atlanta Hawks 12
Tiago Splitter C Atlanta Hawks 9.75625
Jeff Teague PG Atlanta Hawks 8
Kyle Korver SG Atlanta Hawks 5.74648
Thabo Sefolosha SF Atlanta Hawks 4
Mike Scott PF Atlanta Hawks 3.33333
Kent Bazemore SF Atlanta Hawks 2
Dennis Schroder PG Atlanta Hawks 1.7634
Tim Hardaway Jr. SG Atlanta Hawks 1.30452
… (407 rows omitted)

nba.take(0)
PLAYER POSITION TEAM SALARY
Paul Millsap PF Atlanta Hawks 18.6717

Esta é uma nova tabela com apenas a única linha que especificamos.

Também poderíamos obter a quarta, quinta e sexta linhas especificando um intervalo de índices como argumento.

nba.take(np.arange(3, 6))
PLAYER POSITION TEAM SALARY
Jeff Teague PG Atlanta Hawks 8
Kyle Korver SG Atlanta Hawks 5.74648
Thabo Sefolosha SF Atlanta Hawks 4

Se quisermos uma tabela dos 5 jogadores mais bem pagos, podemos primeiro ordenar a lista por salário e depois take as primeiras cinco linhas:

nba.sort('SALARY', descending=True).take(np.arange(5))
PLAYER POSITION TEAM SALARY
Kobe Bryant SF Los Angeles Lakers 25
Joe Johnson SF Brooklyn Nets 24.8949
LeBron James SF Cleveland Cavaliers 22.9705
Carmelo Anthony SF New York Knicks 22.875
Dwight Howard C Houston Rockets 22.3594

Linhas Correspondentes a uma Característica Específica

Com mais frequência, queremos acessar dados em um conjunto de linhas que possuem uma determinada característica, mas cujos índices não conhecemos antecipadamente. Por exemplo, podemos querer dados sobre todos os jogadores que ganharam mais de $10 milhões, mas não queremos gastar tempo contando as linhas na tabela classificada.

O método where faz o trabalho para nós. Sua saída é uma tabela com as mesmas colunas que o original, mas apenas as linhas onde a característica ocorre.

O primeiro argumento de where é o rótulo da coluna que contém as informações sobre se uma linha tem ou não a característica que queremos. Se a característica for “ganhou mais de $10 milhões”, a coluna é SALARY.

O segundo argumento de where é uma maneira de especificar a característica. Alguns exemplos tornarão mais fácil entender o método geral de especificação.

No primeiro exemplo, extraímos os dados de todos aqueles que ganharam mais de $10 milhões.

nba.where('SALARY', are.above(10))
PLAYER POSITION TEAM SALARY
Paul Millsap PF Atlanta Hawks 18.6717
Al Horford C Atlanta Hawks 12
Joe Johnson SF Brooklyn Nets 24.8949
Thaddeus Young PF Brooklyn Nets 11.236
Al Jefferson C Charlotte Hornets 13.5
Nicolas Batum SG Charlotte Hornets 13.1253
Kemba Walker PG Charlotte Hornets 12
Derrick Rose PG Chicago Bulls 20.0931
Jimmy Butler SG Chicago Bulls 16.4075
Joakim Noah C Chicago Bulls 13.4
… (59 rows omitted)

O uso do argumento are.above(10) garantiu que cada linha selecionada tivesse um valor de SALARY maior que 10.

Existem 69 linhas na nova tabela, correspondentes aos 69 jogadores que ganharam mais de $10 milhões de dólares. Organizar essas linhas em ordem torna os dados mais fáceis de analisar. DeMar DeRozan do Toronto Raptors foi o “mais pobre” deste grupo, com um salário um pouco superior a $10 milhões de dólares.

nba.where('SALARY', are.above(10)).sort('SALARY')
PLAYER POSITION TEAM SALARY
DeMar DeRozan SG Toronto Raptors 10.05
Gerald Wallace SF Philadelphia 76ers 10.1059
Luol Deng SF Miami Heat 10.1516
Monta Ellis SG Indiana Pacers 10.3
Wilson Chandler SF Denver Nuggets 10.4494
Brendan Haywood C Cleveland Cavaliers 10.5225
Jrue Holiday PG New Orleans Pelicans 10.5955
Tyreke Evans SG New Orleans Pelicans 10.7346
Marcin Gortat C Washington Wizards 11.2174
Thaddeus Young PF Brooklyn Nets 11.236
… (59 rows omitted)

Quanto ganhou Stephen Curry? Para responder, temos que acessar a linha onde o valor de PLAYER é igual a Stephen Curry. É colocada uma tabela composta por apenas uma linha:

nba.where('PLAYER', are.equal_to('Stephen Curry'))
PLAYER POSITION TEAM SALARY
Stephen Curry PG Golden State Warriors 11.3708

Curry ganhou pouco menos de $11.4 milhões de dólares. Isso é muito dinheiro, mas é menos da metade do salário de LeBron James. Você encontrará esse salário na tabela “Top 5” mais cedo nesta seção, ou poderia encontrá-lo substituindo 'Stephen Curry' por 'LeBron James' na linha de código acima.

No código, are é usado novamente, mas desta vez com o predicado equal_to em vez de above. Assim, por exemplo, você pode obter uma tabela de todos os Warriors:

nba.where('TEAM', are.equal_to('Golden State Warriors')).show()
PLAYER POSITION TEAM SALARY
Klay Thompson SG Golden State Warriors 15.501
Draymond Green PF Golden State Warriors 14.2609
Andrew Bogut C Golden State Warriors 13.8
Andre Iguodala SF Golden State Warriors 11.7105
Stephen Curry PG Golden State Warriors 11.3708
Jason Thompson PF Golden State Warriors 7.00847
Shaun Livingston PG Golden State Warriors 5.54373
Harrison Barnes SF Golden State Warriors 3.8734
Marreese Speights C Golden State Warriors 3.815
Leandro Barbosa SG Golden State Warriors 2.5
Festus Ezeli C Golden State Warriors 2.00875
Brandon Rush SF Golden State Warriors 1.27096
Kevon Looney SF Golden State Warriors 1.13196
Anderson Varejao PF Golden State Warriors 0.289755

Essa parte da tabela já está ordenada por salário, porque a tabela original listava os jogadores ordenados por salário dentro do mesmo time. O .show() no final da linha garante que todas as linhas sejam mostradas, não apenas as primeiras 10.

É tão comum solicitar as linhas para as quais alguma coluna é igual a algum valor que a chamada are.equal_to é opcional. Em vez disso, o método where pode ser chamado apenas com o nome de uma coluna e um valor para alcançar o mesmo efeito.

nba.where('TEAM', 'Denver Nuggets') # equivalent to nba.where('TEAM', are.equal_to('Denver Nuggets'))
PLAYER POSITION TEAM SALARY
Danilo Gallinari SF Denver Nuggets 14
Kenneth Faried PF Denver Nuggets 11.236
Wilson Chandler SF Denver Nuggets 10.4494
JJ Hickson C Denver Nuggets 5.6135
Jameer Nelson PG Denver Nuggets 4.345
Will Barton SF Denver Nuggets 3.53333
Emmanuel Mudiay PG Denver Nuggets 3.10224
Darrell Arthur PF Denver Nuggets 2.814
Jusuf Nurkic C Denver Nuggets 1.842
Joffrey Lauvergne C Denver Nuggets 1.70972
… (4 rows omitted)

Múltiplas Características

Você pode acessar linhas que têm várias características especificadas, usando o where repetidamente. Por exemplo, aqui está uma maneira de extrair todos os Armadores cujos salários eram superiores a $15 milhões de dólares.

nba.where('POSITION', 'PG').where('SALARY', are.above(15))
PLAYER POSITION TEAM SALARY
Derrick Rose PG Chicago Bulls 20.0931
Kyrie Irving PG Cleveland Cavaliers 16.4075
Chris Paul PG Los Angeles Clippers 21.4687
Russell Westbrook PG Oklahoma City Thunder 16.7442
John Wall PG Washington Wizards 15.852

Forma Geral

Neste ponto, você já percebeu que a maneira geral de criar uma nova tabela selecionando linhas com uma determinada característica é usar where e are com a condição apropriada:

original_table_name.where(column_label_string, are.condition)

nba.where('SALARY', are.between(10, 10.3))
PLAYER POSITION TEAM SALARY
Luol Deng SF Miami Heat 10.1516
Gerald Wallace SF Philadelphia 76ers 10.1059
Danny Green SG San Antonio Spurs 10
DeMar DeRozan SG Toronto Raptors 10.05

Observe que a tabela acima inclui Danny Green, que ganhou $10 milhões, mas não Monta Ellis, que ganhou $10.3 milhões. Como em outras partes do Python, o intervalo between inclui o extremo esquerdo, mas não o direito.

Se especificarmos uma condição que não seja satisfeita por nenhuma linha, obteremos uma tabela com rótulos de coluna, mas sem linhas.

nba.where('PLAYER', are.equal_to('Barack Obama'))
PLAYER POSITION TEAM SALARY

Algumas Condições Adicionais

Aqui estão alguns predicados de are que você pode achar úteis. Observe que x e y são números, STRING é uma string e Z é ou um número ou uma string; você deve especificar isso dependendo da característica que você deseja.

Predicado Descrição
are.equal_to(Z) Igual a Z
are.above(x) Maior que x
are.above_or_equal_to(x) Maior que ou igual a x
are.below(x) Menor que x
are.below_or_equal_to(x) Menor que ou igual a x
are.between(x, y) Maior que ou igual a x, e menor que y
are.strictly_between(x, y) Maior que x e menor que y
are.between_or_equal_to(x, y) Maior que ou igual a x, e menor que ou igual a y
are.containing(S) Contém a string S

Você também pode especificar a negação de qualquer uma dessas condições, usando .not_ antes da condição:

Predicado Descrição
are.not_equal_to(Z) Não igual a Z
are.not_above(x) Não acima de x

… e assim por diante. As regras habituais da lógica se aplicam – por exemplo, “não acima de x” é o mesmo que “abaixo ou igual a x”.

Encerramos a seção com uma série de exemplos.

O uso de are.containing pode ajudar a economizar digitação. Por exemplo, você pode simplesmente especificar Warriors em vez de Golden State Warriors:

nba.where('TEAM', are.containing('Warriors')).show()
PLAYER POSITION TEAM SALARY
Klay Thompson SG Golden State Warriors 15.501
Draymond Green PF Golden State Warriors 14.2609
Andrew Bogut C Golden State Warriors 13.8
Andre Iguodala SF Golden State Warriors 11.7105
Stephen Curry PG Golden State Warriors 11.3708
Jason Thompson PF Golden State Warriors 7.00847
Shaun Livingston PG Golden State Warriors 5.54373
Harrison Barnes SF Golden State Warriors 3.8734
Marreese Speights C Golden State Warriors 3.815
Leandro Barbosa SG Golden State Warriors 2.5
Festus Ezeli C Golden State Warriors 2.00875
Brandon Rush SF Golden State Warriors 1.27096
Kevon Looney SF Golden State Warriors 1.13196
Anderson Varejao PF Golden State Warriors 0.289755

Você pode extrair dados de todos os guardas, tanto guardas de ponta quanto guardas de tiro:

nba.where('POSITION', are.containing('G'))
PLAYER POSITION TEAM SALARY
Jeff Teague PG Atlanta Hawks 8
Kyle Korver SG Atlanta Hawks 5.74648
Dennis Schroder PG Atlanta Hawks 1.7634
Tim Hardaway Jr. SG Atlanta Hawks 1.30452
Jason Richardson SG Atlanta Hawks 0.947276
Lamar Patterson SG Atlanta Hawks 0.525093
Terran Petteway SG Atlanta Hawks 0.525093
Avery Bradley PG Boston Celtics 7.73034
Isaiah Thomas PG Boston Celtics 6.91287
Marcus Smart PG Boston Celtics 3.43104
… (171 rows omitted)

Você pode pegar todos os jogadores que não eram Cleveland Cavaliers e tinham um salário não inferior a $20 milhões:

other_than_Cavs = nba.where('TEAM', are.not_equal_to('Cleveland Cavaliers'))
other_than_Cavs.where('SALARY', are.not_below(20))
PLAYER POSITION TEAM SALARY
Joe Johnson SF Brooklyn Nets 24.8949
Derrick Rose PG Chicago Bulls 20.0931
Dwight Howard C Houston Rockets 22.3594
Chris Paul PG Los Angeles Clippers 21.4687
Kobe Bryant SF Los Angeles Lakers 25
Chris Bosh PF Miami Heat 22.1927
Dwyane Wade SG Miami Heat 20
Carmelo Anthony SF New York Knicks 22.875
Kevin Durant SF Oklahoma City Thunder 20.1586

A mesma tabela pode ser criada de várias maneiras. Aqui está outra, e sem dúvida você pode pensar em mais.

other_than_Cavs.where('SALARY', are.above_or_equal_to(20))
PLAYER POSITION TEAM SALARY
Joe Johnson SF Brooklyn Nets 24.8949
Derrick Rose PG Chicago Bulls 20.0931
Dwight Howard C Houston Rockets 22.3594
Chris Paul PG Los Angeles Clippers 21.4687
Kobe Bryant SF Los Angeles Lakers 25
Chris Bosh PF Miami Heat 22.1927
Dwyane Wade SG Miami Heat 20
Carmelo Anthony SF New York Knicks 22.875
Kevin Durant SF Oklahoma City Thunder 20.1586

Como você pode ver, o uso de where com are lhe dá grande flexibilidade para acessar linhas com recursos que lhe interessam. Não hesite em experimentar!

← Capítulo 6.1 – Ordenando Linhas Capítulo 6.3 – Exemplo: Tendências Populacionais →