Cheat sheet di Notebook per una preprocessazione rapida di dati

Spessu e persone chì entranu in u campu di a Scienza di Dati anu menu di aspettative realistiche di ciò chì li aspetta. Parechje persone pensanu chì avà scriveranu rete neurali cool, creanu un assistente di voce da Iron Man, o batteranu tutti in i mercati finanziarii.
Ma u travagliu Dati Scientist hè data-driven, è unu di l 'aspettu cchiù mpurtanti è tempu-cunsumu hè u prucessu di dati nanzu nutriscia lu in una reta neurale o analizà lu in un certu modu.

In questu articulu, a nostra squadra vi descriverà cumu pudete processà e dati rapidamente è facilmente cù struzzioni è codice passu per passu. Avemu pruvatu à fà u codice abbastanza flexible è puderia esse usatu per diversi datasets.

Parechji prufessiunali ùn anu micca truvatu nunda di straordinariu in questu articulu, ma i principianti puderanu amparà qualcosa di novu, è quellu chì hà longu sunniatu di fà un notebook separatu per un processu di dati veloce è strutturatu pò copià u codice è formate per sè stessu, o scaricate u librettu finitu da Github.

Avemu ricevutu u dataset. Cosa da fà dopu?

Allora, u standard: avemu bisognu di capisce ciò chì avemu trattatu, a stampa generale. Per fà questu, usemu panda per definisce solu diversi tipi di dati.

import pandas as pd #импортируем pandas
import numpy as np  #импортируем numpy
df = pd.read_csv("AB_NYC_2019.csv") #читаем датасет и записываем в переменную df

df.head(3) #смотрим на первые 3 строчки, чтобы понять, как выглядят значения

Cheat sheet di Notebook per una preprocessazione rapida di dati

df.info() #Демонстрируем информацию о колонках

Cheat sheet di Notebook per una preprocessazione rapida di dati

Fighjemu i valori di a colonna:

  1. U numaru di linii in ogni culonna currisponde à u numeru tutale di linii?
  2. Chì ghjè l'essenza di e dati in ogni colonna?
  3. Quale colonna vulemu indirizzà per fà predizioni per questu?

E risposte à queste dumande vi permettenu di analizà u set di dati è apprussimatamente disegnà un pianu per e vostre prossime azzioni.

Inoltre, per un sguardu più profondu à i valori in ogni colonna, pudemu usà a funzione Pandas describe(). In ogni casu, u svantaghju di sta funzione hè chì ùn furnisce micca infurmazioni nantu à e colonne cù valori di stringa. Avemu da trattà cun elli dopu.

df.describe()

Cheat sheet di Notebook per una preprocessazione rapida di dati

Visualizazione magica

Fighjemu induve ùn avemu micca valori à tutti:

import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Cheat sheet di Notebook per una preprocessazione rapida di dati

Questu era un pocu sguardu da sopra, avà andemu à e cose più interessanti

Pruvemu di truvà è, se pussibule, sguassate e culonne chì anu solu un valore in tutte e fila (ùn affettanu micca u risultatu in ogni modu):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #Перезаписываем датасет, оставляя только те колонки, в которых больше одного уникального значения

Avà prutegemu noi stessi è u successu di u nostru prughjettu da e linee duplicate (linee chì cuntenenu a listessa infurmazione in u stessu ordine cum'è una di e linee esistenti):

df.drop_duplicates(inplace=True) #Делаем это, если считаем нужным.
                                 #В некоторых проектах удалять такие данные с самого начала не стоит.

Dividemu u dataset in dui: unu cù valori qualitativi, è l'altru cù quelli quantitativi

Quì avemu bisognu di fà una piccula clarificazione: se i linii cù dati mancanti in dati qualitativi è quantitativi ùn sò micca assai correlati cù l'altri, allora avemu bisognu di decide ciò chì sacrificemu - tutte e linee cù dati mancanti, solu una parte di elli, o certe colonne. Sì i linii sò correlati, allora avemu u dirittu di dividisce u dataset in dui. Altrimenti, avete prima bisognu di trattà cù e linee chì ùn correlanu micca i dati mancanti in qualità è quantitative, è solu dopu dividite u dataset in dui.

df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])

Facemu questu per fà più faciule per noi di trasfurmà sti dui tipi di dati diffirenti - più tardi capiremu quantu più faciule questu rende a nostra vita.

Travagliemu cù dati quantitativi

A prima cosa chì duvemu fà hè di determinà s'ellu ci sò "colonne spia" in i dati quantitativi. Chjamemu sti culonni chì perchè si prisentanu cum'è dati quantitativi, ma agiscenu cum'è dati qualitativi.

Cumu pudemu identificà elli? Di sicuru, tuttu dipende di a natura di e dati chì avete analizà, ma in generale tali colonne pò avè pocu dati unichi (in a regione di 3-10 valori unichi).

print(df_numerical.nunique())

Una volta avemu identificatu e culonne spia, li moveremu da dati quantitativi à dati qualitativi:

spy_columns = df_numerical[['колонка1', 'колока2', 'колонка3']]#выделяем колонки-шпионы и записываем в отдельную dataframe
df_numerical.drop(labels=['колонка1', 'колока2', 'колонка3'], axis=1, inplace = True)#вырезаем эти колонки из количественных данных
df_categorical.insert(1, 'колонка1', spy_columns['колонка1']) #добавляем первую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка2', spy_columns['колонка2']) #добавляем вторую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка3', spy_columns['колонка3']) #добавляем третью колонку-шпион в качественные данные

