Nan Python: teoria e prática

Neste texto, abordaremos o conceito de NaN Python, explorando sua teoria e prática. O NaN é um valor especial utilizado para representar resultados inválidos ou indefinidos em operações matemáticas. 

Veremos como detectá-lo e também discutiremos práticas recomendadas para lidar com valores indefinidos em cálculos matemáticos. 

Ao entender o conceito do NaN e aplicar estratégias adequadas, garantiremos operações matemáticas corretas e resultados consistentes em nossas aplicações Python

Exploraremos agora como as bibliotecas Pandas e Numpy podem ajudar no tratamento de dados ausentes ou indefinidos em análise de dados. Além disso, utilizaremos essas ferramentas para aprimorar nossa compreensão desses cenários.

Assim, vamos começar conhecendo o que é o NaN em Python e sua sintaxe de representação.

Artigos relacionados:

O que é NaN Python?

NaN em Python significa “Not a Number” (Não é um Número, em português). É um valor especial usado para representar resultados inválidos ou indefinidos em operações matemáticas. Quando algo não pode realizar a operação corretamente, ele atribui o valor NaN para indicar que não é um número válido. Em outras palavras, o resultado se torna inválido e marcado como NaN.

Dessa maneira, o NaN é útil quando trabalhamos com números em Python, especialmente em situações onde operações matemáticas podem gerar resultados não definidos, como divisões por zero ou operações com valores inválidos.

Sintaxe de NaN Python

Vamos, então, explicar de forma didática e fluente sobre o “NaN” em Python.

“NaN”, que significa “Not a Number” (Não é um número), é usado para representar valores numéricos indefinidos ou inválidos. Em Python, o “NaN” é representado pelo módulo "math" e é comumente usado quando temos cálculos que resultam em valores não numéricos.

Começamos importando o módulo "math" para ter acesso ao “NaN” e também ao "inf" (infinito) que são representações especiais de números em Python.

import math

Agora, vamos ver como utilizar o “NaN” em algumas situações:

Exemplo 1: Divisão por zero

Quando dividimos por zero, o resultado se torna indefinido. Python nos retorna o “NaN”.

resultado = 0 / 0

print(resultado)  # Saída: NaN

Exemplo 2: Operações inválidas

Algumas operações matemáticas podem resultar em valores indefinidos, como a raiz quadrada de um número negativo.

numero_negativo = -1

raiz_quadrada = math.sqrt(numero_negativo)

print(raiz_quadrada)  # Saída: NaN

Exemplo 3: Conversões inválidas

Algumas conversões de tipos podem gerar valores não numéricos, como tentar converter uma string que não representa um número para um valor numérico.

texto_invalido = "Olá, mundo!"

numero_convertido = float(texto_invalido)

print(numero_convertido)  # Saída: NaN

Exemplo 4: Comparação com NaN

Uma particularidade importante do “NaN” é que ele não é igual a nenhum valor, nem mesmo a ele mesmo! Portanto, sempre que tentamos comparar um valor com “NaN”, o resultado será falso.

valor = 10

resultado = valor == math.nan

print(resultado)  # Saída: False

Exemplo 5: Verificando se é NaN

Para verificar se um valor é “NaN”, não podemos usar a comparação direta como no exemplo anterior. Em vez disso, utilizamos a função "math.isnan()".

meu_numero = float('nan')

if math.isnan(meu_numero):

    print("O número é NaN")

else:

    print("O número não é NaN")

Lembre-se, no entanto, que o “NaN” é específico para valores numéricos. Você pode lidar com valores inválidos em outras situações usando exceções ou mecanismos apropriados para representá-los.

Como detectar NaN Python?

Para detectar e lidar com NaN em Python, você pode usar a função math.isnan() para verificar se um valor é NaN e algumas estratégias para tratá-lo. Assim, veremos alguns exemplos logo abaixo.

Detectando NaN em Python

import math

Exemplo: Verificar se um valor é NaN

valor = float('nan')

if math.isnan(valor):

    print("O valor é NaN")

else:

    print("O valor não é NaN")

Como lidar com NaN Python?

Ao trabalhar com valores numéricos em Python, deparamo-nos frequentemente com o NaN em situações de resultados indefinidos. Duas estratégias principais para lidar com o NaN são: usar um valor padrão e substituir o NaN por um valor adequado.

Para implementar a primeira estratégia, no entanto, nós definimos um valor padrão para substituir o NaN. Usaremos uma estrutura condicional para verificar se o valor é NaN e, caso seja, atribuiremos um valor predefinido. Dessa forma, evitaremos resultados inesperados e garantiremos que a operação continue com um valor válido.

import math

def dividir(a, b):

    resultado = a / b if b != 0 else float('nan')

    return resultado

resultado1 = dividir(10, 2)

resultado2 = dividir(10, 0)

print(resultado1)  # Saída: 5.0

print(resultado2)  # Saída: NaN (valor padrão)

A segunda estratégia consiste em substituir o NaN por um valor apropriado, que faça sentido para o contexto do cálculo. Por exemplo, ao calcular a raiz quadrada de um número negativo, em vez de retornar o NaN, podemos substituir pelo valor zero, indicando que não há raiz real para o número negativo.

