🎯 Situation
Un analyste data est venu me voir après une réunion d'équipe où quelqu'un avait proposé "d'ajouter Python à Power BI" pour résoudre un rapport lent. Le rapport avait 40 colonnes importées depuis des tables brutes, pas de star schema, et des mesures DAX qui itéraient sur 2 millions de lignes. Le problème venait du modèle de données — pas d'une opportunité Python.
Mais la semaine d'avant, une autre analyste m'avait demandé pourquoi son modèle de prévision ne fonctionnait pas dans Power BI. Elle essayait d'utiliser DAX pour implémenter un lissage exponentiel sur des périodes de temps. DAX est le mauvais outil pour ça. Python est exactement le bon.
Voici comment faire la différence.
⚠️ Comment Python fonctionne dans Power BI
Power BI supporte Python à deux endroits — et ils servent des objectifs très différents :
🔌 Python dans Power Query (préparation des données)
- S'exécute lors de l'actualisation du dataset
- Reçoit un DataFrame pandas, retourne un DataFrame
- Utilisé pour : nettoyage complexe, appels API, transformations ML
- Nécessite Python installé sur la machine d'actualisation ou la passerelle
- L'output alimente le modèle Power BI comme n'importe quelle requête
📊 Visuels Python (rendu)
- S'exécute lors du rendu du visuel dans le rapport
- Reçoit le dataset filtré sous forme de DataFrame
- Utilisé pour : graphiques personnalisés, superpositions statistiques, outputs de modèles ML
- L'output est une image statique — pas d'interactivité native
- Plus lent que les visuels natifs — à utiliser avec parcimonie
Comprendre dans quelle couche on travaille change complètement la décision. Python dans Power Query s'exécute au moment de l'actualisation et façonne le modèle de données. Les visuels Python s'exécutent au moment du rendu et façonnent ce que voient les utilisateurs.
✓️ 3 cas où Python est le bon outil
1. Prévisions statistiques et modèles ML
DAX peut faire des moyennes mobiles et de la time intelligence basique. Il ne peut pas faire de lissage exponentiel, d'ARIMA, ou de prédictions scikit-learn. Si tu as besoin d'une colonne de prévision — générée par un modèle entraîné — Python dans Power Query est le bon endroit pour l'exécuter.
2. Visualisations personnalisées non disponibles nativement
La bibliothèque de visuels Power BI est grande. Mais si tu as besoin d'un type de graphique spécifique — un violin plot, un diagramme de Sankey, une heatmap personnalisée avec une logique de couleurs spécifique — et que le marketplace ne l'a pas ou que la version disponible ne convient pas, un visuel Python avec matplotlib ou seaborn te donne un contrôle total. Voici un exemple qui met en rouge les marges sous le seuil :
# Python visual in Power BI — anomaly highlighting
# Runs inside Power BI Desktop (requires Python + matplotlib installed)
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import pandas as pd
# 'dataset' is the Power BI dataframe passed automatically
df = dataset.copy()
df['color'] = df['margin_pct'].apply(
lambda x: '#e53e3e' if x < 0.10 else '#38a169'
)
fig, ax = plt.subplots(figsize=(10, 4))
ax.bar(df['customer_name'], df['margin_pct'] * 100, color=df['color'])
ax.axhline(y=10, color='gray', linestyle='--', linewidth=1, label='10% threshold')
ax.set_ylabel('Margin %')
ax.set_title('Customer Margin — Below 10% flagged in red')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()
3. Traitement de texte complexe ou NLP
Si ton dataset contient des champs de texte libre — commentaires clients, descriptions de tickets support, avis produits — et que tu dois extraire du sentiment, regrouper des sujets, ou nettoyer des entrées incohérentes à grande échelle, les bibliothèques NLP de Python (spaCy, NLTK, transformers) font en 10 lignes ce que Power Query ne peut tout simplement pas faire.
❌ 4 cas où Python est overkill
- Consolidation de données et nettoyage basique — si tu joins des tables, renommes des colonnes, filtres des lignes ou supprimes des doublons, Power Query gère ça nativement et efficacement. Remplacer du code M par un script Python ajoute une dépendance (Python installé sur chaque machine d'actualisation) sans gain de performance.
- Agrégations et calculs de KPIs — SUM, AVERAGE, COUNTROWS avec filtres est le cœur de DAX. Écrire une agrégation pandas pour faire ce que
CALCULATE(SUM(...), ...)fait nativement est plus lent à l'actualisation et plus difficile à maintenir. - Problèmes de performance dans des rapports lents — si ton rapport est lent, la cause est presque toujours le modèle de données ou les patterns DAX (comme on l'a vu dans l'article sur les erreurs DAX). Ajouter Python à un dataset mal modélisé le rend plus lent, pas plus rapide.
- Graphiques standard avec des couleurs personnalisées — tu n'as pas besoin de matplotlib pour changer la couleur des barres. La mise en forme conditionnelle native de Power BI gère ça en quelques secondes au lieu de quelques secondes pour le rendu d'un visuel Python.
💡 Synthèse
Python dans Power BI est un vrai superpouvoir — pour un ensemble spécifique de problèmes. Le cadre de décision est simple :
- La tâche nécessite-t-elle une bibliothèque Python ? (scikit-learn, spaCy, statsmodels, matplotlib pour des graphiques personnalisés) → Python est probablement le bon choix
- Est-ce que Power Query ou DAX peut le faire nativement ? → Utilise l'outil natif. C'est plus rapide, ça ne nécessite pas de dépendances externes, et tout développeur Power BI le connaît déjà.
- Le problème est-il un rapport lent ou un problème de modélisation ? → Règle le modèle en premier. Python n'aidera pas.
- Le visuel Python est-il interactif ? → Note que les visuels Python sont des images statiques. Si tu as besoin de cross-filtrage et de drill-through, un visuel natif ou R peut mieux convenir.
Les meilleurs développeurs Power BI connaissent les deux outils — et savent lequel utiliser en premier. Python étend ce qui est possible dans Power BI. Il ne remplace pas les fondamentaux.
👉 Python dans Power BI n'est pas un correctif de performance. C'est une extension de capacités.
Utilise-le pour ce que seul Python peut faire — et fais confiance à DAX pour tout le reste.