Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!

Pandas to najpopularniejsza biblioteka Pythona do pracy z danymi w formie tabel. Wczytuje pliki CSV, Excela czy dane z bazy, pozwala je filtrować, grupować i liczyć, a na końcu narysować wykres - wszystko w kilku czytelnych liniach. W tym artykule zainstalujemy pandas od zera, a potem na prawdziwym zbiorze sprzedaży sklepu internetowego przejdziemy przez całą ścieżkę: od wczytania danych, przez filtrowanie i grupowanie, aż po gotowy wykres do raportu. Ten sam plik i ten sam kod odtworzysz u siebie w kilka minut - dane są do pobrania niżej.
Jeśli Pythona dopiero zaczynasz, warto najpierw zajrzeć do naszego bezpłatnego kursu Python od podstaw, a potem wrócić tutaj. Do przejścia przez ten artykuł wystarczy jednak podstawowa znajomość języka.
sprzedaz_sklep_internetowy.csv - 4300 zamówień sklepu z lat 2024-2025 (kategoria, produkt, miasto, ilość, cena). Dokładnie ten sam plik widzisz na wszystkich zrzutach poniżej. Zapisz go w folderze, z którego będziesz uruchamiać Pythona.Pandas dodaje do Pythona jeden kluczowy obiekt: DataFrame, czyli dwuwymiarową tabelę z nazwanymi kolumnami i ponumerowanymi wierszami - tak jak arkusz w Excelu, tylko sterowany kodem. Pojedyncza kolumna DataFrame to obiekt Series. Każda kolumna ma swój typ danych, po angielsku dtype (skrót od data type): liczby całkowite, liczby z przecinkiem, tekst albo daty. Ten typ decyduje o tym, co można z kolumną zrobić - na liczbach policzysz średnią, a z daty wyciągniesz miesiąc.

