Power BI en datamodelering – Expert blog

Eén dashboard om allen te regeren!

Met deze expert blog wil ik geïnteresseerden in Power BI concrete handvatten bieden. Ik wil een kijkje geven in hoe je jouw data kunt vormgeven, hoe je daar bovenop eenvoudig een dashboard bouwt. Dit artikel is langer dan gewoonlijk, dat is bewust. Ik wil echt inzicht bieden in de mogelijkheden van Power BI en een aantal uitdagingen rondom data modelering bespreken. Ik ga een geeky voorbeeld gebruiken, waar ik de lezer kort in introduceer, so bear with me! 😉 

Aan de slag!

Eén dashboard om allen te regeren!

Mensen die mij persoonlijk kennen weten dat ik een groot fan ben van het werk van Tolkien, en dat ik een gepassioneerd speler van bordspelletjes ben. Combineer deze twee en dan zul je begrijpen dat ik graag The Lord of the Rings – The Living Card Game speel (afgekort tot LotR LCG door fans), uitgegeven door Fantasy Flight Games.

LotR LCG is een coöperatief kaartspel waar jij en een andere speler het samen opnemen tegen het spel. Samen ga je op een quest om de duistere heerser Sauron en zijn legers te verslaan. Om te winnen moet je een deck kaarten samenvoegen dat in staat is alles te overkomen dat tijdens de quest op je afkomt; of dat nu draken, de legers van het duistere land Mordor, bendes rovende Orcs, zwervende Heuveltrollen zijn, of dat het de Tovenaar-koning van Angmar zelf is.

Voorbeeld van de vier soorten speelkaarten: Hero, Event, Ally & Attachment

Geek things aside: op dit moment heb ik een doos met speelkaarten verzameld waarmee ik mijn decks kan bouwen. Dat zijn bijna 800 kaarten waar ik uit kan kiezen, en het vinden van de juiste kaart voor mijn deck is best een onderneming geworden.

Gelukkig zijn er databanken online beschikbaar zoals RingsDB.com, onderhouden door een levendige en loyale online fanbase. Sommige van deze databanken komen zelfs met mooie filterfuncties. Ik ervaar deze als traag. Ze werken allemaal op zo’n manier dat ik eerst mijn parameters moet invoeren en daarna een zoekknop moet indrukken voor ik resultaten krijg.

Met zoveel kaarten om te doorzoeken op zoveel verschillende parameters, ervaar ik deze methode als langzaam. Ik wil graag een filter snel kunnen aanpassen en mijn zoekopdrachten kunnen vernauwen om tot de juiste kaarten te komen. Ik heb ook geen zin om telkens terug te gaan naar de applicatie, waar ik dan een nieuwe zoekopdracht moet gaan samenstellen voor ik opnieuw een zoekopdracht kan uitvoeren.

Daar komt Power BI om de hoek kijken!

Al snel realiseerde ik me dat Power BI in staat is om aan mijn eisen te voldoen. Het stelt me ook in staat om mijn eigen dashboard te creëren zoals ik dat wil. Aangezien er een heleboel informatie op de speelkaarten staat, zag ik dit project als een mooie uitdaging om mezelf eens te trainen in het vormgeven van een werkend datamodel, terwijl ik tegelijkertijd een mooi filter dashboard in elkaar klik. Twee vliegen in één klap.

Verbinden met de API

De online databank is een waardevolle bron. Omdat dit online beschikbaar is, hoef ik niet zelf 800 kaarten in een Excelbestand weg te schrijven. Omdat ik gebruik maak van een HTTP REST call krijg ik JSON informatie binnen. Hierdoor weet ik ongeveer wat ik kan verwachten aan datastructuur.

De online databank is op zo’n manier opgezet dat mensen makkelijk de informatie via de API kunnen uitlezen. De website heeft zelfs een handleiding hoe je contact moet leggen met de API. Hier heb ik dus verder niet veel werk aan. Een simpele code zal de data in Power BI laden:

Source = Json.Document(Web.Contents("https://ringsdb.com/api/public/cards/"))

De data vormgeven

