Zum Hauptinhalt springen




Zeit zu lesen: 5 Protokoll

In einem früheren Beitrag habe ich einige Verwendungsmöglichkeiten von Python als externes Tool für Power BI Desktop vorgestellt und die Hauptkonfiguration durchgearbeitet. Dieser Beitrag erweitert die Grundeinstellungen des externen Tools in Teil 2.

Es gibt zwei Ziele für diesen Beitrag:
1) Zeigen Sie, wie ein Python-Skript in einer virtuellen Umgebung ausgeführt wird
2) Stellen Sie eine Verbindung zu einer .NET-Bibliothek mit dem Namen Tabular Object Model (TOM) her, um Daten zu einem aktuell geöffneten Power BI Desktop-Datenmodell abzurufen

Ändern Sie [tool] .pbitool.json, um es in einer Python-Umgebung auszuführen

Teil 2 zeigte, wie python.exe und ein .py-Skript ausgeführt werden, das jedoch nicht in einer Umgebung ausgeführt wurde. Diese Einschränkung erlaubt grundlegende Skripte, aber komplexere Skripte verwenden Code aus anderen Modulen und Paketen.

Um das grundlegende Beispiel in Teil 2 zu erweitern, habe ich eine Beispieldatei [tool] .pbitool.json (Wesen), die zeigt, wie ein Python-Skript in einer bestimmten Umgebung ausgeführt wird.

Basisumgebung (root)

Ich benutze Anaconda, die eine hat Base C Umgebungsort: 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": ""
} 

Beachten Sie, dass Sie im Teil 2-Beispiel nichts ändern müssen, außer einige Argumente vor den Hauptwerten für Python-Skript, Server und Datenbank hinzuzufügen. Ich habe einige Zeit gebraucht, um mit einem zu arbeiten Menge Versuch und Irrtum, also aufgepasst!

Was ändert sich?

  1. Der Nukleus Straße Es ist immer noch deine python.exe
  2. Anstatt zuerst das gewünschte Skript auszuführen, definieren die Argumente cwp.py. zuerst, dann den Ort Ihrer Umgebung, dann andere python.exe (Ich habe viele Variationen ausprobiert, aber ohne diese Struktur nie richtig funktioniert).
  3. Nach dieser Sequenz werden die Argumente mit Ihrem Hauptskript und den Referenzen des externen Power BI-Tools für den Server und die Datenbank fortgesetzt.

Benannte virtuelle Umgebung

Für eine andere virtuelle Umgebung als die Basis müssen Sie die Argumente ändern, um die richtige Umgebung zu verwenden. Dadurch wird sichergestellt, dass die richtigen Pakete, die Teil dieser Umgebung sind, für die Verwendung mit Ihrem Power BI-Skript verfügbar sind.

Hier ist ein Beispiel für eine Conda-Umgebung namens PowerBI. Beachten Sie, dass der Speicherort von python.exe dies nicht tut haben Wechseln Sie in die Conda-Umgebung (obwohl Sie dies könnten), aber das Ändern des Umgebungsteils des Arguments ist kritisch.

{
  "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": ""
} 

Stellen Sie eine Verbindung zu TOM her

das Tabellarisches Objektmodell Die (TOM) -Bibliothek für .NET öffnet das Power BI-Datenmodell für externe Tools. Damit Python mit .NET interagieren kann, sind zwei Teile erforderlich:
1) Pythonnet Paket für .NET CLR (pip install pythonnet)
2) Python-SSAS Modul (ssas_api.py befindet sich im selben Ordner wie das Hauptskript, das Sie ausführen möchten)

das python-ssas (ssas_api.py) Das Python-Modul, das die TOM-Verbindung erleichtert, ist die gesamte Arbeit von Josh Dimarsky, ursprünglich zum Abfragen und Verarbeiten von Analysis Services. Ich habe es gerade für die Verwendung mit Power BI Desktop oder dem XMLA-Endpunkt in Power BI Premium umfunktioniert und um einige relevante Beispiele erweitert. Es basiert alles auf Joshs Python-Modul, das Funktionen zum Herstellen einer Verbindung mit TOM, Ausführen von DAX-Abfragen usw. bietet.

Dieses spezielle Modul ist gerecht einer mögliche Möglichkeit, .NET CLR mit Python zu verwenden. Zum Beispiel können Sie Alternativen wie ausprobieren .NetBridge um die pyDotNet Packen und codieren Sie Ihre eigene Lösung, um auf die TOM-DLL zuzugreifen. Ich habe keine Bestandsaufnahme der verschiedenen Methoden durchgeführt, um zu wissen, welche die beste oder die effizienteste ist. Das Modul ssas_api.py funktionierte jedoch direkt für das, was ich brauchte, also blieb ich dabei.

Solange Power BI Desktop installiert ist, sollten Sie die erforderlichen DLLs nicht manuell abrufen müssen. Sie könnten sie von bekommen Microsoft direkt obwohl wenn nötig.

Joshs Code in ssas_api.py Lädt Microsoft.AnalysisServices.Tabular.dll und Microsoft.AnalysisServices.AdomdClient.dll aus dem GAC.

image-8-6308357

Holen Sie sich die Metadaten des TOM Power BI-Modells