Cała reszta pandas sprowadza się do operacji na tym obiekcie: wybierz kolumny, odfiltruj wiersze, pogrupuj, policz, narysuj. Zobaczmy to na żywym przykładzie, ale najpierw zainstalujmy bibliotekę.
Zakładamy, że masz zainstalowanego Pythona w wersji 3.9 lub nowszej. Jeśli jeszcze nie, przeprowadzi Cię przez to nasz wpis Instalacja Pythona i PyCharma. Mając Pythona, pandas instalujesz jednym poleceniem w terminalu (w Windowsie to Wiersz polecenia lub PowerShell, na macOS i Linuksie - Terminal):
pip install pandas
Na macOS i Linuksie polecenie brzmi często pip3 install pandas, bo samo pip może wskazywać na starego Pythona 2. Dobrym nawykiem jest tworzenie osobnego środowiska wirtualnego (po angielsku virtual environment) dla każdego projektu. To odizolowany katalog z własnym kompletem bibliotek, dzięki któremu projekty nie mieszają sobie wersji pakietów:
python -m venv .venv
# Windows:
.venv\Scripts\activate
# macOS / Linux:
source .venv/bin/activate
pip install pandasPo instalacji warto sprawdzić, czy wszystko działa. Uruchamiamy Pythona i importujemy pandas. Przyjęło się skracać nazwę do pd - zobaczysz ten zapis w każdym przykładzie w sieci:
python -c "import pandas as pd; print(pd.__version__)"
Pracujemy na pliku sprzedaz_sklep_internetowy.csv (jeśli jeszcze go nie masz, pobierz go tutaj). To 4300 zamówień fikcyjnego sklepu z elektroniką: data zamówienia, kategoria, produkt, miasto, kanał sprzedaży, ilość i cena jednostkowa. Wczytujemy plik funkcją read_csv i od razu oglądamy pierwsze wiersze metodą head. Parametr parse_dates mówi pandas, żeby kolumnę z datą potraktował jako datę, a nie zwykły tekst:
import pandas as pd
df = pd.read_csv("sprzedaz_sklep_internetowy.csv", parse_dates=["data"])
df.head()
Kod uruchamiamy w notatniku Jupyter, dlatego ostatnia linia komórki od razu wyświetla ładnie sformatowaną tabelę. W zwykłym skrypcie dopisałbyś print(df.head()). O Jupyterze więcej w części o Anacondzie.
Ile w ogóle mamy danych? Atrybut shape zwraca liczbę wierszy i kolumn:
df.shape
Zanim cokolwiek policzymy, warto poznać strukturę tabeli. Metoda info wypisuje listę kolumn, liczbę niepustych wartości i typ danych każdej kolumny:
df.info()
Zwróć uwagę na typy danych: data jest typu datetime64 (dzięki parse_dates), ceny to float64 (liczby z przecinkiem), a nazwy to str (tekst). Gdyby data była zwykłym tekstem, nie moglibyśmy wyciągnąć z niej miesiąca ani zrobić wykresu w czasie.
Jedno polecenie daje komplet statystyk dla wszystkich kolumn liczbowych: średnią, odchylenie standardowe, wartości minimalną i maksymalną oraz kwartyle. Metoda round zaokrągla wynik dla czytelności:
df.describe().round(2)
To bezcenne przy pierwszym kontakcie z danymi. Od razu widać zakres cen, typową ilość w zamówieniu i to, czy nie ma podejrzanych wartości, na przykład ujemnych. Wiersz 50% to mediana, czyli wartość środkowa - odporniejsza na pojedyncze bardzo drogie zamówienia niż zwykła średnia.
Pojedynczą kolumnę wybierasz przez df["nazwa"], a kilka kolumn naraz przez listę nazw w podwójnych nawiasach kwadratowych:
df[["produkt", "cena_jedn"]].head()
Najczęstsza operacja to jednak filtrowanie wierszy po warunku. Zapis w środku nawiasu (df["cena_jedn"] > 5000) tworzy tak zwaną maskę logiczną, czyli kolumnę wartości prawda albo fałsz dla każdego wiersza. Pandas zwraca tylko te wiersze, dla których warunek jest prawdziwy:
df[df["cena_jedn"] > 5000].head()
Warunki można łączyć operatorami & (i) oraz | (lub), pamiętając o nawiasach wokół każdego z nich, na przykład df[(df["kategoria"] == "Laptopy") & (df["ilosc"] > 1)]. Do precyzyjnego wskazywania wierszy i kolumn służą też df.loc (po etykietach) oraz df.iloc (po numerach pozycji).
W danych mamy ilość i cenę jednostkową, ale nie ma przychodu. Policzmy go. W pandas nie potrzeba do tego pętli - mnożymy dwie kolumny naraz, a wynik trafia do nowej kolumny. To tak zwana wektoryzacja: operacja wykonuje się od razu na całej kolumnie, dzięki czemu zapis jest krótki, a obliczenie bardzo szybkie. Do podglądu wybieramy zamówienia z ilością większą niż 1, żeby od razu było widać efekt mnożenia:
df["przychod"] = df["ilosc"] * df["cena_jedn"]
df[df["ilosc"] > 1][["produkt", "ilosc", "cena_jedn", "przychod"]].head()
Które zamówienia były największe? Metoda nlargest zwraca wiersze o najwyższej wartości wskazanej kolumny, tutaj dziesięć zamówień o najwyższym przychodzie. Na końcu wybieramy kilka kolumn, żeby wynik był czytelny:
df.nlargest(10, "przychod")[["data", "produkt", "ilosc", "cena_jedn", "przychod"]]
Najciekawsze pytania dotyczą grup: która kategoria zarabia najwięcej, które miasto kupuje najchętniej. Służy do tego groupby, które działa według schematu podziel, policz, połącz (po angielsku split-apply-combine): pandas dzieli dane na grupy według wskazanej kolumny, w każdej grupie wykonuje obliczenie (tu sumę przychodu), a potem składa wyniki w jedną tabelę. Na koniec sortujemy malejąco:
przychod_kat = df.groupby("kategoria")["przychod"].sum().sort_values(ascending=False)
przychod_kat
Liczby robią wrażenie, ale wykres przekonuje szybciej. Pandas ma wbudowane rysowanie - metoda plot na naszym wyniku tworzy gotowy wykres słupkowy. Parametr kind="barh" to słupki poziome, a color ustawia ich kolor:
przychod_kat.sort_values().plot(kind="barh", color="#E02D33",
title="Przychód wg kategorii", xlabel="przychód [zł]");
Średnik na końcu linii to drobiazg z notatnika Jupyter - ukrywa techniczny komunikat o obiekcie wykresu. W zwykłym skrypcie dopisz na górze import matplotlib.pyplot as plt, a na dole plt.show(), żeby okno z wykresem się pojawiło. Pandas rysuje przy pomocy biblioteki matplotlib, którą instaluje się tak samo prosto: pip install matplotlib.
Chcesz przejść od pojedynczych analiz do sprawnej, codziennej pracy z danymi w Pythonie pod okiem praktyka? Szkolenie Analiza danych w języku Python ma terminy gwarantowane.
Uwaga na pułapkę: największy przychód nie znaczy najwięcej zamówień. Metoda value_counts zlicza, ile razy występuje każda wartość w kolumnie:
df["kategoria"].value_counts()
To jest właśnie ten moment, dla którego robi się analizę danych. Akcesoria to najczęstsze zamówienia, ale najniższy przychód - dużo tanich transakcji. Z laptopami jest odwrotnie: mało zamówień, ale każde wysokie. Bez zestawienia tych dwóch liczb łatwo o złą decyzję, na przykład o promowaniu nie tej kategorii, co trzeba.
Jeśli znasz tabele przestawne z Excela, poczujesz się jak w domu. pivot_table rozkłada jedną wartość na dwa wymiary. Sprawdźmy przychód w układzie kategoria (wiersze) wobec kanału sprzedaży (kolumny). Parametr margins=True dodaje wiersz i kolumnę z sumami:
pd.pivot_table(df, values="przychod", index="kategoria",
columns="kanal", aggfunc="sum", margins=True).round(0)
Skoro kolumna z datą ma typ daty, możemy łatwo agregować po czasie. Ustawiamy datę jako indeks, a metoda resample grupuje dane w równe przedziały czasu. Tutaj "ME" oznacza końce kolejnych miesięcy (od angielskiego month end). Sumujemy przychód i od razu rysujemy:
miesiecznie = df.set_index("data").resample("ME")["przychod"].sum()
miesiecznie.plot(marker="o", color="#E02D33",
title="Miesięczny przychód", xlabel="", ylabel="przychód [zł]");
Jednym spojrzeniem widać sezonowość: pod koniec roku sprzedaż wystrzeliwuje w górę - najwyższy słupek na całym wykresie to grudzień, a zaraz po nim, w styczniu i lutym, przychód gwałtownie spada. Taka informacja jest warta realnych pieniędzy - podpowiada, kiedy zwiększyć zapasy i budżet reklamowy. A wyciągnęliśmy ją z surowego pliku CSV w kilku liniach kodu.
Do tej pory instalowaliśmy pandas przez pip. Jest jednak druga popularna droga: Anaconda. To gotowa dystrybucja Pythona przeznaczona do analizy danych i pracy naukowej. W jednym instalatorze dostajesz Pythona oraz komplet bibliotek - pandas, numpy, matplotlib - a także notatnik Jupyter i własny menedżer pakietów o nazwie conda. Nie musisz nic dobierać ręcznie.

