Dans un article précédent, j'ai présenté certaines utilisations possibles de python en tant qu'outil externe pour Power BI Desktop et je suis passé par la configuration principale. Cet article développe la configuration de base de l'outil externe de la partie 2.
Il y a deux objectifs pour ce post:
1) Montrez comment exécuter un script python dans un environnement virtuel
2) Connectez-vous à une bibliothèque .NET appelée Tabular Object Model (TOM) pour obtenir des données sur un modèle de données Power BI Desktop actuellement ouvert
Modifiez [tool] .pbitool.json pour qu'il s'exécute dans un environnement python
La parte 2 mostró cómo ejecutar python.exe y ejecutar un script .py, pero no se ejecutó en un entorno. Esta limitación permite scripts básicos, pero los scripts más complejos usan código de otros módulos y paquetes.
Pour étendre l'exemple de base de la partie 2, j'ai créé un exemple de fichier [tool] .pbitool.json (essence) qui montre comment exécuter un script python dans un environnement donné.
Environnement de base (racine)
J'utilise Anaconda, qui a un base Emplacement de l'environnement C: ProgramData Anaconda3.
{
"version": "1.0",
"name": "PyTOM",
"description": "Use python with Tabular Object Model",
"path": "C:ProgramDataAnaconda3python.exe",
"arguments": "C:/ProgramData/Anaconda3/cwp.py C:/ProgramData/Anaconda3 C:ProgramDataAnaconda3python.exe C:/[PATH TO PYTHON SCRIPT].py "%server%" "%database%"",
"iconData": ""
}
Tenga en cuenta que no es necesario cambiar nada con respecto al ejemplo de la Parte 2, excepto por la adición de algunos argumentos antes del script principal de python, el serveur y los valores de la base de datos. Esto me tomó algo de tiempo para trabajar con un parcelle essais et erreurs, alors faites attention!
Quels changements?
- Le noyau route c'est toujours votre python.exe
- Au lieu d'exécuter d'abord le script souhaité, les arguments définissent cwp.py d'abord, puis l'emplacement de votre environnement, puis autre python.exe (j'ai essayé de nombreuses variantes mais je ne l'ai jamais fait fonctionner correctement sans cette structure).
- Après cette séquence, les arguments continuent avec votre script principal et les références des outils Power BI externes pour le serveur et la base de données.
Environnement virtuel nommé
Pour un environnement virtuel autre que la base, vous devez modifier les arguments pour utiliser l'environnement correct. Cela garantit que les packages appropriés qui font partie de cet environnement sont disponibles pour être utilisés avec votre script Power BI.
Voici un exemple d'environnement conda appelé PowerBI. Notez que l'emplacement de python.exe ne pour avoir basculez vers l'environnement conda (bien que vous puissiez), mais il est essentiel de modifier la partie environnement de l'argument.
{
"version": "1.0",
"name": "PyTOM",
"description": "Use python with Tabular Object Model",
"path": "C:ProgramDataAnaconda3python.exe",
"arguments": "C:/ProgramData/Anaconda3/cwp.py C:/Users/DavidEldersveld/.conda/envs/PowerBI C:ProgramDataAnaconda3python.exe C:/[PATH TO PYTHON SCRIPT].py "%server%" "%database%"",
"iconData": ""
}
Connectez-vous à TOM
Les Modèle d'objet tabulaire La bibliothèque (TOM) pour .NET ouvre le modèle de données Power BI aux outils externes. Deux éléments sont nécessaires pour permettre à python d'interagir avec .NET:
1) Pythonnet package pour .NET CLR (pip install pythonnet)
2) python-SSAS module (ssas_api.py situé dans le même dossier que le script principal que vous souhaitez exécuter)
Les python-ssas (ssas_api.py) Le module python qui facilite la connexion TOM est tout le travail de Josh Dimarsky, à l'origine pour l'interrogation et le traitement d'Analysis Services. Je viens de le réutiliser pour une utilisation avec Power BI Desktop ou le point de terminaison XMLA dans Power BI Premium et je l'ai étendu avec quelques exemples pertinents. Tout est basé sur le module python de Josh, qui a des fonctions pour se connecter à TOM, exécuter des requêtes DAX, etc.
Ce module particulier est juste une manière possible d'utiliser .NET CLR avec python. Par exemple, vous pouvez essayer des alternatives comme .NetBridge pour exécuter le pyDotNet Packagez et codez votre propre solution pour accéder à la DLL TOM. Je n'ai pas fait un inventaire des différentes méthodes disponibles pour savoir laquelle est la meilleure ou la plus efficace. Cependant, le module ssas_api.py fonctionnait directement pour ce dont j'avais besoin, donc je suis resté avec lui.
Tant que Power BI Desktop est installé, vous ne devriez pas avoir à obtenir manuellement les DLL requises. Vous pourriez les obtenir de Microsoft directement bien que si nécessaire.
Le code de Josh dans ssas_api.py charge Microsoft.AnalysisServices.Tabular.dll et Microsoft.AnalysisServices.AdomdClient.dll à partir du GAC.