De data die ik via de API binnenhaal is al gestructureerd. Dit maakt de data makkelijk om mee aan de slag te gaan. Toch zal ik mijn dashboard niet gelijk kunnen gaan bouwen. Ik moet eerst nog wat aanpassingen in de data doorvoeren om Power BI de data correct te laten interpreteren.

Importeren van de data

De bron stuurt mij een lange reeks aan JSON, wat in Power BI wordt omgezet naar een lijst met records (tabellen in een lijst).

De bron stuurt per kaart deze informatie naar Power BI:
[{
"pack_code":"Core",
"pack_name":"Core Set",
"type_code":"hero",
"type_name":"Hero",
"sphere_code":"leadership",
"sphere_name":"Leadership",
"position":1,
"code":"01001",
"name":"Aragorn",
"traits":"D\u00fanedain. Noble. Ranger.",
"text":"Sentinel.\n<b>Response:<\/b> After Aragorn commits to a quest, spend 1 resource from his resource pool to ready him.","flavor":"\"I am Aragorn son of Arathorn; and if by life or death I can save you, I will.\"\n<cite>The Fellowship of the Ring<\/cite>",
"is_unique":true,
"threat":12,
"willpower":2,
"attack":3,
"defense":2,
"health":5,
"quantity":1,
"deck_limit":1,
"illustrator":"John Stanko",
"octgnid":"51223bd0-ffd1-11df-a976-0801200c9001",
"has_errata":false,
"url":"https:\/\/ringsdb.com\/card\/01001",
"imagesrc":"\/bundles\/cards\/01001.png"
},

Hieronder kun je een voorbeeld zien van de informatie die in een enkele record zit opgeslagen. Dat is veel informatie voor één speelkaart, vind je ook niet?

Power BI toont records met de tabel

Alle informatie die in een record zit

Om te kunnen werken met deze data, moet ik eerst de records omzetten naar een tabel. Dat kan met een simpele klik op een knop:

Nu zal Power BI deze records omzetten naar een tabel.

Van record naar werkbare tabel

Ik zie nog steeds een record in een kolom. Voor de volgende stap zal ik de record uit elkaar moeten trekken en in aparte kolommen weg moeten schrijven. Dat kan gedaan worden met een klik op de knop.

Met deze knop zet je een record om in (geselecteerde) kolommen

Er komt een scherm in beeld waar ik kan selecteren welke onderdelen van de record ik wil omzetten naar kolommen. Ik kan lui zijn en alles selecteren, maar om de performance snel te houden kies ik ervoor om alle informatie eruit te filteren die ik niet nodig heb. Ik selecteer enkel de kolommen die ik nodig heb en klik op ‘OK’. Dit zal de hoeveelheid data die Power BI importeert reduceren, waardoor de filters sneller worden toegepast omdat Power BI niet al die onnodige informatie moet uitlezen.

Selecteer de kolommen die je wilt gebruiken in je tabel

Als ik mijn kolommen heb geselecteerd krijg ik de volgende code in Power BI:
= Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"pack_name", "type_name", "sphere_name", "position", "code", "name", "traits", "text", "flavor", "is_unique", "threat", "willpower", "attack", "defense", "health", "quantity", "deck_limit", "has_errata", "url", "imagesrc", "cost", "victory", "quest"}, {"Column1.pack_name", "Column1.type_name", "Column1.sphere_name", "Column1.position", "Column1.code", "Column1.name", "Column1.traits", "Column1.text", "Column1.flavor", "Column1.is_unique", "Column1.threat", "Column1.willpower", "Column1.attack", "Column1.defense", "Column1.health", "Column1.quantity", "Column1.deck_limit", "Column1.has_errata", "Column1.url", "Column1.imagesrc", "Column1.cost", "Column1.victory", "Column1.quest"})
Voor de code wizards onder ons: hier kun je zien hoe ik de records in Column1 verdeel over verschillende kolommen (rood). In het tweede deel van de code (blauw) geeft Power BI elke nieuwe kolom een naam. In de code kun je zien welke kolommen ik heb geselecteerd voor mijn dashboard.

