Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

Shpesh njerëzit që hyjnë në fushën e Shkencës së të Dhënave kanë pritshmëri më pak se realiste për atë që i pret. Shumë njerëz mendojnë se tani ata do të shkruajnë rrjete nervore të lezetshme, do të krijojnë një asistent zanor nga Iron Man, ose do të mundin të gjithë në tregjet financiare.
Por punë Data Shkencëtari drejtohet nga të dhënat dhe një nga aspektet më të rëndësishme dhe që kërkon kohë është përpunimi i të dhënave përpara se t'i ushqejë ato në një rrjet nervor ose t'i analizojë ato në një mënyrë të caktuar.

Në këtë artikull, ekipi ynë do të përshkruajë se si mund t'i përpunoni të dhënat shpejt dhe me lehtësi me udhëzime dhe kode hap pas hapi. Ne u përpoqëm ta bënim kodin mjaft fleksibël dhe mund të përdoret për grupe të dhënash të ndryshme.

Shumë profesionistë mund të mos gjejnë asgjë të jashtëzakonshme në këtë artikull, por fillestarët do të jenë në gjendje të mësojnë diçka të re, dhe kushdo që ka ëndërruar prej kohësh të bëjë një fletore të veçantë për përpunimin e shpejtë dhe të strukturuar të të dhënave, mund ta kopjojë kodin dhe ta formatojë për vete, ose shkarkoni fletoren e përfunduar nga Github.

Ne morëm grupin e të dhënave. Çfarë duhet bërë më pas?

Pra, standardi: duhet të kuptojmë se me çfarë kemi të bëjmë, tablonë e përgjithshme. Për ta bërë këtë, ne përdorim panda për të përcaktuar thjesht lloje të ndryshme të dhënash.

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

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

Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

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

Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

Le të shohim vlerat e kolonës:

  1. A korrespondon numri i rreshtave në secilën kolonë me numrin e përgjithshëm të rreshtave?
  2. Cili është thelbi i të dhënave në secilën kolonë?
  3. Cilën kolonë duam të synojmë në mënyrë që të bëjmë parashikime për të?

Përgjigjet e këtyre pyetjeve do t'ju lejojnë të analizoni grupin e të dhënave dhe të hartoni afërsisht një plan për veprimet tuaja të ardhshme.

Gjithashtu, për një vështrim më të thellë të vlerave në secilën kolonë, ne mund të përdorim funksionin panda describe(). Megjithatë, disavantazhi i këtij funksioni është se ai nuk jep informacion për kolonat me vlera vargu. Ne do të merremi me ta më vonë.

df.describe()

Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

Vizualizimi magjik

Le të shohim se ku nuk kemi fare vlera:

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

Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

Kjo ishte një vështrim i shkurtër nga lart, tani do të kalojmë në gjëra më interesante

Le të përpiqemi të gjejmë dhe, nëse është e mundur, të heqim kolonat që kanë vetëm një vlerë në të gjitha rreshtat (ato nuk do të ndikojnë në rezultatin në asnjë mënyrë):

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

Tani ne mbrojmë veten dhe suksesin e projektit tonë nga linjat e kopjuara (linjat që përmbajnë të njëjtin informacion në të njëjtin rend si një nga linjat ekzistuese):

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

Ne e ndajmë grupin e të dhënave në dy: njëra me vlera cilësore dhe tjetra me vlera sasiore

Këtu duhet të bëjmë një sqarim të vogël: nëse linjat me të dhëna që mungojnë në të dhënat cilësore dhe sasiore nuk janë shumë të ndërlidhura me njëra-tjetrën, atëherë do të duhet të vendosim se çfarë sakrifikojmë - të gjitha linjat me të dhëna që mungojnë, vetëm një pjesë e tyre, ose kolona të caktuara. Nëse linjat janë të ndërlidhura, atëherë ne kemi të drejtë të ndajmë grupin e të dhënave në dy. Përndryshe, së pari do t'ju duhet të merreni me linjat që nuk lidhin të dhënat që mungojnë në cilësi dhe sasi, dhe vetëm më pas të ndani grupin e të dhënave në dy.

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

Ne e bëjmë këtë për ta bërë më të lehtë për ne përpunimin e këtyre dy llojeve të ndryshme të të dhënave - më vonë do të kuptojmë se sa shumë e lehtëson kjo jetën tonë.

Ne punojmë me të dhëna sasiore

Gjëja e parë që duhet të bëjmë është të përcaktojmë nëse ka "kolona spiunazhi" në të dhënat sasiore. Ne i quajmë këto kolona sepse ato paraqiten si të dhëna sasiore, por veprojnë si të dhëna cilësore.

Si mund t'i identifikojmë ato? Sigurisht, gjithçka varet nga natyra e të dhënave që po analizoni, por në përgjithësi kolona të tilla mund të kenë pak të dhëna unike (në rajonin prej 3-10 vlerash unike).

print(df_numerical.nunique())

Pasi të kemi identifikuar kolonat e spiunazhit, ne do t'i zhvendosim ato nga të dhënat sasiore në të dhënat cilësore:

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']) #добавляем третью колонку-шпион в качественные данные

