Par Khaoula BENYAHYA, Data Analyst
Cas d’illustration :
Dans cette partie, nous allons illustrer l’intérêt d’utiliser Python dans Power BI en réalisant des visuels qui n’existent pas dans l’outil. Nous nous sommes basés sur un jeu de données qui contient le détail des commandes avec des données sur les produits achetés ou vendus ainsi que les données relatives aux clients et aux vendeurs. Nous avons 3 catégories de produits : Accessories, Bikes et Clothing.
Pour les graphiques réalisés, nous avons utilisé la librairie matplotlib. C’est une librairie très riche qui permet de customizer presque tous les paramètres d’un graphique Python.
- 1er exemple
Dans un premier temps, nous voulons afficher la répartition mensuelle des quantités commandées de chaque catégorie, ainsi que le total de ces quantités. Nous allons illustrer cela sous forme d’histogrammes.
Ce qui donne :
Le graphique est dynamique si nous filtrons sur les catégories. Nous affichons la répartition de chaque catégorie sélectionnée ainsi qu’un histogramme global qui illustre la somme des catégories choisies. C’est la boucle for qui permet cette dynamique. Par exemple :
Le code qui permet de réaliser cela est :
# import libraries import matplotlib.pyplot as plt # color pallet colors = ['#12239E','#118DFF','#E66C37','#751E73'] # get number of categories nb_cat = len(dataset['Category'].unique())+1 # declare constraints const = 1 cpt = 1 color_choice = 0 # for loop to plot histograms for each category chosen for category in dataset['Category'].unique(): # get number of the subplot subplot=int(str(nb_cat)+str(const)+str(cpt)) # choose the subplot where to plot the histogram plt.subplot(subplot) # get data of the category to plot cat=dataset[dataset.Category==category].drop('Category',axis=1) # plot the graph plt.bar(cat['Mois'],cat['OrderQty'],color=colors[color_choice],width=0.5) # set x axis to invisible plt.gca().get_xaxis().set_visible(False) plt.title(category) cpt=cpt+1 color_choice=color_choice+1 # calculate and plot the sum of order quantities by month total_simple = dataset.groupby('Mois').agg('sum').reset_index().sort_values(by='Month Num') subplot_total=int(str(nb_cat)+str(const)+str(cpt)) plt.subplot(subplot_total) plt.bar(total_simple['Mois'],total_simple['OrderQty'],color='#6B007B',width=0.5) plt.title('Total') plt.xlabel('Période') # label of axis x plt.xticks(rotation=35) # rotate axis x labels # visualizing the plot plt.show()
Grâce à la bibliothèque Matplotlib, une seule ligne de code est nécessaire pour spécifier les colonnes sur lesquelles vous souhaitez faire rapport pour créer ce graphique. Le reste du code permet de customizer celui-ci et le rendre plus dynamique. Cela montre à quel point Python est simple pour créer des graphiques, ce qui permet donc de créer des rapports Power BI plus avancés.
- 2e exemple
Dans l’exemple suivant, nous souhaitons afficher l’évolution des quantités commandés ainsi que les montants commandés des sous-catégories.
Les courbes réagissent bien avec le filtre « SubCategory » en n’affichant que les sous-catégories sélectionnées sur l’axe x.
Ce graphique à 2 axes y permet d’analyser la relation entre la quantité commandée et le montant commandé. Cependant, si vous n’avez besoin que de simples graphiques linéaires ou à barres, je vous suggère d’utiliser plutôt les graphiques intégrés de Power BI, faciles à configurer et à modifier, sans nécessité de code. De plus, le chargement des visuels Python prend plus de temps que les graphiques intégrés, il est donc plus logique d’allouer le temps de chargement plus long à des graphiques plus complexes que nous ne pouvons pas réaliser avec Power BI.
Le code qui permet de réaliser ce graphique est le suivant :
import matplotlib.pyplot as plt # create figure and axis objects with subplots() and defining the figure size fig,ax = plt.subplots(figsize=(10,6)) # make a plot ax.plot(dataset.SubCategory,dataset.OrderQty,color="#12239E") ax.set_ylabel("Quantité de commandes",color="#12239E",fontsize=14) # get rid of the frame for spine in plt.gca().spines.values(): spine.set_visible(False) # twin object for two different y-axis on the sample plot ax2=ax.twinx() # make a plot with different y-axis using second axis object ax2.plot(dataset.SubCategory,dataset.LineTotal,color="#D64550") ax2.set_ylabel("Montant commandé",color="#D64550",fontsize=14) fig.autofmt_xdate(rotation=45) # get rid of the frame of the twin object for spine in plt.gca().spines.values(): spine.set_visible(False) ax.grid('on') plt.rcParams["figure.dpi"] = 100 plt.show()
- 3e exemple
Dans l’exemple suivant, nous souhaitons réaliser des ventilations petits multiples par mesure et non par axe uniquement, en changeant le type de graphique par mesure.
Un histogramme pour la mesure Order Quantity, une courbe linéaire pour Line Total, et un nuage de points pour Unit Price. Les 3 graphiques ont un axe x commun qui représente les mois.
Le code :
import matplotlib.pyplot as plt # set the size of the figure figure = plt.figure(figsize=(10,6)) # subplot the figure into 3 plots and configure the 1st plot plt.subplot(311) plt.bar(dataset.Mois,dataset.OrderQty,color='r',width=0.5) # set axis x to invisible for spine in plt.gca().spines.values(): spine.set_visible(False) plt.grid('on') ax=plt.gca() ax.get_xaxis().set_visible(False) # set label for axis y plt.ylabel('Order quantity') # configure the 2nd plot plt.subplot(312) plt.plot(dataset['Mois'],dataset.LineTotal,color='b') # set axis x to invisible for spine in plt.gca().spines.values(): spine.set_visible(False) plt.grid('on') # set grid of axis x to invisible ax=plt.gca() ax.get_xaxis().set_visible(False) plt.ylabel('Line Total') # configure the 3rd plot plt.subplot(313) # set axis x to invisible for spine in plt.gca().spines.values(): spine.set_visible(False) plt.grid('on') #unit=dataset.groupby(['Mois']).UnitPrice.mean() plt.scatter(dataset['Mois'],dataset['UnitPrice'],color='g') # plot scatter for Unit Price by months plt.ylabel('Unit Price') plt.xlabel('Période',fontsize=14) figure.autofmt_xdate(rotation=35) # rotate axis x labels plt.show() # visualizing the plot
- 4e exemple
Dans ce dernier exemple, nous voulons afficher la performance en pourcentage d’un individu, sous forme d’une jauge, avec la possibilité d’afficher la valeur de l’objectif à atteindre pour l’année N ainsi que la performance de l’année N-1. Pour cet exemple, nous avons utilisé un 2 e jeu de données qui contient les données de performance d’un individu selon les années.
L’axe x présente la performance en %
Nous obtenons le résultat suivant pour l’année 2020 :
Pour 2016 :
Le code utilisé est le suivant :
import pandas as pd import matplotlib.pyplot as plt import numpy as np label='Performance' # bar label # positions of horizontal lines positions = [dataset["Objectif"],dataset["Réalisé N-1"]] line_colors = ['#E66C37','#744EC2'] # color palet line_styles = ['solid','dashed'] # style of lines # define the size of the figure fig, ax = plt.subplots(figsize=(8, 2.5)) # define the limits of x axis plt.xlim(0, 100) # change the scale of x axis plt.xticks(np.arange(0, 110, 10)) # plot the horizontal bar plt.barh(label,width=dataset["Réalisé"],height=0.8,color='#118DFF',linestyle='solid',hatch='/',linewidth=5) # get rid of the frame for spine in plt.gca().spines.values(): spine.set_visible(False) # plot the horizontal lines for i in range(2): plt.vlines(x=positions[i], ymin=-1.5, ymax=1.5, color=line_colors[i], linestyle=line_styles[i]) # plot the legend ax.legend(['Objectif','Réalisé n-1','Réalisé'],ncol=3, bbox_to_anchor=(0, 1), loc='lower left') # visualizing the plot plt.show()
NB :
la librairie NumPy est la bibliothèque Python la plus populaire de calcul numérique.
Conclusion :
Dans cet article, nous avons vu ce que Python peut faire dans Power BI à l’aide de quelques exemples simples. Python libère un grand potentiel en termes d’obtention de données et de création de graphiques personnalisés plus compliqués. Cependant, il existe certaines limitations des visuels Python. Comme nous l’avons mentionné précédemment, Python peut ralentir les performances et ne peut récupérer que 150 000 enregistrements. Je peux imaginer que cela soit problématique pour les grands projets de business intelligence.
Mais cela n’est que le début de l’exploration des faisabilités de Python dans Power BI. J’aurai peut-être d’autres idées à partager à l’avenir !