Odcinek 13/15 – Pierwsze kroki z NumPy, pandas i matplotlib

foto kurs pythona odcinek 13

Po co to?

  • NumPy – szybkie liczenie na tablicach (zamiast pętli).
  • pandas – praca na tabelach jak w Excelu, ale w Pythonie.
  • matplotlib – rysowanie podstawowych wykresów.

Po tym odcinku policzysz średnie, posortujesz dane i zrobisz wykres bez bólu głowy.


1) Instalacja w 2 minuty

W terminalu:

pip install numpy pandas matplotlib

Na początek wystarczy zainstalować globalnie. Później poznasz wirtualne środowiska.


2) NumPy – szybkie liczenie na tablicach

Myśl o ndarray jak o „super-liście” liczb: szybka, jedna operacja działa na całą tablicę.

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([10, 10, 10, 10])

print(a + b)     # [11 12 13 14]
print(a * 2)     # [2 4 6 8]
print(a.mean())  # 2.5 (średnia)
print(a.shape)   # (4,) – rozmiar

Tablica 2D (macierz):

M = np.array([[1, 2, 3],
              [4, 5, 6]])
print(M.shape)        # (2, 3)
print(M[0, 1])        # 2 (wiersz 0, kolumna 1)
print(M.sum(axis=0))  # suma kolumn -> [5 7 9]

Tipy NumPy:

  • Licz na tablicach, nie w pętlach – będzie szybciej i czytelniej.
  • Mieszanie typów zmieni całość na float: np.array([1, 2, 3, 3.5]) → float.

3) pandas – tabele jak w Excelu, tylko programowalne

  • Series = jedna kolumna.
  • DataFrame = wiele kolumn (tabela).
import pandas as pd

df = pd.DataFrame({
    "miasto":   ["Gdańsk", "Warszawa", "Poznań", "Gdańsk"],
    "sprzedaz": [120, 300, 180, 130],
    "kategoria":["A", "B", "A", "B"]
})

print(df.head())     # pierwsze wiersze
print(df.info())     # typy kolumn
print(df.describe()) # statystyki liczb

Wybór i filtrowanie:

print(df["sprzedaz"])                # jedna kolumna (Series)
print(df[["miasto", "sprzedaz"]])    # kilka kolumn

wysoka = df[df["sprzedaz"] > 150]    # filtr
print(wysoka)

Nowa kolumna i obliczenia:

df["sprzedaz_z_vat"] = df["sprzedaz"] * 1.23

Grupowanie i agregacje:

gr = df.groupby("miasto")["sprzedaz"].sum()
print(gr)  # suma sprzedaży per miasto

top_kat = (df.groupby("kategoria")["sprzedaz"]
             .mean()
             .sort_values(ascending=False))
print(top_kat)

Braki danych (NaN):

df["rabat"] = [None, 0.1, None, 0.05]
print(df["rabat"].isna().sum())  # ile braków
df["rabat"] = df["rabat"].fillna(0)

CSV: zapis i odczyt:

df.to_csv("sprzedaz.csv", index=False)
df2 = pd.read_csv("sprzedaz.csv")

Modyfikacje rób przez loc (czytelnie i bez ostrzeżeń):

df.loc[df["miasto"] == "Gdańsk", "sprzedaz"] = df["sprzedaz"] + 10

4) matplotlib – szybkie wykresy

import matplotlib.pyplot as plt

# słupki: suma sprzedaży per miasto
by_city = df.groupby("miasto")["sprzedaz"].sum()
by_city.plot(kind="bar", title="Sprzedaż wg miast")
plt.xlabel("Miasto"); plt.ylabel("Sprzedaż")
plt.show()

# linia: przykładowa seria
import numpy as np
x = np.arange(0, 10)
y = x**2
plt.plot(x, y)
plt.title("y = x^2")
plt.show()

# histogram: rozkład sprzedaży
df["sprzedaz"].plot(kind="hist", bins=5, title="Rozkład sprzedaży")
plt.xlabel("Sprzedaż")
plt.show()

Tip: df.plot(...) pod spodem używa matplotlib – kod jest krótszy.


5) Mini-projekt: szybki raport sprzedaży

Cel: policzyć przychód (sprzedaz * cena), sprawdzić top kategorie i narysować wykres.

import pandas as pd
import matplotlib.pyplot as plt

dane = pd.DataFrame({
    "kategoria": ["A","B","A","B","C","A","C","B"],
    "sprzedaz":  [10,  5,  7,  4,  6,  3,  8,  9],
    "cena":      [20, 30, 25, 10, 40, 25, 15, 12]
})

dane["przychod"] = dane["sprzedaz"] * dane["cena"]

raport = (dane.groupby("kategoria")[["sprzedaz","przychod"]]
               .sum()
               .sort_values("przychod", ascending=False))
print(raport)

raport["przychod"].plot(kind="bar", title="Przychód wg kategorii")
plt.ylabel("PLN")
plt.show()

6) Typowe potknięcia (i szybkie remedia)

  • Chained indexing / SettingWithCopyWarning
    Zamiast df[df["x"]>0]["y"]=... → użyj
    df.loc[df["x"]>0, "y"] = ...
  • Złe typy po wczytaniu (liczby jako tekst)
    df["kol"] = pd.to_numeric(df["kol"], errors="coerce")
    lub read_csv(..., dtype=...)
  • Polskie znaki w CSV
    Podawaj encoding="utf-8" przy read_csv/to_csv.
  • Za dużo pamięci
    Wybieraj kolumny (usecols), używaj kategorii:
    df["kol"] = df["kol"].astype("category"), liczby całkowite: Int32.

7) Ćwiczenia (zrób koniecznie)

  1. Mała tabela sprzedaży – DataFrame z kolumnami: miasto, miesiac, sprzedaz.
    Policz sumę sprzedaży dla każdego miasta i wskaż miasto z najwyższą sumą.
  2. Premia warunkowa – dodaj kolumnę premia = sprzedaz * 0.05 tylko tam, gdzie sprzedaz > 150 (użyj loc).
  3. Ceny i mediany – wczytaj (lub zbuduj) kategoria, cena.
    Policz medianę cen w kategoriach i narysuj słupki median.
  4. Histogram – zrób histogram sprzedaży (10 koszyków) i dodaj tytuł i opisy osi.
  5. Udziały kategoriivalue_counts() na kategoria i wykres kołowy udziałów.

Co zabierasz z odcinka 13?

  • NumPy do szybkich obliczeń na tablicach (bez pętli).
  • pandas do wczytywania, filtrowania, grupowania i tworzenia nowych kolumn.
  • matplotlib do prostych wykresów (słupki, linia, histogram).
  • Zestaw praktycznych trików i ostrzeżeń, które oszczędzają czas.