(len(dados[dados['Renda'] <= 788]) / len(dados)) * 100
(len(dados[dados['Renda'] <= 788]) / len(dados)) * 100
Boas Adriano, tudo bem? Espero que sim!
Inicialmente peço desculpas pela demora em responder.
Sim! o código que você postou traz o mesmo resultado que a função do scipy
# Com a função do scipy
from scipy import stats
percentual = stats.percentileofscore(dados.Renda, 788, kind = 'weak')
print("{0:.2f}%".format(percentual))
# Com a sua função
percentual = (len(dados[dados['Renda'] <= 788]) / len(dados)) * 100
print("{0:.2f}%".format(percentual))
Ambos retornam 28.87%
De fato, a lógica que a função stats.percentileofscore() tem pontos em comum com o que você apresentou como resposta. Vamos abrir a função da biblioteca para ver como ela se comporta:
def percentileofscore(a, score, kind='rank'):
if np.isnan(score):
return np.nan
a = np.asarray(a)
n = len(a)
if n == 0:
return 100.0
if kind == 'rank':
left = np.count_nonzero(a < score)
right = np.count_nonzero(a <= score)
pct = (right + left + (1 if right > left else 0)) * 50.0/n
return pct
elif kind == 'strict':
return np.count_nonzero(a < score) / n * 100
elif kind == 'weak':
return np.count_nonzero(a <= score) / n * 100
elif kind == 'mean':
pct = (np.count_nonzero(a < score) + np.count_nonzero(a <= score)) / n * 50
return pct
else:
raise ValueError("kind can only be 'rank', 'strict', 'weak' or 'mean'")
(código disponível em https://github.com/scipy/scipy/blob/v1.7.0/scipy/stats/stats.py#L1876-L1963)
Por exemplo, a linha 18:
return np.count_nonzero(a <= score) / n * 100
cumpre essencialmente a mesma função do seu código, sendo n o tamanho do array, mas de maneira mais genérica.
As funções das bibliotecas - como essa do scipy - aplicam a lógica que consideram mais consistentes e/ou eficientes. Entretanto, muitas delas são apenas maneiras mais refinadas de executar uma ação importante em determinado contexto.
Parabéns pela implementação! Espero ter ajudado e bons estudos!