Nota-seductorem sheet ad ieiunium Data preprocessing

Saepe homines agrum Datae Scientiae intrantes minus habent quam exspectationes reales quae eos exspectant. Multi putant nunc se scribere subsidia neuralis refrigerantia, vocem adiutorem ex Iron Homine creare, vel omnes in mercatis oeconomicis verberare.
Sed opus Data Sciens est notitia agitatae, et unus aspectus maximi momenti et temporis consumens est notitias expediens antequam eam in retis neuralis pascat vel certo modo dividendo.

In hoc articulo, turma nostra describet quomodo notitia cito ac faciliter cum gradatim mandatis et codice procedere potes. Nos codicem satis flexibilem efficere conati sumus et pro diversis datasetis adhiberi possemus.

Multi doctores in hoc articulo aliquid extraordinarium non invenire possunt, sed incipientes aliquid novi addiscere poterunt, et qui iamdudum somniavit de libello separato ieiunii et notitiae structi, codicem et formare sibi vel imitari potest. download perfecti libello de Github.

Dataset aeeepimus. Quid faciendum?

Sic, vexillum: intelligere debemus quid agimus, summa imago. Ad hoc pandas utimur ad diversa genera notitiarum simpliciter definienda.

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

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

Nota-seductorem sheet ad ieiunium Data preprocessing

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

Nota-seductorem sheet ad ieiunium Data preprocessing

Inspice valores columnae:

  1. Vtrum numerus linearum in unaquaque columna respondeat toti numero linearum?
  2. Quae est essentia notitiarum in unaquaque columna?
  3. Qua columna vis oppugnare ut praedicere pro ea?

Responsa harum quaestionum permittent te ut dataset analysim et proxime consilium proximorum actionum tuarum componas.

Etiam, ut valorum in unaquaque columna altiori inspicias, functionem pandas describere possumus. Sed incommodum huius functionis est quod informationes de columnis cum chordis valores non praebet. De his postea agemus.

df.describe()

Nota-seductorem sheet ad ieiunium Data preprocessing

Magia visualisation

Intueamur ubi nullas habemus valores;

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

Nota-seductorem sheet ad ieiunium Data preprocessing

Hoc breve aspectum superne fuit, nunc ad res magis iucundas movebimus

Studeamus invenire et, si fieri potest, columnas removere quae unum tantum valorem in omnibus ordinibus habent (non ullo modo afficiunt eventum);

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

Nunc nosmetipsos protegimus ac successum propositi a lineis duplicatis (lines continentes eadem notitia eodem ordine ac linearum exsistentium);

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

Datases in duo dividimus, unum cum valoribus qualitivis, alterum cum quantitatis

Hic parva declaratio elucidanda est: si lineae cum notitia absentis in notitia qualitativa et quantitativa inter se non valde connectuntur, tum quid sacrificamus β€” omnes lineas cum notitia absentis, tantum ex parte, definire debebimus; vel quasdam columnas. Si lineae connectuntur, omne fas nobis est dataset in duas dividere. Alioquin primum opus est agere de lineis quae absentiam datam in qualitativa et quantita- tiva non referant, et tunc demum datases in duas dividas.

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

Hoc nos facimus, quo facilius nobis haec duo genera notitiarum enucleentur – postea intellegemus quanto facilius haec vita nostra facit.

Operamur cum quantitatis notitia

Circa primum sciendum est, utrum columnae speculatoriae sint in notitia quantitatis. Has columnas vocamus, quia seipsos ut quantitatis datae, sed ut datas qualitates agunt.

Quomodo eas cognoscimus? Scilicet, totum pendet ex natura notitiarum quas es examinare, sed in genere columnarum singulares notitias parum habere possunt (in regione 3-10 valores singulares).

print(df_numerical.nunique())

Postquam columnas exploratores identificavimus, eas a notitia quantitatis ad datam qualitativum movebimus;

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

