Przekształcanie danych w Power Query wymaga precyzyjnego podejścia do każdej linii kodu i uwzględnienia wszystkich potencjalnych trudności, jakie mogą wystąpić podczas importowania i przetwarzania danych. Celem jest stworzenie raportu, który dostarcza wartościowe informacje z surowych danych. Proces ten może obejmować zarówno przypisywanie ocen do studentów, jak i liczenie dni nieobecności pracowników, a dla obu przypadków kluczowe jest zastosowanie odpowiednich funkcji transformacji w Power Query.

Przy przypisywaniu ocen do studentów, pierwszym krokiem jest uporządkowanie danych i przypisanie odpowiednich ocen do każdego z uczniów. Należy wykonać transformację danych tak, aby puste wartości zostały zastąpione przez wcześniejsze oceny, w przypadku gdy występuje ciągły brak informacji. Ważnym krokiem jest następnie usunięcie pustych wierszy w kolumnie Student, co jest przedstawione w figurze 5.36. Po tych operacjach oceny są prawidłowo przypisane do poszczególnych studentów, jak pokazano na przykładzie w figurze 7.21.

Kiedy oceny są już przypisane, proces nie kończy się na wyświetleniu danych. Konieczne jest, aby zapisać zapytanie z odpowiednią nazwą, na przykład "Marks", oraz załadować wynik do Excela. Warto podkreślić, że w przypadku zastosowania odpowiednich progów ocen, wystarczy jedynie zaktualizować je w źródłowej tabeli, a następnie odświeżyć zapytanie, aby zmiany zostały uwzględnione. W odróżnieniu od wcześniejszych przykładów, nie ma potrzeby ręcznej edycji zapytania.

Z kolei w przypadku obliczania dni nieobecności, dane są pobierane z arkusza TimeOff, z tabeli tOffWork, która zawiera informacje o okresach, w których pracownicy nie byli obecni w pracy. Celem jest stworzenie raportu przedstawiającego liczbę dni nieobecności w każdym miesiącu dla wszystkich sprzedawców. Praca z tymi danymi może być jednak utrudniona przez różnorodność formatów danych, które występują w tej samej tabeli. Na przykład, trzeci wiersz zawiera tylko jedną datę, która jest zinterpretowana przez Excel jako wartość daty, podczas gdy pozostałe wiersze traktowane są jako tekst. To rozróżnienie może powodować problemy w dalszym przetwarzaniu danych.

Po załadowaniu danych do Power Query, za pomocą polecenia „From Table/Range”, pojawia się dodatkowy problem – Excel standardowo importuje daty z komponentem godziny, co utrudnia późniejsze operacje na czasie. Warto zauważyć, że kolumna z danymi o nieobecnościach jest typem "any" (dowolnym), co oznacza, że mogą się w niej znajdować różne typy danych. Jednak próba usunięcia składnika godziny nie będzie skuteczna na tym etapie, ponieważ Excel traktuje go jako część formatu daty i godziny.

Pierwszą operacją, którą należy wykonać, jest podzielenie okresów nieobecności na poszczególnych pracowników. Należy wybrać odpowiednią kolumnę, skorzystać z funkcji "Split Column" i wybrać opcję "By Delimiter", używając średnika jako delimitera. Kolejnym ważnym krokiem jest podzielenie tych wartości na wiersze zamiast na kolumny. Dzięki temu każda osobna wartość (np. pojedyncza data) zostaje umieszczona w osobnym wierszu, a Power Query traktuje dane jako tekst. Po podzieleniu okresów, warto upewnić się, że wszystkie nadmiarowe spacje zostały usunięte, co można zrobić za pomocą funkcji Trim.

W dalszym etapie danych, kiedy rozdzielono kolumny na dwie, warto przejść do kolejnej operacji – wypełnienia brakujących wartości w przypadku pojedynczych dni nieobecności. Należy stworzyć nową kolumnę warunkową, która będzie sprawdzać, czy w drugiej kolumnie znajduje się wartość null, a jeśli tak, to zaktualizuje tę wartość zgodnie z danymi z pierwszej kolumny. Dzięki tej operacji dane stają się pełniejsze i bardziej spójne. Kolejnym krokiem jest utworzenie sekwencji dni pomiędzy dwiema datami, co można zrobić, używając funkcji konwersji dat na liczby oraz operatora sekwencji.

Aby zakończyć proces, należy rozwinąć kolumnę z generowaną sekwencją dni, zmieniając jej typ danych na Date. Teraz mamy pełną tabelę z listą dni nieobecności każdego pracownika. Kolejnym krokiem jest wyciągnięcie nazw miesięcy z dat, a następnie grupowanie danych w celu uzyskania liczby dni nieobecności w każdym miesiącu dla każdego pracownika. Te kroki prowadzą do ostatecznego raportu, który pozwala na dokładne śledzenie nieobecności w pracy.

Proces ten pokazuje, jak zaawansowane techniki przetwarzania danych w Power Query mogą być wykorzystywane do realizacji konkretnych celów biznesowych, takich jak tworzenie raportów o nieobecnościach czy przypisywanie ocen w edukacji. Zastosowanie odpowiednich narzędzi i funkcji pozwala na szybkie i dokładne przetwarzanie dużych zbiorów danych, a także na ich analizowanie i przedstawianie w przejrzysty sposób.

