Kodėl pandas tapo duomenų analitikų geriausia drauge
Kai prieš keletą metų pradėjau rimčiau domėtis duomenų analize, greitai supratau vieną dalyką – be pandas bibliotekos Python ekosistemoje gyventi beveik neįmanoma. Šis įrankis tapo tokiu populiariu ne be priežasties. Jis leidžia dirbti su duomenimis taip natūraliai, kad kartais net pamiršti, jog po gražia sintakse slypi sudėtingi algoritmai ir optimizacijos.
Pandas esmė yra paprasta – tai biblioteka, sukurta darbui su struktūrizuotais duomenimis. Jei kada nors dirbote su Excel lentelėmis ar SQL duomenų bazėmis, pandas DataFrame koncepcija jums atrodys labai pažįstama. Tik čia viskas daroma programiškai, o tai reiškia automatizaciją, pakartojamumą ir daug didesnį našumą.
Kas ypač įdomu – pandas kūrėjas Wes McKinney pradėjo šį projektą 2008 metais dirbdamas finansų sektoriuje, kur jam tiesiog trūko tinkamų įrankių duomenų analizei Python kalba. Dabar šia biblioteka naudojasi milijonai specialistų visame pasaulyje, nuo duomenų mokslininkų iki verslo analitikų.
Duomenų struktūros: Series ir DataFrame
Prieš pradedant gilintis į pandas galimybes, būtina suprasti dvi pagrindines duomenų struktūras. Pirma – Series, tai vienmatis masyvas su indeksais. Galite įsivaizduoti ją kaip Excel stulpelį su pavadinimais kiekvienai eilutei. Antra – DataFrame, tai dvimatis duomenų rinkinys, panašus į visą lentelę.
DataFrame yra tikrasis pandas žvaigždė. Jame galite saugoti skirtingų tipų duomenis – skaičius, tekstą, datas – ir manipuliuoti jais labai lanksčiai. Štai paprastas pavyzdys:
import pandas as pd
duomenys = {
'vardas': ['Jonas', 'Petras', 'Ona', 'Ieva'],
'amžius': [28, 34, 29, 31],
'miestas': ['Vilnius', 'Kaunas', 'Klaipėda', 'Vilnius'],
'atlyginimas': [2500, 3200, 2800, 3500]
}
df = pd.DataFrame(duomenys)
Štai ir turite lentelę, su kuria galite dirbti. Kas įdomu – DataFrame indeksavimas yra labai lankstus. Galite pasiekti duomenis pagal stulpelių pavadinimus, eilučių numerius ar net loginius sąlygų masyvus. Tai suteikia neįtikėtiną galią filtruoti ir transformuoti duomenis.
Duomenų įkėlimas ir eksportavimas
Realybėje duomenys retai kada ateina jau paruošti Python kintamuosiuose. Dažniausiai juos reikia įkelti iš išorinių šaltinių. Čia pandas tikrai spindi – biblioteka palaiko daugybę formatų.
CSV failai yra klasika. pd.read_csv('failas.csv') – ir jūsų duomenys jau DataFrame struktūroje. Bet tai tik pradžia. Pandas gali skaityti Excel failus (read_excel), JSON (read_json), SQL duomenų bazes (read_sql), net HTML lenteles iš tinklalapių (read_html).
Praktikoje dažnai susiduriu su situacijomis, kai CSV failai turi keistą struktūrą – netinkamus skyriklus, trūkstamas antraštes ar keistą kodavimą. Pandas turi parametrų šiems atvejams:
df = pd.read_csv('problematiskas.csv',
sep=';', # kitas skyriklis
encoding='utf-8', # koduotė
header=None, # nėra antraštės
names=['stulpelis1', 'stulpelis2']) # nustatome patys
Eksportuoti duomenis taip pat paprasta. Metodai to_csv(), to_excel(), to_json() leidžia išsaugoti rezultatus bet kokiu formatu. Aš asmeniškai dažniausiai naudoju CSV, nes jis universalus ir lengvai skaitomas.
Duomenų valymas ir transformavimas
Štai čia prasideda tikrasis darbas. Jei manote, kad duomenys visada bus švarūs ir tvarkingi – turiu jus nuvilti. Realybėje 80% laiko praleidžiate valydami ir ruošdami duomenis analizei. Pandas šioje srityje yra nepakeičiamas.
Trūkstamų reikšmių valdymas – tai pirmasis iššūkis. Pandas žymi trūkstamas reikšmes kaip NaN (Not a Number). Galite jas aptikti naudodami isnull() arba isna() metodus. O toliau – pasirinkimas: ištrinti eilutes su trūkstamomis reikšmėmis (dropna()) arba užpildyti jas kažkokia verte (fillna()).
Aš dažnai naudoju tokią strategiją – skaitines reikšmes užpildau vidurkiu ar mediana, o kategorines – dažniausiai pasitaikančia verte:
# Užpildome skaitines reikšmes mediana
df['atlyginimas'].fillna(df['atlyginimas'].median(), inplace=True)
# Kategorines - dažniausiai pasitaikančia verte
df['miestas'].fillna(df['miestas'].mode()[0], inplace=True)
Dublikatų šalinimas – kita dažna problema. drop_duplicates() metodas išsprendžia ją viena eilute. Galite nurodyti, pagal kuriuos stulpelius tikrinti dublikatus, ir kaip elgtis – palikti pirmą ar paskutinį įrašą.
Duomenų tipų keitimas taip pat svarbus. Kartais pandas neteisingai atpažįsta duomenų tipą – pavyzdžiui, skaičius interpretuoja kaip tekstą. astype() metodas leidžia tai ištaisyti. Ypač naudinga dirbant su datomis – pd.to_datetime() funkcija puikiai konvertuoja įvairius datos formatų.
Duomenų filtravimas ir atranka
Kai duomenys švarus, pradedame juos tyrinėti. Filtravimas pandas yra intuityvus ir galingas. Galite naudoti loginius operatorius tiesiogiai su DataFrame.
Norite rasti visus darbuotojus iš Vilniaus? Paprasta:
vilniaus_darbuotojai = df[df['miestas'] == 'Vilnius']
Sudėtingesnės sąlygos? Naudokite & (IR) ir | (ARBA) operatorius:
# Vilniaus darbuotojai, vyresni nei 30 metų
filtras = df[(df['miestas'] == 'Vilnius') & (df['amžius'] > 30)]
# Arba iš Vilniaus, arba uždirba daugiau nei 3000
filtras = df[(df['miestas'] == 'Vilnius') | (df['atlyginimas'] > 3000)]
Vienas iš mano mėgstamiausių metodų – query(). Jis leidžia rašyti filtrus kaip tekstines išraiškas, kas kartais būna daug skaitomiau:
rezultatas = df.query('miestas == "Vilnius" and amžius > 30')
loc ir iloc metodai suteikia dar daugiau kontrolės. loc dirba su pavadinimais (label-based), o iloc – su pozicijomis (integer-based). Tai ypač naudinga, kai reikia pasiekti konkrečias eilutes ir stulpelius:
# Pirmosios 3 eilutės, stulpeliai 'vardas' ir 'atlyginimas'
df.loc[0:2, ['vardas', 'atlyginimas']]
# Tos pačios eilutės pagal poziciją
df.iloc[0:3, [0, 3]]
Grupavimas ir agregavimas
Čia pandas tikrai parodo savo jėgą. groupby() metodas leidžia grupuoti duomenis pagal vieną ar kelis stulpelius ir atlikti agregavimo operacijas. Tai panašu į SQL GROUP BY, tik daug lankstesnis.
Tarkime, norite sužinoti vidutinį atlyginimą kiekviename mieste:
vidutiniai_atlyginimai = df.groupby('miestas')['atlyginimas'].mean()
Galite taikyti kelias agregavimo funkcijas vienu metu:
statistika = df.groupby('miestas').agg({
'atlyginimas': ['mean', 'min', 'max'],
'amžius': 'mean'
})
Kas man ypač patinka – galimybė kurti savo agregavimo funkcijas. Jei standartinių (sum, mean, count ir pan.) nepakanka, tiesiog parašote savo:
def atlyginimo_amplitudė(x):
return x.max() - x.min()
df.groupby('miestas')['atlyginimas'].agg(atlyginimo_amplitudė)
pivot_table() metodas – tai Excel pivot lentelių atitikmuo. Jis leidžia greitai sukurti suvestines lenteles su keliais matmenimis. Naudoju jį, kai reikia pateikti duomenis vadovybei – rezultatas atrodo profesionaliai ir lengvai suprantamas.
Laiko eilučių analizė
Jei dirbate su duomenimis, kurie turi laiko komponentę, pandas turi specialių įrankių. Biblioteka puikiai tvarko datas ir laiko eilutes, o tai kritiškai svarbu finansų, IoT ar bet kurioje kitoje srityje, kur laikas svarbus.
Pirmas žingsnis – įsitikinti, kad datos yra tinkamo tipo:
df['data'] = pd.to_datetime(df['data'])
Tada galite naudoti datos komponentus filtravimui ar grupavimui:
# Ištraukti metus, mėnesį, dieną
df['metai'] = df['data'].dt.year
df['mėnuo'] = df['data'].dt.month
df['savaitės_diena'] = df['data'].dt.dayofweek
Laiko eilučių resamplingas – tai galimybė keisti duomenų granuliarumą. Turite kasdienius duomenis, bet reikia mėnesinių? resample() metodas tai padaro:
# Dienos duomenis agreguojame į mėnesinius
mėnesiniai = df.resample('M', on='data').sum()
Slankiųjų vidurkių skaičiavimas taip pat paprastas – rolling() metodas leidžia taikyti funkcijas slankiajam langui. Tai naudinga trendams identifikuoti:
# 7 dienų slankusis vidurkis
df['slankusis_vidurkis'] = df['vertė'].rolling(window=7).mean()
Kaip išspausti maksimalią naudą iš pandas
Po kelių metų darbo su pandas, supratau, kad efektyvumas priklauso ne tik nuo bibliotekos žinojimo, bet ir nuo to, kaip ją naudojate. Štai keletas praktinių patarimų, kurie man labai padeda.
Venkite ciklų – tai aukso taisyklė. Pandas sukurtas vektorinėms operacijoms, o tai reiškia, kad operacijos taikomos visam stulpeliui ar DataFrame vienu metu. Jei rašote for ciklą, kad pereiti per kiekvieną eilutę, greičiausiai darote kažką ne taip. Vietoj to naudokite apply(), map() ar vektorines operacijas.
# Blogai
for i in range(len(df)):
df.loc[i, 'naujas'] = df.loc[i, 'senas'] * 2
# Gerai
df['naujas'] = df['senas'] * 2
Method chaining – tai stilius, kai metodus grandinuojate vienas po kito. Kodas tampa skaitomesnis ir kompaktiškesnis:
rezultatas = (df
.query('amžius > 25')
.groupby('miestas')
.agg({'atlyginimas': 'mean'})
.sort_values('atlyginimas', ascending=False)
)
Atminties optimizavimas – didelių duomenų rinkinių atveju svarbu kontroliuoti atminties naudojimą. Galite sumažinti DataFrame dydį keisdami duomenų tipus. Pavyzdžiui, jei skaičiai niekada neviršija 127, užtenka int8 tipo vietoj int64.
# Patikriname atminties naudojimą
df.memory_usage(deep=True)
# Optimizuojame tipus
df['amžius'] = df['amžius'].astype('int8')
df['miestas'] = df['miestas'].astype('category')
Kategoriniai duomenys – jei stulpelyje yra ribotas unikalių reikšmių skaičius (pvz., miestai, produktų kategorijos), konvertuokite jį į category tipą. Tai gerokai sumažina atminties naudojimą ir pagreitina kai kurias operacijas.
Dar vienas patarimas – naudokite inplace=True parametrą atsargiai. Nors jis atrodo patogus (modifikuoja esamą DataFrame vietoj naujo kūrimo), jis gali sukelti problemų su kodo skaitomumu ir debug’inimu. Dažnai geriau sukurti naują objektą.
Pandas dokumentacija yra puiki, bet kartais per daug detalė. Kai ieškote greito sprendimo, rekomenduoju Stack Overflow ar pandas cheat sheets. Taip pat verta sekti pandas kūrėjų tinklaraščius – jie dažnai dalijasi pažangiomis technikomis ir best practices.
Paskutinis, bet ne mažiau svarbus dalykas – praktika. Pandas yra viena iš tų bibliotekų, kurią išmokstate darydami, ne skaitydami. Paimkite realų duomenų rinkinį (Kaggle pilna jų), ir tiesiog pradėkite eksperimentuoti. Klaidos yra normalu, o kiekviena problema, kurią išsprendžiate, gilina jūsų supratimą.
Pandas nėra tobula – kartais sintaksė atrodo keista, našumas su labai dideliais duomenų rinkiniais gali smukti, o kai kurios operacijos reikalauja nemažai atminties. Bet bendrai tai vienas geriausių įrankių duomenų analizei Python ekosistemoje. Jei rimtai domitės duomenų mokslu ar analize, pandas įvaldymas yra būtinas žingsnis jūsų karjeroje.
