Notebook cheat sheet vir vinnige data-voorverwerking

Dikwels het mense wat die veld van Data Science betree nie 'n heeltemal realistiese idee van wat op hulle wag nie. Baie mense dink dat hulle nou koel neurale netwerke sal skryf, 'n stemassistent van Iron Man sal skep, of almal in die finansiΓ«le markte sal klop.
Maar werk data Wetenskaplike is data-gedrewe, en een van die belangrikste en tydrowendste oomblikke is dataverwerking voordat dit in 'n neurale netwerk ingevoer of op 'n sekere manier ontleed word.

In hierdie artikel sal ons span beskryf hoe jy data maklik en vinnig kan verwerk met stap-vir-stap instruksies en kode. Ons het probeer om die kode redelik buigsaam te maak en kon vir verskillende datastelle gebruik word.

Baie professionele mense vind dalk niks buitengewoon in hierdie artikel nie, maar beginners sal iets nuuts kan leer, en enigiemand wat lank gedroom het om 'n aparte notaboek vir vinnige en gestruktureerde dataverwerking te maak, kan die kode kopieer en dit vir hulself formateer, of laai die voltooide notaboek van Github af.

Datastel ontvang. Wat om volgende te doen?

Dus, die standaard: jy moet verstaan ​​waarmee ons te doen het, die groot prentjie. Hiervoor gebruik ons ​​pandas om eenvoudig verskillende datatipes te definieer.

import pandas as pd #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ pandas
import numpy as np  #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ numpy
df = pd.read_csv("AB_NYC_2019.csv") #Ρ‡ΠΈΡ‚Π°Π΅ΠΌ датасСт ΠΈ записываСм Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ df

df.head(3) #смотрим Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 3 строчки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ выглядят значСния

Notebook cheat sheet vir vinnige data-voorverwerking

df.info() #ДСмонстрируСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ…

Notebook cheat sheet vir vinnige data-voorverwerking

Kom ons kyk na die waardes van die kolomme:

  1. Stem die aantal lyne in elke kolom ooreen met die totale aantal lyne?
  2. Wat is die kern van die data in elke kolom?
  3. Watter kolom wil ons teiken om voorspellings daarvoor te maak?

Die antwoorde op hierdie vrae sal jou toelaat om die datastel te ontleed en rofweg 'n plan vir die volgende stappe te teken.

Ook, vir 'n dieper kyk na die waardes in elke kolom, kan ons die pandas describe() funksie gebruik. Dit is waar, die nadeel van hierdie funksie is dat dit nie inligting verskaf oor kolomme met stringwaardes nie. Ons sal later met hulle handel.

df.describe()

Notebook cheat sheet vir vinnige data-voorverwerking

Magiese visualisering

Kom ons kyk na waar ons geen waardes het nie:

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

Notebook cheat sheet vir vinnige data-voorverwerking

Dit was 'n klein uitsig van bo af, nou gaan ons na meer interessante dinge.

Kom ons probeer om kolomme te vind en, indien moontlik, uit te vee wat slegs een waarde in alle rye het (dit sal op geen manier die resultaat beΓ―nvloed nie):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ датасСт, оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния

Nou beskerm ons onsself en die sukses van ons projek teen duplikaatlyne (lyne wat dieselfde inligting in dieselfde volgorde as een van die bestaande lyne bevat):

df.drop_duplicates(inplace=True) #Π”Π΅Π»Π°Π΅ΠΌ это, Ссли считаСм Π½ΡƒΠΆΠ½Ρ‹ΠΌ.
                                 #Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ с самого Π½Π°Ρ‡Π°Π»Π° Π½Π΅ стоит.

Ons verdeel die datastel in twee: een met kwalitatiewe waardes, en die ander met kwantitatiewe waardes

Hier moet ons 'n klein verduideliking maak: as die rye met ontbrekende data in kwalitatiewe en kwantitatiewe data nie sterk met mekaar korreleer nie, dan sal ons moet besluit wat ons opoffer - al die rye met ontbrekende data, slegs 'n deel daarvan of sekere kolomme. As die lyne gekorreleer is, het ons die volste reg om die datastel in twee te verdeel. Andersins sal jy eers die lyne moet hanteer waarin die ontbrekende data nie in kwalitatiewe en kwantitatiewe terme korreleer nie, en dan eers die datastel in twee verdeel.

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

Ons doen dit om dit vir ons makliker te maak om hierdie twee verskillende tipes data te verwerk – later sal ons verstaan ​​hoeveel dit ons lewens vereenvoudig.

Werk met kwantitatiewe data

Die eerste ding wat ons moet doen is om vas te stel of daar enige "spioenkolomme" in die kwantitatiewe data is. Ons noem hierdie kolomme so omdat hulle voorgee om kwantitatiewe data te wees, maar hulle werk self as kwalitatiewe.

Hoe kan ons hulle definieer? Dit hang natuurlik alles af van die aard van die data wat jy ontleed, maar oor die algemeen kan sulke kolomme min unieke data hΓͺ (in die omgewing van 3-10 unieke waardes).

print(df_numerical.nunique())

Nadat ons op die spioenkolomme besluit het, skuif ons dit van kwantitatiewe na kwalitatiewe data:

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']) #добавляСм Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅

