04 - Przetwarzanie danych numerycznych z wykorzystaniem bibliotek NumPy oraz pandas

Podstawy przetwarzania danych

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Ćwiczenie laboratoryjne 4: przetwarzanie danych numerycznych z wykorzystaniem bibliotek NumPy oraz pandas

Powrót do spisu treści ćwiczeń laboratoryjnych

Wprowadzenie

Celem tego laboratorium jest praktyczne zapoznanie się z podstawowymi operacjami w bibliotekach NumPy i Pandas, które są podstawowymi narzędziami do pracy z danymi w Pythonie. Biblioteka NumPy oferuje szybkie w obsłudze wielowymiarowe tablice i różnorodne funkcje matematyczne do operowania na nich, dzięki czemu można ją wykorzystać do sprawnego działania na danych macierzowych. Pandas dostarcza wygodnych struktur danych (takich jak DataFrame), umożliwiając łatwe wczytywanie, przetwarzanie i analizę danych ustrukturyzowanych - tabelarycznych.

Przygotowanie środowiska

Zaimportuj do swojego programu niezbędne biblioteki:

import numpy as np
import pandas as pd

Jeśli coś nie działa, upewnij się, że masz zainstalowane biblioteki numpy oraz pandas:

pip install numpy pandas

NumPy – Podstawy

Dlaczego NumPy?

NumPy dostarcza wielowymiarowy typ tablicowy ndarray, który jest znacznie bardziej efektywny pod względem zajętości pamięci i szybkości wykonywania operacji niż standardowe listy Pythona. NumPy pozwala na:

Tworzenie tablic NumPy

Tworzenie tablic może odbywać się na wiele sposobów:

# Tworzenie tablicy z listy Pythona
lista = [1, 2, 3, 4, 5]
tablica = np.array(lista)
print(tablica)

# Tworzenie tablicy z zakresu wartości
tab_od_0_do_9 = np.arange(10)
print(tab_od_0_do_9)

# Tablica wielowymiarowa (2D)
tab_2d = np.array([[1, 2, 3],
                   [4, 5, 6]])
print(tab_2d)

Rozmiar, kształt i typ danych

Tablice NumPy mają atrybuty takie jak shape (kształt tablicy) czy dtype (typ danych):

print("Kształt tab_2d:", tab_2d.shape)
print("Typ danych:", tab_2d.dtype)
print("Liczba wymiarów:", tab_2d.ndim)

Indeksowanie i wycinanie (slicing)

Podobnie jak w listach, tablice NumPy można indeksować oraz “wycinać” fragmenty:

tab = np.arange(10)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("Element o indeksie 3:", tab[3])
print("Fragment od indeksu 2 do 5:", tab[2:6])

Dla tablic wielowymiarowych:

tab_2d = np.array([[10, 20, 30],
                   [40, 50, 60],
                   [70, 80, 90]])

print("Drugi wiersz:", tab_2d[1])
print("Element w 3. wierszu, 2. kolumnie:", tab_2d[2, 1])
print("Fragment - pierwsze dwa wiersze i dwie pierwsze kolumny:\n", tab_2d[:2, :2])

Modyfikacja kształtu tablic

Czasem potrzebujemy zmienić kształt (rozmiar w wymiarach) tablicy:

tab = np.arange(12)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
tab_reshaped = tab.reshape(3, 4)
print(tab_reshaped)

Podstawowe operacje matematyczne

NumPy umożliwia operacje arytmetyczne na całych tablicach:

tab = np.array([1, 2, 3])
print("Dodawanie +10:", tab + 10)
print("Mnożenie *2:", tab * 2)
print("Podniesienie do kwadratu:", tab ** 2)

# Funkcje matematyczne
print("Suma:", np.sum(tab))
print("Średnia:", np.mean(tab))
print("Mediana:", np.median(tab))
print("Odchylenie standardowe:", np.std(tab))

NumPy ma wybudowanych bardzo wiele innych przydatnych funkcji, a więcej informacji znajdziesz na stronie z dokumentacją biblioteki

Operacje logiczne i filtrowanie

Możemy też stosować operacje logiczne, aby wybrać elementy spełniające określony warunek:

tab = np.arange(10)
filtrowane = tab[tab > 5]  # Wybieramy elementy większe niż 5
print(filtrowane)

Operacje logiczne można łączyć w bardziej złożone konstrukcje.

Zadania do samodzielnego wykonania – NumPy

💥 Zadanie 1 💥
Utwórz tablicę NumPy zawierającą liczby od 100 do 109.
Wyświetl jej zawartość, a następnie wyświetl tylko elementy o indeksach od 2 do 5.

💥 Zadanie 2 💥
Utwórz dwuwymiarową tablicę NumPy (3x3) zawierającą liczby od 1 do 9.
Wyświetl drugi wiersz oraz trzeci element z pierwszego wiersza.

