Vous ne vous sentez pas? Surtout quand il y a beaucoup de lignes dans la compétition ou que c'est vraiment lent. Combien de temps passez-vous à créer des fonctionnalités! Dans un tel cas, l'utilisation de la carte le rendra plus rapide.
S'il n'y a pas de numéro de ligne tel qu'il est, il n'y aura pas de différence, donc cette fois j'utiliserai le Titanic de Kaggle. Il y a une colonne appelée Age dedans, donc je veux compter l'encoder.
merge_map.py
import pandas as pd
import time
df = pd.read_csv("train.csv")
df["Age"] = df["Age"].dtype("str")
t1 = time.time()
#pettern 1
df = pd.merge(df,df.Age.value_counts().reset_index().rename(columns = {"Age":"Age_count1"}),
left_on = "Age", right_on = "index", how = "left")
t2 = time.time()
#pettern 2
df["Age_count2"] = df["Age"].map(df.Age.value_counts())
t3 =time.time()
print(t2-t1)
print(t3-t2)
#output
0.004603147506713867
0.0012080669403076172
Dans ce cas, la carte est 4 fois plus rapide. Vous pouvez également effectuer un encodage cible avec map.
df = pd.merge(df, df.groupby("Age").Survived.mean().reset_index().rename(columns =
{"Survived":"Age_target1"}), on = "Age", how = "left")
t4 = time.time()
df["Age_target2"] = df["Age"].map(df.groupby(["Age"]).Survived.mean())
print(t4-t3)
print(t5-t4)
#output
0.005101919174194336
0.001428842544555664
C'est également environ quatre fois plus rapide. À cette échelle, c'est encore 10 ou 40 secondes. C'est assez différent quand vous comprenez 1 minute ou 4 minutes.
la carte doit avoir une clé. Dans ce cas, créez une clé de force.
df = pd.merge(df, df.assign(sex_age_count = 0).groupby(
["Sex", "Age"])["sex_age_count"].count().reset_index(),on = ["Sex", "Age"] ,how = "left")
t6 = time.time()
#Faire une clé de force
df["Sex_Age"] = df["Sex"] + df["Age"]
t7 = time.time()
df["Sex_Age_count"] = df["Sex_Age"].map(df["Sex_Age"].value_counts())
t8 = time.time()
print(t6-t5)
print(t8-t7)
C'est également environ quatre fois plus rapide.
#output
0.006415843963623047
0.0015180110931396484
Recommended Posts