Bonjour,
J’essaie d’effectuer des calculs sur un DataFrame pour en créer un second qui me servira à réaliser un ou plusieurs graphiques.
A l’heure actuelle tout marche correctement, cependant je pense qu’il ne s’agit pas de la façon optimale pour traiter ce type de problème.
Pourriez vous m’indiquer la méthodologie à suivre svp ?
Dans mon exemple j’ai un DF ayant une colonne « browser » (variable qualitative ayant pour value possibles : Firefox, IE, Safari, …)
Je cherche à calculer le nombre d’itérations de chaque value (filtré en fonction de la value d’une seconde colonne) afin de pouvoir afficher l’histogramme correspondant
Voici mon code qui sera peut être plus explicite :
# on crée des DF intermédiaire pour faire nos calculs de volumétrie et agréger les résultats dans un DF
counts_df = pd.DataFrame(dataset.groupby('browser').size().reset_index(name='VolTotal'))
count_df_volIsFraud = pd.DataFrame(dataset[dataset['is_fraud']==1].groupby('browser').size().reset_index(name='VolTotalFraud'))
count_df_volNotIsFraud = pd.DataFrame(dataset[dataset['is_fraud']==0].groupby('browser').size().reset_index(name='VolTotalNotFraud'))
# on agrège les données dans un DF
counts_df= counts_df.merge(right = count_df_volIsFraud, on = 'browser', how = 'inner')
counts_df= counts_df.merge(right = count_df_volNotIsFraud, on = 'browser', how = 'inner')
# on dessine l'histrogramme correspondant
ax= counts_df.plot.bar(x = 'browser', y=[ 'VolTotalNotFraud','VolTotalFraud'], stacked=False, rot=45)
# on loop sur les "bar" de l'histrogramme pour afficher les values correspondantes en tête de chaque bar
for p in ax.patches:
width = p.get_width()
height = p.get_height()
x, y = p.get_xy()
ax.annotate(f'{height}', (x + width/2, y + height*1.02), ha='center')
plt.xlabel("Navigateur")
plt.ylabel("Nb d'opérations")
plt.title('Navigateur / is_fraud')
plt.legend()
plt.show()
Version optimisée proposée :
counts_df_test = dataset.groupby(['source' ]).agg({'user_id': 'count'})
counts_df_test = counts_df_test.rename({"user_id":"nb_user"}, axis=1)
counts_df_test['volIsFraud']= dataset[dataset['is_fraud']==1].groupby(['source' ]).agg({'user_id': 'count'})
counts_df_test['volIsNotFraud']= dataset[dataset['is_fraud']==0].groupby(['source' ]).agg({'user_id': 'count'})
counts_df_test.reset_index()
Quelle serait la meilleure méthode svp ?
Merci