2019-08-05

Python dans Power BI, pourquoi faire ?

L'ajout du visuel Python dans Power BI date de quelques mois déjà... Je vous propose un cas concret justifiant d'y passer quelques heures.

On peut effectivement se poser la question de la pertinence de ces visuels tant les possibilités en termes de traitement (Power Query) et restitution ont drastiquement évolué sur les dernières versions de Power BI. Alors je vous propose un cas concret pour résoudre en quelques heures une problématique qui nécessiterait autrement le développement d'un visuel spécifique.

La problématique


Il est facile de créer un histogramme dont la couleur des barres est soumise à un affichage conditionnel. C'est en revanche impossible à partir du moment où plusieurs séries sont présentes.

La solution

Dans ce cas, l'utilisation du visuel Python permet d'obtenir le résultat attendu :

Préalablement, il est bien entendu indispensable d'avoir installé Python et d'activer les scripts dans les options. Pour déployer matplotlib :
pip install -U matplotlib
Une fois l'environnement prêt, il est temps de configurer le visuel.
Importer le module :
from pylab import *
Créer la fonction permettant de déterminer la couleur de la barre d'histogramme :
def getcolor(data, typecode, mini, maxi):
if typecode == "c":
return (0.9 * ((maxi - data)/(maxi - mini)), 0.8, 0.3 * ((maxi - data)/(maxi - mini)))
elif typecode == "d":
return (0.75 * ((maxi - data)/(maxi - mini)), 0.75 * ((maxi - data)/(maxi - mini)), 0.8)
else:
return (0.8, 0.75 * ((maxi - data)/(maxi - mini)), 0.75 * ((maxi - data)/(maxi - mini)))

 

Gérer les données. Première série, avec affectation de la couleur via la fonction :
groupedSet = dataset.where(dataset.Yogurt == "Chobani Total").groupby("Date").Prix.sum()
colorSet = [getcolor(data, "c", groupedSet.min(), groupedSet.max()) for data in groupedSet]
plt.bar(groupedSet.index, groupedSet, color = colorSet)


Seconde série, avec l'attribut bottom permettant de gérer l'empilement :
groupedSetAlt = dataset.where(dataset.Yogurt == "Danone Total").groupby("Date").Prix.sum()
colorSet = [getcolor(data, "d", groupedSetAlt.min(), groupedSetAlt.max()) for data in groupedSetAlt]
plt.bar(groupedSetAlt.index, groupedSetAlt, color = colorSet, bottom = groupedSet)


Gestion de l'axe des abscisses :
plt.xticks(groupedSet.index[::4], [i[0:4]+"-"+i[5:7]+"-"+i[8:10] for i in groupedSet.index[::4]])
 

Et affichage :
plt.show()
Et voilà !

J'ai évidemment simplifié mon code pour ne gérer que ces 2 séries avec un filtrage "en dur", libre à vous d'imbriquer une boucle pour traiter un nombre variable de séries...

Aucun commentaire: