1
resposta

Esse código não me retorna o mesmo valor da biblioteca scipy?

(len(dados[dados['Renda'] <= 788]) / len(dados)) * 100

1 resposta

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!