Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Pré-processamento

Estou fazendo o pré-processamento de uma base e possuo a data de nascimento no formato AAAA-MM-DD. Preciso primeiro incluir datas nos campos vazios (estou tentando inserir a data mais frequente) e depois criar uma variável Idade a partir da data de nascimento e data atual. Tentei de todas as formas e nenhuma deu certo! Uma luz, por favor! :D

Quais cursos aqui da Alura que ajudam no pré-processamento? Obrigada!

2 respostas
solução!

Oi Aline! Tudo bem contigo?

Existem alguns passos que você pode seguir para alcançar seu objetivo, vamos montar eles aqui com dataframe com datas aleatórias, e a partir desse exemplo aqui você pode aplicar os códigos ao seu banco de dados, belezinha?

Primeiro, montei o Dataframe df com datas e duas linhas sem valores:

import pandas as pd
import numpy as np

df = pd.DataFrame({'data_nascimento':['2000-11-09','2013-10-31','1998-02-17',np.nan,np.nan,'2001-05-28','1998-02-17']})
df

O resultado de df é o seguinte:

data_nascimento
02000-11-09
12013-10-31
21998-02-17
3nan
4nan
52001-05-28
61998-02-17

O tipo inicial dos elementos da coluna data_nascimento é string. Com esse tipo, vamos utilizar agora um método SimpleImputer da biblioteca sklearn. O SimpleImputer vai nos permitir substituir os valores faltantes pelas strings de datas mais frequentes do nosso DataFrame.

Primeiro o importamos através do comando from sklearn.impute import SimpleImputer depois, precisamos definir seus parâmetros. O 1° parâmetro a ser definido é o missing_values que indicará o que será substituído, no nosso caso, são os valores do tipo NaN, indicado por np.nan. Após, definimos o 2° parâmetro, strategy, que será a forma como os dados serão selecionados para substituir o valor NaN, como queremos a data mais frequente, usaremos 'most_frequent'.

Por fim, adaptamos nosso DataFrame às definições anteriores através do .fit_transform(df) e depois transformamos os dados no DataFrame df_novo:

from sklearn.impute import SimpleImputer

imp_mean = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
transform = imp_mean.fit_transform(df)
df_novo = pd.DataFrame(transform, columns=df.columns)

O DataFrame df_novo tem elementos de data como strings, agora, precisamos transformá-los em elementos do tipo datetime. A transformação utiliza o método to_datetime do pandas, e sua transformação é bem simples, devemos apenas definir a coluna que será transformada e qual o formato da data. Como as datas estão organizadas em formato AAAA-MM-DD, então definimos o formato %Y-%m-%d.

df_novo['data_nascimento'] = pd.to_datetime(df_novo['data_nascimento'], format="%Y-%m-%d")

Agora, vamos calcular as idades. Para esse cálculo, importaremos o módulo date da biblioteca datetime, que fornece vários métodos para que possamos trabalhar com datas. Após isso, coletamos a data atual pela função date.today() e criamos uma lista vazia, chamada id, que receberá as idades.

Para o cálculo da idade, entramos em um laço for que vai ler os elementos da coluna data_nascimento e o calcular as idade pela equação: ano_atual - ano_nascimento - (1 ou 0). Nessa equação existe a diferença de anos entre a data de nascimento e atual, no entanto para calcular uma idade devemos também considerar se estamos antes ou depois da data de aniversário. Por exemplo, uma pessoa que nasceu em 31/10/2013 tem no dia 21/01/2022, 8 anos. No entanto, se calcularmos apenas a diferença do ano atual com o de nascimento (2022 - 2013) o resultado é 9 anos, pois o dia e mês atual estão antes do dia e mês do nascimento. Então, no código além da diferença entre anos, vamos comparar se o mês e dia atual estão antes ou depois da data de nascimento, para isso, podemos fazer uma simples comparação: (today.month, today.day) < (i.month, i.day) Se o mês e dia atual estiverem antes do nascimento o retorno será True e será descontado 1 ano a menos na idade, se eles estiverem depois, o retorno será False e nada acontecerá. Os valores de cada cálculo são armazenados na lista idades conforme o código a seguir:

today = date.today()
id = []

for i in df_novo['data_nascimento']:
    id.append(today.year - i.year - ((today.month, today.day) < (i.month, i.day)))

Vale ressaltar que esse laço pode demandar um bom tempo de execução caso o seu banco de dados seja muito grande, pois ele calcula os elementos linha a linha.

Por fim, colocamos os valores das idades em uma nova coluna no DataFrame chamada de idades:

df_novo['idades'] = id
df_novo 

O resultado final pode ser analisado abaixo:

data_nascimentoidades
02000-11-0921
12013-10-318
21998-02-1723
31998-02-1723
41998-02-1723
52001-05-2820
61998-02-1723

Espero ter ajudado!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Olá! Tudo bem? Muito obrigada!

O problema do meus dados se deu por ter duas datas em formato errado. Quando excluí deu certo! :D