|
|
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
Рад са подацима: Python и Pandas библиотека
![]() |
|---|
| Рад са Python-ом - Sketchnote од @nitya |
Док базе података нуде веома ефикасне начине за чување података и њихово испитивање помоћу језика за упитe, најфлексибилнији начин обраде података је писање сопственог програма за манипулацију подацима. У многим случајевима, извршавање упита у бази података било би ефикасније. Међутим, у неким случајевима када је потребна сложенија обрада података, то се не може лако урадити помоћу SQL-а. Обрада података може бити програмирана у било ком програмском језику, али постоје неки језици који су вишег нивоа у погледу рада са подацима. Стручњаци за податке обично преферирају један од следећих језика:
- Python, општи програмски језик, који се често сматра једном од најбољих опција за почетнике због своје једноставности. Python има много додатних библиотека које вам могу помоћи да решите многе практичне проблеме, као што је издвајање података из ZIP архива или конверзија слике у нијансе сиве. Поред обраде података, Python се често користи и за веб развој.
- R је традиционални скуп алата развијен са идејом статистичке обраде података у виду. Такође садржи велику репозиторију библиотека (CRAN), што га чини добрим избором за обраду података. Међутим, R није општи програмски језик и ретко се користи ван домена науке о подацима.
- Julia је још један језик развијен посебно за науку о подацима. Намењен је да пружи боље перформансе од Python-а, чинећи га сјајним алатом за научно експериментисање.
У овој лекцији ћемо се фокусирати на коришћење Python-a за једноставну обраду података. Претпоставићемо основно познавање језика. Ако желите дубљу туру по Python-у, можете погледати један од следећих извора:
- Learn Python in a Fun Way with Turtle Graphics and Fractals - GitHub базирани брзи увод у програмски језик Python
- Take your First Steps with Python Learning Path на Microsoft Learn
Подаци могу бити у различитим облицима. У овој лекцији ћемо размотрити три облика података - табеларни подаци, текст и слике.
Фокусираћемо се на неколико примера обраде података, уместо да вам дамо потпун преглед свих релевантних библиотека. Ово ће вам омогућити да стекнете главну идеју о ономе што је могуће и оставити вас са разумевањем где да нађете решења за своје проблеме када вам затребају.
Најкориснији савет. Када требате да извршите одређену операцију над подацима коју не знате како да урадите, покушајте да је потражите на интернету. Stackoverflow обично садржи много корисних примера кода на Python-у за многе типичне задатке.
Прелиминарни квиз
Табеларни подаци и Dataframes
Већ сте упознали табеларне податке када смо говорили о реловационим базама података. Када имате пуно података који су садржани у многим различитим повезаним табелама, дефинитивно има смисла користити SQL за рад са њима. Међутим, постоји много случајева када имамо табеларне податке и потребно нам је да добијемо неко разумевање или инсајт о тим подацима, као што су расподела, корелација између вредности итд. У науци о подацима, често је потребно извршити неке трансформације изворних података, праћене визуализацијом. Оба ова корака се могу лако урадити коришћењем Python-a.
Постоје две најкорисније библиотеке у Python-у које вам могу помоћи да радите са табеларним подацима:
- Pandas вам омогућава да манипулишете такозваним Dataframes, који су аналогни реловационим табелама. Можете имати именоване колоне и извршавати различите операције над редовима, колонама и целом DataFrame-ом.
- Numpy је библиотека за рад са тензорима, тј. вишедимензионалним низовима. Низ има вредности истог примарног типа и једноставнији је од DataFrame-а, али нуди више математичких операција и ствара мање допунског оптерећења.
Постоји и неколико других библиотека које би требало да знате:
- Matplotlib је библиотека која се користи за визуализацију података и цртање графикона
- SciPy је библиотека са додатним научним функцијама. Већ смо наишли на ову библиотеку када смо говорили о вероватноћи и статистици
Ево пример кода којим ћете обично почети да увозите те библиотеке у почетку свог Python програма:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # потребно је да наведете тачне подпакете који су вам потребни
Pandas је заснован на неколико основних концепата.
Series
Series је низ вредности, сличан листи или numpy низу. Главна разлика је што series има и индеx, и када извршавамо операције над series (нпр. сабирање), индеx се узима у обзир. Индекс може бити једноставан, као нпр. број реда (који је подразумевани индекс при креирању series од листе или низа), или може имати комплексну структуру, као што је временски интервал.
Напомена: Постоји неки уводни Pandas код у приложеном notebook-у
notebook.ipynb. Овде само наводимо неке примере, а свакако сте добродошли да погледате цео notebook.
Размотримо пример: желимо да анализирамо продају у нашем киоску за сладолед. Хајде да генеришемо series бројева продаје (број продатих јединица сваког дана) за одређени период:
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()
Сада претпоставимо да сваке недеље организујемо журку за пријатеље и додатно донесемо 10 пакетића сладоледа за журку. Можемо направити другу series, индексирану по недељама, да то прикажемо:
additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))
Када саберемо две series, добијамо укупни број:
total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()
Напомена да не користимо једноставну синтаксу
total_items+additional_items. Кад бисмо је користили, добили бисмо многоNaN(Not a Number) вредности у резултујућој series. То је зато што недостају вредности за неке индексе у seriesadditional_items, а сабирањеNaNса било чим дајеNaN. Због тога морамо да наведемо параметарfill_valueприликом сабирања.
Код серија са временом можемо такође промјенити узорак (resample) са другим временским интервалима. На пример, претпоставимо да желимо да израчунамо просечан промет продаје месечно. Можемо користити следећи код:
monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')
DataFrame
DataFrame је у основи скуп series са истим индексом. Можемо спојити неколико series у један 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])
Ово ће направити хоризонталну табелу као што је ова:
| 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 |
Такође можемо користити Series као колоне и одредити имена колона користећи речник:
df = pd.DataFrame({ 'A' : a, 'B' : b })
Ово ће нам дати табелу као што је ова:
| 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 |
Напомена да ову структуру табеле можемо добити и транспоновањем претходне табеле, нпр. писањем
df = pd.DataFrame([a,b]).T.rename(columns={ 0 : 'A', 1 : 'B' })
Овде .T значи операцију транспоновања DataFrame-а, тј. мењање редова и колона, а операција rename нам омогућава да преименујемо колоне како би одговарале претходном примеру.
Ево неколико најважнијих операција које можемо извршити над DataFrame-овима:
Селекција колона. Можемо изабрати појединачне колоне писањем df['A'] - ова операција враћа Series. Такође можемо изабрати подскуп колона у други DataFrame писањем df[['B','A']] - ова операција враћа други DataFrame.
Филтрирање само одређених редова по критеријуму. На пример, да задржимо само редове где је колона A већа од 5, можемо написати df[df['A']>5].
Напомена: Начин на који филтрирање функционише је следећи. Израз
df['A']<5враћа буловску серију која показује да ли је условTrueилиFalseза сваки елемент оригиналне Seriesdf['A']. Када се буловска серија користи као индекс, враћа подмножину редова DataFrame-а. Због тога није могуће користити произвољан Python буловски израз, на пример, писањеdf[df['A']>5 and df['A']<7]би било погрешно. Уместо тога, треба користити посебну операцију&за буловске серије, писањемdf[(df['A']>5) & (df['A']<7)](заграде су овде важне).
Креирање нових рачунских колона. Можемо лако креирати нове колоне израчунате за наш DataFrame користећи интуитивне изразе овако:
df['DivA'] = df['A']-df['A'].mean()
Овај пример израчунава разлику A од њене просечне вредности. У ствари, овде рачунамо series, која се онда додељује левој страни, стварајући тако још једну колону. Због тога не можемо користити операције које нису компатибилне са series; пример из кода испод је погрешан:
# Погрешан код -> df['ADescr'] = "Low" ако је df['A'] < 5 иначе "Hi"
df['LenB'] = len(df['B']) # <- Погрешан резултат
Овај други пример, иако је синтаксно исправан, даје погрешан резултат, јер додељује дужину Series B свим вредностима у колони, уместо дужине појединачних елемената, како смо намеравали.
Ако морамо да рачунамо сложене изразе овако, можемо користити функцију apply. Последњи пример може бити написан овако:
df['LenB'] = df['B'].apply(lambda x : len(x))
# или
df['LenB'] = df['B'].apply(len)
Након ових операција, добићемо следећи DataFrame:
| 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 |
Селекција редова по броју може се урадити користећи iloc конструкцију. На пример, да изаберемо првих 5 редова из DataFrame-а:
df.iloc[:5]
Груписање се често користи за добијање резултата сличног pivot таблицама у Excel-у. Претпоставимо да желимо да израчунамо просечну вредност колоне A за сваки дати број LenB. Тада можемо груписати наш DataFrame по LenB и позвати mean:
df.groupby(by='LenB')[['A','DivA']].mean()
Ако желимо да израчунамо просек и број елемената у групи, онда можемо користити сложенију функцију aggregate:
df.groupby(by='LenB') \
.aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
.rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})
Ово нам даје следећу табелу:
| LenB | Count | Mean |
|---|---|---|
| 1 | 1 | 1.000000 |
| 2 | 1 | 3.000000 |
| 3 | 2 | 5.000000 |
| 4 | 3 | 6.333333 |
| 6 | 2 | 6.000000 |
Добијање података
Видели смо колико је лако конструисати Series и DataFrames из Python објеката. Међутим, подаци обично долазе у облику текстуалних фајлова или Excel табела. Срећом, Pandas нам нуди једноставан начин да учитамо податке са диска. На пример, читање CSV фајла је једноставно као ово:
df = pd.read_csv('file.csv')
Видећемо више примера учитавања података, укључујући преузимање са спољних веб сајтова, у одељку "Изазов"
Штампање и графички приказ
Data Scientist често мора да истражи податке, па је зато важно бити у могућности да их визуализује. Када је DataFrame велики, често желимо само да се уверимо да све радимо исправно тако што ћемо одштампати првих неколико редова. Ово се може урадити позивом df.head(). Ако покрећете код у Jupyter Notebook-у, он ће приказати DataFrame у лепом табеларном формату.
Такође смо видели коришћење функције plot за визуализацију одређених колона. Док је plot веома користан за многе задатке и подржава различите типове графикона преко параметра kind=, увек можете користити сирову библиотеку matplotlib за цртање нечег сложенијег. Визуелизацију података ћемо детаљно обрадити у посебним лекцијама курса.
Овај преглед покрива најважније концепте Pandas-а, али библиотека је веома богата и нема граница шта све можете са њом урадити! Хајде сада да применимо ово знање на решавање конкретног проблема.
🚀 Изазов 1: Анализа ширења COVID-а
Први проблем на који ћемо се фокусирати је моделирање ширења пандемије COVID-19. За то ћемо користити податке о броју заражених у различитим земљама, које обезбеђује Center for Systems Science and Engineering (CSSE) на Johns Hopkins University. Скуп података је доступан у овом GitHub Репозиторијуму.
Пошто желимо да вам покажемо како се рукује подацима, позивамо вас да отворите notebook-covidspread.ipynb и прочитате га од почетка до краја. Такође можете извршавати ћелије и решавати неке изазове које смо оставили за вас на крају.
Ако не знате како покренути код у Jupyter Notebook-у, погледајте овaj чланак.
Рад са неструктурираним подацима
Иако подаци често долазе у табеларном облику, у неким случајевима треба да радимо са мање структуираним подацима, на пример текстом или сликама. У том случају, да бисмо применили технике обраде података које смо горе видели, морамо на неки начин извући структуиране податке. Ево неколико примера:
- Издвајање кључних речи из текста и преглед учесталости појављивања тих речи
- Коришћење неуронских мрежа за издвајање информација о објектима на слици
- Добијање информација о емоцијама људи на видео снимку
🚀 Изазов 2: Анализа COVID научних радова
У овом изазову ћемо наставити са темом COVID пандемије и фокусирати се на обраду научних радова о овој теми. Постоји CORD-19 скуп података са више од 7000 (у време писања) радова о COVID-у, доступних са метаподацима и апстрактима (а за око половине радова је доступан и цео текст).
Потпун пример анализе овог скупа података коришћењем когнитивне услуге Text Analytics for Health описан је у овом блогу. Разматраћемо поједностављену верзију ове анализе.
НАПОМЕНА: Не обезбеђујемо копију скупа података у оквиру овог репозиторијума. Прво морате преузети фајл
metadata.csvса овог скупа података на Kaggle. Можда је потребна регистрација на Kaggle. Такође можете преузети скуп података без регистрације овде, али он ће укључивати све пуне текстове поред метаподатака.
Отворите notebook-papers.ipynb и прочитајте га од почетка до краја. Такође можете извршавати ћелије и решавати неке изазове које смо оставили за вас на крају.
Обрада слика
Недавно су развијени веома моћни AI модели који нам омогућавају да разумемо слике. Постоје многи задаци који се могу решити коришћењем унапред тренираних неуронских мрежа или облачних сервиса. Неки примери укључују:
- Класификацију слика, која вам помаже да категоришете слику у једну од унапред дефинисаних класа. Једноставно можете обучити сопствене класификаторе слика користећи сервисе као што је Custom Vision
- Препознавање објеката за детекцију различитих објеката на слици. Услуге као што је computer vision могу детектовати број уобичајених објеката, а такође можете обући модел на Custom Vision да детектује одређене специфичне објекте од интереса.
- Детекцију лица, укључујући одређивање старости, пола и емоција. Ово се може урадити преко Face API.
Све те облачне сервисе можете позвати помоћу Python SDK-ова, и на тај начин их лако укључити у свој ток рада истраживања података.
Ево неколико примера истраживања података из извора слика:
- У блогу How to Learn Data Science without Coding истражујемо Instagram фотографије, покушавајући да разумемо шта људе подстиче да дају више лајкова фотографији. Прво изузимамо највише информација из слика коришћењем computer vision, а затим користимо Azure Machine Learning AutoML да бисмо изградили интерпретабилни модел.
- У Facial Studies Workshop користимо Face API за издвајање емоција људи на фотографијама са догађаја како бисмо покушали да разумемо шта чини људе срећним.
Закључак
Без обзира да ли већ имате структуриране или неструктуриране податке, коришћењем Pythona можете извршити све кораке везане за обраду и разумевање података. То је вероватно најфлексибилнији начин обраде података и због тога већина Data Scientist-а користи Python као свој примарни алат. Учити Python детаљно је добра идеја ако озбиљно приступате својем Data Science путу!
Квиз после предавања
Ревизија и самостално учење
Књиге
Онлајн ресурси
- Званични 10 minutes to Pandas туторијал
- Документација о Pandas визуализацији
Учење Pythona
- Учите Python на забаван начин са Turtle Graphics и фракталима
- Правите прве кораке у Python-у Лернинг Пут на Microsoft Learn
Задатак
Обавите детаљнију студију података за изазове изнад
Захвалности
Ова лекција је ауторска уз ♥️ од Dmitry Soshnikov
Изјава о одрицању одговорности: Овај документ је преведен коришћењем услуге за аутоматски превод Co-op Translator. Иако тежимо тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешна тумачења која произилазе из коришћења овог превода.






