You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

22 KiB

Töötamine andmetega: Python ja Pandas teek

 Sketchnote autorilt (@sketchthedocs)
Töötamine Pythoniga - Sketchnote autorilt @nitya

Sissejuhatav video

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:

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()

Ajaseeria graafik

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()

Ajaseeria graafik

Märkus: Me ei kasuta lihtsat süntaksit total_items+additional_items. Kui me seda teeksime, saaksime palju NaN (Not a Number) väärtusi tulemuseks olevas Series'is. See on tingitud sellest, et additional_items Series'is puuduvad väärtused mõne indeksi punkti jaoks ja NaN lisamine millelegi annab tulemuseks NaN. Seetõttu peame liitmisel määrama fill_value parameetri.

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')

Kuulised ajaseeria keskmised

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']<5 tagastab boole'i Series'i, mis näitab, kas väljend on True või False iga algse Series'i df['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 kirjutades df[df['A']>5 and df['A']<7] oleks vale. Selle asemel peaksite kasutama spetsiaalset & operatsiooni boole'i Series'ite peal, kirjutades df[(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.

COVID levik

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.csv faili 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.

COVID meditsiiniline ravi

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:

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

Ü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.