SQL vs Pandas - Criando um ranking
Neste artigo vamos ver como criar um ranking utilizando Pandas e o SQL. Rankings são comuns na análise de dados e podem parecer simples a primeira vista, mas existem certos detalhes que devem ser levados em conta na hora de construir um.
Vamos começar vendo como fazer isso no Pandas. Para isso, vamos criar um dataframe com os dados que serão utilizados para montar o nosso ranking.
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
print(dataframe)
Nossa primeira tarefa vai ser colocar os dados em ordem decrescente de salário.
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
dataframe = dataframe.sort_values("salario", ascending=False)
print(dataframe)
Para criar o ranking, vamos acrescentar uma coluna neste dataframe. Para criar o ranking basta utilizar o método rank() na coluna que desejamos utilizar como referência. Como parâmetro, vamos informar que desejamos um ranking na ordem decrescente, ou seja,o ranking será ordenado do maior salário para o menor.
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
dataframe[\'rank\'] = dataframe[\'salario\'].rank(ascending=False)
dataframe = dataframe.sort_values("salario", ascending=False)
print(dataframe)
Ao olhar o resultado percebemos um problema. O segundo e o terceiro lugar apareceram como 2,5 no ranking. Eles precisam aparecer como 2, já que o salário deles é igual.
Para ajustar a forma como o ranking foi criado podemos utilizar um parâmetro chamado "method". Por padrão, o method é do tipo "mean", que é a média. Se o parâmetro informado para o method for "min", teremos um resultado diferente:
dataframe[\'rank\'] = dataframe[\'salario\'].rank(method="min", ascending=False)
O retorno para ambos os casos com o mesmo valor o número 2. Perceba que ele pula o número 3 e vai direto para o núumero 4.
Vimos que o padrão do method e "mean" e testamos "min". Existe uma outra opção de method chamada "max". Fazendo assim:
dataframe[\'rank\'] = dataframe[\'salario\'].rank(method="max", ascending=False)
Retorna para ambos os casos com o mesmo valor o número 3. Perceba que ele pulou o número 2.
Para obter números diferentes de ranking para os valores repetidos devemos usar um method chamado "dense".
dataframe[\'rank\'] = dataframe[\'salario\'].rank(method="dense", ascending=False)
Desta forma nosso problema é resolvido, e conseguimos a ordenação correta.
Existe uma outra forma de configurar o nosso ranking. Se você quiser um número unico de ranking para cada valor, independente de repetições, deve usar o method "first".
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
dataframe[\'rank\'] = dataframe[\'salario\'].rank(method="dense", ascending=False)
dataframe[\'rank2\'] = dataframe[\'salario\'].rank(method="first", ascending=False)
dataframe = dataframe.sort_values("salario", ascending=False)
print(dataframe)
Agora chegou a vez de ver como é feita a criação de um ranking utilizando SQL.
No SQL Server, podemos utilizar a função ROW_NUMBER() para criar nosso ranking. Já no MySQL, tudo vai depender da versão que está sendo utilizada em seu servidor. Se você estiver utilizando a versão 8 ou superior também poderá utilizar ROW_NUMBER(). Para versões inferiores, existe outra forma de criar um ranking.
Para não deixar o artigo muito extenso, eu compartilho um link onde eu mostro como pode ser criado um ranking no SQL Server e no MySQL
Encerramento
Neste artigo você viu como a comparação de como criar um ranking utilizando o Pandas e o SQL.
Caso você se interesse por mais comparações entre o Pandas e o SQL, não deixe de conferir os artigos anteriores:
SQL vs Pandas - Operações Básicas
SQL vs Pandas - Operações Básicas parte 2
SQL vs Pandas - Manipulando strings
SQL vs Pandas - Agrupamento e frequências
SQL vs Pandas - média, mediana e quartis