import math

def calcular_raiz_quadrada(numero):

    return math.sqrt(numero) if numero >= 0 else 0

numero1 = 9

numero2 = -4

resultado1 = calcular_raiz_quadrada(numero1)

resultado2 = calcular_raiz_quadrada(numero2)

print(resultado1)  # Saída: 3.0

print(resultado2)  # Saída: 0 (substituição)

Ignorando NaN em cálculos estatísticos com Numpy

Quando lidamos com cálculos estatísticos em Python, é comum termos conjuntos de dados que contêm valores NaN. Recomenda-se ignorar os valores NaN durante as operações estatísticas para evitar interferências nos cálculos.

A biblioteca Numpy oferece uma forma simples e eficiente de lidar com esse cenário. Portanto, podemos utilizar a função numpy.mean() para calcular a média de um conjunto de dados, ignorando automaticamente os valores NaN presentes.

import numpy as np

dados = [1, 2, 3, float('nan'), 5, 6, 7, float('nan'), 9]

dados_sem_nan = [x for x in dados if not math.isnan(x)]

media = np.mean(dados_sem_nan)

print(media)  # Saída: 4.6 (média ignorando os NaN)

Dessa forma, ao utilizar a biblioteca Numpy e a função numpy.mean(), garantimos que os cálculos estatísticos sejam realizados corretamente, sem a interferência de valores inválidos ou indefinidos representados pelo NaN.

Utilizando essas estratégias, então, podemos lidar de forma mais eficiente e confiável com o NaN em Python, garantindo resultados coerentes e evitando comportamentos inesperados em nossas análises e operações matemáticas.

Exemplos de NaN Python

Aqui estão alguns exemplos de como o NaN é representado e usado em Python:

1. Criando um valor NaN

import math

valor_nan = float('nan')

print(valor_nan)  # Saída: NaN

2. Realizando operações inválidas

resultado = 0 / 0

print(resultado)  # Saída: NaN

3. Calculando a raiz quadrada de um número negativo

numero_negativo = -1

raiz_quadrada = math.sqrt(numero_negativo)

print(raiz_quadrada)  # Saída: NaN

4. Convertendo uma string inválida para um valor numérico

texto_invalido = "Olá, mundo!"

numero_convertido = float(texto_invalido)

print(numero_convertido)  # Saída: NaN

5. Utilizando o NaN em cálculos matemáticos

numero1 = 10

numero2 = float('nan')

soma = numero1 + numero2

multiplicacao = numero1 * numero2

print(soma)          # Saída: NaN

print(multiplicacao)  # Saída: NaN

6. Verificando se um valor é NaN:

import math

meu_numero = float('nan')

if math.isnan(meu_numero):

    print("O número é NaN")

else:

    print("O número não é NaN")

O NaN tem utilidade ao representar valores numéricos indefinidos ou inválidos. As pessoas usam ele em cálculos matemáticos quando precisam dividir por zero, extrair a raiz quadrada de números negativos ou fazer conversões de tipos inválidas.

Então, é importante saber como detectar e lidar com o NaN adequadamente para evitar resultados inesperados em suas operações matemáticas e análise de dados.

Práticas recomendadas para lidar com NaN Python 

  1. Sempre verifique se um valor é NaN antes de utilizá-lo em cálculos;
  2. Utilize valores padrão ou substitua NaN por valores que façam sentido para sua aplicação;
  3. Ao realizar operações estatísticas ou análise de dados, considere a exclusão dos valores NaN para obter resultados mais precisos;
  4. Evite a comparação direta com NaN, utilize a função math.isnan() para fazer a verificação correta;
  5. Caso esteja trabalhando com dados estruturados, considere o uso de bibliotecas como Pandas, que possui funções específicas para lidar com NaN de forma eficiente.

Ao lidar com NaN adequadamente, você garante que suas operações matemáticas são realizadas corretamente e evita comportamentos inesperados em sua aplicação.

O porquê do NaN

Matematicamente, algo como uma divisão 0/0 ou 1/0 nos leva a uma situação chamada “indeterminação matemática”, onde o valor é grande demais para mensurar. 

Ele tende ao infinito, mas na computação, ele fica limitado à quantidade de memória disponível. Por isso que, ao gerar valores que são maiores que a quantidade de memória disponível, temos um NaN.

O NaN em outras linguagens

JavaScript

Em JavaScript, o valor NaN é uma propriedade global do objeto “Number”. É retornado quando uma operação matemática não pode produzir um valor numérico válido. Para verificar se um valor é NaN, você pode usar a função "isNaN()"

Exemplo:

let result = Math.sqrt(-1);

console.log(isNaN(result)); // true

C++

Em C++, o valor NaN é representado pelo tipo "std::numeric_limits<double>::quiet_NaN()". 

Para verificar se um valor é NaN, você pode usar a função "std::isnan()". No entanto, essas funcionalidades estão disponíveis a partir do C++11. 

Exemplo:

#include <iostream>

