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?
3 Réponses :
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]
.values ()
ne conserverait pas l'ordre. Par conséquent, nous n'obtiendrons pas le même ordre pour chaque x
.
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}]
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]