Blog JSystems - uwalniamy wiedzę!

Szukaj
Wykres słupkowy przychodu według kategorii i wykres liniowy miesięcznego przychodu zbudowane w pandas i matplotlib
Efekt kilkunastu linii kodu w pandas: przychód według kategorii i miesięczny trend sprzedaży. Do tego dojdziemy w tym artykule, pracując na jednym pliku CSV.

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.

Z tego artykułu dowiesz się:
Pobierz dane do ćwiczeńPlik 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.
Pobierz plik CSV

Czym jest pandas i najważniejsze pojęcie: DataFrame

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.

Infografika anatomii obiektu DataFrame w pandas: indeks, kolumny, typy danych dtype oraz różnica między DataFrame a Series
Anatomia DataFrame: kolumny mają nazwy i typy (dtype), wiersze mają indeks (etykiety 0, 1, 2...). Jedna kolumna to obiekt Series.

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ę.

Instalacja pandas przez pip

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
Terminal z instalacją pandas przez pip: pobieranie pakietów pandas i numpy oraz komunikat Successfully installed
Instalacja pandas przez pip. Menedżer pakietów sam dociąga zależności (m.in. numpy) i kończy komunikatem Successfully installed.

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 pandas

Po 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__)"
Terminal z weryfikacją instalacji pandas: import pandas as pd oraz wypisana wersja biblioteki
Sprawdzenie, że pandas działa: import biblioteki i odczyt numeru wersji. Jeśli nie widzisz błędu, możemy zaczynać analizę.

Wczytanie danych - pierwszy DataFrame

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()
Notatnik Jupyter: wczytanie pliku CSV do pandas metodą read_csv i podgląd pierwszych pięciu wierszy tabeli metodą head
Metoda head() pokazuje pierwsze pięć wierszy. Widać wszystkie kolumny i pierwsze zamówienia - dane wczytały się poprawnie.

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
Notatnik Jupyter: atrybut shape zwraca liczbę wierszy i kolumn DataFrame - cztery tysiące trzysta wierszy i osiem kolumn
shape zwraca parę liczb: 4300 wierszy i 8 kolumn. Pierwsza liczba to zawsze liczba wierszy.

Zanim cokolwiek policzymy, warto poznać strukturę tabeli. Metoda info wypisuje listę kolumn, liczbę niepustych wartości i typ danych każdej kolumny:

df.info()
Notatnik Jupyter: metoda info wypisuje kolumny DataFrame, liczbę niepustych wartości i typy danych dtype każdej kolumny
info() to pierwszy raport o danych: nazwy kolumn, brak braków (4300 wartości wszędzie) oraz typy - liczby, tekst (str) i data (datetime64).

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.

Szybkie podsumowanie liczb metodą describe

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)
Notatnik Jupyter: metoda describe pokazuje statystyki opisowe kolumn liczbowych pandas - średnia, minimum, maksimum i kwartyle
describe() liczy statystyki jednym poleceniem. Widać między innymi średnią cenę jednostkową i najdroższe zamówienie w całym zbiorze.

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.

Wybieranie kolumn i filtrowanie wierszy

Pojedynczą kolumnę wybierasz przez df["nazwa"], a kilka kolumn naraz przez listę nazw w podwójnych nawiasach kwadratowych:

df[["produkt", "cena_jedn"]].head()
Notatnik Jupyter: wybieranie dwóch kolumn z DataFrame w pandas przez listę nazw w nawiasach kwadratowych
Wybranie dwóch kolumn: produkt i cena jednostkowa. Podwójne nawiasy kwadratowe oznaczają listę kolumn do pokazania.

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()
Notatnik Jupyter: filtrowanie wierszy DataFrame w pandas po warunku - zamówienia z ceną jednostkową powyżej 5000 złotych
Filtr po warunku: tylko zamówienia droższe niż 5000 zł za sztukę. To najczęściej używana operacja w codziennej analizie danych.

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).

Tworzenie nowej kolumny - przychód

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()
Notatnik Jupyter: tworzenie nowej kolumny przychód w pandas przez pomnożenie kolumn ilość i cena jednostkowa
Nowa kolumna przychód powstaje z pomnożenia dwóch istniejących kolumn. Na zamówieniach z ilością większą niż 1 wyraźnie widać, że przychód to ilość razy cena jednostkowa.

Sortowanie i największe zamówienia

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"]]
Notatnik Jupyter: metoda nlargest w pandas zwraca dziesięć zamówień o najwyższym przychodzie posortowanych malejąco
Dziesięć największych zamówień według przychodu. Na szczycie drogie laptopy kupowane po dwie sztuki. Ogólne sortowanie robi metoda sort_values.

