Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
W skrócieWizualizacja Python albo R w Power BI to wykres rysowany skryptem na kolumnach z modelu, który Power BI pokazuje na kanwie obok wbudowanych wykresów. Konfigurujemy interpreter Pythona i R w Power BI Desktop, budujemy wykres seaborn i ggplot2 na danych Nordvelli i uczymy się szukać przyczyny błędu skryptu.
Lekcja 13 z 28 bezpłatnego kursu Power BI, od pierwszego raportu do Fabric i Copilota, na jednym zestawie danych sieci Nordvella.
<-- Spis wszystkich lekcjiWbudowane wykresy Power BI wystarczają w większości raportów Nordvelli, ale prędzej czy później trafisz na potrzebę, której standardowa galeria nie zaspokoi: rozkład wartości koszyka z nałożoną krzywą gęstości, mapa cieplna korelacji ocen z ankiet satysfakcji, czy wykres skrzynkowy (box plot, wykres pokazujący medianę i rozrzut) marży w rozbiciu na kategorie. W takich momentach Power BI pozwala oddać stronę raportu skryptowi w Pythonie albo w R. Ty wybierasz kolumny z modelu, skrypt rysuje wykres w bibliotece seaborn lub ggplot2, a Power BI renderuje gotowy obraz na kanwie raportu, obok wykresów natywnych.
W tym rozdziale przejdziemy przez to na danych Nordvelli krok po kroku: najpierw skonfigurujemy interpreter (program uruchamiający kod) w Opcjach, potem zbudujemy realny wykres seaborn na tabeli FaktSprzedaz, dołożymy do tej tabeli kolumny wyliczone skryptem w Power Query, zrobimy wykres w R przez ggplot2, a na koniec zobaczymy, jak wygląda błąd skryptu i gdzie szukać jego przyczyny.
Z tej lekcji dowiesz się:
Pliki do tej lekcji
Plik startowy: stan z końca lekcji 12 (motyw Nordvella Branding i strona Dashboard). Od niego zaczynasz krok 1.
Pobierz nordvella_12_motyw.pbix
Gotowy efekt: plik w stanie z końca tej lekcji: strona Python i R z wizualizacją Pythona, wizualizacją R i fragmentatorem miasta oraz tabela FaktSprzedaz z kolumnami Sezon i CzyAnomalia z kroku skryptu Pythona w Power Query.
Pobierz nordvella_13_python_r.pbix
Skrypty z lekcji: ten sam kod co w ramkach poniżej, w plikach gotowych do otwarcia w edytorze.
Pobierz 13_seaborn_wizual.pyPobierz 13_powerquery_sezon_anomalie.pyPobierz 13_ggplot_korelacja.RPobierz 13_ggplot_hex.R
Dane źródłowe:
Nordvella_
Co chcemy osiągnąć. Dział sprzedaży Nordvelli chce wiedzieć, jak rozkłada się wartość pojedynczej transakcji w każdej kategorii, a do takiego pytania pasuje wykres pudełkowy, którego w standardowym zestawie Power BI nie ma. Zanim sięgniemy po Pythona albo R, chcemy umieć rozpoznać, kiedy skrypt jest naprawdę potrzebny, a kiedy natywny wykres zrobi to lepiej.
Zanim uruchomisz interpreter, zadaj sobie jedno pytanie: czy natywny wykres Power BI naprawdę nie potrafi tego pokazać. W Nordvelli odpowiedź brzmi "nie" znacznie rzadziej, niż się wydaje. Sprzedaż według miast, trend, udział kategorii, mapa sklepów: to wszystko robisz natywnie i lepiej, bo natywne wizualizacje są interaktywne. Sprawdź to od razu na pliku startowym.
Otwórz nordvella_
Na pasku stron na dole okna kliknij kartę Przegląd (strona z lekcji 11), a potem na Wykresie miast kliknij najdłuższy słupek, Warszawa.
Kliknij słupek Warszawy jeszcze raz, żeby zdjąć zaznaczenie. Wykres ze skryptu w Pythonie lub R tej interaktywności nie ma. Wynik jest obrazem PNG: nie da się kliknąć w punkt, żeby przefiltrować resztę strony. To cena za dostęp do bibliotek statystycznych. Płać ją tylko wtedy, gdy dostajesz w zamian coś, czego natywnie nie masz.
| Potrzeba w Nordvelli | Czym zrobić |
|---|---|
| Sprzedaż według miast, trend, udział kategorii, mapa sklepów | Natywny wykres (interaktywny, filtruje stronę) |
| Histogram wartości transakcji z krzywą gęstości | Python (seaborn) lub R |
| Wykres pudełkowy wartości transakcji w czterech kategoriach produktów | Python (seaborn) lub R (ggplot2) |
| Mapa cieplna korelacji ocen z FaktSatysfakcja | Python (seaborn, heatmap) |
| Linia regresji marży względem wartości transakcji z przedziałem ufności | R (ggplot2, geom_smooth) |
Wskazówka: wykres skryptowy trzymaj na osobnej stronie analitycznej, a nie na głównym dashboardzie. Odbiorca dashboardu chce klikać i filtrować, a na stronie analitycznej liczy się głębia.
Co chcemy osiągnąć. Power BI nie ma wbudowanego Pythona, a bez niego żaden skrypt w raporcie Nordvelli się nie uruchomi. Chcemy zainstalować Pythona z potrzebnymi bibliotekami i wskazać go w opcjach Power BI.
Power BI nie ma wbudowanego Pythona. Instalujesz go sam, a Power BI korzysta z niego przy każdym rysowaniu wizualizacji i przy każdym odświeżeniu zapytania ze skryptem.
Pobierz instalator ze strony python.org (Downloads, Windows) i uruchom go. Na pierwszym ekranie zaznacz pole Add python.exe to PATH, a potem kliknij Install Now. Instalator wrzuci Pythona do C:\Users\TwojaNazwa\AppData\Local\Programs\Python\Python314. Na naszym komputerze Python jest zainstalowany dla wszystkich użytkowników (opcja Customize installation, Install Python 3.14 for all users), dlatego leży w C:\Program Files\Python314. Power BI wykrywa oba miejsca. Alternatywą jest dystrybucja Anaconda, która ma pandas, matplotlib i seaborn od razu.
Po instalacji otwórz Wiersz polecenia (menu Start, wpisz cmd) i wpisz komendę, która dociągnie biblioteki używane w tym rozdziale:
python -m pip install pandas matplotlib seabornPakiety, które już masz, pip oznaczy linią Requirement already satisfied, a doinstalowane wypisze w ostatniej linii Successfully installed. U nas pandas (3.0.6) i matplotlib (3.11.2) były już na maszynie, więc pip doinstalował tylko seaborn (0.13.2).
W Power BI Desktop wybierz Plik, Opcje i ustawienia, Opcje. W lewej kolumnie okna, w grupie GLOBALNE, kliknij Wykonywanie skryptów w języku Python. Po prawej zobaczysz sekcję Opcje skryptów w języku Python z listą Wykryte katalogi główne języka Python. Jeśli Power BI znalazł Twoją instalację, jest na liście, wystarczy ją zostawić. Jeśli nie, wybierz z listy Inna i wskaż katalog Pythona przyciskiem Przeglądaj. Pole Wykryte środowiska IDE języka Python możesz zostawić bez zmian, do tej lekcji wystarczy edytor wbudowany w Power BI. Kliknij OK.
Pułapka: jeśli masz kilka instalacji Pythona (na przykład Anacondę i osobny python.org), Power BI wykryje je wszystkie, a biblioteki masz tylko w jednej. Wskaż dokładnie ten katalog, w którym uruchamiałeś pip install. Zły katalog to najczęstsza przyczyna błędu No module named 'seaborn'.
Co chcemy osiągnąć. W tej sekcji wstawimy pierwszy element wizualny Pythona, przekażemy mu trzy pola z modelu i sprawdzimy, w jakiej postaci trafiają do skryptu: jako ramka danych pandas o nazwie dataset. Na tym samym elemencie w następnej sekcji narysujemy wykres seaborn, a fragmentator miast pokaże, czy wykres reaguje na filtry raportu.
Wizualizacje skryptowe postawimy na osobnej stronie. Kliknij + na końcu paska stron. Power BI doda pustą stronę. Kliknij dwukrotnie jej nazwę, wpisz Python i R i naciśnij Enter.
Fragmentator przyda się za chwilę, żeby sprawdzić, czy wykres Pythona reaguje na filtry. Kliknij puste płótno, w panelu Wizualizacje kliknij ikonę Fragmentator, a w panelu Dane rozwiń tabelę DimSklepy i zaznacz haczykiem Miasto. Przy zaznaczonym fragmentatorze kliknij ikonę pędzla Formatuj element wizualny, kartę Ogólne i rozwiń Właściwości. W sekcji Pozycja wpisz Pozioma 1560 i Pionowa 30, w sekcji Rozmiar Wysokość 500 i Szerokość 330. Każdą liczbę zatwierdź Enterem.
Kliknij puste miejsce na płótnie, a w panelu Wizualizacje kliknij ikonę z napisem Py (podpowiedź: Wizualizacja języka Python). Przy pierwszym elemencie skryptowym Power BI pokaże okno Włącz elementy wizualne skryptu z ostrzeżeniem, że wizualizacje skryptów mogą wykonywać kod, który może stanowić zagrożenie dla bezpieczeństwa lub prywatności. Kliknij Włącz.
Na płótnie jest mały, pusty element z logo Pythona, a dolną połowę okna zajmuje Edytor skryptów języka Python z napisem Przeciągnij pola do obszaru Wartości w okienku Wizualizacja, aby zacząć tworzyć skrypt.. W panelu Wizualizacje pojawił się obszar Wartości.
Przy zaznaczonym elemencie Python rozwiń w panelu Dane tabelę FaktSprzedaz i przeciągnij kolumnę WartoscBrutto na napis Dodaj pola danych tutaj w obszarze Wartości. W edytorze od razu pojawi się kilka linii komentarza wygenerowanych przez Power BI, a nad nimi zielony pasek Zduplikowane wiersze zostaną usunięte z danych..
Teraz z tabeli DimProdukty przeciągnij kolumnę Kategoria, a z FaktSprzedaz kolumnę SprzedazID. Upuszczaj każde pole tuż pod ostatnim polem w obszarze Wartości. Preambuła ma teraz trzy kolumny:
# Następujący kod służący do tworzenia ramki danych i usuwania zduplikowanych wierszy jest zawsze wykonywany i działa jako preambuła skryptu:
# dataset = pandas.DataFrame(WartoscBrutto, Kategoria, SprzedazID)
# dataset = dataset.drop_duplicates()
# W tym miejscu wklej lub wpisz kod skryptu:
Przeczytaj pierwszą linię komentarza: kod tworzący ramkę i usuwający duplikaty jest zawsze wykonywany. Linie z # są tylko informacją, ich zakomentowanie ani usunięcie niczego nie zmienia. Dwie transakcje Nordvelli z tą samą wartością i kategorią to dwie osobne sprzedaże, a Power BI zostawiłby z nich jedną. Na samych polach WartoscBrutto i Kategoria do skryptu trafiłoby 100 790 wierszy zamiast 108 675. Dlatego dodaliśmy SprzedazID: każda transakcja ma inny numer, więc żaden wiersz nie jest duplikatem.
Zobacz też: Szkolenie Power BI - Desktop, DAX i Online + Copilot
Power BI grupuje dane wizualizacji po polach tekstowych, a pola liczbowe sumuje. Przy obecnych ustawieniach skrypt dostałby cztery wiersze, po jednym na kategorię, z sumą wartości i liczbą transakcji. Histogram z czterech liczb nie ma sensu. W obszarze Wartości kliknij strzałkę w dół przy polu Suma elementów WartoscBrutto i wybierz Nie sumuj.
To samo zrób przy polu Liczba elementów SprzedazID: strzałka w dół, Nie sumuj. W obszarze zostają trzy pola bez przedrostków.
Ramka danych (po angielsku DataFrame, tabela z nazwanymi kolumnami z biblioteki pandas) o nazwie dataset zawiera tylko kolumny z sekcji Wartości i tylko wiersze, które przechodzą przez filtry strony. Jeśli we fragmentatorze wybierzesz Kraków, skrypt dostanie tylko krakowskie transakcje. Tak wyglądają pierwsze wiersze naszej ramki (kolejność kolumn jak w obszarze):
| WartoscBrutto | Kategoria | SprzedazID |
|---|---|---|
| 7 624,13 | Komputery | 1 |
| 8 250,29 | Komputery | 2 |
| 9 139,98 | Telefony | 3 |
| 11 604,85 | Telefony | 4 |
| 3 810,76 | AGD/RTV | 5 |
Co chcemy osiągnąć. Chcemy dać działowi sprzedaży Nordvelli wykres, którego Power BI nie narysuje natywnie: rozkład wartości transakcji z porównaniem kategorii, i sprawdzić, czy reaguje na fragmentator miasta tak jak zwykła wizualizacja.
Wykres odpowie na pytanie działu sprzedaży: jak rozkłada się wartość pojedynczej transakcji i czy różni się między kategoriami. Złożymy go z dwóch paneli: histogramu wartości transakcji i wykresu pudełkowego (box plot, wykres pokazujący medianę i rozrzut) wartości w podziale na kategorie.
Kliknij w edytorze pod ostatnią linią preambuły i wklej kod z ramki poniżej (jest też w pliku 13_
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="whitegrid")
fig, axes = plt.subplots(1, 2, figsize=(11, 4.5))
# Panel 1: rozkład wartości pojedynczej transakcji
sns.histplot(
data=dataset, x="WartoscBrutto",
bins=50, kde=True, color="#E02D33", ax=axes[0]
)
axes[0].set_title("Rozkład wartości transakcji (Nordvella)")
axes[0].set_xlabel("Wartość brutto (PLN)")
axes[0].set_ylabel("Liczba transakcji")
# Panel 2: wykres pudełkowy wartości per kategoria produktu
sns.boxplot(
data=dataset, x="Kategoria", y="WartoscBrutto",
hue="Kategoria", palette="Reds", legend=False, ax=axes[1]
)
axes[1].set_title("Wartość transakcji wg kategorii")
axes[1].set_xlabel("Kategoria")
axes[1].set_ylabel("Wartość brutto (PLN)")
axes[1].tick_params(axis="x", rotation=30)
plt.tight_layout()
plt.show()Power BI przekaże dataset do Pythona, wykona kod i wstawi to, co narysował matplotlib, jako obraz. Element na płótnie jest jednak tak mały, że wykres jest nieczytelny.
Przy zaznaczonym elemencie Python kliknij ikonę pędzla Formatuj element wizualny, kartę Ogólne, rozwiń Właściwości i wpisz w sekcji Pozycja: Pozioma 30, Pionowa 30, a w sekcji Rozmiar: Wysokość 500, Szerokość 1500. Każdą liczbę zatwierdź Enterem. Najpierw pozycja, potem rozmiar, bo Power BI przycina szerokość do krawędzi strony liczonej od bieżącego położenia.
Kliknij strzałkę w dół na prawym końcu paska Edytor skryptów języka Python, żeby zwinąć edytor, a potem kliknij puste miejsce strony. Płótno wraca do pełnej wysokości i wykres da się przeczytać.
Kliknij Gdańsk we fragmentatorze Miasto. Power BI uruchomi skrypt od nowa na samych gdańskich transakcjach: najwyższy słupek histogramu spada do około 1 700, a kształt rozkładu zostaje ten sam. Kliknij Gdańsk jeszcze raz, żeby zdjąć zaznaczenie.
Najedź myszą na wykres Pythona i kliknij ikonę Tryb koncentracji uwagi w prawym górnym rogu ramki. Wizualizacja zajmie całe płótno. Wróć przyciskiem Powrót do raportu w lewym górnym rogu.
Histogram po lewej pokazuje, że większość transakcji Nordvelli jest niska: najliczniejszy przedział, od około 2 700 do 4 000 zł, ma 28 624 transakcje. Linia gęstości (KDE, wygładzona krzywa pokazująca, gdzie danych jest najwięcej) potwierdza, że rozkład jest prawoskośny: ma długi ogon w stronę wysokich kwot, aż do 62 676 zł. Wykres pudełkowy pokazuje to, czego histogram nie pokaże. Pudełko to zakres od pierwszego do trzeciego kwartyla, kreska w środku to mediana, a kropki to transakcje odstające. Mediana Akcesoriów to 1 102 zł, Komputerów 3 552 zł, AGD/RTV 3 965 zł, a Telefonów 5 554 zł. Telefony mają najwyżej położone pudełko i najdroższą transakcję w danych.
Wskazówka: ten sam wykres zrobisz dla marży. Przeciągnij MarzaNetto do sekcji Wartości, przestaw na Nie sumuj i w kodzie wykresu pudełkowego zamień y="WartoscBrutto" na y="MarzaNetto".
Co chcemy osiągnąć. Analityk Nordvelli chce przy każdej transakcji widzieć porę roku i znacznik, czy kwota mocno odstaje od typowych. Chcemy dodać te dwie kolumny skryptem Pythona w Power Query, zanim dane trafią do modelu.
Python w Power BI ma drugie oblicze: skrypt w Power Query, który nie rysuje, tylko przekształca tabelę, zanim trafi do modelu. Dołożymy do FaktSprzedaz dwie kolumny: Sezon z porą roku i CzyAnomalia z flagą transakcji odstających według reguły trzech sigm (wartość dalej niż trzy odchylenia standardowe od średniej).
Na karcie Narzędzia główne kliknij strzałkę pod przyciskiem Przekształć dane i wybierz Przekształć dane.
W oknie edytora kliknij FaktSprzedaz na liście zapytań po lewej, a potem kartę Przekształć na wstążce. Po prawej stronie wstążki jest grupa Skrypty z dwoma przyciskami: Uruchom skrypt języka R i Uruchom skrypt języka Python. Zapytanie ma na razie cztery kroki: Źródło, Nawigacja, Nagłówki o podwyższonym poziomie i Zmieniono typ.
Kliknij Uruchom skrypt języka Python. W oknie Uruchom skrypt języka Python pole Skrypt ma już linię # Element 'dataset' zawiera dane wejściowe dla skryptu. Kliknij pod nią i wklej kod z ramki (jest też w pliku 13_
import pandas as pd
# dataset = tabela FaktSprzedaz przekazana z Power Query
df = dataset.copy()
# Wyliczenie sezonu z klucza daty (DataID w formacie RRRRMMDD)
miesiac = df["DataID"].astype(str).str[4:6].astype(int)
mapa_sezonow = {
12: "Zima", 1: "Zima", 2: "Zima",
3: "Wiosna", 4: "Wiosna", 5: "Wiosna",
6: "Lato", 7: "Lato", 8: "Lato",
9: "Jesień", 10: "Jesień", 11: "Jesień",
}
df["Sezon"] = miesiac.map(mapa_sezonow)
# Oznaczenie transakcji odstających (reguła trzech sigm)
srednia = df["WartoscBrutto"].mean()
odchylenie = df["WartoscBrutto"].std()
df["CzyAnomalia"] = (
(df["WartoscBrutto"] - srednia).abs() > 3 * odchylenie
).astype(int)
# Power Query pokaże każdą ramkę danych jako osobną tabelę - tutaj będzie to df
Zamiast podglądu pojawi się żółty pasek Wymagane są informacje dotyczące prywatności danych.. Power Query traktuje skrypt jak osobne źródło danych i chce wiedzieć, czy wolno mu przekazać dane z pliku Excel. Kliknij Kontynuuj.
W oknie Poziomy prywatności jest jeden wiersz: c:\, czyli dysk, na którym leży C:\Kurs_PBI\Nordvella_dane.xlsx. Rozwiń listę po prawej, wybierz Organizacyjne i kliknij Zapisz. Pole Ignoruj kontrole poziomów prywatności dla tego pliku zostaw puste: ono wyłącza kontrolę dla całego pliku, a to zabezpieczenie przed wysłaniem danych tam, gdzie nie powinny trafić.
Po kilkunastu sekundach Power Query pokaże tabelę z kolumnami Name i Value i dwoma wierszami: dataset i df. To wszystkie ramki danych, które zostały w pamięci po skrypcie. Nasz wynik to df, więc kliknij Table w wierszu df.
Tabela się rozwinie, a Power Query sam doda krok Zmieniono typ1. Spójrz na nagłówki kolumn CenaNetto, WartoscNetto, WartoscBrutto i MarzaNetto: mają ikonę ABC, czyli typ tekstowy, a liczby mają kropkę zamiast przecinka (7624.13). Python oddaje liczby dziesiętne z kropką, a Power BI w polskich ustawieniach regionalnych nie rozpoznaje ich jako liczb. Gdyby tak zostało, miary sprzedaży i marży z poprzednich lekcji przestałyby działać, bo nie da się zsumować tekstu.
Kliknij nagłówek CenaNetto, a potem z wciśniętym Ctrl nagłówki WartoscNetto, WartoscBrutto i MarzaNetto (MarzaNetto znajdziesz po przewinięciu tabeli w prawo, za KosztWlasny; KosztWlasny ma poprawny typ, nie zaznaczaj go). Kliknij prawym przyciskiem myszy nagłówek jednej z zaznaczonych kolumn i wybierz Zmień typ, Używając ustawień regionalnych....
W oknie Zmienianie typu za pomocą ustawień regionalnych ustaw Typ danych na Liczba dziesiętna, a Ustawienia regionalne na Angielski (Stany Zjednoczone). Pod spodem okno pokaże przykład liczby w tym zapisie: 2,100.50. Kliknij OK.
Kliknij kartę Narzędzia główne i przycisk Zamknij i zastosuj. Power BI uruchomi skrypt na wszystkich 108 675 wierszach i przeładuje tabelę. W oknie Ładowanie przez chwilę zobaczysz FaktSprzedaz z licznikiem wierszy z Pythona.
Po załadowaniu w panelu Dane, w tabeli FaktSprzedaz, są dwie nowe kolumny: CzyAnomalia i Sezon. Sprawdziliśmy wynik zapytaniem DAX: anomalii jest 2 109 (wszystkie powyżej 22 132 zł, czyli średnia 5 209 zł plus trzy odchylenia po 5 641 zł), sezony rozkładają się tak: Zima 34 981 transakcji, Wiosna 28 409, Jesień 26 082, Lato 19 203. Łączna sprzedaż nadal wynosi 467 775 009,17 zł, więc poprawka typów niczego nie zepsuła.
Pułapka: skrypt w Power Query uruchamia się przy każdym odświeżeniu danych, a nie raz. Jeśli transformację da się zapisać w języku M albo w kolumnie DAX, wybierz je. Po publikacji w usłudze Power BI zapytanie ze skryptem Pythona odświeży się tylko przez bramę danych w trybie osobistym, na komputerze z tym samym Pythonem i bibliotekami.
Co chcemy osiągnąć. Zarząd Nordvelli pyta, czy droższe transakcje przynoszą wyższą marżę i czy wygląda to tak samo w każdej kategorii. Chcemy odpowiedzieć wykresem narysowanym w języku R biblioteką ggplot2, bo część analityków pracuje w R, a nie w Pythonie.
R działa w Power BI tak samo jak Python, tylko z inną ikoną w panelu Wizualizacje (litera R) i innym interpreterem. Dane w skrypcie R też nazywają się dataset, ale to data.frame, natywna tabela języka R.
Pobierz R dla Windows ze strony projektu CRAN (cran.r-project.org) i zainstaluj z domyślnymi ustawieniami. U nas to R 4.6.1 w C:\Program Files\R\R-4.6.1. Uruchom program R z menu Start i w konsoli wpisz:
install.packages(c("ggplot2", "hexbin"))Pakiet ggplot2 rysuje wykres, hexbin jest potrzebny w wariancie z kafelkami w kroku 23. Potem w Power BI wybierz Plik, Opcje i ustawienia, Opcje, w grupie GLOBALNE kliknij Obsługa skryptów języka R i sprawdź, czy na liście Wykryte katalogi główne języka R jest katalog R.
Kliknij puste miejsce na płótnie pod wykresem Pythona, a w panelu Wizualizacje kliknij ikonę R (podpowiedź: Element wizualny skryptu R). Zgodę na skrypty dałeś już w kroku 6, więc okno się nie pojawi. Power BI wstawi element R pod wykresem Pythona i otworzy Edytor skryptów języka R.
Pytanie dla Nordvelli: czy droższe transakcje przynoszą wyższą marżę i czy wygląda to tak samo w każdej kategorii. Do obszaru Wartości przeciągnij z FaktSprzedaz WartoscBrutto i MarzaNetto, z DimProdukty Kategoria, a na końcu z FaktSprzedaz SprzedazID. Przy WartoscBrutto, MarzaNetto i SprzedazID wybierz ze strzałki Nie sumuj, tak jak w kroku 8. Rozwiń edytor strzałką w górę na jego pasku. Preambuła w R wygląda tak:
# Następujący kod służący do tworzenia ramki danych i usuwania zduplikowanych wierszy jest zawsze wykonywany i działa jako preambuła skryptu:
# dataset <- data.frame(WartoscBrutto, MarzaNetto, Kategoria, SprzedazID)
# dataset <- unique(dataset)
# W tym miejscu wklej lub wpisz kod skryptu:
Wklej kod pod preambułą (plik 13_
library(ggplot2)
# dataset = data.frame z polami WartoscBrutto, MarzaNetto, Kategoria, SprzedazID
ggplot(dataset, aes(x = WartoscBrutto, y = MarzaNetto, color = Kategoria)) +
geom_point(alpha = 0.35, size = 1.6) +
geom_smooth(method = "lm", se = TRUE) +
scale_color_brewer(palette = "Set1") +
labs(
title = "Korelacja: wartość transakcji a marża (Nordvella)",
x = "Wartość brutto (PLN)",
y = "Marża netto (PLN)",
color = "Kategoria"
) +
theme_minimal(base_size = 12)Zwiń edytor i otwórz wykres R w trybie koncentracji uwagi, tak jak w kroku 12. Każdy punkt to jedna transakcja, kolor to kategoria, a przez każdą chmurę przechodzi linia regresji (dopasowana prosta). geom_smooth(method = "lm") dolicza ją metodą regresji liniowej, a se = TRUE rysuje wokół niej pas niepewności; przy tak dużej liczbie punktów pas jest węższy niż linia.
Nachylenie linii to sygnał biznesowy: ile złotych marży przynosi każda złotówka wartości transakcji. Policzyliśmy je na danych: Akcesoria około 0,33 zł, AGD/RTV 0,18 zł, Komputery 0,08 zł, Telefony 0,05 zł. Telefony mają najdroższe transakcje (krok 12), ale najniższą marżę na złotówkę. Akcesoria to małe kwoty z dużym narzutem.
Gdy punktów jest tyle, że zlewają się w plamę, lepiej pokazać gęstość. W trybie koncentracji rozwiń edytor, zaznacz cały kod (Ctrl+A), wklej wariant z ramki (plik 13_
# Wariant lekki: gdy punktów jest za dużo i wykres się zlewa,
# zastąp chmurę gęstością 2D (kafelki heksagonalne)
library(ggplot2)
ggplot(dataset, aes(x = WartoscBrutto, y = MarzaNetto)) +
geom_hex(bins = 40) +
scale_fill_gradient(low = "#fdd", high = "#E02D33") +
labs(title = "Gęstość: wartość a marża", x = "Wartość brutto (PLN)", y = "Marża netto (PLN)") +
theme_minimal()
Wariant hex był tylko próbą. Wklej z powrotem kod z kroku 22 (razem z preambułą albo pod nią), kliknij Uruchom skrypt, zwiń edytor i wróć do raportu przyciskiem Powrót do raportu. Plik efektu tej lekcji ma na stronie wykres z kroku 22.
Wskazówka: wizualizacja Python i R dostaje najwyżej 150 000 wierszy. FaktSprzedaz ma 108 675 transakcji, więc mieści się w całości, ale jeśli dołożysz pola, które mnożą wiersze, Power BI weźmie tylko pierwsze 150 000 i wykres pokaże niepełny obraz. Wtedy agreguj dane przed wykresem albo zawęź je fragmentatorem.
Co chcemy osiągnąć. Wykres skryptowy w raporcie Nordvelli kiedyś pokaże szary prostokąt zamiast wykresu, na przykład po literówce w nazwie kolumny. Chcemy nauczyć się czytać komunikat błędu, zanim zdarzy się to naprawdę.
Prędzej czy później zamiast wykresu zobaczysz szary prostokąt. Sprawdź, jak to wygląda, zanim zdarzy się naprawdę.
Kliknij wykres Pythona, rozwiń edytor i w linii data=dataset, x="WartoscBrutto", usuń jedną literę, tak żeby było x="WartosBrutto". Kliknij Uruchom skrypt.
Kliknij łącze Zobacz szczegóły w środku elementu, a w oknie, które się otworzy, przycisk Zobacz szczegóły. I tu czeka rozczarowanie: zamiast treści wyjątku Pythona dostajesz ServiceErrorToClientError, identyfikator działania i godzinę. Ani słowa o kolumnie WartosBrutto, ani numeru linii. Kliknij Zamknij i popraw literówkę z powrotem na WartoscBrutto.
Wniosek praktyczny: diagnozę robisz poza Power BI, a poniższa tabela mówi, czego szukać. Komunikaty w pierwszej kolumnie zobaczysz w konsoli Pythona, w Power BI wszystkie wyglądają jak na zrzucie wyżej.
| Komunikat w konsoli Pythona | Przyczyna i naprawa |
|---|---|
ModuleNotFoundError: No module named 'seaborn' | Biblioteki nie ma w interpreterze wskazanym w Opcjach. Uruchom pip install seaborn w tym Pythonie, który wskazujesz Power BI, albo popraw katalog w Opcjach. |
ValueError: Could not interpret value `WartosBrutto` for `x` | Kolumny nie ma w dataset: literówka albo pole nie trafiło do sekcji Wartości. Porównaj nazwę z preambułą. |
| Brak komunikatu, a wykresu nie ma | Brakuje plt.show() na końcu skryptu. Krok 26 pokazuje, jak to wygląda w Power BI. |
ValueError: could not convert string to float | Kolumna liczbowa przyszła jako tekst. Rzutuj: dataset["WartoscBrutto"] = pd.to_numeric(dataset["WartoscBrutto"]). |
| Wykres jest, ale liczby się nie zgadzają | Pola liczbowe mają agregację Suma zamiast Nie sumuj (krok 8) albo dane przekroczyły 150 000 wierszy. |
Na końcu kodu zamień plt.show() na # plt.show(), czyli zakomentuj tę linię, i kliknij Uruchom skrypt. Kod jest poprawny, matplotlib rysuje wykres w pamięci, ale Power BI zbiera go do obrazu dopiero na wywołanie plt.show(). Wizualizacja pokazuje ten sam komunikat co przy literówce. W R analogicznie: wykres ggplot(...) musi zostać wypisany, więc nie przypisuj go do zmiennej bez późniejszego print().
Usuń znak # przed plt.show(), kliknij Uruchom skrypt, zwiń edytor i kliknij puste miejsce strony. Wykres wraca.
Wskazówka: zanim wkleisz kod do Power BI, uruchom go raz w zwykłym Pythonie (w notatniku Jupyter albo w konsoli) na kilku wierszach danych Nordvelli wczytanych do zmiennej dataset. Tam błąd pokaże pełny ślad wywołania (traceback) z numerem linii.
Co chcemy osiągnąć. Raport Nordvelli trafi do usługi Power BI, a tam wizualizacje Python i R działają z ograniczeniami. Chcemy wiedzieć, czego się spodziewać po publikacji, i zapisać plik lekcji z kompletem wykresów.
Po publikacji w usłudze Power BI (piszemy o niej w dalszych rozdziałach) wizualizacje Python i R rysuje sama usługa, ale tylko z pakietami z listy obsługiwanych przez Microsoft i z limitem czasu wykonania. Zapytanie z krokiem skryptu w Power Query, jak nasze FaktSprzedaz, odświeży się w chmurze tylko przez bramę danych w trybie osobistym, na komputerze z zainstalowanym Pythonem i bibliotekami.
Naciśnij Ctrl+S albo kliknij ikonę dyskietki w lewym górnym rogu. Plik nordvella_
Po ponownym otwarciu pliku (także pliku efektu z ramki na początku lekcji) Power BI zapyta o zgodę jeszcze raz, a zamiast wykresów pokaże napisy Wizualizacja języka Python nie są włączone i przyciski Wybierz, aby włączyć. Kliknij Włącz w oknie Włącz elementy wizualne skryptu i wykresy się narysują.
| Zasada | Dlaczego |
|---|---|
| Jedna instalacja Pythona na cały zespół | Raport z wykresem seaborn zadziała u kolegi tylko, gdy ma te same biblioteki. Ustalcie wspólne środowisko i wersje. |
| Skrypt na kanwie tylko do wizualizacji, nie do transformacji | Do przekształceń danych używaj Power Query albo DAX. Wykres skryptowy zostaw na to, czego natywne wizualizacje nie pokażą. |
| Agreguj przed wykresem | 108 675 punktów na wykresie punktowym zlewa się w plamę (krok 23). Zagreguj do miast lub kategorii, żeby wykres coś mówił i szybciej się rysował. |
| Testuj kod poza Power BI | Konsola Pythona pokaże pełny błąd z numerem linii, Power BI tylko ogólny komunikat. |
Pliki z tego rozdziału do pobrania
Gotowy efekt lekcji i cztery skrypty z ramek wyżej. Jeśli coś u Ciebie wygląda inaczej niż na zrzutach, porównaj swój plik z plikiem efektu.
nordvella_
13_
13_
13_
13_
Python i R to mocne uzupełnienie Power BI, ale ich rola jest wąska i celowa. W kolejnym rozdziale wracamy do serca narzędzia, czyli do języka DAX i funkcji CALCULATE, gdzie zdecydowana większość analiz Nordvelli powstaje bez ani jednej linii Pythona. Wykresy skryptowe traktuj jako specjalistyczne uzupełnienie strony analitycznej, a nie fundament raportu.
Komentarze (0)
Brak komentarzy...