MÄnga som kommer in i omrÄdet Data Science har inte helt realistiska förvÀntningar pÄ vad som vÀntar dem. MÄnga tror att de direkt kommer att kunna skriva fantastiska neurala nÀtverk, skapa en röstassistent likt Iron Man eller överlista alla pÄ finansmarknaderna.
Men arbetet Data som Scientist Àr kopplat till data, och en av de viktigaste och mest tidskrÀvande aspekterna Àr datahantering innan de matas in i neurala nÀtverk eller analyseras pÄ specifika sÀtt.
I denna artikel kommer vÄrt team att beskriva hur man enkelt och snabbt bearbetar data med steg-för-steg instruktioner och kod. Vi har strÀvat efter att koden ska vara ganska flexibel sÄ att den kan tillÀmpas pÄ olika datamÀngder.
MÄnga yrkesverksamma kanske inte hittar nÄgot extraordinÀrt i denna artikel, men nybörjare kan lÀra sig nÄgot nytt, och alla som lÀnge har drömt om att skapa en egen notebook för snabb och strukturerad datahantering kan kopiera koden och anpassa den till sig sjÀlva, eller
Vi har fÄtt datamÀngden. Vad gör vi nu?
SÄ, standard: vi behöver förstÄ vad vi har att göra med, den övergripande bilden. För detta anvÀnder vi pandas för att enkelt identifiera olika typer av data.
import pandas as pd #importerar pandas
import numpy as np #importerar numpy
df = pd.read_csv("AB_NYC_2019.csv") #lÀser in datamÀngden och sparar den i variabeln df
df.head(3) #ser pÄ de första 3 raderna för att förstÄ hur vÀrdena ser ut 
df.info() #Visar information om kolumnerna 
Vi tittar pÄ vÀrdena i kolumnerna:
- ĂverensstĂ€mmer antalet rader i varje kolumn med det totala antalet rader?
- Vad Àr essensen av data i varje kolumn?
- Vilken kolumn vill vi göra till mÄlet för att göra förutsÀgelser för den?
Svar pÄ dessa frÄgor kommer att möjliggöra en analys av datamÀngden och ungefÀr skissa en plan för de nÀrmaste ÄtgÀrderna.
För en djupare insyn i vÀrdena i varje kolumn kan vi anvÀnda pandas-funktionen describe(). En nackdel med denna funktion Àr dock att den inte ger information om kolumner med string-vÀrden. Vi kommer att ta itu med dem senare.
df.describe() 
Magisk visualisering
LÄt oss titta pÄ var vi har saknade vÀrden:
import seaborn as sns
sns.heatmap(df.isnull(), yticklabels=False, cbar=False, cmap='viridis') 
Detta var en liten översikt, nu börjar vi med intressantare saker.
Vi ska försöka hitta och, om möjligt, ta bort kolumner dÀr det endast finns ett vÀrde i alla rader (de kommer inte att pÄverka resultatet pÄ nÄgot sÀtt):
df = df[[c for c
in list(df)
if len(df[c].unique()) > 1]] #Ăverskriv datasetet, behĂ„ll endast de kolumner som har mer Ă€n ett unikt vĂ€rdeNu skyddar vi oss sjĂ€lva och framgĂ„ngen för vĂ„rt projekt frĂ„n dubbelrader (rader som innehĂ„ller samma information i samma ordning som redan finns i en av de existerande raderna):
df.drop_duplicates(inplace=True) #Vi gör detta om vi anser att det Àr nödvÀndigt.
#I vissa projekt bör sÄdana data inte tas bort frÄn början.Vi delar upp datasetet i tvÄ: en med kvalitativa vÀrden och en annan med kvantitativa
HÀr behöver vi göra en liten precisering: om rader med saknade data inom kvalitativa och kvantitativa vÀrden inte helt överensstÀmmer med varandra, mÄste vi fatta beslut om vad vi offrar - alla rader med saknade data, endast en del av dem eller specifika kolumner. Om raderna överensstÀmmer har vi full rÀtt att dela datasetet i tvÄ. I annat fall mÄste vi först reda ut rader dÀr saknade data inom kvalitativa och kvantitativa vÀrden inte överensstÀmmer, och först sedan dela datasetet i tvÄ.
df_numerical = df.select_dtypes(include=[np.number])
df_categorical = df.select_dtypes(exclude=[np.number])Vi gör detta för att det ska bli lÀttare att bearbeta dessa tvÄ olika typer av data - senare kommer vi att förstÄ hur mycket detta förenklar vÄrt liv.
Arbeta med kvantitativa data
Det första vi bör göra Àr att avgöra om det finns "spionkolumner" i de kvantitativa data. Vi kallar dessa kolumner sÄ eftersom de utger sig för att vara kvantitativa data, men fungerar som kvalitativa.
Hur kan vi identifiera dem? Naturligtvis beror allt pÄ arten av de data som du analyserar, men i huvudsak kan sÄdana kolumner ha fÄ unika data (runt 3-10 unika vÀrden).
print(df_numerical.nunique())NÀr vi har identifierat spionkolumnerna kommer vi att flytta dem frÄn de kvantitativa data till de kvalitativa:
spy_columns = df_numerical[['kolumn1', 'kolumn2', 'kolumn3']]# Vi separerar spionkolumnerna och skriver till en separat dataframe
df_numerical.drop(labels=['kolumn1', 'kolumn2', 'kolumn3'], axis=1, inplace=True)# Vi tar bort dessa kolumner frÄn de numeriska data
df_categorical.insert(1, 'kolumn1', spy_columns['kolumn1']) # Vi lÀgger till första spionkolumnen i de kvalitativa data
df_categorical.insert(1, 'kolumn2', spy_columns['kolumn2']) # Vi lÀgger till andra spionkolumnen i de kvalitativa data
df_categorical.insert(1, 'kolumn3', spy_columns['kolumn3']) # Vi lĂ€gger till tredje spionkolumnen i de kvalitativa dataĂntligen har vi helt separerat de kvantitativa data frĂ„n de kvalitativa och nu kan vi verkligen arbeta med dem. Först och frĂ€mst â vi mĂ„ste förstĂ„ var vi har tomma vĂ€rden (NaN, och i vissa fall Ă€ven 0 kommer tas som tomma vĂ€rden).
for i in df_numerical.columns:
print(i, df[i][df[i]==0].count())I det hÀr skedet Àr det viktigt att förstÄ i vilka kolumner nollor kan betyda saknade vÀrden: Àr det kopplat till hur data samlades in? Eller kan det bero pÄ datavÀrden? Dessa frÄgor mÄste besvaras i varje enskilt fall.
SÄ om vi beslutar att data kan saknas dÀr det finns nollor, bör vi ersÀtta nollor med NaN för att senare enklare kunna hantera dessa saknade data:
df_numerical[["kolumn 1", "kolumn 2"]] = df_numerical[["kolumn 1", "kolumn 2"]].replace(0, nan)LÄt oss nu se var vi har saknade data:
sns.heatmap(df_numerical.isnull(), yticklabels=False, cbar=False, cmap='viridis') # Vi kan ocksÄ anvÀnda df_numerical.info() 
HĂ€r ska de vĂ€rden som saknas inom kolumnerna markeras i gult. Och det mest intressanta börjar nu â hur ska vi hantera dessa vĂ€rden? Ska vi ta bort rader med dessa vĂ€rden eller kolumner? Eller fylla dessa tomma vĂ€rden med nĂ„got annat?
HÀr Àr en ungefÀrlig plan som kan hjÀlpa dig att besluta om vad som kan göras med de tomma vÀrdena:

