|
|
4 weeks ago | |
|---|---|---|
| .. | ||
| R | 11 months ago | |
| README.md | 4 weeks ago | |
| assignment.md | 6 months ago | |
| notebook-covidspread.ipynb | 6 months ago | |
| notebook-papers.ipynb | 11 months ago | |
| notebook.ipynb | 11 months ago | |
README.md
Rad s podacima: Python i knjižnica Pandas
![]() |
|---|
| Rad s Pythonom - Sketchnote od @nitya |
Iako baze podataka nude vrlo učinkovite načine za pohranu podataka i njihovo upitavanje pomoću jezika za upite, najfleksibilniji način obrade podataka je pisanje vlastitog programa za manipulaciju podacima. U mnogim slučajevima, izvršavanje upita u bazi podataka bilo bi učinkovitije. Međutim, u nekim slučajevima kada je potrebna složenija obrada podataka, to se ne može lako napraviti pomoću SQL-a. Obrada podataka može se programirati u bilo kojem programskom jeziku, ali postoje određeni jezici koji su viša razina u pogledu rada s podacima. Znanstvenici podataka obično preferiraju jedan od sljedećih jezika:
- Python, opći programski jezik koji se često smatra jednom od najboljih opcija za početnike zbog svoje jednostavnosti. Python ima mnoge dodatne knjižnice koje vam mogu pomoći riješiti mnoge praktične probleme, kao što su izvlačenje podataka iz ZIP arhive ili pretvaranje slike u nijanse sive. Osim u znanosti o podacima, Python se također često koristi za web razvoj.
- R je tradicionalni alat razvijen s fokusom na statističku obradu podataka. Također sadrži veliki repozitorij knjižnica (CRAN), što ga čini dobrim izborom za obradu podataka. Međutim, R nije opći programski jezik i rijetko se koristi izvan domene znanosti o podacima.
- Julia je još jedan jezik razvijen posebno za znanost o podacima. Namijenjen je pružanju bolje performanse od Pythona, čineći ga izvrsnim alatom za znanstvene eksperimente.
U ovoj lekciji fokusirat ćemo se na korištenje Pythona za jednostavnu obradu podataka. Pretpostavit ćemo osnovno poznavanje jezika. Ako želite dublji uvod u Python, možete pogledati jedan od sljedećih izvora:
- Naučite Python na zabavan način uz Turtle Graphics i Fraktale - GitHub tijekom brzog uvoda u Python programiranje
- Uzmite svoje prve korake s Pythonom Put učenja na Microsoft Learn
Podaci mogu doći u mnogim oblicima. U ovoj lekciji ćemo razmotriti tri oblika podataka - tablični podaci, tekst i slike.
Usredotočit ćemo se na nekoliko primjera obrade podataka, umjesto da vam damo potpuni pregled svih povezanih knjižnica. To će vam omogućiti da steknete glavnu ideju o tome što je moguće i ostavit će vam razumijevanje gdje pronaći rješenja za vaše probleme kad ih zatrebate.
Najkorisniji savjet. Kad trebate izvršiti neku operaciju na podacima za koju ne znate kako, pokušajte je potražiti na internetu. Stackoverflow obično sadrži mnogo korisnih primjera koda u Pythonu za mnoge tipične zadatke.
Kviz prije lekcije
Tablični podaci i DataFrameovi
Već ste upoznali tablične podatke kada smo razgovarali o relacijskim bazama podataka. Kada imate puno podataka koji su sadržani u mnogim različitim povezanim tablicama, definitivno ima smisla koristiti SQL za rad s njima. Međutim, postoji mnogo slučajeva kada imamo tablicu podataka i trebamo dobiti neko razumijevanje ili uvid u te podatke, poput raspodjele, korelacije između vrijednosti i sl. U znanosti o podacima, često trebamo izvršiti neke transformacije izvornog podatka, praćene vizualizacijom. Oba ta koraka lako se mogu napraviti pomoću Pythona.
Postoje dvije najkorisnije knjižnice u Pythonu koje vam mogu pomoći u radu s tabličnim podacima:
- Pandas omogućuje manipulaciju tzv. DataFrameovima, koji su analogni relacijskim tablicama. Možete imati imenovane stupce i izvoditi različite operacije na redcima, stupcima i DataFrameovima općenito.
- Numpy je knjižnica za rad s tenzorima, tj. višedimenzionalnim nizovima (array). Niz sadrži vrijednosti istog temeljnog tipa, i jednostavniji je od DataFramea, ali nudi više matematičkih operacija i stvara manji režijski trošak.
Postoje i druge knjižnice koje biste trebali poznavati:
- Matplotlib je knjižnica koja se koristi za vizualizaciju podataka i crtanje grafova
- SciPy je knjižnica s dodatnim znanstvenim funkcijama. Već smo naišli na ovu knjižnicu kada smo govorili o vjerojatnosti i statistici
Evo komadić koda koji biste obično koristili za uvoz tih knjižnica na početku vašeg Python programa:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # morate navesti točne podpakete koje trebate
Pandas je usmjeren oko nekoliko osnovnih pojmova.
Series
Series je niz vrijednosti, sličan listi ili numpy nizu. Glavna razlika je da serija također ima indeks, i kada na seriji izvodimo operacije (npr., zbrajamo ih), indeks se uzima u obzir. Indeks može biti jednostavan kao redni broj cijelog broja (to je indeks koji se koristi prema zadanim postavkama pri stvaranju serije iz liste ili niza), ili može imati složenu strukturu, kao što je vremenski interval.
Napomena: U pratećem bilježniku
notebook.ipynbnalazi se uvodni Pandas kod. Ovdje samo izlažemo neke primjere, a svakako ste pozvani da proučite cijeli bilježnik.
Razmotrimo primjer: želimo analizirati prodaju našeg mjesta za sladoled. Generirat ćemo niz brojeva prodaje (broj prodanih stavki svaki dan) za neki vremenski period:
start_date = "Jan 1, 2020"
end_date = "Mar 31, 2020"
idx = pd.date_range(start_date,end_date)
print(f"Length of index is {len(idx)}")
items_sold = pd.Series(np.random.randint(25,50,size=len(idx)),index=idx)
items_sold.plot()
Sad pretpostavimo da svake sedmice organiziramo zabavu za prijatelje i donosimo dodatnih 10 paketa sladoleda za zabavu. Možemo stvoriti drugu seriju, indeksiranu prema tjednu, da to pokažemo:
additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))
Kada zbrojimo dvije serije, dobijemo ukupan broj:
total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()
Napomena da ne koristimo jednostavnu sintaksu
total_items+additional_items. Da jesmo, dobili bismo punoNaN(Not a Number) vrijednosti u rezultirajućoj seriji. To je zato što nedostaju vrijednosti za neke točke indeksa u serijiadditional_items, a dodavanjeNaNna bilo što dajeNaN. Stoga je potrebno koristiti parametarfill_valuetijekom zbrajanja.
Kod vremenskih serija također možemo ponovno uzorkovati seriju s različitim vremenskim intervalima. Na primjer, pretpostavimo da želimo izračunati prosječnu prodaju mjesečno. Možemo koristiti sljedeći kod:
monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')
DataFrame
DataFrame je u biti kolekcija serija s istim indeksom. Možemo kombinirati nekoliko serija u jedan DataFrame:
a = pd.Series(range(1,10))
b = pd.Series(["I","like","to","play","games","and","will","not","change"],index=range(0,9))
df = pd.DataFrame([a,b])
To će stvoriti horizontalnu tablicu poput ove:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 1 | Ja | volim | koristiti | Python | i | Pandas | jako | puno |
Također možemo koristiti Series kao stupce i navesti imena stupaca pomoću rječnika:
df = pd.DataFrame({ 'A' : a, 'B' : b })
To će nam dati tablicu ovakvog izgleda:
| A | B | |
|---|---|---|
| 0 | 1 | Ja |
| 1 | 2 | volim |
| 2 | 3 | koristiti |
| 3 | 4 | Python |
| 4 | 5 | i |
| 5 | 6 | Pandas |
| 6 | 7 | jako |
| 7 | 8 | puno |
| 8 | 9 |
Napomena da ovu strukturu tablice možemo dobiti i transponiranjem prethodne tablice, npr. pisanjem
df = pd.DataFrame([a,b]).T.rename(columns={ 0 : 'A', 1 : 'B' })
Ovdje .T označava operaciju transponiranja DataFramea, tj. promjenu redaka i stupaca, a rename operacija nam omogućava preimenovanje stupaca da odgovaraju prethodnom primjeru.
Evo nekoliko najvažnijih operacija koje možemo izvesti nad DataFrameovima:
Izbor stupca. Možemo odabrati pojedinačne stupce pisanjem df['A'] - ova operacija vraća Series. Također možemo odabrati podskup stupaca u drugi DataFrame pisanjem df[['B','A']] - ovo vraća drugi DataFrame.
Filtriranje samo određenih redaka prema kriterijima. Na primjer, da ostavimo samo one retke kod kojih je stupac A veći od 5, možemo napisati df[df['A']>5].
Napomena: Način na koji filtriranje radi je sljedeći. Izraz
df['A']<5vraća boolean seriju, koja označava je li izrazTrueiliFalseza svaki element u izvornom nizudf['A']. Kad se boolean serija koristi kao indeks, ona vraća podskup redaka u DataFrameu. Stoga nije moguće koristiti proizvoljni Python boolean izraz, na primjerdf[df['A']>5 and df['A']<7]bilo bi pogrešno. Umjesto toga trebate koristiti posebnu operaciju&na boolean serijama, pišućidf[(df['A']>5) & (df['A']<7)](zagrade su važne ovdje).
Kreiranje novih izračunljivih stupaca. Možemo lako stvoriti nove izračunljive stupce za naš DataFrame koristeći intuitivan izraz poput ovog:
df['DivA'] = df['A']-df['A'].mean()
Ovaj primjer izračunava odstupanje A od njegove srednje vrijednosti. Ono što se zapravo događa jest da računamo seriju, te zatim dodjeljujemo tu seriju lijevoj strani, stvarajući novi stupac. Stoga ne možemo koristiti operacije koje nisu kompatibilne sa serijama, na primjer, sljedeći kod je pogrešan:
# Pogrešan kod -> df['ADescr'] = "Low" ako je df['A'] < 5, inače "Hi"
df['LenB'] = len(df['B']) # <- Pogrešan rezultat
Posljednji primjer, iako je sintaktički ispravan, daje nam pogrešan rezultat jer dodjeljuje duljinu serije B svim vrijednostima stupca, a ne duljinu pojedinih elemenata kao što smo zamišljali.
Ako trebamo izračunati složene izraze poput ovog, možemo koristiti funkciju apply. Zadnji primjer možemo napisati na sljedeći način:
df['LenB'] = df['B'].apply(lambda x : len(x))
# ili
df['LenB'] = df['B'].apply(len)
Nakon gore navedenih operacija, dobit ćemo sljedeći DataFrame:
| A | B | DivA | LenB | |
|---|---|---|---|---|
| 0 | 1 | Ja | -4.0 | 1 |
| 1 | 2 | volim | -3.0 | 4 |
| 2 | 3 | koristiti | -2.0 | 2 |
| 3 | 4 | Python | -1.0 | 3 |
| 4 | 5 | i | 0.0 | 1 |
| 5 | 6 | Pandas | 1.0 | 3 |
| 6 | 7 | jako | 2.0 | 6 |
| 7 | 8 | puno | 3.0 | 4 |
| 8 | 9 | 4.0 | 4 |
Odabir redaka prema brojevima može se napraviti korištenjem konstrukta iloc. Na primjer, za odabir prvih 5 redaka iz DataFramea:
df.iloc[:5]
Grupiranje se često koristi za dobivanje rezultata sličnog pivot tablicama u Excelu. Pretpostavimo da želimo izračunati srednju vrijednost stupca A za svaki dani broj LenB. Zatim možemo grupirati naš DataFrame po LenB i pozvati mean:
df.groupby(by='LenB')[['A','DivA']].mean()
Ako trebamo izračunati srednju vrijednost i broj elemenata u grupi, tada možemo koristiti složeniju funkciju aggregate:
df.groupby(by='LenB') \
.aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
.rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})
Ovo nam daje sljedeću tablicu:
| LenB | Count | Mean |
|---|---|---|
| 1 | 1 | 1.000000 |
| 2 | 1 | 3.000000 |
| 3 | 2 | 5.000000 |
| 4 | 3 | 6.333333 |
| 6 | 2 | 6.000000 |
Dobivanje podataka
Vidjeli smo koliko je lako konstruirati Series i DataFrame iz Python objekata. Međutim, podaci obično dolaze u obliku tekstualne datoteke ili Excel tablice. Srećom, Pandas nam nudi jednostavan način za učitavanje podataka s diska. Na primjer, čitanje CSV datoteke je ovako jednostavno:
df = pd.read_csv('file.csv')
Vidjet ćemo još primjera učitavanja podataka, uključujući dohvaćanje s vanjskih web stranica, u odjeljku "Izazov"
Ispisivanje i crtanje
Data Scientist često mora istraživati podatke, stoga je važno moći ih vizualizirati. Kada je DataFrame velik, često želimo samo provjeriti da radimo sve ispravno ispisivanjem prvih nekoliko redaka. To se može napraviti pozivom df.head(). Ako to pokrećete iz Jupyter Notebooka, ispisat će DataFrame u lijepom tabličnom obliku.
Također smo vidjeli upotrebu funkcije plot za vizualizaciju nekih stupaca. Iako je plot vrlo koristan za mnoge zadatke i podržava mnoge različite vrste grafikona preko parametra kind=, uvijek možete koristiti sirovu biblioteku matplotlib za crtanje nečeg složenijeg. Detaljno ćemo obraditi vizualizaciju podataka u posebnim lekcijama.
Ovaj pregled pokriva najvažnije koncepte Pandas biblioteke, no biblioteka je vrlo bogata i nema ograničenja što sve možete s njom napraviti! Sada primijenimo ovo znanje za rješavanje konkretnog problema.
🚀 Izazov 1: Analiza širenja COVID-a
Prvi problem na koji ćemo se fokusirati je modeliranje širenja epidemije COVID-19. Za to ćemo koristiti podatke o broju zaraženih osoba u različitim zemljama, koje pruža Center for Systems Science and Engineering (CSSE) na Sveučilištu Johns Hopkins. Skup podataka dostupan je u ovom GitHub spremištu.
Budući da želimo pokazati kako raditi s podacima, pozivamo vas da otvorite notebook-covidspread.ipynb i pročitate ga od početka do kraja. Također možete izvršavati ćelije i riješiti neke izazove koje smo ostavili za vas na kraju.
Ako ne znate kako pokrenuti kod u Jupyter Notebooku, pogledajte ovaj članak.
Rad s nestrukturiranim podacima
Dok podaci vrlo često dolaze u tabličnom obliku, u nekim slučajevima potrebni su nam manje strukturirani podaci, na primjer tekst ili slike. U tom slučaju, da bismo primijenili tehnike obrade podataka koje smo vidjeli gore, trebamo nekako izvući strukturirane podatke. Evo nekoliko primjera:
- Izvlačenje ključnih riječi iz teksta i praćenje koliko često se te ključne riječi pojavljuju
- Korištenje neuronskih mreža za izvlačenje informacija o objektima na slici
- Dobivanje informacija o emocijama ljudi s video snimke
🚀 Izazov 2: Analiza COVID radova
U ovom izazovu nastavljamo s temom COVID pandemije i fokusiramo se na obradu znanstvenih radova iz tog područja. Postoji CORD-19 Dataset s više od 7000 (u trenutku pisanja) radova o COVID-u, dostupnih s metapodacima i sažetcima (za otprilike polovicu od njih postoji i potpuni tekst).
Cjelovit primjer analize ovog skupa podataka koristeći Text Analytics for Health kognitivnu uslugu opisan je u ovom blog postu. Raspravit ćemo pojednostavljenu verziju te analize.
NAPOMENA: Ne pružamo kopiju skupa podataka kao dio ovog spremišta. Prvo ćete možda morati preuzeti datoteku
metadata.csvs ovog skupa podataka na Kaggleu. Možda je potrebna registracija na Kaggle. Skup podataka možete preuzeti i bez registracije ovdje, no bit će uključen sav puni tekst uz datoteku metapodataka.
Otvorite notebook-papers.ipynb i pročitajte ga od početka do kraja. Također možete izvršavati ćelije i riješiti neke izazove koje smo ostavili za vas na kraju.
Obrada slika
Nedavno su razvijeni vrlo moćni AI modeli koji nam omogućuju razumijevanje slika. Postoji mnogo zadataka koji se mogu riješiti korištenjem unaprijed naučenih neuronskih mreža ili cloud servisa. Neki primjeri uključuju:
- Klasifikacija slika, koja vam može pomoći da kategorizirate sliku u jednu od unaprijed definiranih klasa. Lako možete trenirati vlastite klasifikatore slika koristeći servise poput Custom Vision
- Detekcija objekata za detekciju različitih objekata na slici. Servisi poput Computer Vision mogu detektirati niz uobičajenih objekata, a možete trenirati model Custom Vision za otkrivanje specifičnih objekata od interesa.
- Detekcija lica, uključujući procjenu dobi, spola i emocija. To se može napraviti putem Face API.
Sve te cloud usluge moguće je pozivati pomoću Python SDK-ova, te ih lako uključiti u svoj proces istraživanja podataka.
Evo nekoliko primjera istraživanja podataka iz izvora slika:
- U blog postu Kako naučiti Data Science bez kodiranja istražujemo Instagram fotografije, pokušavajući razumjeti što ljude potiče da daju više lajkova. Prvo izvlačimo što više informacija iz slika korištenjem Computer Vision, zatim pomoću Azure Machine Learning AutoML gradimo tumačivi model.
- U Facial Studies Workshop koristimo Face API za izvlačenje emocija ljudi na fotografijama s događaja, kako bismo pokušali razumjeti što ljude čini sretnima.
Zaključak
Bez obzira imate li već strukturirane ili nestrukturirane podatke, koristeći Python možete izvršiti sve korake vezane uz obradu i razumijevanje podataka. To je vjerojatno najfleksibilniji način obrade podataka, i zato većina data scientista koristi Python kao svoj glavni alat. Dubinsko učenje Pythona dobra je ideja ako ozbiljno pristupate svom Data Science putovanju!
Kviz nakon predavanja
Pregled i samostalno učenje
Knjige
Online resursi
- Službeni 10 minutes to Pandas tutorial
- Dokumentacija za Pandas vizualizaciju
Učenje Pythona
- Nauči Python na zabavan način s Turtle Grafikom i Fraktalima
- Prvi koraci s Pythonom Learning Path na Microsoft Learn
Zadatak
Izvedite detaljniju analizu podataka za gornje izazove
Zasluge
Ovu lekciju je s ljubavlju napisao Dmitry Soshnikov
Napomena: Ovaj dokument je preveden korištenjem AI prevoditeljskog servisa Co-op Translator. Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati greške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za važne informacije preporuča se profesionalni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazumevanja ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.






