import numpy as np
import pandas as pd
pesos = pd.Series([87.6, np.nan, 70.5, 90.5, None])
print(pesos)
pesos.isnull()
#remove os valores ausentes
pesos_semNAN = pesos.dropna()
print(pesos_semNAN)
#tem o mesmo resultado que o dropna
pesos_semNAN2 = pesos[pesos.notnull()]
print(pesos_semNAN2)
data = pd.DataFrame([['P1',1500.89,30,87.6,1,0],
['P2',789.52,48,np.nan,2,0],
['P3',1000.00,28,70.5,2,1],
['P4',589.36,39,90.5,3,1]])
data
data_limpo = data.dropna()
data_limpo
data_limpo = data.dropna(axis=1) #limpa as colunas
data_limpo
data2 = pd.DataFrame([['P1',1500.89,30,87.6,1,0],
['P2',789.52,48,np.nan,2,0],
['P3',1000.00,28,70.5,2,1],
['P4',589.36,39,90.5,3,1],
[np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
['P6',589.36,39,90.5,np.nan,np.nan]])
data2
#remove as linhas com dados ausentes
data_limpo2 = data2.dropna()
data_limpo2
#limpa somente as linhas que estão totalmente preenchidas totalmente com dados ausentes
data_limpo2 = data2.dropna(how='all')
data_limpo2
data3 = pd.DataFrame([['P1',1500.89,30,87.6,1,np.nan],
['P2',789.52,48,np.nan,2,np.nan],
['P3',1000.00,28,70.5,2,np.nan],
['P4',589.36,39,90.5,3,np.nan],
[np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
['P6',589.36,39,90.5,np.nan,np.nan]])
data3
#limpa somente as linhas que estão totalmente preenchidas totalmente com dados ausentes
data_limpo3 = data3.dropna(how='all')
data_limpo3
#limpa somente as colunas que estão totalmente preenchidas totalmente com dados ausentes
data_limpo3 = data3.dropna(how='all', axis=1)
data_limpo3
data4 = pd.DataFrame([['P1',1500.89,30,87.6,1,0],
['P2',789.52,48,np.nan,2,0],
['P3',1000.00,28,70.5,2,1],
['P4',589.36,39,90.5,3,1],
['P5',900.00,np.nan,55.6,np.nan,np.nan],
['P6',589.36,39,90.5,np.nan,np.nan]])
data4
#substitui NAN por um valor
data_zero = data4.fillna(0)
data_zero
#medidas estatísticas do dataframe -- desconsidera o NAN
data4.describe()
#usar dicionario para indicar valores distintos para cada atributo
#substitui NAN pelo valor da media -- conforme apresentado na célula anterior
data_media = data4.fillna({1:894.85, 2:36.80, 3:78.94, 4: 2, 5: 1}) #tomar cuidado com atributo booleano
data_media
#medidas estatísticas após substituição
data_media.describe()
data4
# modo automatico -- entretanto, deve-se tomar cuidado com o booleano -- note que ele não foi alterado nesse momento
# e deve ser alterado manualmente -- ou por algum metodo automatico de contagem ou outra estratégia
# data4.mean calcula as médias por atributo e fillna preenche os dados ausentes
data4.fillna(data4.mean()[0:4])
#note que o data4 ainda não foi modificado, pois fillna retorna um novo dataframe
data4
#altera o data4 (inplace)
data4.fillna({1:894.85, 2:36.80, 3:78.94, 4: 2, 5: 1}, inplace=True)
data4
data5 = pd.DataFrame([['P1',1500.89,30,87.6,1,0],
['P2',789.52,48,np.nan,2,0],
['P3',1000.00,28,70.5,2,1],
['P4',589.36,39,90.5,3,1],
['P5',900.00,np.nan,55.6,np.nan,np.nan],
['P6',589.36,39,90.5,np.nan,np.nan]])
data5
#ffill replica o valor anterior para os ausentes subsequentes -- tomar cuidado
data5.fillna(method='ffill')
from sklearn import preprocessing
data6 = pd.DataFrame([[1500.89,30,87.6,1,0],
[789.52,48,67.5,2,0],
[1000.00,28,70.5,2,1],
[589.36,39,90.5,3,1]])
#normalização pelo máximo (valor / max) -- considera que o menor valor é sempre zero, mesmo não aparecendo nos dados
data7 = data6 / data6.max()
data7
valores = data6.values
valores
min_max = preprocessing.MinMaxScaler() #normalização entre o valor mínimo e o valor máximo == mínimo é zero e o máximo é um
valores_normalizados = min_max.fit_transform(valores)
data8 = pd.DataFrame(valores_normalizados)
data8
from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('euclidean')
data9 = pd.DataFrame([[1500.89,30,87.6,1,0],
[789.52,48,67.5,2,0],
[1000.00,28,70.5,2,1],
[589.36,39,90.5,3,1]])
data9
dist.pairwise(data9.to_numpy()) #calculo de distância com todos os atributos
data10 = pd.DataFrame([[1500.89,30,87.6,1,0],
[789.52,48,np.nan,2,0],
[1000.00,28,70.5,2,1],
[589.36,39,90.5,3,1]])
data10
data10.dropna(axis=1) #remove a coluna que possui dado faltante
valores = data10.dropna(axis=1).to_numpy()
print(valores)
#caula a distancia -- menor distância para P2 é 200 (P4) --- menor distância para linha 1 é a linha 3 ==> 200.36
dist.pairwise(valores)
#desconsiderando salario
valores2 = np.delete(valores, 0, 1)#remove salario
print(valores2)
#note que a linha 3 ainda é a mais próxima, mas a linha 0 seria a segunda mais próxima, nesse caso
dist.pairwise(valores2)
#normalizados pelo máximo
valores = data7.dropna(axis=1).to_numpy()
print(valores)
valores3 = np.delete(valores, 2, 1)#remove atributo peso
print(valores3)
print('\nDistancias:')
dist.pairwise(valores3) #calcula distancia -- linha 0 é mais próxima de linha 1 ==> 0.69
#como o atributo booleano 'aprovado' pode assumir 0 ou 1, ele está nos dois extremos
#Se removermos esse atributo o resultado pode ser diferente, como ilustrado abaixo
#normalizados pelo máximo
valores = data7.dropna(axis=1).to_numpy()
print(valores)
valores3 = np.delete(valores, 2, 1)#remove atributo 'peso'
print(valores3)
valores3 = np.delete(valores3, 3, 1)#remove atributo 'aprovado'
print(valores3)
print('\nDistancias:')
dist.pairwise(valores3) #calcula distancia -- linha 3 é mais próxima de linha 1 ==> 0.40
#normalizados pelo min-max - considerando também o atributo 'aprovado'
valores = data8.dropna(axis=1).to_numpy()
print(valores)
valores4 = np.delete(valores, 2, 1)#remove atributo peso
print(valores4)
print('\nDistancias:')
dist.pairwise(valores4) #calcula distancia -- linha 3 é mais próxima de linha 1 ==> 1.22
from sklearn.impute import KNNImputer
# atualiza valores faltantes com base em vizinho mais próximo, no caso, foi definido 1 vizinho
imputer = KNNImputer(n_neighbors=1, weights="uniform")
data11 = pd.DataFrame([[1500.89,30,87.6,1,0],
[789.52,48,np.nan,2,0],
[1000.00,28,70.5,2,1],
[589.36,39,90.5,3,1]])
data11
#atualização do peso que estava como NA -- criação de um dataframe com o resultado
pd.DataFrame(imputer.fit_transform(data11))