Lab 04 - Grupowanie danych i tabele przestawne
Lab 04 - Grupowanie danych, tabele przestawne i wektoryzacja
Wprowadzenie
Grupowanie danych DataFrame.groupby(..)
Metoda groupby
pozwala na wykonanie agregacji danych które posiadają taką samą wartość wskazanych kolumn, po zgrupowaniu można zastosować dowolną funkcję/funkcje agregujące (np. wyznaczyć statystykę: wartość średnią, medianę lub wartości maksymalną czy minimalną).
Do agregacji można używać pojedynczej funkcji: np.
'color').mean() df.groupby(
lub wielu funkcji:
'color').agg(['mean','count']) df.groupby(
Pamiętaj, że mean, median, sum, min i max mogą zostać wyznaczone wyłącznie dla zmiennych liczbowych (min,max również dla zmiennych porządkowych). Dla wszystkich zmiennych w tym nominalnych działają metody count, first, last
🔥 Zadanie 1 🔥
Wczytaj dane temperatur i wyznacz średnią temperaturę, minimalną i maksymalną temperaturę w danym regionie. Następnie wyznacz te same wskazania dla poszczególnych miesięcy.
Multiindex
Grupowanie tworzy hierarchiczną strukturę indexów (multiindex). Dla tego typu danych nadal można wybierać poszczególne rekordy stosując metodę .loc
podając wartość indeksu jako krotkę. np. Dla DataFrame z zadania 1:
wybranie temperatury dla Afryki i Europy w roku 2015 ma formę:
'Europe', 'Africa'], 2015),:] df.loc[([
Jeśli natomiast interesuje nas wybór po elementach z niższego indeksu i wszystkich elementów z wyższego indeksu dla indeksu dla którego chcemy użyć wszystkie elementy należy wpisać slice(None)
. np żeby wybrać temperatury z Afryki z grudnia ze wszystkich lat:
'Africa', slice(None),12),:] df.loc[(
W Pandas możliwe jest usunięcie multiindexów i stworzenie z nich standardowych kolumn:
df.reset_index()
Tabele przestawne (pivot table)
Tabele przestawne umożliwiają "przestawianie danych", np. dla analizowanego w datasetach przykładach pozwalają nie tylko na agregację danych ale również na stworzenie nowych kolumn, po których dokonano grupowania. Przeanalizuj wynik działania następującego kodu:
= data.drop(columns=['Day']).pivot_table(columns='Region', index=['Year','Month'], aggfunc=['min', 'max', 'mean'], values='AvgTemperature' ) df
Efektem jest stworzenie tabeli przestawnej zawierającej statystyki (aggfunc
) - (min, max, mean) dla wszystkich regionów (columns
), i zgrupowanych po roku i miesiącu (index
). Powyższa funkcja robi to samo co kod w zadaniu 1, jednak dodatkowo index regionów rozdziela na kolumny.
Uwaga: użycie .loc
do wybierania kolumn w konfiguracji hierarchicznej (multi-column) odbywa się identycznie jak w przypadku multiindexów.
🔥 Zadanie 2 🔥
Dla datasetu z zadania 1 wyznacz temperatury w grudniu i czerwcu dla wszystkich regionów. Na 2 subplotach (czerwiec/grudzień) wyświetl w formie wykresu liniowego zmiany temperatur w latach obserwacji dla poszczególnych regionów, czy łatwiej ten wykres wygenerować dla tabeli przestawnej czy dla datasetu z zadania 1?
Wektoryzacja
Wektoryzacja to technika przetwarzania danych, która polega na zastosowaniu operacji na całych kolumnach (lub wierszach) zamiast na pojedynczych elementach. W Pandas operacje na kolumnach są wektoryzowane, co oznacza, że można je stosować do całych kolumn jednocześnie. Przeanalizuj poniższy kod, który wyznacza wartość średnią fragmentu sygnału triggerowanego przez zdarzenie:):
= np.random.rand(10000) # Example of a signal
signal_example
# Generate example event timestamps
= np.sort(np.random.randint(1000, 9000, 20)) # Example event timestamps
event_timestamps
# Create a time window around each event (e.g., -200 ms to 200 ms)
= -0.2 # Start 200 ms before the event
window_start = 0.2 # End 200 ms after the event
window_end
# Create a time vector representing the time points for the analysis
= 1000 # Example sampling rate (1 kHz)
sample_rate = np.linspace(window_start, window_end, int((window_end - window_start) * sample_rate) + 1)
time_vector
# Use NumPy vectorized operations to extract segments around each event
= signal_example[(event_timestamps[:, np.newaxis] + sample_rate * time_vector).astype(int)]
segments
# Compute the average signal across all segments using vectorized operations
= np.mean(segments, axis=0) average_signal
🔥 Zadanie 3🔥
Wczytaj i wyświetl sygnał ECG oraz chwile w których wykryto załamki R beatTimestamps. Czas wystąpienia załamka R podawany jest jako index próbki.
Wiedząc, że częstotliwość próbkowania wynosi 500Hz, wyznacza wartość średnią fali ecg w przedziale (-550ms; 400ms) względem wykrytych załamków R. Dla uśrednionego przebiegu zmierz wartość amplitudy załamka P, R, i T, oraz interwał Q-T. Sposób pomiaru przedstawiono na rysunku poniżej.
🔥 Zadanie 4 - końcowe🔥
Wczytaj dataset zawierający informacje o pasażerach Titanica.
- Używając grupowania lub tabeli przestawnej spróbuj stworzyć dataset zawierający informację o liczbie osób które przeżyły katastrofę z podziałem na płeć i klasę w której podróżowały
- Wyznacz udział procentowy osób, które przeżyły z uwzględnieniem płci i klasy biletu
- Wyniki z pkt 2 wyświetl w formie wykresu słupkowego, gdzie bary pogrupowane są wg płci a w obrębie grupy przedstawiony jest procentowa przeżywalność w poszczególnych klasach. Pamiętaj żeby wykres opatrzony był legendą.
Autorzy: Piotr Kaczmarek