0. Ta bort onödiga kolumner
df_numerical.drop(labels=["kolumn1","kolumn2"], axis=1, inplace=True)1. Finns det fler Àn 50% tomma vÀrden i denna kolumn?
print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)df_numerical.drop(labels=["kolumn1","kolumn2"], axis=1, inplace=True) # Ta bort om nÄgon kolumn har mer Àn 50 saknade vÀrden2. Ta bort rader med tomma vÀrden
df_numerical.dropna(inplace=True) # Tar bort rader med tomma vÀrden, om det sedan finns tillrÀckligt med data för inlÀrning3.1. Infoga ett slumpmÀssigt vÀrde
import random # Importera random
df_numerical["kolumn"].fillna(lambda x: random.choice(df[df[column] != np.nan]["kolumn"]), inplace=True) # Infoga slumpmÀssiga vÀrden i tomma celler i tabellen3.2. Infoga ett konstant vÀrde
from sklearn.impute import SimpleImputer # Importera SimpleImputer, som hjÀlper till att sÀtta in vÀrden
imputer = SimpleImputer(strategy='constant', fill_value="") # Infoga ett specifikt vÀrde med hjÀlp av SimpleImputer
df_numerical[["ny_kolumn1", 'ny_kolumn2', 'ny_kolumn3']] = imputer.fit_transform(df_numerical[['kolumn1', 'kolumn2', 'kolumn3']]) # TillÀmpar detta för vÄr tabell
df_numerical.drop(labels=["kolumn1", "kolumn2", "kolumn3"], axis=1, inplace=True) # Ta bort kolumner med gamla vÀrden3.3. Infoga det genomsnittliga eller mest frekventa vÀrdet
from sklearn.impute import SimpleImputer # Importera SimpleImputer, som hjÀlper till att sÀtta in vÀrden
imputer = SimpleImputer(strategy='mean', missing_values=np.nan) # IstÀllet för mean kan man ocksÄ anvÀnda most_frequent
df_numerical[["ny_kolumn1", 'ny_kolumn2', 'ny_kolumn3']] = imputer.fit_transform(df_numerical[['kolumn1', 'kolumn2', 'kolumn3']]) # TillÀmpar detta för vÄr tabell
df_numerical.drop(labels=["kolumn1", "kolumn2", "kolumn3"], axis=1, inplace=True) # Ta bort kolumner med gamla vÀrden3.4. Infoga ett vÀrde berÀknat av en annan modell
Ibland kan vÀrden berÀknas med hjÀlp av regressionsmodeller, genom att anvÀnda modeller frÄn sklearn-biblioteket eller andra liknande bibliotek. VÄrt team kommer att Àgna en sÀrskild artikel Ät hur detta kan göras inom en snar framtid.
SÄ, berÀttelsen om kvantitativa data pausar hÀr, eftersom det finns mÄnga andra detaljer om hur man bÀst gör dataförberedelse och förbehandling för olika uppgifter, och de grundlÀggande sakerna för kvantitativa data har beaktats i den hÀr artikeln. Nu Àr det dags att ÄtergÄ till kvalitativa data, som vi separerade nÄgra steg tillbaka frÄn de kvantitativa. Du kan Àndra denna notebook som du vill, anpassa den för olika uppgifter sÄ att dataförbehandlingen gÄr mycket snabbt!
Kvalitativa data
PrimÀrt anvÀnds metoden One-hot-encoding för kvalitativa data för att formatera dem frÄn strÀng (eller objekt) till nummer. Innan vi gÄr vidare till detta avsnitt, lÄt oss anvÀnda schemat och koden ovan för att förstÄ de tomma vÀrdena.
df_categorical.nunique()sns.heatmap(df_categorical.isnull(), yticklabels=False, cbar=False, cmap='viridis') 
0. Ta bort onödiga kolumner
df_categorical.drop(labels=["kolumn1", "kolumn2"], axis=1, inplace=True)1. Finns det fler Àn 50% tomma vÀrden i denna kolumn?
print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)df_categorical.drop(labels=["kolumn1", "kolumn2"], axis=1, inplace=True) # Tar bort om nÄgon kolumn
# har mer Àn 50% tomma vÀrden2. Ta bort rader med tomma vÀrden
df_categorical.dropna(inplace=True) # Tar bort rader med tomma vÀrden,
# om det sedan finns tillrÀckligt med data för trÀning3.1. Infoga ett slumpmÀssigt vÀrde
import random
df_categorical["kolumn"].fillna(lambda x: random.choice(df[df[column] != np.nan]["kolumn"]), inplace=True)3.2. Infoga ett konstant vÀrde
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="")
df_categorical[["ny_kolumn1", 'ny_kolumn2', 'ny_kolumn3']] = imputer.fit_transform(df_categorical[['kolumn1', 'kolumn2', 'kolumn3']])
df_categorical.drop(labels=["kolumn1", "kolumn2", "kolumn3"], axis=1, inplace=True)SÄ, vi har Àntligen förstÄtt de tomma vÀrdena i kvalitativa data. Nu Àr det dags att utföra one-hot-encoding för vÀrdena som finns i din databas. Denna metod anvÀnds ofta sÄ att din algoritm kan trÀna med hÀnsyn till kvalitativa 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 = ["kolumn1", "kolumn2", "kolumn3"]
for feature in features_to_encode:
df_categorical = encode_and_bind(df_categorical, feature)SĂ„, vi har Ă€ntligen avslutat att bearbeta kvalitativa och kvantitativa data separat â tid att kombinera dem igen.
new_df = pd.concat([df_numerical, df_categorical], axis=1)Efter att vi har sammanfört dataset i ett enda, kan vi till slut anvÀnda datatransformation med hjÀlp av MinMaxScaler frÄn sklearn-biblioteket. Detta kommer att göra vÄra vÀrden mellan 0 och 1, vilket hjÀlper med modellens trÀning i framtiden.
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)Dessa data Ă€r nu redo för allt â för neurala nĂ€tverk, vanliga ML-algoritmer, etc!
I den hÀr artikeln har vi inte tagit hÀnsyn till arbetet med data som rör tidsserier, eftersom sÄdana data krÀver nÄgot andra metoder för bearbetning beroende pÄ din uppgift. I framtiden kommer vÄrt team att Àgna ett separat Àmne Ät detta och vi hoppas att det kommer att ge nÄgot intressant, nytt och anvÀndbart i ditt liv, precis som denna artikel.
KĂ€lla: habr.com