Së fundi, ne kemi ndarë plotësisht të dhënat sasiore nga të dhënat cilësore dhe tani mund të punojmë me to siç duhet. Gjëja e parë është të kuptojmë se ku kemi vlera boshe (NaN, dhe në disa raste 0 do të pranohet si vlera boshe).

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

Në këtë pikë, është e rëndësishme të kuptohet se në cilat kolona zerat mund të tregojnë vlerat që mungojnë: a është kjo për shkak të mënyrës se si janë mbledhur të dhënat? Apo mund të lidhet me vlerat e të dhënave? Këto pyetje duhet të marrin përgjigje rast pas rasti.

Pra, nëse ende vendosim që mund të na mungojnë të dhënat aty ku ka zero, duhet t'i zëvendësojmë zerat me NaN për ta bërë më të lehtë punën me këto të dhëna të humbura më vonë:

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

Tani le të shohim se ku na mungojnë të dhënat:

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

Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

Këtu ato vlera brenda kolonave që mungojnë duhet të shënohen me të verdhë. Dhe tani fillon argëtimi - si të merreni me këto vlera? A duhet të fshij rreshtat me këto vlera apo kolona? Apo mbushni këto vlera boshe me disa të tjera?

Këtu është një diagram i përafërt që mund t'ju ndihmojë të vendosni se çfarë mund të bëhet, në parim, me vlera boshe:

Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

0. Hiqni kolonat e panevojshme

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

1. A është numri i vlerave boshe në këtë kolonë më i madh se 50%?

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

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

2. Fshi linjat me vlera boshe

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

3.1. Futja e një vlere të rastësishme

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

3.2. Futja e një vlere konstante

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. Vendosni vlerën mesatare ose më të shpeshtë

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. Vendosni vlerën e llogaritur nga një model tjetër

Ndonjëherë vlerat mund të llogariten duke përdorur modele regresioni duke përdorur modele nga biblioteka sklearn ose biblioteka të tjera të ngjashme. Ekipi ynë do t'i kushtojë një artikull të veçantë se si mund të bëhet kjo në të ardhmen e afërt.

Pra, për momentin, narrativa për të dhënat sasiore do të ndërpritet, sepse ka shumë nuanca të tjera se si të bëhet më mirë përgatitja dhe parapërpunimi i të dhënave për detyra të ndryshme, dhe gjërat themelore për të dhënat sasiore janë marrë parasysh në këtë artikull, dhe tani është koha për t'iu kthyer të dhënave cilësore.të cilat i ndamë disa hapa prapa nga ato sasiore. Ju mund ta ndryshoni këtë fletore sipas dëshirës, ​​duke e përshtatur me detyra të ndryshme, në mënyrë që parapërpunimi i të dhënave të shkojë shumë shpejt!

Të dhëna cilësore

Në thelb, për të dhënat cilësore, përdoret metoda e kodimit One-hot për ta formatuar atë nga një varg (ose objekt) në një numër. Përpara se të kalojmë në këtë pikë, le të përdorim diagramin dhe kodin e mësipërm për t'u marrë me vlerat boshe.

df_categorical.nunique()

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

Fleta e mashtrimit të Notepad për parapërpunim të shpejtë të të dhënave

0. Hiqni kolonat e panevojshme

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

1. A është numri i vlerave boshe në këtë kolonë më i madh se 50%?

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

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

2. Fshi linjat me vlera boshe

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

3.1. Futja e një vlere të rastësishme

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

3.2. Futja e një vlere konstante

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)

Pra, më në fund kemi marrë një dorezë për nullet në të dhënat cilësore. Tani është koha për të kryer një kodim të nxehtë të vlerave që janë në bazën e të dhënave tuaja. Kjo metodë përdoret shumë shpesh për të siguruar që algoritmi juaj mund të mësojë nga të dhëna me cilësi të lartë.

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))

Pra, më në fund kemi përfunduar përpunimin e të dhënave të veçanta cilësore dhe sasiore - koha për t'i kombinuar ato përsëri

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

Pasi të kemi kombinuar grupet e të dhënave së bashku në një, më në fund mund të përdorim transformimin e të dhënave duke përdorur MinMaxScaler nga biblioteka sklearn. Kjo do t'i bëjë vlerat tona midis 0 dhe 1, gjë që do të ndihmojë në trajnimin e modelit në të ardhmen.

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

Këto të dhëna tani janë gati për çdo gjë - rrjete nervore, algoritme standarde ML, etj.!

Në këtë artikull, ne nuk kemi marrë parasysh punën me të dhënat e serive kohore, pasi për të dhëna të tilla duhet të përdorni teknika paksa të ndryshme të përpunimit, në varësi të detyrës suaj. Në të ardhmen, ekipi ynë do t'i kushtojë një artikull të veçantë kësaj teme dhe shpresojmë se do të jetë në gjendje të sjellë diçka interesante, të re dhe të dobishme në jetën tuaj, ashtu si kjo.

Burimi: www.habr.com

Shto një koment