Grupowanie - serce analizy (groupby)

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
Notatnik Jupyter: grupowanie danych w pandas metodą groupby - suma przychodu według kategorii posortowana malejąco
groupby sumuje przychód w każdej kategorii. Widać od razu, że Laptopy i Smartfony odpowiadają za większą część obrotu.

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:

Pierwszy wykres wprost z danych

przychod_kat.sort_values().plot(kind="barh", color="#E02D33",
                                title="Przychód wg kategorii", xlabel="przychód [zł]");
Notatnik Jupyter: poziomy wykres słupkowy przychodu według kategorii narysowany w pandas metodą plot z biblioteką matplotlib
Ten sam wynik jako wykres słupkowy - kilka słów w wywołaniu plot() i mamy gotowy obraz do raportu. Laptopy na czele.

Ś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.

Ile zamówień w każdej kategorii - value_counts

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()
Notatnik Jupyter: metoda value_counts w pandas zlicza liczbę zamówień w każdej kategorii produktów
value_counts liczy zamówienia w kategoriach. Akcesoria mają ich najwięcej, choć w przychodzie były na ostatnim miejscu.

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.

Tabela przestawna - pivot_table

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)
Notatnik Jupyter: tabela przestawna pivot_table w pandas - przychód według kategorii i kanału sprzedaży z podsumowaniem
Tabela przestawna: kategoria wobec kanału sprzedaży. Kolumna All to suma dla każdej kategorii, a wiersz All - dla każdego kanału.

Analiza w czasie - trend miesięczny (resample)

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ł]");
Notatnik Jupyter: wykres liniowy miesięcznego przychodu w pandas po grupowaniu czasu metodą resample z widocznymi szczytami sprzedaży
Miesięczny przychód na wykresie liniowym. Najwyższe słupki wypadają na przełomie roku (Black Friday i sezon świąteczny), a zaraz po nich, w styczniu i lutym, przychód gwałtownie spada.

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.

Anaconda - gdy chcesz wszystko w jednym pakiecie

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.

Infografika porównania pip i Anacondy do instalacji pandas w Pythonie - kiedy wybrać które narzędzie
pip i Anaconda prowadzą do tego samego pandas. pip jest lżejszy i standardowy, Anaconda daje komplet narzędzi od razu.

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
Anaconda Prompt: tworzenie środowiska conda z pandas i Jupyterem oraz lista zainstalowanych pakietów
conda create zakłada izolowane środowisko i sam dobiera zgodne wersje pakietów. conda list pokazuje, że pandas jest gotowy do pracy.

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:

Aplikacja Jupyter Notebook z otwartym notatnikiem analizy sprzedaży w pandas - pasek narzędzi, komórki kodu i tabela wyników
Notatnik Jupyter w akcji: po lewej kod, pod nim od razu wynik. Każdą komórkę uruchamiasz osobno, budując analizę krok po kroku.

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.

Co dalej

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.

Chcesz przejść od pandas do uczenia maszynowego z trenerem

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.

Baner szkolenia Python od podstaw przez analizę danych do machine learning w JSystems z terminami gwarantowanymi
NEWSLETTER
Nowe artykuły o Pythonie i danych prosto na maila
Co tydzień wysyłamy świeże poradniki z bloga JSystems. Bez spamu, wypisujesz się jednym kliknięciem.
Zapisz się do newslettera -->
Powiększony zrzut ekranu z artykułu o pandas

Najczęściej zadawane pytania

Do czego służy biblioteka pandas?
Pandas to 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, i wszystko to w kilku czytelnych liniach kodu.
Czym jest DataFrame w pandas?
DataFrame to dwuwymiarowa tabela z nazwanymi kolumnami i ponumerowanymi wierszami, podobna do arkusza w Excelu, ale sterowana kodem. Pojedyncza kolumna DataFrame to obiekt Series, a każda kolumna ma swój typ danych, na przykład liczby, tekst albo daty.
Jak zainstalować pandas?
Mając Pythona w wersji 3.9 lub nowszej, instalujesz pandas jednym poleceniem pip install pandas w terminalu. Na macOS i Linuksie bywa to pip3 install pandas. Dobrym nawykiem jest utworzenie osobnego środowiska wirtualnego dla każdego projektu.
Jak przefiltrować wiersze w DataFrame po warunku?
Warunek zapisany w nawiasie kwadratowym tworzy maskę logiczną, czyli kolumnę wartości prawda albo fałsz dla każdego wiersza. Pandas zwraca tylko wiersze, dla których warunek jest prawdziwy. Warunki łączysz operatorami i oraz lub, pamiętając o nawiasach wokół każdego z nich.
Do czego służą metody info i describe?
Metoda info wypisuje listę kolumn, liczbę niepustych wartości i typ danych każdej kolumny, więc od razu widać braki i typy. Metoda describe liczy statystyki kolumn liczbowych: średnią, odchylenie, wartości skrajne i kwartyle. Obie pomagają szybko poznać strukturę danych.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...