Infine, avemu separatu cumplettamente i dati quantitativi da i dati qualitativi è avà pudemu travaglià cun ellu bè. A prima cosa hè di capisce induve avemu i valori vacanti (NaN, è in certi casi 0 serà accettatu cum'è valori vacanti).

for i in df_numerical.columns:
    print(i, df[i][df[i]==0].count())

À questu puntu, hè impurtante di capiscenu in quale colonne zeri ponu indicà i valori mancanti: hè questu per via di a manera chì e dati sò stati raccolti? O puderia esse ligata à i valori di dati? Queste dumande devenu esse risposte in casu per casu.

Allora, s'è avemu sempre decisu chì pudemu esse mancanti dati induve ci sò zeri, duvemu rimpiazzà i zeri cù NaN per fà più faciule per travaglià cù questi dati persi dopu:

df_numerical[["колонка 1", "колонка 2"]] = df_numerical[["колонка 1", "колонка 2"]].replace(0, nan)

Avà vedemu induve ci mancanu dati:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # Можно также воспользоваться df_numerical.info()

Cheat sheet di Notebook per una preprocessazione rapida di dati

Quì quelli valori in i culonni chì mancanu sò da esse marcati in giallu. È avà principia u divertimentu - cumu si tratta di sti valori? Deve eliminà e fila cù questi valori o colonne? O riempite questi valori vioti cù altri?

Eccu un diagramma apprussimativu chì pò aiutà à decide ciò chì pò, in principiu, esse fattu cù valori vacanti:

Cheat sheet di Notebook per una preprocessazione rapida di dati

0. Eliminate culonni inutile

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Hè u numeru di valori vacanti in questa colonna più grande di 50%?

print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)#Удаляем, если какая-то колонка имеет больше 50 пустых значений

2. Sguassà e linii cù valori vacanti

df_numerical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, если потом останется достаточно данных для обучения

3.1. Inserisce un valore aleatoriu

import random #импортируем random
df_numerical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True) #вставляем рандомные значения в пустые клетки таблицы

3.2. Inserisce un valore constantu

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>") #вставляем определенное значение с помощью SimpleImputer
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.3. Inserite u valore mediu o più frequente

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #вместо mean можно также использовать most_frequent
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.4. Inserite u valore calculatu da un altru mudellu

Calchì volta i valori ponu esse calculati utilizendu mudelli di regressione cù mudelli da a biblioteca sklearn o altre biblioteche simili. A nostra squadra dedicarà un articulu separatu nantu à cumu si pò esse fattu in un futuru vicinu.

Dunque, per avà, a narrativa nantu à e dati quantitativi serà interrotta, perchè ci sò parechje altre sfumature nantu à cumu fà megliu a preparazione di dati è a preprocessazione per e diverse attività, è e cose basi per i dati quantitativi sò stati cunsiderati in questu articulu, è Avà hè u tempu di vultà à i dati qualitativi, chì avemu separatu parechji passi da quelli quantitativi. Pudete cambià stu notebook cum'è vo vulete, adattendu à e diverse attività, cusì chì a preprocessazione di dati và assai rapidamente!

Dati qualitativi

In fondu, per i dati qualitativi, u metudu di codificazione One-hot hè utilizatu per furmà da una stringa (o un oggettu) à un numeru. Prima di passà à questu puntu, usemu u schema è u codice sopra per trattà cù i valori vacanti.

df_categorical.nunique()

sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Cheat sheet di Notebook per una preprocessazione rapida di dati

0. Eliminate culonni inutile

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Hè u numeru di valori vacanti in questa colonna più grande di 50%?

print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True) #Удаляем, если какая-то колонка 
                                                                          #имеет больше 50% пустых значений

2. Sguassà e linii cù valori vacanti

df_categorical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, 
                                   #если потом останется достаточно данных для обучения

3.1. Inserisce un valore aleatoriu

import random
df_categorical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True)

3.2. Inserisce un valore constantu

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>")
df_categorical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_categorical[['колонка1', 'колонка2', 'колонка3']])
df_categorical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True)

Dunque, avemu infine un manicu nantu à i nulli in dati qualitativi. Avà hè u tempu di fà una codificazione in un caldu nantu à i valori chì sò in a vostra basa di dati. Stu metudu hè assai spessu usatu per assicurà chì u vostru algoritmu pò amparà da dati d'alta qualità.

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res)

features_to_encode = ["колонка1","колонка2","колонка3"]
for feature in features_to_encode:
    df_categorical = encode_and_bind(df_categorical, feature))

Dunque, avemu infine finitu di trasfurmà dati qualitativi è quantitativi separati - u tempu di cumminà elli

new_df = pd.concat([df_numerical,df_categorical], axis=1)

Dopu avemu cumminatu i datasets in una sola, pudemu finalmente aduprà a trasfurmazioni di dati cù MinMaxScaler da a biblioteca sklearn. Questu ferà i nostri valori trà 0 è 1, chì aiutanu à a furmazione di u mudellu in u futuru.

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)

Queste dati sò avà pronti per tuttu - rete neurali, algoritmi ML standard, etc.!

In questu articulu, ùn avemu micca pigliatu in contu di travaglià cù dati di serie di u tempu, postu chì per tali dati duvete aduprà tecniche di trasfurmazioni ligeramente diverse, secondu u vostru compitu. In u futuru, a nostra squadra dedicarà un articulu separatu à questu tema, è speremu chì puderà portà qualcosa interessante, novu è utile in a vostra vita, cum'è questu.

Source: www.habr.com

Add a comment