#include <cmath>

#include <limits>

int main() {

double result = std::sqrt(-1);

std::cout << std::isnan(result) << std::endl; // 1 (representando true)

return 0;

}

Java

Em Java, o valor NaN é representado pelo método “Double.NaN”. A classe “Double” possui um método estático “isNaN()” para verificar se um valor é NaN. Exemplo:

double result = Math.sqrt(-1);

System.out.println(Double.isNaN(result)); // true

Uso de NaN em Pandas e Numpy para análise de dados

As bibliotecas Pandas e Numpy são amplamente usadas para análise de dados em Python. Assim, ambas têm suporte nativo para trabalhar com valores NaN, permitindo lidar eficientemente com dados ausentes ou indefinidos em conjuntos de dados.

Em Pandas

  1. Representação de NaN: Em Pandas, NaN é um valor de ponto flutuante especial, semelhante ao Numpy;
  2. Detecção de NaN: Pandas fornece métodos úteis para verificar se um valor é NaN, como "isna()" e "isnull()", que retornam uma máscara booleana;
  3. Tratamento de NaN: Pandas oferece opções como "dropna()" para remover linhas ou colunas com NaN, "fillna()" para preencher valores ausentes ou “interpolate()” para interpolação linear dos valores NaN com base nos vizinhos.

Em Numpy

  1. Representação de NaN: Em Numpy, NaN é representado pela constante "numpy.nan", do tipo "numpy.float64";
  2. Detecção de NaN: Pode-se usar "numpy.isnan()" para verificar quais elementos são NaN em um array;
  3. Tratamento de NaN: Numpy oferece "numpy.nan_to_num()" para substituir NaN por zero, e "numpy.nanmean()" e "numpy.nanstd()" para calcular média e desvio padrão ignorando NaN.

Exemplo de uso em Pandas

import pandas as pd

# Criando DataFrame com NaN

data = {'A': [1, 2, None, 4],

        'B': [5, None, 7, 8]}

df = pd.DataFrame(data)

# Verificando quais valores são NaN

print(df.isna())

# Removendo linhas com NaN

df_cleaned = df.dropna()

# Preenchendo NaN com valor específico

df_filled = df.fillna(0)

Exemplo de uso em Numpy

import numpy as np

# Criando array com NaN

arr = np.array([1, 2, np.nan, 4])

# Verificando quais elementos são NaN

print(np.isnan(arr))

# Substituindo NaN por zero

arr_cleaned = np.nan_to_num(arr)

# Calculando a média ignorando os valores NaN

mean = np.nanmean(arr)

Assim, nessas bibliotecas, é essencial usar NaN adequadamente. Isso permite lidar eficientemente com dados ausentes ou indefinidos durante a análise.

Com essas funcionalidades, é possível realizar tratamentos específicos para evitar problemas com valores faltantes e obter resultados coerentes em análises estatísticas.

Conclusão

Em suma, o NaN (Not a Number) em Python é um valor especial usado para representar resultados inválidos ou indefinidos em operações matemáticas. É útil em situações onde cálculos podem gerar valores não numéricos, como divisões por zero ou operações com valores inválidos. 

O módulo "math" em Python possui a representação do NaN e a função "math.isnan()" para verificar se um valor é NaN.

Quando lidamos com o NaN em Python, devemos seguir práticas recomendadas. Sempre verifique se um valor é NaN antes de usá-lo em cálculos. Considere utilizar valores padrão ou substituição adequada para evitar resultados inesperados. Nas operações estatísticas, nós precisamos ignorar os valores NaN. Isso nos ajuda a obter resultados mais precisos.

Portanto, em Python, o uso adequado do NaN garante operações matemáticas corretas e evita comportamentos inesperados em análises e aplicações. É essencial compreender o conceito do NaN, detectá-lo e tratá-lo para obter resultados coerentes em atividades com números em Python. 

Bibliotecas como Pandas e Numpy, então, oferecem funções específicas para lidar com o NaN de forma mais eficiente em cenários de dados estruturados e cálculos estatísticos.

Portanto, ao adotar as práticas recomendadas e entender o conceito do NaN em Python, você poderá realizar operações matemáticas com maior confiança, evitando problemas de indefinição e obtendo resultados coerentes em suas aplicações.

Se você deseja aprender mais sobre Python, considere ler outros de nossos artigos, como Python while: o guia completo para a execução repetitiva, por exemplo.

Assim sendo, como sabemos que conhecimento nunca é demais, visite mais do nosso blog e aprenda sobre Python, JavaScript e outras linguagens úteis.

Este artigo foi útil?

Obrigado pela resposta!
Picture of Daiana S

Daiana S

Graduada em Letras pelo Instituto Federal da Paraíba e especializada em redação geral. Gosto de escrever sobre tudo e me dedico em vários níveis de expressividade. No geral, todos os meus hobbies giram em torno de escrever alguma coisa e fazer isso bem.

Contato: daiana.blog@homehost.com.br

Ganhe 30% OFF

Indique seu nome e e-mail,e ganhe um cupom de desconto de 30% para sempre na Homehost!