1.2 Bibliotecile NumPy și Pandas
NumPy lucrează cu vectori și matrice, Pandas cu tabele. Împreună acoperă 90% din manipularea datelor la ONIA: citire, filtrare, agregare, curățare.
Teorie: NumPy
Vectori și operații vectoriale
Un ndarray stochează numere de același tip. Operațiile se aplică
pe tot vectorul deodată — fără for, mult mai rapid și mai scurt.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.arange(0, 10, 2) # [0 2 4 6 8]
print(a * 2) # [ 2 4 6 8 10] — vectorizat
print(a + b[:5] if len(b)>=5 else a)
print(a.mean(), a.std(), a.max())
m = np.array([[1, 2], [3, 4]]) # matrice 2x2
print(m.shape) # (2, 2)
print(m @ m) # înmulțire de matrice
print(m.T) # transpusa
Indexare și filtrare booleană
x = np.array([3, -1, 7, 0, -5])
print(x[x > 0]) # [3 7] — mască booleană
x[x < 0] = 0 # înlocuiește negativele
print(np.where(x > 2, "mare", "mic"))
x[conditie] este cel mai folosit idiom NumPy/Pandas —
apare în aproape orice soluție de pe platformă.Teorie: Pandas
Crearea și citirea tabelelor
import pandas as pd
df = pd.read_csv("train.csv") # citește tabelul
print(df.head()) # primele 5 rânduri
print(df.shape) # (rânduri, coloane)
print(df.info()) # tipuri + valori lipsă
print(df.describe()) # statistici pe coloanele numerice
Selectare și modificare
df["pret"] # o coloană (Series)
df[["pret", "suprafata"]] # mai multe coloane
df.iloc[0] # primul rând (după poziție)
df.loc[df["pret"] > 100000] # filtrare după condiție
df["pret_mp"] = df["pret"] / df["suprafata"] # coloană nouă
df = df.drop(columns=["id"]) # ștergere coloană
df = df.rename(columns={"pret": "price"})
Agregări și grupări
df["camere"].value_counts() # frecvența valorilor
df.groupby("oras")["pret"].mean() # media pe grupe
df.groupby("oras").agg(
pret_mediu=("pret", "mean"),
numar=("pret", "size"),
)
df.sort_values("pret", ascending=False).head(10)
Curățarea și transformarea datelor
df.isna().sum() # câte valori lipsă are fiecare coloană
df["pret"] = df["pret"].fillna(df["pret"].median())
df = df.drop_duplicates()
df["oras"] = df["oras"].str.strip().str.lower()
df["data"] = pd.to_datetime(df["data"])
df["luna"] = df["data"].dt.month
df["camere"] = df["camere"].map({"una": 1, "doua": 2}).fillna(df["camere"])
Problemă rezolvată: temperatura medie zilnică
Primim măsurători orare și trebuie să calculăm/predictăm temperatura medie zilnică. Esența soluției este exact materia acestei lecții: citire cu Pandas, grupare pe zi, medie.
Ideea soluției
import pandas as pd
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
# media măsurătorilor pe fiecare zi
medii = train.groupby("ziua")["temperatura"].mean().round(2)
sub = pd.DataFrame({
"SampleID": test["SampleID"],
"temp_medie": test["ziua"].map(medii)
})
sub.to_csv("submission.csv", index=False)
Tiparul groupby → agregare → map pe test → to_csv revine constant în problemele
cu date tabelare.
Probleme propuse
Alege orice CSV (de exemplu train.csv de la o problemă de pe platformă) și răspunde
din cod: câte rânduri are, ce coloane au valori lipsă, care e media și mediana fiecărei coloane
numerice, care sunt cele mai frecvente 3 valori ale fiecărei coloane de tip text.
Dintr-un tabel cu anunțuri imobiliare (oraș, preț, suprafață), afișează pentru fiecare oraș prețul mediu pe metru pătrat și păstrează doar orașele cu cel puțin 10 anunțuri.
Primești un CSV cu valori lipsă, dubluri și texte scrise inconsecvent („Bucuresti", „bucurești ").
Scrie o funcție curata(df) care rezolvă toate cele trei probleme și returnează tabelul curat.
Problemele din categoria ML with Structured Data (45 de probleme) încep toate cu explorare Pandas. Alege una ușoară și fă doar partea de explorare + curățare.