22 KiB
Töötamine andmetega: Python ja Pandas teek
![]() |
|---|
| Töötamine Pythoniga - Sketchnote autorilt @nitya |
Kuigi andmebaasid pakuvad väga tõhusaid viise andmete salvestamiseks ja nende pärimiseks päringukeelte abil, on kõige paindlikum viis andmete töötlemiseks kirjutada oma programm, mis andmeid manipuleerib. Paljudel juhtudel oleks andmebaasi päring tõhusam lahendus. Kuid mõnel juhul, kui on vaja keerukamat andmetöötlust, ei saa seda lihtsalt SQL-i abil teha.
Andmetöötlust saab programmeerida mis tahes programmeerimiskeeles, kuid on teatud keeled, mis on andmetega töötamisel kõrgemal tasemel. Andmeteadlased eelistavad tavaliselt ühte järgmistest keeltest:
- Python, üldotstarbeline programmeerimiskeel, mida peetakse sageli üheks parimaks valikuks algajatele selle lihtsuse tõttu. Pythonil on palju lisateeke, mis aitavad lahendada mitmeid praktilisi probleeme, näiteks andmete ekstraheerimine ZIP-arhiivist või pildi teisendamine halltoonidesse. Lisaks andmeteadusele kasutatakse Pythoni sageli ka veebiarenduses.
- R on traditsiooniline tööriistakomplekt, mis on välja töötatud statistiliste andmete töötlemiseks. Sellel on suur teekide repository (CRAN), mis teeb sellest hea valiku andmetöötluseks. Kuid R ei ole üldotstarbeline programmeerimiskeel ja seda kasutatakse harva väljaspool andmeteaduse valdkonda.
- Julia on veel üks keel, mis on spetsiaalselt välja töötatud andmeteaduse jaoks. Selle eesmärk on pakkuda paremat jõudlust kui Python, muutes selle suurepäraseks tööriistaks teaduslikeks katsetusteks.
Selles õppetükis keskendume Pythoni kasutamisele lihtsaks andmetöötluseks. Eeldame, et olete keelega põgusalt tuttav. Kui soovite Pythoni kohta põhjalikumat ülevaadet, võite viidata ühele järgmistest ressurssidest:
- Õpi Pythonit lõbusalt Turtle Graphicsi ja fraktalitega - GitHubi-põhine kiire sissejuhatus Pythoni programmeerimisse
- Astuge esimesed sammud Pythoniga Õppeprogramm Microsoft Learn lehel
Andmed võivad esineda mitmel kujul. Selles õppetükis käsitleme kolme andmevormi - tabelandmed, tekst ja pildid.
Keskendume mõnele andmetöötluse näitele, selle asemel et anda täielik ülevaade kõigist seotud teekidest. See võimaldab teil saada peamise idee sellest, mis on võimalik, ja jätta teile arusaama, kust leida lahendusi oma probleemidele, kui neid vajate.
Kõige kasulikum nõuanne. Kui teil on vaja teha teatud toimingut andmetega, mida te ei oska, proovige otsida seda internetist. Stackoverflow sisaldab tavaliselt palju kasulikke Pythoni koodinäiteid paljude tüüpiliste ülesannete jaoks.
Eel-loengu viktoriin
Tabelandmed ja DataFrame'id
Olete juba kohtunud tabelandmetega, kui rääkisime relatsioonilistest andmebaasidest. Kui teil on palju andmeid ja need on salvestatud paljudesse erinevatesse seotud tabelitesse, on kindlasti mõistlik kasutada SQL-i nende töötlemiseks. Kuid on palju juhtumeid, kus meil on tabel andmetega ja me peame saama nende andmete kohta arusaama või teadmisi, näiteks jaotuse, väärtuste korrelatsiooni jne. Andmeteaduses on palju juhtumeid, kus peame tegema algandmete transformatsioone, millele järgneb visualiseerimine. Mõlemad sammud saab hõlpsasti teha Pythoniga.
Pythonis on kaks kõige kasulikumat teeki, mis aitavad teil tabelandmetega toime tulla:
- Pandas võimaldab manipuleerida nn DataFrame'idega, mis on analoogsed relatsiooniliste tabelitega. Teil võivad olla nimetatud veerud ja saate teha erinevaid toiminguid ridade, veergude ja DataFrame'ide üldiselt.
- Numpy on teek, mis töötab tensori, st mitmemõõtmeliste massiividega. Massiiv sisaldab sama aluseks oleva tüübi väärtusi ja on lihtsam kui DataFrame, kuid pakub rohkem matemaatilisi operatsioone ja tekitab vähem koormust.
Samuti on paar muud teeki, mida peaksite teadma:
- Matplotlib on teek, mida kasutatakse andmete visualiseerimiseks ja graafikute joonistamiseks
- SciPy on teek, mis sisaldab mõningaid täiendavaid teaduslikke funktsioone. Oleme selle teegiga juba kokku puutunud, kui rääkisime tõenäosusest ja statistikast.
Siin on koodijupp, mida tavaliselt kasutaksite nende teekide importimiseks oma Pythoni programmi alguses:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # you need to specify exact sub-packages that you need
Pandas keskendub mõnele põhimõistele.
Series
Series on väärtuste järjestus, mis sarnaneb loendi või numpy massiiviga. Peamine erinevus seisneb selles, et Series'il on ka indeks, ja kui me Series'iga töötame (nt. liidame neid), võetakse indeks arvesse. Indeks võib olla nii lihtne kui täisarvuline rea number (see on indeks, mida kasutatakse vaikimisi Series'i loendist või massiivist loomisel) või see võib olla keeruka struktuuriga, näiteks kuupäeva intervall.
Märkus: Mõningane sissejuhatav Pandas kood on kaasasolevas märkmikus
notebook.ipynb. Siin toome välja ainult mõned näited, kuid kindlasti olete oodatud tutvuma täieliku märkmikuga.
Vaatame näidet: soovime analüüsida meie jäätisekohviku müüki. Loome müüginumbrite Series'i (müüdud esemete arv iga päev) teatud ajavahemiku kohta:
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()
Oletame nüüd, et igal nädalal korraldame sõpradele peo ja võtame peole lisaks 10 pakki jäätist. Saame luua teise Series'i, mis on indekseeritud nädala järgi, et seda näidata:
additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))
Kui liidame kaks Series'it, saame koguarvu:
total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()
Märkus: Me ei kasuta lihtsat süntaksit
total_items+additional_items. Kui me seda teeksime, saaksime paljuNaN(Not a Number) väärtusi tulemuseks olevas Series'is. See on tingitud sellest, etadditional_itemsSeries'is puuduvad väärtused mõne indeksi punkti jaoks jaNaNlisamine millelegi annab tulemuseksNaN. Seetõttu peame liitmisel määramafill_valueparameetri.
Ajaseeriatega saame ka ümberproovida seeriat erinevate ajavahemikega. Näiteks kui soovime arvutada keskmist müügimahtu kuus, saame kasutada järgmist koodi:
monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')
DataFrame
DataFrame on sisuliselt sama indeksiga Series'ite kogum. Saame kombineerida mitu Series'it DataFrame'iks:
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])
See loob horisontaalse tabeli, mis näeb välja selline:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 1 | I | like | to | use | Python | and | Pandas | very | much |
Saame kasutada Series'it veergudena ja määrata veergude nimed sõnastiku abil:
df = pd.DataFrame({ 'A' : a, 'B' : b })
See annab meile tabeli, mis näeb välja selline:
| A | B | |
|---|---|---|
| 0 | 1 | I |
| 1 | 2 | like |
| 2 | 3 | to |
| 3 | 4 | use |
| 4 | 5 | Python |
| 5 | 6 | and |
| 6 | 7 | Pandas |
| 7 | 8 | very |
| 8 | 9 | much |
Märkus: Saame selle tabeli paigutuse ka eelmise tabeli transponeerimise teel, näiteks kirjutades
df = pd.DataFrame([a,b]).T..rename(columns={ 0 : 'A', 1 : 'B' })
Siin .T tähendab DataFrame'i transponeerimise operatsiooni, st ridade ja veergude vahetamist, ja rename operatsioon võimaldab meil veerge ümber nimetada, et need vastaksid eelmisele näitele.
Siin on mõned kõige olulisemad toimingud, mida saame DataFrame'idega teha:
Veergude valik. Saame valida üksikuid veerge, kirjutades df['A'] - see operatsioon tagastab Series'i. Samuti saame valida veergude alamhulga teise DataFrame'i, kirjutades df[['B','A']] - see tagastab teise DataFrame'i.
Filtreerimine ainult teatud ridade järgi kriteeriumide alusel. Näiteks, et jätta ainult read, kus veerg A on suurem kui 5, saame kirjutada df[df['A']>5].
Märkus: Filtreerimine töötab järgmiselt. Väljend
df['A']<5tagastab boole'i Series'i, mis näitab, kas väljend onTruevõiFalseiga algse Series'idf['A']elemendi jaoks. Kui boole'i Series'i kasutatakse indeksina, tagastab see DataFrame'i ridade alamhulga. Seetõttu ei ole võimalik kasutada suvalist Pythoni boole'i väljendit, näiteks kirjutadesdf[df['A']>5 and df['A']<7]oleks vale. Selle asemel peaksite kasutama spetsiaalset&operatsiooni boole'i Series'ite peal, kirjutadesdf[(df['A']>5) & (df['A']<7)](sulgud on siin olulised).
Uute arvutatavate veergude loomine. Saame hõlpsasti luua uusi arvutatavaid veerge oma DataFrame'ile, kasutades intuitiivset väljendit, näiteks:
df['DivA'] = df['A']-df['A'].mean()
See näide arvutab A kõrvalekalde selle keskmisest väärtusest. Tegelikult arvutame siin Series'i ja määrame selle vasakpoolsele küljele, luues uue veeru. Seega ei saa kasutada operatsioone, mis ei ühildu Series'itega, näiteks järgmine kood on vale:
# Wrong code -> df['ADescr'] = "Low" if df['A'] < 5 else "Hi"
df['LenB'] = len(df['B']) # <- Wrong result
Viimane näide, kuigi süntaktiliselt korrektne, annab meile vale tulemuse, kuna see määrab veeru kõikidele väärtustele Series'i B pikkuse, mitte üksikute elementide pikkuse, nagu me kavatsesime.
Kui peame arvutama keerukaid väljendeid nagu see, saame kasutada apply funktsiooni. Viimane näide võib olla kirjutatud järgmiselt:
df['LenB'] = df['B'].apply(lambda x : len(x))
# or
df['LenB'] = df['B'].apply(len)
Pärast ülaltoodud toiminguid jõuame järgmise DataFrame'ini:
| A | B | DivA | LenB | |
|---|---|---|---|---|
| 0 | 1 | I | -4.0 | 1 |
| 1 | 2 | like | -3.0 | 4 |
| 2 | 3 | to | -2.0 | 2 |
| 3 | 4 | use | -1.0 | 3 |
| 4 | 5 | Python | 0.0 | 6 |
| 5 | 6 | and | 1.0 | 3 |
| 6 | 7 | Pandas | 2.0 | 6 |
| 7 | 8 | very | 3.0 | 4 |
| 8 | 9 | much | 4.0 | 4 |
Ridade valimine numbrite alusel saab teha iloc konstruktsiooni abil. Näiteks, et valida DataFrame'ist esimesed 5 rida:
df.iloc[:5]
Grupeerimine kasutatakse sageli tulemuse saamiseks, mis sarnaneb pivot-tabelitega Excelis. Oletame, et soovime arvutada veeru A keskmise väärtuse iga antud LenB numbri jaoks. Siis saame oma DataFrame'i grupeerida LenB järgi ja kutsuda mean:
df.groupby(by='LenB')[['A','DivA']].mean()
Kui peame arvutama keskmise ja elementide arvu grupis, siis saame kasutada keerukamat aggregate funktsiooni:
df.groupby(by='LenB') \
.aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
.rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})
See annab meile järgmise tabeli:
| LenB | Count | Mean |
|---|---|---|
| 1 | 1 | 1.000000 |
| 2 | 1 | 3.000000 |
| 3 | 2 | 5.000000 |
| 4 | 3 | 6.333333 |
| 6 | 2 | 6.000000 |
Andmete hankimine
Oleme näinud, kui lihtne on luua Series ja DataFrame'i Python objektidest. Kuid tavaliselt on andmed tekstifaili või Exceli tabeli kujul. Õnneks pakub Pandas meile lihtsat viisi andmete laadimiseks kettalt. Näiteks CSV-faili lugemine on nii lihtne:
df = pd.read_csv('file.csv')
Näeme rohkem näiteid andmete laadimisest, sealhulgas nende hankimist välisveebilehtedelt, "Väljakutse" sektsioonis.
Andmete kuvamine ja visualiseerimine
Andmeteadlane peab sageli andmeid uurima, seega on oluline osata neid visualiseerida. Kui DataFrame on suur, tahame tihti lihtsalt veenduda, et teeme kõik õigesti, kuvades esimesed paar rida. Seda saab teha, kutsudes df.head(). Kui käitate seda Jupyter Notebookis, kuvab see DataFrame'i kenasti tabeli kujul.
Oleme näinud ka plot funktsiooni kasutamist, et visualiseerida mõningaid veerge. Kuigi plot on väga kasulik paljude ülesannete jaoks ja toetab erinevaid graafikutüüpe kind= parameetri kaudu, saate alati kasutada matplotlib teeki, et luua midagi keerukamat. Käsitleme andmete visualiseerimist üksikasjalikult eraldi kursuse tundides.
See ülevaade hõlmab Pandase kõige olulisemaid kontseptsioone, kuid teek on väga rikkalik ja võimalused on piiritud! Rakendame nüüd seda teadmist konkreetse probleemi lahendamiseks.
🚀 Väljakutse 1: COVID leviku analüüs
Esimene probleem, millele keskendume, on COVID-19 epideemia leviku modelleerimine. Selleks kasutame andmeid nakatunud inimeste arvu kohta erinevates riikides, mida pakub Center for Systems Science and Engineering (CSSE) Johns Hopkinsi Ülikoolist. Andmestik on saadaval selles GitHubi repositooriumis.
Kuna tahame näidata, kuidas andmetega töötada, kutsume teid avama notebook-covidspread.ipynb ja lugema seda algusest lõpuni. Võite ka rakke käivitada ja lahendada mõned väljakutsed, mille oleme teile lõppu jätnud.
Kui te ei tea, kuidas Jupyter Notebookis koodi käivitada, vaadake seda artiklit.
Töötamine struktureerimata andmetega
Kuigi andmed on sageli tabeli kujul, peame mõnel juhul töötama vähem struktureeritud andmetega, näiteks tekstide või piltidega. Sellisel juhul, et rakendada andmetöötlustehnikaid, mida oleme näinud, peame kuidagi ekstraheerima struktureeritud andmeid. Siin on mõned näited:
- Märksõnade ekstraheerimine tekstist ja nende esinemissageduse analüüs
- Neuraalvõrkude kasutamine, et tuvastada objektid pildil
- Emotsioonide tuvastamine videokaamera voogudes
🚀 Väljakutse 2: COVID-teemaliste teadusartiklite analüüs
Selles väljakutses jätkame COVID pandeemia teemaga ja keskendume teadusartiklite töötlemisele. Olemas on CORD-19 andmestik, mis sisaldab üle 7000 (kirjutamise ajal) COVID-teemalist artiklit koos metaandmete ja kokkuvõtetega (ja umbes pooltel juhtudel on saadaval ka täistekstid).
Täielik näide selle andmestiku analüüsimisest, kasutades Text Analytics for Health kognitiivset teenust, on kirjeldatud selles blogipostituses. Arutame selle analüüsi lihtsustatud versiooni.
NOTE: Me ei paku selle repositooriumi osana andmestiku koopiat. Võite esmalt alla laadida
metadata.csvfaili sellest Kaggle andmestikust. Registreerimine Kaggle'is võib olla vajalik. Võite andmestiku alla laadida ka ilma registreerimiseta siit, kuid see sisaldab kõiki täistekste lisaks metaandmete failile.
Avage notebook-papers.ipynb ja lugege seda algusest lõpuni. Võite ka rakke käivitada ja lahendada mõned väljakutsed, mille oleme teile lõppu jätnud.
Pildiandmete töötlemine
Viimasel ajal on välja töötatud väga võimsad AI mudelid, mis võimaldavad meil pilte mõista. Paljusid ülesandeid saab lahendada eelnevalt treenitud neuraalvõrkude või pilveteenuste abil. Mõned näited hõlmavad:
- Pildiklassifikatsioon, mis aitab teil kategoriseerida pilti ühte eelnevalt määratletud klassi. Oma pildiklassifikaatorite treenimine on lihtne, kasutades teenuseid nagu Custom Vision.
- Objektide tuvastamine, et tuvastada erinevaid objekte pildil. Teenused nagu computer vision suudavad tuvastada mitmeid levinud objekte, ja saate treenida Custom Vision mudelit, et tuvastada konkreetseid huvipakkuvaid objekte.
- Näotuvastus, sealhulgas vanuse, soo ja emotsioonide tuvastamine. Seda saab teha Face API abil.
Kõiki neid pilveteenuseid saab kasutada Python SDK-dega, ja seega saab neid hõlpsasti integreerida teie andmete uurimise töövoogu.
Siin on mõned näited pildiandmete allikatest andmete uurimisest:
- Blogipostituses Kuidas õppida andmeteadust ilma kodeerimiseta uurime Instagrami fotosid, püüdes mõista, mis paneb inimesi fotole rohkem meeldimisi andma. Esmalt ekstraheerime piltidelt võimalikult palju teavet, kasutades computer vision, ja seejärel kasutame Azure Machine Learning AutoML, et luua tõlgendatav mudel.
- Näouuringute töötoas kasutame Face API, et ekstraheerida emotsioone inimestelt fotodelt üritustelt, püüdes mõista, mis teeb inimesi õnnelikuks.
Kokkuvõte
Kas teil on juba struktureeritud või struktureerimata andmed, Pythoniga saate teha kõik andmetöötluse ja -mõistmisega seotud sammud. See on tõenäoliselt kõige paindlikum viis andmetöötluseks, ja seetõttu kasutab enamik andmeteadlasi Pythonit oma peamise tööriistana. Pythonit süvitsi õppida on tõenäoliselt hea mõte, kui olete tõsiselt huvitatud oma andmeteaduse teekonnast!
Loengu järgne viktoriin
Ülevaade ja iseseisev õppimine
Raamatud
Veebiressursid
Python õppimine
- Õpi Pythonit lõbusalt Turtle Graphicsi ja fraktalitega
- Tee esimesed sammud Pythoniga õpitee Microsoft Learnis
Ülesanne
Tee ülaltoodud väljakutsete kohta põhjalikum andmeuuring
Autorid
Selle õppetunni on koostanud ♥️ Dmitry Soshnikov
Lahtiütlus:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta arusaamatuste või valesti tõlgenduste eest, mis võivad tekkida selle tõlke kasutamise tõttu.