De records zijn in kolommen onderverdeeld

Nu toont de interface mij de records, omgezet naar tabel en de data onderverdeeld over de kolommen die ik heb geselecteerd. Let op de namen van de kolommen. Deze zijn toegekend in het blauwe stuk code hierboven.

Het hernoemen van de kolommen

Omdat het dashboard-interface uiteindelijk de namen van de kolommen zelf importeert, en ze allemaal starten met ‘Column1.*’ wil ik ze hernoemen om goed overzicht te houden. Nu kan ik niet in een oogopslag zien welke kolom ik voor me heb. Tijd om alle kolommen te hernoemen!
= Table.RenameColumns(#"Expanded Column",{{"Column1.pack_name", "Pack"}, {"Column1.type_name", "Type"}, {"Column1.sphere_name", "Sphere"}, {"Column1.name", "Name"}, {"Column1.text", "Text"}, {"Column1.traits", "Traits"}, {"Column1.willpower", "Willpower"}, {"Column1.attack", "Attack"}, {"Column1.cost", "Cost"}, {"Column1.deck_limit", "Deck Limit"}, {"Column1.defense", "Defense"}, {"Column1.health", "Health"}, {"Column1.quest", "Quest"}, {"Column1.threat", "Threat"}, {"Column1.flavor", "Flavour"}, {"Column1.quantity", "Quantity"}, {"Column1.position", "Position"}, {"Column1.code", "Code"}, {"Column1.is_unique", "Unique"}, {"Column1.imagesrc", "Imagesrc"}, {"Column1.victory", "Victory"}, {"Column1.url", "Url"}, {"Column1.has_errata", "Errata"}})
Zoals je hier kunt zien, de code neemt de originele naam (blauw) en zet de nieuwe naam erachter (rood).

Filter rijen

Nu heb ik het volgende probleem. De databank bevat een aantal kaarten uit een Collector’s Edition, die ik niet bezit. Maar deze kaarten komen wel terug in mijn dashboard. Dat wil ik natuurlijk niet. Ik wil enkel de kaarten zien die ik zelf ook heb in mijn collectie. Ik moet deze specifieke uitbreiding uit de database filteren omdat ik deze resultaten niet wil zien.

Gelukkig bevat de Pack kolom (rood) deze waarde waardoor ik snel kan filteren op de entries die voldoen aan deze waarde (blauw).
= Table.SelectRows(#"Renamed Columns", each ([Pack] <> "Two-Player Limited Edition Starter"))
Nieuwe informatie toevoegen

Niet alle informatie is beschikbaar in een record. Ik heb nu de waarden in de kolom Pack, dat mij toont in welke uitbreiding de kaart gevonden kan worden. Maar uitbreidingen maken onderdeel uit van zogenaamde Cycles. Een cycle bestaat uit één Big Box expansie en 6 kleinere Adventure Packs.

Helaas zijn cycles niet beschikbaar als waarden in de databank. Ik moet deze dus zelf gaan toevoegen, aangezien dit een handige criteria is om kaarten op de differentiëren. Om deze informatie aan kaarten toe te voeg ik een conditionele kolom toe aan mijn database.

Als ik naar de data kijk, zie ik dat de kolom Code een unieke identificatiecode bevat voor elke kaart, bestaande uit 5 nummers. Als ik door de tabel scroll zie ik dat het format van de code bestaat uit een tweecijferige identificatie van de cycle en een driecijferige kaartnummer. De eerste kaart van de basisset heeft de code 01001 en de tweede 01002, maar als ik de eerste twee kaarten van de eerste Big Box expansie bekijk (waarmee een nieuwe cycle wordt gestart), is de code 03001 en 03002.

Nu weet ik dat ik aan de eerste twee cijfers van de code kan aflezen in welke cycle de kaarten zitten, kan ik deze waarde gebruiken in mijn conditionele kolom.

In deze conditionele kolom vul ik de cellen met waarden (blauw), gebaseerd op de eerste twee cijfers (rood) van de Code identificatiecode. Hieronder zie je de code. Het is wat groot, maar ik kon geen manier vinden om de if-else statements te automatiseren en die custom waarden toe te voegen aan mijn database
= Table.AddColumn(#"Filter columns", "Cycle", each if Text.StartsWith([Code], "01") then "1. Shadow of Mirkwood" else if Text.StartsWith([Code], "02") then "1. Shadow of Mirkwood" else if Text.StartsWith([Code], "03") then "2. Dwarrowdelf" else if Text.StartsWith([Code], "04") then "2. Dwarrowdelf" else if Text.StartsWith([Code], "05") then "3. Against the Shadow" else if Text.StartsWith([Code], "06") then "3. Against the Shadow" else if Text.StartsWith([Code], "07") then "4. Ringmaker" else if Text.StartsWith([Code], "08") then "4. Ringmaker" else if Text.StartsWith([Code], "09") then "5. Angmar Awakened" else if Text.StartsWith([Code], "10") then "5. Angmar Awakened" else if Text.StartsWith([Code], "11") then "6. Dreamchaser" else if Text.StartsWith([Code], "12") then "6. Dreamchaser" else if Text.StartsWith([Code], "13") then "The Hobbit Saga" else if Text.StartsWith([Code], "14") then "The Lord of the Rings Saga" else if Text.StartsWith([Code], "16") then "7. Haradrim" else if Text.StartsWith([Code], "17") then "7. Haradrim" else if Text.StartsWith([Code], "18") then "8. Ered Mithrin" else if Text.StartsWith([Code], "19") then "8. Ered Mithrin" else if Text.StartsWith([Code], "21") then "9. Vengeance of Mordor" else if Text.StartsWith([Code], ”22”) then “9. Vengeance of Mordor” else null)
Het eindresultaat is een nieuwe kolom in mijn tabel, die de juiste cycle koppelt aan de kaart. Vanaf nu kan ik deze waardes in mijn dashboard terug laten komen.

Lokaliseren van afbeeldingen van kaarten

In het record zitten twee URLs. Een leidt naar de pagina van de kaart in de onlinedatabase, de ander leidt naar een afbeelding van de kaart. Ik heb enkel de afbeeldingsURL geïmporteerd, omdat ik geen doel zie voor een link naar een externe website vanuit mijn dashboard.

Power BI ziet deze waarden niet als URL, en zelfs al deed het dat wel, dan ontbrak nog steeds het domain in de URL, waardoor hij me niet goed zou verwijzen. Ik moet dus een nieuwe kolom maken waarmee ik de afbeeldingen in mijn dashboard kan tonen.

Ik voeg een custom column toe en in de code vertel ik Power BI hoe de waarden in deze kolom moeten worden opgebouwd:
= Table.AddColumn(#"Added Conditional Column", "ImageURL", each "https://ringsdb.com"&[Imagesrc])
Deze code voegt een korte reeks tekst toe (blauw) – het domein – en voegt daaraan toe de waarden uit de kolom Imagesrc (rood) – de verkorte URL, zonder domein. Dit schrijf ik weg in de conditional kolom, die ik ImageUrl noem (groen).

Vanaf nu kan ik de URL in deze kolom gebruiken om naar een website te linken, en als ik Power BI vertel dat hij de waarde moet interpreteren als een afbeeldingsURL, zal het de afbeelding tonen in mijn dashboard.

Ik kan Power BI vertellen dat ik deze waardes als afbeeldingsURL wil uitlezen door de querie editor te verlaten en terug naar het Power BI-dashboard te gaan. In de linkerbalk in mijn interface kan ik kiezen voor 3 opties: dashboard, datatabel of relaties. Ik kies voor datatabel.

Dan selecteer ik de ImageURL kolom en onder de tablad Modeling ga ik naar Data Category en selecteer Image URL (zie afbeelding hieronder).

Met deze instellingen kan Power BI leren om bepaalde waardes als image source URL te lezen

Combineren van de teksten op de kaarten

Alle speelkaarten hebben effecten. Sommige speelkaarten hebben daarnaast ook nog een tekst met een quote uit een van de boeken. Ik wil beide waardes samenvoegen in één kolom, zodat ik eenvoudig alle tekst op de kaart van uitlezen in mijn dashboard.

Daarvoor moet ik een nieuwe custom column gaan opzetten die ik Card Text noem. Met de volgende code combineer ik zowel de Text (blauw) als de Flavour (rood) waardes, met een witregel ertussen.
= Table.AddColumn(#"Added ImageUrl", "Card Text", each [Text]& " "&[Flavour])

De eerste kaart zal de volgende tekst tonen:

Sentinel.

<b>Response:</b> After Aragorn commits to a quest, spend 1 resource from his resource pool to ready him.

 

“I am Aragorn son of Arathorn; and if by life or death I can save you, I will.”

<cite>The Fellowship of the Ring</cite>

Ik zie een klein probleem. Als de kaart geen flavour tekst bevat, krijgt die ruimte een null-waarde, en zal de gecombineerde tekst in de Card Text kolom ook een null-waarde bevatten. Dan zal het dashboard uiteindelijk niet in staat zijn deze kaart inclusief de tekst goed weer te geven. De null-waarde veroorzaakt een error.

Vervang null-waardes

Ik moet deze stap tussen het creëren van de ImageUrl kolom en het creëren van de Card Text kolom invoegen. Dit kan, maar ik krijg wel een waarschuwing dat ik een extra stap wil invoegen, en dat dit effect kan hebben op de daaropvolgende stappen. Ga met de naar de Added ImageUrl stap en klik op de rechtermuisknop. Klik ‘Insert step after’. Je zult dan een extra stap kunnen invoegen.

Voeg een stap toe tussen twee eerder gecreerde stappen

Null-waardes zijn eenvoudig te vervangen gelukkig. Ga op de cell staan waar een null-waarde staat, en ga onder de Home tab naar Replace Values.

Vervang met deze knop bepaalde waardes voor een gedefinieerde waarde.

Een scherm komt waarin je kunt definiëren waarmee null-waarden vervangen moeten worden. Ik vervang de null-waarde (blauw) met een leeg veld (rood). De code ziet er als volgt uit:
= Table.ReplaceValue(#"Added ImageUrl",null,"",Replacer.ReplaceValue,{"Flavour"})
Nu is deze query klaar voor gebruik. De stappen zien er als volgt uit:

HTML in de tekst

Valt het je op dat de tekst HTML-tags bevat? Dit maakt de tekst wat moeilijker om te lezen. Ik heb voor alsnog geen goede out-of-the-box oplossingen gevonden voor het weergeven van HTML-tekst in een dashboard, maar ik laat ze er wel in staan voor het geval ik dit een keer vind. Ik zal hier later nog even op terugkomen.

De extra uitdaging: Traits

Sommige speelkaarten hebben Traits. Deze Traits hebben verschillende effecten in het spel. De databron heeft de verschillende Traits onder één container samengevoegd, waardoor Power BI alle verschillende Traits in één kolom wegschrijft.

De Trait-waardes weggeschreven in één kolom

Dit is een probleem, omdat Power BI deze verschillende Traits als een enkel waarde ziet. Het stelt me nu niet in staat om op een enkel Trait te zoeken. Power BI maakt enkel onderscheid tussen de collectie van Traits per kaart. Ik moet daar een oplossing voor vinden.

Om dit op te lossen importeer ik opnieuw de dataset vanuit de API. Ik doorloop alle stappen om de records weer om te zetten naar een tabel. Alleen deze keer haal ik enkel de kolommen Code en Traits binnen.

Scheid de kolom per scheidingsteken

Zie je hoe elke Trait afzonderlijk een punt aan het einde heeft staan? Ik kan dit leesteken gebruiken als scheidingsteken om de informatie over verschillende kolommen te splitsen. Deze punt functioneert zoals een komma of punt-komma dat doet in een CSV-bestand; het onderscheid de waarden van elkaar.

Ik scheid de kolommen op dit leesteken. Ik vertel Power BI dat het een nieuwe kolom moet maken (rood) en elke keer als hij een punt aantreft (groen) hij de Traits waarde (blauw) in eerstvolgende lege kolom moet wegschrijven.
= Table.SplitColumn(#"Renamed Columns", "Traits", Splitter.SplitTextByDelimiter(".", QuoteStyle.Csv), {"Traits.1", "Traits.2", "Traits.3", "Traits.4"})

Nu zijn de Trait waardes in een eigen kolom weggeschreven

Waarom heb ik nu een vierde kolom terwijl ik maar drie Traits heb? Dat heeft te maken met het feit dat elke Trait eindigt op een punt. Als Power BI alleen drie waardes kan wegschrijven, zal hij twee keer controleren op de punt. De derde waarde wordt niet meer gecontroleerd op een scheidingsteken, omdat er geen derde splitsing zal komen voor een vierde kolom. De punt wordt dan meegenomen als Power BI de waarde wegschrijft in de derde kolom.

Helaas leest Power BI “Warrior” of “Warrior.” als twee verschillende waardes, waardoor ik nog steeds niet in staat ben om gemakkelijk op één Trait te filteren. Om dit op te lossen creëer ik een vierde kolom, zodat Power BI na de derde waarde opnieuw zoekt naar de eerstvolgende punt, en deze verwijderd.

De null-waarden die je ziet komen tevoorschijn als Power BI geen derde waarde vindt, en dus stopt met controleren voor het ooit bij een vierde waarde aankomt.

Deze tabel begint al te lijken op wat ik zoek. Maar op deze manier kan Power BI het niet correct uitlezen, omdat ik niet filters op zowel de kolom als de rij kan toepassen. Ik moet nog een paar stappen verder om het perfect te krijgen.

Roteren van kolommen

Het commando unpivot is erg krachtig omdat het de tabel forceert om rijen te maken van bepaalde kolommen.
= Table.UnpivotOtherColumns(#"Split Column by Delimiter", {"Code"}, "Attribute", "Value")
Deze code betekent dat voor elke Code waarde (blauw) die ik heb, ik de Attribute kolom (Traits.1, Traits.2, etc.) omzet naar een rij. Voor elke Attribute rij (rood) die ik maak, voeg ik de Value van de Trait (groen) toe die oorspronkelijk in die kolom staat. Dit levert de volgende tabel op voor de eerste zes kaarten:

Power BI verwerkt eenvoudig complexe datamodelering

De Attribute kolommen zijn weggeschreven als rijen

Zie hoe sommige waardes een kleine witruimte hebben aan hun linkerkant. Dit komt omdat de punt waarop ik ze heb gescheiden een spatie achter zich had staan. Deze spatie wordt meegenomen in het wegschrijven van de nieuwe waarde, want de punt start een nieuwe kolom. Helaas is “Warrior” een andere waarde dan “Warrior”. Dat gaan we zo even oplossen.

Wat ook opvalt is dat alle null-waarden tijdens het unpivoten opgeruimd zijn. Deze tref ik niet meer aan in mijn tabel.

Laat ik eerst even de Attribute kolom verwijderen. Deze is niet langer nodig.
= Table.RemoveColumns(#"Unpivoted Columns",{"Attribute"})
Nu is het tijd om de tekst te gaan trimmen. Selecteer de kolom Value en klik Format. Kies daar voor Trim. Hierdoor zal Power BI automatisch alle extra leestekens rondom de waarden verwijderen. De kolom is nu schoon.

Trim de tekst

= Table.TransformColumns(#"Removed Columns",{{"Value", Text.Trim, type text}})
De tweede query is nu klaar. De stappen die Power BI doorloopt met de data zien er als volgt uit:

Beheer relaties

Alles wat ik nu nog moet doen is even controleren of Power BI zelf de relatie al heeft gelegd tussen mijn twee geïmporteerde databestanden. Dit doe ik weer in mijn dashboard interface. Deze keer kies ik voor de derde optie in de linkerbalk: relatiebeheer.

Aangezien de unieke Code identificiator aanwezig is in de ene tabel, en deze waarden ook aanwezig zijn in de andere tabel kan Power BI beide tabellen koppelen met een Many-to-One relatie via die kolom.

Power BI legt zelf eenvoudig relaties tussen datasets

De relatie tussen beide datasets: Many-to-One, two-way, op de waardes van de Code kolom

Het tabel met Traits bevat meerdere instanties van dezelfde Code identificator terwijl elke Code identificator een unieke waarde is in de kaarten-tabel.
Hierom kies ik voor een Many-to-One relatie. Power BI snapt nu dat als ik wil filteren op Code 01001 hij datzelfde filter moet toepassen over de andere tabel en dezelfde waarde (01001) moet filteren. Deze relatie gaat twee richtingen op, dus als ik filter op een Trait-waarde, wordt die ook uitgevoerd op het hele kaartenbestand.

Op deze manier kan ik op Traits sorteren en enkel de kaarten die aan deze Traits voldoen vinden.

Zijn we er al?

Ja, we zijn klaar met het datamodel. De data is correct importeert en ik heb de data gekneed en Power BI geleerd hoe het informatie moet interpreteren zoals ik dat wil.

Laten we eens kijken wat ik met het dashboard kan doen!

Het dashboard bouwen

Power BI Dashboard

Het dashboard zonder filters toegepast

Zoals je kunt zien bestaat het dashboard uit veel Slicer-filters. Dat is ook het doel van dit dashboard; De kaarten sorteren die voldoen aan mijn parameters. Daar heb ik voor allerlei informatie-typen een filter nodig. Op allerlei verschillende waardes wil ik kaarten kunnen filteren. Je ziet onder andere filters voor Hitpoints, Kosten, Attack en Defense stats en natuurlijk de Traits waar ik dat extra werk in heb gestoken. Daarnaast kan ik zien in welke uitbreiding ik de kaart vind, hoeveel kaarten ik binnen die filters kan vinden en zie ik in de grafieken terug hoe de verdelingen liggen per Sphere (zoiets als klaveren, schoppen, harten en ruiten).

Filters opschonen

Power BI kan bepaalde waardes al uitfilteren

Haal de (Blank)-waardes uit de interface van je dashboard

Omdat niet elke kaart in elke kolom informatie bevat, zal het aanmaken van deze slicer-filters de (BLANK) waardes mee geven. Dit kan eenvoudig uit de interface worden gehaald door in de filter instellingen al een voorsortering van waarden te selecteren. Zoals zichtbaar in de afbeelding hieronder heb ik een filter toegepast op de Slicer van de Defense-waarden, waar ik de (Blank) waarde heb uitgezet. Nu zal op deze waarde niet gesorteerd worden. Doe dit voor elke Slicer waar de (Blank) waarde voorkomt.

Het dashboard

Bovenin zie je een donutgrafiek. Deze toont de kaarttypes per Sphere in de kleuren. De staafdiagram toont de verdeling van domeinen per cycle. Dit is handig voor een snelle analyse als ik bepaalde thematische decks wil bouwen.

Power BI Dashboard

Voor een deck gebouwd rondom de Rohan Trait kan ik zien dat ik het beste kan richten op de blauwe en rode Spheres

Power BI Dashboard

Voor mijn deck in de blauwe en groene Spheres zoek ik een aantal attachment-kaarten. Snel gefilterd heb ik overizcht in alle kaarten tot mijn beschikking!

Power BI Dashboard

Ditmaal ga ik kijken wat ik kan bereiken met een Ent deck – ik zie dat ik mij enkel kan richten op de groene en rode Spheres.

In het midden zie je een matrix-weergave waarin ik de kaartafbeelding toon, samen met de tekst op de kaart. De afbeeldingen worden ingeladen omdat ik Power BI heb verteld dat deze URLs in die kolom als een image URL moeten worden geïnterpreteerd. Nu toont Power BI niet de URL zelf, maar de afbeelding waarnaar de URL verwijst.

Filters worden toegepast over heel het dashboard, zodat als ik op één attribuut filter, alle andere filters enkel nog de waardes tonen die mogelijk zijn binnen de scope van mijn eerste filter. Er is dus geen enkele manier waarop ik een combinatie kan maken van filters die geen resultaten zal teruggeven.

Omdat de filters zo werken, kan ik een aantal filters gebruiken om informatie af te lezen, i.p.v. als actieve filter in te zetten.
Een van de filters toont bijvoorbeeld de Pack values (de uitbreidingssets waarin kaarten zitten). Dit geeft mij een overzicht welke expansies ik nodig heb als ik op bepaalde type kaarten sorteer. Hetzelfde geldt voor de Title-waarden van kaarten. Het is niet relevant om enkel op die kaartnaam te filteren. Deze zijn uniek. Maar het geeft me wel snel de namen van de kaarten die beschikbaar zijn binnen mijn zoekopdracht.

De Traits zijn afzonderlijke filter-waardes geworden, waardoor ik op elke trait afzonderlijk kan filteren. Het enige probleem dat nu nog bestaat is een spellingsfout in de databron zelf waardoor de Traits ‘Dunedain’ en ‘Dúnedain’ als twee afzonderlijke waardes worden gezien. Ik hoop dat dit opgelost wordt in de toekomst. Dit is een fout in de bron, en niet in mijn dashboard of datamodel.

Verbeterpunten

Een andere uitdaging met Traits die ik nog op wil lossen, zit hem in het feit dat de filters nu werken met OR-logica, wat betekent dat als ik zowel Trait X als Trait Y selecteer, Power BI de kaarten filtert die voldoen aan waarde X óf waarde Y. Het filter zou voor mij beter werken als het AND-logica krijgt, en mijn dashboard dus alleen kaarten toont die aan zowel waarde X áls waarde Y voldoen.

Dit probleem treedt niet op als ik met meerdere slicer-filters werk. Tussen verschillende slicers geldt de AND-logica.

Een ander probleem is dat de tekst van de kaart door Power BI niet herkend wordt als HTML, waardoor de styling van de tekst wegvalt en ik de HTML-tags uitlees. Er is een third-party Power BI weergave die Power BI in staat stelt om HTML-tekst te tonen. Voor dit blog focus ik op wat out-of-the-box mogelijk is, dus ik laat het voor nu even zo.

Al deze zaken wil ik in een dashboard 2.0 oppakken. Dit zal wel betekenen dat de matrix-weergave niet langer gebruikt kan worden en ik voortaan de kaartafbeelding moet importeren in de Card Text kolom, zodat deze afbeelding in de HTML-viewer kan worden weergeven.

Ik zal vanaf nu dit dashboard gaan gebruiken als ik mijn decks ga bouwen en kaarten wil zoeken. Ondanks dat ik nog wel een aantal verbeterpunten heb, ben ik zeer tevreden over hoe het dashboard werkt.

Ik hoop dat lezers uit mijn blog een aantal handige tips en trucs weten te halen om zelf aan de slag te gaan met Power BI!

Benieuwd wat Power BI voor jouw organisatie kan betekenen? Neem dan contact op met mij of een van mijn collega’s bij Adoptify en wij komen graag op gesprek om te kijken naar mogelijkheden binnen jouw organisatie!

Deze adoptifiers kunnen je meer vertellen:

Thijs van Tienen

> meer

WEEK 5 Minder klikken en snellere acties in MS Teams

STAY CURIOUS

volg onze adoptifiers over de hele wereld!

Andere blogs:

19 nov Help een hardnekkige e-mailverslaafde MS Teams eenvoudig te omarmen!

We merken in de praktijk dat MS Teams minimaal wordt toegelicht en uitgelegd. Dat is heel jammer want onbekend maakt onbemind. Het nut en gebruiksgemak wordt niet verteld. IT afdelingen…

26 jul Hoe overleef je het hitte record op kantoor?

Compleet in het zweet kom je op kantoor aan. Binnen is het ook om te stikken zo heet, het is nog nooit zo warm geweest,…. Daarom nu 7 Hacks om…

05 jun Verandermanagement met de Prosci methodiek

Onlangs startte ik samen met mijn collega Kim Stoltenkamp en 6 andere professionals de Prosci® Change Management training. Deze 3-daagse training had tot doel om er achter te komen wat Change…

Bekijk alle blogs