Ofte homoj enirantaj la kampon de Datuma Scienco havas malpli ol realismajn atendojn pri tio, kio atendas ilin. Multaj homoj pensas, ke nun ili skribos bonegajn neΕralajn retojn, kreos voΔan asistanton de Iron Man aΕ venkos Δiujn en la financaj merkatoj.
Sed laboro datumoj Sciencisto estas datuma movita, kaj unu el la plej gravaj kaj tempopostulaj aspektoj estas prilaborado de la datumoj antaΕ ol enigi Δin en neΕralan reton aΕ analizi Δin laΕ certa maniero.
En Δi tiu artikolo, nia teamo priskribos kiel vi povas prilabori datumojn rapide kaj facile per paΕo post paΕo instrukcioj kaj kodo. Ni provis fari la kodon sufiΔe fleksebla kaj povus esti uzata por malsamaj datenoj.
Multaj profesiuloj eble ne trovas ion eksterordinaran en Δi tiu artikolo, sed komencantoj povos lerni ion novan, kaj Δiu, kiu longe revas fari apartan kajeron por rapida kaj strukturita datumtraktado, povas kopii la kodon kaj formati Δin por si mem, aΕ
Ni ricevis la datumaron. Kion fari poste?
Do, la normo: ni devas kompreni, kion ni traktas, la Δeneralan bildon. Por fari tion, ni uzas pandojn por simple difini malsamajn datumtipojn.
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() #ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ
Ni rigardu la kolumnvalorojn:
- Δu la nombro da linioj en Δiu kolumno respondas al la tuta nombro da linioj?
- Kio estas la esenco de la datumoj en Δiu kolumno?
- Kiun kolumnon ni volas celi por fari antaΕdirojn pri Δi?
La respondoj al Δi tiuj demandoj permesos al vi analizi la datumaron kaj proksimume desegni planon por viaj venontaj agoj.
AnkaΕ, por pli profunde rigardi la valorojn en Δiu kolumno, ni povas uzi la funkcion describe() pandas. Tamen, la malavantaΔo de Δi tiu funkcio estas ke Δi ne provizas informojn pri kolumnoj kun kordaj valoroj. Ni traktos ilin poste.
df.describe()
Magia bildigo
Ni rigardu kie ni tute ne havas valorojn:
import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
Δi tio estis mallonga rigardo de supre, nun ni transiros al pli interesaj aferoj
Ni provu trovi kaj, se eble, forigi kolumnojn kiuj havas nur unu valoron en Δiuj vicoj (ili neniel influos la rezulton):
df = df[[c for c
in list(df)
if len(df[c].unique()) > 1]] #ΠΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΄Π°ΡΠ°ΡΠ΅Ρ, ΠΎΡΡΠ°Π²Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ
Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
Nun ni protektas nin kaj la sukceson de nia projekto kontraΕ duplikataj linioj (linioj, kiuj enhavas la samajn informojn en la sama ordo kiel unu el la ekzistantaj linioj):
df.drop_duplicates(inplace=True) #ΠΠ΅Π»Π°Π΅ΠΌ ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ Π½ΡΠΆΠ½ΡΠΌ.
#Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
ΡΠ΄Π°Π»ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° Π½Π΅ ΡΡΠΎΠΈΡ.
Ni dividas la datumaron en du: unu kun kvalitaj valoroj, kaj la alia kun kvantaj
Δi tie ni devas fari malgrandan klarigon: se la linioj kun mankantaj datumoj en kvalitaj kaj kvantaj datumoj ne tre korelacias unu kun la alia, tiam ni devos decidi kion ni oferas - Δiujn liniojn kun mankantaj datumoj, nur parton de ili, aΕ certaj kolumnoj. Se la linioj estas korelaciitaj, tiam ni rajtas dividi la datumaron en du. Alie, vi unue devos trakti la liniojn, kiuj ne korelacias la mankantajn datumojn en kvalita kaj kvanta, kaj nur tiam dividi la datumaron en du.
df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])
Ni faras tion por faciligi al ni prilabori Δi tiujn du malsamajn specojn de datumoj - poste ni komprenos kiom pli facilas Δi tio faciligas nian vivon.
Ni laboras kun kvantaj datumoj
La unua afero, kiun ni devas fari, estas determini Δu estas "spionaj kolumnoj" en la kvantaj datumoj. Ni nomas Δi tiujn kolumnojn tiel Δar ili prezentas sin kiel kvantajn datumojn, sed agas kiel kvalitaj datumoj.
Kiel ni povas identigi ilin? Kompreneble, Δio dependas de la naturo de la datumoj, kiujn vi analizas, sed Δenerale tiaj kolumnoj povas havi malmulte da unikaj datumoj (en la regiono de 3-10 unikaj valoroj).
print(df_numerical.nunique())
Post kiam ni identigis la spionkolumnojn, ni movos ilin de kvantaj datumoj al kvalitaj datumoj:
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']) #Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠ΅ΡΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ-ΡΠΏΠΈΠΎΠ½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
Fine, ni tute apartigis kvantajn datumojn de kvalitaj datumoj kaj nun ni povas labori kun Δi Δuste. La unua afero estas kompreni, kie ni havas malplenajn valorojn (NaN, kaj en iuj kazoj 0 estos akceptita kiel malplenaj valoroj).
for i in df_numerical.columns:
print(i, df[i][df[i]==0].count())
Je Δi tiu punkto, estas grave kompreni en kiuj kolumnoj nuloj povas indiki mankantajn valorojn: Δu tio estas pro kiel la datumoj estis kolektitaj? AΕ Δu Δi povus rilati al la datumvaloroj? Δi tiuj demandoj devas esti responditaj laΕkaze.
Do, se ni ankoraΕ decidas, ke eble mankas al ni datumoj kie estas nuloj, ni devus anstataΕigi la nulojn per NaN por plifaciligi labori kun Δi tiuj perditaj datumoj poste:
df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]] = df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]].replace(0, nan)
Nun ni vidu, kie ni mankas datumoj:
sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ df_numerical.info()
Δi tie tiuj valoroj ene de la mankantaj kolumnoj devus esti markitaj flava. Kaj nun komenciΔas la amuzo - kiel trakti Δi tiujn valorojn? Δu mi forigu vicojn kun Δi tiuj valoroj aΕ kolumnoj? AΕ plenigu Δi tiujn malplenajn valorojn per iuj aliaj?
Jen proksimuma diagramo, kiu povas helpi vin decidi, kion oni principe povas fari kun malplenaj valoroj:
0. Forigu nenecesajn kolumnojn
df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)
1. Δu la nombro da malplenaj valoroj en Δi tiu kolumno estas pli granda ol 50%?
print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)
df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)#Π£Π΄Π°Π»ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ 50 ΠΏΡΡΡΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
2. Forigu liniojn kun malplenaj valoroj
df_numerical.dropna(inplace=True)#Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΡΡΠΎΡΠΊΠΈ Ρ ΠΏΡΡΡΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
3.1. Enmetante hazardan valoron
import random #ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ random
df_numerical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True) #Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ°Π½Π΄ΠΎΠΌΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΏΡΡΡΡΠ΅ ΠΊΠ»Π΅ΡΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΡ
3.2. Enmetante konstantan valoron
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. Enmetu la mezan aΕ plej oftan valoron
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. Enigu la valoron kalkulitan de alia modelo
Kelkfoje valoroj povas esti kalkulitaj per regresaj modeloj uzante modelojn de la sklearn-biblioteko aΕ aliaj similaj bibliotekoj. Nia teamo dediΔos apartan artikolon pri kiel tio povas esti farita baldaΕ.
Do, nuntempe, la rakonto pri kvantaj datumoj estos interrompita, Δar ekzistas multaj aliaj nuancoj pri kiel pli bone fari datumpreparon kaj antaΕtraktadon por malsamaj taskoj, kaj la bazaj aferoj por kvantaj datumoj estis konsiderataj en Δi tiu artikolo, kaj nun estas la tempo reveni al kvalitaj datumoj.kiujn ni apartigis plurajn paΕojn malantaΕen de la kvantaj. Vi povas ΕanΔi Δi tiun kajeron laΕplaΔe, adaptante Δin al malsamaj taskoj, por ke datumpretigo iru tre rapide!
Kvalitaj datumoj
Esence, por kvalitaj datenoj, la Unu-varma-kodiga metodo estas uzata por formati Δin de Δeno (aΕ objekto) al nombro. AntaΕ ol pluiri al Δi tiu punkto, ni uzu la diagramon kaj kodon supre por trakti malplenajn valorojn.
df_categorical.nunique()
sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')
0. Forigu nenecesajn kolumnojn
df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)
1. Δu la nombro da malplenaj valoroj en Δi tiu kolumno estas pli granda ol 50%?
print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)
df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True) #Π£Π΄Π°Π»ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°
#ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ 50% ΠΏΡΡΡΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
2. Forigu liniojn kun malplenaj valoroj
df_categorical.dropna(inplace=True)#Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΡΡΠΎΡΠΊΠΈ Ρ ΠΏΡΡΡΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ,
#Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
3.1. Enmetante hazardan valoron
import random
df_categorical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True)
3.2. Enmetante konstantan valoron
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)
Do, ni finfine ektraktis nulojn en kvalitaj datumoj. Nun estas tempo fari unu-varman kodigon sur la valoroj, kiuj estas en via datumbazo. Δi tiu metodo estas tre ofte uzata por certigi, ke via algoritmo povas lerni de altkvalitaj datumoj.
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))
Do, ni finfine finis prilabori apartajn kvalitajn kaj kvantajn datumojn - tempo por kombini ilin reen
new_df = pd.concat([df_numerical,df_categorical], axis=1)
Post kiam ni kombinis la datumarojn kune en unu, ni povas finfine uzi datuman transformon uzante MinMaxScaler de la sklearn-biblioteko. Δi tio faros niajn valorojn inter 0 kaj 1, kio helpos dum trejnado de la modelo estonte.
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)
Δi tiuj datumoj nun estas pretaj por io ajn - neΕralaj retoj, normaj ML-algoritmoj, ktp.!
En Δi tiu artikolo, ni ne konsideris labori kun temposerio-datumoj, Δar por tiaj datumoj vi devus uzi iomete malsamajn prilaborajn teknikojn, depende de via tasko. Estonte nia teamo dediΔos apartan artikolon al Δi tiu temo, kaj ni esperas, ke Δi povos alporti ion interesan, novan kaj utilan en vian vivon, same kiel Δi tiu.
fonto: www.habr.com