Časová analýza a jazyk DAX v Power BI

Časová analýza je jedna z najčastejších typov analýz, keď analyzujete dáta v Power BI. Každý z nás potrebuje aspoň raz za čas analyzovať dáta po rokoch, mesiacoch či dňoch, a niekedy aj po hodinách či minútach. Zatiaľ čo možností, ako to spraviť, je mnoho, tak všetky by mali začať prípravou dobrých základov, aby sme to nemuseli potom zbytočne komplikovať. Preto sa teraz pozrieme na to, ako sa správne robí časová analýza v Power BI.

Vzorové dáta

Majme na začiatok takúto vzorovú tabuľku objednávok:

Tabuľka je kvôli stručnosti výkladu osekaná na hore uvedené 3 stĺpce a zopár riadkov.

Časová analýza po rokoch, mesiacoch, dňoch, atď.

Teraz by sme chceli tieto objednávky analyzovať podľa rokov, mesiacov, týždňov či dní. Existuje na to hneď viacero spôsobov. Jeden zo spôsobov je, že si zo stĺpca „objednane_kedy“ do samostatných stĺpcov odvodíme jednotlivé dátumové zložky, napr. pomocou klasických funkcií YEAR, MONTH, DAY, WEEKNUM, a pod.. Čiže ak chceme analyzovať dáta po rokoch, tak vytvoríme vypočítaný stĺpec s názvom „Rok“ a týmto vzorcom:

Rok = YEAR(Objednavky[objednane_kedy])

To nám vytvorí takýto nový stĺpec:

Tento stĺpec následne vieme použiť v kontingenčnej tabuľke, kde si ho vieme dať do oblasti Riadky alebo Stĺpce, čo nám zoskupí štatistiku po jednotlivých rokoch.

Toto riešenie však má hneď viacero problémov. Ak budeme chcieť robiť podobnú analýzu v inom reporte, tak tam musíme vytvoriť takéto stĺpce odznova. Čiže ak sme v 1. reporte mali analýzu po rokoch, mesiacoch a dňoch, kde sme tieto 3 stĺpce vytvorili podobne ako ten vypočítaný stĺpec vyššie, tak tie isté vzorce budeme musieť zopakovať v ďalšom reporte. Ak to máte zopakovať raz, tak si poviete, že OK. Keď však už budete robiť takýto 10. report, tak možno začnete rozmýšľať, ako by to mohlo ísť lepšie. Ďalším problémom je to, že vám to v tabuľke zaprace miesto ďalšími stĺpcami a začne to byť časom neprehľadné. O ďalší dôvod viac, prečo by to malo ísť spraviť inteligentnejšie.

Pre všetky tieto, aj mnohé ďalšie dôvody preto toto 1. riešenie nepoužijeme, a zmažeme hore uvedený stĺpec „Rok“ z tabuľky „Objednavky“. A ukážeme si, ako to ide spraviť lepšie.

Časová analýza – profesionálne riešenie

Lepším riešením, ktoré vám ušetrí kopec opakovanej práce v každom jednom reporte Power BI, je vytvoriť si najprv špeciálnu časovú tabuľku. V tejto tabuľke budeme mať dátumový stĺpec, v ktorom budú všetky dátumy za všetky analyzované roky. Čiže ak napr. analyzujete dáta za roky 2024-2026, tak tam budete mať všetky dátumy od 1.1.2024 až po 31.12.2026, aj keď možno nemáte dáta pre všetky dátumy. Potom si do ďalších stĺpcov odvodíte jednotlivé časové zložky, ako napr. roky, mesiace, týždne či dni. Či už tú tabuľku pripravíte v Exceli, alebo v Power Query, tak to je viac-menej zajedno. Zo začiatku je to síce viac práce, ako hore uvedené prvé riešenie, ale túto extra prácu bude potrebné spraviť iba raz pre všetkých 200 reportov, ktoré budete v budúcnosti vytvárať. A nie 200x, ako keby ste to robili tým prvým spôsobom.

Dobrá správa je, že ani tú časovú tabuľku nemusíte vytvárať sami. Už takmer 10 rokov je na webe moja ultimátna časová tabuľka, vytvorená cez Power Query, ktorú si môžete stiahnuť na tejto stránke a pridať do svojho reportu. Návod na jej použitie nájdete v tomto článku.

My si ten skript upravíme tak, aby to vygenerovalo časovú tabuľku od roku 2025 po rok 2026 (úpravou premenných na začiatku skriptu), a túto tabuľku si naimportujeme do dátového modelu ako tabuľku s názvom „Kalendar“. Jej prvé riadky by mali vyzerať takto:

Časová analýza v Power BI - Kalendárová tabuľka