Obtenir métadonnées del modelo de Power BI de TOM
Une fois les différentes conditions préalables en place, vous pouvez coder par rapport à TOM. Le code complet est à la fin de cet article et cette essence, mais les principaux éléments des 32 premières lignes:
1) importer le ssas_api.py module
2) définir une connexion au modèle Power BI Desktop à l'aide du serveur argument passé en cliquant sur l'icône dans les outils externes (conn = "Provider = MSOLAP; Data source =" + str (sys.argv [1]) + "; Initial catalog ="; ")
3) définir une requête DAX "factice" pour aider à charger .NET (dax_string = 'EVALUATE ROW ("Loading .NET assemblies", 1)'
4) exécutez la requête DAX (df = powerbi.get_DAX (connection_string = conn, dax_string = dax_string)
5) Terminez les importations TOM et AMOMD pour python une fois qu'ils se chargent et se connectent à TOM
Global System, DataTable, AMO, ADOMD import System from System.Data import DataTable import Microsoft.AnalysisServices.Tabular as TOM import Microsoft.AnalysisServices.AdomdClient as ADOMD TOMServer = TOM.Server () TOMServer.Connect (conn)
Une fois connecté au modèle, le reste de mon exemple de script python montre comment charger divers objets à partir des métadonnées du modèle dans pandas DataFrames. Il est uniquement destiné à être un exemple pour illustrer ce qui pourrait être possible, mais pourrait être développé pour documenter toutes les métadonnées disponibles si vous le souhaitez.

Bientôt dans la partie 4: utilisation de Jupyter et exécution de DAX
Dans la partie 4, vous verrez comment créer un notebook Jupyter avec les informations de connexion Power BI disponibles.
Vous avez peut-être aussi remarqué get_DAX fonction précédemment utilisée pour aider à charger les assemblys .NET requis. Cependant, il est beaucoup plus puissant que ce qui est montré ici. Vous pouvez évaluer toute requête DAX que vous souhaitez taper, copier et coller manuellement en dehors de Power BI Desktop Analyseur de performancesou copier et coller depuis Etude DAX.
Comme vu dans la partie 1, les avantages et les scénarios imaginatifs de l'utilisation de python avec Power BI commencent à augmenter avec la possibilité d'exécuter DAX à partir de python.
************************************************ **********************
CODE COMPLET pour PowerBITOMSample.py
import sys import ssas_api en tant que powerbi importer des pandas en tant que pd print ("Appuyez sur Entrée pour vous connecter et dites 'Salut TOM!'") input () print ('Power BI Desktop Connection') print (str (sys.argv [1])) print (str (sys.argv [2])) conn = "Fournisseur = MSOLAP; Source de données =" + str (sys.argv [1]) + "; Catalogue initial = '';" print (conn) print () dax_string = 'EVALUATE ROW ("Chargement des assemblys .NET", 1)' df = powerbi.get_DAX (connection_string = conn, dax_string = dax_string) print ("Crossing the streams ...") global System , DataTable, AMO, ADOMD import System from System.Data import DataTable import Microsoft.AnalysisServices.Tabular as TOM import Microsoft.AnalysisServices.AdomdClient as ADOMD print ("Reticulating splines ...") print () TOMServer = TOM.Server () TOMServer.Connect (conn) print ("Salut TOM ...") print () # Informations de base de données pour l'élément dans TOMServer.Databases: print ("Database:", item.Name) print ("Compatibility Level:", item. CompatibilityLevel) print ("Created:", item.CreatedTimestamp) DatabaseId = str (sys.argv [2]) PowerBIDatabase = TOMServer.Databases [DatabaseId] print () # Définir la trame de données de mesure dfMeasures = pd.DataFrame (colonnes = ['Table ',' Name ',' Description ',' DataType ',' DataCategory ',' Expression ',' FormatString ',' DisplayFolder ',' Implicit ',' Hidden ',' ModifiedTime ',' State ']) # Définir la colonne Les données frame dfColumns = pd.DataFrame (columns = ['Table', 'Name']) # Tables print ("Liste des tables ...") pour table dans PowerBIDatabase.Model.Tables: print (table.Name) # Attribuer la table courante par nom CurrentTable = PowerBIDatabase.Model.Tables.Find (table.Name) # print (type (CurrentTable)) # print (type (CurrentTable.Measures)) # Mesures pour mesure dans CurrentTable.Measures: new_row = {'Table': table.Name, 'Nom': mesure.Nom, 'Description': mesure.Description, 'DataType': mesure.DataType, 'DataCategory': mesure.DataCategory, 'Expression': mesure.Expression, 'FormatString': mesure. FormatString, 'DisplayFolder': measure.DisplayFolder, 'Implicit': measure.IsSimpleMeasure, 'Hidden': measure.IsHidden, 'ModifiedTime': measure.ModifiedTime, 'State': measure.State} #print (new_row) dfMeasures = dfMeasures. append (new_row, ignore_index = True) # Colonnes pour colonne dans CurrentTable.Columns: new_row = {'Table': table.Name, 'Name': column.Name} #print (column.Name) dfColumns = dfColumns.append ( new_row, ignore_index = True) print (dfMeasures) print (dfColumns) input ()
Liens de paiement
Como Asociado de Amazone, Je gagne de l'argent sur les achats éligibles.