💥 Zadanie 3 💥
Mając tablicę tab = np.array([4, 8, 15, 16, 23, 42]), oblicz sumę, średnią i medianę tej tablicy.
Następnie wyświetl tylko te elementy tej tablicy, które są większe niż 10.

💥 Zadanie 4 💥
Utwórz tablicę o nazwie data zawierającą 10 losowych liczb (np. użyj np.random.rand(10)) i oblicz wartość maksymalną oraz minimalną. Wyświetl wyniki.

💥 Zadanie 5: 💥
Utwórz tablicę o kształcie (2,6) z liczbami od 0 do 11. Zmień jej kształt (reshape) na (3,4) i wyświetl nową tablicę.


Pandas – Podstawy

Dlaczego Pandas?

Pandas upraszcza pracę z danymi tabelarycznymi poprzez:

Tworzenie obiektów Series i DataFrame

# Tworzenie Series
ser = pd.Series([10, 20, 30], index=["a", "b", "c"])
print(ser)

# Tworzenie DataFrame z słownika
data = {
    "imie": ["Jan", "Anna", "Kasia"],
    "wiek": [28, 22, 35],
    "miasto": ["Warszawa", "Kraków", "Gdańsk"]
}
df = pd.DataFrame(data)
print(df)

Podstawowe informacje o DataFrame

Każdy DataFrame posiada atrybuty i metody pozwalające uzyskać informacje o danych:

print("Pierwsze wiersze:\n", df.head())
print("Ostatnie wiersze:\n", df.tail())
print("Informacje o DataFrame:\n", df.info())
print("Statystyki:\n", df.describe())

Wczytywanie danych z pliku CSV

Załóżmy, że masz plik dane.csv z następującą zawartością:

produkt,cena,ilosc
jabłko,2.5,10
banan,3.0,5
pomarańcza,4.0,7

Wczytanie takiego pliku do Pandas:

df_csv = pd.read_csv("dane.csv")
print(df_csv)

Wybieranie kolumn i wierszy

Wybieranie kolumn:

print(df_csv["produkt"])
print(df_csv[["produkt", "cena"]])

Wybieranie wierszy za pomocą indeksów:

print("Pierwszy wiersz:\n", df_csv.iloc[0])
print("Dane produktów od 2. do 3. wiersza:\n", df_csv.iloc[1:3])

Filtrowanie danych

Możemy filtrować DataFrame na podstawie warunków logicznych:

# Produkty z ceną powyżej 40
drozsze = df_csv[df_csv["cena"] > 40]
print(drozsze)

Warunki logiczne można łączyć wykorzystując operatory języka Python w celu uzyskania bardziej złożonych efektów.

Podstawowe operacje statystyczne

print("Średnia cena:", df_csv["cena"].mean())
print("Maksymalna ilość:", df_csv["ilosc"].max())

Biblioteka Pandas ma wybudowanych bardzo wiele innych przydatnych funkcji, a więcej informacji znajdziesz na stronie z dokumentacją biblioteki

Dodawanie nowych kolumn i modyfikacje

Możemy dodawać nowe kolumny, wykonując operacje na istniejących:

df_csv["wartosc_sprzedazy"] = df_csv["cena"] * df_csv["ilosc"]
print(df_csv)

Zadania do samodzielnego wykonania – Pandas

💥 Zadanie 1 💥
Utwórz własny DataFrame df_students zawierający kolumny: imie, ocena, miasto.
Dodaj przynajmniej 4 wiersze z danymi (ręcznie).
Wyświetl utworzony DataFrame oraz jego podstawowe statystyki (df_students.describe()).

💥 Zadanie 2 💥
Korzystając z DataFrame df_students, wyświetl tylko kolumnę ocena.

💥 Zadanie 3 💥
Wyświetl z df_students tylko te wiersze, dla których ocena jest większa niż 3.5.

💥 Zadanie 4 💥
Oblicz średnią ocen dla wszystkich studentów w df_students i wyświetl ją.

💥 Zadanie 5 💥
Dodaj do df_students nową kolumnę status – jeśli ocena jest powyżej 3.0, wpisz zaliczony, w przeciwnym przypadku niezaliczony. Skorzystaj z filtrowania i przypisywania wartości do wybranych wierszy.

💥 Zadanie 6 💥
Stwórz plik sales.csv, w którym znajdują się kolumny: produkt, sprzedaz, cena i wypełnij minimum pięć linii danymi przykładowymi.
Wczytaj plik do DataFrame df_sales, a następnie:

💥 Zadanie 7 💥
Korzystając z df_sales, posortuj dane według kolumny cena rosnąco i wyświetl wynik.