Mit den verschiedenen Voraussetzungen können Sie gegen TOM codieren. Der vollständige Code befindet sich am Ende dieses Beitrags und diese Essenz, aber die Hauptelemente in den ersten 32 Zeilen:
1) importieren Sie die ssas_api.py Modul
2) Definieren Sie eine Verbindung zum Power BI Desktop-Modell mithilfe von Server Argument übergeben, wenn auf das Symbol in Externe Tools geklickt wird (conn = "Provider = MSOLAP; Datenquelle =" + str (sys.argv [1]) + "; Initial catalog ="; ")
3) Definieren Sie eine "Dummy" -DAX-Abfrage zum Laden von .NET (dax_string = 'EVALUATE ROW ("Laden von .NET-Assemblys", 1)).
4) Führen Sie die DAX-Abfrage aus (df = powerbi.get_DAX (connection_string = conn, dax_string = dax_string).
5) Schließen Sie die TOM- und AMOMD-Importe für Python ab, sobald diese geladen und eine Verbindung zu TOM hergestellt wurden

globales System, DataTable, AMO, ADOMD-Import System aus System.Data-Import DataTable-Import Microsoft.AnalysisServices.Tabular als TOM-Import Microsoft.AnalysisServices.AdomdClient als ADOMD TOMServer = TOM.Server () TOMServer.Connect (conn) 

Sobald ich mit dem Modell verbunden bin, zeigt der Rest meines Beispiel-Python-Skripts, wie verschiedene Objekte aus den Modell-Metadaten in Pandas DataFrames geladen werden. Es soll nur ein Beispiel sein, um zu veranschaulichen, was möglich sein könnte, es kann jedoch erweitert werden, um auf Wunsch alle verfügbaren Metadaten zu dokumentieren.

image-9-2985989

In Kürze in Teil 4: Verwenden von Jupyter und Ausführen von DAX

In Teil 4 erfahren Sie, wie Sie ein Jupyter-Notebook mit den verfügbaren Power BI-Verbindungsinformationen erstellen.

Sie haben es vielleicht auch bemerkt get_DAX Funktion, die zuvor zum Laden der erforderlichen .NET-Assemblys verwendet wurde. Es ist jedoch viel leistungsfähiger als das, was hier gezeigt wird. Sie können jede DAX-Abfrage auswerten, die Sie außerhalb von Power BI Desktop manuell eingeben, kopieren und einfügen möchten Leistungsanalysatoroder kopieren und einfügen von DAX-Studie.

Wie in Teil 1 zu sehen ist, nehmen die Vorteile und einfallsreichen Szenarien der Verwendung von Python mit Power BI mit der Möglichkeit zu, DAX über Python auszuführen.

************************************************ **********************

VOLLSTÄNDIGER CODE zum PowerBITOMSample.py 
import sys import ssas_api als powerbi import pandas als pd print ("Drücken Sie die Eingabetaste, um eine Verbindung herzustellen und sagen Sie 'Hi TOM!'") input () print ('Power BI Desktop Connection') print (str (sys.argv [1])) print (str (sys.argv [2])) conn = "Provider = MSOLAP; Datenquelle =" + str (sys.argv [1]) + "; Initial Catalog = '';" print (conn) print () dax_string = 'EVALUATE ROW ("Laden von .NET-Assemblys", 1)' df = powerbi.get_DAX (connection_string = conn, dax_string = dax_string) print ("Crossing the Streams ...") globales System , DataTable, AMO, ADOMD-System aus System.Data-Import importieren DataTable-Import Microsoft.AnalysisServices.Tabular als TOM-Import Microsoft.AnalysisServices.AdomdClient als ADOMD-Druck ("Splines retikulieren ...") print () TOMServer = TOM.Server () TOMServer.Connect (conn) print ("Hi TOM ...") print () # Datenbankinformationen für Element in TOMServer.Databases: print ("Datenbank:", item.Name) print ("Kompatibilitätsstufe:", Element. CompatibilityLevel) print ("Erstellt:", item.CreatedTimestamp) DatabaseId = str (sys.argv [2]) PowerBIDatabase = TOMServer.Databases [DatabaseId] print () # Definieren Sie den Messdatenrahmen dfMeasures = pd.DataFrame (Spalten = ' ',' Name ',' Beschreibung ',' Datentyp ',' DataCategory ',' Ausdruck ',' FormatString ',' DisplayFolder ',' Implizit ',' Versteckt ',' ModifiedTime ',' Status ']) # Spalte definieren Daten frame dfColumns = pd.DataFrame (column = ['Table', 'Name']) # Tabellen drucken ("Tabellen auflisten ...") für Tabelle in PowerBIDatabase.Model.Tables: print (table.Name) # Aktuelle Tabelle zuweisen nach Namen CurrentTable = PowerBIDatabase.Model.Tables.Find (table.Name) #-Druck (Typ (CurrentTable)) #-Druck (Typ (CurrentTable.Measures)) # Maßnahmen zur Messung in CurrentTable.Measures: new_row = {'Table': table.Name, 'Name': Measure.Name, 'Description': Measure.Description, 'DataType': Measure.DataType, 'DataCategory': Measure.DataCategory, 'Expression': Measure.Expression, 'FormatString': Measure. 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) # Spalten für Spalte in 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 ()

Zahlungslinks

Als Amazon Associate verdiene ich mit qualifizierten Einkäufen.

R Marketing Digital