Teraz potrebujeme prepojiť túto novú tabuľku na tabuľku „Objednavky“, cez stĺpce s dátumami. Máme tam však ešte jeden drobný problém – v tabuľke „Objednavky“ máme stĺpec „objednane_kedy“, kde máme dátumy aj časy dohromady v jednom stĺpci, a v tabuľke „Kalendar“ v stĺpci „Dátum“ máme iba dátumy. Keby sme tieto tabuľky prepojili cez tieto stĺpce, tak by dátový model nenašiel žiadne alebo takmer žiadne zhodné riadky na oboch stranách prepojenia, pretože žiadna hodnota s dátumom a časom sa nerovná hodnote iba s dátumom.

Preto prejdeme do Power Query (tlačidlo „Transformovať údaje“ v hlavnom menu), a tam si najprv upravíme tabuľku „Objednávky“. Konkrétne tak, že stĺpec „objednane_kedy“ rozdelíme na 2 samostatné stĺpce – 1 stĺpec s dátumovou zložkou, a 1 stĺpec z časovou zložkou z pôvodného stĺpca. Power Query síce nemá žiadnu operáciu na to, aby sme to vedeli spraviť na 1 kliknutie myši, ale nebude ťažké.

Spravíme to tak, že najprv 2x zduplikujeme stĺpec „objednane_kedy“. Kliknite teda na záhlavie tohto stĺpca pravým tlačidlom myši, a potom v tom menu vyberte položku „Duplikovať stĺpec„:

Časová analýza v Power BI - duplikovanie stĺpca

To nám spraví duplikát z tohto stĺpca:

Tento postup vykonajte ešte raz, lebo budeme potrebovať ešte ďalší duplikát. Malo by to potom vyzerať takto:

Teraz chceme spraviť to, že v tom prvom duplikovanom stĺpci budú iba dátumy, a v tom druhom iba časy. To spravíme tak, že zmeníme typ daného stĺpca buď na iba „Dátum“, alebo iba „Čas“. Kliknite teda v záhlaví daného stĺpca na ikonku s kalendárikom v jeho ľavej časti, a pre prvý duplikovaný stĺpec zvoľte možnosť „Dátum“, a pre druhý duplikovaný stĺpec zvoľte možnosť „Čas“:

Časová analýza v Power BI - rozdelenie stĺpca

Potom ešte premenujte prvý duplikovaný stĺpec na „Dátum“ a druhý na „Čas“. Výsledok by mal vyzerať takto:

Takto jednoducho sme rozdelili dátumovo-časový stĺpec na dva samostatné stĺpce, pričom pôvodný stĺpec sme si ponechali nedotknutý, ak by sme ho náhodou ešte potrebovali neskôr v našich reportoch. Teraz už len kliknite v hlavnom menu na tlačítko „Zavrieť a použiť„, a tieto zmeny sa nám načítajú do dátového modelu.

Teraz už ľahko prepojíme tabuľku „Objednavky“ s tabuľkou „Kalendar“. Prepojte ich teda takto: stĺpec „Dátum“ z tabuľky „Kalendar“ prepojte na stĺpec „Dátum“ v tabuľke „Objednavky“. Výsledok by mal vyzerať takto:

Časová analýza v Power BI - prepojenie s kalendárovou tabuľkou

A teraz už môžete jednoducho robiť časové analýzy v Power BI – do kontingenčiek a grafov stačí vyberať časové zložky z tabuľky „Kalendar“. Ak chcete napríklad spraviť analýzu obratu po rokoch a mesiacoch, tak vytvorte takúto kontingenčku:

  1. do oblasti Hodnoty pridajte z tabuľky „Objednavky“ stĺpec „cena_bez_dph“,
  2. do oblasti Riadky pridajte z tabuľky „Kalendar“ stĺpce „Rok“ a „Mesiac“.

Výsledok bude vyzerať takto:

A to je všetko, čo potrebujete spraviť. Stačilo si do modelu naimportovať tabuľku „Kalendar“, rozdeliť dátumovo-časový stĺpec v tabuľke „Objednávky“ na 2 samostatné stĺpce, potom prepojiť tieto 2 tabuľky, a to je všetko. Nemuseli ste napísať jediný vzorec, a najmä nemusíte opakovať tony vzorcov v každom ďalšom reporte Power BI. To vám ušetrí kopec práce, a najmä to spravíte ako profíci. Takéto riešenie vám zároveň takmer vôbec nezväčší veľkosť dátového modelu, a bude to fungovať bleskurýchlo aj na miliardách riadkov. Keď to totiž spravíte tak, ako to Power BI očakáva – čiže takto – tak sa vám odvďačí obrovskou rýchlosťou a flexibilitou. A preto sme to tak spravili aj my.

Časová analýza po časových intervaloch

Čo však keby sme chceli analyzovať dáta po časových intervaloch? Napr. by sme chceli vidieť, v ktorých časových intervaloch dňa máme najviac objednávok, alebo najväčší obrat? Ani to nebude problém. Budeme jednoducho pokračovať tam, kde sme skončili. V postupe vyššie sme si rozdelili pôvodný dátumovo-časový stĺpec „objednane_kedy“ na dva samostatné stĺpce – jeden s dátumovou zložkou, a druhý s časovou zložkou. A podobne ako sme si predtým do dátového modelu pridali tabuľku „Kalendar“ so všetkými dátumami a ich zložkami, tak si vieme do modelu pridať podobnú tabuľku pre časy.

