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.
Data-Science-For-Beginners/translations/uk/2-Working-With-Data/07-python
localizeflow[bot] bab07620fe
[my,uk,lt] chore(i18n): sync translations
4 weeks ago
..
R 🌐 Update translations via Co-op Translator 11 months ago
README.md [my,uk,lt] chore(i18n): sync translations 4 weeks ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 213 changes) 6 months ago
notebook-covidspread.ipynb chore(i18n): sync translations with latest source changes (chunk 1/1, 69 changes) 6 months ago
notebook-papers.ipynb 🌐 Update translations via Co-op Translator 11 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

Робота з даними: Python та бібліотека Pandas

 Sketchnote від (@sketchthedocs)
Робота з Python - Sketchnote від @nitya

Вступне відео

Хоча бази даних пропонують дуже ефективні способи зберігання даних і запитів до них за допомогою мов запитів, найгнучкішим способом обробки даних є написання власної програми для маніпуляції даними. У багатьох випадках виконання запиту до бази даних було б ефективнішим способом. Однак в деяких випадках, коли потрібна складніша обробка даних, це не завжди можна легко зробити за допомогою SQL. Обробку даних можна програмувати на будь-якій мові програмування, але існують певні мови, які є вищого рівня щодо роботи з даними. Дані науковці зазвичай віддають перевагу одній із наступних мов:

  • Python — мова програмування загального призначення, яку часто вважають одним із найкращих варіантів для початківців через її простоту. Python має багато додаткових бібліотек, які можуть допомогти розв’язати багато практичних задач, таких як вилучення даних із ZIP архіву або конвертація зображення в відтінки сірого. Окрім науки про дані, Python часто використовується для веб-розробки.
  • R — традиційний набір інструментів, розроблений з урахуванням статистичної обробки даних. Він також містить велику бібліотеку (CRAN), що робить його гарним вибором для обробки даних. Проте R не є мовою програмування загального призначення і рідко використовується поза сферою науки про дані.
  • Julia — ще одна мова, розроблена спеціально для науки про дані. Вона має на меті забезпечити вищу продуктивність, ніж Python, що робить її чудовим інструментом для наукових експериментів.

У цьому уроці ми зосередимося на використанні Python для простої обробки даних. Ми припускаємо базове знайомство з мовою. Якщо ви хочете глибше ознайомитися з Python, ви можете звернутися до одного з наступних ресурсів:

Дані можуть мати багато форм. У цьому уроці ми розглянемо три форми даних — табличні дані, текст і зображення.

Ми зосередимося на кількох прикладах обробки даних, замість того, щоб давати повний огляд усіх пов’язаних бібліотек. Це дозволить вам отримати основну ідею про те, що можливо зробити, і залишить розуміння, де шукати рішення ваших задач, коли вони знадобляться.

Найкорисніша порада. Коли вам потрібно виконати певну операцію з даними, яку ви не знаєте, як зробити, спробуйте пошукати це в інтернеті. Stackoverflow зазвичай містить багато корисних прикладів коду на Python для багатьох типових задач.

Попередній тест

Табличні дані та DataFrame

Ви вже стикалися з табличними даними, коли ми говорили про реляційні бази даних. Коли у вас багато даних, і вони розміщені в багатьох різних зв’язаних таблицях, безумовно має сенс використовувати SQL для роботи з ними. Проте існує багато випадків, коли у нас є таблиця з даними, і нам потрібно отримати певне розуміння або інсайти про ці дані, такі як розподіл, кореляція між значеннями тощо. У науці про дані часто потрібно виконувати деякі трансформації оригінальних даних, а потім візуалізувати їх. Обидва ці кроки легко здійснити за допомогою Python.

Існує дві найкорисніші бібліотеки в Python, які можуть допомогти вам працювати з табличними даними:

  • Pandas дозволяє вам маніпулювати так званими DataFrame, які є аналогом реляційних таблиць. Ви можете мати іменовані стовпці та виконувати різні операції з рядками, стовпцями і 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 також є індекс, і коли ми виконуємо операції над Series (наприклад, додаємо), індекс враховується. Індекс може бути таким простим, як числовий номер рядка (це індекс, який використовується за замовчуванням при створенні Series із списку або масиву), або він може мати складну структуру, таку як інтервал дат.

Примітка: Існує деякий вступний код Pandas у супровідному ноутбуці notebook.ipynb. Тут ми лише наводимо деякі приклади, і вам обов’язково варто ознайомитися з повним ноутбуком.

Розглянемо приклад: ми хочемо проаналізувати продажі нашої крамниці морозива. Згенеруємо серію чисел продажу (кількість проданих штук кожного дня) за певний період часу:

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 упаковок морозива для вечірки. Ми можемо створити іншу серію, індексовану за тижнями, щоб це показати:

additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))

Коли ми складаємо дві серії, отримуємо загальну кількість:

total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()

Графік часових рядів

Зауважте, що ми не просто використовуємо синтаксис total_items+additional_items. Якби так було, ми отримали б багато значень NaN (Not a Number) у результаті. Це тому, що в серії additional_items відсутні деякі значення для деяких індексів, і додавання NaN до будь-чого дає NaN. Тому нам потрібно вказати параметр fill_value під час додавання.

За допомогою часових рядів ми також можемо перепробовувати серію з різними часовими інтервалами. Наприклад, припустимо, що ми хочемо порахувати середній обсяг продажів щомісяця. Ми можемо використати такий код:

monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')

Середні значення часових рядів за місяць

DataFrame