Denique notitia quantitatis quantitatis a notitia qualitativa penitus separavimus et nunc cum ea proprie operari possumus. Primum est intellegendum ubi valores inanes habemus (NaN, et in quibusdam 0 ut valores inanes accipietur).

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

Hoc loco interest cognoscere in quibus columnae cyphris possunt significare valores absentes: hoc est debitum quomodo colligitur notitia? Vel potest referri ad valores notitias? Hae interrogationes responderi debent in basi in casu.

Itaque, si adhuc constituimus nos ut notitiae deesse ubi zerae sunt, zephyros cum NaN reponere debeamus ut facilius cum hac amissa notitia postea laboret:

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

Nunc videamus ubi nos notitia absentis:

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

Nota-seductorem sheet ad ieiunium Data preprocessing

Hic valores illae intra columnas quae desunt flavis notari debent. Et nunc incipit iocus - quomodo de istis bonis agam? Cum his valoribus vel columnis ordines delere debeo? Aut haec bona vacua cum aliis quibusdam implent?

Hic proximus est schematismus qui adiuvare potest ad decernendum quid in principio fieri possit cum valoribus inanibus:

Nota-seductorem sheet ad ieiunium Data preprocessing

0. remove columnas necesse

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

1. Estne numerus valorum vacuorum in hac columna maior quam L%?

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

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

2. Delere lineae in inanibus values

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

3.1. Inserentes temere valorem

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

3.2. Inserentes constantem valorem

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. Mediocris vel frequentissimum inserere in valorem

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. Imposito valore ratione alterius exemplar

Aliquando valores iniri possunt exempla regressuum utentes exempla e bibliotheca sklearn vel aliis bibliothecis similibus. Manipulus noster separatum articulum devovet quomodo id in proximo futurum sit.

Sic, nunc, narratio de notitia quantitatis quantitatis interrumpitur, quia multae sunt aliae nuances quomodo melius faciant notitias praeparationes et praeprocessiones ad diversa opera, et elementa pro quantita- tiva notitia in hoc articulo habita sunt ratio; nunc tempus est reverti ad qualitatem datam, quae a quantitatis gradibus plures separavimus. Libellum hunc mutare potes, ut lubet, diversis officiis accommodans, ut notitia praeprocessionis celerrime pergat!

Qualative data

Plerumque, pro qualitativa notitia, methodus One-calidi-descriptionis adhibetur ut eam a filo (vel objecto) ad numerum format. Priusquam huc transgrediar, schemate et codice utamur supra ad bona inanibus tractanda.

df_categorical.nunique()

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

Nota-seductorem sheet ad ieiunium Data preprocessing

0. remove columnas necesse

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

1. Estne numerus valorum vacuorum in hac columna maior quam L%?

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

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

2. Delere lineae in inanibus values

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

3.1. Inserentes temere valorem

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

3.2. Inserentes constantem valorem

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)

Ita demum manubrium nullis in notitia qualitativa tenemus. Tempus est nunc unum calidum-delatum in valoribus qui in datorum datorum tuorum conficere. Haec methodus saepissime adhibita est ut algorithmus tuus ex notitia GENERALIS discere possit.

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

Itaque tandem processui perfecti sumus notitias separatas qualitativa et quantitativa - tempus ad eos reducendos

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

Postquam notulas in unum commisimus, tandem transmutatio notitiarum uti MinMaxScaler e bibliotheca sklearn uti possumus. Haec bona nostra inter 0 et 1, efficiet, quae exemplar in futurum formando adiuvabunt.

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

Haec data nunc ad omnia parata sunt - retiacula neural, vexillum ML algorithms, etc.

In hoc articulo, cum temporis seriei notitiarum operandi rationem non habuimus, cum pro tali notitia technicas processus paulo aliter uteres, tuo negotio fretus. In posterum, turma nostra unum articulum huic argumento destinabit, et speramus fore ut aliquid iucundum, novum et utile in vitam tuam adferre possit, sicut hoc unum.

Source: www.habr.com