Ten slotte het ons kwantitatiewe data heeltemal van kwalitatiewe data geskei en nou kan ons behoorlik daarmee werk. Die eerste ding is om te verstaan ​​waar ons leΓ« waardes het (NaN, en in sommige gevalle sal 0 as leΓ« waardes aanvaar word).

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

Op hierdie stadium is dit belangrik om te verstaan ​​watter kolomme nulle kan hΓͺ wat ontbrekende waardes aandui: het dit iets te doen met hoe die data ingesamel is? Of kan dit verband hou met datawaardes? Hierdie vrae moet op 'n geval-tot-geval basis beantwoord word.

Dus, as ons nietemin besluit dat ons nie data mag hΓͺ waar daar nulle is nie, moet ons nulle vervang met NaN, sodat dit makliker sal wees om later met hierdie verlore data te werk:

df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]] = df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]].replace(0, nan)

Kom ons kyk nou waar ons vermiste data het:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ df_numerical.info()

Notebook cheat sheet vir vinnige data-voorverwerking

Hier moet die waardes binne die kolomme wat ontbreek in geel gemerk word. En die pret begin nou – hoe om met hierdie waardes op te tree? Vee reΓ«ls met hierdie waardes of kolomme uit? Of vul hierdie leΓ« waardes met 'n paar ander?

Hier is 'n rowwe diagram wat jou kan help om uit te vind wat jy basies met leΓ« waardes kan doen:

Notebook cheat sheet vir vinnige data-voorverwerking

0. Verwyder onnodige kolomme

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Is die aantal leΓ« waardes in hierdie kolom groter as 50%?

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

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)#УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ большС 50 пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Verwyder reΓ«ls met leΓ« waardes

df_numerical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Voeg 'n ewekansige waarde in

import random #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ random
df_numerical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True) #вставляСм Ρ€Π°Π½Π΄ΠΎΠΌΠ½Ρ‹Π΅ значСния Π² пустыС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

3.2. Die invoeging van 'n konstante waarde

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. Voeg die gemiddelde of maksimum gereelde waarde in

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. Voeg waarde in wat deur 'n ander model bereken is

Soms kan waardes bereken word met behulp van regressiemodelle met behulp van modelle van die sklearn-biblioteek of ander soortgelyke biblioteke. Ons span sal 'n aparte artikel wy oor hoe dit in die nabye toekoms gedoen kan word.

Dus, terwyl die storie oor kwantitatiewe data onderbreek sal word, want daar is baie ander nuanses oor hoe om datavoorbereiding en -voorverwerking vir verskillende take die beste te doen, en die basiese dinge vir kwantitatiewe data is in hierdie artikel in ag geneem, en dit is nou die tyd om terug te keer na die kwalitatiewe data, wat ons 'n paar stappe terug van kwantitatiewe data geskei het. Jy kan hierdie notaboek verander soos jy wil, dit aanpas by verskillende take sodat datavoorverwerking baie vinnig verloop!

Kwalitatiewe data

Basies, vir kwalitatiewe data, word die Een-warm-enkoderingsmetode gebruik om dit van 'n string (of voorwerp) na 'n getal te formateer. Voordat ons verder gaan na hierdie punt, kom ons gebruik die skema en kode hierbo om leΓ« waardes te hanteer.

df_categorical.nunique()

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

Notebook cheat sheet vir vinnige data-voorverwerking

0. Verwyder onnodige kolomme

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Is die aantal leΓ« waardes in hierdie kolom groter as 50%?

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

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True) #УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 
                                                                          #ΠΈΠΌΠ΅Π΅Ρ‚ большС 50% пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Verwyder reΓ«ls met leΓ« waardes

df_categorical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, 
                                   #Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Voeg 'n ewekansige waarde in

import random
df_categorical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True)

3.2. Die invoeging van 'n konstante waarde

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)

So, uiteindelik het ons te doen gehad met leΓ« waardes in kwalitatiewe data. Nou is dit tyd om een-warm-enkodering te doen vir die waardes wat jy in jou databasis het. Hierdie metode word baie dikwels gebruik sodat jou algoritme opgelei kan word op kwalitatiewe data.

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

Uiteindelik het ons kwalitatiewe en kwantitatiewe data afsonderlik verwerk - dit is tyd om dit terug te kombineer

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

Nadat ons die datastelle in een verbind het, kan ons uiteindelik die datatransformasie gebruik deur die MinMaxScaler van die sklearn-biblioteek te gebruik. Dit sal ons waardes tussen 0 en 1 maak, wat sal help wanneer die model in die toekoms opgelei word.

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

Hierdie data is nou gereed vir enigiets - vir neurale netwerke, standaard ML-algoritmes, ensovoorts!

In hierdie artikel het ons nie die werk met data wat verband hou met tydreekse in ag geneem nie, aangesien u vir sulke data effens verskillende verwerkingstegnieke moet gebruik, afhangend van u taak. In die toekoms sal ons span 'n aparte artikel aan hierdie onderwerp wy, en ons hoop dat dit iets interessants, nuuts en nuttig in jou lewe sal kan bring, soos hierdie een.

Bron: will.com

Voeg 'n opmerking