Ponadto, dla pełniejszego zrozumienia tematu, warto zaznaczyć, że w praktyce często pojawiają się sytuacje, w których dane wejściowe zawierają nieoczekiwane błędy formatowania lub niespójności, co wymaga stosowania dodatkowych metod czyszczenia i walidacji danych. Bez tych operacji, wyniki przetwarzania mogą być błędne, a raporty – niewiarygodne. Dlatego każdą operację w Power Query warto przeprowadzać z dużą starannością, dbając o to, by dane były poprawne na każdym etapie przetwarzania.

Jak zaplanować mecze i parowania graczy w Power Query?

Zadanie tworzenia par graczy w Power Query nie ogranicza się jedynie do podstawowego łączenia danych. Wymaga zastosowania bardziej złożonych operacji, aby uwzględnić wszystkie możliwe zestawienia, w tym eliminację par, w których gracz spotyka się sam ze sobą, a także generowanie pełnej listy meczów, w której każdy gracz zmierzy się z każdym innym.

Pierwszym krokiem w procesie parowania graczy jest rozszerzenie tabeli. Standardowa operacja w Power Query umożliwia dodanie dodatkowych kolumn, które zawierają wartości z innej tabeli, w tym przypadku imiona drugiego gracza. Zaczynamy od użycia formuły w pasku formuł:

mathematica
= Table.ExpandTableColumn(#"Added Custom", "Player2", {"Name"}, {"Player2"})

Ta operacja dodaje kolumnę "Player2", która zawiera imiona wszystkich graczy powiązanych z każdym graczem. W rezultacie tabela powinna zawierać 25 wierszy (5 graczy × 5 graczy), w tym pary, w których gracz spotyka się sam ze sobą. Aby usunąć te samoparowania, należy wykonać kilka kroków. Pierwszym z nich jest zduplikowanie zapytania, co pozwoli zachować obie wersje par – z samym sobą i bez niego. W tym celu:

  1. Klikamy prawym przyciskiem myszy na zapytanie tPlayers i wybieramy opcję "Duplikuj".

  2. W zduplikowanym zapytaniu otwieramy filtr w nagłówku kolumny "Player2", wybieramy "Filtry tekstowe" i ustawiamy opcję "Nie równa się" (Does Not Equal).

  3. W oknie filtrów należy wprowadzić wartość 1 jako tymczasowy symbol, a po jej zatwierdzeniu zmienić kod na:

pgsql
= Table.SelectRows(#"Expanded Player2", each [Player2] <> [Player1])

Dzięki tej zmianie uzyskujemy tabelę, w której usunięto pary samych graczy. Teraz tabela powinna zawierać 20 wierszy, gdzie każdy gracz jest sparowany z innymi graczami, ale nie ze sobą.

Kolejnym krokiem jest stworzenie pełnej listy meczów, w której każdy gracz będzie miał możliwość rozegrania meczu z każdym innym. W tym celu wykorzystujemy podejście iteracyjne, które opiera się na przekształceniu tabeli graczy w listę. Proces zaczyna się od zduplikowania zapytania:

  1. Klikamy prawym przyciskiem myszy na zapytanie tPlayers i wybieramy opcję "Duplikuj".

  2. Usuwamy wszystkie kroki z wyjątkiem pierwszego (Source).

  3. Następnie konwertujemy kolumnę na listę za pomocą opcji "Drill Down" lub "Konwertuj na listę" w zakładce Transformuj.

Zmieniamy kod na:

pgsql
= Excel.CurrentWorkbook(){[Name="tPlayers"]}[Content][Name]

Po tej operacji mamy jednokolumnową tabelę, którą możemy traktować jako listę graczy. Kolejnym krokiem jest dodanie do tej listy indeksów, które pozwolą na przypisanie graczy do par. W tym celu:

  1. Klikamy na ikonkę fx obok paska formuł.

  2. W nowym kroku wprowadzamy formułę:

mathematica
= List.Positions(Players)

Otrzymujemy listę numerów pozycji, która będzie wykorzystywana do tworzenia par. Następnie przekształcamy listę, aby każdy gracz miał przypisaną listę przeciwników, bazując na numerach pozycji:

mathematica
= List.Transform(Indexes, (i) => List.Range(Indexes, i + 1, List.Count(Indexes) - i - 1))

Po tej operacji lista zawiera pary graczy, ale w postaci indeksów, które należy połączyć w pełne zestawienia, używając odpowiedniego formatu:

mathematica
= List.Transform(Indexes, (i) => List.Transform( List.Range(Indexes, i + 1, List.Count(Indexes) - i - 1),(j) => [Player1=Players{i}, Player2=Players{j}]))

Każda kombinacja graczy staje się teraz osobnym rekordem z dwoma graczami. Ostatnim krokiem jest złączenie tych rekordów w pełną listę meczów za pomocą:

sql
= List.Combine(Matches)

Teraz mamy pełną listę par, w której każdy gracz spotyka się z każdym innym. Możemy ją wykorzystać do dalszego przetwarzania, na przykład generowania terminarza meczów.

Warto zrozumieć, że proces ten nie kończy się na prostym połączeniu tabel, lecz wymaga zastosowania zaawansowanych funkcji Power Query, które pozwalają na iteracyjne przetwarzanie danych i generowanie wszystkich możliwych zestawień. Tylko dzięki temu możemy uzyskać dynamiczne parowanie graczy, które można później wykorzystać w szerokim zakresie analiz.

Ważnym aspektem jest również optymalizacja tego procesu, szczególnie przy większych zbiorach danych. Warto pamiętać, że każde przekształcenie danych w Power Query wpływa na wydajność, a zbyt złożone operacje mogą znacząco spowolnić przetwarzanie, dlatego warto testować różne podejścia i dbać o ich efektywność.