Na to si potrebujeme vytvoriť alebo zohnať časovú tabuľku pre čas. Táto bude obsahovať časový stĺpec, kde budú všetky možné časy z 24-hodinového dňa, ideálne po sekundách. Môžu byť aj po hodinách alebo minútach, ak by ste mali časy v hlavnej tabuľke zaznamenané len v takejto granularite, ale väčšinou tam bývajú zapísané časy s presnosťou na sekundy. Preto zvyčajne používame časovú tabuľku pripravenú na úrovni sekúnd.

Dobrá správa je, že aj takúto časovú tabuľku pre čas si môžete stiahnuť už predpripravenú z týchto stránok. Jej najnovšia verzia sa nachádza na tomto odkaze. Pridáte ju do modelu rovnakým spôsobom ako tú predošlú tabuľku „Kalendar“. My si ju teda pridáme tiež, ako tabuľku s názvom „Cas“. Jej prvé riadky by mali vyzerať takto:

Časová analýza v Power BI - Časová tabuľka

Potom prepojíme tabuľku „Objednavky“ na tabuľku „Cas“, a to takto: stĺpec „Čas“ z tabuľky „Čas“ prepojte na stĺpec „Čas“ v tabuľke „Objednavky“. Výsledok by mal vyzerať takto:

Časová analýza v Power BI - prepojenie s časovou tabuľkou

A teraz, keď chcete analyzovať, v ktorých hodinových intervaloch je najväčší obrat, tak vytvorte takúto kontingenčku:

  1. do oblasti Hodnoty pridajte z tabuľky „Objednavky“ stĺpec „cena_bez_dph“,
  2. do oblasti Riadky pridajte z tabuľky „Cas“ stĺpec „Začiatok hodiny“.

Výsledok bude vyzerať takto:

Prípadne, keď to prepnete do grafu, tak to bude vyzerať takto:

Takto vidíte, že aj časová analýza po časových intervaloch ide spraviť ľahko. Všetky časové intervaly si stačí predpripraviť do takejto tabuľky „Cas“ (ak tam ešte nie sú), a potom ich odtiaľto ľahko vyberať do kontingenčiek. Takto viete analyzovať dáta nielen po hodinách, minútach a sekundách, ale aj po polhodinách, štvrťhodinách, päťminútových intervaloch, časti dňa či pracovnej doby. A opäť stačilo pripraviť si ju len raz pre všetky reporty, a potom ju do každého z nich iba naimportovať a prepojiť vhodným spôsobom s hlavnou tabuľkou. A nemuseli ste písať na to jediný vzorec v jazyku DAX.

Problém so skrytými milisekundami

Hore uvedená časová analýza po časových intervaloch vám nemusí zafungovať pri niektorých dátových zdrojoch. Napríklad keď ťaháte dáta z SQL Servera alebo Oraclu, ak sú dátumovo-časové stĺpce uložené s presnosťou až na milisekundy, mikrosekundy či nanosekundy. Problém je, že keď o tom neviete, tak si to nevšimnete ani v Power Query, ani v dátovom modeli, pretože tam sú zobrazené údaje len s presnosťou na sekundy, aj keď sú tam natiahnuté aj s tými mikro-/nanosekundami. V takomto prípade sa potrebujete úplne za začiatku zbaviť týchto zlomkov sekúnd tak, že si v Power Query vytvoríte vypočítaný stĺpec (v hlavnom menu kliknite na „Pridať stĺpec“ => „Vlastný stĺpec„), a doňho zadáte takýto vzorec:

Time.From(Number.IntegerDivide(Number.From([objednane_kedy]) * 86400, 1) / 86400)

Tento vzorec vytvorí nový stĺpec zo stĺpca „objednane_kedy“, z ktorého budú odstránené zlomky sekúnd. Čiže v ňom budú uložené dátumo-časy len s presnosťou na sekundy. Pôvodný stĺpec potom zmažete a namiesto neho použijete tento nový stĺpec do postupu vyššie, kde sme ho rozdeľovali na dátumový a časový stĺpec. Takto vám to potom zafunguje na 100%.

Na záver

Takto sa teda robí profesionálna časová analýza v nielen Power BI, ale aj v mnohých iných BI nástrojoch. Dnes si dokonca ani nemusíte pripravovať a vytvárať časové tabuľky, ale stačí použiť napr. tieto 2 z tohto webu. Takto to máte hotové za pár minút ako profík, a o to viac vás bude baviť vytváranie reportov v Power BI. A ak sa chcete naučiť ešte viac, tak príďte na niektorý z našich kurzov Power BI. Tam sa naučíte ešte oveľa, oveľa viac 🙂

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *