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
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 строчки, чтобы понять, как выглядят значения
df.info() #Демонстрируем информацию о колонках
Fighjemu i valori di a colonna:
- U numaru di linii in ogni culonna currisponde à u numeru tutale di linii?
- Chì ghjè l'essenza di e dati in ogni colonna?
- 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()
Visualizazione magica
Fighjemu induve ùn avemu micca valori à tutti:
import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
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()
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:
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')
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