Różnica w praktyce sprowadza się do menedżera pakietów. Zamiast pip install używasz conda install, a osobne środowiska tworzysz poleceniem conda create. Conda potrafi sprawnie rozwiązać trudne zależności bibliotek kompilowanych, co bywa kłopotliwe przy czystym pip na Windowsie. Tak wygląda założenie nowego środowiska z pandas i Jupyterem oraz sprawdzenie wersji:
conda create -n analiza_danych python=3.12 pandas jupyter
conda activate analiza_danych
conda list pandas
Z Anacondą dostajesz też Jupyter Notebook - interaktywne środowisko, w którym kod pisze się w komórkach uruchamianych po kolei, a wynik (tabela albo wykres) pojawia się od razu pod komórką. To dlatego wszystkie zrzuty w tym artykule wyglądają tak, a nie jak wydruk z terminala. Jupyter uruchomisz z poziomu Anaconda Navigator (graficznego menu dystrybucji) albo poleceniem jupyter notebook:

Które podejście wybrać? Jeśli dopiero zaczynasz i chcesz tylko pobawić się danymi, pip install pandas w zupełności wystarczy. Jeśli planujesz poważniej wejść w analizę danych i uczenie maszynowe, Anaconda oszczędzi Ci sporo instalowania i konfiguracji. Jednej zasady warto pilnować: w obrębie jednego środowiska nie mieszaj pip i conda, bo łatwo wtedy o konflikt wersji.
Masz już komplet podstaw: instalacja, wczytywanie danych, filtrowanie, grupowanie, tabele przestawne i wykresy. To fundament, na którym stoi cała analiza danych i uczenie maszynowe w Pythonie. Kolejne naturalne kroki to numpy (obliczenia na tablicach liczb), ładniejsze wykresy w matplotlib i seaborn, a potem scikit-learn - biblioteka do budowania modeli uczenia maszynowego, która dane wejściowe przyjmuje właśnie jako DataFrame z pandas. Gdy dane przestaną mieścić się na jednym komputerze, w grę wchodzą współczesne rozwiązania big data, w których składnia pandas wraca w narzędziach rozproszonych.
Najlepszy sposób na naukę to własne ćwiczenia. Pobierz plik z danymi, otwórz notatnik i spróbuj odpowiedzieć na własne pytania: które miasto kupuje najdrożej, jak wypada sprzedaż w poszczególnych kanałach, który produkt ma największy udział w swojej kategorii. Każda z tych odpowiedzi to jedno albo dwa polecenia, które już znasz.
Jeśli wolisz uczyć się w uporządkowany sposób i pracować na realnych projektach, prowadzimy szkolenie, które przechodzi całą tę ścieżkę: od podstaw Pythona, przez analizę danych w pandas, aż po pierwsze modele uczenia maszynowego. Kurs ma terminy gwarantowane, więc masz pewność, że grupa się odbędzie.

Komentarze (0)
Brak komentarzy...