DataFrame по суті є колекцією серій з однаковим індексом. Ми можемо поєднати кілька серій у 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 для кожного елемента оригінальної серії df['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 від його середнього значення. Насправді тут ми обчислюємо серію, а потім присвоюємо цю серію лівій частині, створюючи інший стовпець. Отже, ми не можемо використовувати операції, несумісні з серіями, наприклад, код нижче є неправильним:

# Неправильний код -> df['ADescr'] = "Low" if df['A'] < 5 else "Hi"
df['LenB'] = len(df['B']) # <- Неправильний результат

Останній приклад, хоча і синтаксично коректний, дає неправильний результат, оскільки присвоює довжину серії 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]

Групування часто використовується для отримання результату, подібного до зведених таблиць в 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 та DataFrame з об’єктів Python. Однак дані зазвичай надходять у вигляді текстового файлу або Excel-таблиці. На щастя, Pandas пропонує простий спосіб завантаження даних з диска. Наприклад, читання CSV-файлу таке саме просте:

df = pd.read_csv('file.csv')

Ми побачимо більше прикладів завантаження даних, включаючи отримання їх з зовнішніх вебсайтів, у розділі "Виклик"

Виведення на друк і візуалізація

Фахівцю з даних часто доводиться досліджувати дані, тому дуже важливо мати змогу їх візуалізувати. Коли 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 і прочитати його від початку до кінця. Ви також можете виконувати комірки та розв’язувати деякі завдання, які ми залишили на кінець.

COVID Spread

Якщо ви не знаєте, як запускати код у Jupyter Notebook, ознайомтеся з цією статтею.

Робота з неструктурованими даними

Хоча дані дуже часто мають табличну форму, у деяких випадках потрібно працювати з менш структурованими даними, наприклад, текстами або зображеннями. У такому випадку, щоб застосувати техніки обробки даних, які ми бачили вище, нам потрібно якимось чином витягти структуровані дані. Ось кілька прикладів:

  • Витягування ключових слів з тексту і підрахунок, як часто вони зустрічаються
  • Використання нейронних мереж для витягування інформації про об’єкти на зображенні
  • Отримання інформації про емоції людей на відеопотоці з камери

🚀 Виклик 2: Аналіз наукових публікацій про COVID

У цьому виклику ми продовжимо тему пандемії COVID і зосередимось на обробці наукових праць з цього питання. Існує CORD-19 Dataset з понад 7000 (на момент написання) наукових робіт про COVID, доступних разом з метаданими та анотаціями (і приблизно для половини з них також наданий повний текст).

Повний приклад аналізу цього набору даних з використанням когнітивної служби Text Analytics for Health описано у цій публікації в блозі. Ми обговоримо спрощену версію цього аналізу.

ПРИМІТКА: Ми не надаємо копію набору даних як частину цього репозиторію. Спочатку вам може знадобитись завантажити файл metadata.csv з цього набору даних на Kaggle. Можлива реєстрація на Kaggle. Ви також можете завантажити набір даних без реєстрації тут, але він включатиме всі повні тексти окрім метаданих.

Відкрийте notebook-papers.ipynb і прочитайте його від початку до кінця. Ви також можете виконувати комірки та розв’язувати деякі завдання, які ми залишили на кінець.

Covid Medical Treatment

Обробка зображень

Нещодавно було розроблено дуже потужні моделі ШІ, які дозволяють нам розуміти зображення. Існує багато завдань, які можна розв’язувати за допомогою попередньо навчених нейронних мереж або хмарних сервісів. Ось кілька прикладів:

  • Класифікація зображень, яка допомагає класифікувати зображення до однієї з заздалегідь визначених категорій. Ви можете легко навчити власні класифікатори зображень за допомогою сервісів, таких як Custom Vision
  • Виявлення об’єктів для розпізнавання різних об’єктів на зображенні. Сервіси на кшталт computer vision можуть розпізнавати низку поширених об’єктів, і ви можете навчити модель Custom Vision для виявлення деяких конкретних цікавих об’єктів.
  • Розпізнавання облич, включно з визначенням віку, статі та емоцій. Це можна зробити через Face API.

Всі ці хмарні сервіси можна викликати за допомогою Python SDK, і таким чином вони легко інтегруються у ваш робочий процес аналізу даних.

Ось кілька прикладів вивчення даних із джерел зображень:

  • У публікації блогу Як вивчати Data Science без кодування ми досліджуємо фотографії з Instagram, намагаючись зрозуміти, що змушує людей ставити більше лайків. Спочатку ми витягуємо якнайбільше інформації із зображень за допомогою computer vision, а потім використовуємо Azure Machine Learning AutoML для побудови інтерпретованої моделі.
  • На Facial Studies Workshop ми використовуємо Face API для виявлення емоцій людей на фотографіях з подій, щоб спробувати зрозуміти, що робить людей щасливими.

Висновок

Чи маєте ви структуровані чи неструктуровані дані, використовуючи Python, ви можете виконати всі етапи, пов’язані з обробкою і розумінням даних. Це, ймовірно, найгнучкіший спосіб обробки даних, і саме тому більшість фахівців з даних використовують Python як основний інструмент. Вивчення Python у глибину — це, мабуть, хороша ідея, якщо ви серйозно налаштовані на вашу подорож у сферу аналізу даних!

Тест після лекції

Огляд і самостійне вивчення

Книги

Онлайн-ресурси

Вивчення Python

Завдання

Виконайте більш детальне вивчення даних для наведених викликів

Автори

Цей урок створено з ♥️ Дмитром Сошниковим (http://soshnikov.com)


Відмова від відповідальності: Цей документ було перекладено за допомогою сервісу штучного інтелекту для перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.