2
votes

Dans Sklearn, existe-t-il un moyen propre de transformer une liste de dictés?

J'ai une liste de dictionnaires que je souhaite mettre à l'échelle. Pour utiliser les scalers sklearn, je dois transformer les dictionnaires en listes. Ensuite, je transformerai les listes en dictons. Voici ce que je fais:

keys = sorted(X[0].keys())
scaler = RobustScaler()
transformed = scaler.fit_transform([[x[k] for k in keys] for x in X])
X = [{k: x[idx] for idx, k in enumerate(keys)} for x in transformed]

Y a-t-il un moyen plus propre?


0 commentaires

3 Réponses :


1
votes

Cela devrait être un peu plus clair:

from sklearn.preprocessing import RobustScaler

X = [{'a':1, 'b':1}]
keys = sorted(X[0].keys())

scaler = RobustScaler()
transformed = scaler.fit_transform([list(x.values()) for x in X])

result = [dict(zip(keys, x)) for x in transformed]


1 commentaires

.values ​​() ne conserverait pas l'ordre. Par conséquent, nous n'obtiendrons pas le même ordre pour chaque x .



1
votes

Lorsque vous avez vos données sous forme de liste de dict, alors pandas Dataframe serait un choix idéal!

Après la mise à l'échelle, vous devez utiliser les noms de colonne du dataframe pour recréer le dictionnaire.

import pandas as pd
from sklearn.preprocessing import RobustScaler


my_dict1 = {'a': 1324, 'b': 2, 'c': 3}
my_dict2 = {'a': 13, 'b': 123, 'c': 31}
X = [my_dict1, my_dict2]

#[{'a': 1324, 'b': 2, 'c': 3}, {'a': 13, 'b': 123, 'c': 31}]

df = pd.DataFrame(X)
scaler = RobustScaler()
transformed = scaler.fit_transform(df)
transformed_x = [dict(zip(df.columns,x)) for x in transformed]

#[{'a': 1.0, 'b': -1.0, 'c': -1.0}, {'a': -1.0, 'b': 1.0, 'c': 1.0}]


0 commentaires

1
votes

Ma vision de ce problème donne cette solution. Il est très similaire au vôtre, juste la dernière partie utilise dict () et zip () pour un look plus propre (à mon avis).

X_original = [
    {'a': 2, 'b': 3},
    {'a': 7, 'b': 6},
    {'a': 1, 'b': 7},
]
keys = sorted(X_original[0].keys())

scaler = RobustScaler()
X_transformed = scaler.fit_transform([[d[k] for k in keys] for d in X_original])
X_final = [dict(zip(keys, x)) for x in X_transformed]


0 commentaires