Fundamente de programare

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"))
Filtrarea booleană 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"])
Curăță identic train-ul și test-ul. O transformare aplicată doar pe train duce la predicții greșite pe test — una dintre cele mai frecvente greșeli la concurs.

Problemă rezolvată: temperatura medie zilnică

Predicția temperaturii medii zilnice Ușor Rezolvată — 98p

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

1. Statistici pe un CSV Exercițiu

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.

2. Top orașe Exercițiu

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.

3. Curățare de date Exercițiu

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.

4. Pe platformă: ML with Structured Data Platformă

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.